sm-zombiereloaded-3/src/zr/menu.inc
richard f804a7d4e2 Fixes in translations. Added note about compiling. See details.
Fixed weapon type restriction menu not translating the first time.
Fixed zmarket weapon type selection menu title not translated.
Fixed too short title string space in zmarket loadout, ztele force, zspawn force and hit group menus.
Fixed "empty" phrase not translated.
Fixed on/off translation string space too short in hit group menu.
2009-08-23 17:03:14 +02:00

330 lines
9.6 KiB
SourcePawn

/*
* ============================================================================
*
* Zombie:Reloaded
*
* File: menu.inc
* Type: Core
* Description: Base menu functions for the plugin.
*
* Copyright (C) 2009 Greyscale, Richard Helgeby
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ============================================================================
*/
/**
* @section Some defined lengths of menu lines throughout the plugin.
*/
#define MENU_LINE_SMALL_LENGTH 32
#define MENU_LINE_REG_LENGTH 64
#define MENU_LINE_BIG_LENGTH 128
#define MENU_LINE_HUGE_LENGTH 256
#define MENU_LINE_TITLE_LENGTH MENU_LINE_BIG_LENGTH
/**
* @endsection
*/
/**
* Create commands specific to ZMenu.
*/
MenuOnCommandsCreate()
{
// Register ZMenu command.
RegConsoleCmd(SAYHOOKS_KEYWORD_ZMENU, ZMenuCommand, "Opens ZR's main menu.");
}
/**
* Command callback (zmenu)
* Opens ZR's main menu.
*
* @param client The client index.
* @param argc Argument count.
*/
public Action:ZMenuCommand(client, argc)
{
// If client is console, then stop and tell them this feature is for players only.
if (ZRIsConsole(client))
{
TranslationPrintToServer("Must be player");
return Plugin_Handled;
}
// Send main menu.
ZMenuMain(client);
// This stops the "Unknown command" message in client's console.
return Plugin_Handled;
}
/**
* Show main menu to client.
*
* @param client The client index.
*/
ZMenuMain(client)
{
// Create menu handle.
new Handle:menu_main = CreateMenu(ZMenuMainHandle);
decl String:publictrigger[4];
decl String:silenttrigger[4];
// Get public/silent chat triggers.
SayHooksGetPublicChatTrigger(publictrigger, sizeof(publictrigger));
SayHooksGetSilentChatTrigger(silenttrigger, sizeof(silenttrigger));
SetGlobalTransTarget(client);
// Initialize menu lines.
decl String:title[MENU_LINE_TITLE_LENGTH];
decl String:zadmin[MENU_LINE_HUGE_LENGTH];
decl String:zclass[MENU_LINE_HUGE_LENGTH];
decl String:zcookies[MENU_LINE_HUGE_LENGTH];
decl String:zspawn[MENU_LINE_HUGE_LENGTH];
decl String:ztele[MENU_LINE_HUGE_LENGTH];
decl String:zhp[MENU_LINE_HUGE_LENGTH];
decl String:zmarket[MENU_LINE_HUGE_LENGTH];
// Translate each line into client's language.
Format(title, sizeof(title), "%t\n ", "Menu main title", publictrigger, silenttrigger);
Format(zadmin, sizeof(zadmin), "%t", "Menu main zadmin");
Format(zclass, sizeof(zclass), "%t", "Menu main zclass");
Format(zcookies, sizeof(zcookies), "%t", "Menu main zcookies");
Format(zspawn, sizeof(zspawn), "%t", "Menu main zspawn");
Format(ztele, sizeof(ztele), "%t", "Menu main ztele");
Format(zhp, sizeof(zhp), "%t", "Menu main zhp");
Format(zmarket, sizeof(zmarket), "%t", "Menu main zmarket");
// Add items to menu.
SetMenuTitle(menu_main, title);
// Disable option if client isn't an admin.
new bool:admin = ZRIsClientAdmin(client);
AddMenuItem(menu_main, "zadmin", zadmin, MenuGetItemDraw(admin));
// Decide whether the client can use zclass.
new zclassdraw = ClassAllowSelection(client) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED;
AddMenuItem(menu_main, "zclass", zclass, zclassdraw);
AddMenuItem(menu_main, "zcookies", zcookies);
AddMenuItem(menu_main, "zspawn", zspawn);
AddMenuItem(menu_main, "ztele", ztele);
AddMenuItem(menu_main, "zhp", zhp);
AddMenuItem(menu_main, "zmarket", zmarket);
// Display menu to client.
DisplayMenu(menu_main, client, MENU_TIME_FOREVER);
}
/**
* Menu callback (main)
* Redirects client to selected option's handle code.
*
* @param menu The menu handle.
* @param action Action client is doing in menu.
* @param client The client index.
* @param slot The menu slot selected. (starting from 0)
*/
public ZMenuMainHandle(Handle:menu, MenuAction:action, client, slot)
{
// Client selected an option.
if (action == MenuAction_Select)
{
// Create variable to possible resend menu later.
new bool:resend = true;
switch(slot)
{
// Selected ZAdmin.
case 0:
{
// Copy return to resend variable.
resend = !ZAdminMenu(client);
}
// Select ZClass.
case 1:
{
// Send ZClass menu
ClassMenuMain(client);
// Don't resend this menu.
resend = false;
}
// Select ZCookies.
case 2:
{
// Send ZCookies menu
ZCookiesMenuMain(client);
// Don't resend this menu.
resend = false;
}
// Select ZSpawn.
case 3:
{
// Send ZSpawn command from client.
ZSpawnClient(client);
}
// Select ZTele.
case 4:
{
// Copy return to resend variable.
resend = !ZTeleClient(client);
}
// Select ZHP.
case 5:
{
// Toggle ZHP.
ZHPToggle(client);
}
// Select ZMarket.
case 6:
{
// Send ZMarket menu.
resend = !ZMarketMenuMain(client);
}
}
// Resend is still true, then resend menu.
if (resend)
{
ZMenuMain(client);
}
}
// Client exited menu.
if (action == MenuAction_End)
{
CloseHandle(menu);
}
}
/**
* Shows a list of all clients to a client, different handlers can be used for this, as well as title.
*
* @param client The client index.
* @param handler The menu handler.
* @param team If true, only clients on a team will be displayed.
* @param alive If true, only clients that are alive will be displayed.
* @param dead If true, only clients that are dead will be displayed.
* @param any Title is a translations phrase.
*/
stock MenuClientList(client, MenuHandler:handler, bool:team = false, bool:alive = false, bool:dead = false, any:...)
{
// Create menu handle.
new Handle:menu_clients = CreateMenu(handler);
// Set client as translation target.
SetGlobalTransTarget(client);
// Translate phrase.
decl String:translation[MENU_LINE_TITLE_LENGTH];
VFormat(translation, sizeof(translation), "%t", 6);
// Set menu title to the translated phrase.
SetMenuTitle(menu_clients, translation);
decl String:clientoption[MENU_LINE_REG_LENGTH];
decl String:clientuserid[8];
new count = 0;
// x = Client index.
for (new x = 1; x <= MaxClients; x++)
{
// If client isn't in-game, then stop.
if (!IsClientInGame(x))
{
continue;
}
// If client isn't on a team, then stop.
if (team && !ZRIsClientOnTeam(x))
{
continue;
}
// If client is dead, then stop.
if (alive && !IsPlayerAlive(x))
{
continue;
}
// If client is alive, then stop.
if (dead && IsPlayerAlive(x))
{
continue;
}
// Get client info.
GetClientName(x, clientoption, sizeof(clientoption));
IntToString(GetClientUserId(x), clientuserid, sizeof(clientuserid));
// Add option to menu.
AddMenuItem(menu_clients, clientuserid, clientoption);
// Increment count.
count++;
}
// If there are no clients, add an "(Empty)" line.
if (count == 0)
{
// Set translation language again, because SetMenuTitle above reset
// this for some reason.
SetGlobalTransTarget(client);
decl String:empty[64];
Format(empty, sizeof(empty), "%t", "Menu empty");
AddMenuItem(menu_clients, "empty", empty, ITEMDRAW_DISABLED);
}
// Create a "Back" button to the main admin menu.
SetMenuExitBackButton(menu_clients, true);
// Send menu.
DisplayMenu(menu_clients, client, MENU_TIME_FOREVER);
}
/**
* Gets the client index of the selected client in the menu.
*
* @param menu The menu handle.
* @param slot The menu slot that was selected.
* @return The client index, 0 if the selected client is no longer in the server.
*/
stock MenuGetClientIndex(Handle:menu, slot)
{
// Get menu slot's information.
decl String:clientuserid[8];
GetMenuItem(menu, slot, clientuserid, sizeof(clientuserid));
// Return the targetted client through their userid which was set into the menu slot's info param.
return GetClientOfUserId(StringToInt(clientuserid));
}
/**
* Return itemdraw flag for SM menus.
*
* @param condition If this is true, item will be drawn normally.
*/
stock MenuGetItemDraw(bool:condition)
{
return condition ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED;
}