Benutzer-Werkzeuge

Webseiten-Werkzeuge


utilfunctions:areenemiesinarea

Tenji

Bestimmt wolltet die meisten von euch schon mal abfragen, ob gerade Gegner in der Nähe sind!

Wie macht man das meistens?
Genau, man frägt ab, ob eine Entity des feindlichen Players ( nehmen wir mal an id = 2 ) in der Nähe ist:

AreEntitiesInArea( 2, 0, GetPosition("Irgendwo"), 1000, 1)  -- Die 0 bedeutet alle Arten von Entities

Aber jetzt muss man ja immer wissen, ob der Player, den man angegeben hat zur Zeit auch wirklich feindlich ist!
( Mann kann ja auch mitten im Spiel die Diplomatie ändern! )


Ich habe da einen Code geschrieben, der das auf angenemere Weise für einen erledigt:

Er wird hiermit aufgerufen:

AreEnemiesInArea( _player, _position, _range)
  • „_player“ ist der Spieler, der wissen will, ob ein Gegner in der Nähe ist
  • „_position“ ist die Position (muss wie bei AreEntitiesInArea mit GetPosition(„Irgendwo“) angegeben werden)
  • „_range“ ist der Radius um die „_position“


Natürlich gibt es dafür auch ein Gegenstück, das abfragt, ob Verbündete in der Nähe sind!
Dazu einfach diesen Aufruf verwenden:

AreAlliesInArea( _player, _position, _range)


Dies ist der dazu benötigte Code:

------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Comfort functions zur Abfrage, ob Feinde/Verbündete in einem bestimmten Bereich sind                                       by Tenji
------------------------------------------------------------------------------------------------------------------------------------------------------------
function AreEnemiesInArea( _player, _position, _range)
    return AreEntitiesOfDiplomacyStateInArea( _player, _position, _range, Diplomacy.Hostile )
end
function AreAlliesInArea( _player, _position, _range)
    return AreEntitiesOfDiplomacyStateInArea( _player, _position, _range, Diplomacy.Friendly )
end
function AreEntitiesOfDiplomacyStateInArea( _player, _position, _range, _state )
    for i = 1,8 do
        if Logic.GetDiplomacyState( _player, i) == _state then
            if AreEntitiesInArea( i, 0, _position, _range, 1) then
                return true
            end
        end
    end
    return false
end 

Beide Code geben „true“, also ja, zurück, wenn Feinde/Verbündete in der Gegend sind!

Verwenden könnte man sie zB. so:

Achtung, Feinde sind im Anmarsch!

StartSimpleJob("MessageJobKommenFeinde")
---------------------------------------------------------
function MessageJobKommenFeinde()
    if AreEnemiesInArea( 1, GetPosition("Brücke"), 1000) then
        Message("Feinde nähern sich euch!")
        return true
    end
end

Wann kommt denn die Verstärkung?

StartSimpleJob("MessageJobKommenVerbündete")
---------------------------------------------------------
function MessageJobKommenVerbündete()
    if AreAlliesInArea( 1, GetPosition("Brücke"), 1000) then
        Message("Die Verstärkung rückt an!")
        return true
    end
end


Hoffe, dass „Allies“ als Bezeichnung durch geht!
Und, natürlich, man hätte es auch so einrichten können, das man nicht „GetPosition()“ schreiben muss, aber ich dachte, dass man das von „AreEntitiesInArea“ so gewohnt ist - und das würde sonst eher verwirren! ;-) Tenji

Zur Tutorial-Übersicht

utilfunctions/areenemiesinarea.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)