Advertisement
MasamuneDate

Claymore

Apr 12th, 2018
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 12.34 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4.  
  5. #define OFFSET_CSMONEY  115
  6. #define IGNORE_MONSTERS 1
  7.  
  8. new const Claym_mdl[] = "models/mon_50.mdl"
  9. new body_Claym[33]//, Owner[33]
  10. new bool:buy_Claym[33]
  11. new bool:plant_Claym[33]
  12. new bool:g_bBuyZone[33]
  13. new plug_Claym, cost_Claym, roll_Claym, dam_Claym, sector_Claym, bayrules_Claym, damdist_Claym
  14. new sprBoom, sprSmoke//, sprBeam
  15. public plugin_init()
  16. {
  17.     register_plugin("Claymore", "1.00", "StarLey_Andrew")
  18.    
  19.     register_clcmd("say claymore", "claymore_wats")
  20.     register_clcmd("buyclaymore", "Cmd_BuyClaym")
  21.    
  22.     plug_Claym = register_cvar("amx_Claym", "1")
  23.     bayrules_Claym = register_cvar("Claym_buyzone", "0")        // obey buyzone rules? (1 or 0)
  24.     cost_Claym = register_cvar("Claym_cost", "500")         // the cost of each Claym bought
  25.     roll_Claym = register_cvar("rolles", "40")
  26.     dam_Claym = register_cvar("Damages", "200")
  27.     sector_Claym = register_cvar("Sector", "80")
  28.     damdist_Claym = register_cvar("Distance", "80")
  29.    
  30.    
  31.     register_event("StatusIcon", "Event_BuyZone", "be", "2=buyzone")
  32.     RegisterHam(Ham_Spawn,"player","Player_respawn")
  33.     RegisterHam(Ham_Killed, "player", "Plyer_dead")
  34. }
  35. public plugin_precache()
  36. {
  37.     precache_model(Claym_mdl)
  38.     sprBoom  = precache_model("sprites/hexplo.spr")
  39.     sprSmoke = precache_model("sprites/steam.spr")
  40.     //sprBeam = precache_model("sprites/laserbeam.spr")
  41. }
  42. public client_connect(id)
  43. {
  44.     if(get_pcvar_num(plug_Claym))
  45.     {
  46.         plant_Claym[id] = false
  47.         buy_Claym[id] = false
  48.     }
  49. }
  50.  
  51. public client_disconnect(id)
  52. {
  53.     if(get_pcvar_num(plug_Claym))
  54.     {
  55.         plant_Claym[id] = false
  56.         buy_Claym[id] = false
  57.     }
  58. }
  59. public Player_respawn(id)
  60. {
  61.     if (plant_Claym[id])
  62.     {
  63.         engfunc(EngFunc_RemoveEntity, body_Claym[id])
  64.         plant_Claym[id] = false
  65.         buy_Claym[id] = true
  66.         client_print(id, print_chat, "МОÐ�-50 перемещена в Ñ�нарÑ�жение")
  67.     }
  68.     return PLUGIN_HANDLED
  69. }
  70. public Plyer_dead(victim, attacker)
  71. {
  72.     if( !is_user_connected( victim ) )
  73.         return HAM_IGNORED
  74.      
  75.     if( attacker == victim || !attacker )
  76.         return HAM_IGNORED
  77.        
  78.     if (pev_valid(body_Claym[victim]))
  79.         {
  80.             engfunc(EngFunc_RemoveEntity, body_Claym[victim])
  81.             plant_Claym[victim] = false
  82.             buy_Claym[victim] = false          
  83.         }
  84.         return PLUGIN_HANDLED
  85. }
  86. public claymore_wats(id)
  87. {  
  88.     if(buy_Claym[id])
  89.     {
  90.         if(!plant_Claym[id])
  91.         {
  92.             PlantClaym(id)
  93.             return PLUGIN_HANDLED
  94.         }
  95.     }
  96.     else
  97.     {
  98.         if(plant_Claym[id])
  99.         {
  100.             ActClaym_visual(id)
  101.             return PLUGIN_HANDLED
  102.         }
  103.     }
  104.     return PLUGIN_HANDLED
  105. }
  106.  
  107. public Cmd_BuyClaym(id)
  108. {
  109.     if(!get_pcvar_num(plug_Claym) || !is_user_alive(id))
  110.     return PLUGIN_HANDLED
  111.    
  112.     if(!g_bBuyZone[id])
  113.     {
  114.         client_print(id, print_center, "Ð’Ñ‹ должны находитьÑ�Ñ� в зоне закупки")
  115.         return PLUGIN_HANDLED
  116.     }
  117.    
  118.     if(plant_Claym[id])
  119.     return PLUGIN_HANDLED
  120.     if(buy_Claym[id])
  121.     {
  122.         client_print(id, print_chat, "Ð’Ñ‹ уже купили МОÐ�-50")
  123.         return PLUGIN_HANDLED
  124.     }
  125.     if(fm_get_user_money(id) < get_pcvar_num(cost_Claym))
  126.     {  
  127.         client_print(id, print_chat, "У ВаÑ� не хватает денег на МОÐ�-50 ($%d)", get_pcvar_num(cost_Claym))
  128.         return PLUGIN_HANDLED
  129.     }
  130.     fm_set_user_money(id, fm_get_user_money(id)-get_pcvar_num(cost_Claym))
  131.     buy_Claym[id] = true
  132.     plant_Claym[id] = false
  133.     client_print(id, print_chat, "Ð’Ñ‹ купили мину МОÐ�-50", buy_Claym[id])
  134.     return PLUGIN_HANDLED
  135. }
  136. public Event_BuyZone(id)
  137. {
  138.     if(get_pcvar_num(plug_Claym))
  139.     {
  140.         if(read_data(1))
  141.             g_bBuyZone[id] = true
  142.         else{
  143.             if(get_pcvar_num(bayrules_Claym))
  144.                 g_bBuyZone[id] = false
  145.             else
  146.                 g_bBuyZone[id] = true
  147.         }
  148.     }
  149. }
  150. public PlantClaym(id)
  151. {
  152.     if(!is_user_alive(id))
  153.     return PLUGIN_HANDLED
  154.    
  155.     new Float:Kuda[3]
  156.     new Float:Otkuda[3]
  157.     new Float:VektorKuda[3]
  158.     new Float:VektorNormal[3]
  159.     new Float:VektorClaym[3]
  160.     new Tochka[3]
  161.     new Glaz[3]
  162.     get_user_origin(id,Tochka,1)
  163.     get_user_origin(id,Glaz,3)
  164.     new DistanceToWall = get_distance(Glaz,Tochka)
  165.     pev(id, pev_v_angle, VektorKuda)
  166.     angle_vector(VektorKuda, ANGLEVECTOR_FORWARD, VektorKuda)
  167.     pev(id, pev_origin, Otkuda)
  168.     VektorKuda[0] = VektorKuda[0] * 9999.0 + Otkuda[0]
  169.     VektorKuda[1] = VektorKuda[1] * 9999.0 + Otkuda[1]
  170.     VektorKuda[2] = VektorKuda[2] * 9999.0 + Otkuda[2]
  171.     new ptr = create_tr2()
  172.     engfunc(EngFunc_TraceLine, Otkuda, VektorKuda, IGNORE_MONSTERS, id, ptr)
  173.     get_tr2(ptr, TR_vecEndPos, Kuda)
  174.     get_tr2(ptr, TR_vecPlaneNormal, VektorNormal)
  175.     free_tr2(ptr)
  176.     vector_to_angle(VektorNormal, VektorClaym)
  177.    
  178.     //client_print(id, print_center, "NORMAL: %f %f %f Dist:%d", VektorClaym[0], VektorClaym[1], VektorClaym[2], DistanceToWall)
  179.    
  180.     if(DistanceToWall<64)
  181.     {
  182.         body_Claym[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
  183.         set_pev(body_Claym[id], pev_classname, "amxx_Claym")
  184.         engfunc(EngFunc_SetModel, body_Claym[id], Claym_mdl)
  185.         engfunc(EngFunc_SetSize, body_Claym[id], float:{-10.0, -4.0, 0.0}, Float:{10.0, 4.0, 6.0})
  186.         engfunc(EngFunc_SetOrigin, body_Claym[id], Kuda)
  187.         set_pev(body_Claym[id], pev_angles, VektorClaym)
  188.         set_pev(body_Claym[id], pev_solid, SOLID_BBOX)
  189.         set_pev(body_Claym[id], pev_movetype, MOVETYPE_FLY)
  190.         set_pev(body_Claym[id], pev_owner, id)
  191.         buy_Claym[id] = false
  192.         plant_Claym[id] = true
  193.         client_print(id, print_chat, "Ð’Ñ‹ уÑ�тановили мину МОÐ�-50")
  194.     }
  195.     else
  196.     {
  197.         client_print(id, print_center, "Подойдите ближе к Ñ�тене")
  198.         buy_Claym[id] = true
  199.         plant_Claym[id] = false
  200.     }
  201.     return PLUGIN_HANDLED
  202. }
  203.  
  204. public ActClaym_visual(id)
  205. {
  206.     if (!is_user_alive(id))
  207.     return PLUGIN_HANDLED
  208.     //визуализациÑ�
  209.     new Float:ClaymOrigin[3]
  210.     new Float:RealClaymOrigin[3]
  211.     new Float:ClaymAngles[3]
  212.     new Float:ClaymEnd[3]
  213.     new Float:vClaymEnd[3]
  214.     new Float:ClaymVector[3]
  215.    
  216.     pev(body_Claym[id], pev_origin, ClaymOrigin)
  217.     FVecIVec(ClaymOrigin, RealClaymOrigin)
  218.     new i
  219.     for(i=1; i<=get_pcvar_num(roll_Claym); i++)
  220.     {
  221.        
  222.         pev(body_Claym[id], pev_angles, ClaymAngles)
  223.         ClaymAngles[1] -= (get_pcvar_num(sector_Claym)/2)
  224.         ClaymAngles[1] += random(get_pcvar_num(sector_Claym))
  225.         ClaymAngles[0] -= 20
  226.         ClaymAngles[0] += random(20)
  227.         engfunc(EngFunc_MakeVectors, ClaymAngles)
  228.         global_get(glb_v_forward, ClaymAngles)  
  229.         ClaymVector[0] = ClaymAngles[0] * (get_pcvar_num(damdist_Claym) * 36.0) + ClaymOrigin[0]
  230.         ClaymVector[1] = ClaymAngles[1] * (get_pcvar_num(damdist_Claym) * 36.0) + ClaymOrigin[1]
  231.         ClaymVector[2] = ClaymAngles[2] * (get_pcvar_num(damdist_Claym) * 36.0) + ClaymOrigin[2]
  232.    
  233.         new Claymptr = create_tr2()
  234.         engfunc(EngFunc_TraceLine, ClaymOrigin, ClaymVector, IGNORE_MONSTERS, body_Claym[id], Claymptr)
  235.         get_tr2(Claymptr, TR_vecEndPos, ClaymEnd)
  236.         free_tr2(Claymptr)
  237.    
  238.         FVecIVec(ClaymEnd, vClaymEnd)
  239.    
  240.        
  241.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  242.         write_byte(TE_TRACER)
  243.         engfunc(EngFunc_WriteCoord, ClaymOrigin[0])
  244.         engfunc(EngFunc_WriteCoord, ClaymOrigin[1])
  245.         engfunc(EngFunc_WriteCoord, ClaymOrigin[2])
  246.         engfunc(EngFunc_WriteCoord, ClaymEnd[0])
  247.         engfunc(EngFunc_WriteCoord, ClaymEnd[1])
  248.         engfunc(EngFunc_WriteCoord, ClaymEnd[2])
  249.         message_end()
  250.     }
  251.     pev(body_Claym[id], pev_origin, ClaymOrigin)
  252.     FVecIVec(ClaymOrigin, RealClaymOrigin)
  253.    
  254.     message_begin(MSG_ALL, SVC_TEMPENTITY)
  255.     write_byte(3)
  256.     write_coord(RealClaymOrigin[0])
  257.     write_coord(RealClaymOrigin[1])
  258.     write_coord(RealClaymOrigin[2])
  259.     write_short(sprBoom)
  260.     write_byte(9)
  261.     write_byte(255)
  262.     write_byte(0)
  263.     message_end()
  264.    
  265.     message_begin(MSG_ALL, SVC_TEMPENTITY, RealClaymOrigin)
  266.     write_byte(5)
  267.     write_coord(RealClaymOrigin[0])
  268.     write_coord(RealClaymOrigin[1])
  269.     write_coord(RealClaymOrigin[2])
  270.     write_short(sprSmoke)
  271.     write_byte(17)
  272.     write_byte(10)
  273.     message_end()
  274.    
  275.     message_begin(MSG_ALL, SVC_TEMPENTITY)
  276.     write_byte(TE_WORLDDECAL)
  277.     write_coord(RealClaymOrigin[0])
  278.     write_coord(RealClaymOrigin[1])
  279.     write_coord(RealClaymOrigin[2])
  280.     write_byte(28)
  281.     message_end()
  282.        
  283.     //ActClaym(id)
  284.     //УбийÑ�тва
  285.     new Float:VecToTarget[3]
  286.     new Float:AnglToTarget[3]
  287.     new Float:AnglClaymToTarget[3]
  288.     new Float:TargetOrig[3]
  289.     new Float:RealTargetOrig[3]
  290.    
  291.     new pNum, j, Target[32]
  292.     get_players(Target, pNum, "a")
  293.    
  294.     for (j=0; j<pNum; j++)
  295.     {
  296.         pev(Target[j], pev_origin, TargetOrig)
  297.         FVecIVec(TargetOrig, RealTargetOrig)
  298.         pev(body_Claym[id], pev_origin, ClaymOrigin)
  299.         pev(body_Claym[id], pev_angles, ClaymAngles)
  300.        
  301.         VecToTarget[0] = ClaymOrigin[0] - TargetOrig[0]
  302.         VecToTarget[1] = ClaymOrigin[1] - TargetOrig[1]
  303.         VecToTarget[2] = ClaymOrigin[2] - TargetOrig[2]
  304.         VecToTarget[0] = -VecToTarget[0]
  305.         VecToTarget[1] = -VecToTarget[1]
  306.         VecToTarget[2] = -VecToTarget[2]
  307.         vector_to_angle( VecToTarget, AnglToTarget)
  308.    
  309.         if (ClaymAngles[0] > 180.0)
  310.         {
  311.             ClaymAngles[0] = ClaymAngles[0] - 360.0
  312.         }
  313.         if (ClaymAngles[1] > 180.0)
  314.         {
  315.             ClaymAngles[1] = ClaymAngles[1] - 360.0
  316.         }
  317.         if (AnglToTarget[0] > 180.0)
  318.         {
  319.             AnglToTarget[0] = AnglToTarget[0] - 360.0
  320.         }
  321.         if (AnglToTarget[1] > 180.0)
  322.         {
  323.             AnglToTarget[1] = AnglToTarget[1] - 360.0
  324.         }
  325.         AnglClaymToTarget[0] = AnglToTarget[0] - ClaymAngles[0]
  326.         AnglClaymToTarget[1] = AnglToTarget[1] - ClaymAngles[1]
  327.         AnglClaymToTarget[2] = AnglToTarget[2] - ClaymAngles[2]
  328.         if (AnglClaymToTarget[0] <= -180.0)
  329.         {
  330.             AnglClaymToTarget[0] = AnglClaymToTarget[0] + 360.0
  331.         }
  332.         if (AnglClaymToTarget[1] <= -180.0)
  333.         {
  334.             AnglClaymToTarget[1] = AnglClaymToTarget[1] + 360.0
  335.         }
  336.         //client_print(id, print_chat, "p:%f y:%f r:%f", AnglClaymToTarget[0], AnglClaymToTarget[1], AnglClaymToTarget[2])
  337.         new DistanceClaymToPlay = get_distance( RealClaymOrigin, RealTargetOrig)
  338.         //new sector = get_pcvar_num(plug_Claym)/2
  339.         //client_print(Target[j], print_chat, "DistanceClaymToPlay: %d", DistanceClaymToPlay)
  340.        
  341.         if (((AnglClaymToTarget[0] > -10) && (AnglClaymToTarget[0] < 10) && (AnglClaymToTarget[1] > -(get_pcvar_num(sector_Claym)/2)) && (AnglClaymToTarget[1] < (get_pcvar_num(sector_Claym)/2)) && (DistanceClaymToPlay < (get_pcvar_num(damdist_Claym) * 36.0))) || (DistanceClaymToPlay <= 180))
  342.         {
  343.             new Float:TargEndTr[3]
  344.             new Float:RealTargEndTr[3]//здеÑ�ÑŒ пропиÑ�ать траÑ�Ñ�у
  345.             //new Float:BetwenEndITar[3]
  346.             new damptr = create_tr2()
  347.             engfunc(EngFunc_TraceLine, ClaymOrigin, TargetOrig, IGNORE_MONSTERS, body_Claym[id], damptr)
  348.             get_tr2(damptr, TR_vecEndPos, TargEndTr)
  349.             FVecIVec(TargEndTr, RealTargEndTr)
  350.            
  351.             new DistanceEndToTar = get_distance( RealTargetOrig, RealTargEndTr)
  352.                        
  353.             if ( DistanceEndToTar == 0)
  354.             {
  355.                 static Float:health
  356.                 pev(Target[j], pev_health, health)
  357.                 if(health <= get_pcvar_num(dam_Claym))
  358.                 {
  359.                     if(get_user_team(Target[j]) == get_user_team(id))
  360.                     {
  361.                         set_pev(id, pev_frags, float(get_user_frags(id))-1.0)
  362.                     }
  363.                     else
  364.                     {
  365.                         set_pev(id, pev_frags, float(get_user_frags(id))+1.0)
  366.                     }
  367.                     user_silentkill(Target[j])
  368.                     make_deathmsg(id, Target[j], 0, "grenade")
  369.                     refresh_scoreboard(Target[j])
  370.                     refresh_scoreboard(id)
  371.                 }
  372.                 else
  373.                 {
  374.                     set_pev(Target[j], pev_health, health-get_pcvar_num(dam_Claym))
  375.                     dmgevent(Target[j], floatround(get_pcvar_num(dam_Claym)), RealClaymOrigin)
  376.                 }
  377.                
  378.             }
  379.            
  380.             free_tr2(damptr)
  381.         }
  382.     }      
  383.        
  384.        
  385.     engfunc(EngFunc_RemoveEntity, body_Claym[id])
  386.     plant_Claym[id] = false
  387.     return PLUGIN_HANDLED
  388. }
  389.  
  390. stock fm_get_user_money(id)
  391. {
  392.     return get_pdata_int(id, OFFSET_CSMONEY);
  393. }
  394. stock fm_set_user_money(id, money, flash = 1)
  395. {
  396.     set_pdata_int(id, OFFSET_CSMONEY, money);
  397.    
  398.     message_begin(MSG_ONE, get_user_msgid("Money"), {0,0,0}, id);
  399.     write_long(money);
  400.     write_byte(flash ? 1 : 0);
  401.     message_end();
  402. }
  403. stock refresh_scoreboard(id)
  404. {
  405.     message_begin(MSG_ALL, 85)
  406.     write_byte(id)
  407.     write_short(get_user_frags(id))
  408.     write_short(get_user_deaths(id))
  409.     write_short(0)
  410.     write_short(get_user_team(id))
  411.     message_end()
  412. }
  413. stock dmgevent(id, dmg, origin[])
  414. {
  415.     emessage_begin(MSG_ONE, 71, _, id)
  416.     ewrite_byte(0) // dmg_save
  417.     ewrite_byte(dmg) // dmg_take
  418.     ewrite_long(DMG_BLAST)
  419.     ewrite_coord(origin[0])
  420.     ewrite_coord(origin[1])
  421.     ewrite_coord(origin[2])
  422.     emessage_end()
  423. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement