Jump to content

SKKmods

Premium Member
  • Posts

    2725
  • Joined

  • Last visited

Everything posted by SKKmods

  1. Its the 1.10.160 ESL headers all over again ... The CreationKit 1.1.943 update uses a new 0x7 format for BA2 archives that is not backward compatible with previous versions of Fallout4.exe or 3rd party archive tools. The Archive2.exe tool included with CK does work. BA2 archives produced with the new CK can only be used by Fallout4.exe 1.10.980 Since my dev system is fully CK & Fallout4.exe updated, my workflow is to hand pack a BA2 using BSArch and publish two versions; SKKSynthVision_002_980 Update 002 using the new BA2 archive format - use this if you have updated Fallout4.exe Apr 2024 1.10.980 SKKSynthVision_002_162 Update 002 using the old BA2 archive format - use this if you are stuck on Fallout4.exe Nov 2019 1.10.162
  2. Use ..\Fallout 4\Tools\Archive2\Archive2.exe which supports Unknown archive version 0x00000007
  3. Timeframe is ~ 60 seconds between applying the exclusion keyword+moving the actor to holding cell and then finding it again. The "finder" quests are not start game enabled and called from a controller quest script using Quest.Start() ... BUT that does not matter, they can be called [ StartQuest ] from the console with Debug.Trace in OnQuestInit() for the same repro. The keyword is applied direct to the actor ObjectReference.AddKeyword() so it persists past transient alias membership. Of all ~ 622 persistent ActorTypeNPC in base game and DLC the ONLY actor this affects is [Actor < (001AC0CF)>] [ActorBase < (001AC0CD)>] To clear it from the debug log I am GetFormFromFile on that ObjectReference and removing it from any subsequent found RefCollections so my native scripts can silently remove all actors and quests from the world without hacking a single base game script or object and still generate ZERO debug log output. HA!
  4. I have a problem with a quest alias conditional fill. This is not a n00b thing, I have HUNDREDS of quest condition fills in published CK mods, its likely a corner/edge case defect. A quest process picks actor ObjectReferences from a FormList (which makes them globally persistent), moves them to a hidden holding cell and marks them with an "ignore for future processing" keyword which works fine and reports in the Debug.Trace log: SKK_476PrepareWorldQuestScript.PrepareCommonwealth [Actor < (001AC0CF)>] [ActorBase < (001AC0CD)>] [Cell <SKK476HoldingCell (080138BA)>] SKK_476NoDisableKeyword True A following quest RefCollectionAlias conditional fill that looks for globally peristent actors to fill finds the expected ~600 actors, but also keeps including that specific INVULNERABLE actor EVEN THOUGH the conditional fill has specific exclusions (see picture) for GetInCell SKK476HoldingCell == 0 and HasKeyword SKK_476NoDisable == 0 Debug.Trace on the actor properties sitting happily in the RefCollectionAlias shows that the exclusion attributes are still attached: SKK_476ReplaceNPCQuestScript.PrepareNPC [Actor < (001AC0CF)>] [ActorBase < (001AC0CD)>] [Cell <SKK476HoldingCell (080138BA)>] SKK_476NoDisableKeyword True How the hell is the quest conditional fill still picking the actor ? The ONLY unusual thing is that the Actorbase is INVULNERABLE which should not affect conditional attribute evaluations. Unless it does.
  5. Use condition GetWorkshopObjectCount on each of the objects to construct exclusion and inclusion recipe logic.
  6. Nope if it has a construction recipe that allow it to be built or moved it can always be stored. My workaround is for the main object that can be constructed once (recipie condition GetWorkshopObjectCount == 0) to detect workshop mode and swap itself out for the workshop movable proxy object that uses the same NIF, then manage that; ;******************************************************************************************** Event OnLoad() Self.RegisterForRemoteEvent(Self.GetLinkedRef(pWorkshopItemKeyword), "OnWorkshopMode") EndEvent ;******************************************************************************************** Event ObjectReference.OnWorkshopMode(ObjectReference akSender, bool aStart) If(aStart == true) Self.Disable() ObjectReference MyProxy = Self.PlaceAtMe(pMyProxyObject) Self.SetLinkedRef(MyProxy, None) Else ObjectReference MyProxy = Self.GetLinkedRef(None) Self.SetLinkedRef(None, None) If(MyProxy != None) && (myProxy.is3dloaded() == true) ; it has not been stored Self.MoveTo(MyProxy) MyProxy.Disable() MyProxy.Delete() EndIf Self.Enable() EndIf EndEvent ;********************************************************************************************
  7. Great core info as usual. In this case the map marker ObjectReferences are all persistent as the global finder quest can find them. The ObjectReferences to exclude are static CK drag n drops into the form list, verified in game with Debug.Trace iteration: SKK_TarkovQuestScript.GenerateEnableStateList 0 [Form < (0009B040)>].IsInList [FormList < (1C01477F)>] SKK_TarkovQuestScript.GenerateEnableStateList 1 [Form < (0010196C)>].IsInList [FormList < (1C01477F)>] SKK_TarkovQuestScript.GenerateEnableStateList 2 [ObjectReference < (0016349B)>].IsInList [FormList < (1C01477F)>] Unfortunatley console [ IsInList ] does not seem to return >> 1.0 for any form types in my games to validate. Appreciate the offer but I cant use any DLL injections
  8. I use a lot of quest conditional fils in object finder quests. Using IsInList > FormList to exclude base object forms works fine e.g. MiscObject, Weapon or ActorBase forms. If the FormList is of in game ObjectReferences, they seem to be ignored. Question: has anyone ever successfully used Condition.IsInList with a list of ObjectReferences ? The usecase: quest confitional fill finds all wordspace mapmarkers (GetIsId==Mapmarker that are enabled IsDisabed==0) fine. But needs to exclude a static list of those that are known to have EnableStateParents. There is no known condition or script function to dynamically detect an object has EnableStateParent. Therefore trying to use (IsInList==ListToExclude) but they are still included in the conditional quest fill.
  9. Whilst the MoveTo navmesh "marker" is not script addressible, just for fun I messed around with xEdit overrides of XNDP (Navigation Door Link - Navmesh) records. Had some unpredictable sucess/failures changing the target navmesh triangle to maintain NPC pathing and map portal targets. Oh well.
  10. I can get a handle to a load door ObjectReference in script and move that fine. Unfortunatley the associated/linked yellow actor teleport marker does not move with the door object (in CK render window or in game with script), the player keeps teleporting to the original teleport marker location. Before I waste a stack of time on this, does anyone KNOW absolutley if it is possible or impossible to get a handle to and move a teleport marker in script ? I was originally using activators with OnActivate scripted Moveto but the game doesnt know about that path for map marker display and npc pathing and I woudl like to have it all.
  11. *** THE ACTUAL ANSWER: For INTERIOR CELL workshops ground collision is provided by floor tiles like CaveRmFloor512Mid01 or DCKitMudGround01, building out a layer of them at -1.0 Z below the decorative floor works perfectly. If anyone knows the specific NIF or HAVOK collison property that makes those objects "workshop ground" let us know. ***
  12. > I can't compare a Global to a global Yes you can: if(myGlobalVariableA.GetValue() == myGlobalVariableB.GetValue()) > I can't compare a Global to an "int" Yes you can: if(myGlobalVariableA.GetValue() as Int == IntVariable) OR if(myGlobalVariableA.GetValue() == (IntVariable as Float)) Although if your Global actually does contain a decimal you may want to use the Math.Ceiling() or Math.Floor() Int conversions. > I can't make "int" = Global. Yes you can: myGlobalVariableA.SetValue(IntVariable as Float)
  13. I find that new textures (and FUZ audio) loose file are often not found in game until they are packed in BA2 archives. Not that the files are read/loaded from the archives with loose files enabled, but as if the game doesnt notice them until it is forced to scan a BA2 and like "oh, hello some new files to load".
  14. Unfortunately BldDecoSmFlrOnly01 also does not work ... but ... trusty old CaveRmFloor512Mid01 does ! And looking more closely at DmndPlayerHome01 it is underpinned by a bunch of DCKitMudGround01 tiles which are flatter than CaveRmFloor. So the answer appears to be that for INTERIOR workshops ground collision is provided by mud tiles and building out a layer below the set dressing pieces at -1.0 Z works perfectly.
  15. Unfortunatley the navmesh import configuration does not seem to have any impact (geddit?) on workshop build objects detecting interior floor piece ground collision. The same objects that will not detect ground in game (for example WorkshopNpcBedMetalLay01) will happily snap to the floor/ground in the CK render window.
  16. *** THE ACTUAL ANSWER: For INTERIOR CELL workshops ground collision is provided by floor tiles like CaveRmFloor512Mid01 or DCKitMudGround01, building out a layer of them at -1.0 Z below the decorative floor works perfectly. If anyone knows the specific NIF or HAVOK collison property that makes those objects "workshop ground" let us know. *** Created a new interior cell using BldWlpSmFlrCeil01 with finalised navmesh and added a workshop. In game workshop build mode can place objects that have AV WorkshopAnythingIsGround OK. But most workshop build objects do not have that AV and will not detect the in game floor, showing the red I AM FLOATING outline. Have tried the GroundPiece checkbox no effect. Have tried using ground pieces from DmndPlayerHouse01 no effect. Adding AV WorkshopAnythingIsGround works on any workshop build object, but is impractical to retrohack all buildable objects.
  17. By adjusting uGridsToLoad I have observed that when there are ~300 actors in the loaded area a save becomes unloadable.
  18. That also happens when healing friendly NPC actors like settlers from bleedout caused by actual hostile/enemies ~5% of the time they then turn hostile and aggro the player UNLESS this is called before bleedout recovery ends: (ThisREF as Actor).StopCombat() ;avoid hostility when bleedout ends (ThisREF as Actor).StopCombatAlarm() ;avoid hostility when bleedout ends NPC starts bleedout from combat; is hostile to player = false NPC recovers from bleedout without clearing combat state; is hostile to player = true
  19. I dont *KNOW* but have always inferred that base forms are NOT saved in a .FOS save, because when a mod is removed with thoise forms instantiated in the game the error log shows: Cannot open store for class THE_BASE_FORM_I_REMOVED, missing file? You could explore with a test; create mod with a new each base form type with a script that spawns one of each principle form into the world or uses a form (e.g. an actor that uses new level lists, perk, mgef, combat styles), save and remove the mod. See what errors you get.
  20. Check your compiled PEX files are in .../Fallout 4/Data/Scripts Check that loading those loose files are still enabled with the bInvalidateOlderFiles settings. Add some Debug.Trace statements to check the scripts are attaching to in game Forms/Objects
  21. I reused that system to launch Fallout 76 Nukes at the Commonwealth with a spawned target marker and it works fine. Place function: ObjectReference ThisNuke = NukeMarker.PlaceAtMe(pSKK_476NukeMissileTarget, 1, false, false) Utility.Wait(5) ThisNuke.Disable() ThisNuke.Delete() Script attached to SKK_476NukeMissileTarget: Scriptname SKK_476NukeMissileTargetScript extends ObjectReference Const Weapon Property pMS02NukeMissileFar Auto Const Mandatory Event OnLoad() Self.SetActorCause(Game.GetPlayer()) Self.SetActorRefOwner(game.GetPlayer()) ObjectReference objSelf = self as ObjectReference ; more consistent with this cast than just using self Self.SetAngle(0.0, 0.0, self.GetAngleZ()) pMS02NukeMissileFar.Fire(objSelf) utility.Wait(5.0) Self.Delete() EndEvent
  22. For a script attached to the key use OnContainerChanged() akNewContainer == Game.GetPlayer() /probably
  23. Rather than do it with the door you may want to swap a door blocker overlay model in and out with a stateful script. Like how institute old robotics door (HitDoorLgBroken01 0011e97c) is managed with a broken model 1 unit in front of the working model.
  24. I was working on something similar; kill unique named actors (attach OnDeath event via quest alias script) to get their head in a trophy jar that can be placed and activated to say random actor hello lines. All working fine, but abandoned as I could not get the specific actors head (or looks info) to replace the synth head placeholder.
×
×
  • Create New...