diff --git a/leader2/configs/leader/leaders.ini b/leader2/configs/leader/leaders.ini new file mode 100644 index 00000000..f6057827 --- /dev/null +++ b/leader2/configs/leader/leaders.ini @@ -0,0 +1,3 @@ +"STEAM_0:0:22286324" // rogan +"STEAM_0:1:32247009" // neon +"STEAM_0:1:39773416" // omar diff --git a/leader2/scripting/leader2.sp b/leader2/scripting/leader2.sp index 1a46a0e7..a9afbb4c 100644 --- a/leader2/scripting/leader2.sp +++ b/leader2/scripting/leader2.sp @@ -6,7 +6,8 @@ #include #include -#define PLUGIN_VERSION "2.9" +#define PLUGIN_VERSION "3.0" +#define MAXLEADERS 64 #pragma newdecls required int leaderMVP, leaderScore, currentSprite = -1, spriteEntities[MAXPLAYERS+1], markerEntities[MAXPLAYERS+1], leaderClient = -1; @@ -26,6 +27,8 @@ char DefendVTF[PLATFORM_MAX_PATH]; char FollowVMT[PLATFORM_MAX_PATH]; char FollowVTF[PLATFORM_MAX_PATH]; char leaderTag[64]; +char g_sDataFile[128]; +char g_sLeaderAuth[MAXLEADERS][64]; int g_BeamSprite = -1; int g_HaloSprite = -1; @@ -33,16 +36,24 @@ int greyColor[4] = {128, 128, 128, 255}; int g_BeaconSerial[MAXPLAYERS+1] = { 0, ... }; int g_Serial_Gen = 0; +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public Plugin myinfo = { name = "Leader", - author = "AntiTeal", + author = "AntiTeal + Neon", description = "Allows for a human to be a leader, and give them special functions with it.", version = PLUGIN_VERSION, url = "https://antiteal.com" }; +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void OnPluginStart() { + BuildPath(Path_SM, g_sDataFile, sizeof(g_sDataFile), "configs/leader/leaders.ini"); + CreateConVar("sm_leader_version", PLUGIN_VERSION, "Leader Version", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY); LoadTranslations("common.phrases"); LoadTranslations("core.phrases"); @@ -53,8 +64,10 @@ public void OnPluginStart() RegConsoleCmd("sm_leader", Leader); RegConsoleCmd("sm_currentleader", CurrentLeader); + RegConsoleCmd("sm_leaders", Leaders); RegConsoleCmd("sm_voteleader", VoteLeader); RegAdminCmd("sm_removeleader", RemoveTheLeader, ADMFLAG_GENERIC); + RegAdminCmd("sm_reloadleaders", ReloadLeaders, ADMFLAG_GENERIC); g_cVDefendVMT = CreateConVar("sm_leader_defend_vmt", "materials/sg/sgdefend.vmt", "The defend here .vmt file"); g_cVDefendVTF = CreateConVar("sm_leader_defend_vtf", "materials/sg/sgdefend.vtf", "The defend here .vtf file"); @@ -113,8 +126,24 @@ public void OnPluginStart() AddCommandListener(Radio, "getout"); AddCommandListener(Radio, "negative"); AddCommandListener(Radio, "enemydown"); + + AddMultiTargetFilter("@leaders", Filter_Leaders, "Possible Leaders", false); + AddMultiTargetFilter("@leader", Filter_Leader, "Current Leader", false); } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnPluginEnd() +{ + RemoveMultiTargetFilter("@leaders", Filter_Leaders); + RemoveMultiTargetFilter("@leader", Filter_Leader); + +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void ConVarChange(ConVar CVar, const char[] oldVal, const char[] newVal) { g_cVDefendVTF.GetString(DefendVTF, sizeof(DefendVTF)); @@ -135,6 +164,9 @@ public void ConVarChange(ConVar CVar, const char[] oldVal, const char[] newVal) allowVoting = g_cVAllowVoting.BoolValue; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void OnMapStart() { AddFileToDownloadsTable(DefendVTF); @@ -163,14 +195,22 @@ public void OnMapStart() { g_HaloSprite = PrecacheModel(buffer); } + + UpdateLeaders(); } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void CreateBeacon(int client) { g_BeaconSerial[client] = ++g_Serial_Gen; CreateTimer(1.0, Timer_Beacon, client | (g_Serial_Gen << 7), TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void KillBeacon(int client) { g_BeaconSerial[client] = 0; @@ -181,6 +221,9 @@ public void KillBeacon(int client) } } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void KillAllBeacons() { for (int i = 1; i <= MaxClients; i++) @@ -189,6 +232,9 @@ public void KillAllBeacons() } } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void PerformBeacon(int client) { if (g_BeaconSerial[client] == 0) @@ -203,6 +249,9 @@ public void PerformBeacon(int client) } } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public Action Timer_Beacon(Handle timer, any value) { int client = value & 0x7f; @@ -238,6 +287,9 @@ public Action Timer_Beacon(Handle timer, any value) return Plugin_Continue; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public int AttachSprite(int client, char[] sprite) //https://forums.alliedmods.net/showpost.php?p=1880207&postcount=5 { if(!IsPlayerAlive(client)) @@ -274,6 +326,9 @@ public int AttachSprite(int client, char[] sprite) //https://forums.alliedmods.n return Ent; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void RemoveSprite(int client) { if (spriteEntities[client] != -1 && IsValidEdict(spriteEntities[client])) @@ -286,6 +341,9 @@ public void RemoveSprite(int client) spriteEntities[client] = -1; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void RemoveMarker(int client) { if (markerEntities[client] != -1 && IsValidEdict(markerEntities[client])) @@ -298,6 +356,9 @@ public void RemoveMarker(int client) markerEntities[client] = -1; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void SetLeader(int client) { if(IsValidClient(leaderClient)) @@ -323,6 +384,9 @@ public void SetLeader(int client) } } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void RemoveLeader(int client) { //CS_SetClientClanTag(client, leaderTag); @@ -343,6 +407,9 @@ public void RemoveLeader(int client) beaconActive = false; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public int SpawnMarker(int client, char[] sprite) { if(!IsPlayerAlive(client)) @@ -369,6 +436,9 @@ public int SpawnMarker(int client, char[] sprite) return Ent; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public Action CurrentLeader(int client, int args) { if(IsValidClient(leaderClient)) @@ -383,6 +453,9 @@ public Action CurrentLeader(int client, int args) } } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public Action RemoveTheLeader(int client, int args) { if(IsValidClient(leaderClient)) @@ -398,6 +471,9 @@ public Action RemoveTheLeader(int client, int args) } } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public Action Leader(int client, int args) { if(CheckCommandAccess(client, "sm_admin", ADMFLAG_GENERIC, false)) @@ -415,6 +491,7 @@ public Action Leader(int client, int args) if(target == leaderClient) { LeaderMenu(target); + return Plugin_Handled; } else { @@ -424,10 +501,12 @@ public Action Leader(int client, int args) PrintToChatAll("[SM] %N is the new leader!", target); PrintToChat(target, "[SM] You are now the leader! Type !leader to open up the leader menu."); LeaderMenu(target); + return Plugin_Handled; } else { ReplyToCommand(client, "[SM] The target has to be alive!"); + return Plugin_Handled; } } } @@ -444,24 +523,201 @@ public Action Leader(int client, int args) PrintToChatAll("[SM] %N is the new leader!", client); PrintToChat(client, "[SM] You are now the leader! Type !leader to open up the leader menu."); LeaderMenu(client); + return Plugin_Handled; } else { ReplyToCommand(client, "[SM] The target has to be alive!"); + return Plugin_Handled; } } else { ReplyToCommand(client, "[SM] Usage: sm_leader "); + return Plugin_Handled; + } + } + + if (IsPossibleLeader(client)) + { + if(client == leaderClient) + { + LeaderMenu(client); + return Plugin_Handled; + } + if(IsPlayerAlive(client)) + { + SetLeader(client); + PrintToChatAll("[SM] %N is the new leader!", client); + PrintToChat(client, "[SM] You are now the leader! Type !leader to open up the leader menu."); + LeaderMenu(client); + return Plugin_Handled; + } + else + { + ReplyToCommand(client, "[SM] The target has to be alive!"); + return Plugin_Handled; } } if(client == leaderClient) { LeaderMenu(client); + return Plugin_Handled; } return Plugin_Handled; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action Leaders(int client, int args) +{ + char aBuf[1024]; + char aBuf2[MAX_NAME_LENGTH]; + for(int i = 1; i <= MaxClients; i++) + { + if(IsClientInGame(i) && !IsFakeClient(i) && IsPossibleLeader(i)) + { + GetClientName(i, aBuf2, sizeof(aBuf2)); + StrCat(aBuf, sizeof(aBuf), aBuf2); + StrCat(aBuf, sizeof(aBuf), ", "); + } + } + + if(strlen(aBuf)) + { + aBuf[strlen(aBuf) - 2] = 0; + ReplyToCommand(client, "[SM] Possible Leaders currently online: %s", aBuf); + } + else + ReplyToCommand(client, "[SM] Possible Leaders currently online: none"); + + return Plugin_Handled; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action ReloadLeaders(int client, int args) +{ + UpdateLeaders(); + ReplyToCommand(client, "[SM] Reloaded Leader File"); + return Plugin_Handled; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public bool Filter_Leaders(const char[] sPattern, Handle hClients) +{ + for(int i = 1; i <= MaxClients; i++) + { + if(IsClientInGame(i) && !IsFakeClient(i) && IsPossibleLeader(i)) + { + PushArrayCell(hClients, i); + } + } + return true; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public bool Filter_Leader(const char[] sPattern, Handle hClients) +{ + if(IsValidClient(leaderClient)) + { + PushArrayCell(hClients, leaderClient); + return true; + } + return false; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public bool IsPossibleLeader(int client) +{ + char sAuth[64]; + GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth)); + + for (int i = 0; i <= (MAXLEADERS - 1); i++) + { + if (StrEqual(sAuth, g_sLeaderAuth[i])) + return true; + } + return false; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void UpdateLeaders() +{ + for (int i = 0; i <= (MAXLEADERS - 1); i++) + g_sLeaderAuth[i] = ""; + + File fFile = OpenFile(g_sDataFile, "rt"); + if (!fFile) + { + SetFailState("Could not read from: %s", g_sDataFile); + return; + } + + char sAuth[64]; + int iIndex = 0; + + while (!fFile.EndOfFile()) + { + char line[255]; + if (!fFile.ReadLine(line, sizeof(line))) + break; + + /* Trim comments */ + int len = strlen(line); + bool ignoring = false; + for (int i=0; i MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client))) @@ -743,6 +1033,9 @@ bool IsValidClient(int client, bool nobots = true) return IsClientInGame(client); } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public Action Event_RoundEnd(Handle event, char[] name, bool dontBroadcast) { if(IsValidClient(leaderClient)) @@ -753,6 +1046,9 @@ public Action Event_RoundEnd(Handle event, char[] name, bool dontBroadcast) KillAllBeacons(); } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public Action HookPlayerChat(int client, char[] command, int args) { if(IsValidClient(client) && leaderClient == client) @@ -773,6 +1069,9 @@ public Action HookPlayerChat(int client, char[] command, int args) return Plugin_Continue; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { CreateNative("Leader_CurrentLeader", Native_CurrentLeader); @@ -780,16 +1079,25 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max return APLRes_Success; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public int Native_CurrentLeader(Handle plugin, int numParams) { return leaderClient; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public int Native_SetLeader(Handle plugin, int numParams) { SetLeader(GetNativeCell(1)); } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public Action Radio(int client, const char[] command, int argc) { if(client == leaderClient) @@ -821,6 +1129,9 @@ public Action Radio(int client, const char[] command, int argc) return Plugin_Continue; } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void PrintRadio(int client, char[] text) { char szClantag[32], szMessage[64]; @@ -830,6 +1141,9 @@ public void PrintRadio(int client, char[] text) PrintToChatAll(szMessage); } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public Action VoteLeader(int client, int argc) { if(!allowVoting) @@ -886,4 +1200,4 @@ public Action VoteLeader(int client, int argc) } return Plugin_Handled; -} +} \ No newline at end of file