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

MOD中国同盟社

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1017|回复: 8

[求助] 怎麼創建一個虛擬玩家? [复制链接]

Rank: 10Rank: 10Rank: 10

帖子
1292
精华
1
声望
7901 点
金币
857 Mold
被赞许
10 次
注册时间
2008-10-11

热心会员奖 Modchina元老 黑暗使者

发表于 2011-7-27 22:40:03 来自手机 |显示全部楼层
我見過別人的插件創建過兩個虛擬的玩家,沒有實體,活著的。可以讓兩邊玩家都死了也不會結束回合。這個虛擬玩家可以在排行榜看到的,不是機器人。求寫的方法

使用道具 举报

Rank: 10Rank: 10Rank: 10

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

可爱小猫

发表于 2011-7-28 10:37:35 |显示全部楼层
如果没有实体,他还是什么?就算是一个可以穿过的模型都有实体。在TAB记分牌能看见的不是BOT吗?不是BOT就算是NPC好了也是一个实体。没那么容易写。

使用道具 举报

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

帖子
406
精华
0
声望
9411 点
金币
1421 Mold
被赞许
4 次
注册时间
2009-12-18
发表于 2011-7-29 10:44:38 |显示全部楼层
怎麼聽起來好像是死鬥模式為了避免其中一方死光導致回合結束而做的假BOT呢…

使用道具 举报

Rank: 10Rank: 10Rank: 10

帖子
1292
精华
1
声望
7901 点
金币
857 Mold
被赞许
10 次
注册时间
2008-10-11

热心会员奖 Modchina元老 黑暗使者

发表于 2011-7-30 11:58:12 来自手机 |显示全部楼层
怎麼說呢,在遊戲里是沒有這個玩家呢,但是排行榜有顯示

使用道具 举报

Rank: 5Rank: 5

帖子
70
精华
1
声望
879 点
金币
239 Mold
被赞许
25 次
注册时间
2011-7-27
发表于 2011-7-30 13:02:42 |显示全部楼层
噢!玩过足球服没有?足球服会默认建两个这样的玩家!
已有 1 人评分被赞许 收起 理由
zangyu008 + 1 找到了,一个fakebot.sma解决了我的疑问.

总评分: 被赞许 + 1   查看全部评分

使用道具 举报

Rank: 10Rank: 10Rank: 10

帖子
1292
精华
1
声望
7901 点
金币
857 Mold
被赞许
10 次
注册时间
2008-10-11

热心会员奖 Modchina元老 黑暗使者

发表于 2011-7-30 15:42:54 |显示全部楼层
youxiaocui 发表于 2011-7-30 13:02
噢!玩过足球服没有?足球服会默认建两个这样的玩家!

啊?足球插件有?我去下载一个看看
谢谢你告诉我啊.

使用道具 举报

Rank: 5Rank: 5

帖子
70
精华
1
声望
879 点
金币
239 Mold
被赞许
25 次
注册时间
2011-7-27
发表于 2011-7-30 20:29:25 |显示全部楼层
我的新建虚拟玩家插件,虚拟玩家可被打,死后爆炸
  1. #include <amxmodx>
  2. #include <cstrike>
  3. #include <engine>
  4. #include <amxmisc>
  5. #include <fakemeta>

  6. #define FAKEPLAYERSPEED 200   //dynamic fake-player run speed

  7. new models[32][33],num
  8. new body_ents[33][999]
  9. new creators[33]
  10. new exp
  11. new bool:dynamic_ent[999]
  12. new g_fwid

  13. public plugin_init(){
  14.         register_plugin("fake_player"," 0.8", "Enigmaya")
  15.         register_clcmd("amx_create_fake","create_dynamic")
  16.         register_think("fake_player","ent_think")
  17.         unregister_forward(FM_PrecacheEvent, g_fwid, 1)
  18.         register_forward(FM_PlaybackEvent, "fwPlaybackEvent")       
  19. }

  20. public plugin_precache(){
  21.     exp= precache_model("sprites/shockwave.spr")
  22.     num = get_models(models,32)
  23.     for(new i=0;i<num;i++){
  24.       new modelstring[64];
  25.       format(modelstring,63,"models/player/%s/%s.mdl",models[i],models[i])
  26.       precache_model(modelstring)
  27.     }
  28.     g_fwid = register_forward(FM_PrecacheEvent, "fwPrecacheEvent", 1)
  29. }

  30. public fwPlaybackEvent(flags, id, eventid) {
  31.       new ent,body,ent_name[32],ent_ori[3],Float:ent_health
  32.       get_user_aiming (id,ent,body)
  33.       if (ent){
  34.             entity_get_string (ent, EV_SZ_classname, ent_name, 31)
  35.             ent_health=entity_get_float(ent,EV_FL_health)
  36.             get_user_origin(id,ent_ori,3)
  37.             if(equal(ent_name, "fake_player")){
  38.                   if(ent_health<=0){
  39.                         makeexp(ent_ori,20)
  40.                         remove_entity(ent)
  41.                   }
  42.             }
  43.       }
  44. }

  45. public get_models(array[32][],len){
  46.     new dirpos, output[64], outlen, filledamt

  47.     // go through custom models
  48.     while((dirpos = read_dir("models/player",dirpos,output,255,outlen)) != 0) {

  49.       if(containi(output,".") == -1){
  50.         new modelfile[64]
  51.         format(modelfile,63,"models/player/%s/%s.mdl",output,output)
  52.         if(file_exists(modelfile))
  53.         {
  54.           format(array[filledamt],len,"%s",output)
  55.           filledamt += 1
  56.         }
  57.         if(filledamt > 32)
  58.         {
  59.           return filledamt
  60.         }
  61.       }
  62.     }
  63.     return filledamt
  64. }

  65. public create_dynamic(id){
  66.         new entid=try_build(id)
  67.         if( !entid )
  68.                 return PLUGIN_HANDLED
  69.         show_explode(id)       
  70.         set_dynamic_sequence(id,entid)
  71.         entity_set_float(entid,EV_FL_nextthink,halflife_time() + 0.5)
  72.         dynamic_ent[entid]=true
  73.         
  74.         return PLUGIN_HANDLED               
  75. }

  76. try_build(id)
  77. {
  78.         new Float:pOri[3]
  79.         entity_get_vector(id, EV_VEC_origin, pOri)
  80.         new entid=build_now(pOri, id)
  81.         drop_to_floor(entid)
  82.         return entid
  83. }



  84. set_dynamic_sequence(id,entPlayer)
  85. {
  86.         new Float:Vel[3]
  87.         VelocityByAim(id,FAKEPLAYERSPEED,Vel)
  88.        
  89.         new motion=4
  90.         Vel[2]=float(0)
  91.         entity_set_vector(entPlayer,EV_VEC_velocity,Vel)//set Velocity
  92.         entity_set_int(entPlayer,EV_INT_sequence,motion)               
  93. }

  94. show_explode(id)
  95. {
  96.         new ori[3]
  97.         get_user_origin(id,ori)
  98.         makeexp(ori,20)
  99. }


  100. public change_origin(id,entid,Float:pOri[3],Float:eOri[3])
  101. {
  102.         if(!is_user_alive(id) )
  103.                 return PLUGIN_HANDLED
  104.                
  105.         new ran=random(2)
  106.        
  107.            switch(ran){
  108.                 case 0:{
  109.                         pOri[2]+=70.0
  110.                         eOri[2]+=65.0
  111.                         entity_set_origin(id,pOri)
  112.                         entity_set_origin(entid,eOri)
  113.                 }
  114.                 case 1:{
  115.                         pOri[2]+=65.0
  116.                         eOri[2]+=70.0
  117.                         entity_set_origin(id,eOri)
  118.                         entity_set_origin(entid,pOri)
  119.                 }
  120.         }
  121.         return PLUGIN_CONTINUE
  122. }       



  123. //----------------------------------build fake-player------------------------------
  124. public build_now(Float:Ori[3],id)
  125. {
  126.         new Float:Vel[3],Float:angle[3],pmodel[33]  
  127.        
  128.         new entPlayer= create_entity("info_target")
  129.         if( !entPlayer )
  130.                 return 0
  131.                
  132.         entity_set_string(entPlayer, EV_SZ_classname, "fake_player")
  133.             
  134.         //--------set model----------
  135.         cs_get_user_model ( id, pmodel, 32 )
  136.         new mstring[64]
  137.         pmodel=models[random_num(0,num-1)]
  138.         format(mstring,63,"models/player/%s/%s.mdl",pmodel,pmodel)
  139.         entity_set_model(entPlayer, mstring)
  140.        
  141.         //-------base option-------
  142.         new Float:maxs[3] = {16.0,16.0,36.0}
  143.             new Float:mins[3] = {-16.0,-16.0,-36.0}
  144.             entity_set_size(entPlayer,mins,maxs)
  145.         entity_set_int(entPlayer, EV_INT_solid, 2)//SOLID_BBOX)   
  146.         entity_set_int(entPlayer, EV_INT_movetype,MOVETYPE_NOCLIP)
  147.         //entity_set_edict(entPlayer, EV_ENT_owner, 0)
  148.        
  149.         entity_set_float(entPlayer,EV_FL_takedamage,1.0)
  150.         entity_set_float(entPlayer,EV_FL_health,1.00)
  151.         entity_set_float(entPlayer,EV_FL_max_health,100.00)
  152.         
  153.         
  154.         //-------set origin--------

  155.         entity_set_origin(entPlayer, Ori)
  156.        
  157.         //--------set animation-------
  158.         entity_set_float(entPlayer,EV_FL_animtime,2.0)
  159.             entity_set_float(entPlayer,EV_FL_framerate,1.0)
  160.        
  161.         //-----------set angle-----------
  162.         VelocityByAim(id,FAKEPLAYERSPEED,Vel)
  163.         Vel[2]=float(0)
  164.         vector_to_angle(Vel,angle)
  165.         entity_set_vector(entPlayer,EV_VEC_angles,angle)
  166.         entity_set_vector(entPlayer,EV_VEC_v_angle,angle)
  167.         
  168.         drop_to_floor(entPlayer)
  169.                        
  170.         body_ents[id][creators[id]] = entPlayer
  171.         dynamic_ent[entPlayer]=false//initialize bool:dynamic_ent
  172.         return entPlayer
  173. }

  174.        


  175. //-----------------------fake-player think--------------------------


  176. public ent_think(entid){
  177.         if ( is_valid_ent(entid) ){
  178.                 drop_to_floor(entid)
  179.                 new Float:fOri[3]
  180.                 entity_get_vector(entid,EV_VEC_origin,fOri)       
  181.                 find_way(entid,fOri)
  182.                 entity_set_float(entid,EV_FL_nextthink,halflife_time() + 0.1)
  183.         }       
  184.         return PLUGIN_CONTINUE
  185. }

  186. stop_fake(entid)
  187. {
  188.         new Float:Vel[3]
  189.         Vel[0]=0.0
  190.         Vel[1]=0.0
  191.         Vel[2]=0.0
  192.         entity_set_vector(entid,EV_VEC_velocity,Vel)
  193.         entity_set_int(entid,EV_INT_sequence,1)
  194. }

  195. stock DirectedVec(Float:start[3],Float:end[3],Float:reOri[3])
  196. {
  197. //-------code from Hydralisk's 'Admin Advantage'-------//       
  198.         new Float:v3[3]
  199.         v3[0]=start[0]-end[0]
  200.         v3[1]=start[1]-end[1]
  201.         v3[2]=start[2]-end[2]
  202.         new Float:vl = vector_length(v3)
  203.         reOri[0] = v3[0] / vl
  204.         reOri[1] = v3[1] / vl
  205.         reOri[2] = v3[2] / vl
  206. }

  207. public makeexp(ori[3],times){
  208.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  209.         write_byte(3)
  210.         write_coord(ori[0])
  211.         write_coord(ori[1])
  212.         write_coord(ori[2])
  213.         write_short(exp)
  214.         write_byte(times)
  215.         write_byte(10)
  216.         write_byte(0)
  217.         message_end()
  218. }

  219. find_way(entid,Float:fOri[3])
  220. {
  221.         new Float:vTrace[3],Float:vTraceEnd[3],Float:hitOri[3],Float:Vel[3],Float:angle[3]
  222.         // set a entPos to trace a line
  223.         velocity_by_aim(entid, 64, vTrace)
  224.         vTraceEnd[0] = vTrace[0] + fOri[0]
  225.         vTraceEnd[1] = vTrace[1] + fOri[1]
  226.         vTraceEnd[2] = vTrace[2] + fOri[2]+25
  227.         new hitent=trace_line(entid, fOri, vTraceEnd, hitOri)

  228.         //check the trace return values to check is player hit something...
  229.         //doesn't check the hit entity,
  230.         //because if hit nothing,will return 0. and if hit the wall,also return 0.
  231.         new Float:gdis=vector_distance(fOri,hitOri)
  232.        
  233.         //set another entPos to trace another line
  234.         velocity_by_aim(entid, 45, vTrace)
  235.         vTraceEnd[0] = vTrace[0] + fOri[0]
  236.         vTraceEnd[1] = vTrace[1] + fOri[1]
  237.         vTraceEnd[2] = vTrace[2] + fOri[2]-45// lower than first dot
  238.         trace_line(entid, fOri, vTraceEnd, hitOri)
  239.        
  240.         new Float:gdis2=vector_distance(fOri,hitOri)
  241.        
  242.         if( gdis2<43 ){
  243.                 entity_get_vector(entid,EV_VEC_origin,fOri)
  244.                 fOri[2]+=10
  245.                 entity_set_vector(entid,EV_VEC_origin,fOri)
  246.         }       

  247.         entity_get_vector(entid,EV_VEC_velocity,Vel)
  248.         if( hitent || gdis<60 ){
  249.                 //stop
  250.                 stop_fake(entid)
  251.                                                
  252.                 //turn random angle
  253.                 entity_get_vector(entid,EV_VEC_v_angle,angle)
  254.                 new Float:fnum=random_float(-90.0,90.0)
  255.                 angle[1]+=fnum
  256.                 //angle[1]+=90.0
  257.                 entity_set_vector(entid,EV_VEC_v_angle,angle)
  258.                 return
  259.         }
  260.         if( Vel[0]==0.0 || Vel[1]==0.0 ){
  261.                 VelocityByAim(entid,FAKEPLAYERSPEED,Vel)
  262.                 Vel[2]=0.0
  263.                 vector_to_angle(Vel,angle)
  264.                 entity_set_vector(entid,EV_VEC_angles,angle)       
  265.                 entity_set_vector(entid,EV_VEC_velocity,Vel)
  266.                 entity_set_int(entid,EV_INT_sequence,4)       
  267.         }       
  268. }
复制代码

使用道具 举报

Moderator

绑手帝

Rank: 8Rank: 8

帖子
3817
精华
2
声望
8110 点
金币
3174 Mold
被赞许
400 次
注册时间
2009-3-13

Modchina灌水王 Modchina元老

发表于 2013-8-9 20:38:31 |显示全部楼层
alliedmods 有一样的插件 round_end_blocker

使用道具 举报

Rank: 2

帖子
100
精华
0
声望
336 点
金币
60 Mold
被赞许
0 次
注册时间
2013-7-3
发表于 2014-2-20 16:33:20 |显示全部楼层
这个是源码吗》?有别的说明吗?

使用道具 举报

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

回顶部