User:Sickleyield
This is the CM Partners PartnerMagic script. Their readme gives permission for any and all uses of it, but if anyone from the Cutthroat Mods team should wish me to take it down please contact me and I'll do so at once.
I'd like to adapt this as a creature follow script while keeping some of the great "levelup with PC" and "attack that NPC over there" sorts of options. When I apply it directly to my spider companion critter, however, the critter remains unactivatable by the player. I tried deleting some of the nonapplicable parts, like the things about torch equippage, but it made no difference.
If we could turn this into a functional critter companion script, I'm sure you can all see far more interesting uses for it than just my Arachnalia mod. ;) Any creature companion could be quickly and easily integrated with the CM Partners mod. Imagine the possibilities.
Scriptname PartnerMagic
short package
short follow
short following
short partner
short command
short inparty
short interior
short doonce
short start
short currentday
short dayspast
short daysdone
float timer
short timepast
short state
short fspeed short fathletics short weaponUse short incombat short isdead short alert ref target
short pcz short npcz short running short sitting short torch short sneaking short Chameleon short invisible short WaterWalking
short npcspeed short npcathletics short npcstrength short npcwillpower short npcintelligence short npcagility short npcendurance short npcpersonality short npcluck short npchealth short npcmagicka short npcfatigue short npcblade short npcblunt short npchandtohand short npcmarksman short npcheavyarmor short npclightarmor short npcblock short npcsneak short npcacrobatics short npcsecurity short npcmysticism short npcconjuration short npcillusion short npcalteration short npcdestruction short npcrestoration
short setupdoonce short npctype short nlevel short npclevel short pclevel short leveldiff ; Defined as ( pclevel - npclevel ) short levelup short levelreport short npcweapon short pcweapon short npcarmor short pcarmor short train short trainday short trainhour short traindayspast short traindone
short inventory short regulator ref refnpc ref refbox
Begin OnLoad
Set partner to GetFactionRank Partners Set npclevel to GetLevel Set pclevel to Player.GetLevel
End
Begin OnDeath ;
if GetActorValue Health <= 0 && isdead == 0
Set isdead to 1 Set timepast to 1 if inparty == 1 Message, "Your partner is dead." endif
endif
End
Begin OnActivate ; Sets Quest variables when Dialogue is activated. This allows every Partner NPC to use the Quest dialogue as their own.
Set cmPartnersQuest.nType to npctype Set cmPartnersQuest.nLevelup to levelreport Set cmPartnersQuest.nInParty to inparty Set cmPartnersQuest.nLeveldiff to leveldiff if Player.IsSneaking == 1 && partner == 2 ; Only activates Dialogue if Player is not sneaking. Return else Activate endif
End
Begin GameMode ; Normal game scripting run in non-menu mode.
- INITIAL SETUP - Sets all starting values for variables and adds topics and spells..
if setupdoonce == 0
- NPC type denotes the NPC's specialized class, is used for levelup, and has the following values
- 1 -> Combat specialized class
- 2 -> Stealth specialized class
- 3 -> Magic specialized class
Set npctype to 3
Set partner to GetFactionRank Partners Set npclevel to GetLevel Set pclevel to Player.GetLevel Set leveldiff to ( pclevel - npclevel )
Set npchealth to ( GetBaseActorValue Health ) Set npcmagicka to ( GetBaseActorValue Magicka ) Set npcfatigue to ( GetBaseActorValue Fatigue ) Set npcstrength to ( GetBaseActorValue Strength ) Set npcintelligence to ( GetBaseActorValue Intelligence ) Set npcwillpower to ( GetBaseActorValue Willpower ) Set npcagility to ( GetBaseActorValue Agility ) Set npcendurance to ( GetBaseActorValue Endurance ) Set npcpersonality to ( GetBaseActorValue Personality ) Set npcluck to ( GetBaseActorValue Luck ) Set npcspeed to ( GetBaseActorValue Speed ) Set npcathletics to ( GetBaseActorValue Athletics )
Set npcblade to ( GetBaseActorValue Blade ) Set npcmarksman to ( GetBaseActorValue Marksman ) Set npcblunt to ( GetBaseActorValue Blunt ) Set npchandtohand to ( GetBaseActorValue HandtoHand )
Set npclightarmor to ( GetBaseActorValue LightArmor ) Set npcheavyarmor to ( GetBaseActorValue HeavyArmor )
Set npcacrobatics to ( GetBaseActorValue Acrobatics ) Set npcsneak to ( GetBaseActorValue Sneak ) Set npcsecurity to ( GetBaseActorValue Security ) Set npcblock to ( GetBaseActorValue Block )
Set npcmysticism to ( GetBaseActorValue Mysticism ) Set npcconjuration to ( GetBaseActorValue Conjuration ) Set npcillusion to ( GetBaseActorValue Illusion) Set npcalteration to ( GetBaseActorValue Alteration ) Set npcdestruction to ( GetBaseActorValue Destruction ) Set npcrestoration to ( GetBaseActorValue Restoration )
AddSpell "cmWaterBreathingA" SetActorValue Acrobatics, 100 AddTopic cmxAbilities AddTopic cmJoinMe if npctype == 3 AddSpell "cmHealPlayer" AddSpell "cmRestoreHealth" endif Set setupdoonce to 1
endif
if timepast == 1 ; Removes the body after 90 seconds if the Partner NPC dies.
Set timer to ( timer + GetSecondsPassed ) If timer > 90 Set timepast to 2 Set isdead to 2 Disable endif
endif
if isdead == 2 ; Terminates script if Partner NPC dies.
Return
endif
Set package to GetCurrentAIPackage ; Sets main variables to use as conditions for the rest of the scripting Set follow to GetCurrentAIPackage == 1 Set partner to GetFactionRank "Partners"
if inparty == 1 && package == 13
Set inparty to 0
elseif inparty == 0 && follow == 1
Set inparty to 1
endif
- FOLLOW MODE - Sets all the follow variables to define how the NPC follows the Player.
if follow == 1 && following == 0
Set inparty to 1 Set fspeed to ( Player.GetActorValue Speed * 2.25 ) Set fathletics to ( Player.GetActorValue Athletics * 2.25 ) SetActorValue Speed, fspeed SetActorValue Athletics, fathletics SetIgnoreFriendlyHits 7 Set following to 1
elseif follow != 1 && following == 1
SetActorValue Speed, npcspeed SetActorValue Athletics, npcathletics SetIgnoreFriendlyHits 3 Set following to 0
endif
if follow == 1 && incombat == 0
Set pcz to Player.GetPos z Set npcz to GetPos z
elseif follow != 1 && incombat == 0
Set npcz to GetPos z
endif
if follow == 1 ; Scripting in this block commands the NPC to follow the Player in many different ways.
if pcz > ( npcz + 400 ) MoveTo Player elseif pcz < ( npcz - 400 ) MoveTo Player endif
if GetDistance Player > 1024 && incombat == 0 MoveTo Player endif
if IsInCombat == 1 Set incombat to 1 else Set incombat to 0 endif
if incombat == 1 ; Prevents combat between Partner NPC's.. Set target to GetCombatTarget if target == Player Yield Return elseif target.GetInFaction Partners Yield Return endif endif if alert == 0 && Player.IsWeaponOut == 1 SetAlert 1 Set alert to 1 elseif alert == 1 && Player.IsWeaponOut == 0 SetAlert 0 Set alert to 0 endif
if sneaking == 0 && Player.IsSneaking == 1 SetForceSneak 1 Set sneaking to 1 elseif sneaking == 1 && Player.IsSneaking == 0 SetForceSneak 0 Set sneaking to 0 endif
if Chameleon == 0 && Player.HasMagicEffect CHML == 1 AddSpell "cmChameleonA" Set Chameleon to 1 elseif Chameleon == 1 && Player.HasMagicEffect CHML == 0 RemoveSpell "cmChameleonA" Set Chameleon to 0 endif
if invisible == 0 && Player.HasMagicEffect INVI == 1 AddSpell "cmInvisibilityA" Set invisible to 1 elseif invisible == 1 && Player.HasMagicEffect INVI == 0 RemoveSpell "cmInvisibilityA" Set invisible to 0 endif
if running == 0 && Player.IsRunning == 1 SetForceRun 1 Set running to 1 elseif running == 1 && Player.IsRunning == 0 SetForceRun 0 Set running to 0 endif
if WaterWalking == 0 && Player.HasMagicEffect WAWA == 1 AddSpell "cmWaterWalkingA" Set WaterWalking to 1 elseif WaterWalking == 1 && Player.HasMagicEffect WAWA == 0 RemoveSpell "cmWaterWalkingA" Set WaterWalking to 0 endif
if npctype == 3 && cmPartnersQuest.nHeal == 1 ; Cast Party Heal spell. AddSpell "cmHealParty" Cast cmHealParty Player RemoveSpell "cmHealParty" Set cmPartnersQuest.nHeal to 0 endif if sitting == 0 && Player.GetSitting == 3 AddScriptPackage "cmSitScript" Set sitting to 1 endif
endif
if sitting == 1 && Player.GetSitting == 0 ; Forces NPC to rejoin Player after sitting package is complete.
RemoveScriptPackage AddScriptPackage "cmFollowPlayer" Set sitting to 0
endif
- INVENTORY MODE - Inventory scripting which is a modified Toaster script.
if inventory == 1 && follow == 1
if regulator == 3 AddItem cmTorch02 1 EquipItem cmTorch02 RemoveItem cmTorch02 1 Set regulator to 4 RemoveScriptPackage "cmInventory" AddScriptPackage "cmFollowPlayer" Set inventory to 0 endif
if regulator == 2 && MenuMode == 0 Set regulator to 3 refbox.RemoveAllItems refnpc refbox.Disable endif
if regulator == 1 RemoveAllItems refbox refbox.Activate Player Set regulator to 2 endif
endif
- PARTY COMMANDS - Reads Quest variable nParty and executes party commands for NPC.
if partner == 2 && command == 0 && cmPartnersQuest.nParty==1 && inparty == 1
Set command to 1 RemoveScriptPackage AddScriptPackage "cmFollowPlayer"
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==2
Set inparty to 0 Set command to 1 RemoveScriptPackage AddScriptPackage "cmStandGuard"
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==3
Set inparty to 0 Set command to 1 RemoveScriptPackage AddScriptPackage "cmWander"
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==4
RemoveScriptPackage AddScriptPackage "cmEatCommand" Set command to 1
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==5
RemoveScriptPackage AddScriptPackage "cmDrunk" Set command to 1
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==6
RemoveScriptPackage AddScriptPackage "cmSleepCommand" Set command to 1
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==7 && npctype >= 2
RemoveScriptPackage AddScriptPackage "cmHarvestCommand" Set command to 1
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==8
RemoveScriptPackage AddScriptPackage "cmMeleeCommand" Set command to 1
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==9
RemoveScriptPackage AddScriptPackage "cmCastAnyCommand" Set command to 1
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==10
RemoveScriptPackage AddScriptPackage "cmAttackNPCCommand" Set command to 1
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==11
RemoveScriptPackage AddScriptPackage "cmAttackMonsterCommand" Set command to 1
elseif partner == 2 && command == 0 && cmPartnersQuest.nParty==12
RemoveScriptPackage AddScriptPackage "cmFollowPlayer" Set command to 1
elseif partner == 2 && command == 1 && cmPartnersQuest.nParty==0
Set command to 0
elseif partner == 1
Set inparty to 0
endif
if torch == 0 && IsActorUsingATorch == 0 && cmPartnersQuest.nTorch == 1 && IsSneaking == 0
AddItem cmTorch02 1 EquipItem cmTorch02 Set torch to 1
elseif torch == 1 && cmPartnersQuest.nTorch == 0
RemoveItem cmTorch02 1 Set torch to 0
elseif torch == 1 && IsSneaking == 1
RemoveItem cmTorch02 1 Set torch to 0
endif
- TRAINING - Time-delayed levelup scripting
Set npclevel to GetLevel Set pclevel to Player.GetLevel Set leveldiff to ( pclevel - npclevel )
if follow == 1 && train == 0 && leveldiff >= 2
Set train to 1
endif
if follow == 1 && train == 1
Set trainday to GameDay ; Sets up a Day Counter. Set trainhour to GameHour if trainhour > 23.5 Set trainhour to 0 endif Set traindayspast to 0 Set traindone to leveldiff Set train to 2
endif
if follow == 1 && train == 2
if trainday != GameDay if trainhour < GameHour Set trainday to GameDay Set traindayspast to ( traindayspast + 1 ) ; Day Counter counts the number of days. When the number of days equal to the number of training days required, variables are reset to zero and the task can be performed again. if traindayspast != traindone ; If training has not been completed, conduct training. Set levelup to 1 endif endif endif
endif
if follow == 1 && train == 2
if levelup == 1
Set npclevel to ( npclevel + 1 ) Set nlevel to npclevel
if nlevel == 2 SetLevel, 2 elseif nlevel == 3 SetLevel, 3 elseif nlevel == 4 SetLevel, 4 elseif nlevel == 5 SetLevel, 5 elseif nlevel == 6 SetLevel, 6 elseif nlevel == 7 SetLevel, 7 elseif nlevel == 8 SetLevel, 8 elseif nlevel == 9 SetLevel, 9 elseif nlevel == 10 SetLevel, 10 elseif nlevel == 11 SetLevel, 11 elseif nlevel == 12 SetLevel, 12 elseif nlevel == 13 SetLevel, 13 elseif nlevel == 14 SetLevel, 14 elseif nlevel == 15 SetLevel, 15 elseif nlevel == 16 SetLevel, 16 elseif nlevel == 17 SetLevel, 17 elseif nlevel == 18 SetLevel, 18 elseif nlevel == 19 SetLevel, 19 elseif nlevel == 20 SetLevel, 20 elseif nlevel == 21 SetLevel, 21 elseif nlevel == 22 SetLevel, 22 elseif nlevel == 23 SetLevel, 23 elseif nlevel == 24 SetLevel, 24 elseif nlevel == 25 SetLevel, 25 elseif nlevel == 26 SetLevel, 26 elseif nlevel == 27 SetLevel, 27 elseif nlevel == 28 SetLevel, 28 elseif nlevel == 29 SetLevel, 29 elseif nlevel == 30 SetLevel, 30 elseif nlevel == 31 SetLevel, 31 elseif nlevel == 32 SetLevel, 32 elseif nlevel == 33 SetLevel, 33 elseif nlevel == 34 SetLevel, 34 elseif nlevel == 35 SetLevel, 35 elseif nlevel == 36 SetLevel, 36 elseif nlevel == 37 SetLevel, 37 elseif nlevel == 38 SetLevel, 38 elseif nlevel == 39 SetLevel, 39 elseif nlevel == 40 SetLevel, 40 elseif nlevel == 41 SetLevel, 41 elseif nlevel == 42 SetLevel, 42 elseif nlevel == 43 SetLevel, 43 elseif nlevel == 44 SetLevel, 44 elseif nlevel == 45 SetLevel, 45 elseif nlevel == 46 SetLevel, 46 elseif nlevel == 47 SetLevel, 47 elseif nlevel == 48 SetLevel, 48 elseif nlevel == 49 SetLevel, 49 elseif nlevel == 50 SetLevel, 50
endif
; NPC Skill Increases
; Weapons
Set npcweapon to GetWeaponSkillType Set pcweapon to Player.GetWeaponSkillType
if npcweapon == 0 Set npchandtohand to ( npchandtohand + 1 ) elseif npcweapon == 1 Set npcblade to ( npcblade + 1 ) elseif npcweapon == 2 Set npcblunt to ( npcblunt + 1 ) elseif npcweapon == 3 Set npcmarksman to ( npcmarksman + 1 ) endif
if pcweapon == 0 Set npchandtohand to ( npchandtohand + 1 ) elseif pcweapon == 1 Set npcblade to ( npcblade + 1 ) elseif pcweapon == 2 Set npcblunt to ( npcblunt + 1 ) elseif pcweapon == 3 Set npcmarksman to ( npcmarksman + 1 ) endif
; Armor
Set npcarmor to GetArmorRatingUpperBody Set pcarmor to Player.GetArmorRatingUpperBody
if npcarmor == 1 Set npclightarmor to ( npclightarmor + 1 ) elseif npcarmor == 2 Set npcheavyarmor to ( npcheavyarmor + 1 ) endif
if pcarmor == 1 Set npclightarmor to ( npclightarmor + 1 ) elseif pcarmor == 2 Set npcheavyarmor to ( npcheavyarmor + 1 ) endif
; Magic
if npcdestruction >= npcalteration if npcdestruction >= npcillusion if npcdestruction >= npcconjuration if npcdestruction >= npcmysticism if npcdestruction >= npcrestoration Set npcdestruction to ( npcdestruction + 1 ) endif endif endif endif endif
if npcalteration >= npcdestruction if npcalteration >= npcillusion if npcalteration >= npcconjuration if npcalteration >= npcmysticism if npcalteration >= npcrestoration Set npcalteration to ( npcalteration + 1 ) endif endif endif endif endif
if npcillusion >= npcalteration if npcillusion >= npcdestruction if npcillusion >= npcconjuration if npcillusion >= npcmysticism if npcillusion >= npcrestoration Set npcillusion to ( npcillusion + 1 ) endif endif endif endif endif
if npcconjuration >= npcalteration if npcconjuration >= npcillusion if npcconjuration >= npcdestruction if npcconjuration >= npcmysticism if npcconjuration > npcrestoration Set npcconjuration to ( npcconjuration + 1 ) endif endif endif endif endif
if npcmysticism >= npcalteration if npcmysticism >= npcillusion if npcmysticism >= npcconjuration if npcmysticism >= npcdestruction if npcmysticism >= npcrestoration Set npcmysticism to ( npcmysticism + 1 ) endif endif endif endif endif
if npcrestoration >= npcalteration if npcrestoration >= npcillusion if npcrestoration >= npcconjuration if npcrestoration >= npcmysticism if npcrestoration >= npcdestruction Set npcrestoration to ( npcrestoration + 1 ) endif endif endif endif endif
; Stealth
if npcsneak >= npcacrobatics if npcsneak >= npcsecurity if npcsneak >= npcblock Set npcsneak to ( npcsneak + 1 ) endif endif endif
if npcsecurity >= npcacrobatics if npcsecurity >= npcsneak if npcsecurity >= npcblock Set npcsecurity to ( npcsecurity + 1 ) endif endif endif
if npcacrobatics >= npcsneak if npcacrobatics >= npcsecurity if npcacrobatics >= npcblock Set npcacrobatics to ( npcacrobatics + 1 ) endif endif endif
if npcblock >= npcacrobatics if npcblock >= npcsneak if npcblock >= npcsecurity Set npcblock to ( npcblock + 1 ) endif endif endif
; Attributes
if npctype == 1 ; For Combat NPC's
Set npchealth to ( npchealth + 6 ) Set npcmagicka to ( npcmagicka + 1 )
Set npcendurance to ( npcendurance + 2 ) Set npcstrength to ( npcstrength + 2 ) Set npcathletics to ( npcathletics + 1 ) Set npcagility to ( npcagility + 1 ) Set npcspeed to ( npcspeed + 1 ) elseif npctype == 2 ; For Stealth NPC's
Set npchealth to ( npchealth + 4 ) Set npcmagicka to ( npcmagicka + 2 )
Set npcluck to ( npcluck + 1 ) Set npcspeed to ( npcspeed + 2 ) Set npcagility to ( npcagility + 2 ) Set npcstrength to ( npcstrength + 1 ) Set npcendurance to ( npcendurance + 1 ) elseif npctype == 3 ; For Magic NPC's
Set npchealth to ( npchealth + 4 ) Set npcmagicka to ( npcmagicka + 3 )
Set npcpersonality to ( npcpersonality + 1 ) Set npcwillpower to ( npcwillpower + 2 ) Set npcintelligence to ( npcintelligence + 2 ) Set npcspeed to ( npcspeed + 1 ) Set npcstrength to ( npcstrength + 1 ) endif
SetActorValue Strength, npcstrength SetActorValue Willpower, npcwillpower SetActorValue Intelligence, npcintelligence SetActorValue Agility, npcagility SetActorValue Endurance, npcendurance SetActorValue Personality, npcpersonality SetActorValue Luck, npcluck SetActorValue Speed, npcspeed SetActorValue Athletics, npcathletics
SetActorValue Health, npchealth SetActorValue Magicka, npcmagicka SetActorValue Fatigue, npcfatigue
SetActorValue HandtoHand, npchandtohand SetActorValue Blade, npcblade SetActorValue Blunt, npcblunt SetActorValue Marksman, npcmarksman
SetActorValue LightArmor, npclightarmor SetActorValue HeavyArmor, npcheavyarmor
SetActorValue Destruction, npcdestruction SetActorValue Alteration, npcalteration SetActorValue Illusion, npcillusion SetActorValue Conjuration, npcconjuration SetActorValue Mysticism, npcmysticism SetActorValue Restoration, npcrestoration
SetActorValue Sneak, npcsneak SetActorValue Security, npcsecurity SetActorValue Acrobatics, 100 SetActorValue Block, npcblock
Set pclevel to Player.GetLevel Set leveldiff to ( pclevel - npclevel )
Set levelreport to 1 Message "Your partner has gained a new level." 10
if nlevel >= 50 ; Check to see if NPC has reached highest level. Set trainday to 0 Set traindayspast to 0 Set trainhour to 0 Set traindone to 0 Set train to 4 Set levelup to 2 Set levelreport to 2 Message "Your partner has become a master and no longer needs training," 10
elseif leveldiff < 2 ; Check to see if we need to continue training. Set trainday to 0 Set traindayspast to 0 Set trainhour to 0 Set traindone to 0 Set train to 0 Set levelup to 0
elseif leveldiff >= 2 Set levelup to 0 endif endif
endif
End
- AI PACKAGE CONTROLS
Begin OnPackageStart "cmInventory"
if partner == 2 && IsInCombat != 1
Set refnpc to GetSelf Set regulator to 1 Set refbox to PlaceAtMe cmPartnersBox 1 0 0 refbox.SetOwnership Set inventory to 1
endif
End
Begin OnPackageStart "cmPickLockContainer"
SetPackDuration 2
End
Begin OnPackageDone "cmPickLockContainer" ; Commands NPC to rejoin Player after lockpicking'
AddScriptPackage "cmFollowPlayer"
End
- MENU MODE
Begin MenuMode 1009 ; Dialogue Menu - Reset quest and local variables
Set cmPartnersQuest.nParty to 0 Set command to 0 Set levelreport to 0
End
Begin MenuMode 1012 ; SleepWait Menu - Restores health, fatigue, and magicka to NPC when the player waits or sleeps.
if follow == 1
if GetActorValue Health < npchealth SetActorValue Health, npchealth elseif GetActorValue Fatigue < npcfatigue SetActorValue Magicka, npcfatigue elseif GetActorValue Magicka < npcmagicka SetActorValue Magicka, npcmagicka endif
endif
End
Begin OnReset ; Resets stats if 72 hour automatic cell refresh resets to default values while player is away. Not sure if this is necessary. Never tested it.
if GetActorValue Acrobatics < 100
SetLevel, npclevel SetActorValue Strength, npcstrength SetActorValue Willpower, npcwillpower SetActorValue Intelligence, npcintelligence SetActorValue Agility, npcagility SetActorValue Endurance, npcendurance SetActorValue Personality, npcpersonality SetActorValue Luck, npcluck SetActorValue Speed, npcspeed SetActorValue Athletics, npcathletics SetActorValue Health, npchealth SetActorValue Magicka, npcmagicka SetActorValue Fatigue, npcfatigue SetActorValue Blade, npcblade SetActorValue Blunt, npcblunt SetActorValue Marksman, npcmarksman SetActorValue HandtoHand, npchandtohand SetActorValue HeavyArmor, npcheavyarmor SetActorValue LightArmor, npclightarmor SetActorValue Destruction, npcdestruction SetActorValue Alteration, npcalteration SetActorValue Illusion, npcillusion SetActorValue Conjuration, npcconjuration SetActorValue Mysticism, npcmysticism SetActorValue Restoration, npcrestoration SetActorValue Sneak, npcsneak SetActorValue Security, npcsecurity SetActorValue Acrobatics, 150 SetActorValue Block, npcblock
endif
End