Archiv verlassen und diese Seite im Standarddesign anzeigen : Vom Server aus Funktion beim Clienten aufrufen.
makkurona
20.01.2009, 20:20
Hallo!
Melde ich mich auch mal wieder nach kurzer Pause von LUA. Vielleicht leigts dadran, dass ich die Lösung nicht alleine auf die Reihe kriege? Nunja... Folgendes Problem:
Ich habe ein Ent, das bei Benutzung eine Funktion auf dem Clienten aufrufen soll. Dabei möchte ich zwei Tables als Parameter übergeben. Diese werden dann weiter verarbeitet und zu einem schönen Panel aufbereitet, dass der User, der das Event ausgelöst hat ( ENT:Use() ) angezeigt werden soll...
Aber ich krieg es irgendwie nicht auf die Reihe diese Server - Client Hierarchie verwirrt mich immer wieder... besonders, da ich andere Strukturen gewöhnt bin. ^^
Wahrscheinlich ist die Lösung wieder mal einfach. Falls ja, gebe ich euch die Erlaubnis an meinem Bein zu knabbern. Ich schmecke köstlich.
Öh wie jetzt?
Lua-Code?
Was soll er anzeigen, einfach nur 'n Text oder 'n Menü oder wie oder was?
makkurona
21.01.2009, 12:51
An sich "kreiert" der Code beim Client ein Menü... soweit die Theorie. Mir fehlt nunmal die Möglichkeit, eine Funktion beim Clienten auszuführen, der das Event ausgelöst hat. Wie gesagt, ein simples ENT:Use().
Das ist der Kern der Sache.
Ich denke was du erreichen willst ist, dass wenn jemand auf den Entity drückt auf den Client sich ein Menü öffnet?
Da der ENT:Use Hook nur Serverseitig its, wirst du um den Einsatz von Usermessages oder ConCommands nicht herum kommen.
Hier mal ein Einfaches Beispiel :
Server - Seite
function ENT:Use(activator,caller)
if activator:IsValid() && activator:IsPlayer() then
umsg.Start("OpenMyEntityMenu",activator)
umsg.String("Dummy") // Ich geb hier sozusagen nen Dummy Text durch,da ich gerade nicht genau weiß ob es möglich eine "Leere" usermessage einfach zum auslösen des Hooks senden kann
umsg.End()
end
end
Client - Seite
function OpenMenu(um)
// Hier wird dann dein Code sein um dein Menü zu öffnen..
end
usermessage.Hook("OpenMyEntityMenu",OpenMenu)
makkurona
21.01.2009, 13:45
Das wird ja komplizierter als ich dachte...Dann muss ich die Tables ja splitten und neu zusammensetzen.. *seufz* Ich hatte gehofft es gäbe einen einfacheren Weg... ^^
Nun denn, dann mache ich mich mal ans basteln. Vielen dank soweit!
Falls doch noch jemandem eine simple Methode einfällt, schreibt... ._.
Richtig,Die Table wirst du wohl in nen String zusammensetzen müssen,und dann auf dem Client wieder Auseinander nehmen.
Würde dann so aussehen:
Server:
function ENT:Use(activator,caller)
Table = {"Poop","Meow","Kitty","Cat"}
Table_String = string.Implode("|",Table) // Hier wird die Tabelle zu einen String zusammengefügt,und die einzelnen Werte mit "|" getrennt
umsg.Start("OpenMyEntityMenu",activator)
umsg.String(Table_String)
umsg.End()
end
Client:
function OpenEntityMenu(um)
Table = string.Explode("|",um:ReadString()) // Hier wird der String nach den Seperator "|" wieder auseinander "gebrochen".
end
usermessage.Hook("OpenMyEntityMenu",OpenEntityMenu)
Ich würde es ganz einfach über ne NWBool laufen lassen...
Entity.SetNWBool (http://wiki.garrysmod.com/wiki/?title=Entity.SetNWBool)
Entity.GetNWBool (http://wiki.garrysmod.com/wiki/?title=Entity.GetNWBool)
Wobei ich mir ne sicher bin wie Netzwerklastig die ständige Abfrage der NWBool in der Menü "Draw" Funktion ist.
makkurona
21.01.2009, 18:29
Dann müsste ich noch mindestens ein Networked String verwenden, um den Playernamen mitzugeben, der das Entity aktiviert hat. Sonst würde es ja jedem Spieler, der es gerade rendert angezeigt. ;D
Wieso?
bei ENT:Use() gibt es doch die Variablen die man noch abfragen kann wer das Teil aktiviert hat.
SERVER STUFF
// Variable um den Zeitraum festzulegen wann das ENT das nächste mal genutzt werden kann
local nextuse = 0
function ENT:Use( activator, caller )
// Ist nextuse größer der jetzigen Zeit so soll er nichts machen und zum Enden springen
if nextuse > CurTime() then return end
// Sollte das Menü schon aktiv sein so braucht er den neuen Status ja nicht mehr setzten ;)
if activator:GetNWBool( "EnableMenu" ) == true then return end
// ansonsten wird einfach der Status der Boolsche geändert
activator:SetNWBool( "EnableMenu", true )
// Das ENT darf nach 1sek wieder genutzt werden
nextuse = CurTime() + 1
end
Auf der Serverseite weist du dem Spieler beim 1. Spawnen auf dem Server
die "Networked Bool zu":
function Zuweisung( ply )
// Erstellen und Setzen des Status der Bool
ply:SetNWBool( "EnableMenu", false )
/*
"false" deswegen weil das Menu ja nicht gleich beim
ersten mal spawnen eröffnet werden soll ;)
*/
end
hook.Add( "PlayerInitialSpawn", "playerInitialSpawn", Zuweisung )
CLIENT STUFF
Auf der Client Seite lässt du das Menü Script laufen und fragst halt den Status
des Boolean ab.
Ist dieser auf "true" so wird das Menü gezeigt ist er auf "false"
so wird das Menü wieder versteckt.
function MyMenu()
if LocalPlayer():GetNWBool( "EnableMenu" ) == true then
// Menü anzeigen
else
// Menü verstecken
end
end
hook.Add( "HUDPaint", "DrawMyMenu", MyMenu )
Und in deinem Menü kannst ja einen Button machen der das Boolean wieder
auf false setzen.
// Buttoncode
mybutton.DoClick = function()
LocalPlayer():SetNWBool( "EnableMenu", false )
end
Ich hoffe das gibt dir 'n kleinen Überblick :)
Hab das so ausm Kopf geschrieben, sollte aber so direkt funktionieren, wenn du noch das Entsprechende Menü und Funktionen bastelst ;)
makkurona
21.01.2009, 20:10
Verstehe!
Ich hatte ganz vergessen, dass man auch Spielern Networked Vars zuordnen kann. Schande über mich.. ich gebe zu, ich bin nicht ganz auf der Höhe... Das macht das Wetter. Und die Schule. Vorallem die Schule.
Ich ziehe deine Version sogar den Umsg' vor. Mit Convars habe ich wengistens schonmal gearbeitet, und ich habe nicht das Problem mit den Hooks. Die habe ich zwar auch ohne probleme zum laufen gebracht (War ja auch ein schönes Beispiel dabei, danke nocheinmal an dieser Stelle.), aber COnvars sind mir trotzdem lieber. ^^
Alle Funktionen die was mit Entity zu tun haben kannst du auch beim Player anwenden,
da er ja auch ein Entity ist ;)
Vielleicht funktionieren nicht alle, aber der Großteil tut es.
Powered by vBulletin® Version 4.2.2 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.