Moving Mannequins

Post » Wed Jun 20, 2012 7:42 pm

Does anybody know how to get around the moving mannequins glitch? I really want to put a couple mannequins in my custom house, but it's all for not if they keep randomly moving places everytime you enter the house.

EDIT: After placing navmesh under them they are now correctly placed the first time I enter the cell. But when ever I sleep, wait, or load a couple more cells and come back, they move again.
User avatar
Rebecca Clare Smith
 
Posts: 3508
Joined: Fri Aug 04, 2006 4:13 pm

Post » Wed Jun 20, 2012 1:07 pm

Have you finalized your meshes?

I had that problem and it went away after checking and finalizing the navmeshes.
User avatar
krystal sowten
 
Posts: 3367
Joined: Fri Mar 09, 2007 6:25 pm

Post » Wed Jun 20, 2012 10:46 pm

Have you finalized your meshes?

I had that problem and it went away after checking and finalizing the navmeshes.
lol, I originally didn't have ANY navmesh under them. I didn't want NPCs bumping into them all the time, but apparently if you don't put them on navmesh then they'll just randomly hop onto any navmesh around everytime the cell is loaded. But sure enough putting some navmesh down worked, thanks for the reply.
User avatar
Barbequtie
 
Posts: 3410
Joined: Mon Jun 19, 2006 11:34 pm

Post » Wed Jun 20, 2012 10:43 pm

also if you have them raised up on a pedestal, navmesh the surface of the pedestal, not the floor, or else they will try to snap to the floor surface, and sink into the pedestal.
User avatar
Lovingly
 
Posts: 3414
Joined: Fri Sep 15, 2006 6:36 am

Post » Thu Jun 21, 2012 4:04 am

The best way to ensure your Mannequins stay in place is to do a few things together.

First off rotate the offending mannequin(s) and their corresponding trigger 45 degrees from the direction the mannequin will be facing in game(this may be an arbitrary figure as other items like weapons racks require only a small degree of rotation, but it has not failed me yet). Then rotate the xmarkerheading box to the direction you want the mannequin to face. When placing them snap the trigger to the mannequin and the xmarkerheading to the trigger.
Secondly ensure your navmesh runs under the mannequins. If you only do one of the following you will get moving mannequins it will just happen more or less randomly. So far this method has fixed it in my mod and it has helped two other people I suggested it to. Hope this helps

Here are a couple of pics to illustrate:

http://imageshack.us/photo/my-images/845/mannequin1a.jpg/

http://imageshack.us/photo/my-images/31/mannequin2f.jpg/

Side note: Notice I put offending mannequins in my post because some mannequins just stay in place. I have read elsewhere that it has to do with facing a certain direction that causes these errors. It happens with mannequins and weapon racks (swords upside down) that are facing 0,0,0 or something to that effect. I don't proclaim to know for sure the cause but I do know I only had to apply this method to half of the mannequins in my house mod, all of which were facing the same direction, while the others were just fine.

http://imageshack.us/photo/my-images/525/mannequin3.jpg/
User avatar
Olga Xx
 
Posts: 3437
Joined: Tue Jul 11, 2006 8:31 pm

Post » Wed Jun 20, 2012 5:22 pm

I'm still working on a work-around for the strange predilections of Skyrim's mannequins. There are a couple of facts to remember.
  • Mannequins are almost never spawned in place. Where the game chooses to spawn a mannequin (or any other actor) is not documented - but it is not at the attached XMarkerHeading. Instead, the mannequin is spawned elsewhere and, only then, is moved to either the location where it is placed by the plug-in or the location of the attached XMarkerHeading if dictated by the script.
  • Mannequins are set to Ghost to prevent them from disrupting moveable statics and items that they will pass through during their migration to their starting places. This does not work because the Ghost setting is often not recognized by the game until after the mannequins have arrived at their location. You can verify this for yourself by trying to walk through a mannequin immediately after the cell is loaded. You will find that there is a collision surface associated with the mannequin that should not be there unless it belongs to the trigger box. However, you can walk through a trigger box set up for player activation - so that's not it either. Moreover, if you leave your avatar's collision surface in contact with the mystery collision surface associated with the mannequin - your avatar gets pushed back as the mystery collision surface moves out and away from the mannequin. It is worth noting that the activation zone does not move. In any event, this mystery collision surface comes to rest about a game-yard from the mannequin and, if you wait or sleep, you may find that the texture of the mannequin migrates out to rejoin the collision surface - hence the "movement". [this does not happen every time - but often enough to be noticed]
If your mannequins are sharing a cell with loose items and moveable statics, it would seem advisable to have their kit stowed and the mannequins disabled whenever the player is out of the cell and only enabled and kitted up after the player returns to the cell and the disabled mannequins have had time to be positioned. I still have to check and see if this works. Giving the mannequins an AI also seems questionable, so I'll be taking a look at what happens when this is removed.
User avatar
James Smart
 
Posts: 3362
Joined: Sun Nov 04, 2007 7:49 pm

Post » Wed Jun 20, 2012 10:42 pm

Disabling the mannequin AI simply makes them more intractable - with appearances on re-enabling being very hit or miss.
User avatar
yessenia hermosillo
 
Posts: 3545
Joined: Sat Aug 18, 2007 1:31 pm

Post » Wed Jun 20, 2012 5:23 pm

if you want to pick apart my updated mannequin scripts i can post them in spoiler tags. they work pretty well, but i need to optimize them so they run faster (need to switch to arrays instead of slots as SluckyD suggested)
User avatar
Chavala
 
Posts: 3355
Joined: Sun Jun 25, 2006 5:28 am

Post » Wed Jun 20, 2012 3:14 pm

if you want to pick apart my updated mannequin scripts i can post them in spoiler tags. they work pretty well, but i need to optimize them so they run faster (need to switch to arrays instead of slots as SluckyD suggested)
.
I'd love to have a look, thank you.
.
I'm putting in gates interlocked with load doors to give disabled mannequins a chance to find their way before they get enabled - when those gates open and after a delay disguised as a locking mechanism via a sound played. I'm hoping that this will deal with the loose item chaos that occasionally ensues and allow a gradual build-up of cell complexity without overloading the engine.
.
The tricky bit is still the sleep/wait issue which seems to be only happening when an autosaved game gets loaded. I don't know if this means anything, but I've also noticed that some problems seem to disappear when reverting from an autosaved game to a previous manual savegame outside the cell and re-entering. It is as if the game records the position of the mannequin according to the migrated location of the collision surface - which gives rise to the movement when a savegame from the cell in question is loaded. It is a pity that a savegame load doesn't have a corresponding event to tap into...or does it?
User avatar
maddison
 
Posts: 3498
Joined: Sat Mar 10, 2007 9:22 pm

Post » Wed Jun 20, 2012 7:08 pm

this is the script i have attached to the mannequin itself. keep in mind that this was designed for proprietary mannequins and not the vanilla ones. (credit to SluckyD and Daemonjax for the array system)

Spoiler

Scriptname DCVR_AH_MannequinActivatorScript extends Actor  Import UtilityMessage Property MannequinArmorWeaponsMessage  Auto  Message Property MannequinWarningMessage  AutoForm[] Property ArmorSlot Auto HiddenForm[] Property AmmoSlot Auto HiddenForm Property EmptySlot Auto HiddenEvent OnInit()ArmorSlot = New Form[30]AmmoSlot = New Form[3]EndEventEvent OnCellAttach()Wait(0.1)EquipCurrentArmor()Self.BlockActivation()MoveTo(GetLinkedRef())Self.EnableAI(FALSE)EndEventEvent OnActivate(ObjectReference TriggerRef)Self.OpenInventory(TRUE)MoveTo(GetLinkedRef())Self.EnableAI(FALSE)EndEventEvent OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)Actor akPlayer = Game.GetPlayer()If (akBaseItem as Armor) || (akBaseItem as Weapon)	If aiItemCount > 1		If akSourceContainer == akPlayer			MannequinWarningMessage.Show()			aiItemCount -= 1			Self.RemoveItem(akBaseItem, aiItemCount, true, akPlayer)		Else			aiItemCount -= 1			Self.RemoveItem(akBaseItem, aiItemCount)		EndIf	EndIf	AddToArmorSlot(akBaseItem)ElseIf (akBaseItem as Ammo)	AddToAmmoSlot(akBaseItem)Else	MannequinArmorWeaponsMESSAGE.Show()	Self.RemoveItem(akBaseItem, aiItemCount, true, akPlayer)EndIfWait(0.1)EquipCurrentArmor()EndEventEvent OnObjectUnequipped(Form akBaseObject, ObjectReference akReference)If (akBaseObject as Armor) || (akBaseObject as Weapon)	RemoveFromArmorSlot(akBaseObject)ElseIf (akBaseObject as Ammo)	RemoveFromAmmoSlot(akBaseObject)EndifEndEventFunction EquipCurrentArmor()Int i = 0Int n = 0While (i < 30)If (ArmorSlot[i] != EmptySlot)	While (Self.GetItemCount(ArmorSlot[i]) > 1)	Self.RemoveItem(ArmorSlot[i], 1)	EndWhile	EquipItem(ArmorSlot[i])EndIfi += 1EndWhileWhile (n < 3)If (AmmoSlot[n] != EmptySlot)	EquipItem(AmmoSlot[n])EndIfn += 1EndWhileEndFunctionFunction AddToArmorSlot(Form akBaseItem)Int i = 0Bool FoundEmptySlot = FalseWhile (i < 30) && (FoundEmptySlot == False)If (ArmorSlot[i] == EmptySlot)	ArmorSlot[i] = akBaseItem	FoundEmptySlot = TrueEndIfi += 1EndWhileEndFunctionFunction AddToAmmoSlot(Form akBaseItem)Int i = 0Bool FoundEmptySlot = FalseWhile (i < 3) && (FoundEmptySlot == False)If (AmmoSlot[i] == EmptySlot)	AmmoSlot[i] = akBaseItem	FoundEmptySlot = TrueEndIfi += 1EndWhileEndFunctionFunction RemoveFromArmorSlot(Form akBaseItem)Int i = 0Bool FoundMatchingSlot = FalseWhile (i < 30) && (FoundMatchingSlot == False)If (ArmorSlot[i] == akBaseItem)	ArmorSlot[i] = EmptySlot	FoundMatchingSlot = TrueEndIfi += 1EndWhileEndFunctionFunction RemoveFromAmmoSlot(Form akBaseItem)Int i = 0Bool FoundMatchingSlot = FalseWhile (i < 3) && (FoundMatchingSlot == False)If (AmmoSlot[i] == akBaseItem)	AmmoSlot[i] = EmptySlot	FoundMatchingSlot = TrueEndIfi += 1EndWhileEndFunctionFunction ResetMannequinVars()Int i = 0Int n = 0While (i < 30)ArmorSlot[i] = EmptySloti += 1EndWhileWhile (n < 3)AmmoSlot[n] = EmptySlotn += 1EndWhileEndFunction



this is the control activator (still a wip) i ommited most of the code that is irrellevant since this activator does much more than just manage mannequins

Spoiler

Scriptname DCVR_AH_ControlPanelScript extends ObjectReference  Import GameImport UtilityMessage Property Mannequins  Auto  ObjectReference Property MannequinMarker01  Auto  ObjectReference Property MannequinMarker02  Auto  ObjectReference Property MannequinChest01  Auto  ObjectReference Property MannequinChest02  Auto  ObjectReference Property MannequinChest03  Auto  ObjectReference Property MannequinChest04  Auto  ObjectReference Property MannequinChest05  Auto  ObjectReference Property MannequinChest06  Auto  ObjectReference Property MannequinChest07  Auto  ObjectReference Property MannequinChest08  Auto  ObjectReference Property MannequinChest09  Auto  ObjectReference Property MannequinChest10  Auto  ObjectReference Property MannequinChest11  Auto  ObjectReference Property MannequinChest12  Auto  Actor Property Mannequin01  Auto  Actor Property Mannequin02  AutoActor Property Mannequin03  AutoActor Property Mannequin04  AutoActor Property Mannequin05  AutoActor Property Mannequin06 AutoActor Property Mannequin07  Auto  Actor Property Mannequin08  AutoActor Property Mannequin09  AutoActor Property Mannequin10  AutoActor Property Mannequin11  AutoActor Property Mannequin12 AutoActor Property MannequinFem01  AutoActor Property MannequinFem02  AutoActor Property MannequinFem03  AutoActor Property MannequinFem04  AutoActor Property MannequinFem05  AutoActor Property MannequinFem06  AutoActor Property MannequinFem07  AutoActor Property MannequinFem08  AutoActor Property MannequinFem09  AutoActor Property MannequinFem10  AutoActor Property MannequinFem11  AutoActor Property MannequinFem12  AutoSound Property SceneMachine AutoEvent OnActivate(ObjectReference akActionRef)	Self.PlayAnimationAndWait("Trigger01", "Done")	Wait(0.2)	MCPMainMenu()EndEventFunction MCPMainMenu()	Int MainSelection = MainMenu.Show()	If MainSelection == 0		MCPScenery()	ElseIf MainSelection == 1		MCPPatio()	ElseIf MainSelection == 2		MCPServices()	ElseIf MainSelection == 3		MCPMannequins()	ElseIf MainSelection == 4		Return	EndIfEndFunctionFunction MCPMannequins()	Int MannequinSelection = Mannequins.Show()	If MannequinSelection == 0		ChangeGender()	ElseIf MannequinSelection == 1		ResetMannequin()	ElseIf MannequinSelection == 2		Wait(0.2)		MCPMainMenu()	EndIfEndFunctionFunction ChangeGender()	If !MannequinMarker01.IsDisabled()		DisableMale()		EnableFemale()	ElseIf !MannequinMarker02.IsDisabled()		DisableFemale()		EnableMale()	EndIfEndFunctionFunction ResetMannequin()	If !MannequinMarker01.IsDisabled()		DisableMale()		EnableMale()	ElseIf !MannequinMarker02.IsDisabled()		DisableFemale()		EnableFemale()	EndIfEndFunctionFunction DisableMale()	MaleUnequip()	Wait(0.1)	MannequinMarker01.Disable()	Wait(0.1)	MaleResetVars()	Wait(0.2)EndFunctionFunction EnableMale()	MannequinMarker01.Enable()	Wait(0.2)	MaleEquip()	Wait(0.2)EndFunctionFunction DisableFemale()	FemaleUnequip()	Wait(0.1)	MannequinMarker02.Disable()	Wait(0.1)	FemaleResetVars()	Wait(0.2)EndFunctionFunction EnableFemale()	MannequinMarker02.Enable()	Wait(0.2)	FemaleEquip()	Wait(0.2)EndFunctionFunction MaleUnequip()	Mannequin01.RemoveAllItems(MannequinChest01)	Mannequin02.RemoveAllItems(MannequinChest02)	Mannequin03.RemoveAllItems(MannequinChest03)	Mannequin04.RemoveAllItems(MannequinChest04)	Mannequin05.RemoveAllItems(MannequinChest05)	Mannequin06.RemoveAllItems(MannequinChest06)	Mannequin07.RemoveAllItems(MannequinChest07)	Mannequin08.RemoveAllItems(MannequinChest08)	Mannequin09.RemoveAllItems(MannequinChest09)	Mannequin10.RemoveAllItems(MannequinChest10)	Mannequin11.RemoveAllItems(MannequinChest11)	Mannequin12.RemoveAllItems(MannequinChest12)EndFunctionFunction MaleEquip()	MannequinChest01.RemoveAllItems(Mannequin01)	MannequinChest02.RemoveAllItems(Mannequin02)	MannequinChest03.RemoveAllItems(Mannequin03)	MannequinChest04.RemoveAllItems(Mannequin04)	MannequinChest05.RemoveAllItems(Mannequin05)	MannequinChest06.RemoveAllItems(Mannequin06)	MannequinChest07.RemoveAllItems(Mannequin07)	MannequinChest08.RemoveAllItems(Mannequin08)	MannequinChest09.RemoveAllItems(Mannequin09)	MannequinChest10.RemoveAllItems(Mannequin10)	MannequinChest11.RemoveAllItems(Mannequin11)	MannequinChest12.RemoveAllItems(Mannequin12)EndFunctionFunction MaleResetVars()	(Mannequin01 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin02 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin03 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin04 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin05 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin06 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin07 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin08 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin09 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin10 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin11 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(Mannequin12 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()EndFunctionFunction FemaleUnequip()	MannequinFem01.RemoveAllItems(MannequinChest01)	MannequinFem02.RemoveAllItems(MannequinChest02)	MannequinFem03.RemoveAllItems(MannequinChest03)	MannequinFem04.RemoveAllItems(MannequinChest04)	MannequinFem05.RemoveAllItems(MannequinChest05)	MannequinFem06.RemoveAllItems(MannequinChest06)	MannequinFem07.RemoveAllItems(MannequinChest07)	MannequinFem08.RemoveAllItems(MannequinChest08)	MannequinFem09.RemoveAllItems(MannequinChest09)	MannequinFem10.RemoveAllItems(MannequinChest10)	MannequinFem11.RemoveAllItems(MannequinChest11)	MannequinFem12.RemoveAllItems(MannequinChest12)EndFunctionFunction FemaleEquip()	MannequinChest01.RemoveAllItems(MannequinFem01)	MannequinChest02.RemoveAllItems(MannequinFem02)	MannequinChest03.RemoveAllItems(MannequinFem03)	MannequinChest04.RemoveAllItems(MannequinFem04)	MannequinChest05.RemoveAllItems(MannequinFem05)	MannequinChest06.RemoveAllItems(MannequinFem06)	MannequinChest07.RemoveAllItems(MannequinFem07)	MannequinChest08.RemoveAllItems(MannequinFem08)	MannequinChest09.RemoveAllItems(MannequinFem09)	MannequinChest10.RemoveAllItems(MannequinFem10)	MannequinChest11.RemoveAllItems(MannequinFem11)	MannequinChest12.RemoveAllItems(MannequinFem12)EndFunctionFunction FemaleResetVars()	(MannequinFem01 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem02 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem03 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem04 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem05 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem06 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem07 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem08 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem09 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem10 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem11 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()	(MannequinFem12 as DCVR_AH_MannequinActivatorScript).ResetMannequinVars()EndFunction
User avatar
Chris BEvan
 
Posts: 3359
Joined: Mon Jul 02, 2007 4:40 pm

Post » Wed Jun 20, 2012 2:56 pm

Odd, but the navmesh and angle trick do nothing toward keeping the mannequins in place in my mods. I just did this to 7 of them in the Warehouse. They were fine when I entered as were all of the the others (about 50 total), and left the cell and returned and, curiously enough, the only ones who moved were the ones I turned and placed on the mesh, and one other that sits at a 45 degree angle normally.

I have seen something like this posted every few weeks and I try it again occaisonally and it never helps. I keep mine off the navmesh. They usually only move occaisonally and do not seem to move in any pattern that would suggest they are moving to the navmesh. Heck, sometimes they go completely crazy and fly all over the room and end up in crazy places. Like Realm11 said, they always look like they are having a party when I enter and then snap back to their spots, usually. The ones that don't leave their triggers behind at the original spot.

There is a problem getting mannequins to activate when they face 0,0,0, but you only need to angle them a fraction of a degree to fix that, but they still shift around. At least in my experience. If the solution was something as easy as putting them on the navmesh and turning them a few degrees I would think Beth would have done that to fix the vanilla mannequins, which move as well. At least in my game they do.

Just my 2 cents worth. I'm glad its working for somebody.
User avatar
Rebecca Clare Smith
 
Posts: 3508
Joined: Fri Aug 04, 2006 4:13 pm

Post » Wed Jun 20, 2012 11:47 pm

also i should note that my mod is an esm, so there are no extra shennanigans with navmeshes involved. i dont exactly know how well my script would work with plain esp only once the navmesh bugs out
User avatar
jadie kell
 
Posts: 3497
Joined: Sat Jul 29, 2006 3:54 pm

Post » Thu Jun 21, 2012 12:24 am

You guys are experiencing what I call the 'Wandering Bug'. This affects ALL actors, not just mannequins. The problem is caused when an actor doesn't have proper AI; in the case of mannequins they must be forced back to their linked refs in the onCellAttach event. The nilla-quins only force back onCellLoad.. which is why it only works for you some of the time.

Another aspect of this "enableAI()".... this must be set true BEFORE moving an actor anywhere, or it may not move at all. If you want statue mannequins, do an enableAI(false) immediately after the moveto command. This is what it'd look like:
quin.enableAI()
quin.moveto(wherever)
quin.enableAI(false)

As for navMesh... if you use the above technique, you don't need them at all (under your mannequin). It's been a while since I've worked on this, so I may be wrong about that. If you DO need navMesh, then you should be able to set your mannequin to be an obstacle (so NPCs will go around them).

Collision: nilla-quins have three essential components... the actual actor, the collision-box activator, and an xMarkHeading. The actors are set to ghost (as you've noticed).. so their collision is turned off. The collision-box is placed in lieu of it; while the xMark is where the script forces it back to each time that block is fired.

For my CUSTOM mannequins (SPODUM), I turn off ghost/essential and do away with the collision triggers altogether. This way, you just 'talk' to the mannequin to use it - and if you want to permenantly delete one, you just kill it. Of course you'd turn essential back on if you want indestructible statues for target practice (and they DO boost your stats.. either way) or to avoid 'accidental death'.

Another couples 'bugs' you may encounter in your near future - the 'naked bug' and the 'dupe bug'. Naked is when you return to an area and all your mannequins have unequipped their stuff for no apparent reason (fixed by forcing a complete re-equip in the onCellAttach). It also happens after messing with Inventory sometimes... so I wound up calling the force-back and the re-equip blocks quite frequently.

Dupe is when you add apparel to a mannequin then immediately remove it without exiting the Inventory. If you then exit the Inventory, leave the area and return, your mannequin duplicates those apparel items - EVERY time you come back to that area. This is fixed by either clearing the Vanilla slots after an itemRemove; but is already taken care of if you convert to an array system.

The script-fix has the source included with it, and is available for use in other mods... you could simply rename it and attach it to your mannequins (so as not to interfere with Vanilla). You could also add your custom code to it, noting the areas NOT to alter (or you may recreate the bugs). SPODUM hasn't been updated with the new scripting yet (so doesn't have the source included with it yet), but you can still see how the actors and properties are set up.

http://skyrim.nexusmods.com/downloads/file.php?id=10652
http://skyrim.nexusmods.com/downloads/file.php?id=10578
User avatar
Kayla Bee
 
Posts: 3349
Joined: Fri Aug 24, 2007 5:34 pm

Post » Thu Jun 21, 2012 4:34 am

Odd, but the navmesh and angle trick do nothing toward keeping the mannequins in place in my mods. I just did this to 7 of them in the Warehouse. They were fine when I entered as were all of the the others (about 50 total), and left the cell and returned and, curiously enough, the only ones who moved were the ones I turned and placed on the mesh, and one other that sits at a 45 degree angle normally.

I have seen something like this posted every few weeks and I try it again occaisonally and it never helps. I keep mine off the navmesh. They usually only move occaisonally and do not seem to move in any pattern that would suggest they are moving to the navmesh. Heck, sometimes they go completely crazy and fly all over the room and end up in crazy places. Like Realm11 said, they always look like they are having a party when I enter and then snap back to their spots, usually. The ones that don't leave their triggers behind at the original spot.

There is a problem getting mannequins to activate when they face 0,0,0, but you only need to angle them a fraction of a degree to fix that, but they still shift around. At least in my experience. If the solution was something as easy as putting them on the navmesh and turning them a few degrees I would think Beth would have done that to fix the vanilla mannequins, which move as well. At least in my game they do.

Just my 2 cents worth. I'm glad its working for somebody.

Just like having to rotate weapon rack a slight degree to get swords to display on rack properly? It may seem simple but it works. Sometimes the simplest fix is the best fix.

My question for you is out of those mannequins you adjusted did you adjust the only the ones that were having the issue in the first place? All I can say is I have taken the same approach for my mod and two other people who had the issue with theirs were able to fix it in their mods. Placing my mannequins this way every time has yielded great results and I have not encountered any other 'bugs' with my mannequins. But I can't speak for anyone else.
User avatar
Nicole Coucopoulos
 
Posts: 3484
Joined: Fri Feb 23, 2007 4:09 am

Post » Wed Jun 20, 2012 1:49 pm

I agree that simple fixes are the best if they work. My point was that I thought if the fix was that simple, Beth would have used it to fix the vanilla mannequins that are almost as bad as the modded ones. I say "almost" only because, in my experience, mannequins are somewhat better behaved in master files than they are in plugins so Beth has a little advantage over the esp mods that are being posted on Steam, at least. But I have yet to find a single mannequin, mod or vanilla, that has not moved around at some time during my time playing. I think of the mannequin bug on a whole different level from rotating racks and other things to get them to activate correctly. I think Beth knew that trick because the vanilla racks all seemed to work for me.

As far as the mannequins I tried to fix, I just picked the first section I came to in the cell. There are over 50 of them and they all move to some degree until I put armor on them, which calms them down some. Some might move worse than others, but I have seen times while I am testing the raw mod when there is not a single mannequin that is anywhere close to where it belongs. Some of them are literally climbing up the walls. Other times they all move immediately back where they belong. Not a single mannequin in the building faces 0,0,0. They are all at least 45 degrees one way or the other. After I put armor on them they seem to stay put better.

Other than trying Dave's new adjusted scripts and the other fix mods, I have tried all of the little tricks and they don't really make any difference. Like turning them. You have to turn them away from 0,0,0 to get them to to activate, but they still move around. I've put them on navmesh and kept they away from navmesh. Either way they move the same. I've been a little reluctant to apply any script fixes because it would either affect every mannequin in the game, or if I create my own custom mannequins, they won't work with the other mannequin mods that somebody might want to have. So I have been setting them up as best I can and leaving it up the the users to apply the moving mannequin fix they prefer, like Dave's SPODUM mod for example. But whenever I see someone with a simple fix, I try it again just to see if anything has changed. I really haven't worked on them much since the last update so I was hoping it would work better this time.
User avatar
Jay Baby
 
Posts: 3369
Joined: Sat Sep 15, 2007 12:43 pm

Post » Thu Jun 21, 2012 4:48 am

keep in mind that 50 mannequins in a single cell means that MannequinActivatorScript is being called simultaneously 50 times during the OnCellLoad() event block. there is no way for papyrus to exectute that entire chunk of code in real time, so it probably stacks it in a queue and executes only the code that can fit in the cache at once, while the rest of it has to wait before being executed.

while this queue is stacked, your mannequins are probably wandering around as they are loading since their disable ai hasnt yet been called


it doesnt matter if the mannequins are inside a room bound. as long as they phsically exist, they are loading when your enter the cell.

my personal rule of thumb is to never have more than 12 in a single cell at once (which is a very conservative number as i'm sure people have gotten away with more, but you have to account for traffic for ALL your scripts while loading the cell).
User avatar
Queen
 
Posts: 3480
Joined: Fri Dec 29, 2006 1:00 pm

Post » Thu Jun 21, 2012 4:27 am

As you enter the cell to a spot where you can see a large number of mannequins, it appears that they are all moving at once. But just for a flash and then they generally all snap back into place in what I would guess is only a fraction of a second. They never actually seem to be milling around although I have occasionally caught them looking at me. When they are out of place, I usually find them frozen in that position when I enter with no movement. Or if I walk from one room into another and fnd they moved. If I activate their triggers, which do not move, and equip them, they snap into place and are then are generally fine at least for a while. Other than the moment of loading growing from nothing to a noticeable flash, I didn't notice any difference in behavior as I went from, say 24 to 54. The whole point of the mod is storage and display in a very large space so the large number of mannequins is an essential part of the mod. I don't really have time to play anymore. I generally go back to the same save and start each test, so I can't say what happens in the long term. I do not take the time to equip them again every time I start to test changes in the cell. I do notice they appear to get more erratic over time if I am constantly saving and reloading while trying to solve a problem. As I said above, the problem is much more pronounced in the ESP version.
User avatar
Kortniie Dumont
 
Posts: 3428
Joined: Wed Jan 10, 2007 7:50 pm

Post » Wed Jun 20, 2012 12:59 pm

Dupe is when you add apparel to a mannequin then immediately remove it without exiting the Inventory.
thanks for this. now that i know how to replicate it, I've done some extensive tests by inducing the bug using this method.


i've located the root of the problem: Event OnItemAdded is held in cached suspension any time an item is added. none of the code in the block will execute until AFTER the menu is closed, but will fire regardless if the item was removed prior to closing (due to the fact that it is cached). strangely enough, Event OnItemRemoved will fire in its ENTIRETY while the menu is still open, hence the paradox and the cause of the glitch to self-perpetuate (since the initial item added is sent to the function AddToArmorSlot() regardless if it was removed prior to closing the menu, while the script was queued in its cached suspended state).


it's important to know that the queue is cached, because a failsafe variable can NOT be set during the OnItemRemoved to check if the initial item added was removed prior to closing out the menu. the variable's value will not be updated in real time when the menu closes (trust me i've tried)


the only way to intercept this bug from happening is to create a failsafe outside of the cached OnItemAdded function by calling a RegisterForSingleUpdate, and place the failsafe inside the OnUpdate event. but also note, that OnUpdate can only be called once, and multiple items must be stored in an array in order for the failsafe to run through all of them to check for conditions which will allow it to properly add the item to the armorslot.
User avatar
Jonathan Braz
 
Posts: 3459
Joined: Wed Aug 22, 2007 10:29 pm

Post » Wed Jun 20, 2012 9:51 pm

Thank you http://www.gamesas.com/user/764276-sluckyd/ & http://www.gamesas.com/user/766649-amethyst-deceiver/. I've confirmed the conditions of the dupe bug and I've upgraded my Mannequin control script to an array-based script - as you've both suggested. It is noticeably faster (which is really saying something with my belt and braces EnforcePosition function's overhead) - but I'm still ironing out a few glitches.
User avatar
Joie Perez
 
Posts: 3410
Joined: Fri Sep 15, 2006 3:25 pm


Return to V - Skyrim