FlacoBey

Untitled

May 23rd, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.28 KB | None | 0 0
  1. #include <sourcemod>  
  2. #include <sdktools>  
  3. #include sdkhooks  
  4.    
  5. #pragma tabsize 0  
  6.    
  7. float GrenadeDamage = 100.0  
  8. float PipeBombDamage = 100.0  
  9. float BarrelDamage = 100.0  
  10.    
  11. float GrenadeRadius = 10.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 = 1500.0  
  24. float ShakePipe = 1500.0  
  25. float ShakeBarrel = 1500.0  
  26.    
  27. float PowerShakeG = 150.0  
  28. float PowerShakeP = 150.0  
  29. float PowerShakeB = 150.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 && IsVisibleTo(pos, pos2))  
  122.                 {  
  123.                     Fly(i, i, GrenadeFling)  
  124.                 }  
  125.                 if(fDistance < GrenadeRadius && IsVisibleTo(pos, pos2))  
  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 && IsVisibleTo(pos, pos2))  
  158.                 {  
  159.                     Fly(i, i, PipeFling)  
  160.                 }  
  161.                 if(fDistance < PipeRadius && IsVisibleTo(pos, pos2))  
  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 && IsVisibleTo(pos, pos2))  
  194.                 {  
  195.                     Fly(i, i, BarrelFling)  
  196.                 }  
  197.                 if(fDistance < BarrelRadius && IsVisibleTo(pos, pos2))  
  198.                 {  
  199.                     float iOne = BarrelRadius - fDistance  
  200.                     float vForward = BarrelRadius / iOne  
  201.                     int iDamage = RoundToCeil(BarrelDamage / (vForward * vForward * vForward))
  202.                     float HealBuf = GetEntPropFloat(i, Prop_Send, "m_healthBuffer");
  203.                     int flHealth = GetClientHealth(i)
  204.                     if(RoundToCeil(HealBuf) - iDamage < 0 || flHealth - iDamage < 0 || (RoundToCeil(HealBuf) + flHealth) - iDamage < 0)
  205.                     {
  206.                         int iPoint = RoundToCeil(HealBuf) + flHealth;
  207.                         int iTransit = iPoint - iDamage;
  208.                         SetEntProp(i, Prop_Send, "m_isIncapacitated", 1);
  209.                         ForceDamageEntity(i, iTransit, i)
  210.                     }
  211.                     else
  212.                     {
  213.                         ForceDamageEntity(i, iDamage, i)
  214.                     }
  215.                 }  
  216.                 if(fDistance < ShakeBarrel)  
  217.                 {  
  218.                     float iOne = ShakeBarrel - fDistance  
  219.                     float vForward = ShakeBarrel / iOne  
  220.                     float iDamage = (PowerShakeB / (vForward * vForward * vForward)) * 1.0  
  221.                     ScreenShake(i, iDamage)  
  222.                 }  
  223.             }  
  224.         }  
  225.     }  
  226. }  
  227.    
  228. public Fly(explosion, int target, float power)  
  229. {  
  230.     if(target <= 0 || !IsValidEntity(target) || !IsValidEdict(target))  return;  
  231.      
  232.     float targetPos[3], explosionPos[3], traceVec[3], resultingFling[3];  
  233.      
  234.     GetEntPropVector(target, Prop_Data, "m_vecOrigin", targetPos);        
  235.     GetEntPropVector(explosion, Prop_Data,"m_vecOrigin", explosionPos);  
  236.      
  237.     float fDistance = GetVectorDistance(targetPos, explosionPos)  
  238.     float iOne = GrenadeRadius - fDistance  
  239.     float iDamage = GrenadeRadius / iOne  
  240.     power = (GrenadeDamage / (iDamage * iDamage * iDamage)) * 1.0  
  241.     if(power < 1)  
  242.         return;  
  243.      
  244.     MakeVectorFromPoints(explosionPos, targetPos, traceVec);  
  245.     GetVectorAngles(traceVec, resultingFling);  
  246.          
  247.     resultingFling[0] = Cosine(DegToRad(resultingFling[1])) * power;  
  248.     resultingFling[1] = Sine(DegToRad(resultingFling[1])) * power;  
  249.     resultingFling[2] = power + (power * 0.5);  
  250.     if (GetClientTeam(target) == 2)  
  251.     {  
  252.         SDKCall(sdkCallPushPlayer, target, resultingFling, 76, target, 2.0);  
  253.     }  
  254.     else  
  255.     {  
  256.         SDKCall(sdkCallPushPlayer, target, resultingFling, 2, target, 2.0);  
  257.     }  
  258. }  
  259.    
  260. public void ScreenShake(int target, float power)  
  261. {  
  262.     Handle msg;  
  263.     msg = StartMessageOne("Shake", target);  
  264.     BfWriteByte(msg, 0);  
  265.     BfWriteFloat(msg, power);  
  266.     BfWriteFloat(msg, 10.0);  
  267.     BfWriteFloat(msg, 3.0);  
  268.     EndMessage();  
  269. }  
  270.  
  271. static bool IsVisibleTo(float position[3], float targetposition[3])  
  272. {  
  273.     float vAngles[3], vLookAt[3];  
  274.      
  275.     MakeVectorFromPoints(position, targetposition, vLookAt); // compute vector from start to target  
  276.     GetVectorAngles(vLookAt, vAngles); // get angles from vector for trace  
  277.      
  278.     // execute Trace  
  279.     Handle trace = TR_TraceRayFilterEx(position, vAngles, MASK_SHOT, RayType_Infinite, _TraceFilter);  
  280.      
  281.     bool isVisible = false;  
  282.     if (TR_DidHit(trace))  
  283.     {  
  284.         float vStart[3];  
  285.         TR_GetEndPosition(vStart, trace); // retrieve our trace endpoint  
  286.          
  287.         if ((GetVectorDistance(position, vStart, false) + 25.0) >= GetVectorDistance(position, targetposition))  
  288.         {  
  289.             isVisible = true; // if trace ray length plus tolerance equal or bigger absolute distance, you hit the target  
  290.         }  
  291.     }  
  292.      
  293.     return isVisible;  
  294. }  
  295.    
  296. public bool _TraceFilter(int entity, int contentsMask)  
  297. {  
  298.     if (!entity || entity <= MaxClients || !IsValidEntity(entity)) // dont let WORLD, or invalid entities be hit  
  299.     {  
  300.         return false;  
  301.     }  
  302.     return true;  
  303. }  
  304. stock void ForceDamageEntity(int causer, int damage, int victim) // thanks to &#36798;&#26031;*&#32500;&#36798;  
  305. {  
  306.     float victim_origin[3];  
  307.     char rupture[32];  
  308.     char damage_victim[32];  
  309.     IntToString(damage, rupture, sizeof(rupture));  
  310.     Format(damage_victim, sizeof(damage_victim), "hurtme%d", victim);  
  311.     GetEntPropVector(victim, Prop_Send, "m_vecOrigin", victim_origin);  
  312.     int entity = CreateEntityByName("point_hurt");  
  313.     DispatchKeyValue(victim, "targetname", damage_victim);  
  314.     DispatchKeyValue(entity, "DamageTarget", damage_victim);  
  315.     DispatchKeyValue(entity, "Damage", rupture);  
  316.     DispatchSpawn(entity);  
  317.     TeleportEntity(entity, victim_origin, NULL_VECTOR, NULL_VECTOR);  
  318.     AcceptEntityInput(entity, "Hurt", (causer > 0 && causer <= MaxClients) ? causer : -1);  
  319.     DispatchKeyValue(entity, "classname", "point_hurt");  
  320.     DispatchKeyValue(victim, "targetname", "null");  
  321.     AcceptEntityInput(entity, "Kill");  
  322. }  
  323.    
  324. stock bool IsValidClient(int client)  
  325. {  
  326.     if ( client < 1 || client > MaxClients ) return false;  
  327.     if( !IsClientInGame(client)) return false;  
  328.     if ( !IsPlayerAlive( client )) return false;  
  329.     return true;  
  330. }
Advertisement
Add Comment
Please, Sign In to add comment