258 lines
7.0 KiB
SourcePawn
258 lines
7.0 KiB
SourcePawn
|
|
/*
|
|
THESE FUNCTIONS ARE ENTIRELY MADE BY Pelipoika IN HIS PLUGIN "Necromasher":
|
|
https://forums.alliedmods.net/showthread.php?p=2300875
|
|
All credits go to him!
|
|
*/
|
|
|
|
bool g_bShouldBeSmashed[MAXPLAYERS+1] = {false, ...};
|
|
|
|
void NecroMash_Start(){
|
|
|
|
PrecacheModel("models/props_halloween/hammer_gears_mechanism.mdl");
|
|
PrecacheModel("models/props_halloween/hammer_mechanism.mdl");
|
|
PrecacheModel("models/props_halloween/bell_button.mdl");
|
|
|
|
PrecacheSound("misc/halloween/strongman_fast_impact_01.wav");
|
|
PrecacheSound("ambient/explosions/explode_1.wav");
|
|
PrecacheSound("misc/halloween/strongman_fast_whoosh_01.wav");
|
|
PrecacheSound("misc/halloween/strongman_fast_swing_01.wav");
|
|
PrecacheSound("doors/vent_open2.wav");
|
|
|
|
}
|
|
|
|
public void NecroMash_Perk(int client, const char[] sPref, bool apply){
|
|
|
|
if(!apply)
|
|
return;
|
|
|
|
if(GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") > -1)
|
|
NecroMash_SmashClient(client);
|
|
|
|
else{
|
|
|
|
g_bShouldBeSmashed[client] = true;
|
|
CreateTimer(0.1, Timer_NecroMash_Retry, GetClientSerial(client), TIMER_REPEAT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public Action Timer_NecroMash_Retry(Handle hTimer, int iSerial){
|
|
|
|
int client = GetClientFromSerial(iSerial);
|
|
|
|
if(!IsValidClient(client)) return Plugin_Stop;
|
|
if(!g_bShouldBeSmashed[client]) return Plugin_Stop;
|
|
|
|
if(GetEntProp(client, Prop_Send, "m_hGroundEntity") < 0)
|
|
return Plugin_Continue;
|
|
|
|
g_bShouldBeSmashed[client] = false;
|
|
NecroMash_SmashClient(client);
|
|
|
|
return Plugin_Stop;
|
|
|
|
}
|
|
|
|
void NecroMash_SmashClient(int client){
|
|
|
|
float flPos[3], flPpos[3], flAngles[3];
|
|
GetClientAbsOrigin(client, flPos);
|
|
GetClientAbsOrigin(client, flPpos);
|
|
GetClientEyeAngles(client, flAngles);
|
|
flAngles[0] = 0.0;
|
|
|
|
float vForward[3];
|
|
GetAngleVectors(flAngles, vForward, NULL_VECTOR, NULL_VECTOR);
|
|
flPos[0] -= (vForward[0] * 750);
|
|
flPos[1] -= (vForward[1] * 750);
|
|
flPos[2] -= (vForward[2] * 750);
|
|
|
|
flPos[2] += 350.0;
|
|
int gears = CreateEntityByName("prop_dynamic");
|
|
if(IsValidEntity(gears)){
|
|
|
|
DispatchKeyValueVector(gears, "origin", flPos);
|
|
DispatchKeyValueVector(gears, "angles", flAngles);
|
|
DispatchKeyValue(gears, "model", "models/props_halloween/hammer_gears_mechanism.mdl");
|
|
DispatchSpawn(gears);
|
|
|
|
}
|
|
|
|
int hammer = CreateEntityByName("prop_dynamic");
|
|
if(IsValidEntity(hammer)){
|
|
|
|
DispatchKeyValueVector(hammer, "origin", flPos);
|
|
DispatchKeyValueVector(hammer, "angles", flAngles);
|
|
DispatchKeyValue(hammer, "model", "models/props_halloween/hammer_mechanism.mdl");
|
|
DispatchSpawn(hammer);
|
|
|
|
}
|
|
|
|
int button = CreateEntityByName("prop_dynamic");
|
|
if(IsValidEntity(button)){
|
|
|
|
flPos[0] += (vForward[0] * 600);
|
|
flPos[1] += (vForward[1] * 600);
|
|
flPos[2] += (vForward[2] * 600);
|
|
|
|
flPos[2] -= 100.0;
|
|
flAngles[1] += 180.0;
|
|
|
|
DispatchKeyValueVector(button, "origin", flPos);
|
|
DispatchKeyValueVector(button, "angles", flAngles);
|
|
DispatchKeyValue(button, "model", "models/props_halloween/bell_button.mdl");
|
|
DispatchSpawn(button);
|
|
|
|
Handle pack;
|
|
CreateDataTimer(1.3, Timer_NecroMash_Hit, pack);
|
|
WritePackFloat(pack, flPpos[0]); //Position of effects
|
|
WritePackFloat(pack, flPpos[1]); //Position of effects
|
|
WritePackFloat(pack, flPpos[2]); //Position of effects
|
|
|
|
Handle pack2;
|
|
CreateDataTimer(1.0, Timer_NecroMash_Whoosh, pack2);
|
|
WritePackFloat(pack2, flPpos[0]); //Position of effects
|
|
WritePackFloat(pack2, flPpos[1]); //Position of effects
|
|
WritePackFloat(pack2, flPpos[2]); //Position of effects
|
|
|
|
EmitSoundToAll("misc/halloween/strongman_fast_swing_01.wav", _, _, _, _, _, _, _, flPpos);
|
|
}
|
|
|
|
SetVariantString("OnUser1 !self:SetAnimation:smash:0:1");
|
|
AcceptEntityInput(gears, "AddOutput");
|
|
AcceptEntityInput(gears, "FireUser1");
|
|
|
|
SetVariantString("OnUser1 !self:SetAnimation:smash:0:1");
|
|
AcceptEntityInput(hammer, "AddOutput");
|
|
AcceptEntityInput(hammer, "FireUser1");
|
|
|
|
SetVariantString("OnUser1 !self:SetAnimation:hit:1.3:1");
|
|
AcceptEntityInput(button, "AddOutput");
|
|
AcceptEntityInput(button, "FireUser1");
|
|
|
|
SetVariantString("OnUser2 !self:Kill::5.0:1");
|
|
AcceptEntityInput(gears, "AddOutput");
|
|
AcceptEntityInput(gears, "FireUser2");
|
|
|
|
SetVariantString("OnUser2 !self:Kill::5.0:1");
|
|
AcceptEntityInput(hammer, "AddOutput");
|
|
AcceptEntityInput(hammer, "FireUser2");
|
|
|
|
SetVariantString("OnUser2 !self:Kill::5.0:1");
|
|
AcceptEntityInput(button, "AddOutput");
|
|
AcceptEntityInput(button, "FireUser2");
|
|
|
|
}
|
|
|
|
public Action Timer_NecroMash_Hit(Handle timer, any pack){
|
|
|
|
ResetPack(pack);
|
|
|
|
float pos[3];
|
|
pos[0] = ReadPackFloat(pack);
|
|
pos[1] = ReadPackFloat(pack);
|
|
pos[2] = ReadPackFloat(pack);
|
|
|
|
int shaker = CreateEntityByName("env_shake");
|
|
if(shaker != -1){
|
|
|
|
DispatchKeyValue(shaker, "amplitude", "10");
|
|
DispatchKeyValue(shaker, "radius", "1500");
|
|
DispatchKeyValue(shaker, "duration", "1");
|
|
DispatchKeyValue(shaker, "frequency", "2.5");
|
|
DispatchKeyValue(shaker, "spawnflags", "4");
|
|
DispatchKeyValueVector(shaker, "origin", pos);
|
|
|
|
DispatchSpawn(shaker);
|
|
AcceptEntityInput(shaker, "StartShake");
|
|
|
|
SetVariantString("OnUser1 !self:Kill::1.0:1");
|
|
AcceptEntityInput(shaker, "AddOutput");
|
|
AcceptEntityInput(shaker, "FireUser1");
|
|
|
|
}
|
|
|
|
EmitSoundToAll("ambient/explosions/explode_1.wav", _, _, _, _, _, _, _, pos);
|
|
EmitSoundToAll("misc/halloween/strongman_fast_impact_01.wav", _, _, _, _, _, _, _, pos);
|
|
|
|
float pos2[3], Vec[3], AngBuff[3];
|
|
|
|
for(int i = 1; i <= MaxClients; i++){
|
|
|
|
if(IsClientInGame(i) && IsPlayerAlive(i)){
|
|
|
|
GetClientAbsOrigin(i, pos2);
|
|
|
|
if(GetVectorDistance(pos, pos2) <= 500.0){
|
|
|
|
MakeVectorFromPoints(pos, pos2, Vec);
|
|
GetVectorAngles(Vec, AngBuff);
|
|
AngBuff[0] -= 30.0;
|
|
GetAngleVectors(AngBuff, Vec, NULL_VECTOR, NULL_VECTOR);
|
|
NormalizeVector(Vec, Vec);
|
|
ScaleVector(Vec, 500.0);
|
|
Vec[2] += 250.0;
|
|
TeleportEntity(i, NULL_VECTOR, NULL_VECTOR, Vec);
|
|
|
|
}
|
|
|
|
if(GetVectorDistance(pos, pos2) <= 60.0)
|
|
SDKHooks_TakeDamage(i, i, i, 999999.0, DMG_CLUB|DMG_ALWAYSGIB|DMG_BLAST);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pos[2] += 10.0;
|
|
NecroMash_CreateParticle("hammer_impact_button", pos);
|
|
NecroMash_CreateParticle("hammer_bones_kickup", pos);
|
|
|
|
}
|
|
|
|
public Action Timer_NecroMash_Whoosh(Handle timer, any pack){
|
|
|
|
ResetPack(pack);
|
|
|
|
float pos[3];
|
|
pos[0] = ReadPackFloat(pack);
|
|
pos[1] = ReadPackFloat(pack);
|
|
pos[2] = ReadPackFloat(pack);
|
|
|
|
EmitSoundToAll("misc/halloween/strongman_fast_whoosh_01.wav", _, _, _, _, _, _, _, pos);
|
|
|
|
}
|
|
|
|
stock void NecroMash_CreateParticle(char[] particle, float pos[3]){
|
|
|
|
int tblidx = FindStringTable("ParticleEffectNames");
|
|
char tmp[256];
|
|
int count = GetStringTableNumStrings(tblidx);
|
|
int stridx = INVALID_STRING_INDEX;
|
|
|
|
for(int i = 0; i < count; i++){
|
|
|
|
ReadStringTable(tblidx, i, tmp, sizeof(tmp));
|
|
if(StrEqual(tmp, particle, false)){
|
|
stridx = i;
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
for(int i = 1; i <= GetMaxClients(); i++){
|
|
|
|
if(!IsValidEntity(i)) continue;
|
|
if(!IsClientInGame(i)) continue;
|
|
TE_Start("TFParticleEffect");
|
|
TE_WriteFloat("m_vecOrigin[0]", pos[0]);
|
|
TE_WriteFloat("m_vecOrigin[1]", pos[1]);
|
|
TE_WriteFloat("m_vecOrigin[2]", pos[2]);
|
|
TE_WriteNum("m_iParticleSystemIndex", stridx);
|
|
TE_WriteNum("entindex", -1);
|
|
TE_WriteNum("m_iAttachType", 2);
|
|
TE_SendToClient(i, 0.0);
|
|
}
|
|
|
|
} |