prideslayer Posted June 4, 2014 Author Posted June 4, 2014 That's fine but if you need to go back from the beta you'll have to reactivate sexout core. If you zip up the download you can add the zip as a fomod with fomm.
Halstrom Posted June 4, 2014 Posted June 4, 2014 Seems to work ok for me, 3 out 3 successful F/M sexual acts so far using SexoutSex.
Thenryb Posted June 5, 2014 Posted June 5, 2014 It seems to work fine for me with M/F sexual acts using SexoutSex, SexoutSexKey and SexoutRapeGame. In fact, the acts initiated by a key seem to work more reliably than before.
Odessa Posted June 5, 2014 Posted June 5, 2014 1) Testing a stressful scene with '85b4, everything seemed to work fine, but I noticed subsequently an NVSE error in the console: SexoutNGBES: SES: Setting global hook vars.SexoutNGBES: SES: Global hook triggered, SES moving to BES stage 0.Error in script 0e08d18fAttempting to call a function on a NULL reference or base object File: Sexout.esm Offset: 0x0054 Command: LetError in script 0e08d18f An expression failed to evaluate to a valid result File: Sexout.esm Offset: 0x0054 Command: Let (Full scof attached) I did not have debug enabled, but I then enabled it and repeated the sequence and the error did not repeat. XX08d18f is 'fnSexoutGetFlag', which includes error checking which implies to me at least that it shouldn't be possible to get those errors, oddly. Again, as far as I noticed everything worked properly in spite of those errors, so I mean this as information rather than a bug report. 2) I have been getting intermittent CTDs, with a possible link to when I include 'call fnSexoutActSetInt "bDoKOCons", 0' in my sequence of repeat sexout calls. Scof logs attached. Let me know if there's a way I can get you something more scientific to go on. I'm not requesting that this be a priority concern. As an aside: I wondered if it was related to calling too many sexout variable setting functions in the same frame, so I wrote a gratuitous test script, however, this works perfectly: ; This test script repeats every second if player is not busy. It works perfectly, so busy calls don't seem to be an issue. call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rActorA call fnSexoutActSetRef "ActorB", PlayerREF call fnSexoutActSetRef "ActorC", rActorC call fnSexoutActSetRef "ActorX", SunnyREF call fnSexoutActSetInt "duration", 10 call fnSexoutActSetInt "isOral", 1 call fnSexoutActSetInt "isAnal", 1 call fnSexoutActSetInt "isVaginal", 1 call fnSexoutActSetRef "raper", rActorA call fnSexoutActSetInt "bDoKORapee", 1 call fnSexoutActSetInt "bDoKORapist", 1 call fnSexoutActSetInt "anim", 5305 call fnSexoutActSetInt "bDontUndressA", 1 call fnSexoutActSetInt "bDontUndressB", 1 call fnSexoutActSetInt "bDontUndressC", 1 call fnSexoutActSetInt "bDontRedressA", 1 call fnSexoutActSetInt "bDontRedressB", 1 call fnSexoutActSetInt "bDontRedressC", 1 call fnSexoutActSetRef "CBDialogA", GREETING call fnSexoutActSetRef "CBItemA", Jet call fnSexoutActSetRef "CBItemB", Jet call fnSexoutActSetRef "CBItemC", Jet call fnSexoutActSetRef "CBItemX", Jet call fnSexoutActRun
prideslayer Posted June 5, 2014 Author Posted June 5, 2014 Thanks, will take a look later today. I did some testing with Legion and found there are some issues with startconversation/cbdialog as well.
prideslayer Posted June 5, 2014 Author Posted June 5, 2014 I (obviously) haven't seen your code, but you're not calling the SetInt's from a different script, right? fnSexoutAct* (except actor) for prep, set, and run must all occur from a single script. If the engine treats different blocks as different scripts WRT what GetCallingScript returns, then they must be in the same block as well. You've probably already looked, but Prep/Set/Run,Reset use an array of stringmaps in the SexoutNG main quest script. GetCallingScript is the key into the top level array. If prep isn't called first, then the stringmap will not be created, and subsequent set/run will error out. If Prep is called from a different script according to GCS, same end result -- Set* tries to set a value in a nonexistent stringmap. I'll add some debugprints to prep/set/run to indicate what GCS is returning. If the values aren't the same in a single act, that's the problem.
Odessa Posted June 5, 2014 Posted June 5, 2014 No, all calls for any particular act are contained within the same script and iteration of it, and I never start multiple acts in the same iteration.
prideslayer Posted June 5, 2014 Author Posted June 5, 2014 Not even any other UDFs involved? Like doing a prep in the main script and the set's in a UDF you call from there? That's definitely strange..
Odessa Posted June 5, 2014 Posted June 5, 2014 I have 1 UDF which checks fnSexoutActorInUse for each of an array of actors, but no act setup, thats all within the same script. Take a glance if you like, its long but only 1 stage gets processed each time with a 1-second quest delay. scn SexoutSolDuntonBrotherSexScript ; * Using global constants, True: 1, False: 0, None: 0, NotFound: -1 int Init ref rZActor ref rChuck ref rBuck int iStage int iAngle int MyWay int iTimeOut Begin GameMode Printc "Sol: DBS Script Starting (Stage = %g)" iStage if Init != True let rZActor := PlayerREF rZActor.NX_SetEVFl "SO:NotNow", True let rChuck := SexoutSolDuntonChuckREF let rBuck := SexoutSolDuntonBuckREF rBuck.Look rZActor rChuck.Look rZActor let iStage := 0 let iTimeOut := 0 imod FadeToBlack2sISFX let Init := True ;rChuck.Enable ; added for testing ;rBuck.Enable return endif if iTimeOut > 3 DebugPrint "Sol: DBS Timeout = %g" iTimeOut endif if iStage == 0 DebugPrint "Dbros stage 0" rZActor.MoveTo SexoutSolDBSMarkPlayer rBuck.MoveTo SexoutSolDBSMarkOral rChuck.MoveTo SexoutSolDBSMarkCumOn rBuck.RemoveItem OutfitWasteland01, 1 rBuck.AddItem SexoutNude, 1 rBuck.EquipItem SexoutNude rChuck.RemoveItem OutfitWasteland01, 1 rChuck.AddItem SexoutNude, 1 rChuck.EquipItem SexoutNude ;rZActor.SetRestrained 1 ;rBuck.SetRestrained 1 ;rChuck.SetRestrained 1 let iStage := 100 ; * You fellate Buck elseif iStage == 100 ShowMessage SexoutSolDunton1FellateBuck call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rBuck call fnSexoutActSetRef "ActorB", rZActor call fnSexoutActSetInt "bDontRedressB", True call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "isOral", True call fnSexoutActSetInt "Anim", 401 call fnSexoutActRun let iStage := 197 DebugPrint "Sol: DBS %g - fellate" iStage ; * Chuck faps while hes waiting elseif iStage == 200 let iAngle := rChuck.GetAngle Z + rChuck.GetHeadingAngle rZActor rChuck.SetAngle Z, iAngle call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rChuck call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActRun let iStage := 201 DebugPrint "Sol: DBS %g - fap" iStage ; **** ;elseif iStage == 216 ; imod SexoutSolDuntonISFX ; let iStage += 1 ; DebugPrint "Sol: DBS %g - fade" iStage elseif iStage == 217 imod SexoutSolDuntonISFX rChuck.CIOS SexoutNGFinishNow let iStage += 1 DebugPrint "Sol: DBS %g - stop" iStage elseif iStage == 218 rBuck.CIOS SexoutNGFinishNow let iStage := 300 DebugPrint "Sol: DBS %g - stop" iStage ; * Chuck performs cunnilingus, Buck faps elseif iStage == 300 if eval (call tsolActorsInUse (Ar_List rZActor, rChuck)) let iTimeOut += 1 return endif ShowMessage SexoutSolDunton2ChuckCunni let iTimeOut := 0 call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rZActor call fnSexoutActSetRef "ActorB", rChuck call fnSexoutActSetInt "Duration", 99 call fnSexoutActSetInt "IsOral", True call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActSetInt "Anim", 235 call fnSexoutActRun let iStage := 301 DebugPrint "Sol: DBS %g - cunny + fap" iStage elseif iStage == 301 if eval (call tsolActorsInUse (Ar_List rBuck)) let iTimeOut += 1 return endif let iTimeOut := 0 let iAngle := rBuck.GetAngle Z + rBuck.GetHeadingAngle rZActor rBuck.SetAngle Z, iAngle call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rBuck call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActSetInt "duration", 99 call fnSexoutActRun let iStage += 1 DebugPrint "Sol: DBS %g - cunny + fap" iStage ; **** elseif iStage == 306 ShowMessage SexoutSolDunton3AssPoke let SexoutSolGetButtonQuest.Init := False StartQuest SexoutSolGetButtonQuest let iStage += 1 DebugPrint "Sol: DBS %g - poke ass" iStage elseif iStage == 312 ;imod SexoutSolDuntonISFX let iStage += 1 DebugPrint "Sol: DBS %g - fade" iStage elseif iStage == 313 imod SexoutSolDuntonISFX rChuck.CIOS SexoutNGFinishNow let iStage := 400 DebugPrint "Sol: DBS %g - stop" iStage ; * Chuck sodomizes you or you cowgirl (buck carries on) elseif iStage == 400 if eval (call tsolActorsInUse (Ar_List rZActor, rChuck)) let iTimeOut += 1 return endif let iTimeOut := 0 let MyWay := SexoutSolGetButtonQuest.PressedButton StopQuest SexoutSolGetButtonQuest call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rChuck call fnSexoutActSetRef "ActorB", rZActor call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "bDoKOCons", False if MyWay == True ShowMessage SexoutSolDunton4CowGirl call fnSexoutActSetInt "isVaginal", True call fnSexoutActSetInt "Anim", 901 else ShowMessage SexoutSolDunton4Anal call fnSexoutActSetInt "isAnal", True call fnSexoutActSetInt "Anim", 603 endif call fnSexoutActRun let iStage := 401 DebugPrint "Sol: DBS %g (MyWay: %g) - sodomy/cowgirl" iStage MyWay ; **** elseif iStage == 420 ;imod SexoutSolDuntonISFX rBuck.CIOS SexoutNGFinishNow let iStage += 1 DebugPrint "Sol: DBS %g" iStage elseif iStage == 421 imod SexoutSolDuntonISFX rChuck.CIOS SexoutNGFinishNow let iStage := 500 DebugPrint "Sol: DBS %g - stop" iStage ; * Buck takes your cunny elseif iStage == 500 if eval (call tsolActorsInUse (Ar_List rZActor, rBuck)) let iTimeOut += 1 return endif let iTimeOut := 0 ShowMessage SexoutSolDunton4Vaginal call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rBuck call fnSexoutActSetRef "ActorB", rZActor call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "isVaginal", True call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActSetInt "Anim", 634 call fnSexoutActRun let iStage := 501 DebugPrint "Sol: DBS %g - doggy... " iStage elseif iStage == 501 if eval (call tsolActorsInUse (Ar_List rChuck)) let iTimeOut += 1 return endif let iTimeOut := 0 let iAngle := rChuck.GetAngle Z + rChuck.GetHeadingAngle rZActor rChuck.SetAngle Z, iAngle call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rChuck call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActSetInt "duration", 99 call fnSexoutActRun let iStage := 502 DebugPrint "Sol: DBS %g - ... + fap" iStage ; **** elseif iStage == 520 imod SexoutSolDuntonISFX rChuck.CIOS SexoutNGFinishNow let iStage += 1 DebugPrint "Sol: DBS %g - fade" iStage elseif iStage == 521 rBuck.CIOS SexoutNGFinishNow let iStage := 600 DebugPrint "Sol: DBS %g - stop" iStage ; * 3-some elseif iStage == 600 if eval (call tsolActorsInUse (Ar_List rZActor, rChuck, rBuck)) let iTimeOut += 1 return endif let iTimeOut := 0 ShowMessage SexoutSolDunton6DP1 ShowMessage SexoutSolDunton6DP2 call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rChuck ; Vaginal call fnSexoutActSetRef "ActorB", rZActor ; Lucky You call fnSexoutActSetRef "ActorC", rBuck ; Anal call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "isVaginal", True call fnSexoutActSetInt "isAnal", True call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActSetInt "Anim", 5301 call fnSexoutActRun let iStage := 601 DebugPrint "Sol: DBS %g - 3 some" iStage ; **** elseif iStage == 620 ;imod SexoutSolDuntonISFX let iStage += 1 DebugPrint "Sol: DBS %g - fade" iStage elseif iStage == 621 imod SexoutSolDuntonISFX rChuck.CIOS SexoutNGFinishNow let iStage += 1 elseif iStage == 623 rZActor.MoveTo SexoutSolDBSMarkPlayer rBuck.MoveTo SexoutSolDBSMarkCumOn rChuck.MoveTo SexoutSolDBSMarkOral let iStage := 699 DebugPrint "Sol: DBS %g - moveto" iStage ; * You fellate Chuck while buck faps elseif iStage == 700 if eval (call tsolActorsInUse (Ar_List rZActor, rChuck)) let iTimeOut += 1 return endif let iTimeOut := 0 let iAngle := rBuck.GetAngle Z + rBuck.GetHeadingAngle rZActor ShowMessage SexoutSolDunton7fellate call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rChuck call fnSexoutActSetRef "ActorB", rZActor call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "isOral", True call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActSetInt "Anim", 401 call fnSexoutActRun let iStage := 701 DebugPrint "Sol: DBS %g finale p1a" iStage elseif iStage == 701 if eval (call tsolActorsInUse (Ar_List rBuck)) let iTimeOut += 1 return endif let iTimeOut := 0 let iAngle := rBuck.GetAngle Z + rBuck.GetHeadingAngle rZActor rBuck.SetAngle Z, iAngle call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rBuck call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActRun let iStage := 702 DebugPrint "Sol: DBS %g finale p1b" iStage ; **** elseif iStage == 708 ;imod SexoutSolDuntonISFX let iStage += 1 DebugPrint "Sol: DBS %g - fade" iStage elseif iStage == 709 rBuck.CIOS SexoutNGFinishNow let iStage += 1 elseif iStage == 710 imod SexoutSolDuntonISFX rChuck.CIOS SexoutNGFinishNow let iStage += 1 elseif iStage == 712 rZActor.MoveTo SexoutSolDBSMarkPlayer rBuck.MoveTo SexoutSolDBSMarkOral rChuck.MoveTo SexoutSolDBSMarkCumOn let iStage := 799 ; * You fellate Buck while Chuck cums onto you elseif iStage == 800 if eval (call tsolActorsInUse (Ar_List rZActor, rBuck)) let iTimeOut += 1 return endif let iTimeOut := 0 let iAngle := rChuck.GetAngle Z + rChuck.GetHeadingAngle rZActor ShowMessage SexoutSolDunton7ATM call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rBuck call fnSexoutActSetRef "ActorB", rZActor call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "isOral", True call fnSexoutActSetInt "Anim", 401 call fnSexoutActRun let iStage := 801 DebugPrint "Sol: DBS %g finale p2a" iStage elseif iStage == 801 if eval (call tsolActorsInUse (Ar_List rChuck)) let iTimeOut += 1 return endif let iTimeOut := 0 let iAngle := rChuck.GetAngle Z + rChuck.GetHeadingAngle rZActor rChuck.SetAngle Z iAngle call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rChuck call fnSexoutActSetInt "duration", 99 call fnSexoutActRun let iStage += 1 DebugPrint "Sol: DBS %g finale p2b" iStage ; ***** elseif iStage == 810 ShowMessage SexoutSolDunton8Cum rBuck.CIOS SexoutNGFinishNow let iStage += 1 DebugPrint "Sol: DBS %g Duntons come" iStage elseif iStage == 811 ShowMessage SexoutSolDunton9Facial rChuck.CIOS SexoutNGFinishNow let iStage := 900 DebugPrint "Sol: DBS %g Duntons come" iStage ; * Youre tingling again, so you fiddle elseif iStage == 900 if eval (call tsolActorsInUse (Ar_List rZActor)) let iTimeOut += 1 return endif let iTimeOut := 0 ShowMessage SexoutSolDunton10Finger call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rZActor call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "bDoKOCons", False call fnSexoutActRun let iStage += 1 DebugPrint "Sol: DBS %g - you fiddle" iStage ; ***** elseif iStage == 907 ;imod SexoutSolDuntonISFX let iStage += 1 DebugPrint "Sol: DBS %g - fade" iStage elseif iStage == 908 imod SexoutSolDuntonISFX rZActor.CIOS SexoutNGFinishNow let iStage += 1 DebugPrint "Sol: DBS %g - atop" iStage ; * You are licked := completion elseif iStage == 910 if eval (call tsolActorsInUse (Ar_List rZActor, rBuck)) let iTimeOut += 1 return endif let iTimeOut := 0 ShowMessage SexoutSolDunton11Licking call fnSexoutActPrep call fnSexoutActSetRef "ActorA", rZActor call fnSexoutActSetRef "ActorB", rBuck call fnSexoutActSetInt "duration", 99 call fnSexoutActSetInt "isOral", True call fnSexoutActSetInt "Anim", 242 call fnSexoutActRun let iStage += 1 DebugPrint "Sol: DBS %g queening" iStage ; **** elseif iStage == 921 rBuck.CIOS SexoutNGFinishNow let iStage := 999 DebugPrint "Sol: DBS %g - finishing" iStage ; * Finish up elseif iStage == 1000 MessageEx "All of you pant hard with fatigue" ShowMessage SexoutSolDunton12Bathe ;rZActor.SetRestrained False ;rBuck.SetRestrained False ;rChuck.SetRestrained False rBuck.StopLook rChuck.StopLook let iStage := 1001 let MyWay := False rZActor.NX_SetEVFl "SO:NotNow", False let SexoutSolNovacQuest.iBrotherFucks += 1 elseif iStage == 1007 rBuck.RemoveItem SexoutNude, 1 rBuck.AddItem OutfitWasteland01, 1 rBuck.EquipItem OutfitWasteland01 rChuck.RemoveItem SexoutNude, 1 rChuck.AddItem OutfitWasteland01, 1 rChuck.EquipItem OutfitWasteland01 PlaySound NPCHumanEatingFoodChewy MessageEx "Chuck eats a pie" let iStage := 0 StopQuest SexoutSolDuntonBrothersSexQuest return ; ** Otherwise, increment the timer else let iStage += 1 endif Printc "Sol: DBS Script Ended (Stage now = %g)" iStage End ====Seperate Script==== scn tsolActorsInUse ; * lets you check if any of an array of actors are sexout in use ; * returns True once after actually true, to dodge 84 sexout freeze bug. ; * Intended to be used in GameMode block that retry with a delay ; * local ref rActor array_var aEntry int Busy ; * args array_var aActors Begin Function { aActors } let Busy := False foreach aEntry <- aActors let rActor := aEntry["value"] if eval (call fnSexoutActorInUse rActor) let Busy := True rActor.NX_SetEVFl "Sol:SexoutDelay", True elseif rActor.NX_GetEVFl "Sol:SexoutDelay" == True let Busy := True rActor.NX_ClrEVFl "Sol:SexoutDelay" endif loop SetFunctionValue Busy return End
DoctaSax Posted June 5, 2014 Posted June 5, 2014 Well, since a bunch of acts are set by the same script, I'd say you need to call the reset UDF in between, probably.
prideslayer Posted June 5, 2014 Author Posted June 5, 2014 No need to call Reset after Run, it does that itself. The script itself looks fine at a glance, will get more in depth after work. :/
prideslayer Posted June 5, 2014 Author Posted June 5, 2014 Well I've eliminated one of the conversation bugs, working on one more, then will dig in more into your reports Odessa. This one might be an actual bug in Legion though, I'm not sure yet.
prideslayer Posted June 5, 2014 Author Posted June 5, 2014 Odessa it might be that the ref was not valid, and then it blew up in the printC. I noticed in a few spots that I PrintC'd with more params than I had placeholders. Fixing it up now just in case and adding some more debugging to some of them.
prideslayer Posted June 6, 2014 Author Posted June 6, 2014 2.6.85b5 in OP - No more waiting for consciousness etc. before unlocking. - LOTS more logging in debug mode -- use with caution! Odessa, this one (with debug mode on) will positively spam the console/logfile with crap (caller ref and passed ref, mostly). If the CTDs are happening in one of those functions, should help narrow it down.
nyaalich Posted June 6, 2014 Posted June 6, 2014 Unrelated to current issues. Can you add an IsDead check to fnSexoutActorInuse? It's a part of standard "is target valid?" checks.
prideslayer Posted June 6, 2014 Author Posted June 6, 2014 Cando for next beta. Will return 4 if dead.
nyaalich Posted June 6, 2014 Posted June 6, 2014 I thought integrating SQL was a hypothetical/ long time away thing.
Odessa Posted June 6, 2014 Posted June 6, 2014 If you're adding GetDead, typical validity checks also include: GetDisabled GetUnconscious IsChild GetKnockedState (not certain if this one is necessary) Get has no sexout animations Is in banned actor list Personally I think this gets outside the scope of 'ActorInUse', and might be better in a separate actor validity function.
nyaalich Posted June 6, 2014 Posted June 6, 2014 You're right, and I debated whether or not to mention it. Perhaps a different function. Reinventing the wheel each mod, etc. Pride's call, of course.
prideslayer Posted June 6, 2014 Author Posted June 6, 2014 It doesn't really belong there, none of those extra return codes other than true/false do. I wanted to return some information about why it couldn't proceed, a trinary state.. actor is in use (yes, no, notvalid). However it might be better for bugfinding in other scripts if I just turn it back to a true/false. This will mean I return false for invalid refs, so if the caller decides to use it in a subsequent call, it'll be their script that blows up and not sexout -- unless they call sexout, in which case the sanitizer will blow up since it already checks all this stuff. I will be moving those checks out of the sanitizer and into a standalone UDF anyway that anyone can call, that will give a better 'report' on the status of a ref, along the lines of what inuse currently returns. 0 = OK, 1 = not a ref, 2 = not an actor, etc.. Sound good?
nyaalich Posted June 6, 2014 Posted June 6, 2014 Hell, maybe it's something that's more suitable for NVSE (without the Sexout check, obviously).
Odessa Posted June 7, 2014 Posted June 7, 2014 I will be moving those checks out of the sanitizer and into a standalone UDF anyway that anyone can call, that will give a better 'report' on the status of a ref, along the lines of what inuse currently returns. 0 = OK, 1 = not a ref, 2 = not an actor, etc.. Sound good? Yes, that sounds great.
Odessa Posted June 8, 2014 Posted June 8, 2014 Using '85b5, I am still getting the actor freeze if I don't delay once after fnSexoutActorInUse returns false. Have not reproduced the CTD yet, apologies for delay. actor-freeze-scof-log.zip
Recommended Posts