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"