From 8cc9632689d579c057ef5e84e7399f2d2d22ab4e Mon Sep 17 00:00:00 2001 From: Rushaway Date: Sat, 14 Feb 2026 13:40:07 +0100 Subject: [PATCH 1/3] refactor(core): simplify FreeVIP flow --- .../scripting/VIP_FreeVIPGiveaway.sp | 300 ++++++++---------- 1 file changed, 132 insertions(+), 168 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp b/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp index 6a47988..75a458c 100644 --- a/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp +++ b/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp @@ -2,78 +2,83 @@ #include #include -#include #include #include #include #pragma newdecls required -//ConVar g_Cvar_Duration; - /* CONVARS */ -ConVar +ConVar g_Cvar_MinPlayers, g_Cvar_VIPGroup, - g_Cvar_TestVIPGroup, + g_Cvar_TestVIPGroup, g_Cvar_Hostname, g_Cvar_HostNamePrefix, g_Cvar_FreeVIPStart, g_Cvar_FreeVIPEnd; -char +char g_sHostname[256], + g_sVIPGroup[32], + g_sTestVIPGroup[32], g_sHostnamePrefix[256]; - + +int + g_iMinPlayers, + g_iFreeVIPStart, + g_iFreeVIPEnd; + Cookie g_hCookie; + public Plugin myinfo = { name = "[VIP] Free VIP Giveaway", author = "inGame, maxime1907, Dolly", description = "Gives Free VIP for players that are active on server", - version = "2.1" + version = "3.0.0" }; public void OnPluginStart() { - g_Cvar_HostNamePrefix = CreateConVar("sm_freevip_hostname_prefix", "[Free VIP]", "Hostname prefix that will be displayed in server list"); - g_Cvar_MinPlayers = CreateConVar("sm_freevip_min_players", "0", "How many players should be on server to active Free VIP Giveaway. [0 = OnClientPostAdminCheck, 1-255 = OnRoundEnd]", FCVAR_NONE, true, 0.0, true, float(MAXPLAYERS)); - // g_Cvar_Duration = CreateConVar("sm_freevip_duration", "0", "For how many mins give Free VIP. [0 = Unlimited, 1-60 = minutes]", FCVAR_NONE, true, 0.0, true, 60.0); + g_Cvar_HostNamePrefix = CreateConVar("sm_freevip_hostname_prefix", "[Free VIP]", "Hostname prefix that will be displayed in server list"); + g_Cvar_MinPlayers = CreateConVar("sm_freevip_min_players", "0", "How many players should be on server to active Free VIP Giveaway. [-1 = Free VIP Disabled]", FCVAR_NONE, true, -1.0, true, float(MAXPLAYERS)); g_Cvar_VIPGroup = CreateConVar("sm_freevip_group", "VIP", "What VIP group set on player"); g_Cvar_FreeVIPStart = CreateConVar("sm_freevip_timestamp_start", "1669849200", "TimeStamp of the time that free vip will start at!"); g_Cvar_FreeVIPEnd = CreateConVar("sm_freevip_timestamp_end", "1672527600", "TimeStamp of the time that free vip will end at!"); + g_iMinPlayers = GetConVarInt(g_Cvar_MinPlayers); + g_iFreeVIPStart = GetConVarInt(g_Cvar_FreeVIPStart); + g_iFreeVIPEnd = GetConVarInt(g_Cvar_FreeVIPEnd); + + HookConVarChange(g_Cvar_MinPlayers, OnConVarChanged); + HookConVarChange(g_Cvar_VIPGroup, OnConVarChanged); + HookConVarChange(g_Cvar_FreeVIPStart, OnConVarChanged); + HookConVarChange(g_Cvar_FreeVIPEnd, OnConVarChanged); + g_Cvar_Hostname = FindConVar("hostname"); - g_hCookie = new Cookie("freevip_cookie", "Cookie to know who got his vip extended", CookieAccess_Public); - + g_hCookie = new Cookie("freevip_cookie", "Cookie to know who got his vip extended", CookieAccess_Protected); + RegConsoleCmd("sm_freevip", Command_FreeVIP, "Display FreeVIP Giveaway status."); HookEvent("round_start", Event_RoundStart); AutoExecConfig(); - - for(int i = 1; i <= MaxClients; i++) - { - if(!IsClientInGame(i)) - continue; - - if(!IsClientAuthorized(i)) - continue; - - VIP_OnClientLoaded(i); - } + + CreateTimer(2.0, CheckALLVIPPlayers); + CreateTimer(20.5, Timer_ReloadVIPs); } public APLRes AskPluginLoad2(Handle myself, bool bLate, char[] sError, int Err_max) { RegPluginLibrary("VIP_FreeVIPGiveaway"); - + CreateNative("FreeVIP_IsFreeVIPOn", Native_IsFreeVIPOn); CreateNative("FreeVIP_GetEndTimeStamp", Native_GetEndTimeStamp); CreateNative("FreeVIP_GetStartTimeStamp", Native_GetStartTimeStamp); - + return APLRes_Success; } @@ -84,17 +89,19 @@ int Native_IsFreeVIPOn(Handle plugin, int params) int Native_GetEndTimeStamp(Handle plugin, int params) { - return g_Cvar_FreeVIPEnd.IntValue; + return g_iFreeVIPEnd; } int Native_GetStartTimeStamp(Handle plugin, int params) { - return g_Cvar_FreeVIPStart.IntValue; + return g_iFreeVIPStart; } public void OnAllPluginsLoaded() { g_Cvar_TestVIPGroup = FindConVar("sm_vip_test_group"); + GetConVarString(g_Cvar_TestVIPGroup, g_sTestVIPGroup, sizeof(g_sTestVIPGroup)); + HookConVarChange(g_Cvar_TestVIPGroup, OnConVarChanged); } public void OnConfigsExecuted() @@ -104,159 +111,132 @@ public void OnConfigsExecuted() public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast) { - int freeVIPStart = g_Cvar_FreeVIPStart.IntValue; - int freeVipEnd = g_Cvar_FreeVIPEnd.IntValue; - - if(freeVIPStart > GetTime()) + if (!IsFreeVIPOn()) return; - if(freeVipEnd < GetTime()) - return; + int playersOnServer = GetRealPlayersOnServer(); + if (playersOnServer < g_iMinPlayers) + { + // remove temporary vip from players if not enough players + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientInGame(i) || IsFakeClient(i) || !VIP_IsClientVIP(i) || VIP_GetClientID(i) != -1 || VIP_GetClientVIPGroup(i, g_sTestVIPGroup, sizeof(g_sTestVIPGroup))) + continue; - int minPlayers = g_Cvar_MinPlayers.IntValue; - //int duration = GetConVarInt(g_Cvar_Duration); + VIP_RemoveClientVIP2(_, i, false, false); + } - if(minPlayers <= 0) + CPrintToChatAll("{green}[SM] {pink}Free VIP Giveaway {default}is {red}disabled{default}."); + CPrintToChatAll("{pink}Players on: {green}%d {pink}| Players required: {green}%d {pink}| Players needed: {red}+%d", playersOnServer, g_iMinPlayers, (g_iMinPlayers - playersOnServer)); return; + } - char vipGroup[16]; - g_Cvar_VIPGroup.GetString(vipGroup, sizeof(vipGroup)); - - char hostname[255]; - g_Cvar_Hostname.GetString(hostname, sizeof(hostname)); - - // if min players amount reached - int playersOnServer = GetClientCount(); - for(int i = 1; i <= MaxClients; i++) + for (int i = 1; i <= MaxClients; i++) { - if(i <= 0 || i > MaxClients || !IsClientConnected(i)) + if (!IsClientInGame(i) || IsClientSourceTV(i) || IsFakeClient(i) || VIP_IsClientVIP(i)) continue; - if (IsClientSourceTV(i)) - playersOnServer = playersOnServer - 1; // -1 cuz of sourcetv + VIP_GiveClientVIP(_, i, 0, g_sVIPGroup, false); } - if(playersOnServer >= minPlayers) - { - for(int i = 1; i <= MaxClients; i++) - { - if(!IsClientInGame(i)) - continue; - - if(GetClientTeam(i) == CS_TEAM_SPECTATOR || GetClientTeam(i) == CS_TEAM_NONE) - { - /* if player has vip and his vip is temporary and he is in spec - remove vip */ - if(VIP_IsClientVIP(i) && VIP_GetClientID(i) == -1) - VIP_RemoveClientVIP2(_, i, false, false); - - continue; - } + CPrintToChatAll("{green}[SM] {pink}Free VIP Giveaway is {green}enabled{pink}. Players got Free VIP."); +} - if(VIP_IsClientVIP(i)) - continue; +public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + if (convar == g_Cvar_MinPlayers) + g_iMinPlayers = GetConVarInt(convar); + else if (convar == g_Cvar_VIPGroup) + GetConVarString(g_Cvar_VIPGroup, g_sVIPGroup, sizeof(g_sVIPGroup)); + else if (convar == g_Cvar_TestVIPGroup) + GetConVarString(g_Cvar_TestVIPGroup, g_sTestVIPGroup, sizeof(g_sTestVIPGroup)); + else if (convar == g_Cvar_FreeVIPStart) + g_iFreeVIPStart = GetConVarInt(convar); + else if (convar == g_Cvar_FreeVIPEnd) + g_iFreeVIPEnd = GetConVarInt(convar); +} - VIP_GiveClientVIP(_, i, 0, vipGroup, false); - } +public Action Timer_ReloadVIPs(Handle timer) +{ + ServerCommand("sm_reloadvips"); + return Plugin_Continue; +} - // push chat message - CPrintToChatAll("[SM] {pink}Free VIP Giveaway {default}is {green}enabled{default}. {pink}Active players got Free VIP."); - } - else +Action CheckALLVIPPlayers(Handle timer) +{ + for (int i = 1; i <= MaxClients; i++) { - char testVipGroup[16]; - g_Cvar_TestVIPGroup.GetString(testVipGroup, sizeof(testVipGroup)); - - // remove temporary vip from players if not enough players - for(int i = 1; i <= MaxClients; i++) - { - if(!IsClientInGame(i) || IsFakeClient(i) || !VIP_IsClientVIP(i) || VIP_GetClientID(i) != -1 || VIP_GetClientVIPGroup(i, testVipGroup, sizeof(testVipGroup))) - continue; - - VIP_RemoveClientVIP2(_, i, false, false); - } + if (!IsClientInGame(i)) + continue; - int playersNeeded = minPlayers - playersOnServer; + if (!IsClientAuthorized(i)) + continue; - // push chat message - CPrintToChatAll("{green}[SM] {pink}Free VIP Giveaway {default}is {red}disabled{default}.\nPlayers on: {green}%d {default}| Players required: {green}%d {default}| Players needed: {green}+%d", playersOnServer, minPlayers, playersNeeded); + VIP_OnClientLoaded(i, (VIP_IsClientVIP(i)) ? true : false); } + + return Plugin_Continue; } -public void VIP_OnClientLoaded(int client) +public void VIP_OnClientLoaded(int client, bool isVIP) { - if(!IsFreeVIPOn()) + if (!IsFreeVIPOn()) { char cookieValue[6]; g_hCookie.Get(client, cookieValue, sizeof(cookieValue)); /* Set cookie to false in all clients when vip ends */ - if(StrEqual(cookieValue, "true")) + if (StrEqual(cookieValue, "true")) g_hCookie.Set(client, "false"); - + return; } - - if(IsClientSourceTV(client) || IsFakeClient(client)) + + if (IsClientSourceTV(client) || IsFakeClient(client)) return; - - if(!IsClientAuthorized(client)) + + if (!IsClientAuthorized(client)) return; - + GiveVIP(client); } void GiveVIP(int client) { - if(!IsFreeVIPOn()) - return; - - if(client < 1) + if (client < 1) return; - if(VIP_IsClientVIP(client)) + if (VIP_IsClientVIP(client)) { SetVIP(client); return; } - - char vipGroup[16]; - g_Cvar_VIPGroup.GetString(vipGroup, sizeof(vipGroup)); - VIP_GiveClientVIP(_, client, 0, vipGroup, false); - /* Give client the vip flags */ - int flags = GetUserFlagBits(client); - if(!(flags & ADMFLAG_CUSTOM1)) - SetUserFlagBits(client, flags | ADMFLAG_CUSTOM1); + + VIP_GiveClientVIP(_, client, 0, g_sVIPGroup, false); } void SetVIP(int client) { - if(!IsFreeVIPOn()) - return; - - if(client < 1) + if (client < 1) return; - if(!AreClientCookiesCached(client)) + if (!AreClientCookiesCached(client)) return; - + bool canGetVIP; char cookieValue[6]; g_hCookie.Get(client, cookieValue, sizeof(cookieValue)); - if(StrEqual(cookieValue, "true")) + if (StrEqual(cookieValue, "true")) canGetVIP = false; else canGetVIP = true; - if(!VIP_IsClientVIP(client) || VIP_GetClientID(client) == -1 || VIP_GetClientAccessTime(client) == 0) + if (!VIP_IsClientVIP(client) || VIP_GetClientID(client) == -1 || VIP_GetClientAccessTime(client) == 0) return; - - if(!canGetVIP) + + if (!canGetVIP) return; - - char vipGroup[16]; - g_Cvar_VIPGroup.GetString(vipGroup, sizeof(vipGroup)); - - int freeVipEnd = g_Cvar_FreeVIPEnd.IntValue; - int seconds = (freeVipEnd - GetTime()); + + int seconds = (g_iFreeVIPEnd - GetTime()); int originalExpireTimeStamp = VIP_GetClientAccessTime(client); int newExpireTimeStamp = (originalExpireTimeStamp + seconds); VIP_SetClientAccessTime(client, newExpireTimeStamp, true); @@ -266,13 +246,10 @@ void SetVIP(int client) public void OnClientDisconnect(int client) { - if(IsClientSourceTV(client) || IsFakeClient(client)) + if (IsClientSourceTV(client) || IsFakeClient(client)) return; - char testVipGroup[16]; - g_Cvar_TestVIPGroup.GetString(testVipGroup, sizeof(testVipGroup)); - - if(!VIP_IsClientVIP(client) || VIP_GetClientID(client) != -1 || VIP_GetClientVIPGroup(client, testVipGroup, sizeof(testVipGroup))) + if (!VIP_IsClientVIP(client) || VIP_GetClientID(client) != -1 || VIP_GetClientVIPGroup(client, g_sTestVIPGroup, sizeof(g_sTestVIPGroup))) return; VIP_RemoveClientVIP2(_, client, false, false); @@ -280,48 +257,28 @@ public void OnClientDisconnect(int client) Action Command_FreeVIP(int client, int args) { - int playersOnServer = GetClientCount(); - for(int i = 1; i <= MaxClients; i++) - { - if(i <= 0 || i > MaxClients || !IsClientConnected(i)) - continue; - - if (IsClientSourceTV(i)) - playersOnServer = playersOnServer - 1; // -1 cuz of sourcetv - } - int minPlayers = g_Cvar_MinPlayers.IntValue; - int freeVIPStart = g_Cvar_FreeVIPStart.IntValue; - int freeVipEnd = g_Cvar_FreeVIPEnd.IntValue; - - if(freeVIPStart > GetTime() || freeVipEnd < GetTime()) + if (!IsFreeVIPOn()) { CReplyToCommand(client, "{green}[SM] {pink}Free VIP Giveaway {default}is {red}disabled{default}."); return Plugin_Handled; } - if (playersOnServer >= minPlayers) + int playersOnServer = GetRealPlayersOnServer(); + if (playersOnServer < g_iMinPlayers) { - CReplyToCommand(client, "{green}[SM] {pink}Free VIP Giveaway {default}is {green}enabled{default}."); + CReplyToCommand(client, "{green}[SM] {pink}Free VIP Giveaway {default}is {red}disabled{default}."); + CReplyToCommand(client, "{pink}Players on: {green}%d {pink}| Players required: {green}%d {pink}| Players needed: {red}+%d", playersOnServer, g_iMinPlayers, (g_iMinPlayers - playersOnServer)); return Plugin_Handled; } - else - { - int playersNeeded = minPlayers - playersOnServer; - CReplyToCommand(client, "{green}[SM] {pink}Free VIP Giveaway {default}is {red}disabled{default}.\nPlayers on: {green}%d {default}| Players required: {green}%d {default}| Players needed: {green}+%d", playersOnServer, minPlayers, playersNeeded); - return Plugin_Handled; - } + CReplyToCommand(client, "{green}[SM] {pink}Free VIP Giveaway is {green}enabled{pink}. {green}Players got Free VIP."); + return Plugin_Handled; } void SetHostName() { - int freeVIPStart = g_Cvar_FreeVIPStart.IntValue; - int freeVipEnd = g_Cvar_FreeVIPEnd.IntValue; - - if(freeVIPStart > GetTime()) - return; - - if(freeVipEnd < GetTime()) + int iTime = GetTime(); + if (g_iFreeVIPStart > iTime || g_iFreeVIPEnd < iTime) return; g_Cvar_HostNamePrefix.GetString(g_sHostnamePrefix, sizeof(g_sHostnamePrefix)); @@ -333,17 +290,24 @@ void SetHostName() bool IsFreeVIPOn() { - int freeVIPStart = g_Cvar_FreeVIPStart.IntValue; - int freeVipEnd = g_Cvar_FreeVIPEnd.IntValue; - - if(freeVIPStart > GetTime()) + int iTime = GetTime(); + if (g_iFreeVIPStart > iTime || g_iFreeVIPEnd < iTime || g_iMinPlayers < 0) return false; - if(freeVipEnd < GetTime()) - return false; - - if(g_Cvar_MinPlayers.IntValue != 0) - return false; - return true; } + +stock int GetRealPlayersOnServer() +{ + int playersOnServer = GetClientCount(); + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientConnected(i)) + continue; + + if (IsClientSourceTV(i)) + playersOnServer--; + } + + return playersOnServer; +} \ No newline at end of file From 28a8b8066bc631e78581f3226d134358920c8877 Mon Sep 17 00:00:00 2001 From: Rushaway Date: Sat, 14 Feb 2026 14:31:34 +0100 Subject: [PATCH 2/3] minor adjustements --- addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp b/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp index 75a458c..398ed37 100644 --- a/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp +++ b/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp @@ -37,7 +37,7 @@ public Plugin myinfo = name = "[VIP] Free VIP Giveaway", author = "inGame, maxime1907, Dolly", description = "Gives Free VIP for players that are active on server", - version = "3.0.0" + version = "2.2.0" }; public void OnPluginStart() @@ -51,6 +51,7 @@ public void OnPluginStart() g_iMinPlayers = GetConVarInt(g_Cvar_MinPlayers); g_iFreeVIPStart = GetConVarInt(g_Cvar_FreeVIPStart); g_iFreeVIPEnd = GetConVarInt(g_Cvar_FreeVIPEnd); + GetConVarString(g_Cvar_VIPGroup, g_sVIPGroup, sizeof(g_sVIPGroup)); HookConVarChange(g_Cvar_MinPlayers, OnConVarChanged); HookConVarChange(g_Cvar_VIPGroup, OnConVarChanged); @@ -67,8 +68,8 @@ public void OnPluginStart() AutoExecConfig(); - CreateTimer(2.0, CheckALLVIPPlayers); - CreateTimer(20.5, Timer_ReloadVIPs); + CreateTimer(2.0, CheckALLVIPPlayers, _, TIMER_FLAG_NO_MAPCHANGE); + CreateTimer(20.5, Timer_ReloadVIPs, _, TIMER_FLAG_NO_MAPCHANGE); } public APLRes AskPluginLoad2(Handle myself, bool bLate, char[] sError, int Err_max) @@ -114,6 +115,9 @@ public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast) if (!IsFreeVIPOn()) return; + if (g_iMinPlayers <= 0) + return; + int playersOnServer = GetRealPlayersOnServer(); if (playersOnServer < g_iMinPlayers) { From 2c5c75076a085a971db761b28282fdfe022fb746 Mon Sep 17 00:00:00 2001 From: Rushaway Date: Sat, 14 Feb 2026 15:42:50 +0100 Subject: [PATCH 3/3] Stop VIP timers after execution --- addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp b/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp index 398ed37..f74c716 100644 --- a/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp +++ b/addons/sourcemod/scripting/VIP_FreeVIPGiveaway.sp @@ -163,7 +163,7 @@ public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] n public Action Timer_ReloadVIPs(Handle timer) { ServerCommand("sm_reloadvips"); - return Plugin_Continue; + return Plugin_Stop; } Action CheckALLVIPPlayers(Handle timer) @@ -179,7 +179,7 @@ Action CheckALLVIPPlayers(Handle timer) VIP_OnClientLoaded(i, (VIP_IsClientVIP(i)) ? true : false); } - return Plugin_Continue; + return Plugin_Stop; } public void VIP_OnClientLoaded(int client, bool isVIP)