Group
| Variablentyp: group | |
|---|---|
| | |
| | |
| |
Group (Einheitengruppe) ist ein Variablentyp, der den Typ Handle erweitert.
In einer Einheitengruppe können beliebig viele Einheiten unsortiert gespeichert werden.
API
Folgende, auf Einheitengruppen bezogene native Funktionen sind in der common.j-Datei deklariert:
//============================================================================ // Group API // native CreateGroup takes nothing returns group native DestroyGroup takes group whichGroup returns nothing native GroupAddUnit takes group whichGroup, unit whichUnit returns nothing native GroupRemoveUnit takes group whichGroup, unit whichUnit returns nothing native GroupClear takes group whichGroup returns nothing native GroupEnumUnitsOfType takes group whichGroup, string unitname, boolexpr filter returns nothing native GroupEnumUnitsOfPlayer takes group whichGroup, player whichPlayer, boolexpr filter returns nothing native GroupEnumUnitsOfTypeCounted takes group whichGroup, string unitname, boolexpr filter, integer countLimit returns nothing native GroupEnumUnitsInRect takes group whichGroup, rect r, boolexpr filter returns nothing native GroupEnumUnitsInRectCounted takes group whichGroup, rect r, boolexpr filter, integer countLimit returns nothing native GroupEnumUnitsInRange takes group whichGroup, real x, real y, real radius, boolexpr filter returns nothing native GroupEnumUnitsInRangeOfLoc takes group whichGroup, location whichLocation, real radius, boolexpr filter returns nothing native GroupEnumUnitsInRangeCounted takes group whichGroup, real x, real y, real radius, boolexpr filter, integer countLimit returns nothing native GroupEnumUnitsInRangeOfLocCounted takes group whichGroup, location whichLocation, real radius, boolexpr filter, integer countLimit returns nothing native GroupEnumUnitsSelected takes group whichGroup, player whichPlayer, boolexpr filter returns nothing native GroupImmediateOrder takes group whichGroup, string order returns boolean native GroupImmediateOrderById takes group whichGroup, integer order returns boolean native GroupPointOrder takes group whichGroup, string order, real x, real y returns boolean native GroupPointOrderLoc takes group whichGroup, string order, location whichLocation returns boolean native GroupPointOrderById takes group whichGroup, integer order, real x, real y returns boolean native GroupPointOrderByIdLoc takes group whichGroup, integer order, location whichLocation returns boolean native GroupTargetOrder takes group whichGroup, string order, widget targetWidget returns boolean native GroupTargetOrderById takes group whichGroup, integer order, widget targetWidget returns boolean // This will be difficult to support with potentially disjoint, cell-based regions // as it would involve enumerating all the cells that are covered by a particularregion // a better implementation would be a trigger that adds relevant units as they enter // and removes them if they leave... native ForGroup takes group whichGroup, code callback returns nothing native FirstOfGroup takes group whichGroup returns unit
Verwendung
Eine Einheitengruppe kann mit der Funktion CreateGroup erzeugt werden. Sie ist zu Beginn leer. Da es sich um einen von agent abgeleiteten Datentyp handelt, muss eine Gruppe nach ihrer Erzeugung wieder gelöscht werden, insofern kein Speicherleck entstehen soll. Dies geschieht mit Hilfe der Funktion DestroyGroup. Mit den Funktionen GroupAddUnit, GroupRemoveUnit und GroupClear kann eine Einheit zu einer Einheitengruppe hinzugefügt, aus ihr entfernt oder eine Einheitengruppe geleert werden:
local group myGroup = CreateGroup() call GroupAddUnit(myGroup, gg_unit_n020_0012) // Einheit gehört zur Einheitengruppe call GroupRemoveUnit(myGroup, gg_unit_n020_0012) // Einheit wird aus Einheitengruppe entfernt call GroupClear(myGroup) // Einheitengruppe ganz leeren call DestroyGroup(myGroup) // Einheitengruppe ganz zerstören set myGroup = null
Mit Funktionen wie GroupEnumUnitsOfTypeCounted kann eine Einheitengruppe mit Einheiten unter bestimmten Voraussetzungen gefüllt werden. Als Filter kann dabei eine parameterlose Funktion mit dem Rückgabetyp boolean übergeben werden, innerhalb derer man ebenfalls per GetEnumUnit auf die jeweilige Einheit Zugriff hat. Liefert die Filterfunktion true zurück, so wird die Einheit zur Gruppe hinzugefügt, ansonsten nicht:
function myFilter takes nothing returns boolean return IsUnitType(GetEnumUnit(), UNIT_TYPE_HERO) endfunction function test takes group myGroup returns nothing call GroupEnumUnitsOfPlayer(myGroup, Player(0), Filter(function myFilter)) // nehme sämtliche Einheiten von Spieler 1 und rufe für jede davon die Funktion "myFilter" auf, liefert diese "true" zurück bzw. ist die Einheit ein Held, wird sie zur Einheitengruppe hinzugefügt endfunction
Mit der Funktion FirstOfGroup kann immer nur auf die erste Einheit einer Einheitengruppe zugegriffen werden. Daher wird für Funktionen, die die ganze Grouppe betreffen meistens entweder eine Funktion wie ForGroup mit einer zusätzlichen Durchlaufsfunktion, innerhalb derer dann mit GetEnumUnit auf die jeweilige Einheit des Durchlaufs zugegriffen werden kann, oder eine der gruppenbezogenen Funktionen wie etwa GroupImmediateOrder, die keine zusätzliche Durchlaufsfunktion benötigt, verwendet:
function callback takes nothing returns nothing call ShowUnit(GetEnumUnit(), false) // verberge Einheit endfunction function test takes group myGroup returns nothing call ForGroup(myGroup, function callback) // rufe Funktion "callback" für jede Einheit in der Einheitengruppe auf call GroupImmediateOrder(myGroup, "stop") // gesamte Einheitengruppe hält an endfunction
