Jump to content

Recommended Posts

Posted

 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"
phmt69gDRqa4kJe4TPgZpw.png

F5eZqrSnQD60OfSXzxmo9g.png


event "testValue" a "testMoreValue"

4_1X44M3T0mBBxx0sSdQMA.png

 


event "giveWeapon"

VtbCxShWTqmllXxe6uz6-Q.png

RtDB1OkpTjO3Yu7xgLDxMQ.png

 


server
 

Jedná se o event "sourcePlayerTest"

HoCFrBK3TvmIc2Ox0NHFYQ.png

  • Like 2

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...