Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma semicolon 1
- #pragma newdecls required
- #include <sdktools>
- #pragma tabsize 0
- float GrenadeDamage = 5000.0;
- float PipeBombDamage = 5000.0;
- float BarrelDamage = 5000.0;
- float GrenadeRadius = 660.0;
- float PipeRadius = 660.0;
- float BarrelRadius = 660.0;
- float ShakeGrenade = 1320.0;
- float ShakePipe = 1320.0;
- float ShakeBarrel = 1320.0;
- float PowerShakeG = 50.0;
- float PowerShakeP = 50.0;
- float PowerShakeB = 50.0;
- bool IsAllow = false;
- public void OnMapStart()
- {
- IsAllow = false;
- CreateTimer(3.0, allow);
- }
- public Action allow(Handle timer)
- {
- IsAllow = true;
- }
- public void OnEntityDestroyed(int entity)
- {
- if(!IsAllow) return;
- if (IsValidEntity(entity) && IsValidEdict(entity))
- {
- char classname[128];
- GetEdictClassname(entity, classname, 128);
- if (StrEqual(classname, "grenade_launcher_projectile", false))
- {
- GrenadeTouch(entity);
- }
- if (StrEqual(classname, "pipe_bomb_projectile", false))
- {
- BombTouch(entity);
- }
- if (StrEqual(classname, "prop_fuel_barrel", false))
- {
- BarrelTouch(entity);
- }
- }
- }
- public int GrenadeTouch(int entity)
- {
- float pos[3];
- GetEntPropVector(entity, view_as<PropType>(0), "m_vecOrigin", pos, 0);
- GranadeExplode(pos);
- }
- public int BombTouch(int entity)
- {
- float pos[3];
- GetEntPropVector(entity, view_as<PropType>(0), "m_vecOrigin", pos, 0);
- BombExplode(pos);
- }
- public int BarrelTouch(int entity)
- {
- float pos[3];
- GetEntPropVector(entity, view_as<PropType>(0), "m_vecOrigin", pos, 0);
- BarrelExplode(pos);
- }
- int GranadeExplode(float pos[3])
- {
- float fDistance = 0.0;
- float pos2[3];
- for( int i = 0; i < 32; i++ )
- {
- if(IsValidClient(i) && GetClientTeam(i) == 2)
- {
- int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
- if(vClass == 9)
- {
- GetClientAbsOrigin(i, pos2);
- fDistance = GetVectorDistance(pos, pos2);
- if(fDistance < GrenadeRadius && IsVisibleTo(pos, pos2))
- {
- float iOne = GrenadeRadius - fDistance;
- float vForward = GrenadeRadius / iOne;
- int iDamage = RoundToCeil(GrenadeDamage / (vForward * vForward * vForward));
- ForceDamageEntity(i, iDamage, i);
- }
- if(fDistance < ShakeGrenade)
- {
- float iOne = ShakeGrenade - fDistance;
- float vForward = ShakeGrenade / iOne;
- float iDamage = (PowerShakeG / (vForward * vForward * vForward)) * 1.0;
- ScreenShake(i, iDamage);
- }
- }
- }
- }
- }
- int BombExplode(float pos[3])
- {
- float fDistance = 0.0;
- float pos2[3];
- for( int i = 0; i < 32; i++ )
- {
- if(IsValidClient(i) && GetClientTeam(i) == 2)
- {
- int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
- if(vClass == 9)
- {
- GetClientAbsOrigin(i, pos2);
- fDistance = GetVectorDistance(pos, pos2);
- if(fDistance < PipeRadius && IsVisibleTo(pos, pos2))
- {
- float iOne = PipeRadius - fDistance;
- float vForward = PipeRadius / iOne;
- int iDamage = RoundToCeil(PipeBombDamage / (vForward * vForward * vForward));
- ForceDamageEntity(i, iDamage, i);
- }
- if(fDistance < ShakePipe)
- {
- float iOne = ShakePipe - fDistance;
- float vForward = ShakePipe / iOne;
- float iDamage = (PowerShakeP / (vForward * vForward * vForward)) * 1.0;
- ScreenShake(i, iDamage);
- }
- }
- }
- }
- }
- int BarrelExplode(float pos[3])
- {
- float fDistance = 0.0;
- float pos2[3];
- for( int i = 0; i < 32; i++ )
- {
- if(IsValidClient(i) && GetClientTeam(i) == 2)
- {
- int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
- if(vClass == 9)
- {
- GetClientAbsOrigin(i, pos2);
- fDistance = GetVectorDistance(pos, pos2);
- if(fDistance < BarrelRadius && IsVisibleTo(pos, pos2))
- {
- float iOne = BarrelRadius - fDistance;
- float vForward = BarrelRadius / iOne;
- int iDamage = RoundToCeil(BarrelDamage / (vForward * vForward * vForward));
- ForceDamageEntity(i, iDamage, i);
- }
- if(fDistance < ShakeBarrel)
- {
- float iOne = ShakeBarrel - fDistance;
- float vForward = ShakeBarrel / iOne;
- float iDamage = (PowerShakeB / (vForward * vForward * vForward)) * 1.0;
- ScreenShake(i, iDamage);
- }
- }
- }
- }
- }
- public void ScreenShake(int target, float power)
- {
- Handle msg;
- msg = StartMessageOne("Shake", target);
- BfWriteByte(msg, 0);
- BfWriteFloat(msg, power);
- BfWriteFloat(msg, 10.0);
- BfWriteFloat(msg, 3.0);
- EndMessage();
- }
- static bool IsVisibleTo(float position[3], float targetposition[3])
- {
- float vAngles[3], vLookAt[3];
- MakeVectorFromPoints(position, targetposition, vLookAt);
- GetVectorAngles(vLookAt, vAngles);
- Handle trace = TR_TraceRayFilterEx(position, vAngles, MASK_SHOT, RayType_Infinite, _TraceFilter);
- bool isVisible = false;
- if (TR_DidHit(trace))
- {
- float vStart[3];
- TR_GetEndPosition(vStart, trace);
- if ((GetVectorDistance(position, vStart, false) + 25.0) >= GetVectorDistance(position, targetposition))
- {
- isVisible = true;
- }
- }
- return isVisible;
- }
- public bool _TraceFilter(int entity, int contentsMask)
- {
- }
- stock void ForceDamageEntity(int causer, int damage, int victim) // thanks to 达斯*维达
- {
- float victim_origin[3];
- char rupture[32];
- char damage_victim[32];
- IntToString(damage, rupture, sizeof(rupture));
- Format(damage_victim, sizeof(damage_victim), "hurtme%d", victim);
- GetEntPropVector(victim, Prop_Send, "m_vecOrigin", victim_origin);
- int entity = CreateEntityByName("point_hurt");
- DispatchKeyValue(victim, "targetname", damage_victim);
- DispatchKeyValue(entity, "DamageTarget", damage_victim);
- DispatchKeyValue(entity, "Damage", rupture);
- DispatchSpawn(entity);
- TeleportEntity(entity, victim_origin, NULL_VECTOR, NULL_VECTOR);
- AcceptEntityInput(entity, "Hurt", (causer > 0 && causer <= MaxClients) ? causer : -1);
- DispatchKeyValue(entity, "classname", "point_hurt");
- DispatchKeyValue(victim, "targetname", "null");
- AcceptEntityInput(entity, "Kill");
- }
- stock bool IsValidClient(int client)
- {
- if ( client < 1 || client > MaxClients ) return false;
- if( !IsClientInGame(client)) return false;
- if ( !IsPlayerAlive( client )) return false;
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement