From 82d16c163a069dfbb34953d187c8e26a63e2b6dd Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Thu, 8 Oct 2026 16:28:05 +0100 Subject: [PATCH] Couch/EventNotifier changes --- Couch/scripting/Couch.sp | 6 ++- Couch/scripting/CouchAdmin.sp | 13 +++--- .../scripting/EventNotifierAnnouncements.sp | 46 +++++++++++++++++-- 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/Couch/scripting/Couch.sp b/Couch/scripting/Couch.sp index 104773a..6abec09 100644 --- a/Couch/scripting/Couch.sp +++ b/Couch/scripting/Couch.sp @@ -639,12 +639,16 @@ bool IsClientRefused(int couch, int client, bool notify = true) return false; } -// Without the playtime plugin nobody is refused. +// Without the playtime plugin nobody is refused. Admins (ADMFLAG_GENERIC by default) skip the +// tier check; change who with an admin override on "sm_couch_tier_bypass". bool MeetsTier(int client, int required) { if (required <= 0) return true; + if (CheckCommandAccess(client, "sm_couch_tier_bypass", ADMFLAG_GENERIC)) + return true; + if (GetFeatureStatus(FeatureType_Native, "GetPlayerTier_native") != FeatureStatus_Available) return true; diff --git a/Couch/scripting/CouchAdmin.sp b/Couch/scripting/CouchAdmin.sp index b66b209..2676877 100644 --- a/Couch/scripting/CouchAdmin.sp +++ b/Couch/scripting/CouchAdmin.sp @@ -40,7 +40,7 @@ public void OnPluginStart() RegAdminCmd("sm_gotocouch", Command_GotoCouch, ADMFLAG_CHANGEMAP, "Teleports you to the couch"); RegAdminCmd("sm_removecouch", Command_RemoveCouch, ADMFLAG_CHANGEMAP, "Removes the couch"); RegAdminCmd("sm_couchpistolonly", Command_PistolOnly, ADMFLAG_CHANGEMAP, "sm_couchpistolonly [0|1] - only pistols and knives move the couch; no argument toggles"); - RegAdminCmd("sm_couchlog", Command_Log, ADMFLAG_CHANGEMAP, "sm_couchlog [0|1] - show who moves the couch and how in your console, grenades in chat too; no argument toggles"); + RegAdminCmd("sm_couchlog", Command_Log, ADMFLAG_CHANGEMAP, "sm_couchlog [0|1] - show who moves the couch and how in your console; no argument toggles"); } // Game time restarts with the map. @@ -314,7 +314,7 @@ void DoSetLogging(int client, bool bEnable) g_bLogging[client] = bEnable; if (bEnable) - PrintToChat(client, PREFIX ... "\x01Couch log \x04on\x01, see your console for who moves the couch and how. Grenades also show here."); + PrintToChat(client, PREFIX ... "\x01Couch log \x04on\x01, see your console for who moves the couch and how."); else PrintToChat(client, PREFIX ... "\x01Couch log \x04off\x01."); } @@ -325,6 +325,11 @@ void DoSetLogging(int client, bool bEnable) public void Couch_OnCouchInteraction(int couch, int client, CouchMethod method, const char[] weapon) { + // Grenades are rare and knock the couch far, so everyone is told. One blast is one report, so no + // rate limit is needed. The userid is there so an admin can put it straight into sm_couchban. + if (method == CouchMethod_Grenade) + PrintToChatAll("\x01[Couch] \x04%N\x01 (#%d) hit the couch with a \x04grenade", client, GetClientUserId(client)); + if (!AnyoneLogging()) return; @@ -354,7 +359,6 @@ public void Couch_OnCouchInteraction(int couch, int client, CouchMethod method, default: FormatEx(sHow, sizeof(sHow), "moved the couch with %s", weapon[0] != '\0' ? weapon : "something"); } - // Everything goes to the console; grenades are rare and knock the couch far, so they go to chat too. // The userid is there so it can go straight into sm_couchban. int userid = GetClientUserId(client); for (int i = 1; i <= MaxClients; i++) @@ -363,9 +367,6 @@ public void Couch_OnCouchInteraction(int couch, int client, CouchMethod method, continue; PrintToConsole(i, "[Couch] %N (#%d) %s", client, userid, sHow); - - if (method == CouchMethod_Grenade) - PrintToChat(i, "\x01[Couch] \x04%N\x01 (#%d) hit the couch with a \x04grenade", client, userid); } } diff --git a/EventNotifier/scripting/EventNotifierAnnouncements.sp b/EventNotifier/scripting/EventNotifierAnnouncements.sp index 523d6a3..a287109 100644 --- a/EventNotifier/scripting/EventNotifierAnnouncements.sp +++ b/EventNotifier/scripting/EventNotifierAnnouncements.sp @@ -45,7 +45,7 @@ public void OnPluginStart() AutoExecConfig(true, "EventNotifierAnnouncements"); - RegAdminCmd("sm_event_announce", Command_Announce, ADMFLAG_GENERIC, "Posts the next event announcement in chat now"); + RegAdminCmd("sm_event_announce", Command_Announce, ADMFLAG_GENERIC, "sm_event_announce [event number] - Posts an event announcement in chat now (next in rotation if no number given)"); } public void OnConfigsExecuted() @@ -80,10 +80,38 @@ public Action Timer_Announce(Handle timer) public Action Command_Announce(int client, int args) { - if (PostAnnouncement()) - ReplyToCommand(client, "[Events] Announcement posted."); + if (args < 1) + { + if (PostAnnouncement()) + ReplyToCommand(client, "[Events] Announcement posted."); + else + ReplyToCommand(client, "[Events] No upcoming events to announce."); + return Plugin_Handled; + } + + char arg[16]; + GetCmdArg(1, arg, sizeof(arg)); + + int number; + if (StringToIntEx(arg, number) != strlen(arg) || number <= 0) + { + ReplyToCommand(client, "[Events] Usage: sm_event_announce [event number]"); + return Plugin_Handled; + } + + int index = EventNotifier_FindEventByNumber(number); + if (index == -1) + { + ReplyToCommand(client, "[Events] Event #%d is not in the upcoming list.", number); + return Plugin_Handled; + } + + // Explicitly requested events are posted outside the rotation so the + // automatic announcements carry on where they left off. + if (AnnounceEvent(index)) + ReplyToCommand(client, "[Events] Announcement for event #%d posted.", number); else - ReplyToCommand(client, "[Events] No upcoming events to announce."); + ReplyToCommand(client, "[Events] Event #%d could not be announced.", number); return Plugin_Handled; } @@ -91,7 +119,8 @@ public Action Command_Announce(int client, int args) // Announcement // --------------------------------------------------------------------------- -// Posts one event from the rotation window. Returns false when there is nothing to post. +// Posts the next event from the rotation window and advances the rotation. +// Returns false when there is nothing to post. bool PostAnnouncement() { int count = EventNotifier_GetEventCount(); @@ -105,6 +134,13 @@ bool PostAnnouncement() int index = g_iRotation % window; g_iRotation = (index + 1) % window; + return AnnounceEvent(index); +} + +// Posts the event at the given list index to everyone. Returns false if the +// index is out of range. +bool AnnounceEvent(int index) +{ EventInfo ev; if (!EventNotifier_GetEvent(index, ev)) return false;