Advertisement
FlacoBey

Untitled

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