Jump to content
Flashy (JoeR)

[AAF] RSE II: Framework Resources ESM (01/10/20)

Recommended Posts

Karma System Source and Documentation

 

Spoiler

Scriptname RSEII:RSEII_KarmaScript extends Quest

 

Group Globals
    GlobalVariable Property RSEII_Karma_Negative auto
    GlobalVariable Property RSEII_Karma_Positive auto
    GlobalVariable Property RSEII_Karma_Total auto
EndGroup

 

RSEII_KarmaScript Function GetScript() Global
    return (Game.GetFormFromFile(0x0000174D, "RSE_II_Resources.esm") as Quest) as RSEII_KarmaScript
EndFunction

 

;-------------------------------------------------------------------------------------------------------------------------------------------
; Example sending positive karma from a mod - RSEII:RSEII_KarmaScript().PositiveKarma(2.50,"Being angelic", true, true)
; This will add 2.50 to the positive karma pool, pop up (Good Karma earned for being angelic) as a click messagebox.
;-------------------------------------------------------------------------------------------------------------------------------------------

Function PositiveKarma(Float fValue = 1.00, String sReason = "good behavior", bool bShowNotice = false, bool bMessageBox = false)
    Float Positive = RSEII_Karma_Positive.GetValue()
    Float Temp = Positive + Math.Abs(fValue)
    RSEII_Karma_Positive.SetValue(Temp)
    If bShowNotice
        If !bMessageBox
            Debug.Notification("Good Karma earned for "+sReason+".")
        Else
            Debug.MessageBox("<p align='justify'>Good Karma earned for "+sReason+".")
        Endif    
    Endif
    UpdateKarmaTotal()
EndFunction

 

;-------------------------------------------------------------------------------------------------------------------------------------------
; Example sending negative karma from a mod - RSEII:RSEII_KarmaScript().NegativeKarma(1.00,"Being a dick", true, false)
; This will add 1.00 to the negative karma pool, print out (Bad Karma earned for being a dick) as a 2 second notification.
;-------------------------------------------------------------------------------------------------------------------------------------------

Function NegativeKarma(Float fValue = 1.00, String sReason = "bad behavior", bool bShowNotice = false, bool bMessageBox = false)
    Float Negative = RSEII_Karma_Negative.GetValue()
    Float Temp = Negative + Math.Abs(fValue)
    RSEII_Karma_Negative.SetValue(Temp)
    If bShowNotice
        If !bMessageBox
            Debug.Notification("Bad Karma earned for "+sReason+".")
        Else
            Debug.MessageBox("<p align='justify'>Bad Karma earned for "+sReason+".")
        Endif    
    Endif
    UpdateKarmaTotal()
EndFunction

 

;----------------------------------------------------------------------------------------------
; Update karma point total
; call from your mod with - RSEII:RSEII_KarmaScript.GetScript().UpdateKarmaTotal()
;----------------------------------------------------------------------------------------------
Function UpdateKarmaTotal()
    Float Positive = RSEII_Karma_Positive.GetValue()
    Float Negative = RSEII_Karma_Negative.GetValue()
    Float Total = Positive - Negative
    RSEII_Karma_Total.SetValue(Total)
EndFunction

 

;----------------------------------------------------------------------------------------------
; Reset Positive Karma to zero
; call from your mod with - RSEII:RSEII_KarmaScript.GetScript().ResetPositiveKarma()
;----------------------------------------------------------------------------------------------

Function ResetPositiveKarma()
    RSEII_Karma_Positive.SetValue(0.00)
EndFunction

 

;----------------------------------------------------------------------------------------------
; Reset Negative Karma to zero
; call from your mod with - RSEII:RSEII_KarmaScript.GetScript().ResetNegativeKarma()
;----------------------------------------------------------------------------------------------

Function ResetNegativeKarma()
    RSEII_Karma_Negative.SetValue(0.00)
EndFunction

 

 

Or, since you will be using RSE_II_Resources.ESM as a masterfile, you can access the variables yourself, directly, in your own mod and write your own scripting to add, subtract or update these three variables. The provided API is meant for ease of use, not a dictation that it must be used.

 

Washroom System Source and Documentation

 

Spoiler

Scriptname RSEII:RSEII_WashroomFunctionsScript extends Quest

 

CustomEvent WashroomCompleted

 

Group Actors
    Actor Property PlayerREF auto
EndGroup

 

Group Armors
    Armor[] Property RSEII_SkinForms auto
EndGroup

 

Group Globals
    GlobalVariable Property RSEII_MCM_Needs_QuickStrip auto
    GlobalVariable Property RSEII_MCM_Needs_ImmediateRelief auto
    GlobalVariable Property RSEII_MCM_Needs_AllowMeshes auto
    GlobalVariable Property RSEII_MCM_Needs_AllowSounds auto
    GlobalVariable Property RSEII_Needs_HitStops auto
EndGroup

 

Group Idles
    Idle Property LooseIdleStop auto
    Idle Property RSEII_Bathroom_Squating auto
    Idle Property RSEII_Bathroom_Standing auto
EndGroup

 

Group Keywords
    Keyword Property RSEII_PlayerInScene auto
    Keyword Property RSEII_NPCInScene auto
EndGroup

 

Group MoveableStatics
    MovableStatic Property RSEII_UrineStream auto
EndGroup

 

Group Sounds
    Sound Property RSEII_Sound_Peeing auto
    Sound Property RSEII_Sound_Pooping auto
    Sound Property RSEII_Sound_Diarrhea auto
EndGroup

 

Group Spells
    Spell Property RSEII_PoopBrownSpell auto
    Spell Property RSEII_PoopGreenSpell auto
EndGroup


InputEnableLayer myLayer
Form[] EquippedArmor
Form[] NPCEquippedArmor
Bool Undressing

 

RSEII_WashroomFunctionsScript Function GetScript() Global
    return (Game.GetFormFromFile(0x00001EF5, "RSE_II_Resources.esm") as Quest) as RSEII_WashroomFunctionsScript
EndFunction

 

;---------------------------------------------------------------------------------------------------------------------
; PEEING
;---------------------------------------------------------------------------------------------------------------------
; To send an actor to go pee, you need two components.
; One, a registration for a custom event to know when it is done.
; Two, the function call, sending the actor as the argument.
;
; RegisterForCustomEvent(RSEII:RSEII_WashroomFunctionsScript.GetScript(), "WashroomCompleted")
; RSEII:RSEII_WashroomFunctionsScript.GetScript().GoPee(PlayerREF)
;
; In order to action on the custom event callback, you will need an event to capture the call.
;
; Event RSEII:RSEII_WashroomFunctionsScript.WashroomCompleted(RSEII:RSEII_WashroomFunctionsScript akSender, Var[] args)
;     {your code for dealing with coming back from pooping or peeing goes here}
; EndEvent
;---------------------------------------------------------------------------------------------------------------------

Function GoPee(actor akTarget)
    If akTarget == PlayerREF
        PlayerREF.AddKeyword(RSEII_PlayerInScene)
    Else
        akTarget.AddKeyword(RSEII_NPCInScene)        
    Endif
    If RSEII_Needs_HitStops.GetValueInt() == 1
        RegisterForHitEvent(akTarget)
    Endif
    akTarget.UnequipItem(akTarget.GetEquippedWeapon(), false, true)
    If akTarget == PlayerREF
        Game.ForceThirdPerson()
        LL_FourPlay.SetFlyCam(true)
    Endif
    Undress(akTarget)
    If RSEII_MCM_Needs_ImmediateRelief.GetValueInt() == 0
        If akTarget == PlayerREF
            myLayer = InputEnableLayer.Create()
            myLayer.DisablePlayerControls(true, true, true, false, true, true, true)
        Endif
        If akTarget.GetActorBase().GetSex() == 1
            akTarget.PlayIdle(RSEII_Bathroom_Squating)
        Else
            akTarget.PlayIdle(RSEII_Bathroom_Standing)
        Endif
        If RSEII_MCM_Needs_AllowSounds.GetValueInt() == 1
            RSEII_Sound_Peeing.Play(akTarget)
        Endif
        If RSEII_MCM_Needs_AllowMeshes.GetValueInt() == 1
            If akTarget.GetActorBase().GetSex() == 1
                ObjectReference Piss = akTarget.PlaceAtNode("Pelvis_skin", RSEII_UrineStream)
                Piss.SetScale(0.3)
                Piss.SetAngle(0.0, 0.0, 0.0)
                Utility.Wait(25)
                Piss.Delete()
            Endif
            If akTarget.GetActorBase().GetSex() == 0
                ObjectReference PissTwo = akTarget.PlaceAtNode("LArm_Finger13", RSEII_UrineStream)
                PissTwo.SetScale(0.3)                    
                PissTwo.SetAngle(-30.0, 0.0, -60.0)                    
                Utility.Wait(25)
                PissTwo.Delete()                    
            Endif        
        Endif
        akTarget.PlayIdle(LooseIdleStop)
        If akTarget == PlayerREF
            LL_FourPlay.SetFlyCam(False)
            myLayer.EnablePlayerControls()    
            myLayer.Delete()
        Endif
        Redress(akTarget)
        If akTarget == PlayerREF
            PlayerREF.RemoveKeyword(RSEII_PlayerInScene)
        Else
            akTarget.RemoveKeyword(RSEII_NPCInScene)        
        Endif        
    Else
        Debug.Notification("You feel much better.")
    Endif
    UnregisterForHitEvent(akTarget)
    SendCustomEvent("WashroomCompleted")
EndFunction

 

;---------------------------------------------------------------------------------------------------------------------
; POOPING
;---------------------------------------------------------------------------------------------------------------------
; To send an actor to go pee, you need two components.
; One, a registration for a custom event to know when it is done.
; Two, the function call, which has three arguments to send with it.
; ARGUMENT ONE: The actor to send to go poop.
; ARGUMENT TWO: bColor. If you send FALSE, this give brown poop. True give green poop.
; ARGUMENT THREE: bSound. If you send FALSE, its a normal poop sound. True plays diarrhea sound.
;
; RegisterForCustomEvent(RSEII:RSEII_WashroomFunctionsScript.GetScript(), "WashroomCompleted")
; RSEII:RSEII_WashroomFunctionsScript.GetScript().GoPoop(PlayerREF, false, false)
;
; In order to action on the custom event callback, you will need an event to capture the call.
;
; Event RSEII:RSEII_WashroomFunctionsScript.WashroomCompleted(RSEII:RSEII_WashroomFunctionsScript akSender, Var[] args)
;     {your code for dealing with coming back from pooping or peeing goes here}
; EndEvent
;---------------------------------------------------------------------------------------------------------------------

Function GoPoop(actor akTarget, bool bColor = false, bool bSound = false)
    If akTarget == PlayerREF
        PlayerREF.AddKeyword(RSEII_PlayerInScene)
    Else
        akTarget.AddKeyword(RSEII_NPCInScene)        
    Endif
    If RSEII_Needs_HitStops.GetValueInt() == 1
        RegisterForHitEvent(akTarget)
    Endif
    akTarget.UnequipItem(akTarget.GetEquippedWeapon(), false, true)    
    Game.ForceThirdPerson()
    LL_FourPlay.SetFlyCam(true)
    Undress(akTarget)
    If RSEII_MCM_Needs_ImmediateRelief.GetValueInt() == 0
        If akTarget == PlayerREF
            myLayer = InputEnableLayer.Create()
            myLayer.DisablePlayerControls(true, true, true, false, true, true, true)
        Endif
        akTarget.PlayIdle(RSEII_Bathroom_Squating)
        If RSEII_MCM_Needs_AllowSounds.GetValueInt() == 1
            If bSound == False
                RSEII_Sound_Pooping.Play(akTarget)
            Else
                RSEII_Sound_Diarrhea.Play(akTarget)
            Endif
        Endif
        If RSEII_MCM_Needs_AllowMeshes.GetValueInt() == 1
            If bColor == False
                RSEII_PoopBrownSpell.Cast(akTarget)
                If bSound == False
                    Utility.Wait(28)
                Else
                    Utility.Wait(12)
                Endif
            Else
                RSEII_PoopGreenSpell.Cast(akTarget)
                If bSound == False
                    Utility.Wait(28)
                Else
                    Utility.Wait(12)
                Endif
            Endif
        Endif
        akTarget.PlayIdle(LooseIdleStop)
        If akTarget == PlayerREF
            LL_FourPlay.SetFlyCam(False)
            myLayer.EnablePlayerControls()    
            myLayer.Delete()
        Endif
        Redress(akTarget)
        If akTarget == PlayerREF
            PlayerREF.RemoveKeyword(RSEII_PlayerInScene)
        Else
            akTarget.RemoveKeyword(RSEII_NPCInScene)        
        Endif            
    Else
        Debug.Notification("You feel much better.")
    Endif
    UnregisterForHitEvent(akTarget)
    SendCustomEvent("WashroomCompleted")
EndFunction

 

Function Undress(ObjectReference akActionREF)
    int I = 0
    int j = 0
    If akActionREF == PlayerREF
        EquippedArmor = new Form[0]
        If RSEII_MCM_Needs_QuickStrip.GetValueInt() == 0
            I = 0
            int scanEnd = 29
            While (I <= scanEnd)
                Actor:WornItem wornItem= PlayerREF.GetWornItem(I)
                Armor PlayerPiece = WornItem.Item as Armor
                If RSEII_SkinForms.Find(PlayerPiece) < 0
                    EquippedArmor.add(wornItem.item as Form, 1)
                Endif
                PlayerREF.unequipItemSlot(I)
                Utility.Wait(0.04)
                I += 1
            EndWhile
        Elseif RSEII_MCM_Needs_QuickStrip.GetValueInt() == 1
            Actor:WornItem wornItem= PlayerREF.GetWornItem(3)
            Armor PlayerPiece = WornItem.Item as Armor
            If RSEII_SkinForms.Find(PlayerPiece) < 0
                EquippedArmor.add(wornItem.item as Form, 1)
            Endif
            PlayerREF.unequipItemSlot(3)
            Actor:WornItem wornItemtwo= PlayerREF.GetWornItem(11)
            Armor PlayerPieceTwo = WornItemtwo.Item as Armor
            If RSEII_SkinForms.Find(PlayerPieceTwo) < 0
                EquippedArmor.add(wornItemtwo.item as Form, 1)
            Endif
            PlayerREF.unequipItemSlot(11)
        Endif
    Else ;NPC SECTION    
        Actor Target = akActionREF as Actor
        NPCEquippedArmor = new Form[0]
        j = 0
        int scannerEnd = 43
        while (j <= scannerEnd )            
            Actor:WornItem wornValue = Target.GetWornItem(j)
            Form selectedPiece = wornValue.item                
            If (selectedPiece != none && selectedPiece.GetName() != "" )
                NPCEquippedArmor.add(selectedPiece, 1)
                Target.UnequipItem(selectedPiece)
                Utility.wait(0.04);
            EndIf                
            j += 1            
        EndWhile        
    EndIf
EndFunction

 

Function Redress(ObjectReference akActionREF)
    Actor GetDressed = akActionREF as Actor
    If GetDressed == PlayerREF
        int I = 0
        While (I < EquippedArmor.length)
            Utility.wait(0.5)
            PlayerREF.equipItem(EquippedArmor, False, True)
            I += 1
        EndWhile                
    Else
        Actor Target = akActionREF as Actor
        int j = 0
        While (j < NPCEquippedArmor.length)
            Utility.wait(0.5)
            Target.equipItem(NPCEquippedArmor[j], False, True)
            j += 1
        EndWhile
    EndIf
EndFunction

 

Event OnHit(ObjectReference akTarget, ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked, string apMaterial)
        (akTarget as Actor).PlayIdle(LooseIdleStop)
        If akTarget == PlayerREF
            PlayerREF.RemoveKeyword(RSEII_PlayerInScene)
        Else
            akTarget.RemoveKeyword(RSEII_NPCInScene)        
        Endif
        If akTarget == PlayerREF
            LL_FourPlay.SetFlyCam(False)
            myLayer.EnablePlayerControls()    
            myLayer.Delete()
        Endif
        (akTarget as Actor).StartCombat(akAggressor as Actor)
EndEvent

 

In order for these functions to work, you NEED to register for a custom event to listen for when the washroom function is done - in this way, you can have an entry point to action on the activity you sent the actor for. The source documents what your send options are for peeing and pooping, as well as give you the exact scripting to use to register for the custom event. NOTE: There is an array of naked body armors in the washroom script properties. This was done so that you could add custom body armor forms to the scripting, so that when redressing, the body armor will not override clothing (IE: it appears they didn't put their clothing back on - they really did, but the body armor overrode it).

 

Illness System Source and Documentation

 

Spoiler

Scriptname RSEII:RSEII_IllnessScript extends Quest

 

Group Actors
    Actor Property PlayerREF auto
EndGroup

 

Group Globals
    GlobalVariable Property RSEII_MCM_Illness_AllowMeshes auto
    GlobalVariable Property RSEII_MCM_Illness_AllowSounds auto
EndGroup

 

Group Potions
    Potion Property RSEII_PlayerIllnessPotion auto
    Potion Property RSEII_NPCIllnessPotion auto
EndGroup

 

Group Sounds
    Sound Property RSEII_Female_Vomit auto
    Sound Property RSEII_Male_Vomit auto
EndGroup

 

RSEII_IllnessScript Function GetScript() Global
    return (Game.GetFormFromFile(0x00001EF6, "RSE_II_Resources.esm") as Quest) as RSEII_IllnessScript
EndFunction

 

;-------------------------------------------------------------------------------------
; Call the function from your mod, using the player as an example
; RSEII:RSEII_IllnessScript.GetScript().BeSick(PlayerREF)
;
; This function will look at WHO is the illness target.
; Two possible illness magc effects are possible.
; The player effect has blurry vision, the NPC effect does not.
; The function takes MCM settings into account for mesh and sounds.
; The function recognizes akTarget's gender for playing the right sound.
;
; The function does not impose buffs or debuffs on akTarget.
; The calling mod will need to impose their own effects.
; Best to apply your magic effects after calling the illness function.
; Once the illness occurs, the function returns to the calling mod.
;-------------------------------------------------------------------------------------

Function BeSick(actor akTarget)
    If akTarget == PlayerREF
        If RSEII_MCM_Illness_AllowSounds.GetValueInt() == 1
            If PlayerREF.GetLeveledActorBase().GetSex() == 0
                RSEII_Male_Vomit.Play(PlayerREF)
            Else
                RSEII_Female_Vomit.Play(PlayerREF)
            Endif
        Endif
        If RSEII_MCM_Illness_AllowMeshes.GetValueInt() == 1
            PlayerREF.EquipItem(RSEII_PlayerIllnessPotion, false, true)
        Endif
    Else
        If RSEII_MCM_Illness_AllowSounds.GetValueInt() == 1
            If akTarget.GetLeveledActorBase().GetSex() == 0
                RSEII_Male_Vomit.Play(akTarget)
            Else
                RSEII_Female_Vomit.Play(akTarget)
            Endif
        Endif
        If RSEII_MCM_Illness_AllowMeshes.GetValueInt() == 1
            akTarget.EquipItem(RSEII_NPCIllnessPotion, false, true)
        Endif
    Endif
EndFunction

 

Essentially, from the calling mod (your mod), you send the actor to be ill to the framework. Based on the user's MCM settings, this will either play sounds and put a vomit mesh onto the game map (2 minutes and then it auto-deletes from the game), or it won't. That part of it is up to the player. All this function does is determine who is being sick, using the correct magic effect (when applicable) and then returns control to the calling mod. The framework does not impose debuffs or buffs. All the magic effect does is place vomit on the ground, for both NPCs and the player. However, if it is the player, the magic effect also gives the blurry vision imod, so that is one thing you won't have to worry about.

 

Universal Cooldown Timer Source and Documentation

 

Spoiler

Scriptname RSEII:RSEII_CooldownTimerScript extends Quest

 

Group Globals
    GlobalVariable Property RSEII_CooldownTimer auto
EndGroup

 

Group Aliases
    RefCollectionAlias Property CooldownREFS auto
EndGroup

 

;----------------------------------------------------------------------------------------------------------------------------------------------------------
; Every two game hours, by default, the collection alias will be flushed of all added NPCs, allowing them to be used in functions again.
; Provided, of course, that external mods are checking for the RSEII_BlockApproaches keyword as a method to not choose NPCs for functions.
; The time between flushes is controlled by a slider in the frameworks MCM so each player can choose their own length.
;----------------------------------------------------------------------------------------------------------------------------------------------------------

 

Event OnQuestInit()
    StartTimerGameTime(RSEII_CooldownTimer.GetValueInt(),100)
EndEvent

 

Event OnTimerGameTime(int TID)
    If TID == 100
        CoolDownREFS.RemoveAll()
        StartTimerGameTime(RSEII_CooldownTimer.GetValueInt(),100)
    Endif
EndEvent

 

;-------------------------------------------------------------------------------------------------------------------------------------------------------
; To add an NPC, temporarily, to the cooldown timer alias, use the following in your scripts.
; Once an NPC is added to the collection, you don't need to worry about managing them. The framework will do that on its own.
;
; {script property so your mod knows the collection alias to use}
; RefCollectionAlias Property CooldownREFS auto
;
; {add NPC, who we shall call NPCOne as an example, in places where you wish to put NPC into the alias}
; CooldownREFS.AddRef(NPCOne)
;-------------------------------------------------------------------------------------------------------------------------------------------------------

 

A simple means of adding and managing NPCs, to prevent them from being selected for functions when they have the RSEII_BlockApproaches keyword attached to them because they are in the Cooldown alias collection. Once the cooldown period ends, all NPCs are removed from the alias collection and the keyword is automatically removed, allowing them to once again be selected for functions. The time between points of flushing the collection of NPCs can be set by the end user via an MCM slider.

Share this post


Link to post

Keyword: RSEII_PlayerInScene

 

It is my hope and intention that this keyword is used both as a means to check if another mod has focus on the player and thus to prevent other mods from taking control of the player, reducing the risk and chances of inter-mod function conflicts. Likewise, it will be used by RSE II mods to signal just that, so that any other mods using the framework will not be able to grab hold of the player for functions in their mods while the keyword is active via RSE II mods.

 

Keyword: RSEII_IgnoreNudity

 

This keyword will be used by RSE II mods to indicate to the upcoming "Approaches" mod that all other mods within the framework should ignore the player as naked. Of noted use, preventing a nudity approach from firing off when the player is stripped naked during a combat surrender moment or when you use something such as SEU or the AAF hotkey to trigger animations with other NPCs.

 

Keyword: RSEII_BlockApproaches

 

This keyword, when applied to any NPC will prevent them from being selected as a reference alias or reference collection alias fill actor. It will be used in such mods as RSE II's version of Random Shenanigans, Arousal and Nudity Approaches, as well as potential Brothels and Prostitution mods, although I am considering giving them their own specific keywords - I'll decide that later when it is important to do so. At any rate, gone is the need for 1000 different "blocker rings". Can I get an amen???

 

At the moment, this keyword may be applied via papyrus script, by adding to a selected NPC via the console or, and this is coming in a later build of the resources esm file, a way to add them to a global 'donotapproach' quest that houses a refcollectionalias with the keyword attached to any actor who is added to the alias. Use of the keyword can be permanent or it can be used on a reference alias temporarily, as a means to prevent an NPC from being selected twice for the same or differing functions, ie: during an Autonomy Enhanced event, you can add the keyword to the participants to ensure they aren't picked up for something else while they are busy with the autonomy function. The resources ESM will have a way for you to add or remove NPCs from this alias when it is made available publicly.

 

Keyword: RSEII_NPCInScene

 

Similar to the BlockApproaches keyword, but separate from it, to give you a little more granular control over conditioning NPCs to be temporarily unavailable to scripted functions or reference alias fills. When conditioning a refalias fill, using this keyword and the BlockApproaches keyword will ensure that no unacceptable NPC is selected. Of interest, you can condition an alias fill with HasKeyword == RSE__NPCInScene == 0.00, while at the same time adding the keyword to the alias once it does fill - in case people were not aware that such a thing could be done. RSEII: Random Shenanigans does this on it's NPC ref alias fills, so if you need a visual example, RSEII_Mod_RS_Alias is the perfect quest to look at - NPCOne and NPCTwo both have this conditioning AND application of the keyword at the same time.

 

Keyword: RSEII_CombatSystemInUse

 

This keyword is applied to the player for those moments when a combat system override is in place, much like Combat Surrender systems, used to prevent other combat systems from trying to take control of the current combat scenario.

 

Keyword: RSEII_PlayerCaptive

 

Much like the vanilla faction below, this keyword allows you to flag the player as in a hostage state, preventing other functions from initiating a kidnap or hostage scenario on the player.

 

Faction: CaptiveFaction

 

This is a native Fallout4 faction. At @stobor's suggestion, I thought it would be good to add it here, so that everyone making mods where the player (or companion) is held captive, can use this faction, 1) to obviously pacify the hostiles holding the actor, but also 2) so that everyone starts using it as a condition check to prevent unwanted bleed between functions in two mods. Convention, 'If PlayerREF.IsInFaction(CaptiveFaction) == True', would be used to prevent mod functions from occurring when the player is already held captive, ie: to be used to prevent a secondary hostage situation when the player is already in one.

 

Faction: RSEII_PacificationFaction

 

This faction is self-allied to itself. When applied to the player via a reference alias and say for example, every hostile raider in the loaded cell, all of them will become non-hostile to one another. This is similar to what RSE's CSA and AAF Violate do when there is a surrender condition.

 

Condition / Papyrus: IsInScene()

 

Another native Fallout 4 condition check as well as a papyrus check that is an absolute necessity for mod authors that I make a lot of use of, and will continue to do so with RSE II mods. Using this on a condition, say for a reference alias, where IsInScene == None == 0.00 means the alias will only select NPCs that are not currently involved in a running scene, be it dialogue or a package driven scene. Here's an example of it in action. Lets pretend you are coming to Diamond City for the first time. You have Shenanigans installed. You see Piper talking to the speaker. Shenanigans kicks in and select her to walk over to a DC guard and ask for a shag. And suppose after it's done, something in her packaging and the running scene gets broken and she never goes back to talk to Danny on the speaker and thus, the door to DC never opens. However, if you use IsInScene == None == 0.00 on the reference alias fill, Piper would not be selected because she is in a running scene, which preserves her package and quest stack and results in your getting into DC. You can also check this in papyrus with actorname.IsInScene() == False. It does the same thing, allowing a true or false state.

 

RefCollectionAlias: RSEII_UniversalCoolDown

 

This collection alias will host NPCs that you wish to temporarily block from approaching the player or other NPCs, either after they have approached and been turned down or if they approached and were successful in their goal. IE: on an arousal approach, the player accepted an NPC's request for sex - once the animation is done, that NPC would enter this alias and cool down for a determined amount of time.

Share this post


Link to post

Idles: Available Animations

 

Cowering - There are four cowering animations. These are the same ones NPCs use when running away scared.

Surrender - There are two surrender pose animations, kneeling hands up and standing hands up.

Bondage - These are Gray Users' series of single NPC bondage animations.

Hostage - Kneeling with hands tied behind back.

Bathroom - Male standing to urniate and M/F squatting.

Situational - Catcall Whistling, Clapping and Pointing at an NPC.

 

Sounds: Available Sound Effects

 

At this time, there is the catcall whistle and female vomit sound included in the resources. As the bathroom features come online, their sounds will be added. Other sounds will be added as the RSE II mod ecosystem grows.

 

Meshes, Textures and Materials: Human Biological Byproducts

 

There are meshes that are textured via material BGSMs for urine, excrement (regular brown and radioactive green variants) and vomit, used by the framework's bathroom and illness functions. As an added touch of immersion, excrement features swarms of gnats that circle it. Vomit and excrement are only available onscreen, when allowable, for 2 minutes before being removed from the game world. ie, they are not persistent.

Share this post


Link to post

Script Resources

 

These helpful scripts are not part of the Resources.esm, but they should be standardized for mod authors, in my opinion. Not only will they help mod authors, but they will ultimately help players looking for as smooth and as issue-free of an experience as they can have.

 

Startup Script:

 

This simple script is attach to a quest that is flagged Start-Enabled. All other quests in your mod should not be start-enabled. When this quest starts, the scripting looks to see if the player has exited the vault or not. If they have not, the mod will stay dormant until they do. And if they have left the vault already, it will then process it's stack and start up all quests, as required by the mod. Finally, once the stack has finished, the script will stop the quest that it is attached to, freeing up a resource.

 

Spoiler

Group Quests
    Quest Property MQ102 Auto
    Quest Property YourQuestNameHere01 auto
    Quest Property YourQuestNameHere02 auto
EndGroup

 

Event OnQuestInit()
    If MQ102.GetStageDone(10) == False
        RegisterForRemoteEvent(MQ102,"OnStageSet")
    Else
        Startup()
    Endif
EndEvent

 

Event Quest.OnStageSet(Quest akSender, int auiStageID, int auiItemID)
    If akSender == MQ102 && auiStageID == 10
        Startup()
    Endif
EndEvent

 

Function Startup()
    YourQuestNameHere01.Start()
    Utility.Wait(0.1)
    YourQuestNameHere02.Start()
    Utility.Wait(2)
    Debug.Notification("YourModNameHere is now running.")
    Stop()
EndFunction

 

Simple Nudity Check - Vanilla Human Naked Skin and also using Mod-added skins.

 

This small script requires F4SE to be installed, but then, most of us here on LL are using F4SE anyway, since it's required for AAF. At any rate, dropping this function into a script allows you to quickly check nudity against slots 33 and 45, which are the clothing and torso armor slot. Could be useful, especially if you make it a Bool Function, as I will below. This requires you to have an armor form defined in script properties for the SkinNaked form. This only covers the human race for nudity checks and only for the skin armor shown. You can get more elaborate with a formlist of armors for naked skin if you wished. Note, this does not cover custom body mesh nude skin items - if you wish to use a custom skin, you will need to either master to the mod that has the custom skin, or import it directly into your script with a GetFormFromFile call.

 

Spoiler

Armor Property SkinNaked auto

 

Bool Function IsNaked(actor akTarget)

     Actor:WornItem wornItemOne= akTarget.GetWornItem(3)
     Actor:WornItem wornItemTwo= akTarget.GetWornItem(11)    

     If  (wornitemone.item == SkinNaked && wornitemtwo.item == None)

          Return True

     Else

          Return False

     Endif

EndFunction

 

; In order to use the Bool Function, you need to call it as an 'If' statement

;

If IsNaked(PlayerREF) == True   ;using the player as an example, it could be any NPC

     {your scripted function here}

Endif

 

; Lets say you wish to check skin on the Unique Player and Companions mod.

; You need to import those forms into the script.

; Define variables for the skin to import.

 

Armor PlayerSkinNaked

 

; Use GetFormFromFile to import the forms.

 

Function ImportUniques()
    If Game.IsPluginInstalled("UniquePlayer.esp")
        PlayerSkinNaked = Game.GetFormFromFile(0x000D64,"UniquePlayer.esp") as Armor
    Endif

    If Game.IsPluginInstalled("UniqueFemalePlayerAndFollowersDLC.esp")
        PlayerSkinNaked = Game.GetFormFromFile(0x000833,"UniqueFemalePlayerAndFollowersDLC.esp") as Armor
    Endif

    If Game.IsPluginInstalled("UniqueMalePlayerAndFollowersDLC.esp")
        PlayerSkinNaked = Game.GetFormFromFile(0x000833,"UniqueMalePlayerAndFollowersDLC.esp") as Armor
    Endif
EndFunction

 

; Add a function call to your OnQuestInit or OnInit event to call the ImportUniques() function.

 

Event OnQuestInit()

     ImportUniques()

EndEvent

 

; Make a new IsNaked() Function to check vanilla skin and the custom skin.

 

Bool Function IsNaked(actor akTarget)

     Actor:WornItem wornItemOne= akTarget.GetWornItem(3)
     Actor:WornItem wornItemTwo= akTarget.GetWornItem(11)    

     If  (wornitemone.item == SkinNaked && wornitemtwo.item == None) || (wornitemone.item == PlayerSkinNaked && wornitemtwo.item == None)

          Return True

     Else

          Return False

     Endif

EndFunction

 

; Call the function in exactly the same way as above

 

If IsNaked(PlayerREF) == True   ;using the player as an example, it could be any NPC

     {your scripted function here}

Endif

 

Share this post


Link to post

External Mod Integration and Calling Their Functions Within The Resources ESM

 

RSE II Resources provides calls to a few external mods. At this time, Devious Devices, Raider Pet and Real Handcuffs are supported for integration and calling functions. To use them, you simply draw upon the calling functions here.

 

Devious Devices

 

Spoiler

;--------------------------------------------------------------------------------------------------------------------------------------

; In order to check from your mod that Device Device integration is running, simply check the running state of the DD quest in RSE II

;--------------------------------------------------------------------------------------------------------------------------------------

If RSEII_Monitor_ExternalMods.IsRunning()

     ; your code here if you want to apply a device.

Else

     ; your code here for other outcomes than a DD being applied.

Endif

 

;--------------------------------------------------------------------------------------------------------------------------------------

; A secondary means of ensuring Devious Devices is running is to call the global boolean function to validate its running state

;--------------------------------------------------------------------------------------------------------------------------------------

Bool DDInt = RSEII:RSEII_DDScript.GetScript().CheckDD()

If DDInt == True

     ; your code here if you want to apply a device.

Else

     ; your code here for other outcomes than a DD being applied.

Endif

 

;--------------------------------------------------------------------------------------------------------------------------------------

; Either of the above can be used - but you should stick to one or the other, just to make your life easier

;--------------------------------------------------------------------------------------------------------------------------------------

 

 

;--------------------------------------------------------------------------------------------------------------------------------------

; Applying a devious device to the player, use the following API call

; You specify two actors here. The player as the recipient and the actor, akAggressor, who has applied the device to the player

;--------------------------------------------------------------------------------------------------------------------------------------

RSEII:RSEII_DDScript.GetScript().RandomDD(PlayerREF,akAggressor)

 

;--------------------------------------------------------------------------------------------------------------------------------------

; To steal devious device keys from the player, use the following API call

; Here you need only specify the actor, akAggressor, who will steal the keys from the player

; This actor can equal NONE, if you want the keys to just disappear with no way to get them back

;--------------------------------------------------------------------------------------------------------------------------------------

RSEII:RSEII_DDScript.GetScript().RemoveKeys(akAggressor)

 

Real Handcuffs

 

Spoiler

;Functions code kindly provided by EgoBallistic

 

;--------------------------------------------------------------------------------------------------------------------------------------

; In order to check from your mod that Real handcuff integration is running, simply check the running state of the DD quest in RSE II

;--------------------------------------------------------------------------------------------------------------------------------------

If RSEII_External_RealHandcuffs.IsRunning()

     ; your code here if you want to apply handcuffs.

Else

     ; your code here for other outcomes than handcuffs being applied.

Endif

 

;--------------------------------------------------------------------------------------------------------------------------------------

; Applying handcuffs to the player, use the following API call

; You specify one actors here, using the player as an example

;--------------------------------------------------------------------------------------------------------------------------------------

RSEII:RSEII_RHScript.GetScript().RandomRH(PlayerREF)

 

;--------------------------------------------------------------------------------------------------------------------------------------

; To steal handcuff keys from the player, use the following API call

; Here you need to specify two actors, who to steal the keys from and who to give them to

; This thief actor can equal NONE, if you want the keys to just disappear with no way to get them back

;--------------------------------------------------------------------------------------------------------------------------------------

RSEII:RSEII_RHScript.GetScript().RemoveRHKeys(akVictim,akThief)

 

Share this post


Link to post

In case this caught you off-guard and you have no idea what is going on right now...

 

I know some of you have questions. I know this seems like something exciting. So let me address some items in a very high level manner, just to give you some insights.

 

RSE II is the next iteration in the RSE line of mods. It will, at least that is the hope, replace both the original RSE All-In-One mod and the RSE Elements experiments. Both were important, even if they were ultimately frustrating for you due to bugs, compatibility and those ever-constant clean saves that used to be required. But between the very first days of RSE, back in October of 2017, up to and including the most recent RSE Elements, a lot of new skills were learned, a lot of new observations were made. Improvements, bug fixes, all of it led to this point - a complete understanding of what worked and what didn't in each version of the RSE ecosystem of mods that came out up to this point.

 

The big thing about RSE All-In-One was that it was a unified framework, more or less, though really, it was just a massive overhaul of the game. But there was an underlying framework in that each element of RSE could draw upon the same forms natively, actioning or blocking as required by function. But RSE suffered one critical flaw (aside from the myriad bugs) - it was just too fucking big. And let's face it, not everyone used 100% of RSE all the time. It was a resource hog, it slowed down mid-to-low end PCs. There was just too much going on.

 

And that gave rise to RSE Elements, where I split out the functions of RSE into their own micro mods, centering on specific modules within RSE. This made them more usable, in that 1) I had a chance to fix some major problems with RSE, 2) since they were smaller, they worked a lot better and 3) you no longer had to go for everything when you really only wanted one or two functions. But therein lied the Elements biggest fault. Bethesda's interoperability does not function as advertised and believing in the CK wiki, I set about to use soft dependencies to interlink the various elements, so they would talk to one another. This proved to be the biggest failing of the Elements experiment. Yeah sure, they had some new toys that RSE didn't, but they just didn't feel the same, didn't change the game in the same way. The interoperability proved fatal to Elements because it forced people to install components they may not have wanted to install and without that (ahem: looking at you Elements Vol.3), a lot of functionality become unusable.

 

And the way Elements were made was also a problem - at the time, I thought it would save time, that I could manage to fix it all in smaller chunks. But that proved slightly on the false side too. How I built Elements was I took RSE v4.0, made a copy of it and then said, okay, I want to make the CSA mod. I loaded the v4.0 copy into FO4Edit and literally removed all of the forms within RSE that didn't touch the combat surrender or abductions stuff. Then, I resaved the newly created RSE Elements Vol.1 - CSA. After, I went into the CK with that trimmed down mod, reworked some of the quests, dialogues, packaging and used the original scripting to baseline correct functions.

 

You can see the problem, yes? What I thought was saving time ended up being nothing more than a bandaid to fix outstanding RSE problems. In truth, I should have continued with the All-In-One RSE and never tried the Elements experiment.

 

But then, I never would have learned as much as I'd like to think that I have. I would not have been forced to look at both releases, seeing the best and the worst in them and figuring out how to build on the good and completely correct the bad. And so, that brings us to...

 

RSE II: The Second Cumming.

 

RSE II is modular, much like Elements. But unlike Elements that had no unifying framework, RSE II has a framework, a prerequisite .ESM that contains all of the common forms that RSE would need to use to provide intercommunication between modules. This resources esm file contains global variables, actor values, keywords, factions, sound effects, idle animations, common meshes that RSE would need to draw upon across multiple mods. It has baseline functions within it that do nothing on their own, unless you call upon them to do what they are built to do. Essentially, the resources file is simply a library of stuff that I can draw upon, to use, to action with or to block action, as I see fit, within the various modules of the RSE II ecosystem.

 

Because I built RSE II from the ground up with the resources file first, it is scalable. I can add functionality and controls to it, as required. I can activate or shut parts of it down, as needed, though to be honest, this shouldnt be required since the functions are latent and do nothing unless they are told to do something.

 

One thing I have done for the resources esm is to add a karma system into it. It does nothing in and of itself. It simply accepts input from a calling mod and then returns a karma point total. Thats all it does. It doesn't call stalkers, it doesn't call bounty hunters, hell, it doesn't make your settlers give you a cold beer after a hard day's work killing raiders. All it does is sit quietly, waiting for someone to send it a value and then it hands back a result. In a nutshell.

 

Unlike the old Infamy System in RSE or the Karma System in Elements, you can specify how much to add to either positive or negative karma (you must always send a + value, but in case you don't the karma script corrects it to absolute value anyways), update the total karma point count, or reset the positive OR the negative total. In that way, you have control over how your mod deals with player actions. And of course, since you are updating a count and getting back a result, your mod can then create functions to do literally anything you want, based on the player's actions and karma. Want to make your own stalkers mod? Go for it. Bounty Hunters? Cool beans! Make your own methods for resetting negative karma to 0? Absolutely. This one small little script lets YOU decide how to deal with the karma total and you decide what causes the karma to rise. The power of this little script in the resources ESM is that it allows ALL of your mods to potentially draw on the same pool - meaning, for an example, RSE II's CSA mod could add negative karma if you sexually assault a surrendered victim and that increase in negative karma could affect an outcome in someone else's mod just because the negative value got too high. And because you use the framework, you can flag when your mod has player focus and that will prevent all other mods using the framework from trying to highjack the player, creating conflicts or bugs, but more on that later...

 

Starting to see the power of having a unified framework yet?

 

Also, and this one is still ongoing, but I am building basic needs directly into the ESM resources file. It too sits latent and awaits a trigger in order to action. For example, a calling mod could say, hey, Nate ate something an hour ago and has been running ragged ever since; let's send him for a poop. Call the function in the resource ESM, and Nate will go poop, sending the all clear back to the calling mod, so that you can action on that appropriately.

 

And there's the kicker and Im sure some of you are seeing it now...

 

RSE II will be open to ANYONE to create their own Realistic Salacious Encounter. All of the methods you will need to make that work, both for your own mod and within the to-be-released official RSEII mods, are there and more importantly, since they will share a common master file (and you MUST use the resources ESM as a master file to your mod), the forms are NATIVE to each mod using the resource file as a master. No more need for shitty intercommunication / interoperability hooks that don't work as advertised. No more need for twenty different methods to flag the player as busy or in this or that faction. No more need to have 3 mods calling the same animation file, three different ways. Basically, with this, there is no need for anyone to really worry or focus on the basics - the resources takes care of it for you, so all you need to focus on is your functions.

 

I say again - RSE II will be open for ANYONE to make their own RSE-esque mod. And even though it is intended for me, as a resource ESM, anyone can use it, even those mod authors out there that are not the biggest Flashy(Joer)/RSE fans - gasp! I know! But it's true, for some odd reason they exist! Just because the resource ESM is used doesn't mean one needs to make their mod an RSE mod. But having a common resource that is able to action or block action within ALL Lover's Lab Fallout 4 sex mods is something that is sorely lacking. For now, but not much longer. Whether or not anyone else uses that as the advantageous thing it is, well, that is up to them. Just think about it... being able to prevent RSEII mods from doing something because your mod is in the middle of one of it's functions. And because its a shared master, RSEII mods can prevent your mod from starting a function when one of it's own is in the middle of running. No more inter-mod conflicts with quests and AI packages. Everything will be able to talk back and forth, saying, "Hey, I'm doing something right now, so you cannot. When I'm done, I'll flag that Im done and you'll be able to do your thing later.". Imagine that, with two mods by two different mod authors, who NEVER have to coordinate or communicate with one another about that potential conflict/bug, maybe because one of the mod authors hates the other one. Imagine its not just two mods and two mod authors who benefit from this? Imagine it's ALL the mods here and ALL of the mod authors. THAT is the power of the RSE_II_Resources.esm file.

 

And that is exactly what I wanted to RSE II. RSE was insular. It was me, alone, doing everything, guarding the source code to knowledge I invested thousands of hours self-learning, and I mean thousands - we're talking 4000-5000 hours over the span of a year, honing my papyrus and CK know-how. But that causes bad blood in some circles, not releasing source code, fuck me if I know why. I mean, I toiled and earned the knowledge, why should I just hand it over to every Tom, Dick and Harry? Anyways... I've softened on that. One, it helps me if everyone has the source so they can look for their own solutions in the code and two, it stops the complaining about the lack of source code. For RSE II, I wanted it to be 100% open to everyone. Documented, where important, ala the Resources ESM, all sources provided so that we, as a community, can unify our mods and make them every bit as robust and as unbreakable (inter-mod conflict wise) as the Skyrim folks enjoy thanks to their frameworks. And also, if it's open, everyone can contribute, if they want - as in, got an idea, as a mod author, let's discuss and find the best approach to adding it to the framework so that it will benefit everyone.

 

So, what does the resource ESM contain? Well, at the moment that is a small amount of items, as I am in the midst of finalizing the first official RSEII mod. But this list will absolutely grow as I built more and more functionality into it.

  • RSEII contains a faction that is flagged as ALLY to itself, so that you can pacify ANYONE, immediately, just like in CSA.
  • RSEII contains keywords that block approaches, block nudity check, flag if the player is engaged in a function you don't want to interrupt.
  • RSEII contains global variables to govern the karma system.
  • RSEII contains a well-documented script for the karma system functions (with source code!)
  • RSEII contains a handful of commonly used idles, such as surrenders, hostage, bondage, bathroom, clapping, pointing, whistling, etc.
  • RSEII contains sound effects for whistling, bathroom and being sick.
  • RSEII contains a vomit triggering function, replete with my vomit .NIF file.
  • RSEII will soon have a fully functional bathroom trigger function, gender appropriate, with effects and fluids/deposits.
  • RSEII will feature methods in their function calls to allow or disallow items you do not wish to use in said function.
  • IE: If you dont want to see poop or pee, you will be able to flag the resource ESM to not use it.
  • IE: If you dont want the player to see notifications when they receive karma points, just send flags across the call to block that from happening.

Basically, RSE II's resource ESM was made to bring back the original RSE's unified framework, but also allowing it to be modular the way RSE Elements was.

 

And the RSEII_Resources.ESM file is 100% original - nothing from the original RSE is present in it, aside from animations and sounds. And that bring me to...

 

The First Official RSE II Mod: Combat Surrender and Abductions

 

Unlike RSE Elements, as you saw above, that repurposed 90% of the original RSE forms and code to make it work, RSE II's build of CSA is 100% original, started from scratch. And it is in process of completion as I write this. It is not quite the CSA you are used to. Sure, it has a lot of the same functionality, but it is also 100% coded FROM SCRATCH, using the original code as a baseline for research and identifying problem areas. RSE II's CSA not only allows the player to surrender (as well as companions), but it also allows your enemies to potentially surrender too. And now, every single enemy that surrenders can be spoken to, without fail. You have three hostiles surrendered? All three of them will interact with you, every single time, unlike older RSE functions where it was simply broken and didn't work most of the time. Not only that, but I have reintroduced strength in numbers, meaning hostiles just dont surrender because you shoot them below a health threshold - if there are more of them than your party, the odds of them surrendering are slim. The more you whittle them down, the greater the odds they will. Not only that, but interacting with surrendered hostiles now has a four-pronged menu system for those interactions, wherein you can choose exactly how you want to deal with them. Want a non-violent outcome, like robbing them? Doable. Want a violet outcome, like slitting their throat? Doable. Want to assault them in a carnal way? Doable. Want to open their inventory and give them a slave collar? Doable. I have gone over CSA and redone the entire thing, as far as I have gotten because let's face it, RSE's CSA is a complex piece of code weighing in at 100kb compiled - almost the same size as some of Bethesda's biggest game governing scripts.

 

And the best thing about RSE II's CSA? It no longer has cell-edit overrides! It will be able to sit ANYWHERE in your load order without conflicts! About fucking time, right?

 

Other RSE mods will be ported, some in their entirety, some chopped into even smaller sub-mods. New mods will be added as well, featuring functions that have never before been seen in an RSE mod.

 

Although, now that I think about it - I should be able to get Random Shenanigans (Autonomy Enhanced) out sooner than CSA, so that may end up being the first one.

 

Do I have an ETA on this?

 

No. The resources ESM is pretty much good now, aside from final tweaks on the bathroom stuff. CSA is about 25% complete. I wont give ETAs because that is the worst thing that I can do. I am working on this, when I have time. Between the new job and other IRL things, I have only small amounts of time to work on this stuff. But I do, as time and opportunity permits. And also, I wont release even one part of it until I am sure CSA is solid. Who knows? It could be next month, at the end of summer or it could be next week. I just don't know and I don't want to make promises on anything. Because let's face it... my track record on releasing stuff I work on is spotty at best. But for RSE and for RSE's fans, I'm at the least going to give it my all, Small recompense for two years of your support and for the two years of RSE-related headaches you've endured.


I can say for certain that the RSE_II_Resources.esm will be the first to release, just in case anyone wants to start unifying all of their own Lover's Lab mods under a common sex-mod framework, whether they are fans of me/RSE or not, whether their mods are actual sex mods or not - a common framework can prevent all sorts of potential cross-mod issues from arising even if it just to use the basic "PlayerIsInScene" keyword to block all other mods from actioning while yours is in control.

 

RSE II and the unified sex-mod framework it includes is going to kick all kinds of ass. #justsaying

Share this post


Link to post
20 minutes ago, RohZima said:

I instantly want to get back to modding FO4 now

If youre talking about authoring mods, using the framework, that is exactly what I had hoped to hear as a reaction.

 

If you're talking about modding a game to play it, if this is what makes you want to do that, I'd wait. There aren't any mods using this framework yet.

 

But in the words of Yoda (albeit slightly changed), "There will be. There will be." 🤣

Share this post


Link to post

This sounds amazing, I can't wait to see the future of RSE2, Thank you so much Flashy for all your hard work.

Share this post


Link to post
52 minutes ago, Flashy (JoeR) said:

If youre talking about authoring mods, using the framework, that is exactly what I had hoped to hear as a reaction.

 

If you're talking about modding a game to play it, if this is what makes you want to do that, I'd wait. There aren't any mods using this framework yet.

 

But in the words of Yoda (albeit slightly changed), "There will be. There will be." 🤣

Yeah I mean making animations for FO4. I can only really make animations, cant do the clever stuff. I made a poser and used AAF for that, which I like the simplicity of.

 

I've been a little disappointed that FO4 modding didn't take off as much as I thought, maybe now...

Share this post


Link to post

This looks like a very useful concept, overall! 

 

About the RSEII_PlayerInScene keyword: my problem is that NPCs either break idles at some stage, or don't start them at all, when directed to do so via scripted playidle. It's kind of random and I am assuming they do so because of their own sandboxing packages (could be something else that I am not aware of)

 

Is this keyword a potential solution? If not, is it possible to add a "feature" (not sure what it would consist of) that would "brainwash" / add a priority "blank" AI package to NPCs so that they "forget" about their own sandboxing routines and execute scripted commands instead?

 

TY!

 

@RohZima: my mod here can always use additional fresh animations :) right now I am using grayuser's, which were a godsent indeed

 

Share this post


Link to post
7 hours ago, Flashy (JoeR) said:

RSE II - Resources ESM v0.1


 am happy to see you back and eager to see your fine work in action once again JoeR, pretty sure you are one of the reasons any of us play fallout 4 at all these days.

 

However I do urge you please don't burn yourself out my friend. You are far too talented for your own good and we can be patient, you've earned that much in the past

Share this post


Link to post
6 hours ago, RohZima said:

Yeah I mean making animations for FO4. I can only really make animations, cant do the clever stuff. I made a poser and used AAF for that, which I like the simplicity of.

 

I've been a little disappointed that FO4 modding didn't take off as much as I thought, maybe now...

We can always use more standardized idle animations! As @SAC, said, he can for sure use some!

5 hours ago, SAC said:

This looks like a very useful concept, overall! 

 

About the RSEII_PlayerInScene keyword: my problem is that NPCs either break idles at some stage, or don't start them at all, when directed to do so via scripted playidle. It's kind of random and I am assuming they do so because of their own sandboxing packages (could be something else that I am not aware of)

 

Is this keyword a potential solution? If not, is it possible to add a "feature" (not sure what it would consist of) that would "brainwash" / add a priority "blank" AI package to NPCs so that they "forget" about their own sandboxing routines and execute scripted commands instead?

 

TY!

 

@RohZima: my mod here can always use additional fresh animations :) right now I am using grayuser's, which were a godsent indeed

 

The keyword is reserved for the player only. Think about it in this RSE kind of way:

 

The player is fighting raiders and opts to surrender. At the moment of surrender, the player has the RSEII_PlayerInScene keyword attached to them. Now, any mod that is using the framework, as intended, can check as a condition, 'If PlayerREF.HasKeyword(RSEII_PlayerInScene) == False', to ensure the player doesnt have the keyword before trying to take the player to use them in a function. In the example, the player has surrendered and is busy, so has the keyword, and as such, no other mod should be allowed to take control of the player while the surrender segment of CSA is running is functions. Once the surrender and outcomes conclude, the keyword is removed and at that point, the player is once again free to be part of any mod's functions.

 

What you are looking for is a package override - something like a quest with an alias that has an AI package added to it, a quest with say priority 100, so that any NPC in the alias completely overrides their existing AI stack because this quest/alias/package is at priority 100. This seems simplistic, but its actually a little more complex than that when you start determining what their new AI override actions will be, either through the package(s) and/or the scripting. Key though, no matter what, is to enforce the AI stack recheck with an NPC.evaluatepackage() call.

2 hours ago, deadmetal said:

 am happy to see you back and eager to see your fine work in action once again JoeR, pretty sure you are one of the reasons any of us play fallout 4 at all these days.

 

However I do urge you please don't burn yourself out my friend. You are far too talented for your own good and we can be patient, you've earned that much in the past

Slow and steady! Thanks for kind words!

Share this post


Link to post

Universal Cooldown Timer is now in place. Documentation above has been updated.

 

Tonight, I will likely complete the Illness and bathroom function set for the resources esm and upload the latest build. Once that is uploaded, I'll switch momentarily to updating Random Shenanigans to RSE II spec, as it is a rather simple mod to update, so that there is at least one mod that uses the framework, for people to look at, if they wish to see how I use the keywords and aliases to limit NPC inclusion in functions.

Share this post


Link to post

Awesome and I share the comment of "Do not work yourself to death" or as Yoda would say "Moderation there will be"..............

Share this post


Link to post

In addition to the 'PlayerIsInScene' keyword, I think there's some need for a 'PlayerIsCaptive' keyword (or use membership in the vanilla CaptiveFaction, as I have in my mods).  Checking for that would permit mods to avoid trying to (for example) abduct the player for a scenario, when they're already in the middle of one.

 

The more I think about it, just having a documented convention to use CaptiveFaction in that manner might suffice.

Share this post


Link to post

Thank you for your reply. I have already implemented the quest alias solution (or at least tried to, not sure about how valid my "package" is, sometimes it fails and the NPC sandboxes away anyway) :

 

 

One roadblock is that it doesn't work on two or more NPCs at once, I don't know how to handle more than one NPC with one alias.

 

Not meaning to hijack the thread, so if you want to, we can continue this subject in that thread.

 

May I add that I personally think it's a good thing at this time that you have parked the companion mod for the moment. As the others said, take it easy :) 

 

Share this post


Link to post

Flashy, I've used youre original RSE mods in many playthroughs. Since it's release I cannot play Fallout without it. It's fan-fucking-tastic. The best mod ever created.

I've had a cople of qualms I've overlooked and I just wanna make sure I read the description better; will this framework:
1) allow a passout or collapse animation upon extreme exhaustion in RSE AdvNeeds?
2) allow more "skyrim-esque" defined animations or effects for Basic Needs (any bathroom function)?
3) will there possibly be a "vomit" animation on radition sickness (this one I'd love the most as its a little jarring to just barf while running nonchalant)
   -secondly, the vomit function, if i read correctly, can be applied to other conditions?
4) The sex effects alongside AAF with this mod are legitimately flawless. Just wanted to say, it works as advertised, I don't have bugs.


Everything I read sounds promising in improving the mod, which I honestly didnt think was possible as it's so well made already. I'm hyped to see where this goes.

Share this post


Link to post
4 hours ago, SAC said:

Thank you for your reply. I have already implemented the quest alias solution (or at least tried to, not sure about how valid my "package" is, sometimes it fails and the NPC sandboxes away anyway) :

 

 

One roadblock is that it doesn't work on two or more NPCs at once, I don't know how to handle more than one NPC with one alias.

 

Not meaning to hijack the thread, so if you want to, we can continue this subject in that thread.

 

May I add that I personally think it's a good thing at this time that you have parked the companion mod for the moment. As the others said, take it easy :) 

 

Look at using Reference Collection Aliases instead. You can house 100s of NPC in a single alias - that means they all share the same script, the same factions, keywords and AI packages.

 

https://www.creationkit.com/fallout4/index.php?title=RefCollectionAlias_Script

 

Or wait until the next release of the framework and you'll see how I use them (which means, how you can use them really).

4 hours ago, neoncontacts said:

Flashy, I've used youre original RSE mods in many playthroughs. Since it's release I cannot play Fallout without it. It's fan-fucking-tastic. The best mod ever created.

I've had a cople of qualms I've overlooked and I just wanna make sure I read the description better; will this framework:
1) allow a passout or collapse animation upon extreme exhaustion in RSE AdvNeeds?
2) allow more "skyrim-esque" defined animations or effects for Basic Needs (any bathroom function)?
3) will there possibly be a "vomit" animation on radition sickness (this one I'd love the most as its a little jarring to just barf while running nonchalant)
   -secondly, the vomit function, if i read correctly, can be applied to other conditions?
4) The sex effects alongside AAF with this mod are legitimately flawless. Just wanted to say, it works as advertised, I don't have bugs.


Everything I read sounds promising in improving the mod, which I honestly didnt think was possible as it's so well made already. I'm hyped to see where this goes.

1. If there were such an animation, yes absolutely it could be included in the framework and used by anyone for anything.

2. See above.

3. i) See above.

   ii) The vomit function is a latent function. It sits there waiting for a calling mod to activate it. Meaning, you could choose to make the player puke from eating moldy food if you wanted, or when they walk into an area that is flagged as a Smelly Zone. Whatever you want. As long as you call the function, the player will puke.

4. Thanks!

1 hour ago, Olmech said:

Holy shit. Really looking forward to this my friend.

Nothing fast mate ... slow and sure. Framework first, which will do nothing on its own and then... build mods that use it. :)

Share this post


Link to post

Best comeback ever , thank you for being part of the fallout 4 moding scene and enhancing it your own way ;)

Share this post


Link to post
27 minutes ago, Benjou1 said:

Best comeback ever , thank you for being part of the fallout 4 moding scene and enhancing it your own way ;)

Thanks mate!

 

Trying to change my optics a little (which means, Im trying to change my optics, like, a fucking lot). ;)

 

In other news, the illness functions are now in place officially (in my current dev build). The documentation at the top of the post has been updated to show the source of the function.

Share this post


Link to post
7 hours ago, stobor said:

In addition to the 'PlayerIsInScene' keyword, I think there's some need for a 'PlayerIsCaptive' keyword (or use membership in the vanilla CaptiveFaction, as I have in my mods).  Checking for that would permit mods to avoid trying to (for example) abduct the player for a scenario, when they're already in the middle of one.

 

The more I think about it, just having a documented convention to use CaptiveFaction in that manner might suffice.

Yeah... I think the convention should be to use the CaptiveFaction as a check point. I'll add that to the documentation, so that it becomes ingrained in people's minds. Good call mate! Thanks for that!

 

EDIT: Added to reference docs at top of post.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...