HU/Introduction to Scripting the GUI - Part 2: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
No edit summary
 
(54 intermediate revisions by the same user not shown)
Line 1: Line 1:
Ebben a tutoriálban létre fogunk hozni egy egyszerű 'szabályok' ablakot, egy elfogadási gombbal és egy listával a szerver összes szabályáról, és infórmációjáról.
Ebben a tutoriálban létre fogunk hozni egy egyszerű ''szabályok'' ablakot egy elfogadási gombbal, és egy listával a szerver összes szabályairól, és infórmációiról.


{{Note_hu|Vegye figyelembe, hogy ez a tutoriál a [[Introduction to Scripting the GUI|Bevezetés a GUI készítésébe]] tartalmára épül.}}
{{Note_hu|Vegye figyelembe, hogy ez a tutoriál a [[Introduction to Scripting the GUI|Bevezetés a GUI készítésébe]] tartalmára épül.}}
Line 5: Line 5:
==A GUI készítése==
==A GUI készítése==


===Getting set up===
===Alapbeállítások===
Az első dolog, amit létre kell hozununk, az a  GUI elem.
Az első dolog, amit létre kell hoznunk, az a  GUI elem.
For this tutorial we will be using one [[Element/GUI/Window|window]], one [[Element/GUI/Button|button]] and one [[Element/GUI/Text_label|label]].
Ehhez a tutoriálhoz egy [[Element/GUI/Window|ablakot]], egy [[Element/GUI/Button|gombot]] és egy [[Element/GUI/Text_label|címkét]] használunk.
We will be using '''absolute''' position values.
'''Abszolút''' pozícióértékeket fogunk használni.


As noted in the [[Introduction to Scripting the GUI|Previous tutorial]], all the GUI must be made client side.  
Ahogy az [[HU/Introduction to Scripting the GUI|előző tutoriálban]] is említettük, minden GUI-t client oldalon kell létrehozni.  


If you are following on from that tutorial, open up your gui.lua file to work with.
Ha követte az utasításokat az előző tutoriálból, akkor nyissa meg a gui.lua fájlt, amivel majd dolgozni fog.


If you are not, browse to /Your MTA Server/mods/deathmatch/resources/myserver/ directory, and create a folder named "client".  
Ha nem, lépjen a /Your MTA Server/mods/deathmatch/resources/myserver/ könyvtárba, és hozzon létre egy mappát "client" néven.  
Under /client/ directory, create a text file and name it "gui.lua".
A /client/ könyvtárban hozzon létre egy szöveges fájlt "gui.lua" néven.


If you have not already done so, do not forget to include the new gui.lua file in the meta.xml of the main resource, and label it as a client script:
Ha még nem tette meg, ne felejtse el hozzáadni az új gui.lua fájlt a meta.xml-hez a fő resource-ba, és adja meg client script-ként:
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<script src="client/gui.lua" type="client" />
<script src="client/gui.lua" type="client" />
</syntaxhighlight>
</syntaxhighlight>


 
===Ablak létrehozása===
===Making the window===
Ebben a fájlban írni fogunk egy function-t, ami kirajzolja az ablakot:
In this file we will write a funtion that draws the window:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- create the function that will hold our gui creation code
-- create the function that will hold our gui creation code
Line 46: Line 45:
end
end
</syntaxhighlight>
</syntaxhighlight>
This will create a basic window in the centre of the screen that cannot be moved and cannot be resized.
Ez létre fog hozni egy alap ablakot a képernyő közepére, ez az ablak nem mozgatható és méretezhető.


===Making the button===
===Gomb létrehozása===
Next, we will add the button to the bottom of our window that players can click on to accept the rules:
Most létrehozzuk a gombot az ablak aljára, melyre a játékos rá tud kattintani, hogy elfogadja a szabályokat:


'''Note that we are now writing more code for our existing 'createRulesWindow' function. This is not a new function and is meant to replace what you already have.'''
'''Mostpedig több kódot adunk hozzá a már meglévő 'createRulesWindow' function-ünkhöz. Ez nem egy új function, hanem a már meglévőt helyettesíti.'''
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
function createRulesWindow()
function createRulesWindow()
Line 77: Line 76:
</syntaxhighlight>
</syntaxhighlight>


===Making the label===
===Címke létrehozása===
Next, we will add the label to the centre of our window that our rules will be displayed on:
Most hozzáadjuk a címkét az ablakunk közepére, hogy megjelenítsük a szabályainkat:


'''Note that we are now writing more code for our existing 'createRulesWindow' function. This is not a new function and is meant to replace what you already have.'''
'''Mostpedig több kódot adunk hozzá a már meglévő 'createRulesWindow' function-ünkhöz. Ez nem egy új function, hanem a már meglévőt helyettesíti.'''
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
function createRulesWindow()
function createRulesWindow()
Line 135: Line 134:
</syntaxhighlight>
</syntaxhighlight>


''Note that the text is added in a different way to usual (we are not using quotation marks, "").''
''Vegye figyelembe, hogy a szöveg egy másik módon van hozzáadva (nem használunk idézőjeleket, "").''


===Text===
===Szöveg===
There are ''two'' ways to define text for a label.
''Két'' módja létezik a címke szövegének megadására.
For most situations, the recommended method is to enter all your text between quotation marks:
A legtöbb esetben az ajánlott módszer az, hogy az összes szöveget idézőjelek közé írja be:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
guiSetText(guiElement,"My text here")
guiSetText(guiElement,"My text here")
</syntaxhighlight>
</syntaxhighlight>


Azonban, ha egynél több sort szeretnénk a szövegünkbe helyezni, akkor ugyan olyan könnyen használhatjuk a második módszert.
Csupán a helyzettől, és a személyes választástól függ, hogy melyik módszert válasszuk.
A tisztánlátás érdekében röviden ismertetem mind a kettőt.


However, when we want to have more than 1 line in our text, it becomes just as easy to use the second method.
It is purely dependant on situation and personal choice which method you chose.
For clarity's sake, i will briefly outline both here.


 
Idézőjelek használata esetén használhatjuk az újsor karaktert: "\n" Ez lehetővé teszi a számunkra, hogy új sort szúrjunk a szövegünkbe.
When using quotation marks, we can make use of the newline character: "\n"
Például:
This allows us to break onto a new line in our text by entering "\n". For example:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
guiSetText(guiElement,"This is line 1. \n This is line 2. \n This is line 3.")
guiSetText(guiElement,"This is line 1. \n This is line 2. \n This is line 3.")
</syntaxhighlight>
</syntaxhighlight>
 
<br/>
 
Azonban, ha zárójeleket közé helyezzük a szöveget idézőjelek helyett, akkor nem kell aggódni azon, hogy egy plusz karaktert addjunk a szöveghez.  
However, if we use brackets to enclose the text instead of quotation marks, we do not need to worry about entering any extra characters.
Könnyedén beírhatjuk azt a szöveget, amit majd meg szeretnénk jeleníteni a címkében. Például:
We can simply type the text out as we want it to appear in the label. For example:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
guiSetText(guiElement,[[This is line 1.
guiSetText(guiElement,[[This is line 1.
Line 165: Line 162:
</syntaxhighlight>
</syntaxhighlight>


Both of these examples will create exactly the same text on the label.
Mindkét példa ugyan azt a szöveget fogja létrehozni a címkében.
It is entirely up to you which method you chose to use.
Egyedűl attól függ, hogy melyik módszert szeretné választani a használathoz.


===Using the function we wrote===
===A function használata===
The createRulesWindow function is now complete, but it won't do anything until we call it.  
A createRulesWindow function most már kész, de nem fog csinálni semmit, míg meg nem hívjuk.  
It is recommended to create all GUI when the client resource starts, hide them, and show them to the player later when needed.  
Ajánlott az összes GUI létrehozás, amikor a client resource elindul. Rejtse el őket, majd amikor szükség van rá, jelenítse meg a játékosnak.


Therefore, we'll write an event handler for [[onClientResourceStart]] to create the window:
Ezért írni fogunk egy eseménykezelőt az [[onClientResourceStart]]-ra, hogy hozza létre az ablakot:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- attach the event handler to the root element of the resource
-- attach the event handler to the root element of the resource
Line 184: Line 181:
</syntaxhighlight>
</syntaxhighlight>


As this is a rules window, we need to show the window when the player joins the game.  
Mivel ez egy ''szabályok'' ablak, ezért ezt meg kell jelenítenünk a játékosnak, amikor csatlakozik.  
Fortunately, GUI elements are visible by default so we do not need to write any more code to achieve this.
Szerencsére a GUI elemek alapértelmezetten láthatóek, ezért nem kell több kódot írni ennek megvalósítása érdekében.


However, we will also need to show the cursor for the player.  
Azonban láthatóvá kell tenni a kurzort a játékosoknak is.  
This can be done using the same event, [[onClientResourceStart]], so we can modify the above code to include showing the cursor:
Ezt megtehetjük ugyan azzal az eventel használva, [[onClientResourceStart]], így módosítani tudjuk a fenti kódot, hogy láthatóvá tegye a kurzort:


'''Note that we are now writing more code for our 'onClientResourceStart' event. This is not a new function and is meant to replace what you already have.'''
'''Mostpedig több kódot adunk hozzá a már meglévő 'onClientResourceStart' event-ünkhöz. Ez nem egy új function, hanem a már meglévőt helyettesíti.'''
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- attach the event handler to the root element of the resource
-- attach the event handler to the root element of the resource
Line 205: Line 202:
</syntaxhighlight>
</syntaxhighlight>


We now have a completed GUI rules window. Next, we need to write the button functionality for the accept button.
Most már van egy kész ''szabályok'' ablakunk. Ezután megkell írnunk a gomb müködését az elfogadás gombhoz.


==Scripting the Button==
==A gomb megírása==
Now that we have created our GUI, we need to make it work.
Most, hogy létrehoztuk a GUI-t, működővé is kell hogy tegyük.


===Detecting the click===
===A klikk észlelése===
When the player clicks on any part of the GUI, the event "[[onClientGUIClick]]" will be triggered for the GUI component you clicked on. This allows us to easily detect any clicks on the GUI elements we want to use.
Ha egy játékos rákattint a GUI bármely részére, akkor az "[[onClientGUIClick]]" event meg fog hívodni arra a GUI részre, amelyre kattintott. Ez lehetővé teszi a számunkra, hogy kennyedén észlelni tudjunk bármilyen kattintást a GUI elemen, amit használni akarunk.
For example, we can attach the event to the 'rulesButton' button to catch any clicks on it:
Például, hozzá tudjuk csatolni a 'rulesButton' eventet a gombhoz, hogy érzékelje a kattintásokat rajta:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- attach the event onClientGUIClick to rulesButton and set it to trigger the 'acceptRules' function
-- attach the event onClientGUIClick to rulesButton and set it to trigger the 'acceptRules' function
addEventHandler("onClientGUIClick", rulesButton, acceptRules, false)
addEventHandler("onClientGUIClick", rulesButton, acceptRules, false)
</syntaxhighlight>
</syntaxhighlight>
'''Note the final argument passed is "false". This indicates that the event will only trigger directly on rulesButton, not if the event has propagated up or down the tree. Setting this to "true" while attaching to gui elements will mean that clicking on any element in the same branch will trigger this event.'''
'''Vegye figyelembe, hogy az utolsó paraméter az "false". Ez azt mutatja, hogy az event közvetlenül csak a rulesButton-on hívodik meg, és nem akkor, ha az event magasabb, vagy alacsonyabb ágon van. Gui elem csatolása közben, ha "true"-ra állítja, akkor az azt jelenti, hogy bármely ugyan azon ágon lévő elemre kattintás során az event meghívodik.'''


This line of code can now be added inside the 'createRulesWindow' function. It is a common mistake to try and attach events to non-existant GUI elements, so make sure you always attach your events '''after''' the GUI element (in this case, the button) has been created:
Ezt a kódot már hozzá is adhatjuk a 'createRulesWindow' function-höz. Gyakori hiba, hogy eventeket próbálnak meg csatolni egy nem létező GUI-hoz, ezért győződjön meg arról, hogy mindig a létrehozott GUI elem után csatolja az eventet (ebben az esetben a gomb):
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
function createRulesWindow()
function createRulesWindow()
Line 229: Line 226:
</syntaxhighlight>
</syntaxhighlight>


===Managing the click===
===A klikk kezelése===
Now that we can detect when the player clicks on the button, we need to write code to manage what happens when they do.
Most, hogy észlelni tudjuk, hogy a játékos mikor kattint a gombra, írnunk kell egy kódot, ami kezelni tudja ezt, amikor a játékos kattint.
In our [[onClientGUIClick]] event handle, we told it to call the function 'acceptRules' whenever 'rulesButton' is clicked.
A mi [[onClientGUIClick]] event handler-ünkben azt mondtuk, hogy hívja meg a 'acceptRules' function-t, amikor a 'rulesButton'-ra kattintottak.
Therefore, we can now use the function 'acceptRules' to control what happens when the button is clicked:
Ezért most már használhatjuk a 'acceptRules' function-t annak ellenőrzésére, hogy mi történik a gomb megnyomásakor:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- create the function and define the 'button' and 'state' parameters
-- create the function and define the 'button' and 'state' parameters
Line 259: Line 256:
end
end
</syntaxhighlight>
</syntaxhighlight>
Now, when the button is clicked, the window and the cursor will be hidden.
Most, amikor a gombot megnyomják, akkor az ablak és a kurzor elrejtődik.


==Checking for agreement==
==Elfogadás ellenőrzése==
Currently, our window will show when the player joins the server, and they must click accept to remove it.
Jelenleg a mi ablakunk akkkor fog megjelenni, amikor a játékos csatlakozik a szerverre, és csak az elfogadás után tünik el.
However, if they do not accept it they can stay in the server indefinately with the window open.
Azonban, ha nem fogjadja el, akkor bármeddig a szerveren maradhat a nyitott ablakkal együtt.


===Setting a timer===
===Az időzítő beállítása===
To combat this, we will add a timer using [[setTimer]] to kick them from the server after a period of time if they have not accepted the rules.
Ennek elkerülésének érdekében egy [[setTimer]]-t adunk hozzá, hogy egy bizonyos idő után kickelje a játékost, ha nem fogadta el a szabályokat.
First, we will need a global variable to store the timer pointer:
Előszőr is szükségünk lesz egy globális változóra, hogy tárolni tudjuk az időt:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
local rulesWarningTimer = nil
local rulesWarningTimer = nil
</syntaxhighlight>
</syntaxhighlight>
Put this line at the very top of your script (it does not need to be inside a function)
Helyezze ezt a sort a script legtetejére (nem kell, hogy a function-on belül legyen)


Next, we will create our timer:
Ezután létre hozzuk az időzítőt:


'''Note that we are now writing more code for our existing 'createRulesWindow' function.'''
'''Mostpedig több kódot adunk hozzá a már meglévő 'createRulesWindow' function-ünkhöz'''
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
function createRulesWindow()
function createRulesWindow()
Line 285: Line 282:
end
end
</syntaxhighlight>
</syntaxhighlight>
Put this [[setTimer]] line at the bottom of your 'createRulesWindow' function.
Helyezze ezt a [[setTimer]] sort a 'createRulesWindow' function közepére.
This will create a timer that will trigger after 30 seconds.
Ez létre fog hozni egy időzítőt, amely 30 másodperc után fog meghívódni.


===Giving a warning===
===Figyelmeztetés===
Now we will write our 'inactivePlayer' function, to administer warnings to the player and finally kick him if he does not accept:
Most megfogjuk írni az 'inactivePlayer' function-ünket, hogy figyelmeztetést adjon a játékosnak, és végül kickelje is ki, ha nem fogadja el:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- create our function and define the 'status' parameter
-- create our function and define the 'status' parameter
Line 315: Line 312:
end
end
</syntaxhighlight>
</syntaxhighlight>
Note the use of [[triggerServerEvent]] to call the server. You should have experience with client-server interaction from the [[Introduction to Scripting the GUI|Previous tutorial]].  
Vegye figyelembe a [[triggerServerEvent]] használatát, hogy meghívja a szervert. Tapasztalatának kell lennie a client-server kommunikációjáról [[HU/Introduction to Scripting the GUI|az előző tutorialból]].  
If not, you can go back and read the full explanation there.
Ha nincs, vissza mehet és elolvashatja a teljes magyarázatot.




We have now completed all the clientside code for this tutorial.
Ezzel be is fejeztük a teljes clint oldali kódunkat ehhez a tutoriálhoz.


===Kicking the player===
===A játékos kickelése===
We now need to catch the event on the server that we triggered from the client, so open up a serverside lua file to work with.
Most foglalkoznunk kell azzal a server oldali eventel, amit a client oldalon hívtunk meg. Nyissa meg a server oldali lua fájlt, amivel dolgozni fogunk.


To begin, we will add the event on the server:
Kezdésként hozzá fogjuk adni az eventet a szerverhez:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- add the event, note the final argument "true" indicates it can be triggered from the client
-- add the event, note the final argument "true" indicates it can be triggered from the client
Line 331: Line 328:
addEventHandler("clientKickInactivePlayer",root,kickInactivePlayer)
addEventHandler("clientKickInactivePlayer",root,kickInactivePlayer)
</syntaxhighlight>
</syntaxhighlight>
'''Make sure you add your event handler after you have defined your 'kickInactivePlayer' function.'''
'''Győződjön meg arról, hogy hozzáadta az event handler-t miután meghatározta a 'kickInactivePlayer' function-t.'''


Note the use of [[addEvent]] and [[addEventHandler]] on the server. You should have experience with client-server interaction from the [[Introduction to Scripting the GUI|Previous tutorial]].  
Vegye figyelembe az [[addEvent]] és az [[addEventHandler]] használatát a szerveren. Mostanra már rendelkeznie kell némi tapasztalattal a client-server kommunikációjáról az [[Introduction to Scripting the GUI|előző tutorialból]]. Ha nincs, vissza mehet és elolvashatja a teljes magyarázatot.
If not, you can go back and read the full explanation there.


Finally, we will add the 'kickInactivePlayer' function to control kicking of the player:
Végezetűl hozzáadjuk a 'kickInactivePlayer' function-t, hogy kezelje a játékos kickelését:
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- create our function
-- create our function
Line 344: Line 340:
end
end
</syntaxhighlight>
</syntaxhighlight>
Note the use of the 'client' variable, this is an MTA variable that holds the value of the client (player) that triggered the event.
Vegye figyelembe a 'client' változó használatát, ez egy MTA specifikus változó, ami az eseményt hívó client-et (player elementet) tartalmazza.




'''Note that [[kickPlayer]] will require your resource to have kick access in your ACL.'''
'''Vegye figyelembe, hogy a [[kickPlayer]]-nek rendelkeznie kell ACL hozzáféréssel.'''


'''This is most easily accomplished by adding your resource into your admin group in the ACL:'''
'''Ez a legegyszerűbb módja a resouce hozzáadásának az ACL-ben:'''
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<group name="Admin">
<group name="Admin">
Line 357: Line 353:
</group>
</group>
</syntaxhighlight>
</syntaxhighlight>
For more information on the [[ACL]], see the [[ACL]] wiki page.
További információért az [[ACL]]-ról, látogassa meg [[ACL]] wiki oldalt.


That concludes this tutorial. You should now have a fully working rules window for your server.
Ez fejezi be ezt a tutoriált. Most már rendelkeznie kell egy teljesen működő 'szabályok' ablakkal a szerverén.


For further help with GUI, see the [[:Category:GUI_Tutorials|GUI tutorials]].
A GUI-val való további segítségért látogassa meg a [[:Category:GUI_Tutorials_hu|GUI tutorials]] oldalt.


[[Category:GUI_Tutorials]]
[[Category:GUI_Tutorials]]


[[en:Introduction to Scripting the GUI - Part 2]]
[[en:Introduction to Scripting the GUI - Part 2]]
==Fordította==
'''2018.11.08.''' <font size="3">'''[https://wiki.multitheftauto.com/wiki/User:Surge Surge]'''</font>

Latest revision as of 12:50, 13 May 2019

Ebben a tutoriálban létre fogunk hozni egy egyszerű szabályok ablakot egy elfogadási gombbal, és egy listával a szerver összes szabályairól, és infórmációiról.


[[{{{image}}}|link=|]] Megjegyzés: Vegye figyelembe, hogy ez a tutoriál a Bevezetés a GUI készítésébe tartalmára épül.


A GUI készítése

Alapbeállítások

Az első dolog, amit létre kell hoznunk, az a GUI elem. Ehhez a tutoriálhoz egy ablakot, egy gombot és egy címkét használunk. Abszolút pozícióértékeket fogunk használni.

Ahogy az előző tutoriálban is említettük, minden GUI-t client oldalon kell létrehozni.

Ha követte az utasításokat az előző tutoriálból, akkor nyissa meg a gui.lua fájlt, amivel majd dolgozni fog.

Ha nem, lépjen a /Your MTA Server/mods/deathmatch/resources/myserver/ könyvtárba, és hozzon létre egy mappát "client" néven. A /client/ könyvtárban hozzon létre egy szöveges fájlt "gui.lua" néven.

Ha még nem tette meg, ne felejtse el hozzáadni az új gui.lua fájlt a meta.xml-hez a fő resource-ba, és adja meg client script-ként:

<script src="client/gui.lua" type="client" />

Ablak létrehozása

Ebben a fájlban írni fogunk egy function-t, ami kirajzolja az ablakot:

-- create the function that will hold our gui creation code
function createRulesWindow()
	-- get the screen width and height
	local sWidth, sHeight = guiGetScreenSize()
 
	-- create the window, using some maths to find the centre of the screen
	local Width,Height = 445,445
	local X = (sWidth/2) - (Width/2)
	local Y = (sHeight/2) - (Height/2)

	-- create the window
	rulesWindow = guiCreateWindow(X,Y,Width,Height,"Rules",false)
	
	-- stop players from being able to simply move the window out of the way
	guiWindowSetMovable(rulesWindow,false)
	
	-- stop players from being able to resize the window
	guiWindowSetSizable(rulesWindow,false)
end

Ez létre fog hozni egy alap ablakot a képernyő közepére, ez az ablak nem mozgatható és méretezhető.

Gomb létrehozása

Most létrehozzuk a gombot az ablak aljára, melyre a játékos rá tud kattintani, hogy elfogadja a szabályokat:

Mostpedig több kódot adunk hozzá a már meglévő 'createRulesWindow' function-ünkhöz. Ez nem egy új function, hanem a már meglévőt helyettesíti.

function createRulesWindow()
	-- get the screen width and height
	local sWidth, sHeight = guiGetScreenSize()
 
	-- create the window, using some maths to find the centre of the screen
	local Width,Height = 445,445
	local X = (sWidth/2) - (Width/2)
	local Y = (sHeight/2) - (Height/2)

	-- create the window and save the window gui element in a variable called 'rulesWindow'
	rulesWindow = guiCreateWindow(X,Y,Width,Height,"Rules",false)
	
	-- stop players from being able to simply move the window out of the way
	-- note that we use our 'rulesWindow' variable to make changes to the window
	guiWindowSetMovable(rulesWindow,false)
	
	-- stop players from being able to resize the window
	guiWindowSetSizable(rulesWindow,false)
	
	-- create the button and save the button gui element in a variable called 'rulesButton'
	rulesButton = guiCreateButton(137,394,158,37,"Accept",false,rulesWindow)
end

Címke létrehozása

Most hozzáadjuk a címkét az ablakunk közepére, hogy megjelenítsük a szabályainkat:

Mostpedig több kódot adunk hozzá a már meglévő 'createRulesWindow' function-ünkhöz. Ez nem egy új function, hanem a már meglévőt helyettesíti.

function createRulesWindow()
	-- get the screen width and height
	local sWidth, sHeight = guiGetScreenSize()
 
	-- create the window, using some maths to find the centre of the screen
	local Width,Height = 445,445
	local X = (sWidth/2) - (Width/2)
	local Y = (sHeight/2) - (Height/2)

	-- create the window and save the window gui element in a variable called 'rulesWindow'
	rulesWindow = guiCreateWindow(X,Y,Width,Height,"Rules",false)
	
	-- stop players from being able to simply move the window out of the way
	-- note that we use our 'rulesWindow' variable to make changes to the window
	guiWindowSetMovable(rulesWindow,false)
	
	-- stop players from being able to resize the window
	guiWindowSetSizable(rulesWindow,false)
	
	-- create the button and save the button gui element in a variable called 'rulesButton'
	rulesButton = guiCreateButton(137,394,158,37,"Accept",false,rulesWindow)
	
	-- create the label and save the label gui element in a variable called 'rulesLabel'
	-- we set the text of the label to our rules
	rulesLabel = guiCreateLabel(10,25,425,359,[[
	Welcome to my MTA Server!

	Please carefully read the rules before accepting.

	By accepting the rules, you are agreeing to play by them.
	Anyone caught breaking these rules will be kicked and/or banned from this server.

	If you do not accept the rules within 90 seconds, you will be kicked.

	1: No cheating.

	2: No bug abuse.

	3: No mods to your game.

	4: No flaming.

	5: Respect other players.

	6: Be nice!]],false,rulesWindow)
	
	-- set the horizontal alignment of the label to center (ie: in the middle of the window)
	-- also note the final argument "true" 
	-- this turns on wordwrap so if your text goes over the edge of the label, it will wrap around and start a new line automatically
	guiLabelSetHorizontalAlign(rulesLabel,"center",true)	
end

Vegye figyelembe, hogy a szöveg egy másik módon van hozzáadva (nem használunk idézőjeleket, "").

Szöveg

Két módja létezik a címke szövegének megadására. A legtöbb esetben az ajánlott módszer az, hogy az összes szöveget idézőjelek közé írja be:

guiSetText(guiElement,"My text here")

Azonban, ha egynél több sort szeretnénk a szövegünkbe helyezni, akkor ugyan olyan könnyen használhatjuk a második módszert. Csupán a helyzettől, és a személyes választástól függ, hogy melyik módszert válasszuk. A tisztánlátás érdekében röviden ismertetem mind a kettőt.


Idézőjelek használata esetén használhatjuk az újsor karaktert: "\n" Ez lehetővé teszi a számunkra, hogy új sort szúrjunk a szövegünkbe. Például:

guiSetText(guiElement,"This is line 1. \n This is line 2. \n This is line 3.")


Azonban, ha zárójeleket közé helyezzük a szöveget idézőjelek helyett, akkor nem kell aggódni azon, hogy egy plusz karaktert addjunk a szöveghez. Könnyedén beírhatjuk azt a szöveget, amit majd meg szeretnénk jeleníteni a címkében. Például:

guiSetText(guiElement,[[This is line 1.
This is line 2.
This is line 3.]])

Mindkét példa ugyan azt a szöveget fogja létrehozni a címkében. Egyedűl attól függ, hogy melyik módszert szeretné választani a használathoz.

A function használata

A createRulesWindow function most már kész, de nem fog csinálni semmit, míg meg nem hívjuk. Ajánlott az összes GUI létrehozás, amikor a client resource elindul. Rejtse el őket, majd amikor szükség van rá, jelenítse meg a játékosnak.

Ezért írni fogunk egy eseménykezelőt az onClientResourceStart-ra, hogy hozza létre az ablakot:

-- attach the event handler to the root element of the resource
-- this means it will only trigger when its own resource is started
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), 
	function ()
		-- call the createRulesWindow function to create our gui
		createRulesWindow()
	end
)

Mivel ez egy szabályok ablak, ezért ezt meg kell jelenítenünk a játékosnak, amikor csatlakozik. Szerencsére a GUI elemek alapértelmezetten láthatóek, ezért nem kell több kódot írni ennek megvalósítása érdekében.

Azonban láthatóvá kell tenni a kurzort a játékosoknak is. Ezt megtehetjük ugyan azzal az eventel használva, onClientResourceStart, így módosítani tudjuk a fenti kódot, hogy láthatóvá tegye a kurzort:

Mostpedig több kódot adunk hozzá a már meglévő 'onClientResourceStart' event-ünkhöz. Ez nem egy új function, hanem a már meglévőt helyettesíti.

-- attach the event handler to the root element of the resource
-- this means it will only trigger when its own resource is started
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), 
	function ()
		-- call the createRulesWindow function to create our gui
		createRulesWindow()
		
		-- show the cursor to the player
		showCursor(true,true)
	end
)

Most már van egy kész szabályok ablakunk. Ezután megkell írnunk a gomb müködését az elfogadás gombhoz.

A gomb megírása

Most, hogy létrehoztuk a GUI-t, működővé is kell hogy tegyük.

A klikk észlelése

Ha egy játékos rákattint a GUI bármely részére, akkor az "onClientGUIClick" event meg fog hívodni arra a GUI részre, amelyre kattintott. Ez lehetővé teszi a számunkra, hogy kennyedén észlelni tudjunk bármilyen kattintást a GUI elemen, amit használni akarunk. Például, hozzá tudjuk csatolni a 'rulesButton' eventet a gombhoz, hogy érzékelje a kattintásokat rajta:

-- attach the event onClientGUIClick to rulesButton and set it to trigger the 'acceptRules' function
addEventHandler("onClientGUIClick", rulesButton, acceptRules, false)

Vegye figyelembe, hogy az utolsó paraméter az "false". Ez azt mutatja, hogy az event közvetlenül csak a rulesButton-on hívodik meg, és nem akkor, ha az event magasabb, vagy alacsonyabb ágon van. Gui elem csatolása közben, ha "true"-ra állítja, akkor az azt jelenti, hogy bármely ugyan azon ágon lévő elemre kattintás során az event meghívodik.

Ezt a kódot már hozzá is adhatjuk a 'createRulesWindow' function-höz. Gyakori hiba, hogy eventeket próbálnak meg csatolni egy nem létező GUI-hoz, ezért győződjön meg arról, hogy mindig a létrehozott GUI elem után csatolja az eventet (ebben az esetben a gomb):

function createRulesWindow()
	-- create all our GUI elements
	...

	-- now add our onClientGUIClick event to the button we just created
	addEventHandler("onClientGUIClick", rulesButton, acceptRules, false)

A klikk kezelése

Most, hogy észlelni tudjuk, hogy a játékos mikor kattint a gombra, írnunk kell egy kódot, ami kezelni tudja ezt, amikor a játékos kattint. A mi onClientGUIClick event handler-ünkben azt mondtuk, hogy hívja meg a 'acceptRules' function-t, amikor a 'rulesButton'-ra kattintottak. Ezért most már használhatjuk a 'acceptRules' function-t annak ellenőrzésére, hogy mi történik a gomb megnyomásakor:

-- create the function and define the 'button' and 'state' parameters
-- (these are passed automatically by onClientGUIClick)
function acceptRules(button,state)
	-- if our accept button was clicked with the left mouse button, and the state of the mouse button is up
	if button == "left" and state == "up" then
		-- hide the window and all the components
		guiSetVisible(rulesWindow, false)
		
		-- hide the mouse cursor
		showCursor(false,false)
		
		-- output a message to the player
		outputChatBox("Thank you for accepting our rules. Have fun!")
		
		
		-- if the warning timer exists
		if rulesWarningTimer then
			-- stop the timer and set the variable to nil
			-- this is the timer used to kick players who do not accept the rules. We will cover this in more detail in the next section.
			killTimer(rulesWarningTimer)
			rulesWarningTimer = nil
		end
	end
end

Most, amikor a gombot megnyomják, akkor az ablak és a kurzor elrejtődik.

Elfogadás ellenőrzése

Jelenleg a mi ablakunk akkkor fog megjelenni, amikor a játékos csatlakozik a szerverre, és csak az elfogadás után tünik el. Azonban, ha nem fogjadja el, akkor bármeddig a szerveren maradhat a nyitott ablakkal együtt.

Az időzítő beállítása

Ennek elkerülésének érdekében egy setTimer-t adunk hozzá, hogy egy bizonyos idő után kickelje a játékost, ha nem fogadta el a szabályokat. Előszőr is szükségünk lesz egy globális változóra, hogy tárolni tudjuk az időt:

local rulesWarningTimer = nil

Helyezze ezt a sort a script legtetejére (nem kell, hogy a function-on belül legyen)

Ezután létre hozzuk az időzítőt:

Mostpedig több kódot adunk hozzá a már meglévő 'createRulesWindow' function-ünkhöz

function createRulesWindow()
	-- create all of our gui
	...
	
	-- set a timer for 30 seconds and set it to call our 'inactivePlayer' function with "1" as an argument
	rulesWarningTimer = setTimer(inactivePlayer,30000,1,1)
end

Helyezze ezt a setTimer sort a 'createRulesWindow' function közepére. Ez létre fog hozni egy időzítőt, amely 30 másodperc után fog meghívódni.

Figyelmeztetés

Most megfogjuk írni az 'inactivePlayer' function-ünket, hogy figyelmeztetést adjon a játékosnak, és végül kickelje is ki, ha nem fogadja el:

-- create our function and define the 'status' parameter
-- the value of status will be passed from our setTimer function call
function inactivePlayer(status)
	-- if status is 1 (this means it is the first warning)
	if status == 1 then
		-- output a warning
		outputChatBox("Please accept our rules or be kicked.")
		
		-- set another timer to call inactivePlayer in another 30 seconds, with "2" as an argument
		rulesWarningTimer = setTimer(inactivePlayer,30000,1,2)
		
	-- if status is 2 (the second warning)
	elseif status == 2 then
		-- output a final warning
		outputChatBox("FINAL WARNING: Please accept our rules or be kicked.")
		
		-- set a final timer to call inactivePlayer in another 30 seconds, with "3" as an argument
		rulesWarningTimer = setTimer(inactivePlayer,30000,1,3)	
	elseif status == 3 then
		-- trigger the server so we can kick the player
		triggerServerEvent("clientKickInactivePlayer",getLocalPlayer())
	end
end

Vegye figyelembe a triggerServerEvent használatát, hogy meghívja a szervert. Tapasztalatának kell lennie a client-server kommunikációjáról az előző tutorialból. Ha nincs, vissza mehet és elolvashatja a teljes magyarázatot.


Ezzel be is fejeztük a teljes clint oldali kódunkat ehhez a tutoriálhoz.

A játékos kickelése

Most foglalkoznunk kell azzal a server oldali eventel, amit a client oldalon hívtunk meg. Nyissa meg a server oldali lua fájlt, amivel dolgozni fogunk.

Kezdésként hozzá fogjuk adni az eventet a szerverhez:

-- add the event, note the final argument "true" indicates it can be triggered from the client
addEvent("clientKickInactivePlayer",true)
-- add an event handler for this event to trigger the kickInactivePlayer function
addEventHandler("clientKickInactivePlayer",root,kickInactivePlayer)

Győződjön meg arról, hogy hozzáadta az event handler-t miután meghatározta a 'kickInactivePlayer' function-t.

Vegye figyelembe az addEvent és az addEventHandler használatát a szerveren. Mostanra már rendelkeznie kell némi tapasztalattal a client-server kommunikációjáról az előző tutorialból. Ha nincs, vissza mehet és elolvashatja a teljes magyarázatot.

Végezetűl hozzáadjuk a 'kickInactivePlayer' function-t, hogy kezelje a játékos kickelését:

-- create our function
function kickInactivePlayer()
	-- kick the player
	kickPlayer(client,"Please accept our rules.")
end

Vegye figyelembe a 'client' változó használatát, ez egy MTA specifikus változó, ami az eseményt hívó client-et (player elementet) tartalmazza.


Vegye figyelembe, hogy a kickPlayer-nek rendelkeznie kell ACL hozzáféréssel.

Ez a legegyszerűbb módja a resouce hozzáadásának az ACL-ben:

<group name="Admin">
	...
    <object name="resource.YourResourceName" />
	...
</group>

További információért az ACL-ról, látogassa meg ACL wiki oldalt.

Ez fejezi be ezt a tutoriált. Most már rendelkeznie kell egy teljesen működő 'szabályok' ablakkal a szerverén.

A GUI-val való további segítségért látogassa meg a GUI tutorials oldalt.

Fordította

2018.11.08. Surge