l4d2_autobotcrown: Minor tweaks

This commit is contained in:
Jackzie 2021-02-08 11:35:32 -06:00
parent 157e450907
commit 2ae3fd4ec8
No known key found for this signature in database
GPG key ID: 1E834FE36520537A
2 changed files with 25 additions and 9 deletions

Binary file not shown.

View file

@ -5,7 +5,7 @@
//#define DEBUG 0 //#define DEBUG 0
#define SCAN_INTERVAL 5.0 #define SCAN_INTERVAL 4.0
#define SCAN_RANGE 750.0 #define SCAN_RANGE 750.0
#define ACTIVE_INTERVAL 0.4 #define ACTIVE_INTERVAL 0.4
@ -78,7 +78,7 @@ public void OnPluginStart()
RegAdminCmd("sm_ws", Cmd_Status, ADMFLAG_ROOT); RegAdminCmd("sm_ws", Cmd_Status, ADMFLAG_ROOT);
} }
public Action Cmd_Status(int client, int args) { public Action Cmd_Status(int client, int args) {
ReplyToCommand(client, "Scan Timer: %b | Active: %b | In Position %b | Witches %d", timer != INVALID_HANDLE, AutoCrownBot > -1, AutoCrownInPosition, WitchList.Length); ReplyToCommand(client, "Scan Timer: %b | Active: %b | In Position %b | Witches %d | Bot %N", timer != INVALID_HANDLE, AutoCrownBot > -1, AutoCrownInPosition, WitchList.Length, GetClientOfUserId(AutoCrownBot));
return Plugin_Handled; return Plugin_Handled;
} }
public void Event_DifficultyChanged(Event event, const char[] name, bool dontBroadcast) { public void Event_DifficultyChanged(Event event, const char[] name, bool dontBroadcast) {
@ -91,11 +91,13 @@ public void Event_DifficultyChanged(Event event, const char[] name, bool dontBro
} }
}else{ }else{
CloseHandle(timer); CloseHandle(timer);
timer = INVALID_HANDLE;
} }
} }
public void Change_Gamemode(ConVar convar, const char[] oldValue, const char[] newValue) { public void Change_Gamemode(ConVar convar, const char[] oldValue, const char[] newValue) {
if(StrEqual(newValue, "realism")) { if(StrEqual(newValue, "realism")) {
CloseHandle(timer); CloseHandle(timer);
timer = INVALID_HANDLE;
} }
} }
@ -137,12 +139,13 @@ public Action Timer_Active(Handle hdl) {
#if defined DEBUG #if defined DEBUG
PrintToServer("No witches detected, ending timer"); PrintToServer("No witches detected, ending timer");
#endif #endif
timer = INVALID_HANDLE;
return Plugin_Stop; return Plugin_Stop;
} }
//TODO: Also check if startled and cancel it immediately. //TODO: Also check if startled and cancel it immediately.
if(AutoCrownBot > -1) { if(AutoCrownBot > -1) {
int client = GetClientOfUserId(AutoCrownBot); int client = GetClientOfUserId(AutoCrownBot);
if(!IsValidEntity(AutoCrownTarget)) { if(!IsValidEntity(AutoCrownTarget) || IsPlayerIncapped(client)) {
ResetAutoCrown(); ResetAutoCrown();
#if defined DEBUG #if defined DEBUG
@ -150,14 +153,22 @@ public Action Timer_Active(Handle hdl) {
#endif #endif
return Plugin_Stop; return Plugin_Stop;
}else if(client <= 0 || !IsClientConnected(client) || !IsClientInGame(client) || !IsPlayerAlive(client)) { }else if(client <= 0 || !IsClientConnected(client) || !IsClientInGame(client) || !IsPlayerAlive(client)) {
AutoCrownBot = -1; ResetAutoCrown();
AutoCrownTarget = -1;
#if defined DEBUG #if defined DEBUG
PrintToServer("Could not find valid AutoCrownBot"); PrintToServer("Could not find valid AutoCrownBot");
#endif #endif
return Plugin_Stop; return Plugin_Stop;
} }
char wpn[32];
if(!GetClientWeapon(client, wpn, sizeof(wpn)) || !StrEqual(wpn, "weapon_autoshotgun") && !StrEqual(wpn, "weapon_shotgun_spas")) {
ResetAutoCrown();
#if defined DEBUG
PrintToServer("AutoCrownBot does not have a valid weapon (%s)", wpn);
#endif
return Plugin_Stop;
}
GetEntPropVector(AutoCrownTarget, Prop_Send, "m_vecOrigin", witchPos); GetEntPropVector(AutoCrownTarget, Prop_Send, "m_vecOrigin", witchPos);
GetClientAbsOrigin(client, botPosition); GetClientAbsOrigin(client, botPosition);
@ -189,14 +200,12 @@ public Action Timer_Scan(Handle hdl) {
#endif #endif
return Plugin_Stop; return Plugin_Stop;
} }
for(int bot = 1; bot < MaxClients+1; bot++) { for(int bot = 1; bot <= MaxClients; bot++) {
if(IsClientConnected(bot) && IsClientInGame(bot) && IsFakeClient(bot) && IsPlayerAlive(bot)) { if(IsClientConnected(bot) && IsClientInGame(bot) && IsFakeClient(bot) && IsPlayerAlive(bot)) {
//Check if bot has a valid shotgun, with ammo (probably can skip: bot mostly will be full). //Check if bot has a valid shotgun, with ammo (probably can skip: bot mostly will be full).
if(GetClientHealth(bot) > 40) { if(GetClientHealth(bot) > 40) {
char wpn[32]; char wpn[32];
if(GetClientWeapon(bot, wpn, sizeof(wpn)) && if(GetClientWeapon(bot, wpn, sizeof(wpn)) && (StrEqual(wpn, "weapon_autoshotgun") || StrEqual(wpn, "weapon_shotgun_spas"))) {
StrEqual(wpn, "weapon_autoshotgun") || StrEqual(wpn, "weapon_shotgun_spas")
) {
GetClientAbsOrigin(bot, botPosition); GetClientAbsOrigin(bot, botPosition);
for(int i = 0; i < WitchList.Length; i++) { for(int i = 0; i < WitchList.Length; i++) {
@ -208,12 +217,14 @@ public Action Timer_Scan(Handle hdl) {
//TODO: Implement a line-of-sight trace //TODO: Implement a line-of-sight trace
#if defined DEBUG #if defined DEBUG
PrintToServer("Found a valid witch in range of %N: %d", bot, witchID); PrintToServer("Found a valid witch in range of %N: %d", bot, witchID);
PrintToChatAll("Found a valid witch in range of %N: %d", bot, witchID);
#endif #endif
L4D2_RunScript("CommandABot({cmd=1,bot=GetPlayerFromUserID(%i),pos=Vector(%f,%f,%f)})", GetClientUserId(bot), witchPos[0], witchPos[1], witchPos[2]); L4D2_RunScript("CommandABot({cmd=1,bot=GetPlayerFromUserID(%i),pos=Vector(%f,%f,%f)})", GetClientUserId(bot), witchPos[0], witchPos[1], witchPos[2]);
AutoCrownTarget = witchID; AutoCrownTarget = witchID;
AutoCrownBot = GetClientUserId(bot); AutoCrownBot = GetClientUserId(bot);
AutoCrownInPosition = false; AutoCrownInPosition = false;
CreateTimer(ACTIVE_INTERVAL, Timer_Active, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); CreateTimer(ACTIVE_INTERVAL, Timer_Active, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
timer = INVALID_HANDLE;
return Plugin_Stop; return Plugin_Stop;
} }
} }
@ -244,6 +255,7 @@ public void ResetAutoCrown() {
if(AutoCrownBot > -1) if(AutoCrownBot > -1)
L4D2_RunScript("CommandABot({cmd=3,bot=GetPlayerFromUserID(%i)})", AutoCrownBot); L4D2_RunScript("CommandABot({cmd=3,bot=GetPlayerFromUserID(%i)})", AutoCrownBot);
AutoCrownBot = -1; AutoCrownBot = -1;
timer = INVALID_HANDLE;
} }
int GetDifficultyInt(const char[] type) { int GetDifficultyInt(const char[] type) {
@ -257,3 +269,7 @@ int GetDifficultyInt(const char[] type) {
return 1; return 1;
} }
} }
stock bool IsPlayerIncapped(int client) {
return GetEntProp(client, Prop_Send, "m_isIncapacitated") == 1;
}