From ed752979b8ec7d0494c1b3027e679801beb5e79b Mon Sep 17 00:00:00 2001 From: Greyscale Date: Thu, 18 Jun 2009 20:41:54 -0700 Subject: [PATCH] Extended ZMarkets feature to include overwriting their current loadout with their current weapons, and viewing their custom loadout. * Restructured ZMarkets menus. --- .../translations/zombiereloaded.phrases.txt | 87 ++++- src/zr/menu.inc | 2 +- src/zr/weapons/weapons.inc | 26 ++ src/zr/weapons/zmarket.inc | 350 +++++++++++++++--- 4 files changed, 398 insertions(+), 67 deletions(-) diff --git a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt index 2574211..6da04d0 100644 --- a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt +++ b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt @@ -532,6 +532,11 @@ "en" "Weapon @green{1} @defaulthas a purchase limit of @green{2}@default. Wait until you respawn to try again." } + "Weapons zmarket get current loadout" + { + "en" "Updated current loadout, use rebuy option to purchase these weapons again." + } + // Commands "Weapons command restrict syntax" @@ -597,22 +602,82 @@ // Menu (ZMarket) + "Weapons menu zmarket main title" + { + "en" "ZMarket\nSelect an Option:" + } + + "Weapons menu zmarket main get loadout" + { + "en" "Get Current Loadout" + } + + "Weapons menu zmarket main view loadout" + { + "en" "View My Loadout" + } + + "Weapons menu zmarket main rebuy" + { + "en" "Rebuy My Loadout" + } + + "Weapons menu zmarket main auto-rebuy" + { + "#format" "{1:s}" + "en" "Auto-Rebuy: {1}" + } + + "Weapons menu zmarket main weapons list" + { + "en" "View Weapons List" + } + + "Weapons menu zmarket loadout title" + { + "en" "ZMarket\nMy Current Loadout:\nRebuy refers to these weapons" + } + + "Weapons menu zmarket loadout primary" + { + "#format" "{1:s}" + "en" "Primary: {1}" + } + + "Weapons menu zmarket loadout secondary" + { + "#format" "{1:s}" + "en" "Secondary: {1}" + } + + "Weapons menu zmarket loadout melee" + { + "#format" "{1:s}" + "en" "Melee: {1}" + } + + "Weapons menu zmarket loadout projectile" + { + "#format" "{1:s}" + "en" "Projectile: {1}" + } + + "Weapons menu zmarket loadout explosive" + { + "#format" "{1:s}" + "en" "Explosive: {1}" + } + + "Weapons menu zmarket loadout empty" + { + "en" "(None)" + } + "Weapons menu zmarket types title" { "en" "ZMarket\nSelect Weapon Type:" } - "Weapons menu zmarket types rebuy" - { - "en" "Rebuy (1 weapon per slot)" - } - - "Weapons menu zmarket types auto-rebuy" - { - "#format" "{1:s}" - "en" "Auto-Rebuy: {1}\n " - } - "Weapons menu zmarket types weapon type title" { "#format" "{1:s}" diff --git a/src/zr/menu.inc b/src/zr/menu.inc index c409e76..bde8b33 100644 --- a/src/zr/menu.inc +++ b/src/zr/menu.inc @@ -168,7 +168,7 @@ public MenuMainHandle(Handle:menu, MenuAction:action, client, slot) case 5: { // Send ZMarket menu. - resend = !ZMarketMenuTypes(client); + resend = !ZMarketMenuMain(client); } } diff --git a/src/zr/weapons/weapons.inc b/src/zr/weapons/weapons.inc index 6921d64..3c4a727 100644 --- a/src/zr/weapons/weapons.inc +++ b/src/zr/weapons/weapons.inc @@ -371,6 +371,32 @@ stock WeaponsNameToIndex(const String:weapon[]) return -1; } +/** + * Takes a weapon's classname and returns the display name in weapons config file. + * + * @param + */ +stock WeaponsClassnameToDisplay(String:classname[], classnamemaxlen, String:display[], displaymaxlen) +{ + // Strip off classnames' weapon prefix. + ReplaceString(classname, classnamemaxlen, "weapon_", ""); + ReplaceString(classname, classnamemaxlen, "item_", ""); + + // Get the index of the weapon. + new weaponindex = WeaponsNameToIndex(classname); + + // If weapon index is invalid, then return an empty string. + if (weaponindex == -1) + { + // Return an empty string. + strcopy(display, displaymaxlen, ""); + return; + } + + // Return the display name. + WeaponsGetName(weaponindex, display, displaymaxlen); +} + /** * Checks if a weapon is valid. (E.G. listed in weapons.txt) * @param weapon The weapon name. diff --git a/src/zr/weapons/zmarket.inc b/src/zr/weapons/zmarket.inc index d342a35..5d0123d 100644 --- a/src/zr/weapons/zmarket.inc +++ b/src/zr/weapons/zmarket.inc @@ -175,11 +175,12 @@ ZMarketGetPurchaseCount(client, const String:weapon[]) } /** - * Sends weapon type list to client. + * Sends main ZMarket menu to client. + * * @param client The client index. * @return True if the menu was sent successfully, false if not. */ -bool:ZMarketMenuTypes(client) +bool:ZMarketMenuMain(client) { // If weapons module is disabled, then stop. new bool:weapons = GetConVarBool(g_hCvarsList[CVAR_WEAPONS]); @@ -199,6 +200,240 @@ bool:ZMarketMenuTypes(client) return false; } + // Create menu handle. + new Handle:menu_zmarket_main = CreateMenu(ZMarketMenuMainHandle); + + // Set translation target as client. + SetGlobalTransTarget(client); + + // Set menu title. + SetMenuTitle(menu_zmarket_main, "%t\n ", "Weapons menu zmarket main title"); + + // If rebuy is enabled, then add it to the menu. + new bool:zmarketrebuy = GetConVarBool(g_hCvarsList[CVAR_WEAPONS_ZMARKET_REBUY]); + new bool:zmarketrebuyauto = GetConVarBool(g_hCvarsList[CVAR_WEAPONS_ZMARKET_REBUY_AUTO]); + + // Add "Get Current Loadout" option. + decl String:getloadout[WEAPONS_MAX_LENGTH]; + decl String:viewloadout[WEAPONS_MAX_LENGTH]; + decl String:rebuy[WEAPONS_MAX_LENGTH]; + decl String:rebuyauto[WEAPONS_MAX_LENGTH]; + decl String:weaponslist[WEAPONS_MAX_LENGTH]; + + // Get auto-rebuy setting. + decl String:rebuyautosetting[8]; + ConfigBoolToSetting(g_bZMarketAutoRebuy[client], rebuyautosetting, sizeof(rebuyautosetting)); + + // Format menu options. + Format(getloadout, sizeof(getloadout), "%t", "Weapons menu zmarket main get loadout"); + Format(viewloadout, sizeof(viewloadout), "%t", "Weapons menu zmarket main view loadout"); + Format(rebuy, sizeof(rebuy), "%t", "Weapons menu zmarket main rebuy"); + Format(rebuyauto, sizeof(rebuyauto), "%t", "Weapons menu zmarket main auto-rebuy", rebuyautosetting); + Format(weaponslist, sizeof(weaponslist), "%t", "Weapons menu zmarket main weapons list"); + + // Add formatted options to menu. + AddMenuItem(menu_zmarket_main, "Get Loadout", getloadout, MenuGetItemDraw(zmarketrebuy || zmarketrebuyauto)); + AddMenuItem(menu_zmarket_main, "View Loadout", viewloadout, MenuGetItemDraw(zmarketrebuy || zmarketrebuyauto)); + AddMenuItem(menu_zmarket_main, "Rebuy", rebuy, MenuGetItemDraw(zmarketrebuy || zmarketrebuyauto)); + AddMenuItem(menu_zmarket_main, "Auto-Rebuy", rebuyauto, MenuGetItemDraw(zmarketrebuyauto)); + AddMenuItem(menu_zmarket_main, "Weapons List", weaponslist); + + // Set exit back button. + SetMenuExitBackButton(menu_zmarket_main, true); + + DisplayMenu(menu_zmarket_main, client, MENU_TIME_FOREVER); + + // Menu sent successfully. + return true; +} + +/** + * Called when client selects option in the main ZMarket menu, and handles it. + * + * @param menu_zmarket_main Handle of the menu being used. + * @param action The action done on the menu (see menus.inc, enum MenuAction). + * @param client The client index. + * @param slot The slot index selected (starting from 0). + */ +public ZMarketMenuMainHandle(Handle:menu_zmarket_main, MenuAction:action, client, slot) +{ + // Client selected an option. + if (action == MenuAction_Select) + { + switch(slot) + { + // Get loadout. + case 0: + { + // Gets a client's current loadout. + ZMarketGetCurrentLoadout(client); + + // Resend menu. + ZMarketMenuMain(client); + } + // View loadout. + case 1: + { + // Show a client their current loadout. + ZMarketMenuLoadout(client); + } + // Rebuy. + case 2: + { + // Force client to rebuy weapons. + ZMarketRebuy(client); + + // Resend menu. + ZMarketMenuMain(client); + } + // Auto-rebuy. + case 3: + { + // Toggle rebuy. + g_bZMarketAutoRebuy[client] = !g_bZMarketAutoRebuy[client]; + + // Resend menu. + ZMarketMenuMain(client); + } + // Weapons list. + case 4: + { + // Send the weapon types list. + ZMarketMenuTypes(client); + } + } + } + // Client closed the menu. + if (action == MenuAction_Cancel) + { + // Client hit "Back" button. + if (slot == MenuCancel_ExitBack) + { + MenuMain(client); + } + } + // Client hit "Exit" button. + else if (action == MenuAction_End) + { + CloseHandle(menu_zmarket_main); + } +} + +/** + * Sends list of weapons in a client's loadout to the client. + * + * @param client The client index. + */ +bool:ZMarketMenuLoadout(client) +{ + // Create menu handle. + new Handle:menu_zmarket_loadout = CreateMenu(ZMarketMenuLoadoutHandle); + + // Set translation target as client. + SetGlobalTransTarget(client); + + // Set menu title. + SetMenuTitle(menu_zmarket_loadout, "%t\n ", "Weapons menu zmarket loadout title"); + + decl String:primaryweapon[WEAPONS_MAX_LENGTH]; + decl String:secondaryweapon[WEAPONS_MAX_LENGTH]; + decl String:meleeweapon[WEAPONS_MAX_LENGTH]; + decl String:projectileweapon[WEAPONS_MAX_LENGTH]; + decl String:explosiveweapon[WEAPONS_MAX_LENGTH]; + + // Return the display name for all the client's weapon classname's. + WeaponsClassnameToDisplay(g_strZMarketLastWeapon[client][Slot_Primary], sizeof(g_strZMarketLastWeapon), primaryweapon, sizeof(primaryweapon)); + WeaponsClassnameToDisplay(g_strZMarketLastWeapon[client][Slot_Secondary], sizeof(g_strZMarketLastWeapon), secondaryweapon, sizeof(secondaryweapon)); + WeaponsClassnameToDisplay(g_strZMarketLastWeapon[client][Slot_Melee], sizeof(g_strZMarketLastWeapon), meleeweapon, sizeof(meleeweapon)); + WeaponsClassnameToDisplay(g_strZMarketLastWeapon[client][Slot_Projectile], sizeof(g_strZMarketLastWeapon), projectileweapon, sizeof(projectileweapon)); + WeaponsClassnameToDisplay(g_strZMarketLastWeapon[client][Slot_Explosive], sizeof(g_strZMarketLastWeapon), explosiveweapon, sizeof(explosiveweapon)); + + // Get the empty translation. + decl String:empty[64]; + Format(empty, sizeof(empty), "%t", "Weapons menu zmarket loadout empty"); + + // If the client doesn't have a weapon in this slot, then set the weapon to the empty translation. + if (!primaryweapon[0]) + { + strcopy(primaryweapon, sizeof(primaryweapon), empty); + } + if (!secondaryweapon[0]) + { + strcopy(secondaryweapon, sizeof(secondaryweapon), empty); + } + if (!meleeweapon[0]) + { + strcopy(meleeweapon, sizeof(meleeweapon), empty); + } + if (!projectileweapon[0]) + { + strcopy(projectileweapon, sizeof(projectileweapon), empty); + } + if (!explosiveweapon[0]) + { + strcopy(explosiveweapon, sizeof(explosiveweapon), empty); + } + + decl String:primary[64]; + decl String:secondary[64]; + decl String:melee[64]; + decl String:projectile[64]; + decl String:explosive[64]; + + // Format all the lines of the menu. + Format(primary, sizeof(primary), "%t", "Weapons menu zmarket loadout primary", primaryweapon); + Format(secondary, sizeof(secondary), "%t", "Weapons menu zmarket loadout secondary", secondaryweapon); + Format(melee, sizeof(melee), "%t", "Weapons menu zmarket loadout melee", meleeweapon); + Format(projectile, sizeof(projectile), "%t", "Weapons menu zmarket loadout projectile", projectileweapon); + Format(explosive, sizeof(explosive), "%t", "Weapons menu zmarket loadout explosive", explosiveweapon); + + // Add formatted options to menu. + AddMenuItem(menu_zmarket_loadout, primary, primary, ITEMDRAW_DISABLED); + AddMenuItem(menu_zmarket_loadout, secondary, secondary, ITEMDRAW_DISABLED); + AddMenuItem(menu_zmarket_loadout, melee, melee, ITEMDRAW_DISABLED); + AddMenuItem(menu_zmarket_loadout, projectile, projectile, ITEMDRAW_DISABLED); + AddMenuItem(menu_zmarket_loadout, explosive, explosive, ITEMDRAW_DISABLED); + + // Set exit back button. + SetMenuExitBackButton(menu_zmarket_loadout, true); + + // Send menu to client. + DisplayMenu(menu_zmarket_loadout, client, MENU_TIME_FOREVER); +} + +/** + * Allow the user to press the "Back" button to go to main ZMarket menu. + * + * @param menu_zmarket_loadout Handle of the menu being used. + * @param action The action done on the menu (see menus.inc, enum MenuAction). + * @param client The client index. + * @param slot The slot index selected (starting from 0). + */ +public ZMarketMenuLoadoutHandle(Handle:menu_zmarket_loadout, MenuAction:action, client, slot) +{ + // Client closed the menu. + if (action == MenuAction_Cancel) + { + // Client hit "Back" button. + if (slot == MenuCancel_ExitBack) + { + ZMarketMenuMain(client); + } + } + // Client hit "Exit" button. + else if (action == MenuAction_End) + { + CloseHandle(menu_zmarket_loadout); + } +} + +/** + * Sends weapon type list to client. + * + * @param client The client index. + */ +ZMarketMenuTypes(client) +{ // Create menu handle. new Handle:menu_zmarket_types = CreateMenu(ZMarketMenuTypesHandle); @@ -208,32 +443,6 @@ bool:ZMarketMenuTypes(client) // Set menu title. SetMenuTitle(menu_zmarket_types, "%t\n ", "Weapons menu zmarket types title"); - // If rebuy is enabled, then add it to the menu. - new bool:zmarketrebuy = GetConVarBool(g_hCvarsList[CVAR_WEAPONS_ZMARKET_REBUY]); - new bool:zmarketrebuyauto = GetConVarBool(g_hCvarsList[CVAR_WEAPONS_ZMARKET_REBUY_AUTO]); - - // If rebuy or auto-rebuy is enabled, then add it to the menu. - if (zmarketrebuy || zmarketrebuyauto) - { - // Add "Rebuy" option. - decl String:rebuy[WEAPONS_MAX_LENGTH]; - Format(rebuy, sizeof(rebuy), "%t", "Weapons menu zmarket types rebuy"); - AddMenuItem(menu_zmarket_types, "Rebuy", rebuy); - } - - // If auto-rebuy is enabled, then add it to the menu. - if (zmarketrebuyauto) - { - // Get current auto-rebuy setting. - decl String:rebuyautosetting[8]; - ConfigBoolToSetting(g_bZMarketAutoRebuy[client], rebuyautosetting, sizeof(rebuyautosetting)); - - // Add "Auto-Rebuy" option. - decl String:rebuyauto[WEAPONS_MAX_LENGTH]; - Format(rebuyauto, sizeof(rebuyauto), "%t", "Weapons menu zmarket types auto-rebuy", rebuyautosetting); - AddMenuItem(menu_zmarket_types, "Auto-Rebuy", rebuyauto); - } - decl String:typename[WEAPONS_MAX_LENGTH]; // x = Array index. @@ -260,13 +469,11 @@ bool:ZMarketMenuTypes(client) SetMenuExitBackButton(menu_zmarket_types, true); DisplayMenu(menu_zmarket_types, client, MENU_TIME_FOREVER); - - // Menu sent successfully. - return true; } /** * Called when client selects option in the weapons list menu, and handles it. + * * @param menu_zmarket_types Handle of the menu being used. * @param action The action done on the menu (see menus.inc, enum MenuAction). * @param client The client index. @@ -280,28 +487,6 @@ public ZMarketMenuTypesHandle(Handle:menu_zmarket_types, MenuAction:action, clie decl String:weapontype[WEAPONS_MAX_LENGTH]; GetMenuItem(menu_zmarket_types, slot, weapontype, sizeof(weapontype)); - if (StrEqual(weapontype, "Rebuy")) - { - // Force client to rebuy weapons. - ZMarketRebuy(client); - - // Resend menu. - ZMarketMenuTypes(client); - - return; - } - - if (StrEqual(weapontype, "Auto-Rebuy")) - { - // Toggle rebuy. - g_bZMarketAutoRebuy[client] = !g_bZMarketAutoRebuy[client]; - - // Resend menu. - ZMarketMenuTypes(client); - - return; - } - // Get weapon index. new weapontypeindex = RestrictTypeToIndex(weapontype); @@ -326,7 +511,7 @@ public ZMarketMenuTypesHandle(Handle:menu_zmarket_types, MenuAction:action, clie // Client hit "Back" button. if (slot == MenuCancel_ExitBack) { - MenuMain(client); + ZMarketMenuMain(client); } } // Client hit "Exit" button. @@ -338,6 +523,7 @@ public ZMarketMenuTypesHandle(Handle:menu_zmarket_types, MenuAction:action, clie /** * Sends a list of weapons of a certain type in a menu to the client. + * * @param client The client index. */ ZMarketMenuTypeWeapons(client) @@ -455,6 +641,7 @@ ZMarketMenuTypeWeapons(client) /** * Called when client selects option in the weapon group menu, and handles it. + * * @param menu_zmarket_typeweapons Handle of the menu being used. * @param action The action done on the menu (see menus.inc, enum MenuAction). * @param client The client index. @@ -636,6 +823,59 @@ stock bool:ZMarketEquip(client, const String:weapon[], bool:rebuy = false) return true; } +/** + * Gets the client's current weapons and puts them in the rebuy cache. + * + * @param client The client index. + * @return True if the menu sent successfully, false if not. + */ +bool:ZMarketGetCurrentLoadout(client) +{ + // If client is dead, then tell them they must be alive and stop. + if (!IsPlayerAlive(client)) + { + TranslationPrintToChat(client, "Must be alive"); + return false; + } + + // If client is a zombie, then tell them they must be human and stop. + if (!IsPlayerAlive(client)) + { + TranslationPrintToChat(client, "Must be human"); + return false; + } + + // Get all of client's current weapons. + new weapons[WeaponsSlot]; + WeaponsGetClientWeapons(client, weapons); + + decl String:weaponname[WEAPONS_MAX_LENGTH]; + + // x = Weapon slot. + for (new x = 0; x < WEAPONS_SLOTS_MAX; x++) + { + // If slot is empty, then clear this slot in rebuy cache and stop. + if (weapons[x] == -1) + { + // Empty rebuy slot. + strcopy(g_strZMarketLastWeapon[client][x], sizeof(g_strZMarketLastWeapon), ""); + continue; + } + + // Get the name of the weapon. + GetEdictClassname(weapons[x], weaponname, sizeof(weaponname)); + ReplaceString(weaponname, sizeof(weaponname), "weapon_", ""); + + // Copy the name to the rebuy cache. + strcopy(g_strZMarketLastWeapon[client][x], sizeof(g_strZMarketLastWeapon), weaponname); + } + + // Tell client their loadout has been updated. + TranslationPrintToChat(client, "Weapons zmarket get current loadout"); + + return true; +} + /** * Force a client to rebuy their weapons. * @@ -687,7 +927,7 @@ public Action:ZMarketCommand(client, argc) } // Send ZMarket menu. - ZMarketMenuTypes(client); + ZMarketMenuMain(client); // This stops the "Unknown command" message in client's console. return Plugin_Handled;