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