FlacoBey

Untitled

May 5th, 2019
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.76 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdktools>
  3.  
  4. bool IsSpawned
  5. bool IsAbility
  6.  
  7. Handle sdkCallPushPlayer = INVALID_HANDLE;
  8. Handle GameConf = INVALID_HANDLE;
  9.  
  10. ConVar vPower, vDamage, vTime;
  11.  
  12. public OnPluginStart()
  13. {
  14.     GameConf = LoadGameConfigFile("detonationforce");
  15.     StartPrepSDKCall(SDKCall_Player);
  16.     PrepSDKCall_SetFromConf(GameConf, SDKConf_Signature, "CTerrorPlayer_Fling");
  17.     PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
  18.     PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
  19.     PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer);
  20.     PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
  21.     sdkCallPushPlayer = EndPrepSDKCall();
  22.    
  23.     vPower = CreateConVar("PowerRock", "80", "Сила откидывания камня", FCVAR_NONE);
  24.     vDamage = CreateConVar("DamageRock", "80", "Урон от взрыва", FCVAR_NONE);
  25.     vTime = CreateConVar("TimeAnimRock", "2.0", "Как долго игрок будет приходить в себя от взрыва камня", FCVAR_NONE);
  26.    
  27.     HookEvent("tank_spawn", hTankSpawn, EventHookMode_PostNoCopy);
  28.     HookEvent("tank_killed", hTankKill, EventHookMode_PostNoCopy);
  29.     HookEvent("ability_use", AbilityUsed);
  30.    
  31.     AutoExecConfig(true, "TankRock");
  32. }
  33.  
  34. public OnMapStart()
  35. {
  36.     PrecacheParticle("gas_explosion_pump");
  37.     PrecacheModel("models/props_junk/propanecanister001a.mdl", true);
  38.    
  39.     IsSpawned = false;
  40.     IsAbility = false;
  41. }
  42.  
  43. public Action hTankSpawn(Handle:event, const String:name[], bool:dontBroadcast)
  44. {
  45.     IsSpawned = true;
  46. }
  47.  
  48. public Action hTankKill(Handle:event, const String:name[], bool:dontBroadcast)
  49. {
  50.     IsSpawned = false;
  51.     IsAbility = false;
  52. }
  53.  
  54. public Action:AbilityUsed(Handle:event, const String:name[], bool:dontBroadcast)
  55. {
  56.     char sAbili[32];
  57.     GetEventString(event, "ability", sAbili, sizeof(sAbili));
  58.  
  59.     if(StrEqual(sAbili, "ability_throw"))
  60.     {  
  61.         IsAbility = true;
  62.     }
  63. }
  64.  
  65. public OnEntityCreated(entity, const String:classname[])
  66. {
  67.     if(!IsAbility && !IsSpawned) return;
  68.     if(StrEqual(classname, "tank_rock"))
  69.     {
  70.         CreateTimer(0.1, OnHeSpawned, EntIndexToEntRef(entity), TIMER_FLAG_NO_MAPCHANGE);
  71.     }
  72. }
  73.  
  74. public OnEntityDestroyed(entity)
  75. {  
  76.     if(!IsSpawned && !IsValidEntity(entity) && !IsAbility) return;
  77.    
  78.     decl String:g_classname[20];
  79.     GetEdictClassname(entity, g_classname, 20);
  80.    
  81.     if(StrEqual(g_classname, "tank_rock"))
  82.     {
  83.         for (new i = 1; i <= MaxClients; i++)
  84.         {
  85.             float vPos[3], vEntityPos[3];
  86.             GetEntPropVector(i, Prop_Data, "m_vecOrigin", vPos);       
  87.             GetEntPropVector(entity, Prop_Data, "m_vecOrigin", vEntityPos);
  88.            
  89.             int vStreght = RoundToCeil(GetConVarInt(vPower) - GetVectorDistance(vPos, vEntityPos));
  90.            
  91.             if(vStreght < 1) return;
  92.            
  93.             float vTraceVec[3], vResult[3];
  94.            
  95.             MakeVectorFromPoints(vEntityPos, vPos, vTraceVec);
  96.             GetVectorAngles(vTraceVec, vResult);
  97.            
  98.             vResult[0] = Cosine(DegToRad(vResult[1])) * vStreght;
  99.             vResult[1] = Sine(DegToRad(vResult[1])) * vStreght;
  100.             vResult[2] = vStreght + (vStreght * 0.5);
  101.            
  102.             LittleFlower(vEntityPos)
  103.             SDKCall(sdkCallPushPlayer, i, vResult, 76, i, GetConVarFloat(vTime));
  104.             ShowParticle(vEntityPos, "gas_explosion_pump", 3.0);
  105.            
  106.             int samage = RoundToCeil(GetConVarInt(vDamage) - GetVectorDistance(vPos, vEntityPos));
  107.             if(samage < 0) return;
  108.            
  109.             ForceDamageEntity(entity, samage, i)
  110.         }
  111.     }
  112. }
  113.  
  114. public Action OnHeSpawned(Handle timer, any ent)
  115. {
  116.     decl client;
  117.     if ((ent = EntRefToEntIndex(ent)) > 0 && (client = GetEntPropEnt(ent, Prop_Data, "m_hThrower")) > 0 && IsClientInGame(client))
  118.     {
  119.         IsAbility = false;
  120.         if(IsValidEntity(ent) && IsValidEdict(ent))
  121.         {
  122.             if(IsValidInfected(client))
  123.             {
  124.                 if(IsClientInGame(client) && IsPlayerAlive(client))
  125.                 {
  126.                     if(GetEntityFlags(client) & FL_ONFIRE)
  127.                     {
  128.                         IgniteEntity(ent, 100.0);
  129.                     }
  130.                 }
  131.             }
  132.         }
  133.     }
  134. }
  135.  
  136.  public ShowParticle(Float:pos[3], String:particlename[], Float:time)
  137. {
  138.     new particle = CreateEntityByName("info_particle_system");
  139.     if (IsValidEdict(particle))
  140.     {
  141.         TeleportEntity(particle, pos, NULL_VECTOR, NULL_VECTOR);
  142.         DispatchKeyValue(particle, "effect_name", particlename);
  143.         DispatchKeyValue(particle, "targetname", "particle");
  144.         DispatchSpawn(particle);
  145.         ActivateEntity(particle);
  146.         AcceptEntityInput(particle, "start");
  147.         CreateTimer(time, DeleteParticles, particle);
  148.     }
  149. }
  150.  
  151. public PrecacheParticle(String:particlename[])
  152. {
  153.     new particle = CreateEntityByName("info_particle_system");
  154.     if (IsValidEdict(particle))
  155.     {
  156.         DispatchKeyValue(particle, "effect_name", particlename);
  157.         DispatchKeyValue(particle, "targetname", "particle");
  158.         DispatchSpawn(particle);
  159.         ActivateEntity(particle);
  160.         AcceptEntityInput(particle, "start");
  161.         CreateTimer(0.01, DeleteParticles, particle);
  162.     }
  163. }
  164.  
  165. public Action:DeleteParticles(Handle:timer, any:particle)
  166. {
  167.     if(IsValidEntity(particle))
  168.     {
  169.         decl String:classname[64];
  170.         GetEdictClassname(particle, classname, sizeof(classname));
  171.         if (StrEqual(classname, "info_particle_system", false))
  172.         {
  173.             AcceptEntityInput(particle, "stop");
  174.             AcceptEntityInput(particle, "kill");
  175.             RemoveEdict(particle);
  176.         }
  177.      }
  178. }
  179.  
  180. stock LittleFlower(Float:pos[3])
  181. {
  182.     new entity = CreateEntityByName("prop_physics");
  183.     if (IsValidEntity(entity))
  184.     {
  185.         pos[2] += 1.0;
  186.         DispatchKeyValue(entity, "model", "models/props_junk/propanecanister001a.mdl");
  187.         DispatchSpawn(entity);
  188.         SetEntData(entity, GetEntSendPropOffs(entity, "m_CollisionGroup"), 1, 1, true);
  189.         SetEntityRenderMode(entity, RENDER_TRANSCOLOR);
  190.         SetEntityRenderColor(entity, 255, 255, 255, 0);
  191.         TeleportEntity(entity, pos, NULL_VECTOR, NULL_VECTOR);
  192.         AcceptEntityInput(entity, "break");
  193.     }
  194. }
  195.  
  196. stock ForceDamageEntity(causer, damage, victim) // thanks to 达斯*维达
  197. {
  198.     float victim_origin[3];
  199.     char rupture[32];
  200.     char damage_victim[32];
  201.     IntToString(damage, rupture, sizeof(rupture));
  202.     Format(damage_victim, sizeof(damage_victim), "hurtme%d", victim);
  203.     GetEntPropVector(victim, Prop_Send, "m_vecOrigin", victim_origin);
  204.     int entity = CreateEntityByName("point_hurt");
  205.     DispatchKeyValue(victim, "targetname", damage_victim);
  206.     DispatchKeyValue(entity, "DamageTarget", damage_victim);
  207.     DispatchKeyValue(entity, "Damage", rupture);
  208.     DispatchSpawn(entity);
  209.     TeleportEntity(entity, victim_origin, NULL_VECTOR, NULL_VECTOR);
  210.     AcceptEntityInput(entity, "Hurt", (causer > 0 && causer <= MaxClients) ? causer : -1);
  211.     DispatchKeyValue(entity, "classname", "point_hurt");
  212.     DispatchKeyValue(victim, "targetname", "null");
  213.     AcceptEntityInput(entity, "Kill");
  214. }
  215.  
  216. stock bool:IsValidInfected( client )
  217. {
  218.     if ( client < 1 || client > MaxClients ) return false;
  219.     if ( !IsClientConnected( client )) return false;
  220.     if ( !IsClientInGame( client )) return false;
  221.     if ( GetClientTeam( client ) != 3 ) return false;
  222.     return true;
  223. }
Advertisement
Add Comment
Please, Sign In to add comment