FlacoBey

Untitled

May 20th, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.70 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdktools>
  3.  
  4. //Survivors
  5. int iDamageGrenadeLauncherS = 500;
  6. float iPowerSFling = 150.0;
  7. float iRadiusSdie = 200.0
  8. float iRadiusSFling = 400.0
  9. float iRadiusSDamage = 400.0
  10.  
  11. //Survivors Pipe Bomb
  12. int iDamagePipeS = 400;
  13. float iPowerSFlingPipe = 150.0;
  14. float iRadiusSdiePipe = 200.0
  15. float iRadiusSFlingPipe = 400.0
  16. float iRadiusSDamagePipe = 400.0
  17.  
  18. //Tank
  19. int iDamageGrenadeLauncherT = 500;
  20. float iPowerTFling = 10.0
  21. float iRadiusTDamage = 700.0
  22. float iRadiusTFling = 700.0
  23.  
  24. //Tank Pipe
  25. int iDamagePipeT = 400
  26. float iPowerTFlingPipe = 10.0
  27. float iRadiusTDamagePipe = 700.0
  28. float iRadiusTFlingPipe = 700.0
  29.  
  30. //Charger
  31. int iDamageGrenadeLauncherC = 500
  32. float iPowerCFling = 300.0
  33. float iRadiusCDamage = 400.0
  34. float iRadiusCFling = 300.0
  35.  
  36. //Charger Pipe
  37. int iDamagePipeC = 400;
  38. float iPowerCFlingPipe = 300.0
  39. float iRadiusCDamagePipe = 400.0
  40. float iRadiusCFlingPipe = 300.0
  41.  
  42. //Other Inf
  43. int iDamageGrenadeLauncherI = 500
  44. float iPowerIFling = 150.0
  45. float iRadiusIDamage = 200.0
  46. float iRadiusIFling = 400.0
  47.  
  48. //Other Inf Pipe
  49. int iDamagePipeI = 500;
  50. float iPowerIFlingPipe = 150.0
  51. float iRadiusIDamagePipe = 200.0
  52. float iRadiusIFlingPipe = 400.0
  53.  
  54. Handle sdkCallPushPlayer;
  55.  
  56. public OnPluginStart()
  57. {
  58.     Handle hGameConf = LoadGameConfigFile("gamedata_stager");
  59.     if( hGameConf == null )
  60.         SetFailState("Couldn't find the offsets and signatures file. Please, check that it is installed correctly.");
  61.     StartPrepSDKCall(SDKCall_Static);
  62.     if( PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "CTerrorPlayer_OnStaggered") == false )
  63.         SetFailState("Could not load the \"CTerrorPlayer_OnStaggered\" gamedata signature.");
  64.     PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  65.     PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  66.     PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  67.     PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  68.     PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer);
  69.     PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
  70.     PrepSDKCall_SetReturnInfo(SDKType_CBaseEntity, SDKPass_Pointer);
  71.     sdkCallPushPlayer = EndPrepSDKCall();
  72.     if( sdkCallPushPlayer == null )
  73.         SetFailState("Could not prep the \"CTerrorPlayer_OnStaggered\" function.");
  74. }
  75.  
  76. public OnEntityDetroyed(entity)
  77. {
  78.     if(IsValidEntity(entity))
  79.     {
  80.         char sCls[32]
  81.         GetEntityClassname(entity, sCls, sizeof(sCls))
  82.         if(StrEqual(sCls, "grenade_launcher_projectile"))
  83.         {
  84.             for(int i = 1; i <= MaxClients; ++i)
  85.             {
  86.                 if(IsValidClient(i))
  87.                 {
  88.                     float vPos[3], vDamager[3];
  89.                     GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vDamager);
  90.                     GetEntPropVector(i, Prop_Send, "m_vecOrigin", vPos);
  91.                     float fTargetDistance = GetVectorDistance(vDamager, vPos);
  92.                    
  93.                     if(GetClientTeam(i) == 3)
  94.                     {
  95.                         int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
  96.                         if (vClass == 8)
  97.                         {
  98.                             if (!IsVisibleTo(vDamager, vPos)) return;
  99.                             if (fTargetDistance > iRadiusTDamage)
  100.                             {
  101.                                 int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  102.                                 ForceDamageEntity(iOwn, iDamageGrenadeLauncherT, i)
  103.                             }
  104.                             if (fTargetDistance > iRadiusTFling)
  105.                             {
  106.                                 Fly(entity, i, iPowerTFling)
  107.                             }
  108.                         }
  109.                         else if (vClass == 6)
  110.                         {
  111.                             if (!IsVisibleTo(vDamager, vPos)) return;
  112.                             if (fTargetDistance > iRadiusCDamage)
  113.                             {
  114.                                 int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  115.                                 ForceDamageEntity(iOwn, iDamageGrenadeLauncherC, i)
  116.                             }
  117.                             if (fTargetDistance > iRadiusCFling)
  118.                             {
  119.                                 Fly(entity, i, iPowerCFling)
  120.                             }
  121.                         }
  122.                         else
  123.                         {
  124.                             if (!IsVisibleTo(vDamager, vPos)) return;
  125.                             if (fTargetDistance > iRadiusIDamage)
  126.                             {
  127.                                 int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  128.                                 ForceDamageEntity(iOwn, iDamageGrenadeLauncherI, i)
  129.                             }
  130.                             if (fTargetDistance > iRadiusIFling)
  131.                             {
  132.                                 Fly(entity, i, iPowerIFling)
  133.                             }
  134.                         }
  135.                     }
  136.                     else
  137.                     {
  138.                         if (!IsVisibleTo(vDamager, vPos)) return;
  139.                         if (fTargetDistance > iRadiusSdie)
  140.                         {
  141.                             ForcePlayerSuicide(i)
  142.                         }
  143.                         if (fTargetDistance > iRadiusSFling)
  144.                         {
  145.                             Fly(entity, i, iPowerSFling)
  146.                         }
  147.                         if (fTargetDistance > iRadiusSDamage)
  148.                         {
  149.                             int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  150.                             int iDamage = RoundToCeil(fTargetDistance - iDamageGrenadeLauncherS)
  151.                             ForceDamageEntity(iOwn, iDamage, i)
  152.                         }
  153.                     }
  154.                 }
  155.             }
  156.         }
  157.         else if(StrEqual(sCls, "pipe_bomb_projectile"))
  158.         {
  159.             for(int i = 1; i <= MaxClients; ++i)
  160.             {
  161.                 if(IsValidClient(i))
  162.                 {
  163.                     float vPos[3], vDamager[3];
  164.                     GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vDamager);
  165.                     GetEntPropVector(i, Prop_Send, "m_vecOrigin", vPos);
  166.                     float fTargetDistance = GetVectorDistance(vDamager, vPos);
  167.                    
  168.                     if(GetClientTeam(i) == 3)
  169.                     {
  170.                         int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
  171.                         if (vClass == 8)
  172.                         {
  173.                             if (!IsVisibleTo(vDamager, vPos)) return;
  174.                             if (fTargetDistance > iRadiusTDamagePipe)
  175.                             {
  176.                                 int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  177.                                 ForceDamageEntity(iOwn, iDamagePipeT, i)
  178.                             }
  179.                             if (fTargetDistance > iRadiusTFlingPipe)
  180.                             {
  181.                                 Fly(entity, i, iPowerTFlingPipe)
  182.                             }
  183.                         }
  184.                         else if (vClass == 6)
  185.                         {
  186.                             if (!IsVisibleTo(vDamager, vPos)) return;
  187.                             if (fTargetDistance > iRadiusCDamagePipe)
  188.                             {
  189.                                 int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  190.                                 ForceDamageEntity(iOwn, iDamagePipeC, i)
  191.                             }
  192.                             if (fTargetDistance > iRadiusCFlingPipe)
  193.                             {
  194.                                 Fly(entity, i, iPowerCFlingPipe)
  195.                             }
  196.                         }
  197.                         else
  198.                         {
  199.                             if (!IsVisibleTo(vDamager, vPos)) return;
  200.                             if (fTargetDistance > iRadiusIDamagePipe)
  201.                             {
  202.                                 int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  203.                                 ForceDamageEntity(iOwn, iDamagePipeI, i)
  204.                             }
  205.                             if (fTargetDistance > iRadiusIFlingPipe)
  206.                             {
  207.                                 Fly(entity, i, iPowerIFlingPipe)
  208.                             }
  209.                         }
  210.                     }
  211.                     else
  212.                     {
  213.                         if (!IsVisibleTo(vDamager, vPos)) return;
  214.                         if (fTargetDistance > iRadiusSdiePipe)
  215.                         {
  216.                             ForcePlayerSuicide(i)
  217.                         }
  218.                         if (fTargetDistance > iRadiusSFlingPipe)
  219.                         {
  220.                             Fly(entity, i, iPowerSFlingPipe)
  221.                         }
  222.                         if (fTargetDistance > iRadiusSDamagePipe)
  223.                         {
  224.                             int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
  225.                             int iDamage = RoundToCeil(fTargetDistance - iDamagePipeS)
  226.                             ForceDamageEntity(iOwn, iDamage, i)
  227.                         }
  228.                     }
  229.                 }
  230.             }
  231.         }
  232.     }
  233. }
  234.  
  235. stock void ForceDamageEntity(int causer, int damage, int victim) // thanks to 达斯*维达
  236. {
  237.     float victim_origin[3];
  238.     char rupture[32];
  239.     char damage_victim[32];
  240.     IntToString(damage, rupture, sizeof(rupture));
  241.     Format(damage_victim, sizeof(damage_victim), "hurtme%d", victim);
  242.     GetEntPropVector(victim, Prop_Send, "m_vecOrigin", victim_origin);
  243.     int entity = CreateEntityByName("point_hurt");
  244.     DispatchKeyValue(victim, "targetname", damage_victim);
  245.     DispatchKeyValue(entity, "DamageTarget", damage_victim);
  246.     DispatchKeyValue(entity, "Damage", rupture);
  247.     DispatchSpawn(entity);
  248.     TeleportEntity(entity, victim_origin, NULL_VECTOR, NULL_VECTOR);
  249.     AcceptEntityInput(entity, "Hurt", (causer > 0 && causer <= MaxClients) ? causer : -1);
  250.     DispatchKeyValue(entity, "classname", "point_hurt");
  251.     DispatchKeyValue(victim, "targetname", "null");
  252.     AcceptEntityInput(entity, "Kill");
  253. }
  254.  
  255. static bool IsVisibleTo(float position[3], float targetposition[3])
  256. {
  257.     float vAngles[3], vLookAt[3];
  258.    
  259.     MakeVectorFromPoints(position, targetposition, vLookAt); // compute vector from start to target
  260.     GetVectorAngles(vLookAt, vAngles); // get angles from vector for trace
  261.    
  262.     // execute Trace
  263.     Handle trace = TR_TraceRayFilterEx(position, vAngles, MASK_SHOT, RayType_Infinite, _TraceFilter);
  264.    
  265.     bool isVisible = false;
  266.     if (TR_DidHit(trace))
  267.     {
  268.         float vStart[3];
  269.         TR_GetEndPosition(vStart, trace); // retrieve our trace endpoint
  270.        
  271.         if ((GetVectorDistance(position, vStart, false) + 25.0) >= GetVectorDistance(position, targetposition))
  272.         {
  273.             isVisible = true; // if trace ray length plus tolerance equal or bigger absolute distance, you hit the target
  274.         }
  275.     }
  276.    
  277.     return isVisible;
  278. }
  279.  
  280. public bool _TraceFilter(int entity, int contentsMask)
  281. {
  282.     if (!entity || entity <= MaxClients || !IsValidEntity(entity)) // dont let WORLD, or invalid entities be hit
  283.     {
  284.         return false;
  285.     }
  286.     return true;
  287. }
  288. public Fly(explosion, int target, float power)
  289. {
  290.     if(target <= 0 || !IsValidEntity(target) || !IsValidEdict(target))  return;
  291.    
  292.     float targetPos[3], explosionPos[3], traceVec[3], resultingFling[3];
  293.    
  294.     GetEntPropVector(target, Prop_Data, "m_vecOrigin", targetPos);     
  295.     GetEntPropVector(explosion, Prop_Data,"m_vecOrigin", explosionPos);
  296.    
  297.     power = power - GetVectorDistance(targetPos,explosionPos);
  298.    
  299.     if(power < 1)
  300.         return;
  301.    
  302.     MakeVectorFromPoints(explosionPos, targetPos, traceVec);
  303.     GetVectorAngles(traceVec, resultingFling);
  304.        
  305.     resultingFling[0] = Cosine(DegToRad(resultingFling[1])) * power;
  306.     resultingFling[1] = Sine(DegToRad(resultingFling[1])) * power;
  307.     resultingFling[2] = power + (power * 0.5);
  308.  
  309.     if (GetClientTeam(target) == 2)
  310.     {
  311.         SDKCall(sdkCallPushPlayer, target, resultingFling, 76, target, 2.0);
  312.     }
  313.     else
  314.     {
  315.         SDKCall(sdkCallPushPlayer, target, resultingFling, 2, target, 2.0);
  316.     }
  317.  
  318. }
  319.  
  320. stock bool IsValidClient(int client)
  321. {
  322.     if ( client < 1 || client > MaxClients ) return false;
  323.     if ( !IsClientConnected( client )) return false;
  324.     if ( !IsClientInGame( client )) return false;
  325.     if ( !IsPlayerAlive( client )) return false;
  326.     return true;
  327. }
Advertisement
Add Comment
Please, Sign In to add comment