• Announcements

    • Ashal

      SITE MOVED - IN READ ONLY MODE   12/08/2015

      Please use http://www.loverslab.com moving forward. Site has been restored to a previous version, and this one placed into a read-only mode. This is available for a limited time so users may reference/copy content that has been lost in the transition. This will no longer be accessible by December 22nd, 2015.

astymma

Contributor
  • Content count

    1,682
  • Joined

  • Last visited

Posts posted by astymma


  1. Then maybe we are missing something obvious or, nifscript is missing stuff oblivion had.

    Because i can still import head facials in blender and modify the head mesh with shape keys. just like oblivion. if i can get that work i will be able to export a normal animation correctly even with facials imbeded withing the same animation. No need for even nifscope.

     

    pics removed

    I think with Scanti's tools you could create OBJ files of all the expressions you need and then simply append them to the head tri as available expressions.

     

    Basically:

    • Load head mesh into FaceGen (full not trial).
    • Assign expression you want to edit.
    • Export expression as OBJ file.
    • Edit OBJ in Blender.
    • Use Scanti's AddMorph utility to add the edited expression to the head TRI file.

    Just a thought.

     

    EDIT: Er, assuming the expressions achieved through dialogue being played during the sex act still works...

     

    EDIT: Attached my instructions I typed up for messing with expressions in TRI files ( was for Head06)

     

     

    0

  2. Just wanted to point out that SexoutPositioning functions as both a guide to using NX Vars AND as a guide to utilizing the callback system... specifically to obtain information you're discussing.


     


    Here's SexoutPosBEMainS which does the heavy lifting:





    scn SexoutPosBEMainS

    ref rActor
    ref rTemp
    ref rTarget
    int iAbort
    float fTemp
    int iStage
    float fTimer
    int iQuiet
    int iPlayerInvolved
    int iDispel

    Begin ScriptEffectStart
        set rActor to GetSelf
         if rActor
             if SexoutPosQVars.iDebug
                printtoconsole "SexoutPos: BEMainS starting on Actor:(%i)[%n]" rActor rActor
            endif
         else
             if SexoutPosQVars.iDebug
                printtoconsole "SexoutPos: BEMainS starting on NULL Actor... Aborting."
            endif
              set iAbort to 1
              set iStage to 2
              return
        endif
        set rTemp to rActor.NX_GetEVFo "Sexout:Start::spellTarget"
        if rActor != rTemp
             if SexoutPosQVars.iDebug
                printtoconsole "SexoutPos: BEMainS cast on different actor(%i)[%n] than SexouNGBegin(%i)[%n]. Switching to SpellTarget to get NX Vars. Continuing." rActor rActor rTemp rTemp
            endif
            set rActor to rTemp
         else
             if SexoutPosQVars.iDebug
                printtoconsole "SexoutPos: BEMainS cast on same actor as SexouNGBegin(%i)[%n]. Continuing." rActor rActor
            endif
        endif
        if rActor == Player
            set fTimer to 0    
            set iStage to 0
            set iQuiet to 0
            set rTarget to rActor
            ;start with NULL state
            rActor.Dispel SexoutPosSpMonitor
            rActor.Dispel SexoutPosSpReset
            rActor.Dispel SexoutPosSpTerminate
        else
            set rTemp to rActor.NX_GetEVFo "Sexout:Start::actorA"
            if rTemp
                ;start with NULL state
                rActor.Dispel SexoutPosSpMonitor
                rActor.Dispel SexoutPosSpReset
                rActor.Dispel SexoutPosSpTerminate
            endif
            if rTemp == Player
                set iPlayerInvolved to 1
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Actor not player but Actor A is... recasting on A."
                endif
                set rTarget to rTemp
            endif
            set rTemp to rActor.NX_GetEVFo "Sexout:Start::actorB"
            if rTemp
                ;start with NULL state
                rActor.Dispel SexoutPosSpMonitor
                rActor.Dispel SexoutPosSpReset
                rActor.Dispel SexoutPosSpTerminate
            endif
            if rTemp == Player
                set iPlayerInvolved to 1
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Actor not player but Actor B is... recasting on B."
                endif
                set rTarget to rTemp
            endif
            set rTemp to rActor.NX_GetEVFo "Sexout:Start::actorC"
            if rTemp
                ;start with NULL state
                rActor.Dispel SexoutPosSpMonitor
                rActor.Dispel SexoutPosSpReset
                rActor.Dispel SexoutPosSpTerminate
            endif
            if rTemp == Player
                set iPlayerInvolved to 1
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Actor not player but Actor C is... recasting on C."
                endif
                set rTarget to rTemp
            endif
            if 0 == rTarget
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Player is not actor A, B or C or NX Vars are missing from (%i)[%n]... Aborting." rActor rActor
                endif
                set iStage to 2
                set iAbort to 1
                set iQuiet to 1
                if rActor
                    ;return actor to NULL state
                    rActor.Dispel SexoutPosSpMonitor
                    rActor.Dispel SexoutPosSpReset
                    rActor.Dispel SexoutPosSpTerminate
                endif
                return
            else
                ;start with NULL state
                set SexoutPosActive to 0
            endif
        endif
    End

    Begin ScriptEffectUpdate
        if 1 == iDispel
            return
         endif
        if 0 == iStage
            if fTimer < 5.00
                set fTimer to (fTimer + ScriptEffectElapsedSeconds)            
                return
            else
                set iStage to 1
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Timer elapsed, moving on."
                endif
                return
            endif
        endif
        if 1 == iStage
            set rTemp to rActor.NX_GetEVFo "Sexout:Start::actorA"
            if rTemp
                set SexoutPosQVars.rActorA to rTemp
                set SexoutPosQVars.iHasA to 1
                set fTemp to rTemp.NX_GetEVFl "Sexout:PosX"
                set SexoutPosQVars.PosOrigAX to fTemp
                set fTemp to rTemp.NX_GetEVFl "Sexout:PosY"
                set SexoutPosQVars.PosOrigAY to fTemp
                set fTemp to rTemp.NX_GetEVFl "Sexout:PosZ"
                set SexoutPosQVars.PosOrigAZ to fTemp
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Actor A(%i)[%n] found, PosOrigA values set." rTemp rTemp
                endif
            else
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Actor A not found, PosOrigA values not set."
                endif
            endif
            set rTemp to rActor.NX_GetEVFo "Sexout:Start::actorB"
            if rTemp
                set SexoutPosQVars.rActorB to rTemp
                set SexoutPosQVars.iHasB to 1
                set fTemp to rTemp.NX_GetEVFl "Sexout:PosX"
                set SexoutPosQVars.PosOrigBX to fTemp
                set fTemp to rTemp.NX_GetEVFl "Sexout:PosY"
                set SexoutPosQVars.PosOrigBY to fTemp
                set fTemp to rTemp.NX_GetEVFl "Sexout:PosZ"
                set SexoutPosQVars.PosOrigBZ to fTemp
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Actor B(%i)[%n] found, PosOrigB values set." rTemp rTemp
                endif
            else
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Actor B not found, PosOrigB values not set."
                endif
            endif
            set rTemp to rActor.NX_GetEVFo "Sexout:Start::actorC"
            if rTemp
                set SexoutPosQVars.rActorC to rTemp
                set SexoutPosQVars.iHasC to 1
                set fTemp to rTemp.NX_GetEVFl "Sexout:PosX"
                set SexoutPosQVars.PosOrigCX to fTemp
                set fTemp to rTemp.NX_GetEVFl "Sexout:PosY"
                set SexoutPosQVars.PosOrigCY to fTemp
                set fTemp to rTemp.NX_GetEVFl "Sexout:PosZ"
                set SexoutPosQVars.PosOrigCZ to fTemp
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Actor C(%i)[%n] found, PosOrigC values set." rTemp rTemp
                endif
            else
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Actor C not found, PosOrigC values not set."
                endif
            endif
            set rTemp to rActor.NX_GetEVFo "Sexout:Start::spellTarget"
            if rTemp
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: rActorOrig being set to spellTarget(%i)[%n]" rTemp rTemp
                endif
                set SexoutPosQVars.rActorOrig to rTemp
            else
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: spellTarget is NULL, unable to set rActorOrig... Aborting." rTemp rTemp
                endif
                set iAbort to 1
                set iStage to 2
                return
            endif
            if 1 == SexoutPosQVars.iHasB
                set rTemp to SexoutPosQVars.rActorB
                set SexoutPosQVars.rActorCur to rTemp
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: rActorCur being set to B:(%i)[%n]" rTemp rTemp
                endif
            else
                if 1 == SexoutPosQVars.iHasA
                    set rTemp to SexoutPosQVars.rActorA
                    set SexoutPosQVars.rActorCur to rTemp
                    if SexoutPosQVars.iDebug
                        printtoconsole "SexoutPos: rActorCur being set to A:(%i)[%n]" rTemp rTemp
                    endif
                elseif 1 == SexoutPosQVars.iHasC
                    set rTemp to SexoutPosQVars.rActorC
                    set SexoutPosQVars.rActorCur to rTemp
                    if SexoutPosQVars.iDebug
                        printtoconsole "SexoutPos: rActorCur being set to C:(%i)[%n]" rTemp rTemp
                    endif
                else
                    if SexoutPosQVars.iDebug
                        printtoconsole "SexoutPos: iHasA, iHasB, iHasC all set to False. Can't set rActorCur. Aborting."
                    endif
                    set iAbort to 1
                    set iStage to 2
                    return
                endif
            endif
            set iStage to 2
            return
        endif
        if 2 == iStage
            if 1 == iAbort
                if 0 == iQuiet
                    ShowMessage SexoutPosMsgAbort
                endif
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: Generic Abort... check previous console messages for cause."
                endif
                set iDispel to 1
                rActor.Dispel SexoutPosSpMain
            else
                if SexoutPosQVars.iDebug
                    printtoconsole "SexoutPos: BEMainS completed successfully... dispelling SpMain on actor(%i)[%n] and casting SpMonitor on actor(%i)[%n]" rActor rActor rTarget rTarget
                endif
                if rTarget != Player
                    printtoconsole "SexoutPos: BEMainS completed successfully but rTarget(%i)[%n] is not the same actor as the Player... Aborting." rTarget rTarget
                    set iAbort to 1
                    set iStage to 2
                    return
                endif
                rTarget.CIOS SexoutPosSpMonitor
                set iDispel to 1
                rActor.Dispel SexoutPosSpMain
            endif  
        endif
    End


     


    Note the spell target checks and such code designed to handle the spell not being cast on the actual spell target.


    0

  3. I'm curious, you know a lot about what's "behind the scenes" concerning some commands. These things are not explained in the Beth guide, is there a place where I can find them?

     

     

    Unfortunately, like I did... Google. Reading blogs, forums, GECK wiki talk pages... and my FAVORITE... finding out that the GECK wiki authors didn't write something in the GECK wiki if it was already written in the Oblivion CS wiki... fucking GRRR... like the talk pages... you know, the ones where scripters detail how the behavior has gotchas and give actual behavior as compared to expected behavior.

     

    EDIT: Oh... and I'm a programmer with over 30 years of experience writing code... that helps too ;)

    0

  4. AJ, the main reason I stated MoveTo updates the 3d Scene Graph is that when a call updates the graph it blocks thread execution until it completes.  MoveTo , unless the Player is the one being moved, immediately performs the move and updates the graph... this transfers control AWAY from your script to the rendering engine. Basically, ANY command which updates the scene graph will be the LAST command executed in a script THAT frame. The engine will try to get back to your script in the normal scheduling of script time and execute what came after that call... maybe. More likely it will run the script as if it were a new frame of execution.


     


    Typically you solve this by updating a stage variable and then doing a MoveTo. When your script receives control again, the updated stage variable moves execution after the MoveTo to finish what needs to be done.


     


    Your pseudo code might be:



    Begin

    int StageVar

    if StageVar == 0
        Do I need to move?
            No = return
            Yes = set StageVar = 1, Move NPC
    elseif StageVar == 1
        Run a Timer for a couple of seconds
        Timer Complete?
             No = keep running timer
             Yes = set StageVar = 2
    elseif StageVar == 2
        Set StageVar = 0
        Perform Cleanup (Disable, MarkForDelete)
    Endif

    End

    0

  5. In fact you may want to try something like:


    If (MyFollowerREF.GetDistance Player > SomeDistance)
        if (IsReference MyMarkerReference)
            MyFollowerREF.MoveTo MyMarkerReference
        else
            set MyMarkerReference to player.placeatme XMarker 1
        endif
    else
        if (IsReference MyMarkerReference)
            MyMarkerReference.Disable
            MyMarkerReference.MarkForDelete
        else
            return
        endif
    endif

    1

  6. As far as I know, the distance and direction parameters to PlaceAtMe don't work. The engine finds the nearest safe location and places the copy there. Although it may take the direction as a hint and try to put it there...


     


     I would not do the following:



    MyFollowerREF.Moveto MyMarkerReference
    MyMarkerReference.Disable
    MyMarkerReference.MarkForDelete

    I would do this:



    integer iDoCleanup
    if (IsReference MyMarkerReference)
        MyFollowerREF.Moveto MyMarkerReference
        set iDoCleanup to 1
    endif
    ...
    ;different stage of script
    if (1 == iDoCleanup)
        MyMarkerReference.Disable
        MyMarkerReference.MarkForDelete
    endif

    MoveTo causes an update of the 3d Scene Graph and will thus take many frames to complete.


    0

  7. What are your random issues?


     


    A few things to remember about PlaceAtMe...


    • It takes a few frames for the function to complete. (MyReference could evaluate as true and still NOT point to an existing in world object... for a few frames)
    • If you pick up the item created, the reference is now invalid. (i.e. player picks it up and puts in inventory).
    • Many reference types will be unloaded on cell reset if created by PlaceAtMe.
    0

  8. Yeah, I initially advised using 0 to initialize refs but also mentioned that if that doesn't work, try ANY constant reference... playerRef should be fine... though I'd probably use a reference unlikely to be edited ( an XMarker you place in your own mod in a closed, unreachable cell for example). Or one that is unrelated to your task... if you are gonna store an actor in it dynamically, use something OTHER than an actor as your constant. Helps with debugging.


    0

  9. ContainerRef.RemoveAllItems ActorREF 0 1

    That moves all items from a container and gives them to the actor. The only actual MOVE of the object functions. Everything else is a copy and/or destroy.

     

    EDIT: RemoveAllTypedItems also is a MOVE. RemoveItem is a delete.

     

    2nd EDIT: Oh and YES... the method you discussed is the only way AFAIK to have dynamic mobile quest targets.

    1

  10.  

    You can obtain the editor location reference id of any reference by preceding the reference with "ref.". It's shorthand

     

    Just when I think I'm starting to know shit, astymma walks in :)

     

    Come to think of it, other than startconversation, I can't think of a function that specifically requires or takes editor refIDs.

     

     

    I think the reason why StartConversation specifically takes those IDs is to facilitate pathing. Having the refIDs allows the engine to not have to traverse the Scene Graph to find the pertinent navmeshes for pathing. It has reference to them from the call. It can immediately start working on pathing the actor to the target.

     

    Specifically, I believe that when the editor ref is loaded, it's kept updated by the engine in real time in memory. Providing the reference gives the current information for the actor. It's why prefacing a reference with "ref." is useful. Alternatively, if that's not correct... then it's used as a shortcut into the pathing algorithm... what we call in AI a pathing hint. It shears leaves off the binary search tree.

    0

  11. SmallerTalk actually uses this:



    refHolder.StartConversation player, SmallerTalkGreeting ref.refHolder ref.Player 1 1

    refHolder being the holder of the token


     


    Basically...


    The holder of the token is refHolder, it calls StartConversation...


    the player is the one who will be targeted...


    refHolder will use topic_id of SmallerTalkGreeting when conversation is initiated...


    the starting location reference if movement is required is ref.refHolder...


    the ending location reference if movement is required is ref.player...


    head tracking is allowed so the NPC looks at the player during the process...


    because movement to the target is permitted.


     


    You can obtain the editor location reference id of any reference by preceding the reference with "ref.". It's shorthand.


    Using the location refs is what allows SmallerTalk to permit movement of speaker towards target even through cell transitions.


     


    The point being that the call is neither "mental" nor "superfluous"... but required...


     


     


    1

  12. Well I don't want it to be "easy" I just don't like having to wait on some chance conversation to only have a possibility of getting it rather than simply activating some dialogue to attempt it.  But anyway, thanks for the help, I'll look around and see what I can come up with.

     

    Your best bet is SexoutSex. It's the Generic, no failure, sex dialogue mod.

    0

  13. Would love to see this ported into FONV. The old MAC mod made the attempt at adding a porn studio in Freeside, but the quests that went along with it were fairly detached and didn't really lead anywhere. For as much Sexout content we have for NV now, its surprising something like a porn studio and strip clubs haven't been made yet for the Strip and surrounding areas.

     

    There's a revised version of MAC here. It contains a lot more content. I would only really use it if you're comfortable using FNVEdit to merge lists and NPC records though as it requires Lings , NCCS and FoxyFiends (a fiend overhaul) in addition to wsex. It's by the guy who made Love Shacks and Art of Seduction and Marriage (both fairly good quest mods).

     

    Basically, if you play a male PC, these mods are great for adding content... and god knows male content is hard to find, sadly.

    0

  14. I couldn't get the facial Morphs to stay on during animations; they would reset instantly

    back to the vanilla (lack of) expression before I could even attempt to move the camera into

    position. The only issue with the facial Expressions are these bright white elongated triangular

    artefacts that appear next to characters in some poses, particularly open-mouth poses... that and

    you can't get the mouth open far enough to get a dick in without clipping on the lips. Those

    dicks are just too damn big... :0

    If you engage the facial expression during animation the character will reset position briefly to a

    standing idle, but will return to the animated position after a few seconds, so no harm done. The

    Positioning mod really comes in handy for oral stuff.

     

    The T-pose of almost every animation has an expression assigned. It's the T-pose expression. Unfortunately it resets any current idle you're playing as an expression.  Generally you want the animation you want to modify to be playing and then apply your modified expression.

    0