Ergebnis 1 bis 7 von 7

Thema: Lokale Gamemode-Funktionen verändern?

  1. #1

    Standard Lokale Gamemode-Funktionen verändern?

    Hallo!
    Ich möchte gerne wissen ob es irgendwie möglich ist über ein Addon die LimitReachedProcess Funktion zu verändern. Es soll kein Gamemode werden...

    Code:
    local function LimitReachedProcess( ply, str )
    
    	// Always allow in single player
    	if (SinglePlayer()) then return true end
    
    	local c = server_settings.Int( "sbox_max"..str, 0 )
    	
    	if ( ply:GetCount( str ) < c || c < 0 ) then return true end 
    	
    	ply:LimitHit( str ) 
    	return false
    
    end
    Danke im Voraus!

  2. #2

    Standard AW: Lokale Gamemode-Funktionen verändern?

    In wie fern möchtest du etwas ändern?

  3. #3

    Standard AW: Lokale Gamemode-Funktionen verändern?

    So solls in etwa aussehen:
    Code:
    local function LimitReachedProcess(pl, str)
    	local c = server_settings.Int("sbox_max"..str, 0)
    	
    	if (SinglePlayer() or pl:IsSuperAdmin() or (str != "npcs" and (pl:IsAdvanced() or pl:GetCount(str) < c or c < 0))) then return true end
    	
    	pl:LimitHit(str)
    	return false
    end
    "IsAdvanced" ist eine meiner eigenen Funktionen.
    LimitHit möchte ich auch noch verändern

    Es geht alles auch anders... Ich hatte das ganze Script schon fehlerfrei am Laufen aber durch ein Verändern dieser Funktionen wäre es noch besser.

  4. #4

    Standard AW: Lokale Gamemode-Funktionen verändern?

    So so,

    aber was soll dieses Script nachher bewirken?

    Es zeigt doch schon das Limit von etwas an...

  5. #5

    Standard AW: Lokale Gamemode-Funktionen verändern?

    Ich hatte nicht vor ne Liste zu machen mit dem was das Script hinterher (oder schon) kann
    Mal ganz grob: Es gibt eine Gruppe mit fortgeschrittenen Spielern welche über mehr Rechte verfügen. So können z.B. "normale" Spieler insgesamt nur fünf explosive props spawnen.

    Das heißt... Es gibt kein generelles Limit. Es gibt allgemeine Verbote und Limits für eine bestimmte Gruppe. Darum möchte ich diese Funktion geringfügig ändern... Scheint aber nicht möglich zu sein

  6. #6
    Avatar von aVoN
    Registriert seit
    23.04.2006
    Ort
    Hannover

    Standard AW: Lokale Gamemode-Funktionen verändern?

    Es gibt diverse Möglichkeiten:
    Um das zu erreichen, was du möchtest (Limits ändern) empfehle ich dir Player:GetCount zu überschreiben. Das verwende ich selber. Dort kann man dann aber nur "Limited" und "Unlimited" ändern indem man entweder die richtige Anzahl zurückgibt oder "0" (unlimited).

    Für dein vorhaben: Du brauchst eine Funktion, die global ist und LimitReachedProcess aufruft. Von dieser Funktion holst du dir die function enviroment (zeig ich gleich wies geht).
    Dann holst du dir aus diesem die gewünschte funktion (LimitReachedProcess).
    Jetzt kommt der spekulative Teil: Du definierst eine neue variable "LimitReachedProcess" und setzt einen pointer auf die zuvor aus den fEnv gewonnene Daten gefundene Funktion LimitReachedProcess und machst sie so global.
    Wenn mich nicht alles täuscht, kannst du nun versuchen, die funktion mit deiner eigenen zu überschreiben.

    Code:
    -- That's what you need to overwrite, but it's local - DUH!
    local function ALocalFunction()
    	-- NOT MY CODE
    end
    
    -- This is, what you have and can access
    function AGlobalFunction()
    	-- SOME CODE
    	local AResult = ALocalFunction; -- SOMEWHERE IS "ALocalFunction" USED
    	-- SOME OTHER CODE
    end
    
    -- Somewhere else in another lua file now...
    
    -- Your getting the fenv of "AGlobalFunction"
    local the_pointer_to_ALocalFunction;
    local gi = debug.getinfo(AGlobalFunction)
    for i=1,gi.nups do
    	local k,v = debug.getupvalue(AGlobalFunction,i)
    	if(k == "ALocalFunction") then
    		the_pointer_to_ALocalFunction = v;
    	end
    end
    
    -- We found the "LocalFunction", now make it global
    ALocalFunction = the_pointer_to_ALocalFunction;
    
    -- If everything works fine, the pointer of the ALocalFunction is now allocated to be global. Let's hope, overwriting the global will result in overwriting the local too...
    function ALocalFunction()
    	-- MY CODE
    end
    Das Verfahren hat zwei Schwachpunkte: 1. bin ich mir nicht sicher, ob der alleinige Aufruf einer Funktion diese automatisch in die function enviroment mit aufnimmt (eher nicht).
    2. Kann es (höchstwahrscheinlich) so sein, das local/global nicht auf pointer beschränkt sind. Soll heißen, du kannst eine lokale funktion auch global definieren (selber Pointer, nicht nur selber Name!), und trotzdem wird beim überschreiben der globalen die lokale erhalten bleiben.

  7. Folgender Benutzer sagt Danke zu aVoN für den nützlichen Beitrag:


  8. #7

    AW: Lokale Gamemode-Funktionen verändern?

    Danke aVoN!
    Ich habe meine alte Methode verbessert und verwende diese auch momentan... trotzdem werde ich das bestimmt noch mal brauchen

Berechtigungen

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