scripting:tutorials:level2:find_entities
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
| scripting:tutorials:level2:find_entities [2023/11/08 11:17] – fritz_98 | scripting:tutorials:level2:find_entities [2023/11/10 11:32] (aktuell) – [Beliebige Gebäude oder Einheiten eines Spielers im Gebiet finden] fritz_98 | ||
|---|---|---|---|
| Zeile 91: | Zeile 91: | ||
| Wie im Artikel zu [[ scripting: | Wie im Artikel zu [[ scripting: | ||
| + | |||
| + | **Hinweis**: | ||
| ===Variante 1: Direkt in Variablen=== | ===Variante 1: Direkt in Variablen=== | ||
| Zeile 237: | Zeile 239: | ||
| Wie im Artikel zu [[ scripting: | Wie im Artikel zu [[ scripting: | ||
| + | |||
| + | **Hinweis**: | ||
| ===Variante 1: Direkt in Variablen=== | ===Variante 1: Direkt in Variablen=== | ||
| Zeile 272: | Zeile 276: | ||
| ====Beispiel Anwendungsfall==== | ====Beispiel Anwendungsfall==== | ||
| + | |||
| + | Wir führen das Beispiel aus [[ scripting: | ||
| <code lua> | <code lua> | ||
| - | -- Eigentlich sollte man nicht auf deutsch programmieren. Versuche, auf englische Namen umzusteigen | + | -- Der Funktionsname CallbackQuestBuildCathedral wurde als Callback bei der Definition der Quest angegeben |
| - | -- Kommentare kannst du dann dafür nutzen, zu erklären, was die Funktion macht, also z.B: | + | -- Die Funktion wird automatisch |
| - | -- Diese Funktion wird nach dem Bau der Garnision | + | -- Das Argument _QuestDescription ist das Quest-Table, mit dem die Quest definiert wurde |
| - | -- Sie übergibt die errichtete Garnision an Spieler 2 | + | function |
| - | -- (usw. was auch immer noch folgt) | + | -- Der Key AreaPos der _QuestDescription enthält den Skriptnamen der Position |
| - | -- Falls mal etwas nicht funktioniert, kannst du anhand solcher Notizen schneller prüfen, ob die Funktion | + | local QuestPosition = GetPosition(_QuestDescription.AreaPos) |
| - | -- das tut, was sie soll | + | -- Wir brauchen |
| - | function | + | local QuestRadius = _QuestDescription.AreaSize |
| - | -- Du lässt die Kaserne an Position | + | |
| - | -- holen: | + | -- die Art und Anzahl |
| - | local QuestPosition = GetPosition(" | + | |
| - | -- Wir brauchen die Variablen hier nur lokal. Kein Grund, sie global zu definieren | + | |
| - | -- Die Position ist jetzt in QuestPosition, | + | local EntityType, Amount = unpack(EntityRequirement) |
| - | -- die gebaut werden sollte | + | local FoundEntities |
| - | local NumberFoundEntities, EntityId1 | + | |
| - | -- Wenn die Quest korrekt funktioniert, sollte diese Bedingung immer zutreffen | + | for i = 2, FoundEntities[1] + 1 do |
| - | if NumberFoundEntities > 0 then | + | -- Wechsle die Spieler-Id der gefundenen |
| - | | + | -- Mehr Informationen zu ChangePlayer findest du in der Comfort-Referenz und |
| - | ChangePlayer(EntityId1, 2) | + | -- im Artikel zu " |
| + | ChangePlayer(FoundEntities[i], 4) | ||
| + | end | ||
| end | end | ||
| end | end | ||
| Zeile 298: | Zeile 306: | ||
| ====Beliebige Gebäude oder Einheiten eines Spielers im Gebiet finden==== | ====Beliebige Gebäude oder Einheiten eines Spielers im Gebiet finden==== | ||
| + | |||
| + | Weiter oben wurde bereits der zusätzliche Parameter '' | ||
| + | |||
| + | Mit '' | ||
| + | |||
| + | Am nützlichsten ist diese Funktion, um zu prüfen, ob ein Spieler ein Gebäude oder einen Siedler in einem bestimmten Gebiet hat: | ||
| + | <code lua> | ||
| + | function IsPlayerSettlerInArea(_PlayerId, | ||
| + | -- _EntityType muss 0 sein, um _AccessCategory verwenden zu können | ||
| + | -- Wir müssen nur 1 Entity der Kategorie 2 = Siedler finden | ||
| + | local NumberOfEntities, | ||
| + | return NumberOfEntities > 0 | ||
| + | end | ||
| + | |||
| + | function IsPlayerBuildingInArea(_PlayerId, | ||
| + | -- _EntityType muss 0 sein, um _AccessCategory verwenden zu können | ||
| + | -- Wir müssen nur 1 Entity der Kategorie 8 = Gebäude finden | ||
| + | local NumberOfEntities, | ||
| + | return NumberOfEntities > 0 | ||
| + | end | ||
| + | </ | ||
| + | |||
| + | Man kann sie auch dafür verwenden, um beispielsweise alle Gebäude eines Spielers in einem bestimmten Gebiet zu zerstören: | ||
| + | <code lua> | ||
| + | function DestroyAllPlayerBuildingsInArea(_PlayerId, | ||
| + | -- Initialisiere ein lokales Table | ||
| + | local FoundEntities = {} | ||
| + | repeat | ||
| + | -- Suche alle Gebäude von Spieler _PlayerId im Bereich | ||
| + | FoundEntities = { Logic.GetPlayerEntitiesInArea(_PlayerId, | ||
| + | -- Zerstöre alle gefundenen Gebäude | ||
| + | for i = 2, FoundEntities[1] + 1 do | ||
| + | DestroyEntity(FoundEntities[i]) | ||
| + | end | ||
| + | -- Die Schleife hört auf zu iterieren, sobald keine weiteren Gebäude mehr im Bereich sind | ||
| + | until FoundEntities[1] == 0 | ||
| + | end | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Dies war ein erster Ausflug in die '' | ||
| + | |||
| + | [[ scripting: | ||
| + | [[ scripting: | ||
| + | [[ scripting: | ||
scripting/tutorials/level2/find_entities.1699442240.txt.gz · Zuletzt geändert: 2023/11/08 11:17 von fritz_98
