Advertisement
FlacoBey

Untitled

Jul 2nd, 2019
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.59 KB | None | 0 0
  1. #pragma semicolon 1
  2. #pragma newdecls required
  3.  
  4. #include <sdktools>  
  5.    
  6. #pragma tabsize 0  
  7.    
  8. float GrenadeDamage = 5000.0;
  9. float PipeBombDamage = 5000.0;
  10. float BarrelDamage = 5000.0;
  11.    
  12. float GrenadeRadius = 660.0;
  13. float PipeRadius = 660.0;
  14. float BarrelRadius = 660.0;
  15.  
  16. float ShakeGrenade = 1320.0;
  17. float ShakePipe = 1320.0;
  18. float ShakeBarrel = 1320.0;
  19.    
  20. float PowerShakeG = 50.0;
  21. float PowerShakeP = 50.0;
  22. float PowerShakeB = 50.0;
  23.    
  24. bool IsAllow = false;  
  25.    
  26. public void OnMapStart()  
  27. {  
  28.     IsAllow = false;  
  29.     CreateTimer(3.0, allow);
  30. }  
  31.    
  32. public Action allow(Handle timer)  
  33. {  
  34.     IsAllow = true;  
  35. }  
  36.    
  37. public void OnEntityDestroyed(int entity)  
  38. {  
  39.     if(!IsAllow) return;  
  40.      
  41.     if (IsValidEntity(entity) && IsValidEdict(entity))  
  42.     {  
  43.         char classname[128];  
  44.         GetEdictClassname(entity, classname, 128);  
  45.         if (StrEqual(classname, "grenade_launcher_projectile", false))  
  46.         {  
  47.             GrenadeTouch(entity);  
  48.         }  
  49.         if (StrEqual(classname, "pipe_bomb_projectile", false))  
  50.         {  
  51.             BombTouch(entity);  
  52.         }  
  53.         if (StrEqual(classname, "prop_fuel_barrel", false))  
  54.         {  
  55.             BarrelTouch(entity);  
  56.         }  
  57.     }  
  58. }  
  59.    
  60. public int GrenadeTouch(int entity)  
  61. {  
  62.     float pos[3];  
  63.     GetEntPropVector(entity, view_as<PropType>(0), "m_vecOrigin", pos, 0);  
  64.     GranadeExplode(pos);  
  65. }  
  66.    
  67. public int BombTouch(int entity)  
  68. {  
  69.     float pos[3];  
  70.     GetEntPropVector(entity, view_as<PropType>(0), "m_vecOrigin", pos, 0);  
  71.     BombExplode(pos);
  72. }  
  73.    
  74. public int BarrelTouch(int entity)  
  75. {  
  76.     float pos[3];  
  77.     GetEntPropVector(entity, view_as<PropType>(0), "m_vecOrigin", pos, 0);  
  78.     BarrelExplode(pos);  
  79. }  
  80.    
  81. int GranadeExplode(float pos[3])  
  82. {  
  83.     float fDistance = 0.0;  
  84.     float pos2[3];  
  85.     for( int i = 0; i < 32; i++ )  
  86.     {  
  87.         if(IsValidClient(i) && GetClientTeam(i) == 2)  
  88.         {  
  89.             int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
  90.             if(vClass == 9)  
  91.             {  
  92.                 GetClientAbsOrigin(i, pos2);  
  93.                 fDistance = GetVectorDistance(pos, pos2);  
  94.                 if(fDistance < GrenadeRadius && IsVisibleTo(pos, pos2))  
  95.                 {  
  96.                     float iOne = GrenadeRadius - fDistance;
  97.                     float vForward = GrenadeRadius / iOne;
  98.                     int iDamage = RoundToCeil(GrenadeDamage / (vForward * vForward * vForward));
  99.                     ForceDamageEntity(i, iDamage, i);
  100.                 }  
  101.                 if(fDistance < ShakeGrenade)  
  102.                 {  
  103.                     float iOne = ShakeGrenade - fDistance;
  104.                     float vForward = ShakeGrenade / iOne;
  105.                     float iDamage = (PowerShakeG / (vForward * vForward * vForward)) * 1.0;
  106.                     ScreenShake(i, iDamage);
  107.                 }
  108.             }  
  109.         }  
  110.     }  
  111. }  
  112.    
  113. int BombExplode(float pos[3])  
  114. {  
  115.     float fDistance = 0.0;  
  116.     float pos2[3];  
  117.     for( int i = 0; i < 32; i++ )  
  118.     {  
  119.         if(IsValidClient(i) && GetClientTeam(i) == 2)  
  120.         {  
  121.             int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
  122.             if(vClass == 9)
  123.             {  
  124.                 GetClientAbsOrigin(i, pos2);  
  125.                 fDistance = GetVectorDistance(pos, pos2);  
  126.                 if(fDistance < PipeRadius && IsVisibleTo(pos, pos2))  
  127.                 {  
  128.                     float iOne = PipeRadius - fDistance;  
  129.                     float vForward = PipeRadius / iOne;
  130.                     int iDamage = RoundToCeil(PipeBombDamage / (vForward * vForward * vForward));
  131.                     ForceDamageEntity(i, iDamage, i);
  132.                 }  
  133.                 if(fDistance < ShakePipe)  
  134.                 {  
  135.                     float iOne = ShakePipe - fDistance;
  136.                     float vForward = ShakePipe / iOne;
  137.                     float iDamage = (PowerShakeP / (vForward * vForward * vForward)) * 1.0;
  138.                     ScreenShake(i, iDamage);
  139.                 }
  140.             }  
  141.         }  
  142.     }  
  143. }  
  144.    
  145. int BarrelExplode(float pos[3])  
  146. {  
  147.     float fDistance = 0.0;  
  148.     float pos2[3];  
  149.     for( int i = 0; i < 32; i++ )  
  150.     {  
  151.         if(IsValidClient(i) && GetClientTeam(i) == 2)  
  152.         {  
  153.             int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
  154.             if(vClass == 9)  
  155.             {  
  156.                 GetClientAbsOrigin(i, pos2);  
  157.                 fDistance = GetVectorDistance(pos, pos2);  
  158.                 if(fDistance < BarrelRadius && IsVisibleTo(pos, pos2))  
  159.                 {  
  160.                     float iOne = BarrelRadius - fDistance;
  161.                     float vForward = BarrelRadius / iOne;
  162.                     int iDamage = RoundToCeil(BarrelDamage / (vForward * vForward * vForward));
  163.                     ForceDamageEntity(i, iDamage, i);
  164.                 }  
  165.                 if(fDistance < ShakeBarrel)  
  166.                 {  
  167.                     float iOne = ShakeBarrel - fDistance;
  168.                     float vForward = ShakeBarrel / iOne;
  169.                     float iDamage = (PowerShakeB / (vForward * vForward * vForward)) * 1.0;
  170.                     ScreenShake(i, iDamage);
  171.                    
  172.                 }
  173.             }
  174.         }  
  175.     }  
  176. }  
  177.  
  178. public void ScreenShake(int target, float power)  
  179. {  
  180.     Handle msg;  
  181.     msg = StartMessageOne("Shake", target);  
  182.     BfWriteByte(msg, 0);  
  183.     BfWriteFloat(msg, power);  
  184.     BfWriteFloat(msg, 10.0);  
  185.     BfWriteFloat(msg, 3.0);  
  186.     EndMessage();  
  187. }  
  188.  
  189. static bool IsVisibleTo(float position[3], float targetposition[3])  
  190. {  
  191.     float vAngles[3], vLookAt[3];  
  192.      
  193.     MakeVectorFromPoints(position, targetposition, vLookAt);
  194.     GetVectorAngles(vLookAt, vAngles);
  195.     Handle trace = TR_TraceRayFilterEx(position, vAngles, MASK_SHOT, RayType_Infinite, _TraceFilter);  
  196.      
  197.     bool isVisible = false;  
  198.     if (TR_DidHit(trace))  
  199.     {  
  200.         float vStart[3];  
  201.         TR_GetEndPosition(vStart, trace);
  202.         if ((GetVectorDistance(position, vStart, false) + 25.0) >= GetVectorDistance(position, targetposition))  
  203.         {  
  204.             isVisible = true;
  205.         }  
  206.     }  
  207.      
  208.     return isVisible;  
  209. }  
  210.  
  211. public bool _TraceFilter(int entity, int contentsMask)  
  212. {  
  213.  
  214. }
  215.  
  216. stock void ForceDamageEntity(int causer, int damage, int victim) // thanks to &#36798;&#26031;*&#32500;&#36798;  
  217. {  
  218.     float victim_origin[3];  
  219.     char rupture[32];  
  220.     char damage_victim[32];  
  221.     IntToString(damage, rupture, sizeof(rupture));  
  222.     Format(damage_victim, sizeof(damage_victim), "hurtme%d", victim);  
  223.     GetEntPropVector(victim, Prop_Send, "m_vecOrigin", victim_origin);  
  224.     int entity = CreateEntityByName("point_hurt");  
  225.     DispatchKeyValue(victim, "targetname", damage_victim);  
  226.     DispatchKeyValue(entity, "DamageTarget", damage_victim);  
  227.     DispatchKeyValue(entity, "Damage", rupture);  
  228.     DispatchSpawn(entity);  
  229.     TeleportEntity(entity, victim_origin, NULL_VECTOR, NULL_VECTOR);  
  230.     AcceptEntityInput(entity, "Hurt", (causer > 0 && causer <= MaxClients) ? causer : -1);  
  231.     DispatchKeyValue(entity, "classname", "point_hurt");  
  232.     DispatchKeyValue(victim, "targetname", "null");  
  233.     AcceptEntityInput(entity, "Kill");  
  234. }  
  235.    
  236. stock bool IsValidClient(int client)  
  237. {  
  238.     if ( client < 1 || client > MaxClients ) return false;  
  239.     if( !IsClientInGame(client)) return false;  
  240.     if ( !IsPlayerAlive( client )) return false;  
  241.     return true;  
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement