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