Jump to content

[WIP] Furniture Interaction Framework - for NPCs and Player


Roggvir

Recommended Posts

Short description:

A framework, providing easy and natural way for player and NPCs to utilize various kinds of persistent furniture placed anywhere in Skyrim for sexual interaction,

without requiring the furniture to be specially prepared in any way (no need for attaching scripts in CK, etc.), but will work also for non-furniture based animations.

 

NOTE: Although the primary aim is to support various BDSM furniture and devices (by default, the objects provided by the Zaz Animation Pack),

casual sex will be also supported (beds/chairs/thrones/benches/whatever, depending on animations available in SexLab by default, or what other people may later provide via custom modules - any animation in game can be used to build an "interaction").

 

An old video to demonstrate how it should work (NSFW obviously!)

...it shows only some pillory whipping (NPCs seem to prefer it for some mysterious reason) and fucking, because that was all i had mostly working back then.

But don't let that put you off if it isn't your thing, there will be of course various types of casual interactions, without furniture, and including many other furniture like beds and chairs and benches, etc. (including direct player involvement in any role)

It is just supposed to show how it's gonna work in general, to demonstrate the attempted seamlessness of how things happen (npcs walk instead of being teleported, they put down stuff while undressing and picking it up again [yes, you can steal it], etc.), not to showcase these particular interactions.

 

 

Long description...

 

I will not be placing any furniture anywhere, at least not as part of this particular mod.

This mod aims to be a framework, providing means to allow both player, followers, and any NPCs to utilize any existing furniture.

HOW will the player or NPCs utilize the furniture around them, will be up to an Interaction Module i create on top of this framework, or by custom modules hopefully made later by other ppl.

 

By existing furniture, i mean the persistent furniture objects placed all over Skyrim, coming either from vanilla game, or from any mod adding objects into the world or interiors.

Any supported furniture will become a usefull furniture once you put my mod into the game - no need to attach any scripts in CK, no need to add any support into your mod which adds one more chair to the Breezehome, to make it work.

 

By any furniture, i mean of course only the furniture that is being supported by my the framework.

Framework needs to know which furniture objects are supported and which interactions are available for them (note the difference between interactions and animations - interaction is using animations, but animation does not equal interaction).

Using modular approach allows anyone to create a rather simple plugin, adding support for new furniture and defining its interactions.

 

 

The Framework will provide:

  • Handling and assigning of "furniture" threads as they are needed
    When any actor is send to use supported furniture, that actor and furniture is assigned into aliases of one of available threads, which ensures the actor stays in furniture and allows further interactions with him from that moment on, until the actor is released.
    Sending actors into furniture, starting interactions, or releasing actors, is handled by appropriate Interaction Module the furniture belongs to, utilizing functions provided by the framework.
     
  • Basic AI packages for NPCs
    Packages provide reliable way of making NPCs to use the furniture or start interactions - on their own (depending on situation), or when player makes them to (via interaction choices provided by interaction module), or by any other quests/scripts/scenes.
    Framework will contain basic packages for default ways of interaction, but any Interaction Module can provide additional packages and means to use them.
    NOTE: Don't let packages scare you away, you dont need to know anything about them as by default they will be used automatically by the framework. It is quite simple in fact, so far i use only two packages and they seem to be enough for everything i needed so far - one which is basically a "sit" package, assigned via alias to actors who are ordered into a furniture, and another one, which is a very simple "activate" package, assigned via alias to other actors who are sent to interact with others in furniture.
    The actual interactions are NOT defined inside those packages, so it isn't like there has to be a package for every kind of interaction.

     
  • Furniture Library System
    A "register" of furniture objects and their associated interactions, and means for an Interaction Module to register additional furniture (and its interactions, and even packages - if the default ones aren't enough).

 

The Interaction Module will provide:

  • Default Furniture Library
    Adds support for some basic furniture including default interactions, by registering the furniture objects with "Furniture Library System" as any custom module would.
     
  • Default Interactions
    Function definitions for starting interactions and handling post-interaction cleanups, etc., no mater how the interactions are initiated (via player dialogs, or any scripts, including the central NPC controller making NPCs to start interactions on their own)
    These functions are defined inside the "Default Furniture Library" scripts.
     
  • Default Interaction Dialogs
    Player initiated interaction can be implemented in various ways, one of them being via dialogs.
    When talking to NPC, these dialog choices may be made available depending on various conditions (one of them being a supported furniture nearby), allowing the player to say things like "Get into that pillory" which makes the NPC to walk to the nearest object of that type and get in.
    When talking to NPC who is already in some kind of furniture, additional dialog choices will be available to start various interactions (for example, selecting "I am gonna fuck you now" will start ...guess what :)), and a special dialog choice "I'll let others have fun with you" marking the NPC as "available to all", allowing other NPCs to perform random interactions (depending on various conditions, NPC dispositions, etc. - still TBD).
    Custom modules may completely omit any dialogs, and implement the interactions in different ways, if they choose to do so.

 

 

This is just a first draft of the specification, and even though i am currently following it, it is a subjet to changes as i go.

But most of this is already implemented, so i dont expect any features to be dropped, probably only slightly changed or new ones added.

 

 

 

 

For those asking for a download:

Please, have a bit more patience, i am working as fast as i can.

Majority of promised features are already implemented, so the framework itself is in quite usable condition, but i still need to finalize and thoroughly test few parts of code,

and add more default interactions (i didn't "bother" with them so much yet, because i still focus on the core functionality and those few that i did add already are enough for my testing purposes, but would be hardly enough for your enjoyment).

But stay tuned, it won't take long until the first alpha release.

 

In the meantime feel free to comment and keep sharing ideas.

Link to comment

Nothing? Nobody has anything to say?

Did i post in a wrong forum thread?

 

Anyway...

Working on the player and follower interaction, i made some progress.

Player can order the follower to use furniture, then aproach the follower again and initiate various interactions via dialogue choices.

I also managed to prevent the victim from standing up after animation finishes (a simple alteration to original SexLab scripts did the trick).

So now the interaction is fluid as it can be without any glitches or animation wierdness.

 

One slightly annoying problem:

After player exits the cell and returns, while leaving the follower in furniture, the follower is found standing next to the furniture instead still being IN it.

The problem is that SetDontMove() somehow overrides SetRestrained() and vice versa.

I checked this with the getRestrained console command:

 

- if i run the SetRestrained first, and SetDontMove after it, then getRestrained shows the follower is NOT restrained.

- if i switch the order of those two funtion calls, then getRestrained shows the follower IS restrained.

 

This is a problem, because i need to use SetDontMove to prevent the actor being moved around (for example if hit),

and i also need SetRestrained, so the actor doesnt leave the furniture even after player leaves, waits, and reenters the cell.

 

Any suggestions, please? --- solved in the following post

Link to comment

Actually, i think i dont really need the actor.SetDontMove(True) to prevent actor being pushed away, as using actor.SetVehicle(furniture) should be enough.

I think i introduced the SetDontMove when i found that SexLab is using it, and because i am bypassing the SexLab's code that resets it after animation ended,

i had to reset it myself - but i dont actually ever need to set it to True, i think i introduced it just because i thought it is needed because... well, becaue SexLab uses it, so it must be important right?

 

In any case, using only the call to actor.SetDontMove(False) to reset it after animation ends, seem to be sufficient and everything works properly.

Link to comment

I would appreciate any tips on improving/simplifying/cleaning the following script.

It is far from finished of course, but i'd like to know if i am doing something wrong, or if i went the wrong direction (wouldn't it be too resource hungry, having to attach the script in CK to every object that we want to use? is there a better way? will i run into some issues later that i dont see right now? etc.) considering what i want to achieve.

 

This script is attached to a furniture (a pillory only, each type of furniture will have own specific script later), and used to handle basic interaction (activation, playing idle animations, releasing the actor).

Whoever activates the object (while noone is using it), gets trapped/locked in position.

A special ability spell is added to the trapped actor, to enable dialog choices for applicable interaction (not part of this script).

While no interaction is active, random idle animations are being played by the trapped actor.

To release the trapped actor, someone must activate the object (only if the furniture script is in idle state, ie. no interaction is active).

 

 

 

Scriptname RoggFurnitureScript extends ObjectReference
{Script attached to a furniture, adding given abilities to actors depending on furniture type}

objectReference property refFurniture auto hidden ; hidden property referencing the activated furniture
actor property akActor auto hidden ; hidden property to track who activated the furniture
spell property AbRoggInPillory auto ; property referencing the ability to add to the actor
Idle[] idleAnims
bool isPlayer = false

Event OnLoad()
	BlockActivation(true)
EndEvent
Event OnUnload()
	UnregisterForUpdate()
EndEvent
Event OnInit()
	idleAnims = New Idle[5]
	idleAnims[0] = Game.GetFormFromFile(0x00008108, "ZaZAnimationPack.esm") As Idle
	idleAnims[1] = Game.GetFormFromFile(0x00008109, "ZaZAnimationPack.esm") As Idle
	idleAnims[2] = Game.GetFormFromFile(0x0000810A, "ZaZAnimationPack.esm") As Idle
	idleAnims[3] = Game.GetFormFromFile(0x0000810B, "ZaZAnimationPack.esm") As Idle
	idleAnims[4] = Game.GetFormFromFile(0x0000810C, "ZaZAnimationPack.esm") As Idle
EndEvent

auto STATE INIT
	Event OnActivate(ObjectReference akActionRef)
		Debug.Notification("INIT: ACTIVATE")
		refFurniture = self as ObjectReference
		isPlayer = (akActionRef == Game.GetPlayer())
		akActor = akActionRef as Actor
		akActor.AddSpell(AbRoggInPillory, true)
		akActor.SetVehicle(refFurniture) ; SetVehicle prevents actor from being pushed away when bumped by other actors/objects
		If isPlayer
			Game.DisablePlayerControls(true, true, false, false, false, false, false)
		Else
			If akActor.IsDoingFavor()
				akActor.SetDoingFavor(False)
			EndIf
			akActor.TranslateTo(X,Y,Z, GetAngleX(), GetAngleY(), GetAngleZ(), 10.0) ; Translate victims position and rotation to the furniture, and register for update in one second to set the position as the translation sometimes doesnt end where it should be.
		EndIf
		RegisterForSingleUpdate(1.0)
	EndEvent
	; It may seem unneccessary to juggle with TranslateTo like this, calling it twice in a row with a playIdle in between,
	; but it seems to be needed to prevent the actor to stand up from pillory and bend in it again
	Event OnUpdate()
		If akActor.PlayIdle(idleAnims[0])
			akActor.StopTranslation()
			; It is really important to differentiate Player from Follower/NPC who need to run a different set of commands to prevent some animation related wierdness
			If isPlayer
				akActor.SetPosition(X,Y,Z)
				akActor.SetAngle(GetAngleX(), GetAngleY(), GetAngleZ())
			Else
				akActor.TranslateTo(X,Y,Z, GetAngleX(), GetAngleY(), GetAngleZ(), 0.01, 0.01)
				akActor.setRestrained(True)
			EndIf
			GotoState("IDLE")
		EndIf
	EndEvent
EndState

STATE IDLE
	Event OnCellAttach()
		Debug.Notification("IDLE: CELL ATTACHED")
		akActor.SetVehicle(refFurniture) ; in case we are reentering the cell after we were gone and it got unloaded, seems like the setVehicle state gets lost
		RegisterForSingleUpdate(0)
	endEvent
	Event OnBeginState()
		Debug.Notification("IDLE: BEGIN")
		akActor.SetVehicle(refFurniture) ; in case we are returning to IDLE state after SexLab has been playing some anims which overriden our setVehicle command
		RegisterForSingleUpdate(3) ; The delay here is important to prevent the actor to stand up and bend again
	EndEvent
	Event OnUpdate()
		If SexLabUtil.IsActorActive(akActor)
			Debug.Notification("IDLE: TO ACTIVE")
			GotoState("ACTIVE")
		Else
			If akActor.IsInDialogueWithPlayer()
				Debug.Notification("IDLE: DIALOG OPEN")
				RegisterForSingleUpdate(5)
			Else
				int i = Utility.RandomInt(0, 4)
				Debug.Notification("IDLE: ANIM " + i)
				akActor.SetPosition(X,Y,Z)
				akActor.SetAngle(GetAngleX(), GetAngleY(), GetAngleZ())
				akActor.PlayIdle(idleAnims[i])
				RegisterForSingleUpdate(Utility.RandomInt(5, 30))
			EndIf
		EndIf
	EndEvent
	Event OnActivate(ObjectReference akActionRef)
		Debug.Notification("IDLE: TO RELEASE")
		; release the actor from furniture, but lets make sure the actor cannot release himself
		;If akActor != (akActionRef as Actor)
			UnregisterForUpdate()
			GotoState("RELEASE")
		;EndIf
	EndEvent
EndState

STATE ACTIVE
	Event OnCellAttach()
		Debug.Notification("ACTIVE: CELL ATTACHED")
		RegisterForSingleUpdate(5.0)
	endEvent
	Event OnBeginState()
		Debug.Notification("ACTIVE: BEGIN")
		RegisterForSingleUpdate(5.0)
	EndEvent
	Event OnUpdate()
		If SexLabUtil.IsActorActive(akActor)
			Debug.Notification("ACTIVE: WAITING")
			RegisterForSingleUpdate(5.0)
		Else
			Debug.Notification("ACTIVE: TO IDLE")
			GotoState("IDLE")
		EndIf
	EndEvent
EndState

STATE RELEASE
	Event OnBeginState()
		Debug.Notification("RELEASE: BEGIN")
		RegisterForSingleUpdate(0)
	EndEvent
	Event OnUpdate()
		Debug.Notification("RELEASE: RELEASING")
		If akActor
			akActor.StopTranslation()
			akActor.SetVehicle(None)
			akActor.RemoveSpell(AbRoggInPillory)
			Debug.SendAnimationEvent(akActor, "IdleForceDefaultState") ; reset actors animation state to prevent it being stuck in whatever idle been played last
			If isPlayer
				Game.EnablePlayerControls()
			Else
				akActor.setRestrained(False)
				akActor.setDontMove(False)
				; resume follower duty of following the player around
				If akActor.IsPlayerTeammate()
					akActor.SetAv("WaitingForPlayer", 0)
					; calling SetObjectiveDisplayed may be unneccessary, but it is normaly done when resuming to follow in DialogueFollowerScript, so until sure, lets do it here too
					Quest DlgFollowerQuest = Quest.GetQuest("DialogueFollower")
					If DlgFollowerQuest
						(DlgFollowerQuest as DialogueFollowerScript).SetObjectiveDisplayed(10, abdisplayed = false)
					EndIf
				EndIf
			EndIf
		EndIf
		Debug.Notification("RELEASE: TO INIT")
		GotoState("INIT")
	EndEvent
EndState

 

 

 

Thank you for any advice.

Link to comment

I cant help you, only encourage.  The interaction of NPCs, sexlab, and sexlab ready furniture would be amazing, and so I encourage you to keep at it.  It may be to your advantage to get with an animator like Leito who uses furniture in his/her animations who may be able to answer so of your questions.

Link to comment

Thank you, i already started and abandoned many projects and ideas, because i found the implementation in Skyrim too difficult to put up with.

I'll try my best to keep it up, encouragement helps :)

 

Regarding asking any animators or other modders for help... well, i think about it every time i get stuck, but i think it is too early to actively bother anyone else with my problems.

Maybe later, when i have something to show. For now, i'll just keep posting about my progress, and maybe someone will take the bait :)

Link to comment

I am thinking about changing it into a quest driven system, something similar to SexLab threads.

One main quest and several clones of a 'thread' quests for holding references to furniture in use and actors involved.

Main quest would provide interface for starting 'thread' quests for every furniture in use.

Interactions would be run and controlled via particular thread quest script functions.

This should also negate the need for attaching furniture scripts in CK, as all that these scripts are doing could be done via the "thread" quests,

except one thing:

 

- initiating the use/leave furniture actions

 

but i am sure there are other ways to do that...

 

From player perspective, choosing the furniture the follower/NPC should "use", could be based around using the OnCrosshairRefChange.

Or maybe directly via dialogue, instead of using the "do me a favour" or "i want you to do something" options, new direct dialogue choices like "sit in that chair", "get int that pillory", etc., would be enabled by setting some global vars (chairIsNear, pilloryisNear, etc) from a quest script periodically checking for nearest furniture of that type in current cell.

These dialog choices would run a code that would use "main" quest script to start a new "thread" quest for the given furniture and actors, and the thread would take care of things from there.

 

...If you know this is wrong, or not the best way, i'll appreaciate if you stop me before i spent another dozens of hours trying to implement what i just outlined.

 

EDIT: I actually started reworking it into a quest driven system, right after this original post.

...spent the whole night working on it, should have a working concept very soon.

Link to comment

Progress report...

 

Basic quest driven framework is finished.

It consists of furniture-scanner script, which periodically checks for existence of nearby furniture of given types,

setting corresponding global variables to 1 or 0 (ie. if a pillory is found nearby, global RoggIsNearPillory is set to 1).

These global variables are used to enable dialog choices for ordering actors into furniture.

Upon selecting one of thes dialog choices, a new thread is started (or uses existing one if having same actor assigned),

both actor and furniture are assigned into its referenceAliases, and makes the actor walk to the furniture to activate it.

The furniture's referenceAlias script takes care of playing appropriate random idles if no interaction is happening, etc. (similar to the old "RoggFurnitureScript"),

still using the ability spell to mark the actor as being in particular type of furniture to enable further dialog choices for actual interaction,

which is run via functions provided by appropriate thread.

Theoretically it supports any actor (player/npc/follower) on any side of the interaction, and can be used in any quests, jailor-NPC packages, etc.

 

That being said, i am currently struggling with making the actor to go to the furniture and activate it.

I am trying to use AI package on actor referenceAlias, but i never did anything with AI packages, so i had to resort to the google-try-fail-google method,

and after several hours it doesnt seem i am any closer to successful implementation.

HELP WANTED - if you know about good tutorials or examples, post the links please.

 

EDIT: Figured out the referenceAlias AI packages, cannot use templates though, had to create special "activate" package for every thread.

Once is actor assigned into thread's actor referenceAlias, the "activate" package kicks in, using the furniture referenceAlias as target and actor walks to it and activates it, thus gets/sits int.

 

...still a lot to do, but the future looks bright!

Link to comment

Thank you for the kind words.

 

btw. the basic framework seems to be stable, and things are working for the pillories.

I am really pleased with how it all works so far, including the way of interaction via dialogues, and i think it feels really natural.

...all it takes is to talk to an NPC/follower, and if there is any kind of usable furniture around, an appropriate dialogue choice will be available.

Upon selecting such dialogue choice, the actor will find a furniture of given type, closest to player, gets in it, and since then the dialog changes to provide only interaction choices, inventory access, and option to release the actor.

No need to point anywhere, like when asking for favours, no need to cast spells.

Speaking of spells... i will maybe try to implement a new shout which initiates a dialog with targeted NPC that is too far away for normal activation via the default 'E' key.

 

Still, have a new problem with Zaz Wooden Horse - playing its idle animation doesnt work, the NPC jumps off.

I am going to test other objects (so far i added only the Pillory and Horse, so i'll have to stop being lazy and add the rest), but if the same scripts works with at least one, then i doubt the problem is in those scripts (unless maybe some objects need some extra-special treatment)

Link to comment

A slight progress...

Reworked the way "threads" are registered with the main controller.

EDIT: i should probably explain how it works, its simple:

Thread scripts register for a "Yo! i am ready!" ModEvent which is send by Main controller after it preps whatever it needs.

When the threads receive this event, they call the RegisterThread() function on the main controller, causing the thread to

get saved in main controller's thread list, and retrieve the assigned thread ID in one go.

 

Main controller script (the relevant parts only):

 

scriptname RoggMain extends Quest

RoggThread[] Threads

event OnInit()
    RegisterForSingleUpdate(1)
endEvent

event OnUpdate()
    if Threads.length == 0
        Threads = new RoggThread[100]
    endIf
    SendModEvent("ROGG_RoggReady")
endEvent

int function RegisterThread(RoggThread t)
    int i
    while i < Threads.Length
        if Threads[i] == None
            Threads[i] = t
            return i
        endIf
        i += 1
    endWhile
    return -1
endFunction

RoggThread function PickThread()
    int i
    while i < Threads.Length
        if Threads[i] == None
            return None
        elseif Threads[i].IsReady
            return Threads[i].Pick()
        endIf
        i += 1
    endWhile
    return None
endFunction

 

 

 

A Thread script (relevant parts only):

 

scriptname RoggThread extends Quest

RoggMain property ROGG auto hidden

int thread_id = -1
int property id hidden
    int function get()
        return thread_id
    endFunction
endProperty

bool property IsReady hidden
    bool function get()
        return GetState() == "AVAILABLE"
    endFunction
endProperty

event OnInit()
    RegisterForModEvent("ROGG_RoggReady", "OnRoggReady")
endEvent

event OnRoggReady(string eventName, string strArg, float numArg, Form sender)
    UnregisterForModEvent("ROGG_RoggReady")
    ROGG = sender as RoggMain
    if thread_id < 0
        thread_id = ROGG.RegisterThread(self)
        GotoState("AVAILABLE")
    endif
endEvent

RoggThread function Pick()
    RoggLog("Called Pick() outside AVAILABLE state.")
    return None
endFunction

state AVAILABLE
    RoggThread function Pick()
        GoToState("RESERVED")
        return self
    endFunction
endState

 

 

 

I did it to get rid of the need to manually link the "thread" quests into some variables.

For example, SexLab fills its thread slots like this:

Slots = new sslThreadController[15]
Slots[0] = Game.GetFormFromFile(0x61EEF, "SexLab.esm") as sslThreadController
Slots[1] = Game.GetFormFromFile(0x62452, "SexLab.esm") as sslThreadController
...

Before, i had to do something simmilar, but no more. It makes adding new threads a bit easier.

But if it is a good thing, that remains to be seen after some more testing.

 

 

A slight setback...

Spent almost dozen hours trying to find out why the hell is the MainControler script receving update events every second!

Finally found why - for anyone who wants to have a laugh, its really simple, here goes:

When you attach several scripts to a single quest by putting them in the list of scripts in Quest->Scripts_Tab,

and then you call RegisterForSingleUpdate() in one of them, it results with all the scripts receiving this event!

...and this is the point where you laugh, because I DIDN'T KNOW THIS!
It kind of makes sense... i guess.

So, it was my RoggFurnitureScanner script, registering for single updates to rerun its furniture scan - once i moved it into its own dedicated quest, problem was gone.
(btw. isn't there a way to prevent this behaviour? maybe some special flag in the script-extends line? because it seems like a waste to create a new quest for every other script i need to run)

 

Link to comment

Awesome. Does this mean vanilla furniture, like chairs, benches, fences, etc will also be compatible or are you going to place new objects like pillories, etc. across Skyrim?

 

Well... i am not sure i completely understand the question, so let me put it this way:

 

EDIT: moved the answer into the first post (see the "long description" spoiler)

Link to comment

When i think of it, it may open a wide area of new possibilities.

With this you can even roleplay a pimp, force your follower into a bed in let's say Banered Mare, and then go sit on the bar, drink, talk to Hulda, and wait for the various NPCs to come upstairs to get serviced, while you just keep counting the coins :)

You could actually use this to make money in the game!

I am already thinking into making it possible to even set prices for various acts :-D ...the brain is unstoppable sometimes :)

Sounds like ppl could have a great deal of fun with this.

 

...well, note to self: back to earth and focus on the framework first.

Link to comment

Progress report...

 

Started rewriting various furniture-specific scripts into a modular version.

This will finally allow to "register" new types of furniture objects and/or animations, including complete interaction handling functions, from outside of the framework.

Link to comment

I think something like this was already asked for plenty of times for SexLab ;)

 

At least after seeing how good this works in The Sims 3, i started wondering why you can't bang Lydia on the kitchen table or in the bathtub.

 

Personally i have no idea about animating or scripting, so i don't have anything to contribute other than voicing my support and voting the thread up.

Link to comment

Thank you all, and as a reward for being such supportive audience, here is another...

 

Progress report!

 

Registering furniture with the framework finally works.

Now i am going to clean it up of some debug/obsolete code, and go back to tweaking the scripts driving the default interactions.

 

As you probably noticed, i started using ZaZ pillory as my "test subject", so i will finish few sample interactions for it,

then i will do the same for at least one other furniture to have something i can call at least an Alpha,

and then i'll post it for download, so all of you can try it and hopefully give some feedback.

Link to comment

Progress report...

 

  • Took a minor detour and partially implemented MCM configuration menu.
    It cannot be yet used for enabling/disabling the framework or any of its parts,
    but at least it displays information about registered threads (state, actor, furniture),
    and list of furnitures registered with the Furniture Library.
     
  • Added support for Furniture Library into the Furniture Scanner
    Now it scans for all registered furniture, and is listening for registration changes to be able to adapt its scanning process accordingly.
     
  • Polished some code
    Renamed 90% of all scripts, functions, variables and forms. to make it a bit more ...nicer?
    Improved and simplified the Furniture Library registration method.
     
  • Added few more furniture pieces to the Default Furniture Library
    So, currently supported furniture zbfPillorySingle, zbfWheel03, zbfWoodenHorse, and zbfWoodenPony01.
    Interactions are still waiting to be implemented (but the underlying system is ready), and that is what i will do now.
     
  • Spent horrendous amount of time by testing it all
    Well, i wrote "testing", but maybe "goofing around" would be better words to describe it.
    No NPC in Whiterun was spared (except the guards, you dont wanna mess with them guards!).
    One by one, the poor residents of Whiterun were dragged into my secret temporary lair at Drunken Huntsman, to endure rigorous
    testing involving wheels, pillories, and ponies (and creepy eyeballing by Elrindir trying to sell them some bows, arrows, and mead).

 

Next on the list: Interactions!

Link to comment

I found one extremely annoying problem.

Annoying "furniture-entering" animation being played when player reenters cell after leaving there an NPC already in a furniture.

Details can be found in ZaZ Anim Pack thread where i posted, asking for help: at http://www.loverslab.com/topic/17062-zaz-animation-pack-2015-02-10/page-147?do=findComment&comment=1077967

 

Other than that, everything looks better and better with every minute.

Currently working on some basic/sample 1 on 1 interactions, and outlining the basics for required AI packages.

(sadly, i spent the whole last night trying to figure out the problem mentioned above - so far without success, it really drives me crazy, these kinds of "glitches" are exatly what i don't want to have in this mod :().

Link to comment

Progress report...

  • Wasted some time trying to fix unfixable
    Tried to find solution or fix for the "actors in furniture sometimes play furniture entering animation/blending when player enters the cell".
    Some real gurus already tried to find out whats going on, but without any success. So, i am finally moving on.
     
  • Wasted some more time with pillory and its IsFurnitureInUse() issue
    The function should return true as long as somebody sits in the furniture, but with zbfPillorySingle it returns true only for few seconds at the beginning,
    and then it starts returning false - even if the pillory is still occupied.
    Again, couldn't find what the problem is, spent too much time with it already, so ..moving on.
     
  • Implemented interactions as spell based
    I hate spells :) but i couldnt find a better way to define and run interaction scripts from outside of the framework (to allow the expected modularity).
    So, interactions are now started by a script casting spells with attached activeMagicEffect script.
    It sounds ugly (at least to me), but its actually pretty neatly done, and works perfect.
     
  • Added three sample interactions for Pillory
    More will follow shortly, of course also for other objects.

 

...in the upcomming hours, i will update first post with some fresh info on current implementation, how it works, how to register custom furniture with anims and interactions, etc.

Still not download though (not until also the system of AI Packages gets finalized).

Link to comment

Most of the technical stuff is beyond me, as I've never invested any time into learning Papyrus, but from what I'm reading here, this seems pretty badass.

 

I'm guessing, using your framework, it would be possible for things to happen like a rapist slamming you over a table and having his way with you, rather than just doing it on the floor (given, of course, that the requisite animations exist, and that whichever rape-mod references them). Right?

 

I mean it can happen "accidentally" anyway (i.e. my post here, serendipitous positioning in FNV), but were it actually intentional... that'd be super-hot.

 

Also, do walls count as furniture? Because fucked against a wall = also super-hot.

Link to comment

Archived

This topic is now archived and is closed to further replies.

  • 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