Spacing companions in a cutscene

In cutscenes fired from speak triggers I normally don’t have any issues because I tend to have two companions but with three sometimes one gets in the way of the one that’s speaking or the camera angles go wrong. The conversation line node is set to close up ( default ) for the camera but says random at the top when you don’t open up the camera part of the node and I just leave it up to the game to do the rest.

If I move the companions about during the first line of the conversation you can get some weird results with everybody bumping into each other or facing a wall before they talk. So…

Is there a way of getting the camera to pick up on characters more accurately and not through people ? Or move them into better positions like a SetPersonalSpace function or ApplyStopHoldingHandsItsOnlyaDungeon Mode? I don’t want to NWN1 style it and prefer cutscenes which tend to work more reliably.

Thank you.

On the first node of the convo, you could use a ‘ga_jump_party_in_formation’ script (and waypoint) along with a ‘ga_party_freeze’ script. Make sure to use a ‘ga_party_unfreeze’ script at the end of the convo.

1 Like

@Tsongo I have scripts for this. Let me take a look in my latest module and get back to you.

I did it like this in my third and newly released module at some places.

  1. Make a few waypoints where you want the PC and the companions to stand, so they face each other like you want at an appropriate distance
  2. Then make a New Generic Trigger where you put a script like this at the OnEnter of the trigger.
  3. Make sure that you have a script somewhere on some node of the dialogue where the PC exits CutSceneMode otherwise the player won’t be able to move once the dialogue is done.

OnEnter trigger script example:

void main()
object oPC = GetEnteringObject();

if (!GetIsPC(oPC)) return;

int DoItOnce = GetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF));	

if (DoItOnce==TRUE) return;

		object oWP1 = GetNearestObjectByTag("wptfb1");
		object oWP2 = GetNearestObjectByTag("wptfb2");
		object oCompanion1 = GetNearestObjectByTag("comp1");
		object oCompanion2 = GetNearestObjectByTag("comp2");
		object oCompanion3 = GetNearestObjectByTag("comp3");
		object oCompanion4 = GetNearestObjectByTag("comp4");
		object oFactionLeader = GetFactionLeader(oPC);
		AssignCommand(oFactionLeader, ClearAllActions());
		AssignCommand(oCompanion1, ClearAllActions());
		AssignCommand(oCompanion2, ClearAllActions());
		AssignCommand(oCompanion3, ClearAllActions());
		AssignCommand(oCompanion4, ClearAllActions());
		AssignCommand(oCompanion1, ActionJumpToObject(oWP1));
		AssignCommand(oCompanion2, ActionJumpToObject(oWP1));
		AssignCommand(oCompanion3, ActionJumpToObject(oWP2));
		AssignCommand(oCompanion4, ActionJumpToObject(oWP2));
		AssignCommand(oFactionLeader, ActionJumpToObject(oWP2));

		SetCutsceneMode(oPC);  // this needs to be cleared by the dialog's End/Abort dialog handlers.
        	AssignCommand(oCompanion1, ActionStartConversation(oFactionLeader, "conversation", FALSE, FALSE, FALSE, FALSE));


Exit cutscene mode script that I use somewhere on a node in the dialogue(I think you can do this in another way too, but that’s just the way I do it):

void main()

object oPC = GetPCSpeaker();


Edit: When you have done it like this, and you’re now sure exactly where everyone is going to stand, you can then set up cameras that you tweak, so that they show the characters exactly the way you like, if you want it to be even more controlled from your part.

Edit 2: And you can of course use even more waypoints to really control exactly where each and everyone is standing.


preferable to slot that script in the dialog’s End and Abort eventslots (see dialog Properties)

/just sayin’


andgalf and travus… Thank you for the ideas I am going to investigate this and see which conversations need fixing, it’s usually the indoor ones that go a bit weird because it’s a bit more cramped.

kevL_s… I like scripts that look like that, I can fully understand them !

1 Like

Yes, I agree. Just saying that you can put this script in any node really. It works that way too, but sure, it should probably go in the End and Abort eventslots.

I hope that you get things working the way you want @Tsongo.

andgalf… Thanks and I hope I can get it working right too it’s a bit annoying looking through people’s heads, or a shield or just not knowing who’s saying what !