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;************************************