Scriptname ScarabDurabilityActorEffect extends ActiveMagicEffect;=============== PROPERTIES ==========================================;Formlist Property ScarabDurabilityTrackerFLST AutoFloat Property DamagePerHit AutoFloat Property BaseDurability AutoFloat Property BreakPoint AutoFloat[] Property DurabilityTracker Auto HiddenForm[] Property FormTracker Auto HiddenActor Property ThisActor Auto HiddenWeapon Property RightWeapon Auto HiddenWeapon Property LeftWeapon Auto Hidden;=============== VARIABLES ==========================================;Int DurableItemIndex;=============== EVENTS ==========================================;Event OnEffectStart(Actor akTarget, Actor akCaster) ThisActor = Self.GetTargetActor() Debug.Trace("ScarabDurability I am " + ThisActor + ", I have ScarabDurabilityActorEffect") DurabilityTracker = new Float[128]EndEventEvent OnObjectEquipped(Form akBaseObject, ObjectReference akReference) if akBaseObject as Weapon Debug.Trace("ScarabDurability " + ThisActor + " just equipped weapon: " + akBaseObject) GetEquippedWeapons() if GetItemDurability(akBaseObject) < BreakPoint Debug.Trace("ScarabDurability " + ThisActor + " that one is broken: " + akBaseObject) ThisActor.UnEquipItem(akBaseObject, true, false) endIf endIfEndEventEvent OnCombatStateChanged(Actor akTarget, int aeCombatState) ReEquipWeapons() if (akTarget == Game.GetPlayer()) if (aeCombatState == 0) Debug.Trace("ScarabDurability " + ThisActor + "We have left combat with the player!") elseif (aeCombatState == 1) Debug.Trace("ScarabDurability " + ThisActor + "We have entered combat with the player!") elseif (aeCombatState == 2) Debug.Trace("ScarabDurability " + ThisActor + "We are searching for the player...") endIf endIfEndEventEvent OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) Debug.Trace("ScarabDurability " + ThisActor + " was hit by " + akAggressor + " with " + akSource) ;Debug.Trace("ScarabDurability " + "let's damage our stuff ") if (abPowerAttack || abHitBlocked) Debug.Trace("It was a power attack or blocked - double damage") DamageOurStuff(DamagePerHit * 2) else DamageOurStuff(DamagePerHit) endIfEndEvent;=============== FUNCTIONS ==========================================;Function GetEquippedWeapons() RightWeapon = ThisActor.GetEquippedWeapon(false) LeftWeapon = ThisActor.GetEquippedWeapon(true) if RightWeapon as Weapon InitializeItemDurability(RightWeapon) endif if LeftWeapon as Weapon InitializeItemDurability(LeftWeapon) endif Debug.Trace("ScarabDurability " + ThisActor + " is equipped with: " + RightWeapon + LeftWeapon) DumpDurabilityData()EndFunctionFloat Function GetItemDurability(Form DurableItem) DurableItemIndex = GetFormIndex(ScarabDurabilityTrackerFLST, DurableItem) Return DurabilityTracker[DurableItemIndex]EndFunctionFunction InitializeItemDurability(Form DurableItem) DurableItemIndex = GetFormIndex(ScarabDurabilityTrackerFLST, DurableItem) if (DurableItemIndex >= 0) Debug.Trace("ScarabDurability " + DurableItem + "already registered at " + DurableItemIndex) else ScarabDurabilityTrackerFLST.AddForm(DurableItem) DurableItemIndex = GetFormIndex(ScarabDurabilityTrackerFLST, DurableItem) Debug.Trace("ScarabDurability " + DurableItem + "now registered at " + DurableItemIndex) endIf if DurabilityTracker[DurableItemIndex] as Float Debug.Trace("ScarabDurability " + "Durability of " + DurableItem + " tracked at " + DurableItemIndex + " data " + DurabilityTracker[DurableItemIndex]) else Debug.Trace("ScarabDurability " + "Durability of " + DurableItem + " tracked at " + DurableItemIndex + " data " + DurabilityTracker[DurableItemIndex]) DurabilityTracker[DurableItemIndex] = BaseDurability endifEndFunctionFunction DamageItem(Form DurableItem, Float DamageOfHit) DurableItemIndex = GetFormIndex(ScarabDurabilityTrackerFLST, DurableItem) ; randomise damage done up to DamagePerHit DamageOfHit = DamageOfHit * Utility.RandomFloat() Debug.Trace("ScarabDurability " + "Damaging " + DurableItem + " by " + DamageOfHit) DurabilityTracker[DurableItemIndex] = DurabilityTracker[DurableItemIndex] - DamageOfHit Debug.Trace("ScarabDurability " + "Durability of " + ThisActor + DurableItem + " = " + DurabilityTracker[DurableItemIndex]) ; chance to break is inverse of amount damaged if Utility.RandomFloat(0.0, BaseDurability) < DurabilityTracker[DurableItemIndex] Debug.Trace("ScarabDurability " + ThisActor + "running BreakItem " + DurableItem) BreakItem(DurableItem) endIfEndFunctionFunction BreakItem(Form DurableItem) DurableItemIndex = GetFormIndex(ScarabDurabilityTrackerFLST, DurableItem) Debug.Trace("ScarabDurability " + ThisActor + "Broken " + DurableItem) ThisActor.UnEquipItem(DurableItem, true, false) Debug.Trace("ScarabDurability " + ThisActor + "Dropping " + DurableItem) ThisActor.DropObject(DurableItem) ObjectReference BrokenItem = Game.FindClosestReferenceOfType(DurableItem, ThisActor.GetPositionX(), ThisActor.GetPositionY(), ThisActor.GetPositionZ(), 100.00) BrokenItem.SetDestroyed() Debug.Trace("ScarabDurability " + ThisActor + "Reset Counter " + DurableItem) DurabilityTracker[DurableItemIndex] = BaseDurabilityEndFunctionFunction DamageOurStuff(Float DamageOfHit) if RightWeapon as Weapon DamageItem(RightWeapon, DamageOfHit) endif if LeftWeapon as Weapon DamageItem(LeftWeapon, DamageOfHit) endifEndFunctionFunction ReEquipWeapons() if (RightWeapon as Weapon) Debug.Trace("ScarabDurability " + ThisActor + " Unequipping: "+ RightWeapon) ThisActor.UnEquipItem(RightWeapon) Debug.Trace("ScarabDurability " + ThisActor + " Equipping: "+ RightWeapon) ThisActor.EquipItem(RightWeapon) endif if (LeftWeapon as Weapon) Debug.Trace("ScarabDurability " + ThisActor + " Unequipping: "+ LeftWeapon) ThisActor.UnEquipItem(LeftWeapon) Debug.Trace("ScarabDurability " + ThisActor + " Equipping: "+ LeftWeapon) ThisActor.EquipItem(LeftWeapon) endifEndFunctionFunction DumpArrayData(Float[] objects) int currentElement = 0 while (currentElement < objects.Length) Debug.Trace("ScarabDurability " + "Durability of " + ThisActor + currentElement + " = " + objects[currentElement]) currentElement += 1 endWhileEndFunctionFunction DumpDurabilityData() int currentElement = 0 while (currentElement < FormTracker.Length) if FormTracker[currentElement] as Form Debug.Trace("ScarabDurability " + ThisActor + "Durability of " + ScarabDurabilityTrackerFLST.GetAt(currentElement) + " is " + DurabilityTracker[currentElement]) endif currentElement += 1 endWhileEndFunction; copied from http://www.creationkit.com/GetAt_-_FormListint Function GetFormIndex(FormList List, Form Member) global{Gets the index of Member in List. Returns -1 if not found} if (!List.HasForm(Member)) Return -1 endif int Index = 0 While (List.GetAt(Index) != Member) Index += 1 EndWhile Return IndexEndFunction