Scydo 397 Odesláno: 27. Prosinec, 2020 Share Odesláno: 27. Prosinec, 2020 (upraveno) MASIVNÍ POUŽITÍ KNIHOVNY ***** V tomto díle nepůjde ani tak moc o návod, jako spíše o ukázku, že velkou většinu částí/includů ze knihovny lze aplikovat a tvořit s její pomocí prakticky cokoliv a obsahuje skoro cokoliv. Nějakou dobu jsem přemýšlel, jak to nejlepé předvést a tak mě napadlo napsat takovou menší ukázku Admin scriptu s použitím co nejvíce možností z knihovny, jak to je jen možné. Situace je následujicí, použil jsem: y_hooks pro hookované funkce, y_va pro již vytvořené formátované funkce zpráv, y_timers pro lepší práci s timery, y_inline pro práci s funkcí volanou ve fci, y_commands pro příkazy a parametry, y_dialog pro práci s dialogy a abych nepotřeboval nastavovat ID, y_ini pro ukládání údajů o hráči, y_colours protože obsahuje skoro 4000 barev jak pro zprávy tak i pro obyčejné použití, y_scriptinit pro speciální fci která se vyvolá jak ve FS tak i ve GM, y_utils pro doplňkové fce jako například právě zjištění nicku ReturnPlayerName(), y_iterate pro lepší práci s cykly, y_playerarray pro komprimaci paměti boolean proměnných, y_groups pro práci s oprávněním a skupinama. A vytvořil následujicí kód: Spoiler #include <a_samp> #include <YSI_Coding\y_hooks> #include <YSI_Coding\y_va> #include <YSI_Coding\y_timers> #include <YSI_Coding\y_inline> #include <YSI_Visual\y_commands> #include <YSI_Visual\y_dialog> #include <YSI_Storage\y_ini> #include <YSI_Server\y_colours> #include <YSI_Server\y_scriptinit> #include <YSI_Core\y_utils> #include <YSI_Data\y_iterate> #include <YSI_Data\y_playerarray> #include <YSI_Players\y_groups> new PlayerArray:IsAdmin<MAX_PLAYERS>, PlayerArray:vHp<MAX_PLAYERS>, Group:gPlayer, Group:gAdmin, Group:gVip; forward NacistData(playerid, name[], value[]); public NacistData(playerid, name[], value[]) { new bool:hodnota = false; INI_Bool("isadmin", hodnota); Bit_Set(IsAdmin, playerid, hodnota); Group_SetPlayer(gPlayer, playerid, true); INI_Bool("isvip", hodnota); Group_SetPlayer(gPlayer, playerid, hodnota); INI_Bool("isadming", hodnota); Group_SetPlayer(gAdmin, playerid, hodnota); return 1; } public OnScriptInit() { Group_SetGlobalCommandDefault(false); Group_SetGlobalGroup(gPlayer, true); gPlayer = Group_Create("Hráč"); gVip = Group_Create("Vip"); gAdmin = Group_Create("Admin"); Group_SetColour(gPlayer, X11_GREEN); Group_SetColour(gVip, X11_YELLOW1); Group_SetColour(gAdmin, X11_RED); GROUP_ADD<gPlayer> { @YCMD:help; @YCMD:setowner; } GROUP_ADD<gVip> { @YCMD:help; @YCMD:vhp; @YCMD:setowner; } GROUP_ADD<gAdmin> { @YCMD:help; @YCMD:setowner; } return 1; } hook OnPlayerConnect(playerid) { new file[50]; format(file, sizeof file, "%s.txt", ReturnPlayerName(playerid)); INI_ParseFile(file, "NacistData", .bExtra = true, .extra = playerid); return 1; } hook OnPlayerDisconnect@2(playerid, reason) { new file[50]; format(file, sizeof file, "%s.txt", ReturnPlayerName(playerid)); new INI:Soubor = INI_Open(file); INI_WriteBool(Soubor, "isadmin", Bit_Get(IsAdmin, playerid)); INI_WriteBool(Soubor, "isvip", Group_GetPlayer(gVip, playerid)); INI_WriteBool(Soubor, "isadming", Group_GetPlayer(gAdmin, playerid)); INI_Close(Soubor); return 1; } YCMD:setowner(playerid, params[], help) { if (Bit_Get(IsAdmin, playerid) == true) return SendClientMessage(playerid, X11_RED, "Už máš toto oprávnění !"); if (!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, X11_RED, "Nemáš dostatečné admin oprávnění !"); Bit_Let(IsAdmin, playerid); va_SendClientMessageToAll(X11_RED, "Hráč %s se úspěšně stal novým majitelem", ReturnPlayerName(playerid)); return 1; } YCMD:help(playerid, params[], help) { //Sample code return SendClientMessage(playerid, X11_RED, "Sample code"), 1; } YCMD:vhp(playerid, params[], help) { if (Bit_Get(vHp, playerid) == true) return SendClientMessage(playerid, X11_RED, "Už jsi toto použil. Vyčkej pro další !"); SetPlayerHealth(playerid, 100.0); defer dalsiPouziti(playerid); return SendClientMessage(playerid, X11_GREEN, "Úspěšně jsi si doplnil život!"), 1; } YCMD:setlevel(playerid, params[], help) = setalevel; YCMD:setalevel(playerid, params[], help) { if (help) return SendClientMessage(playerid, X11_YELLOW1, "Nastaví hráči Administrátorská práva !"); if (Bit_Get(IsAdmin, playerid) == false) return SendClientMessage(playerid, X11_RED, "Nemáš dostatečné admin oprávnění !"); if (isnull(params)) return SendClientMessage(playerid, X11_RED, "Použití: /setalevel ID"); if (strval(params) == INVALID_PLAYER_ID) return SendClientMessage(playerid, X11_RED, "Špatné ID !"); SetPVarInt(playerid, "playeridid", strval(params)); inline OnSetLevel(pid, dialogid, response, listitem, string:inputtext[]) { #pragma unused dialogid, inputtext if (!response) return 1; new id = GetPVarInt(id, "playeridid"); switch (listitem) { case 0: { Group_SetPlayer(gPlayer, id, true); va_SendClientMessage(pid, X11_GREEN, "Nastavil jsi hráči %s skupinu %s", ReturnPlayerName(id), Group_GetName(gPlayer)); } case 1: { Group_SetPlayer(gVip, id, true); va_SendClientMessage(pid, X11_GREEN, "Nastavil jsi hráči %s skupinu %s", ReturnPlayerName(id), Group_GetName(gVip)); } case 2: { Group_SetPlayer(gAdmin, id, true); va_SendClientMessage(pid, X11_GREEN, "Nastavil jsi hráči %s skupinu %s", ReturnPlayerName(id), Group_GetName(gAdmin)); } } } return Dialog_ShowCallback(playerid, using inline OnSetLevel, DIALOG_STYLE_LIST, "Nastavit lvl", "Hrac\nVip\nAdmin", "Potvrdit", "Zavrit"); } timer dalsiPouziti[1000*60*2](playerid) { Bit_Vet(vHp, playerid); SendClientMessage(playerid, X11_GREEN, "Už můžeš opět použít /vhp"); } YCMD:kill(playerid, params[], help) { if (help) return SendClientMessage(playerid, X11_YELLOW1, "Zabije hráče na místě"); if (isnull(params)) return SendClientMessage(playerid, X11_RED, "Použití: /kill ID"); if (strval(params) == INVALID_PLAYER_ID) return SendClientMessage(playerid, X11_RED, "Špatné ID !"); SetPlayerHealth(strval(params), 0.0); va_SendClientMessage(playerid, X11_RED, "Zabil jsi hráče %s", ReturnPlayerName(strval(params))); return 1; } YCMD:vips(playerid, params[], help) { new dialog[512]; foreach (new i: Player) { if (Group_GetPlayer(gVip, i) == true) { format(dialog, sizeof dialog, "%s\n{%06x}%s "YELLOW"[VIP]", GetPlayerColor(i) >>> 8, ReturnPlayerName(i)); } } return Dialog_Show(playerid,DIALOG_STYLE_LIST, "Vip Online", dialog, "Zavrit", ""); } Kdyby si náhodou někdo myslel, že jsem si ten kód jen vycucal z prstů a nelze to kompilovat, tak zde : https://ctrlv.link/shots/2020/12/27/33IK.png Pouze varování a to nevyužití jednoho makra, ale to lze snadno vyřešit či ignorovat. Několik poznámek ohledně kódu Jelikož plánuji udělat na zbytek includů z knihovny individuální návod, nebudu zde popisovat o čem přesně jsou, nebo co přesně dělají, ale: Bohužel, funkce při čtení souboru nemají návratovou hodnotu vyčtené informace. To znamená, že pro nastavení boolean je zapotřebí si deklarovat proměnnou new bool:hodnota která načtenou informací vše nastaví. Při načítání jsme nemuseli zjišťovat jestliže je hráč, protože pak zjišťujeme jestliže není VIP či Admin, a obě možnosti můžou vyjít jako nepravé, takže lze nastavit rovnou Group_SetPlayer(gPlayer, playerid, true), že s určitostí patří mezi hráče. Příkaz setalevel má alternativní příkaz setlevel. YCMD mají hned několik možných návratových hodnot. To znamená, že není dobrý nápad používat boolean návratovou hodnotu true/false ale pouze čísla a to 1 nebo 0. Hookované fce jsou jen pouze, kdybych místo scriptu z toho udělal include. A také se zavolají dříve než public. Proměnná IsAdmin neni nic více než jen pro rozlišení jestliže je admin a aby mohl příkaz setalevel. Při hookování OnPlayerDisconnect, jsem musel použít jiné "id" hooku, protože původní už je někde použité v knihovně. y_bit/y_playerarray - Odkaz y_hooks - Odkaz y_timers - Odkaz Hlavní topic - Odkaz Edited 27. Prosinec, 2020 by Scydo 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now