Roggvir Posted January 31, 2015 Posted January 31, 2015 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 neededWhen 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 NPCsPackages 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 SystemA "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 LibraryAdds support for some basic furniture including default interactions, by registering the furniture objects with "Furniture Library System" as any custom module would. Default InteractionsFunction 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 DialogsPlayer 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.
Roggvir Posted February 3, 2015 Author Posted February 3, 2015 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
Roggvir Posted February 3, 2015 Author Posted February 3, 2015 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.
Roggvir Posted February 3, 2015 Author Posted February 3, 2015 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.
Manax Posted February 3, 2015 Posted February 3, 2015 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.
Roggvir Posted February 3, 2015 Author Posted February 3, 2015 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
Roggvir Posted February 3, 2015 Author Posted February 3, 2015 Updated first post to reflect current state of development (and renamed the thread).
Roggvir Posted February 5, 2015 Author Posted February 5, 2015 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.
Roggvir Posted February 5, 2015 Author Posted February 5, 2015 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!
echo711 Posted February 6, 2015 Posted February 6, 2015 you're doing pretty nice work, this would make sexlab and other mods more interesting as for npc interaction goes, sadly i know nothing for scripting, so i can't give any advice or help. Just keep up the good work, its very appreciated.
Roggvir Posted February 7, 2015 Author Posted February 7, 2015 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)
Roggvir Posted February 8, 2015 Author Posted February 8, 2015 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)
Puupsfred Posted February 9, 2015 Posted February 9, 2015 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?
Roggvir Posted February 9, 2015 Author Posted February 9, 2015 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)
Roggvir Posted February 9, 2015 Author Posted February 9, 2015 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.
Roggvir Posted February 9, 2015 Author Posted February 9, 2015 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.
xgcsentielxs Posted February 9, 2015 Posted February 9, 2015 Like the concept! I may have to download and check out soon. 8)
guk Posted February 9, 2015 Posted February 9, 2015 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.
Roggvir Posted February 10, 2015 Author Posted February 10, 2015 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.
Roggvir Posted February 10, 2015 Author Posted February 10, 2015 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 ScannerNow it scans for all registered furniture, and is listening for registration changes to be able to adapt its scanning process accordingly. Polished some codeRenamed 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 LibrarySo, 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 allWell, 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 rigoroustesting involving wheels, pillories, and ponies (and creepy eyeballing by Elrindir trying to sell them some bows, arrows, and mead). Next on the list: Interactions!
ren54642 Posted February 10, 2015 Posted February 10, 2015 cool hope it works out looking forward to it
Blackness blackness is... Posted February 11, 2015 Posted February 11, 2015 cool mod idea. you got my support for sure
Roggvir Posted February 11, 2015 Author Posted February 11, 2015 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 ).
Roggvir Posted February 12, 2015 Author Posted February 12, 2015 Progress report... Wasted some time trying to fix unfixableTried 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() issueThe 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 basedI 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 PilloryMore 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).
iron_jack Posted February 12, 2015 Posted February 12, 2015 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.
Recommended Posts
Archived
This topic is now archived and is closed to further replies.