scripting:tutorials:level2:npcs
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Nächste Überarbeitung | Vorherige Überarbeitung | ||
scripting:tutorials:level2:npcs [2023/09/10 12:15] – angelegt fritz_98 | scripting: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 8: | Zeile 8: | ||
^ Key ^ Bedeutung ^ Erforderlich? | ^ Key ^ Bedeutung ^ Erforderlich? | ||
- | | name | Skriptname des NPCs (kann im Editor gesetzt werden) | Ja | | + | | **name** | Skriptname des NPCs (kann im Editor gesetzt werden) | Ja | |
- | | callback | Funktion, die bei der Interaktion mit dem NPC aufgerufen wird | Ja | | + | | **callback** | Funktion, die bei der Interaktion mit dem NPC aufgerufen wird | Ja | |
- | | briefing | Briefing, das bei der Interaktion mit dem NPC gestartet wird | Nur, wenn kein '' | + | | **briefing** | Briefing, das bei der Interaktion mit dem NPC gestartet wird | Nur, wenn kein '' |
- | | heroName | Wenn der NPC nur mit einem bestimmten Helden interagieren soll, wird hier dessen Skriptname eingetragen | Nein | | + | | **heroName** | Wenn der NPC nur mit einem bestimmten Helden interagieren soll, wird hier dessen Skriptname eingetragen |
- | | vanishPos | | Nein | + | | **wrongHeroMessage** | Nachricht, die angezeigt wird, wenn der NPC mit dem falschen Helden angesprochen wird \\ (alle außer derjenige, der mit '' |
+ | | **follow** | Kann entweder **true** oder ein Skriptname sein. Der NPC folgt bei **true** dem nächsten Helden, sonst der angegebenen Entity | Nein | | ||
+ | | **vanishPos** | Nach der Interaktion geht der NPC zur angegebenen Position und verschwindet, | ||
- | \\ | + | Tatsächlich kann man einer '' |
- | (Standardmäßig | + | |
+ | **Hinweis**: | ||
+ | |||
+ | **Achtung**: | ||
+ | |||
+ | Der einfachste Fall ist ein NPC, der einfach nur ein Gespräch über ein Briefing anbietet: | ||
+ | <code lua> | ||
+ | -- Wir schreiben jeweils eine Funktion für die Erstellung des NPCs und eine für das Callback, in dem | ||
+ | -- Fall den Start des Briefings | ||
+ | function CreateNpcScout() | ||
+ | local Npc = { | ||
+ | -- Auf der Karte muss eine Einheit (am besten ein Kundschafter) mit dem Namen " | ||
+ | name = " | ||
+ | -- Der Callback ist einfach nur der Name der Funktion | ||
+ | callback = CreateBriefingScout | ||
+ | } | ||
+ | |||
+ | CreateNPC(Npc) | ||
+ | end | ||
+ | |||
+ | function CreateBriefingScout() | ||
+ | local Briefing = { | ||
+ | { | ||
+ | title = " | ||
+ | text = "Alles ruhig hier an den Grenzen, mein Herr!", | ||
+ | position = GetPosition(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | StartBriefing(Briefing) | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ====Interaktion mit einem bestimmten Helden==== | ||
+ | |||
+ | Möglicherweise wollen wir den Kundschafter nur mit Dario sprechen lassen. Dafür muss die Dario-Entity den Skriptnamen ''" | ||
+ | |||
+ | <code lua> | ||
+ | -- Wir schreiben jeweils eine Funktion für die Erstellung des NPCs und eine für das Callback, in dem | ||
+ | -- Fall den Start des Briefings | ||
+ | function CreateNpcScout() | ||
+ | -- Zur Anschauung die äquivalente, | ||
+ | CreateNPC{ | ||
+ | name = " | ||
+ | callback = CreateBriefingScout, | ||
+ | heroName = " | ||
+ | wrongHeroMessage = "Meine Informationen übergebe ich nur Dario persönlich!" | ||
+ | } | ||
+ | end | ||
+ | |||
+ | function CreateBriefingScout() | ||
+ | local Briefing = { | ||
+ | { | ||
+ | title = " | ||
+ | text = " | ||
+ | position = GetPosition(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | StartBriefing(Briefing) | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ====Zusätzliche Parameter der Callback-Funktion==== | ||
+ | |||
+ | Im vorigen Beispiel haben wir gesehen, dass es ganz schön sein kann, wenn der NPC den Helden, | ||
+ | |||
+ | Tatsächlich werden sowohl die '' | ||
+ | |||
+ | In diesem Beispiel haben wir zuvor auf der Karte Dario mit dem Skriptnamen ''" | ||
+ | |||
+ | <code lua> | ||
+ | -- An der Erstellung des NPCs ändert sich nichts | ||
+ | function CreateNpcScout() | ||
+ | CreateNPC{ | ||
+ | name = " | ||
+ | callback = CreateBriefingScout | ||
+ | } | ||
+ | end | ||
+ | |||
+ | function CreateBriefingScout(_NpcDescription, | ||
+ | -- Mit der Funktion GetEntityName kann der Skriptname einer Entity anhand der Entity-Id | ||
+ | -- ermittelt werden | ||
+ | -- Weil der Skriptname genau dem Anzeigenamen der Helden entspricht, bekommen wir so den | ||
+ | -- korrekten Namen für jeden Helden | ||
+ | -- Hätten wir Dario den Skriptnamen " | ||
+ | local HeroName = GetEntityName(_HeroId) | ||
+ | |||
+ | -- Mit dieser Information können wir nun festlegen, wie der Kundschafter den Helden anspricht | ||
+ | local Address = " | ||
+ | if HeroName == " | ||
+ | Address = " | ||
+ | end | ||
+ | |||
+ | local Briefing = { | ||
+ | { | ||
+ | title = " | ||
+ | text = Address..", | ||
+ | position = GetPosition(" | ||
+ | }, | ||
+ | |||
+ | { | ||
+ | -- Der Name des Helden kann hier benutzt werden, um den Titel und die Position der | ||
+ | -- Briefingseite korrekt zu setzen | ||
+ | title = HeroName, | ||
+ | text = "Sehr gut, weitermachen!", | ||
+ | position = GetPosition(HeroName) | ||
+ | } | ||
+ | } | ||
+ | |||
+ | StartBriefing(Briefing) | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ====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. | ||
+ | |||
+ | Hierfür haben wir Drake (Skriptname ''" | ||
+ | |||
+ | <code lua> | ||
+ | function SetupSheep() | ||
+ | -- Alle 4 Schafe sollen zum NPC werden | ||
+ | for i = 1, 4 do | ||
+ | CreateNpcSheep(i) | ||
+ | end | ||
+ | end | ||
+ | |||
+ | function CreateNpcSheep(_Number) | ||
+ | local Npc = { | ||
+ | -- Weil wir die Namen der Schafe durchnummeriert haben, können wir hier an das Präfix " | ||
+ | -- die Zahl anhängen | ||
+ | name = " | ||
+ | -- Zusätzlicher Wert: Wir merken uns die Nummer des Schafs. Das wird im Callback wichtig | ||
+ | number = _Number, | ||
+ | -- Alle Schafe benutzen das gleiche Callback! | ||
+ | callback = SheepInteraction, | ||
+ | -- Alle Schafe sollen Drake folgen | ||
+ | follow = " | ||
+ | } | ||
+ | |||
+ | CreateNPC(Npc) | ||
+ | end | ||
+ | |||
+ | function SheepInteraction(_NpcDescription, | ||
+ | -- Sobald Drake mit einem der Schafe | ||
+ | Sound.PlayGUISound(Sounds.AmbientSounds_Sheep_rnd_1) | ||
+ | -- Damit das " | ||
+ | -- Dazu benutzen wir die oben definierte Funktion CreateNpcSheep und geben als Parameter die Nummer | ||
+ | -- an, die wir uns beim ersten Erstellen des Schaf-NPCs gemerkt haben | ||
+ | CreateNpcSheep(_NpcDescription.number) | ||
+ | end | ||
+ | </ | ||
---- | ---- | ||
- | ====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 '' | ||
+ | |||
+ | Technisch gesehen arbeitet '' | ||
+ | <code lua> | ||
+ | for i = 1, 4 do | ||
+ | DestroyNPC{name = " | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ====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 '' | ||
+ | |||
+ | Zuerst muss der NPC mit '' | ||
+ | <code lua> | ||
+ | SetNPCWaypoints(" | ||
+ | </ | ||
+ | alle Wegpunkte, deren Namen mit ''" | ||
+ | |||
+ | Die Wegpunkte werden nicht der Reihe nach angesteuert. Es wird (in diesem Fall alle 30 Sekunden) ein Wegpunkt ausgewählt, | ||
+ | |||
+ | Wird ein Zielpunkt während des Spiels zerstört, so wird er nicht automatisch aus der Liste entfernt. Die so entstandene " | ||
+ | |||
+ | 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 '' | ||
+ | <code lua> | ||
+ | TalkedToScout = TalkedToNPC{name = " | ||
+ | </ | ||
+ | |||
+ | ---- | ||
- | 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: |
+ | [[ scripting: |
scripting/tutorials/level2/npcs.1694348121.txt.gz · Zuletzt geändert: 2023/09/10 12:15 von fritz_98