Beiträge von sbx320

    Das Problem ist, dass du nur eine Variable für das Fahrzeug hast. Du brauchst aber pro Spieler eine Variable. Etwa so:

    MTA Server hatte ich grad nicht zur Hand. Aber eine Installation von Lua sollte sich eigentlich genauso verhalten:

    Lua
    _print = print
    
    
    function print(text)
    	return _print("print sagt: "..text)
    end
    
    
    print("Hallo Welt")

    Ausgabe der Konsole

    Code
    C:\Lua>lua C:\print_test.lua
    print sagt: Hallo Welt

    Nachtrag:
    Eine alternative Variante, an der man etwas besser erkennen kann wieso "print" überschrieben wird

    Lua
    _print = print
    
    
    print = function(text)
    	return _print("print sagt: "..text)
    end
    
    
    print("Hallo Welt")

    print selbst ist nichts anderes als eine Variable mit einem Verweis auf eine Funktion. Und die Variable print kann man beliebig, wie jede andere Variable ändern.

    Beispiel:

    Lua
    _setElementInterior = setElementInterior
    
    
    function setElementInterior ( element, int, x, y, z )
    	-- Beliebiger Code, z.B. das Triggern unseres Events:
    	triggerEvent ( "onPlayerInteriorChange", element )
    	-- Danach der Aufruf der eigentlichen Funktion
    	return _setElementInterior ( element, int, x, y, z )
    end

    Würde sich nicht selbst aufrufen.

    Die originale setElementInterior-Funktion (bzw. ein Verweis auf diese) ist nurnoch in _setElementInterior vorhanden. Der alte Verweis von "setElementInterior" wird überschrieben.

    Justus:
    Das "alte" wird ja überschrieben. function setPlayerMoney(player, money) entspricht ja setPlayerMoney = function(player, money). In unserem Fall wird die Variable "setPlayerMoney" auf eine eigene Funktion gesetzt. (Eventuell wird die Funktion dann vom Garbage Collector "eingesammelt", aber da bin ich mir sehr unsicher da ich den GC noch nicht wirklich verstanden habe.

    Zelnehlun:
    Bitte den Code der dazugehört posten. Das setElementHealth sollte soweit richtig sein.

    Und hier noch die Erklärung dazu wieso das nicht geht:

    Wenn ihr eine neue Funktion mit einem bereits existierendem Namen erstellt wird die alte überschrieben. Wenn ihr nun versucht die originale Funktion in euerer neuen Funktion aufzurufen wird nicht die gewünschte originale Funktion aufgerufen sondern die neue Funktion.
    Prinzipiell ruft die neue Funktion sich dann also selbst auf. Dies führt dann zu einer Endlosschleife die Lua irgendwann mit einem Stack Overflow abbricht.

    Wenn ihr eine Funktion überladen wollt, (zB bei setPlayerMoney das Geld direkt in eine Datenbank speichern) dann geht das folgendermaßen:

    Lua
    local setPlayerMoneyAlt = setPlayerMoney -- Funktion setPlayerMoney nach setPlayerMoneyAlt kopieren
    
    
    function setPlayerMoney(player, money) -- Neue Funktion definieren
    	savePlayerData(player, "pMoney", money) -- Funktion die zB das Geld speiechert
    	setPlayerMoneyAlt(player, money) -- Alte Funktion aufrufen und Geld setzen
    end

    onPlayerDamage wird nicht helfen.

    Zitat von http://wiki.multitheftauto.com/wiki/OnPlayerDamage

    It should also be noted that canceling this event has no effect. Cancel the client-side event onClientPlayerDamage instead.

    max93: Eventuell wird onClientPlayerDamage nicht aufgerufen, wenn der Schaden den Spieler direkt töten würde. Probier mal onClientPlayerWasted ebenfalls zu überprüfen.

    Nun dazu kannst du die Funktion von Justus folgendermaßen ergänzen:

    Lua
    function cancelDamage()
        if getElementHealth(getLocalPlayer()) <= 20.0 then 
    		cancelEvent()
    	end
    end
    addEventHander("onClientPlayerDamage", getLocalPlayer(), cancelDamage)

    Und wieso sollte jemand einen Hack verwenden um Schaden zu bekommen?

    Laut http://lua-users.org/wiki/GarbageCollectionTutorial markiert der Garbage Collector alle erreichbaren Objekte auf die von irgendwo hin verwiesen wird und löscht (bzw. gibt den entsprechenden Speicher frei) danach alle nicht-markierten Objekte. Soweit hoffe ich mal, dass ich das richtig verstanden habe.

    Jetzt stellt sich für mich die Frage wieso der GC mein "obj" nicht markiert. Es wird ja immernoch von "tollesObj" auf die Table "obj" verwiesen.

    Edit:
    Eben gerade habe ich noch etwas herumprobiert und bin danach auf die Lösung gekommen. "setTimer" übernimmt nicht die Table und gibt sie später 1 zu 1 wieder zurück, sondern kopiert die Table. Anscheinend werden dabei metatables ignoriert und nicht wieder gesetzt.

    Naja die entgültige Lösung war es einen Wrapper um den Timer zu basteln.

    Tockra:

    Lua
    local rankName = { ["Medic"] = { [1] = "Auszubildender", [2] = "Krankenwagenfahrer", [3] = "Assistenzarzt", [4] = "Arzt", [5] = "Chefarzt" } }
    local rankNameRanks = { ["Medic"] = { ["Auszubildender"] = 1, ["Krankenwagenfahrer"] = 2, ["Assistenzarzt"] = 3, ["Arzt"] = 4, ["Chefarzt"] = 5} }

    Die 2. Methode ist falsch, da du überall ein local hast.
    Richtig wär: (Die 2. Zeile ist auch überflüssig. Die Table erstellst du in der 3. Zeile durch { und })

    Lua
    local rankName ={}
    rankName["Medic"] = {[1] = "Auszubildender",[2] = "Krankenwagenfahrer",[3] = "Assistenzarzt",[4] = "Arzt",[5] = "Chefarzt"}



    @VioLeTTe/Marwin:

    Bei dir fehlt das end für die If-Bedingung. Nach setSoundVolume einfach noch ein end hinzufügen.

    @Wieso das Script von Kaito nicht funktioniert:

    Zitat von http://wiki.multitheftauto.com/wiki/GetVehicleOccupants

    Note: Don't use an ipairs loop with the table returned by this function. It will skip the driver, as ipairs starts at 1 and the driver seat is ID 0. And if there's an empty seat, ipairs will stop looping. Refer to the example for a way to get around this.

    @Funktion zum Überprüfen ob ein Fahrzeug besetzt ist
    Hab ich doch oben geschrieben :>

    Habs mir grad nochmal angeschaut.

    Andere Methode:

    Lua
    function isVehicleOccupied(vehicle)
    	local occupants = getVehicleOccupants(vehicle)
    	local seats = getVehicleMaxPassengers(vehicle)
    	for seat = 0, seats do
    		if occupants[seat] then return true end
    	end
    	return false
    end

    Und dann halt