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
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
- 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 (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