Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: Geld für jeden getöteten Zombie

  1. #11
    Avatar von Eddman
    Registriert seit
    07.04.2013
    Ort
    Bayern

    Standard AW: Geld für jeden getöteten Zombie

    Zitat Zitat von RP-01 Beitrag anzeigen
    Dann mach mal local Money = 0 (lokale Variable) in der 1. Zeile, anstatten von Money = 0 (globale Variable).
    Das ändert leider auch nichts. Leider Immernoch das selbe Problem, hmmm

  2. #12
    Avatar von Eddman
    Registriert seit
    07.04.2013
    Ort
    Bayern

    Standard AW: Geld für jeden getöteten Zombie

    Woran könnte es wohl noch liegen, ich rätsel schon sehr lange und komm einfach nicht drauf :/

  3. #13

    Standard AW: Geld für jeden getöteten Zombie

    Mir ist gerade eingefallen warum.

    Der Hook OnNPCKilled wird nur serverseitig ausgeführt, und somit wird auch die Funktion AddMoney nur serverseitig aufgerufen. Was du in deinem Code nun also tust, ist folgendes: Du führst bei der Tötung eines Zombies AddMoney(20) serverseitig aus, womit die Variable Money auch nur serverseitig geändert (um 20 vergrößert) wird. Danach gehst du in deinem clientside Code hin, und rufst für das GUI die variable Money auf, welche dann allerdings immer noch auf 0 steht, da du sie nur serverseitig geändert hast, nie aber clientseitig (Du rufst in dem CS Code die CS Variable Money auf).

    Ergo: Du musst die Variable Money nach Veränderung vom Server zum Client senden, damit du auch den aktuellen, serverseitig errechneten Wert beim Client hast.

    Das könntest du entweder mit dem neuen net-Modul von GMod 13 realiseren, oder mit den älteren, aber etwas simpleren Usermessages.

    Und noch ein Hinweis: Wenn du jetzt mehrere Clients (auch Bots zählen als solche) auf dem Server hast, wird nach deinem bisherigen Code einfach alles zusammenaddiert und jeder hat letztendlich den selben Wert in Money stehen.


    Edit: Wäre übriegns cool, wenn du hier mal verifizieren könntest, dass du GMod auch wirklich besitzt.
    Geändert von RP-01 (08.04.2013 um 22:25 Uhr)

  4. Folgender Benutzer sagt Danke zu RP-01 für den nützlichen Beitrag:


  5. #14
    Avatar von Eddman
    Registriert seit
    07.04.2013
    Ort
    Bayern

    Standard AW: Geld für jeden getöteten Zombie

    Ahh, so geht das also ! Hört sich logisch an, ich teste es später mal gleich und berichte dann.Thx für die Hilfe

    PS: Ich wollte mich bereits verifizieren, aber es ist fehlgeschlagen weil ich kein öffentliches Profil habe, muss später mal schauen wie ich es öffentliche mache dann tue ich es aufjedenfall

    EDIT#1: Bin nun ein verifizierter GMOD Nutzer PS: Ich poste später ob es funktioniert hat

    EDIT#2: Jetzt funktioniert es!! thx Habe es über usermessage gelöst, da mir leider nicht bekannt ist, wie ich es mit dem Net-Modul lösen kann. Hier mein Code falls jemand anderes mal das selbe Problem hat
    <cl_init.lua>
    Code:
    function UpdateMoney(data)
    	Geld = data:ReadLong()
    	return Geld
    end
    usermessage.Hook("moneyupdate", UpdateMoney)
    
    function GetGeld()
    	return Geld
    end
    --Beim Button muss die Funktion GetMoney() mit der neuen Funktion GetGeld() ersetzt werden.
    <init.lua>
    Hier habe ich am Ende der Funktion GM:OnNPCKilled diesen Code hinzugefügt:

    Code:
    umsg.Start("moneyupdate") 
         umsg.Long(Money)
    umsg.End()
    PS:
    Zitat Zitat von RP-01 Beitrag anzeigen
    Und noch ein Hinweis: Wenn du jetzt mehrere Clients (auch Bots zählen als solche) auf dem Server hast, wird nach deinem bisherigen Code einfach alles zusammenaddiert und jeder hat letztendlich den selben Wert in Money stehen.
    Achso, hmm. Weisst du was ich abändern muss damit das nicht so ist? Oder ist das zu aufwendig :/? Ich werd mal überlegen.
    Geändert von Eddman (09.04.2013 um 22:05 Uhr)

  6. #15

    Standard AW: Geld für jeden getöteten Zombie

    Du solltest die Zeile usermessage.Hook("moneyupdate", UpdateMoney) in den clientside Code verschieben, damit das nachher mit mehreren Clients auch funktioniert. Dass das so im SS Code überhaupt geht, ist eigentlich mehr oder weniger ein Zufall/Bug. Die Datenübertragung dauert aus irgend einem Grund auch länger, und außerdem entspricht es eigentlich nicht der Art und Weise, wie man die Funktion verwenden sollte.

    Zitat Zitat von Eddman Beitrag anzeigen
    Achso, hmm. Weisst du was ich abändern muss damit das nicht so ist? Oder ist das zu aufwendig :/? Ich werd mal überlegen.
    Willst du, dass das Geld nur für eine Sitzung jeweils behalten, oder irgendwo dauerhaft für jeden Spieler gespeichert wird? Im Prinzip könntest du auch zuerst ersteres machen, und letzters darauf aufbauen.

  7. Folgender Benutzer sagt Danke zu RP-01 für den nützlichen Beitrag:


  8. #16
    Avatar von Eddman
    Registriert seit
    07.04.2013
    Ort
    Bayern

    Terminal AddMoney() Button

    argh, verdammt. erneut ein copy paste fehler... vermutlich wollte ich es später verschieben und habe es vergessen... tut mir wirklich sehr leid, ich werde in zukunft alles doublechecken bevor ich es rüberkopiere

    Zitat Zitat von RP-01 Beitrag anzeigen
    Willst du, dass das Geld nur für eine Sitzung jeweils behalten, oder irgendwo dauerhaft für jeden Spieler gespeichert wird? Im Prinzip könntest du auch zuerst ersteres machen, und letzters darauf aufbauen.
    Vorerst soll das Geld nur für diese Sitzung gespeichert werden, ich werde aber später eine Funktion schreiben die die Variablen bei jeder Veränderung gleich in eine Textdatei speichert, damit ich meine Variablen beim nächsten Start mit den Werten initialisieren kann.

    __________________________________________________ ______________________________________________


    EDIT: Nun habe ich leider wieder ein Problem. Ich hatte vor den umgekehrten Weg ebenfalls zu probieren, also Variablenwerte vom Clienten zum Server schicken. Ich habe mir hierfür einen zweiten Button "btn02" angelegt, der bei Betätigung den Wert der Variable "Geld" (äquivalent zu "money" für den Client) um eins inkrementiert.

    <cl_init.lua>
    /*Ich habe der function AddGeld() die Fettgedruckten Codezeilen hinzugefügt, damit werden laut meiner Vermutung die Daten zur <shared.ini> gesendet (da hier der entsprechende Hook liegt), wo sich die Variable "money" befindet die aktualisiert werden soll.*/
    Code:
    function AddGeld(x)
            Geld = Geld + x
    --Der Wert von x wird mit folgendem Code meiner Vermutung nach zur <shared.lua> geschickt, da dort der entsprechende hook liegt                      
    	umsg.Start("addmoneyupdate_srv")
    		umsg.Long(x)  
    	umsg.End()
    end
    
    --FENSTER MIT BUTTON -  (für die Erklärung als unwichtig befundener Code wurde weggelassen)
            ...
    	btn02:SetText("+1$")
    	btn02.DoClick = 
    		function(btn02)
                        AddGeld(1)   --Die selbe Funktion wie AddMoney() nur eben für den Client, addiert 1 zur Variable Geld.
    		end
            ...
    <shared.ini>
    --Hier habe ich die AddMoneyUpd_Srv() Func. hinzugefügt. Sie soll aufgerufen werden, wenn der Hook aktiviert wurde.
    Code:
    	
    function AddMoneyUpd_Srv(data)
    	
          AddMoney(data:ReadLong())  --Der Wert x wird empfangen und gleich in die Funktion AddMoney() als Parameter eingefügt.
    		
          print(data:ReadLong().."$ wurden eben vom Server empfangen und zu money addiert.") --Ausgabefunktion
    end
    usermessage.Hook("addmoneyupdate_srv", AddMoneyUpd_Srv)
    Aber leider bekomme ich folgende Fehlermeldung, weiss jemand wieso? Kann ich dies überhaupt so lösen, oder handelt es sich hierbei um ein Verständnisproblem?

    [ERROR] gamemodes/test/gamemode/cl_init.lua:19: attempt to index global 'umsg' (a nil value)
    1. AddGeld - gamemodes/test/gamemode/cl_init.lua:19
    2. DoClick - gamemodes/test/gamemode/cl_init.lua:108
    3. unknown - lua/vgui/dlabel.lua:206

    PS: Sorry wenn ich ein wenig nerven sollte mit meinen ständigen Hilfegesuchen, aber ich denke wenn ich diesen Schritt verstanden habe, bin ich schonmal einen großen Schritt weiter
    Geändert von Eddman (09.04.2013 um 23:09 Uhr) Grund: Anschaulicher gemacht

  9. #17
    Avatar von Eddman
    Registriert seit
    07.04.2013
    Ort
    Bayern

    News GELÖST!

    Kann es sein das umsg.Start() nur dafür gedacht ist Daten vom Server zu den Clients zu schicken? Falls ja, wie könnte ich es dann lösen? Geht es vielleicht mit den net-Modulen?

    Edit: Ja es geht mit dem net-Modul. Das hier müsste meine Lösung sein, ich werde es mal versuchen. http://maurits.tv/data/garrysmod/wik...index6a83.html

    Edit2: Maaaaan, was mache ich nur andauernd falsch ??! Hier mein zweiter Anlauf mit dem Net Modul... Alles ausser folgendem fettgedruckten ist gleich.


    <cl_init.lua>
    /*Ich habe der function AddGeld() die Fettgedruckten Codezeilen hinzugefügt*/
    Code:
    function AddGeld(x)
            Geld = Geld + x
    --Der Wert von x wird mit folgendem Code meiner Vermutung nach zur <shared.lua> geschickt, da dort der entsprechende hook liegt                      
    		net.Start( "addmoneyupdate_srv")
    			net.WriteLong(x)
    		net.SendToServer()
    end
    <shared.ini>
    --Hierdurch habe ich die alte Funktion AddMoneyUpd_Srv() ersetzt.
    Code:
    	
    net.Receive( "addmoneyupdate_srv", function(len)         
    
    	AddMoney(net.ReadLong())
    	
    end)
    <init.lua>
    --Ist nötig um den Namen bekannt zu machen.
    Code:
    util.AddNetworkString("addmoneyupdate_srv")
    Ich bekomme folgenden Fehler:


    [ERROR] gamemodes/test/gamemode/cl_init.lua:27: attempt to call field 'WriteLong' (a nil value)
    1. send - gamemodes/test/gamemode/cl_init.lua:27
    2. AddGeld - gamemodes/test/gamemode/cl_init.lua:20
    3. DoClick - gamemodes/test/gamemode/cl_init.lua:114
    4. unknown - lua/vgui/dlabel.lua:206


    EDIT3: Ursache gefunden. Es war nicht mein Fehler, sondern der von den Entwicklern des NetModuls. WriteLong wird nicht erkannt, was man auch daran erkennt das es nicht Lila wird wenn man "net.WriteLong" schreibt. Es bleibt einfach schwarz. Als ich stattdessen testweise net.WriteFloat() sowie net.ReadFloat() verwendete funktionierte es tadellos.

    Ich möchte mich hiermit nochmals herzlichst an RP-01 bedanken der mir hierbei sehr viel geholfen hat das ganze zu verstehen. Dankeschön !!!
    Geändert von Eddman (10.04.2013 um 15:50 Uhr) Grund: Dankeschön RP-01

  10. #18

    Standard AW: GELÖST!

    Zitat Zitat von Eddman Beitrag anzeigen
    Kann es sein das umsg.Start() nur dafür gedacht ist Daten vom Server zu den Clients zu schicken? Falls ja, wie könnte ich es dann lösen? Geht es vielleicht mit den net-Modulen?
    Die Usermessages sind generell nur um vom Server zum Client zu senden. In GMod 12 gab es damals das datastream-Modul, was jetzt durch's net-Modul ersetzt wurde, welches schlichtweg besser strukturiert ist und effizienter und schneller arbeitet.


    Zitat Zitat von Eddman Beitrag anzeigen
    EDIT3: Ursache gefunden. Es war nicht mein Fehler, sondern der von den Entwicklern des NetModuls. WriteLong wird nicht erkannt, was man auch daran erkennt das es nicht Lila wird wenn man "net.WriteLong" schreibt. Es bleibt einfach schwarz. Als ich stattdessen testweise net.WriteFloat() sowie net.ReadFloat() verwendete funktionierte es tadellos.
    Also eigentlich funktioniert das tadellos, und was durch net.WriteLong gesendet wird, ist auch auf der jeweils anderen Seite durch net.ReadLong abrufbar. Ansonsten ist es auch völlig Ok die Float-Funktionen zu nutzen, da die gerade bei Anwendung von Kommazahlen vom Algorithmus her optimiert sind.

    Ansonsten gehört
    Lua Code:
    1. net.Receive( "addmoneyupdate_srv", function(len)         
    2.  
    3. 	AddMoney(net.ReadLong())
    4.  
    5. end)
    nicht in shared, sondern in die Server-Umgebung. Der Wert soll ja schließlich nur beim Server draufgeschlagen werden, und nicht noch mal bei'm Client. Die einzig richtige Methode für shared wäre, wenn du es so schreibst:
    Lua Code:
    1. net.Receive( "addmoneyupdate_srv", function(len)         
    2.  
    3. 	if SERVER then AddMoney(net.ReadLong()) end
    4.  
    5. end)

    Außerdem hast du mit dem Code jetzt noch nicht das Problem gelöst, dass jeder Spieler sein eigenes Geld dort stehen hat. So wie ich das dem jetzigen Stand nämlich entnehmen kann, wird alles Geld was die Spieler erkillen auf dem Server zusammen addiert. Zudem ist es kein Gute Idee, solche Daten vom Client zum Server zu senden. Wenn sich einer den Quellcode ansieht, könnte er einfach per Skript oder lua_run_cl
    Lua Code:
    1. net.Start( "addmoneyupdate_srv") net.WriteLong(898757558) net.SendToServer()
    ausführen, und hätte ruckzuck 898757558 mehr an Geld.

    Du hättest es sollen nach wie vor über den OnNPCKilled-Hook serverseitig machen, für jeden aktiven Spieler 'nen extra Table-Eintrag in einer Variable innerhalb von init.lua erstellen, und den Wert nach Veränderung oder wie in diesem Post beschrieben anschließend zum Client senden.

    Wenn ich morgen früh in der Schule Zeit habe, kann ich dir den Code mal eben schnell zusammenschreiben. Als Orientierung wie's richtig geht.
    Geändert von RP-01 (10.04.2013 um 21:15 Uhr)

  11. Folgender Benutzer sagt Danke zu RP-01 für den nützlichen Beitrag:


  12. #19
    Avatar von Eddman
    Registriert seit
    07.04.2013
    Ort
    Bayern

    Standard AW: Geld für jeden getöteten Zombie

    Außerdem hast du mit dem Code jetzt noch nicht das Problem gelöst, dass jeder Spieler sein eigenes Geld dort stehen hat. So wie ich das dem jetzigen Stand nämlich entnehmen kann, wird alles Geld was die Spieler erkillen auf dem Server zusammen addiert. Zudem ist es kein Gute Idee, solche Daten vom Client zum Server zu senden. Wenn sich einer den Quellcode ansieht, könnte er einfach per Skript oder lua_run_cl
    Hmm, Jetzt wo du es sagst, stimmt. Thx für die info! Das mit lua_run ist ja fies :-? Die einzige Möglichkeit die mir momentan dagegen einfällt ist, den Quellcode zu verschlüsseln nachdem er Fertiggestellt ist. Aber bin natürlich für Alternativvorschläge offen.

    Ansonsten gehört nicht in shared, sondern in die Server-Umgebung. Der Wert soll ja schließlich nur beim Server draufgeschlagen werden, und nicht noch mal bei'm Client. Die einzig richtige Methode für shared wäre, wenn du es so schreibst:
    Dachte ich auch, aber beim Client ist der Wert der selbe wie beim Server ;) Auch mit meinem Code

    Wenn ich morgen früh in der Schule Zeit habe, kann ich dir den Code mal eben schnell zusammenschreiben. Als Orientierung wie's richtig geht.
    Das wär echt nice! :)
    Geändert von Eddman (11.04.2013 um 10:54 Uhr)

  13. #20

    Standard AW: Geld für jeden getöteten Zombie

    Zitat Zitat von Eddman Beitrag anzeigen
    Hmm, Jetzt wo du es sagst, stimmt. Thx für die info! Das mit lua_run ist ja fies Die einzige Möglichkeit die mir momentan dagegen einfällt ist, den Quellcode zu verschlüsseln nachdem er Fertiggestellt ist. Aber bin natürlich für Alternativvorschläge offen.
    Zitat Zitat von RP-01 Beitrag anzeigen
    Du hättest es sollen nach wie vor über den OnNPCKilled-Hook serverseitig machen, für jeden aktiven Spieler 'nen extra Table-Eintrag in einer Variable innerhalb von init.lua erstellen, und den Wert nach Veränderung oder wie in diesem Post beschrieben anschließend zum Client senden.

    Zitat Zitat von Eddman Beitrag anzeigen
    Das wär echt nice!
    Um ehrlich zu sein, bin ich gerade viel zu faul für sowas. Wenn du dich allerdings selbst ran machst, bringt's dir eh mehr und ich kann dir auch gerne weiterhin sagen, was jeweils falsch ist oder was besser gemacht werden könnte.

Ähnliche Themen

  1. 3D Brille (jetzt mit Anleitung / für jeden Monitor)
    Von pjanfred im Forum Computer & Konsolen Spiele
    Antworten: 104
    Letzter Beitrag: 13.08.2010, 13:33
  2. Geld im Internet [NO FAKE]
    Von dominic im Forum Allgemeine Diskussionen
    Antworten: 7
    Letzter Beitrag: 14.06.2010, 21:18
  3. Brauche schnell Geld!
    Von DMGaina im Forum Archiv
    Antworten: 21
    Letzter Beitrag: 03.04.2008, 19:00
  4. gm_construct2 für jeden!
    Von monky2k6 im Forum GMod Allgemein
    Antworten: 5
    Letzter Beitrag: 13.01.2008, 14:36
  5. Irgend wann, erwischt es jeden.
    Von happy im Forum Ragdolls
    Antworten: 5
    Letzter Beitrag: 26.10.2007, 16:12

Berechtigungen

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