Construction Set Spieler automatisch zu bestimmtem Ort gehen lassen

Fellan

Freund des Hauses
Ich möchte, dass nachdem ich einen bestimmten Gegenstand aktiviert habe, der Spieler vollautomatisch und nicht aufzuhalten zu einem bestimmten Punkt geht/läuft. Folgendes Szenario stelle ich mir vor:

Der Spieler aktiviert das Objekt (in diesem Fall eine TriggerBox) und geht ganz von alleine zu einem bestimmten Punkt. Der Spieler soll nicht in der Lage sein, dies zu stoppen, er wird also "gezwungen" zu Punkt X zu gehen. Dort wird er dann von einem NPC angesprochen.

Ich könnte auch einfach den NPC den Spieler aktivieren, also ansprechen, lassen, aber dann müsste der NPC durchs Wasser zum Spieler schwimmen und der Dialog würde dort stattfinden - das möchte ich nicht. Außerdem laufe ich dann Gefahr, dass der Spieler den NPC angreift - das möchte ich auch nicht.

Der Spieler soll komplett machtlos gemacht werden (Menü aktivieren ist natürlich noch erlaubt, Speichern jedoch nicht), während der PC zu Punkt X "gelaufen wird".

Ist sowas möglich? Und wenn ja, wie?

Anmerkung: Der Spieler soll von dem Moment des Aktivierens des Objektes bis zum Start des Dialoges machtlos sein. Auch den Dialog soll er zu keinem Zeitpunkt abbrechen können. Sobald der Dialog aufhört, "verschwindet" der NPC, indem er einen Zauber benutzt (d.h., der Zauber benutzt ihn, aber das führt zu weit). Erst dann soll der Spieler wieder steuern können.
 
Mit einem "Player.MoveToMarker" würde der Spieler teleportiert - das will ich vermeiden, er soll schon dahin gehen bzw. laufen. Das ein "DisablePlayerControls" möglich ist, weiß ich, aber ich will ja, dass der Script diese Kontrolle im Grunde "übernimmt"...
 
Hmm, das ist ein Problem, welches mir in unserem Mod-Projekt auch demnächst noch bevorsteht. Ob man es zufriedenstellend lösen kann, weiß ich noch nicht. Im Kopf habe ich die Idee, mittels Player.CreateFullActorCopy eine Kopie des Spielers zu erzeugen und diese dann per Skript/AI-Package zu steuern. Dem Spieler soll währenddessen, wie hier bereits angesprochen, die Kontrolle entzogen und die Spielfigur mit Player.SAA 0.0 unsichtbar gemacht werden.

Die eine Frage ist, wie man das dann mit der Kamerasteuerung hinkriegt. Man müsste die eigentliche Spielfigur der Kopie folgen lassen, also mit ständigen kleinen MoveTo oder SetPos und SetAngel-Befehlen arbeiten. Nur weiß ich noch nicht, wie "ruckelig" das wird. Evtl. könnte man auch feste "Kamerapositionen" längs des Weges den die Kopie gehen muss einrichten, an welche der Spieler versetzt wird, um ihn von dort aus die Szene beobachten zu lassen. (wie bei einem Formel1-Rennen). Der Spieler wird allerdings immer noch per Mausrad rein- und rauszoomen können. Dies läßt sich m.W. nicht verhindern. Ebenso wirst Du glaube ich nicht ausschließen können, dass der Spieler während der Szene speichert. Das Hauptmenü samt Speicherfunktion ist trotz DisablePlayerControls ja leider immer noch aufrufbar.

Die zweite Frage wird sein, ob es gelingt, die Übergänge zwischen dem normalen und dem ferngesteuerten Teil einigermaßen "glatt" zu gestalten. In meinem Fall geht der Spieler durch eine Tür und anschließend soll die Fernsteuerung aktiv sein. Da ist somit eh der Loadscreen dazwischen. Bei der Triggerbox und später dem Umschalten unmittelbar vor dem Gespräch mit dem NPC wird es aber wohl etwas seltsam aussehen, wenn plötzlich die Kopie erscheint und verschwindet. Außerdem benötigt CreateFullActorCopy machmal ein paar Sekunden, bis die Kopie dargestellt wird.

Der Teil mit dem Gespräch sollte relativ einfach sein. Sobald die Kopie in die Nähe des NPCs gelangt, wird sie entfernt (DeleteFullActorCopy) und der Spieler, immer noch ohne Kontrolle, an deren Position "gemoved". Anschließend eröffnet sofort der NPC per StartConversation Player das Gespräch. Sofern die "Choices" aufeinander folgen, kommt der Spieler aus dem Dialog nicht raus. Am Ende teleportiert der NPC sich fort und erst danach wird die Kontrolle für den Spieler wieder freigegeben.

Naja, nur so eine Idee. Bislang ist mir noch keine geschicktere Methode eingefallen, wie man sonst die Spielfigur steuern könnte. Direkt auf den Spieler einzuwirken und ihn gegen seinen Willen etwas tun zu lassen, ist von den Entwicklern ja leider nicht vorgesehen.
 
  • Like
Reaktionen: Fellan
Ich könnte mir vorstellen, das wenn man den Player mit Moveto Befehlen jeden Frame bewegt kein sichtbares Ruckeln entsteht, denn die Bewegung des Spielers wird ja zwischen 2 Frames nicht sichtbar interpoliert, wie denn auch, weil man zwischen 2 Frames ja nicht sieht (Wer das wohl jetzt verstanden hat :-D).
Optimal wäre es natürlich, wenn man die FPS mit in das Bewegungsscript einbaut, doch ich weiß nicht wie man die auslesen kann.
Und anstatt eine Kopie zu erstellen könnte man ja vielleicht einfach den Player in die Laufanimation schicken, aber das nur als Alternativevorschlag.

MfG
Junker Locklear
 
Gutgut, ich habe mal versucht, aus deiner Beschreibung einen Script zu formen:

Code:
scn MeinTollerScriptDerDenSpielerAutomatischGehenLässt

begin onActivate Player [COLOR=Gray];Script liegt auf einer TriggerBox

[COLOR=Black]if ( WGTSewersActivated == 1 ) [COLOR=Gray];"if" nur in meinem Fall wichtig
   [COLOR=Black]DisablePlayerControls
   if ( GetPlayerControlsDisabled == 1 ) [COLOR=Gray];kontrolliert, ob die Steuerung auch wirklich aus ist
[/COLOR][/COLOR][COLOR=Black]Player.CreateFullActorCopy [COLOR=Red];wie lasse ich die nun mit einem Travel-Package zu Punkt X gehen? Wie heißt die ID der Kopie?
[COLOR=Black]      Player.SAA 0.0
      Player.MoveToMarker [COLOR=DarkOrange]Marker-ID[COLOR=Black] [COLOR=Gray];bringt den mittlerweile unsichtbaren Spieler zu Punkt X, der die Kameraposition darstellt - der Spieler kann, trotz DisablePlayerControls weiterhin die Kamera bewegen!
      [COLOR=Red];if-Kontrolle, die "wartet", bis die Spieler-Kopie in einem bestimmten Radius zum NPC gekommen ist?[COLOR=DarkOrange][COLOR=Black][COLOR=DarkOrange][COLOR=Black]
         [COLOR=Red];ist die Spieler-Kopie beim NPC angekommen, wird diese mit dem echten Spieler ersetzt, der wieder sichtbar gemacht wird.
[COLOR=Black]      endif
   endif
endif
end

Das ist mir zu hoch, zu kompliziert, lässt sich zu schwer umsetzen - ich denke, ich werde mir etwas anderes überlegen müssen. Trotzdem Danke für die Hilfe. ;)
[/COLOR][/COLOR][/COLOR][/COLOR][/COLOR][/COLOR][/COLOR][/COLOR][/COLOR][/COLOR]
[/COLOR][/COLOR][/COLOR]
[/COLOR][/COLOR][/COLOR]
 
Das ist mir zu hoch, zu kompliziert, lässt sich zu schwer umsetzen

Hehe, Du scheinst Dich irgendwie noch immer nicht so recht mit der Skripterei anfreunden zu können. ;) Dabei ist das doch gerade der interessanteste Part an der ganzen Modderei. :lol:

Falls Du es doch noch versuchen willst, habe ich mal einen Entwurf gemacht, wie es gehen könnte. Ungetestet und ziemlich simpel.

Im OnTrigger-Block wird der Ablauf gestartet, dem Spieler die Kontrolle entzogen und die Kopie erstellt. CreateFullActorCopy liefert die RefID der erzeugten Kopie, diese wird in der Variable SpielerKopieRef gespeichert. Anschließend wird der Kopie eine AI-Package aufgeladen (müsste eine Travel-Package sein) und der Spieler noch an seine Beobachterposition gesetzt.

Im GameMode-Block wird, solange die Kopie den NPC noch nicht erreicht hat, der Blickwinkel (um die Z-Achse) des Players ständig auf die Kopie ausgerichtet. Der Spieler kann (leider) immer noch nach oben und unten sehen.

Erreicht die Kopie den NPC, wird sie enfernt und der Spieler zum NPC "gemoved". Dieser eröffnet sogleich den Dialog. Da der Spieler noch immer keine Kontrolle hat, kann er sich dem nicht entziehen oder den NPC angreifen.

Nach Ende des Gesprächs teleportiert der NPC sich fort und der Spieler erhält die Kontrolle zurück.

Wie gesagt, das Ganze ist noch sehr einfach und müsste sicher noch ausgefeilt werden, damit es gut aussieht. Das Skript soll nur ungefähr das machen, was Du versuchen wolltest. :)

Code:
scn DeinTollerScriptDerDenSpielerAutomatischGehenLässt ;-)

short Ablauf
float WinkelZ
ref SpielerKopieRef

begin OnTrigger Player

   if Ablauf == 0
      Player.SetRestrained 1     ; Spieler kann sich nicht mehr bewegen oder drehen
      Player.saa 0.0                 ; Spieler unsichtbar
      DisablePlayerControls      ; Kontrolle ausschalten

      set SpielerKopieRef to Player.CreateFullActorCopy      ; Kopie erzeugen
      SpielerKopieRef.AddScriptPackage KopieGehtZumNPC      ; Kopie zum NPC gehen lassen

      set Ablauf to 1

      Player.MoveTo KameraMarker

   endif
end

begin GameMode

   if Ablauf == 1
      if SpielerKopieRef.GetDistance NPCRef < 300
         set Ablauf to 2
         SpielerKopieRef.DeleteFullActorCopy
      else
         set WinkelZ to Player.GetAngle Z + Player.GetHeadingAngle SpielerKopieRef
         Player.SetAngle Z WInkelZ
      endif

   elseif Ablauf == 2
      set Ablauf to 3
      Player.MoveTo NPCRef

   elseif Ablauf == 3
      Player.saa 1.0	; Spieler wieder sichtbar
      NPCRef StartConversation Player TopicID      ; NPC beginnt Gespräch

   elseif Ablauf == 4      ; wird im Resultskript des o.g. Topics gesetzt
      NPCRef.CastSpell Fortzaubern NPCRef
      Player.SetRestrained 0      ; Dem Spieler die Kontrolle zurückgeben
      EnablePlayerControls
      set Ablauf to 5      ; Fertig
   endif
end
 
  • Like
Reaktionen: Fellan
Brausebart schrieb:
Hehe, Du scheinst Dich irgendwie noch immer nicht so recht mit der Skripterei anfreunden zu können. ;) Dabei ist das doch gerade der interessanteste Part an der ganzen Modderei. :lol:

Interessant insofern, ob es überhaupt alles klappt, was ich mir so denke. Wenigstens habe ich die Grundlagen verstanden, und mit denen fällt mir meist auch irgendetwas ein, wie ich die Probleme umgehen kann - denn statt sie zu lösen habe ich das bisher meist gemacht. ;)

Zum Script: Ich bin mir sicher, dass ich das noch einmal verwenden kann, danke dafür. Das hier beschriebene Problem will ich aber anders lösen - wie gesagt, das hier kann ich womöglich doch noch einmal brauchen. :)