Construction Set Tier-Gefährten erstellen

Fellan

Freund des Hauses
Ich möchte einen Tier-Gefährten erstellen. Sobald der Spieler in seine Sichtweite kommt, spricht das Tier den Spieler an. Der Spieler hat dann zur Auswahl "Folge mir" und "Warte hier".

Wählt der Spieler "Warte hier" bleibt das Tier an Ort und Stelle, bewegt sich nicht, nur, um sich zu verteidigen. Nach einem Kampf geht er aber wieder an seinen ursprünglichen Ort zurück.

Wählt der Spieler "Folge mir" geht das Tier dem Spieler immer hinterher, egal ob Dungeons, Städte, Kämpfe, Oblivion-Ebenen, wasauchimmer. Außerdem werden neue "Gesprächs"optionen freigeschaltet:

"Warte...": Der Spieler hat eine Reihe von im Spiel bereits vorhandenen Orten zur Auswahl, z.B. Tavernen, Gildenhäuser, Häuser des Spielers o.ä. Nimmt der Spieler beispielsweise "Warte..." "in Chorrol..." "an der großen Eiche." soll das Tier sich sofort auf den Weg machen. Sobald der Spieler das Tier nicht mehr sieht, wird es direkt zum Ort "gebeamt".

"Erkunden": Der Spieler bekommt die Kontrolle über das Tier und kann mit ihm gefahrlos die Umgebung erkunden. Sobald das Tier oder der Spieler in einen Kampf geraten, hat der Spieler wieder die Kontrolle über sich selbst. Hat der Spieler Kontrolle über das Tier, kann er es nur lenken, jedoch nicht kämpfen o.ä.


Das "Erkunden" war nur so eine Idee von mir, die anderen Sachen finde ich aber schon wichtig. Gibt es ein Tutorial dazu oder weiß jemand, wie ich den "Dialog" mit dem Tier starten kann, wie ich es erreiche, dass es mir folgt und zu Punkt X läuft, wenn ich es an einem anderen Ort warten lassen will bzw. wie es an Ort und Stelle stehenbleibt?
 
also meinste mit erkunden, das der Player dann das Tier is??

das das Tier dem Player dann folgt, könnte man auf jdeden fall über Dialog results regeln.. Chosies: ja, nein ja: follow = player == 1 no: good bye
 
  • Like
Reaktionen: Fellan
Es gibt Follow-Packages als Tagesabläufe. Diese könnte ich dem Tier geben und als Condition eine Global setzen. Diese Global wird dann durch die Dialoge verändert, das dürfte funktionieren.

Jetzt ist nur das Problem, wie das Tier den NPC anspricht bzw. wie der NPC das Tier dann ansprechen kann. Meines Wissens nach sind ja keine Dialoge mit Tieren möglich?
 
Das klingt witzig, aber ich nehme an ein Gespräch mit einem Tier wird schwierig (weil die glaube, vermute ich, kein lipreading ham), aber kann man das nicht einfach über Messageboxen regeln? Das man erst zb.: Stadt, taverne oder sonstwas auswählen kann, dann öfnnert sich wieder eine Messagebox und jenachdem was man angeklickt hat, kommt die Auflistung der Städte oder Tavernen usw. und anschließend (bei Städten zb.) die einzelnen Orte in der Stadt, so wie du schon gsgt hast (zb.: Die Eiche).
Geht das mit dem Dorthingehen nicht einfach mit einem moveto-Befehl?
Auf jeden Fall ist es eine lustige Idee.
_______________
Code:
Begin OnActivate
Messagebox "Wohin du reisen möchtest", "Orte"
End

geht das nicht einfach so?
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Fellan
Nein, es geht hier gar nicht um das Gespräch. Das Tier sagt ja nichts. Man soll in dem Gespräch nur auswählen können, was das Tier machen soll. Das könnte man im Grunde auch über MessageBoxen regeln, da habe ich noch gar nicht dran gedacht, Danke.

Das hingehen geht zwar mit einem "MoveToMarker", der Spieler soll aber nicht sehen, dass das Tier einfach wegteleportiert wird, sondern dass das Tier losläuft. Das soll es auch, aber sobald der Spieler "wegguckt" oder ihn nicht mehr sehen kann, wird das Tier teleportiert, damit es nicht ewig läuft und am Ende vielleicht gar nicht ankommt.
 
Und wenn man so einen treuen Weggefährten haben möchte, wo trifft man ihn dann an? Kann man die sich kaufen? Und wenn ja, gibt es dann verschiedene Wegbegleiter? Oder freundet er sich im Laufe einer Quest mit einem an? Das wär auch wichtig. Und außerdem müsste man den doch auch noch so einstellen, dass er nicht jeden angreift, sondern freundlich gesinnt ist. Übrigens, weiß einer wo man das einstellen kann?

Übrigens sind doch alle Objekte auf eine bestimmte Entfernung für den Spieler nicht mehr sichtbar, oder? Und so weit ich weiß gibt es eine Variable, die für die Entfernung vom Spieler steht. Dann kann man die doch einfach einfügen.
 
Zuletzt bearbeitet:
Es wird nur ein Tier geben. Einen "Tierladen" gibt es schon in einer anderen Mod. Man soll mein Tier in einem alten Lagerraum finden.
Das ist nur als kleines Extra gedacht und nicht Hauptbestandteil meiner Mod (es geht um den "Weißgoldturm", siehe Signatur). Das Tier soll auch nichts besonderes können (das "Erkunden" wäre eine schöne Sache, ist mir aber wahrscheinlich zu hoch) sondern nur als Begleiter dienen. Das Tier soll auch nicht wachsen, stärker werden, neue Fähigkeiten erlernen.

Zum angreifen: Ich denke es reicht, das Tier in die "PlayerFaction" zu stecken. Dann dürfte es alle Leute genau so mögen wie auch der Spieler und umgekehrt. Ich möchte auch, dass das Tier unsterblich ist, dazu setze ich es einfach auf "Essential", jetzt wird es nur noch bewusstlos. Wenn das Tier jetzt in einer Cell bewusstlos wird und der Spieler wechselt derweil die Cell, ist das Tier dann automatisch neben dem Spieler?
 
wie ich es erreiche, dass es mir folgt und zu Punkt X läuft, wenn ich es an einem anderen Ort warten lassen will bzw. wie es an Ort und Stelle stehenbleibt?
Mit entsprechenden Paketen, die von einer definierten Bedingung abhängig sind.

Um das Grundprinzip zu erklären, hier ein einfaches Beispiel für "Folgen" und "Warte hier":

Zunächst legst Du für die Grundfunktionen eine Fraktion an.
Fraktion1: frGrundfunktionen

In dieser Fraktion legst Du die Ränge
1 für Folgen und
2 für Warten an.

Nun bekommt dein Tier 2 Pakete, die unter AI am Anfang der Liste stehen müssen.
1. Follow Player
2. Wander at current position
Die Pakete haben jeweils die Bedingung GetFactionRank frGrundfunktionen

Wenn dein Begleiter nun folgen soll, bekommt er ein
SetFactionRank frGrundfunktionen, 1
EvaluatePackage


und wenn er warten soll
SetFactionRank frGrundfunktionen, 2
EvaluatePackage

Durch genaue Einstellung der Pakete und Benutzung mehrerer Factions kannst Du nach dem Prinzip dein Tier sehr differenziert steuern, ohne viel Scripten zu müssen.

Wenn Du nun das Tier an einen Ort beamen würdest und das "Warte hier" Paket aktiv ist, würde das Tier dort bleiben.

Wenn es selbst dort hingehen soll, muss an die Stelle ein xMarker gesetzt werden und das Tier braucht ein Travelpaket. Man kann aber auch stellen aussuchen, an denen es bereits xMarker gibt und diese als Ziel für die Travelpakete benutzen.

Zum angreifen: Ich denke es reicht, das Tier in die "PlayerFaction" zu stecken.
kann man so machen, obwohl es besser wäre, alle Beziehungen zu den feindlichen Factions zu setzen, damit das Tier dem Player unter allen Umständen hilft, wenn er angegriffen wird. Sonst kann es passieren, dass es nur daneben steht und zuschaut. Ein Aggressionswert von 5 würde dann reichen, damit das Tier bei Angriffen reagiert. Bei einem Wert von 10 würde es auch von selber angreifen.

Ich möchte auch, dass das Tier unsterblich ist, dazu setze ich es einfach auf "Essential", jetzt wird es nur noch bewusstlos. Wenn das Tier jetzt in einer Cell bewusstlos wird und der Spieler wechselt derweil die Cell, ist das Tier dann automatisch neben dem Spieler?
nein.

Was das automatische Folgen angeht, sollte das Tier als Questobjekt markiert sein, weil das einen unmittelbaren Einfluss darauf hat, wie schnell und zuverlässig es bei Zellenwechseln folgt.
Ausserdem brauchst Du ein Script, welches das Tier zu dir teleportiert, falls es - aus welchen Gründen auch immer - nicht automatisch gefolgt ist.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Fellan
Seidenweber schrieb:
Zunächst legst Du für die Grundfunktionen eine Fraktion an.

Ich gehe davon aus, dass das auch mit Global Variables möglich ist? Im Grunde wäre es ja das gleiche, nur dass die Global verändert wird statt dem Faction Rank.

Seidenweber schrieb:
Was das automatische Folgen angeht, sollte das Tier als Questobjekt markiert sein, weil das einen unmittelbaren Einfluss darauf hat, wie schnell und zuverlässig es bei Zellenwechseln folgt.
Ausserdem brauchst Du ein Script, welches das Tier zu dir teleportiert, falls es - aus welchen Gründen auch immer - nicht automatisch gefolgt ist.

Wie würde denn so ein Script aussehen und worauf würde der liegen?

Bis hierhin erstmal vielen, vielen Dank. :)
 
Hallo Fellan,

die Tiere in Oblivion haben, mal abgesehen vom Pferd, keinen Aktivator. Du müsstest entweder einen Aktivator in die Nif reinpfriemeln, oder ein anderes Objekt benutzen um die MessageBox aufzurufen, einen Ring zum Beispiel.
Die globalen Steuerungsvariablen kannst Du auch in einem separaten Questskript definieren. Falls Dir die normale Abfragezeit von 5 Sekunden bei den Questskripts zu langsam sind, kann diese reduziert werden. Siehe Wiki

Gruß, Gert
 
  • Like
Reaktionen: Fellan
die Tiere in Oblivion haben, mal abgesehen vom Pferd, keinen Aktivator. Du müsstest entweder einen Aktivator in die Nif reinpfriemeln, oder ein anderes Objekt benutzen um die MessageBox aufzurufen, einen Ring zum Beispiel.

Das stimmt leider nicht ganz. Ich habe bei einem Bären einen passenden Script (beginnend mit OnActivate) eingesetzt und es klappt:p. Wenn du den "TestScript" ausprobieren willst, hier ist er (Allerdings ist es nur ein "Testscript", also ohne irgendeine funktion. Er dient lediglich dazu, um zu sehen, ob ein Script funktioniert):

Code:
scn BearFriend

short Messagebox01
short answer

Begin OnActivate
Set Messagebox01 to 1
Messagebox "Was soll ich tun?" "Warten" "Folgen"
End

Begin GameMode

If Messagebox01 == 1
set answer to getbuttonpressed

If answer == 0
Messagebox "Ich warte."
set Messagebox01 to 0
Elseif answer == 1
Messagebox "Ich folge."
set Messagebox01 to 0
Endif

Endif

End
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Fellan
Ich gehe davon aus, dass das auch mit Global Variables möglich ist?
jepp - es geht nur darum, etwas als Bedingung zu haben, was im Spiel sonst nicht existiert und auch nicht durch äußere Umstände verändert werden kann.

Wie würde denn so ein Script aussehen und worauf würde der liegen?
Quest-Actors folgen normalerweise ziemlich zuverlässig. Wenn das aber mal nicht so ist, weil der Spieler z.B. einen Teleporter oder ähliches benutzt, muss man das von Hand regeln.

Worauf das Script rennt ist eigentlich egal. Das kann auch ein Questscript sein, was normalerweise alle 5 Sekunden rennt. Hauptsache, es wird periodisch geprüft, ob das Pet in der Nähe des Spielers ist, wenn es eigentlich so sein sollte.

also grob nach dem Muster
Code:
If Bedingung für Folgen == wahr && GetDistance Player > 8000
TierRef.MoveTo Player
EndIf
 
  • Like
Reaktionen: Fellan
Was bringt das "GetDistance Player > 8000"? Wie vielen Metern entspricht das in etwa, kann ich statt den 8000 auch ein "GetInCell" verwenden (was ist der Script-Befehl für ein "ODER"?)? Kann ich statt den 8000 Units auch einen anderen Befehl benutzen, der als "AND/OR" (wenn es sowas denn beim CS gibt) wie eben "GetInCell" oder "GetLOS"? Ich möchte, dass wenn der Spieler das Tier nicht mehr sehen kann, d.h. das Tier außerhalb der in den Optionen eingestellten Sichtbarkeit ist, zum Spieler teleportiert wird. Außerdem soll das Tier, sobald der Spieler auf ein Pferd steigt oder einen Zauber verwendet, der seine Geschwindigkeit erhöht, genauso viel schneller werden. Das Tier soll also immer mit dem Spieler mithalten können.
 
Was bringt das "GetDistance Player > 8000"?
Die Zahl ist willkürlich gewählt, aber groß genug, um den Radius abzudecken, in dem sich das Tier in der Regel befinden wird. Ausserdem ist 8000 größer als die Sichtweite und damit würde der Spieler nie in der Ferne sehen, wie sein Tier plötzlich da wegbeamt. Also ein ganz brauchbarer Wert.

Wenn das Tier nicht im Speicher ist,
oder sich Player und Tier in verschiedenen Interiors befinden,
oder einer von beiden in einer Innenzelle und der andere in einer Aussenzelle ist,
liefert GetDistance immer einen Wert, der sehr viel größer als 8000 ist.

kann ich statt den 8000 auch ein "GetInCell" verwenden
Nein. GetInCell ohnehin nicht. Du meinst sicher GetInSameCell. Das würde aber draussen nicht klappen. Wenn der Spieler eine neue Aussenzelle betreten würde und das Tier 2 Meter hinter ihm ist, befindet es sich noch in der vorherigen Zelle - GetInSameCell würde also false liefern, obwohl das Tier da ist und folgt.

Wie vielen Metern entspricht das in etwa
128 units sind ca. 6 Fuß. Das entspicht etwa 1,8 Metern. 8000 Units sind also ca. 112 Meter.

was ist der Script-Befehl für ein "ODER"?
If dies || das

Ich möchte, dass wenn der Spieler das Tier nicht mehr sehen kann, d.h. das Tier außerhalb der in den Optionen eingestellten Sichtbarkeit ist, zum Spieler teleportiert wird.
Das wäre durch die 8000 abgedeckt, kann aber auch etwa so aussehen
Code:
If Bedingung für Folgen == wahr
    If TierRef.GetDistance Player > 4096 && Player.GetLOS TierRef == 0 
        TierRef.MoveTo Player
    EndIf
EndIf
Wenn der Player auf einem Pferd sitzt, bezieht sich GetLOS allerdings nicht auf den Kamerawinkel, sondern auf die Blickrichtung des Pferdes, da der Player immer geradeaus über den Pferdekopf schaut.

Ausserdem liefert GetLOS immer false, sobald etwas die Sicht behindert. Wird die Sichtlinie (Line Of Sight) z.B. durch eine Kiste oder einen Felsen unterbrochen, ist GetLOS sofort 0. Darum sollte das bei den meisten Anwendungen zusammen mit anderen Kriterien geprüft werden.

Außerdem soll das Tier, sobald der Spieler auf ein Pferd steigt oder einen Zauber verwendet, der seine Geschwindigkeit erhöht, genauso viel schneller werden. Das Tier soll also immer mit dem Spieler mithalten können.
Das ist Fummelei, wenn das im Spiel nicht bescheuert aussehen soll, weil sich der Speedwert bei NPC und Kreaturen anders auswirkt. Wenn man das Tier zu schnell macht, rast es u.U. wie ein Kugelblitz auf Gegner zu - macht man es zu langsam, kann es dem Player nicht folgen :blink:

Ich würde vielleicht Vergleichstests machen. Dass heisst, den Player ohne Rüstung mit verschiedenen Speedwerten rennen lassen und sehen, wie gut das Tier folgen kann. Aus den Werten würde ich mir eine kleine Tabelle bauen und den Speedwert des Tieres dann über ein Script an den jeweiligen Wert des Players anpassen. Ausnahme, wenn der Player auf dem Pferd sitzt, weil dann der Wert des Pferdes die Vorgabe ist.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Fellan
Ich habe jetzt (hoffentlich) alles so weit fertig. Das Tier wartet und folgt dem Spieler auf Schritt und Tritt, falls das mal nicht so sein sollte, wird er direkt zum Spieler gebracht (ab einer Entfernung von 3000 Units, der Spieler darf das Tier via "GetLOS" nicht sehen).

Das "Gehe zu Punkt X" scheint zumindest vom CS her zu funktionieren: Das Tier macht sich auf Befehl sofort auf den Weg zu Punkt X, sobald der Spieler das Tier nicht mehr sehen kann, wird es direkt dorthin teleportiert.

Das mit dem "Erkunden" und Geschwindigkeit erhöhen werde ich mir sparen. Ich will auch auf Gimmicks wie Ringe oder Spruchrollen zum Herrufen verzichten. Da das Tier unsterblich ist und ab einer bestimmten Entfernung wieder zum Spieler gebracht wird (d.h. wohl spätestens beim Cellwechsel) kann ja im Grunde auch gar nichts passieren.

Danke für die Hilfe, ich habe zwar noch nichts getestet, gehe aber davon aus, dass alles klappt. :)