Constant spell effect put on follower by script stops workin

Post » Sun Jan 06, 2013 12:13 pm

I have modified the "powerShrineScript" and added a new standing stone, the "Berserker Stone" which grants a constant effect magical ability that buffs health and armor, it does this using addSpell() on the target actor, the same way as the other standing stones. This works all fine and dandy on the player, but I have also modded the script so that NPC followers can also benefit from the buff, by telling them to them activate the berserker stone using the follower order system.

This seems to work fine, the stone lights up and the follower gets the ability. However, whenever I fast travel together with the follower the effects stop when we arrive. It seems that the follower still has the magical ability, but it doesn't do anything anymore. To get it working again, I have to first make the follower use the stone once to remove the ability, and then again to add it.

If I give the same spell to a follower using the creation kit, the effect is truly constant and lasts even if we fast travel.

Does anyone know what to do to make a spell applied to an NPC by a script permanent?

Here is the most relevant part of the script:

Spoiler
if bBerserker &&  obj AS ACTOR  npc = obj as actor	if npc.hasSpell(pDoomBerserkerAbility)	 npc.removeSpell(pDoomBerserkerAbility)	else	 npc.addSpell(pDoomBerserkerAbility)  	SELF.playAnimation("playanim01")	endif   endif

And the entire script, most of the code has not been changed from the vanilla powerShrineScript
Spoiler
scriptName powerShrineScript extends ObjectReferenceimport gameimport utilityString property graphVariable auto; //which stone are weBOOL PROPERTY bApprentice AUTOBOOL PROPERTY bAtronach AUTOBOOL PROPERTY bBerserker AUTOBOOL PROPERTY bLady AUTOBOOL PROPERTY bLord AUTOBOOL PROPERTY bLover AUTOBOOL PROPERTY bMage AUTOBOOL PROPERTY bRitual AUTOBOOL PROPERTY bSerpent AUTOBOOL PROPERTY bShadow AUTOBOOL PROPERTY bSteed AUTOBOOL PROPERTY bThief AUTOBOOL PROPERTY bTower AUTOBOOL PROPERTY bWarrior AUTO; //list of the effectsSPELL PROPERTY pDoomApprenticeAbility AUTOSPELL PROPERTY pdoomApprenticeNegativeAbility AUTOSPELL PROPERTY pDoomAtronachAbility AUTOSPELL PROPERTY pDoomBerserkerAbility AUTOSPELL PROPERTY pDoomLadyAbility AUTOSPELL PROPERTY pDoomLordAbility AUTOSPELL PROPERTY pDoomLoverAbility AUTOSPELL PROPERTY pDoomMageAbility AUTOSPELL PROPERTY pDoomRitualAbility AUTOSPELL PROPERTY pDoomSerpentAbility AUTOSPELL PROPERTY pDoomShadowAbility AUTOSPELL PROPERTY pDoomSteedAbility AUTOSPELL PROPERTY pDoomThiefAbility AUTOSPELL PROPERTY pDoomTowerAbility AUTOSPELL PROPERTY pDoomWarriorAbility AUTO; //list of the messagesMESSAGE PROPERTY pDoomApprenticeMSG AUTOMESSAGE PROPERTY pDoomAtronachMSG AUTOMESSAGE PROPERTY pDoomBerserkerMSG AUTOMESSAGE PROPERTY pDoomLadyMSG AUTOMESSAGE PROPERTY pDoomLordMSG AUTOMESSAGE PROPERTY pDoomLoverMSG AUTOMESSAGE PROPERTY pDoomMageMSG AUTOMESSAGE PROPERTY pDoomRitualMSG AUTOMESSAGE PROPERTY pDoomSerpentMSG AUTOMESSAGE PROPERTY pDoomShadowMSG AUTOMESSAGE PROPERTY pDoomSteedMSG AUTOMESSAGE PROPERTY pDoomThiefMSG AUTOMESSAGE PROPERTY pDoomTowerMSG AUTOMESSAGE PROPERTY pDoomWarriorMSG AUTOMESSAGE PROPERTY pDoomApprenticeRemovedMSG AUTOMESSAGE PROPERTY pDoomAtronachRemovedMSG AUTOMESSAGE PROPERTY pDoomBerserkerRemovedMSG AUTOMESSAGE PROPERTY pDoomLadyRemovedMSG AUTOMESSAGE PROPERTY pDoomLordRemovedMSG AUTOMESSAGE PROPERTY pDoomLoverRemovedMSG AUTOMESSAGE PROPERTY pDoomMageRemovedMSG AUTOMESSAGE PROPERTY pDoomRitualRemovedMSG AUTOMESSAGE PROPERTY pDoomSerpentRemovedMSG AUTOMESSAGE PROPERTY pDoomShadowRemovedMSG AUTOMESSAGE PROPERTY pDoomSteedRemovedMSG AUTOMESSAGE PROPERTY pDoomThiefRemovedMSG AUTOMESSAGE PROPERTY pDoomTowerRemovedMSG AUTOMESSAGE PROPERTY pDoomWarriorRemovedMSG AUTO; //list of Rested spells -- need to remove just for the LoverSpell Property pRested AutoSpell Property pWellRested AutoSpell Property pMarriageRested Auto; //the perk for RitualPERK PROPERTY pDoomRitualPerk AUTO; //the already have messageMESSAGE PROPERTY pDoomAlreadyHaveMSG AUTO;************************************BOOL DOONCE=TRUEACTOR npcAuto State baseEVENT onACTIVATE(OBJECTREFERENCE obj)  ; //check to see if the player is the activator and we havent already activated  IF(doOnce && obj AS ACTOR == game.getPlayer())     doOnce = FALSE     ; //if we already have the power and this is the stone then kick the player out   IF(bApprentice && game.getPlayer().hasSpell(pDoomApprenticeAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)	doOnce = TRUE   ELSEIF(bAtronach && game.getPlayer().hasSpell(pDoomAtronachAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)	doOnce = TRUE   ELSEIF(bBerserker && game.getPlayer().hasSpell(pDoomBerserkerAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)	doOnce = TRUE   ELSEIF(bLady && game.getPlayer().hasSpell(pDoomLadyAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)	doOnce = TRUE   ELSEIF(bLord && game.getPlayer().hasSpell(pDoomLordAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSEIF(bLover && game.getPlayer().hasSpell(pDoomLoverAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSEIF(bMage && game.getPlayer().hasSpell(pDoomMageAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSEIF(bRitual && game.getPlayer().hasSpell(pDoomRitualAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSEIF(bSerpent && game.getPlayer().hasSpell(pDoomSerpentAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSEIF(bShadow && game.getPlayer().hasSpell(pDoomShadowAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSEIF(bSteed && game.getPlayer().hasSpell(pDoomSteedAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSEIF(bThief && game.getPlayer().hasSpell(pDoomThiefAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSEIF(bTower && game.getPlayer().hasSpell(pDoomTowerAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSEIF(bWarrior && game.getPlayer().hasSpell(pDoomWarriorAbility))	pDoomAlreadyHaveMSG.show()	utility.wait(2)  	doOnce = TRUE   ELSE		; // present them with the choice	IF(showSign() == 0)	 removeSign()	 addSign()		 SELF.playAnimation("playanim01")		 utility.wait(15)		 doOnce = TRUE	ELSE	 utility.wait(2)	 doOnce = TRUE	ENDIF     ENDIF  ELSE   if bBerserker &&  obj AS ACTOR	npc= obj as actor	if npc.hasSpell(pDoomBerserkerAbility)	 npc.removeSpell(pDoomBerserkerAbility)	else	 npc.addSpell(pDoomBerserkerAbility)  	SELF.playAnimation("playanim01")	endif   endif  ENDIFendEVENTendStateint FUNCTION showSign()int signHolderIF(bApprentice)  signHolder = pDoomApprenticeMSG.show()ELSEIF(bAtronach)  signHolder = pDoomAtronachMSG.show()ELSEIF(bBerserker)  signHolder = pDoomBerserkerMSG.show()ELSEIF(bLady)  signHolder = pDoomLadyMSG.show()ELSEIF(bLord)  signHolder = pDoomLordMSG.show()ELSeIF(bLover)  signHolder = pDoomLoverMSG.show()ELSEIF(bMage)  signHolder = pDoomMageMSG.show()ELSEIF(bRitual)  signHolder = pDoomRitualMSG.show()ELSEIF(bSerpent)  signHolder = pDoomSerpentMSG.show()ELSEIF(bShadow)  signHolder = pDoomShadowMSG.show()ELSEIF(bSteed)  signHolder = pDoomSteedMSG.show()ELSEIF(bThief)  signHolder = pDoomThiefMSG.show()ELSEIF(bTower)  signHolder = pDoomTowerMSG.show()ELSEIF(bWarrior)  signHolder = pDoomWarriorMSG.show()ENDIFRETURN signHolderendFUNCTION; //FUNCTION: addSign; //; // adds the sign of the stone to the playerFUNCTION addSign()game.AddAchievement(29)IF(bApprentice)  game.getPlayer().addSpell(pDoomApprenticeAbility)  game.getPlayer().addSpell(pdoomApprenticeNegativeAbility)ELSEIF(bAtronach)  game.getPlayer().addSpell(pDoomAtronachAbility)ELSEIF(bBerserker)  game.getPlayer().addSpell(pDoomBerserkerAbility)ELSEIF(bLady)  game.getPlayer().addSpell(pDoomLadyAbility)ELSEIF(bLord)  game.getPlayer().addSpell(pDoomLordAbility)ELSeIF(bLover)  game.getPlayer().removeSpell(pRested)  game.getPlayer().removeSpell(pWellRested)  game.getPlayer().removeSpell(pMarriageRested)  game.getPlayer().addSpell(pDoomLoverAbility)ELSEIF(bMage)  game.getPlayer().addSpell(pDoomMageAbility)ELSEIF(bRitual)  game.getPlayer().addSpell(pDoomRitualAbility)  game.getPlayer().addPerk(pdoomRitualPerk)ELSEIF(bSerpent)  game.getPlayer().addSpell(pDoomSerpentAbility)ELSEIF(bShadow)  game.getPlayer().addSpell(pDoomShadowAbility)ELSEIF(bSteed)  game.getPlayer().addSpell(pDoomSteedAbility)ELSEIF(bThief)  game.getPlayer().addSpell(pDoomThiefAbility)ELSEIF(bTower)  game.getPlayer().addSpell(pDoomTowerAbility)ELSEIF(bWarrior)  game.getPlayer().addSpell(pDoomWarriorAbility)ENDIFendFUNCTION; //FUNCTION: removeSign; //; // Removes all of the signs currently on the playerFUNCTION removeSign()IF(game.getPlayer().hasSpell(pDoomApprenticeAbility))  game.getPlayer().removeSpell(pDoomApprenticeAbility)  game.getPlayer().removeSpell(pdoomApprenticeNegativeAbility)  pDoomApprenticeRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomAtronachAbility))  game.getPlayer().removeSpell(pDoomAtronachAbility)  pDoomAtronachRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomBerserkerAbility))  game.getPlayer().removeSpell(pDoomBerserkerAbility)  pDoomBerserkerRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomLadyAbility))  game.getPlayer().removeSpell(pDoomLadyAbility)  pDoomLadyRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomLordAbility))  game.getPlayer().removeSpell(pDoomLordAbility)  pDoomLordRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomLoverAbility))  game.getPlayer().removeSpell(pDoomLoverAbility)  pDoomLoverRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomMageAbility))  game.getPlayer().removeSpell(pDoomMageAbility)  pDoomMageRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomRitualAbility))  game.getPlayer().removeSpell(pDoomRitualAbility)  pDoomRitualRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomSerpentAbility))  game.getPlayer().removeSpell(pDoomSerpentAbility)  pDoomSerpentRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomShadowAbility))  game.getPlayer().removeSpell(pDoomShadowAbility)  pDoomShadowRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomSteedAbility))  game.getPlayer().removeSpell(pDoomSteedAbility)  pDoomSteedRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomThiefAbility))  game.getPlayer().removeSpell(pDoomThiefAbility)  pDoomThiefRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomTowerAbility))  game.getPlayer().removeSpell(pDoomTowerAbility)  pDoomTowerRemovedMSG.show()ELSEIF(game.getPlayer().hasSpell(pDoomWarriorAbility))  game.getPlayer().removeSpell(pDoomWarriorAbility)  pDoomWarriorRemovedMSG.show()ENDIF  endFUNCTION;************************************State waiting;do nothingendState;********
****************************
User avatar
Nathan Risch
 
Posts: 3313
Joined: Sun Aug 05, 2007 10:15 pm

Return to V - Skyrim