Jump to content

Žebříček

Populární obsah

Showing content with the highest reputation on 01/04/21 in all areas

  1. 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.
    2 points
  2. Používat kolizní detekci fyzikální cestou je zbytečná ztráta výpočetního výkonu (alespoň pro tento počin) - Celá věc se dá (jak již odpověděl @Hip) spočítat jen jednoduchou matematikou. Hráč po potvrzení úhlu a síly šťouchu "předá serveru" vstupní vektor, na základě kterého se vyšle bílá koule do prostoru a každým tickem se jí konstantně ubere rychlost a zároveň změří vzdálenost od ostatních koulí (s ohledem na jejich radius - resp. velikost). Pokud protne jinou kouli, spočítá se úhel mezi původním vektorem a vektorem do druhé koule (pozice bílé koule minus pozice kolizní koule) a na základě tohoto úhlu se poté vytvoří dva nové "vstupní" vektory, které se využijí pro novou aktivaci skriptu na obě koule s poloviční rychlostí bílé koule v místě kolize. A to celé se opakuje do té doby, než rychlost překročí nějaký limit (rychlost < 0.01 např) - poté se šťouch "dokončí" a začíná se na novo. EDIT: Případně se dá na základě kolizního úhlu vypočítat i poměr předané energie pro rozdělení rychlosti koulí (když bílá jen škrtne jinou kouli, nepředá ji půl rychlosti ale jen zlomek (90 - [uhel] / 90) * [rychlost bílé koule]
    1 point
  3. Varianta jedna jsou texdraws, varianta druhá je přes objekty. Chovej se k objektům jen v rámci dvou os - budou se pohybovat jen v 2D prostoru, dej pod ně kulečníkový stůl, na to koule a jejich pohyb dopočítávej. Pomůže ti k tomu určitě https://cs.wikipedia.org/wiki/Soustava_souřadnic ber plochu stolu jako soustavu souřadnic ve 2D prostoru. Náraz koule do koule zjistíš přes https://www2.karlin.mff.cuni.cz/~portal/analyticka_geometrie/souradnice.php?kapitola=vzdalenost kde budeš počítat každý pohyb, zda se koule přiblížila k jiné, přičemž odchylka bude poloměr koule. Kam se koule posunuje a kam se má posunout zjistíš přes vektory https://matematika.cz/vektory A doporučuju používat něco jako SetObjectPosition nikoli MoveObject, protože koule bude pomalu zpomalovat a budeš to podle mě mít jednodušší. Vypadá to složitě, ale je to jinak strašně jednoduché
    1 point
  4. 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:
    1 point
  5. Viz. edit původní citace - došlo mi to dřív, než jsi stihl zareagovat
    0 points
  6. 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.
    0 points
×
×
  • Create New...