Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Geld für jeden getöteten Zombie

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

    Standard 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
    Geändert von Eddman (07.04.2013 um 18:40 Uhr) Grund: Code ergänzt

  2. #2

    Standard 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:
    Lua Code:
    1. hook.Add( "OnNPCKilled", "AddMoneyOnNPCKill", function( victim, killer, weapon ) <code> end )
    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
    Lua Code:
    1. victim:GetClass() == "<Entity name> //der Entity Name steht -eigentlich selbsterklärend- jeweils für den Namen des Entities, also [I]npc_headcrab[/I], [I]npc_antlion[/I]([I]guard[/I]), [I]npc_poisonzombie[/I] usw."
    einsetzen.

    Für Player=killer müsstest du
    Lua Code:
    1. killer:IsPlayer()
    einsetzen.

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


  4. #3
    Avatar von Eddman
    Registriert seit
    07.04.2013
    Ort
    Bayern

    Standard 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.
    Geändert von Eddman (07.04.2013 um 17:52 Uhr)

  5. #4
    Horst Avatar von minifisch
    Registriert seit
    02.09.2008
    Ort
    Österreich

    Standard 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
    Gruß
    minifisch

  6. Folgender Benutzer sagt Danke zu minifisch für den nützlichen Beitrag:


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

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

    Zitat Zitat von minifisch Beitrag anzeigen
    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

    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?
    Geändert von Eddman (07.04.2013 um 18:39 Uhr)

  8. #6

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

    1. 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.
    2. Wenn irgendwo eine Änderung vorgenommen werden soll, Änderung vorerst in seiner Table im Script durchführen.
    3. 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.
    4. 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-
    Geändert von RP-01 (07.04.2013 um 21:05 Uhr)

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


  10. #7
    Avatar von Eddman
    Registriert seit
    07.04.2013
    Ort
    Bayern

    Standard 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 :/

  11. #8

    Standard 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..
    Geändert von RP-01 (07.04.2013 um 21:11 Uhr)

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


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

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

    ahhh...! Ein typischer Anfängerfehler... 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.
    Geändert von Eddman (07.04.2013 um 21:45 Uhr)

  14. #10

    Standard 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).

Ä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
  •