#include #include #pragma semicolon 1 #pragma newdecls required #define PREFIX "\x01[SM] \x04" // So commands fail with a message instead of an unbound-native error while the core is unloaded. bool g_bCoreLoaded; public Plugin myinfo = { name = "Couch Admin", author = "marisakirisame.net", description = "Admin commands and menu for the ZE couch", version = "2.0", url = "https://marisakirisame.net" }; public void OnPluginStart() { RegAdminCmd("sm_couch", Command_Couch, ADMFLAG_CHANGEMAP, "Opens the couch menu"); RegAdminCmd("sm_spawncouch", Command_SpawnCouch, ADMFLAG_CHANGEMAP, "Spawns the couch where you are aiming"); RegAdminCmd("sm_bringcouch", Command_BringCouch, ADMFLAG_CHANGEMAP, "Brings the couch to where you are aiming"); 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"); } public void OnAllPluginsLoaded() { g_bCoreLoaded = LibraryExists("Couch"); } public void OnLibraryAdded(const char[] name) { if (StrEqual(name, "Couch")) g_bCoreLoaded = true; } public void OnLibraryRemoved(const char[] name) { if (StrEqual(name, "Couch")) g_bCoreLoaded = false; } // --------------------------------------------------------------------------------------------- // Commands // --------------------------------------------------------------------------------------------- public Action Command_Couch(int client, int args) { if (!RequireInGame(client) || !RequireCore(client)) return Plugin_Handled; ShowCouchMenu(client); return Plugin_Handled; } public Action Command_SpawnCouch(int client, int args) { if (!RequireInGame(client) || !RequireCore(client)) return Plugin_Handled; DoSpawn(client); return Plugin_Handled; } public Action Command_BringCouch(int client, int args) { if (!RequireInGame(client) || !RequireCore(client)) return Plugin_Handled; DoBring(client); return Plugin_Handled; } // Needs no position, so it also works from the server console. public Action Command_RemoveCouch(int client, int args) { if (!RequireCore(client)) return Plugin_Handled; DoRemove(client); return Plugin_Handled; } public Action Command_PistolOnly(int client, int args) { if (!RequireCore(client)) return Plugin_Handled; bool bEnable = !Couch_IsPistolOnly(); if (args >= 1) bEnable = (GetCmdArgInt(1) != 0); DoSetPistolOnly(client, bEnable); return Plugin_Handled; } bool RequireInGame(int client) { if (client >= 1 && IsClientInGame(client)) return true; ReplyToCommand(client, "[SM] This command can only be used in-game."); return false; } bool RequireCore(int client) { if (g_bCoreLoaded) return true; ReplyToCommand(client, "[SM] The Couch core plugin is not loaded."); return false; } // --------------------------------------------------------------------------------------------- // Actions // --------------------------------------------------------------------------------------------- void DoSpawn(int client) { if (Couch_Spawn(client) == -1) { ReplyToCommand(client, "[SM] Could not create the couch."); return; } ShowActivity2(client, PREFIX, "\x01Spawned the \x04couch\x01."); LogAction(client, -1, "\"%L\" spawned the couch.", client); } void DoBring(int client) { if (!Couch_Bring(client)) { ReplyToCommand(client, "[SM] There is no couch to bring. Use sm_spawncouch first."); return; } ShowActivity2(client, PREFIX, "\x01Brought the \x04couch\x01."); LogAction(client, -1, "\"%L\" brought the couch.", client); } void DoRemove(int client) { if (!Couch_Remove()) { ReplyToCommand(client, "[SM] There is no couch to remove."); return; } ShowActivity2(client, PREFIX, "\x01Removed the \x04couch\x01."); LogAction(client, -1, "\"%L\" removed the couch.", client); } void DoToggleEffect(int client) { bool bEnable = !Couch_IsEffectEnabled(); Couch_SetEffectEnabled(bEnable); ShowActivity2(client, PREFIX, "\x01Turned the couch effect \x04%s\x01.", bEnable ? "on" : "off"); LogAction(client, -1, "\"%L\" turned the couch effect %s.", client, bEnable ? "on" : "off"); } // Announced to everyone so players know why their rifle stopped moving the couch. void DoSetPistolOnly(int client, bool bEnable) { Couch_SetPistolOnly(bEnable); ShowActivity2(client, PREFIX, "\x01Turned couch pistol-only mode \x04%s\x01.", bEnable ? "on" : "off"); LogAction(client, -1, "\"%L\" turned couch pistol-only mode %s.", client, bEnable ? "on" : "off"); } // --------------------------------------------------------------------------------------------- // Menu // --------------------------------------------------------------------------------------------- // Rebuilt on every display so the labels always reflect the current state. void ShowCouchMenu(int client) { bool bHasCouch = (Couch_GetCouch() != -1); bool bPlaced = Couch_IsPlaced(); Menu menu = new Menu(MenuHandler_Couch); menu.SetTitle("Couch"); // With a couch out, bring is the way to move it; without one there is nothing to bring. menu.AddItem("spawn", "Spawn couch at crosshair", bHasCouch ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT); menu.AddItem("bring", "Bring couch to crosshair", bHasCouch ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED); if (bHasCouch) menu.AddItem("remove", "Remove couch"); else if (bPlaced) menu.AddItem("remove", "Remove couch (respawns next round)"); else menu.AddItem("remove", "Remove couch", ITEMDRAW_DISABLED); char sItem[64]; FormatEx(sItem, sizeof(sItem), "Effect: %s", Couch_IsEffectEnabled() ? "ON" : "OFF"); menu.AddItem("effect", sItem); FormatEx(sItem, sizeof(sItem), "Pistol only: %s", Couch_IsPistolOnly() ? "ON" : "OFF"); menu.AddItem("pistol", sItem); menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } public int MenuHandler_Couch(Menu menu, MenuAction action, int param1, int param2) { switch (action) { case MenuAction_Select: { int client = param1; if (!g_bCoreLoaded) { RequireCore(client); return 0; } char sInfo[16]; menu.GetItem(param2, sInfo, sizeof(sInfo)); if (StrEqual(sInfo, "spawn")) DoSpawn(client); else if (StrEqual(sInfo, "bring")) DoBring(client); else if (StrEqual(sInfo, "remove")) DoRemove(client); else if (StrEqual(sInfo, "effect")) DoToggleEffect(client); else if (StrEqual(sInfo, "pistol")) DoSetPistolOnly(client, !Couch_IsPistolOnly()); ShowCouchMenu(client); } case MenuAction_End: { delete menu; } } return 0; }