Fallout 4 Next-Gen Update Support Has Arrived (2024-05-15)
Next-Gen release
The "Next-Gen version" was being worked on since end of April. It entered beta (as v18.0, 2024-05-10) to give time for modders to test it. (The beta was only a test build).
The first final release for the Next-Gen game patch has finally arrived(v18.1, 2024-05-15).
Over 150 new native functions and 6 event dispatchers were added to both the Next-Gen and the "non-Next-Gen"versions of Garden of Eden SE. Several bugs were fixed for the Next-Gen version during beta.
The non Next-Gen version of Garden of Eden SE structurally did not change (beyond minor code optimization, including new compiler settings for faster code execution and a bit more informative logger).
I'd like to confirm that both the main (i.e. non Next-Gen) and the Next-Gen versions of Garden of Eden will continue being supported.
Hey, it's been a minute but I'm back with more requests if you're still up for it! I was wondering if you'd be able to make RemoveNthItem(), DropNthItem(), TransferNthItem have a Bool to be Silent like RemoveItem()? It'd be nice to move things around without the audio. SuppressHudMessages() is useful for the visual cues, but audio cues are another story. Having the dropped item be disabled from the start would also be nice.
Also, it'd be nice to have AttachModToNthItem() replace a mod that is already present. I've noticed some odd behavior where if the item already has a mod it'll attach the mod you want it to, but it will still have the old mod. The new mod is greyed out at the workbench and it claims you can't build it while the actual craftable mod is also present. This doesn't happen with the vanilla AttachMod() to ObjectReference. It fully removes the mod and displays properly at a workbench.
It'd also be real handy if we had some way of marking and tracking an inventory item so that we can do things with it repeatedly without having to find it again. Maybe this is a skill issue on my part. Also, in a similar way to SortFormsByForms(), it'd be nice to be able to compare the integer arrays produced by various GetItemIndex Functions(). So a SortIntByInt(), I guess.
I've also been needing a EquipObjectReference() Function where you can equip an item from the world. Preferably with the option for it to be silent. And it'd be even better if it removed the previous equipped item from your inventory, but that might be a bit specific for my use case.
And finally, I was hoping to get some more functions for changing the properties of inventory items if possible? For instance, I was really hoping for a way to repair power armor health via script.
Sorry for the text wall. I've been meaning to ask about some of these for months. I only just decided to finally get around to it. Hope you are well!
Sorry for the late reply, Starfield received an update with new compiler settings last month and I had to restore all native plugins..
I can add "SuppressInventoryAudio" to the next update.
I just replaced the Two-Shot weapon mod with Mighty with AttachModToNthItem and the Two-Shot was properly removed. Are you sure abRemoveInvalidMods was true when you called it?
I added EquipObjectReference to the feature notes.
Added SetNthItemHealth to the feature notes as well.
It's all good, thank you for your dedication! I'm sure you have a lot on your plate with so many mods.
I'm pretty sure I tested it with abRemoveInvalidMods both ways and it behaved the same. I'm not sure what it could be. Funny enough, that was pretty close to the use case as I've rewritten the LegendaryItemQuestScript to have it select an item in the NPC's inventory. I ended up just dropping the item I want and using the vanilla function. I wouldn't be surprised if it's something on my end as the amount of times I've created my own issues is at least 9 out of 10 times.
As per the usual, I have another request. I was wondering if I could get a function to change the workbench type of a furniture? I'm trying to open the CookingMenu using the Weapons Workbench and the best method I've found is placing a new bench that's set to Alchemy and activating that... But I'd prefer to just use the original bench if possible. In Skyrim, I used SetBaseObject() from PowerOfThree's papyrus extender to "swap" ore veins and that worked there. However the version provided in Papyrus Common Library doesn't seem to function the same for a workbench. Alternatively, if you know of a better way to do this I'm all ears.
Or perhaps a function to open the CookingMenu with this workbench as the source?
I'm modifiying weapon instance ammo when equipping / unequipping them. But the info in the Pipboy doesn't seem to update the ammo values. I tried to use RefreshPipBoyMenuData() but as per the comment it doesn't have a visible effect. Do you know how I could do this or if a function could be added for to refresh with visible changes?
Unfortunately the name of RefreshPipBoyMenuData is a bit misleading.. it only refreshes a few Scaleform data so I should need to add an extra note it in the .psc.
I added this to v19.6 beta. (Tested it with F4SE's InstanceData.SetWeight and it works).
Bool Function UpdateInventoryItemData(ObjectReference akReference, Int aiItemIndex) native global
I was planning out a way to use the GetNthNodeDistanceFromReference function for two nodes on the same reference. I ran into a problem trying to understand how to fill aiNodeIndex1 and aiNodeIndex2 when (both) the nodes I want/need to track are in an attached OMOD. Can't reference the OMOD itself and using the number from the OMODs NIF would just return whatever falls under that number on the reference-that-it's-attached-to's nif.
Any tips on how would/if could move forward in a case like that?
Sorry for the late reply. I looked into it and it appears there's a bug in some of the Get/SetNthNode functions. They don't find certain nodes while GetModelNodes do. I fixed it in the beta of the upcoming update.
I think I'm missing something obvious here, but how do I recieve the added events? I'm registering for them like so Event OnPlayerLoadGame() RegisterForNativeEvent("GardenOfEdenEvents","OnEquipUnequip") EndEvent
Function OnEquipUnequip(Actor akSender) global Debug.Trace("Hit OnEquipUnequip event") EndFunction But I never seem to recieve the event, any advice?
EDIT: Nevermind, it needs to be the name of MY script!
When it comes to .dll files I am a fish out of water and could use some help. I tried to launch f4se through the button on vortex and got an error window saying.
GardenOfEdenPapyrusExtender.dll
REL/Relocation.h(629): failed to open: data/f4se/plugins/version-1-10-984-0.bin
It gave me an OK button and that's it. Would someone be so kind as to tell me how I fucked up.
Hi Larann, have you ever looked into removing the "muted audio" during dialogue scenes? AFT/AFT Plus calls a npc.say() call after pausing the scene in order to get more followers to interject during dialogue, but since it's in a scene, it makes all audio outside of the actors in the scene very muted.
You mean the audio ducking behavior, when all sounds/voices except the speaker's voice is ducked? I think I can add SuppressSoundDucking() to the next update.
Hey, sorry to bother you with another request, but would it be possible to add a function that equips an item only visually? It should function similar to `EquipNthItem`, but the previously equipped item stays active and the new item replaces only the old one's visual appearance.
Yes, but now that I think of it, having an additional function that does the same but with an item from another container would be great. bool Function RenderNthItem(Actor akActor, int aiItemIndex, bool abRendered) native global bool Function RenderNthExternalItem(Actor akActor, ObjectReference akContainer, int aiItemIndex, bool abRendered) native global
Hi, would it be possible to add functions to return the ID of an inventory object? Currently there's no good way to uniquely identify an inventory object. The following functions would be helpful in this regard: int Function GetNthItemInventoryID(ObjectRefernce akRef, int aiIndex) native global int Function GetItemIndexByInventoryID(ObjectRefernce akRef, int aiID) native global
Sorry, it's not possible to uniquely identify stacked items. Inventory item stacks (e.g. of weapons and armors) don't appear to have persisting IDs that could be used to identify them. As soon as the player equips or modifies an item in the stack, the ID changes. I can write a unique key generator for stacked items to quickly lookup each one during a game session for script optimization purposes but the hashes won't persist across saves (unless I save them but I'd like to avoid that).
Hmmm, I suppose this is somewhat fine, since there are already item stack functions, I could use them to detect stack changes. Do the keys/IDs change when reloading a save? It sounds like, as long as the inventory stays the same, the IDs will not change.
584 comments
(2024-05-15)
Next-Gen release
The "Next-Gen version" was being worked on since end of April. It entered beta (as v18.0, 2024-05-10) to give time for modders to test it. (The beta was only a test build).
The first final release for the Next-Gen game patch has finally arrived (v18.1, 2024-05-15).
Over 150 new native functions and 6 event dispatchers were added to both the Next-Gen and the "non-Next-Gen" versions of Garden of Eden SE. Several bugs were fixed for the Next-Gen version during beta.
The non Next-Gen version of Garden of Eden SE structurally did not change (beyond minor code optimization, including new compiler settings for faster code execution and a bit more informative logger).
I'd like to confirm that both the main (i.e. non Next-Gen) and the Next-Gen versions of Garden of Eden will continue being supported.
Also, it'd be nice to have AttachModToNthItem() replace a mod that is already present. I've noticed some odd behavior where if the item already has a mod it'll attach the mod you want it to, but it will still have the old mod. The new mod is greyed out at the workbench and it claims you can't build it while the actual craftable mod is also present. This doesn't happen with the vanilla AttachMod() to ObjectReference. It fully removes the mod and displays properly at a workbench.
It'd also be real handy if we had some way of marking and tracking an inventory item so that we can do things with it repeatedly without having to find it again. Maybe this is a skill issue on my part. Also, in a similar way to SortFormsByForms(), it'd be nice to be able to compare the integer arrays produced by various GetItemIndex Functions(). So a SortIntByInt(), I guess.
I've also been needing a EquipObjectReference() Function where you can equip an item from the world. Preferably with the option for it to be silent. And it'd be even better if it removed the previous equipped item from your inventory, but that might be a bit specific for my use case.
And finally, I was hoping to get some more functions for changing the properties of inventory items if possible? For instance, I was really hoping for a way to repair power armor health via script.
Sorry for the text wall. I've been meaning to ask about some of these for months. I only just decided to finally get around to it. Hope you are well!
I can add "SuppressInventoryAudio" to the next update.
I just replaced the Two-Shot weapon mod with Mighty with AttachModToNthItem and the Two-Shot was properly removed. Are you sure abRemoveInvalidMods was true when you called it?
I added EquipObjectReference to the feature notes.
Added SetNthItemHealth to the feature notes as well.
I'm pretty sure I tested it with abRemoveInvalidMods both ways and it behaved the same. I'm not sure what it could be. Funny enough, that was pretty close to the use case as I've rewritten the LegendaryItemQuestScript to have it select an item in the NPC's inventory. I ended up just dropping the item I want and using the vanilla function. I wouldn't be surprised if it's something on my end as the amount of times I've created my own issues is at least 9 out of 10 times.
As per the usual, I have another request. I was wondering if I could get a function to change the workbench type of a furniture? I'm trying to open the CookingMenu using the Weapons Workbench and the best method I've found is placing a new bench that's set to Alchemy and activating that... But I'd prefer to just use the original bench if possible. In Skyrim, I used SetBaseObject() from PowerOfThree's papyrus extender to "swap" ore veins and that worked there. However the version provided in Papyrus Common Library doesn't seem to function the same for a workbench. Alternatively, if you know of a better way to do this I'm all ears.
Or perhaps a function to open the CookingMenu with this workbench as the source?
Thank you!
I added this to v19.6 beta. (Tested it with F4SE's InstanceData.SetWeight and it works).
Bool Function UpdateInventoryItemData(ObjectReference akReference, Int aiItemIndex) native global
Is the beta available to download? Would like to try this out.
I was planning out a way to use the GetNthNodeDistanceFromReference function for two nodes on the same reference.
I ran into a problem trying to understand how to fill aiNodeIndex1 and aiNodeIndex2 when (both) the nodes I want/need to track are in an attached OMOD.
Can't reference the OMOD itself and using the number from the OMODs NIF would just return whatever falls under that number on the reference-that-it's-attached-to's nif.
Any tips on how would/if could move forward in a case like that?
Thank you.
Event OnPlayerLoadGame()
But I never seem to recieve the event, any advice?RegisterForNativeEvent("GardenOfEdenEvents","OnEquipUnequip")
EndEvent
Function OnEquipUnequip(Actor akSender) global
Debug.Trace("Hit OnEquipUnequip event")
EndFunction
EDIT: Nevermind, it needs to be the name of MY script!
I tried to launch f4se through the button on vortex and got an error window saying.
GardenOfEdenPapyrusExtender.dll
REL/Relocation.h(629): failed to open:
data/f4se/plugins/version-1-10-984-0.bin
It gave me an OK button and that's it. Would someone be so kind as to tell me how I fucked up.
If curious my mistake was trying to launch through Vortex.
have you ever looked into removing the "muted audio" during dialogue scenes?
AFT/AFT Plus calls a npc.say() call after pausing the scene in order to get more followers to interject during dialogue, but since it's in a scene, it makes all audio outside of the actors in the scene very muted.
It should function similar to `EquipNthItem`, but the previously equipped item stays active and the new item replaces only the old one's visual appearance.
bool Function RenderNthItem(Actor akActor, int aiItemIndex, bool abRendered) native global
bool Function RenderNthExternalItem(Actor akActor, ObjectReference akContainer, int aiItemIndex, bool abRendered) native global
Currently there's no good way to uniquely identify an inventory object.
The following functions would be helpful in this regard:
int Function GetNthItemInventoryID(ObjectRefernce akRef, int aiIndex) native global
int Function GetItemIndexByInventoryID(ObjectRefernce akRef, int aiID) native global
Thanks in advance. :)
Do the keys/IDs change when reloading a save? It sounds like, as long as the inventory stays the same, the IDs will not change.