From a1cb7e2431a49135e291b43ba73e18d221b5a8b4 Mon Sep 17 00:00:00 2001 From: dragokas Date: Sun, 31 Mar 2019 20:06:52 +0300 Subject: [PATCH] translation support --- .../scripting/LMC_L4D1_Menu_Choosing.sp | 79 +++-- .../scripting/LMC_L4D2_Menu_Choosing.sp | 134 +++---- .../sourcemod/scripting/include/LMCCore.inc | 115 +++++- .../translations/l4d_lmc.phrases.txt | 331 ++++++++++++++++++ 4 files changed, 554 insertions(+), 105 deletions(-) create mode 100644 addons/sourcemod/translations/l4d_lmc.phrases.txt diff --git a/addons/sourcemod/scripting/LMC_L4D1_Menu_Choosing.sp b/addons/sourcemod/scripting/LMC_L4D1_Menu_Choosing.sp index 9cb10af..986dd0d 100644 --- a/addons/sourcemod/scripting/LMC_L4D1_Menu_Choosing.sp +++ b/addons/sourcemod/scripting/LMC_L4D1_Menu_Choosing.sp @@ -28,13 +28,14 @@ #define REQUIRE_PLUGIN #include #include + #undef REQUIRE_PLUGIN #pragma newdecls required #define PLUGIN_NAME "LMC_L4D1_Menu_Choosing" -#define PLUGIN_VERSION "1.0" +#define PLUGIN_VERSION "1.1" //change me to whatever flag you want #define COMMAND_ACCESS ADMFLAG_CHAT @@ -176,6 +177,8 @@ public Plugin myinfo = public void OnPluginStart() { + LoadTranslations("l4d_lmc.phrases"); + CreateConVar("lmc_l4d1_menu_choosing", PLUGIN_VERSION, "LMC_L4D1_Menu_Choosing_Version", FCVAR_DONTRECORD|FCVAR_NOTIFY); hCvar_AdminOnlyModel = CreateConVar("lmc_adminonly", "0", "Allow admins to only change models? (1 = true) NOTE: this will disable announcement to player who join. ((#define COMMAND_ACCESS ADMFLAG_CHAT) change to w/o flag you want or (Use override file))", FCVAR_NOTIFY, true, 0.0, true, 1.0); @@ -366,49 +369,49 @@ public Action ShowMenu(int iClient, int iArgs) { if(iClient == 0) { - ReplyToCommand(iClient, "[LMC] Menu is in-game only."); + ReplyToCommand(iClient, Translate(iClient, "%t", "In-game only")); // "[LMC] Menu is in-game only."); return Plugin_Continue; } if(g_bAdminOnly && !CheckCommandAccess(iClient, "sm_lmc", COMMAND_ACCESS)) { - ReplyToCommand(iClient, "\x04[LMC] \x03Model Changer is only available to admins."); + ReplyToCommand(iClient, Translate(iClient, "%t", "Admin only")); // "\x04[LMC] \x03Model Changer is only available to admins."); return Plugin_Continue; } if(!IsPlayerAlive(iClient) && bAutoBlockedMsg[iClient][5]) { - ReplyToCommand(iClient, "\x04[LMC] \x03Pick a Model to be Applied NextSpawn"); + ReplyToCommand(iClient, Translate(iClient, "%t", "Alive only")); // "\x04[LMC] \x03Pick a Model to be Applied NextSpawn"); bAutoBlockedMsg[iClient][5] = false; } Handle hMenu = CreateMenu(CharMenu); - SetMenuTitle(hMenu, "Lux's Model Changer");//1.4 + SetMenuTitle(hMenu, Translate(iClient, "%t", "Lux's Model Changer"));//1.4 - AddMenuItem(hMenu, "1", "Normal Models"); - AddMenuItem(hMenu, "2", "Random Common"); + AddMenuItem(hMenu, "1", Translate(iClient, "%t", "Normal Models")); + AddMenuItem(hMenu, "2", Translate(iClient, "%t", "Random Common")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Witch])) - AddMenuItem(hMenu, "3", "Witch"); + AddMenuItem(hMenu, "3", Translate(iClient, "%t", "Witch")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Boomer])) - AddMenuItem(hMenu, "4", "Boomer"); + AddMenuItem(hMenu, "4", Translate(iClient, "%t", "Boomer")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Hunter])) - AddMenuItem(hMenu, "5", "Hunter"); + AddMenuItem(hMenu, "5", Translate(iClient, "%t", "Hunter")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Smoker])) - AddMenuItem(hMenu, "6", "Smoker"); + AddMenuItem(hMenu, "6", Translate(iClient, "%t", "Smoker")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Pilot])) - AddMenuItem(hMenu, "7", "Chopper Pilot"); + AddMenuItem(hMenu, "7", Translate(iClient, "%t", "Chopper Pilot")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Bill])) - AddMenuItem(hMenu, "8", "Bill"); + AddMenuItem(hMenu, "8", Translate(iClient, "%t", "Bill")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Zoey])) - AddMenuItem(hMenu, "9", "Zoey"); + AddMenuItem(hMenu, "9", Translate(iClient, "%t", "Zoey")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Francis])) - AddMenuItem(hMenu, "10", "Francis"); + AddMenuItem(hMenu, "10", Translate(iClient, "%t", "Francis")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Louis])) - AddMenuItem(hMenu, "11", "Louis"); + AddMenuItem(hMenu, "11", Translate(iClient, "%t", "Louis")); if(g_bTankModel) { if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Tank])) - AddMenuItem(hMenu, "12", "Tank"); + AddMenuItem(hMenu, "12", Translate(iClient, "%t", "Tank")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_TankDLC3])) - AddMenuItem(hMenu, "13", "Tank DLC"); + AddMenuItem(hMenu, "13", Translate(iClient, "%t", "Tank DLC")); } SetMenuExitButton(hMenu, true); @@ -465,7 +468,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][0]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Smoker"); + CPrintToChat(iClient, "%t", "Disabled_Models_Smoker"); // "\x04[LMC] \x03Server Has Disabled Models for \x04Smoker"); bAutoBlockedMsg[iClient][0] = false; return; } @@ -477,7 +480,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][1]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Boomer"); + CPrintToChat(iClient, "%t", "Disabled_Models_Boomer"); // "\x04[LMC] \x03Server Has Disabled Models for \x04Boomer"); bAutoBlockedMsg[iClient][1] = false; return; } @@ -489,7 +492,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][2]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Hunter"); + CPrintToChat(iClient, "%t", "Disabled_Models_Hunter"); // "\x04[LMC] \x03Server Has Disabled Models for \x04Hunter"); bAutoBlockedMsg[iClient][2] = false; return; } @@ -501,7 +504,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][3]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Tank"); + CPrintToChat(iClient, "%t", ""); // "\x04[LMC] \x03Server Has Disabled Models for \x04Tank"); bAutoBlockedMsg[iClient][3] = false; return; } @@ -515,7 +518,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][4]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Survivors"); + CPrintToChat(iClient, "%t", "Disabled_Models_Tank"); // "\x04[LMC] \x03Server Has Disabled Models for \x04Survivors"); bAutoBlockedMsg[iClient][4] = false; return; } @@ -533,7 +536,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Models will be default"); + CPrintToChat(iClient, "%t", "Default_Models"); // "\x04[LMC] \x03Models will be default"); bAutoApplyMsg[iClient] = false; return; } @@ -558,7 +561,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Common Infected"); + CPrintToChat(iClient, "%t", "Model_Common"); // "\x04[LMC] \x03Model is \x04Common Infected"); bAutoApplyMsg[iClient] = false; } case 3: @@ -569,7 +572,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Witch"); + CPrintToChat(iClient, "%t", "Model_Witch"); // "\x04[LMC] \x03Model is \x04Witch"); bAutoApplyMsg[iClient] = false; } case 4: @@ -580,7 +583,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Boomer"); + CPrintToChat(iClient, "%t", "Model_Boomer"); // "\x04[LMC] \x03Model is \x04Boomer"); bAutoApplyMsg[iClient] = false; } case 5: @@ -590,7 +593,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Hunter"); + CPrintToChat(iClient, "%t", "Model_Hunter"); // "\x04[LMC] \x03Model is \x04Hunter"); bAutoApplyMsg[iClient] = false; } case 6: @@ -601,7 +604,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Smoker"); + CPrintToChat(iClient, "%t", "Model_Smoker"); // "\x04[LMC] \x03Model is \x04Smoker"); bAutoApplyMsg[iClient] = false; } case 7: @@ -612,7 +615,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Chopper Pilot"); + CPrintToChat(iClient, "%t", "Model_Chopper_Pilot"); // "\x04[LMC] \x03Model is \x04Chopper Pilot"); bAutoApplyMsg[iClient] = false; } case 8: @@ -623,7 +626,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Bill"); + CPrintToChat(iClient, "%t", "Model_Bill"); // "\x04[LMC] \x03Model is \x04Bill"); bAutoApplyMsg[iClient] = false; } case 9: @@ -634,7 +637,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Zoey"); + CPrintToChat(iClient, "%t", "Model_Zoey"); // "\x04[LMC] \x03Model is \x04Zoey"); bAutoApplyMsg[iClient] = false; } case 10: @@ -645,7 +648,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Francis"); + CPrintToChat(iClient, "%t", "Model_Francis"); // "\x04[LMC] \x03Model is \x04Francis"); bAutoApplyMsg[iClient] = false; } case 11: @@ -656,7 +659,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Louis"); + CPrintToChat(iClient, "%t", "Model_Louis"); // "\x04[LMC] \x03Model is \x04Louis"); bAutoApplyMsg[iClient] = false; } case 12: @@ -670,7 +673,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Tank"); + CPrintToChat(iClient, "%t", "Model_Tank"); // "\x04[LMC] \x03Model is \x04Tank"); bAutoApplyMsg[iClient] = false; } case 13: @@ -684,7 +687,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Tank DLC"); + CPrintToChat(iClient, "%t", "Model_Tank_DLC"); // "\x04[LMC] \x03Model is \x04Tank DLC"); bAutoApplyMsg[iClient] = false; } } @@ -710,10 +713,10 @@ public Action iClientInfo(Handle hTimer, any iUserID) { case 1: { - PrintToChat(iClient, "\x04[LMC] \x03To Change Model use chat Command \x04!lmc\x03"); + CPrintToChat(iClient, "%t", "Change_Model_Help_Chat"); // "\x04[LMC] \x03To Change Model use chat Command \x04!lmc\x03"); EmitSoundToClient(iClient, sJoinSound, SOUND_FROM_PLAYER, SNDCHAN_STATIC); } - case 2: PrintHintText(iClient, "[LMC] To Change Model use chat Command !lmc"); + case 2: PrintHintText(iClient, "%t", "Change_Model_Help_Hint"); // "[LMC] To Change Model use chat Command !lmc"); } return Plugin_Stop; } diff --git a/addons/sourcemod/scripting/LMC_L4D2_Menu_Choosing.sp b/addons/sourcemod/scripting/LMC_L4D2_Menu_Choosing.sp index 79d882b..05f4001 100644 --- a/addons/sourcemod/scripting/LMC_L4D2_Menu_Choosing.sp +++ b/addons/sourcemod/scripting/LMC_L4D2_Menu_Choosing.sp @@ -35,7 +35,7 @@ #define PLUGIN_NAME "LMC_L4D2_Menu_Choosing" -#define PLUGIN_VERSION "1.0.6" +#define PLUGIN_VERSION "1.0.7" //change me to whatever flag you want #define COMMAND_ACCESS ADMFLAG_CHAT @@ -240,6 +240,8 @@ public Plugin myinfo = public void OnPluginStart() { + LoadTranslations("l4d_lmc.phrases"); + CreateConVar("lmc_l4d2_menu_choosing", PLUGIN_VERSION, "LMC_L4D2_Menu_Choosing_Version", FCVAR_DONTRECORD|FCVAR_NOTIFY); hCvar_AdminOnlyModel = CreateConVar("lmc_adminonly", "0", "Allow admins to only change models? (1 = true) NOTE: this will disable announcement to player who join. ((#define COMMAND_ACCESS ADMFLAG_CHAT) change to w/o flag you want or (Use override file))", FCVAR_NOTIFY, true, 0.0, true, 1.0); @@ -436,73 +438,73 @@ public Action ShowMenu(int iClient, int iArgs) { if(iClient == 0) { - ReplyToCommand(iClient, "[LMC] Menu is in-game only."); + ReplyToCommand(iClient, Translate(iClient, "%t", "In-game only")); // "[LMC] Menu is in-game only."); return Plugin_Continue; } if(g_bAdminOnly && !CheckCommandAccess(iClient, "sm_lmc", COMMAND_ACCESS)) { - ReplyToCommand(iClient, "\x04[LMC] \x03Model Changer is only available to admins."); + ReplyToCommand(iClient, Translate(iClient, "%t", "Admin only")); // "\x04[LMC] \x03Model Changer is only available to admins."); return Plugin_Continue; } if(!IsPlayerAlive(iClient) && bAutoBlockedMsg[iClient][8]) { - ReplyToCommand(iClient, "\x04[LMC] \x03Pick a Model to be Applied NextSpawn"); + ReplyToCommand(iClient, Translate(iClient, "%t", "Alive only")); // "\x04[LMC] \x03Pick a Model to be Applied NextSpawn"); bAutoBlockedMsg[iClient][8] = false; } Handle hMenu = CreateMenu(CharMenu); - SetMenuTitle(hMenu, "Lux's Model Changer");//1.4 + SetMenuTitle(hMenu, Translate(iClient, "%t", "Lux's Model Changer"));//1.4 - AddMenuItem(hMenu, "1", "Normal Models"); - AddMenuItem(hMenu, "2", "Random Common"); + AddMenuItem(hMenu, "1", Translate(iClient, "%t", "Normal Models")); + AddMenuItem(hMenu, "2", Translate(iClient, "%t", "Random Common")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Witch])) - AddMenuItem(hMenu, "3", "Witch"); + AddMenuItem(hMenu, "3", Translate(iClient, "%t", "Witch")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_WitchBride])) - AddMenuItem(hMenu, "4", "Witch Bride"); + AddMenuItem(hMenu, "4", Translate(iClient, "%t", "Witch Bride")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Boomer])) - AddMenuItem(hMenu, "5", "Boomer"); + AddMenuItem(hMenu, "5", Translate(iClient, "%t", "Boomer")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Boomette])) - AddMenuItem(hMenu, "6", "Boomette"); + AddMenuItem(hMenu, "6", Translate(iClient, "%t", "Boomette")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Hunter])) - AddMenuItem(hMenu, "7", "Hunter"); + AddMenuItem(hMenu, "7", Translate(iClient, "%t", "Hunter")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Smoker])) - AddMenuItem(hMenu, "8", "Smoker"); + AddMenuItem(hMenu, "8", Translate(iClient, "%t", "Smoker")); if(IsModelPrecached(sUnCommonPaths[LMCUnCommonModelType_RiotCop])) - AddMenuItem(hMenu, "9", "Riot Cop"); + AddMenuItem(hMenu, "9", Translate(iClient, "%t", "Riot Cop")); if(IsModelPrecached(sUnCommonPaths[LMCUnCommonModelType_MudMan])) - AddMenuItem(hMenu, "10", "MudMan"); + AddMenuItem(hMenu, "10", Translate(iClient, "%t", "MudMan")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Pilot])) - AddMenuItem(hMenu, "11", "Chopper Pilot"); + AddMenuItem(hMenu, "11", Translate(iClient, "%t", "Chopper Pilot")); if(IsModelPrecached(sUnCommonPaths[LMCUnCommonModelType_Ceda])) - AddMenuItem(hMenu, "12", "CEDA"); + AddMenuItem(hMenu, "12", Translate(iClient, "%t", "CEDA")); if(IsModelPrecached(sUnCommonPaths[LMCUnCommonModelType_Clown])) - AddMenuItem(hMenu, "13", "Clown"); + AddMenuItem(hMenu, "13", Translate(iClient, "%t", "Clown")); if(IsModelPrecached(sUnCommonPaths[LMCUnCommonModelType_Jimmy])) - AddMenuItem(hMenu, "14", "Jimmy Gibs"); + AddMenuItem(hMenu, "14", Translate(iClient, "%t", "Jimmy Gibs")); if(IsModelPrecached(sUnCommonPaths[LMCUnCommonModelType_Fallen])) - AddMenuItem(hMenu, "15", "Fallen Survivor"); + AddMenuItem(hMenu, "15", Translate(iClient, "%t", "Fallen Survivor")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Nick])) - AddMenuItem(hMenu, "16", "Nick"); + AddMenuItem(hMenu, "16", Translate(iClient, "%t", "Nick")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Rochelle])) - AddMenuItem(hMenu, "17", "Rochelle"); + AddMenuItem(hMenu, "17", Translate(iClient, "%t", "Rochelle")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Coach])) - AddMenuItem(hMenu, "18", "Coach"); + AddMenuItem(hMenu, "18", Translate(iClient, "%t", "Coach")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Ellis])) - AddMenuItem(hMenu, "19", "Ellis"); + AddMenuItem(hMenu, "19", Translate(iClient, "%t", "Ellis")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Bill])) - AddMenuItem(hMenu, "20", "Bill"); + AddMenuItem(hMenu, "20", Translate(iClient, "%t", "Bill")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Zoey]))// not going to filter light model other checks will get that. - AddMenuItem(hMenu, "21", "Zoey"); + AddMenuItem(hMenu, "21", Translate(iClient, "%t", "Zoey")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Francis]))// not going to filter light model other checks will get that. - AddMenuItem(hMenu, "22", "Francis"); + AddMenuItem(hMenu, "22", Translate(iClient, "%t", "Francis")); if(IsModelPrecached(sHumanPaths[LMCHumanModelType_Louis])) - AddMenuItem(hMenu, "23", "Louis"); + AddMenuItem(hMenu, "23", Translate(iClient, "%t", "Louis")); if(g_bTankModel) { if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_Tank])) - AddMenuItem(hMenu, "24", "Tank"); + AddMenuItem(hMenu, "24", Translate(iClient, "%t", "Tank")); if(IsModelPrecached(sSpecialPaths[LMCSpecialModelType_TankDLC3])) - AddMenuItem(hMenu, "25", "Tank DLC"); + AddMenuItem(hMenu, "25", Translate(iClient, "%t", "Tank DLC")); } SetMenuExitButton(hMenu, true); //DisplayMenu(hMenu, iClient, 15); @@ -559,7 +561,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][0]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Smoker"); + CPrintToChat(iClient, "%t", "Disabled_Models_Smoker"); // "\x04[LMC] \x03Server Has Disabled Models for \x04Smoker"); bAutoBlockedMsg[iClient][0] = false; return; } @@ -571,7 +573,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][1]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Boomer"); + CPrintToChat(iClient, "%t", "Disabled_Models_Boomer"); // "\x04[LMC] \x03Server Has Disabled Models for \x04Boomer"); bAutoBlockedMsg[iClient][1] = false; return; } @@ -583,7 +585,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][2]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Hunter"); + CPrintToChat(iClient, "%t", "Disabled_Models_Hunter"); // "\x04[LMC] \x03Server Has Disabled Models for \x04Hunter"); bAutoBlockedMsg[iClient][2] = false; return; } @@ -593,7 +595,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][3]) return; - PrintToChat(iClient, "\x04[LMC] \x03Models Don't Work for \x04Spitter"); + CPrintToChat(iClient, "%t", "Unsupported_Spitter"); // "\x04[LMC] \x03Models Don't Work for \x04Spitter"); bAutoBlockedMsg[iClient][3] = false; return; } @@ -602,7 +604,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][4]) return; - PrintToChat(iClient, "\x04[LMC] \x03Models Don't Work for \x04Jockey"); + CPrintToChat(iClient, "%t", "Unsupported_Jockey"); // "\x04[LMC] \x03Models Don't Work for \x04Jockey"); bAutoBlockedMsg[iClient][4] = false; return; } @@ -614,7 +616,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][5]) return; - PrintToChat(iClient, "\x04[LMC] \x03Models Don't Work for \x04Charger"); + CPrintToChat(iClient, "%t", "Unsupported_Charger"); // "\x04[LMC] \x03Models Don't Work for \x04Charger"); bAutoBlockedMsg[iClient][5] = false; return; } @@ -625,7 +627,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][6]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Tank"); + CPrintToChat(iClient, "%t", "Disabled_Models_Tank"); // "\x04[LMC] \x03Server Has Disabled Models for \x04Tank"); bAutoBlockedMsg[iClient][6] = false; return; } @@ -639,7 +641,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoBlockedMsg[iClient][7]) return; - PrintToChat(iClient, "\x04[LMC] \x03Server Has Disabled Models for \x04Survivors"); + CPrintToChat(iClient, "%t", "Disabled_Models_Survivors"); // "\x04[LMC] \x03Server Has Disabled Models for \x04Survivors"); bAutoBlockedMsg[iClient][7] = false; return; } @@ -657,7 +659,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Models will be default"); + CPrintToChat(iClient, "%t", "Default_Models"); // "\x04[LMC] \x03Models will be default"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; return; @@ -683,7 +685,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Common Infected"); + CPrintToChat(iClient, "%t", "Model_Common"); // "\x04[LMC] \x03Model is \x04Common Infected"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -695,7 +697,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Witch"); + CPrintToChat(iClient, "%t", "Model_Witch"); // "\x04[LMC] \x03Model is \x04Witch"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -707,7 +709,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Witch Bride"); + CPrintToChat(iClient, "%t", "Model_Witch_Bride"); // "\x04[LMC] \x03Model is \x04Witch Bride"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -719,7 +721,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Boomer"); + CPrintToChat(iClient, "%t", "Model_Boomer"); // "\x04[LMC] \x03Model is \x04Boomer"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -731,7 +733,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Boomette"); + CPrintToChat(iClient, "%t", "Model_Boomette"); // "\x04[LMC] \x03Model is \x04Boomette"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -742,7 +744,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Hunter"); + CPrintToChat(iClient, "%t", "Model_Hunter"); // "\x04[LMC] \x03Model is \x04Hunter"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -754,7 +756,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Smoker"); + CPrintToChat(iClient, "%t", "Model_Smoker"); // "\x04[LMC] \x03Model is \x04Smoker"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -766,7 +768,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04RiotCop"); + CPrintToChat(iClient, "%t", "Model_RiotCop"); // "\x04[LMC] \x03Model is \x04RiotCop"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -778,7 +780,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04MudMen"); + CPrintToChat(iClient, "%t", "Model_MudMen"); // "\x04[LMC] \x03Model is \x04MudMen"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -790,7 +792,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Chopper Pilot"); + CPrintToChat(iClient, "%t", "Model_Chopper_Pilot"); // "\x04[LMC] \x03Model is \x04Chopper Pilot"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -802,7 +804,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04CEDA Suit"); + CPrintToChat(iClient, "%t", "Model_Chopper_CEDA"); // "\x04[LMC] \x03Model is \x04CEDA Suit"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -814,7 +816,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Clown"); + CPrintToChat(iClient, "%t", "Model_Chopper_Clown"); // "\x04[LMC] \x03Model is \x04Clown"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -826,7 +828,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Jimmy Gibs"); + CPrintToChat(iClient, "%t", "Model_Chopper_Jimmy_Gibs"); // "\x04[LMC] \x03Model is \x04Jimmy Gibs"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -838,7 +840,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Fallen Survivor"); + CPrintToChat(iClient, "%t", "Model_Chopper_Fallen_Survivor"); // "\x04[LMC] \x03Model is \x04Fallen Survivor"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -851,7 +853,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Nick"); + CPrintToChat(iClient, "%t", "Model_Chopper_Nick"); // "\x04[LMC] \x03Model is \x04Nick"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -863,7 +865,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Rochelle"); + CPrintToChat(iClient, "%t", "Model_Chopper_Rochelle"); // "\x04[LMC] \x03Model is \x04Rochelle"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -875,7 +877,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Coach"); + CPrintToChat(iClient, "%t", "Model_Chopper_Coach"); // "\x04[LMC] \x03Model is \x04Coach"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -887,7 +889,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Ellis"); + CPrintToChat(iClient, "%t", "Model_Chopper_Ellis"); // "\x04[LMC] \x03Model is \x04Ellis"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -899,7 +901,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Bill"); + CPrintToChat(iClient, "%t", "Model_Bill"); // "\x04[LMC] \x03Model is \x04Bill"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -921,7 +923,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Zoey"); + CPrintToChat(iClient, "%t", "Model_Zoey"); // "\x04[LMC] \x03Model is \x04Zoey"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -943,7 +945,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Francis"); + CPrintToChat(iClient, "%t", "Model_Francis"); // "\x04[LMC] \x03Model is \x04Francis"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -955,7 +957,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Louis"); + CPrintToChat(iClient, "%t", "Model_Louis"); // "\x04[LMC] \x03Model is \x04Louis"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -970,7 +972,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Tank"); + CPrintToChat(iClient, "%t", "Model_Tank"); // "\x04[LMC] \x03Model is \x04Tank"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -985,7 +987,7 @@ void ModelIndex(int iClient, int iCaseNum, bool bUsingMenu=false) if(!bUsingMenu && !bAutoApplyMsg[iClient]) return; - PrintToChat(iClient, "\x04[LMC] \x03Model is \x04Tank DLC"); + CPrintToChat(iClient, "%t", "Model_Tank_DLC"); // "\x04[LMC] \x03Model is \x04Tank DLC"); SetExternalView(iClient); bAutoApplyMsg[iClient] = false; } @@ -1012,10 +1014,10 @@ public Action iClientInfo(Handle hTimer, any iUserID) { case 1: { - PrintToChat(iClient, "\x04[LMC] \x03To Change Model use chat Command \x04!lmc\x03"); + CPrintToChat(iClient, "%t", "Change_Model_Help_Chat"); // "\x04[LMC] \x03To Change Model use chat Command \x04!lmc\x03"); EmitSoundToClient(iClient, sJoinSound, SOUND_FROM_PLAYER, SNDCHAN_STATIC); } - case 2: PrintHintText(iClient, "[LMC] To Change Model use chat Command !lmc"); + case 2: PrintHintText(iClient, "%t", "Change_Model_Help_Hint"); // "[LMC] To Change Model use chat Command !lmc"); case 3: { int iEntity = CreateEntityByName("env_instructor_hint"); @@ -1032,7 +1034,7 @@ public Action iClientInfo(Handle hTimer, any iUserID) DispatchKeyValue(iEntity, "hint_timeout", sValues); DispatchKeyValue(iEntity, "hint_range", "100"); DispatchKeyValue(iEntity, "hint_icon_onscreen", "icon_tip"); - DispatchKeyValue(iEntity, "hint_caption", "[LMC] To Change Model use chat Command !lmc"); + DispatchKeyValue(iEntity, "hint_caption", Translate(iClient, "%t", "Change_Model_Help_Hint")); // "[LMC] To Change Model use chat Command !lmc"); Format(sValues, sizeof(sValues), "%i %i %i", GetRandomInt(1, 255), GetRandomInt(100, 255), GetRandomInt(1, 255)); DispatchKeyValue(iEntity, "hint_color", sValues); DispatchSpawn(iEntity); diff --git a/addons/sourcemod/scripting/include/LMCCore.inc b/addons/sourcemod/scripting/include/LMCCore.inc index 0e3b895..305eccc 100644 --- a/addons/sourcemod/scripting/include/LMCCore.inc +++ b/addons/sourcemod/scripting/include/LMCCore.inc @@ -96,6 +96,119 @@ forward void LMC_OnClientModelApplied(int iClient, int iEntity, const char sMode */ forward void LMC_OnClientModelDestroyed(int iClient, int iEntity); +/** +* @note Used for in-line string translation. +* +* @param iClient Client Index, translation is apllied to. +* @param format String formatting rules. By default, you should pass at least "%t" specifier. +* @param ... Variable number of format parameters. +* @return char[192] Resulting string. Note: output buffer is hardly limited. +*/ +stock char[] Translate(int iClient, const char[] format, any ...) +{ + char buffer[192]; + SetGlobalTransTarget(iClient); + VFormat(buffer, sizeof(buffer), format, 3); + return buffer; +} + +/** +* @note Prints a message to a specific client in the chat area. Supports named colors in translation file. +* +* @param iClient Client Index. +* @param format Formatting rules. +* @param ... Variable number of format parameters. +* @no return +*/ +stock void CPrintToChat(int iClient, const char[] format, any ...) +{ + char buffer[192]; + SetGlobalTransTarget(iClient); + VFormat(buffer, sizeof(buffer), format, 3); + ReplaceColor(buffer, sizeof(buffer)); + PrintToChat(iClient, "\x01%s", buffer); +} + +/** +* @note Prints a message to all clients in the chat area. Supports named colors in translation file. +* +* @param format Formatting rules. +* @param ... Variable number of format parameters. +* @no return +*/ +stock void CPrintToChatAll(const char[] format, any ...) +{ + char buffer[192]; + for( int i = 1; i <= MaxClients; i++ ) + { + if( IsClientInGame(i) && !IsFakeClient(i) ) + { + SetGlobalTransTarget(i); + VFormat(buffer, sizeof(buffer), format, 2); + ReplaceColor(buffer, sizeof(buffer)); + PrintToChat(i, "\x01%s", buffer); + } + } +} + +/** +* @note Converts named color to control character. Used internally by string translation functions. +* +* @param char[] Input/Output string for convertion. +* @param maxLen Maximum length of string buffer (includes NULL terminator). +* @no return +*/ +stock void ReplaceColor(char[] message, int maxLen) +{ + ReplaceString(message, maxLen, "{white}", "\x01", false); + ReplaceString(message, maxLen, "{cyan}", "\x03", false); + ReplaceString(message, maxLen, "{orange}", "\x04", false); + ReplaceString(message, maxLen, "{green}", "\x05", false); +} + +/** +* @note Prints a hint message to all clients. Supports individual string translation for each client. +* +* @param format Formatting rules. +* @param ... Variable number of format parameters. +* @no return +*/ +stock void CPrintHintTextToAll(const char[] format, any ...) +{ + char buffer[192]; + for( int i = 1; i <= MaxClients; i++ ) + { + if( IsClientInGame(i) && !IsFakeClient(i) ) + { + SetGlobalTransTarget(i); + VFormat(buffer, sizeof(buffer), format, 2); + PrintHintText(i, buffer); + } + } +} + +/** +* @note Prints a center screen message to all clients. Supports individual string translation for each client. +* +* @param format Formatting rules. +* @param ... Variable number of format parameters. +* @no return +*/ +stock void CPrintCenterTextAll(const char[] format, any ...) +{ + char buffer[192]; + for( int i = 1; i <= MaxClients; i++ ) + { + if( IsClientInGame(i) && !IsFakeClient(i) ) + { + SetGlobalTransTarget(i); + VFormat(buffer, sizeof(buffer), format, 2); + PrintCenterText(i, buffer); + } + } +} + + @@ -202,4 +315,4 @@ public void __pl_LMCCore_SetNTVOptional() MarkNativeAsOptional("LMC_ResetRenderMode"); MarkNativeAsOptional("LMC_HideClientOverlayModel"); } -#endif \ No newline at end of file +#endif diff --git a/addons/sourcemod/translations/l4d_lmc.phrases.txt b/addons/sourcemod/translations/l4d_lmc.phrases.txt new file mode 100644 index 0000000..4903dff --- /dev/null +++ b/addons/sourcemod/translations/l4d_lmc.phrases.txt @@ -0,0 +1,331 @@ +/* + Following named colors are supported: + - {white} (use instead of \x01 ) + - {cyan} (use instead of \x03 ) + - {orange} (use instead of \x04 ) + - {green} (use instead of \x05 ) +*/ + +"Phrases" +{ + "In-game only" + { + "en" "[LMC] Menu is in-game only." + "ru" "[LMC] Меню доступно только в игре." + } + "Admin only" + { + "en" "{orange}[LMC] {cyan}Model Changer is only available to admins." + "ru" "{orange}[LMC] {cyan}Смена модели доступна только для админов." + } + "Alive only" + { + "en" "{orange}[LMC] {cyan}Pick a Model to be Applied NextSpawn" + "ru" "{orange}[LMC] {cyan}Сменить модель можно при следующем возрождении" + } + "Lux's Model Changer" + { + "en" "Lux's Model Changer" + "ru" "Смена персонажа (от Lux)" + } + "Normal Models" + { + "en" "Normal Models" + "ru" "Обычные модели" + } + "Random Common" + { + "en" "Random Common" + "ru" "Случайный зомби" + } + "Witch" + { + "en" "Witch" + "ru" "Ведьма" + } + "Witch Bride" + { + "en" "Witch Bride" + "ru" "Ведьма-невеста" + } + "Boomer" + { + "en" "Boomer" + "ru" "Толстяк" + } + "Boomette" + { + "en" "Boomette" + "ru" "Толстунья" + } + "Hunter" + { + "en" "Hunter" + "ru" "Охотник" + } + "Smoker" + { + "en" "Smoker" + "ru" "Курильщик" + } + "Riot Cop" + { + "en" "Riot Cop" + "ru" "Спецназ" + } + "MudMan" + { + "en" "MudMan" + "ru" "Грязевик" + } + "Chopper Pilot" + { + "en" "Chopper Pilot" + "ru" "Пилот вертолёта" + } + "CEDA" + { + "en" "CEDA" + "ru" "Агент АЧС" + } + "Clown" + { + "en" "Clown" + "ru" "Клоун" + } + "Jimmy Gibs" + { + "en" "Jimmy Gibs" + "ru" "Джимми Гибс" + } + "Fallen Survivor" + { + "en" "Fallen Survivor" + "ru" "Падший выживший" + } + "Nick" + { + "en" "Nick" + "ru" "Ник" + } + "Rochelle" + { + "en" "Rochelle" + "ru" "Рошель" + } + "Coach" + { + "en" "Coach" + "ru" "Тренер" + } + "Ellis" + { + "en" "Ellis" + "ru" "Эллис" + } + "Bill" + { + "en" "Bill" + "ru" "Билл" + } + "Zoey" + { + "en" "Zoey" + "ru" "Зои" + } + "Francis" + { + "en" "Francis" + "ru" "Френсис" + } + "Louis" + { + "en" "Louis" + "ru" "Луис" + } + "Tank" + { + "en" "Tank" + "ru" "Танк" + } + "Tank DLC" + { + "en" "Tank DLC" + "ru" "Танк DLC" + } + "Disabled_Models_Smoker" + { + "en" "{orange}[LMC] {cyan}Server Has Disabled Models for {orange}Smoker" + "ru" "{orange}[LMC] {cyan}На сервере отключены модели для {orange}Курильщика" + } + "Disabled_Models_Boomer" + { + "en" "{orange}[LMC] {cyan}Server Has Disabled Models for {orange}Boomer" + "ru" "{orange}[LMC] {cyan}На сервере отключены модели для {orange}Толстяка" + } + "Disabled_Models_Hunter" + { + "en" "{orange}[LMC] {cyan}Server Has Disabled Models for {orange}Hunter" + "ru" "{orange}[LMC] {cyan}На сервере отключены модели для {orange}Охотника" + } + "Disabled_Models_Tank" + { + "en" "{orange}[LMC] {cyan}Server Has Disabled Models for {orange}Tank" + "ru" "{orange}[LMC] {cyan}На сервере отключены модели для {orange}Танка" + } + "Disabled_Models_Survivors" + { + "en" "{orange}[LMC] {cyan}Server Has Disabled Models for {orange}Survivors" + "ru" "{orange}[LMC] {cyan}На сервере отключены модели для {orange}Выживших" + } + "Default_Models" + { + "en" "{orange}[LMC] {cyan}Models will be default" + "ru" "{orange}[LMC] {cyan}Выбрана стандартная модель" + } + "Unsupported_Spitter" + { + "en" "{orange}[LMC] {cyan}Models Don't Work for {orange}Spitter" + "ru" "{orange}[LMC] {cyan}Модели не работают для {orange}Плевальщицы" + } + "Unsupported_Jockey" + { + "en" "{orange}[LMC] {cyan}Models Don't Work for {orange}Jockey" + "ru" "{orange}[LMC] {cyan}Модели не работают для {orange}Жокея" + } + "Unsupported_Charger" + { + "en" "{orange}[LMC] {cyan}Models Don't Work for {orange}Charger" + "ru" "{orange}[LMC] {cyan}Модели не работают для {orange}Громилы" + } + "Model_Common" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Common Infected" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Обычный заражённый" + } + "Model_Witch" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Witch" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Ведьма" + } + "Model_Witch_Bride" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Witch Bride" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Ведьма-невеста" + } + "Model_Boomer" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Boomer" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Толстяк" + } + "Model_Boomette" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Boomette" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Толстунья" + } + "Model_Hunter" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Hunter" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Охотник" + } + "Model_Smoker" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Smoker" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Курильщик" + } + "Model_RiotCop" + { + "en" "{orange}[LMC] {cyan}Model is {orange}RiotCop" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Спецназ" + } + "Model_MudMen" + { + "en" "{orange}[LMC] {cyan}Model is {orange}MudMen" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Грязевик" + } + "Model_Chopper_Pilot" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Chopper Pilot" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Пилот вертолёта" + } + "Model_Chopper_CEDA" + { + "en" "{orange}[LMC] {cyan}Model is {orange}CEDA" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Агент АЧС" + } + "Model_Chopper_Clown" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Clown" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Клоун" + } + "Model_Chopper_Jimmy_Gibs" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Jimmy Gibs" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Джимми Гибс" + } + "Model_Chopper_Fallen_Survivor" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Fallen Survivor" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Падший выживший" + } + "Model_Chopper_Nick" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Nick" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Ник" + } + "Model_Chopper_Rochelle" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Rochelle" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Рошель" + } + "Model_Chopper_Coach" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Coach" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Тренер" + } + "Model_Chopper_Ellis" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Ellis" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Эллис" + } + "Model_Bill" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Bill" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Билл" + } + "Model_Zoey" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Zoey" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Зоя" + } + "Model_Francis" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Francis" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Френсис" + } + "Model_Louis" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Louis" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Луис" + } + "Model_Tank" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Tank" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Танк" + } + "Model_Tank_DLC" + { + "en" "{orange}[LMC] {cyan}Model is {orange}Tank DLC" + "ru" "{orange}[LMC] {cyan}Выбрана модель - {orange}Танк DLC" + } + "Change_Model_Help_Chat" + { + "en" "{orange}[LMC] {cyan}To Change Model use chat Command {orange}!lmc" + "ru" "{orange}[LMC] {cyan}Для смены модели введите в чат {orange}!lmc" + } + "Change_Model_Help_Hint" + { + "en" "[LMC] To Change Model use chat Command !lmc" + "ru" "[LMC] Для смены модели введите в чат !lmc" + } +}