Die Inhalte in diesem Wiki wurden seit längerem nicht mehr aktualisiert.

Alternativ gibt es unter https://gmod.de ein deutschsprachiges Forum zu Garry's Mod.

VGUI Tutorial

Aus GMod Wiki (DE)
Wechseln zu: Navigation, Suche

Aufgabe

Wir wollen nun ein kleines sogenanntes VGUI, ein Menü, erstellen. In diesem Menü soll es möglich sein, eine Funktion auszuführen, indem man auf einen Knopf drückt. Das Menü soll dabei eine Bezeichnung haben und der Button einen Text, auf dem die Funktion draufsteht. Das Menü soll sich immer dann öffnen, wenn man "/menu" in den Chat schreibt.

Macht euch schon einmal auf eine menge Gefasel bereit :-D

Aufbau

Da wir es hier mit einer menge Funktionen zu tun haben, wird es etwas schwierig, einen genauen Aufbau zu nennen. Wichtig ist, dass wir, da wir ein VGUI erstellen, sowohl Client als auch Server berücksichtigen müssen. Gleichzeitig ist noch zu nennen, dass das Skript, was wir erstellen, höchstwahrscheinlich bei niemand Anderem funktioniert, wenn man es nicht dem Clienten überträgt. Normalerweise werden solche Dinge nämlich innerhalb einer Gamemode initalisiert (siehe init.lua und cl_init.lua). Von daher sollte dieses Tutorial bis zum Ende gelesen werden, damit man auch wirklich alles versteht etc.

Folgendes gehört also dem Clienten:

  • Das VGUI
  • Der Button
  • Das concommand zum aufrufen des VGUIs

Folgendes gehört dann dem Server:

  • Die Funktion, um zu überprüfen, ob der Spieler "/menu" geschrieben hat
  • Die Funktion des Buttons

Vorbereitungen

Erstellt euch nun folgende zwei Dateien:

  • [ACCOUNTNAME]\garrysmod\garrysmod\lua\autorun\server\vguitest.lua
  • [ACCOUNTNAME]\garrysmod\garrysmod\lua\autorun\client\vguitest_client.lua

Die Serverfunktionen

Zunächst einmal bauen wir uns die Funktion, damit der Spieler das Menü aufrufen kann. Um nicht immer in die Konsole gehen zu müssen, bauen wir uns die Funktion so, dass sie mithilfe des Chat funktioniert, genauso, wie in den guten alten AMX Zeiten:

  1. function check_message(ply, msg, bool)
  2.  
  3. 	if msg == "/menu" then
  4. 	    ply:ConCommand("open_test_vgui\n")
  5. 	end
  6.  
  7. end
  8.  
  9. hook.Add("PlayerSay", "check_message_of_player", check_message)

Die Funktion überprüft nun, wenn jemand etwas schreibt, ob das Geschriebene, also "msg", "/menu" entspricht. Sollte dies der Fall sein, wird dem Spieler, der es geschrieben hat, "befohlen", dass er das Konsolenkommando namens "open_test_vgui" ausführen soll. "\n" soll dabei in der Konsole eine neue Zeile anfangen, damit nicht der nächste Befehl in die selbe Zeile gerät. Mithilfe vonn "hook.Add" verbinden wir "PlayerSay" mit unserer Funktion, damit sie immer, wenn jemand etwas schreibt, aufgerufen wird.

Nun erstellen wir die Funktion des Buttons:

  1.  
  2. function give_player_health(ply)
  3.  
  4.     ply:SetHealth(ply:Health() + 10)
  5.     ply:ChatPrint("Added 10 HP!")
  6.  
  7. end
  8.  
  9. concommand.Add("give_player_health", give_player_health)

Die Funktion hat das Argument "ply", damit wir später wissen, welcher Spieler die Funktion aufgerufen hat. Dieses wird später beim Concommand mit übergeben. "ply:SetHealth" addiert 10 Gesundheitspunkte zum Spieler und mit "ply:ChatPrint" wird einfach "Added 10 HP!" in den Chat des Spielers geschrieben.

Alles das in die Datei vguitest.lua abspeichern.

Die Clientfunktionen

Nun kommen wir endlich zum eigentlichen VGUI.. oder noch nicht:

  1.  
  2. local ply = LocalPlayer()

Das soll uns später ein bisschen Arbeit ersparen.

Jetzt aber endlich, das VGUI:

  1.  
  2. local Pan = vgui.Create( "Frame" )
  3. Pan:SetSize( 200, 200 )
  4. Pan:SetPos( ScrW()/2-100, ScrH()/2-100 )
  5. Pan:PostMessage( "setTitle", "text", "Tutorial Menu" )

Mit "vgui.Create" machen wir aus "Pan" ein Menü. Es hat dann das Attribut eines "Frame". Danach kommt die Größe (erst X, dann Y) unseres Menüs. Mit "Pan:SetPos( ScrW()/2-100, ScrH()/2-100 )" Zentrieren wir unser Menü in die Mitte des Bildschirms. "PostMessage" ist dafür da, um dem VGUI im Nachhinein einen Befehl zu geben. Wir setzen den Titel des Menüs daher zu "Tutorial Menu".

Jetzt den Button:

  1.  
  2. local Button = vgui.Create( "Button", Pan )
  3. Button:SetSize(100,30)
  4. Button:SetText( "Give Health" )
  5. Button:SetPos( 5, 30 )

Aus "Button" machen wir jetzt ebenfalls ein VGUI. Dem fügen wir das Attribut "Button" hinzu, damit man darauf klicken kann. Zudem setzen wir "Pan" zum Parent, damit sich der Button mit dem eigentlichen Menü mitbewegt. Danach setzen wir die Größe und die Inschrift ein. Die Position ist bei einem Parent immer relativ zum eigentlichen VGUI und nicht mehr absolut!

Weil der Button, wenn man das Menü verkleinert oder vergrößert, immer seine Position verändert, und damit man unser Menü nicht kleiner oder größer machen kann, fügen wir folgende Funktion ein (Die Funktion wird automatisch gehookt):

  1. function Pan:Think()
  2.     local xy = Pan:GetSize()
  3.     if xy != {200,200} then
  4. 	    Pan:SetSize( 200, 200 )
  5. 	end
  6.  
  7.     Button:SetPos( 5, 30 )
  8.  
  9. end

Zunächst wird die aktuelle Größe gespeichert und dann verglichen. Ist sie nicht mehr 200 und 200, dann wird das Menü automatisch wieder skaliert. Dann wird noch die Position des Buttons bestimmt.

Und jetzt geben wir dem Button noch seine Funktion:

  1. function Button:DoClick( )
  2.     LocalPlayer():ConCommand("give_player_health\n")
  3. end

Wenn wir den Button jetzt anklicken, wird das Concommand, das wir auf dem Server erstellt haben, aufgerufen (s.o.).

Fehlt nur noch die Funktion, um das VGUI sichtbar werden zu lassen:

  1. function open_test_vgui()
  2.  
  3.     Pan:SetVisible(true)
  4. end 
  5.  
  6. concommand.Add("open_test_vgui", open_test_vgui)

Das wird nun alles in die vguitest_client.lua gespeichert.

Zusätzliche Notizen

  • Würdet ihr nun einen Server aufmachen, damit andere Spieler euer Menü sehen können, werden diese es nicht sehen. Grund: Die anderen Spieler haben das Clientskript nicht. Mann muss es ihnen also noch schicken, aber dass könnt ihr ja irgendwie selbst übernehmen.
  • In einem Gamemode könntet ihr das Ganze mit init.lua und cl_init.lua verbinden.
  • Wer glaubt, man benötige noch die RES-Dateien, sollte sie vergessen.
  • Um VGUIs an Clienten senden zu können, müssen sie in einem serverseitigen Script an den Clienten gesendet werden.

Ergebnis

Ergebnis vgui tutorial.jpg