Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:find_entities

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige ÜberarbeitungVorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
scripting:tutorials:level2:find_entities [2023/11/08 11:17] fritz_98scripting: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:tutorials:level2:functions#mehrere_rueckgabewerte |mehreren Rückgabewerten]] beschrieben, können diese Rückgabewerte auf unterschiedliche Arten in Variablen geschrieben werden. Wie im Artikel zu [[ scripting:tutorials:level2:functions#mehrere_rueckgabewerte |mehreren Rückgabewerten]] beschrieben, können diese Rückgabewerte auf unterschiedliche Arten in Variablen geschrieben werden.
 +
 +**Hinweis**: Unabhängig von der verwendeten Variante sind die zurückgegebenen Entity-Ids nach dem Abstand zur Zielplosition sortiert - das nächstgelegene Entity zuerst.
  
 ===Variante 1: Direkt in Variablen=== ===Variante 1: Direkt in Variablen===
Zeile 237: Zeile 239:
  
 Wie im Artikel zu [[ scripting:tutorials:level2:functions#mehrere_rueckgabewerte |mehreren Rückgabewerten]] beschrieben, können diese Rückgabewerte auf unterschiedliche Arten in Variablen geschrieben werden. Wie im Artikel zu [[ scripting:tutorials:level2:functions#mehrere_rueckgabewerte |mehreren Rückgabewerten]] beschrieben, können diese Rückgabewerte auf unterschiedliche Arten in Variablen geschrieben werden.
 +
 +**Hinweis**: Unabhängig von der verwendeten Variante sind die zurückgegebenen Entity-Ids nach dem Abstand zur Zielplosition sortiert - das nächstgelegene Entity zuerst.
  
 ===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:tutorials:level2:setup_quest#gebaeude_errichtensetupestablish |SetupEstablish]] fort und wollen im Callback der Quest die Kathedrale, das Wohnhaus und den Gutshof an Spieler 4 übergeben. Alle Namen, Positionen, etc. sind vom verlinkten Beispiel übernommen:
  
 <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 bei Erfüllung der Quest aufgerufen 
--- Diese Funktion wird nach dem Bau der Garnision bei Position "kaserne" im Zusammenhang mit der Quest ??? aufgerufen  +-- Das Argument _QuestDescription ist das Quest-Tablemit dem die Quest definiert wurde 
--- Sie übergibt die errichtete Garnision an Spieler 2  +function CallbackQuestBuildCathedral(_QuestDescription
--- (usw. was auch immer noch folgt) +    -- Der Key AreaPos der _QuestDescription enthält den Skriptnamen der Position der Quest 
--Falls mal etwas nicht funktioniertkannst du anhand solcher Notizen schneller prüfen, ob die Funktion +    local QuestPosition = GetPosition(_QuestDescription.AreaPos
--- das tut, was sie soll +    -- Wir brauchen außerdem noch den Radius, innerhalb dessen die Kathedrale gebaut werden sollte 
-function Kasernefertig() +    local QuestRadius = _QuestDescription.AreaSize 
-    -- Du lässt die Kaserne an Position "kaserne" mit Umkreis 3000 Siedler-cm bauen. Die Position muss man erst + 
-    -- holen: +    -- die Art und Anzahl der Gebäudedie wir übergeben wollenist ebenfalls bereits in der Quest enthalten 
-    local QuestPosition = GetPosition("kaserne"+    for _, EntityRequirement in ipairs(_QuestDescription.EntityTypes) do 
-    -- Wir brauchen die Variablen hier nur lokalKein Grund, sie global zu definieren +        -- Eine Erklärung zur Funktion unpack findest du im Artikel zur Lua-Standardbibliothek verlinkt 
-    -- Die Position ist jetzt in QuestPosition, der Umkreis ist 3000Spieler hat Id 1 und wir suchen genau die eine Kaserne+        local EntityTypeAmount = unpack(EntityRequirement) 
-    -- die gebaut werden sollte +        local FoundEntities Logic.GetPlayerEntitiesInArea(_QuestDescription.Player, EntityType, QuestPosition.X, QuestPosition.Y, QuestRadiusAmount} 
-    local NumberFoundEntitiesEntityId1 = Logic.GetPlayerEntitiesInArea(1, Entities.PB_Barracks2, QuestPosition.X, QuestPosition.Y, 30001+ 
-    -- Wenn die Quest korrekt funktioniertsollte diese Bedingung immer zutreffen +        for i = 2FoundEntities[1] + 1 do 
-    if NumberFoundEntities > 0 then +            -- Wechsle die Spieler-Id der gefundenen Gebäude zu Spieler 
-        -- Wechsle die Spieler-Id der gefundenen Kaserne zu Spieler 2 +            -- Mehr Informationen zu ChangePlayer findest du in der Comfort-Referenz und 
-        ChangePlayer(EntityId12)+            -- im Artikel zu "Belohnungen" auf Ebene 
 +            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 ''_AccessCategory'' erwähnt. ''Logic.GetPlayerEntitiesInArea'' ist die einzige "Entity-Suchfunktion", die diesen Parameter besitzt. Er wird dazu benutzt, Entities einer bestimmten Kategorie zu finden (im Wesentlichen Siedler oder Gebäude). Dazu **muss** als Entity-Typ ''0'' angegeben werden!
 +
 +Mit ''_AccessCategory'' 2 (für Siedler) oder ''_AccessCategory'' 8 (für Gebäude) können dann Entities der entsprechenden Kategorie gesucht werden. Wenn die ''_AccessCategory'' nicht angegeben wurde, beträgt sie standardmäßig 10, sodass sowohl nach beliebigen Siedlern als auch Gebäuden gesucht wird (denn 2 + 8 = 10).
 +
 +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, _Position, _Radius)
 +    -- _EntityType muss 0 sein, um _AccessCategory verwenden zu können
 +    -- Wir müssen nur 1 Entity der Kategorie 2 = Siedler finden
 +    local NumberOfEntities, _ = Logic.GetPlayerEntitiesInArea(_PlayerId, 0, _Position.X, _Position.Y, _Radius, 1, 2)
 +    return NumberOfEntities > 0
 +end
 +
 +function IsPlayerBuildingInArea(_PlayerId, _Position, _Radius)
 +    -- _EntityType muss 0 sein, um _AccessCategory verwenden zu können
 +    -- Wir müssen nur 1 Entity der Kategorie 8 = Gebäude finden
 +    local NumberOfEntities, _ = Logic.GetPlayerEntitiesInArea(_PlayerId, 0, _Position.X, _Position.Y, _Radius, 1, 8)
 +    return NumberOfEntities > 0
 +end
 +</code>
 +
 +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, _Position, _Radius)
 +    -- Initialisiere ein lokales Table
 +    local FoundEntities = {}
 +    repeat
 +        -- Suche alle Gebäude von Spieler _PlayerId im Bereich
 +        FoundEntities = { Logic.GetPlayerEntitiesInArea(_PlayerId, 0, _Position.X, _Position.Y, _Radius, 16, 8) }
 +        -- 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
 +</code>
 +
 +----
 +
 +Dies war ein erster Ausflug in die ''Logic.''-Funktionen außerhalb des Comfort-Layers. Im nächsten Kapitel behandeln wir deutlich leichter zu hantierende Tribute.
 +
 +[[ scripting:tutorials:level2:rewards| Voriges Kapitel: Belohnungen ]] \\
 +[[ scripting:tutorials:level2:tribute | Nächstes Kapitel: Tribute ]] \\
 +[[ scripting:tutorials:level2:find_entities | Zurück nach oben ]]
scripting/tutorials/level2/find_entities.1699442240.txt.gz · Zuletzt geändert: 2023/11/08 11:17 von fritz_98