Jump to content

Xogos

Administrators
  • Posts

    3
  • Joined

  • Last visited

  • Days Won

    1

Xogos last won the day on February 18 2023

Xogos had the most liked content!

2 Followers

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Xogos's Achievements

Rookie

Rookie (2/14)

  • One Month Later
  • Week One Done
  • Reacting Well Rare
  • Conversation Starter

Recent Badges

6

Reputation

  1. Zdravím, připravil jsem si pro Vás malý návod. Obtížnost tutoriálu: 1/5 List funkcí/věcí které použijeme dnes: Attributes EventHandlers["eventjmeno"] new Action<...>() TriggerEvent TriggerServerEvent Event je událost kterou lze volat jen u daného hráče nebo všem hráčům na serveru.. Takovéto eventy se dají využít i na server side čistě.. Bez dalších řečí pojďme se podívat jak registrovat a volat eventy.. Ukážu zde zase více příkladů jak registrovat eventy. Takto se tvoří jak serverové tak klientské eventy. //Vytvoříme funkci kterou pak budeme volat skrze TriggerEvent public void fullArmour() { API.SetPedArmour(API.PlayerPedId(), 100); } //Vytvoříme funkci s paramterama kde budeme hračovi přidávat armour, a budeme volat skrze TriggerEvent. public void giveArmour(int armour) { int playerPed = API.PlayerPedId(); API.SetPedArmour(playerPed, API.GetPedArmour(playerPed) + armour); } //[EventHandler("...")] je attribute který předává "vlastnosti" //dané funkci která půjde volat srkze event, veškeré parametry co zde jsou //tak půjdou volat skrze TriggerEvent. [EventHandler("giveWeapon")] public void giveWeapon(string weapon,int ammo) { API.GiveWeaponToPed(API.PlayerPedId(), (uint)API.GetHashKey(weapon), ammo, false, true); } public MainClass() { //Action nám zapouzdruje metodu kterou lze zapouzdrovat i pomocí //annonymních funkcích, lze přidávat parametry do action které si //ukážeme dóle, tento event nám doplní věškeré HP a lze volat pomocí TriggerEvent EventHandlers["fullHeal"] += new Action(() => { API.SetEntityHealth(API.PlayerPedId(), 250); }); //jak padlo nahoře, tento event bude příjmat datový typ INT //jak už naznačuje annonymní funkce i název eventu, tento event //nám bude léčit hráče ve hře. Lze vyvolat tento event pomocí TriggerEvent. EventHandlers["giveHeal"] += new Action<int>((health) => { int playerPed = API.PlayerPedId(); API.SetEntityHealth(playerPed, API.GetEntityHealth(playerPed) + health); }); //Zapouzdří nám funkci "fullArmour" lze volat pomocí TriggerEvent EventHandlers["fullArmour"] += new Action(fullArmour); //Zapouzdří nám funkci "giveArmour" lze volat pomocí TriggerEvent EventHandlers["giveArmour"] += new Action<int>(giveArmour); } a jak vyvolám takový event ? úplně jednoduše. Pomocí funkce "TriggerEvent" který má parametry takové String eventName params object[] parametry Ale pozor! Jestli chcete volat eventy které jsou čistě client side, musíte použít funkci "TriggerEvent" ale jestli chcete volat event který je na serveru tak musíte použít "TriggerServerEvent" [Command("healme")] void heal() { //Vyvolá event který jsme si registrovali nahoře. //v našem případě nás to vyléčí. TriggerEvent("fullHeal"); } [Command("weapon")] void giveWeapon() { //Vyvolá event který jsme si registrovali nahoře. //v našem případě nám toto dá zbraň pistol a 250 nábojů. TriggerEvent("giveWeapon","WEAPON_PISTOL",250); } a jak můžu "přenášet" proměnné z funkce ? [EventHandler("testValue")] void passValue(dynamic testValue) { //Typovost musí být vždy dynamic, protože jí lze deklarovat //jako dynamickou metodu.. a volá se jako normální funkce. //lze dávat více argumentů do této dynamické funkce. testValue("joujoujou cum na to"); } [EventHandler("testMoreValue")] void passMoreValue(dynamic testValue) { //příklad více parametrů. testValue("string",true,0.1f); } [Command("event")] void cmd() { //Zde musíme "zaobalit" tu dynamickou funkci kterou jsme si //deklarovali v eventu "testValue" jelikož vracíme string //tak budeme deklarovat new Action se stringem. TriggerEvent("testValue", new Action<string>((value) => { //Vypíšeme do konzole jaká je hodnota z dynamické funkce, //respektivě jeho parametry. Debug.WriteLine("string" + value); })); //Jen mezera do konzole ať lépe rozeznáme který text je který. Debug.WriteLine(" "); Debug.WriteLine(" "); TriggerEvent("testMoreValue", new Action<string,bool,float>((value,boolean,floatik) => { //to samé jako nahoře, akorát máme více parametrů. Debug.WriteLine($"{value}"); Debug.WriteLine($"{boolean}"); Debug.WriteLine($"{floatik}"); })); } Jelikož tento návod je pouze o eventech a jen jak NAČÍST esx. tak tady ukážu jen jak načíst esx jak client, tak server side. Jestli vás zajímá jaké funkce má ESX tak zde je jejich dokumentace: https://esx-org.github.io/es_extended/ client //Napíšeme si statickou dynamickou proměnnu //kterou budeme deklarovat hned jak se resource spustí. public static dynamic esx; public ClientMain() { //while je smyčka která se bude opakovat do té doby //dokud esx nebude mít null hodnotu. //proč chceme smyčku vůbec ? Protože se může stát že omylem //se náš script načte dřív jak ESX a nezapíše nic do "dynamic esx" while (esx == null) { //je lepší vždy dávat delay nad všechny funkce, jestli jedna //z funkci bude mít nějakou chybu tak se "Delay" nikdy nevyvolá //a crashne hra.. //Co vlastně tato funkce dělá ? //Vytváří úlohu která bude pozastavena po určitém čase, v našem případě //za 10 milisekund, ano čas se udává v milisekundách 1000 ms = 1 sekunda Delay(10); //Vyvoláme event který nám bude vracet dynamické metody //a ty zapíšeme do proměnné "esx" TriggerEvent("esx:getSharedObject", new Action<dynamic>(esxObj => { esx = esxObj; })); } } server //Napíšeme si statickou dynamickou proměnnu //kterou budeme deklarovat hned jak se resource spustí. public static dynamic esx; public main() { //Vyvoláme event který nám bude vracet dynamické metody //a ty zapíšeme do proměnné "esx" TriggerEvent("esx:getSharedObject", new Action<dynamic>(esxObj => { esx = esxObj; })); } Ještě se pojďme podívat na server side eventy, protože budete chtít někdy v budoucnu zjištovat jaký hráč trigroval event atd, tak pojďme si rovnou ukázat jak na to! //[FromSource] player, fivem handluje docela trošku zvláštně toto.. tento parametr //"Player" nemusíte vůbec nikde dávat do eventu aby tam byl. Kdykoliv vyvoláte //funkci "TriggerServerEvent" tak tento parametr se tam sám přenese. [EventHandler("sourcePlayerTest")] public void giveWeapon([FromSource] Player player,string text) { Debug.WriteLine(player.Name + " string value: " + text); } public serverClass() { //Bylo vysvětleno nahoře, zde jestli chcete zjištovat kdo event vyvolal, tak musíte //dát do parametrů Action "Player" jelikož to není funkce ale annonymní funkce tak //zde musíte dávat jenom datový typ Player a ne Attribute [FromSource] EventHandlers["AnotherTestSourcePlayer"] += new Action<Player, string>((player, text) => { //Vypíše do konzole jméno hráče a string z parametru "text" Debug.WriteLine(player.Name + " string value: " + text); }); } Jak takový event vyvolám ? Ale pozor! Jestli chcete volat eventy které jsou čistě server side, musíte použít funkci "TriggerEvent" ale jak vyvolám eventy ze serveru pro hráče ? Máme tady 2 funkce které budeme volat pro hráče... player.TriggerEvent("eventName") toto nám vyvolá jen u daného hráče event. TriggerClientEvent("eventName") Tato funkce vyvolá daný event úplně u všech lidí na serveru... Ale pozor, jestli ovládáte luU tak víte že musíte vyplnít "-1" aby se to vyvolalo u všech lidí na serveru, zde nemusíte specifikovat hráče protože to dělá funkce co jsme si ukazovali nad náma. Příklad client side: [Command("serverevent")] void playerCommand() { //Vyvolá event na serveru se jménem "AnotherTestSourcePlayer" TriggerServerEvent("AnotherTestSourcePlayer","textik lulik"); } //registrujeme příkaz "healplayer" a musíme kontrolovat i parametry //logicky když to chceme vyvolávat u určitého hráče tak musíme //řešit jeho ID... stím nám pomůže "string[] args" který nám bude //vracet co vlastně za parametry zadal do příkazu //musíte zadat /healplayer <ID> [Command("healplayer")] void addGroup(string[] args) { //Jelikož c# začíná s číslem 0 a ne 1 jako lua tak zadáme 0. //Jelikož c# řeší typovost, tak musíme ze stringu udělat int //a stím nám pomůže funkce Parse. Která nám ze stringu udělá int TriggerServerEvent("HealPlayerFromId", Int64.Parse(args[0])); } Příklad server side: [EventHandler("AnotherTestSourcePlayer")] void testEvent() { //vyvolá u všech lidí na serveru event "fullHeal" TriggerClientEvent("fullHeal"); } //Logicky budeme potřebovat ID hráče takže si napíšeme parametr "ID" //který pak budeme volat skrze client/server odkud chcete. [EventHandler("HealPlayerFromId")] void fromId(int id) { //toto nám vratí instanci daného hráče z ID. Player player = new PlayerList()[id]; player.TriggerEvent("fullHeal"); } Výsledek: Client event "fullHeal" event "testValue" a "testMoreValue" event "giveWeapon" server Jedná se o event "sourcePlayerTest"
  2. Zdravím, připravil jsem si pro Vás malý návod. Obtížnost tutoriálu: 2/5 List funkcí které použijeme dnes: new Func<T1,Return Value(datový typ)>(nazevFunkce) new Action<T1,...>() Exports.Add("Nazev exportu", delegate) Exports["Nazev resource"] Co je to export? Export je Dictionary mapa která ukládá delegate funkce a lze tyto funkce dědit do ostatních resourců.. jestli je ještě někdo z maten co je to Dictionary a delegate, tak to rychle vysvětlím. Není to nic těžkého. Dictionary Je mapa klíčů a hodnot do které můžete ukládat skoro cokoliv. Delegate Je odkaz který odkazuje na funkci s parametrama. To samé platí pro "new Action<...>() , new Func...>" Zapouzdruje metodu, je tady jeden rozdíl akorát. New action nevrací hodnotu a new Func vrací hodnotu. Dám několik příkladů jakýma způsobama lze vytvářet exporty, na Vás je pak si vybrat který se vám bude nejvíce "líbit" nebo lépe používat... Pojďme se na to vrhnout teda. //Deklarujeme delegate která má jenom parametr string public delegate void MessageFunction(string msg); //Tvoříme funkci která nám zobrazovat Subtitles do hry public void showSubtitles(string message) { //Tato funkce nám zobrazí titulky ve hře.. Screen.ShowSubtitle(message); } //Funkce která bude sloužit k vyvolání eventu "chatMessage" která posílá zprávu do chatu.. public void ZpravaDoChatu(string message) { TriggerEvent("chatMessage", "<Zprava>", new[] { 255, 0, 0 }, message); } public MainClass() { //abstraktuje funkci "showSubtitles" MessageFunction subtitle = showSubtitles; //přidáváme export se jménem "showSubtitles" Exports.Add("showSubtitles", subtitle); //Annonymní funkce Exports.Add("sendMessage", new Action<string>((message) => { TriggerEvent("chatMessage", "<Zprava>", new[] { 255, 0, 0 }, message); })); //abstraktuje funkci "ZpravaDoChatu" Exports.Add("anotherMessage", new Action<string>(ZpravaDoChatu)); } Jak pak něco takového vyvolám vůbec ? [Command("testprikaz")] void myCommand() { //Exports vrací DynamicMethod, "xCoreMaster" je název mého resourcu. Může se lišit od vašeho.. dynamic xCoreMaster = Exports["xCoreMaster"]; xCoreMaster.showSubtitles("test subtitles"); xCoreMaster.sendMessage("Zprava v chatu lel"); xCoreMaster.anotherMessage("dalsi zprava"); } Výsledek: Jak vracet hodnoty z export funkcí ? //Deklarujeme delegate která bude vracet datový typ "string" public delegate string namePlayer(); //vytvoříme funkci getPlayerName public string getPlayerName() { // Pokaždé když se zavolá tato funkce, tak se vratí string v podobě "(Jmeno hráče) z exportu lel" return Game.Player.Name + " z exportu lel"; } //Jenom příklad, funkce banka reprezentuje jenom funkci pro vracení datového typu. public int banka() { //Pokaždé když zavoláme funkci tak nám bude vracet 559. return 559; } public MainClass() { //abstraktuje funkci "getPlayerName" namePlayer name = getPlayerName; Exports.Add("getPlayerName", name); Exports.Add("moneyBank", new Func<int>(banka)); //Jak už se psalo nahoře, new Func<...> dokáže vracet hodnoty.. Mám takovou domněnku že fivem nerado čte třídy.. //tzn není dobré vracet Player třídu, nebo vlastní třídy. //Annonymní funkce která když se zavolá vratí true/false podle toho jeslti hráč je naživu. Exports.Add("isAlive", new Func<bool>(() => { if(Game.PlayerPed.Health < 0) return false; return true; })); } [Command("testprikaz")] void myCommand() { //Exports vrací DynamicMethod, "xCoreMaster" je název mého resourcu. Může se lišit od vašeho.. dynamic xCoreMaster = Exports["xCoreMaster"]; xCoreMaster.sendMessage("Jmeno: " + xCoreMaster.getPlayerName()); xCoreMaster.sendMessage("Banka: " + xCoreMaster.moneyBank()); xCoreMaster.sendMessage("Jsem naživu: " + xCoreMaster.isAlive()); } Výsledek: Děkuji za prečtení 🙂
  3. Zdravím, připravil jsem si pro Vás návod pro Fivem c# resource. Obtížnost tutoriálu: 1/5 List věcí které budeme potřebovat: Visual studio Fivem client Fivem server Visual studio Vytvoříte nový projekt který bude v jazyku C# a jako předloho vyberete "Class Library (.NET Framework)". Až vybere tuto předlohu tak máte ještě jednu možnost a to vybrat verzi FrameWorku, tak si vyberete ".NET FrameWork 4.5.2" Výsledek by měl vypadat nějak takto (Jestli nemáte ale Visual studio 2017 tak nemáte takovéto UI bude vypadat jinak ale furt tam máte stejné možnosti jako zde!) Až se Vám dotvoří projekt tak se Vám ukáže toto: Vás bude aktuálně zajímat "FivemResource" (Záleží jak jste si pojmenovali projekt, může to být odlišné od toho jak jste si to pojmenovali.) Pravým kliknutím na "FivemResource" vám vyjedou různé možnosti, a Vy musíte najít "Properties" a kliknout na to. Když jste udělal tento postup tak Vám vyjede takové nastavení, a Vás budou zajímat pouze 2 tabulky a to "Application" a "Build". Nejdříve půjdeme do "Application" a tam máme input se jménem "Assembly name" za ten název tam musíte přidat .net jestli nepřidáte .net tak se Váš resource nespustí! Nadále půjdeme do nastavení "Build" a tam je sekce "Output" a změníme akorát output path do naší složky kde máme fivem server -> resources Pak všechen postup uložíte zkratkou "CTRL + S" Všechny kroky pak vypadají takto: A teď musime přidat "CitizenFX.Core.dll" knihovnu do našeho projektu ve visual studiu. Nejdříve si musíte rozkliknout Váš projekt a tam pak uvidíte "References" pravým klikem vám vyjede pár možností a Vás bude zajímat: "Add reference". Tam pak máte tlačítko "Browse" a z dole uvedené cesty si přidáte tuto knihovnu. Knihovna se nachází ve Vaší Fivem složce (hra) najdete jí zde "...\FiveM.app\citizen\clr2\lib\mono\4.5". Pak už kliknete jen na "OK". Knihovna je importovaná už v projektu, ale musíte ještě nastavit aby se Vám tato knihovna při kompilaci projektu ne-exportovala s projektem. Rozkliknete si zase "Properties" aby jste viděl všechny itemy, najdete "CitizenFX.Core" kliknete pravým tlačítkem na "properties". Ukáže se Vám tabulka "properties" tam najdete "Copy Local" a hodnotu z "true" změníte na "false" Teď půjdeme na kódovaní! Nejdříve si musíme implementovat naší třídu "BaseScriptem" aby Fivem dokázalo spustit náš resource. na červenej text najedete myškou a zmáčknete alt + enter Dále si můžeme vytvořit jednoduchý příkaz jen aby jsme veděli že resource funguje A takto vypadá client side 🙂 Další na řade je server side... Pravým tlačítkem kliknete na "Solution 'FivemResource'" a dáte add -> new project -> Class Library (.NET Framework) akorát si to pojmenujete "server" Další na řadě je zase knihovna... úplně stejný postup akorát jiná cesta 🙂 Knihovnu najdete v "..../FiveM_server\citizen\clr2\lib\mono\4.5" a tam zase najdete "CitizenFX.Core.dll" v kódovaní je stejný postup... Class1 : BaseScript Poslední krok je export... a to stačí kliknout pouze F5 Pak si vytvoříme akorát fxmanifest.lua který bude mít tyto soubory v clientu + serveru client_scripts { 'FivemResource.net.dll' } server_script { "server.net.dll", } Obrázky ze hry + konzole
×
×
  • Create New...