关灯
开启左侧

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

  [复制链接]
admin实名认证 发表于 2016-5-4 22:41:14 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
和平守护者卫士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的脚本代码。具体怎么加入到你的内核中去,你就自己想办法了!!
 
VIP介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • 荣誉管理

    曾经为论坛做出突出贡献目前已离职的版主
  • 论坛元老

    为论坛做出突出贡献的会员

0关注

5粉丝

3421帖子

排行榜
作者专栏

QQ交流群&&微信订阅号

QQ交流群

微信订阅号

吾爱尚玩资源基地永久域名:

Www.523Play.Com

在线管理员QQ:1589479632

邮箱:Email@523play.com

QQ交流群:558936238

Copyright   ©2015-2116  吾爱尚玩资源基地|523play.comPowered by©523Pplay.Com技术支持:吾爱尚玩资源基地