diff --git a/cstrike/addons/sourcemod/configs/zr/hitgroups.txt b/cstrike/addons/sourcemod/configs/zr/hitgroups.txt index 5965fd9..b354dec 100644 --- a/cstrike/addons/sourcemod/configs/zr/hitgroups.txt +++ b/cstrike/addons/sourcemod/configs/zr/hitgroups.txt @@ -12,7 +12,7 @@ // Attribute: Values: Description: // ---------------------------------------------------------------------------- // index number The hitgroup index. -// damage yes/no Allow damage to be done on this hitgroup for zombies. +// damage on/off Allow damage to be done on this hitgroup for zombies. // knockback decimal The knockback multiplier for this hitgroup. "hitgroups" // Counter-Strike: Source hitgroups @@ -23,7 +23,7 @@ "index" "0" // Damage - "damage" "yes" + "damage" "on" // Knockback "knockback" "1.0" @@ -35,7 +35,7 @@ "index" "1" // Damage - "damage" "yes" + "damage" "on" // Knockback "knockback" "2.0" @@ -47,7 +47,7 @@ "index" "2" // Damage - "damage" "yes" + "damage" "on" // Knockback "knockback" "1.3" @@ -59,7 +59,7 @@ "index" "3" // Damage - "damage" "yes" + "damage" "on" // Knockback "knockback" "1.2" @@ -71,7 +71,7 @@ "index" "4" // Damage - "damage" "yes" + "damage" "on" // Knockback "knockback" "1.0" @@ -83,7 +83,7 @@ "index" "5" // Damage - "damage" "yes" + "damage" "on" // Knockback "knockback" "1.0" @@ -95,7 +95,7 @@ "index" "6" // Damage - "damage" "yes" + "damage" "on" // Knockback "knockback" "0.9" @@ -107,7 +107,7 @@ "index" "7" // Damage - "damage" "yes" + "damage" "on" // Knockback "knockback" "0.9" @@ -119,7 +119,7 @@ "index" "8" // Damage - "damage" "yes" + "damage" "on" // Knockback "knockback" "1.0" diff --git a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt index 1fdefd4..e5f32e7 100644 --- a/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt +++ b/cstrike/addons/sourcemod/translations/zombiereloaded.phrases.txt @@ -143,7 +143,7 @@ "Config command reload all stats begin" { - "en" "Reloading all Zombie:Reloaded config files...\n ------------------------------------------------" + "en" "Reloading all Zombie:Reloaded config files...\n------------------------------------------------" } "Config command reload all stats successful" @@ -432,37 +432,37 @@ "Menu main zclass" { "#format" "{1:s}" - "en" "ZClass - Configure your class settings. (Command: {1})" + "en" "ZClass - Configure class settings. (Command: {1})" } "Menu main zcookies" { "#format" "{1:s}" - "en" "ZCookies - Toggle your personal ZR settings here. (Command: {1})" + "en" "ZCookies - Toggle personal ZR settings here. (Command: {1})" } "Menu main zspawn" { "#format" "{1:s}" - "en" "ZSpawn - Join late? Use this to spawn. (Command: {1})" + "en" "ZSpawn - Join late? Spawn with this. (Command: {1})" } "Menu main ztele" { "#format" "{1:s}" - "en" "ZTele - Teleport back to your spawn location. (Command: {1})" + "en" "ZTele - Stuck? Teleport back to spawn. (Command: {1})" } "Menu main zhp" { "#format" "{1:s}" - "en" "ZHP - Toggle real HP display when infected. (Command: {1})" + "en" "ZHP - Shows real HP as zombie. (Command: {1})" } "Menu main zmarket" { "#format" "{1:s}" - "en" "ZMarket - Need a weapon? Buy them here. (Command: {1})" + "en" "ZMarket - Customize loadouts here. (Command: {1})" } // =========================== @@ -634,7 +634,7 @@ "Weapons menu restrict types unrestrict all" { "#format" "{1:s}" - "en" "Unrestrict weapon type {1}\n " + "en" "Unrestrict weapon type {1}" } "Weapons menu restrict zmarket title" @@ -747,6 +747,25 @@ // Hitgroups (core) // =========================== + // Menu + + "Hitgroups menu hitgroups title" + { + "en" "Hitgroup Management\nCommands: zr_hitgroup(_enable_all/_headshots_only)\nSelect a Hitgroup to Toggle:" + } + + "Hitgroups menu hitgroups enable all" + { + "en" "Enable All Hitgroups" + } + + "Hitgroups menu hitgroups headshots only" + { + "en" "Headshots Only" + } + + // Commands + "Hitgroups command syntax" { "en" "Toggles or sets if a zombie's hitgroup can be damaged. Usage: zr_hitgroup [1/0]" @@ -796,7 +815,7 @@ "ZAdmin main title" { - "en" "ZAdmin\n Select Category:" + "en" "ZAdmin\nSelect Category:" } "ZAdmin main class multipliers" @@ -809,6 +828,11 @@ "en" "Weapon Management" } + "ZAdmin main hitgroups" + { + "en" "Hitgroup Management" + } + "ZAdmin main zombie" { "en" "Zombie Management" diff --git a/src/zr/config.inc b/src/zr/config.inc index ead5501..f0ca203 100644 --- a/src/zr/config.inc +++ b/src/zr/config.inc @@ -884,15 +884,15 @@ public Action:ConfigReloadAllCommand(client, argc) } /** - * Converts string of "yes" or "no" to a boolean value. + * Converts string of "yes/on" or "no/off" to a boolean value. * - * @param option "yes" or "no" string to be converted. + * @param option "yes/on" or "no/off" string to be converted. * @return True if string is "yes", false otherwise. */ stock bool:ConfigSettingToBool(const String:option[]) { // If option is equal to "yes," then return true. - if (StrEqual(option, "yes", false)) + if (StrEqual(option, "yes", false) || StrEqual(option, "on", false)) { return true; } @@ -904,8 +904,8 @@ stock bool:ConfigSettingToBool(const String:option[]) /** * Converts boolean value to "yes" or "no". * - * @param bOption True/false value to be converted to "yes"/"no", respectively. - * @param option Destination string buffer to store "yes" or "no" in. + * @param bOption True/false value to be converted to "yes/on"/"no/off", respectively. + * @param option Destination string buffer to store "yes/on" or "no/off" in. * @param maxlen Length of destination string buffer (wont't be more than 4). * @param yesno When true, returns "yes/no", false returns "on/off." */ diff --git a/src/zr/damage.inc b/src/zr/damage.inc index 37e1a24..3a4ab41 100644 --- a/src/zr/damage.inc +++ b/src/zr/damage.inc @@ -170,6 +170,13 @@ public ZRTools_Action:DamageTraceAttack(client, inflictor, attacker, Float:damag // Here we know that attacker and client are different teams. + // If client is a human, then allow damage. + if (InfectIsClientHuman(client)) + { + // Allow damage. + return ZRTools_Continue; + } + // If damage hitgroups cvar is disabled, then allow damage. new bool:damagehitgroups = GetConVarBool(g_hCvarsList[CVAR_DAMAGE_HITGROUPS]); if (!damagehitgroups) diff --git a/src/zr/hitgroups.inc b/src/zr/hitgroups.inc index 37c5def..944e7b3 100644 --- a/src/zr/hitgroups.inc +++ b/src/zr/hitgroups.inc @@ -349,6 +349,154 @@ stock Float:HitgroupsGetKnockback(index) return Float:GetArrayCell(arrayHitgroup, _:HITGROUPS_DATA_KNOCKBACK); } +/** + * Sends list of hitgroups to client. + * + * @param client The client index. + * @return True if sent successfully, false if not. + */ +bool:HitgroupsMenuHitgroups(client) +{ + // If hitgroups is disabled, then stop. + new bool:hitgroups = GetConVarBool(g_hCvarsList[CVAR_HITGROUPS]); + if (!hitgroups) + { + return false; + } + + // Create menu handle. + new Handle:menu_hitgroups = CreateMenu(HitgroupsMenuHitgroupsHandle); + + // Set client as translation target. + SetGlobalTransTarget(client); + + SetMenuTitle(menu_hitgroups, "%t\n ", "Hitgroups menu hitgroups title"); + + decl String:enableall[32]; + decl String:headshotsonly[32]; + + // Format menu options. + Format(enableall, sizeof(enableall), "%t", "Hitgroups menu hitgroups enable all"); + Format(headshotsonly, sizeof(headshotsonly), "%t\n ", "Hitgroups menu hitgroups headshots only"); + + // Add options to menu. + AddMenuItem(menu_hitgroups, "Enable All", enableall); + AddMenuItem(menu_hitgroups, "Headshots Only", headshotsonly); + + decl String:hitgroupoption[MAX_NAME_LENGTH]; + decl String:hitgroupcandamage[MAX_NAME_LENGTH]; + decl String:hitgroupid[4]; + + // x = Hitgroup index. + new size = GetArraySize(arrayHitgroups); + for (new x = 0; x < size; x++) + { + // Get hitgroup name. + HitgroupsGetName(x, hitgroupoption, sizeof(hitgroupoption)); + IntToString(x, hitgroupid, sizeof(hitgroupid)); + + // Convert bool to "On/Off" + ConfigBoolToSetting(HitgroupsCanDamage(x), hitgroupcandamage, sizeof(hitgroupcandamage), false); + + // Format "on/off" to the option. + Format(hitgroupoption, sizeof(hitgroupoption), "%s: %s", hitgroupoption, hitgroupcandamage); + + // Add option to menu. + AddMenuItem(menu_hitgroups, hitgroupid, hitgroupoption); + } + + // Create a "Back" button to the main admin menu. + SetMenuExitBackButton(menu_hitgroups, true); + + // Send menu. + DisplayMenu(menu_hitgroups, client, MENU_TIME_FOREVER); + + return true; +} + +/** + * Called when client selects option in the infect clients menu, and handles it. + * @param menu_weapons_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 HitgroupsMenuHitgroupsHandle(Handle:menu_hitgroups, MenuAction:action, client, slot) +{ + // Client selected an option. + if (action == MenuAction_Select) + { + switch(slot) + { + // Enable all hitgroups. + case 0: + { + // x = Hitgroup index. + new size = GetArraySize(arrayHitgroups); + for (new x = 0; x < size; x++) + { + // Enable hitgroup. + HitgroupsSetDamage(x, true); + } + + // Tell the server that all hitgroups have been enabled. + TranslationPrintToChatAll(true, false, "Hitgroups command enable all successful"); + } + // Headshots only. + case 1: + { + // x = Hitgroup index. + new size = GetArraySize(arrayHitgroups); + for (new x = 0; x < size; x++) + { + if (HitgroupsGetIndex(x) == HITGROUP_HEAD) + { + // Enable hitgroup. + HitgroupsSetDamage(x, true); + + continue; + } + + // Disable hitgroup. + HitgroupsSetDamage(x, false); + } + + // Tell the server that headshots only been enabled. + TranslationPrintToChatAll(true, false, "Hitgroups command headshots only successful"); + } + default: + { + // Get selected hitgroup index. + decl String:hitgroupid[4]; + GetMenuItem(menu_hitgroups, slot, hitgroupid, sizeof(hitgroupid)); + new hitgroup = StringToInt(hitgroupid); + + // Toggle value. + new bool:hitgroupcandamage = HitgroupsCanDamage(hitgroup); + HitgroupsSetDamage(hitgroup, !hitgroupcandamage); + } + } + + // Re-send menu. + HitgroupsMenuHitgroups(client); + } + // Client closed the menu. + if (action == MenuAction_Cancel) + { + // Client hit "Back" button. + if (slot == MenuCancel_ExitBack) + { + // Re-open admin menu. + ZAdminMenu(client); + } + } + // Client hit "Exit" button. + else if (action == MenuAction_End) + { + CloseHandle(menu_hitgroups); + } +} + /** * Command callback (zr_hitgroup) * Toggles or sets if a zombie's hitgroup can be damaged. @@ -436,17 +584,12 @@ public Action:HitgroupsCommand(client, argc) */ public Action:HitgroupsEnableAllCommand(client, argc) { - new hitgroup; - // x = Hitgroup index. new size = GetArraySize(arrayHitgroups); for (new x = 0; x < size; x++) { - // Get CS:S hitgroup index. - hitgroup = HitgroupsGetIndex(x); - // Set that hitgroup index to true for damage. - HitgroupsSetDamage(hitgroup, true); + HitgroupsSetDamage(x, true); } // Tell the server that all hitgroups have been enabled. @@ -467,27 +610,22 @@ public Action:HitgroupsEnableAllCommand(client, argc) */ public Action:HitgroupsHeadshotsOnlyCommand(client, argc) { - new hitgroup; - // x = Hitgroup index. new size = GetArraySize(arrayHitgroups); for (new x = 0; x < size; x++) { - // Get CS:S hitgroup index. - hitgroup = HitgroupsGetIndex(x); - // If this hitgroup is the head, then enable it and stop. - if (hitgroup == HITGROUP_HEAD) + if (HitgroupsGetIndex(x) == HITGROUP_HEAD) { - HitgroupsSetDamage(hitgroup, true); + HitgroupsSetDamage(x, true); continue; } // Set that hitgroup index to true for damage. - HitgroupsSetDamage(hitgroup, false); + HitgroupsSetDamage(x, false); } - // Tell the server that all hitgroups have been enabled. + // Tell the server that headshots only been enabled. TranslationPrintToChatAll(true, false, "Hitgroups command headshots only successful"); // Log action to game events. diff --git a/src/zr/infect.inc b/src/zr/infect.inc index 939fc56..c91a872 100644 --- a/src/zr/infect.inc +++ b/src/zr/infect.inc @@ -807,7 +807,7 @@ InfectMenuClients(client) SetMenuTitle(menu_infect_clients, "%t\n ", "Infect menu clients title"); - decl String:clientoption[MAX_NAME_LENGTH]; + decl String:clientoption[64]; decl String:clientuserid[8]; // x = Client index. diff --git a/src/zr/weapons/menu_weapons.inc b/src/zr/weapons/menu_weapons.inc index 7bc44f5..65d8752 100644 --- a/src/zr/weapons/menu_weapons.inc +++ b/src/zr/weapons/menu_weapons.inc @@ -210,7 +210,7 @@ WeaponsMenuTypeWeapons(client) decl String:unrestrictall[64]; Format(restrictall, sizeof(restrictall), "%t", "Weapons menu restrict types restrict all", typename); - Format(unrestrictall, sizeof(unrestrictall), "%t", "Weapons menu restrict types unrestrict all", typename); + Format(unrestrictall, sizeof(unrestrictall), "%t\n ", "Weapons menu restrict types unrestrict all", typename); // Draw items as selectable only if not all weapons within the type are restricted or unrestricted. AddMenuItem(menu_weapons_typeweapons, "restrictall", restrictall, MenuGetItemDraw(!RestrictIsTypeUniform(true, g_iWeaponsCurType[client]))); diff --git a/src/zr/zadmin.inc b/src/zr/zadmin.inc index db7ad09..8ae5a94 100644 --- a/src/zr/zadmin.inc +++ b/src/zr/zadmin.inc @@ -80,14 +80,16 @@ bool:ZAdminMenu(client) SetMenuTitle(menu_zadmin, "%t\n ", "ZAdmin main title"); decl String:classmultipliers[64]; + decl String:weapons[64]; + decl String:hitgroups[64]; + decl String:infect[64]; decl String:zspawn[64]; decl String:ztele[64]; - decl String:weapons[64]; - decl String:infect[64]; //decl String:logflags[64]; Format(classmultipliers, sizeof(classmultipliers), "%t", "ZAdmin main class multipliers"); Format(weapons, sizeof(weapons), "%t", "ZAdmin main weapons"); + Format(hitgroups, sizeof(hitgroups), "%t", "ZAdmin main hitgroups"); Format(infect, sizeof(infect), "%t", "ZAdmin main zombie"); Format(zspawn, sizeof(zspawn), "%t", "ZAdmin main force zspawn"); Format(ztele, sizeof(ztele), "%t", "ZAdmin main force ztele"); @@ -95,6 +97,7 @@ bool:ZAdminMenu(client) AddMenuItem(menu_zadmin, "classmultipliers", classmultipliers); AddMenuItem(menu_zadmin, "weapons", weapons); + AddMenuItem(menu_zadmin, "hitgroups", hitgroups); AddMenuItem(menu_zadmin, "infect", infect); AddMenuItem(menu_zadmin, "zspawn", zspawn); AddMenuItem(menu_zadmin, "ztele", ztele); @@ -137,8 +140,13 @@ public ZAdminMenuHandle(Handle:menu_zadmin, MenuAction:action, client, slot) { resend = !WeaponsMenuMain(client); } - // Zombie management. + // Hitgroup management. case 2: + { + resend = !HitgroupsMenuHitgroups(client); + } + // Zombie management. + case 3: { // We're not resending this menu. resend = false; @@ -147,7 +155,7 @@ public ZAdminMenuHandle(Handle:menu_zadmin, MenuAction:action, client, slot) InfectMenuClients(client); } // Force ZSpawn. - case 3: + case 4: { // We're not resending this menu. resend = false; @@ -156,7 +164,7 @@ public ZAdminMenuHandle(Handle:menu_zadmin, MenuAction:action, client, slot) MenuClientList(client, ZSpawnForceHandle, "ZSpawn clients title"); } // Force ZTele. - case 4: + case 5: { // We're not resending this menu. resend = false;