diff --git a/addons/sourcemod/data/vip/cfg/groups.ini b/addons/sourcemod/data/vip/cfg/groups.ini new file mode 100644 index 0000000..f5b3a89 --- /dev/null +++ b/addons/sourcemod/data/vip/cfg/groups.ini @@ -0,0 +1,14 @@ +"VIP_GROUPS" +{ + "vip1" // Имя группы + { + // Параметры + + } + + "vip2" // Имя группы + { + // Параметры + + } +} diff --git a/addons/sourcemod/data/vip/cfg/sort_menu.ini b/addons/sourcemod/data/vip/cfg/sort_menu.ini new file mode 100644 index 0000000..e69de29 diff --git a/addons/sourcemod/data/vip/cfg/times.ini b/addons/sourcemod/data/vip/cfg/times.ini new file mode 100644 index 0000000..bae4f80 --- /dev/null +++ b/addons/sourcemod/data/vip/cfg/times.ini @@ -0,0 +1,38 @@ +"TIMES" +{ + "0" // Время в секундах + { + "ru" "Навсегда" // Отображение в меню + "en" "Permanent" // Отображение в меню + } + + "3600" + { + "ru" "1 Час" + "en" "1 Hour" + } + + "86400" + { + "ru" "1 Сутки" + "en" "1 Day" + } + + "604800" + { + "ru" "1 Неделя" + "en" "1 Week" + } + + "2592000" + { + "ru" "1 Месяц" + "en" "1 Month" + } + + "15552000" + { + "ru" "6 Месяцев" + "en" "6 Months" + } +} diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 28d6623..2971112 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -6,7 +6,11 @@ #include #include -#define VIP_VERSION "3.0.1 R" +#if defined VIP_CORE_VERSION +#define VIP_VERSION VIP_CORE_VERSION +#else +#define VIP_VERSION "3.1 DEV" +#endif #define DEBUG_MODE 0 // Режим отладки @@ -82,6 +86,10 @@ public void OnPluginStart() ITEM_DRAW = hDataPack.Position; delete hDataPack; + + g_bIsTranslationPhraseExistsAvailable = (CanTestFeatures() && + GetFeatureStatus(FeatureType_Native, "TranslationPhraseExists") == FeatureStatus_Available); + ReadConfigs(); VIPMenu_Setup(); diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index d58cfac..233f118 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -159,7 +159,6 @@ forward void VIP_OnFeatureUnregistered(const char[] szFeature); * * @param iClient Индекс игрока. * - * @return true - продолжить. * false - не выполнять проверку. */ @@ -198,7 +197,7 @@ forward void VIP_OnClientDisconnect(int iClient, bool bIsVIP); * Вызывается когда игрок получает VIP-статус. * * @param iClient Индекс игрока. - * @param iAdmin Индекс админа (0 - сервер). + * @param iAdmin Индекс админа (0 - сервер, -1 - плагин). * * @noreturn */ @@ -212,7 +211,7 @@ forward void VIP_OnVIPClientAdded(int iClient, int iAdmin); * "Expired" - Истек; * "Removed by Admin" - Удален админом; * "Removed by native" - Удален нативом. - * @param iAdmin Индекс админа (0 - сервер). + * @param iAdmin Индекс админа (0 - сервер, -1 - плагин). * * @noreturn */ @@ -366,7 +365,7 @@ native void VIP_SendClientVIPMenu(int iClient, bool bSelection = false); * * @noreturn */ -native void VIP_GiveClientVIP(int iAdmin = 0, int iClient, int iTime, const char[] szGroup, bool bAddToDB = true); +native void VIP_GiveClientVIP(int iAdmin = -1, int iClient, int iTime, const char[] szGroup, bool bAddToDB = true); #pragma deprecated Use VIP_GiveClientVIP() instead native bool VIP_SetClientVIP(int iClient, int iTime, any AuthType, const char[] szGroup, bool bAddToDB = true); @@ -382,7 +381,7 @@ native bool VIP_SetClientVIP(int iClient, int iTime, any AuthType, const char[] * @return true - Успешно. * false - Не удалось выполнить. */ -native bool VIP_RemoveClientVIP2(int iAdmin = 0, int iClient, bool bInDB, bool bNotify); +native bool VIP_RemoveClientVIP2(int iAdmin = -1, int iClient, bool bInDB, bool bNotify); #pragma deprecated Use VIP_RemoveClientVIP2() instead native bool VIP_RemoveClientVIP(int iClient, bool bInDB, bool bNotify); @@ -642,6 +641,20 @@ native bool VIP_GetTimeFromStamp(char[] szBuffer, int iMaxLength, int iTimeStamp */ native void VIP_AddStringToggleStatus(const char[] szInput, char[] szBuffer, int iMaxLength, const char[] szFeature, int iClient); +/** + * Формирует путь к файлу с настройками модуля. + * + * @param szBuffer Буфер, в который будет помещен результат. + * @param iMaxLength Размер буфера. + * @param szFileName Имя файла. + * + * @noreturn +*/ +stock void VIP_BuildModulesPath(char[] szBuffer, int iMaxLen, const char[] szFileName) +{ + BuildPath(Path_SM, szBuffer, iMaxLen, "data/vip/modules/%s", szFileName); +} + public SharedPlugin __pl_vip_core= { name = "vip_core", diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 90333bd..3963452 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -1,4 +1,3 @@ - static Handle g_hGlobalForward_OnVIPLoaded; static Handle g_hGlobalForward_OnClientPreLoad; static Handle g_hGlobalForward_OnClientLoaded; @@ -75,7 +74,7 @@ void CreateForward_OnClientDisconnect(int iClient) Call_Finish(); } -void CreateForward_OnVIPClientAdded(int iClient, int iAdmin = 0) +void CreateForward_OnVIPClientAdded(int iClient, int iAdmin = OWNER_PLUGIN) { DBG_API("CreateForward_OnVIPClientAdded(%N (%d), %d)", iClient, iClient, iAdmin) Call_StartForward(g_hGlobalForward_OnVIPClientAdded); @@ -84,7 +83,7 @@ void CreateForward_OnVIPClientAdded(int iClient, int iAdmin = 0) Call_Finish(); } -void CreateForward_OnVIPClientRemoved(int iClient, const char[] sReason, int iAdmin = 0) +void CreateForward_OnVIPClientRemoved(int iClient, const char[] sReason, int iAdmin = OWNER_PLUGIN) { DBG_API("CreateForward_OnVIPClientRemoved(%N (%d), %d, '%s')", iClient, iClient, iAdmin, sReason) Call_StartForward(g_hGlobalForward_OnVIPClientRemoved); @@ -114,7 +113,7 @@ Action CreateForward_OnShowClientInfo(int iClient, const char[] szEvent, const c Call_PushString(szType); Call_PushCell(hKeyValues); Call_Finish(eResult); - DBG_API("CreateForward_OnShowClientInfo = %b", eResult) + DBG_API("CreateForward_OnShowClientInfo = %d", eResult) return eResult; } @@ -568,7 +567,7 @@ public int Native_SetClientVIP(Handle hPlugin, int iNumParams) char szGroup[64]; GetNativeString(4, SZF(szGroup)); - return API_GiveClientVIP(hPlugin, REASON_PLUGIN, iClient, iTime, szGroup, bAddToDB); + return API_GiveClientVIP(hPlugin, OWNER_PLUGIN, iClient, iTime, szGroup, bAddToDB); } int API_GiveClientVIP(Handle hPlugin, @@ -682,7 +681,7 @@ int API_RemoveClientVIP(Handle hPlugin, int iClientID; if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { - DB_RemoveClientFromID(REASON_PLUGIN, iClient, _, true, _, _, szPluginName); + DB_RemoveClientFromID(OWNER_PLUGIN, iClient, _, true, _, _, szPluginName); } } @@ -825,28 +824,30 @@ public int Native_UnregisterFeature(Handle hPlugin, int iNumParams) public int Native_UnregisterMe(Handle hPlugin, int iNumParams) { DebugMessage("FeaturesArraySize: %d", g_hFeaturesArray.Length) - if (g_hFeaturesArray.Length > 0) + if (!g_hFeaturesArray.Length) { - char szFeature[FEATURE_NAME_LENGTH]; - ArrayList hArray; + return 0; + } - for (int i = 0, iSize = g_hFeaturesArray.Length; i < iSize; ++i) - { - g_hFeaturesArray.GetString(i, SZF(szFeature)); + char szFeature[FEATURE_NAME_LENGTH]; + ArrayList hArray; + + for (int i = 0, iSize = g_hFeaturesArray.Length; i < iSize; ++i) + { + g_hFeaturesArray.GetString(i, SZF(szFeature)); - if (GLOBAL_TRIE.GetValue(szFeature, hArray)) + if (GLOBAL_TRIE.GetValue(szFeature, hArray)) + { + if (view_as(hArray.Get(FEATURES_PLUGIN)) != hPlugin) { - if (view_as(hArray.Get(FEATURES_PLUGIN)) != hPlugin) - { - continue; - } + continue; + } - UnregisterFeature(szFeature, hArray); + UnregisterFeature(szFeature, hArray); - g_hFeaturesArray.Erase(i); - --i; - --iSize; - } + g_hFeaturesArray.Erase(i); + --i; + --iSize; } } @@ -888,7 +889,7 @@ void UnregisterFeature(const char[] szFeature, ArrayList hArray) g_hVIPMenu.AddItem("NO_FEATURES", "NO_FEATURES", ITEMDRAW_DISABLED); } } - + for (int j = 1; j <= MaxClients; ++j) { if (IsClientInGame(j) && g_iClientInfo[j] & IS_VIP) @@ -1227,7 +1228,7 @@ public int Native_GetTimeFromStamp(Handle hPlugin, int iNumParams) if (iTimeStamp > 0) { int iClient = GetNativeCell(4); - if (iClient == 0 || CheckValidClient(iClient, false)) + if (iClient == LANG_SERVER || CheckValidClient(iClient, false)) { char szBuffer[64]; UTIL_GetTimeFromStamp(SZF(szBuffer), iTimeStamp, iClient); diff --git a/addons/sourcemod/scripting/vip/AdminMenu.sp b/addons/sourcemod/scripting/vip/AdminMenu.sp index 768021c..557ea52 100644 --- a/addons/sourcemod/scripting/vip/AdminMenu.sp +++ b/addons/sourcemod/scripting/vip/AdminMenu.sp @@ -302,7 +302,7 @@ void ShowTimeMenu(int iClient) if (iMenuType != TIME_SET && szTime[0] == '0') continue; - hKv.GetString(szClientLang, SZF(szBuffer), "LangError"); + hKv.GetString(szClientLang, SZF(szBuffer)); if (!szBuffer[0]) { hKv.GetString(szServerLang, SZF(szBuffer), "LangError"); diff --git a/addons/sourcemod/scripting/vip/CMD.sp b/addons/sourcemod/scripting/vip/CMD.sp index a3766d1..c5e44dd 100644 --- a/addons/sourcemod/scripting/vip/CMD.sp +++ b/addons/sourcemod/scripting/vip/CMD.sp @@ -1,4 +1,3 @@ - void CMD_Setup() { RegConsoleCmd("sm_refresh_vips", ReloadVIPPlayers_CMD); diff --git a/addons/sourcemod/scripting/vip/Features.sp b/addons/sourcemod/scripting/vip/Features.sp index c3c6b9f..a152449 100644 --- a/addons/sourcemod/scripting/vip/Features.sp +++ b/addons/sourcemod/scripting/vip/Features.sp @@ -1,4 +1,10 @@ +bool IsValidFeature(const char[] szFeature) +{ + DebugMessage("IsValidFeature:: FindStringInArray -> %i", g_hFeaturesArray.FindString(szFeature)) + return (g_hFeaturesArray.FindString(szFeature) != -1); +} + void Features_TurnOffAll(int iClient) { DebugMessage("Features_TurnOffAll %N (%i)", iClient, iClient) diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index 069430d..527f9bd 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -35,6 +35,10 @@ #define REASON_EXPIRED -2 #define REASON_OUTDATED -3 + +#define OWNER_SERVER 0 +#define OWNER_PLUGIN -1 + char KEY_CID[] = "Core->ClientID"; char KEY_EXPIRES[] = "Core->Expires"; char KEY_GROUP[] = "Core->Group"; @@ -118,6 +122,7 @@ bool g_CVAR_bDefaultStatus; bool g_CVAR_bLogsEnable; EngineVersion g_EngineVersion; +bool g_bIsTranslationPhraseExistsAvailable; char g_szSID[64]; diff --git a/addons/sourcemod/scripting/vip/UTIL.sp b/addons/sourcemod/scripting/vip/UTIL.sp index d7878b3..7bdfee8 100644 --- a/addons/sourcemod/scripting/vip/UTIL.sp +++ b/addons/sourcemod/scripting/vip/UTIL.sp @@ -1,5 +1,4 @@ - int GET_UID(int iClient) { return iClient > 0 ? UID(iClient):iClient; @@ -36,7 +35,7 @@ stock int UTIL_ReplaceChars(char[] szBuffer, int InChar, int OutChar) if (szBuffer[i] == InChar) { szBuffer[i] = OutChar; - iNum++; + ++iNum; } } @@ -48,13 +47,10 @@ bool UTIL_StrCmpEx(const char[] szString1, const char[] szString2) int iLen = strlen(szString1); if (iLen != strlen(szString2)) { - // i don't see any reason, why we should compare strings, - // if length is different because this fact means: they - // different too. return false; } - for (int i = 0; i < iLen; i++) + for (int i = 0; i < iLen; ++i) { if (szString1[i] != szString2[i]) { @@ -256,7 +252,7 @@ void UTIL_ReloadVIPPlayers(int iClient, bool bNotify) } } /* -void UTIL_REM_VIP_PLAYER(int iClient = 0, int iTarget = 0, int iAccID = 0, int iClientID, const char[] szReason) +void UTIL_REM_VIP_PLAYER(int iClient = OWNER_SERVER, int iTarget = 0, int iAccID = 0, int iClientID, const char[] szReason) { if (g_CVAR_bLogsEnable) { @@ -297,7 +293,7 @@ void UTIL_Reply(int iClient, const char[] szMsg, any ...) } } -void UTIL_ADD_VIP_PLAYER(int iAdmin = 0, +void UTIL_ADD_VIP_PLAYER(int iAdmin = OWNER_SERVER, int iTarget = 0, int iAccID = 0, int iDuration, @@ -338,11 +334,11 @@ void UTIL_ADD_VIP_PLAYER(int iAdmin = 0, switch(iAdmin) { - case REASON_PLUGIN: + case OWNER_PLUGIN: { FormatEx(SZF(szAdmin), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); } - case 0: + case OWNER_SERVER: { FormatEx(SZF(szAdmin), "%T", "BY_SERVER", LANG_SERVER); } diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index b90dad7..d828e21 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -8,30 +8,29 @@ void VIPMenu_Setup() void AddFeatureToVIPMenu(const char[] szFeature) { DebugMessage("AddFeatureToVIPMenu: %s", szFeature) - if (g_hSortArray != null) - { - ResortFeaturesArray(); - - g_hVIPMenu.RemoveAllItems(); - - int i, iSize; - char szItemInfo[128]; - ArrayList hArray; - iSize = g_hFeaturesArray.Length; - for (i = 0; i < iSize; ++i) - { - g_hFeaturesArray.GetString(i, SZF(szItemInfo)); - if (GLOBAL_TRIE.GetValue(szItemInfo, hArray) && view_as(hArray.Get(FEATURES_ITEM_TYPE)) != HIDE) - { - DebugMessage("AddMenuItem: %s", szItemInfo) - g_hVIPMenu.AddItem(szItemInfo, szItemInfo); - } - } - } - else + if (g_hSortArray == null) { DebugMessage("AddMenuItem") g_hVIPMenu.AddItem(szFeature, szFeature); + return; + } + + ResortFeaturesArray(); + + g_hVIPMenu.RemoveAllItems(); + + int i, iSize; + char szMenuFeature[FEATURE_NAME_LENGTH]; + ArrayList hArray; + iSize = g_hFeaturesArray.Length; + for (i = 0; i < iSize; ++i) + { + g_hFeaturesArray.GetString(i, SZF(szMenuFeature)); + if (GLOBAL_TRIE.GetValue(szMenuFeature, hArray) && view_as(hArray.Get(FEATURES_ITEM_TYPE)) != HIDE) + { + DebugMessage("AddMenuItem: %s", szMenuFeature) + g_hVIPMenu.AddItem(szMenuFeature, szMenuFeature); + } } } @@ -39,7 +38,7 @@ void ResortFeaturesArray() { DebugMessage("ResortFeaturesArray\n \n ") - if ((g_hFeaturesArray).Length < 2) + if (g_hFeaturesArray.Length < 2) { return; } @@ -53,12 +52,12 @@ void ResortFeaturesArray() #endif*/ x = 0; - char szItemInfo[128]; + char szFeature[128]; for (i = 0; i < iSize; ++i) { - g_hSortArray.GetString(i, SZF(szItemInfo)); - DebugMessage("GetSortArrayString: %s (i: %i, x: %i)", szItemInfo, i, x) - index = g_hFeaturesArray.FindString(szItemInfo); + g_hSortArray.GetString(i, SZF(szFeature)); + DebugMessage("GetSortArrayString: %s (i: %i, x: %i)", szFeature, i, x) + index = g_hFeaturesArray.FindString(szFeature); DebugMessage("FindStringInGlobalArray: index: %i", index) if (index != -1) { @@ -84,11 +83,11 @@ stock void PrintArray(ArrayList &hArray) iSize = hArray.Length; if (iSize) { - char szItemInfo[128]; + char szFeature[128]; for (i = 0; i < iSize; ++i) { - hArray.GetString(i, SZF(szItemInfo)); - DebugMessage("%i: %s", i, szItemInfo) + hArray.GetString(i, SZF(szFeature)); + DebugMessage("%i: %s", i, szFeature) } } } @@ -96,34 +95,20 @@ stock void PrintArray(ArrayList &hArray) */ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOption) { - if(action == MenuAction_Display || + if((action == MenuAction_Display || action == MenuAction_DisplayItem || action == MenuAction_DrawItem || - action == MenuAction_Select) - { - if(!(g_iClientInfo[iClient] & IS_VIP) || !g_hFeatures[iClient]) - { - return 0; - } - } - static char szItemInfo[FEATURE_NAME_LENGTH]; - ArrayList hBuffer; - Function fCallback; - Handle hPlugin; - /* - switch (action) - { - case MenuAction_Display, MenuAction_DrawItem, MenuAction_DisplayItem, MenuAction_Select: + action == MenuAction_Select) && + (!(g_iClientInfo[iClient] & IS_VIP) || !g_hFeatures[iClient])) { - if (!(g_iClientInfo[iClient] & IS_VIP)) - { - (g_hVIPMenu).Cancel(); - DisplayClientInfo(iClient, "expired_info"); - return 0; - } - } + return 0; } - */ + + static char szFeature[FEATURE_NAME_LENGTH]; + static ArrayList hBuffer; + static Function fCallback; + static Handle hPlugin; + switch (action) { case MenuAction_Cancel: @@ -150,8 +135,6 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti } else { - // FakeClientCommand(iClient, "menuselect 0"); - // DisplayClientInfo(iClient, "expired_info"); Clients_ExpiredClient(iClient); return 0; } @@ -167,13 +150,13 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti case MenuAction_DrawItem: { int iStyle; - g_hVIPMenu.GetItem(iOption, SZF(szItemInfo), iStyle); + g_hVIPMenu.GetItem(iOption, SZF(szFeature), iStyle); - DebugMessage("MenuAction_DrawItem: Client: %i, Feature: %s, iStyle: %i", iClient, szItemInfo, iStyle) + DebugMessage("MenuAction_DrawItem: Client: %i, Feature: %s, iStyle: %i", iClient, szFeature, iStyle) - if (GLOBAL_TRIE.GetValue(szItemInfo, hBuffer)) + if (GLOBAL_TRIE.GetValue(szFeature, hBuffer)) { - if (view_as(hBuffer.Get(FEATURES_VALUE_TYPE)) != VIP_NULL && Features_GetStatus(iClient, szItemInfo) == NO_ACCESS) + if (view_as(hBuffer.Get(FEATURES_VALUE_TYPE)) != VIP_NULL && Features_GetStatus(iClient, szFeature) == NO_ACCESS) { iStyle = g_CVAR_bHideNoAccessItems ? ITEMDRAW_RAWLINE:ITEMDRAW_DISABLED; DebugMessage("NO_ACCESS -> iStyle: %i", iStyle) @@ -187,7 +170,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti hPlugin = view_as(hBuffer.Get(FEATURES_PLUGIN)); Call_StartFunction(hPlugin, fCallback); Call_PushCell(iClient); - Call_PushString(szItemInfo); + Call_PushString(szFeature); Call_PushCell(iStyle); Call_Finish(iStyle); DebugMessage("Function_Draw -> iStyle: %i", iStyle) @@ -201,13 +184,18 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti case MenuAction_DisplayItem: { - g_hVIPMenu.GetItem(iOption, SZF(szItemInfo)); - - DebugMessage("MenuAction_DisplayItem: Client: %i, Feature: %s", iClient, szItemInfo) + g_hVIPMenu.GetItem(iOption, SZF(szFeature)); + DebugMessage("MenuAction_DisplayItem: Client: %i, Feature: %s", iClient, szFeature) + char szDisplay[128]; - - if (GLOBAL_TRIE.GetValue(szItemInfo, hBuffer)) + if (strcmp(szFeature, "NO_FEATURES") == 0) + { + FormatEx(SZF(szDisplay), "%T", "NO_FEATURES", iClient); + return RedrawMenuItem(szDisplay); + } + + if (GLOBAL_TRIE.GetValue(szFeature, hBuffer)) { DataPack hDataPack = view_as(hBuffer.Get(FEATURES_MENU_CALLBACKS)); hDataPack.Position = ITEM_DISPLAY; @@ -216,11 +204,10 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti { hPlugin = view_as(hBuffer.Get(FEATURES_PLUGIN)); - szDisplay[0] = 0; bool bResult; Call_StartFunction(hPlugin, fCallback); Call_PushCell(iClient); - Call_PushString(szItemInfo); + Call_PushString(szFeature); Call_PushStringEx(SZF(szDisplay), SM_PARAM_STRING_UTF8 | SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK); Call_PushCell(sizeof(szDisplay)); Call_Finish(bResult); @@ -232,49 +219,34 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti return RedrawMenuItem(szDisplay); } } - - if (view_as(hBuffer.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) + + static char szFeatureName[128]; + if(IsTranslationPhraseExists(szFeature)) { - if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "TranslationPhraseExists") == FeatureStatus_Available) - { - if(!TranslationPhraseExists(szItemInfo)) - { - FormatEx(SZF(szDisplay), "%s [%T]", szItemInfo, g_szToggleStatus[view_as(Features_GetStatus(iClient, szItemInfo))], iClient); - return RedrawMenuItem(szDisplay); - } - } - FormatEx(SZF(szDisplay), "%T [%T]", szItemInfo, iClient, g_szToggleStatus[view_as(Features_GetStatus(iClient, szItemInfo))], iClient); - return RedrawMenuItem(szDisplay); + FormatEx(SZF(szFeatureName), "%T", szFeature, iClient); } - - if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "TranslationPhraseExists") == FeatureStatus_Available) + else { - if(!TranslationPhraseExists(szItemInfo)) - { - strcopy(SZF(szDisplay), szItemInfo); - return RedrawMenuItem(szDisplay); - } + strcopy(SZF(szFeatureName), szFeature); + } + + if (view_as(hBuffer.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) + { + FormatEx(SZF(szDisplay), "%s [%T]", szFeatureName, g_szToggleStatus[view_as(Features_GetStatus(iClient, szFeature))], iClient); } - FormatEx(SZF(szDisplay), "%T", szItemInfo, iClient); return RedrawMenuItem(szDisplay); } - if (strcmp(szItemInfo, "NO_FEATURES") == 0) - { - FormatEx(SZF(szItemInfo), "%T", "NO_FEATURES", iClient); - } - - return RedrawMenuItem(szItemInfo); } case MenuAction_Select: { - g_hVIPMenu.GetItem(iOption, SZF(szItemInfo)); + g_hVIPMenu.GetItem(iOption, SZF(szFeature)); - if (GLOBAL_TRIE.GetValue(szItemInfo, hBuffer)) + if (GLOBAL_TRIE.GetValue(szFeature, hBuffer)) { PlaySound(iClient, ITEM_TOGGLE_SOUND); - DebugMessage("MenuAction_Select: Client: %i, Feature: %s", iClient, szItemInfo) + DebugMessage("MenuAction_Select: Client: %i, Feature: %s", iClient, szFeature) DataPack hDataPack = view_as(hBuffer.Get(FEATURES_MENU_CALLBACKS)); hDataPack.Position = ITEM_SELECT; @@ -285,19 +257,19 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti char szBuffer[4]; VIP_ToggleState eOldStatus, eNewStatus; - eOldStatus = Features_GetStatus(iClient, szItemInfo); + eOldStatus = Features_GetStatus(iClient, szFeature); eNewStatus = (eOldStatus == ENABLED) ? DISABLED:ENABLED; if (fCallback != INVALID_FUNCTION) { - eNewStatus = Function_OnItemToggle(hPlugin, fCallback, iClient, szItemInfo, eOldStatus, eNewStatus); + eNewStatus = Function_OnItemToggle(hPlugin, fCallback, iClient, szFeature, eOldStatus, eNewStatus); } if (eNewStatus != eOldStatus) { - eNewStatus = CreateForward_OnFeatureToggle(iClient, szItemInfo, eOldStatus, eNewStatus); + eNewStatus = CreateForward_OnFeatureToggle(iClient, szFeature, eOldStatus, eNewStatus); if (eNewStatus != eOldStatus) { - Features_SetStatus(iClient, szItemInfo, eNewStatus); + Features_SetStatus(iClient, szFeature, eNewStatus); IntToString(view_as(eNewStatus), SZF(szBuffer)); SetClientCookie(iClient, view_as(GetArrayCell(hBuffer, FEATURES_COOKIE)), szBuffer); } @@ -308,7 +280,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti } g_hFeatures[iClient].SetValue(KEY_MENUITEM, hMenu.Selection); - if (Function_OnItemSelect(hPlugin, fCallback, iClient, szItemInfo)) + if (Function_OnItemSelect(hPlugin, fCallback, iClient, szFeature)) { hMenu.DisplayAt(iClient, hMenu.Selection, MENU_TIME_FOREVER); } @@ -319,12 +291,6 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti return 0; } -bool IsValidFeature(const char[] szFeature) -{ - DebugMessage("IsValidFeature:: FindStringInArray -> %i", g_hFeaturesArray.FindString(szFeature)) - return (g_hFeaturesArray.FindString(szFeature) != -1); -} - bool OnVipMenuFlood(int iClient) { static float fLastTime[MAXPLAYERS + 1]; @@ -335,4 +301,14 @@ bool OnVipMenuFlood(int iClient) fLastTime[iClient] = fSec; } return false; -} \ No newline at end of file +} + +bool IsTranslationPhraseExists(const char[] szPhrase) +{ + if (g_bIsTranslationPhraseExistsAvailable) + { + return TranslationPhraseExists(szPhrase); + } + + return true; +} diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 03f198d..dd96035 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -203,6 +203,7 @@ } "LOG_ADMIN_SET_EXPIRATION" { + "#format" "{1:L},{2:s},{3:s}" "en" "Admin {1} has set {2} VIP's duration to {3}" "fi" "Admin {1} on asettanut VIP-pelaajalle {2} VIP keston tilalle {3}" "de" "Admin {1} {2}s VIP-Dauer um {3} eingestellt"