Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sourcemod>
- #include <sdktools>
- //Survivors
- int iDamageGrenadeLauncherS = 500;
- float iPowerSFling = 150.0;
- float iRadiusSdie = 200.0
- float iRadiusSFling = 400.0
- float iRadiusSDamage = 400.0
- //Survivors Pipe Bomb
- int iDamagePipeS = 400;
- float iPowerSFlingPipe = 150.0;
- float iRadiusSdiePipe = 200.0
- float iRadiusSFlingPipe = 400.0
- float iRadiusSDamagePipe = 400.0
- //Tank
- int iDamageGrenadeLauncherT = 500;
- float iPowerTFling = 10.0
- float iRadiusTDamage = 700.0
- float iRadiusTFling = 700.0
- //Tank Pipe
- int iDamagePipeT = 400
- float iPowerTFlingPipe = 10.0
- float iRadiusTDamagePipe = 700.0
- float iRadiusTFlingPipe = 700.0
- //Charger
- int iDamageGrenadeLauncherC = 500
- float iPowerCFling = 300.0
- float iRadiusCDamage = 400.0
- float iRadiusCFling = 300.0
- //Charger Pipe
- int iDamagePipeC = 400;
- float iPowerCFlingPipe = 300.0
- float iRadiusCDamagePipe = 400.0
- float iRadiusCFlingPipe = 300.0
- //Other Inf
- int iDamageGrenadeLauncherI = 500
- float iPowerIFling = 150.0
- float iRadiusIDamage = 200.0
- float iRadiusIFling = 400.0
- //Other Inf Pipe
- int iDamagePipeI = 500;
- float iPowerIFlingPipe = 150.0
- float iRadiusIDamagePipe = 200.0
- float iRadiusIFlingPipe = 400.0
- Handle sdkCallPushPlayer;
- public OnPluginStart()
- {
- Handle hGameConf = LoadGameConfigFile("gamedata_stager");
- if( hGameConf == null )
- SetFailState("Couldn't find the offsets and signatures file. Please, check that it is installed correctly.");
- StartPrepSDKCall(SDKCall_Static);
- if( PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "CTerrorPlayer_OnStaggered") == false )
- SetFailState("Could not load the \"CTerrorPlayer_OnStaggered\" gamedata signature.");
- PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
- PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
- PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
- PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
- PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer);
- PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
- PrepSDKCall_SetReturnInfo(SDKType_CBaseEntity, SDKPass_Pointer);
- sdkCallPushPlayer = EndPrepSDKCall();
- if( sdkCallPushPlayer == null )
- SetFailState("Could not prep the \"CTerrorPlayer_OnStaggered\" function.");
- }
- public OnEntityDetroyed(entity)
- {
- if(IsValidEntity(entity))
- {
- char sCls[32]
- GetEntityClassname(entity, sCls, sizeof(sCls))
- if(StrEqual(sCls, "grenade_launcher_projectile"))
- {
- for(int i = 1; i <= MaxClients; ++i)
- {
- if(IsValidClient(i))
- {
- float vPos[3], vDamager[3];
- GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vDamager);
- GetEntPropVector(i, Prop_Send, "m_vecOrigin", vPos);
- float fTargetDistance = GetVectorDistance(vDamager, vPos);
- if(GetClientTeam(i) == 3)
- {
- int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
- if (vClass == 8)
- {
- if (!IsVisibleTo(vDamager, vPos)) return;
- if (fTargetDistance > iRadiusTDamage)
- {
- int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
- ForceDamageEntity(iOwn, iDamageGrenadeLauncherT, i)
- }
- if (fTargetDistance > iRadiusTFling)
- {
- Fly(entity, i, iPowerTFling)
- }
- }
- else if (vClass == 6)
- {
- if (!IsVisibleTo(vDamager, vPos)) return;
- if (fTargetDistance > iRadiusCDamage)
- {
- int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
- ForceDamageEntity(iOwn, iDamageGrenadeLauncherC, i)
- }
- if (fTargetDistance > iRadiusCFling)
- {
- Fly(entity, i, iPowerCFling)
- }
- }
- else
- {
- if (!IsVisibleTo(vDamager, vPos)) return;
- if (fTargetDistance > iRadiusIDamage)
- {
- int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
- ForceDamageEntity(iOwn, iDamageGrenadeLauncherI, i)
- }
- if (fTargetDistance > iRadiusIFling)
- {
- Fly(entity, i, iPowerIFling)
- }
- }
- }
- else
- {
- if (!IsVisibleTo(vDamager, vPos)) return;
- if (fTargetDistance > iRadiusSdie)
- {
- ForcePlayerSuicide(i)
- }
- if (fTargetDistance > iRadiusSFling)
- {
- Fly(entity, i, iPowerSFling)
- }
- if (fTargetDistance > iRadiusSDamage)
- {
- int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
- int iDamage = RoundToCeil(fTargetDistance - iDamageGrenadeLauncherS)
- ForceDamageEntity(iOwn, iDamage, i)
- }
- }
- }
- }
- }
- else if(StrEqual(sCls, "pipe_bomb_projectile"))
- {
- for(int i = 1; i <= MaxClients; ++i)
- {
- if(IsValidClient(i))
- {
- float vPos[3], vDamager[3];
- GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vDamager);
- GetEntPropVector(i, Prop_Send, "m_vecOrigin", vPos);
- float fTargetDistance = GetVectorDistance(vDamager, vPos);
- if(GetClientTeam(i) == 3)
- {
- int vClass = GetEntProp(i, Prop_Send, "m_zombieClass");
- if (vClass == 8)
- {
- if (!IsVisibleTo(vDamager, vPos)) return;
- if (fTargetDistance > iRadiusTDamagePipe)
- {
- int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
- ForceDamageEntity(iOwn, iDamagePipeT, i)
- }
- if (fTargetDistance > iRadiusTFlingPipe)
- {
- Fly(entity, i, iPowerTFlingPipe)
- }
- }
- else if (vClass == 6)
- {
- if (!IsVisibleTo(vDamager, vPos)) return;
- if (fTargetDistance > iRadiusCDamagePipe)
- {
- int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
- ForceDamageEntity(iOwn, iDamagePipeC, i)
- }
- if (fTargetDistance > iRadiusCFlingPipe)
- {
- Fly(entity, i, iPowerCFlingPipe)
- }
- }
- else
- {
- if (!IsVisibleTo(vDamager, vPos)) return;
- if (fTargetDistance > iRadiusIDamagePipe)
- {
- int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
- ForceDamageEntity(iOwn, iDamagePipeI, i)
- }
- if (fTargetDistance > iRadiusIFlingPipe)
- {
- Fly(entity, i, iPowerIFlingPipe)
- }
- }
- }
- else
- {
- if (!IsVisibleTo(vDamager, vPos)) return;
- if (fTargetDistance > iRadiusSdiePipe)
- {
- ForcePlayerSuicide(i)
- }
- if (fTargetDistance > iRadiusSFlingPipe)
- {
- Fly(entity, i, iPowerSFlingPipe)
- }
- if (fTargetDistance > iRadiusSDamagePipe)
- {
- int iOwn = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
- int iDamage = RoundToCeil(fTargetDistance - iDamagePipeS)
- ForceDamageEntity(iOwn, iDamage, i)
- }
- }
- }
- }
- }
- }
- }
- 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");
- }
- static bool IsVisibleTo(float position[3], float targetposition[3])
- {
- float vAngles[3], vLookAt[3];
- MakeVectorFromPoints(position, targetposition, vLookAt); // compute vector from start to target
- GetVectorAngles(vLookAt, vAngles); // get angles from vector for trace
- // execute Trace
- 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); // retrieve our trace endpoint
- if ((GetVectorDistance(position, vStart, false) + 25.0) >= GetVectorDistance(position, targetposition))
- {
- isVisible = true; // if trace ray length plus tolerance equal or bigger absolute distance, you hit the target
- }
- }
- return isVisible;
- }
- public bool _TraceFilter(int entity, int contentsMask)
- {
- if (!entity || entity <= MaxClients || !IsValidEntity(entity)) // dont let WORLD, or invalid entities be hit
- {
- return false;
- }
- return true;
- }
- public Fly(explosion, int target, float power)
- {
- if(target <= 0 || !IsValidEntity(target) || !IsValidEdict(target)) return;
- float targetPos[3], explosionPos[3], traceVec[3], resultingFling[3];
- GetEntPropVector(target, Prop_Data, "m_vecOrigin", targetPos);
- GetEntPropVector(explosion, Prop_Data,"m_vecOrigin", explosionPos);
- power = power - GetVectorDistance(targetPos,explosionPos);
- if(power < 1)
- return;
- MakeVectorFromPoints(explosionPos, targetPos, traceVec);
- GetVectorAngles(traceVec, resultingFling);
- resultingFling[0] = Cosine(DegToRad(resultingFling[1])) * power;
- resultingFling[1] = Sine(DegToRad(resultingFling[1])) * power;
- resultingFling[2] = power + (power * 0.5);
- if (GetClientTeam(target) == 2)
- {
- SDKCall(sdkCallPushPlayer, target, resultingFling, 76, target, 2.0);
- }
- else
- {
- SDKCall(sdkCallPushPlayer, target, resultingFling, 2, target, 2.0);
- }
- }
- stock bool IsValidClient(int client)
- {
- if ( client < 1 || client > MaxClients ) return false;
- if ( !IsClientConnected( client )) return false;
- if ( !IsClientInGame( client )) return false;
- if ( !IsPlayerAlive( client )) return false;
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement