• T端脚本Peacekeeper守护者NPC脚本代码


     这是一个和平守护者卫士NPC脚本,当玩家在这个NPC的一定范围内,一定的x,y坐标内,你就不会有PVP标记。
    
    简单说来,这个就是一个设置安全区域的办法之一!
    
    
    #include "ScriptPCH.h"
    
    
    typedef struct {float x, y;} Point;
    
    
    // This is a list of X, Y coordinates that you want to make your "safe area"  这里就是定义安全区域的坐标位置的地方
    // The first and last points MUST be the same for this to work
    static const Point V[] = { {4519.443359f, 2709.068359f}, 
    {4518.447266f, 2699.789795f}, 
    {4512.137695f, 2689.388184f}, 
    {4512.927734f, 2674.512207f}, 
    {4515.222168f, 2658.663330f}, 
    {4523.524902f, 2641.542480f}, 
    {4536.573730f, 2630.782715f}, 
    {4546.353027f, 2636.786865f}, 
    {4562.053711f, 2651.318359f}, 
    {4570.511719f, 2663.249756f}, 
    {4578.481445f, 2696.588135f}, 
    {4564.876465f, 2707.007324f}, 
    {4542.565918f, 2708.313477f}, 
    {4526.848145f, 2710.782471f}, 
    {4519.443359f, 2709.068359f} };
    
    
    static const int n = 14;
    
    
    class npc_peacekeeper : public CreatureScript
    {
    public:
        npc_peacekeeper() : CreatureScript("npc_peacekeeper") {}
    
    
        CreatureAI* GetAI(Creature* c) const
        {
            return new npc_peacekeeperAI(c);
        }
    
    
        struct npc_peacekeeperAI : public ScriptedAI
        {
            npc_peacekeeperAI(Creature* c) : ScriptedAI(c) {}
    
    
                  int isLeft(Point P0, Point P1, Point P2)
                  {
                      return ( (P1.x - P0.x) * (P2.y - P0.y)
                              - (P2.x - P0.x) * (P1.y - P0.y) );
                  }
          
                  // Checks if a Point is inside the predefined area
                  bool IsInArea(Point P)
                  {
                     int wn = 0;  
    
    
                      for (int i=0; i < n; i++) 
                {   
                              if (V[i].y <= P.y) 
                    {         
                                  if (V[i + 1].y > P.y)      
                                      if (isLeft(V[i], V[i+1], P) > 0)  
                                          ++wn;            
                              }
                              else 
                    {                       
                                  if (V[i + 1].y <= P.y)     
                                      if (isLeft(V[i], V[i+1], P) < 0)  
                                          --wn;            
                              }
                      }
                      return wn != 0;
                  }
          
                  void Reset()
                  {
                     // Only run the check every 1 second rather than every update
                     // Not sure how intensive this algorithm is, but it's better to be safe
                     timer = 1000;
                  }
          
            void UpdateAI(uint32 diff)
            {
                     if (timer <= diff)
                     {
                            Map::PlayerList const& Players = me->GetMap()->GetPlayers();
                            for (Map::PlayerList::const_iterator itr = Players.begin(); itr != Players.end(); ++itr)
                            {
                                   if (Player* player = itr->GetSource())
                                   {
                                      if (player->GetAreaId() != me->GetAreaId())
                                             continue;
                                      Point p = { player->GetPositionX(), player->GetPositionY() };
                                      if (IsInArea(p))
                                             player->SetPvP(false);
                                      else
                                             player->SetPvP(true);
                                   }
                           }
                            timer = 1000;
                     } else timer -= diff;
            }
          
                  uint32 timer;
        };
    };
    
    
    void AddSC_npc_peacekeeper()
    {
        new npc_peacekeeper();
    }
    
    上面就是NPC的脚本代码。具体怎么加入到你的内核中去,你就自己想办法了!!
  • 相关阅读:
    9.17(day11)
    9.14(day10)
    9.13(day9)
    9.12(day8)
    mysql 的存储过程
    MySQL 子查询与多表联合查询
    MySQL 函数
    MySQL 的查询
    MySQL的约束
    MySQL 表的增删改查操作
  • 原文地址:https://www.cnblogs.com/needly/p/3751605.html
Copyright © 2020-2023  润新知