diff --git a/addons/sourcemod/configs/weapons_presets.cfg b/addons/sourcemod/configs/weapons_presets.cfg new file mode 100644 index 0000000..6544acc --- /dev/null +++ b/addons/sourcemod/configs/weapons_presets.cfg @@ -0,0 +1,59 @@ +"Skins" +{ + "Random Skins All Weapons" + { + "weapon_awp" "-1" + "weapon_ak47" "-1" + "weapon_m4a1" "-1" + "weapon_m4a1_silencer" "-1" + "weapon_deagle" "-1" + "weapon_usp_silencer" "-1" + "weapon_hkp2000" "-1" + "weapon_glock" "-1" + "weapon_elite" "-1" + "weapon_p250" "-1" + "weapon_cz75a" "-1" + "weapon_fiveseven" "-1" + "weapon_tec9" "-1" + "weapon_revolver" "-1" + "weapon_nova" "-1" + "weapon_xm1014" "-1" + "weapon_mag7" "-1" + "weapon_sawedoff" "-1" + "weapon_m249" "-1" + "weapon_negev" "-1" + "weapon_mp9" "-1" + "weapon_mac10" "-1" + "weapon_mp7" "-1" + "weapon_ump45" "-1" + "weapon_p90" "-1" + "weapon_bizon" "-1" + "weapon_famas" "-1" + "weapon_galilar" "-1" + "weapon_ssg08" "-1" + "weapon_aug" "-1" + "weapon_sg556" "-1" + "weapon_scar20" "-1" + "weapon_g3sg1" "-1" + "weapon_knife_karambit" "-1" + "weapon_knife_m9_bayonet" "-1" + "weapon_bayonet" "-1" + "weapon_knife_survival_bowie" "-1" + "weapon_knife_butterfly" "-1" + "weapon_knife_flip" "-1" + "weapon_knife_push" "-1" + "weapon_knife_tactical" "-1" + "weapon_knife_falchion" "-1" + "weapon_knife_gut" "-1" + "weapon_knife_ursus" "-1" + "weapon_knife_gypsy_jackknife" "-1" + "weapon_knife_stiletto" "-1" + "weapon_knife_widowmaker" "-1" + "weapon_mp5sd" "-1" + "weapon_knife_css" "-1" + "weapon_knife_cord" "-1" + "weapon_knife_canis" "-1" + "weapon_knife_outdoor" "-1" + "weapon_knife_skeleton" "-1" + } +} diff --git a/addons/sourcemod/plugins/test_natives.smx b/addons/sourcemod/plugins/test_natives.smx new file mode 100644 index 0000000..98c3082 Binary files /dev/null and b/addons/sourcemod/plugins/test_natives.smx differ diff --git a/addons/sourcemod/plugins/weapons.smx b/addons/sourcemod/plugins/weapons.smx new file mode 100644 index 0000000..d5acba5 Binary files /dev/null and b/addons/sourcemod/plugins/weapons.smx differ diff --git a/addons/sourcemod/scripting/include/weapons.inc b/addons/sourcemod/scripting/include/weapons.inc index d27a96b..487d99e 100644 --- a/addons/sourcemod/scripting/include/weapons.inc +++ b/addons/sourcemod/scripting/include/weapons.inc @@ -14,3 +14,18 @@ forward Action Weapons_OnClientKnifeSelectPre(int client, int knifeId, char[] kn //Called after client selects a knife from !knife. forward void Weapons_OnClientKnifeSelectPost(int client, int knifeId, char[] knifeName); + +//Sets client's skins for a weapons. +native void Weapons_SetClientSkin(int client, const char[] weapon, int skin); + +// Set client's float(wear) for a weapon. +native void Weapons_SetClientWear(int client, const char[] weapon, float wear); + +// Set client's seed for a weapon. +native void Weapons_SetClientSeed(int client, const char[] weapon, int seed); + +// Set client's nametag for a weapon +native void Weapons_SetClientNameTag(int client, const char[] weapon, const char[] name); + +// Set client's startrack for a weapon +native void Weapons_ToggleClientStarTrack(int client, const char[] weapon); \ No newline at end of file diff --git a/addons/sourcemod/scripting/weapons.sp b/addons/sourcemod/scripting/weapons.sp index 17e2b01..9fba1a7 100644 --- a/addons/sourcemod/scripting/weapons.sp +++ b/addons/sourcemod/scripting/weapons.sp @@ -33,6 +33,7 @@ #include "weapons/config.sp" #include "weapons/menus.sp" #include "weapons/natives.sp" +#include "weapons/presets.sp" //#define DEBUG @@ -41,7 +42,7 @@ public Plugin myinfo = name = "Weapons & Knives", author = "kgns | oyunhost.net", description = "All in one weapon skin management", - version = "1.7.3", + version = "1.7.5", url = "https://www.oyunhost.net" }; @@ -51,6 +52,11 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max CreateNative("Weapons_SetClientKnife", Weapons_SetClientKnife_Native); CreateNative("Weapons_GetClientKnife", Weapons_GetClientKnife_Native); + CreateNative("Weapons_SetClientSkin", Weapons_SetClientSkin_Native); + CreateNative("Weapons_SetClientWear", Weapons_SetClientWear_Native); + CreateNative("Weapons_SetClientSeed", Weapons_SetClientSeed_Native); + CreateNative("Weapons_SetClientNameTag", Weapons_SetClientNameTag_Native); + CreateNative("Weapons_ToggleClientStarTrack", Weapons_ToggleClientStarTrack_Native); g_hOnKnifeSelect_Pre = CreateGlobalForward("Weapons_OnClientKnifeSelectPre", ET_Event, Param_Cell, Param_Cell, Param_String); g_hOnKnifeSelect_Post = CreateGlobalForward("Weapons_OnClientKnifeSelectPost", ET_Ignore, Param_Cell, Param_Cell, Param_String); @@ -87,6 +93,7 @@ public void OnPluginStart() g_Cvar_EnableWeaponOverwrite = CreateConVar("sm_weapons_enable_overwrite", "1", "Enable/Disable players overwriting other players' weapons (picked up from the ground) by using !ws command"); g_Cvar_GracePeriod = CreateConVar("sm_weapons_grace_period", "0", "Grace period in terms of seconds counted after round start for allowing the use of !ws command. 0 means no restrictions"); g_Cvar_InactiveDays = CreateConVar("sm_weapons_inactive_days", "30", "Number of days before a player (SteamID) is marked as inactive and his data is deleted. (0 or any negative value to disable deleting)"); + g_Cvar_SavePresetAcces = CreateConVar("sm_weapons_save_preset_adminsonly", "1", "Who have the acces to save a preset of skins? 1 = Admin only | 0 = Everyone", 0, true, 0.0, true, 1.0); AutoExecConfig(true, "weapons"); @@ -97,7 +104,7 @@ public void OnPluginStart() RegConsoleCmd("sm_nametag", CommandNameTag); RegConsoleCmd("sm_wslang", CommandWSLang); RegConsoleCmd("sm_seed", CommandSeedMenu); - + PTaH(PTaH_GiveNamedItemPre, Hook, GiveNamedItemPre); PTaH(PTaH_GiveNamedItemPost, Hook, GiveNamedItemPost); @@ -189,6 +196,7 @@ public Action CommandWeaponSkins(int client, int args) PrintToChat(client, " %s \x02%t", g_ChatPrefix, "GracePeriod", g_iGracePeriod); } } + return Plugin_Handled; } diff --git a/addons/sourcemod/scripting/weapons/config.sp b/addons/sourcemod/scripting/weapons/config.sp index 790fc0a..bbec0a7 100644 --- a/addons/sourcemod/scripting/weapons/config.sp +++ b/addons/sourcemod/scripting/weapons/config.sp @@ -23,6 +23,8 @@ public void ReadConfig() g_smWeaponDefIndex = new StringMap(); delete g_smLanguageIndex; g_smLanguageIndex = new StringMap(); + delete g_smSkinsNames; + g_smSkinsNames = new StringMap(); for (int i = 0; i < sizeof(g_WeaponClasses); i++) { @@ -79,6 +81,8 @@ public void ReadConfig() KvGetString(kv, "classes", classes, sizeof(classes)); KvGetString(kv, "index", index, sizeof(index)); + g_smSkinsNames.SetString(index, name); + for (int k = 0; k < sizeof(g_WeaponClasses); k++) { Format(weaponTemp, sizeof(weaponTemp), "%s;", g_WeaponClasses[k]); @@ -99,4 +103,18 @@ public void ReadConfig() { SetFailState("Could not find a config file for any languages."); } + + ReadPressets(); } + +void ReadPressets() // We just need a global handle of the KVs +{ + BuildPath(Path_SM, g_sPressetsFile, sizeof(g_sPressetsFile), "configs/weapons_presets.cfg"); + + delete g_hPresets; + g_hPresets = new KeyValues("Skins"); + if(!g_hPresets.ImportFromFile(g_sPressetsFile)) + { + LogError("File \"%s\" is missing.", g_sPressetsFile); + } +} \ No newline at end of file diff --git a/addons/sourcemod/scripting/weapons/forwards.sp b/addons/sourcemod/scripting/weapons/forwards.sp index e390240..00f937f 100644 --- a/addons/sourcemod/scripting/weapons/forwards.sp +++ b/addons/sourcemod/scripting/weapons/forwards.sp @@ -77,6 +77,7 @@ public void OnClientPutInServer(int client) g_FloatTimer[client] = INVALID_HANDLE; g_bWaitingForNametag[client] = false; g_bWaitingForSeed[client] = false; + g_bWaitingForPressetName[client] = false; for (int i = 0; i < sizeof(g_WeaponClasses); i++) { g_iSeedRandom[client][i] = 0; diff --git a/addons/sourcemod/scripting/weapons/globals.sp b/addons/sourcemod/scripting/weapons/globals.sp index 5b8f88c..b40d678 100644 --- a/addons/sourcemod/scripting/weapons/globals.sp +++ b/addons/sourcemod/scripting/weapons/globals.sp @@ -79,6 +79,8 @@ int g_iGracePeriod; ConVar g_Cvar_InactiveDays; int g_iGraceInactiveDays; +ConVar g_Cvar_SavePresetAcces; + int g_iSkins[MAXPLAYERS+1][sizeof(g_WeaponClasses)]; int g_iStatTrak[MAXPLAYERS+1][sizeof(g_WeaponClasses)]; int g_iStatTrakCount[MAXPLAYERS+1][sizeof(g_WeaponClasses)]; @@ -121,4 +123,11 @@ StringMap g_smWeaponDefIndex; StringMap g_smLanguageIndex; GlobalForward g_hOnKnifeSelect_Pre; -GlobalForward g_hOnKnifeSelect_Post; \ No newline at end of file +GlobalForward g_hOnKnifeSelect_Post; + +StringMap g_smSkinsNames; + +bool g_bWaitingForPressetName[MAXPLAYERS + 1]; + +KeyValues g_hPresets; +char g_sPressetsFile[PLATFORM_MAX_PATH]; \ No newline at end of file diff --git a/addons/sourcemod/scripting/weapons/helpers.sp b/addons/sourcemod/scripting/weapons/helpers.sp index b182ea0..30450d5 100644 --- a/addons/sourcemod/scripting/weapons/helpers.sp +++ b/addons/sourcemod/scripting/weapons/helpers.sp @@ -71,6 +71,16 @@ int GetWeaponIndex(int entity) return -1; } +int GetIndex(const char[] classname) +{ + int index; + if(g_smWeaponIndex.GetValue(classname, index)) + { + return index; + } + return -1; +} + bool GetWeaponClass(int entity, char[] weaponClass, int size) { int id = GetEntProp(entity, Prop_Send, "m_iItemDefinitionIndex"); diff --git a/addons/sourcemod/scripting/weapons/hooks.sp b/addons/sourcemod/scripting/weapons/hooks.sp index 5c5f032..9ad49a5 100644 --- a/addons/sourcemod/scripting/weapons/hooks.sp +++ b/addons/sourcemod/scripting/weapons/hooks.sp @@ -129,6 +129,13 @@ public Action ChatListener(int client, const char[] command, int args) return Plugin_Handled; } + else if(g_bWaitingForPressetName[client] && IsValidClient(client) && !IsChatTrigger()) + { + SavePresset(client, msg); + g_bWaitingForPressetName[client] = false; + + return Plugin_Handled; + } return Plugin_Continue; } diff --git a/addons/sourcemod/scripting/weapons/menus.sp b/addons/sourcemod/scripting/weapons/menus.sp index 82a589f..e51455f 100644 --- a/addons/sourcemod/scripting/weapons/menus.sp +++ b/addons/sourcemod/scripting/weapons/menus.sp @@ -748,6 +748,20 @@ public int MainMenuHandler(Menu menu, MenuAction action, int client, int selecti CreateLanguageMenu(client).Display(client, menuTime); } } + else if(StrEqual(info, "load")) + { + ShowPressets(client); + } + else if(StrEqual(info, "save")) + { + PrintToChat(client, " %s \x04%t", g_ChatPrefix, "WaitingForPresset", client); + + g_bWaitingForPressetName[client] = true; + } + else if(StrEqual(info, "delete")) + { + ShowPressets(client, true); + } else { g_smWeaponIndex.GetValue(info, g_iIndex[client]); @@ -795,15 +809,41 @@ Menu CreateMainMenu(int client) } } } + + Format(buffer, sizeof(buffer), "%T", "LoadPresset", client); + menu.AddItem("load", buffer); + + switch(g_Cvar_SavePresetAcces.IntValue) + { + case 1: // Admin only + { + if(GetUserAdmin(client) != INVALID_ADMIN_ID) + { + Format(buffer, sizeof(buffer), "%T", "SavePresset", client); + menu.AddItem("save", buffer); + + Format(buffer, sizeof(buffer), "%T", "DeletePresset", client); + menu.AddItem("delete", buffer); + } + } + case 0: // Everyone + { + Format(buffer, sizeof(buffer), "%T", "SavePresset", client); + menu.AddItem("save", buffer); + + Format(buffer, sizeof(buffer), "%T", "DeletePresset", client); + menu.AddItem("delete", buffer); + } + } - for(int i = index; i < 6; i++) + for(int i = index; i < 4; i++) { menu.AddItem("", "", ITEMDRAW_SPACER); } - + Format(buffer, sizeof(buffer), "%T", "ChangeLang", client); menu.AddItem("lang", buffer); - + return menu; } @@ -960,3 +1000,89 @@ public int LanguageMenuHandler(Menu menu, MenuAction action, int client, int sel } } } + +public int SeePressetsHandler(Menu menu, MenuAction action, int client, int selection) +{ + switch(action) + { + case MenuAction_Select: + { + if(IsClientInGame(client)) + { + char info[32]; + menu.GetItem(selection, info, sizeof(info)); + + ShowPressetInfo(client, info); + } + } + case MenuAction_End: + { + delete menu; + } + } + + if(selection == MenuCancel_ExitBack) + { + int menuTime; + if((menuTime = GetRemainingGracePeriodSeconds(client)) >= 0) + { + CreateMainMenu(client).Display(client, menuTime); + } + } +} + +public int SeeDeletePressetsHandler(Menu menu, MenuAction action, int client, int selection) +{ + switch(action) + { + case MenuAction_Select: + { + if(IsClientInGame(client)) + { + char info[64]; + menu.GetItem(selection, info, sizeof(info)); + + DeletePresset(client, info); + } + } + case MenuAction_End: + { + delete menu; + } + } + + if(selection == MenuCancel_ExitBack) + { + int menuTime; + if((menuTime = GetRemainingGracePeriodSeconds(client)) >= 0) + { + CreateMainMenu(client).Display(client, menuTime); + } + } +} + +public int SeePressetSkinsHandler(Menu menu, MenuAction action, int client, int selection) +{ + switch(action) + { + case MenuAction_Select: + { + if(IsClientInGame(client)) + { + char item[64]; + menu.GetItem(selection, item, sizeof(item)); + + LoadPresset(client, item); + } + } + case MenuAction_End: + { + delete menu; + } + } + + if(selection == MenuCancel_ExitBack) + { + ShowPressets(client); + } +} \ No newline at end of file diff --git a/addons/sourcemod/scripting/weapons/natives.sp b/addons/sourcemod/scripting/weapons/natives.sp index 587a797..ea51a4f 100644 --- a/addons/sourcemod/scripting/weapons/natives.sp +++ b/addons/sourcemod/scripting/weapons/natives.sp @@ -32,3 +32,142 @@ public int Weapons_SetClientKnife_Native(Handle plugin, int numparams) SetClientKnife(client, KnifeName, true, update); return 0; } + +public int Weapons_SetClientSkin_Native(Handle plugin, int numparams) +{ + int client = GetNativeCell(1); + if (client < 1 || client > MaxClients) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%d).", client); + } + if(!IsClientInGame(client)) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Client (%d) is not in game.", client); + } + + char weaponName[32], updateFields[64]; + GetNativeString(2, weaponName, sizeof(weaponName)); + + int index = GetIndex(weaponName); + int skinid = GetNativeCell(3); + + RemoveWeaponPrefix(g_WeaponClasses[index], weaponName, sizeof(weaponName)); + Format(updateFields, sizeof(updateFields), "%s = %d", weaponName, skinid); + UpdatePlayerData(client, updateFields); + + g_iSkins[client][index] = skinid; + RefreshWeapon(client, index); + + return 0; +} + +public int Weapons_SetClientWear_Native(Handle plugin, int numparams) +{ + int client = GetNativeCell(1); + if (client < 1 || client > MaxClients) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%d).", client); + } + if(!IsClientInGame(client)) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Client (%d) is not in game.", client); + } + + char weaponName[32], updateFields[64]; + GetNativeString(2, weaponName, sizeof(weaponName)); + int index = GetIndex(weaponName); + + g_fFloatValue[client][index] = GetNativeCell(3); + + RemoveWeaponPrefix(g_WeaponClasses[index], weaponName, sizeof(weaponName)); + Format(updateFields, sizeof(updateFields), "%s_float = %.2f", weaponName, g_fFloatValue[client][index]); + UpdatePlayerData(client, updateFields); + + RefreshWeapon(client, index); + + return 0; +} + +public int Weapons_SetClientSeed_Native(Handle plugin, int numparams) +{ + int client = GetNativeCell(1); + if (client < 1 || client > MaxClients) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%d).", client); + } + if(!IsClientInGame(client)) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Client (%d) is not in game.", client); + } + + char weaponName[32], updateFields[64]; + GetNativeString(2, weaponName, sizeof(weaponName)); + int index = GetIndex(weaponName); + + g_iWeaponSeed[client][index] = GetNativeCell(3); + + RemoveWeaponPrefix(g_WeaponClasses[index], weaponName, sizeof(weaponName)); + Format(updateFields, sizeof(updateFields), "%s_seed = %.2f", weaponName, g_fFloatValue[client][index]); + UpdatePlayerData(client, updateFields); + + RefreshWeapon(client, index); + + return 0; +} + +public int Weapons_SetClientNameTag_Native(Handle plugin, int numparams) +{ + int client = GetNativeCell(1); + if (client < 1 || client > MaxClients) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%d).", client); + } + if(!IsClientInGame(client)) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Client (%d) is not in game.", client); + } + + char weaponName[32], updateFields[64], name[64]; + GetNativeString(2, weaponName, sizeof(weaponName)); + GetNativeString(3, name, sizeof(name)); + int index = GetIndex(weaponName); + + g_NameTag[client][index] = name; + + char escaped[257]; + db.Escape(name, escaped, sizeof(escaped)); + RemoveWeaponPrefix(g_WeaponClasses[index], weaponName, sizeof(weaponName)); + Format(updateFields, sizeof(updateFields), "%s_tag = '%s'", weaponName, escaped); + UpdatePlayerData(client, updateFields); + + RefreshWeapon(client, index); + + return 0; +} + +public int Weapons_ToggleClientStarTrack_Native(Handle plugin, int numparams) +{ + int client = GetNativeCell(1); + if (client < 1 || client > MaxClients) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%d).", client); + } + if(!IsClientInGame(client)) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Client (%d) is not in game.", client); + } + + char weaponName[32], updateFields[64]; + GetNativeString(2, weaponName, sizeof(weaponName)); + int index = GetIndex(weaponName); + + g_iStatTrak[client][index] = 1 - g_iStatTrak[client][index]; + + RemoveWeaponPrefix(g_WeaponClasses[index], weaponName, sizeof(weaponName)); + Format(updateFields, sizeof(updateFields), "%s_trak = %d", weaponName, g_iStatTrak[client][index]); + UpdatePlayerData(client, updateFields); + + RefreshWeapon(client, index); + + return 0; +} \ No newline at end of file diff --git a/addons/sourcemod/scripting/weapons/presets.sp b/addons/sourcemod/scripting/weapons/presets.sp new file mode 100644 index 0000000..334128d --- /dev/null +++ b/addons/sourcemod/scripting/weapons/presets.sp @@ -0,0 +1,153 @@ +void SavePresset(int client, char[] name) +{ + char buffer[64]; + + g_hPresets.Rewind(); + g_hPresets.JumpToKey(name, true); + + for(int i = 0; i < sizeof(g_WeaponClasses); i++) + { + Format(buffer, sizeof(buffer), "%i", g_iSkins[client][i]); + + g_hPresets.SetString(g_WeaponClasses[i], buffer); + } + + g_hPresets.Rewind(); + g_hPresets.ExportToFile(g_sPressetsFile); + + PrintToChat(client, " %s \x04%t", g_ChatPrefix, "PressetSaved", client); +} + +void ShowPressets(int client, bool deleteMode = false) +{ + char buffer[128]; + Menu menu; + + switch(deleteMode) + { + case true: menu = new Menu(SeeDeletePressetsHandler); + case false: menu = new Menu(SeePressetsHandler); + } + + Format(buffer, sizeof(buffer), "%T", "LoadPressetsTitle", client); + menu.SetTitle(buffer); + + menu.ExitBackButton = true; + + g_hPresets.Rewind(); + if(g_hPresets.GotoFirstSubKey()) + { + do + { + g_hPresets.GetSectionName(buffer, sizeof(buffer)); + + menu.AddItem(buffer, buffer); + } + while(g_hPresets.GotoNextKey()); + } + else + { + Format(buffer, sizeof(buffer), "%T", "NoPressetsAvalabile", client); + menu.AddItem("", buffer, ITEMDRAW_DISABLED); + } + + menu.Display(client, MENU_TIME_FOREVER); +} + +void ShowPressetInfo(int client, char[] name) +{ + char buffer[128], key[10]; + + g_hPresets.Rewind(); + if(g_hPresets.JumpToKey(name)) + { + Menu menu = new Menu(SeePressetSkinsHandler); + + Format(buffer, sizeof(buffer), "%T", "LoadPressetsTitle", client); + menu.SetTitle(buffer); + + Format(buffer, sizeof(buffer), "%T\n ", "LoadThisPresset", client); + menu.AddItem(name, buffer); + + for(int i = 0; i < sizeof(g_WeaponClasses); i++) + { + strcopy(buffer, sizeof(buffer), ""); + + Format(key, sizeof(key), "%i", g_hPresets.GetNum(g_WeaponClasses[i])); + + if(StrEqual(key, "0")) // Skip default skins + { + continue; + } + + if(StrEqual(key, "-1")) + { + Format(buffer, sizeof(buffer), "%T | %T", g_WeaponClasses[i], client, "RandomSkin", client); + menu.AddItem(name, buffer, ITEMDRAW_DISABLED); + } + + else if(g_smSkinsNames.GetString(key, buffer, sizeof(buffer))) + { + Format(buffer, sizeof(buffer), "%T | %s", g_WeaponClasses[i], client, buffer); + menu.AddItem(name, buffer, ITEMDRAW_DISABLED); + } + } + menu.ExitBackButton = true; + menu.Display(client, MENU_TIME_FOREVER); + } +} + +void LoadPresset(int client, char[] name) +{ + char updateFields[1024 * 2], buffer[32], weaponName[32]; + + g_hPresets.Rewind(); + if(g_hPresets.JumpToKey(name)) + { + for(int i = 0; i < sizeof(g_WeaponClasses); i++) + { + g_hPresets.GetString(g_WeaponClasses[i], buffer, sizeof(buffer)); + g_iSkins[client][i] = StringToInt(buffer); + + RemoveWeaponPrefix(g_WeaponClasses[i], weaponName, sizeof(weaponName)); + + if(!updateFields[0]) + { + Format(updateFields, sizeof(updateFields), "%s = %d", weaponName, g_iSkins[client][i]); + } + else + { + Format(updateFields, sizeof(updateFields), "%s, %s = %d", updateFields, weaponName, g_iSkins[client][i]); + } + } + } + + UpdatePlayerData(client, updateFields); + + PrintToChat(client, " %s \x04%T", g_ChatPrefix, "PressetLoaded", client, name); +} + +void DeletePresset(int client, char[] name) +{ + g_hPresets.Rewind(); + if(g_hPresets.JumpToKey(name)) + { + g_hPresets.DeleteThis(); + } + + g_hPresets.Rewind(); + g_hPresets.ExportToFile(g_sPressetsFile); + + PrintToChat(client, " %s \x04%T", g_ChatPrefix, "PressetDeleted", client, name); +} + +/** +"Skins" +{ + "Test" + { + "123" "123" + } +} + + */ \ No newline at end of file diff --git a/addons/sourcemod/translations/weapons.phrases.txt b/addons/sourcemod/translations/weapons.phrases.txt index 937bc74..0ddfedb 100644 --- a/addons/sourcemod/translations/weapons.phrases.txt +++ b/addons/sourcemod/translations/weapons.phrases.txt @@ -1,5 +1,55 @@ "Phrases" { + "PressetDeleted" + { + "en" "Preset deleted!" + } + + "PressetLoaded" + { + "en" "Preset loaded!" + } + + "LoadThisPresset" + { + "en" "Load this preset" + } + + "PressetSaved" + { + "en" "Preset created succesfully" + } + + "WaitingForPresset" + { + "en" "Please write the name of this preset" + } + + "NoPressetsAvalabile" + { + "en" "There are no presets yet" + } + + "LoadPressetsTitle" + { + "en" "Select a preset" + } + + "DeletePresset" + { + "en" "Delete a Skin Teample" + } + + "SavePresset" + { + "en" "Create a Skin Preset" + } + + "LoadPresset" + { + "en" "Presets" + } + "WSMenuTitle" { "en" "Weapon Skins Menu"