Fallout 4

Name:       SKK FastStart new game
ModFile:    SKKFastStart.ESP
Platform:   Fallout 4 (PC, XBOX)
Author:     [email protected]
Source:     https://www.nexusmods.com/fallout4/mods/29227
Date:       Jan 2018
Version:    001 onwards



(1) I am just running the base game  

Having published a mod that makes it easier for players to start new games (rather than recycle the same old vault respec or exit save game), the number of new games now being generated exposes issues with the way mod authors are adding items to the player inventory. This is what the unmodfied base game does:


Main Quest MQ101 Pre-War Sanctuary Stage(0) during the transition from the Game Menu > Intro Video > Mirror Scene the quest script calls function PlayerREF.RemoveAllItems() so any mods that have already added player inventory through OnInit() or OnQuestInit() script events will be lost.

MQ101 Stage (900) Move Player to Postwar Vault the quest script calls function PlayerREF.RemoveAllItems() again so any mods later in the load order that do actually manage to place stuff in the active player inventory will then be cleared out between MQ101 Pre War Vault and MQ102 Post war vault. 

This is why many mods cant add suff to a new vanilla game and you need to grovel around with help and additem console commands. 

SKK FastStart New Game intercepts MQ101 at Stage(20) to take control and bypass the Stage(900) inventory clear down, but, any top of load order mods that are unaware of this new game condition will have already lost their stuff at stage zero. Forever in time, like tears in the rain.

SKK SyntheticPlayer intercepts MQ101 at Stage(0) by hacking modifying base game scripts to take control and bypass all stages so the inventory is never cleared. 


(2) I am running an ALT or fast start mod  

Many ALT or Fast start mods bypass MQ101 Pre-War Sanctuary and MQ102 Out of Time quests so their quest stages are never set or marked as completed. Thoughtful mods that try to wait for those completion or stage set triggers will never start/populate inventory.
 
SKK FastStart New Game sets MQ101 quest completed and the key MQ102 vault exit stages 10 and 15 as completed.

SKK SyntheticPlayer sets MQ102 stages 0, 10, and 15 as completed.


(3) Vault 111 exit bottleneck WARNING

Many well crafted mods are using MQ102 Stage(10) "Vault exit elevator" or Stage(15) "Radios on" to start their processing, and now Creation Club content also seems to kick ALL OF ITS QUESTS AT ONCE here as well. Some sort of throttling is in order (technical and metaphorical).


 "If only someone would do something about the apathy here"


This has lead to massive backlogs in quest event processing, to the point where the main quest MQ102 can take several minutes to return stages which can miss scenes and triggers. The player can sprint to Sanctuary, trip all manner of out of sequence triggers and glitch Codsworth dialogue before MQ102 has caught up.

I have had to re-architect SKK FastStart from a sweet and simple linear single script to split multi thread at vault exit to get my unfair share of resource time, just to try and shutdown and clear space for all this nonsense.

As you can't count on any MQ102 stages firing with most ALT and FAST start mods bypassing them, plus the vault exit bottleneck, mod authors should have a fallback of player location changes in the world using the OnLocationChange event. Be aware that the Vault111 location spans both the internal vault and the external vault elevator areas, so it will not trigger until the player is moving down the hill.


If you are a mod author and unsure what all this is about, please reach out to me and help reduce your mod users bitching about your inventory problems that SKK FastStart or SyntheticPlayer is exposing (no, not causing).


 "If only someone would do something about the irony here"


(4) Robust new game start script

This is the model script that over 50 different SKK solutions use to cope with the many and varied new game start conditions (except if starting a custom game in an interior or worldspace other than Commonwelth):

Scriptname SKK_ModelQuestScript extends Quest

;************************************************************************

Actor      Property pPlayerREF     Auto Const Mandatory
Quest      Property pMQ101         Auto Const Mandatory
Quest      Property pMQ102         Auto Const Mandatory
Worldspace Property pCommonwealth  Auto Const Mandatory

Bool bAddInventoryDone = FALSE ;one time switch

;************************************************************************

Event OnQuestInit()
   If (pMQ101.IsCompleted() == True) || (pMQ102.GetStage() >= 0) || (pPlayerREF.GetWorldspace() == pCommonwealth)
      AddInventory() ;Game is past MQ101 RemoveAllItems quest stages
   Else 
      Self.RegisterForRemoteEvent(pMQ101, "OnStageSet")
      Self.RegisterForRemoteEvent(pMQ102, "OnStageSet")
      Self.RegisterForRemoteEvent(pPlayerREF), "OnLocationChange")
   Endif
EndEvent 

;************************************************************************

Event Quest.OnStageSet(Quest akSender, int auiStageID, int auiItemID)
   If (akSender == pMQ101) && (auiStageID > 900) ;past the last MQ101 inventory clear-down.
      AddInventory() ; stuff that can be available in V111 (although no Pipboy to activate) 
   ElseIf (akSender == pMQ102) && (auiStageID >= 0)  ;player wakes in cryo pod.
      AddInventory() ;stuff that can be available in V111 (although no Pipboy to activate) 
   ElseIf (akSender == pMQ102) && (auiStageID >= 10) ;v111 elevator exit.
      AddInventory() ; stuff that shoud only be available in the world.
    Endif
EndEvent

;************************************************************************

Event Actor.OnLocationChange(Actor akSender, Location akOldLoc, Location akNewLoc)
   If (pPlayerREF.GetWorldspace() == pCommonwealth) ;exiting V111 location. 
   AddInventory()
   EndIf
EndEvent

;************************************************************************

Function AddInventory()
   Self.UnRegisterForRemoteEvent(pMQ101, "OnStageSet")
   Self.UnRegisterForRemoteEvent(pMQ102, "OnStageSet")
   Self.UnRegisterForRemoteEvent(pPlayerREF), "OnLocationChange")
   If (bAddInventoryDone == FALSE) ;onetime switch
      bAddInventoryDone = TRUE
      Self.RegisterForRemoteEvent(pPlayerREF, "OnPlayerLoadGame") ; for updates
      ;do your stuff
   EndIf
EndFunction

;************************************************************************

Event Actor.OnPlayerLoadGame(Actor akSender)
   ;do update stuff
EndEvent

;************************************************************************

Article information

Added on

Edited on

Written by

SKK50