Schatzkistenbau

Die bereits entwickelte Funktion habe ich mit etwas Comfort ausgestattet. Fragen? Dann KLICK

Diese Funktion benötigt den Trigger-Fix, um richtig zu funktionieren.

Sinn der Funktion ist, ganz einfach eine Schatzkiste mit beliebigem Inhalt zu erzeugen. Man braucht nur noch diese Funktion Aufgerufen mit (besser nicht)

 	CreateChestRobert(_position,_opener,_entity, _glanz, _good,_amount,_range,_sound,_distance,_playerId, _callback, _replace)

(besser das)
Wem das zu unübersichtlich ist kann auch diesen Code kopieren, irgendwo abspeichern und bei Gebrauch nehmen.
Anschließen das ausfüllen was man will und den Rest einfach raus schneiden.

	local entry = { position =  ,
					opener   =  ,  -- wer soll das öffnen können. Bei mehreren ein table --> {"Dario","Serf1"}
					entity   =  ,  -- wer soll den Schatz verbergen
					glanz    =  ,  -- soll der Schatz glänzen --> irgendetwas reinschreiben irgendeine Zahl oder true
					good     =  ,  -- Was soll gegeben werden
					amount   =  ,  -- wieviel davon
					range    =  ,  -- Zufallsgrenze
					sound    =  ,  -- Ein anderer Sound? z.B Sounds.Military_SO_Fireworks
					distance =  ,  -- Wenn es etwas größeres ist, sollte hier eine größere Zahl stehen
					playerId =  ,  -- Wem soll das gehören. ID eingeben sonst ist das vom Spieler
                    callback =  ,  -- Wenn vorhanden, wird diese Funktion aufgerufen
                    replace  =  ,  -- Wie soll das geöffnete Entity aussehen
					}
	CreateChestRobert(entry) 
 
                                        -- Die Kommas sind wichtig!
Parameter
_position oder
position
Klar wohin das Ganze
_opener oder
opener
Wer soll das öffnen können.
Entweder ein String mit dem Namen
z.B. „Dario“
oder ein Table mit mehreren Namen
z.B {„Dario“,„Serf1“}

Es muß kein Hero sein. Ein Gebäude wäre aber Sinnlos, das kann ja nicht laufen.
Auf der anderen Seite, ist der Schatz z.B ein Hero oder Serf und der Opener ein Gebäude, so wird der Schatz gefunden wenn der Hero oder Serf in der Nähe des Gebäudes ist. An die distance denken. Gebäude sind groß.
_entity oder
entity
Wenn man etwas anderes als Schatz haben will als die Kiste kommt das hier rein.
Das kann sein, was das Herz begehrt; Haus, Baum, Serf, egal was.
_glanz oder
glanz
Wenns glänzen soll hier etwas rein, irgendeine Zahl reicht.
Keine Angst wenns läuft, dann läuft der Glanz mit.
_good oder
good
Hier kommt rein was man in die Kiste tun will.
Holz,Eisen,u.s.w.
Man kann aber auch etwas beliebiges rein tun z. B. ein Schlüssel soll gefunden werden.
Dann sollte hier stehen : „eine Schatzkiste mit einem Schlüssel“
Jetzt findet der Chestopener auch den Schlüssel. Das letzte Wort in der Zeile wird gelb geschrieben.
_amount oder
amount
Hier kommt rein wieviel man von dem Vorherigen reintun will
_range oder
range
Wenn der Zufall entscheiden soll kommt eine Zahl hier hinein
z.B 1000 dann wird 100 bis 1000 vom Ausgewählten gegeben.
_sound oder
sound
Wenn etwas anderes ertönen soll als die Fanfare kommt das hier herein.
z.B. Sounds.Military_SO_Fireworks
_playerId oder
playerId
Wem soll das gehören. Wird nichts eingegeben ist das vom Spieler.

Wäre ganz lustig wenn es der Feind ist und unsere Kameraden machen es platt, dann ist auch der Schatz weg. Oder unsere Serfs schlagen eine Baum der der Schatz war. Schade. Der Glanz erinnert daran, daß man etwas hätte haben können.
_callback oder
callback
Dies ist eine Funktion, die nach dem Öffnen aufgerufen wird (optional)
_replace oder
replace
Welches Entity soll nach dem Öffnen vorhanden sein.

Rückgabe der Funktion ist der Name des Schatzes

Wichtig ist auch wie immer bei lua wenn ich irgendwo hinten etwas eingeben will, so muß davor mindestens nil stehen. Oder den Code oben Kopieren.

Das hier muß niemand verstehen nur oben das. Einfach kopieren und rein ins Script.
Zum Üben ist es aber gut zu schauen, wie haben die das gemacht.

--#########################################################################
--###
--###    Comfort Chest-Function
--###    Version 1.01
--###    Author: Robert (1.00)
--###    reworked by: Old McDonald (1.01), dem der Autor Dank bezeugt.
--###
 
function LaufGlanz(_table)
    assert(type(_table) == "table");
 
    local deleted = {};
    local moveCount = table.getn(tChestRobert.movingSave);
    if moveCount == 0 then
        tChestRobert.movingSave.job = false;
        return true;
    end
 
    _table.tenthseconds = (_table.tenthseconds or 1) + 1;
    if _table.tenthseconds == 2 then
        _table.tenthseconds = 0;
        for i = 1, moveCount do
            if Logic.IsEntityMoving(tChestRobert.movingSave[i].name) then
                SetPosition(tChestRobert.movingSave[i].glanz, GetPosition(tChestRobert.movingSave[i].name));
            else table.insert(deleted, i);
            end
        end
 
        for i = 1, table.getn(deleted) do
            table.remove(tChestRobert.movingSave, deleted[i]);
        end
    end
end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function CreateChestRobert(_position,_opener,_entity, _glanz, _good,_amount,_range,_sound,_distance, _playerId, _callback, _replace)
    if type(_position.position)=="table" then
        _opener   = _position.opener
        _entity   = _position.entity
        _glanz    = _position.glanz
        _good     = _position.good
        _amount   = _position.amount
        _range    = _position.range
        _sound    = _position.sound
        _distance = _position.distance 
        _playerId = _position.playerId 
        _callback = _position.callback
        _replace  = _position.replace
        _position = _position.position
    end
    _playerId =_playerId or GUI.GetPlayerID()
    _distance = _distance or 300
    _callback = _callback or function() end;
    tChestRobert = tChestRobert or {};
 
    assert(type(_position)=="table", "Die Position fehlt")
 
    assert(type(_opener)=="number" or type(_opener)=="string" or type(_opener)=="table", "Ohne Öffner nutzt keine Kiste etwas")
    tChestRobert.count = (tChestRobert.count or 0) + 1;
    local name  = "name"..tChestRobert.count
    local glanz = _glanz and "glanz"..tChestRobert.count or nil;
 
    if type(_opener)=="string" or type(_opener) == "number" then 
        _opener = {_opener} 
    end
 
    if _glanz then
        CreateEntity(_playerId,Entities.XD_Sparkles,_position,glanz) 
    end
 
    if not _entity then
        _entity = Entities.XD_ChestClose
    end
 
    table.insert(tChestRobert,{name = name,position = _position,opener = _opener,glanz = glanz,entity = _entity,good = _good,amount = _amount,range = _range,sound = _sound,distance = _distance, callback = _callback, replace = _replace})
    CreateEntity(_playerId,_entity,_position,name)
 
    if not tChestRobert.job then
        tChestRobert.job = StartSimpleJob("ChestRobert");
    end
 
    return name
end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function ChestRobert()
    local deleted = {};
    local chestCount = table.getn(tChestRobert);
    if chestCount == 0 then
        tChestRobert.job = false;
        return true;
    end
    for i = 1, chestCount do
        if not IsDead(tChestRobert[i].name) then
            if Logic.IsEntityMoving(tChestRobert[i].name) and tChestRobert[i].glanz then
                tChestRobert.movingSave = tChestRobert.movingSave or {};
                if not tChestRobert.movingSave.job then
                    tChestRobert.movingSave.job = StartSimpleHiResJob("LaufGlanz", {});
                end
                table.insert(tChestRobert.movingSave, { name = tChestRobert[i].name, glanz = tChestRobert[i].glanz });
            end
            for j = 1, table.getn(tChestRobert[i].opener) do
                if IsNear(tChestRobert[i].opener[j],tChestRobert[i].name,tChestRobert[i].distance) then
                    if tChestRobert[i].glanz then 
                        DestroyEntity(tChestRobert[i].glanz) 
                    end
 
 
                    if tChestRobert[i].replace then
                        ReplaceEntity(tChestRobert[i].name, tChestRobert[i].replace);
                    elseif tChestRobert[i].entity == Entities.XD_ChestClose then
                        ReplaceEntity(tChestRobert[i].name,Entities.XD_ChestOpen)
                    end
 
                    chestCallback(tChestRobert[i].opener[j],tChestRobert[i].good,tChestRobert[i].amount,tChestRobert[i].range,tChestRobert[i].sound, tChestRobert[i].callback)
                    table.insert(deleted, i);
                end
            end
        else
            if tChestRobert[i].glanz then 
			    DestroyEntity(tChestRobert[i].glanz);
			end
            table.insert(deleted, i);
        end
    end
 
    for i = 1, table.getn(deleted) do
        table.remove(tChestRobert, deleted[i]);
    end
end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function chestCallback(_opener,_good,_amount,_range,_sound, _callback)
    local cText
    local nBeginn
    local tGood={{"Holz"      ,function() AddWood  (_amount) end},
                 {"Lehm"      ,function() AddClay  (_amount) end},
                 {"Eisen"     ,function() AddIron  (_amount) end},
                 {"Schwefel"  ,function() AddSulfur(_amount) end},
                 {"Steinen"   ,function() AddStone (_amount) end},
                 {"Talern"    ,function() AddGold  (_amount) end},
                 {""          ,function()                    end},
                };
    if type(_good) == "string" then
        if     string.upper(_good)=="HOLZ"     then _good=1
        elseif string.upper(_good)=="LEHM"     then _good=2
        elseif string.upper(_good)=="EISEN"    then _good=3
        elseif string.upper(_good)=="SCHWEFEL" then _good=4
        elseif string.upper(_good)=="STEIN"    then _good=5
        elseif string.upper(_good)=="GOLD"     then _good=6
        else 
            local nPunkt = 0
            while nPunkt do
                nBeginn = nPunkt
                nPunkt = string.find(_good,"%s",nPunkt+1)
            end
            _amount = string.sub(_good,nBeginn+1) 
            cText   = string.sub(_good,1,nBeginn)
            _good = 7
        end
    end
    if _range then 
        if _range < 101 then begin = 1 else begin= 100 end 
        _amount=math.random (begin ,_range or 1000)
    elseif type (_amount)~="number" and type (_amount)~="string"then
        _amount=1000
    end
 
 
    if type (_good)~="number" then
        _good=math.random (6)
    end
    if _good ~= 7 then
        tGood[_good][2](_amount)
        cText = "einen Schatz mit "  
    else
        tGood[_good][2]()
    end
    if type(_sound) == "number" then
        Sound.PlayGUISound(_sound)
    else
        Sound.PlayGUISound(Sounds.Misc_Chat)
    end
    Message("Ihr habt "..cText.." @color:255,232,0 ".._amount.." "..tGood[_good][1].." @color:255,255,255 gefunden")
 
    _callback( _opener );
end

©Robert, überarbeitet von Old McDonald ;-)

Versions-History