From caf5e95fd16199c260e5a0533e4301617cec16b7 Mon Sep 17 00:00:00 2001 From: Jackz Date: Wed, 11 May 2022 23:07:05 -0500 Subject: [PATCH] minor file changes --- plugins/activitymonitor.smx | Bin 8341 -> 8423 bytes plugins/jutils.smx | Bin 0 -> 2367 bytes plugins/l4d2_special_control.smx | Bin 0 -> 7039 bytes scripting/activitymonitor.sp | 11 +- scripting/include/actions.inc | 919 ++++++++++++++++++++++++++++++ scripting/l4d2_special_control.sp | 164 ++++++ 6 files changed, 1089 insertions(+), 5 deletions(-) create mode 100644 plugins/jutils.smx create mode 100644 plugins/l4d2_special_control.smx create mode 100644 scripting/include/actions.inc create mode 100644 scripting/l4d2_special_control.sp diff --git a/plugins/activitymonitor.smx b/plugins/activitymonitor.smx index c817158f27d6b6b9f06f1b6cb81e5eddf2af2576..4cb70a894155d68fb7143db63e844e1dd6623f55 100644 GIT binary patch delta 8225 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 Pq(9+q9JH=k{`3C;&3s{w delta 8143 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 Txow|kLm-~{g6R0qW9)wbf^!G* diff --git a/plugins/jutils.smx b/plugins/jutils.smx new file mode 100644 index 0000000000000000000000000000000000000000..7dc10b1d9a1b9861cbf38763a4aee24aa1870de2 GIT binary patch literal 2367 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
(this) + view_as
(offset), type)); + } + + public void Set( int offset, any data, NumberType type = NumberType_Int32 ) + { + StoreToAddress(view_as
(this) + view_as
(offset), data, type); + } + + /* Action members */ + + /* Return parent action */ + property BehaviorAction Parent + { + public native get(); + } + + /* Return child action */ + property BehaviorAction Child + { + public native get(); + } + + /* Return Under action */ + /* if we are suspender then this will return a suspended action */ + property BehaviorAction Under + { + public native get(); + } + + /* Return Above action */ + /* if we are suspended action then this will return a suspender */ + property BehaviorAction Above + { + public native get(); + } + + /* Gets entity who owns this action */ + /* 0 will be returned if action is not started yet */ + property int Actor + { + public native get(); + } + + /* Used to determine whether an action has been suspended */ + property bool IsSuspended + { + public native get(); + public native set(bool suspended); + } + + /* Used to determine whether an action has been started (OnStart has already been called)*/ + property bool IsStarted + { + public native get(); + public native set(bool started); + } + + /* Event Handlers */ + + property Function OnStart + { + public native set(Function func); + } + + property Function OnUpdate + { + public native set(Function func); + } + + property Function OnEnd + { + public native set(Function func); + } + + property Function OnSuspend + { + public native set(Function func); + } + + property Function OnResume + { + public native set(Function func); + } + + property Function OnInitialContainedAction + { + public native set(Function func); + } + + property Function OnLeaveGround + { + public native set(Function func); + } + + property Function OnLandOnGround + { + public native set(Function func); + } + + property Function OnContact + { + public native set(Function func); + } + + property Function OnMoveToSuccess + { + public native set(Function func); + } + + property Function OnMoveToFailure + { + public native set(Function func); + } + + property Function OnStuck + { + public native set(Function func); + } + + property Function OnUnStuck + { + public native set(Function func); + } + + property Function OnPostureChanged + { + public native set(Function func); + } + + property Function OnAnimationActivityComplete + { + public native set(Function func); + } + + property Function OnAnimationActivityInterrupted + { + public native set(Function func); + } + + property Function OnAnimationEvent + { + public native set(Function func); + } + + property Function OnIgnite + { + public native set(Function func); + } + + property Function OnInjured + { + public native set(Function func); + } + + property Function OnKilled + { + public native set(Function func); + } + + property Function OnOtherKilled + { + public native set(Function func); + } + + property Function OnSight + { + public native set(Function func); + } + + property Function OnLostSight + { + public native set(Function func); + } + + property Function OnThreatChanged + { + public native set(Function func); + } + + property Function OnSound + { + public native set(Function func); + } + + property Function OnSpokeConcept + { + public native set(Function func); + } + + property Function OnNavAreaChanged + { + public native set(Function func); + } + + property Function OnModelChanged + { + public native set(Function func); + } + + property Function OnPickUp + { + public native set(Function func); + } + + property Function OnShoved + { + public native set(Function func); + } + + property Function OnBlinded + { + public native set(Function func); + } + + property Function OnEnteredSpit + { + public native set(Function func); + } + + property Function OnHitByVomitJar + { + public native set(Function func); + } + + property Function OnCommandAttack + { + public native set(Function func); + } + + property Function OnCommandAssault + { + public native set(Function func); + } + + property Function OnCommandApproachV + { + public native set(Function func); + } + + property Function OnCommandApproachE + { + public native set(Function func); + } + + property Function OnCommandRetreat + { + public native set(Function func); + } + + property Function OnCommandPause + { + public native set(Function func); + } + + property Function OnCommandResume + { + public native set(Function func); + } + + property Function OnCommandString + { + public native set(Function func); + } + + property Function IsAbleToBlockMovementOf + { + public native set(Function func); + } + + /**************************/ + /* POST CALLBACKS SETTERS */ + /**************************/ + + property Function OnStartPost + { + public native set(Function func); + } + + property Function OnUpdatePost + { + public native set(Function func); + } + + property Function OnEndPost + { + public native set(Function func); + } + + property Function OnSuspendPost + { + public native set(Function func); + } + + property Function OnResumePost + { + public native set(Function func); + } + + property Function OnInitialContainedActionPost + { + public native set(Function func); + } + + property Function OnLeaveGroundPost + { + public native set(Function func); + } + + property Function OnLandOnGroundPost + { + public native set(Function func); + } + + property Function OnContactPost + { + public native set(Function func); + } + + property Function OnMoveToSuccessPost + { + public native set(Function func); + } + + property Function OnMoveToFailurePost + { + public native set(Function func); + } + + property Function OnStuckPost + { + public native set(Function func); + } + + property Function OnUnStuckPost + { + public native set(Function func); + } + + property Function OnPostureChangedPost + { + public native set(Function func); + } + + property Function OnAnimationActivityCompletePost + { + public native set(Function func); + } + + property Function OnAnimationActivityInterruptedPost + { + public native set(Function func); + } + + property Function OnAnimationEventPost + { + public native set(Function func); + } + + property Function OnIgnitePost + { + public native set(Function func); + } + + property Function OnInjuredPost + { + public native set(Function func); + } + + property Function OnKilledPost + { + public native set(Function func); + } + + property Function OnOtherKilledPost + { + public native set(Function func); + } + + property Function OnSightPost + { + public native set(Function func); + } + + property Function OnLostSightPost + { + public native set(Function func); + } + + property Function OnThreatChangedPost + { + public native set(Function func); + } + + property Function OnSoundPost + { + public native set(Function func); + } + + property Function OnSpokeConceptPost + { + public native set(Function func); + } + + property Function OnNavAreaChangedPost + { + public native set(Function func); + } + + property Function OnModelChangedPost + { + public native set(Function func); + } + + property Function OnPickUpPost + { + public native set(Function func); + } + + property Function OnShovedPost + { + public native set(Function func); + } + + property Function OnBlindedPost + { + public native set(Function func); + } + + property Function OnEnteredSpitPost + { + public native set(Function func); + } + + property Function OnHitByVomitJarPost + { + public native set(Function func); + } + + property Function OnCommandAttackPost + { + public native set(Function func); + } + + property Function OnCommandAssaultPost + { + public native set(Function func); + } + + property Function OnCommandApproachVPost + { + public native set(Function func); + } + + property Function OnCommandApproachEPost + { + public native set(Function func); + } + + property Function OnCommandRetreatPost + { + public native set(Function func); + } + + property Function OnCommandPausePost + { + public native set(Function func); + } + + property Function OnCommandResumePost + { + public native set(Function func); + } + + property Function OnCommandStringPost + { + public native set(Function func); + } + + property Function IsAbleToBlockMovementOfPost + { + public native set(Function func); + } +}; + +methodmap BehaviorActionCustom < BehaviorAction +{ + public static native BehaviorActionCustom Create(const char[] name); + // public native BehaviorActionCustom Delete(); + + property Function OnStartPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnUpdatePost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnEndPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnSuspendPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnResumePost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnInitialContainedActionPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnLeaveGroundPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnLandOnGroundPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnContactPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnMoveToSuccessPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnMoveToFailurePost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnStuckPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnUnStuckPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnPostureChangedPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnAnimationActivityCompletePost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnAnimationActivityInterruptedPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnAnimationEventPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnIgnitePost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnInjuredPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnKilledPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnOtherKilledPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnSightPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnLostSightPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnThreatChangedPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnSoundPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnSpokeConceptPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnNavAreaChangedPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnModelChangedPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnPickUpPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnShovedPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnBlindedPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnEnteredSpitPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnHitByVomitJarPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnCommandAttackPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnCommandAssaultPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnCommandApproachVPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnCommandApproachEPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnCommandRetreatPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnCommandPausePost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnCommandResumePost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function OnCommandStringPost + { + public get() + { + return INVALID_FUNCTION; + } + } + + property Function IsAbleToBlockMovementOfPost + { + public get() + { + return INVALID_FUNCTION; + } + } +} \ No newline at end of file diff --git a/scripting/l4d2_special_control.sp b/scripting/l4d2_special_control.sp new file mode 100644 index 0000000..b23b18d --- /dev/null +++ b/scripting/l4d2_special_control.sp @@ -0,0 +1,164 @@ +#pragma semicolon 1 +#pragma newdecls required + +#define DEBUG 1 + +#define PLUGIN_VERSION "1.0" + +#include +#include +#include +//#include + +#define SPECIAL_COUNT 8 + +char SPECIAL_NAMES[SPECIAL_COUNT][] = { + "Smoker", "Boomer", "Hunter", "Spitter", "Jockey", "Charger", "Witch", "Tank" +}; + + +enum SpecialSpawnType { + SpawnType_Vanilla, + SpawnType_GroupsOf4, + SpawnType_Constant +} + +enum SpecialType { + Special_Invalid = -1, + Special_Smoker = 1, + Special_Boomer, + Special_Hunter, + Special_Spitter, + Special_Jockey, + Special_Charger, + Special_Witch, + Special_Tank +} + + +// Changeable settings +#define MIN_SPAWN_DURATION 200 + +public Plugin myinfo = +{ + name = "L4D2 Special Control", + author = "jackzmc", + description = "", + version = PLUGIN_VERSION, + url = "" +}; + +ConVar cvar_MinPlayersNeeded, cvar_SpawnMode; + +int extraSpecialCount = 1; // 4 + X + +float specialTimers[SPECIAL_COUNT]; + +public void OnPluginStart() { + EngineVersion g_Game = GetEngineVersion(); + if(g_Game != Engine_Left4Dead && g_Game != Engine_Left4Dead2) { + SetFailState("This plugin is for L4D/L4D2 only."); + } + + cvar_MinPlayersNeeded = CreateConVar("l4d_spc_minplayers", "5", "Minimum number of players needed to enable special control.", FCVAR_NONE, true, 1.0); + cvar_SpawnMode = CreateConVar("l4d_spc_spawn_mode", "0", "Controls how the specials will be spawned.\n0 = Vanilla Timing, 1 = ", FCVAR_NONE, true, 1.0); + + CreateTimer(30.0, SpawnTimer, _, TIMER_REPEAT); + CreateTimer(1.0, DebugTimer, _, TIMER_REPEAT); +} + +public Action DebugTimer(Handle h) { + static char buffer[512]; + static bool a; + int start = a ? 5 : 1; + int end = a ? 7 : 4; + buffer[0] = '\0'; + for(int i = 1; i < 6; i++) { + Format(buffer, sizeof(buffer), "%s\n%s: %f (raw %.0f)", buffer, SPECIAL_NAMES[i], specialTimers[i], GetGameTime() - specialTimers[i]); + } + a = !a; + PrintCenterTextAll(buffer); + return Plugin_Continue; +} + +public Action SpawnTimer(Handle h) { + SpecialType special = GetNextPendingSpecial(); + if(special != Special_Invalid) { + int victim = FindSuitableVictim(); + specialTimers[view_as(special) - 1] = GetGameTime(); + SpawnAutoSpecialOnPlayer(special, victim); + } + return Plugin_Continue; +} + +int FindSuitableVictim() { + float distance; + int victim = -1; + for(int i = 1; i <= MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i)) { + if(GetRandomFloat() < 0.1) continue; //10% to skip + float flow = L4D2Direct_GetFlowDistance(i); + if(flow > distance || victim == -1) { + flow = distance; + victim = i; + } + } + } + Debug("Found victim: %N (flow %f)", victim, distance); + return victim; +} + +SpecialType GetNextPendingSpecial() { + float time = GetGameTime(); + int specialId = -1; + float spTime; + for(int i = 1; i < SPECIAL_COUNT; i++) { + if(time - specialTimers[i] > MIN_SPAWN_DURATION && (specialTimers[i] < spTime || specialId == -1)) { + specialId = i; + spTime = specialTimers[i]; + } + } + Debug("Found next special: %s (rel %f)", SPECIAL_NAMES[specialId-1], GetGameTime() - spTime); + return view_as(specialId); +} + + +public void SpawnAutoSpecialOnPlayer(SpecialType type, int target) { + int bot = CreateFakeClient("SpecialControlBot"); + if (bot != 0) { + ChangeClientTeam(bot, 3); + CreateTimer(0.1, Timer_KickBot, bot); + } + int index = view_as(type) - 1; + Debug("Spawning special %s on %N", SPECIAL_NAMES[index], target); + CheatCommand(target, "z_spawn_old", SPECIAL_NAMES[index], "auto"); +} + +stock Action Timer_KickBot(Handle timer, int client) { + if (IsClientInGame(client) && (!IsClientInKickQueue(client))) { + if (IsFakeClient(client)) KickClient(client); + } +} + +stock void CheatCommand(int client, const char[] command, const char[] argument1, const char[] argument2) { + int userFlags = GetUserFlagBits(client); + SetUserFlagBits(client, ADMFLAG_ROOT); + int flags = GetCommandFlags(command); + SetCommandFlags(command, flags & ~FCVAR_CHEAT); + FakeClientCommand(client, "%s %s %s", command, argument1, argument2); + SetCommandFlags(command, flags); + SetUserFlagBits(client, userFlags); +} + + +stock void Debug(const char[] format, any ...) { + #if defined DEBUG + char buffer[192]; + + VFormat(buffer, sizeof(buffer), format, 2); + + PrintToServer("[SpecialControl] %s", buffer); + PrintToConsoleAll("[SpecialControl] %s", buffer); + + #endif +} \ No newline at end of file