Background info:
for those that don't know, the "dupe" bug is a glitch caused by an event paradox while the inventory of the mannequin is still open. Essentially, any time you add an item, the event block OnItemAdded() will be queued in a cache and hold position until AFTER the menu closes, in which case it will fire off the length of code contained inside the function. That's all fine, except.... if you remove the item from the mannequin before closing the menu. The event block OnItemRemoved() will fire in its entirety WHILE the menu is open, hence the paradox. So what ends up happening is, if you add an armor, then remove it before closing the menu, the OnItemAdded() will fired from its queued AND cached status regardless if the item has already been removed.
As you know, the OnItemAdded on the mannequin script will add said item to the slot system (regardless if you use the vanilla script or an array system). The next time the mannequin fires off the EquipCurrentArmor() function, it will incorrectly force-equip this rogue armor piece onto itself, and since it is now out of sync with the rest of the script, it will continue to force-equip a duplicate of this same offending armor infinitely, every single time the Event OnCellLoad() is called (or OnCellAttach, whatever you have on the script). This is because, even though the mannequin did not physically have the offending armor piece in its inventory at the time, since the form ID is stored in the slot system, it will be "given" this armor to equip (this is a standard feature in skyrim).
It is also important to note that the OnItemAdded is suspended in a cached state because, even if you try to apply a failsafe to the OnItemRemoved() event block, it will have no effect on the OnItemAdded() function call when it eventually fires, since it will only return the value of the variable in its cached state.
Edit: updated script
Scriptname DCVR_AH_MannequinActivatorScript extends ActorImport UtilityMessage Property MannequinArmorWeaponsMessage AutoForm[] Property ArmorSlot Auto HiddenForm Property EmptySlot Auto HiddenEvent OnInit()ArmorSlot = New Form[30]EndEventEvent OnCellAttach()Self.BlockActivation()EquipCurrentArmor()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) || (akBaseItem as Ammo)) AddToArmorSlot(akBaseItem)Else MannequinArmorWeaponsMESSAGE.Show() Self.RemoveItem(akBaseItem, aiItemCount, true, akPlayer)EndIfRegisterForSingleUpdate(0.1)EndEventEvent OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)RemoveFromArmorSlot(akBaseItem)RegisterForSingleUpdate(0.1)EndEventEvent OnObjectUnequipped(Form akBaseObject, ObjectReference akReference)RemoveFromArmorSlot(akBaseObject)EndEventEvent OnUpdate()EquipCurrentArmor()EndEventFunction EquipCurrentArmor()Int i = 0Self.UnequipAll()While (i < 30) If (ArmorSlot[i] != EmptySlot) Self.EquipItem(ArmorSlot[i]) EndIf i += 1EndWhileEndFunctionFunction AddToArmorSlot(Form akBaseItem)Int i = 0Bool FoundEmptySlot = FalseWhile (i < 30) && (FoundEmptySlot == False) If (ArmorSlot[i] == EmptySlot) ArmorSlot[i] = akBaseItem FoundEmptySlot = True EndIf i += 1EndWhileEndFunctionFunction RemoveFromArmorSlot(Form akBaseItem)Int i = 0Bool FoundMatchingSlot = FalseWhile (i < 30) && (FoundMatchingSlot == False) If (ArmorSlot[i] == akBaseItem) ArmorSlot[i] = EmptySlot FoundMatchingSlot = True EndIf i += 1EndWhileEndFunctionFunction ResetMannequinVars()Int i = 0While (i < 30) ArmorSlot[i] = EmptySlot i += 1EndWhileEndFunction