Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Žebříček


Populární obsah

Showing content with the highest reputation since 23.12.2020 in all areas

  1. 12 points
    Zdravíčko přátelé, přeji vám všem krásné vánoce a vše nejlepší do nového roku 2021 Máme za sebou poněkud splašený rok, a kvůli této situaci se hodně lidí ocitlo v tíživé situaci jak finanční, či rodinné. I mě jako živnostníka a majitele firmy to neminulo a od léta jsem se musel hodně otáčet, abych firmu nepoložil (klienti, se kterými jsem zvyklý pracovat, najednou začali šetřit). Proto jsem neměl dostatek času věnovat se fóru a jeho růstu, či proměně. Všichni členové týmu měli naprosto volné ruce, mohli měnit co se jim zlíbí. @Lucifer Morningstar dostal do rukou kompletní přístup k běžícímu VPS, @Ewwe na nás bohužel také nemá dostatek času a @vEnd začíná prohlašovat, že je potřeba nabrat nové lidi do týmu (kteří se budou aktivně věnovat dění na fóru), protože celý moderátorský tým se tu ochomítne jednou za týden. Herní Servery Mnoho lidí psalo mně i dalším zprávy s dotazy ohledně herního serveru. Za úkol zprovoznit Minecraft server to dostal @Lucifer Morningstar - VPSko už běží druhý měsíc a server stále nemáme (částečně se chvilkama čekalo i na mě). V tuto chvíli se VPSko reinstaluje z Cent OS (který Spy odsoudil, kvůli končící podpoře a stejně mě "zaúkoloval" s přehozením) na Ubuntu. Až se to dotáhne (při předpokladu, že do té doby neupadnu do spánku), tak tam sám nahodím jednak Minecraft server v základu, ale také pár dalších retro her - počínaje CoD2, či právě i SA:MP a uvidíme o co přesně byste měli zájem. Abychom nabídli něco originálního, jiného a nového tak servery poběží na základní nastavení - s tím, že tu na fóru se zřídí nějaká sekce, do které kdokoliv může postnout požadavek na instalaci jakéhokoliv kódu / addonu / módu. Celý proces vypilujeme za pochodu - zkusíme hlasování, manuální schvalování apod. Detaily čekejte v podrobnějším topicu zaměřeném na toto téma exkluzivně. Tým @vEnd Žádal o kompletní obměnu moderátorského týmu (včetně něj). Nakonec jsme to politicky ufackovali jen na nový přírůstek - někdo kdo je tu pravidelně, je aktivní a má zájem se podílet na rekonstrukci komunity. Také bych chtěl apelovat na všechny zkušenější, kteří tu s námi ještě jste - vytvořte nám nějaký content, návod, příspěvek. @Lucifer Morningstar přislíbil seriál na téma Linux a já se chystám na game-dev a hardware sérii. Jenže jsme jen dva a já věřím, že je tu více lidí, kteří by rádi postavili fórum zase na nohy Reklama Možná jste si všimli nových přírůstků mezi registrovanými členy Reklamy sice neběží na plný výkon (jako na jaře), nicméně budget je alespoň na nějakém minimu, který to udržuje + se snažím propagovat fórum i v osobních kruzích. Takže doufám, že jsme nováčkům pomohli a ještě jim mnohokrát budeme ku pomoci Další kroky V tuto chvíli je hlavním cílem mise, zajistit se na finanční krizi. Proto nebudou ani v dalších několika měsících probíhat významnější investice - pojede VPS na herní servery, reklama v nějakém menším budgetu, stále budeme bez download sekce a aktivita našich mužů nebude taková jaká by měla být. Já věřím, že to všichni pochopíte - jsme už dospělí lidé, někteří z nás mají už své rodiny. Jakýkoliv vývoj, kterýmkoliv směrem se budu snažit filtrovat do nějakého nového vlákna, kde popíšu jaká je situace, co se děje a co se dít bude. V tuto chvíli se řeší stavba herních serverů (Minecraft, CoD2, SA:MP), můžete již teď začít podávat návrhy na instalaci skriptů a obsahu, který na serverech chcete. Detaily dořešíme později Až se rozběhnou servery, dotáhneme ten problém s aktivitou v našich řadách a obnovíme reklamu. @Lucifer Morningstar se SNAD dostane k nějakému tomu návodu. Já určitě také něco sepíšu. Děkuji vám všem Rád bych poděkoval hlavně našemu moderátorskému týmu! Ti kluci jsou tu už takových let, nikdy za svou práci neviděli ani halíř, natož kolikrát poděkování. Proto bych jim rád poděkoval jak osobně, tak i nějakou revanží. Buďme prosím rádi za jejich služby a za to, že to fórum drželi a drží tak dlouho A i vám všem ostatním přeji veselý start a úspěšný rok 2021, který nám již klepe na dveře. Věřím, že už se vyhrabeme z nesmyslných opatření a začneme zase znovu budovat hodnoty, které jsou naší vizí.
  2. 7 points
    Ahoj. Rád bych zde odprezentoval své nové video ze hry GTA V a to konkrétně "kooperativní" stunt movie, které jsem vytvořil společně s kamarádem. Snad se bude páčit.
  3. 6 points
    Jestliže se mi to povede, tenhle topic by měl vyjít přesně na nový rok... (Skoro, o jednu minutu, sakra...) Happy New Year.
  4. 5 points
    Ahoj, napadlo mě sem přidat lightweight příspěvky jako jsou uživatelské statusy (tzn. ne klasické topicy ve fóru), které by sloužily jako "agregátor" tech novinek. Příklady (hodně odlehčené): Vyjde nová verze Nette. Zdejší PHP fanboys napíšou krátkou zprávu "Vyšlo nové Nette 4.0, je to pořád trash, umí to x, y a z, rozbila se zpětná kompatibilita. Více info zde". Vyjde nová specifikace ECMAScriptu, napíše se novinka "Vyšla nová specifikace ECMAScriptu, přináší to optional chaining atd. akorát to podporují stejně jen 2 browsery, takže se stejně transpiluje, cool". Výhody: Plno novinek z různých odvětvích, i které by mě nikdy nenapadlo sledovat (PHP). Takové RSSko. Zvýší to aktivitu - s takovýma blbostma asi nebudete spamovat normální topicy. Zvětšení zaměření fóra - zatím se fórum pořád drží pawna a nepřináší nic moc z okolního světa. // EDIT: Samozřejmě na novinky půjde reagovat - můžeme rozjet i nějaké flamewars a tím by se ještě víc zvýšila aktivita
  5. 5 points
    Nasiel som tuto velmi zaujimavu sadu includov, kde su zadefinovane vsetky ciselne prvky ako enumy. Pred tym som to este nikde nevidel takto pokope. Napr farba: #define COLOR_LIGHTRED 0xEE9090FF Alebo ikony: #define ICON_SCHOOL 36 Alebo skin: #define SKIN_CJ 0 //Carl "CJ" Johnson (Main Character) Alebo co sa mne velmi pacilo, tak Vehicle Health: #define VEH_HEALTH_FULL 1000 #define VEH_HEALTH_FULL_LOW 650 #define VEH_HEALTH_WHITESMOKE 649 #define VEH_HEALTH_WHITESMOKE_LOW 550 #define VEH_HEALTH_GREYSMOKE 549 #define VEH_HEALTH_GREYSMOKE_LOW 390 #define VEH_HEALTH_BLACKSMOKE 389 #define VEH_HEALTH_BLACKSMOKE_LOW 250 #define VEH_HEALTH_ONFIRE 249 Takze miesto cisla mozete pouzit text, ktory je ludskym okom lepsie citatelny nez nezname cislo, napr. 550. Miesto SetVehicleHealth(vehicleid, 550); mozete pouzit SetVehicleHealth(vehicleid, VEH_HEALTH_WHITESMOKE_LOW); Link na includy: https://github.com/kkmzero/isampp/tree/main/include/i_sampp
  6. 4 points
    YSI_Visual\y_commands + YSI_Players\y_groups ***** V tomto návodě se hodí ukázat obojí, protože oba includy z knihovny můžou být výborně spojené, ale zároveň lze použít pouze ycmd. y_groups je právě takové rozšíření na skupiny a levely(příklad podobnosti: oprávnění z Minecraftu). Jestliže se někdo chce naučit YSI, tak doporučuji si k ruce vzít také tento topic, protože obsahuje většinu kódu, na který je zaměřen i tento návod. Začneme y_commands. Nejdříve si načteme include z knihovny samozřejmě: #include <YSI_Visual\y_commands> A následně, jeho volání příkazů je poměrně snadné, příklad: YCMD:prikaz(playerid, params[], help) { //Sample code return 1; } S tím, že argumenty jsou jasné a to playerid pro hráče co příkaz zavolal, params[] pro parametry a help, to si ukážeme za chvilku. Pozor! Každý příkaz se MUSÍ vracet přes hodnotu 0 či 1. Nikdy true či false. Je to z důvodu, že každý příkaz má několiko vlastních návratových hodnot(později si ukážeme ve funkci). Argument help je argument, ktery se vyvolá poté, co hráč za příkaz napíše znak '?', příklad "help ?" nebo "kick ?". Do podmínky se vkláda tak, že znak hráč napsal správně(ostatní je klasifikované jako parametry). Ukázka použití: #include <YSI_Server\y_colours> YCMD:tajnyprikaz(playerid, params[], help) { if (help) return SendClientMessage(playerid, X11_YELLOW1, "Tento příkaz ti dá všechna práva !"); return 1; } Pokud ale máte raději starý dobrý i-zcmd / zcmd styl, tak to y_commands ho také podporuje a to: CMD:name(playerid, params[]) { // Sample code return 1; } Návod a více informací: Akorát jediná nevýhoda je, že nepodporuje následný argument help. Takže, jestliže ho někdo chcete používát, musí i použít formu YCMD. A kdo je nadšenec do zcmd, tak ví, že při nepoužívání params, tento argument lze vynechat. To bohužel y_commands nepodporuje(to samé s argumentem help). Dále y_commands obsahuje i možnosti alternativních příkazů. Jsou dva způsoby, a to původní starý ve funkci OnGameModeInit() / OnFilterScriptInit() / OnScriptInit(): #include <YSI_Server\y_scriptinit> public OnScriptInit() { Command_AddAltNamed("primarni", "sekundarni"); return 1; } A nebo novější a zajímavější metoda a to rovnou nad příkaz do kódu: YCMD:statistiky(playerid, params[], help) = stats; YCMD:stats(playerid, params[], help) { //Sample code return 1; } Pokud jde o y_groups: Jak jistě víme, že jedna z možností, jak kontrolovat, jestliže má hráč oprávnění můžeme podmínkou v každém příkazu, příklad: #include <YSI_Server\y_colours> YCMD:me(playerid, params[], help) { if (!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, X11_RED, "Nemáš dostatečné Admin oprávnění!"); // Sample code return 1; } Teď to zkusíme s y_groups. Nejdříve si samozřejmě nahrajeme include z knihovny: #include <YSI_Players\y_groups> Dále si deklarujeme samotnou skupina. Každá skupina má vlastní tag, stejně jako u y_bit/y_playerarray: new Group:Admins; Ale pozor. Samotná proměnná, tedy skupina teď sama o sobě nic není, přesnějí je takzvaně UNDEF a nebude správně fungovat, dokud si jí nevytvoříme opět ve funkci OnGameModeInit() / OnFilterScriptInit() / OnScriptInit(): #include <YSI_Server\y_scriptinit> public OnScriptInit() { Admins = Group_Create(); return 1; } Funkce Group_Create() má ještě jeden argument a to jméno. Jde o jméno, které pak vrací jiná funkce(o ní později) a jde o jméno, které bude mít každý vlastnít dané skupiny (jestliže to uživatel nastaví). Můžeme jí tedy nastavit nejen jméno ale také i barvu. A jméno ani nemusíme nastavovat při vytváření. Můžeme si ho nastavit později dle sebe: public OnScriptInit() { Admins = Group_Create("Admin"); Group_SetColour(Admins, X11_RED); /*** A NEBO ***/ Admins = Group_Create(); Group_SetName(Admins, "Admin"); Group_SetColour(Admins, X11_RED); Teď, následně jméno skupiny můžeme dostat pomocí funkce Group_GetName(), příklad použití: #include <YSI_Coding\y_va> new Group:gPlayers; YCMD:skupina(playerid, params[], help) { if (Group_IsValid(gPlayers) == false) return SendClientMessage(playerid, -1, "Tato skupina není validní!"); if (Group_GetPlayer(gPlayers, playerid) == true) va_SendClientMessage(playerid, X11_YELLOW1, "Jsi ve skupině %s", Group_GetName(gPlayers)); else return SendClientMessage(playerid, -1, "Nejsi v této skupině!"); return 1; } A y_groups mají ještě jedno zajímavou funkci a to: public OnScriptInit() { gPlayers = Group_Create(); Group_SetGlobalGroup(gPlayers, true); Jde o funkci, která danou skupinu nastaví jako defaultní, teda všichni kdo se připojí, i ti co přijdou na serveru po prvé, tak se jím automaticky nastaví. Do takové skupiny se právě hodí hráči jako základ. A teď zpět ke y_commands. Jak jsem říkal, oba includy lze výborně propojit. Jedna taková funkce je způsob, který defaultně všem zakáže všechny příkazy: Group_SetGlobalCommandDefault(false); A teď jsou dva způsoby, jak povolovat/zakazovat příkazy. 1. Povolit/zakázat všechny příkazy určité skupině: // Povolí celé skupině Group_SetCommandDefault(jmenoSkupiny, ALLOW); // Zakáže celé skupině Group_SetCommandDefault(jmenoSkupiny, DENY); Poznámka: V původní verzi YSI, se namísto ALLOW/DENY používalo true/false. Y_Less říká, že vám to pravděpodobně bude také fungovat, nicméně, více doporučuje používat ALLOW/DENY, hlavně protože boolean styl vám vyhodí stejně varování o tagu, více zde. 2. Povolit/zakázat určitý příkaz celé určité skupině. Group_SetCommand(jmenoSkupiny, YCMD:prikaz, ALLOW); Group_SetCommand(jmenoSkupiny, YCMD:prikaz, DENY); Nezapomenout používat tag YCMD: u jmén příkazů. A teď nemusíme neustále používat podmínku u každého příkazu na oprávnění. A nebo pokud se nechceme upsat k smrti funkcema, lze použít i zajímavější metoda: GROUP_ADD<jmenoSkupiny> { @YCMD:help; @YCMD:stats; @YCMD:vip; @YCMD:credits; } Hráči se daná skupina nastaví pomocí funkci Group_SetPlayer(). Příklad použití: new Group:gPlayers, Group:gDeathMatch; public OnScriptInit() { gPlayers = Group_Create(); Group_SetGlobalGroup(gPlayers, true); gDeathMatch = Group_Create(); Group_SetCommandDefault(gPlayers, ALLOW); Group_SetCommandDefault(gDeathMatch, DENY); Group_SetCommand(jmenoSkupiny, YCMD:leave, ALLOW); return 1; } YCMD:tymcerveny(playerid, params[], help) { // Sample code SendClientMessage(playerid, X11_GREEN, "Připojil ses do Team DeathMatch!"); Group_SetPlayer(gDeathMatch, playerid, true); return 1; } Jestliže použijeme y_groups ke y_commands, tak se nám také otevírá další možnost návratové hodnoty u příkazu a to, jestliže právě nemá dostatečné oprávnění. Stejně jako i-zcmd, tak i y_commands mají na to vlastní funkci a to: public e_COMMAND_ERRORS:OnPlayerCommandReceived(playerid, cmdtext[], e_COMMAND_ERRORS:success) { if(success == COMMAND_DENIED) { SendClientMessage(playerid, X11_RED, "Nemáš dostatečné oprávnění!"); return COMMAND_OK; } if(success == COMMAND_UNDEFINED) { SendClientMessage(playerid, X11_WHITE, "Tento příkaz neexistuje! Zkus použít /help"); return COMMAND_OK; } return COMMAND_OK; } A návratové hodnoty u příkazů/ve funkci můžou být následujicí: // Příkaz vrátil 0. COMMAND_ZERO_RET = 0 , // Příkaz se správně zavolal. COMMAND_OK = 1 , // Příkaz neexistuje COMMAND_UNDEFINED = 2 , // Nemá oprávnění na příkaz. COMMAND_DENIED = 3 , // Také nemá oprávnění + nedá dát znát, že existuje. COMMAND_HIDDEN = 4 , // Příkaz použil hráč, který by neměl existovat. COMMAND_NO_PLAYER = 6 , // Všechny příkazy jsou deaktivované pro totoho hráče. COMMAND_DISABLED = 7 , // Použit například '/' namísto '#'. COMMAND_BAD_PREFIX = 8 , // Nenapsal správně příkaz jako '/neco' COMMAND_INVALID_INPUT = 10, Hlavní topic - odkaz
  7. 4 points
    YSI_Data\y_bit ***** Prolog: Dá se říct, že celá YSI ohledně této tématiky má tři hlavní kategorie a to y_bit, y_playerarray, y_jaggedarray. y_bit je include z knihovny pro komprimaci paměti boolean proměnných. Pak jeho odvozenina je y_playerarray, což je prakticky to samé, nicméně s jediným rozdílem a to, že má jiný tag při deklaraci, ale použití je identické(spíše pro rozeznání). A třetí je y_jaggedarray, pomocí něhož lze přeskupit velikosti ve 2D poli a jejich buněk(nicméně jeho použití spadá už do obtížnosti ****). y_bit je výborně hodí, jestliže používáte spousty boolean polí. Problém u proměnných typu int a boolean je, že oba využivají stejný počet paměti, i když u boolean lze mít pouze dvě možné výsledné hodnoty a to 1(true) nebo 0(false). Někteří si můžou říct, že při těch pár proměnných není třeba nic šetřit. Jenže, v momentě, kdy je makro #MAX_PLAYERS 500 a uživatel proměnnou s ním deklaruje hned několikrát, tak už to může být problém. Při tvorbě příkladů jsem využil novou YSI5. Y_Less v návodě na instalaci uvadí, aby uživatelé použili sampctl. Nicméně, je i varianta pro uživatele bez toho a to zde: [klik] Pro použivání y_bit je nejdříve zapotřebí si ho nahrát: #include <YSI_Data\y_bit> Pozor. Jestliže, chcete používat i y_playerarray, musí se načíst i y_bit, protože obsahuje většinu fcí pro něj. #include <YSI_Data\y_bit> #include <YSI_Data\y_playerarray> A následná deklarace(ano, deklaruje se v ostrých závorkách): new BitArray:varX<ind>; // varX = jméno pole // ind = velikost pole, dále jinak jako "slot" new PlayerArray:AdminLevel<MAX_PLAYERS>; // AdminLevel = jméno pole // MAX_PLAYERS = velikost pole, dále jinak jako "slot" y_bit(a y_playerarray) mají následujicí základní funkce, které si každou individuálně vysvětlíme: Bit_Get(BitArray:array<>, slot); Bit_Set(BitArray:array<>, slot, bool:set); Bit_Let(BitArray:array<>, slot); Bit_Vet(BitArray:array<>, slot); Bit_SetAll(BitArray:array<>, bool:set); Bit_Get(); Vrátí boolean hodnotu dle toho, jaký má daný slot. Příklad: new BitArray:varA<256>; if (Bit_Get(varA, 100) == true) { print("Tanto bunka je true !"); } Bit_Set(); Nastaví danému slotu danou boolean hodnotu. Příklad: new BitArray:varA<256>; if (Bit_Get(varA, 32) == true) { print("Chyba, správně by měla být false!"); Bit_Set(varA, 32, false); } if (Bit_Get(varA, 128) == false) { print("Chyba, správně by měla být true!"); Bit_Set(varA, 128, true); } Bit_Let(); a Bit_Vet(); Jde vlastně o podobné funkce s tím rozdílem, že u Bit_Let() se nastaví hodnota na true, mezitím co u Bit_Vet() hodnotu na false. Obě fce jsou o trochu rychlejší než Bit_Set(). Příklad: new BitArray:varA<256>; if (Bit_Get(varA, 32) == true) { print("Chyba, správně by měla být false!"); Bit_Vet(varA, 32); } if (Bit_Get(varA, 128) == false) { print("Chyba, správně by měla být true!"); Bit_Let(varA, 128); } Bit_SetAll(); Jde o funkci, která nastaví u všech buňěk danou boolean hodnotu. Hodí se například u nastavení různých nutných null u hráče či serveru. Příklad: new BitArray:varA<256>; new i = 0; while (i < sizeof(varA)) { Bit_Vet(varA, i); i++; } // Tak tohle celé je zbytečné, protože stačí: Bit_SetAll(varA, false); Využití Tak to je celkém široké, protože jde víceméně o náhražku proměnné boolean, nicméně pár využití by tu bylo: Prostý AFK script: #include <YSI_Data\y_bit> #include <YSI_Data\y_playerarray> new PlayerArray:IsAfk<MAX_PLAYERS>; #include <YSI_Visual\y_commands> YCMD:afk(playerid, params[], help) { // Jestliže ještě není afk: if (Bit_Get(IsAfk, playerid) == false) { Bit_Let(IsAfk, playerid); SendClientMessage(..., "Nyní jsi AFK, pro navrácení napiš /afk"); TogglePlayerControllable(playerid, false); // Jestliže ale už afk je: }else{ Bit_Vet(IsAfk, playerid); SendClientMessage(..., "Vrátil ses zpět do hry."); TogglePlayerControllable(playerid, true); } return 1; } Prostý Event script s typem Admin Portu: #include <a_samp> #include <YSI_Data\y_bit> #include <YSI_Data\y_playerarray> new BitArray:EventPort<MAX_PORT_TYPES>; new PlayerArray:OnEvent<MAX_PLAYERS>; #include <YSI_Visual\y_commands> YCMD:event(playerid, params[], help) { if (getPlayerAdminLevel(playerid) > LEVEL_PLAYER) { Bit_Let(EventPort, strval(params)); // Nastaví se typ eventu } if (Bit_Get(OnEvent, playerid) == true) { return SendClientMessage(..., "Už jsi na eventu !"); } if (Bit_Get(EventPort, 0) == true) { // Na event se lze portnout pouze s vozidlem } if (Bit_Get(EventPort, 1) == true) { // Na event se lze portnout pouze bez vozidla } if (Bit_Get(EventPort, 2) == true) { // Na event se lze portnout pouze s určitým modelem vozidla } if (Bit_Get(EventPort, 3) == true) { // Tento event je TDM/DM } if (Bit_Get(EventPort, 4) == true) { // Tento event je závod } Bit_Let(OnEvent, playerid); // A pošleme ho na event, jestliže vše projde v pořádku return 1; } YCMD:koneceventu(playerid, params[], help) { Bit_SetAll(EventPort, false); Bit_SetAll(OnEvent, false); // Sample code return 1; } Scydovy YSI návody - Hlavní topic: odkaz
  8. 4 points
    Zdravíčko přátelé - možná jste zabrouzdali na toto fórum náhodou, možná hledáte zdroje k výuce programování, či si jen stavíte informační balík a zvažujete, jestli se do toho pustit. Na všechny vaše základní otázky bych rád odpověděl jednou větou - programování je styl života. A dále ji rozvedu: Jakmile se jednou naučíte programovat, už se nedokážete na jakoukoliv technologii koukat stejným způsobem jako kdy dřív. Jakmile začnete myslet analyticky, změní se vám pohled na celý svět. Osvojíte si nové dovednosti nejen na počítači, ale i v běžném životě. Programování prostě nehorázně ovlivní váš každodenní život a pokud mu propadnete tak jako například já - dá se říct, že vás úplně pohltí. Když se chce člověk naučit programovat, musí se naučit myslet jako stroj, představit si práci kódu, postup po řádcích a dokázat udržet v paměti kvantum informací. Při větších projektech jsem musel v hlavě udržet povědomí o několika stovkách názvů a vědět k čemu přesně slouží a případně kde jsou všude využity (a to mluvím jen o proměnných a vlastních funkcích). Nehledě na tisíce dalších názvů funkcí a dalších pojmů, které si musíte pamatovat při schopnosti jakéhokoliv psaní kódu. Programování rozvíjí všechny druhy mentálních schopností - logiku, matematiku, analytiku, strukturu, fantazii, kreativitu. Vy sami si určíte rychlost a intezitu, kterou to do sebe začnete prát - proto také nedoporučuji platit si výukové kurzy - budou to do vás prát rychlým tempem, protože čas jsou peníze a čím víc toho do vás co nejrychleji nahustí, tím více lidí dokážou "obsloužit". Ze zkušenosti vím, že většina nadaných programátorů startuje na programování ve hrách, které hrajou. Dává to smysl, protože právě pomocí her člověk najde v programování zálibu, koníček a smysl. Tvoříte vlastní svět, dle svých pravidel a realizujete vaše vlastní fantazie a nápady - tak jak se vám zachce. Objevujete nové funkce postupně a základy programovacích jazyků ve hrách jsou velmi jednoduché a často stavěné na syntaxi pokročilých jazyků, takže je potom přechod na vyšší level o hodně jednodušší. Z moderních her mohu doporučit jednoznačně Arma 3 (C-like SQF), Minecraft (Java), Rust (C#) a ze starších GTA SA:MP (C-like Pawn), CS GO (Lua / C-like Pawn), Garry's Mod (Lua). Začátek - první krůčky Učte se z dokumentace dané hry (či jazyka) za pomoci experimentování, snažte se vyřešit samostatně všechny chyby, bugy či pády - tímto způsobem se dá naučit nejrychleji, nejlépe a nejzábavněji. Pokud si myslíte, že problém se prostě nedá vyřešit, zkuste kód smazat a napsat ho úplně jinak, myslete tzv. outside-of-the-box - nemějte tunelové vidění. Jako v open-world hrách i programování má více řešení. Pokud problém vyřešíte, zkuste zapřemýšlet, proč to takhle funguje a proč to předtím nefungovalo - musíte do hlavy dostat všechny tyto informace a pospojovat relevance - poté začnete psát perfektní kódy neustále. Stanovte si nějaký cíl - například "Naprogramuji herní mód deathmatch, s počítáním skóre a textovými efekty vítěze" - po splnění zkuste něco obtížnějšího, něco co si nedokážete představit jak v tuto chvíli naprogramovat, ale přeci jen víte, že je to realizovatelné - například "Teď se pustím do capture the flag s náhodnými událostmi ovlivňující chování hry po každé získané vlajce" - hlavou vám proběhnou myšlenky jako "Sakra jak udělám tohle, a jak támhleto?" - v tuto chvíli je potřeba se naučit takové myšlenky vyházet z hlavy, jsou zbytečné. Řekněte si, co je potřeba udělat jako první, jako druhé a udělejte to, poté se vrhněte na další věci. Je dobré si ze začátku celý plán napsat bodově do nějakého dokumentu. V případě, že se pouštíte do HTML, PHP, či jiného webového jazyka (či neherního jazyka), si místo herních módu představte například vlastní blog, e-shop, portfolio, galerii, úložiště. Můžete zkoušet naprogramovat klony známých webů - idnes, dropbox, facebook, youtube, google - cokoliv vás napadne. V tuto chvíli nejde o výsledek - ale o experimentování, které vás zocelí ve znalostech. Další kroky Pamatujte, že v momentě kdy zjistíte, že vás to nebaví, je to moc složité na pochopení, vypadá to jakoby se někdo vyblil na klávesnici, nebo to píšou asi v latině - neztrácejte motivaci, zezačátku vždy experimentujeme - můžete se zkusit učit jiný jazyk, v jiné hře, jiném nástroji - tohle není čeština nebo angličtina, pokud se naučíte jeden programovací jazyk velmi dobře, je velmi pravděpodobné, že umíte základy dalších desítek programovacích jazyků. Jazyky se můžou lišit syntaxí, způsobem zápisu, ale ve výsledku jsou si všechny velmi podobné. Dá se říct, že největší skupina jazyků se označuje C-like (vyjadřují podobnost syntaxi jazyka C [wiki]). Poté tu máme originální Python, PHP, Pascal, Fortran, Perl, LISP. Jazyky se dělí na nespočet kategorií (druhů kategorií) a struktur, které je zbytečné znát [zdroj]. V tom největším měřítku se dají všechny jazyky obalit do 5 hlavních oddílů: Strojový jazyk - to jsou jedničky a nuly, bitové informace, nečitelné pro člověka, ale jediný jazyk, ve kterém pracuje jakýkoliv procesor. Assembly / LLL: low-level jazyk - jazyk vytvořený zvlášť pro různé procesory, nejnižší čitelná forma kódu (Assembler je program pro překlad tohoto jazyka na strojový jazyk) HLL: High-level jazyk - velmi user-friendly jazyk, který se využívá v profesní lize, tvoří se v něm hry, aplikace, nástroje, weby a všemožné další výtvory. (C, C++, C#, PHP, Java, apod.) VHLL: Very-high-level jazyk - je jazyk s velkou abstrakcí, většinou je částí již hotového produktu (tvořený v HLL), například jako součást moddovacích nástrojů her (SQF pro Arma 3, Pawn pro SA:MP) Dětské jazyky - existují pro výuku programování dětem, jsou naprosto jednoduché, většinou přeložené do řeči rodné země. Nabízí naprosto minimum funkcí a slouží jen jako základní vstup do světa programování. (Scratch, Blockly) A nebo je můžeme rozdělit do typů dle stylu programování: (Programovací paradigmata [zdroj]) Procedurální (imperativní) Funkcionální Objektově-orientované Skriptovací Logické Ve výsledku jde jen o to, zapamatovat si funkce, metody, proměnné a syntax. Vše ostatní už je jen schopnost toto všechno pospojovat dohromady - tomu se říká programování.
  9. 3 points
    Zdravíčko přátelé Rád bych vám představil první soutěž tohoto roku - a současně bych vás rád tímto motivoval k aktivitě, psaní návodů, odpovídání na témata a diskuzi. Za vaši aktivitu vás od této chvíle každý měsíc odměníme dárkem v podobě vytištěné figurky pawno.cz v modré designové barvě. Resp. pošleme ji tomu nejaktivnějšímu z vás Figurka je z materiálu PETG, rozměrově je 10cm vysoká a 5.5cm do šířek. Jde o vlastní model, vytvořený na základě původní figurky jazyka Pawn - která byla i v prvním logu fóra. Bodovat budeme jednotlivě každého dle množství obsahu, které za daný soutěžní měsíc vypustil do fóra - body se budou udělovat za kvalitu obsahu, relevance příspěvku, informační hodnotu a originalitu. Za každé kolo zveřejníme 3 nejaktivnější uživatele a oceníme je dle umístění takto: Figurka Pawno.cz + speciální titul na fóru dle výběru Speciální titul na fóru dle relevance Speciální titul na fóru dle relevance Figurka bude zabalena do krabičky a odesílána přes zásilkovnu - výherce si bude moci anonymně vybrat jakékoliv odběrné místo, kam mu ji poté zašleme. Speciální tituly na fóru ještě doladíme s vedením, ale představte si je víceméně takto: Best Guide Ultimate Tutor Lord of Discussion Které by měli lépe přiblížit komunitní zaměření výherce soutěže První místo si může vybrat, jaký titul chce. Dalším je přidělíme na základě způsobu jejich aktivity. Začínáme ihned, tak vzhůru do psaní!
  10. 3 points
    YSI_Players\y_text 📄 + YSI_Players\y_languages 📚 ***** Upozornění: YSI_Players\y_text 📄 #include <YSI_Players\y_text> Takže, nejdříve y_text. Je založena podobně jako, když si uděláme makra zpráv, které se například opakuji a nechceme je neustále psat: #define ERROR_MSG_ALEVEL "[ ! ] {FFFFFF}Nemáš dostatečné oprávnění !" // Simple code if (var[playerid] == false) return SendClientMessage(playerid, 0xFF000000, ERROR_MSG_ALEVEL); // Simple code Což je dobré. Můžeme kdykoliv zprávu změnit a nemusíme přepisovat stovky zpráv kdybychom chtěli cokoliv měnit. Nicméně problém je, že taková akce vyžaduje, aby se celý kód znovu kompiloval. A do toho přichází y_text. Díky kterému nejen, že můžeme měnit zprávu, ale můžeme jí změnit aniž by jsme museli znovu kompilovat kód. Teď někdo zkušenější by si asi řekl: ,,Nojo, ale pokud chceš mít upravitelné zprávy a nemuset stále kompilovat, tak si je jednoduše uložíš a pak načteš. Tak co bylo na tom tak speciální?". A odpověď zní ano. Je to prakticky načítání řetězců. Zkusíme si takový menší hloupější příklad: Může to být o trochu lepší ale prozatím pracujme s tímhle. Zatím to není tak hrozné, ale při více zprávách už začne být trochu problém(a navíc si na každou zprávu deklarovat proměnnou? Bruh). Teď zkusíme to samé se y_text: loadtext soubor[sekce]; public OnPlayerConnect(playerid) { Text_Send(playerid, $MSG_WELCOME); return 1; } public OnPlayerDisconnect(playerid, reason) { Text_Send(playerid, $MSG_BYE); return 1; } YCMD:hp(playerid, o[], help) { // Simple code if (AdminLevel[playerid] < LEVEL_MODERATOR) return Text_Send(playerid, $ERROR_MSG_ALEVEL); // Simple code } A to je všechno . Takže, jak si někteří všimli máme tu dvě zajímavosti a to funkce loadtext a Text_Send(). Funkce loadtext slouží právě na načtení údajů z našeho soubor.txt a přesněji všechen text pod tagem [sekce]. Jméno souboru i sekce jsou jedno jaké, klidně i server_text_benzinka.txt, ale jsou důležité tři body: Koncovka souboru se musí shodovat se zkratkou ve Langs_Add(o tom později), protože z toho pak načítá i text, dle toho v jakém jazyce se má zobrazit a jaký hráč má nastavený, Musíme přidat tag sekce textů, které má následně načíst, Adresa daného souboru aby byla ve scriptfiles/YSI/tu Takže příklad, vytvoříme si soubor Czech.CZ ve scriptfiles/YSI/ a v něm budou tři zprávy: [cze] MSG_HELLO = Ahoj, vítej na serveru. MSG_BYE = Sbohem. Zase se někdy zastav. MSG_ERROR = Někde nastala chyba! Nyní v kódě si tenhle text načteme pomocí: loadtext Czech[cze]; A můžeme začít používat kdekoliv pomocí funkce Text_Send(). Nesmíme ale zapomenout na znaménko $, které odkazuje právě na danou zprávu v souboru: Text_Send(playerid, $MSG_HELLO); Text_Send(playerid, $MSG_BYE); Text_Send(playerid, $MSG_ERROR); Ale tady zábava nekončí, protože Text_Send() je velmi chytrá funkce a nejen, že to může poslat hráčovi, ale také i všem hráčům v dané skupině: new Group:gVips; Text_Send(gVips, $MSG_VIP_EVENT); Nebo i všem co mají nějakou naší proměnnou. Nicméně pokud to je naše proměnná a nic ze YSI, tak musíme před proměnnou přidat znak @ a všem, kdo mají tuto proměnnou true se odešle zpráva(nelze udělat pro všechny co mají false ): new bool:bIsVip[MAX_PLAYER]; Text_Send(@ bIsVip, $MSG_VIP_EVENT); Můžeme i odeslat formátovanou zprávu se specifikátory! Stačí si jen ten specifikátor přidat do našeho souboru: [cze] MSG_HELLO = Ahoj %q, tvoje ID je %i. MSG_BYE = Sbohem %s(ID:%i). public OnPlayerConnect(playerid) { // Specifikátor %q je nick hráče a potřebuje jedno playerid // aby to jméno zjistil, pak druhé je jeho id samozřejmě. Text_Send(playerid, $MSG_HELLO, playerid, playerid); return 1; } Specifkátory do souboru jsou: %c - Character %b - Boolean %f - Float %s - String %q - Nick hráče, které zjistí z jeho ID %g - Zobrazení nekonečna %d + %i - Čísla %l - Slovně boolean, cokoliv větší než 0 se zobrazí jako true, a 0 se zobrazí jako false. %n - Příkaz, aka jak se zobrazí příkaz ve hře (kdyby uživatel chtěl změnit jejich jméno). [cze] MSG_HELP = Tento příkaz neexistuje, zkus se podívat do %n. Text_Send(playerid, $MSG_HELP, YCMD:help); Můžeme měnit i barvu naší zprávy. Ideální je na to použít naše y_colors, protože obsahují 4000 barev, tak na co si hledat vlastní? Jsou dvě možnost jak přidávat barvy do zpráv, lepší a horší. Horší je pomocí #jméno ale ten není zavřený, takže může sežrat i kus ze slova, například #GOLDenter by zobrazilo pouze ter, protože # sežral -en pro barvu GOLDEN, takže lepší je používat ve {jméno}: [cze] MSG_CMD_HELP = {RED}[ ! ] {SNOW}Tento příkaz neexistuje, zkus {RED}/help Lze použít i "X11" barvy, a postup je úplně stejný: RED -> X11_RED. Nicméně, je tu přecijen pár limitů. Jeden z nich je, že zpráva nemůže být delší než 128(je možné, že se to už zvětšilo, nikde o tom nic není). Takže, jestliže chceme delší text, tak můžeme použít další "specifikátor"(ono je to spíše identifikátor) a to _číslo, příklad _3, _2, _1...: [cze] MSG_DLOUHY_1 = Tohle bude moc dlouhý text, takže si radši na to něco dáme. "_2" "_3" MSG_DLOUHY_2 = Například budu tady psát náhodná slova takže něco jako slovosled MSG_DLOUHY_3 = to vůbec nebude existovat, protože heh to tak určitě. MSG_DLOUHE4 = Tohle už tam patřit nebude, protože nějáký vůl zapomněl přidat podtržítko před slovo DLOUHE. Text_Send(playerid, $MSG_DLOUHY); Teď, když víme jak na dlouhé texty, můžeme odeslat i dialog takhle? Ale samozřejmě, i na to má y_text funkce a hned na všechny styly dialogů: Text_MessageBox(...); Text_InputBox(...); Text_ListBox(...); Text_PasswordBox(...); // Jestliže ale i tak chceme vlastní tak: Text_DialogBox(playerid, DIALOG_STYLE_TABLIST_HEADERS, ...); Příklad použití: [czech] DIALOG_NABOJE_TITLE = Dům a náboje DIALOG_NABOJE = Napiš, kolik chceš schovat %s nábojů do domu číslo %i: DIALOG_CANCEL = Zrušit DIALOG_ACCEPT = Potvrdit inline OnHouseWeaponAdd(...) { // Simple code } Text_InputBox(playerid, using inline OnHouseWeaponAdd, $DIALOG_NABOJE_TITLE, $DIALOG_NABOJE, $DIALOG_ACCEPT, $DIALOG_CANCEL, GetPlayerWeaponName(playerid), GetHouseIDbyPlayer(playerid)); YSI_Players\y_languages 📚 A teď přichází ten důvod, proč je důležitá i koncovka souboru. Jestliže budeme používát y_text(nebo cokoliv, co ho obsahuje), tak nejen, že to vyhodí varování o nevyužití funkce Langs_Add a nejen, že stejné varování vyhodí i do konzole serveru ale také se nenahrají pořádně naše texty, protože ať chceme nebo ne, y_text se nahrajou spolu s y_languages a jakmile y_languages zaznamená, že není žádný jazyk, hodí se jako #NO_LANGUAGE (-1) a nic nenačte ani nenajde. Jestliže chceme ale jen používat vymoženost y_text a ukládat si naše zprávy do souboru, tak není problém. Stačí ten jazyk deklarovat, nastavit hráči a to je všechno. Nicméně, knihovna přináší pár zajímavých pomůcek pro servery co mají více jazyků. První co, tak si deklarujeme náš nový jazyk a jako vždy(a stejně jako y_groups) i on má vlastní tag: // Soubor czech.CZ: [all] HELLO = Dobrý den. //Soubor french.FR: [all] HELLO = Bonjour //Soubor germany.DE: [all] HELLO = Guten Tag. // Můžeme i více nahrání: loadtext czech[all], french[all], germany[all]; Všimněte si, že všechny 3 soubory mají stejný keyword HELLO. A jak teda pak zobrazit hráči tu správou zprávu? To přece podle toho jaký má nastavený jazyk! Tak pojďme si je vytvořit: Stejně jako y_groups i jazyky si musíme definovat: Mají dva argumenty a to 2 písmena(zkratka+koncovka souboru odkud se ten text jazyka nahrává) a jak se ten jazyk bude zobrazovat. Oboje samozřejmě lze zobrazit pak následně ve hře: public OnGameModeInit() { lCzech = Langs_AddLanguage("CZ", "Čeština"); lFrench = Langs_AddLanguage("DE", "Deutsche"); lGermany = Langs_AddLanguage("FR", "Français"); return 1; } Nyní ten jazyk samozřejmě musíme hráči nastavit. Můžeme buď jakmile se nastaví a nebo například v dialogu: new string[27]; format(string, sizeof string, "%s\n%s\n%s", Langs_GetName(lCzech), Langs_GetName(lFrench), Langs_GetName(lGermany)); inline OnChangeLanguage(pid, ...) { // Sample code switch (listitem) { case 0: Langs_SetPlayerLanguage(pid, lCzech); case 1: Langs_SetPlayerLanguage(pid, lFrench); case 2: Langs_SetPlayerLanguage(pid, lGermany); } // Sample code return 1; } Dialog_Show(playerid, using inline OnChangeLanguage, DIALOG_STYLE_LIST, "Nastavení", string, "Potvrdit", "Zavřít"); A teď, protože máme už jazyky načtené, máme je vytvořené i nastavené, tak můžeme hráčům posílat zprávy podle toho, jaký mají nastavený jazyk, například: YCMD:hello(playerid, o[], help) { return Text_Send(playerid, $HELLO), 1; } A to je všechno. Jak jsem již psal, y_languages si zjistí jazyk hráče podle toho jaký má nastavený. Pak dle toho vleze do správného souboru, vemze zprávu a zobrazí. Další věc, co se může hodit, tak zobrazení i zkratky jazyka: public OnPlayerText(playerid, text[]) { // Simple code if (...) { va_SendClientMessageToAll(X11_SNOW, "[%s] %s(%i): %s", Langs_GetCode(Langs_GetPlayerLanguage(playerid)), ReturnPlayerName(playerid), playerid, text); return 0; } // Simple code return 1; } Výsledek: [CZ] Scydo(ID:0): Ahoj, jak se vede? __________________________________________________________ Gratuluji, dostali jste se až na konec 🥳🥳🥳 Hlavní topic - odkaz
  11. 3 points
    Co třeba, až bude ten shop, jak se plánuje, tak že by se posílal voucher se slevou, třeba 10-20%?
  12. 3 points
    Ahoj, jak už ffredyk avizoval v jeho tématu pro plány pro rok 2021, chceme nabrat jednoho aktivního moderátora. Schválně zdůrazňuji slovo aktivního, protože přesně takového hledáme – někoho, kdo sem chodí alespoň jednou za den a je schopen se věnovat každodenní moderaci fóra, což zahrnuje: prevenci spamu a off topicu v tématech, uzamykání témat, kontrolu dodržování pravidel chatu, kontrolu a případné doplňování prefixů témat a kontrolu dodržování ostatních pravidel. Podmínky Přihlásit se může kdokoliv, kdo splňuje následující dvě podmínky: Každodenní aktivita na fóru – tato podmínka musí být splněna bez výjimky, nový moderátor musí na fórum docházet každý den a starat se o pořádek a dodržování pravidel. Dodržování této podmínky budu osobně kontrolovat a pokud se moderátor v tomto ohledu neosvědčí, dostane šanci další kandidát. Neaktivních moderátorů máme dost. Spisovnost a formálnost v psaném projevu – od nového moderátora vyžaduji, aby měl kulturní psaný projev, tedy projev, ve kterém nebudou hrubé pravopisné a gramatické chyby a který nebude v rozporu s dobrým chováním a pravidly fóra (tedy například žádné vulgarity či urážení ostatních uživatelů). Každý samozřejmě tu a tam vynechá čárku ve větě nebo napíše překlep, nicméně člověk má vždy možnost si po sobě svůj text přečíst, než jej zveřejní. Nekladu žádné požadavky na věk ani na zkušenosti s moderováním. Z vlastní zkušenosti vím, že naučit se s nástroji určenými pro moderování nezabere déle než pár dní. Forma žádosti Chcete-li se zúčastnit náboru, napište mi soukromou zprávu, ve které uvedete: jak často na fórum docházíte (jednou za den, dvakrát za den, každých 10 minut apod.), něco o sobě (můžete psát, o čem chcete – vaše záliby, vaše historie tady na fóru, klidně pište o vašem psovi) a zda případně můžete něčím přispět fóru vyjma moderování (psaním návodů, pořádáním akcí apod.). Předtím, než žádost odešlete, ujistěte se prosím, že splňujete obě podmínky uvedené v předchozí sekci. Závěr A to je vše, přátelé. Děkuji za přečtení a těším se na vaše žádosti! Nábor nemá pevně stanovené datum ukončení, jakmile budu mít vybraného vhodného kandidáta, nábor skončí a zbylí kandidáti, kteří se stihli přihlásit, se zařadí do pořadníku – to pro případ, že by se vybraný kandidát neosvědčil.
  13. 2 points
    Dobrý den. Projekt LA-RP hledá člověka na pozici: Developer. Info o projektu - Tento projekt je zcela nový na FiveM CZ/SK co si budeme.Klasický ESX NO WL projekt jelikož si prozatím nemůžeme WL dovolit z důvodu nizké návštěvnosti.Určitě do budoucna uvítáme formu Whitelist. Info o systému serveru + STAV -ESX systém + Koupené interiéry (Gabz+Unclejust+GKSHOP (GCPHONE) ) Nabídka pro nového developera + Požadavky -Finanční nabídka: 5000,- (Zde bych určitě preferoval nějakou písemnou smlouvu aby nedošlo k odcizení peněz do prázdná jedná se celkově o vysokou částku) - Záloha 1500,- za prvotní prácí (Tím nemyslíme že za celý komplet hotový server pošleme zálohu.Jednalo by se o první krůčky a začátek tvorby) -Férová domluva s majitelem projektu ohledně ceny - Okamžitá platba za odvedenou práci (Převod učet,Paypal) Co požadujeme - Zkušenost lua - Férové jednaní - dodržení slibu - Stabilní udržovaní z hlediska developu - Přechod na (Onesync Infinity) - Optimalizaci serveru. - Maximální limit financí pro dev: 6000,- Hodnocení projektu a komunity z hlediska majitele 8/10 - Kvalita RP na 50% Chovaní hráčů - 90% - Kvalita AT - 90% - Aktivita AT na reportech - 90% - Ze strany komunity pochvala. Děkuji za jakékoliv nabídky.Budu se těšit na budoucí spolupráci V případě mě kontaktujte zde pomocí SZ. (PS: Omlouvám se za gramatiku děkuji)
  14. 2 points
    Přesně tak, několik let jsme s klukama drželi OSK-Host, strašně nám to dalo a posunuli jsme se úplně jinam.
  15. 2 points
    Co je toto za dalsi shitpost? Ako majitel prveho free SAMP hostingu musim povedat, ze sme hostingy nezakladali preto, ze by "nebyli k dostani", ale preto ze nas to bavilo. Radi sme programovali, mali sme prostriedky (free pipni VPS) a chceli sme byt v centru diania SAMP, tak sme zakladali hostingy. Hostingy sme zrusili preto, ze nas to prestalo bavit a posunuli sme sa inde, nie preto, ze by bolo menej hracov. Ked som skoncil ja, tak som mal na hostingu plno. Mody kradli aj platene hostingy.
  16. 2 points
    Ahoj, nedávno jsem si všimnul, že se zde nedají psát pokročilejší texty (například matematické rovnice). Narazil jsem na plugin, který přináší syntax LaTeXu pro renderování matematických rovnic. https://github.com/capnrefsmmat/ipbLatex (tady by se hodil náhled githubu, viz můj předešlý návrh) Nejspíš by se to moc často nevyužívalo, ale když už, tak by to razantně zlepšilo kvalitu postu a pro některá odvětví, kterým se toto fórum nevěnuje, ale věnovat může, je zápis matematických konstrukcí fundamentální věc. Využít by se to dalo například v mém topicu o TSP, nebo v helpu o kulečníku, kde kolegové posílali rovnice pro výpočty úhlů, síly atd. pro simulaci kulečníkových koulí. Co si o tomto návrhu myslíte? Ukázka, jak vypadá zápis a výsledek zápisu: (nahoře zápis, dole vyrenderovaná matematická rovnice, která se zobrazí v topicu)
  17. 2 points
    Zdravím všechny, tentokrát je to příspěvek zejména pro ostřílené staré členy. Máte možnost získat svůj účet zpět! V roce 2013 kolem 1. ledna došlo při původním vedením fóra ke smazání několika účtů. (Byly to moderátorské účty) Pokud si pamatujete, bylo to z důvodu "ochrany". Samozřejmě to je nesmysl a mě osobně to mrzí, že jste o účty přišli. (Já sám jsem o něj taky jednou přišel, ale z jiného důvodu) Rozhodli jsme se, že chceme účty "vrátit". Členové, jež tehdy přišli a chtěli by ho nějak lehce zachránit, tak mají možnost. Po dohledání vám zde na novém účtu jsme schopni navýšit množství napsaných příspěvků o tolik, kolik jste jich měli v poslední záloze před smazáním a upravit datum registrace, které jste původně měli na starém účtu. Vážíme si vás a chceme napravit to, co někdo jiný tehdy pokazil. Za obnovení starých účtů zodpovídám já. Ověření datumu registrace a počet příspěvků probíhá přes web.archive.org. Kdo chce, tak se může ozvat sem nebo přímo do SZ mě. Díky Jinak gratuluji @Fakerko_ jako prvnímu, kdo má obnoveno!
  18. 2 points
    Přijde ti taky víc user-friendly klikací programování ve scratchi než psaní v jazycích jako pawn, java atd.?
  19. 2 points
    Jagshemas, v tomto insighteri by som vam chcel predstavit generovanie API dokumentacie pre webove aplikacie. O co ide? Dokumentavanie webovych endpointov je velmi dolezite pokial chcete, aby vase API pouzivali aj ostatni ludia. Nikto poriadne neriesi ako vlastne na to a vela krat je vysledkom iba odflaktnuty automaticky vygenerovany swagger napr. z .NETu. Ako bude vygenerovana dokumentacia vyzerat/o co sa vlastne jedna vizualne? Priblizne takto: https://stripe.com/docs/api/orders/object a takto https://redocly.github.io/redoc/#section/Introduction Ako nato? Existuje super standard, ktory sa vola OpenAPI (ako inak). Je to schema JSON/YAML suboru v ktorom popisujete vase API. Zaklad suboru vam dokaze pravdepodobne vyexportovat vas framework, ako napr. vyssie spominany Swagger v .NET. Na editovanie a pridavania examplov, popisu a pod. je opensource SW s nazvom Spotlight Studio. A finalne, na generovanie sa moze pouzit redoc, ktory vam dokaze subory bud servovat (ako http server) alebo vygeneruje standalone all-in-one html subor, ktory si nahodite na svoj web. Pre generovanie sa pouzije jednoduchy prikaz: npx redoc-cli bundle <nazov_suboru.yaml> (nodeJs potrebne. npx spusti npm package bez toho, aby ho stiahol). Linky: Spotlight Studio - https://stoplight.io/studio/ ReDoc - https://github.com/Redocly/redoc OpenAPI specka - https://www.openapis.org/
  20. 2 points
    A čo tak spraviť niečo ako "shop" figuriek, určite ten material nestojí moc, a poštovné taktiež nebude stáť. A však vôbec či by mal o to niekto záujem :D
  21. 2 points
    Ahoj, docela nam tu vsem chybis. Skoda, ze jeste nejsi modem
  22. 2 points
    YSI_Coding\y_stringhash + YSI_Coding\y_unique + YSI_Coding\y_remote + YSI_Game\y_vehicledata ***** Ahoj. Jsem tu opět a mám pár dalších docela zajímavých objevů ze YSI, o které se s váma musím podělit. YSI_Coding\y_stringhash #include <YSI_Coding\y_stringhash> hašování, přesněji hašovací funkce jsou funkce, které převedou pomocí matematické operace data do jednoduššího číselného údaje - více. y_stringhash pracuje velmi podobně. Vezme řetězec údajů a hodí do do číselné podobny, která se pak snadněji podmínkuje. K čemu to je dobré? Určitě známe všichni switch. Jestliže ne, více v návodě od @vEnd: A jak všichni víme, jediné údaje, které se dají přepnout jsou obyčejné hodnoty, které se lze porovnávat jako jsou int, float či boolean. A porovnávat řetězec? Například, když si chceme udělat příkaz /drazba, kde bude mít v příkaze možnost napsat jestliže bude dražit auto, dům nebo zbraň? Ani náhodou. Jediná možnost je pomocí funkce strcmp(), ale to není zrovna ideální. Tak přichází y_stringhash s možností i přepnout řetězec a to pomocí funkce YHash(): switch (YHash(mujStr, .podminka = boolean)) { case _H<dum>: { // Sample code } case _H<auto>: { // Sample code } case _H<zbran>: { // Sample code } YHash = Jméno funkce. mujStr = řetězec, který se hašuje, .podmínka = přesnějí argumenty funkce (jsou hned 4, později vysvětlím), _H = iterátor pro každý hašnutý údaj, ze slova Hash, <dum>, <auto>, <zbran> = hašnuté údaje, nepřidávat uvozovky! Ale pozor. YHash má zapnuté(true) case-sensitive, takže ahoj a Ahoj, aHoj apod nebude to samé. Jestliže chceme zahrnout i to, musíme ho vypnout(false) a používat jiný iterátor a to _I (od slova Insensitive): #include <YSI_Visual\y_commands> YCMD:event(playerid, o[], help) { switch (YHash(o, .sensitive = false)) { case _I<tunning>: { // Sample code } case _I<derby>: { // Sample code } case _I<dm>: { // Sample code } /* Zajímavost, vyhodí error, že už je definovaný: */ case _I<DM>: { // Sample code } Co se týče podmínek, přesněji argumentů u YHash, tak jsou následujicí: Jestliže chceme hašovat packnutý řetězec: switch (YHash(mujStr, .sensitive = false, .pack = true)) A nebo jestliže chceme hašovat jen určitou délku(max length) řetězce: switch (YHash(mujStr, .sensitive = false, .len = 5)) A teď pozor dvě a to dávejte si pozor jestliže se vám některý hašnutý údaj neopakuje(i když stejně, jestliže máte vypnuté case-sensitive tak vám to vyhodí chybu). Y_Less také říká, že se může, i když velmi nepravděpodobně, stát, že i když jste si jistý na 100 % že nemáte žádný stejný údaj dvakrát a stejně vám to vyhodí chybu o shodnosti, tak stačí změnit 3. argument funkce type. Více o tom, jak to funguje a jak se obě používají - zde. YSI_Coding\y_unique #include <YSI_Coding\y_unique> Často se nemusí ani nahrávat. Ve velké většině se nahraje automaticky spolu se y_hooks. y_unique není nic více než jen hromada maker, které přidávají ke funkcím číslo jako jejich "id" a tak umožní používat stejnou funkci vícekrát. Nejčastějí se takové věci hodí do include. Největší a nejužitečnější ukázka použití je právě y_hooks, protože nejen, že můžeme hookovat stejné funkce ale také můžeme je hookovat vícekrát: #include <YSI_Coding\y_hooks> hook OnPlayerConnect(playerid) { // Sample Code #1 } hook [email protected](playerid) { // Sample Code #2 } hook [email protected](playerid) { // Sample Code #3 } Největší "id", které se dá použít je 999. Takže jich je určitě dost. YSI_Coding\y_remote #include <YSI_Coding\y_remote> y_remote je prakticky jen vylepšené CallLocalFunction() a CallRemoteFunction(), nicméně, umožní dostávat chyby ještě před kompilací(například jestliže volaná fce nemá návratovou hodnotu a využívá se tak). Má hned několik keywords. Jedno z nich je vytvoření samotné funkce pomocí remotefunc: remotefunc LjmenoFunkce() { } // V jiném scriptu: remotefunc RjmenoFunkce() { } Dalším je voláním localfunc pro lokální a broadcastfunc pro mimo: public OnPlayerConnect(playerid) { // Zavolá pouze v aktuálním scriptu: localfunc LjmenoFunkce(); // Zavolá ve všech scriptech zároveň: broadcastfunc RjmenoFunkce(); return 1; } Pokud jde o argumenty, tak: localfunc LjmenoFunkce(cislo, Float:fcislo, string:rezezec[]) { pritnf("Cislo: %i, FCislo: %2.f Str %s", cislo, fcislo, retezec); } hook [email protected](playerid) { localfunc LjmenoFunkce(11, 43.3, "ahojjoha"); return 1; } A jak jsem již psal, jedna z výhod y_remote je, že může vracet i určité chyby, například právě s chybou návratové hodnoty: #include <YSI_Core\y_utils> remotefunc void:prosteBla(cislo) { printf("Cislo = %i", cislo); } public OnPlayerConnect(playerid) { new mojecislo = localfunc prosteBla(10); return 1; } // Vyhodí chybu, prosteBla nemá návratovou hodnotu A ještě jedna věc. Jestliže máme deklarovanou funkci v jiném kódě v jiném scriptu, je potřeba u volání funkce s řetězcem přidat i délku(alespoň podle knihovny). YSI_Game\y_vehicledata #include <YSI_Game\y_vehicledata> Tak jo. Tohle bude zajímavější. Většina z nás si musela vždycky deklarovat jména modelů a nebo půl hodiny hledat id daného modelu pro náš FS. Teď ale díky y_vehicledata, které má prakticky všechny, není třeba. Funkce y_vehicledata mají tři hlavní kategorie: Vehicle_ = Funkce berou a používají vehicleid, které vrací například CreateVehicle(), Model_ = Funkce berou a používají modeild, které vrací právě GetVehicleModel(), VMI_ = aka "Vehicle Internal Model" a mají vlastní speciální hodnotu a je specifické pro tenhle include. A k tomu používají i vlastní tag VMI:. Rozdíl oproti modelům je, že je vždy validní, můžou se použít jako index pro foreach a také mají právě tag, díky kterému se můžou odlišit. Všechny tři kategorie si stojí i za jménem funkcí, takže například Vehicle_IsPolice(), Model_IsPolice() i VMI_IsPolice() je vše stejně definované. Nyní funkce: Vehicle_GetCategory(vehicleid); Navrátí ID kategorie vozidla, které můžete vidět na wiki - odkaz. Kdyžtak jména kategorií: CATEGORY_UNKNOWN CATEGORY_AIRPLANE CATEGORY_HELICOPTER CATEGORY_BIKE CATEGORY_CONVERTIBLE CATEGORY_INDUSTRIAL CATEGORY_LOWRIDER CATEGORY_OFFROAD // Verze 1 CATEGORY_OFF_ROAD // Verze 2 CATEGORY_PUBLIC CATEGORY_SALOON CATEGORY_SPORT CATEGORY_STATIONWAGON // Verze 1 CATEGORY_STATION_WAGON // Verze 2 CATEGORY_BOAT CATEGORY_TRAILER CATEGORY_UNIQUE CATEGORY_RC A teď pokud jde o funkce pro podmínky, tak těch je hned několik. A jsou právě kategorizované dle modelu daného vozidla: (Poznámka: za jménoFce dosadit jednu ze tří kategorií, co chcete použít a to Model, Vehicle nebo VMI). Vehicle_IsValid(vehicleid); // Jednoduše zjistí jestliže je vozidlo validní. jménoFce_IsCar(vehicleid); jménoFce_IsTruck(vehicleid); jménoFce_IsVan(vehicleid); jménoFce_IsFire(vehicleid); jménoFce_IsPolice(vehicleid); jménoFce_IsFBI(vehicleid); jménoFce_IsSWAT(vehicleid); jménoFce_IsMilitary(vehicleid); jménoFce_IsWeaponised(vehicleid); //Jakékoliv vozidlo, které může cokoliv "střílet" (započítává se i voda) jménoFce_IsHelicopter(vehicleid); jménoFce_IsBoat(vehicleid); jménoFce_IsPlane(vehicleid); jménoFce_IsBike(vehicleid); jménoFce_IsAmbulance(vehicleid); jménoFce_IsTaxi(vehicleid); jménoFce_IsOnWater(vehicleid) - //Vozidla, která nejsou ve CATEGORY_BOAT, ale mohou na vodu. jménoFce_IsCoastguard(vehicleid); jménoFce_IsTrain(vehicleid); // I včetně vagónů. jménoFce_IsLS(vehicleid); // Specificky pro policie ze LS. jménoFce_IsSF(vehicleid); // jménoFce_IsLV(vehicleid); // jménoFce_IsTank(vehicleid); jménoFce_IsFlowerpot(vehicleid); jménoFce_IsTransport(vehicleid); jménoFce_GetName(vehicleid); // Navrátí jméno modelu v packed řetězci. Použití, určité jasné: YCMD:stop(playerid, params[], help) { if (help) return SendClientMessage(playerid, X11_GREEN, "Zastavit hráče pro kontrolu"); if (!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, X11_RED, "Nejsi ve vozidle"); if (!Vehicle_IsCar(GetPlayerVehicleID(playerid)) || !Vehicle_IsPolice(GetPlayerVehicleID(playerid))) return SendClientMessage(playerid, X11_RED, "Nejsi v policejním autě"); // Sample code } return 1; } A jaký je rozdíl mezi VMI a Model_/Vehicle_? Jak jsem již psal, je to jaká si vlastní forma y_vehicledata, a mají všechny 3 body: vlastí tag, vždy validní a použití jako index. new VIM:VIM_VehicleID = Vehicle_GetVIM(GetPlayerVehicleID(playerid)); new VIM:VIM_modelID = Model_ToVIM(GetPlayerVehicleID(playerid)); if (!VIM_IsPolice(VIM_modelID)) return ...; Hlavní topic - odkaz Gratuluju, dostali jste se na konec 🥳🥳🥳🥳.
  23. 2 points
    Ahoj, podělte se s ostatními o vaše oblíbené extensions do vašich code editorů/IDE (vscode, intelij, atom atd.) Mezi mé nainstalované extensiony do vs code patří tyto zajímavé kousky: C# - self explained (mám kvůli vývoji her v Unity, ale stejně to moc nefunguje na linuxu) (link) TeX Workshop - Pro všechny moje LaTeX potřeby (link) Vetur - Tooling pro VueJS (link) VSC-Prolog - Tool pro support prologu - jednoho z top jazyků (link) a samozřejmě vsinder - Pro noční brouzdání a navazování nových známostí (Něco jako tinder pro programátory) (link)
  24. 2 points
    Live server Remote SSH Prettier Auto rename tag Turbo console log
  25. 2 points
    Úvod Yii framework, je PHP framework a stejně jako mnoho dalších frameworku vám má především usnadnit práci a ušetřit čas psaním kódu. První vydání bylo v roce 2008. Nyní je Yii framework již ve verzi dvě. Klade důraz na znovu použitelnost a jednoduchost použití. Je striktně objektově orientovaný a každá komponenta frameworku je nezávislá, konfigurovatelná a rozšířitelná. Vlastnosti Rozdělení aplikační a prezentační logiky na základě MVC architektury. Přístup k databázi pomocí Database Access Objects (DAO) a Active Record Integruje jQuery knihovnu, pro validaci formulářů Jednoduché a bezpečné zpracování formulářů a validace dat Autentizace a autorizace – kontrola přístupu na základě hierarchických rolí Lokalizace (L10N) a internacionalizace (I18N) – překlad textů, formátování čísel a času Zpracování, archivování a filtrace chyb Zabezpečení a odolnost aplikace vůči různým druhům útoků Instalace Instalace vyžaduje, aby jste měli v počítači nebo na serveru nainstalovaný composer. A pak připravení aplikace vyžaduje PHP. A již předem vytvořenou databázi (prázdnou). Instalovat budeme advanced-template, jelikož basic-template nemá už v základu plno výhod a nechci vás o ně připravit. Otevřeme si příkazovou řádku a jdeme na to. Nejprve nainstalujeme plugin, který povoluje spravovat bower a npm závislosti skrze composer, a to příkazem: composer global require "fxp/composer-asset-plugin:~1.1.1" Poté si vytvoříme projekt samotný, příkazem: composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application Tento příkaz si rozebereme: composer – volání composeru create-project – dáváme vědět, že chceme vytvořit nový projekt --prefer-dist – znamená, že budeme upřesňovat, kde chceme nový projekt vytvořit yiisoft/yii2-app-advanced – název template advanced yii-application – název složky, která se vytvoří ve vašem počítači nebo na serveru s obsahem projektu (můžete libovolně upravit, dle svého) Finalizace Otevřeme si projekt v některém z editoru kódu, například VSC a otevřeme soubor: environments/dev/common/config/main-local.php – kde si nastavíme přístupy k databázi. Nyní musíme projekt z inicializovat, a to uděláme tak, že se v příkazovém řádku přesuneme do rootu nového projektu a pustíme příkaz: php init a zvolíme "Development". Poté pustíme migrace pomocí příkazu: ./yii migrate což nám automaticky vytvoří základní tabulky v databázi. A to je vše! Nyní máte web přístupný pod adresou http(s)://vas_web.cz/frontend/web/ a http(s)://vas_web.cz/backend/web/ – samozřejmě si můžete v Apache/Nginx nebo jen v .htaccess nastavit alias pro cestu, ale to už nechám na vás! Snad vás tento návod bavil tak, jako mě a zase někdy, AHOJ!
  26. 2 points
    Ahoj, vytvoris si dva objekty, na ktere napises svuj text pomoci https://open.mp/docs/translations/es/scripting/functions/SetObjectMaterialText a attachnes je na vozidlo.
  27. 2 points
    Já VS Code začal používat před týdnem. Pracuje se mi dobře v tom.
  28. 2 points
    Napawnit admin system. Konecne uz funguje prikaz /ecar [ID]
  29. 2 points
    Já začínal v PsPadu, pak jsem měl Sublime text, pak Atom, pak NetBeans a pak Visual Studio Code a u toho jsem zůstal. Visual studio code má totiž plno pluginů, theme a lze poměrně dobře customizovat. Třeba jako jediný z IDE má plugin pro synchronizaci souborů se serverem, krom NetBeans, který to má v základu. (IDE od JetBrains neznám). Visuální stránka rozhodně špatně nevypadá: PHP light theme: https://ctrlv.cz/qEot PHP dark theme: https://ctrlv.cz/DIXF HTML light theme: https://ctrlv.cz/kurd HTML dark theme: https://ctrlv.cz/8twf I ikony, které na screenech můžete vidět, tak se dají obměnit, takže je to fakt plně customizovatelné a za mě je to aktuálně nejlepší IDE. Jen ještě dodám, že na autocomplete pro PHP je to Visual Studia plugin, myslím tím funkce a classy skrze PHP projekt.
  30. 2 points
    Nevidel som, ako to na tých serveroch presne funguje, ale očakával by som, že na objekt biliardového stola je vložených niekoľko malých objektov biliardových gulí a že sa využíva ColAndreas plugin na zistenie, či guľa narazí do inej gule/hrany stola. Guliam vieš potom asi nastaviť rýchlosť a smer podľa rýchlosti a smeru gule, ktorá do nich narazila. U odrazov od hrán stola platí asi niečo na spôsob uhol dopadu = uhol odrazu.
  31. 2 points
    YSI_Storage\y_ini ***** Prolog: Anketa: Nejdříve si ukážeme jaké funkce mají naše vybrané includy (dini, DOF2, eINI a y_ini), abych ukázal, že není mezi nimi moc velký rozdíl(dokonce, některé nabízejí více možností): /* DINI DOF2 EINI Y_INI */ /* --- */ >>> DOF2_ParseFile(); >>> INI::ParseINI(); >>> INI_ParseFile(); dini_Create(); >>> DOF2_CreateFile(); >>> INI::CreateINI(); >>> INI_Open(); dini_Exists(); >>> DOF2_FileExists(); >>> INI::IsValidHandle(); >>> fexist(); // ! dini_Set(); >>> DOF2_SetString(); >>> INI::WriteString(); >>> INI_WriteString(); dini_IntSet(); >>> DOF2_SetInt(); >>> INI::WriteInteger(); >>> INI_WriteInt(); dini_FloatSet(); >>> DOF2_SetFloat(); >>> INI::WriteFloat(); >>> INI_WriteFloat(); dini_BoolSet(); >>> DOF2_SetBool(); >>> INI::WriteBool(); >>> INI_WriteBool(); dini_Get(); >>> DOF2_GetString(); >>> INI::ReadString(); >>> INI_String(); dini_Int(); >>> DOF2_GetInt(); >>> INI::ReadInteger(); >>> INI_Int(); dini_Float(); >>> DOF2_GetFloat(); >>> INI::ReadFloat(); >>> INI_Float(); dini_Bool(); >>> DOF2_GetBool(); >>> INI::WriteBool(); >>> INI_Bool(); /* --- */ >>> DOF2_SetHex(); >>> INI::WriteHex(); >>> INI_WriteHex(); /* --- */ >>> DOF2_SetBin(); >>> INI::WriteBinary(); >>> INI_WriteBin(); /* --- */ >>> DOF2_SaveFile(); >>> INI::CloseINI(); >>> INI_Close(); /* --- */ >>> DOF2_RemoveFile(); >>> fremove(); /* Asi?*/ >>> fremove(); // ! /* DINI DOF2 EINI Y_INI */ Více o eINI - zde Jediná potíž je, že y_ini má všechny fce pouze načítací ve fci ze ParseFile. Důvodem je hlavně rychlost, protože tímhle způsobem je načítání rychlejší když načítá rovnou celý soubor, či více údajů naráz. (Lze i určité, ale obtížnost spadá do ***). Tak jo začnem. První co asi některé mohlo zarazit je, že y_ini nemá funkce na smazání či zjištění existence souboru. Nicméně, jestliže chceme to zakomponovat, není problém si na to udělat makra: #define INI_Exists fexist #define INI_Remove fremove Když teď na to máme fce tak ukázka jak se zjišťuje existence souboru, otevírají a zavírají: if (INI_Exists("cesta/soubor.txt")) { new INI:soubor = INI_Open("cesta/soubor.txt"); INI_Close(soubor); // ! } Nesmíme zapomenout, že y_ini má vlastní tag na soubory. Ne File: jako mají soubory ale INI: tag. To není tak těžké. Teď si zkusíme do toho souboru vepsat pár údajů, všech možných datových typů: if (INI_Exists("cesta/soubor.txt")) { new INI:soubor = INI_Open("cesta/soubor.txt"); INI_WriteInt(soubor, "myInt", 94515); INI_WriteFloat(soubor, "myFloat", 0.594); INI_WriteHex(soubor, "myHex", 0xFF000000); INI_WriteBool(soubor, "myBool", true); INI_WriteString(soubor, "myString", "Ahoj, tohle je pro string"); INI_Close(soubor); } Pokud jde o načítání, tak jak jsem již psal, y_ini nemá fce na načítání určitých údajů(jako má, ale je to složitější) ale pouze ve volané funkci, kterou můžeme zavolat pomocí INI_ParseFile(). Je ještě jedna funkce na načítání a to INI_Load(). Funkce jsou prakticky stejné, akorát u Load není vícero argumentů ohledně načítání, takže doporučuji raději používat INI_ParseFile(): (A taky hlavně protože jsem zjistil, že Load nemá ani jméno funkce, do které vkládat načítání ale má nějakou vlastní, kterou jsem za boha nezjistil jaká to je ) INI_ParseFile(fname[], remoteFormat[], bool:bFileFirst = false, bool:bExtra = false, extra = 0, bool:bLocal = true, bool:bPassTag = false, bool:bFilter = true, filter[] = "") Tak jo. Má spousty argumentů ale pojďme si je vysvětlit: fname[] = Jaký soubor se má načíst. remoteFormat[] = Z jaké funkce se budou údaje načítat. bFileFirst = Jestliže nejdříve začít načítání souboru a až pak od určitého tagu a nebo při false, proces bude opačný. bExtra = Načíst nějaká speciální data. extra = Jaká speciální data načítat (ve 99 % případů to je playerid) bLocal = Načítat z lokální funkce či globální? bPassTag = Přidát tag k přidání speciálního parametru? NE K JMÉNU FUNKCE. bFilter = Přidat filter na všechny tagy a nebo jen na určitý? filter[] = Přidaný text pro nalézání určitého tagu na načtení. Jestliže jste zmatený, co jaká přesně delá, tak není třeba si dělat obavu. Za sebe můžu říct, že určitě použijete pouze 2 argumenty a to zrovna bExtra a extra pro playerid. Lze použít inline? Ano! A tady přichází ta ukázka, kde šlo poznat, že někdo kód okopíroval z tutoriálu, protože používal následujicí načítání: INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid); forward LoadUser_data(playerid, name[], value[]); public LoadUser_data(playerid, name[], value[]) { Což by sice fungovalo ale jen pouze, jestliže před vpisování údajů přidal i tag: INI_SetTag(soubor, "data"); Bez tagu, se to nenačte! Takže, přicházím s následujicím: Tagy jsou fajn a užitečné, ale pouze pro rozdělení sekcí údajů a není třeba je používat na načítání určitých údajů. Tím myslím rozdělení, kdy někteří nejdříve načítají registrační údaje jako je jméno, heslo, popřípadě IP a až poté načítají zbytek údajů. Za mě se to zdá zbytečné, a klidně naráz načíst vše, protože se na server stejně nedostane, dokud nezadá správné heslo. Načítat jenom určité bych uznal jen, pokud se načítá skutečně enormně velké množství údajů jako například 100 i víc. No, nevím, hlasujte v anketě, co si o tom myslíte. Tak a jak je to s načítáním samotným. Nic těžkého, stačí si na to zavolat funkci(nesmíse také zapomenout návratovou hodnotu!). Následujicí načítání má pouze 2 argumenty a to jméno klíče co se načítají a do čeho se má načítat: public OnPlayerConnect(playerid) { INI_ParseFile(SouborHrace(playerid), "NacistData", .bExtra = true, .extra = playerid); return 1; } forward NacistData(playerid, name[], value[]); public NacistData(playerid, name[], value[]) { INI_Int("myInt", myInt[playerid]); INI_Float("myFloat", myFloat[playerid]); INI_Hex("myHex", myHex[playerid]); INI_Bool("myBool", myBool[playerid]); INI_String("myString", myString[playerid]); return 1; } Ale jestliže chceme načíst takové hodnoty, do kterých se musí hodnota nastavit/navrátit, můžeme si ve funkci deklarovat proměnnou a pomocí ní načítat vše: #include <YSI_Data\y_playerarray> new PlayerArray:IsVip<MAX_PLAYERS>; forward NacistData(playerid, name[], value[]); public NacistData(playerid, name[], value[]) { new bool:hodnota; INI_Bool("myBool", hodnota); Bit_Set(IsVip, playerid, hodnota); return 1; } Nejlepší ukázka, kde lze dobře využít y_ini je registrace a přihlášení. YSI_Server/y_colours Nebo také YSI_Server\y_colors není nic více než hromada(přesnějí skoro 4000) předdefinovaných barev. Ne jen pro šestnáctková(barva nicku hráče) tak i desitkové nebo i barvy pro gametext. Pro šestnáctkovou před jménem barvy se přidává X11, u desitkové se nemusí nic přidávat stačí jméno a stejně jako u obyčejných gametext se přidává znak ~. Příklady použití: #include <YSI_Server\y_colours> SendClientMessage(playerid, X11_RED, "Tohle celé bude červená zpráva"); SendClientMessage(playerid, X11_RED, "Tohle bude červené "SNOW"tohle bílé"); GameTextForPlayer(playerid, "~X~~H~~H~zluta", 3000, 1); Hlavní topic - odkaz Všechny barvy u y_colors/y_colours:
  32. 2 points
    YSI_Core\y_utils YSI_Coding\y_va + YSI_Coding\y_inline YSI_Data\y_iterate / YSI_Data\y_foreach ***** Tak jo. Tyto 4 includy (plus jeden co je jen alternativa), sice obsahují mnoho dalších zajímavých vymožeností, nicméně, chci tu pouze ukázat to nejzajímavější a to, co s velkou pravděpodobností někdo použije při tvorbě FS/GM. YSI_Core\y_utils A začneme s y_utils. Jak už ang. slovo "utils" naznačuje, jde o nástroje, přesněji o hromadu užitečných funkcí. Většinou takové funkce jste mohli vidět na SA-MP fóře ve topicu "Useful functions": A to je jen ten seznam funkcí, co jsem našel . Kdoví, které tam ještě jsou. Tak zkusíme ty nejzajímavější/nejužitečnější: 1. isnull() pro parametry do příkazů: if (isnull(params)) return ...; 2. StrToUpper() pro změnu všech znaků písmen na velká a StrToLower() pro změnu všech znaků písmen na malá: format(str, sizeof str, "Máš zapnuté/vypnuté načítání? %s", Bit_Get(IsOnLoad, playerid) == true ? StrToUpper("true") : StrToUpper("false")); // Anti CapsLock va_SendClientMessageToAll(-1, "%s %s", ReturnPlayerName(playerid), StrToLower(text)); 3. Random() pro náhodné číslo a RandomFloat() pro náhodné desetinné číslo: Random(min, max); RandomFloat(Float:min, Float:max, dp = 2); Argument dp je ohledně zaokrouhlení výsledné hodnoty. Pro lepší představu kód: printf("%.3f %.3f %.3f %.3f", RandomFloat(1.0, 10.0, 0), RandomFloat(1.0, 10.0, 1), RandomFloat(1.0, 10.0, 2), RandomFloat(1.0, 10.0, 3)); printf("%.3f %.3f %.3f %.3f", RandomFloat(1.0, 10.0, 0), RandomFloat(1.0, 10.0, 1), RandomFloat(1.0, 10.0, 2), RandomFloat(1.0, 10.0, 3)); printf("%.3f %.3f %.3f %.3f", RandomFloat(1.0, 10.0, 0), RandomFloat(1.0, 10.0, 1), RandomFloat(1.0, 10.0, 2), RandomFloat(1.0, 10.0, 3)); printf("%.3f %.3f %.3f %.3f", RandomFloat(1.0, 10.0, 0), RandomFloat(1.0, 10.0, 1), RandomFloat(1.0, 10.0, 2), RandomFloat(1.0, 10.0, 3)); printf("%.3f %.3f %.3f %.3f", RandomFloat(1.0, 10.0, 0), RandomFloat(1.0, 10.0, 1), RandomFloat(1.0, 10.0, 2), RandomFloat(1.0, 10.0, 3)); printf("%.3f %.3f %.3f %.3f", RandomFloat(1.0, 10.0, 0), RandomFloat(1.0, 10.0, 1), RandomFloat(1.0, 10.0, 2), RandomFloat(1.0, 10.0, 3)); printf("%.3f %.3f %.3f %.3f", RandomFloat(1.0, 10.0, 0), RandomFloat(1.0, 10.0, 1), RandomFloat(1.0, 10.0, 2), RandomFloat(1.0, 10.0, 3)); A výsledek: 7.000 4.400 8.460 1.365 1.000 9.300 8.399 8.619 7.000 4.900 3.529 4.157 2.000 7.400 4.309 4.928 1.000 7.000 4.699 3.971 6.000 1.700 8.949 2.434 5.000 2.200 9.359 5.991 4. isnumeric() jestliže je řetězec znaků číslo: if (!isnumeric(inputtext)) return ...; 5. GetIP() vrátí IP hráče(ne pouze v číslech!): va_SendClientMessage(..., "%s", GetIP(playerid)); 6. IS_IN_RANGE jestliže hodnota je v rozmezí a NOT_IN_RAGE jestliže není: if (IS_IN_RANGE(10, 1, 100) == true) return print("Cislo 10 je v rozmezí!"); if (NOT_IN_RANGE(10, 1, 9) == true) return print("Cislo 10 není v rozmezí!"); 7. A nebo několik return ze řetězce hodnot do určitého datového typu: hexstr(string[]); boolstr(string[]); binstr(string[]); A mnohem více... YSI_Coding\y_va Include y_va pro změnu obsahuje možnost si udělat vlastní formátované zprávy, funkce apod. Příklad, běžného formátování zpráv: new string[144 + 1]; format (string, sizeof (string), "Bla bla bla %s %i %d", ReturnPlayerName(playerid), Random(10), Random(100)); SendClientMessage(playerid, -1, string); Další možnosti byly pomocí maker, nebo vzít proměnnou string jako globální proměnnou, nebo pomocí #emit. Nicméně pro obyčejné uživatelé to je velmi složitě. Include y_va nabízí jednodušší způsob, jak si takové funkce udělat. Ukázka použití funkce zpráv ze y_va: va_SendClientMessage(playerid, -1, "Bla bla bla %s %i %d", ReturnPlayerName(playerid), Random(10), Random(100)); A to není všechno. Nejen, že je to jednodušší, ale také rychlejší něž obyčejně či přes marka. Uživatel si může udělat vlastní pomocí va_format a va_start. Ukázka, jak je udělané va_SendClientMessage(): va_SendClientMessage(playerid, colour, const fmat[], {Float, _}:...) { new str[145]; va_format(str, sizeof (str), fmat, va_start<3>); return SendClientMessage(playerid, colour, str); } S tím, že formátování samotné fce je ve va_format a argument va_start<3> zastává pořadí, kdy se začnou přidávat hodnoty za specifikátory. Samozřejmě, nemusíte si takové funkce tvořit. Většina už je předdefinovaná. Seznam: va_print(const fmat[], va_args<>); va_SendPlayerMessageToPlayer(playerid, senderid, const fmat[], va_args<>); va_SendPlayerMessageToAll(senderid, const fmat[], va_args<>); va_SendClientMessage(playerid, colour, const fmat[], va_args<>); va_SendClientMessageToAll(colour, const fmat[], va_args<>); va_GameTextForPlayer(playerid, const fmat[], time, style, va_args<>); va_GameTextForAll(const fmat[], time, style, va_args<>); va_SetTimerEx(const function[], interval, bool:repeating, const fmat[], va_:STATIC_ARGS); va_CreatePlayerTextDraw(playerid, Float:x, Float:y, fmat[], va_args<>); va_TextDrawCreate(Float:x, Float:y, fmat[], va_args<>); va_CallLocalFunction(const function[], const fmat[], va_:STATIC_ARGS); va_CallRemoteFunction(const function[], const fmat[], va_:STATIC_ARGS); YSI_Data\y_foreach / YSI_Data\y_iterate Pokud jde rozdíl mezi foreach a iterate, tak žádný není. Jen foreach je více známé, protože je starší. y_iterare se dělí na dvě možnost použití. A. Lepší práce s cykly včetně s již předdefinovanýma podmínkama (například u cyklu pro hráče se cyklí pouze hráči). B. Udělat si vlastní hodnotu, co se bude cyklit. A. Nejdříve práce s cykly. Normální cyklus všichni asi známe, příklad: for(new i; i<MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { Pak je tu možnost s novou funkcí, která vrátí nejvyšší id hráče na serveru: for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++) { if(IsPlayerConnected(i)) { A teď ukázka přes foreach: foreach (new i: Player) { Jednoduché že? A obsahuje to i samozřejmě podmínku zda je to hráče a jestliže je online. Jinak používání je úplně stejné jako u obyčejného cyklu: foreach (new i: Player) { if (AdminLevel[i] > 10) { // Sample code } } Slovo "Player" je takzvané iter tag aka typ. Zde ještě je seznam dalších iter tagů, které obsahuje: foreach (new v: Vehicle) foreach (new b: Bot) foreach (new a: Actor) foreach (new c: Character) // Další části knihovny: foreach (new p: Bit(bit_jméno)) foreach (new g: Group(gAdmins)) foreach (new i: Range(10,100)) // Potom několik speciálních například: // Cyklus vrátí každého index v poli které obsahuje 0. foreach (new i : Null(pole)) // Cyklus vrátí každého index v poli které NEobsahuje 0. foreach (new i : NonNull(pole)) // Cyklus půjde pozpátku foreach (new i : Reverse(10)) // Mocniny. 1, 2, 4, 8, 16... foreach (new i: Powers(2)) // 5x náhodná čísla foreach (new i: Random(5)) // Fibonacciho posloupnost foreach (new i: Fib()) // Cyklus skončí jakmile narazí index rovnají se číslu, takže 5 new pole[] = { 1, 2, 3, 4, 5, 6, 7} foreach (new i: Until(6, pole)) // Cyklus vypíše všechny indexy na kterých se nachází číslo 6 new pole[] = { 6, 1, 9, 3, 4, 6, 6} foreach (new i: Filter(6, pole)) B. Teď je další možnost, kdy si lze přidat vlastní iter tag. Zkusíme si například udělat příkaz /admins. Začneme deklarací našeho iteru: // Maximální počet hodnot v iteratoru: #define MAX_ADMINS (10) // Proměnná s tagem Iterator: a maximální počet hodnot v ostrých závorkách: new Iterator:Admins<MAX_ADMINS> Než ale budeme pokračovat, vysvětlení pár funkcí, které y_iterate obsahuje: // Zjistí volnou hodnotu v iteratoru: Iter_Free(Iterator:Name<>); // Jestliže iterator tuhle hodnotu už obsahuje: Iter_Contains(Iterator:Name<>, value); // Přidá do iteratoru danou hodnotu: Iter_Add(Iterator:Name<>, value); // Odebere z iteratoru danou hodnotu: Iter_Remove(Iterator:Name<>, value); // Zjistí počet vložených iteratoru: Iter_Count(Iterator:Name<>); // Pročistí celý iterator od všech hodnot: Iter_Clear(IteratorArray:Name[]<>); // Zjistí velikost iteratoru, // (Jestliže na všechno používáte MAX_něco makro tak není co řešit): Iter_Size(Iterator:Name<>); Teď, jestliže je hráč teda náš admin, musíme ho do našeho iteratoru přidat. Můžeme například poté, co se připojí na server: public OnPlayerConnect(playerid) { LoadPlayerData(playerid); // <-- Udělaná nějaká naše funkce na načítaní údajů hráče if (AdminLevel[playerid] > 0) { if (Iter_Count(Admins) < MAX_ADMINS) Iter_Add(Admins, playerid); else return printf("Něco je špatně. Asi máš moc Adminů v Admintýmu! %i", Iter_Count(Admins)); } return 1; } Samozřejmě, po odpojení ho musíme odebrat, jinak se nám budou stále přidávat další: public OnPlayerDisconnect(playerid, reason) { if (Iter_Contains(Admins, playerid)) Iter_Remove(Admins, playerid); return 1; } A nakonec, jestliže je se vypne FS či server, tak pro jistotu tenhle iterator pročistit. Lze to i po spuštění: public OnFilterScriptExit() { Iter_Clear(Admins); A teď, když náš iterator obsahuje POUZE hráče, co mají adminlevel, můžeme s ním snadno pracovat: YCMD:admins(playerid, o[], help) { if (Iter_Count(Admins) == 0) return SendClientMessage(playerid, X11_RED, "Momentálně není online žádný Admin!"); foreach (new i: Admins) { if (IsPlayerAdmin(i)) va_SendClientMessage(playerid, X11_YELLOW1, "%s [LEVEL %i + RCON]", ReturnPlayerName(i), AdminLevel[i]); else va_SendClientMessage(playerid, X11_YELLOW1, "%s [LEVEL %i]", ReturnPlayerName(i), AdminLevel[i]); } return 1; } YSI_Coding\y_inline Jednouše řečeno, jde o include, kde lze používat vnořené fce, aka funkce ve funkci a velmi často se přitom používá naše kouzelné slovíčko using, a buď inline pro uvnitř a nebo public pro mimo. Takto se VÝBORNĚ hodí na práci s dialogy, protože nikdo nechce ten mega obrovský OnDialogResponse kód. Je opět několik možností, jak tento inlcude používat. Jde i při tom tvořit vlastní funkce, které se budou volat, nicméně, to už spadá do obtížnosti ****, takže to vynechám. Ale kdo by se o to zajímal, tak více informací zde - odkaz My se zaměříme, jak to efektivně využít do našeho GM. Jak jsem již psal, výborně se hodí s y_dialogs, protože můžeme volat otevřený dialog a nemusíme ho cpát do fce OnDialogResponse(). Jednu variantu ukázky jsem tu již převedl a to voláním dialogu mimo fce a to ve Přechod z dini/dcmd/jiné na YSI4 (v části o dialogu) a nebo uvnitř fce a to ve Masivní použití knihovny. Hlavní topic (kdyžtak upraveny na 2020) - odkaz
  33. 2 points
    Pěkný tutoriál. Doteď jsem nevěděl že přes YSI se dají dělat i příkazy. Díky moc.
  34. 2 points
    Bože ty to vidíš, a necháš to tak.
  35. 2 points
    No pošli nám ho tu koukneme se. S velkou ochranou očí.
  36. 2 points
    Ty také posíláš tvé Gm i když nejsou tvé :D
  37. 1 point
    Designově se mi tam del button úplně nehodí právě... Na androidu nativní tlačítko "Smazat" funguje, na iOS je tlačítko "Reset" ale to nic bohužel neudělá :/
  38. 1 point
  39. 1 point
    Ahoj, nedávno tady došlo k přehlédnutí linku na github a tak mě napadlo, že by bylo dobré přidat při linknutí githubu náhled jeho README.md (+ metadata jako název, autor atd.), podobně jako to je při linknutí jiného topicu zde na fóru. Co si o tom myslíte? // Edit: Byl jsem upozorněn členem @Scydo, že už zde nejsou náhledy pro pastebin (docela škoda), toto by se mohlo nahradit náhledy na Github gist, nebo přidat rovnou i náhled na pastebin. Vizuálně je to rozhodně lepší, než kus linku.
  40. 1 point
    Už tu na ní je dávno vytvořený topic
  41. 1 point
    Auto rename tag umi VSCode do jiste miry samo (musi se to zapnout), bohuzel to nepodporuje uplne vse Prettier je takova klasika, ale TCL vypada docela uzitecne. Diky za sdileni!
  42. 1 point
    Ja robim v Angularu. Oproti ostatnym mi pride super v tom, ze ma oddeleny data layer (service), je OOP, TypeScript, defaultna imeplementacia http clientu + interceptorov. Je modularny, ma directivy a je podporovany googlom. Angular je viac urceny pre enterprise riesenia, kde vynika, nie pre micro weby. React je shitty v tom, ze uzivatel nema moc moznosti, ako prenasat data medzi komponentami. Takze bud si to prehadzuje cez props, co je strasne prijebane riesenie, ak si tam potrebujete preniest 10 objektov alebo pouzit redux, ale to je zas state management system, nie data layer. Nema css/scss layer abstraction, jak ma napr angular. Obecne sa v reactu velmi casto pise cssko priamo v JS, co je tiez dobra sracka. JS je pre scripty, HTML pre znackovanie a CSS pre stylovanie. je*at to vsetko do jedneho suboru je jak keby to programoval nejaky premotivovany analfabet, co opustil vysku, zamestnal sa v FB a zacal vymyslat chujoviny. Robil som v Reactu cca 2 roky (a stale bohuzial robim nejake legacy bugfixy) a ako, nikdy viac. Plus jako oddelovat kod na modely a funkcie? Jako WTF? Nejaky Domain Driven Design alebo HexArch sa moze pojebat, ked tu mame react/redux. Proste dajme dokopy funkcie pre account spolu s funkciami pre napr. shopping cart. Pac to domenovo spolu uplne suvisi, hlavne ze je to inovativne riesenie...
  43. 1 point
    Děkuji moc, ale jak říkám GM není kompletně můj je tam něco přidaného z ostatních GM protože se mi to líbilo tak jsem si to tam vložil atd...
  44. 1 point
    Dodělal jsem svůj RolePlay server na který jsem hrdý a jsem rád že po 4 letech práce mám za sebou. Ještě to chce dodělávky ale tak to potrvá měsíc.
  45. 1 point
    Já osobně hodlám sledovat vývoj Apple M1 čipu, jelikož se dosti povedl a čekám co přinese M1X a M2. Jinak jsem se ještě nedostal podívat se na PHP8, kde by prý měl mít nárůst výkonu po optimalizaci.
  46. 1 point
    :seenobodycares: :airquotes: :catmeh: :itsthelaw: Zdroje:
  47. 1 point
    Chcem priateľku požiadať o ruku 🌹
  48. 1 point
    Děkuji, ale nenašla by se jiná verze než je deamx ? chtěl bych si zkusit i ten GM poupravit a zahrát si ho na soukromém serveru.
  49. 1 point
    To je anténa navržená pro spojení dvou vzdálených bodů s přímou viditelností - má malý úhel. Určitě není navržená na pokrytí prostoru signálem. Mrkni spíš na něco jako tohle: https://www.i4wifi.cz/cs/210743-ubnt-unifi-ac-mesh-ap-2-4ghz-300mbps-5ghz-867mbps-1x-gbit-rj45-venkovni-poe-24v-802-3af-alta?gclid=CjwKCAiA25v_BRBNEiwAZb4-ZT4TLwQRbkQp2VGNsNAhSJ7SceoCLma0f9RLQdrq5mY4GyzcTVGouRoCZxcQAvD_BwE
  50. 1 point
    Keďže ku dňu 1.04.2018 mne a pár ďalším členom fóra bol udelený post "Zástupca hlavného moderátora", je čas vykonať nejaké zmeny. Tu je môj návrh zmien, ktoré by mohli prejsť (a byť schválené) radou ZHM. 1.) Vytvoriť z tímu ZHM plnohonotný tím administrátorov a) (Voliteľné) Odstrániť vEnda 2.) Pridať novú sekciu na porno, samozrejme, v slobodnej zemi sa každý môže vyjadriť a teda by nemala byť táto sekcia nijako obsahovo kontrolovaná 3.) Vrámci zachovania/zvýšenia dynamiky tohoto fóra, každý novo-registrovaný môže počas prvých 24 hodín zaviesť na fórum nejakú zmenu; nikto z moderátorov/administrátorov mu nemôže odporovať 4.) Zvýšiť aktivitu v chate auto-banom ak používateľ neprispieva do chatu aspoň 2x za týždeň Píšte ďalšie návrhy, tie budú prebrané vrámci ZHM a prípadne pridané na fórum. Ďakujem za pozornosť.
×
×
  • Create New...