[[http://www.siedler-games.de|{{:sg-link.jpg|}}]] ====== Schatzkistenbau ====== Die bereits entwickelte Funktion habe ich mit etwas Comfort ausgestattet. Fragen? Dann [[http://www.siedler-portal.de/vb3/showthread.php?postid=47028#post47028|KLICK]] Diese Funktion benötigt den [[:utilscripts:cxtools|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. \\ {{utilmaps:schatzkiste.png}} | |**_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 ©[[http://www.siedler-portal.de/vb3/showthread.php?postid=47028#post47028|Robert]], überarbeitet von [[http://www.siedler-portal.de/vb3/member.php?u=1762|Old McDonald]] ;-) ===Versions-History=== ***Version 1.00** * //Erstellung// ***Version 1.01** * //Verbesserungen// * Callback-Funktion ermöglicht * Entity nach dem Öffnen kann festgelegt werden * Der Job wird nun automatisch aufgerufen * Es wird nun ein Job erzeugt und keine Delay-Func, was jetzt ein Speichern zu jedem Zeitpunkt ermöglicht ([[:utilscripts:cxtools|Trigger-Fix]] wird benötigt) * Wenn das Entity tot ist (aus welchem Grund auch immer), wird der Eintrag gelöscht und der Glanz, falls vorhanden, zerstört * Der voreingestellte Sound wurde nun auf den (auch vom Spiel verwendeten) Schatz-Sound geändert. * //Bug-Fixes// * Es konnte passieren, dass mehrmals Rohstoffe gegeben wurden * Es konnte zu Fehlern kommen, wenn kein Glanz erzeugt wurde ***Version 1.01b** * //Verbesserungen// * Der Callback-Funktion den Opener übergeben