Brum Brum 9 3 Napisano 19 Lipca 2019 (edytowane) Opis: Dodaje komendę !models / !modele po wpisaniu pojawia się menu z wyborem "grupy" z której ma wybrać dany model. Grupy dodaje się w pliku konfiguracyjnym oraz ustawia na flagę (można zostawić puste miejsce wtedy będzie dla każdego). Plugin posiada swój downloader. Plugin jest alternatywą tego pluginu -> https://forums.alliedmods.net/showthread.php?t=87597Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! KOD: Spoiler /**************************************************************************** ** 1.0 Wydanie pierwszej wersji. * ** 1.1 Przejście na tablice dynamiczne. Dziękuję Magnetowi za pomoc * ** 1.2 Usunięcie cvarów. Przejście na konfigurację(usuniętych cvarów) w KV * ** Zmiana sposobu konfigurowania modeli (brak kv.JumpToKey) * ** Dodanie możliwości ustawienia jednego modelu w dwóch drużynach bez * ** konieczności dodawania tego samego modelu dwa razy. Aktualne tagi drużyn * ** [CT/TT/BOTH] wszystko musi być z dużych inaczej pominie model. * ** Dodanie "show_in_menu"(bool) 0 - Osoby, które nie mają danej flagi nie * ** widzą danej kategorii. 1 - Osoby, które nie mają danej flagi mają * ** pokazane w menu dane kategorię, ale nie mogą ich wybrać. * ** Dodano support SteamID(STEAM_X:X:XXXXXXXXX) wystarczy wpisać je w miejsce* ** flagi. Kategorie, które są tylko dla danego SteamID nie są wyświetlane * ** nikomu oprócz osoby z danym SteamID. * ** Dodano "no_category"(bool) Jeżeli jest tylko jedna kategoria to nie * ** wyskoczy jej wybór tylko od razu modele. Zabezpieczono przed możliwością * ** zmiany modelu na model do którego się nie ma dostępu. * ** 1.3 Fix błędu przy Flags.GetString * *****************************************************************************/ #include <sdktools> #include <clientprefs> #include <cstrike> #pragma semicolon 1 #pragma newdecls required Handle Cookies_SectionCT, Cookies_SectionTT, Cookies_ModelCT, Cookies_ModelTT; char MOD_TAG[64]; KeyValues kv; ArrayList FlagList; ArrayList ModelNameCT, ModelNameTT; ArrayList ModelSectionCT, ModelSectionTT; ArrayList ModelDirCT, ModelDirTT; ArrayList ModelDirArmsCT, ModelDirArmsTT; ArrayList SectionList; int ClientTempInt[MAXPLAYERS + 1]; int ClientSectionCT[MAXPLAYERS + 1], ClientSectionTT[MAXPLAYERS + 1], ClientModelCT[MAXPLAYERS + 1], ClientModelTT[MAXPLAYERS + 1]; bool g_bArmsEnabled, g_bShowInMenu, g_bNoCategory; public Plugin myinfo = { name = "ADEPT --> Models", description = "Autorski Plugin StudioADEPT.net", author = "Brum Brum", version = "1.3", url = "http://www.StudioADEPT.net/forum", }; /*************************************** **** OnPluginStart oraz OnMapStart ***** ****************************************/ public void OnPluginStart() { FlagList = new ArrayList(32); ModelNameCT = new ArrayList(32); ModelNameTT = new ArrayList(32); ModelSectionCT = new ArrayList(32); ModelSectionTT = new ArrayList(32); ModelDirCT = new ArrayList(128); ModelDirTT = new ArrayList(128); ModelDirArmsCT = new ArrayList(128); ModelDirArmsTT = new ArrayList(128); SectionList = new ArrayList(32); Cookies_SectionCT = RegClientCookie("sm_models_section_ct", "Zapisuje wybraną sekcje modelu po CT tzn. ADMIN, VIP itp.", CookieAccess_Public); Cookies_SectionTT = RegClientCookie("sm_models_section_tt", "Zapisuje wybraną sekcje modelu po TT tzn. ADMIN, VIP itp.", CookieAccess_Public); Cookies_ModelCT = RegClientCookie("sm_models_model_ct", "Zapisuje wybrany model gracza po stronie CT", CookieAccess_Public); Cookies_ModelTT = RegClientCookie("sm_models_model_tt", "Zapisuje wybrany model gracza po stronie TT", CookieAccess_Public); HookEvent("player_spawn", Event_PlayerSpawn); HookEvent("player_team", Event_PlayerTeam); RegConsoleCmd("sm_models", CMD_Models); RegConsoleCmd("sm_modele", CMD_Models); RegConsoleCmd("sm_model", CMD_Models); } public void OnMapStart() { PrecacheModel("models/player/custom_player/legacy/ctm_st6_varianta.mdl", true); PrecacheModel("models/player/custom_player/legacy/tm_phoenix_varianta.mdl", true); PrecacheModel("models/weapons/ct_arms_st6.mdl", true); PrecacheModel("models/weapons/t_arms_phoenix.mdl", true); Download(); LoadConfig(); } public void OnMapEnd() { ResetArrays(); } void ResetArrays() { FlagList.Clear(); ModelNameCT.Clear(); ModelNameTT.Clear(); ModelSectionCT.Clear(); ModelSectionTT.Clear(); ModelDirCT.Clear(); ModelDirTT.Clear(); ModelDirArmsCT.Clear(); ModelDirArmsTT.Clear(); SectionList.Clear(); } /*************************************** ****************** Eventy ************** ****************************************/ public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if (!IsValidClient(client))return; SetPlayerModel(client); } public Action Event_PlayerTeam(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if (!IsValidClient(client))return; if (ClientTempInt[client] > 0)CMD_Models(client, 0); } /**************************************** **** Cookies oraz OnClientDisconnect **** ****************************************/ public void OnClientCookiesCached(int client) { char value[16]; GetClientCookie(client, Cookies_SectionCT, value, sizeof(value)); ClientSectionCT[client] = StringToInt(value); GetClientCookie(client, Cookies_SectionTT, value, sizeof(value)); ClientSectionTT[client] = StringToInt(value); GetClientCookie(client, Cookies_ModelCT, value, sizeof(value)); ClientModelCT[client] = StringToInt(value); GetClientCookie(client, Cookies_ModelTT, value, sizeof(value)); ClientModelTT[client] = StringToInt(value); } public void OnClientDisconnect(int client) { if (AreClientCookiesCached(client)) { char value[16]; Format(value, sizeof(value), "%d", ClientSectionCT[client]); SetClientCookie(client, Cookies_SectionCT, value); Format(value, sizeof(value), "%d", ClientModelCT[client]); SetClientCookie(client, Cookies_ModelCT, value); Format(value, sizeof(value), "%d", ClientSectionTT[client]); SetClientCookie(client, Cookies_SectionTT, value); Format(value, sizeof(value), "%d", ClientModelTT[client]); SetClientCookie(client, Cookies_ModelTT, value); } ClientSectionCT[client] = 0; ClientSectionTT[client] = 0; ClientModelCT[client] = 0; ClientModelTT[client] = 0; } /**************************************** ************** Komendy ****************** ****************************************/ public Action CMD_Models(int client, int args) { if (client == 0)return Plugin_Handled; if (GetClientTeam(client) == CS_TEAM_SPECTATOR || GetClientTeam(client) == CS_TEAM_NONE)return Plugin_Handled; Menu menu = new Menu(Menu_Handler); menu.SetTitle("[%s -> Models]", MOD_TAG); menu.AddItem("default", "Domyślny"); if (g_bNoCategory) { if (SectionList.Length - 2 == 1) { ShowMenuWithModels(client, 1); return Plugin_Handled; } } for (int i = 1; i < SectionList.Length - 1; i++) { bool steamid = false; char buffer[256], id[16], flag[32]; SectionList.GetString(i, buffer, sizeof(buffer)); FlagList.GetString(i, flag, sizeof(flag)); if (StrContains(flag, "STEAM_", false) != -1)steamid = true; Format(id, sizeof(id), "%d", i); if (g_bShowInMenu) { if (!steamid)menu.AddItem(id, buffer, CheckFlags(client, flag)); else { if (IsClientSteamID(client, flag))menu.AddItem(id, buffer, CheckFlags(client, flag)); } } else { if (CheckModelFlag(client, flag))menu.AddItem(id, buffer); } } menu.ExitButton = true; menu.Display(client, 60); return Plugin_Handled; } /**************************************** ************** Handlery ***************** *****************************************/ public int Menu_Handler(Menu menu, MenuAction action, int client, int item) { if (!IsValidClient(client))return; if (GetClientTeam(client) == CS_TEAM_SPECTATOR || GetClientTeam(client) == CS_TEAM_NONE)return; switch (action) { case MenuAction_Select: { char info[32]; menu.GetItem(item, info, sizeof(info)); int sec = StringToInt(info); if (StrEqual(info, "default", false)) { if (GetClientTeam(client) == CS_TEAM_CT) { ClientSectionCT[client] = 0; ClientModelCT[client] = 0; } else if (GetClientTeam(client) == CS_TEAM_T) { ClientSectionTT[client] = 0; ClientModelTT[client] = 0; } ClientTempInt[client] = 0; SetPlayerModel(client); return; } ShowMenuWithModels(client, sec); } case MenuAction_End:delete menu; } } void ShowMenuWithModels(int client, int section) { if (!IsValidClient(client))return; ClientTempInt[client] = section; char bufferSection[64], buffer[64], bufferItem[8], flag[32]; Menu menu = new Menu(SelectModel_Handler); menu.SetTitle("[%s -> Models] Wybierz model", MOD_TAG); SectionList.GetString(section, bufferSection, sizeof(bufferSection)); FlagList.GetString(section, flag, sizeof(flag)); if (g_bNoCategory) { if (SectionList.Length - 2 == 1)menu.AddItem("default", "Domyślny"); } if (GetClientTeam(client) == CS_TEAM_CT) { for (int i = 0; i < ModelSectionCT.Length - 1; i++) { ModelSectionCT.GetString(i, buffer, sizeof(buffer)); if (StrEqual(buffer, bufferSection)) { char name[32]; ModelNameCT.GetString(i, name, sizeof(name)); Format(bufferItem, sizeof(bufferItem), "%d", i); menu.AddItem(bufferItem, name, CheckFlags(client, flag)); } } } else if (GetClientTeam(client) == CS_TEAM_T) { for (int i = 0; i < ModelSectionTT.Length - 1; i++) { ModelSectionTT.GetString(i, buffer, sizeof(buffer)); if (StrEqual(buffer, bufferSection)) { char name[32]; ModelNameTT.GetString(i, name, sizeof(name)); Format(bufferItem, sizeof(bufferItem), "%d", i); menu.AddItem(bufferItem, name, CheckFlags(client, flag)); } } } menu.ExitButton = true; menu.Display(client, 60); } public int SelectModel_Handler(Menu menu, MenuAction action, int client, int item) { if (!IsValidClient(client))return; if (GetClientTeam(client) == CS_TEAM_SPECTATOR || GetClientTeam(client) == CS_TEAM_NONE)return; switch (action) { case MenuAction_Select: { char info[32], MName[32]; menu.GetItem(item, info, sizeof(info)); int model = StringToInt(info); int sec = ClientTempInt[client]; if (g_bNoCategory && StrEqual(info, "default", false)) { if (GetClientTeam(client) == CS_TEAM_CT) { ClientSectionCT[client] = 0; ClientModelCT[client] = 0; } else if (GetClientTeam(client) == CS_TEAM_T) { ClientSectionTT[client] = 0; ClientModelTT[client] = 0; } ClientTempInt[client] = 0; SetPlayerModel(client); PrintToChat(client, "\x01\x0B★ \x07[%s -> Models]\x04 Ustawiono twój model na\x02 Domyślny!", MOD_TAG); return; } if (GetClientTeam(client) == CS_TEAM_CT) { ClientSectionCT[client] = sec; ClientModelCT[client] = model; ModelNameCT.GetString(ClientModelCT[client], MName, sizeof(MName)); } else if (GetClientTeam(client) == CS_TEAM_T) { ClientSectionTT[client] = sec; ClientModelTT[client] = model; ModelNameTT.GetString(ClientModelTT[client], MName, sizeof(MName)); } PrintToChat(client, "\x01\x0B★ \x07[%s -> Models]\x04 Ustawiono twój model na \x02%s", MOD_TAG, MName); SetPlayerModel(client); } case MenuAction_End:delete menu; case MenuAction_Cancel:ClientTempInt[client] = 0; } } /**************************************** ************** KV i Download ************ *****************************************/ void LoadConfig() { delete kv; kv = CreateKeyValues("Models"); char sPath[PLATFORM_MAX_PATH]; BuildPath(Path_SM, sPath, sizeof(sPath), "configs/ADEPT_Models.txt"); if (!FileExists(sPath)) SetFailState("Nie znaleziono pliku: %s", sPath); kv.ImportFromFile(sPath); SectionList.PushString("Default"); ModelSectionCT.PushString("Default"); ModelSectionTT.PushString("Default"); ModelNameCT.PushString("Domyślny CT"); ModelNameTT.PushString("Domyślny TT"); ModelDirCT.PushString("models/player/custom_player/legacy/ctm_st6_varianta.mdl"); ModelDirTT.PushString("models/player/custom_player/legacy/tm_phoenix_varianta.mdl"); ModelDirArmsCT.PushString("models/weapons/ct_arms_st6.mdl"); ModelDirArmsTT.PushString("models/weapons/t_arms_phoenix.mdl"); FlagList.PushString(""); char buffer[64], sbuffer[64]; kv.GetString("MOD_TAG", buffer, sizeof(buffer)); strcopy(MOD_TAG, sizeof(MOD_TAG), buffer); g_bArmsEnabled = view_as<bool>(kv.GetNum("arms_enabled", 1)); g_bShowInMenu = view_as<bool>(kv.GetNum("show_in_menu", 1)); g_bNoCategory = view_as<bool>(kv.GetNum("no_category", 1)); if (!kv.GotoFirstSubKey()) { delete kv; return; } do { kv.GetSectionName(sbuffer, sizeof(sbuffer)); SectionList.PushString(sbuffer); kv.GetString("flag", buffer, sizeof(buffer)); FlagList.PushString(buffer); kv.GotoFirstSubKey(); do { char Name[64], Model[128], Arms[128], Team[5]; kv.GetSectionName(Name, sizeof(Name)); kv.GetString("model", Model, sizeof(Model)); kv.GetString("arms", Arms, sizeof(Arms)); kv.GetString("team", Team, sizeof(Team)); if (IsEmptyString(Name)) { LogError("[ADEPT_Modele] Nie podano nazwy do modelu! Pomijam go"); continue; } if (IsEmptyString(Model)) { LogError("[ADEPT_Modele] Nie podano ścieżki do modelu %s | Pomijam go", Name); continue; } if (IsEmptyString(Arms) && g_bArmsEnabled) { LogError("[ADEPT_Modele] Nie podano ścieżki do rąk z modelu %s | Pomijam go", Name); continue; } if (IsEmptyString(Team) || !StrEqual(Team, "CT", true) && !StrEqual(Team, "TT", true) && !StrEqual(Team, "BOTH", true)) { LogError("[ADEPT_Modele] Nie podano żadnego teamu do modelu %s | Pomijam go", Name); continue; } if (StrEqual(Team, "BOTH", true)) { ModelSectionCT.PushString(sbuffer); ModelSectionTT.PushString(sbuffer); ModelNameCT.PushString(Name); ModelNameTT.PushString(Name); ModelDirCT.PushString(Model); ModelDirTT.PushString(Model); if (StrEqual(Arms, "default", true)) { ModelDirArmsCT.PushString("models/weapons/ct_arms_st6.mdl"); ModelDirArmsTT.PushString("models/weapons/t_arms_phoenix.mdl"); continue; } ModelDirArmsCT.PushString(Arms); ModelDirArmsTT.PushString(Arms); } else if (StrEqual(Team, "CT", true)) { ModelSectionCT.PushString(sbuffer); ModelNameCT.PushString(Name); ModelDirCT.PushString(Model); if (StrEqual(Arms, "default", true)) { strcopy(Arms, sizeof(Arms), "models/weapons/ct_arms_st6.mdl"); continue; } ModelDirArmsCT.PushString(Arms); } else if (StrEqual(Team, "TT", true)) { ModelSectionTT.PushString(sbuffer); ModelNameTT.PushString(Name); ModelDirTT.PushString(Model); if (StrEqual(Arms, "default", true)) { strcopy(Arms, sizeof(Arms), "models/weapons/t_arms_phoenix.mdl"); continue; } ModelDirArmsTT.PushString(Arms); } } while (kv.GotoNextKey()); kv.GoBack(); } while (kv.GotoNextKey()); ModelSectionCT.PushString("X"); ModelSectionTT.PushString("X"); ModelNameCT.PushString("X"); ModelNameTT.PushString("X"); ModelDirCT.PushString("X"); ModelDirTT.PushString("X"); ModelDirArmsCT.PushString("X"); ModelDirArmsTT.PushString("X"); SectionList.PushString("X"); FlagList.PushString("X"); return; } int Download() { char inFile[PLATFORM_MAX_PATH]; char line[512]; int i = 0; int totalLines = 0; BuildPath(Path_SM, inFile, sizeof(inFile), "configs/ADEPT_Models_Download.txt"); Handle file = OpenFile(inFile, "rt"); if (file != INVALID_HANDLE) { while (!IsEndOfFile(file)) { if (!ReadFileLine(file, line, sizeof(line))) { break; } TrimString(line); if (strlen(line) > 0) { if (StrContains(line, "//") != -1) continue; AddFileToDownloadsTable(line); if (StrContains(line, ".mdl", true) != -1) { PrecacheModel(line); } else if (StrContains(line, ".wav", true) != -1 || StrContains(line, ".mp3", true) != -1) { ReplaceStringEx(line, sizeof(line), "sound/", ""); PrecacheSound(line); } else if (StrContains(line, ".mdl", true) == -1 && StrContains(line, ".wav", true) == -1 && StrContains(line, ".mp3", true) == -1) { PrecacheDecal(line); } totalLines++; } i++; } CloseHandle(file); } return totalLines; } /**************************************** ************** Zmiana Modelu ************ *****************************************/ void SetPlayerModel(int client) { if (!IsValidClient(client))return; switch (GetClientTeam(client)) { case CS_TEAM_T: { if (ClientSectionTT[client] > ModelSectionTT.Length || ClientSectionTT[client] < 0)ClientSectionTT[client] = 0; if (ClientModelTT[client] > ModelDirTT.Length || ClientModelTT[client] < 0)ClientModelTT[client] = 0; char flag[32]; FlagList.GetString(ClientSectionTT[client], flag, sizeof(flag)); if (CheckModelFlag(client, flag)) { char model[128], arms[128]; ModelDirTT.GetString(ClientModelTT[client], model, sizeof(model)); if (g_bArmsEnabled)ModelDirArmsTT.GetString(ClientModelTT[client], arms, sizeof(arms)); //else ModelDirArmsTT.GetString(0, arms, sizeof(arms)); SetEntityModel(client, model); SetEntityArms(client, arms); } } case CS_TEAM_CT: { if (ClientSectionCT[client] > ModelSectionCT.Length || ClientSectionCT[client] < 0)ClientSectionCT[client] = 0; if (ClientModelCT[client] > ModelDirCT.Length || ClientModelCT[client] < 0)ClientModelCT[client] = 0; char flag[32]; FlagList.GetString(ClientSectionCT[client], flag, sizeof(flag)); if (CheckModelFlag(client, flag)) { char model[128], arms[128]; ModelDirCT.GetString(ClientModelCT[client], model, sizeof(model)); if (g_bArmsEnabled)ModelDirArmsCT.GetString(ClientModelCT[client], arms, sizeof(arms)); //else ModelDirArmsCT.GetString(0, arms, sizeof(arms)); SetEntityModel(client, model); SetEntityArms(client, arms); } } } } /**************************************** ****************** Inne ***************** *****************************************/ int CheckFlags(int client, const char[] flag) { if (GetUserFlagBits(client) & ReadFlagString(flag))return ITEMDRAW_DEFAULT; if (GetUserFlagBits(client) & ADMFLAG_ROOT)return ITEMDRAW_DEFAULT; if (StrEqual(flag, "", true))return ITEMDRAW_DEFAULT; if (IsClientSteamID(client, flag))return ITEMDRAW_DEFAULT; return ITEMDRAW_DISABLED; } bool CheckModelFlag(int client, const char[] flag) { if (GetUserFlagBits(client) & ReadFlagString(flag))return true; if (GetUserFlagBits(client) & ADMFLAG_ROOT)return true; if (StrEqual(flag, "", true))return true; if (IsClientSteamID(client, flag))return true; return false; } bool IsClientSteamID(int client, const char[] steamid) { if (!IsValidClient(client))return false; char SteamID[32]; GetClientAuthId(client, AuthId_Steam2, SteamID, sizeof(SteamID)); if (StrEqual(steamid, SteamID, true))return true; return false; } void SetEntityArms(int client, char[] arms) { SetEntPropString(client, Prop_Send, "m_szArmsModel", arms); } bool IsValidClient(int client) { if (!(1 <= client <= MaxClients) || !IsClientInGame(client) || !IsClientConnected(client) || IsFakeClient(client) || IsClientSourceTV(client)) return false; return true; } bool IsEmptyString(const char[] string) { if (!string[0])return true; else return false; } Przykładowy plik konfiguracyjny: Spoiler "Models" { "MOD_TAG" "ADEPT" // TAG Pokazywany na czacie / w menu "arms_enabled" "1" // włącza wyłącza ustawianie rąk "show_in_menu" "1" // Jeżeli gracz nie ma danej flagi czy ma pokazywać mu tą kategorię? 1 - tak 0 - nie "no_category" "1" // Jeżeli jest tylko jedna kategoria to nie wyskoczy jej wybór tylko od razu modele (jeżeli są pod flagę będą niemożliwe do wybrania przez graczy bez flagi) "VIP" // Nazwa grupy pokazanej w menu { "flag" "o" // Flaga, którą gracz musi mieć aby ustawić model z tej grupy. Puste pole oznacza, że każdy może ustawić model z tej grupy // Można również podać STEAMID i grupa będzie przeznaczona tylko i wyłącznie dla osoby z danym STEAMID (Grupy pod STEAMID są wyświetlane tylko osobie z tym STEAMID) "CT GIGN CS:S" { "model" "models/player/custom_player/eminem/css/ct_gign.mdl" // Ścieżka modelu "arms" "models/player/custom_player/eminem/css/v_arms.mdl" // Ścieżka modelu rąk. po wpisaniu "default" ustawi standarnowe rękawice dla danego teamu. "team" "CT" // [CT/TT/BOTH] } "TT Leet CS:S" { "model" "models/player/custom_player/eminem/css/t_leet.mdl" "arms" "models/player/custom_player/eminem/css/v_arms.mdl" "team" "TT" } } "Test STEAMID" { "flag" "STEAM_1:1:220315125" "Negan" { "model" "models/player/custom_player/kodua/negan/negan.mdl" "arms" "models/player/custom_player/kodua/negan/negan_arms.mdl" "team" "BOTH" } } } Przykładowy plik downloadera: Spoiler // Co tu dużo pisać po prostu dajemy modele do pobrania (automatycznie mają precache) models/player/custom_player/zombie/revenant/revenant_v2.mdl models/player/custom_player/zombie/revenant/revenant_arms.mdl models/player/custom_player/kuristaja/tf2/scout/scout_bluv2.mdl models/player/custom_player/kuristaja/tf2/scout/scout_blu_arms.mdl Jeżeli masz jakąś propozycję co można dodać pisz śmiało 😄 Natomiast jeżeli widzisz, że kod można napisać lepiej napisz mi co konkretnie i jak mogę to napisać lepiej 😉 Z góry dziękuję. Starsze wersje: Spoiler ADEPT_Models.spHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! ADPET_Models_Download.txtHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! ADEPT_Models.txtHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Zabraniam kopiowania powyższego pluginu na inne fora niż go-code.pl bez mojej zgody. ADEPT_Models.spHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! ADEPT_Models.txtHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! ADEPT_Models_Download.txtHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Edytowane 7 Grudnia 2019 przez Brum Brum Aktualizacja pluginu Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Mesharsky Napisano 20 Lipca 2019 Plus za wstawkę. Ale fiesta z tymi charami XD Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
dev Napisano 20 Lipca 2019 (edytowane) 2 godziny temu, Mesharsky napisał: Plus za wstawkę. Ale fiesta z tymi charami XD To za mało powiedziane. dynamiczne tablice powinieneś użyć, aktualnie alokujesz tyle pamięci że plugin na niektórych serwerach może po prostu wy*ierdalać serwer. Pomnóż sobie to w nawiasach przez siebie i troszkę duże liczby ci wyjdą, pamiętając że jest to 1 plugin! kolejna sprawa do takich rzeczy powinieneś użyć własnego połączenia mysql (najlepiej zwątkowanego) a nie męczyć i tak te biedne clientprefsy Edytowane 20 Lipca 2019 przez dev Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum Napisano 20 Lipca 2019 3 godziny temu, masnuwa_ni napisał: To za mało powiedziane. dynamiczne tablice powinieneś użyć, aktualnie alokujesz tyle pamięci że plugin na niektórych serwerach może po prostu wy*ierdalać serwer. Pomnóż sobie to w nawiasach przez siebie i troszkę duże liczby ci wyjdą, pamiętając że jest to 1 plugin! kolejna sprawa do takich rzeczy powinieneś użyć własnego połączenia mysql (najlepiej zwątkowanego) a nie męczyć i tak te biedne clientprefsy Może i masz rację, że powinienem użyć tablic dynamicznych. Tylko że kompletnie nie mam pomysłu, jak mogę użyć tych tablic w taki sposób, aby wszystko działało dobrze. Może mnie naprowadzisz? Co do mysql to nie widzę najmniejszego sensu, aby go użyć. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Angel 2 Napisano 20 Lipca 2019 Widzę w tym pluginie sporo zapożyczeń z tego pluginu -> https://forums.alliedmods.net/showthread.php?t=87597Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Praktycznie taki sam układ pliku konfiguracyjnego, część kodu, może dobrze byłoby podać źródło? Mimo to plus dla Ciebie za wykonaną pracę, nie omieszkam sprawdzić Twojej wersji Cytuj Przez Brum Brum, 20 Lipca 2019 Jest to prawda. Sam się męczyłem z tym kv i nagle mi mignęło przed oczami, że gdzieś już to widziałem. Zapożyczyłem kawałek kodu fakt. Zaraz dodam link do tamtego pluginu ;-) Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET 3 Napisano 20 Lipca 2019 O stary XD Te zmienne alokują jakieś 15MB pamięci 😮 Musisz to koniecznie poprawić, opierając kod na tablicach dynamicznych tak jak wyżej wspomniał @masnuwa_ni Cytuj Przez MAGNET, 20 Lipca 2019 Potem Ci pomoge Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum 3 Napisano 23 Lipca 2019 @Update Od teraz do przechowywania informacji o modelach używane są tablice dynamiczne. Dziękuję @MAGNET za pomoc 😉 W razie błędów jak zawsze piszcie w komentarzu. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Limitowany 1 Napisano 24 Lipca 2019 Kurde, aż sobie sprawdzę z ciekawości. Fajny plugin np na deathruna z modelami. Ewentualnie flaga pod admina i inne wdzianko dla admina na serwer 😛 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
gejmer Napisano 10 Listopada 2019 Moze mi ktos napisac krok po kroku jak wgrac te modele na serwer by wszytko dzialalo ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum Napisano 10 Listopada 2019 (edytowane) 21 minut temu, gejmer napisał: Moze mi ktos napisac krok po kroku jak wgrac te modele na serwer by wszytko dzialalo ? 1. Wrzucasz modele jakie chcesz na serwer 2. Pobierasz 3 pliki z pierwszego posta. 3. Plik .sp kompilujesz i plik .smx wrzucasz do folderu plugins. 4. Pliki tekstowe wrzucasz do folderu configs 5. W pliku ADEPT_Models.txt dodajesz grupy/modele wszystko masz opisane w pliku 6. W drugim pliku dodajesz ścieżki do modelów/materialsów aby zaczęło pobierać pliki graczom, którzy wchodzą na serwer 7. Zmieniasz mapę i pod !models masz dodane przez siebie grupy z modelami ;-) Edytowane 10 Listopada 2019 przez Brum Brum literówka Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Gość Napisano 10 Listopada 2019 Hm, brakuje mi w tym pluginie możliwości ustawienia "BOTH" w kv, jako alternatywy dla dodawania tego samego modelu dla CT i TT 😛 Cytuj Przez Brum Brum, 10 Listopada 2019 Możliwe, że w przyszłym update się pojawi =) Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
gejmer Napisano 10 Listopada 2019 @Brum Brum a gdzie moge znaleźć models/player/custom_player/zombie/revenant/revenant_v2.mdl tylko mojego modelu? Cytuj Przez Brum Brum, 10 Listopada 2019 Jest to przykładowa ścieżka do modelu Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
gejmer Napisano 10 Listopada 2019 Tak wiem lecz nwn skad mam wziasc to z innego modelu Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum Napisano 10 Listopada 2019 13 minut temu, gejmer napisał: Tak wiem lecz nwn skad mam wziasc to z innego modelu Zazwyczaj jak pobierasz modele autorzy modelu dają ścieżki do plików w .txt Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
gejmer Napisano 10 Listopada 2019 @Brum Brum zrobilem wszystko i jest git ja widze model lecz inni gracze widza kwadrat error Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum Napisano 10 Listopada 2019 3 minuty temu, gejmer napisał: @Brum Brum zrobilem wszystko i jest git ja widze model lecz inni gracze widza kwadrat error Wgrałeś sobie pliki czy pobrało Ci od serwera? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
gejmer Napisano 10 Listopada 2019 @Brum Brum pobrało od serwera Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum Napisano 10 Listopada 2019 Teraz, gejmer napisał: @Brum Brum pobrało od serwera Proponowałbym dla testu zrestartować serwer i spytać graczy czy im pobierze model. Jak nie pomoże chodź PW na steam Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Paweł 1 Napisano 10 Listopada 2019 Jest jeszcze opcja, że graczom nieprawidłowo pobrał się model, dlatego mają wielkiego errora. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
gejmer Napisano 14 Listopada 2019 @Brum Brum Moj blad zle napisalem sciezke. Da rade jako vip zmienic model na standardowy ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum 1 Napisano 14 Listopada 2019 12 minut temu, gejmer napisał: @Brum Brum Moj blad zle napisalem sciezke. Da rade jako vip zmienic model na standardowy ? Aktualnie nie ma. W przyszłej aktualizacji na pewno się pojawi 😉 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum 2 Napisano 18 Listopada 2019 (edytowane) @Update Dodano możliwość wyboru domyślnego modelu. Usunięcie cvarów. Przejście na konfigurację(usuniętych cvarów) w KV Zmiana sposobu konfigurowania modeli (brak kv.JumpToKey) Dodanie możliwości ustawienia jednego modelu w dwóch drużynach bez konieczności dodawania tego samego modelu dwa razy. Aktualne tagi drużyn [CT/TT/BOTH] wszystko musi być z dużych inaczej pominie model. Dodano "show_in_menu"(bool) 0 - Osoby, które nie mają danej flagi nie widzą danej kategorii. 1 - Osoby, które nie mają danej flagi mają pokazane w menu dane kategorię, ale nie mogą ich wybrać. Dodano support SteamID (STEAM_X:X:XXXXXXXXX) wystarczy wpisać je w miejsce flagi. Kategorie, które są tylko dla danego SteamID nie są wyświetlane nikomu oprócz osoby z danym SteamID. Dodano "no_category"(bool) Jeżeli jest tylko jedna kategoria to nie wyskoczy jej wybór tylko od razu modele. Osoby korzystające ze starszej wersji proszone są o sprawdzenie nazwy pliku od downloadu. Znajduje się tam literówka w nowej wersji pluginu zostało to poprawione. Przez niezaktualizowanie nazwy pliku od pobierania może dojść do crashu na serwerze poprzez brak precache modelu! Edytowane 18 Listopada 2019 przez Brum Brum Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
haooy Napisano 5 Grudnia 2019 (edytowane) errorami spami, prosze o naprawe tego(najnowsza wersja z gory) Spoiler [SM] Exception reported: Invalid index -1 (count: 5) [SM] Blaming: ADEPT_Models.smx [SM] Call stack trace: [SM] [0] ArrayList.GetString [SM] [1] Line 510, dd\ADEPT_Models.sp::SetPlayerModel [SM] [2] Line 114, dd\ADEPT_Models.sp::Event_PlayerSpawn Edytowane 5 Grudnia 2019 przez haooy wersja Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Brum Brum Napisano 5 Grudnia 2019 57 minut temu, haooy napisał: errorami spami, prosze o naprawe tego(najnowsza wersja z gory) Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Ukryj zawartość [SM] Exception reported: Invalid index -1 (count: 5) [SM] Blaming: ADEPT_Models.smx [SM] Call stack trace: [SM] [0] ArrayList.GetString [SM] [1] Line 510, dd\ADEPT_Models.sp::SetPlayerModel [SM] [2] Line 114, dd\ADEPT_Models.sp::Event_PlayerSpawn Spróbuj tej wersji, jak wszystko będzie git zaktualizuję na górze 😃 ADEPT_Models.spHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
haooy Napisano 5 Grudnia 2019 dalej to samo, tylko troche sie zmienil error [SM] Exception reported: Invalid index -1 (count: 7) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach