mirror of
https://github.com/Jackzmc/sourcemod-plugins.git
synced 2025-05-06 16:43:21 +00:00
H&S fixes
This commit is contained in:
parent
162d2c2664
commit
b8e2135d42
5 changed files with 205 additions and 27 deletions
Binary file not shown.
|
@ -11,11 +11,31 @@
|
||||||
#define ENT_ENV_NAME "cenv"
|
#define ENT_ENV_NAME "cenv"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void DeleteCustomEnts() {
|
stock void DeleteCustomEnts() {
|
||||||
EntFire(ENT_PROP_NAME, "Kill");
|
EntFireTarget(ENT_PROP_NAME, "Kill");
|
||||||
EntFire(ENT_BLOCKER_NAME, "Kill");
|
EntFireTarget(ENT_BLOCKER_NAME, "Kill");
|
||||||
EntFire(ENT_PORTAL_NAME, "Kill");
|
EntFireTarget(ENT_PORTAL_NAME, "Kill");
|
||||||
EntFire(ENT_ENV_NAME, "Kill");
|
EntFireTarget(ENT_ENV_NAME, "Kill");
|
||||||
|
}
|
||||||
|
|
||||||
|
stock void EntFireTarget(const char[] name, const char[] input) {
|
||||||
|
static char targetname[64];
|
||||||
|
static char cmd[32];
|
||||||
|
#if defined DEBUG_LOG_MAPSTART
|
||||||
|
PrintToServer("EntFireTarget: %s \"%s\"", name, input);
|
||||||
|
#endif
|
||||||
|
int len = SplitString(input, " ", cmd, sizeof(cmd));
|
||||||
|
if(len > -1) SetVariantString(input[len]);
|
||||||
|
|
||||||
|
for(int i = MaxClients + 1; i <= 4096; i++) {
|
||||||
|
if(IsValidEntity(i) && (IsValidEdict(i) || EntIndexToEntRef(i) != -1)) {
|
||||||
|
GetEntPropString(i, Prop_Data, "m_iName", targetname, sizeof(targetname));
|
||||||
|
if(StrEqual(targetname, name, false)) {
|
||||||
|
if(len > -1) AcceptEntityInput(i, cmd);
|
||||||
|
else AcceptEntityInput(i, input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stock int CreateEnvBlockerScaled(const char[] entClass, const float pos[3], const float scale[3] = { 5.0, 5.0, 5.0 }, bool enabled = true) {
|
stock int CreateEnvBlockerScaled(const char[] entClass, const float pos[3], const float scale[3] = { 5.0, 5.0, 5.0 }, bool enabled = true) {
|
||||||
|
@ -120,6 +140,9 @@ void OnPortalTouch(const char[] output, int caller, int activator, float delay)
|
||||||
} else {
|
} else {
|
||||||
TeleportEntity(activator, entData[caller].portalOffsets, NULL_VECTOR, NULL_VECTOR);
|
TeleportEntity(activator, entData[caller].portalOffsets, NULL_VECTOR, NULL_VECTOR);
|
||||||
}
|
}
|
||||||
|
#if defined PORTAL_ENTER_SOUND
|
||||||
|
EmitSoundToClient(activator, PORTAL_ENTER_SOUND, activator);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
stock int StartPropCreate(const char[] entClass, const char[] model, const float pos[3], const float ang[3]) {
|
stock int StartPropCreate(const char[] entClass, const char[] model, const float pos[3], const float ang[3]) {
|
||||||
|
@ -199,7 +222,65 @@ stock int CreateDynamicLight(float vOrigin[3], float vAngles[3], int color, floa
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// From l4d_anomaly
|
||||||
|
stock int CreateParticle(const char[] sParticle, const float vPos[3], const float vAng[3], int client = 0)
|
||||||
|
{
|
||||||
|
int entity = CreateEntityByName("info_particle_system");
|
||||||
|
|
||||||
int GetHammerId(int entity) {
|
if( entity != -1 )
|
||||||
return HasEntProp(entity, Prop_Data, "m_iHammerID") ? GetEntProp(entity, Prop_Data, "m_iHammerID") : -1;
|
{
|
||||||
|
DispatchKeyValue(entity, "effect_name", sParticle);
|
||||||
|
DispatchKeyValue(entity, "targetname", ENT_PORTAL_NAME)
|
||||||
|
DispatchSpawn(entity);
|
||||||
|
ActivateEntity(entity);
|
||||||
|
AcceptEntityInput(entity, "start");
|
||||||
|
|
||||||
|
if( client )
|
||||||
|
{
|
||||||
|
// Attach to survivor
|
||||||
|
SetVariantString("!activator");
|
||||||
|
AcceptEntityInput(entity, "SetParent", client);
|
||||||
|
}
|
||||||
|
|
||||||
|
TeleportEntity(entity, vPos, vAng, NULL_VECTOR);
|
||||||
|
|
||||||
|
// Refire
|
||||||
|
float refire = 0.2;
|
||||||
|
static char sTemp[64];
|
||||||
|
Format(sTemp, sizeof(sTemp), "OnUser1 !self:Stop::%f:-1", refire - 0.05);
|
||||||
|
SetVariantString(sTemp);
|
||||||
|
AcceptEntityInput(entity, "AddOutput");
|
||||||
|
Format(sTemp, sizeof(sTemp), "OnUser1 !self:FireUser2::%f:-1", refire);
|
||||||
|
SetVariantString(sTemp);
|
||||||
|
AcceptEntityInput(entity, "AddOutput");
|
||||||
|
AcceptEntityInput(entity, "FireUser1");
|
||||||
|
|
||||||
|
SetVariantString("OnUser2 !self:Start::0:-1");
|
||||||
|
AcceptEntityInput(entity, "AddOutput");
|
||||||
|
SetVariantString("OnUser2 !self:FireUser1::0:-1");
|
||||||
|
AcceptEntityInput(entity, "AddOutput");
|
||||||
|
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// From l4d_anomaly
|
||||||
|
stock void PrecacheParticle(const char[] sEffectName)
|
||||||
|
{
|
||||||
|
static int table = INVALID_STRING_TABLE;
|
||||||
|
if( table == INVALID_STRING_TABLE )
|
||||||
|
{
|
||||||
|
table = FindStringTable("ParticleEffectNames");
|
||||||
|
}
|
||||||
|
|
||||||
|
if( FindStringIndex(table, sEffectName) == INVALID_STRING_INDEX )
|
||||||
|
{
|
||||||
|
bool save = LockStringTables(false);
|
||||||
|
AddToStringTable(table, sEffectName);
|
||||||
|
LockStringTables(save);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define ENT_BLOCKER_NAME "hsblocker"
|
#define ENT_BLOCKER_NAME "hsblocker"
|
||||||
#define ENT_PORTAL_NAME "hsportal"
|
#define ENT_PORTAL_NAME "hsportal"
|
||||||
#define ENT_ENV_NAME "hsenv"
|
#define ENT_ENV_NAME "hsenv"
|
||||||
|
#define PORTAL_ENTER_SOUND "custom/xen_teleport.mp3"
|
||||||
#include <gamemodes/ents>
|
#include <gamemodes/ents>
|
||||||
|
|
||||||
stock void CheatCommand(int client, const char[] command, const char[] argument1) {
|
stock void CheatCommand(int client, const char[] command, const char[] argument1) {
|
||||||
|
@ -28,7 +29,7 @@ stock void EntFire(const char[] name, const char[] input) {
|
||||||
for(int i = MaxClients + 1; i <= 4096; i++) {
|
for(int i = MaxClients + 1; i <= 4096; i++) {
|
||||||
if(IsValidEntity(i) && (IsValidEdict(i) || EntIndexToEntRef(i) != -1)) {
|
if(IsValidEntity(i) && (IsValidEdict(i) || EntIndexToEntRef(i) != -1)) {
|
||||||
if(hammerId > 0) {
|
if(hammerId > 0) {
|
||||||
if(hammerId == GetHammerId(i)) {
|
if(hammerId == Entity_GetHammerId(i)) {
|
||||||
if(setTeam) {
|
if(setTeam) {
|
||||||
SDKHook(i, SDKHook_TraceAttackPost, Hook_OnAttackPost);
|
SDKHook(i, SDKHook_TraceAttackPost, Hook_OnAttackPost);
|
||||||
SetEntProp(i, Prop_Send, "m_iTeamNum", 0);
|
SetEntProp(i, Prop_Send, "m_iTeamNum", 0);
|
||||||
|
@ -87,6 +88,13 @@ void SetupEntities(bool blockers = true, bool props = true, bool portals = true)
|
||||||
if(portals && CreatePortal(Portal_Teleport, config.model, config.origin, config.offset, config.scale) == -1) {
|
if(portals && CreatePortal(Portal_Teleport, config.model, config.origin, config.offset, config.scale) == -1) {
|
||||||
PrintToServer("[H&S:WARN] Failed to spawn portal at (%.1f,%.1f, %.1f)", config.origin[0], config.origin[1], config.origin[2]);
|
PrintToServer("[H&S:WARN] Failed to spawn portal at (%.1f,%.1f, %.1f)", config.origin[0], config.origin[1], config.origin[2]);
|
||||||
}
|
}
|
||||||
|
} else if(StrEqual(config.type, "_portal_xen")) {
|
||||||
|
if(portals) {
|
||||||
|
if(CreatePortal(Portal_Teleport, config.model, config.origin, config.offset, config.scale) == -1) {
|
||||||
|
PrintToServer("[H&S:WARN] Failed to spawn portal at (%.1f,%.1f, %.1f)", config.origin[0], config.origin[1], config.origin[2]);
|
||||||
|
}
|
||||||
|
CreateParticle(PARTICLE_ELMOS, config.origin, NULL_VECTOR); // Pulsating
|
||||||
|
}
|
||||||
} else if(StrEqual(config.type, "_lantern")) {
|
} else if(StrEqual(config.type, "_lantern")) {
|
||||||
int parent = CreateProp("prop_dynamic", config.model, config.origin, config.rotation);
|
int parent = CreateProp("prop_dynamic", config.model, config.origin, config.rotation);
|
||||||
if(parent == -1) {
|
if(parent == -1) {
|
||||||
|
|
|
@ -63,23 +63,28 @@ void SetSlasher(int client, bool ignoreBalance = false) {
|
||||||
}
|
}
|
||||||
GameState state = GetState();
|
GameState state = GetState();
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
ArrayList hiders = new ArrayList();
|
||||||
for(int i = 1; i <= MaxClients; i++) {
|
for(int i = 1; i <= MaxClients; i++) {
|
||||||
if(IsClientConnected(i) && IsClientInGame(i) && i != client) {
|
if(IsClientConnected(i) && IsClientInGame(i) && i != client && GetClientTeam(i) == 2) {
|
||||||
for(int s = 0; s < 6; s++) {
|
for(int s = 0; s < 6; s++) {
|
||||||
int ent = GetPlayerWeaponSlot(i, s);
|
int ent = GetPlayerWeaponSlot(i, s);
|
||||||
if(ent > 0) AcceptEntityInput(ent, "Kill");
|
if(ent > 0) AcceptEntityInput(ent, "Kill");
|
||||||
}
|
}
|
||||||
|
hiders.Push(i);
|
||||||
if(state == State_Hunting)
|
if(state == State_Hunting)
|
||||||
CheatCommand(i, "give", "pistol_magnum");
|
CheatCommand(i, "give", "pistol_magnum");
|
||||||
else
|
else
|
||||||
CheatCommand(i, "give", "knife");
|
CheatCommand(i, "give", "knife");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int defibHolder = hiders.Get(GetRandomInt(0, hiders.Length - 1));
|
||||||
|
CheatCommand(defibHolder, "give", "defibrillator");
|
||||||
Format(buf, sizeof(buf), "g_ModeScript.MutationState.CurrentSlasher = GetPlayerFromUserID(%d); g_ModeScript.GiveSeekerItem(GetPlayerFromUserID(%d))", GetClientUserId(client), GetClientUserId(client));
|
Format(buf, sizeof(buf), "g_ModeScript.MutationState.CurrentSlasher = GetPlayerFromUserID(%d); g_ModeScript.GiveSeekerItem(GetPlayerFromUserID(%d))", GetClientUserId(client), GetClientUserId(client));
|
||||||
L4D2_ExecVScriptCode(buf);
|
L4D2_ExecVScriptCode(buf);
|
||||||
currentSeeker = client;
|
currentSeeker = client;
|
||||||
// CheatCommand(client, "give", "fireaxe");
|
CheatCommand(client, "give", "fireaxe");
|
||||||
CheatCommand(client, "give", "adrenaline");
|
CheatCommand(client, "give", "adrenaline");
|
||||||
|
delete hiders;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetTick() {
|
int GetTick() {
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
#include <smlib/effects>
|
#include <smlib/effects>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define PARTICLE_ELMOS "st_elmos_fire_cp0"
|
||||||
|
#define PARTICLE_TES1 "electrical_arc_01"
|
||||||
|
|
||||||
public Plugin myinfo =
|
public Plugin myinfo =
|
||||||
{
|
{
|
||||||
name = "L4D2 Hide & Seek",
|
name = "L4D2 Hide & Seek",
|
||||||
|
@ -65,7 +68,8 @@ bool gameOver;
|
||||||
int currentSeeker;
|
int currentSeeker;
|
||||||
int currentPlayers = 0;
|
int currentPlayers = 0;
|
||||||
|
|
||||||
Handle suspenseTimer, thirdPersonTimer;
|
Handle suspenseTimer, thirdPersonTimer, peekCamStopTimer, hiderCheckTimer;
|
||||||
|
|
||||||
|
|
||||||
int g_BeamSprite;
|
int g_BeamSprite;
|
||||||
int g_HaloSprite;
|
int g_HaloSprite;
|
||||||
|
@ -76,6 +80,7 @@ bool ignoreSeekerBalance;
|
||||||
ConVar cvar_peekCam;
|
ConVar cvar_peekCam;
|
||||||
ConVar cvar_seekerBalance;
|
ConVar cvar_seekerBalance;
|
||||||
ConVar cvar_abm_autohard;
|
ConVar cvar_abm_autohard;
|
||||||
|
ConVar cvar_seekerHelpers;
|
||||||
|
|
||||||
BaseGame Game;
|
BaseGame Game;
|
||||||
#include <gamemodes/base>
|
#include <gamemodes/base>
|
||||||
|
@ -105,6 +110,7 @@ public void OnPluginStart() {
|
||||||
|
|
||||||
cvar_peekCam = CreateConVar("hs_peekcam", "3", "Controls the peek camera on events. Set bits\n0 = OFF, 1 = On Game End, 2 = Any death", FCVAR_NONE, true, 0.0, true, 3.0);
|
cvar_peekCam = CreateConVar("hs_peekcam", "3", "Controls the peek camera on events. Set bits\n0 = OFF, 1 = On Game End, 2 = Any death", FCVAR_NONE, true, 0.0, true, 3.0);
|
||||||
cvar_seekerBalance = CreateConVar("hs_seekerbalance", "1", "Enable or disable ensuring every player has played as seeker", FCVAR_NONE, true, 0.0, true, 1.0);
|
cvar_seekerBalance = CreateConVar("hs_seekerbalance", "1", "Enable or disable ensuring every player has played as seeker", FCVAR_NONE, true, 0.0, true, 1.0);
|
||||||
|
cvar_seekerHelpers = CreateConVar("hs_seekerhelper", "1", "Dev. 0 = off, 1 = Glow", FCVAR_NONE, true, 0.0);
|
||||||
|
|
||||||
ConVar hGamemode = FindConVar("mp_gamemode");
|
ConVar hGamemode = FindConVar("mp_gamemode");
|
||||||
hGamemode.AddChangeHook(Event_GamemodeChange);
|
hGamemode.AddChangeHook(Event_GamemodeChange);
|
||||||
|
@ -178,8 +184,13 @@ public void OnMapStart() {
|
||||||
PrecacheSound(SOUND_SUSPENSE_1);
|
PrecacheSound(SOUND_SUSPENSE_1);
|
||||||
PrecacheSound(SOUND_SUSPENSE_1_FAST);
|
PrecacheSound(SOUND_SUSPENSE_1_FAST);
|
||||||
PrecacheSound(SOUND_SHAKE);
|
PrecacheSound(SOUND_SHAKE);
|
||||||
|
PrecacheSound("custom/xen_teleport.mp3");
|
||||||
AddFileToDownloadsTable("sound/custom/suspense1.mp3");
|
AddFileToDownloadsTable("sound/custom/suspense1.mp3");
|
||||||
AddFileToDownloadsTable("sound/custom/suspense1fast.mp3");
|
AddFileToDownloadsTable("sound/custom/suspense1fast.mp3");
|
||||||
|
AddFileToDownloadsTable("sound/custom/xen_teleport.mp3");
|
||||||
|
|
||||||
|
PrecacheParticle(PARTICLE_ELMOS);
|
||||||
|
PrecacheParticle(PARTICLE_TES1);
|
||||||
|
|
||||||
g_BeamSprite = PrecacheModel("sprites/laser.vmt");
|
g_BeamSprite = PrecacheModel("sprites/laser.vmt");
|
||||||
g_HaloSprite = PrecacheModel("sprites/halo01.vmt");
|
g_HaloSprite = PrecacheModel("sprites/halo01.vmt");
|
||||||
|
@ -244,9 +255,12 @@ public void Event_GamemodeChange(ConVar cvar, const char[] oldValue, const char[
|
||||||
if(suspenseTimer != null)
|
if(suspenseTimer != null)
|
||||||
delete suspenseTimer;
|
delete suspenseTimer;
|
||||||
suspenseTimer = CreateTimer(20.0, Timer_Music, _, TIMER_REPEAT);
|
suspenseTimer = CreateTimer(20.0, Timer_Music, _, TIMER_REPEAT);
|
||||||
|
if(hiderCheckTimer != null)
|
||||||
|
delete hiderCheckTimer;
|
||||||
|
hiderCheckTimer = CreateTimer(30.0, Timer_CheckHiders, _, TIMER_REPEAT);
|
||||||
if(thirdPersonTimer != null)
|
if(thirdPersonTimer != null)
|
||||||
delete thirdPersonTimer;
|
delete thirdPersonTimer;
|
||||||
thirdPersonTimer = CreateTimer(1.0, Timer_CheckPlayers, _, TIMER_REPEAT);
|
thirdPersonTimer = CreateTimer(2.0, Timer_CheckPlayers, _, TIMER_REPEAT);
|
||||||
if(!lateLoaded) {
|
if(!lateLoaded) {
|
||||||
for(int i = 1; i <= MaxClients; i++) {
|
for(int i = 1; i <= MaxClients; i++) {
|
||||||
if(IsClientConnected(i) && IsClientInGame(i)) {
|
if(IsClientConnected(i) && IsClientInGame(i)) {
|
||||||
|
@ -265,6 +279,7 @@ public void Event_GamemodeChange(ConVar cvar, const char[] oldValue, const char[
|
||||||
Cleanup();
|
Cleanup();
|
||||||
delete suspenseTimer;
|
delete suspenseTimer;
|
||||||
delete thirdPersonTimer;
|
delete thirdPersonTimer;
|
||||||
|
delete hiderCheckTimer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,11 +290,25 @@ public Action Timer_StopPeekCam(Handle h) {
|
||||||
PeekCam.SetViewing(i, false);
|
PeekCam.SetViewing(i, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
RequestFrame(Frame_StopPeekCam);
|
||||||
|
return Plugin_Stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frame_StopPeekCam() {
|
||||||
PeekCam.Destroy();
|
PeekCam.Destroy();
|
||||||
return Plugin_Handled;
|
peekCamStopTimer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnEntityCreated(int entity, const char[] classname) {
|
||||||
|
if(isEnabled) {
|
||||||
|
if(StrEqual(classname, "infected"))
|
||||||
|
AcceptEntityInput(entity, "Kill");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast) {
|
public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast) {
|
||||||
|
if(gameOver) return;
|
||||||
|
|
||||||
int client = GetClientOfUserId(event.GetInt("userid"));
|
int client = GetClientOfUserId(event.GetInt("userid"));
|
||||||
int attacker = GetClientOfUserId(event.GetInt("attacker"));
|
int attacker = GetClientOfUserId(event.GetInt("attacker"));
|
||||||
|
|
||||||
|
@ -287,22 +316,23 @@ public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast
|
||||||
PeekCam.Target = attacker > 0 ? attacker : client;
|
PeekCam.Target = attacker > 0 ? attacker : client;
|
||||||
PeekCam.Perspective = Cam_FirstPerson;
|
PeekCam.Perspective = Cam_FirstPerson;
|
||||||
|
|
||||||
int alive = 0;
|
|
||||||
float pos[3], checkPos[3];
|
float pos[3], checkPos[3];
|
||||||
|
// If player died on their own, set attacker to themselves for viewing purposes
|
||||||
if(attacker <= 0) attacker = client;
|
if(attacker <= 0) attacker = client;
|
||||||
GetClientAbsOrigin(attacker, pos);
|
GetClientAbsOrigin(attacker, pos);
|
||||||
PeekCam.SetViewing(attacker, true);
|
PeekCam.SetViewing(attacker, true);
|
||||||
|
|
||||||
|
int alive = 0;
|
||||||
for(int i = 1; i <= MaxClients; i++) {
|
for(int i = 1; i <= MaxClients; i++) {
|
||||||
if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i)) {
|
if(IsClientConnected(i) && IsClientInGame(i)) {
|
||||||
if(attacker > 0 && attacker != client) {
|
// If death was by a seeker:
|
||||||
if(cvar_peekCam.IntValue & 2) {
|
if(attacker == currentSeeker && cvar_peekCam.IntValue & 2) {
|
||||||
GetClientAbsOrigin(i, checkPos);
|
GetClientAbsOrigin(i, checkPos);
|
||||||
if(GetVectorDistance(checkPos, pos) > DEATH_CAM_MIN_DIST) {
|
if(GetVectorDistance(checkPos, pos) > DEATH_CAM_MIN_DIST) {
|
||||||
PeekCam.SetViewing(i, true);
|
PeekCam.SetViewing(i, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
alive++;
|
if(IsPlayerAlive(i) && GetClientTeam(i) == 2) alive++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -321,17 +351,20 @@ public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast
|
||||||
} else {
|
} else {
|
||||||
CPrintToChatAll("{green}The seeker %N won!", currentSeeker);
|
CPrintToChatAll("{green}The seeker %N won!", currentSeeker);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cvar_peekCam.IntValue & 1) {
|
if(cvar_peekCam.IntValue & 1) {
|
||||||
PeekCam.Target = client;
|
PeekCam.Target = client;
|
||||||
PeekCam.Perspective = Cam_ThirdPerson;
|
PeekCam.Perspective = Cam_ThirdPerson;
|
||||||
}
|
}
|
||||||
|
|
||||||
gameOver = true;
|
gameOver = true;
|
||||||
return;
|
return;
|
||||||
} else if(alive > 2 && client != currentSeeker) {
|
} else if(alive > 2 && client != currentSeeker) {
|
||||||
CPrintToChatAll("{green}%d hiders remain", alive - 1);
|
CPrintToChatAll("{green}%d hiders remain", alive - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CreateTimer(2.0, Timer_StopPeekCam);
|
if(peekCamStopTimer != null && IsValidHandle(peekCamStopTimer)) delete peekCamStopTimer;
|
||||||
|
peekCamStopTimer = CreateTimer(2.0, Timer_StopPeekCam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,6 +380,7 @@ public void OnClientPutInServer(int client) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void Event_ItemPickup(Event event, const char[] name, bool dontBroadcast) {
|
public void Event_ItemPickup(Event event, const char[] name, bool dontBroadcast) {
|
||||||
int client = GetClientOfUserId(event.GetInt("userid"));
|
int client = GetClientOfUserId(event.GetInt("userid"));
|
||||||
if(client && client > 0 && currentSeeker != client) {
|
if(client && client > 0 && currentSeeker != client) {
|
||||||
|
@ -417,10 +451,15 @@ public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
|
||||||
}
|
}
|
||||||
EntFire("relay_intro_start", "Kill");
|
EntFire("relay_intro_start", "Kill");
|
||||||
EntFire("outro", "Kill");
|
EntFire("outro", "Kill");
|
||||||
SetupEntities();
|
CreateTimer(1.0, Timer_SetupEntities);
|
||||||
CreateTimer(15.0, Timer_RoundStart);
|
CreateTimer(15.0, Timer_RoundStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Action Timer_SetupEntities(Handle h) {
|
||||||
|
SetupEntities();
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) {
|
public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) {
|
||||||
if(nextRoundMap[0] != '\0') {
|
if(nextRoundMap[0] != '\0') {
|
||||||
ForceChangeLevel(nextRoundMap, "SetMapSelect");
|
ForceChangeLevel(nextRoundMap, "SetMapSelect");
|
||||||
|
@ -447,9 +486,13 @@ public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) {
|
||||||
|
|
||||||
public Action Timer_CheckPlayers(Handle h) {
|
public Action Timer_CheckPlayers(Handle h) {
|
||||||
for(int i = 1; i <= MaxClients; i++) {
|
for(int i = 1; i <= MaxClients; i++) {
|
||||||
if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i) && i != currentSeeker)
|
if(!IsClientConnected(i) || !IsClientInGame(i)) continue;
|
||||||
|
if(GetClientTeam(i) == 2 && IsPlayerAlive(i) && i != currentSeeker)
|
||||||
QueryClientConVar(i, "cam_collision", QueryClientConVarCallback);
|
QueryClientConVar(i, "cam_collision", QueryClientConVarCallback);
|
||||||
|
SetEntProp(i, Prop_Send, "m_audio.soundscapeIndex", -1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
ServerCommand("soundscape_flush");
|
||||||
return Plugin_Continue;
|
return Plugin_Continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,6 +516,36 @@ public void QueryClientConVarCallback(QueryCookie cookie, int client, ConVarQuer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PLAYER_GLOW_COLOR[3] = { 0, 255, 0 };
|
||||||
|
public Action Timer_CheckHiders(Handle h) {
|
||||||
|
static float seekerLoc[3];
|
||||||
|
static float playerLoc[3];
|
||||||
|
if(cvar_seekerHelpers.IntValue != 0) return Plugin_Continue;
|
||||||
|
if(currentSeeker > 0) {
|
||||||
|
GetClientAbsOrigin(currentSeeker, seekerLoc);
|
||||||
|
}
|
||||||
|
for(int i = 1; i <= MaxClients; i++) {
|
||||||
|
if(i != currentSeeker && IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2) {
|
||||||
|
GetClientAbsOrigin(i, playerLoc);
|
||||||
|
float dist = GetVectorDistance(seekerLoc, playerLoc, true);
|
||||||
|
if(dist > 290000.0) {
|
||||||
|
L4D2_SetPlayerSurvivorGlowState(i, true);
|
||||||
|
L4D2_SetEntityGlow(i, L4D2Glow_Constant, 0, 10, PLAYER_GLOW_COLOR, true);
|
||||||
|
CreateTimer(2.0, Timer_RemoveGlow, GetClientUserId(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Plugin_Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action Timer_RemoveGlow(Handle h, int userid) {
|
||||||
|
int client = GetClientOfUserId(userid);
|
||||||
|
if(client) {
|
||||||
|
L4D2_SetPlayerSurvivorGlowState(client, false);
|
||||||
|
L4D2_RemoveEntityGlow(client);
|
||||||
|
}
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
GameState prevState;
|
GameState prevState;
|
||||||
public Action Timer_Music(Handle h) {
|
public Action Timer_Music(Handle h) {
|
||||||
static float seekerLoc[3];
|
static float seekerLoc[3];
|
||||||
|
@ -504,7 +577,7 @@ public Action Timer_Music(Handle h) {
|
||||||
EmitSoundToClient(i, SOUND_SUSPENSE_1_FAST, i, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_CHANGEPITCH, 1.0, 100, currentSeeker, seekerLoc, playerLoc, true);
|
EmitSoundToClient(i, SOUND_SUSPENSE_1_FAST, i, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_CHANGEPITCH, 1.0, 100, currentSeeker, seekerLoc, playerLoc, true);
|
||||||
isNearbyPlaying[i] = true;
|
isNearbyPlaying[i] = true;
|
||||||
} else if(dist <= 1000000.0) {
|
} else if(dist <= 1000000.0) {
|
||||||
EmitSoundToClient(i, SOUND_SUSPENSE_1, i, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_CHANGEPITCH, 0.2, 90, currentSeeker, seekerLoc, playerLoc, true);
|
EmitSoundToClient(i, SOUND_SUSPENSE_1, i, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_CHANGEPITCH, 0.4, 90, currentSeeker, seekerLoc, playerLoc, true);
|
||||||
isNearbyPlaying[i] = true;
|
isNearbyPlaying[i] = true;
|
||||||
StopSound(i, SNDCHAN_AUTO, SOUND_SUSPENSE_1_FAST);
|
StopSound(i, SNDCHAN_AUTO, SOUND_SUSPENSE_1_FAST);
|
||||||
} else if(isNearbyPlaying[i]) {
|
} else if(isNearbyPlaying[i]) {
|
||||||
|
@ -545,10 +618,21 @@ public Action Timer_RoundStart(Handle h) {
|
||||||
SetEntProp(entity, Prop_Send, "m_iTeamNum", 0);
|
SetEntProp(entity, Prop_Send, "m_iTeamNum", 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
entity = INVALID_ENT_REFERENCE;
|
||||||
while ((entity = FindEntityByClassname(entity, "env_soundscape")) != INVALID_ENT_REFERENCE) {
|
while ((entity = FindEntityByClassname(entity, "env_soundscape")) != INVALID_ENT_REFERENCE) {
|
||||||
AcceptEntityInput(entity, "Disable");
|
AcceptEntityInput(entity, "Disable");
|
||||||
AcceptEntityInput(entity, "Kill");
|
AcceptEntityInput(entity, "Kill");
|
||||||
}
|
}
|
||||||
|
entity = INVALID_ENT_REFERENCE;
|
||||||
|
while ((entity = FindEntityByClassname(entity, "env_soundscape_triggerable")) != INVALID_ENT_REFERENCE) {
|
||||||
|
AcceptEntityInput(entity, "Disable");
|
||||||
|
AcceptEntityInput(entity, "Kill");
|
||||||
|
}
|
||||||
|
entity = INVALID_ENT_REFERENCE;
|
||||||
|
while ((entity = FindEntityByClassname(entity, "env_soundscape_proxy")) != INVALID_ENT_REFERENCE) {
|
||||||
|
AcceptEntityInput(entity, "Disable");
|
||||||
|
AcceptEntityInput(entity, "Kill");
|
||||||
|
}
|
||||||
if(mapConfig.mapTime > 0) {
|
if(mapConfig.mapTime > 0) {
|
||||||
SetMapTime(mapConfig.mapTime);
|
SetMapTime(mapConfig.mapTime);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue