Benutzer-Werkzeuge

Webseiten-Werkzeuge


utilfunctions:fallen_selbstgebaut


Noigi & Tenji

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
utilfunctions/fallen_selbstgebaut.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)