Wer sich schon einmal an der Legenden-Kampagne „Kampf um die Smaragdebene“ versucht hat, wird sich wohl schmerzhaft an die Fallen erinnern können, die einem dort das Leben schwer machen. Und Jeder sollte eigentlich die Tretminen kennen, die der Held Salim aufstellen kann.
Wär doch schön, wenn man sowas in eine Karte einbauen könnte…
Mit der folgenden Funktion kann eine beliebige Entität in eine vergleichbare Falle verwandelt werden:
CreateTrap( _name, _playerID, _range, _amount )
Zum Beispiel in die FirstMapAction einfügen.
Dazu muss der weiter unten stehende Zusatzcode ins Skript (beliebige Stelle) kopiert werden.
Solche Fallen können ein beliebiges Objekt sein (Büsche, Bäume, Rohstoffhaufen; lustig wirds bei beweglichen Einheiten…), und verursachen wenn Feinde in der Nähe sind eine Reihe von Explosionen, bis sie sich selbst zerstören.
Hier die Parameter mit Erklärung:
Ein Beispiel könnte z.B. so aussehen:
--Hier wird die Entity "trap" zur Falle gemacht,... --...die die Feinde von Spieler 2 verletzen kann,... --...einen Reaktionsradius von 1000 hat... --...und insgesamt 50x explodieren kann. CreateTrap( "trap" ,2 ,1000, 50 )
So einfach geht das. Es können auf diese Weise beliebig viele Fallen erstellt werden!
function CreateTrap( _name, _playerID, _range, _amount ) gvTraps = gvTraps or { TrapsJobID = StartSimpleJob("TrapJob") }; local amount, range; if _range == nil then range = 800; else range = _range; end if _amount == nil then amount = 1; else amount = _amount; end local trap = { name = _name, player = _playerID, range = range, amount = amount, }; table.insert( gvTraps, trap ); end function TrapJob() for i = table.getn(gvTraps),1,-1 do local trap = gvTraps[i]; if Counter.Tick2( trap.name, 2) then if trap.amount > 0 and AreEnemiesInArea( trap.player, GetPosition( trap.name), trap.range ) then CreateEntity( trap.player, Entities.XD_Bomb1, GetPosition( trap.name) ); trap.amount = trap.amount -1; elseif trap.amount == 0 then DestroyTrap( trap); DestroyEntity( trap.name); end end end end function DestroyTrap( _trap) for i = 1,table.getn(gvTraps) do if gvTraps[i] == _trap then table.remove(gvTraps,i); return true end end end
--Zusätzlich wird die AreEnemiesInArea-Funktion von Tenji benötigt. --Wenn sich diese schon im Skript befindet, muss sie nicht nochmal eingefügt werden. function AreEnemiesInArea( _player, _position, _range) for i = 1,8 do if Logic.GetDiplomacyState( _player, i) == Diplomacy.Hostile then if AreEntitiesInArea( i, 0, _position, _range, 1) then return true end end end end