About this mod
Allows the player to summon a Shadow Clone of themselves.
- Requirements
- Permissions and credits
- Changelogs
This mod adds a new master illusion spell, Shadow Clone on Self, that will summon a copy of the of player.
- The summoned clone will have equal stats to the player and will wear their equipped armor.
- The clone will use copies of the spells and/or weapons that were equipped by the player when the spell was cast.
- Additionally, through the lesser power, Shadow Clone on Self - Select Shout, the player can give the clone access to one of their shouts. This choice is remembered by the game so you don't need to recast the power every time you summon a clone. Players can change or remove the shout by recasting the power. Only one shout can be selected at a time.
There are three versions of the mod:
- A Standalone, No-Requirements Version (For Vanilla/Non-Requiem Modlists)
- A Requiem Version
- A Requiem - Magic Redone Version
In the Requiem - Magic Redone version, the spell also benefits from shadow magic perks, so you can summon two clones at the same time if you have the perks.
Mod is open perms. Do what you want with it.
Technical Details:
The mod works by summoning a naked, headless NPC (sex of the clone is the same as the player's) and then, via a script attached to a magic effect, equipping it with the caster's armor, spell/weapon.
Then, to make the clone have identical stats to the caster, actor values are carried over from the player.
I chose this implementation over spawning a duplicate of the player as, from my experience, that can completely break the game.
See the actual script source below for more details. For developers, ignore the source files that come with mod (they are outdated) and refer to ones below instead (or use Champollion on the .pex files).
Main Shadow Clone Script:
Scriptname mad_ShadowClone extends ActiveMagicEffect
Actor Property PlayerRef Auto
Perk Property IllPerk Auto
formlist property Shout_FormList auto
GlobalVariable Property useShoutGlobal auto
Event OnEffectStart(Actor akTarget, Actor akCaster)
akCaster.SetScale(PlayerRef.GetActorBase().GetHeight())
akCaster.AddItem(PlayerRef.GetEquippedWeapon(true))
akCaster.AddItem(PlayerRef.GetEquippedWeapon())
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(40))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(32))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(31))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(42))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(30))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(33))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(34))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(36))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(35))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(37))
akCaster.EquipItem(PlayerRef.GetEquippedArmorInSlot(39))
akCaster.AddSpell(PlayerRef.GetEquippedSpell(1))
akCaster.AddSpell(PlayerRef.GetEquippedSpell(0))
akCaster.EquipSpell(PlayerRef.GetEquippedSpell(0),0)
akCaster.EquipSpell(PlayerRef.GetEquippedSpell(0),1)
akCaster.AddShout(Shout_FormList.GetAt(0) as Shout)
akCaster.ForceAv("Health", (PlayerRef.GetAV("Health")/PlayerRef.GetAVPercentage("Health")))
akCaster.ForceAv("Magicka", ((PlayerRef.GetAV("Magicka")/PlayerRef.GetAVPercentage("Magicka"))))
akCaster.ForceAv("Stamina", (PlayerRef.GetAV("Stamina")/PlayerRef.GetAVPercentage("Stamina")))
akCaster.ForceAv("Alteration", (PlayerRef.GetAV("Alteration")))
akCaster.ForceAv("Conjuration", (PlayerRef.GetAV("Conjuration")))
akCaster.ForceAv("Destruction", (PlayerRef.GetAV("Destruction")))
akCaster.ForceAv("Illusion", (PlayerRef.GetAV("Illusion")))
akCaster.ForceAv("Restoration", (PlayerRef.GetAV("Restoration")))
akCaster.ForceAv("OneHanded", (PlayerRef.GetAV("OneHanded")))
akCaster.ForceAv("TwoHanded", (PlayerRef.GetAV("TwoHanded")))
akCaster.ForceAv("Block", (PlayerRef.GetAV("Block")))
akCaster.ForceAv("HeavyArmor", (PlayerRef.GetAV("HeavyArmor")))
akCaster.ForceAv("LightArmor", (PlayerRef.GetAV("LightArmor")))
akCaster.ForceAv("Marksman", (PlayerRef.GetAV("Marksman")))
akCaster.ForceAv("Sneak", (PlayerRef.GetAV("Sneak")))
akCaster.ForceAv("DamageResist", (PlayerRef.GetAV("DamageResist")))
akCaster.ForceAv("FireResist", (PlayerRef.GetAV("FireResist")))
akCaster.ForceAv("ElectricResist", (PlayerRef.GetAV("ElectricResist")))
akCaster.ForceAv("FrostResist", (PlayerRef.GetAV("FrostResist")))
akCaster.ForceAv("MagicResist", (PlayerRef.GetAV("MagicResist")))
akCaster.ForceAv("Poisonresist", (PlayerRef.GetAV("Poisonresist")))
akCaster.ForceAv("OneHandedMod", (PlayerRef.GetAV("OneHandedMod")))
akCaster.ForceAv("OneHandedPowerMod", (PlayerRef.GetAV("OneHandedPowerMod")))
akCaster.ForceAv("TwoHandedMod", (PlayerRef.GetAV("TwoHandedMod")))
akCaster.ForceAv("TwoHandedPowerMod", (PlayerRef.GetAV("TwoHandedPowerMod")))
akCaster.ForceAv("MarksmanMod", (PlayerRef.GetAV("MarksmanMod")))
akCaster.ForceAv("MarksmanPowerMod", (PlayerRef.GetAV("MarksmanPowerMod")))
akCaster.ForceAv("LightArmorMod", (PlayerRef.GetAV("LightArmorMod")))
akCaster.ForceAv("HeavyArmorMod", (PlayerRef.GetAV("HeavyArmorMod")))
akCaster.ForceAv("Magickarate", (PlayerRef.GetAV("Magickarate")))
akCaster.ForceAv("Absorbchance", (PlayerRef.GetAV("Absorbchance")))
akCaster.ForceAv("weaponspeedmult", (PlayerRef.GetAV("weaponspeedmult")))
akCaster.ForceAv("Unarmeddamage", (PlayerRef.GetAV("Unarmeddamage")))
endEvent
Event OnEffectFinish(Actor akTarget, Actor akCaster)
akCaster.RemoveShout(Shout_FormList.GetAt(0) as Shout)
endEvent
Select Shout Script:
scriptName mad_CloneAddShout extends ActiveMagicEffect
;-- Properties --------------------------------------
message property clone_Message auto
message property clone_MessageNo auto
formlist property Shout_FormList auto
Spell property mEffect1 auto
MagicEffect property mEffect2 auto
GlobalVariable Property useShoutGlobal auto
;-- Variables ---------------------------------------
;-- Functions ---------------------------------------
; Skipped compiler generated GotoState
function OnEffectStart(Actor akTarget, Actor akCaster)
bool addShout = true
if Game.GetPlayer().HasSpell(mEffect1)
addShout = false
clone_MessageNo.Show(0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000)
endif
if addShout == true
Shout_FormList.Revert()
Shout_FormList.AddForm((Game.GetPlayer().GetEquippedShout()) as form)
clone_Message.Show(0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000)
endif
endFunction
; Skipped compiler generated GetState
The Script to add "Shadow Clone on Self - Select Shout" to the player from the spell tome is from Requiem - Magic Redone.Force AV is used as it gets around having to give the clone any active perks/spells the player has that would modify damage, resistances, or armor penetration. For instance, if the player has an armor spell active or a matching set armor bonus perk, the clone will inherit the AR from it through the scripts without needing to jump through any hoops.
Importantly, force AV overwrites the current AV values and does not stack on top of them. So if the clone has 300 armor from the equipped items, (while the player has 500 from the same items due to perks), the force AV script will set the clone's armor to exactly 500.
My other Mods:
Redeeming Fultheim - A Blades Quest Addon - 90+ New lines of dialogue for Delphine, Esbern, and Fultheim. Adds a short, fully voiced quest to convince Fultheim to rejoin the Blades.
The Taste of Death - Quest Addon - 50+ New lines of dialogue. Adds new dialogue, enemies, and gameplay to the vanilla quest "The Taste of Death". Confront the cult of Namira and bring them to justice.
Boethiah's Calling - Alternate Questline - Adds 70+ lines of fully voiced dialogue. Alternate questline to obtain the Ebony Mail. Now a "friend" can trick and try to sacrifice you!
Mephala's Curse - Whispering Door Quest Addon - Adds a functioning curse to the Ebony Blade and new world encounters. Now the player must find a way to destroy the Blade or succumbing to Mephala is inevitable.
Mehrunes Dagon's Shrine Unlocked - Pieces of the Past Alternate Ending - Voiced - 40 new lines of dialogue. Adds methods to enter Mehrunes Dagon's Shrine without helping Silus Vesuius or having to side with Mehrunes Dagon. Additionally, you can reforge the Razer yourself without Dagon if skilled enough.
Requiem - Auto NPC Patcher - Makes any mod playable in Requiem. A Synthesis Patcher and SPID configuration that adjusts the stats, perks, and levels of NPCs added by any mod to be in line with Requiem's Balancing.
Requiem - Unofficial Reqtificator Lite - My recreation of the Reqtificator in Synthesis. Allows you to get over the 254 master limit easily.
Engaging Combat - Keep Combat Dynamic at Higher Levels - A lightweight, highly compatible combat mod designed to prevent gameplay from becoming boring as players reach high levels. Perfect for Requiem or any 'unleveled' Skyrim load order.
My Requiem Patches:
Requiem - Reqtificator 254 Master Limit Workaround - xEdit and Mod Organizer
Requiem - Ryn's Mehrunes Dagon's Shrine
Requiem - Vampire Armor Expansion - Vampire Clothing Expansion
Attacko's Daedra Integration and Rebalance Series - COMPATIBLE WITH REQUIEM - My series of mods that rebalances and integrates Attacko's Daedra into the world in a lore-friendly way.
Abhorrent Behemoth • Anthropoid Daedroth • Bipedal Charyboid • Fire-Tounged Daedroths • Sulking Twilight