Das ändert leider auch nichts. Leider Immernoch das selbe Problem, hmmm
Druckbare Version
Woran könnte es wohl noch liegen, ich rätsel schon sehr lange und komm einfach nicht drauf :/
Mir ist gerade eingefallen warum. :D
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.
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 8) PS: Ich poste später ob es funktioniert hat
EDIT#2: Jetzt funktioniert es!! thx:up: 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>
<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.
Hier habe ich am Ende der Funktion GM:OnNPCKilled diesen Code hinzugefügt:
PS:Code:umsg.Start("moneyupdate")
umsg.Long(Money)
umsg.End()
Achso, hmm. Weisst du was ich abändern muss damit das nicht so ist? Oder ist das zu aufwendig :/? Ich werd mal überlegen.
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.
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.
argh, verdammt. erneut ein copy paste fehler... :bash: 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:(
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.*/
<shared.ini>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
...
--Hier habe ich die AddMoneyUpd_Srv() Func. hinzugefügt. Sie soll aufgerufen werden, wenn der Hook aktiviert wurde.
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?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)
[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 ;)
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*/
<shared.ini>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
--Hierdurch habe ich die alte Funktion AddMoneyUpd_Srv() ersetzt.
<init.lua>Code:
net.Receive( "addmoneyupdate_srv", function(len)
AddMoney(net.ReadLong())
end)
--Ist nötig um den Namen bekannt zu machen.
Ich bekomme folgenden Fehler:Code:util.AddNetworkString("addmoneyupdate_srv")
[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 !!! :up::up::up:
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.
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
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:
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 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.
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:
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
Dachte ich auch, aber beim Client ist der Wert der selbe wie beim Server ;) Auch mit meinem CodeZitat:
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:
Das wär echt nice! :)Zitat:
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.
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.