Jump to content

[Dev/Test/Beta] LL FourPlay community F4SE plugin v43 2023 05 06


Recommended Posts

2 hours ago, Kharos said:

Taking a look at it again, the .pex has a different timestamp but the same CRC, so it might be wrong too?

 

Yep, looks like same issue there.  The pex definitely should not have the same CRC.  The psc is correct though.

Edited by EgoBallistic
Link to comment
43 minutes ago, MrFuturehope said:

Guys, is this the same thing that is a part of AAF installation? And if so, is it safe to replace the older files in AAF with this updated version?


Yes, and yes.  But it won't do anything useful for you until someone uses the new functions in a mod.

 

Link to comment
  • 3 months later...

new in v42:

; Return whether form is persistent or not
Bool Function IsPersistent(Form akForm) native global

; Set a form persistent or not. Returns false if form does not exist
Bool Function SetPersistent(Form akForm, bool akFlag) native global

 

 

Link to comment
On 9/14/2021 at 1:01 PM, LukeDuke said:

Can I safely install v42 on top of AAF v161.1 and RealHandcuffs? As both mods include older version (AAF v39 and RealHandcuffs v41)

 

As noted, you definitely can, though there's probably no point until some mod you use updates to take advantage of the new features in this version, and those mods almost always embed their own copy of the LLFP lib anyway (as you've observed) and update it as needed.

Link to comment
  • 1 year later...
1 hour ago, Fskywalker said:

Hi! im new installing this, i need the ll and src, but mo2 only reconocised ll file, not src one. help pls

 

Odds are you don't need to install LLFP directly yourself at all, unless you're making a mod of your own. Most mods which depend on the LLFP library include a copy of it and install that for you automatically. You can install the LLFP library mod, it's just not likely to do much for you on its own.

 

The source code archive isn't going to be "installable" by a mod manager because it's not a mod. It's literally a bundle of the C++ source code in case you want to develop a modified version of the LLFP library and recompile the DLL yourself. If you actually need to do that, you'll already know what to do with the files inside there without me going into more detail.

Link to comment
On 1/20/2023 at 12:11 AM, vaultbait said:

 

Odds are you don't need to install LLFP directly yourself at all, unless you're making a mod of your own. Most mods which depend on the LLFP library include a copy of it and install that for you automatically. You can install the LLFP library mod, it's just not likely to do much for you on its own.

 

The source code archive isn't going to be "installable" by a mod manager because it's not a mod. It's literally a bundle of the C++ source code in case you want to develop a modified version of the LLFP library and recompile the DLL yourself. If you actually need to do that, you'll already know what to do with the files inside there without me going into more detail.

oh, well im a newbie so ,i was trying to get wasteland elaying expansion but im so clumsy. 

Link to comment
2 hours ago, Fskywalker said:

oh, well im a newbie so ,i was trying to get wasteland elaying expansion but im so clumsy. 

 

I'm unfamiliar with "wasteland elaying expansion" but if its description says to download and install the LLFP library, then you just need that, ignore the source code bundle.

Link to comment
  • 3 months later...

new in v43

 

Ported from SKSE by EgoBallistic

 

;
;    INI setting functions
;    =====================
;
;    Functions to retrieve INI settings, e.g. Fallout4.ini, Fallout4Prefs.ini, Fallout4Custom.ini, mod .ini files in Data folder
;    These functions retrieve the settings from the game engine, not from the INI files themselves.
;    Parameter is the .ini setting name and section, fSettingName:SectionName.  For example, fMinCurrentZoom:Camera
;    Note that typing is strict, e.g. you cannot call GetINIFloat on an Int setting
;
; Return Float setting value or 0.0 if not found
float Function GetINIFloat(string ini) native global

 

; Return Int setting value or 0 if not found
int Function GetINIInt(string ini) native global

 

; Return Bool setting value or false if not found
Bool Function GetINIBool(string ini) native global

 

; Return String setting value or NONE if not found
String Function GetINIString(string ini) native global

 

Link to comment
  • 4 weeks later...

New in v44

 

New functions by EgoBallistic

 

; Return an Actor's actor flags (not the same as the Form flags)
Int Function GetActorFlags(Actor akActor) native global

 

;   Reset an actor's persistent Essential / Protected data
;    Calling Actor.SetEssential() overrides the actor base value. Changing the state on the actor base will no longer have any effect, and

;    neither will the Essential flag on Aliases.  This function resets the override so ActorBase and alias flags will work again.
bool Function ResetActorEssential(Actor akActor) native global

 

; Return an array of all the forms in a FormList
Form[] Function FormListToArray(FormList akFormList) native global

 

; Return the form with the given formID from any type of plugin (esm, esl, esp)
Form Function GetFormFromPlugin(String modName, Int formID) native global

 

; Return an array of forms given an array of plugin names and an array of form IDs
Form[] Function GetFormArray(String[] modNames, Int[] formIDs) native global

 

; Populate a formlist with the forms given an array of plugin names and a corresponding array of form IDs
Function PopulateFormlist(FormList akFormList, String[] modNames, Int[] formIDs) native global

 

;
;    Animation functions
;    ===================
;
;    Functions to play animations on actors. They do basic sanity checking on the inputs so that None idles and actors,
;    actors who are deleted or disabled, and actors with no AI middle process will not attempt to play idles.
;
; Make one actor play an idle
Function PlayIdle(Actor akActor, Form akIdle) native global

 

; Make multiple actors play idles, in synch
Function PlayMultipleIdles(Actor[] akActor, Form[] akIdle) native global

 

 

 

Link to comment
7 hours ago, jaam said:

Function PlayMultipleIdles(Actor[] akActor, Form[] akIdle) native global

Thanks for the update. I have some questions about this one:
Does every actor in the Actor[] array will play a corresponding idle in the Form[] array ?

akActor[i].playIdle(akIdle[i])

 and what if you provide more actors than idles or inversely (more idles than actors) ? will they just be ignored ? 

Edited by lee3310
Link to comment
6 hours ago, vaultbait said:

Is this a step toward integrating AAF NativeSync's implementation?

 

This will be used in the next release of AAF, it does pretty much the same thing as NativeSync in terms of getting animations to play in sync.  It validates the arguments then reduces everything to arrays of pointers and loops through them so the idles are started as close to simultaneously as possible.

 

1 hour ago, lee3310 said:

Thanks for the update. I have some questions about this one:
Does every actor in the Actor[] array will play a corresponding idle in the Form[] array ?

 

That's correct.  You pass in 4 actors and 4 idles, actor[0] will play idle[0] and so on.

 

1 hour ago, lee3310 said:

and what if you provide more actors than idles or inversely (more idles than actors) ? will they just be ignored ? 

 

Nothing will play in that case, the first thing the function does is verify that the number of idles is the same as the number of actors.  It also checks that the idles are valid, the actors are not disabled or deleted, etc.

 

I thought about adding a variant that lets you make an array of actors play a single idle, but there aren't many use cases for that, and you can accomplish it anyway by putting the same idle X number of times in the Form[] array.

Link to comment
9 hours ago, EgoBallistic said:

I thought about adding a variant that lets you make an array of actors play a single idle

Your solution for breaking the idle loop after scene is the only situation i can think of where such function could be useful: you just pass the actors array "on scene end" to the function with only one idle (actionIdle) "ActionInitializeGraphToBaseState".

Link to comment
  • 1 month later...

@jaam The behaviors of IntToHexString and HexStringToInt aren't equivalent, It turns out they have been the problem to all of my solutions.

 

code:

    Int adder=0x1000000
    int counter
    int result
    While counter<512
        Result+=adder
        dlog("Result: "+Result+" IntToHexString(Result): "+IntToHexString(Result)+" HexToInt(IntToHex(Result)): "+HexStringToInt(IntToHexString(Result)))
        counter+=1
        wait(0.05)
    endWhile

log:

Result    -2147483648 IntToHexString(Result)    80000000 HexToInt(IntToHex(Result))    2147483647
Result    2097152000 IntToHexString(Result)    7d000000 HexToInt(IntToHex(Result))    2097152000
Result    2113929216 IntToHexString(Result)    7e000000 HexToInt(IntToHex(Result))    2113929216
Result    -2130706432 IntToHexString(Result)    81000000 HexToInt(IntToHex(Result))    2147483647
Result    -2113929216 IntToHexString(Result)    82000000 HexToInt(IntToHex(Result))    2147483647
Result    2130706432 IntToHexString(Result)    7f000000 HexToInt(IntToHex(Result))    2130706432
Result    -2147483648 IntToHexString(Result)    80000000 HexToInt(IntToHex(Result))    2147483647
Result    -2097152000 IntToHexString(Result)    83000000 HexToInt(IntToHex(Result))    2147483647

Thanks to papyrus being papyrus a few are out of order, and I cleaned the timestamps off.

Link to comment
7 hours ago, tzenrick said:

@jaam The behaviors of IntToHexString and HexStringToInt aren't equivalent, It turns out they have been the problem to all of my solutions.

 

code:

    Int adder=0x1000000
    int counter
    int result
    While counter<512
        Result+=adder
        dlog("Result: "+Result+" IntToHexString(Result): "+IntToHexString(Result)+" HexToInt(IntToHex(Result)): "+HexStringToInt(IntToHexString(Result)))
        counter+=1
        wait(0.05)
    endWhile

log:

Result    -2147483648 IntToHexString(Result)    80000000 HexToInt(IntToHex(Result))    2147483647
Result    2097152000 IntToHexString(Result)    7d000000 HexToInt(IntToHex(Result))    2097152000
Result    2113929216 IntToHexString(Result)    7e000000 HexToInt(IntToHex(Result))    2113929216
Result    -2130706432 IntToHexString(Result)    81000000 HexToInt(IntToHex(Result))    2147483647
Result    -2113929216 IntToHexString(Result)    82000000 HexToInt(IntToHex(Result))    2147483647
Result    2130706432 IntToHexString(Result)    7f000000 HexToInt(IntToHex(Result))    2130706432
Result    -2147483648 IntToHexString(Result)    80000000 HexToInt(IntToHex(Result))    2147483647
Result    -2097152000 IntToHexString(Result)    83000000 HexToInt(IntToHex(Result))    2147483647

Thanks to papyrus being papyrus a few are out of order, and I cleaned the timestamps off.

 

This looks like something is mixing signed integers and unsigned integers, leading to values with the last bit set rolling over into the negative range.

Link to comment

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...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more information, see our Privacy Policy & Terms of Use