Back to blog
Apr 27, 2024
6 min read

Skyrim: Weapon Arts Scripts

How to make Weapon Arts that look like Bloodskal Blade?

Steps:

  1. Create a new Magic Effect —> Create a new Spell —> Attach the Magic Efeect to this Spell. (Type:Ability;Self)

  2. Create a new Perk —> Attach Perk to a weapon —> When weapon equips, the game gives the Perk to Player —> The Perk initiates another another Weapon Arts Spells to Player.

  3. Create the actual Weapon Arts Spells. Just copy Vanilla Bloodskal Blade Spells.Make two of them, one is for Horizontal, another is Vertical. Those spells will shoot shoot Magic Waves when the effects start. When the Magic Waves hit NPC, they deal damage to them.

More detailed tutorial: Link

Two versions:

  • Lite version: Good for Two-haned Greatsword. The code is from the Vanilla game.
  • Complex version: Used for One-handed weapons and Two-handed Axes and more. Code is from @Azazellz.

Weapon Arts (Lite):

1
Scriptname MyWeaponArtsScript extends ActiveMagicEffect
2
3
Spell Property SpellHoriz auto
4
Spell Property SpellVert auto
5
6
Actor SelfRef
7
8
Event OnEffectStart(Actor akTarget, Actor akCaster)
9
SelfRef = akCaster
10
registerForAnimationEvent(SelfRef, "AttackPowerStanding_FXstart")
11
registerForAnimationEvent(SelfRef, "AttackPowerRight_FXstart")
12
registerForAnimationEvent(SelfRef, "AttackPowerLeft_FXstart")
13
registerForAnimationEvent(SelfRef, "AttackPowerBackward_FXstart")
14
registerForAnimationEvent(SelfRef, "AttackPowerForward_FXstart")
15
endEvent
16
17
Event OnEffectFinish(Actor akTarget, Actor akCaster)
18
;;Automatically Unregisterd when Ability Removed
19
ENDEVENT
20
21
Event OnAnimationEvent(ObjectReference akSource, string EventName)
22
if (eventName == "AttackPowerRight_FXstart") || (eventName == "AttackPowerLeft_FXstart") || (eventName == "AttackPowerBackward_FXstart")
23
SpellHoriz.cast(SelfRef)
24
25
elseif (eventName == "AttackPowerStanding_FXstart") || (eventName == "AttackPowerForward_FXstart")
26
SpellVert.cast(SelfRef)
27
endif
28
endEVENT

Explain:

Whenever the attack event happens, the game listen to Player’s animation types, and apply a magic effect to Player. There are two Properties:

  • SpellHoriz - Link it to DLC2BloodskalBladeSpellHoriz
  • SpellVert - Link it to DLC2BloodskalBladeSpellVert

Complex Version:

1
scriptName TheBloodskalBladeFullScript extends activemagiceffect
2
3
actor property selfref auto hidden
4
5
spell property OneHandedSpellForward auto
6
spell property OneHandedSpellStand auto
7
spell property OneHandedSpellSide auto
8
spell property OneHandedSpellBack auto
9
10
spell property OneHandedSpellForwardLeft auto
11
spell property OneHandedSpellStandLeft auto
12
spell property OneHandedSpellSideLeft auto
13
spell property OneHandedSpellBackLeft auto
14
15
spell property SpellForward auto
16
spell property SpellStand auto
17
spell property SpellSide auto
18
spell property SpellBack auto
19
20
spell property AxeSpellForward auto
21
spell property AxeSpellStand auto
22
spell property AxeSpellSide auto
23
spell property AxeSpellBack auto
24
25
spell property UnarmedSpellForward auto
26
spell property UnarmedSpellStand auto
27
spell property UnarmedSpellSide auto
28
spell property UnarmedSpellBack auto
29
30
spell property SpellBash auto
31
32
Float property Direction auto
33
Float property Speed auto
34
35
36
function OnEffectStart(actor akTarget, actor akCaster)
37
38
selfref = akCaster
39
self.registerForAnimationEvent(akCaster as objectreference, "PowerAttack_Start_End")
40
self.registerForAnimationEvent(akCaster as objectreference, "AttackPowerStanding_FXStart")
41
self.registerForAnimationEvent(akCaster as objectreference, "AttackPowerRight_FXStart")
42
self.registerForAnimationEvent(akCaster as objectreference, "AttackPowerLeft_FXStart")
43
self.registerForAnimationEvent(akCaster as objectreference, "AttackPowerBackward_FXStart")
44
self.registerForAnimationEvent(akCaster as objectreference, "AttackPowerForward_FXStart")
45
self.registerForAnimationEvent(akCaster as objectreference, "bashRelease")
46
self.registerForAnimationEvent(akCaster as objectreference, "WeaponSwing")
47
self.registerForAnimationEvent(akCaster as objectreference, "WeaponLeftSwing")
48
endFunction
49
50
function OnAnimationEvent(objectreference akSource, String EventName)
51
52
if EventName == "bashRelease"
53
SpellBash.Cast(selfref as objectreference, none)
54
elseIf EventName == "AttackPowerStanding_FXStart"
55
SpellStand.Cast(selfref as objectreference, none)
56
elseIf EventName == "AttackPowerForward_FXStart"
57
if selfref.IsSprinting()
58
SpellForward.Cast(selfref as objectreference, none)
59
endIf
60
elseIf EventName == "AttackPowerRight_FXStart" || EventName == "AttackPowerLeft_FXStart"
61
SpellSide.Cast(selfref as objectreference, none)
62
elseIf EventName == "AttackPowerBackward_FXStart"
63
SpellBack.Cast(selfref as objectreference, none)
64
elseIf EventName == "WeaponSwing"
65
Direction = selfref.GetAnimationVariableFloat("Direction")
66
Speed = selfref.GetAnimationVariableFloat("Speed")
67
Bool PowerAttack = selfref.GetAnimationVariableBool("bAllowRotation")
68
if PowerAttack
69
if selfref.GetEquippedItemType(0) == 6
70
if Speed == 0.000000
71
AxeSpellStand.Cast(selfref as objectreference, none)
72
elseIf Speed > 0.000000
73
if Direction == 1.00000 || Direction == 0.000000
74
if selfref.IsSprinting() == 0
75
AxeSpellForward.Cast(selfref as objectreference, none)
76
endIf
77
elseIf Direction == 0.250000
78
AxeSpellSide.Cast(selfref as objectreference, none)
79
elseIf Direction == 0.750000
80
AxeSpellSide.Cast(selfref as objectreference, none)
81
elseIf Direction == 0.500000
82
AxeSpellBack.Cast(selfref as objectreference, none)
83
endIf
84
endIf
85
elseIf selfref.GetEquippedItemType(1) == 1 || selfref.GetEquippedItemType(1) == 2 || selfref.GetEquippedItemType(1) == 3 || selfref.GetEquippedItemType(1) == 4
86
if Speed == 0.000000
87
OneHandedSpellStand.Cast(selfref as objectreference, none)
88
elseIf Speed > 0.000000
89
if Direction == 1.00000 || Direction == 0.000000
90
if selfref.IsSprinting() == 0
91
OneHandedSpellForward.Cast(selfref as objectreference, none)
92
endIf
93
elseIf Direction == 0.250000
94
OneHandedSpellSide.Cast(selfref as objectreference, none)
95
elseIf Direction == 0.750000
96
OneHandedSpellSide.Cast(selfref as objectreference, none)
97
elseIf Direction == 0.500000
98
OneHandedSpellBack.Cast(selfref as objectreference, none)
99
endIf
100
endIf
101
elseIf selfref.GetEquippedItemType(1) == 0
102
if Speed == 0.000000
103
UnarmedSpellStand.Cast(selfref as objectreference, none)
104
elseIf Speed > 0.000000
105
if Direction == 1.00000 || Direction == 0.000000
106
UnarmedSpellForward.Cast(selfref as objectreference, none)
107
elseIf Direction == 0.250000
108
UnarmedSpellSide.Cast(selfref as objectreference, none)
109
elseIf Direction == 0.750000
110
UnarmedSpellSide.Cast(selfref as objectreference, none)
111
elseIf Direction == 0.500000
112
UnarmedSpellBack.Cast(selfref as objectreference, none)
113
endIf
114
endIf
115
endIf
116
endIf
117
elseIf EventName == "WeaponLeftSwing"
118
Direction = selfref.GetAnimationVariableFloat("Direction")
119
Speed = selfref.GetAnimationVariableFloat("Speed")
120
Bool PowerAttack = selfref.GetAnimationVariableBool("bAllowRotation")
121
if PowerAttack
122
if selfref.GetEquippedItemType(0) == 6
123
if Speed == 0.000000
124
AxeSpellStand.Cast(selfref as objectreference, none)
125
elseIf Speed > 0.000000
126
if Direction == 1.00000 || Direction == 0.000000
127
if selfref.IsSprinting() == 0
128
AxeSpellForward.Cast(selfref as objectreference, none)
129
endIf
130
elseIf Direction == 0.250000
131
AxeSpellSide.Cast(selfref as objectreference, none)
132
elseIf Direction == 0.750000
133
AxeSpellSide.Cast(selfref as objectreference, none)
134
elseIf Direction == 0.500000
135
AxeSpellBack.Cast(selfref as objectreference, none)
136
endIf
137
endIf
138
elseIf selfref.GetEquippedItemType(1) == 1 || selfref.GetEquippedItemType(1) == 2 || selfref.GetEquippedItemType(1) == 3 || selfref.GetEquippedItemType(1) == 4
139
if Speed == 0.000000
140
OneHandedSpellStandLeft.Cast(selfref as objectreference, none)
141
elseIf Speed > 0.000000
142
if Direction == 1.00000 || Direction == 0.000000
143
if selfref.IsSprinting() == 0
144
OneHandedSpellForwardLeft.Cast(selfref as objectreference, none)
145
endIf
146
elseIf Direction == 0.250000
147
OneHandedSpellSideLeft.Cast(selfref as objectreference, none)
148
elseIf Direction == 0.750000
149
OneHandedSpellSideLeft.Cast(selfref as objectreference, none)
150
elseIf Direction == 0.500000
151
OneHandedSpellBackLeft.Cast(selfref as objectreference, none)
152
endIf
153
endIf
154
elseIf selfref.GetEquippedItemType(1) == 0
155
if Speed == 0.000000
156
UnarmedSpellStand.Cast(selfref as objectreference, none)
157
elseIf Speed > 0.000000
158
if Direction == 1.00000 || Direction == 0.000000
159
UnarmedSpellForward.Cast(selfref as objectreference, none)
160
elseIf Direction == 0.250000
161
UnarmedSpellSide.Cast(selfref as objectreference, none)
162
elseIf Direction == 0.750000
163
UnarmedSpellSide.Cast(selfref as objectreference, none)
164
elseIf Direction == 0.500000
165
UnarmedSpellBack.Cast(selfref as objectreference, none)
166
endIf
167
endIf
168
endIf
169
endIf
170
endIf
171
endFunction
172
173
function OnEffectFinish(actor akTarget, actor akCaster)
174
175
self.unregisterForAnimationEvent(akCaster as objectreference, "PowerAttack_Start_End")
176
self.unregisterForAnimationEvent(akCaster as objectreference, "AttackPowerStanding_FXStart")
177
self.unregisterForAnimationEvent(akCaster as objectreference, "AttackPowerRight_FXStart")
178
self.unregisterForAnimationEvent(akCaster as objectreference, "AttackPowerLeft_FXStart")
179
self.unregisterForAnimationEvent(akCaster as objectreference, "AttackPowerBackward_FXStart")
180
self.unregisterForAnimationEvent(akCaster as objectreference, "AttackPowerForward_FXStart")
181
self.unregisterForAnimationEvent(akCaster as objectreference, "bashRelease")
182
self.unregisterForAnimationEvent(akCaster as objectreference, "WeaponSwing")
183
self.unregisterForAnimationEvent(akCaster as objectreference, "WeaponLeftSwing")
184
endFunction

Note: This version not works for Greatsword.

Some of my modshave Weapon Arts: