Improved handling of missing classes in class menus. Fixed bots not getting default class config (removed IsFakeClient check). Made new ClassCountTeam function for customized counting.
This commit is contained in:
parent
1659d24c4a
commit
72c6e9f632
@ -467,6 +467,11 @@
|
|||||||
"en" "Toggle Admin Mode"
|
"en" "Toggle Admin Mode"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"!zclass not found"
|
||||||
|
{
|
||||||
|
"en" "No classes found."
|
||||||
|
}
|
||||||
|
|
||||||
// ===========================
|
// ===========================
|
||||||
// ZAdmin Menu
|
// ZAdmin Menu
|
||||||
// ===========================
|
// ===========================
|
||||||
|
@ -112,9 +112,9 @@ CreateCvars()
|
|||||||
gCvars[CVAR_CLASSES] = CreateConVar("zr_classes", "1", "Enable zombie classes");
|
gCvars[CVAR_CLASSES] = CreateConVar("zr_classes", "1", "Enable zombie classes");
|
||||||
gCvars[CVAR_CLASSES_SPAWN] = CreateConVar("zr_classes_spawn", "0", "Classmenu is re-displayed every spawn (0: Disable)");
|
gCvars[CVAR_CLASSES_SPAWN] = CreateConVar("zr_classes_spawn", "0", "Classmenu is re-displayed every spawn (0: Disable)");
|
||||||
gCvars[CVAR_CLASSES_RANDOM] = CreateConVar("zr_classes_random", "0", "A random class is assigned to each player every round. Overrides zr_classes_spawn and default classes. (0: Disable)");
|
gCvars[CVAR_CLASSES_RANDOM] = CreateConVar("zr_classes_random", "0", "A random class is assigned to each player every round. Overrides zr_classes_spawn and default classes. (0: Disable)");
|
||||||
gCvars[CVAR_CLASSES_DEFAULT_ZOMBIE] = CreateConVar("zr_classes_default_zombie", "", "Default zombie class selected for all players when they connect. Use \"random\" to select a random class, or blank to use class config defaults.");
|
gCvars[CVAR_CLASSES_DEFAULT_ZOMBIE] = CreateConVar("zr_classes_default_zombie", "random", "Default zombie class selected for all players when they connect. Use \"random\" to select a random class, or blank to use class config defaults.");
|
||||||
gCvars[CVAR_CLASSES_DEFAULT_HUMAN] = CreateConVar("zr_classes_default_human", "", "Default human class selected for all players when they connect. Use \"random\" to select a random class, or blank to use class config defaults.");
|
gCvars[CVAR_CLASSES_DEFAULT_HUMAN] = CreateConVar("zr_classes_default_human", "random", "Default human class selected for all players when they connect. Use \"random\" to select a random class, or blank to use class config defaults.");
|
||||||
gCvars[CVAR_CLASSES_DEFAULT_ADMIN] = CreateConVar("zr_classes_default_admin", "", "Default admin-only class selected for admins when they connect. Use \"random\" to select a random class, or blank to use class config defaults.");
|
gCvars[CVAR_CLASSES_DEFAULT_ADMIN] = CreateConVar("zr_classes_default_admin", "random", "Default admin-only class selected for admins when they connect. Use \"random\" to select a random class, or blank to use class config defaults.");
|
||||||
gCvars[CVAR_ZOMBIE_HEALTH] = CreateConVar("zr_zombie_health", "5000", "The default health of a zombie");
|
gCvars[CVAR_ZOMBIE_HEALTH] = CreateConVar("zr_zombie_health", "5000", "The default health of a zombie");
|
||||||
gCvars[CVAR_ZOMBIE_SPEED] = CreateConVar("zr_zombie_speed", "350", "How fast zombies travel (300: Default speed, 600: Double speed)");
|
gCvars[CVAR_ZOMBIE_SPEED] = CreateConVar("zr_zombie_speed", "350", "How fast zombies travel (300: Default speed, 600: Double speed)");
|
||||||
gCvars[CVAR_ZOMBIE_JUMP_DISTANCE] = CreateConVar("zr_zombie_jump_distance", "0.1", "How far the zombie jumps, (0: Regular jump distance)");
|
gCvars[CVAR_ZOMBIE_JUMP_DISTANCE] = CreateConVar("zr_zombie_jump_distance", "0.1", "How far the zombie jumps, (0: Regular jump distance)");
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
*/
|
*/
|
||||||
ClassClientInit(client)
|
ClassClientInit(client)
|
||||||
{
|
{
|
||||||
if (!IsFakeClient(client))
|
if (ZRIsValidClient(client))
|
||||||
{
|
{
|
||||||
// Set default class indexes on the player.
|
// Set default class indexes on the player.
|
||||||
ClassClientSetDefaultIndexes(client);
|
ClassClientSetDefaultIndexes(client);
|
||||||
|
@ -9,30 +9,6 @@
|
|||||||
* ============================================================================
|
* ============================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Menu layouts
|
|
||||||
|
|
||||||
---------------------------------------
|
|
||||||
Class selection:
|
|
||||||
|
|
||||||
Admin mode is enabled!
|
|
||||||
|
|
||||||
1. Select Zombie Class
|
|
||||||
- Classic
|
|
||||||
2. Select Human Class
|
|
||||||
- Regular Human
|
|
||||||
3. Select Admin Class <-- Only active for admins
|
|
||||||
- Hidden Admin
|
|
||||||
(spacer)
|
|
||||||
4. Toggle Admin Mode
|
|
||||||
- Disabled
|
|
||||||
|
|
||||||
0. Exit
|
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ------------------------------------
|
/* ------------------------------------
|
||||||
*
|
*
|
||||||
* MAIN CLASS MENU
|
* MAIN CLASS MENU
|
||||||
@ -48,7 +24,6 @@ Admin mode is enabled!
|
|||||||
ClassMenuMain(client)
|
ClassMenuMain(client)
|
||||||
{
|
{
|
||||||
new Handle:menu = CreateMenu(ClassMenuMainHandle);
|
new Handle:menu = CreateMenu(ClassMenuMainHandle);
|
||||||
new itemdraw = (ZRIsClientAdmin(client)) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED;
|
|
||||||
|
|
||||||
SetGlobalTransTarget(client);
|
SetGlobalTransTarget(client);
|
||||||
SetMenuTitle(menu, "%t\n", "!zclass title");
|
SetMenuTitle(menu, "%t\n", "!zclass title");
|
||||||
@ -65,6 +40,16 @@ ClassMenuMain(client)
|
|||||||
decl String:adminmode[128];
|
decl String:adminmode[128];
|
||||||
decl String:toggleadminmode[128];
|
decl String:toggleadminmode[128];
|
||||||
|
|
||||||
|
// Get number of enabled classes per team.
|
||||||
|
new zombiecount = ClassCountTeam(ZR_CLASS_TEAM_ZOMBIES);
|
||||||
|
new humancount = ClassCountTeam(ZR_CLASS_TEAM_ZOMBIES);
|
||||||
|
new admincount = ClassCountTeam(ZR_CLASS_TEAM_ZOMBIES);
|
||||||
|
|
||||||
|
// Set draw style on class options depending on number of enabled classes.
|
||||||
|
new zombie_itemdraw = (zombiecount > 1) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED;
|
||||||
|
new human_itemdraw = (humancount > 1) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED;
|
||||||
|
new admin_itemdraw = (admincount > 1) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED;
|
||||||
|
|
||||||
// Check if the player is in admin mode.
|
// Check if the player is in admin mode.
|
||||||
if (ClassPlayerInAdminMode[client])
|
if (ClassPlayerInAdminMode[client])
|
||||||
{
|
{
|
||||||
@ -76,19 +61,20 @@ ClassMenuMain(client)
|
|||||||
// List zombie class options.
|
// List zombie class options.
|
||||||
ClassGetName(ClassSelected[client][ZR_CLASS_TEAM_ZOMBIES], zombieclass, sizeof(zombieclass), ZR_CLASS_CACHE_MODIFIED);
|
ClassGetName(ClassSelected[client][ZR_CLASS_TEAM_ZOMBIES], zombieclass, sizeof(zombieclass), ZR_CLASS_CACHE_MODIFIED);
|
||||||
Format(zombieselect, sizeof(zombieselect), "%t\n %s", "!zclass zombie", zombieclass);
|
Format(zombieselect, sizeof(zombieselect), "%t\n %s", "!zclass zombie", zombieclass);
|
||||||
AddMenuItem(menu, "", zombieselect);
|
AddMenuItem(menu, "", zombieselect, zombie_itemdraw);
|
||||||
|
|
||||||
// List human class options.
|
// List human class options.
|
||||||
ClassGetName(ClassSelected[client][ZR_CLASS_TEAM_HUMANS], humanclass, sizeof(humanclass), ZR_CLASS_CACHE_MODIFIED);
|
ClassGetName(ClassSelected[client][ZR_CLASS_TEAM_HUMANS], humanclass, sizeof(humanclass), ZR_CLASS_CACHE_MODIFIED);
|
||||||
Format(humanselect, sizeof(humanselect), "%t\n %s", "!zclass human", humanclass);
|
Format(humanselect, sizeof(humanselect), "%t\n %s", "!zclass human", humanclass);
|
||||||
AddMenuItem(menu, "", humanselect);
|
AddMenuItem(menu, "", humanselect, human_itemdraw);
|
||||||
|
|
||||||
|
// Only display admin class options for admins.
|
||||||
if (ZRIsClientAdmin(client))
|
if (ZRIsClientAdmin(client))
|
||||||
{
|
{
|
||||||
// List admin class options.
|
// List admin class options.
|
||||||
ClassGetName(ClassSelected[client][ZR_CLASS_TEAM_ADMINS], adminclass, sizeof(adminclass), ZR_CLASS_CACHE_MODIFIED);
|
ClassGetName(ClassSelected[client][ZR_CLASS_TEAM_ADMINS], adminclass, sizeof(adminclass), ZR_CLASS_CACHE_MODIFIED);
|
||||||
Format(adminselect, sizeof(adminselect), "%t\n %s", "!zclass admin", adminclass);
|
Format(adminselect, sizeof(adminselect), "%t\n %s", "!zclass admin", adminclass);
|
||||||
AddMenuItem(menu, "", adminselect, itemdraw);
|
AddMenuItem(menu, "", adminselect, admin_itemdraw);
|
||||||
|
|
||||||
// Set admin mode status string.
|
// Set admin mode status string.
|
||||||
if (ClassPlayerAdminMode[client])
|
if (ClassPlayerAdminMode[client])
|
||||||
@ -100,9 +86,12 @@ ClassMenuMain(client)
|
|||||||
Format(adminmode, sizeof(adminmode), "%t", "Off");
|
Format(adminmode, sizeof(adminmode), "%t", "Off");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Spacer. ITEMDRAW_SPACER not used because it use a slot.
|
||||||
|
AddMenuItem(menu, "", " ", ITEMDRAW_RAWLINE);
|
||||||
|
|
||||||
// Show admin mode toggle option.
|
// Show admin mode toggle option.
|
||||||
Format(toggleadminmode, sizeof(toggleadminmode), "%t\n %s", "!zclass admin mode toggle", adminmode);
|
Format(toggleadminmode, sizeof(toggleadminmode), "%t\n %s", "!zclass admin mode toggle", adminmode);
|
||||||
AddMenuItem(menu, "", toggleadminmode);
|
AddMenuItem(menu, "", toggleadminmode, admin_itemdraw);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetMenuExitBackButton(menu, true);
|
SetMenuExitBackButton(menu, true);
|
||||||
@ -134,7 +123,8 @@ public ClassMenuMainHandle(Handle:menu, MenuAction:action, client, slot)
|
|||||||
}
|
}
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
// ClassMenuToggleAdmin(client);
|
// ClassToggleAdminMode(client);
|
||||||
|
ClassMenuMain(client);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -219,6 +209,12 @@ ClassMenuSelect(client, teamid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
// No classes found. Display message. The main class menu should
|
||||||
|
// prevent this from happening, but we print a message just in case.
|
||||||
|
Format(menuitem, sizeof(menuitem), "%t\n", "!zclass not found");
|
||||||
|
AddMenuItem(menu, classname, menuitem, ITEMDRAW_RAWLINE);
|
||||||
|
}
|
||||||
|
|
||||||
SetMenuExitBackButton(menu, true);
|
SetMenuExitBackButton(menu, true);
|
||||||
DisplayMenu(menu, client, MENU_TIME_FOREVER);
|
DisplayMenu(menu, client, MENU_TIME_FOREVER);
|
||||||
@ -270,7 +266,7 @@ public ClassMenuSelectHandle(Handle:menu, MenuAction:action, client, slot)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClassToggleAdminMode(client)
|
||||||
ClassMenuToggleAdmin(client)
|
|
||||||
{
|
{
|
||||||
|
// TODO: Move to new file, adminmode.inc.
|
||||||
}
|
}
|
||||||
|
@ -421,6 +421,62 @@ bool:ClassAddToArray(Handle:array, teamfilter = -1, bool:ignoreEnabled = false,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts total classes or classes in the specified team.
|
||||||
|
*
|
||||||
|
* @param teamfilter Optional. The team ID to filter. Negative value for
|
||||||
|
* no filter (default).
|
||||||
|
* @param ignoreEnabled Ignore the enabled attribute.
|
||||||
|
* @param cachetype Optional. Specifies what class cache to read from.
|
||||||
|
* Options:
|
||||||
|
* ZR_CLASS_CACHE_ORIGINAL - Unchanced class data.
|
||||||
|
* ZR_CLASS_CACHE_MODIFIED (default) - Changed/newest
|
||||||
|
* class data.
|
||||||
|
* @return Number of total classes or classes in the specified team.
|
||||||
|
*/
|
||||||
|
ClassCountTeam(teamfilter = -1, bool:ignoreEnabled = false, cachetype = ZR_CLASS_CACHE_MODIFIED)
|
||||||
|
{
|
||||||
|
// Check if there are no classes.
|
||||||
|
if (ClassCount == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store a local boolean that says if the user specified a team filter or not.
|
||||||
|
new bool:has_filter = bool:(teamfilter >= 0);
|
||||||
|
new count;
|
||||||
|
|
||||||
|
// Loop through all classes.
|
||||||
|
for (new classindex = 0; classindex < ClassCount; classindex++)
|
||||||
|
{
|
||||||
|
if (!ignoreEnabled && !ClassIsEnabled(classindex, cachetype))
|
||||||
|
{
|
||||||
|
// The class is disabled and the enabled attribute is NOT ignored.
|
||||||
|
// Skip to the next class.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check team filtering.
|
||||||
|
if (has_filter)
|
||||||
|
{
|
||||||
|
// Only add classes with matching team ID.
|
||||||
|
if (ClassGetTeamID(classindex, cachetype) == teamfilter)
|
||||||
|
{
|
||||||
|
// Team ID match. Increment counter.
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No filter. Increment counter.
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return number of classes found.
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a random class index from a specified team or from all classes.
|
* Gets a random class index from a specified team or from all classes.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user