mirror of
https://github.com/Jackzmc/sourcemod-plugins.git
synced 2025-05-07 00:43:20 +00:00
Update bin/includes
This commit is contained in:
parent
8c2ca6453c
commit
d23503099b
19 changed files with 1115 additions and 431 deletions
|
@ -363,7 +363,8 @@ public Action Timer_UpdateGrab(Handle timer, DataPack pack) {
|
|||
|
||||
// *** Runs whether in rotation mode or not
|
||||
float entNewPos[3];
|
||||
GetEntNewPosition(client, entNewPos);
|
||||
int buttons = GetClientButtons(client);
|
||||
GetEntNewPosition(client, entNewPos, buttons & IN_SPEED == 0);
|
||||
entNewPos[0] += g_fGrabOffset[client][0];
|
||||
entNewPos[1] += g_fGrabOffset[client][1];
|
||||
entNewPos[2] += g_fGrabOffset[client][2];
|
||||
|
@ -426,14 +427,14 @@ int GetLookingEntity(int client, TraceEntityFilter filter) {
|
|||
static float pos[3], ang[3];
|
||||
GetClientEyePosition(client, pos);
|
||||
GetClientEyeAngles(client, ang);
|
||||
TR_TraceRayFilter(pos, ang, MASK_OPAQUE, RayType_Infinite, filter, client);
|
||||
TR_TraceRayFilter(pos, ang, MASK_ALL, RayType_Infinite, filter, client);
|
||||
if(TR_DidHit()) {
|
||||
return TR_GetEntityIndex();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
stock bool GetEntNewPosition(int client, float endPos[3])
|
||||
stock bool GetEntNewPosition(int client, float endPos[3], bool doCollision = true)
|
||||
{
|
||||
if (client > 0 && client <= MaxClients && IsClientInGame(client)) {
|
||||
float clientEye[3], clientAngle[3], direction[3];
|
||||
|
@ -444,9 +445,11 @@ stock bool GetEntNewPosition(int client, float endPos[3])
|
|||
ScaleVector(direction, g_fGrabDistance[client]);
|
||||
AddVectors(clientEye, direction, endPos);
|
||||
|
||||
TR_TraceRayFilter(clientEye, endPos, MASK_OPAQUE, RayType_EndPoint, TraceRayFilterEnt, client);
|
||||
if (TR_DidHit(INVALID_HANDLE)) {
|
||||
TR_GetEndPosition(endPos);
|
||||
if(doCollision) {
|
||||
TR_TraceRayFilter(clientEye, endPos, MASK_OPAQUE, RayType_EndPoint, TraceRayFilterEnt, client);
|
||||
if (TR_DidHit(INVALID_HANDLE)) {
|
||||
TR_GetEndPosition(endPos);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -52,9 +52,9 @@ void SetupsTrollCombos() {
|
|||
#if defined _behavior_included
|
||||
combo.AddTroll("Witch Magnet");
|
||||
#endif
|
||||
combo.AddTroll("No Button Touchie", TrollMod_Constant, 17);
|
||||
combo.AddTroll("Slow Speed", TrollMod_Constant, 2);
|
||||
combo.AddTroll("Instant Commons", TrollMod_Instant, 1);
|
||||
combo.AddTroll("No Button Touchie", 17, TrollMod_Constant);
|
||||
combo.AddTroll("Slow Speed", 2, TrollMod_Constant);
|
||||
combo.AddTroll("Instant Commons", 1, TrollMod_Instant);
|
||||
// combo.AddTroll("Swarm", TrollMod_Instant);
|
||||
combo.AddTroll("Vomit Player");
|
||||
combo.AddTroll("Dull Melee", .flags=2);
|
||||
|
|
|
@ -218,6 +218,35 @@ public Action Event_WeaponReload(int weapon) {
|
|||
}
|
||||
return Plugin_Continue;
|
||||
}
|
||||
public Action L4D2_CGasCan_EventKilled(int gascan, int &inflictor, int &attacker) {
|
||||
static int noButtonPressIndex;
|
||||
if(!noButtonPressIndex) noButtonPressIndex = GetTrollID("No Button Touchie");
|
||||
if(attacker > 0 && attacker <= MaxClients) {
|
||||
if(Trolls[noButtonPressIndex].IsActive(attacker)) {
|
||||
if(Trolls[noButtonPressIndex].activeFlagClients[attacker] & 1) {
|
||||
return Plugin_Handled;
|
||||
}
|
||||
if(Trolls[noButtonPressIndex].activeFlagClients[attacker] & 2) {
|
||||
L4D_CTerrorPlayer_OnVomitedUpon(attacker, attacker);
|
||||
}
|
||||
if(Trolls[noButtonPressIndex].activeFlagClients[attacker] & 4) {
|
||||
L4D_SetPlayerIncapacitatedState(attacker, true);
|
||||
}
|
||||
if(Trolls[noButtonPressIndex].activeFlagClients[attacker] & 8) {
|
||||
ServerCommand("sm_slay #%d", GetClientUserId(attacker));
|
||||
}
|
||||
if(Trolls[noButtonPressIndex].activeFlagClients[attacker] & 16) {
|
||||
float speed = GetEntPropFloat(attacker, Prop_Send, "m_flLaggedMovementValue");
|
||||
if(speed > 0.9) speed = 0.80;
|
||||
speed -= 5.0;
|
||||
SetEntPropFloat(attacker, Prop_Send, "m_flLaggedMovementValue", speed);
|
||||
PrintToConsoleAdmins("[FTT] NoButtonTouchie: %N speed is now %f", speed);
|
||||
}
|
||||
}
|
||||
lastButtonUser = attacker;
|
||||
}
|
||||
return Plugin_Continue;
|
||||
}
|
||||
public Action Event_ButtonPress(const char[] output, int entity, int client, float delay) {
|
||||
static int noButtonPressIndex;
|
||||
if(!noButtonPressIndex) noButtonPressIndex = GetTrollID("No Button Touchie");
|
||||
|
|
|
@ -740,6 +740,23 @@ stock void HSVToRGBInt(const float vec[3], int out[3]) {
|
|||
out[2] = RoundToFloor(view_as<float>(out[2]));
|
||||
}
|
||||
|
||||
stock bool GetCursorLocation(int client, float outPos[3]) {
|
||||
float angle[3];
|
||||
GetClientEyePosition(client, outPos);
|
||||
GetClientEyeAngles(client, angle);
|
||||
TR_TraceRayFilter(outPos, angle, MASK_SOLID, RayType_Infinite, Filter_IgnorePlayer, client);
|
||||
if(TR_DidHit()) {
|
||||
TR_GetEndPosition(outPos);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool Filter_IgnorePlayer(int entity, int mask, int data) {
|
||||
return entity > 0 && entity != data;
|
||||
}
|
||||
|
||||
// Gets a position from where the cursor is upto distance away (basically <= distance, going against walls)
|
||||
stock bool GetCursorLimited(int client, float distance, float endPos[3], TraceEntityFilter filter)
|
||||
{
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
* Copyright (C) 2017 "Accelerator74"
|
||||
*
|
||||
* Left 4 DHooks Direct SourceMod plugin
|
||||
* Copyright (C) 2022 "SilverShot" / "Silvers"
|
||||
* Copyright (C) 2023 "SilverShot" / "Silvers"
|
||||
*
|
||||
* =============================================================================
|
||||
*
|
||||
|
@ -58,13 +58,13 @@
|
|||
|
||||
|
||||
|
||||
// Natives: 252 (including 3 for L4D1 only)
|
||||
// L4D1 = 31 [left4downtown] + 47 [l4d_direct] + 16 [l4d2addresses] + 56 [silvers - mine!] + 4 [anim] = 154
|
||||
// L4D2 = 61 [left4downtown] + 59 [l4d_direct] + 31 [l4d2addresses] + 94 [silvers - mine!] + 4 [anim] = 249
|
||||
// Natives: 253 (including 3 for L4D1 only)
|
||||
// L4D1 = 31 [left4downtown] + 47 [l4d_direct] + 16 [l4d2addresses] + 58 [silvers - mine!] + 4 [anim] = 156
|
||||
// L4D2 = 61 [left4downtown] + 59 [l4d_direct] + 31 [l4d2addresses] + 95 [silvers - mine!] + 4 [anim] = 250
|
||||
|
||||
// Forwards: 183 (including 2 for L4D1 only)
|
||||
// L4D1 = 129
|
||||
// L4D2 = 181
|
||||
// Forwards: 188 (including 2 for L4D1 only)
|
||||
// L4D1 = 132
|
||||
// L4D2 = 186
|
||||
|
||||
// Stocks: 168 (L4D1 = 111, L4D2 = 164)
|
||||
// left4dhooks_silver 45 stocks (L4D1 = 38, L4D2 = 52)
|
||||
|
@ -1058,6 +1058,40 @@ forward void L4D_OnEnterGhostState(int client);
|
|||
*/
|
||||
forward void L4D_OnEnterGhostState_PostHandled(int client);
|
||||
|
||||
/**
|
||||
* @brief Called whenever CTerrorPlayer::TakeOverBot(CTerrorPlayer*) is invoked
|
||||
* @remarks This happens when player is looking to take over a bot
|
||||
*
|
||||
* @param client the client that is looking to take over a bot
|
||||
*
|
||||
* @return Plugin_Handled to block, Plugin_Continue otherwise
|
||||
*/
|
||||
forward Action L4D_OnTakeOverBot(int client);
|
||||
|
||||
/**
|
||||
* @brief Called whenever CTerrorPlayer::TakeOverBot(CTerrorPlayer*) is invoked
|
||||
* @remarks This happens when player is looking to take over a bot
|
||||
* @remarks This forward will not trigger if the relative pre-hook forward has been blocked with Plugin_Handled
|
||||
*
|
||||
* @param client the client that is looking to take over a bot
|
||||
* @param success true if the takeover was successful, false otherwise
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
forward void L4D_OnTakeOverBot_Post(int client, bool success);
|
||||
|
||||
/**
|
||||
* @brief Called whenever CTerrorPlayer::TakeOverBot(CTerrorPlayer*) is invoked
|
||||
* @remarks This happens when player is looking to take over a bot
|
||||
* @remarks This forward will ONLY trigger if the relative pre-hook forward has been blocked with Plugin_Handled
|
||||
*
|
||||
* @param client the client that is looking to take over a bot
|
||||
* @param success true if the takeover was successful, false otherwise
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
forward void L4D_OnTakeOverBot_PostHandled(int client, bool success);
|
||||
|
||||
/**
|
||||
* @brief Called whenever CTerrorPlayer::MaterializeFromGhost is invoked
|
||||
* @remarks Called when a Special Infected spawns out of ghost mode.
|
||||
|
@ -2471,7 +2505,7 @@ forward void L4D_OnGrabWithTongue_PostHandled(int victim, int attacker);
|
|||
*
|
||||
* @return Plugin_Handled to block, Plugin_Continue otherwise
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward Action L4D2_OnJockeyRide(int victim, int attacker);
|
||||
|
||||
/**
|
||||
|
@ -2484,7 +2518,7 @@ forward Action L4D2_OnJockeyRide(int victim, int attacker);
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_OnJockeyRide_Post(int victim, int attacker);
|
||||
|
||||
/**
|
||||
|
@ -2497,7 +2531,7 @@ forward void L4D2_OnJockeyRide_Post(int victim, int attacker);
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_OnJockeyRide_PostHandled(int victim, int attacker);
|
||||
|
||||
/**
|
||||
|
@ -2512,7 +2546,7 @@ forward void L4D2_OnJockeyRide_PostHandled(int victim, int attacker);
|
|||
*
|
||||
* @return Plugin_Handled to block, Plugin_Changed to use overwritten values from plugin, Plugin_Continue otherwise
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward Action L4D2_OnSlammedSurvivor(int victim, int attacker, bool &bWallSlam, bool &bDeadlyCharge);
|
||||
|
||||
/**
|
||||
|
@ -2528,7 +2562,7 @@ forward Action L4D2_OnSlammedSurvivor(int victim, int attacker, bool &bWallSlam,
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_OnSlammedSurvivor_Post(int victim, int attacker, bool bWallSlam, bool bDeadlyCharge);
|
||||
|
||||
/**
|
||||
|
@ -2544,7 +2578,7 @@ forward void L4D2_OnSlammedSurvivor_Post(int victim, int attacker, bool bWallSla
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_OnSlammedSurvivor_PostHandled(int victim, int attacker, bool bWallSlam, bool bDeadlyCharge);
|
||||
|
||||
/**
|
||||
|
@ -2556,7 +2590,7 @@ forward void L4D2_OnSlammedSurvivor_PostHandled(int victim, int attacker, bool b
|
|||
*
|
||||
* @return Plugin_Handled to block, Plugin_Continue otherwise
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward Action L4D2_OnStartCarryingVictim(int victim, int attacker);
|
||||
|
||||
/**
|
||||
|
@ -2569,7 +2603,7 @@ forward Action L4D2_OnStartCarryingVictim(int victim, int attacker);
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_OnStartCarryingVictim_Post(int victim, int attacker);
|
||||
|
||||
/**
|
||||
|
@ -2582,7 +2616,7 @@ forward void L4D2_OnStartCarryingVictim_Post(int victim, int attacker);
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_OnStartCarryingVictim_PostHandled(int victim, int attacker);
|
||||
|
||||
/**
|
||||
|
@ -2862,7 +2896,7 @@ forward void L4D2_VomitJar_Detonate_PostHandled(int entity, int client);
|
|||
*
|
||||
* @return Plugin_Handled to block allowing damage to an entity, Plugin_Continue otherwise
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward Action L4D2_CInsectSwarm_CanHarm(int acid, int spitter, int entity);
|
||||
|
||||
/**
|
||||
|
@ -2876,7 +2910,7 @@ forward Action L4D2_CInsectSwarm_CanHarm(int acid, int spitter, int entity);
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_CInsectSwarm_CanHarm_Post(int acid, int spitter, int entity);
|
||||
|
||||
/**
|
||||
|
@ -2890,7 +2924,7 @@ forward void L4D2_CInsectSwarm_CanHarm_Post(int acid, int spitter, int entity);
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_CInsectSwarm_CanHarm_PostHandled(int acid, int spitter, int entity);
|
||||
|
||||
/**
|
||||
|
@ -2905,6 +2939,19 @@ forward void L4D2_CInsectSwarm_CanHarm_PostHandled(int acid, int spitter, int en
|
|||
*/
|
||||
forward void L4D_CBreakableProp_Break(int prop, int entity);
|
||||
|
||||
/**
|
||||
* @brief Called whenever CGasCan::Event_Killed() is invoked
|
||||
* @remarks Called when a gascan is broken
|
||||
*
|
||||
* @param gascan the gascan entity index
|
||||
* @param inflictor the inflictor entity index
|
||||
* @param attacker the attacker entity index
|
||||
*
|
||||
* @return Plugin_Handled to block detonating, Plugin_Changed to change any values, Plugin_Continue otherwise
|
||||
*/
|
||||
// L4D2 only.
|
||||
forward Action L4D2_CGasCan_EventKilled(int gascan, int &inflictor, int &attacker);
|
||||
|
||||
/**
|
||||
* @brief Called whenever CGasCan::Event_Killed() is invoked
|
||||
* @remarks Called when a gascan is broken
|
||||
|
@ -2915,8 +2962,21 @@ forward void L4D_CBreakableProp_Break(int prop, int entity);
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
forward void L4D2_CGasCan_EventKilled(int gascan, int inflictor, int attacker);
|
||||
// L4D2 only.
|
||||
forward void L4D2_CGasCan_EventKilled_Post(int gascan, int inflictor, int attacker);
|
||||
|
||||
/**
|
||||
* @brief Called whenever CGasCan::Event_Killed() is invoked
|
||||
* @remarks Called when a gascan is broken
|
||||
*
|
||||
* @param gascan the gascan entity index
|
||||
* @param inflictor the inflictor entity index
|
||||
* @param attacker the attacker entity index
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
forward void L4D2_CGasCan_EventKilled_PostHandled(int gascan, int inflictor, int attacker);
|
||||
|
||||
/**
|
||||
* @brief Called whenever CGasCan::ShouldStartAction() is invoked
|
||||
|
@ -2928,7 +2988,7 @@ forward void L4D2_CGasCan_EventKilled(int gascan, int inflictor, int attacker);
|
|||
*
|
||||
* @return Plugin_Handled to block adding to Scavenge score (see "Scavenge Score Fix" plugin for more details), Plugin_Continue otherwise
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward Action L4D2_CGasCan_ShouldStartAction(int client, int gascan, int nozzle);
|
||||
|
||||
/**
|
||||
|
@ -2942,7 +3002,7 @@ forward Action L4D2_CGasCan_ShouldStartAction(int client, int gascan, int nozzle
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_CGasCan_ShouldStartAction_Post(int client, int gascan, int nozzle);
|
||||
|
||||
/**
|
||||
|
@ -2956,7 +3016,7 @@ forward void L4D2_CGasCan_ShouldStartAction_Post(int client, int gascan, int noz
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_CGasCan_ShouldStartAction_PostHandled(int client, int gascan, int nozzle);
|
||||
|
||||
/**
|
||||
|
@ -2969,7 +3029,7 @@ forward void L4D2_CGasCan_ShouldStartAction_PostHandled(int client, int gascan,
|
|||
*
|
||||
* @return Plugin_Handled to block adding to Scavenge score (see "Scavenge Score Fix" plugin for more details), Plugin_Continue otherwise
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward Action L4D2_CGasCan_ActionComplete(int client, int gascan, int nozzle);
|
||||
|
||||
/**
|
||||
|
@ -2983,7 +3043,7 @@ forward Action L4D2_CGasCan_ActionComplete(int client, int gascan, int nozzle);
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_CGasCan_ActionComplete_Post(int client, int gascan, int nozzle);
|
||||
|
||||
/**
|
||||
|
@ -2997,7 +3057,7 @@ forward void L4D2_CGasCan_ActionComplete_Post(int client, int gascan, int nozzle
|
|||
*
|
||||
* @noreturn
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward void L4D2_CGasCan_ActionComplete_PostHandled(int client, int gascan, int nozzle);
|
||||
|
||||
/**
|
||||
|
@ -3028,7 +3088,7 @@ forward void L4D_OnServerHibernationUpdate(bool hibernating);
|
|||
*
|
||||
* @return Plugin_Handled to let the client through with addons, Plugin_Continue otherwise.
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
forward Action L4D2_OnClientDisableAddons(const char[] SteamID);
|
||||
|
||||
/**
|
||||
|
@ -3358,7 +3418,7 @@ native any L4D_GetNearestNavArea(const float vecPos[3], float maxDist = 300.0, b
|
|||
*
|
||||
* @param client The client to check
|
||||
*
|
||||
* @return The nav area adress or 0 on fail
|
||||
* @return The nav area address or 0 on fail
|
||||
*/
|
||||
native any L4D_GetLastKnownArea(int client);
|
||||
|
||||
|
@ -3412,6 +3472,15 @@ native void L4D_FindRandomSpot(int NavArea, float vecPos[3]);
|
|||
*/
|
||||
native bool L4D2_IsVisibleToPlayer(int client, int team, int team_target, int NavArea, float vecPos[3]);
|
||||
|
||||
/**
|
||||
* @brief Teleports a player to a valid position if they are stuck.
|
||||
*
|
||||
* @param client Client to perform the action
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
native void L4D_WarpToValidPositionIfStuck(int client);
|
||||
|
||||
/**
|
||||
* @brief Returns true when any survivor has left the starting area and true in Versus when the saferoom door automatically opens.
|
||||
*
|
||||
|
@ -3516,11 +3585,10 @@ native bool L4D2_IsReachable(int client, const float vecPos[3]);
|
|||
*
|
||||
* @param startArea NavArea address
|
||||
* @param endArea NavArea address
|
||||
* @param ignoreNavBlockers Bool to ignore blocked areas while checking (does not seem to work as expected)
|
||||
* @param ignoreNavBlockers Bool to ignore blocked areas while checking (does not seem to work as expected) (ignored in L4D1)
|
||||
*
|
||||
* @return Distance between the areas, 0.0 if the same area or -1.0 on failure.
|
||||
*/
|
||||
// L4D2 only.
|
||||
native float L4D2_NavAreaTravelDistance(float startPos[3], float endPos[3], bool ignoreNavBlockers);
|
||||
|
||||
/**
|
||||
|
@ -3738,7 +3806,7 @@ native bool L4D_GoAwayFromKeyboard(int client);
|
|||
*
|
||||
* @return True or false
|
||||
*/
|
||||
// L4D2 only.
|
||||
// L4D2 only.
|
||||
native bool L4D2_AreWanderersAllowed();
|
||||
|
||||
/**
|
||||
|
@ -4330,6 +4398,7 @@ native int L4D_GetMaxChapters();
|
|||
|
||||
/**
|
||||
* @brief Returns all TheNavAreas addresses
|
||||
* @remarks Can only be called 1 frame after OnMapStart at the earliest otherwise the addresses are invalid
|
||||
*
|
||||
*param aList The ArrayList to store all nav area addresses.
|
||||
*
|
||||
|
@ -4339,6 +4408,7 @@ native void L4D_GetAllNavAreas(ArrayList aList);
|
|||
|
||||
/**
|
||||
* @brief Returns a given NavArea's ID from it's address
|
||||
* @remarks Can only be called 1 frame after OnMapStart at the earliest otherwise the addresses are invalid
|
||||
*
|
||||
*param area The NavArea address
|
||||
*
|
||||
|
@ -4348,6 +4418,7 @@ native int L4D_GetNavAreaID(Address area);
|
|||
|
||||
/**
|
||||
* @brief Returns a given NavArea address from it's ID
|
||||
* @remarks Can only be called 1 frame after OnMapStart at the earliest otherwise the addresses are invalid
|
||||
*
|
||||
*param id The NavArea ID
|
||||
*
|
||||
|
@ -4357,6 +4428,7 @@ native Address L4D_GetNavAreaByID(int id);
|
|||
|
||||
/**
|
||||
* @brief Returns origin of a given NavArea
|
||||
* @remarks Can only be called 1 frame after OnMapStart at the earliest otherwise the addresses are invalid
|
||||
*
|
||||
*param area The address of the NavArea to read.
|
||||
*param vecPos The vector to store the position read.
|
||||
|
@ -4367,6 +4439,7 @@ native void L4D_GetNavAreaPos(Address area, float vecPos[3]);
|
|||
|
||||
/**
|
||||
* @brief Returns size of a given NavArea
|
||||
* @remarks Can only be called 1 frame after OnMapStart at the earliest otherwise the addresses are invalid
|
||||
*
|
||||
*param area The address of the NavArea to read.
|
||||
*param vecPos The vector to store the size read.
|
||||
|
@ -4378,6 +4451,7 @@ native void L4D_GetNavAreaSize(Address area, float vecSize[3]);
|
|||
/**
|
||||
* @brief Returns the nav area attribute flags
|
||||
* @remarks See the "NAV_BASE_*" near the top of the include file
|
||||
* @remarks Can only be called 1 frame after OnMapStart at the earliest otherwise the addresses are invalid
|
||||
*
|
||||
*param pTerrorNavArea Pointer to a NavArea
|
||||
*
|
||||
|
@ -4388,6 +4462,7 @@ native int L4D_GetNavArea_AttributeFlags(Address pTerrorNavArea);
|
|||
/**
|
||||
* @brief Sets the nav area attribute flags
|
||||
* @remarks See the "NAV_BASE_*" near the top of the include file
|
||||
* @remarks Can only be called 1 frame after OnMapStart at the earliest otherwise the addresses are invalid
|
||||
*
|
||||
*param pTerrorNavArea Pointer to a NavArea
|
||||
*param flags Attribute flags to set
|
||||
|
@ -4399,6 +4474,7 @@ native void L4D_SetNavArea_AttributeFlags(Address pTerrorNavArea, int flags);
|
|||
/**
|
||||
* @brief Returns the terror nav area attribute flags
|
||||
* @remarks See the "NAV_SPAWN_*" near the top of the include file
|
||||
* @remarks Can only be called 1 frame after OnMapStart at the earliest otherwise the addresses are invalid
|
||||
*
|
||||
*param pTerrorNavArea Pointer to a TerrorNavArea
|
||||
*
|
||||
|
@ -4409,6 +4485,7 @@ native int L4D_GetNavArea_SpawnAttributes(Address pTerrorNavArea);
|
|||
/**
|
||||
* @brief Sets the terror nav area attribute flags
|
||||
* @remarks See the "NAV_SPAWN_*" near the top of the include file
|
||||
* @remarks Can only be called 1 frame after OnMapStart at the earliest otherwise the addresses are invalid
|
||||
*
|
||||
*param pTerrorNavArea Pointer to a TerrorNavArea
|
||||
*param flags Attribute flags to set
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#tryinclude <left4dhooks_silver>
|
||||
#tryinclude <left4dhooks_stocks>
|
||||
|
||||
#define LUX_LIBRARY_VERSION "0.5.5"
|
||||
#define LUX_LIBRARY_VERSION "0.5.7"
|
||||
|
||||
#define GIMMEDATA "lux_library"
|
||||
|
||||
|
@ -395,16 +395,57 @@ stock float Terror_GetAdrenalineTime(int iClient)
|
|||
}
|
||||
|
||||
/**
|
||||
* Create a physics explosion that does not affect players and don't check for line of sight and no force fall-off.
|
||||
* Calls CTerrorPlayer::OnRevivedByDefibrillator()
|
||||
*
|
||||
* @param iRevivee Client index be revived.
|
||||
* @param iReviver Client index who revived can be same as revivee.
|
||||
* @param iDeathModel Death model index, dead survivor model (survivor_death_model).
|
||||
*
|
||||
* @return True if revive was successful false otherwise.
|
||||
* @error Invalid entity index or invalid attachment name,
|
||||
* signature for function not found, or SDKCall failed.
|
||||
**/
|
||||
stock bool Terror_ReviveDeathModel(int iRevivee, int iReviver, int iDeathModel)
|
||||
{
|
||||
static Handle hSDKCall;
|
||||
if(hSDKCall == null)
|
||||
{
|
||||
Handle hGamedata;
|
||||
GetGameData(hGamedata);
|
||||
|
||||
StartPrepSDKCall(SDKCall_Player);
|
||||
if(PrepSDKCall_SetFromConf(hGamedata, SDKConf_Signature, "CTerrorPlayer::OnRevivedByDefibrillator"))
|
||||
{
|
||||
PrepSDKCall_AddParameter(SDKType_CBasePlayer, SDKPass_Pointer);
|
||||
PrepSDKCall_AddParameter(SDKType_CBaseEntity, SDKPass_Pointer);
|
||||
hSDKCall = EndPrepSDKCall();
|
||||
if(hSDKCall == null)
|
||||
LogError("Unable to prep 'CTerrorPlayer::OnRevivedByDefibrillator'");
|
||||
}
|
||||
else
|
||||
{
|
||||
LogError("Error finding the 'CTerrorPlayer::OnRevivedByDefibrillator' signature.");
|
||||
}
|
||||
delete hGamedata;
|
||||
if(hSDKCall == null)
|
||||
return false;
|
||||
}
|
||||
SDKCall(hSDKCall, iRevivee, iReviver, iDeathModel);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a physics explosion that does not affect players.
|
||||
*
|
||||
* @param vecOrigin Origin of the explosion.
|
||||
* @param iMagnitude Magnitude of the explosion.
|
||||
* @param iMagnitude Magnitude of the explosion limit of 100, explode more than once for more power.
|
||||
* @param flRadius Radius of the explosion.
|
||||
* @param bDamage True to damage props, false otherwise.
|
||||
* @param flInnerRadius If not zero, the LOS is calculated from a point intersecting this sphere.
|
||||
*
|
||||
* @error Failed to create explosion.
|
||||
**/
|
||||
stock void PhysicsExplode(float vecOrigin[3], int iMagnitude, float flRadius, bool bDamage=false)
|
||||
stock void PhysicsExplode(float vecOrigin[3], int iMagnitude, float flRadius, bool bDamage=false, float flInnerRadius=0.0)
|
||||
{
|
||||
static int iBoom = INVALID_ENT_REFERENCE;
|
||||
|
||||
|
@ -420,11 +461,11 @@ stock void PhysicsExplode(float vecOrigin[3], int iMagnitude, float flRadius, bo
|
|||
|
||||
if(bDamage)
|
||||
{
|
||||
DispatchKeyValue(iBoom, "spawnflags", "0");
|
||||
DispatchKeyValue(iBoom, "spawnflags", "8");
|
||||
}
|
||||
else
|
||||
{
|
||||
DispatchKeyValue(iBoom, "spawnflags", "1");
|
||||
DispatchKeyValue(iBoom, "spawnflags", "9");
|
||||
}
|
||||
|
||||
char sBuf[32];
|
||||
|
@ -433,7 +474,7 @@ stock void PhysicsExplode(float vecOrigin[3], int iMagnitude, float flRadius, bo
|
|||
|
||||
IntToString(RoundFloat(flRadius), sBuf, sizeof(sBuf));
|
||||
DispatchKeyValue(iBoom, "radius", sBuf);
|
||||
DispatchKeyValueFloat(iBoom, "inner_radius", flRadius);
|
||||
DispatchKeyValueFloat(iBoom, "inner_radius", flInnerRadius);
|
||||
|
||||
TeleportEntity(iBoom, vecOrigin, NULL_VECTOR, NULL_VECTOR);
|
||||
|
||||
|
@ -523,15 +564,8 @@ stock void TE_SetupPhysicsProp(float vecModelOrigin[3],
|
|||
*
|
||||
* @return True on success, false on failure.
|
||||
**/
|
||||
stock bool TE_SetupDynamicLight(float vecOrigin[3], int RGB[3], float flRadius, float flTime, float flDecay=0.0, int exponent=0)
|
||||
stock void TE_SetupDynamicLight(float vecOrigin[3], int RGB[3], float flRadius, float flTime, float flDecay=0.0, int exponent=0)
|
||||
{
|
||||
static int iLastTick;
|
||||
int iCurrentTick = GetGameTickCount();
|
||||
|
||||
if(iLastTick == iCurrentTick)
|
||||
return false;
|
||||
iLastTick = iCurrentTick;
|
||||
|
||||
TE_Start("Dynamic Light");
|
||||
|
||||
TE_WriteVector("m_vecOrigin", vecOrigin);
|
||||
|
@ -542,8 +576,6 @@ stock bool TE_SetupDynamicLight(float vecOrigin[3], int RGB[3], float flRadius,
|
|||
TE_WriteFloat("m_fRadius", flRadius);
|
||||
TE_WriteFloat("m_fTime", flTime);
|
||||
TE_WriteFloat("m_fDecay", flDecay);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1249,4 +1281,435 @@ stock void GetAbsOrigin(int iEntity, float vecOrigin[3], bool bCenter=false)
|
|||
vecOrigin[1] += (vecMins[1] + vecMaxs[1]) * 0.5;
|
||||
vecOrigin[2] += (vecMins[2] + vecMaxs[2]) * 0.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////Sound
|
||||
|
||||
|
||||
/**
|
||||
* level boost in some games maybe clamed, e.g. l4d max seems to be 150
|
||||
* pitch is clamed between 1-200, this maybe different between games.
|
||||
* sndChannel static sound wont be replaced, however if overflowed it wont play any sound until static sounds have finished.
|
||||
*
|
||||
* @param sample sound file path.
|
||||
* @param origin origin to emit sound from.
|
||||
* @param entity entity to emit sound from.
|
||||
* @param level sound level attenuation, the wav sound it's self matters.
|
||||
* @param pitch sound pitch.
|
||||
* @param sndChannel sound channel.
|
||||
* @param rangeMin players within the min range sound wont be mixed.
|
||||
* @param rangeCurve range curve until max mix can be achieved.
|
||||
* @param levelBoost add level boost to mixed sounds max rangeCurve will apply levelBoost, half will apply half levelBoost.
|
||||
* @param exponent exponent value to multiply, logarithmic.
|
||||
*
|
||||
* @error Invalid client index.
|
||||
**/
|
||||
stock void EmitMixedAmbientSoundToAll(const char[] sample,
|
||||
const float origin[3] = NULL_VECTOR,
|
||||
int entity = SOUND_FROM_PLAYER,
|
||||
int level = SNDLEVEL_NORMAL,
|
||||
int pitch = SNDPITCH_NORMAL,
|
||||
int sndChannel = SNDCHAN_AUTO,
|
||||
float rangeMin,
|
||||
float rangeCurve=1500.0,
|
||||
int levelBoost=0,
|
||||
float exponent=1.0)
|
||||
{
|
||||
for(int i = 1; i <= MaxClients; ++i)
|
||||
{
|
||||
if(!IsClientInGame(i) || IsFakeClient(i))
|
||||
continue;
|
||||
|
||||
EmitMixedAmbientSound(i, sample, origin, entity, level, pitch, sndChannel, rangeMin, rangeCurve, levelBoost, exponent);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* level boost in some games maybe clamed, e.g. l4d max seems to be 150
|
||||
* pitch is clamed between 1-200, this maybe different between games.
|
||||
* sndChannel static sound wont be replaced, however if overflowed it wont play any sound until static sounds have finished.
|
||||
*
|
||||
* @param sample sound file path.
|
||||
* @param origin origin to emit sound from.
|
||||
* @param entity entity to emit sound from.
|
||||
* @param level sound level attenuation, the wav sound it's self matters.
|
||||
* @param pitch sound pitch.
|
||||
* @param sndChannel sound channel.
|
||||
* @param rangeMin players within the min range sound wont be mixed.
|
||||
* @param rangeCurve range curve until max mix can be achieved, sample2 is played when 2x this value.
|
||||
* @param levelBoost add level boost to mixed sounds max rangeCurve will apply levelBoost, half will apply half levelBoost.
|
||||
* @param exponent exponent value to multiply, logarithmic.
|
||||
* @param sample2 sound file path.
|
||||
* @param level2 sound level attenuation.
|
||||
* @param pitch2 sound pitch.
|
||||
*
|
||||
* @error Invalid client index.
|
||||
**/
|
||||
stock void EmitMixedAmbientSoundToAll_FallBack(const char[] sample,
|
||||
const float origin[3] = NULL_VECTOR,
|
||||
int entity = SOUND_FROM_PLAYER,
|
||||
int level = SNDLEVEL_NORMAL,
|
||||
int pitch = SNDPITCH_NORMAL,
|
||||
int sndChannel = SNDCHAN_AUTO,
|
||||
float rangeMin,
|
||||
float rangeCurve=1500.0,
|
||||
int levelBoost=0,
|
||||
float exponent=1.0,
|
||||
const char[] sample2,
|
||||
int level2 = SNDLEVEL_NORMAL,
|
||||
int pitch2 = SNDPITCH_NORMAL)
|
||||
{
|
||||
for(int i = 1; i <= MaxClients; ++i)
|
||||
{
|
||||
if(!IsClientInGame(i) || IsFakeClient(i))
|
||||
continue;
|
||||
|
||||
EmitMixedAmbientSound_FallBack(i, sample, origin, entity, level, pitch, sndChannel, rangeMin, rangeCurve, levelBoost, exponent, sample2, level2, pitch2);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* level boost in some games maybe clamed, e.g. l4d max seems to be 150
|
||||
* pitch is clamed between 1-200, this maybe different between games.
|
||||
* sndChannel static sound wont be replaced, however if overflowed it wont play any sound until static sounds have finished.
|
||||
*
|
||||
* @param client client index.
|
||||
* @param sample sound file path.
|
||||
* @param origin origin to emit sound from.
|
||||
* @param entity entity to emit sound from.
|
||||
* @param level sound level attenuation, the wav sound it's self matters.
|
||||
* @param pitch sound pitch.
|
||||
* @param sndChannel sound channel.
|
||||
* @param rangeMin players within the min range sound wont be mixed.
|
||||
* @param rangeCurve range curve until max mix can be achieved.
|
||||
* @param levelBoost add level boost to mixed sounds max rangeCurve will apply levelBoost, half will apply half levelBoost.
|
||||
* @param exponent exponent value to multiply, logarithmic.
|
||||
*
|
||||
* @error Invalid client index.
|
||||
**/
|
||||
stock void EmitMixedAmbientSound(int client, const char[] sample,
|
||||
const float origin[3] = NULL_VECTOR,
|
||||
int entity = SOUND_FROM_PLAYER,
|
||||
int level = SNDLEVEL_NORMAL,
|
||||
int pitch = SNDPITCH_NORMAL,
|
||||
int sndChannel = SNDCHAN_AUTO,
|
||||
float rangeMin,
|
||||
float rangeCurve=1500.0,
|
||||
int levelBoost=0,
|
||||
float exponent=1.0)
|
||||
{
|
||||
static float vecEyePos[3];
|
||||
int newPitch;
|
||||
float flDist;
|
||||
float flDistPercent;
|
||||
float flDistMulti;
|
||||
int DistLevelBoost;
|
||||
int viewEnt = -1;
|
||||
|
||||
viewEnt = GetEntPropEnt(client, Prop_Send, "m_hViewEntity");
|
||||
if(viewEnt > 0)
|
||||
{
|
||||
GetAbsOrigin(viewEnt, vecEyePos);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetClientEyePosition(client, vecEyePos);
|
||||
}
|
||||
flDist = GetVectorDistance(origin, vecEyePos);
|
||||
|
||||
if(rangeCurve == 0.0)
|
||||
{
|
||||
LogError("RangeCurve == 0.0");
|
||||
return;
|
||||
}
|
||||
|
||||
flDist = (flDist - rangeMin < 0.0 ? 0.0 : flDist - rangeMin);
|
||||
flDistPercent = (flDist / rangeCurve);
|
||||
flDistMulti = (flDistPercent * 2) * exponent;
|
||||
newPitch = pitch;
|
||||
|
||||
if(flDistMulti > 1.0)
|
||||
{
|
||||
newPitch = FloatToInt(newPitch / (flDistMulti > 2.0 ? 2.0 : flDistMulti));
|
||||
}
|
||||
|
||||
DistLevelBoost = FloatToInt((flDistPercent * exponent) * levelBoost);
|
||||
if(DistLevelBoost > levelBoost)
|
||||
DistLevelBoost = levelBoost;
|
||||
|
||||
EmitSoundToClient(client, sample, entity, sndChannel, level + DistLevelBoost, _, _, newPitch, _, origin);
|
||||
}
|
||||
|
||||
/**
|
||||
* level boost in some games maybe clamed, e.g. l4d max seems to be 150
|
||||
* pitch is clamed between 1-200, this maybe different between games.
|
||||
* sndChannel static sound wont be replaced, however if overflowed it wont play any sound until static sounds have finished.
|
||||
*
|
||||
* @param client client index.
|
||||
* @param sample sound file path.
|
||||
* @param origin origin to emit sound from.
|
||||
* @param entity entity to emit sound from.
|
||||
* @param level sound level attenuation, the wav sound it's self matters.
|
||||
* @param pitch sound pitch.
|
||||
* @param sndChannel sound channel.
|
||||
* @param rangeMin players within the min range sound wont be mixed.
|
||||
* @param rangeCurve range curve until max mix can be achieved, sample2 is played when 2x this value.
|
||||
* @param levelBoost add level boost to mixed sounds max rangeCurve will apply levelBoost, half will apply half levelBoost.
|
||||
* @param exponent exponent value to multiply, logarithmic.
|
||||
* @param sample2 sound file path.
|
||||
* @param level2 sound level attenuation.
|
||||
* @param pitch2 sound pitch.
|
||||
*
|
||||
* @error Invalid client index.
|
||||
**/
|
||||
stock void EmitMixedAmbientSound_FallBack(int client, const char[] sample,
|
||||
const float origin[3] = NULL_VECTOR,
|
||||
int entity = SOUND_FROM_PLAYER,
|
||||
int level = SNDLEVEL_NORMAL,
|
||||
int pitch = SNDPITCH_NORMAL,
|
||||
int sndChannel = SNDCHAN_AUTO,
|
||||
float rangeMin,
|
||||
float rangeCurve=1500.0,
|
||||
int levelBoost=0,
|
||||
float exponent=1.0,
|
||||
const char[] sample2,
|
||||
int level2 = SNDLEVEL_NORMAL,
|
||||
int pitch2 = SNDPITCH_NORMAL)
|
||||
{
|
||||
static float vecEyePos[3];
|
||||
int newPitch;
|
||||
float flDist;
|
||||
float flDistPercent;
|
||||
float flDistMulti;
|
||||
int DistLevelBoost;
|
||||
int viewEnt = -1;
|
||||
|
||||
viewEnt = GetEntPropEnt(client, Prop_Send, "m_hViewEntity");
|
||||
if(viewEnt > 0)
|
||||
{
|
||||
GetAbsOrigin(viewEnt, vecEyePos);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetClientEyePosition(client, vecEyePos);
|
||||
}
|
||||
flDist = GetVectorDistance(origin, vecEyePos);
|
||||
|
||||
if(rangeCurve == 0.0)
|
||||
{
|
||||
LogError("RangeCurve == 0.0");
|
||||
return;
|
||||
}
|
||||
|
||||
flDist = (flDist - rangeMin < 0.0 ? 0.0 : flDist - rangeMin);
|
||||
flDistPercent = (flDist / rangeCurve);
|
||||
flDistMulti = (flDistPercent * 2) * exponent;
|
||||
|
||||
if(flDistMulti >= 2.0)
|
||||
{
|
||||
EmitSoundToClient(client, sample2, entity, sndChannel, level2, _, _, pitch2, _, origin);
|
||||
return;
|
||||
}
|
||||
|
||||
newPitch = pitch;
|
||||
if(flDistMulti > 1.0)
|
||||
{
|
||||
newPitch = FloatToInt(newPitch / (flDistMulti > 2.0 ? 2.0 : flDistMulti));
|
||||
}
|
||||
|
||||
DistLevelBoost = FloatToInt((flDistPercent * exponent) * levelBoost);
|
||||
if(DistLevelBoost > levelBoost)
|
||||
DistLevelBoost = levelBoost;
|
||||
|
||||
EmitSoundToClient(client, sample, entity, sndChannel, level + DistLevelBoost, _, _, newPitch, _, origin);
|
||||
}
|
||||
|
||||
int FloatToInt(float val)
|
||||
{
|
||||
return RoundFloat(val);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////Legacy Particle Stock///////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Creates a tempent particle.
|
||||
*
|
||||
* @param iParticleIndex Particle index location in the "ParticleEffectNames" stringtable.
|
||||
* @param iEntIndex Entity index to attach particle to.
|
||||
* @param fDelay Delay for the TE_SendToAll function.
|
||||
* @param SendToAll True to send to all clients, false otherwise. You must call the send function yourself if sending to specific clients.
|
||||
* @param sParticleName Name of the particle to find the index with. Only used if the particle index is invalid.
|
||||
* @param iAttachmentIndex Attachment index of the particle. Decompile the model to retrieve this value.
|
||||
* @param fParticleAngles Angles of the particle. Usually effects particles that have no gravity.
|
||||
* @param iFlags Flags of the particle. Note: A value of "1" is required for attachment points and damage types.
|
||||
* @param iDamageType The damage type of the particle. (Used in impact effect dispatches and attachment points need to be set to use.)
|
||||
* @param fMagnitude The magnitude of the particle. (Needs testing; used in pipe bomb blast.)
|
||||
* @param fScale The scale of the particle (doesn't apply to most particles). (Needs testing.)
|
||||
*
|
||||
* @return True on success, false on failure.
|
||||
* @error Invalid effect index or invalid particle stringtable index.
|
||||
**/
|
||||
#pragma deprecated Used for backwards compatibility.
|
||||
stock bool L4D_TE_Create_Particle(float fParticleStartPos[3]={0.0, 0.0, 0.0},
|
||||
float fParticleEndPos[3]={0.0, 0.0, 0.0},
|
||||
int iParticleIndex=-1,
|
||||
int iEntIndex=0,
|
||||
float fDelay=0.0,
|
||||
bool SendToAll=true,
|
||||
char sParticleName[64]="",
|
||||
int iAttachmentIndex=0,
|
||||
float fParticleAngles[3]={0.0, 0.0, 0.0},
|
||||
int iFlags=0,
|
||||
int iDamageType=0,
|
||||
float fMagnitude=0.0,
|
||||
float fScale=1.0,
|
||||
float fRadius=0.0)
|
||||
{
|
||||
TE_Start("EffectDispatch");
|
||||
|
||||
static EngineVersion IsEngine;
|
||||
if(IsEngine == Engine_Unknown)
|
||||
IsEngine = GetEngineVersion();
|
||||
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vOrigin.x" :"m_vOrigin[0]", fParticleStartPos[0]);
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vOrigin.y" :"m_vOrigin[1]", fParticleStartPos[1]);
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vOrigin.z" :"m_vOrigin[2]", fParticleStartPos[2]);
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vStart.x" :"m_vStart[0]", fParticleEndPos[0]);//end point usually for bulletparticles or ropes
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vStart.y" :"m_vStart[1]", fParticleEndPos[1]);
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vStart.z" :"m_vStart[2]", fParticleEndPos[2]);
|
||||
|
||||
static int iEffectIndex = INVALID_STRING_INDEX;
|
||||
if(iEffectIndex < 0)
|
||||
{
|
||||
iEffectIndex = __FindStringIndex2(FindStringTable("EffectDispatch"), "ParticleEffect");
|
||||
if(iEffectIndex == INVALID_STRING_INDEX)
|
||||
SetFailState("Unable to find EffectDispatch/ParticleEffect indexes");
|
||||
|
||||
}
|
||||
|
||||
TE_WriteNum("m_iEffectName", iEffectIndex);
|
||||
|
||||
if(iParticleIndex < 0)
|
||||
{
|
||||
static int iParticleStringIndex = INVALID_STRING_INDEX;
|
||||
iParticleStringIndex = __FindStringIndex2(FindStringTable("ParticleEffectNames"), sParticleName);
|
||||
if(iParticleStringIndex == INVALID_STRING_INDEX)
|
||||
return false;
|
||||
|
||||
TE_WriteNum("m_nHitBox", iParticleStringIndex);
|
||||
}
|
||||
else
|
||||
TE_WriteNum("m_nHitBox", iParticleIndex);
|
||||
|
||||
TE_WriteNum("entindex", iEntIndex);
|
||||
TE_WriteNum("m_nAttachmentIndex", iAttachmentIndex);
|
||||
|
||||
TE_WriteVector("m_vAngles", fParticleAngles);
|
||||
|
||||
TE_WriteNum("m_fFlags", iFlags);
|
||||
TE_WriteFloat("m_flMagnitude", fMagnitude);// saw this being used in pipebomb needs testing what it does probs shaking screen?
|
||||
TE_WriteFloat("m_flScale", fScale);
|
||||
TE_WriteFloat("m_flRadius", fRadius);// saw this being used in pipebomb needs testing what it does probs shaking screen?
|
||||
TE_WriteNum("m_nDamageType", iDamageType);// this shit is required dunno why for attachpoint emitting valve probs named it wrong
|
||||
|
||||
if(SendToAll)
|
||||
TE_SendToAll(fDelay);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stops a tempent particle.
|
||||
*
|
||||
* @param fParticleStartPos Starting position of the particle.
|
||||
* @param fParticleEndPos Ending position of the particle.
|
||||
* @param iParticleIndex Particle index location in the "ParticleEffectNames" stringtable.
|
||||
* @param iEntIndex Entity index to attach particle to.
|
||||
* @param fDelay Delay for the TE_SendToAll function.
|
||||
* @param SendToAll True to send to all clients, false otherwise. You must call the send function yourself if sending to specific clients.
|
||||
* @param sParticleName Name of the particle to find the index with. Only used if the particle index is invalid.
|
||||
* @param iAttachmentIndex Attachment index of the particle. Decompile the model to retrieve this value.
|
||||
* @param fParticleAngles Angles of the particle. Usually effects particles that have no gravity.
|
||||
* @param iFlags Flags of the particle.
|
||||
* @param iDamageType The damage type of the particle. (Used in impact effect dispatches and attachment points need to be set to use.)
|
||||
* @param fMagnitude The magnitude of the particle. (Needs testing; used in pipe bomb blast.)
|
||||
* @param fScale The scale of the particle (doesn't apply to most particles). (Needs testing.)
|
||||
* @param fRadius The radius of the particle.
|
||||
*
|
||||
* @return True on success, false on failure.
|
||||
* @error Invalid effect index or invalid particle stringtable index.
|
||||
**/
|
||||
#pragma deprecated Used only for backwards compatibility.
|
||||
stock bool L4D_TE_Stop_Particle(float fParticleStartPos[3]={0.0, 0.0, 0.0},
|
||||
float fParticleEndPos[3]={0.0, 0.0, 0.0},
|
||||
int iParticleIndex=-1,
|
||||
int iEntIndex=0,
|
||||
float fDelay=0.0,
|
||||
bool SendToAll=true,
|
||||
char sParticleName[64]="",
|
||||
int iAttachmentIndex=0,
|
||||
float fParticleAngles[3]={0.0, 0.0, 0.0},
|
||||
int iFlags=0,
|
||||
int iDamageType=0,
|
||||
float fMagnitude=0.0,
|
||||
float fScale=1.0,
|
||||
float fRadius=0.0)
|
||||
{
|
||||
TE_Start("EffectDispatch");
|
||||
|
||||
static EngineVersion IsEngine;
|
||||
if(IsEngine == Engine_Unknown)
|
||||
IsEngine = GetEngineVersion();
|
||||
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vOrigin.x" :"m_vStart[0]", fParticleStartPos[0]);
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vOrigin.y" :"m_vStart[1]", fParticleStartPos[1]);
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vOrigin.z" :"m_vStart[2]", fParticleStartPos[2]);
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vStart.x" :"m_vOrigin[0]", fParticleEndPos[0]);//end point usually for bulletparticles or ropes
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vStart.y" :"m_vOrigin[1]", fParticleEndPos[1]);
|
||||
TE_WriteFloat(IsEngine == Engine_Left4Dead2 ? "m_vStart.z" :"m_vOrigin[2]", fParticleEndPos[2]);
|
||||
|
||||
static int iEffectIndex = INVALID_STRING_INDEX;
|
||||
if(iEffectIndex < 0)
|
||||
{
|
||||
iEffectIndex = __FindStringIndex2(FindStringTable("EffectDispatch"), "ParticleEffectStop");
|
||||
if(iEffectIndex == INVALID_STRING_INDEX)
|
||||
SetFailState("Unable to find EffectDispatch/ParticleEffectStop indexes");
|
||||
|
||||
}
|
||||
|
||||
TE_WriteNum("m_iEffectName", iEffectIndex);
|
||||
|
||||
if(iParticleIndex < 0)
|
||||
{
|
||||
static int iParticleStringIndex = INVALID_STRING_INDEX;
|
||||
iParticleStringIndex = __FindStringIndex2(FindStringTable("ParticleEffectNames"), sParticleName);
|
||||
if(iParticleStringIndex == INVALID_STRING_INDEX)
|
||||
return false;
|
||||
|
||||
TE_WriteNum("m_nHitBox", iParticleStringIndex);
|
||||
}
|
||||
else
|
||||
TE_WriteNum("m_nHitBox", iParticleIndex);
|
||||
|
||||
TE_WriteNum("entindex", iEntIndex);
|
||||
TE_WriteNum("m_nAttachmentIndex", iAttachmentIndex);
|
||||
|
||||
TE_WriteVector("m_vAngles", fParticleAngles);
|
||||
|
||||
TE_WriteNum("m_fFlags", iFlags);
|
||||
TE_WriteFloat("m_flMagnitude", fMagnitude);// saw this being used in pipebomb needs testing what it does probs shaking screen?
|
||||
TE_WriteFloat("m_flScale", fScale);
|
||||
TE_WriteFloat("m_flRadius", fRadius);// saw this being used in pipebomb needs testing what it does probs shaking screen?
|
||||
TE_WriteNum("m_nDamageType", iDamageType);// this shit is required dunno why for attachpoint emitting valve probs named it wrong
|
||||
|
||||
if(SendToAll)
|
||||
TE_SendToAll(fDelay);
|
||||
|
||||
return true;
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Left 4 DHooks Direct - Stock Functions
|
||||
* Copyright (C) 2022 Silvers
|
||||
* Copyright (C) 2023 Silvers
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -202,7 +202,7 @@ bool ComputeGroups(Group groups[MAX_GROUPS], GroupResult result, float activateF
|
|||
inGroup[j] = true;
|
||||
members.Push(GetClientUserId(j));
|
||||
} else {
|
||||
PrintDebug("not adding member to group %d: %N (dist = %.4f) (fldiff = %.1f) (l:%N)", groupIndex + 1, j, dist, flowDiff, i);
|
||||
// PrintDebug("not adding member to group %d: %N (dist = %.4f) (fldiff = %.1f) (l:%N)", groupIndex + 1, j, dist, flowDiff, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -294,6 +294,39 @@ bool ComputeGroups(Group groups[MAX_GROUPS], GroupResult result, float activateF
|
|||
return groupIndex > 0;
|
||||
}
|
||||
|
||||
public Action L4D2_CGasCan_EventKilled(int gascan, int &inflictor, int &attacker) {
|
||||
if(hEnabled.IntValue > 0 && attacker > 0 && attacker <= MaxClients) {
|
||||
float activatorFlow = L4D2Direct_GetFlowDistance(attacker);
|
||||
Group groups[MAX_GROUPS];
|
||||
GroupResult result;
|
||||
ComputeGroups(groups, result, activatorFlow);
|
||||
|
||||
AdminId admin = GetUserAdmin(attacker);
|
||||
if(admin != INVALID_ADMIN_ID && admin.HasFlag(Admin_Custom1)) {
|
||||
lastButtonPressTime = GetGameTime();
|
||||
return Plugin_Continue;
|
||||
} else if(result.groupCount > 0 && result.ungroupedCount > 0) {
|
||||
lastButtonPressTime = GetGameTime();
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
if(panicStarted) {
|
||||
panicStarted = false;
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
|
||||
PrintToConsoleAll("[CC] Gascan Light by %N", attacker);
|
||||
if(hEnabled.IntValue == 2 || !IsActivationAllowed(activatorFlow, 1500.0)) {
|
||||
ClientCommand(attacker, "play ui/menu_invalid.wav");
|
||||
PrintToChat(attacker, "Please wait for players to catch up.");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
lastButtonPressTime = GetGameTime();
|
||||
}
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
|
||||
// 5 far/8 total
|
||||
// [Debug] average 4222.518066 - difference 2262.424316
|
||||
|
|
|
@ -150,7 +150,7 @@ Restore from saved inventory
|
|||
static StringMap weaponMaxClipSizes;
|
||||
static StringMap pInv;
|
||||
|
||||
static char HUD_SCRIPT_DATA[] = "g_ModeScript._eph <- {Fields = {players = {slot = g_ModeScript.HUD_RIGHT_BOT, dataval = \"%s\", flags = g_ModeScript.HUD_FLAG_ALIGN_LEFT|g_ModeScript.HUD_FLAG_TEAM_SURVIVORS|g_ModeScript.HUD_FLAG_NOBG}}};HUDSetLayout(g_ModeScript._eph);HUDPlace(g_ModeScript.HUD_RIGHT_BOT, 0.72,0.78,0.3,0.3);g_ModeScript";
|
||||
static char HUD_SCRIPT_DATA[] = "g_ModeScript._eph <- { Fields = { players = { slot = g_ModeScript.HUD_RIGHT_BOT, dataval = \"%s\", flags = g_ModeScript.HUD_FLAG_ALIGN_LEFT | g_ModeScript.HUD_FLAG_TEAM_SURVIVORS | g_ModeScript.HUD_FLAG_NOBG } } }; HUDSetLayout(g_ModeScript._eph); HUDPlace(g_ModeScript.HUD_RIGHT_BOT, 0.72,0.78,0.3,0.3); g_ModeScript";
|
||||
|
||||
static char HUD_SCRIPT_CLEAR[] = "g_ModeScript._eph <- { Fields = { players = { slot = g_ModeScript.HUD_RIGHT_BOT, dataval = \"\", flags = g_ModeScript.HUD_FLAG_ALIGN_LEFT|g_ModeScript.HUD_FLAG_TEAM_SURVIVORS|g_ModeScript.HUD_FLAG_NOBG } } };HUDSetLayout( g_ModeScript._eph );g_ModeScript";
|
||||
|
||||
|
@ -1271,7 +1271,6 @@ public Action Timer_UpdateHud(Handle h) {
|
|||
Format(prefix, 13, "AFK %N", client);
|
||||
else
|
||||
Format(prefix, 8, "%N", i);
|
||||
|
||||
} else {
|
||||
Format(prefix, 8, "%N", i);
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Anti Rush
|
||||
* Copyright (C) 2021 Silvers
|
||||
* Copyright (C) 2023 Silvers
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -18,7 +18,7 @@
|
|||
|
||||
|
||||
|
||||
#define PLUGIN_VERSION "1.17"
|
||||
#define PLUGIN_VERSION "1.19"
|
||||
#define DEBUG_BENCHMARK 0 // 0=Off. 1=Benchmark logic function.
|
||||
|
||||
/*======================================================================================
|
||||
|
@ -33,6 +33,15 @@
|
|||
========================================================================================
|
||||
Change Log:
|
||||
|
||||
1.19 (10-Mar-2023)
|
||||
- Added cvar "l4d_anti_rush_health" to hurt players who are rushing. Requested by "Voevoda".
|
||||
- Changed cvar "l4d_anti_rush_type" to allow disabling teleport or slowdown, to only enable health drain.
|
||||
- Translation phrases updated to support the health drain only type. Thanks to "Voevoda" and "HarryPotter" for updating Russian and Chinese translations.
|
||||
|
||||
1.18 (01-Jun-2022)
|
||||
- L4D1: Fixed throwing errors.
|
||||
- L4D2: Added map "c5m5_bridge" to the data config.
|
||||
|
||||
1.17 (04-Dec-2021)
|
||||
- Changes to fix warnings when compiling on SourceMod 1.11.
|
||||
|
||||
|
@ -136,8 +145,8 @@ float g_iBenchTicks;
|
|||
#define EVENTS_CONFIG "data/l4d_anti_rush.cfg"
|
||||
|
||||
|
||||
ConVar g_hCvarAllow, g_hCvarMPGameMode, g_hCvarModes, g_hCvarModesOff, g_hCvarModesTog, g_hCvarFinale, g_hCvarFlags, g_hCvarIgnore, g_hCvarIncap, g_hCvarPlayers, g_hCvarRangeLast, g_hCvarRangeLead, g_hCvarSlow, g_hCvarTank, g_hCvarText, g_hCvarTime, g_hCvarType, g_hCvarWarnLast, g_hCvarWarnLead, g_hCvarWarnTime;
|
||||
float g_fCvarRangeLast, g_fCvarRangeLead, g_fCvarSlow, g_fCvarTime, g_fCvarWarnLast, g_fCvarWarnLead, g_fCvarWarnTime;
|
||||
ConVar g_hCvarAllow, g_hCvarMPGameMode, g_hCvarModes, g_hCvarModesOff, g_hCvarModesTog, g_hCvarFinale, g_hCvarFlags, g_hCvarIgnore, g_hCvarHealth, g_hCvarIncap, g_hCvarPlayers, g_hCvarRangeLast, g_hCvarRangeLead, g_hCvarSlow, g_hCvarTank, g_hCvarText, g_hCvarTime, g_hCvarType, g_hCvarWarnLast, g_hCvarWarnLead, g_hCvarWarnTime;
|
||||
float g_fCvarHealth, g_fCvarRangeLast, g_fCvarRangeLead, g_fCvarSlow, g_fCvarTime, g_fCvarWarnLast, g_fCvarWarnLead, g_fCvarWarnTime;
|
||||
int g_iCvarFinale, g_iCvarFlags, g_iCvarIgnore, g_iCvarIncap, g_iCvarPlayers, g_iCvarTank, g_iCvarText, g_iCvarType;
|
||||
bool g_bCvarAllow, g_bMapStarted, g_bLeft4Dead2;
|
||||
|
||||
|
@ -145,6 +154,7 @@ bool g_bInhibit[MAXPLAYERS+1];
|
|||
float g_fHintLast[MAXPLAYERS+1];
|
||||
float g_fHintWarn[MAXPLAYERS+1];
|
||||
float g_fLastFlow[MAXPLAYERS+1];
|
||||
float g_fHighestFlow[MAXPLAYERS+1];
|
||||
Handle g_hTimer;
|
||||
|
||||
char g_sMap[PLATFORM_MAX_PATH];
|
||||
|
@ -152,6 +162,7 @@ bool g_bFoundMap;
|
|||
bool g_bEventStarted;
|
||||
float g_fEventExtended;
|
||||
|
||||
|
||||
ArrayList g_hElevators;
|
||||
GlobalForward g_OnRushForward;
|
||||
|
||||
|
@ -193,16 +204,17 @@ public void OnPluginStart()
|
|||
g_hCvarModesTog = CreateConVar( "l4d_anti_rush_modes_tog", "0", "Turn on the plugin in these game modes. 0=All, 1=Coop, 2=Survival, 4=Versus, 8=Scavenge. Add numbers together.", CVAR_FLAGS );
|
||||
g_hCvarFinale = CreateConVar( "l4d_anti_rush_finale", g_bLeft4Dead2 ? "2" : "0", "Should the plugin activate in finales. 0=Off. 1=All finales. 2=Gauntlet type finales (L4D2 only).", CVAR_FLAGS );
|
||||
g_hCvarFlags = CreateConVar( "l4d_anti_rush_flags", "", "Players with these flags will be immune from teleporting forward when behind or slowing down when ahead.", CVAR_FLAGS );
|
||||
g_hCvarHealth = CreateConVar( "l4d_anti_rush_health", "0", "0=Off. Amount of health to remove every second when someone is rushing.", CVAR_FLAGS);
|
||||
g_hCvarIgnore = CreateConVar( "l4d_anti_rush_ignore", "0", "Should players with the immune flags be counted toward total flow distance. 0=Ignore them. 1=Count them.", CVAR_FLAGS );
|
||||
g_hCvarIncap = CreateConVar( "l4d_anti_rush_incapped", "0", "0=Off. How many survivors must be incapped before ignoring them in calculating rushers and slackers.", CVAR_FLAGS );
|
||||
g_hCvarPlayers = CreateConVar( "l4d_anti_rush_players", "3", "Minimum number of alive survivors before the function kicks in. Must be 3 or greater otherwise the lead/last and average cannot be detected.", CVAR_FLAGS, true, 3.0 );
|
||||
g_hCvarRangeLast = CreateConVar( "l4d_anti_rush_range_last", "3000.0", "How far behind someone can travel from the average Survivor distance before being teleported forward.", CVAR_FLAGS, true, MINIMUM_RANGE );
|
||||
g_hCvarRangeLead = CreateConVar( "l4d_anti_rush_range_lead", "3000.0", "How far forward someone can travel from the average Survivor distance before being teleported or slowed down.", CVAR_FLAGS, true, MINIMUM_RANGE );
|
||||
g_hCvarRangeLast = CreateConVar( "l4d_anti_rush_range_last", "3000.0", "0.0=Off. How far behind someone can travel from the average Survivor distance before being teleported forward.", CVAR_FLAGS );
|
||||
g_hCvarRangeLead = CreateConVar( "l4d_anti_rush_range_lead", "3000.0", "How far forward someone can travel from the average Survivor distance before being teleported, slowed down or health drained.", CVAR_FLAGS, true, MINIMUM_RANGE );
|
||||
g_hCvarSlow = CreateConVar( "l4d_anti_rush_slow", "75.0", "Maximum speed someone can travel when being slowed down.", CVAR_FLAGS, true, 20.0 );
|
||||
g_hCvarTank = CreateConVar( "l4d_anti_rush_tanks", "1", "0=Off. 1=On. Should Anti-Rush be enabled when there are active Tanks.", CVAR_FLAGS );
|
||||
g_hCvarText = CreateConVar( "l4d_anti_rush_text", "1", "0=Off. 1=Print To Chat. 2=Hint Text. Display a message to someone rushing, or falling behind.", CVAR_FLAGS );
|
||||
g_hCvarTime = CreateConVar( "l4d_anti_rush_time", "10", "How often to print the message to someone if slowdown is enabled and affecting them.", CVAR_FLAGS );
|
||||
g_hCvarType = CreateConVar( "l4d_anti_rush_type", "1", "What to do with rushers. 1=Slowdown player speed when moving forward. 2=Teleport back to group. 3=Spawn Special On Them", CVAR_FLAGS );
|
||||
g_hCvarType = CreateConVar( "l4d_anti_rush_type", "1", "What to do with rushers. 0=Ignore (used for health drain / forward only). 1=Slowdown player speed when moving forward. 2=Teleport back to group.", CVAR_FLAGS );
|
||||
g_hCvarWarnLast = CreateConVar( "l4d_anti_rush_warn_last", "2500.0", "How far behind someone can travel from the average Survivor distance before being warned about being teleported.", CVAR_FLAGS, true, MINIMUM_RANGE );
|
||||
g_hCvarWarnLead = CreateConVar( "l4d_anti_rush_warn_lead", "2500.0", "How far forward someone can travel from the average Survivor distance before being warned about being teleported or slowed down.", CVAR_FLAGS, true, MINIMUM_RANGE );
|
||||
g_hCvarWarnTime = CreateConVar( "l4d_anti_rush_warn_time", "15.0", "0.0=Off. How often to print a message to someone warning them they are ahead or behind and will be teleported or slowed down.", CVAR_FLAGS );
|
||||
|
@ -217,6 +229,7 @@ public void OnPluginStart()
|
|||
g_hCvarAllow.AddChangeHook(ConVarChanged_Allow);
|
||||
g_hCvarFinale.AddChangeHook(ConVarChanged_Cvars);
|
||||
g_hCvarFlags.AddChangeHook(ConVarChanged_Cvars);
|
||||
g_hCvarHealth.AddChangeHook(ConVarChanged_Cvars);
|
||||
g_hCvarIgnore.AddChangeHook(ConVarChanged_Cvars);
|
||||
g_hCvarIncap.AddChangeHook(ConVarChanged_Cvars);
|
||||
g_hCvarPlayers.AddChangeHook(ConVarChanged_Cvars);
|
||||
|
@ -250,12 +263,12 @@ public void OnConfigsExecuted()
|
|||
IsAllowed();
|
||||
}
|
||||
|
||||
public void ConVarChanged_Allow(Handle convar, const char[] oldValue, const char[] newValue)
|
||||
void ConVarChanged_Allow(Handle convar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
IsAllowed();
|
||||
}
|
||||
|
||||
public void ConVarChanged_Cvars(Handle convar, const char[] oldValue, const char[] newValue)
|
||||
void ConVarChanged_Cvars(Handle convar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
GetCvars();
|
||||
}
|
||||
|
@ -268,6 +281,7 @@ void GetCvars()
|
|||
g_iCvarIgnore = g_hCvarIgnore.IntValue;
|
||||
|
||||
g_iCvarFinale = g_hCvarFinale.IntValue;
|
||||
g_fCvarHealth = g_hCvarHealth.FloatValue;
|
||||
g_iCvarIncap = g_hCvarIncap.IntValue;
|
||||
g_iCvarPlayers = g_hCvarPlayers.IntValue;
|
||||
g_fCvarTime = g_hCvarTime.FloatValue;
|
||||
|
@ -377,7 +391,7 @@ bool IsAllowedGameMode()
|
|||
return true;
|
||||
}
|
||||
|
||||
public void OnGamemode(const char[] output, int caller, int activator, float delay)
|
||||
void OnGamemode(const char[] output, int caller, int activator, float delay)
|
||||
{
|
||||
if( strcmp(output, "OnCoop") == 0 )
|
||||
g_iCurrentMode = 1;
|
||||
|
@ -428,7 +442,7 @@ bool ParseConfigFile(const char[] file)
|
|||
return (result == SMCError_Okay);
|
||||
}
|
||||
|
||||
public SMCResult ColorConfig_NewSection(Handle parser, const char[] section, bool quotes)
|
||||
SMCResult ColorConfig_NewSection(Handle parser, const char[] section, bool quotes)
|
||||
{
|
||||
g_iSectionLevel++;
|
||||
|
||||
|
@ -443,7 +457,7 @@ public SMCResult ColorConfig_NewSection(Handle parser, const char[] section, boo
|
|||
return SMCParse_Continue;
|
||||
}
|
||||
|
||||
public SMCResult ColorConfig_KeyValue(Handle parser, const char[] key, const char[] value, bool key_quotes, bool value_quotes)
|
||||
SMCResult ColorConfig_KeyValue(Handle parser, const char[] key, const char[] value, bool key_quotes, bool value_quotes)
|
||||
{
|
||||
// On / Off
|
||||
if( g_iSectionLevel == 2 && g_bFoundMap )
|
||||
|
@ -478,24 +492,24 @@ public SMCResult ColorConfig_KeyValue(Handle parser, const char[] key, const cha
|
|||
return SMCParse_Continue;
|
||||
}
|
||||
|
||||
public void OutputStart(const char[] output, int caller, int activator, float delay)
|
||||
void OutputStart(const char[] output, int caller, int activator, float delay)
|
||||
{
|
||||
g_bEventStarted = true;
|
||||
}
|
||||
|
||||
public void OutputStop(const char[] output, int caller, int activator, float delay)
|
||||
void OutputStop(const char[] output, int caller, int activator, float delay)
|
||||
{
|
||||
g_bEventStarted = false;
|
||||
}
|
||||
|
||||
|
||||
public SMCResult ColorConfig_EndSection(Handle parser)
|
||||
SMCResult ColorConfig_EndSection(Handle parser)
|
||||
{
|
||||
g_iSectionLevel--;
|
||||
return SMCParse_Continue;
|
||||
}
|
||||
|
||||
public void ColorConfig_End(Handle parser, bool halted, bool failed)
|
||||
void ColorConfig_End(Handle parser, bool halted, bool failed)
|
||||
{
|
||||
if( failed )
|
||||
SetFailState("Error: Cannot load the config file: \"%s\"", EVENTS_CONFIG);
|
||||
|
@ -536,7 +550,7 @@ int FindByClassTargetName(const char[] sClass, const char[] sTarget)
|
|||
// ====================================================================================================
|
||||
// EVENTS
|
||||
// ====================================================================================================
|
||||
public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
|
||||
void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
|
||||
{
|
||||
delete g_hTimer;
|
||||
|
||||
|
@ -568,13 +582,13 @@ public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
|
|||
}
|
||||
}
|
||||
|
||||
public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
|
||||
void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
|
||||
{
|
||||
ResetSlowdown();
|
||||
ResetPlugin();
|
||||
}
|
||||
|
||||
public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
|
||||
void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
|
||||
{
|
||||
int client = GetClientOfUserId(event.GetInt("userid"));
|
||||
if( client )
|
||||
|
@ -583,7 +597,7 @@ public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast
|
|||
}
|
||||
}
|
||||
|
||||
public void Event_PlayerTeam(Event event, const char[] name, bool dontBroadcast)
|
||||
void Event_PlayerTeam(Event event, const char[] name, bool dontBroadcast)
|
||||
{
|
||||
int client = GetClientOfUserId(event.GetInt("userid"));
|
||||
if( client )
|
||||
|
@ -624,6 +638,7 @@ void ResetClient(int i)
|
|||
g_fHintLast[i] = 0.0;
|
||||
g_fHintWarn[i] = 0.0;
|
||||
g_fLastFlow[i] = 0.0;
|
||||
g_fHighestFlow[i] = 0.0;
|
||||
|
||||
SDKUnhook(i, SDKHook_PreThinkPost, PreThinkPost);
|
||||
}
|
||||
|
@ -646,7 +661,7 @@ void ResetSlowdown()
|
|||
// ====================================================================================================
|
||||
// LOGIC
|
||||
// ====================================================================================================
|
||||
public Action TimerTest(Handle timer)
|
||||
Action TimerTest(Handle timer)
|
||||
{
|
||||
if( !g_bMapStarted ) return Plugin_Continue;
|
||||
|
||||
|
@ -712,7 +727,7 @@ public Action TimerTest(Handle timer)
|
|||
continue;
|
||||
|
||||
// Ignore healing / using stuff
|
||||
if( GetEntPropEnt(client, Prop_Send, "m_useActionTarget") > 0 )
|
||||
if( g_bLeft4Dead2 && GetEntPropEnt(client, Prop_Send, "m_useActionTarget") > 0 )
|
||||
continue;
|
||||
|
||||
// Ignore reviving
|
||||
|
@ -734,6 +749,13 @@ public Action TimerTest(Handle timer)
|
|||
|
||||
// Get flow
|
||||
flow = L4D2Direct_GetFlowDistance(client);
|
||||
// Only get the highest flow
|
||||
if(flow > g_fHighestFlow[client]) {
|
||||
g_fHighestFlow[client] = flow;
|
||||
} else {
|
||||
flow = g_fHighestFlow[client];
|
||||
}
|
||||
|
||||
if( flow && flow != -9999.0 ) // Invalid flows
|
||||
{
|
||||
countflow++;
|
||||
|
@ -792,17 +814,17 @@ public Action TimerTest(Handle timer)
|
|||
{
|
||||
g_fHintWarn[client] = GetGameTime() + g_fCvarWarnTime;
|
||||
|
||||
if( g_iCvarType == 1 )
|
||||
ClientHintMessage(client, "Warn_Slowdown");
|
||||
else
|
||||
ClientHintMessage(client, "Warn_Ahead");
|
||||
switch( g_iCvarType )
|
||||
{
|
||||
case 0: ClientHintMessage(client, "Warn_Health");
|
||||
case 1: ClientHintMessage(client, "Warn_Slowdown");
|
||||
case 2: ClientHintMessage(client, "Warn_Ahead");
|
||||
}
|
||||
}
|
||||
|
||||
// Compare higher flow with next survivor, they're rushing
|
||||
if( distance > g_fCvarRangeLead )
|
||||
{
|
||||
// PrintToServer("RUSH: %N %f", client, distance);
|
||||
flowBack = false;
|
||||
int punishType = g_iCvarType, result;
|
||||
|
||||
Call_StartForward(g_OnRushForward);
|
||||
|
@ -812,8 +834,11 @@ public Action TimerTest(Handle timer)
|
|||
|
||||
if(Call_Finish(result) == SP_ERROR_NONE && result > 0) break;
|
||||
|
||||
// PrintToServer("RUSH: %N %f", client, distance);
|
||||
flowBack = false;
|
||||
|
||||
// Slowdown enabled?
|
||||
if( punishType == 1 )
|
||||
if( g_fCvarHealth || punishType == 1 )
|
||||
{
|
||||
// Inhibit moving forward
|
||||
// Only check > or < because when == the same flow distance, they're either already being slowed or running back, so we don't want to change/affect them within the same flow NavMesh.
|
||||
|
@ -821,7 +846,7 @@ public Action TimerTest(Handle timer)
|
|||
{
|
||||
g_fLastFlow[client] = flow;
|
||||
|
||||
if( g_bInhibit[client] == false )
|
||||
if( g_iCvarType == 1 && g_bInhibit[client] == false )
|
||||
{
|
||||
g_bInhibit[client] = true;
|
||||
SDKHook(client, SDKHook_PreThinkPost, PreThinkPost);
|
||||
|
@ -832,7 +857,17 @@ public Action TimerTest(Handle timer)
|
|||
{
|
||||
g_fHintLast[client] = GetGameTime() + g_fCvarTime;
|
||||
|
||||
ClientHintMessage(client, "Rush_Slowdown");
|
||||
switch( g_iCvarType )
|
||||
{
|
||||
case 0: ClientHintMessage(client, "Rush_Health");
|
||||
case 1: ClientHintMessage(client, "Rush_Slowdown");
|
||||
}
|
||||
}
|
||||
|
||||
// Hurt for rushing?
|
||||
if( g_fCvarHealth )
|
||||
{
|
||||
SDKHooks_TakeDamage(client, 0, 0, g_fCvarHealth);
|
||||
}
|
||||
}
|
||||
else if( flow < g_fLastFlow[client] )
|
||||
|
@ -973,7 +1008,7 @@ public Action L4D_OnGetWalkTopSpeed(int target, float &retVal)
|
|||
}
|
||||
// */
|
||||
|
||||
public void PreThinkPost(int client)
|
||||
void PreThinkPost(int client)
|
||||
{
|
||||
SetEntPropFloat(client, Prop_Send, "m_flMaxspeed", g_fCvarSlow);
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ public void OnPluginStart() {
|
|||
void ShowRepMenu(int client, int targetUserid) {
|
||||
Menu menu = new Menu(RepFinalHandler);
|
||||
menu.SetTitle("Choose a rating");
|
||||
char id[8];
|
||||
char id[16];
|
||||
Format(id, sizeof(id), "%d|1", targetUserid);
|
||||
menu.AddItem(id, "+Rep");
|
||||
Format(id, sizeof(id), "%d|1", targetUserid);
|
||||
|
@ -91,7 +91,7 @@ void ShowRepMenu(int client, int targetUserid) {
|
|||
public int RepPlayerHandler(Menu menu, MenuAction action, int param1, int param2) {
|
||||
/* If an option was selected, tell the client about the item. */
|
||||
if (action == MenuAction_Select) {
|
||||
static char info[4];
|
||||
static char info[8];
|
||||
menu.GetItem(param2, info, sizeof(info));
|
||||
int targetUserid = StringToInt(info);
|
||||
int target = GetClientOfUserId(targetUserid);
|
||||
|
@ -111,7 +111,7 @@ public int RepPlayerHandler(Menu menu, MenuAction action, int param1, int param2
|
|||
public int RepFinalHandler(Menu menu, MenuAction action, int param1, int param2) {
|
||||
/* If an option was selected, tell the client about the item. */
|
||||
if (action == MenuAction_Select) {
|
||||
char info[8];
|
||||
char info[16];
|
||||
menu.GetItem(param2, info, sizeof(info));
|
||||
char str[2][8];
|
||||
ExplodeString(info, "|", str, 2, 8, false);
|
||||
|
@ -443,7 +443,7 @@ public void DB_FindNotes(Database db, DBResultSet results, const char[] error, a
|
|||
CPrintChatToAdmins(" > {olive}%d Auto Actions Applied", actions);
|
||||
}
|
||||
if(repP > 0 || repN > 0) {
|
||||
CPrintChatToAdmins(" > {olive}%d +rep\t{yellow}-rep", repP, repN);
|
||||
CPrintChatToAdmins(" > {olive}%d +rep\t{yellow}%d-rep", repP, repN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -615,6 +615,6 @@ any Native_AddNoteIdentity(Handle plugin, int numParams) {
|
|||
void AddNoteIdentity(const char noteCreator[32], const char noteTarget[32], const char[] message) {
|
||||
// messaege length + steamids (32 + 32 + null term)
|
||||
// char[] query = new char[strlen(message) + 65];
|
||||
DB.Format(query, sizeof(query), "INSERT INTO `notes` (steamid, markedBy, content) VALUES ('%s', '%s', '%s')", noteCreator, noteTarget, message);
|
||||
DB.Format(query, sizeof(query), "INSERT INTO `notes` (steamid, markedBy, content) VALUES ('%s', '%s', '%s')", noteTarget, noteCreator, message);
|
||||
DB.Query(DB_AddNote, query);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue