FlacoBey

Untitled

May 23rd, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.74 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdktools>
  3. #include sdkhooks
  4.  
  5. #pragma tabsize 0
  6.  
  7. float GrenadeDamage = 250.0
  8. float PipeBombDamage = 250.0
  9. float BarrelDamage = 250.0
  10.  
  11. float GrenadeRadius = 1500.0
  12. float PipeRadius = 1500.0
  13. float BarrelRadius = 1500.0
  14.  
  15. float GrenadeFling = 450.0
  16. float PipeFling = 450.0
  17. float BarrelFling = 450.0
  18.  
  19. float RadiusFlingGrenade = 250.0
  20. float RadiusFlingPipe = 250.0
  21. float RadiusFlingBarrel = 250.0
  22.  
  23. float ShakeGrenade = 500.0
  24. float ShakePipe = 500.0
  25. float ShakeBarrel = 500.0
  26.  
  27. float PowerShakeG = 50.0
  28. float PowerShakeP = 50.0
  29. float PowerShakeB = 50.0
  30.  
  31. Handle sdkCallPushPlayer;
  32.  
  33. public OnPluginStart()
  34. {
  35.     Handle GameConf = LoadGameConfigFile("gamedata_stager");  
  36.            
  37.     if(GameConf == INVALID_HANDLE)
  38.     {
  39.         SetFailState("Couldn't find the offsets and signatures file. Please, check that it is installed correctly.");
  40.     }
  41.        
  42.     StartPrepSDKCall(SDKCall_Player);
  43.     PrepSDKCall_SetFromConf(GameConf, SDKConf_Signature, "CTerrorPlayer_Fling");
  44.     PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  45.     PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
  46.     PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer);
  47.     PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
  48.     sdkCallPushPlayer = EndPrepSDKCall();
  49. }
  50.  
  51. bool IsAllow = false;
  52.  
  53. public OnMapStart()
  54. {
  55.     IsAllow = false;
  56.     CreateTimer(3.0, allow)
  57. }
  58.  
  59. public Action allow(Handle timer)
  60. {
  61.     IsAllow = true;
  62. }
  63.  
  64. public void OnEntityDestroyed(int entity)
  65. {
  66.     if(!IsAllow) return;
  67.    
  68.     if (IsValidEntity(entity) && IsValidEdict(entity))
  69.     {
  70.         char classname[128];
  71.         GetEdictClassname(entity, classname, 128);
  72.         if (StrEqual(classname, "grenade_launcher_projectile", false))
  73.         {
  74.             GrenadeTouch(entity);
  75.         }
  76.         if (StrEqual(classname, "pipe_bomb_projectile", false))
  77.         {
  78.             BombTouch(entity);
  79.         }
  80.         if (StrEqual(classname, "prop_fuel_barrel", false))
  81.         {
  82.             BarrelTouch(entity);
  83.         }
  84.     }
  85. }
  86.  
  87. public int GrenadeTouch(int entity)
  88. {
  89.     float pos[3];
  90.     GetEntPropVector(entity, PropType:0, "m_vecOrigin", pos, 0);
  91.     GranadeExplode(pos);
  92. }
  93.  
  94. public int BombTouch(int entity)
  95. {
  96.     float pos[3];
  97.     GetEntPropVector(entity, PropType:0, "m_vecOrigin", pos, 0);
  98.     BombExplode(pos)
  99. }
  100.  
  101. public int BarrelTouch(int entity)
  102. {
  103.     float pos[3];
  104.     GetEntPropVector(entity, PropType:0, "m_vecOrigin", pos, 0);
  105.     BarrelExplode(pos);
  106. }
  107.  
  108. int GranadeExplode(float pos[3])
  109. {
  110.     float fDistance = 0.0;
  111.     float pos2[3];
  112.     for( int i = 0; i < 32; i++ )
  113.     {
  114.         if(IsValidClient(i) && GetClientTeam(i) == 2)
  115.         {
  116.             int vClass = GetEntProp(i, Prop_Send, "m_zombieClass")
  117.             if(vClass == 9)
  118.             {
  119.                 GetClientAbsOrigin(i, pos2);
  120.                 fDistance = GetVectorDistance(pos, pos2);
  121.                 if(fDistance < RadiusFlingGrenade)
  122.                 {
  123.                     Fly(i, i, GrenadeFling)
  124.                 }
  125.                 if(fDistance < GrenadeRadius)
  126.                 {
  127.                     float iOne = GrenadeRadius - fDistance
  128.                     float vForward = GrenadeRadius / iOne
  129.                     int iDamage = RoundToCeil(GrenadeDamage / ((vForward * vForward) * vForward))
  130.                     ForceDamageEntity(i, iDamage, i)
  131.                 }
  132.                 if(fDistance < ShakeGrenade)
  133.                 {
  134.                     float iOne = ShakeGrenade - fDistance
  135.                     float vForward = ShakeGrenade / iOne
  136.                     float iDamage = (PowerShakeG / (vForward * vForward * vForward)) * 1.0
  137.                     ScreenShake(i, iDamage)
  138.                 }
  139.             }
  140.         }
  141.     }
  142. }
  143.  
  144. int BombExplode(float pos[3])
  145. {
  146.     float fDistance = 0.0;
  147.     float pos2[3];
  148.     for( int i = 0; i < 32; i++ )
  149.     {
  150.         if(IsValidClient(i) && GetClientTeam(i) == 2)
  151.         {
  152.             int vClass = GetEntProp(i, Prop_Send, "m_zombieClass")
  153.             if(vClass == 9)
  154.             {
  155.                 GetClientAbsOrigin(i, pos2);
  156.                 fDistance = GetVectorDistance(pos, pos2);
  157.                 if(fDistance < RadiusFlingPipe)
  158.                 {
  159.                     Fly(i, i, PipeFling)
  160.                 }
  161.                 if(fDistance < PipeRadius)
  162.                 {
  163.                     float iOne = PipeRadius - fDistance
  164.                     float vForward = PipeRadius / iOne
  165.                     int iDamage = RoundToCeil(PipeBombDamage / (vForward * vForward * vForward))
  166.                     ForceDamageEntity(i, iDamage, i)
  167.                 }
  168.                 if(fDistance < ShakePipe)
  169.                 {
  170.                     float iOne = ShakePipe - fDistance
  171.                     float vForward = ShakePipe / iOne
  172.                     float iDamage = (PowerShakeP / (vForward * vForward * vForward)) * 1.0
  173.                     ScreenShake(i, iDamage)
  174.                 }
  175.             }
  176.         }
  177.     }
  178. }
  179.  
  180. int BarrelExplode(float pos[3])
  181. {
  182.     float fDistance = 0.0;
  183.     float pos2[3];
  184.     for( int i = 0; i < 32; i++ )
  185.     {
  186.         if(IsValidClient(i) && GetClientTeam(i) == 2)
  187.         {
  188.             int vClass = GetEntProp(i, Prop_Send, "m_zombieClass")
  189.             if(vClass == 9)
  190.             {
  191.                 GetClientAbsOrigin(i, pos2);
  192.                 fDistance = GetVectorDistance(pos, pos2);
  193.                 if(fDistance < RadiusFlingBarrel)
  194.                 {
  195.                     Fly(i, i, BarrelFling)
  196.                 }
  197.                 if(fDistance < BarrelRadius)
  198.                 {
  199.                     float iOne = BarrelRadius - fDistance
  200.                     float vForward = BarrelRadius / iOne
  201.                     int iDamage = RoundToCeil(BarrelDamage / (vForward * vForward * vForward))
  202.                     ForceDamageEntity(i, iDamage, i)
  203.                 }
  204.                 if(fDistance < ShakeBarrel)
  205.                 {
  206.                     float iOne = ShakeBarrel - fDistance
  207.                     float vForward = ShakeBarrel / iOne
  208.                     float iDamage = (PowerShakeB / (vForward * vForward * vForward)) * 1.0
  209.                     ScreenShake(i, iDamage)
  210.                 }
  211.             }
  212.         }
  213.     }
  214. }
  215.  
  216. public Fly(explosion, int target, float power)
  217. {
  218.     if(target <= 0 || !IsValidEntity(target) || !IsValidEdict(target))  return;
  219.    
  220.     float targetPos[3], explosionPos[3], traceVec[3], resultingFling[3];
  221.    
  222.     GetEntPropVector(target, Prop_Data, "m_vecOrigin", targetPos);      
  223.     GetEntPropVector(explosion, Prop_Data,"m_vecOrigin", explosionPos);
  224.    
  225.     float fDistance = GetVectorDistance(targetPos, explosionPos)
  226.     float iOne = GrenadeRadius - fDistance
  227.     float iDamage = GrenadeRadius / iOne
  228.     power = (GrenadeDamage / (iDamage * iDamage * iDamage)) * 1.0
  229.     if(power < 1)
  230.         return;
  231.    
  232.     MakeVectorFromPoints(explosionPos, targetPos, traceVec);
  233.     GetVectorAngles(traceVec, resultingFling);
  234.        
  235.     resultingFling[0] = Cosine(DegToRad(resultingFling[1])) * power;
  236.     resultingFling[1] = Sine(DegToRad(resultingFling[1])) * power;
  237.     resultingFling[2] = power + (power * 0.5);
  238.     if (GetClientTeam(target) == 2)
  239.     {
  240.         SDKCall(sdkCallPushPlayer, target, resultingFling, 76, target, 2.0);
  241.     }
  242.     else
  243.     {
  244.         SDKCall(sdkCallPushPlayer, target, resultingFling, 2, target, 2.0);
  245.     }
  246. }
  247.  
  248. public void ScreenShake(int target, float power)
  249. {
  250.     Handle msg;
  251.     msg = StartMessageOne("Shake", target);
  252.     BfWriteByte(msg, 0);
  253.     BfWriteFloat(msg, power);
  254.     BfWriteFloat(msg, 10.0);
  255.     BfWriteFloat(msg, 3.0);
  256.     EndMessage();
  257. }
  258.  
  259. stock void ForceDamageEntity(int causer, int damage, int victim) // thanks to 达斯*维达
  260. {
  261.     float victim_origin[3];
  262.     char rupture[32];
  263.     char damage_victim[32];
  264.     IntToString(damage, rupture, sizeof(rupture));
  265.     Format(damage_victim, sizeof(damage_victim), "hurtme%d", victim);
  266.     GetEntPropVector(victim, Prop_Send, "m_vecOrigin", victim_origin);
  267.     int entity = CreateEntityByName("point_hurt");
  268.     DispatchKeyValue(victim, "targetname", damage_victim);
  269.     DispatchKeyValue(entity, "DamageTarget", damage_victim);
  270.     DispatchKeyValue(entity, "Damage", rupture);
  271.     DispatchSpawn(entity);
  272.     TeleportEntity(entity, victim_origin, NULL_VECTOR, NULL_VECTOR);
  273.     AcceptEntityInput(entity, "Hurt", (causer > 0 && causer <= MaxClients) ? causer : -1);
  274.     DispatchKeyValue(entity, "classname", "point_hurt");
  275.     DispatchKeyValue(victim, "targetname", "null");
  276.     AcceptEntityInput(entity, "Kill");
  277. }
  278.  
  279. stock bool IsValidClient(int client)
  280. {
  281.     if ( client < 1 || client > MaxClients ) return false;
  282.     if( !IsClientInGame(client)) return false;
  283.     if ( !IsPlayerAlive( client )) return false;
  284.     return true;
  285. }
Advertisement
Add Comment
Please, Sign In to add comment