FlacoBey

Untitled

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