Jump to content

Recommended Posts

Posted

 

I've been trying very hard to use this in my Mod.

I have just one problem, and its very breaking. It's the stated known issue "Player character can't get out (stuck in collision with zaz vertical stocks?)"

 

​This happens very consistently, I've only seen it not occur maybe 1 out of 10 times.

When it happens, then all variations of MoveTo to continue the quest, leave the player in a few very bad situations, like "over the world" or their run speed suddenly very fast, ultimately leading to a CTD.

 

I'm using same edits as what Kenjoka posted as I find they are needed for it to work at all. This includes using Game.SetPlayerAIDriven.

 

 

Possible solution you might be able to help me with:

I've tried to move the player before moveActorOut. Was thinking to just not execute moveActorOut, and port the player directly out of the machine. This places the player "above the world" too. So I'm wondering if maybe you could help me with what needs to happen to work around using moveActorOut so I can avoid the "collision with zaz vertical stocks".

 

You can try

  1. -forcing the view to 3rd person with making player ai controlled
  2. -disabling the stocks for a few seconds (if it works, you can delete collision from them by copying stuff in nif to a new nif and putting stocks w/o collision over the real stocks)
  3. - ask Xaz to fix the stocks :)other stocks don't have this problem
  4. - replace stocks collision model with something small like a barrel?

 

 

I had already tried #1. Does not help

#2 sounds good but how can I reference and disable it without creating a hard dependency on your mod?

Posted

 

 

I had already tried #1. Does not help

#2 sounds good but how can I reference and disable it without creating a hard dependency on your mod?

 

I messed with stocks collision in 0.45 so now it's better

 

................................................................

To teleport BDOD with a script:

Place this in your script and call TPBDOD( reference from a cell in CK linked to your script property, adjust height relative to the floor... 15 is ok).

objectReference function TPBDOD(objectReference targetRef, float bdodadjheight)

ObjectReference stocks
Quest xbQ=Game.GetFormFromFile(0x001854, "BrandingDeviceOfDoom.esp") As Quest
objectReference bdodObjRef=(xbQ as xxbQuestScript).BdodInDungeonObjRef
(bdodObjRef as xxBrandingDeviceScript).MoveBDODFromDungeonToObjRef(targetRef, bdodadjheight) ;25.0
stocks=(bdodObjRef as xxBrandingDeviceScript).BDODGetTPStocksRef()
; debug.notification("stocks "+stocks)
return stocks
endfunction

Teleport with a console:

set xxBDODTeleportToPC to 1

 

Don't move for a few seconds

 

 

help xxbdod will list the proper variable names

 

 

The same device is being teleported so if 2 differenet mods will teleport it, perhaps you should teleport it each time player enters your cell.

Currently BDOD NPC packages won't work because new stocks are being spawned and deleted

Posted

 

 

 

I had already tried #1. Does not help

#2 sounds good but how can I reference and disable it without creating a hard dependency on your mod?

 

I messed with stocks collision in 0.45 so now it's better

 

................................................................

To teleport BDOD with a script:

Place this in your script and call TPBDOD( reference from a cell in CK linked to your script property, adjust height relative to the floor... 15 is ok).

function TPBDOD(objectReference targetRef, float bdodadjheight)

Quest xbQ=Game.GetFormFromFile(0x001854, "BrandingDeviceOfDoom.esp") As Quest
objectReference bdodObjRef=(xbQ as xxbQuestScript).BdodInDungeonObjRef
(bdodObjRef as xxBrandingDeviceScript).MoveBDODFromDungeonToObjRef(targetRef, bdodadjheight) ;25.0

endfunction

Teleport with a console:

set xxBDODTeleportToPC to 1

 

Don't move for a few seconds

 

 

help xxbdod will list the proper variable names

 

 

The same device is being teleported so if 2 differenet mods will teleport it, perhaps you should teleport it each time player enters your cell.

Currently BDOD NPC packages won't work because new stocks are being spawned and deleted

 

 

Nice. I just tried this out in game with the console and looking promising. Getting stuck problem no longer happening so far. I will try this out in my mod. The teleport is a bonus for sure, as I had been thinking about all the work it would take me to try and put this in my own location myself. 

Posted

 

Nice. I just tried this out in game with the console and looking promising. Getting stuck problem no longer happening so far. I will try this out in my mod. The teleport is a bonus for sure, as I had been thinking about all the work it would take me to try and put this in my own location myself. 

Also I forgot to provide an ObjectReference to the stocks in 0.45 making it useless lol , so now there's 0.46

 

Yeah, putting a new device in is a horrible PITA

Posted

 

 

Nice. I just tried this out in game with the console and looking promising. Getting stuck problem no longer happening so far. I will try this out in my mod. The teleport is a bonus for sure, as I had been thinking about all the work it would take me to try and put this in my own location myself. 

Also I forgot to provide an ObjectReference to the stocks in 0.45 making it useless lol , so now there's 0.46

 

Yeah, putting a new device in is a horrible PITA

 

 

Ya acaully I'm feeling lost now as I remember there's this

 

; 0 - brandingdungeon

; 1 - markarth

; 2 - whiterun

 

It's not apparent to me where I get this object reference you just added in .46. My own Package is no problem but what object do I reference to "sit" ?

 

And it's also not apparent to me how to adapt for each case where those above are different.

Posted

 

Ya acaully I'm feeling lost now as I remember there's this

 

; 0 - brandingdungeon

; 1 - markarth

; 2 - whiterun

 

It's not apparent to me where I get this object reference you just added in .46. My own Package is no problem but what object do I reference to "sit" ?

 

And it's also not apparent to me how to adapt for each case where those above are different.

 

Ah, you will only need devnum=0, a device from brandingdungeon that can teleport

 

The object reference to stocks will be returned by this function which you copy paste into your code

objectReference function TPBDOD(objectReference targetRef, float bdodadjheight)

ObjectReference stocks
Quest xbQ=Game.GetFormFromFile(0x001854, "BrandingDeviceOfDoom.esp") As Quest
objectReference bdodObjRef=(xbQ as xxbQuestScript).BdodInDungeonObjRef
(bdodObjRef as xxBrandingDeviceScript).MoveBDODFromDungeonToObjRef(targetRef, bdodadjheight) ;25.0
stocks=(bdodObjRef as xxBrandingDeviceScript).BDODGetTPStocksRef()
; debug.notification("stocks "+stocks)
return stocks
endfunction

then you call it like

newstocks = TPBDOD (something, 15.0)

 

It will teleport the bdod to "something",

newstocks is the object reference to vertical stocks which you will use in a package for a a slave aka which you reference to "sit"

something is your reference in your map cell, for example shackles on the floor / or an invisible xmarkerheading

 

Also in that example code in the OP, maybe you'll need to replace stocks references with newstocks, and there's a bunch of garbage now :P so you might want to hold on till i test this on npcs

Posted

 

 

Ya acaully I'm feeling lost now as I remember there's this

 

; 0 - brandingdungeon

; 1 - markarth

; 2 - whiterun

 

It's not apparent to me where I get this object reference you just added in .46. My own Package is no problem but what object do I reference to "sit" ?

 

And it's also not apparent to me how to adapt for each case where those above are different.

 

Ah, you will only need devnum=0, a device from brandingdungeon that can teleport

 

The object reference to stocks will be returned by this function which you copy paste into your code

objectReference function TPBDOD(objectReference targetRef, float bdodadjheight)

ObjectReference stocks
Quest xbQ=Game.GetFormFromFile(0x001854, "BrandingDeviceOfDoom.esp") As Quest
objectReference bdodObjRef=(xbQ as xxbQuestScript).BdodInDungeonObjRef
(bdodObjRef as xxBrandingDeviceScript).MoveBDODFromDungeonToObjRef(targetRef, bdodadjheight) ;25.0
stocks=(bdodObjRef as xxBrandingDeviceScript).BDODGetTPStocksRef()
; debug.notification("stocks "+stocks)
return stocks
endfunction

then you call it like

newstocks = TPBDOD (something, 15.0)

 

It will teleport the bdod to "something",

newstocks is the object reference to vertical stocks which you will use in a package for a a slave aka which you reference to "sit"

something is your reference in your map cell, for example shackles on the floor / or an invisible xmarkerheading

 

Also in that example code in the OP, maybe you'll need to replace stocks references with newstocks, and there's a bunch of garbage now :P so you might want to hold on till i test this on npcs

 

 

Using your function to place the branding device where I want works no problem.

 

But I see no way to have the package reference newstocks. I don't understand what you have in mind here, have you tried it?

Posted

 

 

 

Ya acaully I'm feeling lost now as I remember there's this

 

; 0 - brandingdungeon

; 1 - markarth

; 2 - whiterun

 

It's not apparent to me where I get this object reference you just added in .46. My own Package is no problem but what object do I reference to "sit" ?

 

And it's also not apparent to me how to adapt for each case where those above are different.

 

Ah, you will only need devnum=0, a device from brandingdungeon that can teleport

 

The object reference to stocks will be returned by this function which you copy paste into your code

objectReference function TPBDOD(objectReference targetRef, float bdodadjheight)

ObjectReference stocks
Quest xbQ=Game.GetFormFromFile(0x001854, "BrandingDeviceOfDoom.esp") As Quest
objectReference bdodObjRef=(xbQ as xxbQuestScript).BdodInDungeonObjRef
(bdodObjRef as xxBrandingDeviceScript).MoveBDODFromDungeonToObjRef(targetRef, bdodadjheight) ;25.0
stocks=(bdodObjRef as xxBrandingDeviceScript).BDODGetTPStocksRef()
; debug.notification("stocks "+stocks)
return stocks
endfunction

then you call it like

newstocks = TPBDOD (something, 15.0)

 

It will teleport the bdod to "something",

newstocks is the object reference to vertical stocks which you will use in a package for a a slave aka which you reference to "sit"

something is your reference in your map cell, for example shackles on the floor / or an invisible xmarkerheading

 

Also in that example code in the OP, maybe you'll need to replace stocks references with newstocks, and there's a bunch of garbage now :P so you might want to hold on till i test this on npcs

 

 

Using your function to place the branding device where I want works no problem.

 

But I see no way to have the package reference newstocks. I don't understand what you have in mind here, have you tried it?

 

In package data choose the package target as "Ref alias" with one of the aliases from your "Quest", and force that alias to the new stocks.

 

Posted

That is what I tried. Tried with the new stocks as a objectref property. But since the property cannot be filled with anything other than default, it will not be listed to choose when you try to make a quest alias for it.

 

Have you tried it?

Posted

That is what I tried. Tried with the new stocks as a objectref property. But since the property cannot be filled with anything other than default, it will not be listed to choose when you try to make a quest alias for it.

 

Have you tried it?

Yes, I've tried it. You need to press OK as soon as you create aliases/packages and close their window/reopen, otherwise CK is bugged and won't let you pick stuff.

I made an npc walk to spawned stocks by using 2 aliases, but it wouldn't enter them, likely my Skyrim is screwed up.

 

Which part of Deadly Mutilations does this mod actually use by the way? From context I'm guessing it's the sound files (screams and whatnot)...?

only screams

Posted

That is what I tried. Tried with the new stocks as a objectref property. But since the property cannot be filled with anything other than default, it will not be listed to choose when you try to make a quest alias for it.

 

Have you tried it?

 

Also the easiest way instead of using stupid packages is

 

SlaveActor.PathToReference(stocks, 1)

stocks.Activate(SlaveActor)

 

 

 

Posted

 

That is what I tried. Tried with the new stocks as a objectref property. But since the property cannot be filled with anything other than default, it will not be listed to choose when you try to make a quest alias for it.

 

Have you tried it?

 

Also the easiest way instead of using stupid packages is

 

SlaveActor.PathToReference(stocks, 1)

stocks.Activate(SlaveActor)

 

 

Thank you! PathToReference is the ticket. No need for any alias etc. so that solved my problem completely.

 

I now have it working perfectly, incorporated into the story and scene and all. Also handling skipping it if your mod is not installed. It shall be in my next release.

Posted

 

 

 

I had already tried #1. Does not help

#2 sounds good but how can I reference and disable it without creating a hard dependency on your mod?

 

I messed with stocks collision in 0.45 so now it's better

 

................................................................

To teleport BDOD with a script:

Place this in your script and call TPBDOD( reference from a cell in CK linked to your script property, adjust height relative to the floor... 15 is ok).

objectReference function TPBDOD(objectReference targetRef, float bdodadjheight)

ObjectReference stocks
Quest xbQ=Game.GetFormFromFile(0x001854, "BrandingDeviceOfDoom.esp") As Quest
objectReference bdodObjRef=(xbQ as xxbQuestScript).BdodInDungeonObjRef
(bdodObjRef as xxBrandingDeviceScript).MoveBDODFromDungeonToObjRef(targetRef, bdodadjheight) ;25.0
stocks=(bdodObjRef as xxBrandingDeviceScript).BDODGetTPStocksRef()
; debug.notification("stocks "+stocks)
return stocks
endfunction

Teleport with a console:

set xxBDODTeleportToPC to 1

 

Don't move for a few seconds

 

 

help xxbdod will list the proper variable names

 

 

The same device is being teleported so if 2 differenet mods will teleport it, perhaps you should teleport it each time player enters your cell.

Currently BDOD NPC packages won't work because new stocks are being spawned and deleted

 

 

wow, thanks, that sounds very cool,

 

I will try to use it this week for the slaverun reloaded mod and teleport a branding device in the slaverun dungeon

 

if I understand it right and do the teleport 10 times there still will be only one branding device and not 10 in my dungeon? :D

as I want to brand my slave after every city enslavement (with corinthios tatoos)

 

 

Posted

Found a problem and I am stumped.

 

The second time the device gets operated, the player along with part of the device, starts to float through the air and move across the large room im in, always to the same spot up in the air. It does this while still operating and still finishes branding. This will consisently happen each time.

 

The entirety of my code is as follows.

Tried lots of variations, such as the version below that will only teleport it once, but still same thing each time. Also tried teleporting it first to my holding cell, then to the spot. No difference. Seems like something needs to reset or clean up.

 

Note: my VirginInitSceneStart() function does stuff including:

Game.DisablePlayerControls(true, true, true, false, true) ;disable movement, combat, pov, sneak
Game.forcethirdperson()
VirginFixIdle()
Game.Setplayeraidriven(true)

;********** Branding Device 

ObjectReference VirginStocksRef
Bool PlaceOnce = False

;.......... Branding Device - place
Function VirginBrandingDevicePlace()
	If ! PlaceOnce
		Quest xbQ = Game.GetFormFromFile(0x001854, "BrandingDeviceOfDoom.esp") As Quest
		ObjectReference bdodObjRef=(xbQ as xxbQuestScript).BdodInDungeonObjRef
		(bdodObjRef as xxBrandingDeviceScript).MoveBDODFromDungeonToObjRef(BrandingAreaMarker, 15)
		VirginStocksRef = (bdodObjRef as xxBrandingDeviceScript).BDODGetTPStocksRef()
		PlaceOnce = True
	EndIf
EndFunction

;.......... Branding Device - place if first time, move into, operate
Function VirginBrandingDevice()
	;is branding mod installed?
	If Game.GetModByName("BrandingDeviceOfDoom.esp") == 255  ;function returns 255 if mod not there
		Debug.MessageBox("Branding Device of Doom is not installed. You will have to just imagine screaming for hours as a branding machine sears tattoos onto your skin!")
		Return
	EndIf

	;place the device first time
	VirginBrandingDevicePlace()
	
	;port next to it
	VirginPortal.Cast(PlayerRef)
	Utility.Wait(3)	
	PlayerRef.MoveTo(BrandingArea2Marker) 
	Utility.Wait(1)
	VirginPortal.Cast(PlayerRef)    
	Utility.wait(3)
	
	;get in stocks
    GlobalVariable gstocksactivated= Game.GetFormFromFile(0x00007486, "BrandingDeviceOfDoom.esp") As GlobalVariable    
    gstocksactivated.setvalue(0)
	VirginInitSceneStart()
	PlayerRef.PathToReference(VirginStocksRef, 1)
	VirginStocksRef.Activate(PlayerRef)

	;Run the Branding Machine
	Utility.wait(10)
	brandexternal(11) ;Lbreast
	Utility.wait(8)
	brandexternal(5)  ;LAss
	Utility.wait(8)
	brandexternal(2)  ;crotch
	Utility.wait(8)
	brandexternal(6)  ;RAss
	Utility.wait(8)
	brandexternal(10) ;RUnderboob
	Utility.wait(6)
	VirginInitSceneEnd()
	VirginFixIdle()
EndFunction

;.......... Branding Device - supporting functions
function brandexternal(int bodypositionnumber)
	Quest questbdod = Game.GetFormFromFile(0x00001854, "BrandingDeviceOfDoom.esp") As Quest
	ReferenceAlias slavealias
	GlobalVariable gstartdevice
	slavealias = questbdod.getalias(0) as ReferenceAlias
	gstartdevice = Game.GetFormFromFile(0x00005EB6, "BrandingDeviceOfDoom.esp") As GlobalVariable    
	GlobalVariable gpositionnumber = Game.GetFormFromFile(0x0000594D, "BrandingDeviceOfDoom.esp") As GlobalVariable    
	gpositionnumber.setvalue(bodypositionnumber)
	gstartdevice.setvalue(1)
	waitwhilebusy()
endfunction

function waitwhilebusy()
    Utility.wait(3)
    GlobalVariable gbusy= Game.GetFormFromFile(0x00001DC0, "BrandingDeviceOfDoom.esp") As GlobalVariable    
    int busy=gbusy.getvalue() as int
    while(busy==1)
        busy=gbusy.getvalue() as int
        Utility.wait(1.0)
    endwhile
endfunction

Posted

Some more data points:

If VirginBrandingDevice() runs before player leaves the cell - problem does not happen - can keep repeating no problem. But as soon as you leave the cell (COC out or whatever), then if you run VirginBrandingDevice() the problem will occur if it's not the first time

 

I can go to the Whiterun outdoor device and get in and out, running it each time, and no problem. So would appear to be only a problem for the teleported device, although have not tried to do this through script.

 

I'm tried to figure out how to place the device each time the cell loads. I tried just Event OnCellLoad() and it did not work (the device did not show up), but even if it did work, this is a horrible solution as too much script load, and would need to be more sophisticated. Not sure I want to peruse this since just placing the device each time I start to use does not work (even if I move it to my holding cell, then place it again) so I can't see why this would help.

 

----------

As a workaround, so I can release my mod for now, I'd be happy to use the Whiterun device. But I don't have enough info on how to use the Whiterun location... specifically how to get VirginStocksRef for it? I'd actually like to know how to do this even if we have a solution for the teleported too.

 

 

EDIT: One last thing I tried. On 2nd try move the device to a new location within the came dungeon, then use it. Same problem.

Posted

 

wow, thanks, that sounds very cool,

 

I will try to use it this week for the slaverun reloaded mod and teleport a branding device in the slaverun dungeon

 

if I understand it right and do the teleport 10 times there still will be only one branding device and not 10 in my dungeon? :D

as I want to brand my slave after every city enslavement (with corinthios tatoos)

 

 

So far there's just 1, but you never know what papyrus will do next :)

 

Some more data points:

If VirginBrandingDevice() runs before player leaves the cell - problem does not happen - can keep repeating no problem. But as soon as you leave the cell (COC out or whatever), then if you run VirginBrandingDevice() the problem will occur if it's not the first time

 

I can go to the Whiterun outdoor device and get in and out, running it each time, and no problem. So would appear to be only a problem for the teleported device, although have not tried to do this through script.

 

I'm tried to figure out how to place the device each time the cell loads. I tried just Event OnCellLoad() and it did not work (the device did not show up), but even if it did work, this is a horrible solution as too much script load, and would need to be more sophisticated. Not sure I want to peruse this since just placing the device each time I start to use does not work (even if I move it to my holding cell, then place it again) so I can't see why this would help.

 

----------

As a workaround, so I can release my mod for now, I'd be happy to use the Whiterun device. But I don't have enough info on how to use the Whiterun location... specifically how to get VirginStocksRef for it? I'd actually like to know how to do this even if we have a solution for the teleported too.

 

 

EDIT: One last thing I tried. On 2nd try move the device to a new location within the came dungeon, then use it. Same problem.

I've reproduced this bug, I think my script variables are lost after leaving the cell.

Posted

I've reproduced this bug, I think my script variables are lost after leaving the cell.

 

 

Another data point. I recreated it when it's the first time...the difference was that the cell has loaded more than once. So I think the problem is when the cell is load more than once, rather than it being the first time.

 

Can you give me the info I need to use the whiterun location please (I mentioned above)? This way can I test and release without waiting to use the teleported version, rather than remove it to release.

Posted

 

I've reproduced this bug, I think my script variables are lost after leaving the cell.

 

 

Another data point. I recreated it when it's the first time...the difference was that the cell has loaded more than once. So I think the problem is when the cell is load more than once, rather than it being the first time.

 

Can you give me the info I need to use the whiterun location please (I mentioned above)? This way can I test and release without waiting to use the teleported version, rather than remove it to release.

Use v0.43 and that huge piece of code in the OP and  change devnum to 2

 

Posted

 

 

I've reproduced this bug, I think my script variables are lost after leaving the cell.

 

 

Another data point. I recreated it when it's the first time...the difference was that the cell has loaded more than once. So I think the problem is when the cell is load more than once, rather than it being the first time.

 

Can you give me the info I need to use the whiterun location please (I mentioned above)? This way can I test and release without waiting to use the teleported version, rather than remove it to release.

Use v0.43 and that huge piece of code in the OP and  change devnum to 2

 

 

I'd rather wait for you to fix than have to tell people to use an old version, which half will not read and not do. Not a good way for me to release first time out of the gate.

 

​Also I have no intention of changing my code that much all over again. I want to use the StockRef as I have it and simply swap to whiterun. You can't give me the info required to do that?

 

EDIT: wait... .43? that's the one that does not even work at all for me as you just get stuck in the stocks. Otherwise I'd have already released previously

Posted

 

 

 

I've reproduced this bug, I think my script variables are lost after leaving the cell.

 

 

Another data point. I recreated it when it's the first time...the difference was that the cell has loaded more than once. So I think the problem is when the cell is load more than once, rather than it being the first time.

 

Can you give me the info I need to use the whiterun location please (I mentioned above)? This way can I test and release without waiting to use the teleported version, rather than remove it to release.

Use v0.43 and that huge piece of code in the OP and  change devnum to 2

 

 

I'd rather wait for you to fix than have to tell people to use an old version, which half will not read and not do. Not a good way for me to release first time out of the gate.

 

​Also I have no intention of changing my code that much all over again. I want to use the StockRef as I have it and simply swap to whiterun. You can't give me the info required to do that?

 

EDIT: wait... .43? that's the one that does not even work at all for me as you just get stuck in the stocks. Otherwise I'd have already released previously

Try 0.47 with teleportation

Posted

Yup. Looks like you nailed it. More of the bits of machine in now too that's great.

 

I'll be testing more in the full context of my scenes, and hopefully releasing with it included later today.

 

By the way, if in future you'd like me to test with my mod before you release to public, let me know. It's certainly worth it for me to catch something before rather than dealing with support.

Posted

More testing and all was well so I've now released with this in as a soft dependancy. Fun fun :)

 

We did find one thing but it's cosmetic. I mentioned above how I thought you had improved in .47 by adding more bits of the machine.

 

Well those bits don't show up during my actual scenes, and I'd guess the difference is that by that point the cell has loaded more than once before placing your machine (just a guess as it's the only difference I can think of). To see what I mean you can see the missing parts in this pic

 

Posted

More testing and all was well so I've now released with this in as a soft dependancy. Fun fun :)

 

We did find one thing but it's cosmetic. I mentioned above how I thought you had improved in .47 by adding more bits of the machine.

 

Well those bits don't show up during my actual scenes, and I'd guess the difference is that by that point the cell has loaded more than once before placing your machine (just a guess as it's the only difference I can think of). To see what I mean you can see the missing parts in this pic

 

If they won't show up, but you really want those bits, you can place your own stuff in CK in the general area where the bdod is supposed to go.

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...