Geld für jeden getöteten Zombie
Hallo Welt!
Ich hoffe jemand hat ein wenig Zeit und Lust mir bei meinem kleinem Problem zu helfen.
Wie der Titel bereits sagt, möchte ich das der Spieler für jeden erlegten Zombie etwas Geld bekommt, die Menge des Geldes hängt davon ab welcher Zombie getötet wird. Für eine lächerliche Headcrab soll man natürlich weniger Geld bekommen als für einen Antilon Guard. Ich habe außerdem noch ein Fenster indem die aktuelle Geldmenge ausgegeben werden soll.
Ich denke ich benötige die Funktion GM:OnNPCKilled Da diese ja immer dann aufgerufen wird, wenn ein NPC sich verabschiedet. Ich dachte mir ich mach es so, brauche aber hilfe bei den stellen die ich mit rot markiert habe.
<init.lua>
Code:
local function GM:OnNPCKilled(victim,killer,weapon)
if victim == Headcrab and Player=killer then
AddMoney(5) --Addiert 5 zur Variable Money
elseif victim == Antilon Guard and Player=killer then
AddMoney(200)
end
end
--Ausgelöst durch drücken von F4 (Zum Öffnen des Fensters)
function GM:ShowSpare2(ply)
umsg.Start("Openup", PopUp01) umsg.End()
end
Was füge ich für Headcreab und Antilon Guard ein damit der Code tatsächlich funktioniert?:(
Wie realisiere ich es das die Aktion nur ausgelöst wird wenn ich selbst den Feind ausgeschaltet habe,
ich will ja nicht das ich Geld für Zombies bekomme die durch andere getötet wurden. Geht das so mit dem Code wie er da steht?
<shared.lua>
--Hier befinden sich meine beiden Funktionen AddMoney() und GetMoney()
Code:
Money = 0
function AddMoney(x)
Money = Money + x
print(x .." $ Hinzugefügt")
end
function GetMoney()
print(Money)
return Money
end
concommand.Add("getmoney", GetMoney)
Ich weiss nicht ob das mit dem Geld so hinhaut, ich denke eher nicht, da die Variable Money wahrscheinlich immer wieder den Wert 0 bekommt. Kann ich mein Vorhaben eigentlich so einfach lösen, oder bin ich gezwungen die Werte in Datenbanken zu speichern?
<cl_init.lua>
Das ist der Code für mein kleines Fenster das den aktuellen Geldstand anzeigt.
Code:
function PopUp01()
local ply = LocalPlayer()
local Fenster = vgui.Create("DFrame")
local Label01 = vgui.Create("DLabel",Fenster)
Fenster:SetPos(50,50)
Fenster:SetSize(100,300)
Fenster:SetTitle("Money")
Fenster:SetVisible(true)
Fenster:ShowCloseButton(true)
Fenster:SetDraggable(true)
Fenster:MakePopup()
Label01:SetPos(5,20)
Label01:SetSize(260,20)
Label01:SetColor(Color(255,255,255,255))
Label01:SetFont("default")
Label01:SetText( "Geld: " ..GetMoney() )
end
usermessage.Hook("Openup", PopUp01)
Ich hoffe wirklich sehr das mir jemand helfen kann. Ich wäre euch sehr dankbar ! ;)
-Eddman
AW: Geld für jeden getöteten Zombie
Wo soll dein Code denn hin? Soll der direkt in einen Gamemode implementiert sein, oder unabhänig implementirbar (z.B. im AddOn-Format) sein?
Ich würde dir empfehlen ein serverseitge Autorun-Datei (eine .lua DAtei in "lua/autorun/server") anzulegen, und dort deine OnNPCKilled-Funktion als Hook zu hinterlegen, in der Form:Add/GetMoney kommt dann in eine Datei, welche direkt in den autorun Ordner gelegt wird, und der Fenster-Kram in eine Datei innerhalb von autorun/client.
Für "victim == Headcrab/Antlion/etc." musst du einsetzen.
Für Player=killer müsstest du einsetzen.
AW: Geld für jeden getöteten Zombie
Hi RP-01. Vielen Dank für deinen hilfreiche Beitrag! :) so geht das also... Der Mod ist in einem eigenem Gamemode implementiert. Danke für deine Tipps, ich behalte es mir auf jedenfall im Hinterkopf. Kannst du dir mein "Money Problem" bitte auch mal kurz ansehen? Klappt das so wie ich es gemacht habe, oder bekommt die Variable dann immer einfach wieder den Wert 0 ? :-? Ich werds mal testen.
(PS: Gibt es hier eigentlich keinen Danke Button?)
Note: Bin noch ein ziemlicher Neuling im Lua Modden, habe erst vor einer Woche damit begonnen mich Intensiv mit LUA zu beschäftigen. Daher noch die Anfangsschwierigkeiten.
AW: Geld für jeden getöteten Zombie
Den Dankebutton bekommt man erst ab einer bestimmten Anzahl von Beiträgen (5, 10, keine Ahnung genau)
Bei jedem Serverneustart wird auf alle Fälle der Geldbetrag zurückgesetzt _und_ der Betrag ist nur Clientseitig verfügbar.
Du müsstest den Betrag auch auf dem Server für jeden Spieler einzeln speichern. Klappt anfangs gut mit der internen SQLite Datenbank von Garrys Mod - siehe http://wiki.garrysmod.com/page/Libraries/sql
AW: Geld für jeden getöteten Zombie
Zitat:
Zitat von
minifisch
Den Dankebutton bekommt man erst ab einer bestimmten Anzahl von Beiträgen
Wollte mich bei RP-01 bedanken, aber die werden schon Ihre Gründe dafür haben denke ich, auch wenn mir nicht einfällt welche :D
Danke für den Tipp mit SQLite. Aber vorerst genügt es mir vollkommen wenn der Betrag nach dem Verlassen des Spiels wieder 0 ist, erstmal kleine Kuchen backen.;) Werde ich mir aber als nächstes vornehmen. Hier der Aktuelle Stand:
<init.lua>
Code:
function GM:OnNPCKilled(victim,killer,weapon)
if victim:GetClass() == npc_zombie and killer:IsPlayer() then
AddMoney(25)
print("Zombie killed")
end
end
Ich habe jeweils eine Print Methode hingesetzt um zu testen ob es erkannt wird wenn ich einen Zombie vom Typ "npc_zombie" ins nirvana schick, aber in der Konsole erscheint nichts :?: Wenn ich mit meinem Konsolenkommando die Funktion GetMoney() Aufrufe steht dort auch immernoch 0 dort ? Weiss jemand was ich falsch gemacht habe?
AW: Geld für jeden getöteten Zombie
Ist so wie minifish es sagt, allerdings gibt es noch simplere Methoden das umzusetzen;
Pro Spieler der beitritt, wird z.B. in garrysmod/data/rp_data eine Datei mit seiner SteamID angelegt (Vorsicht, da die ID zwei ":" enthält. Am besten in allem verknüpften Code durch ein gleiches Zeichen ersetzen oder komplett entfernen.). Darin könntest du dann Sachen wie "money" oder allgemeine Daten und Statistiken abspeichern.
- Wenn ein Spieler joined, überprüfen ob er bereits eine Datei hat. Wenn nicht, neue Table für den Player im Script anlegen, alles auf 0/den Standardwert setzen und den Inhalt dann in die entsprechende Datei schreiben. Ansonsten nur die Daten auslesen, und in eine Tabelle im Script schreiben.
- Wenn irgendwo eine Änderung vorgenommen werden soll, Änderung vorerst in seiner Table im Script durchführen.
- Wenn ein Spieler leavt, oder wenn der Server ausgeschaltet/restarted wird (beides per Hook überprüfbar), aktuellen Inhalt der Tabelle(n) in Datei(en) schreiben.
- Um Datenverlust bei Crashes etc. vorzubeugen, im 10 bis 60 Sekundentakt Tabelleninhalte in Datei schreiben, sofern sich seit dem letzten Schreiben überhaupt etwas verändert hat. Muss oder sollte man auch nicht für jeden Spieler simultan machen. Man könnte z.B. alle 0,5s eine Datei aktualisieren.
Wenn du jetzt bei jeder Änderung einen Eintrag aus der SQL-Datenbank auslesen und wieder reinschreiben würdest bzw. die Datei auslesen und neu beschreiben würdest, wäre das bei vielen Kills innerhlab einer kurzen Zeitspanne (z.B. 7 Kills gleichzeitig durch eine Granate) sehr unperformant. 'Kannst natürlich auch die SQLite Datenbanken nach dem selben Prinzip verwenden.
Edit: -snip-
AW: Geld für jeden getöteten Zombie
Hi RP-01, danke ! :) Sehr ausführlich, das werde ich auf jeden fall zu Rate ziehen wenn ich das dann tatsächlich so mache. Ich habe mir auch schon zwei englische Tutorials dazu auf YT angesehen. Aber wie gesagt will ich erstmal kleine Kuchen backen und das ganze nur für den Singleplayer auslegen ;)
Naja erstmal muss ich es überhaupt hinbekommen das überhaupt was passiert. Ich bitte dich/euch meinen vorherigen Post mal anzusehen wenn Zeit & Lust. Ich komm immernoch nicht darauf warum das so nicht hinhaut :/
AW: Geld für jeden getöteten Zombie
Whoops, habe deinen vorherigen Beitrag übersehen.
Also zuerst mal muss npc_zombie in Anführungszeichen, also "npc_zombie", da GetClass() 'nen String ausgibt.
Und die Money-Funktionen geben bei mir serverseitig alles zurück, wenn ich das Zeugs über lua_run aufrufe. Und Clientside, wenn ich es direkt mit if CLIENT then <> end in einer Datei aufrufe.
lua_run_cl scheint momentan nicht zu funktionieren, da ich durch den Command rein gar nichts mehr ausführen kann..
AW: Geld für jeden getöteten Zombie
ahhh...! Ein typischer Anfängerfehler... :bang: Danke!!
Die Sache mit dem Money ist auch fast gelöst.
Es gibt nur noch ein Problem, wenn ich einen Zombie kill, bekomme ich 20 $, der Konsolenkommand getmoney hat bestätigt das diese auch erfolgreich hinzugefügt wurden.
Aber wenn ich das Fenster öffne steht dort immernoch das ich 0 $ habe? hmm, ich schau mir das mal genauer an.
AW: Geld für jeden getöteten Zombie
Dann mach mal local Money = 0 (lokale Variable) in der 1. Zeile, anstatten von Money = 0 (globale Variable).