设为首页收藏本站新闻投稿

MOD中国同盟社

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 890|回复: 13

[求助] NPC自动寻找附近玩家 [复制链接]

Rank: 10Rank: 10Rank: 10

帖子
1250
精华
0
声望
3577 点
金币
470 Mold
被赞许
45 次
注册时间
2010-7-13

可爱小猫

发表于 2012-1-20 11:33:52 |显示全部楼层
又是NPC的大问题一个……
单独用这个
  1. for (new i=0;i<33;i++)
  2. {
  3.      if (is_user_alive(i) && entity_range(ent, i)<=600.0)     //如果i是活的,并且i与npc的距离<=600.0
  4.      {
  5.           aim_ent(ent, i)     //NPC瞄准i
  6.           //……其余事件
  7.      }
  8. }
复制代码


被搜索到在600范围内的玩家似乎排序不对,不是找最近的人,而是找更早加入游戏的人(囧)
于是我设置NPC后他就一直追着我打,我跑远远的他还是只追到我死。
---------------------------------
于是费劲心思整出一个寻找最近玩家的stock
  1. stock get_closest_player(ent)
  2. {
  3.         new players[32], num
  4.         get_players(players, num, "a")
  5.         new id=0, Float:closestdist = 1000.0
  6.         new player, Float:dist

  7.         for (new i=0;i<num;i++)
  8.         {
  9.                 player = players[i]
  10.                 dist = entity_range(player, ent)
  11.                 if(dist < closestdist)
  12.                 {
  13.                         id = player
  14.                         closestdist = dist
  15.                 }
  16.         }
  17.         if (id && get_user_team(id)==2) return id

  18.         return 0
  19. }
复制代码



实际上我也不完全懂这东西写的什么意思,特别是他怎么计算最近玩家的
这东西是从https://forums.alliedmods.net/showthread.php?t=138173的内容中萃取来的

==============
于是又有问题了,这东西屁股后面的不找(还会判断前后方?)
前面,墙后面的死追(透视眼?)
不过好在他终于懂得放弃追寻远距离的玩家,找近的抽,谁靠近谁倒霉……
==============
为了修复问题,我找到两个函数——
engine.inc
  1. native is_in_viewcone(entity, const Float:origin[3], use3d = 0)
  2. native is_visible(entity, target);
复制代码



if (is_in_viewcone(ent, origin)) 我用了没什么反应(我连他是不是用在if上都不知道)
if (is_visible(ent, id)) 这个也没反应,不过我找出了问题……这东西根本不是(id是ent可以看见的)的意思,
根本就是(id是被ent瞄准)。可是我也有让NPC瞄准玩家,他就是不反应,问题=我写的瞄准和他的瞄准不同位。
  1. stock aim_ent(ent, id)
  2. {
  3.         new Float:origin[3], Float:origin2[3], Float:angle[3]
  4.         entity_get_vector(id, EV_VEC_origin, origin)
  5.         entity_get_vector(ent, EV_VEC_origin, origin2)
  6.         xs_vec_sub(origin, origin2, origin)
  7.         xs_vec_normalize(origin, origin)
  8.         vector_to_angle(origin, angle)
  9.         entity_set_vector(ent, EV_VEC_v_angle, angle)
  10.         angle[0] = 0.0
  11.         entity_set_vector(ent, EV_VEC_angles, angle)
  12. }
复制代码



这瞄准应该没问题吧?他看不见我也没办法
=====================
问题综合:
NPC不会寻找屁股后面的玩家来pk
NPC不理会墙壁的阻拦,透视眼追杀墙壁后面的玩家
--还是需要一个函数来判断玩家是否在NPC的面前,看得见。

使用道具 举报

Rank: 10Rank: 10Rank: 10

帖子
1093
精华
0
声望
4196 点
金币
605 Mold
被赞许
1 次
注册时间
2009-5-16
发表于 2012-1-20 12:30:47 |显示全部楼层
  表示JAVA程序员看着头疼了,只看懂if和for循环
哎,CS外国的不要弄追击啊,不然我就白弄了!

使用道具 举报

Rank: 5Rank: 5

帖子
316
精华
0
声望
788 点
金币
94 Mold
被赞许
2 次
注册时间
2010-7-13
发表于 2012-1-20 14:45:39 |显示全部楼层
深奥                           

使用道具 举报

Rank: 7Rank: 7Rank: 7

帖子
1926
精华
0
声望
2850 点
金币
380 Mold
被赞许
2 次
注册时间
2009-5-31
发表于 2012-1-20 16:21:31 |显示全部楼层
恩恩,表示功能残缺~~~

使用道具 举报

Rank: 8Rank: 8

帖子
1219
精华
5
声望
1774 点
金币
377 Mold
被赞许
35 次
注册时间
2009-4-25
发表于 2012-1-20 23:58:06 |显示全部楼层
本帖最后由 wlxms 于 2012-1-20 23:59 编辑

哈哈 比我好些 我的是只会指定一个玩家 一个劲的往玩家方向冲 不会转弯... 而且玩家走了 只会死死的盯着玩家但是还是往那个方向跑... 还不能上斜坡...我彻底蛋疼了...

使用道具 举报

Rank: 8Rank: 8

帖子
1219
精华
5
声望
1774 点
金币
377 Mold
被赞许
35 次
注册时间
2009-4-25
发表于 2012-1-21 00:04:28 |显示全部楼层
for (new i=0;i<33;i++)
{
     if (is_user_alive(i) && entity_range(ent, i)<=600.0)     //如果i是活的,并且i与npc的距离<=600.0
     {
          aim_ent(ent, i)     //NPC瞄准i
          //……其余事件
     }
}
在这段里面加格break试试

使用道具 举报

Rank: 8Rank: 8

帖子
1219
精华
5
声望
1774 点
金币
377 Mold
被赞许
35 次
注册时间
2009-4-25
发表于 2012-1-21 00:07:28 |显示全部楼层
本帖最后由 wlxms 于 2012-1-21 00:08 编辑

怎么设置实体是否可以被破坏和实体的血量
我设置的了实体是否可以被破坏但是却设置不了血量(func_breakable)
如果可以 +我QQ 815497317

使用道具 举报

Rank: 10Rank: 10Rank: 10

帖子
1250
精华
0
声望
3577 点
金币
470 Mold
被赞许
45 次
注册时间
2010-7-13

可爱小猫

发表于 2012-1-21 08:02:31 |显示全部楼层
wlxms 发表于 2012-1-21 00:07
怎么设置实体是否可以被破坏和实体的血量
我设置的了实体是否可以被破坏但是却设置不了血量(func_breakable ...


        entity_set_float(ent, EV_FL_health, 700.0)
        entity_set_float(ent, EV_FL_takedamage, 2.0)

伤害类型,CS玩家,1.0则是实体的伤害类型,半条命的伤害类型。2.0则跟人类一样难打死。
而且创建实体似乎不能用pev。无效。


使用道具 举报

Rank: 7Rank: 7Rank: 7

帖子
157
精华
4
声望
1284 点
金币
454 Mold
被赞许
42 次
注册时间
2010-4-18

懒人勋章

发表于 2012-1-21 08:51:59 |显示全部楼层
本帖最后由 冈崎汐 于 2012-1-21 08:52 编辑

楼主的第一次尝试其实可以完美解决问题.

放弃 for 循环, 改用 while 循环, 用 random 接口获取索引 "i", 这样被检测的玩家是随机的. 不会出现楼主所述现象. 在 while 语句中设置循环次数, 防止循环过多.
Acfun Guard 使用教程、更新地址:
http://lolifun.net

领导: 既然都满意, 为何移民? 他说, 因为那里允许不满意.

使用道具 举报

Rank: 8Rank: 8

帖子
1219
精华
5
声望
1774 点
金币
377 Mold
被赞许
35 次
注册时间
2009-4-25
发表于 2012-1-21 13:24:17 |显示全部楼层
水蛭 发表于 2012-1-21 08:02
entity_set_float(ent, EV_FL_health, 700.0)
        entity_set_float(ent, EV_FL_takedamage, 2.0)

用什么实体 func_breakable?还是...

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

回顶部