Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Vom Server aus Funktion beim Clienten aufrufen.

  1. #1

    Standard Vom Server aus Funktion beim Clienten aufrufen.

    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.

  2. #2

    Standard AW: Vom Server aus Funktion beim Clienten aufrufen.

    Öh wie jetzt?

    Lua-Code?

    Was soll er anzeigen, einfach nur 'n Text oder 'n Menü oder wie oder was?

  3. #3

    Standard AW: Vom Server aus Funktion beim Clienten aufrufen.

    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.

  4. #4

    Standard AW: Vom Server aus Funktion beim Clienten aufrufen.

    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
    Lua Code:
    1. function ENT:Use(activator,caller)
    2.    if activator:IsValid() && activator:IsPlayer() then
    3.       umsg.Start("OpenMyEntityMenu",activator)
    4.       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
    5.       umsg.End()
    6.    end
    7. end

    Client - Seite
    Lua Code:
    1. function OpenMenu(um)
    2.    // Hier wird dann dein Code sein um dein Menü zu öffnen..
    3. end
    4. usermessage.Hook("OpenMyEntityMenu",OpenMenu)
    Geändert von BennyG (21.01.2009 um 14:00 Uhr)

  5. #5

    Standard AW: Vom Server aus Funktion beim Clienten aufrufen.

    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... ._.

  6. #6

    Standard AW: Vom Server aus Funktion beim Clienten aufrufen.

    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:
    Lua Code:
    1. function ENT:Use(activator,caller)
    2.    Table = {"Poop","Meow","Kitty","Cat"}
    3.    Table_String = string.Implode("|",Table)  // Hier wird die Tabelle zu einen String zusammengefügt,und die einzelnen Werte mit "|" getrennt
    4.    umsg.Start("OpenMyEntityMenu",activator)
    5.    umsg.String(Table_String)
    6.    umsg.End()
    7. end

    Client:
    Lua Code:
    1. function OpenEntityMenu(um)
    2.    Table = string.Explode("|",um:ReadString()) // Hier wird der String nach den Seperator "|" wieder auseinander "gebrochen".
    3. end
    4. usermessage.Hook("OpenMyEntityMenu",OpenEntityMenu)
    Geändert von BennyG (21.01.2009 um 14:02 Uhr)

  7. Folgender Benutzer sagt Danke zu BennyG für den nützlichen Beitrag:


  8. #7

    Standard AW: Vom Server aus Funktion beim Clienten aufrufen.

    Ich würde es ganz einfach über ne NWBool laufen lassen...

    Entity.SetNWBool
    Entity.GetNWBool


    Wobei ich mir ne sicher bin wie Netzwerklastig die ständige Abfrage der NWBool in der Menü "Draw" Funktion ist.

  9. #8

    Standard AW: Vom Server aus Funktion beim Clienten aufrufen.

    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

  10. #9

    Standard AW: Vom Server aus Funktion beim Clienten aufrufen.

    Wieso?

    bei ENT:Use() gibt es doch die Variablen die man noch abfragen kann wer das Teil aktiviert hat.


    SERVER STUFF

    Lua Code:
    1.  
    2. // Variable um den Zeitraum festzulegen wann das ENT das nächste mal genutzt werden kann
    3. local nextuse = 0 
    4.  
    5.  
    6. function ENT:Use( activator, caller )
    7.  
    8. // Ist nextuse größer der jetzigen Zeit so soll er nichts machen und zum Enden springen
    9. if nextuse > CurTime() then return end
    10.  
    11. // Sollte das Menü schon aktiv sein so braucht er den neuen Status ja nicht mehr setzten ;)
    12. if activator:GetNWBool( "EnableMenu" ) == true then return end
    13.  
    14. // ansonsten wird einfach der Status der Boolsche geändert
    15. activator:SetNWBool( "EnableMenu", true )
    16.  
    17.  
    18. // Das ENT darf nach 1sek wieder genutzt werden
    19. nextuse = CurTime() + 1
    20.  
    21. end



    Auf der Serverseite weist du dem Spieler beim 1. Spawnen auf dem Server
    die "Networked Bool zu":

    Lua Code:
    1. function Zuweisung( ply )
    2.  
    3. // Erstellen und Setzen des Status der Bool
    4. ply:SetNWBool( "EnableMenu", false )
    5.  
    6. /*
    7.     "false" deswegen weil das Menu ja nicht gleich beim 
    8.     ersten mal spawnen eröffnet werden soll ;)
    9. */
    10.  
    11. end
    12. 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.


    Lua Code:
    1.  
    2. function MyMenu()
    3.  
    4.     if LocalPlayer():GetNWBool( "EnableMenu" ) == true then
    5.         // Menü anzeigen
    6.     else
    7.         // Menü verstecken
    8.     end
    9.  
    10. end
    11.  
    12. hook.Add( "HUDPaint", "DrawMyMenu", MyMenu )


    Und in deinem Menü kannst ja einen Button machen der das Boolean wieder
    auf false setzen.


    Lua Code:
    1. // Buttoncode
    2. mybutton.DoClick = function()
    3.                        LocalPlayer():SetNWBool( "EnableMenu", false )
    4.                    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

  11. Folgender Benutzer sagt Danke zu Pac_187 für den nützlichen Beitrag:


  12. #10

    Standard AW: Vom Server aus Funktion beim Clienten aufrufen.

    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •