Taft Tunnel followers glitch

Post » Mon Feb 22, 2010 8:52 am

I'm trying to fix a little thing that was bugging me. When I'm in the Taft Tunnel, Garza complains about his heart. Right after that, any vanilla followers I have hired appear out of nowhere and just wait at the tunnel entrance. If you currently have the followers "following", it's not a big deal. But if you have them waiting say at the players house - it's really annoying to have them pop in and wait. The first time through, I had them waiting at the Megaton house and they appeared in Taft and just waited. I didn't even realize they where there and kept going. I had to reload a previous save after I finished and returned to Megaton only to find the house empty.

I found the code that teleports them to Taft, but I'm not really sure how to prevent it from happening. The only thing I can think of is:

1) Check every Jefferson, Purity, Jefferson Wasteland cell - if there in one of those - teleport them.

2) Check the players houses (which will break down if they are waiting somewhere else) - if they're not in those - teleport them.

Just wondering if some scripting gurus have a better solution (preferably without FOSE).

Here is the vanilla code that teleports them to Taft:

scn MQ05FollowerCatchupTrigSCRIPT; this script runs on a trigger in TaftTunnel01 that fakes followers moving through a load door ;	in case they've been left behind somewhere at Project Purity or Taft Tunnel; Erik may want ot make this more robust later on.short doOncebegin onTriggerEnter player	if doOnce == 0		set doOnce to 1		MQ05EnclaveTaftBarrier.enable									; enable Enclave energy field to prevent backtracking in 02		DisableNavmesh TaftMinMesh									; disable navmesh under that energy field to prevent NPC pathing in low?		TaftCheckpointDoor.unlock											; unlock door @ Brotherhood checkpoint			if getStage MQ05 >= 80 && getStage MQ05 < 100	;; // Check for here/dead on all the MQ05 tagalong NPCs			if DoctorLiRef.getInCell TaftTunnel01 == 0				if DoctorLiRef.getDead == 0					DoctorLiRef.moveto MQ05FollowerCatchupMarker				endif							endif			if GarzaRef.getInCell TaftTunnel01 == 0				if GarzaRef.getDead == 0					GarzaRef.moveto MQ05FollowerCatchupMarker				endif							endif			if DanielAgincourtRef.getInCell TaftTunnel01 == 0				if DanielAgincourtRef.getDead == 0					DanielAgincourtRef.moveto MQ05FollowerCatchupMarker				endif							endif			if AlexDargonRef.getInCell TaftTunnel01 == 0				if AlexDargonRef.getDead == 0					AlexDargonRef.moveto MQ05FollowerCatchupMarker				endif							endif	;; // Check for hired/here/dead on all the NPC followers the player might have			if followers.CharonHired == 1 && CharonREF.getInCell TaftTunnel01 == 0				if CharonREF.getDead == 0					CharonREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.FawkesHired == 1 && MQ08FawkesREF.getInCell TaftTunnel01 == 0				if MQ08FawkesREF.getDead == 0					MQ08FawkesREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.JerichoHired== 1 && JerichoREF.getInCell TaftTunnel01 == 0				if JerichoREF.getDead == 0					JerichoREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.StarPaladinCrossHired== 1 && StarPaladinCrossREF.getInCell TaftTunnel01 == 0				if StarPaladinCrossREF.getDead == 0					StarPaladinCrossREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.ButchHired== 1 && ButchREF.getInCell TaftTunnel01 == 0				if ButchREF.getDead == 0					ButchREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.RL3Hired== 1 && RL3REF.getInCell TaftTunnel01 == 0				if RL3REF.getDead == 0					RL3REF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.CloverHired== 1 && CloverREF.getInCell TaftTunnel01 == 0				if CloverREF.getDead == 0					CloverREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.DogmeatHired== 1 && DogmeatREF.getInCell TaftTunnel01 == 0				if DogmeatREF.getDead == 0					DogmeatREF.moveto MQ05FollowerCatchUpMarker				endif			endif		endif	endifend

It makes sure they're hired, in Taft, and not dead - but is there an easy way to check if there waiting outside Jefferson? Otherwise I'm probably going with option 1.

TIA
User avatar
adame
 
Posts: 3454
Joined: Wed Aug 29, 2007 2:57 am

Post » Mon Feb 22, 2010 12:23 pm

I'm trying to fix a little thing that was bugging me. When I'm in the Taft Tunnel, Garza complains about his heart. Right after that, any vanilla followers I have hired appear out of nowhere and just wait at the tunnel entrance. If you currently have the followers "following", it's not a big deal. But if you have them waiting say at the players house - it's really annoying to have them pop in and wait. The first time through, I had them waiting at the Megaton house and they appeared in Taft and just waited. I didn't even realize they where there and kept going. I had to reload a previous save after I finished and returned to Megaton only to find the house empty.

I found the code that teleports them to Taft, but I'm not really sure how to prevent it from happening. The only thing I can think of is:

1) Check every Jefferson, Purity, Jefferson Wasteland cell - if there in one of those - teleport them.

2) Check the players houses (which will break down if they are waiting somewhere else) - if they're not in those - teleport them.

Just wondering if some scripting gurus have a better solution (preferably without FOSE).

Here is the vanilla code that teleports them to Taft:

scn MQ05FollowerCatchupTrigSCRIPT; this script runs on a trigger in TaftTunnel01 that fakes followers moving through a load door ;	in case they've been left behind somewhere at Project Purity or Taft Tunnel; Erik may want ot make this more robust later on.short doOncebegin onTriggerEnter player	if doOnce == 0		set doOnce to 1		MQ05EnclaveTaftBarrier.enable								; enable Enclave energy field to prevent backtracking in 02		DisableNavmesh TaftMinMesh								; disable navmesh under that energy field to prevent NPC pathing in low?		TaftCheckpointDoor.unlock										; unlock door @ Brotherhood checkpoint			if getStage MQ05 >= 80 && getStage MQ05 < 100;; // Check for here/dead on all the MQ05 tagalong NPCs			if DoctorLiRef.getInCell TaftTunnel01 == 0				if DoctorLiRef.getDead == 0					DoctorLiRef.moveto MQ05FollowerCatchupMarker				endif							endif			if GarzaRef.getInCell TaftTunnel01 == 0				if GarzaRef.getDead == 0					GarzaRef.moveto MQ05FollowerCatchupMarker				endif							endif			if DanielAgincourtRef.getInCell TaftTunnel01 == 0				if DanielAgincourtRef.getDead == 0					DanielAgincourtRef.moveto MQ05FollowerCatchupMarker				endif							endif			if AlexDargonRef.getInCell TaftTunnel01 == 0				if AlexDargonRef.getDead == 0					AlexDargonRef.moveto MQ05FollowerCatchupMarker				endif							endif;; // Check for hired/here/dead on all the NPC followers the player might have			if followers.CharonHired == 1 && CharonREF.getInCell TaftTunnel01 == 0				if CharonREF.getDead == 0					CharonREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.FawkesHired == 1 && MQ08FawkesREF.getInCell TaftTunnel01 == 0				if MQ08FawkesREF.getDead == 0					MQ08FawkesREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.JerichoHired== 1 && JerichoREF.getInCell TaftTunnel01 == 0				if JerichoREF.getDead == 0					JerichoREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.StarPaladinCrossHired== 1 && StarPaladinCrossREF.getInCell TaftTunnel01 == 0				if StarPaladinCrossREF.getDead == 0					StarPaladinCrossREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.ButchHired== 1 && ButchREF.getInCell TaftTunnel01 == 0				if ButchREF.getDead == 0					ButchREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.RL3Hired== 1 && RL3REF.getInCell TaftTunnel01 == 0				if RL3REF.getDead == 0					RL3REF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.CloverHired== 1 && CloverREF.getInCell TaftTunnel01 == 0				if CloverREF.getDead == 0					CloverREF.moveto MQ05FollowerCatchUpMarker				endif			endif			if followers.DogmeatHired== 1 && DogmeatREF.getInCell TaftTunnel01 == 0				if DogmeatREF.getDead == 0					DogmeatREF.moveto MQ05FollowerCatchUpMarker				endif			endif		endif	endifend

It makes sure they're hired, in Taft, and not dead - but is there an easy way to check if there waiting outside Jefferson? Otherwise I'm probably going with option 1.

TIA


Are you by chance using Project Beauty or PB HD? I had this happen to me a couple of times, and I think (iirc) that I had it narrowed down to that mod causing it.
User avatar
Beth Belcher
 
Posts: 3393
Joined: Tue Jun 13, 2006 1:39 pm

Post » Mon Feb 22, 2010 12:40 pm

No, I'm not using either mod. Actually, the first time through I had no mods installed ( before I knew about them :P ). It's definitely in the vanilla script causing it.

Edit:

This seems to be working:
scn MQ05FollowerCatchupTrigSCRIPT; this script runs on a trigger in TaftTunnel01 that fakes followers moving through a load door ;	in case they've been left behind somewhere at Project Purity or Taft Tunnel; Erik may want ot make this more robust later on.short doOncebegin onTriggerEnter player	if doOnce == 0		set doOnce to 1		MQ05EnclaveTaftBarrier.enable									; enable Enclave energy field to prevent backtracking in 02		DisableNavmesh TaftMinMesh									; disable navmesh under that energy field to prevent NPC pathing in low?		TaftCheckpointDoor.unlock											; unlock door @ Brotherhood checkpoint			if getStage MQ05 >= 80 && getStage MQ05 < 100	;; // Check for here/dead on all the MQ05 tagalong NPCs			if DoctorLiRef.getInCell TaftTunnel01 == 0				if DoctorLiRef.getDead == 0					DoctorLiRef.moveto MQ05FollowerCatchupMarker				endif							endif			if GarzaRef.getInCell TaftTunnel01 == 0				if GarzaRef.getDead == 0					GarzaRef.moveto MQ05FollowerCatchupMarker				endif							endif			if DanielAgincourtRef.getInCell TaftTunnel01 == 0				if DanielAgincourtRef.getDead == 0					DanielAgincourtRef.moveto MQ05FollowerCatchupMarker				endif							endif			if AlexDargonRef.getInCell TaftTunnel01 == 0				if AlexDargonRef.getDead == 0					AlexDargonRef.moveto MQ05FollowerCatchupMarker				endif							endif	;; // Check for hired/here/dead on all the NPC followers the player might have					if followers.CharonHired == 1 && CharonREF.getInCell TaftTunnel01 == 0				if CharonREF.getDead == 0					if (CharonREF.GetInCell PPurity == 1 || CharonREF.GetInWorldspace Wasteland == 1)						CharonREF.moveto MQ05FollowerCatchUpMarker					endif				endif			endif			if followers.FawkesHired == 1 && MQ08FawkesREF.getInCell TaftTunnel01 == 0				if MQ08FawkesREF.getDead == 0					if (MQ08FawkesREF.GetInCell PPurity == 1 || MQ08FawkesREF.GetInWorldspace Wasteland == 1)						MQ08FawkesREF.moveto MQ05FollowerCatchUpMarker					endif				endif			endif			if followers.JerichoHired== 1 && JerichoREF.getInCell TaftTunnel01 == 0				if JerichoREF.getDead == 0					if (JerichoREF.GetInCell PPurity == 1 || JerichoREF.GetInWorldspace Wasteland == 1)						JerichoREF.moveto MQ05FollowerCatchUpMarker					endif				endif			endif			if followers.StarPaladinCrossHired== 1 && StarPaladinCrossREF.getInCell TaftTunnel01 == 0				if StarPaladinCrossREF.getDead == 0					if (StarPaladinCrossREF.GetInCell PPurity == 1 || StarPaladinCrossREF.GetInWorldspace Wasteland == 1)						StarPaladinCrossREF.moveto MQ05FollowerCatchUpMarker					endif				endif			endif			if followers.ButchHired== 1 && ButchREF.getInCell TaftTunnel01 == 0				if ButchREF.getDead == 0					if (ButchREF.GetInCell PPurity == 1 || ButchREF.GetInWorldspace Wasteland == 1)						ButchREF.moveto MQ05FollowerCatchUpMarker					endif				endif			endif			if followers.RL3Hired== 1 && RL3REF.getInCell TaftTunnel01 == 0				if RL3REF.getDead == 0					if (RL3REF.GetInCell PPurity == 1 || RL3REF.GetInWorldspace Wasteland == 1)						RL3REF.moveto MQ05FollowerCatchUpMarker					endif				endif			endif			if followers.CloverHired== 1 && CloverREF.getInCell TaftTunnel01 == 0				if CloverREF.getDead == 0					if (CloverREF.GetInCell PPurity == 1 || CloverREF.GetInWorldspace Wasteland == 1)						CloverREF.moveto MQ05FollowerCatchUpMarker					endif				endif			endif			if followers.DogmeatHired== 1 && DogmeatREF.getInCell TaftTunnel01 == 0				if DogmeatREF.getDead == 0					if (DogmeatREF.GetInCell PPurity == 1 || DogmeatREF.GetInWorldspace Wasteland == 1)						DogmeatREF.moveto MQ05FollowerCatchUpMarker					endif				endif			endif					endif	endifend

If there in any of the PPurity Interior cells or in the Wasteland worldspace, they will be teleported. Otherwise, they'll stay where they are.

I didn't know http://geck.gamesas.com/index.php/GetInCell works with partial names, and I still don't know hot to check if a ref is in a particular worldspace cell (
Spoiler
because parts of Jefferson get fenced off
). So it checks if they're in any Wasteland worldspace cell.
User avatar
Alan Cutler
 
Posts: 3163
Joined: Sun Jul 01, 2007 9:59 am

Post » Mon Feb 22, 2010 12:58 am

I'm trying to fix a little thing that was bugging me. When I'm in the Taft Tunnel, Garza complains about his heart. Right after that, any vanilla followers I have hired appear out of nowhere and just wait at the tunnel entrance. If you currently have the followers "following", it's not a big deal. But if you have them waiting say at the players house - it's really annoying to have them pop in and wait.



I guess if you're not familiar with followers, this would look like a big deal.

All you have to do is have the script check for the follower's wait variable (it lives in each follower's object script), and I guess you could check for if the follower is alive. The move would be skipped if wait was in place, and never executed if the follower was dead. I suspect that the script not checking this as Bethesda wrote it was a little slipup. Positively no FOSE needed, it's straightforward.

If what you're thinking about is, what if the taft tunnel becomes unreachable after that part of the main quest is passed, and the player made the follower wait in there.. well, imo, the player sorta deserves what he gets in that case. Phalanx doesn't even cover that and I don't expect to code for it, that's a player screwup and they can go to my "Gary" helper NPC if they need to repair their game from doing *that*. But if you wanted, you could do a check for encounterzone once the player leaves that area and teleport the follower out at that time.
User avatar
Courtney Foren
 
Posts: 3418
Joined: Sun Mar 11, 2007 6:49 am

Post » Mon Feb 22, 2010 10:04 am

I'm really hesitant when it comes to messing with vanilla stuff. So when I have to change something like that, I usually ask for help. My horns are still pretty green :P

I guess having them trapped in Purity was a concern, but really - I don't take followers on the main quests. But I'm going to start a new game soon and I might take them next time. Really it was just getting them to stay where I tell them to stay. If I leave them in the players house, they shouldn't pop into Taft - which is what was happening.

There are a few times in the game where the followers just pop in out of nowhere when I told them to wait. Taft is one, when I return from Zeta is another (I can't figure out why that one does it - there's no moveto).

I'll have to check out Phalanx and see what you mean. I have way too many mods to try. Just trying to button up my darn house mod so I can start playing again :)

On a positive note, I did figure out how to get the followers to wait at a custom location for an indefinite amount of time while trying to fix the Taft glitch.
User avatar
Gavin Roberts
 
Posts: 3335
Joined: Fri Jun 08, 2007 8:14 pm

Post » Sun Feb 21, 2010 9:45 pm

I'm really hesitant when it comes to messing with vanilla stuff. So when I have to change something like that, I usually ask for help. My horns are still pretty green :P

I guess having them trapped in Purity was a concern, but really - I don't take followers on the main quests. But I'm going to start a new game soon and I might take them next time. Really it was just getting them to stay where I tell them to stay. If I leave them in the players house, they shouldn't pop into Taft - which is what was happening.

There are a few times in the game where the followers just pop in out of nowhere when I told them to wait. Taft is one, when I return from Zeta is another (I can't figure out why that one does it - there's no moveto).

I'll have to check out Phalanx and see what you mean. I have way too many mods to try. Just trying to button up my darn house mod so I can start playing again :)

On a positive note, I did figure out how to get the followers to wait at a custom location for an indefinite amount of time while trying to fix the Taft glitch.


Yeah if you're looking for a one stop shop for follower fixes, Phalanx is a big pile of them. Just stay on top of the releases if you get it (like the update happening in a few days). I don't have the biggest base of testers, and it shows now and then, so my updates tend to have bugfixes for its own, added content.

But, if you're looking for how to code follower fixes yourself, as a learning thing - Phalanx is not necessarily a good starting point - a number of things have been completely rewritten and I do some kinda hard-to-follow stuff. For simple stuff it's best to ask in here I think.

Zeta does have a moveto, I am told. But its not a glitch per-se... it would take a while to explain that one.
User avatar
Mr. Allen
 
Posts: 3327
Joined: Fri Oct 05, 2007 8:36 am

Post » Sun Feb 21, 2010 8:58 pm

I should be wrapping up pretty soon and I'll give it a try. I'll let you know if I find any bugs :)

I searched up and down for the Zeta moveto, couldn't find it. I tell any followers to wait in the player house, go to Zeta, return immediately and they're standing around the return point. The followers are pretty cool, but I hate babysitting.
User avatar
Dalia
 
Posts: 3488
Joined: Mon Oct 23, 2006 12:29 pm

Post » Sun Feb 21, 2010 10:40 pm

My understanding is that in zeta, there is a script which, when you exit zeta, it checks the FollowerREF.hasbeenhired variable and moves the follower based upon that. One reason they may have picked that variable is because, in the vanilla game, followers auto-fire if they are made to wait for longer than a day or so. So, the Followers.NameHired variable wouldn't have been positively helpful in returning the player's follower to him (vanilla tries to force only 1 in most cases).

It's got the problems that any follower who was fired is also dragged by the code, and also any follower who's waiting and who has not had their little internal timer expire is also moved. But they aren't grossly destructive problems, at least.

Moving followers who are being made to wait is not all that bad in this case (although that's not what I will do in Phalanx). What I do not like is the way the code moves fired followers. When I make a compatibility module for Phalanx and Phalanx/FOOK, I might park the followers near the capture site and force the player to return to that spot to retrieve them, similar to what I did for the MQ08Capture scene. My versions of the followers have no self-firing wait-related code, so the whole thing is kinda easier for me to work with than it would have been for Bethesda (assuming that they didn't want to modify the followers' object scripts this far down the road).
User avatar
Mashystar
 
Posts: 3460
Joined: Mon Jul 16, 2007 6:35 am

Post » Mon Feb 22, 2010 2:24 am

I think I got it. I don't think it uses a moveto, it just makes them stop waiting if they are hired and waiting.

I went to Zeta and coc'ed to the Megaton player house and they where still waiting in there. So I coc'ed to Zeta and returned - they where running towards the return point from the direction of Megaton. I looks like returning to the wasteland just turn off there waiting and the start running towards they players location from where ever they are.

Here's a snip from the vanilla script: DLC05TeleporterDoorMasterScript
				if ( JerichoRef.HasBeenHired == 1 )					if JerichoRef.Waiting == 1						set JerichoRef.Waiting to 0						JerichoRef.EVP					endif				endif				if ( CharonRef.HasBeenHired == 1 )					if CharonRef.Waiting == 1						set CharonRef.Waiting to 0						CharonRef.EVP					endif				endif				if ( DogmeatRef.HasBeenHired == 1 )					if DogmeatRef.Waiting == 1						set DogmeatRef.Waiting to 0						DogmeatRef.EVP					endif				endif				if ( ButchRef.HasBeenHired == 1 )					if ButchRef.Waiting == 1						set ButchRef.Waiting to 0						ButchRef.EVP					endif				endif				if ( CloverRef.HasBeenHired == 1 )					if CloverRef.Waiting == 1						set CloverRef.Waiting to 0						CloverRef.EVP					endif				endif				if ( RL3Ref.HasBeenHired == 1 )					if RL3Ref.Waiting == 1						set RL3Ref.Waiting to 0						RL3Ref.EVP					endif				endif				if ( MQ08FawkesRef.HasBeenHired == 1 )					if MQ08FawkesRef.Waiting == 1						set MQ08FawkesRef.Waiting to 0						MQ08FawkesRef.EVP					endif					endif				if ( StarPaladinCrossRef.HasBeenHired == 1 )					if StarPaladinCrossRef.Waiting == 1 						set StarPaladinCrossRef.Waiting to 0						StarPaladinCrossRef.EVP					endif				endif

I just commented out of the above code and now they stay put.

Thanks
User avatar
Isabella X
 
Posts: 3373
Joined: Sat Dec 02, 2006 3:44 am


Return to Fallout 3