Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:npcs

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:npcs [2023/09/10 13:20] fritz_98scripting:tutorials:level2:npcs [2023/11/11 11:53] (aktuell) – [Zusätzliche Parameter der Callback-Funktion] fritz_98
Zeile 1: Zeile 1:
-=====NPCs=====+======NPCs======
  
 Grundsätzlich sind alle Nichtspielercharaktere (Non-Player-Characters) NPCs. Im Kontext von Siedler 5 sind allerdings speziell jene Charaktere gemeint, die dem Spieler über Helden Interaktionen anbieten, gekennzeichnet durch ein großes Ausrufezeichen über dem Kopf. Grundsätzlich sind alle Nichtspielercharaktere (Non-Player-Characters) NPCs. Im Kontext von Siedler 5 sind allerdings speziell jene Charaktere gemeint, die dem Spieler über Helden Interaktionen anbieten, gekennzeichnet durch ein großes Ausrufezeichen über dem Kopf.
Zeile 52: Zeile 52:
 \\ \\
  
-===Interaktion mit einem bestimmten Helden===+====Interaktion mit einem bestimmten Helden====
  
 Möglicherweise wollen wir den Kundschafter nur mit Dario sprechen lassen. Dafür muss die Dario-Entity den Skriptnamen ''"Dario"'' besitzen: Möglicherweise wollen wir den Kundschafter nur mit Dario sprechen lassen. Dafür muss die Dario-Entity den Skriptnamen ''"Dario"'' besitzen:
Zeile 60: Zeile 60:
 -- Fall den Start des Briefings -- Fall den Start des Briefings
 function CreateNpcScout() function CreateNpcScout()
-    local Npc = {+    -- Zur Anschauung die äquivalente, verkürzte Schreibweise 
 +    CreateNPC{
         name = "Scout",         name = "Scout",
         callback = CreateBriefingScout,         callback = CreateBriefingScout,
Zeile 66: Zeile 67:
         wrongHeroMessage = "Meine Informationen übergebe ich nur Dario persönlich!"         wrongHeroMessage = "Meine Informationen übergebe ich nur Dario persönlich!"
     }     }
- 
-    CreateNPC(Npc) 
 end end
  
Zeile 85: Zeile 84:
 \\ \\
  
-===Zusätzliche Parameter der Callback-Funktion===+====Zusätzliche Parameter der Callback-Funktion====
  
 Im vorigen Beispiel haben wir gesehen, dass es ganz schön sein kann, wenn der NPC den Helden, mit dem er angesprochen wird, direkt beim Namen nennen kann bzw. generell der Heldenname im Callback verfügbar ist. Im vorigen Beispiel haben wir gesehen, dass es ganz schön sein kann, wenn der NPC den Helden, mit dem er angesprochen wird, direkt beim Namen nennen kann bzw. generell der Heldenname im Callback verfügbar ist.
  
-Tatsächlich werden sowohl die ''_NpcDescription'' als auch die Entity-Id des interagierenden Helden an das Callback übergeben. Über die Entity-Id wiederum lässt sich der Skriptname des Helden ermitteln. +Tatsächlich werden sowohl die ''_NpcDescription'' als auch die Entity-Id des interagierenden Helden an das Callback übergeben. Über die Entity-Id wiederum lässt sich der Skriptname des Helden ermitteln. Nimmt man wie in den obigen Beispielen diese Parameter in der Funktion nicht an, werden sie einfach [[ scripting:tutorials:level2:functions#zu_viele_und_zu_wenige_parameter |ignoriert]].
  
 In diesem Beispiel haben wir zuvor auf der Karte Dario mit dem Skriptnamen ''"Dario"'' und Ari mit dem Skriptnamen ''"Ari"'' auf der Karte platziert. In diesem Beispiel haben wir zuvor auf der Karte Dario mit dem Skriptnamen ''"Dario"'' und Ari mit dem Skriptnamen ''"Ari"'' auf der Karte platziert.
Zeile 96: Zeile 95:
 -- An der Erstellung des NPCs ändert sich nichts -- An der Erstellung des NPCs ändert sich nichts
 function CreateNpcScout() function CreateNpcScout()
-    local Npc = {+    CreateNPC{
         name = "Scout",         name = "Scout",
         callback = CreateBriefingScout         callback = CreateBriefingScout
     }     }
- 
-    CreateNPC(Npc) 
 end end
  
Zeile 113: Zeile 110:
          
     -- Mit dieser Information können wir nun festlegen, wie der Kundschafter den Helden anspricht     -- Mit dieser Information können wir nun festlegen, wie der Kundschafter den Helden anspricht
-    local Address = ""+    local Address = "Herr"
     if HeroName == "Ari" then     if HeroName == "Ari" then
         Address = "Herrin"         Address = "Herrin"
-    else 
-        Address = "Herr" 
     end     end
          
Zeile 142: Zeile 137:
 \\ \\
  
-===Weitere Parameter===+====Weitere Parameter====
  
 Im nächsten Beispiel wollen wir weitere Parameter für NPCs demonstrieren und zeigen, dass auf eine NPC-Interaktion nicht notwendigerweise ein Briefing folgen muss. Außerdem zeigen wir, dass einem NPC noch weitere, frei wählbare Werte gegeben werden können, auf die in der NPC-Interaktion zugegriffen werden kann. Im nächsten Beispiel wollen wir weitere Parameter für NPCs demonstrieren und zeigen, dass auf eine NPC-Interaktion nicht notwendigerweise ein Briefing folgen muss. Außerdem zeigen wir, dass einem NPC noch weitere, frei wählbare Werte gegeben werden können, auf die in der NPC-Interaktion zugegriffen werden kann.
Zeile 184: Zeile 179:
 ---- ----
  
-====Funktionen für NPCs====+=====Funktionen für NPCs=====
  
-DestroyNPC+Es gibt einige Funktionen, die für NPCs benutzt werden können, die im Folgenden kurz erklärt sind.
  
-SetNPCWaypoints+====Einen NPC deaktivieren==== 
 + 
 +Mit der Funktion ''DestroyNPC(_NpcDescription)'' kann ein zuvor erstellter NPC wieder "zerstört" werden. Dabei wird **nicht die Entity gelöscht**, sondern nur die Interaktivität deaktiviert (also das Ausrufezeichen entfernt). 
 + 
 +Technisch gesehen arbeitet ''DestroyNPC'' mit einer ''_NpcDescription''. Für die Funktion relevant ist allerdings nur der Name, sodass man die NPC-Beschreibung verkürzt angeben kann. Will man beispielsweise Drake aus seiner persönlichen Schaf-Hölle befreien, reicht der Aufruf 
 +<code lua> 
 +for i = 1, 4 do 
 +    DestroyNPC{name = "Sheep"..i} 
 +end 
 +</code> 
 + 
 +\\ 
 + 
 +====Wegpunkte für NPCs==== 
 + 
 +Wir können NPCs wie den Kundschafter oben zwischen verschiedenen Wegpunkten umherwandern lassen. Dazu müssen auf der Karte Entities platziert werden, deren Skriptnamen einem durchnummerierten Schema folgen. 
 + 
 +Zum Beispiel können wir dem Kundschafter oben Wegpunkte geben, indem wir einige ''XD_ScriptEntity''s mit den Skriptnamen ''"ScoutWaypoint1"'' bis ''"ScoutWaypoint5"'' auf der Karte platzieren. Es kann zwar prinzipiell jede Entity als Wegpunkt dienen, zerstörte Entities wie gefällte Bäume oder eingerissene Gebäude können aber für Fehler sorgen. Die Nummerierung muss bei 1 beginnen und darf keine Lücken haben. 
 + 
 +Zuerst muss der NPC mit ''CreateNPC'' erstellt werden. Dann kann mit 
 +<code lua> 
 +SetNPCWaypoints("Scout", "ScoutWaypoint", 30) 
 +</code> 
 +alle Wegpunkte, deren Namen mit ''"ScoutWaypoint"'' beginnt als Wegpunkte für den Kundschafter festgelegt werden. Die 30 ist die Zeit in Sekunden die gewartet wird, bevor der NPC einen weiteren Wegpunkt ansteuert. Wird die Zeit zu gering gewählt, wird der NPC oft einen der Wegpunkte nicht erreichen, sondern auf halbem Weg abbrechen und einen neuen Wegpunkt ansteuern. Ist die Zeit sehr hoch gewählt, wird der NPC bei jedem Wegpunkt eine zeitlang verweilen. 
 + 
 +Die Wegpunkte werden nicht der Reihe nach angesteuert. Es wird (in diesem Fall alle 30 Sekunden) ein Wegpunkt ausgewählt, zu dem der NPC hinläuft. Bei dieser Zufallsauswahl kann der nächste Wegpunkt auch der sein, an dem er sich bereits befindet. Der NPC wird also an diesem Punkt etwas länger stehenbleiben. 
 + 
 +Wird ein Zielpunkt während des Spiels zerstört, so wird er nicht automatisch aus der Liste entfernt. Die so entstandene "Lücke" in den durchnummerierten Wegpunkten sorgt dafür, dass alle Wegpunkte, deren Nummerierung nach der der zerstörten Entity kommt, nicht mehr besucht werden können. 
 + 
 +Dem NPC kann zu jedem Zeitpunkt neue Wegpunkte zuweisen. Außerdem verweilt der NPC automatisch an einem Wegpunkt, wenn ein Held in der Nähe ist, was das Ansprechen erleichtert. Er bleibt allerdings nicht automatisch stehen, wenn er einen Held auf seinem Weg trifft. 
 + 
 +\\ 
 + 
 +====NPC-Status abfragen==== 
 + 
 +Um zu prüfen, ob mit einem NPC bereits gesprochen wurde, wird die Funktion ''TalkedToNPC(_NpcDescription)'' benutzt. Wie auch ''DestroyNPC'' arbeitet diese Funktion nur mit dem Namen der NPC-Beschreibung. Deshalb ist folgender Aufruf ausreichend: 
 +<code lua> 
 +TalkedToScout = TalkedToNPC{name = "Scout"
 +</code> 
 + 
 +----
  
-SetNPCFollow+NPCs können nun mit Helden sprechen und ihnen Aufträge erteilen. Wie die Erfüllung dieser Aufträge ermittelt wird, wird im nächsten Kapitel gezeigt.
  
-TalkedToNPC+[[ scripting:tutorials:level2:setup_quest | Nächstes Kapitel: Orte erreichen, Gebäude bauen, Gegner besiegen ]] \\ 
 +[[ scripting:tutorials:level2:npcs | Zurück nach oben ]]
scripting/tutorials/level2/npcs.1694352043.txt.gz · Zuletzt geändert: 2023/09/10 13:20 von fritz_98