Jump to content
Fivem-DEV.cz

Leaderboard


Popular Content

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

  1. 5 points
    Velice mne potěšil zcela nový a neohraný koncept serveru. Musím uznat, že již z prezentace tento server skrývá určitý potenciál. (vysvětlím v závěru) Nicméně, soudím, že na tomto serveru najdu to, co na žádném jiném na cz/sk scéně! Naprosto mne pohltila možnost hrát za policii, zdravotníky a dokonce i za společnost s názvem Vanilla Unicorn. Jsem osobně překvapen, že takové frakce tam jsou. Jelikož není standartní na ostatních serverech takové frakce vidět. Mohu hrát dokonce za drogového dealera? Proboha, těch drog tam je tolik, že to ani nešlo vyjmenovat na co vše tam máte bezpodmínečně své custom scripty. To zajísté nebude jen marihuana a kokain jako je to na každém druhém Bčkovém serveru. S naprostou touhou očekávám “plno dalších věcí“. Určitě se trefím se svým odhadem, že tam bude i legendární a velmi vzácná frakce s názvem Premium Deluxe Motorsport, která je taktéž velmi ceněná! Velmi namotivován a s touhou přečíst si více jsem neodolal a klikl jsem na webové stránky tohoto serveru! Prošel jsem přes sáhodlouhou sekci na titulní straně rovnou do sekce A-team kde jsem se dozvěděl, že máte dokonce dva druhy developerů! Nemůžu se dočkat až in-game vyzkouším schopnosti car-developera který každé addon auto sám zajisté zkontroloval, poupravil handling tak, aby to nejezdilo 600km/h a auto bylo plně ovladatelné! Dále, protože jako správný hráč chci znát pravidla jsem se podíval do stejnojmenné sekce. Našel jsem zde velmi mnoho užitečných a nádherně definovaných pravidel. Cituji: „Revenge Kill = Nesmíte pomstít svojí postavu když máte PK neboť si to ne pamatujete pokud jste PK nedostali tak se musíte nejdřív zotavit.“ A zde bych rád poukázal na začátek mojí skromné recenze. Musím uznat, že již z prezentace tento server skrývá určitý potenciál. Ano, pokud jste učitel českého jazyka, zde máte rozhodně velký potenciál tento skvělý tým jistě budoucího skvělého serveru něco naučit. Něco, co si do života odnesou nejen profesionální developeři, ale i budoucí češtináři!
  2. 5 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
  3. 1 point
    Zdravím, koukal sem že tu někdo na fóru hledal WeaponShop s zásobníkama tak zde nějaký přikládám Možnost Zakoupit zásobník za nějakou tu částku Viz config Config.Price = 500 Doplní 50 nábojů viz řádek 86 Jakékoliv chyby hlásit prosím do topicu tento script je už trošku starší
  4. 1 point
    Zdravím, script jsem stáhl ale pokud chci dokoupit náboje, peníze mi to sebere ale žádný nápoje nepřičte.
  5. 1 point
    Zdravím, jdu ohledně PedMenu, mám v plánu koupit RPMenu od Scoobika, protože chceme odstranit vMenu, a stále chceme pro server nechat PedMenu, kdyby jsme tam nechali vMenu, bude to moc žrát, tudiž se chci zeptat, zda někdo nezná nějaké PedMenu.. Budu rád za všechny odpovědi. Nejlépe free, ale pokud nebude free, nevadí. Díky moc, gajdoš..
  6. 1 point
    Jednoduchý BASH script, kterým můžeme použít v linuxovém prostředí, pomocí kterého automaticky můžeme zálohovat svůj FIVEM server, ale i také např. i databázi svého webu. Nejprve si uložíme přiložený soubor do zvoleného umístění ve svém linuxovém prostředí. DB_BACKUP Např do /root uloženému souboru je potřeba nastavit oprávnění "spouštění" to provedeme příkazem chmod chmod +x /root/db_backup.sh Cestu k souboru změníme dle vašeho umístění souboru. Následně si upravíme proměnné v bash souboru. Zvolte si svůj preferovaný editor, Např.: nano, vi, vim, mcedit, atd. a přistoupíme k editaci souboru. vi /root/db_backup.sh V souboru editujeme POUZE řádky 10, 14, 16, 20, 22 Na řádku č.: 10 zvolíme číselnou hodnotu v počtu dní dle své možnosti jak dlouho chceme uchovávat backup soubory. Defaultní hodnota je nastavena na 60dní řádek č.:14 určuje název zálohovaného souboru. řádek č.:16 určuje název databáze řádek č.:18 určuje ip/url daného DB serveru řádek č.:20 určuje jméno uživatele, který má přístup do databáze. Doporučuji vždy vytvářet pro fivem i podobné scripty uživatele kde jsou omezeny oprávnění, tak aby Vám script, nebo i fivem nemohlo mazat celé tabulky/databáze na serveru řádek č.:22 určuje heslo pro daného uživatele Pro vyzkoušení provedeme ruční spuštění scriptu ./root/db_backup.sh Po spuštění správný výsledek je takto: root@vps-7e50ff9f:/# ./root/db_backup.sh BACKUP STARTED FILES DELETED!! root@vps-7e50ff9f:/# Nyní se můžeme podívat do složky kde jsou připravovány zálohy na první vytvořený soubor ls -la /mnt/backups/mysqlbackup/2021-04-22/ Cesta se musí upravit dle datumu spuštění scriptu. Zálohy jsou ukládány separátně dle dnů a soubory jsou pak časovány Výsledek je např.: takto: root@vps-f9f:~# ls -la /mnt/backups/mysqlbackup/2021-04-22/ total 37648 drwxr-xr-x 2 root root 4096 Apr 22 12:21 . drwxr-xr-x 3 root root 4096 Apr 22 10:12 .. -rw-r--r-- 1 root root 967695686 Apr 22 10:12 severussnape-10-12.sql -rw-r--r-- 1 root root 967698611 Apr 22 10:17 severussnape-10-17.sql -rw-r--r-- 1 root root 967700201 Apr 22 10:30 severussnape-10-30.sql -rw-r--r-- 1 root root 967711570 Apr 22 11:30 severussnape-11-30.sql -rw-r--r-- 1 root root 967732090 Apr 22 12:21 severussnape-12-21.sql Nyní nastavíme automatizaci. Script zadáme do CRONu. editaci CRONtab tabulky provedeme příkazem crontab -e Chceme-li zálohovat každých 10min tak přidáme na konec souboru tento řádek */10 * * * * /root/db_backup.sh Uložení pak provedeme mimo "insert" mód zadáním :wq Po uložení dostaneme oznámení crontab: installing new crontab Toto je kompletní nastavení zálohování.
  7. 1 point
    To bude v tom skriptu jak budu doma mrknu na ten Trew hud
  8. 1 point
    Zdravím, Jmenuji se Petr "eFko" Stibor .. Již 12 let vystupuji pod přezdívkou "eFko". Pokud je zabraná tak je to eFkoCZ//FoxterCZ.. Posledních několik měsíců se na mě hrne vlna agrese a to hlavně o tom,že jsem "Scammer""Okrádač"a tomu podobné.. K vyjádření : Osobně jsem nikdy nikoho neokradl spíš jsem druhým dával.Mrzí mě,že jsem teď u každého znám jako scammer..Ať je to Fivem-Development nebo Rocket League, kde to šíří především Pan Hunt .. K vaší situaci: Pokud si najmete někoho na práci přes internet a chcete po něm,aby jí provedl ,chtějte po tom dotyčném jeho předchozí práci a vždy mít něco v ruce. HLAVNĚ! vždy pokud tomu člověku něco zaplatíte...chtějte znát více informací! A né jen kontakt na discordu nebo jiné síťi... Mrzí mě co se vám stalo a dalším.. Nezmůžu s tím nic jen jsem reagoval na ty ,kteří si toto přečetli a okamžitě začli házet kamení po mé osobě.. K obraně : Internet je volný pro všechny.. Každý může mít jakýkoliv nickname.. To však neznamená ,že pokud si někdo založí účet pod nickem např: "RotHot" a okrade s tímto nickem několik lidí,že všichni uživatelé tohoto nicku budou ihned zloději že?...Tak vás snažně prosím ověřujte si informace dřív než začnete někoho pomlouvat a srážet jeho osobu.. Vám by se to také nelíbilo ale situace je to neřešitelná.. Kontakt na discord mám eFko#4613
  9. 1 point
    https://forum.cfx.re/t/how-to-streaming-addon-clothes-and-ped-props-for-mp-freemode-models/458854
  10. 1 point
    První dotaz: V klientovi si udělej nějakou stavovou proměnnou a po libovolném čase ji zmeň local isWaiting = true Citizen.CreateThread( function() Citizen.Wait(60000) -- Cekame jednu minutu isWaiting = false end ) A potom jen kontroluješ, jestli je isWaiting už false. Pokud je true, všechny akce hned na začátku ukončíš. Druhý dotaz: Toto jsem potřeboval řešit a poslal jsem tak PR do txadmina na zachycení eventu před restartem. Takže to můžeš udělat jednoduše zachycením na serveru: AddEventHandler('txAdmin:events:scheduledRestart', function(eventData) if eventData.secondsRemaining == 60 then TriggerClientEvent("restartInOneMinute", -1) end end) Na klientovi si pak ten event zachytíš a opět si uděláš stavovou proměnnou jako v první otázce. Tady pozor na to, že u nově připojených to pak musíš taky nastavovat.
  11. 1 point
    Download link: https://github.com/Xogy/rcore_arcade
  12. 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
  13. 1 point
    Optimalizace scriptů Zdravím všechny developery, rádoby developery, adminy, majitele serverů, samouky a další. Jak asi víte, halo efekt serveru je poměrně důlěžitý -> Hráč se připojí, bude mít 10 FPS kvůli nějaké neřesti serveru, po 2 měsících problém opravíte, tak pravděpodobně hráč zpátky už nezavítá. No a ostatně, pokud je hráč ve FiveM nový, tak FiveM už třeba ani hrát nebude, přejde na jinou podobnou platformu. Takže pokud víte, že vaše scripty nejsou optimalizované a to hodně špatně optimalizované, tak je na čase těm hráčům říct, že problém je na vaší straně a nebo ho opravit. Níže si ukážeme, jak na to. Nutno podotknout, že toto není jediný způsob, způsobů je více. Níže si ukážeme ten nejjednoduší: 1. Jo, ještě abych nezapomněl, je potřeba si ukázat, jak zjistit, na čem vlastně jsme. Je to jednoduché, otevřeme si F8 a do ní napíšeme: "resmon 1", co nám otevře takové okno a vy uvidíte, které scripty vám nejvíce zatěžují CPU a jaké je celkové vytížení CPU. No a takové CPU ms je druhý sloupeček zleva. Když nahoru na něj kliknete, tak se vám seřadí scripty podle toho, který je nejzatěžující a nejníž bude nejspíše nějaká mapa. Číslo bude nejspíše (mělo by) být zelené. Uveďme si tu nějaké hodnoty, pro představu: 10ms a > - Zamyslete se, zda nebude lepší server vypnout a optimalizovat jej a pak až na něj pustit hráče 5 - 10ms - No, ještě máte před sebou velký kus práce 3.01 - 5ms - Průměrný server, ale ještě se to dá vylepšit 0 - 3ms - Dobrá práce ! Nějaké obejktivnější - Dle pana "teb" z LSPR.cz by normálně hotový server (kdy máte všechny featury, které chcete mít a in general máte vše hotové, neplánujete nic přidávat a když jsou scripty ve stand-by mode - pokud budete zrovna v nějakém "heistu", tak dává smysl, že script musí běžet náročněji) (Nějakých 250 scriptů, aut, map dohromady asi) je strop 3ms -> Máte víc? Tak šup do toho. Základní body: Dávejte co nejméně věcí do "while true do" s Wait (Citizen.Wait) - je to stejné; které je o hodnotě 0 - Hodně málo věcí potřebuje být aktualizováno káždý frame Věci jako hashe atd. nezískávejte kažý frame, stačí jednou za celé načtení hry Nechte script "spát"/čekat, když hráč je daleko od místa, kde se má něco dít No a níže si dáme nějaké ty příklady Níže je příklad, jak vykreslovat 3DText (funkci na vykreslování musíme mít někde bokem) a po stisknutí klávesy [E] vyvolat funkci. Vlevo je příklad, kdy script bude každý frame kontrolovat vzdálenost, dokonce pomocí FiveM native, vpravo je rychlejší, který to bude kontrolovat pomocí "lua math", vpravo, který poběží "mnohem lépe", který nebude kontrolovat každý frame, pokud jsme dále, ale bude "spát" Dalším takovým příkladem je ukázáno, že se nemusí vždy všechno dělat ve "while true do" loopě, stačí 1/resource load, dát tam pár Waits a tím ušetřit nějaký ten zlomek ms v total CPU ussage. Stačí si napsat a definovat hashe mimo loopu a potom tam dát nějaké ty Waits. No a níže je vidět, pokud máme table s více lokacemi a jednoduše nemůžeme kontrolovat, zda je hráč poblíž - pokud ne, tak necháme loop čekat a to proto, že když hráč není poblíž neznamená, že je daleko i od další. Dá se tomu předejít, že budeme kontrolovat, zda je poblíž alespoň jedné a pokud ne, tak necháme script spát. No a zase, to nalevo ve stand-by mode běží +- 0.03ms a nalevo 0.01ms a hráč to reálně nepozná. No na závěr jen zbývá dodat, že programování není jen o kopírování, ale o vymýšlení, snění, zkoušení a realizování. Zase, jako vždy, netvrdím, že toto j správně a že byste to takto měli dělat, ale říkám, jak jsem to já udělal, jak to mně funguje a jak jsem s tím já spokojen. Také budu rád, když mě někdo opraví a poradí mi. Jo a nezapomínejte, ne všechny FPS problém a celkové výkonnostní problémy má na svědomí script a vysoké CPU ussage, ale také ruku k dílu za nízká FPS dávají addon mapy, auta a oblečení - proto jak se říká (a ani teď a tady tomu nebude jinak) - Méně je někdy více. Jakmile narazím na další informace a zkušenosti, tak nebudu váhat je sdílet.
  14. 1 point
    Jestli myslíš aby jsi třeba napsal command "/a" a ono ti to otevřelo faktury tak použij ExecuteCommand('showbills')
  15. 1 point
    Tento návod je pro starší verzi ESX, protože s novější už jsem nepracoval, ale měla by se dát v pohodě přenést i na novější verze. Úprava byla dělána pro esx verzi, která používá v inventáři limit místo váhy. Počet řádků tabulky es_extended roste exponencionálně s počtem hráčů a itemů - jelikož u každého hráče vytvoří záznam s předmětem a to i v případě, že jej hráč u sebe nemá (tedy count = 0). Postup: 1. Úprava načítání inventáře V souboru: es_extended/server/main.lua Uvnitř tohoto eventu: AddEventHandler('es:playerLoaded', function(source, _player) Nalezneme část, kde se načítá inventář. Poznáme to dle komentáře: -- Get Inventory Celou část upravíme a přepíšeme následovně: -- Get Inventory table.insert( tasks, function(cb) MySQL.Async.fetchAll( "SELECT * FROM `user_inventory` WHERE `identifier` = @identifier", { ["@identifier"] = player.getIdentifier() }, function(inventory) local tasks2 = {} for i = 1, #inventory do local item = ESX.Items[inventory[i].item] if item then table.insert( userData.inventory, { name = inventory[i].item, count = inventory[i].count, label = item.label, limit = item.limit, usable = ESX.UsableItemsCallbacks[inventory[i].item] ~= nil, rare = item.rare, canRemove = item.canRemove } ) else print(('es_extended: invalid item "%s" ignored!'):format(inventory[i].item)) end end for k, v in pairs(ESX.Items) do local found = false for j = 1, #userData.inventory do if userData.inventory[j].name == k then found = true break end end if not found then table.insert( userData.inventory, { name = k, count = 0, label = ESX.Items[k].label, limit = ESX.Items[k].limit, usable = ESX.UsableItemsCallbacks[k] ~= nil, rare = ESX.Items[k].rare, canRemove = ESX.Items[k].canRemove } ) end end Async.parallelLimit( tasks2, 5, function(results) end ) table.sort( userData.inventory, function(a, b) return a.label < b.label end ) cb() end ) end ) Tím jsme zajistili, že se nám v DB nebudou vytvářet záznamy s count = 0. 2. Ukládání inventáře V souboru: es_extended/server/functions.lua Uvnitř této funkce: ESX.SavePlayer = function(xPlayer, cb) Nalezneme část, kde se ukládá inventář postavy. Poznáme to dle komentáře: -- Inventory items Celou část upravíme a přepíšeme následovně: -- Inventory items for i = 1, #xPlayer.inventory, 1 do if ESX.LastPlayerData[xPlayer.source].items[xPlayer.inventory[i].name] ~= xPlayer.inventory[i].count then table.insert( asyncTasks, function(cb) MySQL.Async.execute( "UPDATE user_inventory SET `count` = @count WHERE identifier = @identifier and item = @item", { ["@count"] = xPlayer.inventory[i].count, ["@identifier"] = xPlayer.identifier, ["@item"] = xPlayer.inventory[i].name }, function(rowsChanged) if rowsChanged == 0 then MySQL.Async.execute( "INSERT INTO `user_inventory` (count, identifier, item) VALUES (@count, @identifier, @item)", { ["@count"] = xPlayer.inventory[i].count, ["@identifier"] = xPlayer.identifier, ["@item"] = xPlayer.inventory[i].name }, function(rowsChanged) if cb ~= nil then cb() end end ) else cb() end end ) end ) ESX.LastPlayerData[xPlayer.source].items[xPlayer.inventory[i].name] = xPlayer.inventory[i].count end end Tím zařídíme, že pokud hráč u sebe předmět již měl, jenom se upraví počet. Pokud neměl, vytvoří se nový záznam. 3. Mazání záznamů s count = 0 Poslední krok. Mazání záznamů s count = 0 můžete dělat kdekoliv a jakkoliv. Ideálně při startu es_extended v souboru: es_extended/server/common.lua Stačí do události AddEventHandler('onMySQLReady', function () přidat následující dotaz: MySQL.Async.execute("DELETE FROM user_inventory WHERE `count` = 0", {}) A tadááá, to je celé kouzlo. Velikost databáze se vám tak klidně může zmenšit z 500 000 záznamů třeba na 5 000, čímž dotazy do této tabulky značně urychlíte.
  16. 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.
  17. 1 point
    weed.webm V tomto tutoriálu bych vám chtěl ukázat, jak na LSRP.cz navrhuji scripty tak, aby snadno fungovaly ve více hráčích, stav byl konzistentní napříč hráči a zároveň tento způsob programování naprosto znemožňuje, aby hacker mohl jakkoli benefitovat. Projdeme si, jak bych řešil script pro pěstování marihuany, připadně čehokoli jiného na podobný způsob. Výsledek neposkytuje nijak zábavný gameplay a smysl tohoto scriptu je pouze, aby jste se naučili, jak problémy podobného typu řešit správně, nikoli aby jste to použili na svém serveru. Je pak na vás, jak to dochutíte a uděláte to zábavné pro hráče. Nebudu vše vysvětlovat detailně, tuprtoriál je určen pro ogramátory, ne "fivem developery." Pokud ale něco nebude jasné, klidně se ptejte. Na LSRP.cz tak budeme řešit právě pěstování trávy, řešíme tak synchronizaci krabic, které hráči nosí jako součást jobu a některé mechaniky používáme pro jízdu na a vození nosítek a wheelchairu, nošení hráčů a NPC přes rameno, atd.. Hlavní koncept je, že server si udržuje stav, spravuje změnu stavu a distribuuje stav hráčům. To znamená, že když hráč chce zasadit květinu, pošle na server pouze event "chci zasadit květinu." Server pak zjistí, jestli může zasadit květinu (má v inventáři semínka? - neřeším v tutoriálu), kde se hráč nachází, vypočítá pozici kytky, nastaví počáteční stav kytky a pošle všem hráčům nový stav. Mohl by také kontrolovat, jestli na dané pozici či blízko už není jiná kytka (mimo scope tutoriálu) Dále server hlídá, kdy kytka vyroste a jde sebrat, řeší když hráč chce sebrat kytku (je kytka vyrostlá? je hráč dostatečně blízko?) a o těchto změnách stavu pak informuje hráče. Hacker při použítí tohoto stylu programování nemá žádnou výhodu. Nemůže zasadit kytku když nemá semínka, nemůže sebrat kytku když není vyrostlá a nemůže ukrást cizí kytky, aniž by u nich stál. Samozřejmě hacker může pomocí noclipu/fly hacku zasadit kytku mimo mapu, ve vzduchu, pod zemí atd., ale to už není problém tohoto scriptu, to by měl anticheat system. Na straně klienta pak pouze sledujeme stav, pokud je hráč blížko kytce tak vytvoříme OFFLINE objekt (je dobré omezit počet networked objektů), pokud se hráč vzdáli tak objekt smažeme, pokud se změní stage tak objekt smažeme a vytvoříme nový. Pokud je hráč blízko kytce co má stage který umožňuje kytku sklidit, zobrazíme hint a reagujeme na tlačítko. To je zhruba vše, co je potřeba. Detailněji to můžete vidět v následujícím anotovaném kódu. OneSync Server kód -- Zde si budeme udržovat kompletní přehled o trávě WeedState = {} -- vždy zvyšující se číslo, aby každá kytka měla unikátní ID WeedIndex = 1 -- jak dlouho trvá než kytka vyroste -- dvojnásobek pak trvá než kytka uhyne a zmizí TIME_TO_GROW = 10 * 1000 -- užitečný console příkaz pro vypsání stavu scriptu -- hodí se při debugování, když se ptáte "je chyba v syncu?" "za jak dlouho vyroste?" "kolik je kytek?" RegisterCommand('showweed', function(source) if source == 0 then tprint(WeedState) end end) -- příkaz pro zasazení trávy -- úmyslně zjednodušený, nic se nekontroluje, všichni můžou sázet všude -- ideálně by se melo zkontrolvoat jestli hráč má semínku a to pak sebrat z inventáře RegisterCommand('weed', function(source) local Source = source local ped = GetPlayerPed(Source) -- využijeme onesyncu, abychom bezpečně vypočítali, kam kytku zasadit -- díky tomu předejteme možnosti, že by si hacker mohl kytky sázet na místa, kde se nenachází local coords = GetEntityCoords(ped) local heading = GetEntityHeading(ped) -- kytku dáme před hráče. +90 proto, že EntityHeading směřuje o 90 stupnů doprava -- když přičteme 90 stupňů, bude heading směřovat před hráče local weedOffset = vector3( math.cos(math.rad(heading + 90.0)), math.sin(math.rad(heading + 90.0)), -1.0 ) AddPlant(coords + weedOffset) end, false) -- Jednoduchá funkce která přidá novou kytku do WeedState a synchronizuje stav -- nechceme nechávat tuto logiku zbytečne v command handleru -- kód se pak líp čte function AddPlant(pos) local idx = WeedIndex WeedIndex = WeedIndex + 1 WeedState[idx] = { pos = pos, stage = 0, plantedAt = GetGameTimer(), } SyncPlants(-1) end -- jen wrapper okolo eventu, nic zvláštního function SyncPlants(target) TriggerClientEvent('state_weed:sync', target, WeedState) end -- nesmíme zapomenout poslat stav komukoli, kdo se napojí na server -- když bychom to neudělali, tak hráči uvidí jen kytky, které byly zasazené během doby, co jsou online -- (nebo, s tím, jak je tento script napsaný, tak by dostali celý stav jakmile by někdo zasadil kytku) RegisterNetEvent('playerSpawned') AddEventHandler('playerSpawned', function() SyncPlants(source) end) -- tento thread slouží k tomu, že periodicky kontrolujeme, -- jestli nějaká kytka nevyrostla a pokud ano, posuneme jí stage -- případně ji smažeme, pokud zahynula Citizen.CreateThread(function() while true do Wait(1000) -- užitečný způsob, jak zjistit, jestli se tento tick něco změnilo -- pokud ano, tak synchronizovat stav -- pokud ne, tak zbytečně neposíláme data local anythingChanged = false for id, plant in pairs(WeedState) do if plant.stage == 0 and (GetGameTimer() - plant.plantedAt) > TIME_TO_GROW then plant.stage = 1 anythingChanged = true elseif plant.stage == 1 and (GetGameTimer() - plant.plantedAt) > (TIME_TO_GROW * 2) then WeedState[id] = nil anythingChanged = true end end if anythingChanged then SyncPlants(-1) end end end) -- když hráč chce sebrat kytku, pošle event na server -- jelikož nechceme, aby hackeři mohli jen tak sbírat kytky, -- ještě na serveru ověříme, jestli je tento event legit RegisterNetEvent('state_weed:pickup') AddEventHandler('state_weed:pickup', function(id) local Source = source local ped = GetPlayerPed(Source) local coords = GetEntityCoords(ped) local plant = WeedState[id] -- zkontrolujeme, že hráč sbírá kytku co existuje if plant then -- zkontrolujeme, že hráč je dostatečně blížko kytce if #(plant.pos - coords) < 3.0 then -- zkontrolujeme, že kytka je sbíratelná (stage 1) if plant.stage == 1 then WeedState[id] = nil -- tady bychom ještě hráče měli odměnit za sebrání kytky TriggerClientEvent('state_weed:info', Source, '~g~Tráva byla úspesne sklizena') SyncPlants(-1) else TriggerClientEvent('state_weed:info', Source, '~g~Tráva jeste nevyrostla') end else TriggerClientEvent('state_weed:info', Source, 'Tráva je moc daleko') end else TriggerClientEvent('state_weed:info', Source, 'Trávu se nepodarilo sklidit') end end) -- DEBUG FN -- jen debug funkce co vypíše obsah LUA tabulky function tprint (tbl, indent) if not indent then indent = 0 end if type(tbl) == 'table' then for k, v in pairs(tbl) do formatting = string.rep(" ", indent) .. k .. ": " if type(v) == "table" then print(formatting) tprint(v, indent+1) elseif type(v) == 'boolean' then print(formatting .. tostring(v)) else print(formatting .. v) end end else print(tbl) end end Client kód -- klientský stav scriptu WeedState = {} -- jednoduchý způsob, jak zjistit, jestli objekt/auto/ped je NETWORKED, je použít constantu -- pak se nedívám na `false, true, false)` a nemusím se ptát "je networked?" -- neboť to vidím - `NOT_NETWORKED, true, false)` - samozřejmě když popletu poředí argumentu, tak mi tohle nijak nepomůže NOT_NETWORKED = false -- na jakou vzdálenost chceme vytvořit objekt? -- pokud hráč bude dál, než tato vzdálenost, tak objekt vůbec nebude -- existovat ve hře. Já často používám 100 - 150, ale na testování 5 RENDER_DISTANCE = 5.0 -- Pokud už objekt existuje, tak ho despawneme, až když bude o toleranci dál, než v render distance -- Díky tomu pokud budu stát na hranici render distance tak mi objekt nebude přeblikávat pokaždé, když se přiblížím a oddálím -- Dobrá tolerance je třeba 20 jednotek RENDER_DISTANCE_TOLERANCE = 2.0 -- Jaké objekty použijeme, pro jakou stage STAGE_OBJECTS = { [0] = 'prop_weed_02', [1] = 'prop_weed_01', } RegisterNetEvent('state_weed:sync') AddEventHandler('state_weed:sync', function(w) local receivedIds = {} local ped = PlayerPedId() local coords = GetEntityCoords(ped) for id, plant in pairs(w) do -- receivedIds tabulku použijeme pro to, -- abychom poznali, jaké ID kytek už nejsou na serveru -- tzn. pokud v lokálním WeedState bude některé ID, co není v -- receivedIds, pak už server smazal danou kytku a klient musí taky receivedIds[id] = true -- pokud jde o novou kytku, tak ji jen přidáme do stavu a vytvoříme objekt if not WeedState[id] then WeedState[id] = plant ProcessPlantObject(coords, WeedState[id]) else -- pokud již na clientu kytka existuje -- musíme myslet na to, že klient už jí mohl vytvořit entitu -- a ten musíme zachovat. Nesmíme na něj ztratit referenci. -- zároveň zkontrolujeme, jestli se nezměnila stage a pokud ano, refreshneme objekt local oldPlantStage = WeedState[id].stage local entity = WeedState[id].entity WeedState[id] = plant WeedState[id].entity = entity if oldPlantStage ~= WeedState[id].stage then ProcessPlantObject(coords, WeedState[id]) end end end -- nakonec, jak jsem psal na začátku funkce -- smažeme kytky, které už nejsou evidované na serveru for id, plant in pairs(WeedState) do if not receivedIds[id] then DeleteWeedObject(plant) WeedState[id] = nil end end end) -- jen funkce na zobrazení notifikace. Ideálně použijte to, co používáte napříč projektem RegisterNetEvent('state_weed:info') AddEventHandler('state_weed:info', function(text) SetNotificationTextEntry('STRING') AddTextComponentSubstringPlayerName(text) DrawNotification(true, true) end) -- samostatný thread checkuje, jestli je hráč blízko nějaké kytce -- a pokud ano a kytka je vyrostlá, zobrazíme hint a reagujeme na tlačítko Citizen.CreateThread(function() while true do Wait(0) local ped = PlayerPedId() local coords = GetEntityCoords(ped) for id, plant in pairs(WeedState) do if plant.stage == 1 and #(coords - plant.pos) < 1.5 then RenderPickupText(plant.pos) if IsControlJustPressed(0, 38) then TriggerServerEvent('state_weed:pickup', id) end end end end end) -- samostatný thread checkuje stav entit -- pokud se hráč přiblíží, vytvoříme entitu -- pokud se vzdáli, smažeme entitu -- pokud nesedí model entity, refreshneme entitu Citizen.CreateThread(function() while true do Wait(1000) local ped = PlayerPedId() local coords = GetEntityCoords(ped) for _, plant in pairs(WeedState) do ProcessPlantObject(coords, plant) end end end) -- funkce která dělá to, co je popsané nad předchozím theadem ^^ function ProcessPlantObject(playerCoords, plant) if not plant.entity and #(plant.pos - playerCoords) < RENDER_DISTANCE then plant.entity = CreateWeedObject(plant.pos, plant.stage) elseif plant.entity and #(plant.pos - playerCoords) > (RENDER_DISTANCE + RENDER_DISTANCE_TOLERANCE) then DeleteWeedObject(plant) elseif plant.entity and GetEntityModel(plant.entity) ~= GetHashKey(STAGE_OBJECTS[plant.stage]) then DeleteWeedObject(plant) plant.entity = CreateWeedObject(plant.pos, plant.stage) end end -- Wrapper funkce na vytvoření objektu -- Ideálně by to chtělo do `while not HasModelLoaded(hash) do` -- přidat backpressure, že pokud se do např. 500 framu (nebo určitého času) nenačte model, tak -- to přestane čekat a vyfailuje -- to je ale mimo scope tohoto tutoriálu function CreateWeedObject(pos, stage) local hash = GetHashKey(STAGE_OBJECTS[stage]) if IsModelInCdimage(hash) then -- IsModelInCdimage checkuje, jestli model je ve hře. Na vzdory názvu nemá nic dočinení s CDčkama :) RequestModel(hash) while not HasModelLoaded(hash) do Wait(0) end local entity = CreateObject(hash, pos.x, pos.y, pos.z, NOT_NETWORKED, false, false) if entity == 0 then print("ERROR: Could not create object", hash) return nil end FreezeEntityPosition(entity, true) SetEntityAsMissionEntity(entity, true, true) return entity else print("ERROR: Model hash not in game ", hash) end end -- jednoduchy wrapper na smazani entity function DeleteWeedObject(plant) if plant.entity then DeleteObject(plant.entity) plant.entity = nil end end -- wrapper na 3d text function RenderPickupText(pos) local visible, x, y = GetScreenCoordFromWorldCoord(pos.x, pos.y, pos.z) SetTextFont(0) SetTextScale(0.0, 0.5) SetTextColour(255, 255, 255, 255) SetTextOutline() SetTextCentre(true) SetTextEntry("STRING") AddTextComponentString("~y~[E]~s~ Sklidit") DrawText(x, y) end
  18. 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
  19. 0 points
    🥲 proč řekni mě proč? Jak můžeš používat esx crackhead loading screen 🥲
  20. 0 points
    neříkal si že si fakt dobrý developer co umí lua atd..?
  21. 0 points
    Zdravíčko potřeboval bych pomoct , nevím jak dál už :D Zmizela mi minimapa ve vozidla zkoušel jsem vyměnit es_extended jiný hudy a nic nepomohlo stále tam není neví někdo jak to opravit či nějaký script co ji tam přidá ? Děkuju za přečtení kikotei
  22. 0 points
    Ne nechcem unban, ale ďakujem. Môžeš mi dať kľudne ďalší ban. Už sa sem radšej nevrátim. Prajem vám veľa šťastia a lásky v budúcnosti. RealDaBaby / Bromomento LESS GOOOO
  23. 0 points
    Bromomento, jestli chceš někdy dostat unban tak tímto si to dost kurvíš :) Tady máš další permu teda.
  24. 0 points
    Dvákrát měř, ale jednou .....si zaplať člověka, kterej opravdu ví co dělá.
  25. 0 points
    jakoby ne asi, ty doslova reselluješ dumpy a leaky. Když už nahlašuju tak si aspoň změním účet

Our partners

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