Xogos Posted February 18, 2023 Share Posted February 18, 2023 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.