搜索
查看: 3638|回复: 9

[AMXX 带源码] 发一个很娱乐的-AWP开枪有闪电源码

[复制链接]
发表于 2009-1-15 03:23:38 | 显示全部楼层 |阅读模式 来自 中国–广东–广州–白云区
本帖最后由 点通粉丝 于 2009-1-15 03:25 编辑

此插件改变AWP成一个闪电枪

  1. */

  2. #define VERSION        "1.0"

  3. #include <amxmodx>
  4. #include <amxmisc>
  5. #include <cstrike>
  6. #include <fakemeta>

  7. new const lightning_sprite[] = "sprites/lgtning.spr"
  8. new const sound_file[] = "weapons/electro5.wav"

  9. new const Float:origin_offsets[45] =
  10. {
  11.         0.0,0.0,0.0,
  12.         0.0,0.0,32.0,
  13.         0.0,0.0,-32.0,
  14.         12.0,0.0,0.0,
  15.         -12.0,0.0,0.0,
  16.         0.0,12.0,0.0,
  17.         0.0,-12.0,0.0,
  18.         12.0,0.0,32.0,
  19.         -12.0,0.0,32.0,
  20.         0.0,12.0,32.0,
  21.         0.0,-12.0,32.0,
  22.         12.0,0.0,-32.0,
  23.         -12.0,0.0,-32.0,
  24.         0.0,12.0,-32.0,
  25.         0.0,-12.0,-32.0
  26. }

  27. new spriteindex
  28. new DeathMsg

  29. new clipammo[33]
  30. new bpammo[33]
  31. new bool:can_shoot[33]

  32. new enabled_pcvar
  33. new damage_pcvar
  34. new head_damage_pcvar
  35. new reload_time_pcvar
  36. new distance_pcvar

  37. public plugin_init()
  38. {
  39.         register_plugin("Awp -> Lightning Gun",VERSION,"GHW_Chronic")
  40.         register_forward(FM_PlayerPreThink,"Forward_Think")

  41.         enabled_pcvar = register_cvar("lg_awp_enabled","1")
  42.         damage_pcvar = register_cvar("lg_awp_damage","20.0")
  43.         head_damage_pcvar = register_cvar("lg_awp_hs_damage","400.0")
  44.         reload_time_pcvar = register_cvar("lg_awp_reload","1.0")
  45.         distance_pcvar = register_cvar("lg_awp_distance","40.0")

  46.         DeathMsg = get_user_msgid("DeathMsg")
  47. }

  48. public plugin_precache()
  49. {
  50.         spriteindex = precache_model(lightning_sprite)
  51.         precache_sound(sound_file)
  52. }

  53. public client_connect(id)
  54. {
  55.         can_shoot[id] = true
  56. }

  57. public Forward_Think(id)
  58. {
  59.         new clip, backpack
  60.         if(get_pcvar_num(enabled_pcvar) && is_user_alive(id) && get_user_weapon(id,clip,backpack)==CSW_AWP && (pev(id,pev_button) & IN_ATTACK))
  61.         {
  62.                 //Don't allow real AWP to fire
  63.                 set_pev(id,pev_button,pev(id,pev_button) - IN_ATTACK)

  64.                 if(clip && can_shoot[id])
  65.                 {
  66.                         //Get Player's nozzle origin
  67.                         //And Where he shot
  68.                         new I_player_origin[3], I_end_origin[3]
  69.                         new Float:player_origin[3], Float:end_origin[3]
  70.                         pev(id,pev_origin,player_origin)
  71.                         get_user_origin(id,I_player_origin,1)
  72.                         get_user_origin(id,I_end_origin,3)
  73.                         IVecFVec(I_end_origin,end_origin)
  74.                         IVecFVec(I_player_origin,player_origin)

  75.                         //Make a Lightning Beam between those 2 locations
  76.                         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  77.                         write_byte(0)                //TE_BEAMPOINTS
  78.                         write_coord(I_player_origin[0])        // start position
  79.                         write_coord(I_player_origin[1])
  80.                         write_coord(I_player_origin[2])
  81.                         write_coord(I_end_origin[0])        // end position
  82.                         write_coord(I_end_origin[1])
  83.                         write_coord(I_end_origin[2])
  84.                         write_short(spriteindex)
  85.                         write_byte(1)        // framestart
  86.                         write_byte(1)        // framerate
  87.                         write_byte(2)        // life in 0.1's
  88.                         write_byte(40)        // width
  89.                         write_byte(0)        // noise
  90.                         write_byte(255)
  91.                         write_byte(255)
  92.                         write_byte(255)
  93.                         write_byte(200)        // brightness
  94.                         write_byte(0)        // speed
  95.                         message_end()

  96.                         emit_sound(id,CHAN_VOICE,sound_file,VOL_NORM, ATTN_NORM,0,PITCH_NORM)

  97.                         //Take 1 clip ammo away
  98.                         //And remove all ammo temporarily so player cannot re-fire
  99.                         clipammo[id] = clip - 1
  100.                         bpammo[id] = backpack
  101.                         new weapid = engfunc(EngFunc_FindEntityByString,-1,"classname","weapon_awp")
  102.                         while(weapid && pev(weapid, pev_owner) != id)
  103.                         {
  104.                                 weapid = engfunc(EngFunc_FindEntityByString,weapid,"classname","weapon_awp")
  105.                         }
  106.                         if(weapid)
  107.                         {
  108.                                 cs_set_weapon_ammo(weapid,0)
  109.                                 if(clipammo[id])
  110.                                 {
  111.                                         set_hudmessage(255,0,0,0.85,0.85,0,6.0,get_pcvar_float(reload_time_pcvar))
  112.                                         show_hudmessage(id,"%d | %d",clipammo[id],bpammo[id])
  113.                                         can_shoot[id] = false
  114.                                         cs_set_user_bpammo(id,CSW_AWP,0)
  115.                                         remove_task(id)
  116.                                         set_task(get_pcvar_float(reload_time_pcvar),"give_ammo_back",id)       
  117.                                 }
  118.                         }

  119.                         //Possible targets to have been shot
  120.                         new players[32], num
  121.                         get_players(players,num,"h")

  122.                         new Float:target_origin[3]
  123.                         new Float:target_origin2[3]
  124.                         new Float:hit[3]

  125.                         new aiment, bodypart
  126.                         get_user_aiming(id,aiment,bodypart)
  127.                         new CsTeams:id_team = cs_get_user_team(id)

  128.                         for(new i=0;i<num;i++)
  129.                         {
  130.                                 //Not self / same team
  131.                                 if(players[i]!=id && cs_get_user_team(players[i])!=id_team)
  132.                                 {
  133.                                         pev(players[i],pev_origin,target_origin2)
  134.                                         //Loop through all offset origins
  135.                                         for(new current_offset=0;current_offset<15;current_offset++)
  136.                                         {
  137.                                                 target_origin[0] = target_origin2[0] + origin_offsets[current_offset*3 + 0]
  138.                                                 target_origin[1] = target_origin2[1] + origin_offsets[current_offset*3 + 1]
  139.                                                 target_origin[2] = target_origin2[2] + origin_offsets[current_offset*3 + 2]

  140.                                                 //Is the target able to be hit by the player (or is there a wall or something between them)
  141.                                                 engfunc(EngFunc_TraceLine,player_origin,target_origin,1,id,0)
  142.                                                 get_tr2(0,TR_vecEndPos,hit)
  143.                                                 if((hit[0]==target_origin[0] && hit[1]==target_origin[1] && hit[2]==target_origin[2]) || aiment==players[i])
  144.                                                 {
  145.                                                         //Calculate if in FOV (Because arctan calculations assume the lines are continuous, however they really only extend from player forward, not backward)
  146.                                                         static Float:angles[3], Float:diff[3], Float:reciprocalsq, Float:norm[3], Float:dot, Float:fov
  147.                                                         pev(id, pev_angles, angles)
  148.                                                         engfunc(EngFunc_MakeVectors, angles)
  149.                                                         global_get(glb_v_forward, angles)
  150.                                                         angles[2] = 0.0

  151.                                                         diff[0] = target_origin[0] - player_origin[0]
  152.                                                         diff[1] = target_origin[1] - player_origin[1]
  153.                                                         diff[2] = target_origin[2] - player_origin[2]
  154.                                                         //diff[2] = 0.0// - for 2D viewcone

  155.                                                         reciprocalsq = 1.0 / floatsqroot(diff[0]*diff[0] + diff[1]*diff[1] + diff[2]*diff[2])
  156.                                                         norm[0] = diff[0] * reciprocalsq
  157.                                                         norm[1] = diff[1] * reciprocalsq
  158.                                                         norm[2] = diff[2] * reciprocalsq

  159.                                                         dot = norm[0]*angles[0] + norm[1]*angles[1] + norm[2]*angles[2]
  160.                                                         pev(id, pev_fov, fov)
  161.                                                         if(dot >= floatcos(fov * 3.1415926535 / 360.0))
  162.                                                         {
  163.        
  164.                                                                 //Calculate if target is close enough to the lightning-rail to get hurt
  165.                                                                 new Float:slope[2][2]
  166.                                                                 slope[0][0] = (player_origin[1] - end_origin[1]) / (player_origin[0] - end_origin[0])
  167.                                                                 slope[1][0] = (player_origin[1] - target_origin[1]) / (player_origin[0] - target_origin[0])

  168.                                                                 slope[0][1] = (player_origin[1] - end_origin[1]) / (player_origin[2] - end_origin[2])
  169.                                                                 slope[1][1] = (player_origin[1] - target_origin[1]) / (player_origin[2] - target_origin[2])

  170.                                                                 new Float:tan[3][2]
  171.                                                                 new Float:sin[2]
  172.                                                                 tan[0][0] = floatatan(slope[1][0],degrees)
  173.                                                                 tan[1][0] = floatatan(slope[0][0],degrees)
  174.                                                                 tan[2][0] = floatabs(tan[0][0] - tan[1][0])
  175.                                                                 sin[0] = floatsin(tan[2][0],degrees)

  176.                                                                 tan[0][1] = floatatan(slope[1][1],degrees)
  177.                                                                 tan[1][1] = floatatan(slope[0][1],degrees)
  178.                                                                 tan[2][1] = floatabs(tan[0][1] - tan[1][1])
  179.                                                                 sin[1] = floatsin(tan[2][1],degrees)

  180.                                                                 //If that position is close enough to the target for him to be hit by the lightning
  181.                                                                 if(sin[0] * get_distance_f(target_origin,player_origin) <= get_pcvar_float(distance_pcvar) && sin[1] * get_distance_f(target_origin,player_origin) <= get_pcvar_float(distance_pcvar))
  182.                                                                 {
  183.                                                                         new hs = 0
  184.                                                                         new old_msgblock = get_msg_block(DeathMsg)
  185.                                                                         set_msg_block(DeathMsg,BLOCK_ONCE)
  186.                                                                         //If id is not aiming at target's head
  187.                                                                         if(players[i]!=aiment || bodypart!=1)
  188.                                                                         {
  189.                                                                
复制代码
 楼主| 发表于 2009-1-15 03:24:17 | 显示全部楼层 来自 中国–广东–广州–白云区
本帖最后由 点通粉丝 于 2009-1-15 03:26 编辑
  1.                 //Make a Lightning Beam on the hit target
  2.                                                                                 message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  3.                                                                                 write_byte(0)                //TE_BEAMPOINTS
  4.                                                                                 write_coord(floatround(target_origin[0]) + 32)        // start position
  5.                                                                                 write_coord(floatround(target_origin[1]) + 32)
  6.                                                                                 write_coord(floatround(target_origin[2]) + 32)
  7.                                                                                 write_coord(floatround(target_origin[0]) - 32)        // end position
  8.                                                                                 write_coord(floatround(target_origin[1]) - 32)
  9.                                                                                 write_coord(floatround(target_origin[2]) - 32)
  10.                                                                                 write_short(spriteindex)
  11.                                                                                 write_byte(1)        // framestart
  12.                                                                                 write_byte(1)        // framerate
  13.                                                                                 write_byte(2)        // life in 0.1's
  14.                                                                                 write_byte(200)        // width
  15.                                                                                 write_byte(0)        // noise
  16.                                                                                 write_byte(255)
  17.                                                                                 write_byte(255)
  18.                                                                                 write_byte(255)
  19.                                                                                 write_byte(200)        // brightness
  20.                                                                                 write_byte(0)        // speed
  21.                                                                                 message_end()

  22.                                                                                 fm_fakedamage(players[i],id,get_pcvar_float(damage_pcvar),DMG_BULLET)
  23.                                                                         }
  24.                                                                         else
  25.                                                                         {
  26.                                                                                 hs = 1
  27.                                                                                 fm_fakedamage(players[i],id,get_pcvar_float(head_damage_pcvar),DMG_BULLET)
  28.                                                                         }
  29.                                                                         set_msg_block(DeathMsg,old_msgblock)

  30.                                                                         //If player died produce death message
  31.                                                                         if(!is_user_alive(players[i]))
  32.                                                                         {
  33.                                                                                 make_deathmsg(id,players[i],hs,"awp")
  34.                                                                         }
  35.                                                                 }
  36.                                                         }
  37.                                                         break;
  38.                                                 }
  39.                                         }
  40.                                 }
  41.                         }
  42.                 }
  43.         }
  44. }

  45. //From VEN
  46. stock fm_fakedamage(victim,attacker, Float:takedmgdamage, damagetype)
  47. {
  48.         new entity = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"trigger_hurt"))

  49.         new value[16]
  50.         float_to_str(takedmgdamage * 2, value, 15)
  51.         set_kvd(0, KV_ClassName,"trigger_hurt")
  52.         set_kvd(0, KV_KeyName, "dmg")
  53.         set_kvd(0, KV_Value, value)
  54.         set_kvd(0, KV_fHandled, 0)
  55.         dllfunc(DLLFunc_KeyValue,entity,0)

  56.         num_to_str(damagetype, value, 15)
  57.         set_kvd(0, KV_ClassName,"trigger_hurt")
  58.         set_kvd(0, KV_KeyName, "damagetype")
  59.         set_kvd(0, KV_Value, value)
  60.         set_kvd(0, KV_fHandled, 0)
  61.         dllfunc(DLLFunc_KeyValue,entity,0)

  62.         set_kvd(0, KV_ClassName,"trigger_hurt")
  63.         set_kvd(0, KV_KeyName, "origin")
  64.         set_kvd(0, KV_Value, "8192 8192 8192")
  65.         set_kvd(0, KV_fHandled, 0)
  66.         dllfunc(DLLFunc_KeyValue,entity,0)

  67.         dllfunc(DLLFunc_Spawn,entity)

  68.         set_pev(entity,pev_classname,"Lightning")
  69.         set_pev(entity,pev_owner,attacker)
  70.         dllfunc(DLLFunc_Touch,entity,victim)
  71.         engfunc(EngFunc_RemoveEntity,entity)

  72.         return 1
  73. }

  74. public give_ammo_back(id)
  75. {
  76.         cs_set_user_bpammo(id,CSW_AWP,bpammo[id])
  77.         new weapid = engfunc(EngFunc_FindEntityByString,-1,"classname","weapon_awp")
  78.         while(weapid && pev(weapid, pev_owner) != id)
  79.         {
  80.                 weapid = engfunc(EngFunc_FindEntityByString,weapid,"classname","weapon_awp")
  81.         }
  82.         if(weapid)
  83.         {
  84.                 cs_set_weapon_ammo(weapid,clipammo[id])
  85.         }
  86.         can_shoot[id] = true
  87. }
复制代码
1# 点通粉丝

(如虚幻闪电枪)
CVARs :
lg_awp_enabled -启用/禁用插件( 1 =打开0 =关闭) (默认值: 1 )
lg_awp_damage -(默认值: 20.0 )
lg_awp_hs_damage -(默认值: 400.0 )
lg_awp_reload -(秒) (默认值: 1.0 )
lg_awp_distance -(默认值: 40.0 )
回复

使用道具 举报

 楼主| 发表于 2009-1-15 03:37:55 | 显示全部楼层 来自 中国–广东–广州–白云区
这源码太长.所以分作两段发上来
这插件在cs1.5上测试的时侯.用AWP开第二枪的时侯死机
不知点解呢....???
望高手改一改..五该晒

*/////////////
cs1.6未测试过.五知效果是五是也一样呢
完1.6的人请自行恻试一下啦
回复

使用道具 举报

 楼主| 发表于 2009-1-16 01:12:22 | 显示全部楼层 来自 中国–广东–广州–白云区
在jim_yang 的解答下CS1.5可以使用啦

你可以试试把cs_set_user_bpammo(id, CSW_AWP, ?)字样的地方替换成
set_pdata_int(id, 381, ?)
这样就能在1.5下用了,不过1.6又不能用了。
1.6里用set_pdata_int(id, 377, ?)
如果你想两个版同时能用,要加入对游戏版本的判断,然后分别使用两种方法。
设置一个全局变量offset_awp
if(1.5)
  offset_awp = 381
else
  offset_awp = 377
set_pdata_int(id, offset_awp, ?)
回复

使用道具 举报

 楼主| 发表于 2009-1-19 06:10:01 | 显示全部楼层 来自 中国–广东–广州–白云区
哦.我知点解我编译来编译去都编译五到啦.原来是要用utf-8格式来编译的
唉..搞了我两天总算弄明白啦..
这个可用在1.5啦
回复

使用道具 举报

发表于 2009-2-26 01:56:22 | 显示全部楼层 来自 中国–广东–广州–番禺区
收到不错。。。
回复

使用道具 举报

发表于 2009-5-22 06:39:06 | 显示全部楼层 来自 中国–广东–东莞
加油,。。。。
回复

使用道具 举报

发表于 2009-7-25 18:57:41 | 显示全部楼层 来自 中国–浙江–杭州
不错啊,我在CZ1.6中试过,好用的,但是AWP的威力下降不少,击中一枪只有20-30点血
回复

使用道具 举报

发表于 2009-7-27 13:55:00 | 显示全部楼层 来自 中国–河南–南阳
这.....利用闪电攻击人吗...有点....
回复

使用道具 举报

发表于 2011-3-11 16:34:51 | 显示全部楼层 来自 中国–广东–江门
呵呵!这个不错!!!!!!
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表