Inhaltsverzeichnis
Einleitung
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…
Fallen selbstgebaut
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:
- _name ist der Skriptname der Entität, die zur Falle werden soll
- _playerID ist die ID des Spielers dem die Falle gehören soll; also wessen Feinde dadurch verletzt werden können
- _range ist der Radius um die Falle, innerhalb dessen die Falle auf Feinde reagiert; dieser Parameter ist optional
- _amount ist die Anzahl der Explosionen, die die Falle verursachen kann bis sie zerstört wird; ebenfalls optional
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!
Zusatzcode
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