Jump to content
Fivem-DEV.cz

Leaderboard


Popular Content

Showing content with the highest reputation since 04/29/2021 in all areas

  1. 1 point
    Activity Pub ActivityPub je otevřený, decentralizovaný protokol sociálních sítí založený na protokolu Pump.io ActivityPump. Poskytuje rozhraní API typu klient / server pro vytváření, aktualizaci a mazání obsahu a také federované rozhraní API typu server-to-server pro doručování oznámení a obsahu. Zdroj: ActivityPub - Wikipedia Proč nás to zajímá? FiveM implementovalo podporu ActivityPub feedů pro servery před více než rokem. feature: cfx-ui: community home page feed (to use, `sets activitypubFeed fivem@mastodon.social` or similar ActivityPub/WebFinger endpoint) committed 5. úno 2020 Launcher Navíc je na úvodní obrazovce FiveM klienta “COMMUNITY” feed, který obsahuje souhrn zpráv z různých relevantních účtů, včetně zpráv ze serverů, na kterých jste v minulosti hráli. image (1)2560×1403 454 KB Profil serveru Každý server s aktivním ActivityPub feedem na svém profilu sloupec s historií novinek. image2560×1440 329 KB Jak na to? Možností je několik, od vlastní implementace, přes vlastní instance na hotovém systému, který má implementaci technologie, až po hostované řešení, kam se jen zaregistrujete a píšete. Výběr řešení Vlastní řešení - ActivityPub Hotová implementace - ActivityPub - W3C Wiki Hotová implementace - Mastodon Self-hosted - https://joinmastodon.org/ Hosted - https://mstdn.social/ Nastavení MSTDN.SOCIAL Navštívíme stránku https://mstdn.social/ Zaregistrujeme se image (5)1059×805 95.7 KB Potvrdíme registrační email Proklikáme se úvodním přivítáním, které nám přehledně v češtině představí službu Můžeme začít psát příspěvky! image (9)1281×769 61.6 KB Napojení na FXServer Napojení je velmi jednoduché, mělo by fungovat vše na FiveM klientovi, např. FiveM, RedM, LibertyM Otevřeme si https://mstdn.social/settings/profile , kde vidím svou adresu, doporučuji nastavit zobrazované jméno a avatar. Kamkoliv do konfiguračního souboru (většinou server.cfg) pro spuštění FXServeru setneme naši adresu pomocí activityPubFeed, např. takto: sets activitypubFeed pepega@mstdn.social Restartujeme server Načtení feedu může trvat i několik desítek minut (vyjímečně možná i hodin), nemusí být hned (problém mezi nebem a FiveM). V “Community” feedu na úvodní stránce klienta FiveM se zobrazují zpravidla servery na kterých jste historicky hráli a máte je nacachované v historii klienta. Líbil se ti návod, využil jsi ho? Hoď lajk, subscribe, zvoneček, nebo co to tady vedou :))) A poděl se o zkušenosti! Chceš poděkovat kafem? https://www.paypal.com/paypalme/johnnypernik
  2. 1 point
    Ahoj, přidávám sem odkaz na stáhnutí NoReticle v podstatě se jedná jen o primitivní script na zmizení crosshairu ve hře. Je to napsané čistě v lua, protože originální script NoReticle je napsaný v c# a žere na server-side dost... Takže toto nemá server-side a je to jen na klientu a na resmonu to žere 0.2 Pokud používáte i u sebe NoReticle zkuste si udělat profiler na server-sidu jestli Vám též nežere.
  3. 1 point
    V tomto návodu si ukážeme jak udělat custom blip. Co je potřeba ? - OpenIV (https://openiv.com/) - Texture Toolkit (https://www.gta5-mods.com/tools/texture-toolkit) - Kterýkoliv program který podporuje úpravu .dds souboru. Například Paint (https://www.getpaint.net/) Otevřete si OpenIV. V pravém horním rohu je vyhledávací okénko. Do něj zadejte minimap.ytd. Potom co toto zadáte tak dejte "Search "minimap.ytd" in all archives". Potom vám vyskočí okénko s 3 soubory. Na druhý soubor("minimap.ytd") dvakrát klikneme a následně se objeví kde je soubor uložen. A přetáhneme minimap.ytd na plochu či složky . Potom otevřeme Texture Toolkit. V záložce "File" klikneme na "Load" a vybereme "minimap.ytd". Následně si označíme blips_texturesheet_ng.dds nebo blips_texturesheet_ng_2.dds (Záleží jaký blip chcete upravit) . Následně v záložce "Edit" dáme "Export". Soubor .dds se vám stáhne do složky kde máte Texture Toolkit. Potom tento soubor otevřeme v Paintu (nebo nějaký jiný program k tomu určený). Následně můžete upravovat blipy. Každý blip má velikost 64x64. Potom co jsme dokončily úpravy tak si soubor uložíme. Následně otevřeme Texture Toolkit a v záložce "Edit" dáme "Import". Vybereme soubor .dds který jsme si upravily. Potom když klikneme na soubor , který jsme si upravovali, v Texture Toolkit. Tak by tam měla být textura kterou jsme upravily. Následně v záložce "File" klikneme na "Save". Potom už stačí vytvořit složku (např.: blip) a do ní vytvoříme soubor "__resource.lua". Tento soubor může být prázdný. Potom ještě do naší složky vytvořit další složku s názvem "stream" a to téhle složky vložíme minimap.ytd. Pak už jenom stačí dát naší složku(blip) do serveru a dát 'start blip' do server.cfg . Obrázek jak to může vypadat: https://imgur.com/PKagm2d
  4. 0 points
    🥲 proč řekni mě proč? Jak můžeš používat esx crackhead loading screen 🥲
  5. 0 points
    Zdravíčko! Vítám Vás u jednoduchého a začátečnického počteníčka, jak začít se lua skriptováním v prostředí FiveM. Budu se snažit vysvětlit většinu věcí, co nejvíce do detailu, aby to pochopil doopravdy i jednotlivci. Předtím, než se vrhneme do FiveM by bylo fajn se seznámit s lua jazykem. Lua jako každý jiný jazyk (programovací / skriptovací) má vlastnosti, které můžete i nemusíte znát. Ovšem jsou sdílené napříč skoro všemi jazyky a tím, že budete dělat skripty se můžete začít zajímat i o reálné programování a svět okolo kódování. Pojďme si říct o těch vlastnostech. Proměnné / funkce / tipy Nejvíce základní věci všech jazyků jsou právě proměnné. Proměnné mají mnoho typů a také mají svojí takzvanou "dálku vidění" (scope) v daném kódu. V samotném lua jazyce existuje mnoha funkcí / metod, které jsou velmi užitečné a nemuseli jste je do teď znát. Jdeme si uvést příklady, se kterými se v lua skriptování můžeme potkat. -- Typy proměnných v lue -- Proměnnou si představte něco jako "úložiště" pro data. variable = nil -- Proměnná variable nemá hodnotu. variable = "string" -- Proměnná variable je string. A tento string obsahuje text "string". variable = 0 -- Proměnná variable je integer (v lue se používá number). Hodnotou je 0. -- POZOR!! -- V případě, že nastane případ, kdy proměnná variable vypadá takto: variable = "0" -- Tak se typově už NEJEDNÁ o number, ale o string. Nutno si toto rozlišit. Jak si to převést? variable = "0" alterVariable = tonumber(variable) -- Tato lua funkce nám zajistí, že ve stringu najde tu danou 0 a převede jí na 0. (proměnná se uvede jako number). -- tonumber() funkce se také dá použít jako check zda string obsahuje číslo, pokud ne vrátí Vám hodnotu nil (která se také beré jako false při podmínce) if tonumber("dfdf") then -- string "dfdf" obsahuje číslo (neobsahuje) else -- string "dfdf" neobsahuje číslo (neobsahuje) end -- Tato funkce je dosti používaná při pracování s daty, které jsou ve právě stringu. -- variable = {} -- table / pole, které může mít své vlastnosti. variable = true; variable = false -- boolean / pravda, nepravda. Na tomdle asi není, co víc vysvětlovat. -- Na závěr dodám, že existuje ještě jedna fajn lua funkce a tou je: type(variable) -- Zjistí Vám to typ dané proměnné. (string, number, table, boolean) -- -- Cykly -- Hlavní cykly -> for a while. Uvedeme si příklady použití obou. local locations = {"Praha", "Brno"} -- for ... do for i=1, #locations do -- Lua indexuje od 1. Tímpádem si vytvoříme proměnnou i, která bude mít počáteční hodnotu 1 a cyklus se provede tolikrát, dokud i nebude mít hodnotu #locations. (#locations je v našem případě délka tohoto pole. V tomto případě 2.) print(locations[i]) -- ukaž mi hodnotu v locations na indexu i. end -- while ... do local showingOnScreen = true -- ukazuje se něco na obrazovce? Ano. while showingOnScreen do -- jeden z mnoha příkladů -- VE FIVEM SE MUSÍ VE WHILE CYKLU ČEKAT! Citizen.Wait(počet milisekund) -- operace, která se bude provádět neustále dokud proměnná showingOnScreen nebude nepravda / false. end -- -- Scopes / viditelnost v kódu -- Mezi proměnnými v lua skriptování existují 2 scopy. local / global local variable = nil -- < Toto je lokální proměnná. variable = nil -- < Proměnná bez určení scopu je vždy globální. -- Kdy se s tímdle reálně setkáme ? -- Vytvoříme si nějakou funkci. useDefaultName = true -- Vytvoříme si proměnnou defaultName, která bude globální playerName = getPlayerName() -- Vytvoříme si proměnnou playerName, která bude globální. Tato proměnná zavolá metodu getPlayerName. function getPlayerName() -- Metoda / funkce. V rámci jednoduchosti tomu budeme říkat prostě funkce. local name -- Určíme si lokální proměnnou name. Aktuálně nemá hodnotu (nil). Jde používat pouze v rámci té funkce, kdekoliv jinde Vám bude později vracet nil. Tato proměnná pokaždé při zavolání této funkce nebude mít hodnotu. Nějakou hodnotu jí přidělíme. if useDefaultName then -- Uděláme si podmínku, která by se dala přeložit takto (pokud proměnná useDefaultName je pravda tak proveď) name = "Pavel" -- výše uvedená lokální proměnná name bude mít hodnotu Pavel (string), protože se zde její hodnota upravila za pomocí proměnné, která je "globální". else -- Pokud je podmínka nepravda (false) tak proveď operaci: name = "Franta" -- výše uvedená lokální proměnná name bude mít hodnotu Franta (string). end return name -- Metoda vrátí výše uvedenou proměnnou name. V našem případě vrátí Pavla. end -- Nyní se přesuneme na skriptování ve FiveM, protože tyto znalosti nám aktuálně stačí k tomu si vytvořit jednoduchý skript pro nakupování itemů (postavené na ESX). !! Upozorňuju, že Vás zde nebudu učit, jak vytvořit server / zapnout ho nebo jak dát resource do server.cfg. To snad víte všichni už. !! Vytvoříme si složku se skriptem. Např. strin_example pro moje účely. Do této složky si vytvoříme základní soubory (lua soubory) Můžeme si to uspořádat takhle: Ovšem já mám radši větší pořádek, a tak si to rozdělím pro lepší přehlednost. Do client a server složky si udělám: Tento soubor nám bude v obou případech sloužit jako hlavní skript mezi všemi v těch složkách. Nyní se vrátíme zpět a koukneme se do fxmanifestu. Ten by měl vypadat přibližně takto: fx_version 'cerulean' -- FX verze. resource_manifest_version je "deprecated" (zastaralé), nový výraz je fx_version game 'gta5' -- Hra, na kterou je resource / skript tvořen. (gta5 / rdr3 nebo i oboje -> games {gta5, rdr3}) client_scripts { -- Skripty, které se načtou clientovi. 'client/*.lua', -- Osobně využívám "globbing". Tedy nepíšu furt nové řádky 'client/jméno_skriptu.lua', ale napíšu 'client/*.lua' a to mi načte veškeré soubory ve složce client s příponou .lua 'config.lua' -- Soubor, který bude obsahovat konstanty / Config, bude sdílený pro clienta i server a nebude se měnit. } server_scripts { -- Skripty, které se načtou serveru. 'server/*.lua', -- opět "globbing". 'config.lua' -- opět sdílený soubot. } Nyní, když půjdeme na náš server a do F8 napíšeme refresh by nám mělo FiveM napsat, že soubor byl úspěšně načten. Takže resource máme ready a můžeme se do toho vrhnout. Jako první destinaci si dáme config.lua. Zde si napíšeme data, které chceme, aby používal client i server. Jelikož budeme dělat jako příklad shopy, tak si dáme tento kód. -- Zde si budu psát proměnné caps lockem. Vytvoříme si takové "fake" konstanty (nepřepisovatelné proměnné). -- Jelikož je lua case-sensitive tak nám toto nejvíce zaručí, že si to nepřepíšeme. ONESYNC = true -- Pokud jsme uživatelé onesyncu tak tato proměnná bude pravda. (Onesync je dobrá věc zejména díky server-side zabezpečení -> uvidíte později) ESX_VERSION = 1.1 -- Určení jaké ESX máme 1.1 a níže nebo 1.2 / v1-final. AMOUNT_TO_BUY = 1 -- Kolik si hráč koupí při jedné návštěvě? SHOP_LOCATIONS = { -- proměnná SHOP_LOCATIONS, která je pole a obsahuje vectory. vector3(20.33268737793,-1106.1296386719,29.797008514404), -- vector3 je víceméně table, které má 3 numerické hodnoty x, y, z a používá se ke koordinacím. vector3(25.747142791748,-1344.9035644531,29.497022628784), } SHOP_ITEMS = { -- table / pole SHOP_ITEMS pro itemy {name = 'bread', label = 'Chleba', price = 40}, -- další pole pro jednotlivý item {name = 'beer', label = 'Pivo', price = 60} } Základní data v configu máme a teď s nimi jdeme na client pracovat! :) Otevřeme si client/main.lua, v prohlížeči https://docs.fivem.net/natives/ a začneme. ESX = nil -- globální proměnná ESX Citizen.CreateThread(function() -- "vlákno", které nám načte ESX while ESX == nil do TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) Citizen.Wait(0) end end) Citizen.CreateThread(function() -- naše hlavní "vlákno" AddTextEntry('OPEN_SHOPS:FIVEMDEV', '~INPUT_CONTEXT~ Otevrit obchod') -- Na začátku vlákna si vytvoříme text entry pro otevření obchodu. while true do -- cyklus while, který poběží vždy dokud pravda bude pravda. (To se chápeme, že vždy) Citizen.Wait(0) -- FiveM čekání lehce řečeno. (Pokud cyklus while nemá čekání tak se Vám FiveM freeze). V našem případě budeme chtít prozatím každý frame. local ped = PlayerPedId() -- Proměnná ped, která nám získa ID peda clienta. local coords = GetEntityCoords(ped) -- Proměnná coords, která získa koordinace entity. (pro nás to bude náš ped) local distanceToShop = 10000.0 -- Proměnná, která nám bude držet nejbližší distanci k jakémukoliv shopu for i=1, #SHOP_LOCATIONS do -- cyklus for local distance = #(coords - SHOP_LOCATIONS[i]) -- length operátor -> #(Naše koordinace - koordinace obchodu) if distance < distanceToShop then distanceToShop = distance end if distance < 50.0 then -- Pokud je vzdálenost menší, než 50 tak proveď DrawMarker( 21, -- typ markeru SHOP_LOCATIONS[i], -- naše koordinace na indexu i z cyklu for 0, -- směr X 0, -- směr Y 0, -- směr Z 0, -- rotace markeru X 0, -- rotace markeru Y 0, -- rotace markeru Z 0.5, -- šírka X 0.5, -- šírka Y 0.5, -- šírka Z 30, -- červená 50, -- modrá 100, -- zelená 140, -- alpha / opacity. 0 až 255 false, -- chceme, aby marker skákal? false, -- chceme, aby se marker otáčel ve směru hráčova vidění? nil, -- nemá vliv true -- chceme, aby se marker točil? ) -- vykresli marker. end if distance < 3.0 then -- Pokud je vzdálenost menší, než 3 tak proveď DisplayHelpTextThisFrame('OPEN_SHOPS:FIVEMDEV') -- Ukaž help text každý frame. if IsControlJustReleased(0, 38) then -- Pokud je zrovna spuštěna klávesa E, tak proveď openShopMenu() -- Zavolej funkci na otevření menu obchodu. end end end if distanceToShop > 60 then -- pokud je distance větší, než 60 tak nám čekej v tomto cyklu sekundu. (Značná optimalizace) Citizen.Wait(1000) end end end) function openShopMenu() -- funkce na otevření menu obchodu local elements = {} -- lokální proměnná elements, která nám bude sloužit jako pole pro elementy itemů -- Tato část je dost o pochopení ESX menu. Doporučuju se kouknout přímo na dokumentaci ESX. for i=1, #SHOP_ITEMS do -- cyklus for, používáme na itemy local item = SHOP_ITEMS[i] -- SHOP_ITEMS na indexu i (určité pole z SHOP_ITEMS) local itemLabel = string.format('%s - $%s / %sks', item.label, item.price * AMOUNT_TO_BUY, AMOUNT_TO_BUY) --[[ využijeme lua funkce string.format a uděláme si pěkný label pro náš item. string.format nahrazuje %s ve stringu námi udanými hodnotami. ]] table.insert(elements, {label = itemLabel, value = i}) --[[ vkládáme do pole elements pole, která má hodnoty label & value label bude mít hodnotu itemLabel a value bude mít hodnotu i (indexu itemu v poli) ]] end ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'shop_menu', { title = 'Obchod', -- Nadpis menu align = 'center', -- Kde se menu bude nacházet elements = elements, -- elementy menu }, function(data, menu) -- on select callback menu.close() -- Zavři menu po zakoupení itemu. TriggerServerEvent('strin_example:buyItem', data.current.value) -- Zavoláme server event na koupení itemu s udáním indexu na daný item. end, function(data, menu) -- on cancel callback menu.close() -- Zavři menu, když ho hráč chce zavřít. end) end Teď, když máme napsaný client se podíváme do server/main.lua. o_o ESX = nil TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) --[[ opět si načteme esx, ovšem tentokrát na serveru. ]] RegisterNetEvent('strin_example:buyItem') -- Registrace network eventu. (server eventu) AddEventHandler('strin_example:buyItem', function(itemIndex) -- na tento event mi přidej handler s funkcí: local _source = source --[[ uložíme si ID sourcu. (source je vždy server ID clienta, který zavolal tento event) ukládáme si ho, abychom ho neztratili. ]] local xPlayer = ESX.GetPlayerFromId(_source) -- přes ESX si zjistíme hráče skrze ID if isPlayerNearShop(_source) then -- V této podmínce si zavoláme funkci zda je hráč blízko shopu a předáme jí ID hráče. local item = SHOP_ITEMS[itemIndex] -- uvedeme si jaký item si hráč zakoupil. V tomto případě item na indexu itemIndex local price = item.price * AMOUNT_TO_BUY -- cena na kus if canPlayerCarryItem(_source, item.name, AMOUNT_TO_BUY) then -- naše funkce, která nám zkontroluje zda hráč může dostat tolik itemu. if doesPlayerHaveEnoughMoney(_source, price) then -- naše funkce nám zkontroluje zda hráč má dostatek peněz. xPlayer.removeMoney(price) -- odečti cenu z hráčových kapes. xPlayer.addInventoryItem(item.name, AMOUNT_TO_BUY) -- xPlayer funkce na přidaní itemu TriggerClientEvent('esx:showNotification', _source, string.format('Koupil jste %s - %sx za $%s', item.label, AMOUNT_TO_BUY, price)) -- esx notify event end else TriggerClientEvent('esx:showNotification', _source, 'Máš plné bágly brácho') --[[ Jelikož nevím zda používám ESX 1.1 nebo výše, tak si to ujistím eventem, který mají obě verze. O tomto eventu si více můžete zjistit v ESX dokumentaci. ]] end else print('??') end end) function isPlayerNearShop(id) if ONESYNC then -- Uděláme si podmínku na to zda je ONESYNC proměnná v configu uvedená jako pravda. Pokud ano proveď: local ped = GetPlayerPed(id) -- zde používám GetPlayerPed(id) za účelem toho, že musím získat peda daného hráče a na serveru PlayerPedId()... To snad dojde všem, že ne. :D local coords = GetEntityCoords(ped) -- opět získáme koordinace local distanceToShop = 100 for i=1, #SHOP_LOCATIONS do -- opět for cyklus jako na clientovi local distance = #(coords - SHOP_LOCATIONS[i]) -- opět vypočteme vzdálenost if distance < distanceToShop then distanceToShop = distance end if distanceToShop > 10 then -- pokud vzdálenost od jakéhokoli shopu je větší, než 10 (budeme více tolerantní) tak proveď return false -- není blízko obchodu, vracím false end end end return true -- Na konec funkce si zapíšeme, že hráč je blízko shopu a vrátíme true. (v průběhu této funkce nám to může vrátit nějaký return dřív.) end function canPlayerCarryItem(id, item, count) local xPlayer = ESX.GetPlayerFromId(id) -- získáme si opět pomocí ESX hráče skrz ID if ESX_VERSION >= 1.2 then -- pokud je ESX verze nad 1.2 tak proveď: if xPlayer.canCarryItem(item, count) then -- xPlayer funkce to už řeší za nás. return true -- vrať true, hráč může nosit item end else local xPlayerItem = xPlayer.getInventoryItem(item) -- tato xPlayer funkce nám zjistí informace o itemu a stavu o itemu u hráče. if (xPlayerItem.count + count) <= xPlayerItem.limit then -- pokud je nový počet itemu u hráče menší, než limit nebo se rovná limitu tak proveď: return true -- vrať true, hráč můž nosit item end end return false -- vrať false, hráč má plný bágl PepegaClap end function doesPlayerHaveEnoughMoney(id, price) local xPlayer = ESX.GetPlayerFromId(id) -- získáme si opět pomocí ESX hráče skrz ID if (xPlayer.getMoney() - price) < 0 then -- odečti od aktuálních peněz, co má u sebe hráč cenu itemů. Pokud je to menší, než 0 tak nemá prachy. return false -- vrať false, hráč nemá na rohlík end return true -- vrať true, hráč může roztáčet prašule end No a pomocí těchto kroků se dokážete naučit psát jednoduché skripty. Není to hitparáda nějaká, ale tydle malé zkušenosti Vás můžou dovést k velkým věcem. Vždy je to o tom se učit a nechat si radit od zkušenějších. Snad Vám tento "tutoriál" nějak pomohl k sebe rozvoji a ještě si na závěr dodáme in-game ukázku. V blízkosti - 0.02 / 0.03 Idle - 0.01 Ozkoušet si to můžete sami, děkuju za pozornost. :) Pokud jsem na něco zapomněl nebo napsal blbost, tak se omlouvám. Píšu to už 3 hodiny a je 3:30. Dobrou noc. :D

Our partners

rcore.cz
K4mb1
SLTH
×
×
  • Create New...