SQL synchronization
This commit is contained in:
parent
412d90048d
commit
53761b952a
@ -312,15 +312,18 @@
|
||||
// Baby Star Gladiator (Union)
|
||||
4238,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2
|
||||
//================================
|
||||
// Note: Star Emperor and Soul Reaper bonus stats are unknown. Using Star Gladiator and Soul Linker's
|
||||
// bonus stats for now until I know the official ones.
|
||||
//
|
||||
// Star Emperor
|
||||
4239,1,5,0,0,2,0,4,1,6,0,5,1,2,0,4,6,3,0,1,5,2,0,1,3,4,0,5,0,2,5,1,0,0,5,2,6,3,5,1,0,2,3,1,0,5,0,2,1,0,5,0,0,0,0,0,1,0,0,2,0
|
||||
4239,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2
|
||||
// Soul Reaper
|
||||
4240,4,5,0,0,4,3,5,0,0,0,5,4,2,0,5,4,3,0,1,5,2,0,0,3,4,5,0,1,2,5,4,0,0,5,2,0,3,5,4,0,2,3,1,4,5,0,2,0,4,5,0,2,0,4,0,0,0,0,4,0
|
||||
4240,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5
|
||||
// Baby Star Emperor
|
||||
4241,1,5,0,0,2,0,4,1,6,0,5,1,2,0,4,6,3,0,1,5,2,0,1,3,4,0,5,0,2,5,1,0,0,5,2,6,3,5,1,0,2,3,1,0,5,0,2,1,0,5,0,0,0,0,0,1,0,0,2,0
|
||||
4241,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2
|
||||
// Baby Soul Reaper
|
||||
4242,4,5,0,0,4,3,5,0,0,0,5,4,2,0,5,4,3,0,1,5,2,0,0,3,4,5,0,1,2,5,4,0,0,5,2,0,3,5,4,0,2,3,1,4,5,0,2,0,4,5,0,2,0,4,0,0,0,0,4,0
|
||||
4242,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5
|
||||
// Star Emperor (Union)
|
||||
4243,1,5,0,0,2,0,4,1,6,0,5,1,2,0,4,6,3,0,1,5,2,0,1,3,4,0,5,0,2,5,1,0,0,5,2,6,3,5,1,0,2,3,1,0,5,0,2,1,0,5,0,0,0,0,0,1,0,0,2,0
|
||||
4243,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2
|
||||
// Baby Star Emperor (Union)
|
||||
4244,1,5,0,0,2,0,4,1,6,0,5,1,2,0,4,6,3,0,1,5,2,0,1,3,4,0,5,0,2,5,1,0,0,5,2,6,3,5,1,0,2,3,1,0,5,0,2,1,0,5,0,0,0,0,0,1,0,0,2,0
|
||||
4244,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2
|
||||
|
@ -28317,163 +28317,6 @@ Body:
|
||||
Element: Weapon
|
||||
Requires:
|
||||
SpCost: 1
|
||||
- Id: 2574
|
||||
Name: SJ_LIGHTOFMOON
|
||||
Description: Light of Moon
|
||||
MaxLevel: 1
|
||||
- Id: 2575
|
||||
Name: SJ_LUNARSTANCE
|
||||
Description: Lunar Stance
|
||||
MaxLevel: 1
|
||||
- Id: 2576
|
||||
Name: SJ_FULLMOONKICK
|
||||
Description: Full Moon Kick
|
||||
MaxLevel: 1
|
||||
- Id: 2577
|
||||
Name: SJ_LIGHTOFSTAR
|
||||
Description: Light of Star
|
||||
MaxLevel: 1
|
||||
- Id: 2578
|
||||
Name: SJ_STARSTANCE
|
||||
Description: Star Stance
|
||||
MaxLevel: 1
|
||||
- Id: 2579
|
||||
Name: SJ_NEWMOONKICK
|
||||
Description: New Moon Kick
|
||||
MaxLevel: 1
|
||||
- Id: 2580
|
||||
Name: SJ_FLASHKICK
|
||||
Description: Flash Kick
|
||||
MaxLevel: 1
|
||||
- Id: 2581
|
||||
Name: SJ_STAREMPEROR
|
||||
Description: Star Emperor
|
||||
MaxLevel: 1
|
||||
- Id: 2582
|
||||
Name: SJ_NOVAEXPLOSING
|
||||
Description: Nova Explosion
|
||||
MaxLevel: 1
|
||||
Type: Misc
|
||||
- Id: 2583
|
||||
Name: SJ_UNIVERSESTANCE
|
||||
Description: Universe Stance
|
||||
MaxLevel: 1
|
||||
- Id: 2584
|
||||
Name: SJ_FALLINGSTAR
|
||||
Description: Falling Star
|
||||
MaxLevel: 1
|
||||
- Id: 2585
|
||||
Name: SJ_GRAVITYCONTROL
|
||||
Description: Gravity Control
|
||||
MaxLevel: 1
|
||||
- Id: 2586
|
||||
Name: SJ_BOOKOFDIMENSION
|
||||
Description: Book of Dimension
|
||||
MaxLevel: 1
|
||||
- Id: 2587
|
||||
Name: SJ_BOOKOFCREATINGSTAR
|
||||
Description: Book of Creating Star
|
||||
MaxLevel: 1
|
||||
- Id: 2588
|
||||
Name: SJ_DOCUMENT
|
||||
Description: Document of Sun Moon and Star
|
||||
MaxLevel: 1
|
||||
- Id: 2589
|
||||
Name: SJ_PURIFY
|
||||
Description: Purification of Sun Moon and Star
|
||||
MaxLevel: 1
|
||||
- Id: 2590
|
||||
Name: SJ_LIGHTOFSUN
|
||||
Description: Light of Sun
|
||||
MaxLevel: 1
|
||||
- Id: 2591
|
||||
Name: SJ_SUNSTANCE
|
||||
Description: Sun Stance
|
||||
MaxLevel: 1
|
||||
- Id: 2592
|
||||
Name: SJ_SOLARBURST
|
||||
Description: Solar Burst
|
||||
MaxLevel: 1
|
||||
- Id: 2593
|
||||
Name: SJ_PROMINENCEKICK
|
||||
Description: Prominence Kick
|
||||
MaxLevel: 1
|
||||
- Id: 2594
|
||||
Name: SJ_FALLINGSTAR_ATK
|
||||
Description: Falling Star Attack
|
||||
MaxLevel: 1
|
||||
- Id: 2595
|
||||
Name: SJ_FALLINGSTAR_ATK2
|
||||
Description: Falling Star Attack 2
|
||||
MaxLevel: 1
|
||||
- Id: 2596
|
||||
Name: SP_SOULGOLEM
|
||||
Description: Golem's Soul
|
||||
MaxLevel: 1
|
||||
- Id: 2597
|
||||
Name: SP_SOULSHADOW
|
||||
Description: Shadow's Soul
|
||||
MaxLevel: 1
|
||||
- Id: 2598
|
||||
Name: SP_SOULFALCON
|
||||
Description: Falcon's Soul
|
||||
MaxLevel: 1
|
||||
- Id: 2599
|
||||
Name: SP_SOULFAIRY
|
||||
Description: Fairy's Soul
|
||||
MaxLevel: 1
|
||||
- Id: 2600
|
||||
Name: SP_CURSEEXPLOSION
|
||||
Description: Curse Explosion
|
||||
MaxLevel: 1
|
||||
- Id: 2601
|
||||
Name: SP_SOULCURSE
|
||||
Description: Soul Curse
|
||||
MaxLevel: 1
|
||||
- Id: 2602
|
||||
Name: SP_SPA
|
||||
Description: Espa
|
||||
MaxLevel: 1
|
||||
- Id: 2603
|
||||
Name: SP_SHA
|
||||
Description: Esha
|
||||
MaxLevel: 1
|
||||
- Id: 2604
|
||||
Name: SP_SWHOO
|
||||
Description: Eswhoo
|
||||
MaxLevel: 1
|
||||
- Id: 2605
|
||||
Name: SP_SOULUNITY
|
||||
Description: Soul Unity
|
||||
MaxLevel: 1
|
||||
- Id: 2606
|
||||
Name: SP_SOULDIVISION
|
||||
Description: Soul Division
|
||||
MaxLevel: 1
|
||||
- Id: 2607
|
||||
Name: SP_SOULREAPER
|
||||
Description: Soul Reaper
|
||||
MaxLevel: 1
|
||||
- Id: 2608
|
||||
Name: SP_SOULREVOLVE
|
||||
Description: Soul Revolution
|
||||
MaxLevel: 1
|
||||
- Id: 2609
|
||||
Name: SP_SOULCOLLECT
|
||||
Description: Soul Collect
|
||||
MaxLevel: 1
|
||||
- Id: 2610
|
||||
Name: SP_SOULEXPLOSION
|
||||
Description: Soul Explosion
|
||||
MaxLevel: 1
|
||||
- Id: 2611
|
||||
Name: SP_SOULENERGY
|
||||
Description: Soul Energy Research
|
||||
MaxLevel: 1
|
||||
- Id: 2612
|
||||
Name: SP_KAUTE
|
||||
Description: Kaute
|
||||
MaxLevel: 1
|
||||
- Id: 3001
|
||||
Name: KO_YAMIKUMO
|
||||
Description: Shadow Hiding
|
||||
|
@ -29444,22 +29444,7 @@ Body:
|
||||
Description: Light of Moon
|
||||
MaxLevel: 5
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 20000
|
||||
- Level: 2
|
||||
Time: 30000
|
||||
- Level: 3
|
||||
Time: 40000
|
||||
- Level: 4
|
||||
Time: 50000
|
||||
- Level: 5
|
||||
Time: 60000
|
||||
Requires:
|
||||
SpCost: 40
|
||||
- Id: 2575
|
||||
@ -29467,28 +29452,15 @@ Body:
|
||||
Description: Lunar Stance
|
||||
MaxLevel: 3
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Requires:
|
||||
SpCost: 10
|
||||
- Id: 2576
|
||||
Name: SJ_FULLMOONKICK
|
||||
Description: Full Moon Kick
|
||||
MaxLevel: 10
|
||||
Type: Weapon
|
||||
MaxLevel: 7
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Weapon
|
||||
SplashArea: 3
|
||||
CastCancel: true
|
||||
Duration1: 20000
|
||||
Cooldown: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -29510,22 +29482,7 @@ Body:
|
||||
Description: Light of Star
|
||||
MaxLevel: 5
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 20000
|
||||
- Level: 2
|
||||
Time: 30000
|
||||
- Level: 3
|
||||
Time: 40000
|
||||
- Level: 4
|
||||
Time: 50000
|
||||
- Level: 5
|
||||
Time: 60000
|
||||
Requires:
|
||||
SpCost: 40
|
||||
- Id: 2578
|
||||
@ -29533,10 +29490,6 @@ Body:
|
||||
Description: Star Stance
|
||||
MaxLevel: 3
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Requires:
|
||||
SpCost: 10
|
||||
@ -29544,18 +29497,8 @@ Body:
|
||||
Name: SJ_NEWMOONKICK
|
||||
Description: New Moon Kick
|
||||
MaxLevel: 7
|
||||
Type: Weapon
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Weapon
|
||||
SplashArea: 3
|
||||
CastCancel: true
|
||||
CastTime: 1000
|
||||
Duration1: 15000
|
||||
Cooldown: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -29576,28 +29519,9 @@ Body:
|
||||
Name: SJ_FLASHKICK
|
||||
Description: Flash Kick
|
||||
MaxLevel: 7
|
||||
Type: Weapon
|
||||
TargetType: Attack
|
||||
Range: 1
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Weapon
|
||||
CastCancel: true
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 4000
|
||||
- Level: 2
|
||||
Time: 5000
|
||||
- Level: 3
|
||||
Time: 6000
|
||||
- Level: 4
|
||||
Time: 7000
|
||||
- Level: 5
|
||||
Time: 8000
|
||||
- Level: 6
|
||||
Time: 9000
|
||||
- Level: 7
|
||||
Time: 10000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -29616,21 +29540,10 @@ Body:
|
||||
Amount: 15
|
||||
- Id: 2581
|
||||
Name: SJ_STAREMPEROR
|
||||
Description: Star Emperor Advent
|
||||
Description: Star Emperor
|
||||
MaxLevel: 5
|
||||
Type: Weapon
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Weapon
|
||||
SplashArea: 3
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 1000
|
||||
Duration1: 7000
|
||||
Cooldown: 10000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -29645,23 +29558,11 @@ Body:
|
||||
Amount: 90
|
||||
- Id: 2582
|
||||
Name: SJ_NOVAEXPLOSING
|
||||
Description: Nova Explosion
|
||||
Description: Nova Explosing
|
||||
MaxLevel: 5
|
||||
Type: Misc
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
IgnoreElement: true
|
||||
IgnoreFlee: true
|
||||
IgnoreDefCard: true
|
||||
Range: 3
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
CastTime: 5000
|
||||
AfterCastActDelay: 1000
|
||||
Duration1: 2000
|
||||
Cooldown: 20000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -29679,41 +29580,15 @@ Body:
|
||||
Description: Universe Stance
|
||||
MaxLevel: 3
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Requires:
|
||||
SpCost: 10
|
||||
- Id: 2584
|
||||
Name: SJ_FALLINGSTAR
|
||||
Description: Falling Star
|
||||
MaxLevel: 10
|
||||
MaxLevel: 7
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
CastTime: 1000
|
||||
Duration1: 126000
|
||||
Cooldown:
|
||||
- Level: 1
|
||||
Time: 120000
|
||||
- Level: 2
|
||||
Time: 140000
|
||||
- Level: 3
|
||||
Time: 160000
|
||||
- Level: 4
|
||||
Time: 180000
|
||||
- Level: 5
|
||||
Time: 200000
|
||||
- Level: 6
|
||||
Time: 220000
|
||||
- Level: 7
|
||||
Time: 240000
|
||||
FixedCastTime: 2000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -29735,16 +29610,8 @@ Body:
|
||||
Description: Gravity Control
|
||||
MaxLevel: 1
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
CastTime: 2000
|
||||
AfterCastActDelay: 500
|
||||
Duration1: 5000
|
||||
Cooldown: 20000
|
||||
Requires:
|
||||
SpCost: 80
|
||||
- Id: 2586
|
||||
@ -29752,52 +29619,16 @@ Body:
|
||||
Description: Book of Dimension
|
||||
MaxLevel: 5
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Duration1: 60000
|
||||
Duration2: 30000
|
||||
Cooldown:
|
||||
- Level: 1
|
||||
Time: 150000
|
||||
- Level: 2
|
||||
Time: 120000
|
||||
- Level: 3
|
||||
Time: 90000
|
||||
- Level: 4
|
||||
Time: 60000
|
||||
- Level: 5
|
||||
Time: 30000
|
||||
Requires:
|
||||
SpCost: 40
|
||||
- Id: 2587
|
||||
Name: SJ_BOOKOFCREATINGSTAR
|
||||
Description: Book of Creating Star
|
||||
MaxLevel: 5
|
||||
Type: Weapon
|
||||
TargetType: Ground
|
||||
Range: 7
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Weapon
|
||||
CastCancel: true
|
||||
CastTime: 2000
|
||||
AfterCastActDelay: 500
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 6000
|
||||
- Level: 2
|
||||
Time: 7000
|
||||
- Level: 3
|
||||
Time: 8000
|
||||
- Level: 4
|
||||
Time: 9000
|
||||
- Level: 5
|
||||
Time: 10000
|
||||
Cooldown: 15000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -29810,53 +29641,24 @@ Body:
|
||||
Amount: 65
|
||||
- Level: 5
|
||||
Amount: 70
|
||||
Unit:
|
||||
Id: Creatingstar
|
||||
Layout: 2
|
||||
Interval: -1
|
||||
Target: Enemy
|
||||
Flag:
|
||||
NoOverlap: true
|
||||
PathCheck: true
|
||||
NoKnockback: true
|
||||
- Id: 2588
|
||||
Name: SJ_DOCUMENT
|
||||
Description: Document of Sun Moon and Star
|
||||
Description: Document
|
||||
MaxLevel: 3
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Cooldown: 60000
|
||||
Requires:
|
||||
SpCost: 60
|
||||
- Id: 2589
|
||||
Name: SJ_PURIFY
|
||||
Description: Purification of Sun Moon and Star
|
||||
Description: Purify
|
||||
MaxLevel: 1
|
||||
- Id: 2590
|
||||
Name: SJ_LIGHTOFSUN
|
||||
Description: Light of Sun
|
||||
MaxLevel: 5
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 20000
|
||||
- Level: 2
|
||||
Time: 30000
|
||||
- Level: 3
|
||||
Time: 40000
|
||||
- Level: 4
|
||||
Time: 50000
|
||||
- Level: 5
|
||||
Time: 60000
|
||||
Requires:
|
||||
SpCost: 40
|
||||
- Id: 2591
|
||||
@ -29864,27 +29666,15 @@ Body:
|
||||
Description: Sun Stance
|
||||
MaxLevel: 3
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Requires:
|
||||
SpCost: 10
|
||||
- Id: 2592
|
||||
Name: SJ_SOLARBURST
|
||||
Description: Solar Burst
|
||||
MaxLevel: 10
|
||||
Type: Weapon
|
||||
MaxLevel: 7
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Hit: Multi_Hit
|
||||
HitCount: -3
|
||||
Element: Weapon
|
||||
SplashArea: 3
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 500
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -29905,35 +29695,18 @@ Body:
|
||||
Name: SJ_PROMINENCEKICK
|
||||
Description: Prominence Kick
|
||||
MaxLevel: 7
|
||||
Type: Weapon
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Range: 1
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Weapon
|
||||
SplashArea: 1
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 1000
|
||||
CastDelayFlags:
|
||||
IgnoreStatus: true
|
||||
Requires:
|
||||
SpCost: 20
|
||||
- Id: 2594
|
||||
Name: SJ_FALLINGSTAR_ATK
|
||||
Description: Falling Star Attack
|
||||
MaxLevel: 7
|
||||
Type: Weapon
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
TargetType: Attack
|
||||
Flags:
|
||||
IsChorus: true
|
||||
Hit: Multi_Hit
|
||||
HitCount: -3
|
||||
Element: Weapon
|
||||
SplashArea: 2
|
||||
CastCancel: true
|
||||
Requires:
|
||||
SpCost: 1
|
||||
@ -29941,44 +29714,19 @@ Body:
|
||||
Name: SJ_FALLINGSTAR_ATK2
|
||||
Description: Falling Star Attack 2
|
||||
MaxLevel: 7
|
||||
Type: Weapon
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Flags:
|
||||
IsChorus: true
|
||||
Range: 1
|
||||
Hit: Multi_Hit
|
||||
HitCount: -3
|
||||
Element: Weapon
|
||||
SplashArea: 2
|
||||
CastCancel: true
|
||||
Requires:
|
||||
SpCost: 1
|
||||
- Id: 2596
|
||||
Name: SP_SOULGOLEM
|
||||
Description: Golem's Soul
|
||||
Description: Soul Golem
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Support
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 500
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 120000
|
||||
- Level: 3
|
||||
Time: 180000
|
||||
- Level: 4
|
||||
Time: 240000
|
||||
- Level: 5
|
||||
Time: 300000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -29991,31 +29739,13 @@ Body:
|
||||
Amount: 100
|
||||
- Level: 5
|
||||
Amount: 50
|
||||
SpiritSphereCost: 1
|
||||
- Id: 2597
|
||||
Name: SP_SOULSHADOW
|
||||
Description: Shadow's Soul
|
||||
Description: Soul Shadow
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Support
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 500
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 120000
|
||||
- Level: 3
|
||||
Time: 180000
|
||||
- Level: 4
|
||||
Time: 240000
|
||||
- Level: 5
|
||||
Time: 300000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30028,31 +29758,13 @@ Body:
|
||||
Amount: 100
|
||||
- Level: 5
|
||||
Amount: 50
|
||||
SpiritSphereCost: 1
|
||||
- Id: 2598
|
||||
Name: SP_SOULFALCON
|
||||
Description: Falcon's Soul
|
||||
Description: Soul Falcon
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Support
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 500
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 120000
|
||||
- Level: 3
|
||||
Time: 180000
|
||||
- Level: 4
|
||||
Time: 240000
|
||||
- Level: 5
|
||||
Time: 300000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30065,31 +29777,13 @@ Body:
|
||||
Amount: 100
|
||||
- Level: 5
|
||||
Amount: 50
|
||||
SpiritSphereCost: 1
|
||||
- Id: 2599
|
||||
Name: SP_SOULFAIRY
|
||||
Description: Fairy's Soul
|
||||
Description: Soul Fairy
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Support
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 500
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 120000
|
||||
- Level: 3
|
||||
Time: 180000
|
||||
- Level: 4
|
||||
Time: 240000
|
||||
- Level: 5
|
||||
Time: 300000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30102,25 +29796,13 @@ Body:
|
||||
Amount: 100
|
||||
- Level: 5
|
||||
Amount: 50
|
||||
SpiritSphereCost: 1
|
||||
- Id: 2600
|
||||
Name: SP_CURSEEXPLOSION
|
||||
Description: Curse Explosion
|
||||
MaxLevel: 10
|
||||
Type: Magic
|
||||
MaxLevel: 5
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Range: 9
|
||||
Hit: Multi_Hit
|
||||
HitCount: -7
|
||||
Element: Dark
|
||||
SplashArea: 3
|
||||
CastCancel: true
|
||||
CastTime: 3000
|
||||
AfterCastActDelay: 500
|
||||
Cooldown: 1000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30137,38 +29819,18 @@ Body:
|
||||
Name: SP_SOULCURSE
|
||||
Description: Soul Curse
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Splash: true
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
SplashArea: 3
|
||||
CastCancel: true
|
||||
CastTime: 1000
|
||||
AfterCastActDelay: 500
|
||||
Duration1: 20000
|
||||
Cooldown: 5000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost: 70
|
||||
SpiritSphereCost: 3
|
||||
- Id: 2602
|
||||
Name: SP_SPA
|
||||
Description: Espa
|
||||
MaxLevel: 10
|
||||
Type: Magic
|
||||
MaxLevel: 5
|
||||
TargetType: Attack
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Endowed
|
||||
CastCancel: true
|
||||
CastTime: 500
|
||||
Duration1: 5000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30181,65 +29843,13 @@ Body:
|
||||
Amount: 64
|
||||
- Level: 5
|
||||
Amount: 68
|
||||
SpiritSphereCost:
|
||||
- Level: 1
|
||||
Amount: 1
|
||||
- Level: 2
|
||||
Amount: 1
|
||||
- Level: 3
|
||||
Amount: 1
|
||||
- Level: 4
|
||||
Amount: 1
|
||||
- Level: 5
|
||||
Amount: 1
|
||||
- Level: 6
|
||||
Amount: 1
|
||||
- Level: 7
|
||||
Amount: 1
|
||||
- Level: 8
|
||||
Amount: 1
|
||||
- Level: 9
|
||||
Amount: 1
|
||||
- Id: 2603
|
||||
Name: SP_SHA
|
||||
Description: Esha
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
Element: Endowed
|
||||
SplashArea:
|
||||
- Level: 1
|
||||
Area: 1
|
||||
- Level: 2
|
||||
Area: 1
|
||||
- Level: 3
|
||||
Area: 2
|
||||
- Level: 4
|
||||
Area: 2
|
||||
- Level: 5
|
||||
Area: 2
|
||||
CastCancel: true
|
||||
CastTime: 500
|
||||
AfterCastActDelay: 500
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 3000
|
||||
- Level: 2
|
||||
Time: 4000
|
||||
- Level: 3
|
||||
Time: 5000
|
||||
- Level: 4
|
||||
Time: 6000
|
||||
- Level: 5
|
||||
Time: 7000
|
||||
Duration2: 5000
|
||||
Cooldown: 3000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30252,40 +29862,13 @@ Body:
|
||||
Amount: 24
|
||||
- Level: 5
|
||||
Amount: 26
|
||||
SpiritSphereCost: 1
|
||||
- Id: 2604
|
||||
Name: SP_SWHOO
|
||||
Description: Eswhoo
|
||||
MaxLevel: 10
|
||||
Type: Magic
|
||||
MaxLevel: 7
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
Splash: true
|
||||
Range: 9
|
||||
Hit: Multi_Hit
|
||||
HitCount: -5
|
||||
Element: Endowed
|
||||
SplashArea:
|
||||
- Level: 1
|
||||
Area: 1
|
||||
- Level: 2
|
||||
Area: 1
|
||||
- Level: 3
|
||||
Area: 1
|
||||
- Level: 4
|
||||
Area: 2
|
||||
- Level: 5
|
||||
Area: 2
|
||||
- Level: 6
|
||||
Area: 2
|
||||
- Level: 7
|
||||
Area: 3
|
||||
CastCancel: true
|
||||
CastTime: 500
|
||||
AfterCastActDelay: 500
|
||||
Duration1: 5000
|
||||
Cooldown: 2000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30302,85 +29885,13 @@ Body:
|
||||
Amount: 86
|
||||
- Level: 7
|
||||
Amount: 90
|
||||
SpiritSphereCost:
|
||||
- Level: 1
|
||||
Amount: 2
|
||||
- Level: 2
|
||||
Amount: 2
|
||||
- Level: 3
|
||||
Amount: 2
|
||||
- Level: 4
|
||||
Amount: 2
|
||||
- Level: 5
|
||||
Amount: 2
|
||||
- Level: 6
|
||||
Amount: 2
|
||||
- Level: 7
|
||||
Amount: 2
|
||||
- Level: 8
|
||||
Amount: 2
|
||||
- Level: 9
|
||||
Amount: 2
|
||||
- Level: 10
|
||||
Amount: 1
|
||||
- Id: 2605
|
||||
Name: SP_SOULUNITY
|
||||
Description: Soul Unity
|
||||
MaxLevel: 7
|
||||
Type: Magic
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Splash: true
|
||||
Range: 11
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
SplashArea:
|
||||
- Level: 1
|
||||
Area: 1
|
||||
- Level: 2
|
||||
Area: 1
|
||||
- Level: 3
|
||||
Area: 2
|
||||
- Level: 4
|
||||
Area: 2
|
||||
- Level: 5
|
||||
Area: 3
|
||||
- Level: 6
|
||||
Area: 3
|
||||
- Level: 7
|
||||
Area: 4
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 1000
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 30000
|
||||
- Level: 2
|
||||
Time: 60000
|
||||
- Level: 3
|
||||
Time: 90000
|
||||
- Level: 4
|
||||
Time: 120000
|
||||
- Level: 5
|
||||
Time: 150000
|
||||
- Level: 6
|
||||
Time: 180000
|
||||
- Level: 7
|
||||
Time: 210000
|
||||
Cooldown:
|
||||
- Level: 2
|
||||
Time: 30000
|
||||
- Level: 3
|
||||
Time: 60000
|
||||
- Level: 4
|
||||
Time: 90000
|
||||
- Level: 5
|
||||
Time: 120000
|
||||
- Level: 6
|
||||
Time: 150000
|
||||
- Level: 7
|
||||
Time: 180000
|
||||
FixedCastTime: 4000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30397,24 +29908,13 @@ Body:
|
||||
Amount: 54
|
||||
- Level: 7
|
||||
Amount: 56
|
||||
SpiritSphereCost: 10
|
||||
- Id: 2606
|
||||
Name: SP_SOULDIVISION
|
||||
Description: Soul Division
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
CastTime: 500
|
||||
AfterCastActDelay: 500
|
||||
Duration1: 5000
|
||||
Cooldown: 3000
|
||||
FixedCastTime: 1500
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30427,42 +29927,12 @@ Body:
|
||||
Amount: 48
|
||||
- Level: 5
|
||||
Amount: 52
|
||||
SpiritSphereCost: 1
|
||||
- Id: 2607
|
||||
Name: SP_SOULREAPER
|
||||
Description: Soul Reaper
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
CastTime: 3000
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 90000
|
||||
- Level: 2
|
||||
Time: 120000
|
||||
- Level: 3
|
||||
Time: 150000
|
||||
- Level: 4
|
||||
Time: 180000
|
||||
- Level: 5
|
||||
Time: 210000
|
||||
Cooldown:
|
||||
- Level: 1
|
||||
Time: 90000
|
||||
- Level: 2
|
||||
Time: 120000
|
||||
- Level: 3
|
||||
Time: 150000
|
||||
- Level: 4
|
||||
Time: 180000
|
||||
- Level: 5
|
||||
Time: 210000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30475,24 +29945,13 @@ Body:
|
||||
Amount: 48
|
||||
- Level: 5
|
||||
Amount: 50
|
||||
SpiritSphereCost: 2
|
||||
- Id: 2608
|
||||
Name: SP_SOULREVOLVE
|
||||
Description: Soul Revolution
|
||||
Description: Soul Revolve
|
||||
MaxLevel: 3
|
||||
Type: Magic
|
||||
TargetType: Support
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Flags:
|
||||
PartyOnly: true
|
||||
Range: 9
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 500
|
||||
Cooldown: 3000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30505,45 +29964,17 @@ Body:
|
||||
Name: SP_SOULCOLLECT
|
||||
Description: Soul Collect
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
Duration1:
|
||||
- Level: 1
|
||||
Time: 60000
|
||||
- Level: 2
|
||||
Time: 50000
|
||||
- Level: 3
|
||||
Time: 40000
|
||||
- Level: 4
|
||||
Time: 30000
|
||||
- Level: 5
|
||||
Time: 20000
|
||||
Duration2: 600000
|
||||
Requires:
|
||||
SpCost: 100
|
||||
- Id: 2610
|
||||
Name: SP_SOULEXPLOSION
|
||||
Description: Soul Explosion
|
||||
MaxLevel: 5
|
||||
Type: Misc
|
||||
TargetType: Attack
|
||||
DamageFlags:
|
||||
IgnoreElement: true
|
||||
IgnoreFlee: true
|
||||
IgnoreDefCard: true
|
||||
Range: 7
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
CastTime: 2000
|
||||
AfterCastActDelay: 500
|
||||
Cooldown: 60000
|
||||
FixedCastTime: 1000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30556,25 +29987,17 @@ Body:
|
||||
Amount: 120
|
||||
- Level: 5
|
||||
Amount: 150
|
||||
SpiritSphereCost: 10
|
||||
- Id: 2611
|
||||
Name: SP_SOULENERGY
|
||||
Description: Soul Energy Research
|
||||
Description: Soul Energy
|
||||
MaxLevel: 5
|
||||
- Id: 2612
|
||||
Name: SP_KAUTE
|
||||
Description: Kaute
|
||||
MaxLevel: 5
|
||||
Type: Magic
|
||||
TargetType: Support
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Range: 7
|
||||
Hit: Single
|
||||
HitCount: 1
|
||||
CastCancel: true
|
||||
AfterCastActDelay: 1000
|
||||
Cooldown: 5000
|
||||
Requires:
|
||||
SpCost:
|
||||
- Level: 1
|
||||
@ -30587,7 +30010,6 @@ Body:
|
||||
Amount: 42
|
||||
- Level: 5
|
||||
Amount: 48
|
||||
SpiritSphereCost: 5
|
||||
- Id: 3001
|
||||
Name: KO_YAMIKUMO
|
||||
Description: Shadow Hiding
|
||||
|
@ -62,7 +62,6 @@
|
||||
2284,4 //SC_FATALMENACE
|
||||
2300,4 //SC_DIMENSIONDOOR
|
||||
5063,4 //WE_CALLALLFAMILY
|
||||
462,4 //SL_KAIZEL
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Battlegrounds
|
||||
@ -101,8 +100,6 @@
|
||||
2284,8 //SC_FATALMENACE
|
||||
2300,8 //SC_DIMENSIONDOOR
|
||||
5063,8 //WE_CALLALLFAMILY
|
||||
5023,8 //SU_LOPE
|
||||
462,8 //SL_KAIZEL
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Mixed
|
||||
@ -187,8 +184,6 @@
|
||||
//----------------------------------------------------------------------------
|
||||
426,256 //TK_HIGHJUMP
|
||||
290,256 //SA_ABRACADABRA
|
||||
5023,256 //SU_LOPE
|
||||
462,256 //SL_KAIZEL
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Zone 5 - Sealed Shrine
|
||||
|
@ -6203,7 +6203,7 @@
|
||||
4239,444,1,443,9,0,0,0,0,0,0,0,0 //SG_FUSION#Union of the Sun, Moon and Stars#
|
||||
4239,2574,5,2576,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFMOON##
|
||||
4239,2575,3,2588,1,0,0,0,0,0,0,0,0 //SJ_LUNARSTANCE##
|
||||
4239,2576,10,2579,7,0,0,0,0,0,0,0,0 //SJ_FULLMOONKICK##
|
||||
4239,2576,7,2579,7,0,0,0,0,0,0,0,0 //SJ_FULLMOONKICK##
|
||||
4239,2577,5,2584,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFSTAR##
|
||||
4239,2578,3,2588,1,0,0,0,0,0,0,0,0 //SJ_STARSTANCE##
|
||||
4239,2579,7,2575,1,0,0,0,0,0,0,0,0 //SJ_NEWMOONKICK##
|
||||
@ -6211,7 +6211,7 @@
|
||||
4239,2581,5,2582,5,2583,3,0,0,0,0,0,0 //SJ_STAREMPEROR##
|
||||
4239,2582,5,2583,1,0,0,0,0,0,0,0,0 //SJ_NOVAEXPLOSING##
|
||||
4239,2583,3,2575,3,2578,3,2591,3,0,0,0,0 //SJ_UNIVERSESTANCE##
|
||||
4239,2584,10,2580,7,0,0,0,0,0,0,0,0 //SJ_FALLINGSTAR##
|
||||
4239,2584,7,2580,7,0,0,0,0,0,0,0,0 //SJ_FALLINGSTAR##
|
||||
4239,2585,1,2583,1,0,0,0,0,0,0,0,0 //SJ_GRAVITYCONTROL##
|
||||
4239,2586,5,2581,3,2588,3,0,0,0,0,0,0 //SJ_BOOKOFDIMENSION##
|
||||
4239,2587,5,2581,3,2588,3,0,0,0,0,0,0 //SJ_BOOKOFCREATINGSTAR##
|
||||
@ -6219,7 +6219,7 @@
|
||||
4239,2589,1,441,10,0,0,0,0,0,0,0,0 //SJ_PURIFY##
|
||||
4239,2590,5,2592,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFSUN##
|
||||
4239,2591,3,2588,1,0,0,0,0,0,0,0,0 //SJ_SUNSTANCE##
|
||||
4239,2592,10,2593,7,0,0,0,0,0,0,0,0 //SJ_SOLARBURST##
|
||||
4239,2592,7,2593,7,0,0,0,0,0,0,0,0 //SJ_SOLARBURST##
|
||||
4239,2593,7,2591,1,0,0,0,0,0,0,0,0 //SJ_PROMINENCEKICK##
|
||||
4239,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
|
||||
|
||||
@ -6274,13 +6274,13 @@
|
||||
4240,2597,5,2605,5,0,0,0,0,0,0,0,0 //SP_SOULSHADOW##
|
||||
4240,2598,5,2608,2,0,0,0,0,0,0,0,0 //SP_SOULFALCON##
|
||||
4240,2599,5,2605,5,0,0,0,0,0,0,0,0 //SP_SOULFAIRY##
|
||||
4240,2600,10,2601,3,0,0,0,0,0,0,0,0 //SP_CURSEEXPLOSION##
|
||||
4240,2600,5,2601,3,0,0,0,0,0,0,0,0 //SP_CURSEEXPLOSION##
|
||||
4240,2601,5,2607,3,0,0,0,0,0,0,0,0 //SP_SOULCURSE##
|
||||
4240,2602,10,2603,1,0,0,0,0,0,0,0,0 //SP_SPA##
|
||||
4240,2602,5,2603,1,0,0,0,0,0,0,0,0 //SP_SPA##
|
||||
4240,2603,5,2607,3,0,0,0,0,0,0,0,0 //SP_SHA##
|
||||
4240,2604,10,2602,3,0,0,0,0,0,0,0,0 //SP_SWHOO##
|
||||
4240,2604,7,2602,3,0,0,0,0,0,0,0,0 //SP_SWHOO##
|
||||
4240,2605,7,2611,3,0,0,0,0,0,0,0,0 //SP_SOULUNITY##
|
||||
4240,2606,5,2602,10,2603,5,0,0,0,0,0,0 //SP_SOULDIVISION##
|
||||
4240,2606,5,2602,5,2603,5,0,0,0,0,0,0 //SP_SOULDIVISION##
|
||||
4240,2607,5,2609,1,0,0,0,0,0,0,0,0 //SP_SOULREAPER##
|
||||
4240,2608,3,2611,3,2612,3,0,0,0,0,0,0 //SP_SOULREVOLVE##
|
||||
4240,2609,5,0,0,0,0,0,0,0,0,0,0 //SP_SOULCOLLECT##
|
||||
@ -6329,7 +6329,7 @@
|
||||
4241,444,1,443,9,0,0,0,0,0,0,0,0 //SG_FUSION#Union of the Sun, Moon and Stars#
|
||||
4241,2574,5,2576,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFMOON##
|
||||
4241,2575,3,2588,1,0,0,0,0,0,0,0,0 //SJ_LUNARSTANCE##
|
||||
4241,2576,10,2579,7,0,0,0,0,0,0,0,0 //SJ_FULLMOONKICK##
|
||||
4241,2576,7,2579,7,0,0,0,0,0,0,0,0 //SJ_FULLMOONKICK##
|
||||
4241,2577,5,2584,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFSTAR##
|
||||
4241,2578,3,2588,1,0,0,0,0,0,0,0,0 //SJ_STARSTANCE##
|
||||
4241,2579,7,2575,1,0,0,0,0,0,0,0,0 //SJ_NEWMOONKICK##
|
||||
@ -6337,7 +6337,7 @@
|
||||
4241,2581,5,2582,5,2583,3,0,0,0,0,0,0 //SJ_STAREMPEROR##
|
||||
4241,2582,5,2583,1,0,0,0,0,0,0,0,0 //SJ_NOVAEXPLOSING##
|
||||
4241,2583,3,2575,3,2578,3,2591,3,0,0,0,0 //SJ_UNIVERSESTANCE##
|
||||
4241,2584,10,2580,7,0,0,0,0,0,0,0,0 //SJ_FALLINGSTAR##
|
||||
4241,2584,7,2580,7,0,0,0,0,0,0,0,0 //SJ_FALLINGSTAR##
|
||||
4241,2585,1,2583,1,0,0,0,0,0,0,0,0 //SJ_GRAVITYCONTROL##
|
||||
4241,2586,5,2581,3,2588,3,0,0,0,0,0,0 //SJ_BOOKOFDIMENSION##
|
||||
4241,2587,5,2581,3,2588,3,0,0,0,0,0,0 //SJ_BOOKOFCREATINGSTAR##
|
||||
@ -6345,7 +6345,7 @@
|
||||
4241,2589,1,441,10,0,0,0,0,0,0,0,0 //SJ_PURIFY##
|
||||
4241,2590,5,2592,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFSUN##
|
||||
4241,2591,3,2588,1,0,0,0,0,0,0,0,0 //SJ_SUNSTANCE##
|
||||
4241,2592,10,2593,7,0,0,0,0,0,0,0,0 //SJ_SOLARBURST##
|
||||
4241,2592,7,2593,7,0,0,0,0,0,0,0,0 //SJ_SOLARBURST##
|
||||
4241,2593,7,2591,1,0,0,0,0,0,0,0,0 //SJ_PROMINENCEKICK##
|
||||
4241,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
|
||||
4241,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
|
||||
@ -6402,13 +6402,13 @@
|
||||
4242,2597,5,2605,5,0,0,0,0,0,0,0,0 //SP_SOULSHADOW##
|
||||
4242,2598,5,2608,2,0,0,0,0,0,0,0,0 //SP_SOULFALCON##
|
||||
4242,2599,5,2605,5,0,0,0,0,0,0,0,0 //SP_SOULFAIRY##
|
||||
4242,2600,10,2601,3,0,0,0,0,0,0,0,0 //SP_CURSEEXPLOSION##
|
||||
4242,2600,5,2601,3,0,0,0,0,0,0,0,0 //SP_CURSEEXPLOSION##
|
||||
4242,2601,5,2607,3,0,0,0,0,0,0,0,0 //SP_SOULCURSE##
|
||||
4242,2602,10,2603,1,0,0,0,0,0,0,0,0 //SP_SPA##
|
||||
4242,2602,5,2603,1,0,0,0,0,0,0,0,0 //SP_SPA##
|
||||
4242,2603,5,2607,3,0,0,0,0,0,0,0,0 //SP_SHA##
|
||||
4242,2604,10,2602,3,0,0,0,0,0,0,0,0 //SP_SWHOO##
|
||||
4242,2604,7,2602,3,0,0,0,0,0,0,0,0 //SP_SWHOO##
|
||||
4242,2605,7,2611,3,0,0,0,0,0,0,0,0 //SP_SOULUNITY##
|
||||
4242,2606,5,2602,10,2603,5,0,0,0,0,0,0 //SP_SOULDIVISION##
|
||||
4242,2606,5,2602,5,2603,5,0,0,0,0,0,0 //SP_SOULDIVISION##
|
||||
4242,2607,5,2609,1,0,0,0,0,0,0,0,0 //SP_SOULREAPER##
|
||||
4242,2608,3,2611,3,2612,3,0,0,0,0,0,0 //SP_SOULREVOLVE##
|
||||
4242,2609,5,0,0,0,0,0,0,0,0,0,0 //SP_SOULCOLLECT##
|
||||
@ -6459,7 +6459,7 @@
|
||||
4243,444,1,443,9,0,0,0,0,0,0,0,0 //SG_FUSION#Union of the Sun, Moon and Stars#
|
||||
4243,2574,5,2576,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFMOON##
|
||||
4243,2575,3,2588,1,0,0,0,0,0,0,0,0 //SJ_LUNARSTANCE##
|
||||
4243,2576,10,2579,7,0,0,0,0,0,0,0,0 //SJ_FULLMOONKICK##
|
||||
4243,2576,7,2579,7,0,0,0,0,0,0,0,0 //SJ_FULLMOONKICK##
|
||||
4243,2577,5,2584,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFSTAR##
|
||||
4243,2578,3,2588,1,0,0,0,0,0,0,0,0 //SJ_STARSTANCE##
|
||||
4243,2579,7,2575,1,0,0,0,0,0,0,0,0 //SJ_NEWMOONKICK##
|
||||
@ -6467,7 +6467,7 @@
|
||||
4243,2581,5,2582,5,2583,3,0,0,0,0,0,0 //SJ_STAREMPEROR##
|
||||
4243,2582,5,2583,1,0,0,0,0,0,0,0,0 //SJ_NOVAEXPLOSING##
|
||||
4243,2583,3,2575,3,2578,3,2591,3,0,0,0,0 //SJ_UNIVERSESTANCE##
|
||||
4243,2584,10,2580,7,0,0,0,0,0,0,0,0 //SJ_FALLINGSTAR##
|
||||
4243,2584,7,2580,7,0,0,0,0,0,0,0,0 //SJ_FALLINGSTAR##
|
||||
4243,2585,1,2583,1,0,0,0,0,0,0,0,0 //SJ_GRAVITYCONTROL##
|
||||
4243,2586,5,2581,3,2588,3,0,0,0,0,0,0 //SJ_BOOKOFDIMENSION##
|
||||
4243,2587,5,2581,3,2588,3,0,0,0,0,0,0 //SJ_BOOKOFCREATINGSTAR##
|
||||
@ -6475,7 +6475,7 @@
|
||||
4243,2589,1,441,10,0,0,0,0,0,0,0,0 //SJ_PURIFY##
|
||||
4243,2590,5,2592,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFSUN##
|
||||
4243,2591,3,2588,1,0,0,0,0,0,0,0,0 //SJ_SUNSTANCE##
|
||||
4243,2592,10,2593,7,0,0,0,0,0,0,0,0 //SJ_SOLARBURST##
|
||||
4243,2592,7,2593,7,0,0,0,0,0,0,0,0 //SJ_SOLARBURST##
|
||||
4243,2593,7,2591,1,0,0,0,0,0,0,0,0 //SJ_PROMINENCEKICK##
|
||||
4243,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
|
||||
|
||||
@ -6519,7 +6519,7 @@
|
||||
4244,444,1,443,9,0,0,0,0,0,0,0,0 //SG_FUSION#Union of the Sun, Moon and Stars#
|
||||
4244,2574,5,2576,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFMOON##
|
||||
4244,2575,3,2588,1,0,0,0,0,0,0,0,0 //SJ_LUNARSTANCE##
|
||||
4244,2576,10,2579,7,0,0,0,0,0,0,0,0 //SJ_FULLMOONKICK##
|
||||
4244,2576,7,2579,7,0,0,0,0,0,0,0,0 //SJ_FULLMOONKICK##
|
||||
4244,2577,5,2584,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFSTAR##
|
||||
4244,2578,3,2588,1,0,0,0,0,0,0,0,0 //SJ_STARSTANCE##
|
||||
4244,2579,7,2575,1,0,0,0,0,0,0,0,0 //SJ_NEWMOONKICK##
|
||||
@ -6527,7 +6527,7 @@
|
||||
4244,2581,5,2582,5,2583,3,0,0,0,0,0,0 //SJ_STAREMPEROR##
|
||||
4244,2582,5,2583,1,0,0,0,0,0,0,0,0 //SJ_NOVAEXPLOSING##
|
||||
4244,2583,3,2575,3,2578,3,2591,3,0,0,0,0 //SJ_UNIVERSESTANCE##
|
||||
4244,2584,10,2580,7,0,0,0,0,0,0,0,0 //SJ_FALLINGSTAR##
|
||||
4244,2584,7,2580,7,0,0,0,0,0,0,0,0 //SJ_FALLINGSTAR##
|
||||
4244,2585,1,2583,1,0,0,0,0,0,0,0,0 //SJ_GRAVITYCONTROL##
|
||||
4244,2586,5,2581,3,2588,3,0,0,0,0,0,0 //SJ_BOOKOFDIMENSION##
|
||||
4244,2587,5,2581,3,2588,3,0,0,0,0,0,0 //SJ_BOOKOFCREATINGSTAR##
|
||||
@ -6535,7 +6535,7 @@
|
||||
4244,2589,1,441,10,0,0,0,0,0,0,0,0 //SJ_PURIFY##
|
||||
4244,2590,5,2592,3,0,0,0,0,0,0,0,0 //SJ_LIGHTOFSUN##
|
||||
4244,2591,3,2588,1,0,0,0,0,0,0,0,0 //SJ_SUNSTANCE##
|
||||
4244,2592,10,2593,7,0,0,0,0,0,0,0,0 //SJ_SOLARBURST##
|
||||
4244,2592,7,2593,7,0,0,0,0,0,0,0,0 //SJ_SOLARBURST##
|
||||
4244,2593,7,2591,1,0,0,0,0,0,0,0,0 //SJ_PROMINENCEKICK##
|
||||
4244,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
|
||||
4244,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
|
||||
|
@ -1309,7 +1309,7 @@ ACMD_FUNC(heal)
|
||||
}
|
||||
|
||||
if ( hp < 0 && sp <= 0 ) {
|
||||
status_damage(NULL, &sd->bl, -hp, -sp, 0, 0, 0);
|
||||
status_damage(NULL, &sd->bl, -hp, -sp, 0, 0);
|
||||
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
||||
clif_displaymessage(fd, msg_txt(sd,156)); // HP or/and SP modified.
|
||||
return 0;
|
||||
@ -1320,7 +1320,7 @@ ACMD_FUNC(heal)
|
||||
if (hp > 0)
|
||||
status_heal(&sd->bl, hp, 0, 0);
|
||||
else {
|
||||
status_damage(NULL, &sd->bl, -hp, 0, 0, 0, 0);
|
||||
status_damage(NULL, &sd->bl, -hp, 0, 0, 0);
|
||||
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
||||
}
|
||||
}
|
||||
@ -1329,7 +1329,7 @@ ACMD_FUNC(heal)
|
||||
if (sp > 0)
|
||||
status_heal(&sd->bl, 0, sp, 0);
|
||||
else
|
||||
status_damage(NULL, &sd->bl, 0, -sp, 0, 0, 0);
|
||||
status_damage(NULL, &sd->bl, 0, -sp, 0, 0);
|
||||
}
|
||||
|
||||
clif_displaymessage(fd, msg_txt(sd,156)); // HP or/and SP modified.
|
||||
@ -3490,28 +3490,6 @@ ACMD_FUNC(spiritball)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ACMD_FUNC(soulball)
|
||||
{
|
||||
uint32 max_soulballs = min(ARRAYLENGTH(sd->soul_timer), 0x7FFF);
|
||||
int number;
|
||||
nullpo_retr(-1, sd);
|
||||
|
||||
if (!message || !*message || (number = atoi(message)) < 0 || number > max_soulballs) {
|
||||
char msg[CHAT_SIZE_MAX];
|
||||
safesnprintf(msg, sizeof(msg), "Usage: @soulball <number: 0-%d>", max_soulballs);
|
||||
clif_displaymessage(fd, msg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sd->soulball > 0)
|
||||
pc_delsoulball(sd, sd->soulball, 1);
|
||||
sd->soulball = number;
|
||||
clif_soulball(sd);
|
||||
// no message, player can see the difference
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
*
|
||||
*------------------------------------------*/
|
||||
@ -10311,7 +10289,6 @@ void atcommand_basecommands(void) {
|
||||
ACMD_DEF(questskill),
|
||||
ACMD_DEF(lostskill),
|
||||
ACMD_DEF(spiritball),
|
||||
ACMD_DEF(soulball),
|
||||
ACMD_DEF(party),
|
||||
ACMD_DEF(guild),
|
||||
ACMD_DEF(breakguild),
|
||||
|
@ -268,9 +268,9 @@ struct block_list* battle_getenemyarea(struct block_list *src, int x, int y, int
|
||||
void battle_damage(struct block_list *src, struct block_list *target, int64 damage, t_tick delay, uint16 skill_lv, uint16 skill_id, enum damage_lv dmg_lv, unsigned short attack_type, bool additional_effects, t_tick tick, bool isspdamage) {
|
||||
map_freeblock_lock();
|
||||
if (isspdamage)
|
||||
status_fix_spdamage(src, target, damage, delay, skill_id);
|
||||
status_fix_spdamage(src, target, damage, delay);
|
||||
else
|
||||
status_fix_damage(src, target, damage, delay, skill_id); // We have to separate here between reflect damage and others [icescope]
|
||||
status_fix_damage(src, target, damage, delay); // We have to separate here between reflect damage and others [icescope]
|
||||
if (attack_type && !status_isdead(target) && additional_effects)
|
||||
skill_additional_effect(src, target, skill_id, skill_lv, attack_type, dmg_lv, tick);
|
||||
if (dmg_lv > ATK_BLOCK && attack_type)
|
||||
@ -316,7 +316,7 @@ TIMER_FUNC(battle_delay_damage_sub){
|
||||
battle_damage(src, target, dat->damage, dat->delay, dat->skill_lv, dat->skill_id, dat->dmg_lv, dat->attack_type, dat->additional_effects, tick, dat->isspdamage);
|
||||
} else if( !src && dat->skill_id == CR_REFLECTSHIELD ) { // it was monster reflected damage, and the monster died, we pass the damage to the character as expected
|
||||
map_freeblock_lock();
|
||||
status_fix_damage(target, target, dat->damage, dat->delay, dat->skill_id);
|
||||
status_fix_damage(target, target, dat->damage, dat->delay);
|
||||
map_freeblock_unlock();
|
||||
}
|
||||
}
|
||||
@ -576,22 +576,6 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
|
||||
damage += (int64)(damage * tsc->data[SC_ANTI_M_BLAST]->val2 / 100);
|
||||
#endif
|
||||
break;
|
||||
case ELE_DARK:
|
||||
if (tsc->data[SC_SOULCURSE]) {
|
||||
if (status_get_class_(target) == CLASS_BOSS)
|
||||
#ifdef RENEWAL
|
||||
ratio += 20;
|
||||
#else
|
||||
damage += (int64)(damage * 20 / 100);
|
||||
#endif
|
||||
else
|
||||
#ifdef RENEWAL
|
||||
ratio += 100;
|
||||
#else
|
||||
damage *= 2;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1073,7 +1057,7 @@ bool battle_check_sc(struct block_list *src, struct block_list *target, struct s
|
||||
int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Damage *d,int64 damage,uint16 skill_id,uint16 skill_lv)
|
||||
{
|
||||
struct map_session_data *sd = NULL;
|
||||
struct status_change *sc, *tsc;
|
||||
struct status_change *sc;
|
||||
struct status_change_entry *sce;
|
||||
int div_ = d->div_, flag = d->flag;
|
||||
|
||||
@ -1112,19 +1096,12 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
if (sc && sc->data[SC_MAXPAIN])
|
||||
return 0;
|
||||
|
||||
switch (skill_id) {
|
||||
#ifndef RENEWAL
|
||||
case PA_PRESSURE:
|
||||
case HW_GRAVITATION:
|
||||
if (skill_id == PA_PRESSURE
|
||||
|| skill_id == HW_GRAVITATION
|
||||
)
|
||||
return damage; //These skills bypass everything else.
|
||||
#endif
|
||||
case SP_SOULEXPLOSION:
|
||||
return damage; //These skills bypass everything else.
|
||||
}
|
||||
|
||||
// Nothing can reduce the damage, but Safety Wall and Millennium Shield can block it completely.
|
||||
// So can defense sphere's but what the heck is that??? [Rytech]
|
||||
if (skill_id == SJ_NOVAEXPLOSING && !(sc && (sc->data[SC_SAFETYWALL] || sc->data[SC_MILLENNIUMSHIELD])))
|
||||
return damage;
|
||||
|
||||
if( sc && sc->count ) { // SC_* that reduce damage to 0.
|
||||
#ifdef RENEWAL
|
||||
@ -1132,7 +1109,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
#else
|
||||
if (sc->data[SC_BASILICA]
|
||||
#endif
|
||||
&& !status_bl_has_mode(src,MD_STATUS_IMMUNE) && skill_id != SP_SOULEXPLOSION ) {
|
||||
&& !status_bl_has_mode(src,MD_STATUS_IMMUNE) ) {
|
||||
d->dmg_lv = ATK_BLOCK;
|
||||
return 0;
|
||||
}
|
||||
@ -1160,7 +1137,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
if (!battle_check_sc(src, bl, sc, d, damage, skill_id, skill_lv))
|
||||
return 0;
|
||||
|
||||
if (sc->data[SC__MANHOLE] || (src->type == BL_PC && sc->data[SC_KINGS_GRACE]) || sc->data[SC_GRAVITYCONTROL]) {
|
||||
if (sc->data[SC__MANHOLE] || (src->type == BL_PC && sc->data[SC_KINGS_GRACE])) {
|
||||
d->dmg_lv = ATK_BLOCK;
|
||||
return 0;
|
||||
}
|
||||
@ -1504,26 +1481,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
status_change_end(bl, SC_TUNAPARTY, INVALID_TIMER);
|
||||
}
|
||||
|
||||
if ((sce = sc->data[SC_DIMENSION1]) && damage > 0) {
|
||||
sce->val2 -= (int)cap_value(damage, INT_MIN, INT_MAX);
|
||||
if (sce->val2 >= 0)
|
||||
damage = 0;
|
||||
else
|
||||
damage = -sce->val2;
|
||||
if (sce->val2 <= 0)
|
||||
status_change_end(bl, SC_DIMENSION1, INVALID_TIMER);
|
||||
}
|
||||
|
||||
if ((sce = sc->data[SC_DIMENSION2]) && damage > 0) {
|
||||
sce->val2 -= (int)cap_value(damage, INT_MIN, INT_MAX);
|
||||
if (sce->val2 >= 0)
|
||||
damage = 0;
|
||||
else
|
||||
damage = -sce->val2;
|
||||
if (sce->val2 <= 0)
|
||||
status_change_end(bl, SC_DIMENSION2, INVALID_TIMER);
|
||||
}
|
||||
|
||||
if( sc->data[SC_MEIKYOUSISUI] && rnd()%100 < 40 ) // custom value
|
||||
damage = 0;
|
||||
|
||||
@ -1570,7 +1527,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
|
||||
//SC effects from caster side.
|
||||
sc = status_get_sc(src);
|
||||
tsc = status_get_sc(src);
|
||||
|
||||
if (sc && sc->count) {
|
||||
if( sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] )
|
||||
@ -1623,19 +1579,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
}
|
||||
} //End of caster SC_ check
|
||||
|
||||
if (tsc && tsc->count) {
|
||||
struct map_session_data *tsd = (struct map_session_data *)src;
|
||||
|
||||
if (tsc->data[SC_INVINCIBLE] && !tsc->data[SC_INVINCIBLEOFF])
|
||||
damage += damage * 75 / 100;
|
||||
if (tsd && (sce = tsc->data[SC_SOULREAPER])) {
|
||||
if (rnd()%100 < sce->val2 && tsd->soulball < MAX_SOUL_BALL) {
|
||||
clif_specialeffect(src, 1208, AREA);
|
||||
pc_addsoulball(tsd, 0, 5 + 3 * pc_checkskill(tsd, SP_SOULENERGY));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//PK damage rates
|
||||
if (battle_config.pk_mode && sd && bl->type == BL_PC && damage && map_getmapflag(bl->m, MF_PVP)) {
|
||||
if (flag & BF_SKILL) { //Skills get a different reduction than non-skills. [Skotlex]
|
||||
@ -2937,9 +2880,6 @@ static int battle_get_weapon_element(struct Damage* wd, struct block_list *src,
|
||||
if (sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 4)
|
||||
element = ELE_HOLY;
|
||||
break;
|
||||
case SJ_PROMINENCEKICK:
|
||||
element = ELE_FIRE;
|
||||
break;
|
||||
case RL_H_MINE:
|
||||
if (sd && sd->flicker) //Force RL_H_MINE deals fire damage if activated by RL_FLICKER
|
||||
element = ELE_FIRE;
|
||||
@ -4484,12 +4424,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
case KO_SETSUDAN:
|
||||
skillratio += 100 * (skill_lv - 1);
|
||||
RE_LVL_DMOD(100);
|
||||
if (tsc) {
|
||||
struct status_change_entry *sce;
|
||||
|
||||
if ((sce = tsc->data[SC_SPIRIT]) || (sce = tsc->data[SC_SOULGOLEM]) || (sce = tsc->data[SC_SOULSHADOW]) || (sce = tsc->data[SC_SOULFALCON]) || (sce = tsc->data[SC_SOULFAIRY])) // Bonus damage added when target is soul linked.
|
||||
skillratio += 200 * sce->val1;
|
||||
}
|
||||
if(tsc && tsc->data[SC_SPIRIT])
|
||||
skillratio += 200 * tsc->data[SC_SPIRIT]->val1;
|
||||
break;
|
||||
case KO_BAKURETSU:
|
||||
skillratio += -100 + (sd ? pc_checkskill(sd,NJ_TOBIDOUGU) : 1) * (50 + sstatus->dex / 4) * skill_lv * 4 / 10;
|
||||
@ -4604,34 +4540,6 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
if (sd && pc_checkskill(sd, SU_SPIRITOFLIFE))
|
||||
skillratio += skillratio * status_get_hp(src) / status_get_max_hp(src);
|
||||
break;
|
||||
case SJ_FULLMOONKICK:
|
||||
skillratio += 1000 + 100 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_LIGHTOFMOON])
|
||||
skillratio += skillratio * sc->data[SC_LIGHTOFMOON]->val2 / 100;
|
||||
break;
|
||||
case SJ_NEWMOONKICK:
|
||||
skillratio += 600 + 100 * skill_lv;
|
||||
break;
|
||||
case SJ_STAREMPEROR:
|
||||
skillratio += 700 + 200 * skill_lv;
|
||||
break;
|
||||
case SJ_SOLARBURST:
|
||||
skillratio += 900 + 220 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_LIGHTOFSUN])
|
||||
skillratio += skillratio * sc->data[SC_LIGHTOFSUN]->val2 / 100;
|
||||
break;
|
||||
case SJ_PROMINENCEKICK:
|
||||
skillratio += 50 + 50 * skill_lv;
|
||||
break;
|
||||
case SJ_FALLINGSTAR_ATK:
|
||||
case SJ_FALLINGSTAR_ATK2:
|
||||
skillratio += 100 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_LIGHTOFSTAR])
|
||||
skillratio += skillratio * sc->data[SC_LIGHTOFSTAR]->val2 / 100;
|
||||
break;
|
||||
}
|
||||
return skillratio;
|
||||
}
|
||||
@ -5337,7 +5245,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
|
||||
)
|
||||
{
|
||||
ATK_RATER(wd->damage, 50)
|
||||
status_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD);
|
||||
status_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false));
|
||||
clif_skill_nodamage(target,target,ST_REJECTSWORD,tsc->data[SC_REJECTSWORD]->val1,1);
|
||||
if( --(tsc->data[SC_REJECTSWORD]->val3) <= 0 )
|
||||
status_change_end(target, SC_REJECTSWORD, INVALID_TIMER);
|
||||
@ -5354,8 +5262,8 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
|
||||
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
|
||||
1, SR_CRESCENTELBOW_AUTOSPELL, tsc->data[SC_CRESCENTELBOW]->val1, DMG_SINGLE); // This is how official does
|
||||
clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
|
||||
status_damage(target, src, rdamage, 0, 0, 0, 0);
|
||||
status_damage(src, target, rdamage/10, 0, 0, 1, 0);
|
||||
status_damage(target, src, rdamage, 0, 0, 0);
|
||||
status_damage(src, target, rdamage/10, 0, 0, 1);
|
||||
status_change_end(target, SC_CRESCENTELBOW, INVALID_TIMER);
|
||||
}
|
||||
|
||||
@ -6075,10 +5983,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
MATK_ADD(sstatus->matk_min);
|
||||
}
|
||||
|
||||
if (sd) { // Soul energy spheres adds MATK.
|
||||
MATK_ADD(3*sd->soulball);
|
||||
}
|
||||
|
||||
if (nk[NK_SPLASHSPLIT]) { // Divide MATK in case of multiple targets skill
|
||||
if (mflag>0)
|
||||
ad.damage /= mflag;
|
||||
@ -6503,23 +6407,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
i = cap_value(i, 1, 4);
|
||||
skillratio = 2500 + ((skill_lv - i + 1) * 500);
|
||||
break;
|
||||
case SP_CURSEEXPLOSION:
|
||||
if (tsc && tsc->data[SC_SOULCURSE])
|
||||
skillratio += 1400 + 200 * skill_lv;
|
||||
else
|
||||
skillratio += 300 + 100 * skill_lv;
|
||||
break;
|
||||
case SP_SPA:
|
||||
skillratio += 400 + 250 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case SP_SHA:
|
||||
skillratio += -100 + 5 * skill_lv;
|
||||
break;
|
||||
case SP_SWHOO:
|
||||
skillratio += 1000 + 200 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
}
|
||||
|
||||
if (sc) {// Insignia's increases the damage of offensive magic by a fixed percentage depending on the element.
|
||||
@ -6993,16 +6880,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
||||
case SU_SV_ROOTTWIST_ATK:
|
||||
md.damage = 100;
|
||||
break;
|
||||
case SP_SOULEXPLOSION:
|
||||
md.damage = tstatus->hp * (20 + 10 * skill_lv) / 100;
|
||||
break;
|
||||
case SJ_NOVAEXPLOSING:
|
||||
// (Base ATK + Weapon ATK) * Ratio
|
||||
md.damage = (sstatus->batk + sstatus->rhw.atk) * (200 + 100 * skill_lv) / 100;
|
||||
|
||||
// Additional Damage
|
||||
md.damage += sstatus->max_hp / (6 - min(5, skill_lv)) + status_get_max_sp(src) * (2 * skill_lv);
|
||||
break;
|
||||
}
|
||||
|
||||
if (nk[NK_SPLASHSPLIT]) { // Divide ATK among targets
|
||||
@ -7434,7 +7311,7 @@ int battle_damage_area(struct block_list *bl, va_list ap) {
|
||||
if( amotion )
|
||||
battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true,false);
|
||||
else
|
||||
status_fix_damage(src,bl,damage,0,LG_REFLECTDAMAGE);
|
||||
status_fix_damage(src,bl,damage,0);
|
||||
clif_damage(bl,bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false);
|
||||
skill_additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
|
||||
map_freeblock_unlock();
|
||||
@ -7520,8 +7397,6 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
status_change_end(src, SC_CLOAKING, INVALID_TIMER);
|
||||
else if (sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4 & 2))
|
||||
status_change_end(src, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
||||
else if (sc->data[SC_NEWMOON] && --(sc->data[SC_NEWMOON]->val2) <= 0)
|
||||
status_change_end(src, SC_NEWMOON, INVALID_TIMER);
|
||||
}
|
||||
if (tsc && tsc->data[SC_AUTOCOUNTER] && status_check_skilluse(target, src, KN_AUTOCOUNTER, 1)) {
|
||||
uint8 dir = map_calc_dir(target,src->x,src->y);
|
||||
@ -7740,7 +7615,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
}
|
||||
|
||||
clif_damage(d_bl, d_bl, gettick(), wd.amotion, wd.dmotion, damage, 1, DMG_NORMAL, 0, false);
|
||||
status_fix_damage(NULL, d_bl, damage, 0, CR_DEVOTION);
|
||||
status_fix_damage(NULL, d_bl, damage, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -7759,7 +7634,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
|
||||
if (e_bl && !status_isdead(e_bl)) {
|
||||
clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
|
||||
status_fix_damage(NULL, e_bl, damage, 0, EL_WATER_SCREEN);
|
||||
status_fix_damage(NULL, e_bl, damage, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -7862,14 +7737,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
clif_status_change(src, EFST_POSTDELAY, 1, skill_delayfix(src, r_skill, r_lv), 0, 0, 1);
|
||||
}
|
||||
}
|
||||
if (wd.flag&BF_WEAPON && sc && sc->data[SC_FALLINGSTAR] && rand()%100 < sc->data[SC_FALLINGSTAR]->val2) {
|
||||
if (sd)
|
||||
sd->state.autocast = 1;
|
||||
if (status_charge(src, 0, skill_get_sp(SJ_FALLINGSTAR_ATK, sc->data[SC_FALLINGSTAR]->val1)))
|
||||
skill_castend_nodamage_id(src, src, SJ_FALLINGSTAR_ATK, sc->data[SC_FALLINGSTAR]->val1, tick, flag);
|
||||
if (sd)
|
||||
sd->state.autocast = 0;
|
||||
}
|
||||
|
||||
if (wd.flag & BF_WEAPON && src != target && damage > 0) {
|
||||
if (battle_config.left_cardfix_to_right)
|
||||
battle_drain(sd, target, wd.damage, wd.damage, tstatus->race, tstatus->class_);
|
||||
|
@ -1387,29 +1387,6 @@ static void clif_spiritcharm_single(int fd, struct map_session_data *sd)
|
||||
WFIFOSET(fd, packet_len(0x08cf));
|
||||
}
|
||||
|
||||
|
||||
/// Notifies the client of an object's souls.
|
||||
/// Note: Spirit spheres and Soul spheres work on
|
||||
/// seprate systems officially, but both send out
|
||||
/// the same packet which leads to confusion on how
|
||||
/// much soul energy a Soul Reaper acturally has
|
||||
/// should the player also have spirit spheres.
|
||||
/// They will likely create a new packet for this soon
|
||||
/// to seprate the animations for spirit and soul spheres.
|
||||
/// For now well use this and replace it later when possible. [Rytech]
|
||||
///
|
||||
/// 01d0 <id>.L <amount>.W (ZC_SPIRITS)
|
||||
/// 01e1 <id>.L <amount>.W (ZC_SPIRITS2)
|
||||
static void clif_soulball_single(int fd, struct map_session_data *sd)
|
||||
{
|
||||
WFIFOHEAD(fd, packet_len(0x1d0));
|
||||
WFIFOW(fd,0)=0x1d0;
|
||||
WFIFOL(fd,2)=sd->bl.id;
|
||||
WFIFOW(fd,6)=sd->soulball;
|
||||
WFIFOSET(fd, packet_len(0x1d0));
|
||||
}
|
||||
|
||||
|
||||
/*==========================================
|
||||
* Run when player changes map / refreshes
|
||||
* Tells its client to display all weather settings being used by this map
|
||||
@ -1499,8 +1476,6 @@ int clif_spawn(struct block_list *bl)
|
||||
|
||||
if (sd->spiritball > 0)
|
||||
clif_spiritball(&sd->bl);
|
||||
if (sd->soulball > 0)
|
||||
clif_soulball(sd);
|
||||
if(sd->state.size==SZ_BIG) // tiny/big players [Valaris]
|
||||
clif_specialeffect(bl,EF_GIANTBODY2,AREA);
|
||||
else if(sd->state.size==SZ_MEDIUM)
|
||||
@ -4633,33 +4608,6 @@ void clif_storageclose(struct map_session_data* sd)
|
||||
WFIFOSET(fd,packet_len(0xf8));
|
||||
}
|
||||
|
||||
|
||||
/// Notifies clients in an area of an object's souls.
|
||||
/// Note: Spirit spheres and Soul spheres work on
|
||||
/// seprate systems officially, but both send out
|
||||
/// the same packet which leads to confusion on how
|
||||
/// much soul energy a Soul Reaper acturally has
|
||||
/// should the player also have spirit spheres.
|
||||
/// They will likely create a new packet for this soon
|
||||
/// to seprate the animations for spirit and soul spheres.
|
||||
/// For now well use this and replace it later when possible. [Rytech]
|
||||
///
|
||||
/// 01d0 <id>.L <amount>.W (ZC_SPIRITS)
|
||||
/// 01e1 <id>.L <amount>.W (ZC_SPIRITS2)
|
||||
void clif_soulball(struct map_session_data *sd)
|
||||
{
|
||||
unsigned char buf[8];
|
||||
|
||||
nullpo_retv(sd);
|
||||
|
||||
WBUFW(buf,0)=0x1d0;
|
||||
WBUFL(buf,2)=sd->bl.id;
|
||||
WBUFW(buf,6)=sd->soulball;
|
||||
clif_send(buf,packet_len(0x1d0),&sd->bl,AREA);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*==========================================
|
||||
* Server tells 'sd' player client the abouts of 'dstsd' player
|
||||
*------------------------------------------*/
|
||||
@ -4681,8 +4629,6 @@ static void clif_getareachar_pc(struct map_session_data* sd,struct map_session_d
|
||||
clif_spiritball_single(sd->fd, dstsd);
|
||||
if (dstsd->spiritcharm_type != CHARM_TYPE_NONE && dstsd->spiritcharm > 0)
|
||||
clif_spiritcharm_single(sd->fd, dstsd);
|
||||
if (dstsd->soulball > 0)
|
||||
clif_soulball_single(sd->fd, dstsd);
|
||||
if( (sd->status.party_id && dstsd->status.party_id == sd->status.party_id) || //Party-mate, or hpdisp setting.
|
||||
(sd->bg_id && sd->bg_id == dstsd->bg_id) || //BattleGround
|
||||
pc_has_permission(sd, PC_PERM_VIEW_HPMETER)
|
||||
@ -6081,10 +6027,6 @@ void clif_status_change_sub(struct block_list *bl, int id, int type, int flag, t
|
||||
|
||||
nullpo_retv(bl);
|
||||
|
||||
// Statuses with an infinite duration, but still needs a duration sent to display properly.
|
||||
if (type == EFST_LUNARSTANCE || type == EFST_UNIVERSESTANCE || type == EFST_SUNSTANCE || type == EFST_STARSTANCE)
|
||||
tick = 200;
|
||||
|
||||
#if PACKETVER >= 20120618
|
||||
if (flag && battle_config.display_status_timers)
|
||||
WBUFW(buf,0) = 0x983;
|
||||
@ -9561,8 +9503,6 @@ void clif_refresh(struct map_session_data *sd)
|
||||
clif_spiritball_single(sd->fd, sd);
|
||||
if (sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0)
|
||||
clif_spiritcharm_single(sd->fd, sd);
|
||||
if (sd->soulball)
|
||||
clif_soulball_single(sd->fd, sd);
|
||||
if (sd->vd.cloth_color)
|
||||
clif_refreshlook(&sd->bl,sd->bl.id,LOOK_CLOTHES_COLOR,sd->vd.cloth_color,SELF);
|
||||
if (sd->vd.body_style)
|
||||
@ -10765,7 +10705,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
|
||||
if(!sd->state.autotrade && mapdata->flag[MF_LOADEVENT]) // Lance
|
||||
npc_script_event(sd, NPCE_LOADMAP);
|
||||
|
||||
if (pc_checkskill(sd, SG_DEVIL) && ((sd->class_&MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || pc_is_maxjoblv(sd)))
|
||||
if (pc_checkskill(sd, SG_DEVIL) && pc_is_maxjoblv(sd))
|
||||
clif_status_load(&sd->bl, EFST_DEVIL1, 1); //blindness [Komurka]
|
||||
|
||||
if (sd->sc.opt2) //Client loses these on warp.
|
||||
@ -11045,7 +10985,7 @@ void clif_parse_QuitGame(int fd, struct map_session_data *sd)
|
||||
{
|
||||
/* Rovert's prevent logout option fixed [Valaris] */
|
||||
//int type = RFIFOW(fd,packet_db[RFIFOW(fd,0)].pos[0]);
|
||||
if( !sd->sc.data[SC_CLOAKING] && !sd->sc.data[SC_HIDING] && !sd->sc.data[SC_CHASEWALK] && !sd->sc.data[SC_CLOAKINGEXCEED] && !sd->sc.data[SC_SUHIDE] && !sd->sc.data[SC_NEWMOON] &&
|
||||
if( !sd->sc.data[SC_CLOAKING] && !sd->sc.data[SC_HIDING] && !sd->sc.data[SC_CHASEWALK] && !sd->sc.data[SC_CLOAKINGEXCEED] && !sd->sc.data[SC_SUHIDE] &&
|
||||
(!battle_config.prevent_logout || sd->canlog_tick == 0 || DIFF_TICK(gettick(), sd->canlog_tick) > battle_config.prevent_logout) )
|
||||
{
|
||||
set_eof(fd);
|
||||
@ -11281,8 +11221,7 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type,
|
||||
(sd->sc.data[SC_AUTOCOUNTER] && action_type != 0x07) ||
|
||||
sd->sc.data[SC_BLADESTOP] ||
|
||||
sd->sc.data[SC__MANHOLE] ||
|
||||
sd->sc.data[SC_SUHIDE] ||
|
||||
sd->sc.data[SC_GRAVITYCONTROL]))
|
||||
sd->sc.data[SC_SUHIDE] ))
|
||||
return;
|
||||
|
||||
if(action_type != 0x00 && action_type != 0x07)
|
||||
@ -11409,7 +11348,7 @@ void clif_parse_Restart(int fd, struct map_session_data *sd)
|
||||
break;
|
||||
case 0x01:
|
||||
/* Rovert's Prevent logout option - Fixed [Valaris] */
|
||||
if( !sd->sc.data[SC_CLOAKING] && !sd->sc.data[SC_HIDING] && !sd->sc.data[SC_CHASEWALK] && !sd->sc.data[SC_CLOAKINGEXCEED] && !sd->sc.data[SC_SUHIDE] && !sd->sc.data[SC_NEWMOON] &&
|
||||
if( !sd->sc.data[SC_CLOAKING] && !sd->sc.data[SC_HIDING] && !sd->sc.data[SC_CHASEWALK] && !sd->sc.data[SC_CLOAKINGEXCEED] && !sd->sc.data[SC_SUHIDE] &&
|
||||
(!battle_config.prevent_logout || sd->canlog_tick == 0 || DIFF_TICK(gettick(), sd->canlog_tick) > battle_config.prevent_logout) )
|
||||
{ //Send to char-server for character selection.
|
||||
pc_damage_log_clear(sd,0);
|
||||
|
@ -714,7 +714,6 @@ void clif_skillunit_update(struct block_list* bl);
|
||||
void clif_autospell(struct map_session_data *sd,uint16 skill_lv);
|
||||
void clif_devotion(struct block_list *src, struct map_session_data *tsd);
|
||||
void clif_spiritball(struct block_list *bl);
|
||||
void clif_soulball(struct map_session_data *sd);
|
||||
void clif_combo_delay(struct block_list *bl,t_tick wait);
|
||||
void clif_bladestop(struct block_list *src, int dst_id, int active);
|
||||
void clif_changemapcell(int fd, int16 m, int x, int y, int type, enum send_target target);
|
||||
|
@ -2146,10 +2146,6 @@ int map_quit(struct map_session_data *sd) {
|
||||
status_change_end(&sd->bl, SC_GLASTHEIM_STATE, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_GLASTHEIM_ITEMDEF, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_GLASTHEIM_HPSP, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_SOULGOLEM, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_SOULSHADOW, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_SOULFALCON, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_SOULFAIRY, INVALID_TIMER);
|
||||
}
|
||||
}
|
||||
|
||||
|
150
src/map/pc.cpp
150
src/map/pc.cpp
@ -505,115 +505,6 @@ void pc_delspiritball(struct map_session_data *sd,int count,int type)
|
||||
}
|
||||
}
|
||||
|
||||
static TIMER_FUNC(pc_soulball_timer)
|
||||
{
|
||||
struct map_session_data *sd;
|
||||
|
||||
if ((sd = (struct map_session_data *)map_id2sd(id)) == nullptr || sd->bl.type != BL_PC)
|
||||
return 1;
|
||||
|
||||
if (sd->soulball <= 0) {
|
||||
ShowError("pc_soulball_timer: %d soulball's available. (aid=%d tid=%d)\n", sd->soulball, sd->status.account_id, tid);
|
||||
sd->soulball = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int i;
|
||||
|
||||
ARR_FIND(0, sd->soulball, i, sd->soul_timer[i] == tid);
|
||||
if (i == sd->soulball) {
|
||||
ShowError("pc_soulball_timer: timer not found (aid=%d tid=%d)\n", sd->status.account_id, tid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sd->soulball--;
|
||||
if (i != sd->soulball)
|
||||
memmove(sd->soul_timer + i, sd->soul_timer + i + 1, (sd->soulball - i) * sizeof(int));
|
||||
sd->soul_timer[sd->soulball] = INVALID_TIMER;
|
||||
clif_soulball(sd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a soulball to player for 'interval' ms
|
||||
* @param sd: Player data
|
||||
* @param interval: Duration
|
||||
* @param max: Max amount of soulballs
|
||||
*/
|
||||
int pc_addsoulball(struct map_session_data *sd, int interval, int max)
|
||||
{
|
||||
nullpo_ret(sd);
|
||||
|
||||
max = min(max, MAX_SOUL_BALL);
|
||||
sd->soulball = cap_value(sd->soulball, 0, MAX_SOUL_BALL);
|
||||
|
||||
if (sd->soulball && sd->soulball >= max) {
|
||||
if (sd->soul_timer[0] != INVALID_TIMER)
|
||||
delete_timer(sd->soul_timer[0], pc_soulball_timer);
|
||||
sd->soulball--;
|
||||
if (sd->soulball != 0)
|
||||
memmove(sd->soul_timer + 0, sd->soul_timer + 1, (sd->soulball) * sizeof(int));
|
||||
sd->soul_timer[sd->soulball] = INVALID_TIMER;
|
||||
}
|
||||
|
||||
if (interval > 0) {
|
||||
int tid = add_timer(gettick() + interval, pc_soulball_timer, sd->bl.id, 0), i;
|
||||
|
||||
ARR_FIND(0, sd->soulball, i, sd->soul_timer[i] == INVALID_TIMER || DIFF_TICK(get_timer(tid)->tick, get_timer(sd->soul_timer[i])->tick) < 0);
|
||||
if (i != sd->soulball)
|
||||
memmove(sd->soul_timer + i + 1, sd->soul_timer + i, (sd->soulball - i) * sizeof(int));
|
||||
sd->soul_timer[i] = tid;
|
||||
}
|
||||
|
||||
sd->soulball++;
|
||||
clif_soulball(sd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes number of soulball from player
|
||||
* @param sd: Player data
|
||||
* @param count: Amount to remove
|
||||
* @param type: 1 = doesn't give client effect
|
||||
*/
|
||||
int pc_delsoulball(struct map_session_data *sd, int count, int type)
|
||||
{
|
||||
nullpo_ret(sd);
|
||||
|
||||
if (sd->soulball <= 0) {
|
||||
sd->soulball = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (count <= 0)
|
||||
return 0;
|
||||
|
||||
if (count > sd->soulball)
|
||||
count = sd->soulball;
|
||||
sd->soulball -= count;
|
||||
if (count > MAX_SKILL_LEVEL)
|
||||
count = MAX_SKILL_LEVEL;
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (sd->soul_timer[i] != INVALID_TIMER) {
|
||||
delete_timer(sd->soul_timer[i], pc_soulball_timer);
|
||||
sd->soul_timer[i] = INVALID_TIMER;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = count; i < MAX_SKILL_LEVEL; i++) {
|
||||
sd->soul_timer[i - count] = sd->soul_timer[i];
|
||||
sd->soul_timer[i] = INVALID_TIMER;
|
||||
}
|
||||
|
||||
if (!type)
|
||||
clif_soulball(sd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Increases a player's fame points and displays a notice to him
|
||||
* @param sd Player
|
||||
@ -1492,8 +1383,6 @@ bool pc_authok(struct map_session_data *sd, uint32 login_id2, time_t expiration_
|
||||
|
||||
for(i = 0; i < MAX_SPIRITBALL; i++)
|
||||
sd->spirit_timer[i] = INVALID_TIMER;
|
||||
for (i = 0; i < MAX_SOUL_BALL; i++)
|
||||
sd->soul_timer[i] = INVALID_TIMER;
|
||||
|
||||
if (battle_config.item_auto_get)
|
||||
sd->state.autoloot = 10000;
|
||||
@ -6127,13 +6016,6 @@ bool pc_memo(struct map_session_data* sd, int pos)
|
||||
* @return player skill cooldown
|
||||
*/
|
||||
int pc_get_skillcooldown(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv) {
|
||||
if (skill_id == SJ_NOVAEXPLOSING) {
|
||||
struct status_change *sc = status_get_sc(&sd->bl);
|
||||
|
||||
if (sc && sc->data[SC_DIMENSION])
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cooldown = skill_get_cooldown(skill_id, skill_lv);
|
||||
|
||||
if (cooldown == 0)
|
||||
@ -7018,7 +6900,7 @@ int pc_checkjoblevelup(struct map_session_data *sd)
|
||||
clif_updatestatus(sd,SP_SKILLPOINT);
|
||||
status_calc_pc(sd,SCO_FORCE);
|
||||
clif_misceffect(&sd->bl,1);
|
||||
if (pc_checkskill(sd, SG_DEVIL) && ((sd->class_&MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || pc_is_maxjoblv(sd)) )
|
||||
if (pc_checkskill(sd, SG_DEVIL) && pc_is_maxbaselv(sd))
|
||||
clif_status_change(&sd->bl, EFST_DEVIL1, 1, 0, 0, 0, 1); //Permanent blind effect from SG_DEVIL.
|
||||
|
||||
npc_script_event(sd, NPCE_JOBLVUP);
|
||||
@ -7574,8 +7456,6 @@ void pc_skillup(struct map_session_data *sd,uint16 skill_id)
|
||||
clif_updatestatus(sd,SP_SKILLPOINT);
|
||||
if( skill_id == GN_REMODELING_CART ) /* cart weight info was updated by status_calc_pc */
|
||||
clif_updatestatus(sd,SP_CARTINFO);
|
||||
if (pc_checkskill(sd, SG_DEVIL) && ((sd->class_&MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || pc_is_maxjoblv(sd)))
|
||||
clif_status_change(&sd->bl, EFST_DEVIL1, 1, 0, 0, 0, 1); //Permanent blind effect from SG_DEVIL.
|
||||
if (!pc_has_permission(sd, PC_PERM_ALL_SKILL)) // may skill everything at any time anyways, and this would cause a huge slowdown
|
||||
clif_skillinfoblock(sd);
|
||||
}
|
||||
@ -7804,7 +7684,7 @@ int pc_resetskill(struct map_session_data* sd, int flag)
|
||||
if( pc_is_taekwon_ranker(sd) )
|
||||
return 0;
|
||||
|
||||
if( pc_checkskill(sd, SG_DEVIL) && ((sd->class_&MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || pc_is_maxjoblv(sd)) )
|
||||
if( pc_checkskill(sd, SG_DEVIL) && pc_is_maxjoblv(sd) )
|
||||
clif_status_load(&sd->bl, EFST_DEVIL1, 0); //Remove perma blindness due to skill-reset. [Skotlex]
|
||||
i = sd->sc.option;
|
||||
if( i&OPTION_RIDING && pc_checkskill(sd, KN_RIDING) )
|
||||
@ -7922,7 +7802,7 @@ int pc_resethate(struct map_session_data* sd)
|
||||
int i;
|
||||
nullpo_ret(sd);
|
||||
|
||||
for (i=0; i<MAX_PC_FEELHATE; i++)
|
||||
for (i=0; i<3; i++)
|
||||
{
|
||||
sd->hate_mob[i] = -1;
|
||||
pc_setglobalreg(sd, add_str(sg_info[i].hate_var), 0);
|
||||
@ -8150,27 +8030,6 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
|
||||
sd->devotion[k] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (k = 0; k < MAX_STELLAR_MARKS; k++) {
|
||||
if (sd->stellar_mark[k]) {
|
||||
struct map_session_data *smarksd = map_id2sd(sd->stellar_mark[k]);
|
||||
|
||||
if (smarksd)
|
||||
status_change_end(&smarksd->bl, SC_FLASHKICK, INVALID_TIMER);
|
||||
sd->stellar_mark[k] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (k = 0; k < MAX_UNITED_SOULS; k++) {
|
||||
if (sd->united_soul[k]) {
|
||||
struct map_session_data *usoulsd = map_id2sd(sd->united_soul[k]);
|
||||
|
||||
if (usoulsd)
|
||||
status_change_end(&usoulsd->bl, SC_SOULUNITY, INVALID_TIMER);
|
||||
sd->united_soul[k] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(sd->shadowform_id) { //if we were target of shadowform
|
||||
status_change_end(map_id2bl(sd->shadowform_id), SC__SHADOWFORM, INVALID_TIMER);
|
||||
sd->shadowform_id = 0; //should be remove on status end anyway
|
||||
@ -8229,8 +8088,6 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
|
||||
|
||||
if ( sd->spiritball !=0 )
|
||||
pc_delspiritball(sd,sd->spiritball,0);
|
||||
if (sd->soulball != 0)
|
||||
pc_delsoulball(sd, sd->soulball, 0);
|
||||
|
||||
if (sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0)
|
||||
pc_delspiritcharm(sd,sd->spiritcharm,sd->spiritcharm_type);
|
||||
@ -13416,7 +13273,6 @@ void do_init_pc(void) {
|
||||
add_timer_func_list(pc_calc_pvprank_timer, "pc_calc_pvprank_timer");
|
||||
add_timer_func_list(pc_autosave, "pc_autosave");
|
||||
add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer");
|
||||
add_timer_func_list(pc_soulball_timer, "pc_soulball_timer");
|
||||
add_timer_func_list(pc_follow_timer, "pc_follow_timer");
|
||||
add_timer_func_list(pc_endautobonus, "pc_endautobonus");
|
||||
add_timer_func_list(pc_spiritcharm_timer, "pc_spiritcharm_timer");
|
||||
|
@ -35,9 +35,6 @@ enum sc_type : int16;
|
||||
#define MAX_SPIRITBALL 15 /// Max spirit balls
|
||||
#define MAX_DEVOTION 5 /// Max Devotion slots
|
||||
#define MAX_SPIRITCHARM 10 /// Max spirit charms
|
||||
#define MAX_SOUL_BALL 20 /// Max soul ball
|
||||
#define MAX_STELLAR_MARKS 5 /// Max stellar marks
|
||||
#define MAX_UNITED_SOULS 12 /// Max united souls
|
||||
|
||||
#define LANGTYPE_VAR "#langtype"
|
||||
#define CASHPOINT_VAR "#CASHPOINTS"
|
||||
@ -537,16 +534,12 @@ struct map_session_data {
|
||||
short spiritcharm; //No. of spirit
|
||||
int spiritcharm_type; //Spirit type
|
||||
int spiritcharm_timer[MAX_SPIRITCHARM];
|
||||
int8 soulball, soulball_old;
|
||||
int soul_timer[MAX_SOUL_BALL];
|
||||
|
||||
unsigned char potion_success_counter; //Potion successes in row counter
|
||||
unsigned char mission_count; //Stores the bounty kill count for TK_MISSION
|
||||
short mission_mobid; //Stores the target mob_id for TK_MISSION
|
||||
int die_counter; //Total number of times you've died
|
||||
int devotion[MAX_DEVOTION]; //Stores the account IDs of chars devoted to.
|
||||
int stellar_mark[MAX_STELLAR_MARKS]; // Stores the account ID's of character's with a stellar mark.
|
||||
int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united.
|
||||
|
||||
int trade_partner;
|
||||
struct s_deal {
|
||||
@ -1299,9 +1292,6 @@ void pc_delinvincibletimer(struct map_session_data* sd);
|
||||
|
||||
void pc_addspiritball(struct map_session_data *sd,int interval,int max);
|
||||
void pc_delspiritball(struct map_session_data *sd,int count,int type);
|
||||
int pc_addsoulball(struct map_session_data *sd,int interval,int max);
|
||||
int pc_delsoulball(struct map_session_data *sd,int count,int type);
|
||||
|
||||
void pc_addfame(struct map_session_data *sd,int count);
|
||||
unsigned char pc_famerank(uint32 char_id, int job);
|
||||
bool pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl);
|
||||
|
@ -1546,35 +1546,6 @@
|
||||
export_constant(SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT);
|
||||
export_constant(SC_ADAPTATION);
|
||||
export_constant(SC_BASILICA_CELL);
|
||||
export_constant(SC_LIGHTOFMOON);
|
||||
export_constant(SC_LIGHTOFSUN);
|
||||
export_constant(SC_LIGHTOFSTAR);
|
||||
export_constant(SC_LUNARSTANCE);
|
||||
export_constant(SC_UNIVERSESTANCE);
|
||||
export_constant(SC_SUNSTANCE);
|
||||
export_constant(SC_FLASHKICK);
|
||||
export_constant(SC_NEWMOON);
|
||||
export_constant(SC_STARSTANCE);
|
||||
export_constant(SC_DIMENSION);
|
||||
export_constant(SC_DIMENSION1);
|
||||
export_constant(SC_DIMENSION2);
|
||||
export_constant(SC_CREATINGSTAR);
|
||||
export_constant(SC_FALLINGSTAR);
|
||||
export_constant(SC_NOVAEXPLOSING);
|
||||
export_constant(SC_GRAVITYCONTROL);
|
||||
export_constant(SC_SOULCOLLECT);
|
||||
export_constant(SC_SOULREAPER);
|
||||
export_constant(SC_SOULUNITY);
|
||||
export_constant(SC_SOULSHADOW);
|
||||
export_constant(SC_SOULFAIRY);
|
||||
export_constant(SC_SOULFALCON);
|
||||
export_constant(SC_SOULGOLEM);
|
||||
export_constant(SC_SOULDIVISION);
|
||||
export_constant(SC_SOULENERGY);
|
||||
export_constant(SC_USE_SKILL_SP_SPA);
|
||||
export_constant(SC_USE_SKILL_SP_SHA);
|
||||
export_constant(SC_SP_SHA);
|
||||
export_constant(SC_SOULCURSE);
|
||||
#ifdef RENEWAL
|
||||
export_constant(SC_EXTREMITYFIST2);
|
||||
#endif
|
||||
@ -7718,7 +7689,6 @@
|
||||
export_constant(UNT_FIRE_RAIN);
|
||||
export_constant(UNT_CATNIPPOWDER);
|
||||
export_constant(UNT_NYANGGRASS);
|
||||
export_constant(UNT_CREATINGSTAR);
|
||||
export_constant(UNT_GD_LEADERSHIP);
|
||||
export_constant(UNT_GD_GLORYWOUNDS);
|
||||
export_constant(UNT_GD_SOULCOLD);
|
||||
|
@ -1633,13 +1633,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
status_change_end(bl, SC_KAAHI, INVALID_TIMER);
|
||||
status_change_end(bl, SC_ONEHAND, INVALID_TIMER);
|
||||
status_change_end(bl, SC_ASPDPOTION2, INVALID_TIMER);
|
||||
// New soul links confirmed to not dispell with this skill
|
||||
// but thats likely a bug since soul links can't stack and
|
||||
// soul cutter skill works on them. So ill add this here for now. [Rytech]
|
||||
status_change_end(bl, SC_SOULGOLEM, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULSHADOW, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULFALCON, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULFAIRY, INVALID_TIMER);
|
||||
}
|
||||
break;
|
||||
case TK_TURNKICK:
|
||||
@ -1912,13 +1905,8 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
case KO_JYUMONJIKIRI:
|
||||
sc_start(src,bl,SC_JYUMONJIKIRI,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
||||
break;
|
||||
case SP_SOULEXPLOSION:
|
||||
case KO_SETSUDAN: // Remove soul link when hit.
|
||||
status_change_end(bl, SC_SPIRIT, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULGOLEM, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULSHADOW, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULFALCON, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULFAIRY, INVALID_TIMER);
|
||||
case KO_SETSUDAN:
|
||||
status_change_end(bl,SC_SPIRIT,INVALID_TIMER);
|
||||
break;
|
||||
case KO_MAKIBISHI:
|
||||
sc_start(src,bl, SC_STUN, 10 * skill_lv, skill_lv, skill_get_time2(skill_id,skill_lv));
|
||||
@ -2039,10 +2027,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
case SC_RECOGNIZEDSPELL: case SC_CHASEWALK2: case SC_BITE:
|
||||
case SC_ACTIVE_MONSTER_TRANSFORM: case SC_DORAM_BUF_01: case SC_DORAM_BUF_02:
|
||||
case SC_SPORE_EXPLOSION:
|
||||
case SC_NEWMOON: case SC_FLASHKICK: case SC_NOVAEXPLOSING:
|
||||
case SC_SOULUNITY: case SC_SOULSHADOW: case SC_SOULFAIRY:
|
||||
case SC_SOULFALCON: case SC_SOULGOLEM: case SC_USE_SKILL_SP_SPA:
|
||||
case SC_USE_SKILL_SP_SHA: case SC_SP_SHA:
|
||||
#ifdef RENEWAL
|
||||
case SC_EXTREMITYFIST2:
|
||||
#endif
|
||||
@ -2112,18 +2096,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
case SU_LUNATICCARROTBEAT2:
|
||||
sc_start(src, bl, SC_STUN, 20, skill_lv, skill_get_time2(skill_id, skill_lv));
|
||||
break;
|
||||
case SJ_FULLMOONKICK:
|
||||
sc_start(src, bl, SC_BLIND, 15 + 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
break;
|
||||
case SJ_STAREMPEROR:
|
||||
sc_start(src, bl, SC_SILENCE, 50 + 10 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
break;
|
||||
case SP_CURSEEXPLOSION:
|
||||
status_change_end(bl, SC_SOULCURSE, INVALID_TIMER);
|
||||
break;
|
||||
case SP_SHA:
|
||||
sc_start(src, bl, SC_SP_SHA, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
break;
|
||||
} //end switch skill_id
|
||||
|
||||
if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai)
|
||||
@ -2477,15 +2449,6 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SP_SPA:
|
||||
sc_start(src, src, SC_USE_SKILL_SP_SPA, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
break;
|
||||
case SP_SHA:
|
||||
sc_start(src, src, SC_USE_SKILL_SP_SHA, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
|
||||
break;
|
||||
case SP_SWHOO:
|
||||
sc_start(src, src, SC_USE_SKILL_SP_SHA, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
break;
|
||||
}
|
||||
|
||||
if(sd && (sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR &&
|
||||
@ -3116,10 +3079,6 @@ void skill_combo(struct block_list* src,struct block_list *dsrc, struct block_li
|
||||
if (pc_checkskill(sd, SR_TIGERCANNON) > 0 || pc_checkskill(sd, SR_GATEOFHELL) > 0)
|
||||
duration = 1;
|
||||
break;
|
||||
case SJ_PROMINENCEKICK:
|
||||
if (pc_checkskill(sd, SJ_SOLARBURST) > 0)
|
||||
duration = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else { //other
|
||||
@ -3499,7 +3458,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
nbl = battle_getenemyarea(bl,bl->x,bl->y,2,BL_CHAR,bl->id);
|
||||
if( nbl ){ // Only one target is chosen.
|
||||
damage = damage / 2; // Deflect half of the damage to a target nearby
|
||||
clif_skill_damage(bl, nbl, tick, status_get_amotion(src), 0, status_fix_damage(bl,nbl,damage,0,0), dmg.div_, OB_OBOROGENSOU_TRANSITION_ATK, -1, DMG_SINGLE);
|
||||
clif_skill_damage(bl, nbl, tick, status_get_amotion(src), 0, status_fix_damage(bl,nbl,damage,0), dmg.div_, OB_OBOROGENSOU_TRANSITION_ATK, -1, DMG_SINGLE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3674,22 +3633,12 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
break;
|
||||
case SU_LUNATICCARROTBEAT:
|
||||
case SU_LUNATICCARROTBEAT2:
|
||||
case SP_CURSEEXPLOSION:
|
||||
case SP_SPA:
|
||||
case SP_SHA:
|
||||
if (dmg.div_ < 2)
|
||||
type = DMG_SPLASH;
|
||||
if (!(flag&SD_ANIMATION))
|
||||
clif_skill_nodamage(dsrc, bl, skill_id, skill_lv, 1);
|
||||
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, dmg_type);
|
||||
break;
|
||||
case SJ_FALLINGSTAR_ATK:
|
||||
case SJ_FALLINGSTAR_ATK2:
|
||||
dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_MULTI_HIT);
|
||||
break;
|
||||
case SJ_NOVAEXPLOSING:
|
||||
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, DMG_SINGLE);
|
||||
break;
|
||||
case AB_DUPLELIGHT_MELEE:
|
||||
case AB_DUPLELIGHT_MAGIC:
|
||||
dmg.amotion = 300;/* makes the damage value not overlap with previous damage (when displayed by the client) */
|
||||
@ -3730,7 +3679,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
|| skill_id == HW_GRAVITATION
|
||||
#endif
|
||||
|| skill_id == NPC_EVILLAND) && !shadow_flag )
|
||||
status_fix_damage(src,bl,damage,dmg.dmotion,skill_id); //Deal damage before knockback to allow stuff like firewall+storm gust combo.
|
||||
status_fix_damage(src,bl,damage,dmg.dmotion); //Deal damage before knockback to allow stuff like firewall+storm gust combo.
|
||||
if( !status_isdead(bl) && additional_effects )
|
||||
skill_additional_effect(src,bl,skill_id,skill_lv,dmg.flag,dmg.dmg_lv,tick);
|
||||
if( damage > 0 ) //Counter status effects [Skotlex]
|
||||
@ -3752,7 +3701,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
battle_delay_damage(tick, dmg.amotion,src,bl,dmg.flag,skill_id,skill_lv,damage,dmg.dmg_lv,dmg.dmotion, additional_effects, false);
|
||||
}
|
||||
|
||||
if (tsc && skill_id != NPC_EVILLAND && skill_id != SP_SOULEXPLOSION && skill_id != SJ_NOVAEXPLOSING
|
||||
if (tsc && skill_id != NPC_EVILLAND
|
||||
#ifndef RENEWAL
|
||||
&& skill_id != PA_PRESSURE && skill_id != HW_GRAVITATION
|
||||
#endif
|
||||
@ -3768,7 +3717,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
{
|
||||
if (!rmdamage) {
|
||||
clif_damage(d_bl, d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0, false);
|
||||
status_fix_damage(NULL, d_bl, damage, 0, 0);
|
||||
status_fix_damage(NULL, d_bl, damage, 0);
|
||||
} else {
|
||||
bool isDevotRdamage = false;
|
||||
|
||||
@ -3778,12 +3727,12 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
// This check is only for magical skill.
|
||||
// For BF_WEAPON skills types track var rdamage and function battle_calc_return_damage
|
||||
clif_damage(bl, (!isDevotRdamage) ? bl : d_bl, gettick(), 0, 0, damage, 0, DMG_NORMAL, 0, false);
|
||||
status_fix_damage(bl, (!isDevotRdamage) ? bl : d_bl, damage, 0, 0);
|
||||
status_fix_damage(bl, (!isDevotRdamage) ? bl : d_bl, damage, 0);
|
||||
}
|
||||
} else {
|
||||
status_change_end(bl, SC_DEVOTION, INVALID_TIMER);
|
||||
if (!dmg.amotion)
|
||||
status_fix_damage(src, bl, damage, dmg.dmotion, 0);
|
||||
status_fix_damage(src, bl, damage, dmg.dmotion);
|
||||
}
|
||||
}
|
||||
if (tsc->data[SC_WATER_SCREEN_OPTION]) {
|
||||
@ -3793,10 +3742,10 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
if (e_bl) {
|
||||
if (!rmdamage) {
|
||||
clif_skill_damage(e_bl, e_bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id));
|
||||
status_fix_damage(NULL, e_bl, damage, 0, 0);
|
||||
status_fix_damage(NULL, e_bl, damage, 0);
|
||||
} else {
|
||||
clif_skill_damage(bl, bl, gettick(), 0, 0, damage, dmg.div_, skill_id, -1, skill_get_hit(skill_id));
|
||||
status_fix_damage(bl, bl, damage, 0, 0);
|
||||
status_fix_damage(bl, bl, damage, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4660,7 +4609,7 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui
|
||||
}
|
||||
case 4: // THE CHARIOT - 1000 damage, random armor destroyed
|
||||
{
|
||||
status_fix_damage(src, target, 1000, 0, skill_id);
|
||||
status_fix_damage(src, target, 1000, 0);
|
||||
clif_damage(src, target, tick, 0, 0, 1000, 0, DMG_NORMAL, 0, false);
|
||||
if (!status_isdead(target))
|
||||
{
|
||||
@ -4710,7 +4659,7 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui
|
||||
}
|
||||
case 11: // THE DEVIL - 6666 damage, atk and matk halved, cursed
|
||||
{
|
||||
status_fix_damage(src, target, 6666, 0, skill_id);
|
||||
status_fix_damage(src, target, 6666, 0);
|
||||
clif_damage(src, target, tick, 0, 0, 6666, 0, DMG_NORMAL, 0, false);
|
||||
sc_start(src, target, SC_INCATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
|
||||
sc_start(src, target, SC_INCMATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
|
||||
@ -4719,7 +4668,7 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui
|
||||
}
|
||||
case 12: // THE TOWER - 4444 damage
|
||||
{
|
||||
status_fix_damage(src, target, 4444, 0, skill_id);
|
||||
status_fix_damage(src, target, 4444, 0);
|
||||
clif_damage(src, target, tick, 0, 0, 4444, 0, DMG_NORMAL, 0, false);
|
||||
break;
|
||||
}
|
||||
@ -5206,15 +5155,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
case SU_SCRATCH:
|
||||
case SU_LUNATICCARROTBEAT:
|
||||
case SU_LUNATICCARROTBEAT2:
|
||||
case SJ_FULLMOONKICK:
|
||||
case SJ_NEWMOONKICK:
|
||||
case SJ_SOLARBURST:
|
||||
case SJ_PROMINENCEKICK:
|
||||
case SJ_STAREMPEROR:
|
||||
case SJ_FALLINGSTAR_ATK2:
|
||||
case SP_CURSEEXPLOSION:
|
||||
case SP_SHA:
|
||||
case SP_SWHOO:
|
||||
if( flag&1 ) {//Recursive invocation
|
||||
int sflag = skill_area_temp[0] & 0xFFF;
|
||||
int heal = 0;
|
||||
@ -5228,18 +5168,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
if( skill_area_temp[1] != bl->id && !inf2[INF2_ISNPC] )
|
||||
sflag |= SD_ANIMATION; // original target gets no animation (as well as all NPC skills)
|
||||
|
||||
// If a enemy player is standing next to a mob when splash Es- skill is casted, the player won't get hurt.
|
||||
if ((skill_id == SP_SHA || skill_id == SP_SWHOO) && !battle_config.allow_es_magic_pc && bl->type != BL_MOB)
|
||||
break;
|
||||
|
||||
heal = (int)skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag);
|
||||
if( skill_id == NPC_VAMPIRE_GIFT && heal > 0 ) {
|
||||
clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1);
|
||||
status_heal(src,heal,0,0);
|
||||
}
|
||||
|
||||
if (skill_id == SJ_PROMINENCEKICK) // Trigger the 2nd hit. (100% fire damage.)
|
||||
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag|8|SD_ANIMATION);
|
||||
} else {
|
||||
int starget = BL_CHAR|BL_SKILL;
|
||||
|
||||
@ -5247,15 +5180,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
skill_area_temp[1] = bl->id;
|
||||
skill_area_temp[2] = 0;
|
||||
|
||||
if (sd && (skill_id == SP_SHA || skill_id == SP_SWHOO) && !battle_config.allow_es_magic_pc && bl->type != BL_MOB) {
|
||||
status_change_start(src, bl, SC_STUN, 10000, skill_lv, 0, 0, 0, 500, 10);
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
if (skill_id == SP_SWHOO)
|
||||
status_change_end(src, SC_USE_SKILL_SP_SPA, INVALID_TIMER);
|
||||
|
||||
switch ( skill_id ) {
|
||||
case LG_EARTHDRIVE:
|
||||
case GN_CARTCANNON:
|
||||
@ -5528,33 +5452,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
skill_attack(BF_MAGIC, src, src, bl, skill_id, skill_lv, tick, flag);
|
||||
break;
|
||||
|
||||
case SJ_NOVAEXPLOSING:
|
||||
skill_attack(BF_MISC, src, src, bl, skill_id, skill_lv, tick, flag);
|
||||
|
||||
// We can end Dimension here since the cooldown code is processed before this point.
|
||||
if (sc && sc->data[SC_DIMENSION])
|
||||
status_change_end(src, SC_DIMENSION, INVALID_TIMER);
|
||||
else // Dimension not active? Activate the 2 second skill block penalty.
|
||||
sc_start(src, &sd->bl, SC_NOVAEXPLOSING, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
break;
|
||||
|
||||
case SP_SOULEXPLOSION:
|
||||
if (!(tsc && (tsc->data[SC_SPIRIT] || tsc->data[SC_SOULGOLEM] || tsc->data[SC_SOULSHADOW] || tsc->data[SC_SOULFALCON] || tsc->data[SC_SOULFAIRY])) || tstatus->hp < 10 * tstatus->max_hp / 100) { // Requires target to have a soul link and more then 10% of MaxHP.
|
||||
// With this skill requiring a soul link, and the target to have more then 10% if MaxHP, I wonder
|
||||
// if the cooldown still happens after it fails. Need a confirm. [Rytech]
|
||||
if (sd)
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
skill_attack(BF_MISC, src, src, bl, skill_id, skill_lv, tick, flag);
|
||||
break;
|
||||
|
||||
case SL_SMA:
|
||||
status_change_end(src, SC_SMA, INVALID_TIMER);
|
||||
case SL_STIN:
|
||||
case SL_STUN:
|
||||
case SP_SPA:
|
||||
if (sd && !battle_config.allow_es_magic_pc && bl->type != BL_MOB) {
|
||||
status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF);
|
||||
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
||||
@ -5993,7 +5894,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_NEWMOON, INVALID_TIMER);
|
||||
if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
||||
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
||||
sc_start(src,bl, SC_INFRAREDSCAN, 10000, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
@ -6295,80 +6195,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
}
|
||||
break;
|
||||
|
||||
case SJ_FALLINGSTAR_ATK:
|
||||
if (sd) { // If a player used the skill it will search for targets marked by that player.
|
||||
if (tsc && tsc->data[SC_FLASHKICK] && tsc->data[SC_FLASHKICK]->val4 == 1) { // Mark placed by a player.
|
||||
int8 i = 0;
|
||||
|
||||
ARR_FIND(0, MAX_STELLAR_MARKS, i, sd->stellar_mark[i] == bl->id);
|
||||
if (i < MAX_STELLAR_MARKS) {
|
||||
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
|
||||
skill_castend_damage_id(src, bl, SJ_FALLINGSTAR_ATK2, skill_lv, tick, 0);
|
||||
}
|
||||
}
|
||||
} else if ( tsc && tsc->data[SC_FLASHKICK] && tsc->data[SC_FLASHKICK]->val4 == 2 ) { // Mark placed by a monster.
|
||||
// If a monster used the skill it will search for targets marked by any monster since they can't track their own targets.
|
||||
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
|
||||
skill_castend_damage_id(src, bl, SJ_FALLINGSTAR_ATK2, skill_lv, tick, 0);
|
||||
}
|
||||
break;
|
||||
case SJ_FLASHKICK: {
|
||||
struct map_session_data *tsd = BL_CAST(BL_PC, bl);
|
||||
struct mob_data *md = BL_CAST(BL_MOB, src), *tmd = BL_CAST(BL_MOB, bl);
|
||||
|
||||
// Only players and monsters can be tagged....I think??? [Rytech]
|
||||
// Lets only allow players and monsters to use this skill for safety reasons.
|
||||
if ((!tsd && !tmd) || !sd && !md) {
|
||||
if (sd)
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if the target is already tagged by another source.
|
||||
if ((tsd && tsd->sc.data[SC_FLASHKICK] && tsd->sc.data[SC_FLASHKICK]->val1 != src->id) || (tmd && tmd->sc.data[SC_FLASHKICK] && tmd->sc.data[SC_FLASHKICK]->val1 != src->id)) { // Same as the above check, but for monsters.
|
||||
// Can't tag a player that was already tagged from another source.
|
||||
if (sd)
|
||||
clif_skill_fail(sd,skill_id, USESKILL_FAIL, 0);
|
||||
map_freeblock_unlock();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Attack the target and return the damage result for the upcoming check.
|
||||
int64 fk_damage = skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
|
||||
|
||||
if (sd) { // Tagging the target.
|
||||
int i;
|
||||
|
||||
ARR_FIND(0, MAX_STELLAR_MARKS, i, sd->stellar_mark[i] == bl->id);
|
||||
if (i == MAX_STELLAR_MARKS) {
|
||||
ARR_FIND(0, MAX_STELLAR_MARKS, i, sd->stellar_mark[i] == 0);
|
||||
if (i == MAX_STELLAR_MARKS) { // Max number of targets tagged. Fail the skill.
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
map_freeblock_unlock();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Tag the target only if damage was done. If it deals no damage, it counts as a miss and won't tag.
|
||||
// Note: Not sure if it works like this in official but you can't mark on something you can't
|
||||
// hit, right? For now well just use this logic until we can get a confirm on if it does this or not. [Rytech]
|
||||
if (fk_damage > 0) { // Add the ID of the tagged target to the player's tag list and start the status on the target.
|
||||
sd->stellar_mark[i] = bl->id;
|
||||
|
||||
// Val4 flags if the status was applied by a player or a monster.
|
||||
// This will be important for other skills that work together with this one.
|
||||
// 1 = Player, 2 = Monster.
|
||||
// Note: Because the attacker's ID and the slot number is handled here, we have to
|
||||
// apply the status here. We can't pass this data to skill_additional_effect.
|
||||
sc_start4(src, bl, SC_FLASHKICK, 100, src->id, i, skill_lv, 1, skill_get_time(skill_id, skill_lv));
|
||||
}
|
||||
} else if (md) { // Monster's cant track with this skill. Just give the status.
|
||||
if (fk_damage > 0)
|
||||
sc_start4(src, bl, SC_FLASHKICK, 100, 0, 0, skill_lv, 2, skill_get_time(skill_id, skill_lv));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skill_id);
|
||||
clif_skill_damage(src, bl, tick, status_get_amotion(src), tstatus->dmotion,
|
||||
@ -6736,15 +6562,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
}
|
||||
break;
|
||||
|
||||
case SP_SOULCURSE:
|
||||
if (flag&1)
|
||||
sc_start(src, bl, type, 30 + 10 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
else {
|
||||
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case PR_LEXDIVINA:
|
||||
case MER_LEXDIVINA:
|
||||
if (tsce)
|
||||
@ -7141,29 +6958,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case SU_FRESHSHRIMP:
|
||||
case SU_ARCLOUSEDASH:
|
||||
case NPC_MAXPAIN:
|
||||
case SP_SOULREAPER:
|
||||
case SJ_LIGHTOFMOON:
|
||||
case SJ_LIGHTOFSTAR:
|
||||
case SJ_FALLINGSTAR:
|
||||
case SJ_LIGHTOFSUN:
|
||||
case SJ_BOOKOFDIMENSION:
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
||||
break;
|
||||
|
||||
case SJ_GRAVITYCONTROL: {
|
||||
int fall_damage = sstatus->batk + sstatus->rhw.atk - tstatus->def2;
|
||||
|
||||
if (bl->type == BL_PC)
|
||||
fall_damage += dstsd->weight / 10 - tstatus->def;
|
||||
else // Monster's don't have weight. Put something in its place.
|
||||
fall_damage += 50 * status_get_lv(src) - tstatus->def;
|
||||
|
||||
fall_damage = max(1, fall_damage);
|
||||
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, fall_damage, skill_get_time(skill_id, skill_lv)));
|
||||
}
|
||||
break;
|
||||
case NPC_HALLUCINATION:
|
||||
case NPC_HELLPOWER:
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv,
|
||||
@ -7400,45 +7198,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
}
|
||||
break;
|
||||
|
||||
case SP_SOULUNITY: {
|
||||
int8 count = min(5 + skill_lv, MAX_UNITED_SOULS);
|
||||
|
||||
if (sd == nullptr || sd->status.party_id == 0 || (flag & 1)) {
|
||||
if (!dstsd || !sd) { // Only put player's souls in unity.
|
||||
if (sd)
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
if (dstsd->sc.data[type] && dstsd->sc.data[type]->val2 != src->id) { // Fail if a player is in unity with another source.
|
||||
if (sd)
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
map_freeblock_unlock();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (sd) { // Unite player's soul with caster's soul.
|
||||
i = 0;
|
||||
|
||||
ARR_FIND(0, count, i, sd->united_soul[i] == bl->id);
|
||||
if (i == count) {
|
||||
ARR_FIND(0, count, i, sd->united_soul[i] == 0);
|
||||
if(i == count) { // No more free slots? Fail the skill.
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
map_freeblock_unlock();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
sd->united_soul[i] = bl->id;
|
||||
}
|
||||
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, skill_lv, src->id, i, 0, skill_get_time(skill_id, skill_lv)));
|
||||
} else if (sd)
|
||||
party_foreachsamemap(skill_area_sub, sd, skill_get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill_castend_nodamage_id);
|
||||
}
|
||||
break;
|
||||
|
||||
case MO_CALLSPIRITS:
|
||||
if(sd) {
|
||||
int limit = skill_lv;
|
||||
@ -7555,37 +7314,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case KO_HAPPOKUNAI:
|
||||
case RL_FIREDANCE:
|
||||
case RL_R_TRIP:
|
||||
case SJ_FULLMOONKICK:
|
||||
case SJ_NEWMOONKICK:
|
||||
case SJ_SOLARBURST:
|
||||
case SJ_STAREMPEROR:
|
||||
case SJ_FALLINGSTAR_ATK:
|
||||
{
|
||||
struct status_change *sc = status_get_sc(src);
|
||||
int starget = BL_CHAR|BL_SKILL;
|
||||
|
||||
if (skill_id == SR_HOWLINGOFLION)
|
||||
starget = splash_target(src);
|
||||
if (skill_id == SJ_NEWMOONKICK) {
|
||||
if (tsce) {
|
||||
status_change_end(bl, type, INVALID_TIMER);
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
||||
break;
|
||||
} else
|
||||
sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
}
|
||||
if (skill_id == SJ_STAREMPEROR && sc && sc->data[SC_DIMENSION]) {
|
||||
if (sd) {
|
||||
// Remove old shields if any exist.
|
||||
pc_delspiritball(sd, sd->spiritball, 0);
|
||||
for (i = 0; i < 2; i++) {
|
||||
pc_addspiritball(sd, skill_get_time2(SJ_BOOKOFDIMENSION, 1), 2);
|
||||
sc_start2(src, bl, static_cast<sc_type>(SC_DIMENSION1 + i), 100, skill_lv, status_get_max_sp(src), skill_get_time2(SJ_BOOKOFDIMENSION, 1));
|
||||
}
|
||||
}
|
||||
status_change_end(src, SC_DIMENSION, INVALID_TIMER);
|
||||
}
|
||||
|
||||
skill_area_temp[1] = 0;
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget,
|
||||
@ -7679,7 +7413,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
map_freeblock_unlock();
|
||||
return 1;
|
||||
}
|
||||
status_damage(src, src, sstatus->max_hp,0,0,1, skill_id);
|
||||
status_damage(src, src, sstatus->max_hp,0,0,1);
|
||||
break;
|
||||
|
||||
case AL_ANGELUS:
|
||||
@ -7742,10 +7476,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case CR_SHRINK:
|
||||
case SG_FUSION:
|
||||
case GS_GATLINGFEVER:
|
||||
case SJ_LUNARSTANCE:
|
||||
case SJ_STARSTANCE:
|
||||
case SJ_UNIVERSESTANCE:
|
||||
case SJ_SUNSTANCE:
|
||||
if( tsce )
|
||||
{
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,status_change_end(bl, type, INVALID_TIMER));
|
||||
@ -7754,43 +7484,25 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
}
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
||||
break;
|
||||
case SP_SOULCOLLECT:
|
||||
if (tsce) {
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, status_change_end(bl, type, INVALID_TIMER));
|
||||
map_freeblock_unlock();
|
||||
return 0;
|
||||
}
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, pc_checkskill(sd,SP_SOULENERGY), max(1000, skill_get_time(skill_id, skill_lv))));
|
||||
break;
|
||||
case SL_KAITE:
|
||||
case SL_KAAHI:
|
||||
case SL_KAIZEL:
|
||||
case SL_KAUPE:
|
||||
case SP_KAUTE:
|
||||
if (sd) {
|
||||
if (!dstsd || !(
|
||||
(sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SOULLINKER) ||
|
||||
(dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER ||
|
||||
dstsd->status.char_id == sd->status.char_id ||
|
||||
dstsd->status.char_id == sd->status.partner_id ||
|
||||
dstsd->status.char_id == sd->status.child ||
|
||||
(skill_id == SP_KAUTE && dstsd->sc.data[SC_SOULUNITY])
|
||||
dstsd->status.char_id == sd->status.child
|
||||
)) {
|
||||
status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NORATEDEF);
|
||||
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (skill_id == SP_KAUTE) {
|
||||
if (!status_charge(src, sstatus->max_hp * (10 + 2 * skill_lv) / 100, 0)) {
|
||||
if (sd)
|
||||
clif_skill_fail(sd,skill_id, USESKILL_FAIL,0);
|
||||
break;
|
||||
}
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
||||
status_heal(bl, 0, tstatus->max_sp * (10 + 2 * skill_lv) / 100, 2);
|
||||
} else
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id, skill_lv)));
|
||||
break;
|
||||
case SM_AUTOBERSERK:
|
||||
case MER_AUTOBERSERK:
|
||||
@ -8059,7 +7771,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
if( mer && mer->master )
|
||||
{
|
||||
status_heal(&mer->master->bl, mer->battle_status.hp, 0, 2);
|
||||
status_damage(src, src, mer->battle_status.max_hp, 0, 0, 1, skill_id);
|
||||
status_damage(src, src, mer->battle_status.max_hp, 0, 0, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -8489,10 +8201,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case SC_DECORATION_OF_MUSIC: case SC_GN_CARTBOOST: case SC_CHASEWALK2:
|
||||
case SC_ACTIVE_MONSTER_TRANSFORM: case SC_DORAM_BUF_01: case SC_DORAM_BUF_02:
|
||||
case SC_SPORE_EXPLOSION:
|
||||
case SC_NEWMOON: case SC_FLASHKICK: case SC_NOVAEXPLOSING:
|
||||
case SC_SOULUNITY: case SC_SOULSHADOW: case SC_SOULFAIRY:
|
||||
case SC_SOULFALCON: case SC_SOULGOLEM: case SC_USE_SKILL_SP_SPA:
|
||||
case SC_USE_SKILL_SP_SHA: case SC_SP_SHA:
|
||||
#ifdef RENEWAL
|
||||
case SC_EXTREMITYFIST2:
|
||||
#endif
|
||||
@ -9286,10 +8994,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case SL_STAR:
|
||||
case SL_SUPERNOVICE:
|
||||
case SL_WIZARD:
|
||||
if (sd && tsc && (tsc->data[SC_SOULGOLEM] || tsc->data[SC_SOULSHADOW] || tsc->data[SC_SOULFALCON] || tsc->data[SC_SOULFAIRY])) { // Soul links from Soul Linker and Soul Reaper skills don't stack.
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL,0);
|
||||
break;
|
||||
}
|
||||
//NOTE: here, 'type' has the value of the associated MAPID, not of the SC_SPIRIT constant.
|
||||
if (sd && dstsd && !((dstsd->class_&MAPID_UPPERMASK) == type)) {
|
||||
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
||||
@ -9307,10 +9011,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
sc_start(src,src,SC_SMA,100,skill_lv,skill_get_time(SL_SMA,skill_lv));
|
||||
break;
|
||||
case SL_HIGH:
|
||||
if (sd && tsc && (tsc->data[SC_SOULGOLEM] || tsc->data[SC_SOULSHADOW] || tsc->data[SC_SOULFALCON] || tsc->data[SC_SOULFAIRY])) { // Soul links from Soul Linker and Soul Reaper skills don't stack.
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL,0);
|
||||
break;
|
||||
}
|
||||
if (sd && !(dstsd && (dstsd->class_&JOBL_UPPER) && !(dstsd->class_&JOBL_2) && dstsd->status.base_level < 70)) {
|
||||
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
||||
break;
|
||||
@ -9319,39 +9019,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
sc_start4(src,bl,type,100,skill_lv,skill_id,0,0,skill_get_time(skill_id,skill_lv)));
|
||||
sc_start(src,src,SC_SMA,100,skill_lv,skill_get_time(SL_SMA,skill_lv));
|
||||
break;
|
||||
case SP_SOULGOLEM:
|
||||
case SP_SOULSHADOW:
|
||||
case SP_SOULFALCON:
|
||||
case SP_SOULFAIRY:
|
||||
if (sd && !dstsd) { // Only player's can be soul linked.
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL,0);
|
||||
break;
|
||||
}
|
||||
if (tsc) {
|
||||
if (tsc->data[status_skill2sc(skill_id)]) { // Allow refreshing an already active soul link.
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
|
||||
break;
|
||||
} else if (tsc->data[SC_SPIRIT] || tsc->data[SC_SOULGOLEM] || tsc->data[SC_SOULSHADOW] || tsc->data[SC_SOULFALCON] || tsc->data[SC_SOULFAIRY]) { // Soul links from Soul Linker and Soul Reaper skills don't stack.
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
|
||||
break;
|
||||
|
||||
case SP_SOULREVOLVE:
|
||||
if (!(tsc && (tsc->data[SC_SPIRIT] || tsc->data[SC_SOULGOLEM] || tsc->data[SC_SOULSHADOW] || tsc->data[SC_SOULFALCON] || tsc->data[SC_SOULFAIRY]))) {
|
||||
if (sd)
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
break;
|
||||
}
|
||||
status_heal(bl, 0, 50*skill_lv, 2);
|
||||
status_change_end(bl, SC_SPIRIT, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULGOLEM, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULSHADOW, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULFALCON, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULFAIRY, INVALID_TIMER);
|
||||
break;
|
||||
|
||||
case SL_SWOO:
|
||||
if (tsce) {
|
||||
@ -9452,24 +9119,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
}
|
||||
break;
|
||||
|
||||
case SJ_DOCUMENT:
|
||||
if (sd) {
|
||||
switch (skill_lv) {
|
||||
case 1:
|
||||
pc_resetfeel(sd);
|
||||
break;
|
||||
case 2:
|
||||
pc_resethate(sd);
|
||||
break;
|
||||
case 3:
|
||||
pc_resetfeel(sd);
|
||||
pc_resethate(sd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
||||
break;
|
||||
|
||||
case GS_GLITTERING:
|
||||
if(sd) {
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
@ -9947,7 +9596,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
|
||||
if(rnd()%100 >= 60 + 8 * skill_lv) {
|
||||
if((dstsd && (dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) || rnd()%100 >= 60 + 8 * skill_lv) {
|
||||
if (sd)
|
||||
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
||||
break;
|
||||
@ -10013,11 +9662,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case SC_MTF_MLEATKED: case SC_MTF_CRIDAMAGE: case SC_HEAT_BARREL:
|
||||
case SC_P_ALTER: case SC_E_CHAIN:
|
||||
case SC_C_MARKER: case SC_B_TRAP: case SC_H_MINE:
|
||||
case SC_NEWMOON: case SC_FLASHKICK: case SC_DIMENSION:
|
||||
case SC_NOVAEXPLOSING:
|
||||
case SC_SOULUNITY: case SC_SOULSHADOW: case SC_SOULFAIRY:
|
||||
case SC_SOULFALCON: case SC_SOULGOLEM: case SC_USE_SKILL_SP_SPA:
|
||||
case SC_USE_SKILL_SP_SHA: case SC_SP_SHA:
|
||||
case SC_STRANGELIGHTS: case SC_DECORATION_OF_MUSIC: case SC_GN_CARTBOOST:
|
||||
case SC_RECOGNIZEDSPELL: case SC_CHASEWALK2: case SC_ACTIVE_MONSTER_TRANSFORM:
|
||||
case SC_SPORE_EXPLOSION:
|
||||
@ -10359,7 +10003,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
||||
status_change_end(bl,SC_CLOAKINGEXCEED,INVALID_TIMER);
|
||||
status_change_end(bl,SC_CAMOUFLAGE,INVALID_TIMER);
|
||||
status_change_end(bl,SC_NEWMOON,INVALID_TIMER);
|
||||
if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
||||
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
||||
}
|
||||
@ -10751,7 +10394,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
sc_start(src,bl, type, 100, skill_lv,skill_get_time(skill_id, skill_lv));
|
||||
} else if( flag&2 ) {
|
||||
if( src->id != bl->id && battle_check_target(src,bl,BCT_ENEMY) > 0 )
|
||||
status_fix_damage(src,bl,9999,clif_damage(src,bl,tick,0,0,9999,0,DMG_NORMAL,0,false),skill_id);
|
||||
status_fix_damage(src,bl,9999,clif_damage(src,bl,tick,0,0,9999,0,DMG_NORMAL,0,false));
|
||||
} else if( sd ) {
|
||||
short chance = sstatus->int_/6 + sd->status.job_level/5 + skill_lv*4;
|
||||
if( !sd->status.party_id || (rnd()%100 > chance)) {
|
||||
@ -10767,7 +10410,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv,
|
||||
sc_start(src,src,SC_STOP,100,skill_lv,skill_get_time2(skill_id,skill_lv)));
|
||||
if( flag&2 ) // Dealed here to prevent conflicts
|
||||
status_fix_damage(src,bl,9999,clif_damage(src,bl,tick,0,0,9999,0,DMG_NORMAL,0,false),skill_id);
|
||||
status_fix_damage(src,bl,9999,clif_damage(src,bl,tick,0,0,9999,0,DMG_NORMAL,0,false));
|
||||
}
|
||||
break;
|
||||
case WM_SONG_OF_MANA:
|
||||
@ -11313,14 +10956,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case OB_ZANGETSU:
|
||||
case KG_KYOMU:
|
||||
case KG_KAGEMUSYA:
|
||||
case SP_SOULDIVISION:
|
||||
if (skill_id == SP_SOULDIVISION) { // Usable only on other players.
|
||||
if (bl->type != BL_PC) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
||||
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||
@ -11336,7 +10971,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_NEWMOON, INVALID_TIMER);
|
||||
if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
||||
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
||||
status_change_end(bl, SC_MARIONETTE, INVALID_TIMER);
|
||||
@ -12527,7 +12161,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
case MH_STEINWAND:
|
||||
case MH_XENO_SLASHER:
|
||||
case LG_KINGS_GRACE:
|
||||
case SJ_BOOKOFCREATINGSTAR:
|
||||
case RL_B_TRAP:
|
||||
flag|=1;//Set flag to 1 to prevent deleting ammo (it will be deleted on group-delete).
|
||||
case GS_GROUNDDRIFT: //Ammo should be deleted right away.
|
||||
@ -12944,7 +12577,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
}
|
||||
map_foreachinallrange(unit_changetarget, src, AREA_SIZE, BL_MOB, src, &group->unit->bl); // Release all targets against the caster
|
||||
skill_blown(src, src, skill_get_blewcount(skill_id, skill_lv), unit_getdir(src), BLOWN_IGNORE_NO_KNOCKBACK); // Don't stop the caster from backsliding if special_state.no_knockback is active
|
||||
clif_skill_nodamage(src,src,skill_id,skill_lv,sc_start(src,src,type,100,skill_lv,skill_get_time2(skill_id,skill_lv)));
|
||||
clif_skill_nodamage(src,src,skill_id,skill_lv,sc_start(src,src,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -14281,11 +13914,6 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_
|
||||
sc_start(ss, bl, type, 100, sg->skill_lv, skill_get_time(sg->skill_id, sg->skill_lv));
|
||||
break;
|
||||
|
||||
case UNT_CREATINGSTAR:
|
||||
if (!sce)
|
||||
sc_start4(ss, bl, type, 100, sg->skill_lv, ss->id, unit->bl.id, 0, sg->limit);
|
||||
break;
|
||||
|
||||
case UNT_GD_LEADERSHIP:
|
||||
case UNT_GD_GLORYWOUNDS:
|
||||
case UNT_GD_SOULCOLD:
|
||||
@ -14818,7 +14446,6 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
|
||||
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
||||
status_change_end(bl,SC_CLOAKINGEXCEED,INVALID_TIMER);
|
||||
status_change_end(bl,SC_CAMOUFLAGE,INVALID_TIMER);
|
||||
status_change_end(bl,SC_NEWMOON,INVALID_TIMER);
|
||||
if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
||||
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
||||
}
|
||||
@ -15162,7 +14789,6 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, t_tick tick)
|
||||
case SO_WATER_INSIGNIA:
|
||||
case SO_WIND_INSIGNIA:
|
||||
case SO_EARTH_INSIGNIA:
|
||||
case SJ_BOOKOFCREATINGSTAR:
|
||||
case SC_BLOODYLUST:
|
||||
case GN_FIRE_EXPANSION_SMOKE_POWDER:
|
||||
case GN_FIRE_EXPANSION_TEAR_GAS:
|
||||
@ -15617,7 +15243,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
||||
{ //GMs don't override the skillItem check, otherwise they can use items without them being consumed! [Skotlex]
|
||||
sd->state.arrow_atk = skill_get_ammotype(skill_id)?1:0; //Need to do arrow state check.
|
||||
sd->spiritball_old = sd->spiritball; //Need to do Spiritball check.
|
||||
sd->soulball_old = sd->soulball; //Need to do Soulball check.
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -15806,10 +15431,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
||||
if(sc->data[SC_COMBO]->val1 != MO_COMBOFINISH && sc->data[SC_COMBO]->val1 != CH_TIGERFIST)
|
||||
return false;
|
||||
break;
|
||||
case SJ_SOLARBURST:
|
||||
if (!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SJ_PROMINENCEKICK))
|
||||
return 0;
|
||||
break;
|
||||
case MO_EXTREMITYFIST:
|
||||
// if(sc && sc->data[SC_EXTREMITYFIST]) //To disable Asura during the 5 min skill block uncomment this...
|
||||
// return false;
|
||||
@ -15907,7 +15528,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
||||
}
|
||||
break;
|
||||
case SL_SMA:
|
||||
if(sc && !(sc->data[SC_SMA] || sc->data[SC_USE_SKILL_SP_SHA]))
|
||||
if(!(sc && sc->data[SC_SMA]))
|
||||
return false;
|
||||
break;
|
||||
case HT_POWER:
|
||||
@ -16065,12 +15686,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
||||
if (status->sp == status->max_sp)
|
||||
return false; //Unusable when at full SP.
|
||||
break;
|
||||
case SP_KAUTE: // Fail if below 30% MaxHP.
|
||||
if (status->hp < 30 * status->max_hp / 100) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case AM_CALLHOMUN: //Can't summon if a hom is already out
|
||||
if (sd->status.hom_id && sd->hd && !sd->hd->homunculus.vaporize) {
|
||||
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
||||
@ -16329,28 +15944,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case SJ_FULLMOONKICK:
|
||||
if (!(sc && sc->data[SC_NEWMOON])) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case SJ_STAREMPEROR:
|
||||
case SJ_NOVAEXPLOSING:
|
||||
case SJ_GRAVITYCONTROL:
|
||||
case SJ_BOOKOFDIMENSION:
|
||||
case SJ_BOOKOFCREATINGSTAR:
|
||||
case SP_SOULDIVISION:
|
||||
case SP_SOULEXPLOSION:
|
||||
if (!map_flag_vs(sd->bl.m)) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case SP_SWHOO:
|
||||
if (!(sc && sc->data[SC_USE_SKILL_SP_SPA]))
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
|
||||
/* check state required */
|
||||
@ -16448,30 +16041,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case ST_SUNSTANCE:
|
||||
if (!(sc && (sc->data[SC_SUNSTANCE] || sc->data[SC_UNIVERSESTANCE]))) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case ST_MOONSTANCE:
|
||||
if (!(sc && (sc->data[SC_LUNARSTANCE] || sc->data[SC_UNIVERSESTANCE]))) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case ST_STARSTANCE:
|
||||
if (!(sc && (sc->data[SC_STARSTANCE] || sc->data[SC_UNIVERSESTANCE]))) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case ST_UNIVERSESTANCE:
|
||||
if (!(sc && sc->data[SC_UNIVERSESTANCE])) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* check the status required */
|
||||
@ -16584,37 +16153,13 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
||||
return false;
|
||||
}
|
||||
|
||||
if (require.spiritball > 0) { // Skills that require certain types of spheres to use.
|
||||
switch (skill_id) { // Skills that require soul spheres.
|
||||
case SP_SOULGOLEM:
|
||||
case SP_SOULSHADOW:
|
||||
case SP_SOULFALCON:
|
||||
case SP_SOULFAIRY:
|
||||
case SP_SOULCURSE:
|
||||
case SP_SPA:
|
||||
case SP_SHA:
|
||||
case SP_SWHOO:
|
||||
case SP_SOULUNITY:
|
||||
case SP_SOULDIVISION:
|
||||
case SP_SOULREAPER:
|
||||
case SP_SOULEXPLOSION:
|
||||
case SP_KAUTE:
|
||||
if (sd->soulball < require.spiritball) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_SPIRITS, 0);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
default: // Skills that require spirit/coin spheres.
|
||||
if (sd->spiritball < require.spiritball) {
|
||||
if ((sd->class_&MAPID_BASEMASK) == MAPID_GUNSLINGER || (sd->class_&MAPID_UPPERMASK) == MAPID_REBELLION)
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_COINS, (require.spiritball == -1) ? 1 : require.spiritball);
|
||||
else
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_SPIRITS, (require.spiritball == -1) ? 1 : require.spiritball);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if ((require.spiritball > 0 && sd->spiritball < require.spiritball) ||
|
||||
(require.spiritball == -1 && sd->spiritball < 1)) {
|
||||
if ((sd->class_&MAPID_BASEMASK) == MAPID_GUNSLINGER || (sd->class_&MAPID_UPPERMASK) == MAPID_REBELLION)
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_COINS, (require.spiritball == -1) ? 1 : require.spiritball);
|
||||
else
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_SPIRITS, (require.spiritball == -1) ? 1 : require.spiritball);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -16644,7 +16189,6 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id,
|
||||
//GMs don't override the skillItem check, otherwise they can use items without them being consumed! [Skotlex]
|
||||
sd->state.arrow_atk = skill_get_ammotype(skill_id)?1:0; //Need to do arrow state check.
|
||||
sd->spiritball_old = sd->spiritball; //Need to do Spiritball check.
|
||||
sd->soulball_old = sd->soulball; //Need to do Soulball check.
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -16857,29 +16401,8 @@ void skill_consume_requirement(struct map_session_data *sd, uint16 skill_id, uin
|
||||
if(require.hp || require.sp)
|
||||
status_zap(&sd->bl, require.hp, require.sp);
|
||||
|
||||
if(require.spiritball > 0) { // Skills that require certain types of spheres to use
|
||||
switch (skill_id) { // Skills that require soul spheres.
|
||||
case SP_SOULGOLEM:
|
||||
case SP_SOULSHADOW:
|
||||
case SP_SOULFALCON:
|
||||
case SP_SOULFAIRY:
|
||||
case SP_SOULCURSE:
|
||||
case SP_SPA:
|
||||
case SP_SHA:
|
||||
case SP_SWHOO:
|
||||
case SP_SOULUNITY:
|
||||
case SP_SOULDIVISION:
|
||||
case SP_SOULREAPER:
|
||||
case SP_SOULEXPLOSION:
|
||||
case SP_KAUTE:
|
||||
pc_delsoulball(sd, require.spiritball, 0);
|
||||
break;
|
||||
|
||||
default: // Skills that require spirit/coin spheres.
|
||||
pc_delspiritball(sd, require.spiritball, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(require.spiritball > 0)
|
||||
pc_delspiritball(sd,require.spiritball,0);
|
||||
else if(require.spiritball == -1) {
|
||||
sd->spiritball_old = sd->spiritball;
|
||||
pc_delspiritball(sd,sd->spiritball,0);
|
||||
@ -17493,8 +17016,6 @@ int skill_vfcastfix(struct block_list *bl, double time, uint16 skill_id, uint16
|
||||
VARCAST_REDUCTION(30); //Reduces 30% Variable Cast Time of magic Water spells.
|
||||
if (sc->data[SC_TELEKINESIS_INTENSE])
|
||||
VARCAST_REDUCTION(sc->data[SC_TELEKINESIS_INTENSE]->val2);
|
||||
if (sc->data[SC_SOULFAIRY])
|
||||
VARCAST_REDUCTION(sc->data[SC_SOULFAIRY]->val3);
|
||||
// Multiplicative Fixed CastTime values
|
||||
if (sc->data[SC_SECRAMENT])
|
||||
fixcast_r = max(fixcast_r, sc->data[SC_SECRAMENT]->val2);
|
||||
@ -17562,7 +17083,6 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv)
|
||||
case CH_CHAINCRUSH:
|
||||
case SR_DRAGONCOMBO:
|
||||
case SR_FALLENEMPIRE:
|
||||
case SJ_PROMINENCEKICK:
|
||||
//If delay not specified, it will be 1000 - 4*agi - 2*dex
|
||||
if (time == 0)
|
||||
time = 1000;
|
||||
@ -18677,7 +18197,7 @@ bool skill_check_shadowform(struct block_list *bl, int64 damage, int hit)
|
||||
return false;
|
||||
}
|
||||
|
||||
status_damage(bl, src, damage, 0, clif_damage(src, src, gettick(), 500, 500, damage, hit, (hit > 1 ? DMG_MULTI_HIT : DMG_NORMAL), 0, false), 0, SC__SHADOWFORM);
|
||||
status_damage(bl, src, damage, 0, clif_damage(src, src, gettick(), 500, 500, damage, hit, (hit > 1 ? DMG_MULTI_HIT : DMG_NORMAL), 0, false), 0);
|
||||
if( sc && sc->data[SC__SHADOWFORM] && (--sc->data[SC__SHADOWFORM]->val3) <= 0 ) {
|
||||
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
||||
if( src->type == BL_PC )
|
||||
@ -21719,11 +21239,6 @@ int skill_disable_check(struct status_change *sc, uint16 skill_id)
|
||||
case KO_YAMIKUMO:
|
||||
case RA_WUGDASH:
|
||||
case RA_CAMOUFLAGE:
|
||||
case SJ_LUNARSTANCE:
|
||||
case SJ_STARSTANCE:
|
||||
case SJ_UNIVERSESTANCE:
|
||||
case SJ_SUNSTANCE:
|
||||
case SP_SOULCOLLECT:
|
||||
if( sc->data[status_skill2sc(skill_id)] )
|
||||
return 1;
|
||||
break;
|
||||
|
@ -646,10 +646,6 @@ enum e_require_state : uint8 {
|
||||
ST_ELEMENTALSPIRIT,
|
||||
ST_ELEMENTALSPIRIT2,
|
||||
ST_PECO,
|
||||
ST_SUNSTANCE,
|
||||
ST_MOONSTANCE,
|
||||
ST_STARSTANCE,
|
||||
ST_UNIVERSESTANCE
|
||||
};
|
||||
|
||||
/// List of Skills
|
||||
@ -2231,8 +2227,6 @@ enum e_skill_unit_id : uint16 {
|
||||
UNT_CATNIPPOWDER,
|
||||
UNT_NYANGGRASS,
|
||||
|
||||
UNT_CREATINGSTAR,
|
||||
|
||||
/**
|
||||
* Guild Auras
|
||||
**/
|
||||
|
@ -1065,36 +1065,6 @@ void initChangeTables(void)
|
||||
|
||||
set_sc( WE_CHEERUP , SC_CHEERUP , EFST_CHEERUP , SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK );
|
||||
|
||||
// Star Emperor
|
||||
set_sc( SJ_LIGHTOFMOON , SC_LIGHTOFMOON , EFST_LIGHTOFMOON , SCB_NONE );
|
||||
set_sc( SJ_LIGHTOFSTAR , SC_LIGHTOFSTAR , EFST_LIGHTOFSTAR , SCB_NONE );
|
||||
set_sc( SJ_LUNARSTANCE , SC_LUNARSTANCE , EFST_LUNARSTANCE , SCB_MAXHP );
|
||||
add_sc( SJ_FULLMOONKICK , SC_BLIND );
|
||||
set_sc( SJ_STARSTANCE , SC_STARSTANCE , EFST_STARSTANCE , SCB_ASPD );
|
||||
set_sc( SJ_NEWMOONKICK , SC_NEWMOON , EFST_NEWMOON , SCB_NONE );
|
||||
set_sc( SJ_FLASHKICK , SC_FLASHKICK , EFST_FLASHKICK , SCB_NONE );
|
||||
add_sc( SJ_STAREMPEROR , SC_SILENCE );
|
||||
set_sc( SJ_NOVAEXPLOSING , SC_NOVAEXPLOSING , EFST_NOVAEXPLOSING , SCB_NONE );
|
||||
set_sc( SJ_UNIVERSESTANCE , SC_UNIVERSESTANCE , EFST_UNIVERSESTANCE , SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK );
|
||||
set_sc( SJ_FALLINGSTAR , SC_FALLINGSTAR , EFST_FALLINGSTAR , SCB_NONE );
|
||||
set_sc( SJ_GRAVITYCONTROL , SC_GRAVITYCONTROL , EFST_GRAVITYCONTROL , SCB_NONE );
|
||||
set_sc( SJ_BOOKOFDIMENSION , SC_DIMENSION , EFST_DIMENSION , SCB_NONE );
|
||||
set_sc( SJ_BOOKOFCREATINGSTAR , SC_CREATINGSTAR , EFST_CREATINGSTAR , SCB_SPEED );
|
||||
set_sc( SJ_LIGHTOFSUN , SC_LIGHTOFSUN , EFST_LIGHTOFSUN , SCB_NONE );
|
||||
set_sc( SJ_SUNSTANCE , SC_SUNSTANCE , EFST_SUNSTANCE , SCB_BATK|SCB_WATK );
|
||||
|
||||
// Soul Reaper
|
||||
set_sc( SP_SOULGOLEM , SC_SOULGOLEM , EFST_SOULGOLEM , SCB_DEF|SCB_MDEF );
|
||||
set_sc( SP_SOULSHADOW , SC_SOULSHADOW , EFST_SOULSHADOW , SCB_ASPD|SCB_CRI );
|
||||
set_sc( SP_SOULFALCON , SC_SOULFALCON , EFST_SOULFALCON , SCB_WATK|SCB_HIT );
|
||||
set_sc( SP_SOULFAIRY , SC_SOULFAIRY , EFST_SOULFAIRY , SCB_MATK );
|
||||
set_sc( SP_SOULCURSE , SC_SOULCURSE , EFST_SOULCURSE , SCB_NONE );
|
||||
set_sc( SP_SHA , SC_SP_SHA , EFST_SP_SHA , SCB_SPEED );
|
||||
set_sc( SP_SOULUNITY , SC_SOULUNITY , EFST_SOULUNITY , SCB_NONE );
|
||||
set_sc( SP_SOULDIVISION , SC_SOULDIVISION , EFST_SOULDIVISION , SCB_NONE );
|
||||
set_sc( SP_SOULREAPER , SC_SOULREAPER , EFST_SOULREAPER , SCB_NONE );
|
||||
set_sc( SP_SOULCOLLECT , SC_SOULCOLLECT , EFST_SOULCOLLECT , SCB_NONE );
|
||||
|
||||
/* Storing the target job rather than simply SC_SPIRIT simplifies code later on */
|
||||
SkillStatusChangeTable[skill_get_index(SL_ALCHEMIST)] = (sc_type)MAPID_ALCHEMIST,
|
||||
SkillStatusChangeTable[skill_get_index(SL_MONK)] = (sc_type)MAPID_MONK,
|
||||
@ -1541,10 +1511,6 @@ void initChangeTables(void)
|
||||
StatusChangeFlagTable[SC_DORAM_BUF_01] |= SCB_REGEN;
|
||||
StatusChangeFlagTable[SC_DORAM_BUF_02] |= SCB_REGEN;
|
||||
|
||||
// Soul Reaper
|
||||
StatusIconChangeTable[SC_USE_SKILL_SP_SPA] = EFST_USE_SKILL_SP_SPA;
|
||||
StatusIconChangeTable[SC_USE_SKILL_SP_SHA] = EFST_USE_SKILL_SP_SHA;
|
||||
|
||||
#ifdef RENEWAL
|
||||
// renewal EDP increases your weapon atk
|
||||
StatusChangeFlagTable[SC_EDP] |= SCB_WATK;
|
||||
@ -1650,7 +1616,6 @@ void initChangeTables(void)
|
||||
#ifdef RENEWAL
|
||||
StatusChangeStateTable[SC_LONGING] |= SCS_NOMOVE;
|
||||
#endif
|
||||
StatusChangeStateTable[SC_GRAVITYCONTROL] |= SCS_NOMOVE;
|
||||
|
||||
/* StatusChangeState (SCS_) NOPICKUPITEMS */
|
||||
StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM;
|
||||
@ -1661,7 +1626,6 @@ void initChangeTables(void)
|
||||
StatusChangeStateTable[SC__FEINTBOMB] |= SCS_NOPICKITEM;
|
||||
StatusChangeStateTable[SC_NOCHAT] |= SCS_NOPICKITEM|SCS_NOPICKITEMCOND;
|
||||
StatusChangeStateTable[SC_SUHIDE] |= SCS_NOPICKITEM;
|
||||
StatusChangeStateTable[SC_NEWMOON] |= SCS_NOPICKITEM;
|
||||
|
||||
/* StatusChangeState (SCS_) NODROPITEMS */
|
||||
StatusChangeStateTable[SC_AUTOCOUNTER] |= SCS_NODROPITEM;
|
||||
@ -1689,7 +1653,6 @@ void initChangeTables(void)
|
||||
StatusChangeStateTable[SC_SATURDAYNIGHTFEVER] |= SCS_NOCAST;
|
||||
StatusChangeStateTable[SC_CURSEDCIRCLE_TARGET] |= SCS_NOCAST;
|
||||
StatusChangeStateTable[SC_KINGS_GRACE] |= SCS_NOCAST;
|
||||
StatusChangeStateTable[SC_GRAVITYCONTROL] |= SCS_NOCAST;
|
||||
|
||||
/* StatusChangeState (SCS_) NOCHAT (skills) */
|
||||
StatusChangeStateTable[SC_BERSERK] |= SCS_NOCHAT;
|
||||
@ -1855,7 +1818,7 @@ int64 status_charge(struct block_list* bl, int64 hp, int64 sp)
|
||||
{
|
||||
if(!(bl->type&BL_CONSUME))
|
||||
return (int)hp+sp; // Assume all was charged so there are no 'not enough' fails.
|
||||
return status_damage(NULL, bl, hp, sp, 0, 3, 0);
|
||||
return status_damage(NULL, bl, hp, sp, 0, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1874,7 +1837,7 @@ int64 status_charge(struct block_list* bl, int64 hp, int64 sp)
|
||||
* Note: HP/SP are integer values, not percentages. Values should be
|
||||
* calculated either within function call or before
|
||||
*/
|
||||
int status_damage(struct block_list *src,struct block_list *target,int64 dhp, int64 dsp, t_tick walkdelay, int flag, uint16 skill_id)
|
||||
int status_damage(struct block_list *src,struct block_list *target,int64 dhp, int64 dsp, t_tick walkdelay, int flag)
|
||||
{
|
||||
struct status_data *status;
|
||||
struct status_change *sc;
|
||||
@ -1942,7 +1905,6 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
|
||||
status_change_end(target, SC_CAMOUFLAGE, INVALID_TIMER);
|
||||
status_change_end(target, SC_DEEPSLEEP, INVALID_TIMER);
|
||||
status_change_end(target, SC_SUHIDE, INVALID_TIMER);
|
||||
status_change_end(target, SC_NEWMOON, INVALID_TIMER);
|
||||
if ((sce=sc->data[SC_ENDURE]) && !sce->val4) {
|
||||
/** [Skotlex]
|
||||
* Endure count is only reduced by non-players on non-gvg maps.
|
||||
@ -2132,7 +2094,7 @@ int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int flag)
|
||||
if (hp < 0) {
|
||||
if (hp == INT_MIN) // -INT_MIN == INT_MIN in some architectures!
|
||||
hp++;
|
||||
status_damage(NULL, bl, -hp, 0, 0, 1, 0);
|
||||
status_damage(NULL, bl, -hp, 0, 0, 1);
|
||||
hp = 0;
|
||||
}
|
||||
|
||||
@ -2151,7 +2113,7 @@ int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int flag)
|
||||
if(sp < 0) {
|
||||
if (sp == INT_MIN)
|
||||
sp++;
|
||||
status_damage(NULL, bl, 0, -sp, 0, 1, 0);
|
||||
status_damage(NULL, bl, 0, -sp, 0, 1);
|
||||
sp = 0;
|
||||
}
|
||||
|
||||
@ -2238,19 +2200,19 @@ int status_percent_change(struct block_list *src, struct block_list *target, int
|
||||
if (hp > INT_MAX) {
|
||||
hp -= INT_MAX;
|
||||
if (flag)
|
||||
status_damage(src, target, INT_MAX, 0, 0, (!src||src==target?5:1), 0);
|
||||
status_damage(src, target, INT_MAX, 0, 0, (!src||src==target?5:1));
|
||||
else
|
||||
status_heal(target, INT_MAX, 0, 0);
|
||||
}
|
||||
if (sp > INT_MAX) {
|
||||
sp -= INT_MAX;
|
||||
if (flag)
|
||||
status_damage(src, target, 0, INT_MAX, 0, (!src||src==target?5:1), 0);
|
||||
status_damage(src, target, 0, INT_MAX, 0, (!src||src==target?5:1));
|
||||
else
|
||||
status_heal(target, 0, INT_MAX, 0);
|
||||
}
|
||||
if (flag)
|
||||
return status_damage(src, target, hp, sp, 0, (!src||src==target?5:1), 0);
|
||||
return status_damage(src, target, hp, sp, 0, (!src||src==target?5:1));
|
||||
return status_heal(target, hp, sp, 0);
|
||||
}
|
||||
|
||||
@ -2447,8 +2409,6 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
|
||||
(sc->data[SC_ANKLE] && skill_block_check(src, SC_ANKLE, skill_id)) ||
|
||||
(sc->data[SC_STASIS] && skill_block_check(src, SC_STASIS, skill_id)) ||
|
||||
(sc->data[SC_BITE] && skill_block_check(src, SC_BITE, skill_id)) ||
|
||||
(sc->data[SC_NOVAEXPLOSING] && skill_block_check(src, SC_NOVAEXPLOSING, skill_id)) ||
|
||||
(sc->data[SC_GRAVITYCONTROL] && skill_block_check(src, SC_GRAVITYCONTROL, skill_id)) ||
|
||||
(sc->data[SC_KAGEHUMI] && skill_block_check(src, SC_KAGEHUMI, skill_id))
|
||||
))
|
||||
return false;
|
||||
@ -2516,7 +2476,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
|
||||
if (tsc) {
|
||||
if ((tsc->option&hide_flag) && !is_boss && (tsd->special_state.perfect_hiding || !is_detect))
|
||||
return false;
|
||||
if ((tsc->data[SC_CLOAKINGEXCEED] || tsc->data[SC_NEWMOON]) && !is_boss && (tsd->special_state.perfect_hiding || is_detect))
|
||||
if (tsc->data[SC_CLOAKINGEXCEED] && !is_boss && (tsd->special_state.perfect_hiding || is_detect))
|
||||
return false; // Works against insect and demon but not against bosses
|
||||
if (tsc->data[SC__FEINTBOMB] && (is_boss || is_detect))
|
||||
return false; // Works against all
|
||||
@ -2588,7 +2548,7 @@ int status_check_visibility(struct block_list *src, struct block_list *target)
|
||||
|
||||
if (((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC_SUHIDE]) && !is_boss && (tsd->special_state.perfect_hiding || !is_detector))
|
||||
return 0;
|
||||
if ((tsc->data[SC_CLOAKINGEXCEED] || tsc->data[SC_NEWMOON]) && !is_boss && ((tsd && tsd->special_state.perfect_hiding) || is_detector))
|
||||
if (tsc->data[SC_CLOAKINGEXCEED] && !is_boss && ((tsd && tsd->special_state.perfect_hiding) || is_detector))
|
||||
return 0;
|
||||
if (tsc->data[SC__FEINTBOMB] && !is_boss && !is_detector)
|
||||
return 0;
|
||||
@ -2642,7 +2602,7 @@ int status_base_amotion_pc(struct map_session_data* sd, struct status_data* stat
|
||||
temp_aspd = (float)(sqrt(temp_aspd) * 0.25f) + 0xc4;
|
||||
if ((skill_lv = pc_checkskill(sd,SA_ADVANCEDBOOK)) > 0 && sd->status.weapon == W_BOOK)
|
||||
val += (skill_lv - 1) / 2 + 1;
|
||||
if ((skill_lv = pc_checkskill(sd, SG_DEVIL)) > 0 && ((sd->class_&MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || pc_is_maxjoblv(sd)))
|
||||
if ((skill_lv = pc_checkskill(sd, SG_DEVIL)) > 0 && pc_is_maxjoblv(sd))
|
||||
val += 1 + skill_lv;
|
||||
if ((skill_lv = pc_checkskill(sd,GS_SINGLEACTION)) > 0 && (sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE))
|
||||
val += ((skill_lv + 1) / 2);
|
||||
@ -3400,8 +3360,6 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
|
||||
if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_HPRATE)
|
||||
bonus += 30;
|
||||
#endif
|
||||
if(sc->data[SC_LUNARSTANCE])
|
||||
bonus += bonus * sc->data[SC_LUNARSTANCE]->val2 / 100;
|
||||
|
||||
//Decreasing
|
||||
if(sc->data[SC_VENOMBLEED])
|
||||
@ -4395,7 +4353,7 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
|
||||
#ifndef RENEWAL_ASPD
|
||||
if((skill=pc_checkskill(sd,SA_ADVANCEDBOOK))>0 && sd->status.weapon == W_BOOK)
|
||||
base_status->aspd_rate -= 5*skill;
|
||||
if ((skill = pc_checkskill(sd,SG_DEVIL)) > 0 && ((sd->class_&MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || pc_is_maxjoblv(sd)))
|
||||
if((skill = pc_checkskill(sd,SG_DEVIL)) > 0 && pc_is_maxjoblv(sd))
|
||||
base_status->aspd_rate -= 30*skill;
|
||||
if((skill=pc_checkskill(sd,GS_SINGLEACTION))>0 &&
|
||||
(sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE))
|
||||
@ -5916,8 +5874,6 @@ static unsigned short status_calc_str(struct block_list *bl, struct status_chang
|
||||
if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
|
||||
str += 15;
|
||||
#endif
|
||||
if (sc->data[SC_UNIVERSESTANCE])
|
||||
str += sc->data[SC_UNIVERSESTANCE]->val2;
|
||||
|
||||
return (unsigned short)cap_value(str,0,USHRT_MAX);
|
||||
}
|
||||
@ -5998,8 +5954,6 @@ static unsigned short status_calc_agi(struct block_list *bl, struct status_chang
|
||||
if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
|
||||
agi += 15;
|
||||
#endif
|
||||
if (sc->data[SC_UNIVERSESTANCE])
|
||||
agi += sc->data[SC_UNIVERSESTANCE]->val2;
|
||||
|
||||
return (unsigned short)cap_value(agi,0,USHRT_MAX);
|
||||
}
|
||||
@ -6070,8 +6024,6 @@ static unsigned short status_calc_vit(struct block_list *bl, struct status_chang
|
||||
if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
|
||||
vit += 15;
|
||||
#endif
|
||||
if (sc->data[SC_UNIVERSESTANCE])
|
||||
vit += sc->data[SC_UNIVERSESTANCE]->val2;
|
||||
|
||||
return (unsigned short)cap_value(vit,0,USHRT_MAX);
|
||||
}
|
||||
@ -6146,8 +6098,6 @@ static unsigned short status_calc_int(struct block_list *bl, struct status_chang
|
||||
int_ += 3;
|
||||
if(sc->data[SC_GLASTHEIM_STATE])
|
||||
int_ += sc->data[SC_GLASTHEIM_STATE]->val1;
|
||||
if (sc->data[SC_UNIVERSESTANCE])
|
||||
int_ += sc->data[SC_UNIVERSESTANCE]->val2;
|
||||
|
||||
if(bl->type != BL_PC) {
|
||||
if(sc->data[SC_STRIPHELM])
|
||||
@ -6241,8 +6191,6 @@ static unsigned short status_calc_dex(struct block_list *bl, struct status_chang
|
||||
if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
|
||||
dex += 15;
|
||||
#endif
|
||||
if (sc->data[SC_UNIVERSESTANCE])
|
||||
dex += sc->data[SC_UNIVERSESTANCE]->val2;
|
||||
|
||||
return (unsigned short)cap_value(dex,0,USHRT_MAX);
|
||||
}
|
||||
@ -6311,8 +6259,6 @@ static unsigned short status_calc_luk(struct block_list *bl, struct status_chang
|
||||
if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT)
|
||||
luk += 15;
|
||||
#endif
|
||||
if (sc->data[SC_UNIVERSESTANCE])
|
||||
luk += sc->data[SC_UNIVERSESTANCE]->val2;
|
||||
|
||||
return (unsigned short)cap_value(luk,0,USHRT_MAX);
|
||||
}
|
||||
@ -6390,8 +6336,6 @@ static unsigned short status_calc_batk(struct block_list *bl, struct status_chan
|
||||
if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ATKRATE)
|
||||
batk += batk * 20 / 100;
|
||||
#endif
|
||||
if (sc->data[SC_SUNSTANCE])
|
||||
batk += batk * sc->data[SC_SUNSTANCE]->val2 / 100;
|
||||
|
||||
return (unsigned short)cap_value(batk,0,USHRT_MAX);
|
||||
}
|
||||
@ -6492,10 +6436,6 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan
|
||||
watk -= watk * sc->data[SC_CATNIPPOWDER]->val2 / 100;
|
||||
if (sc->data[SC_CHATTERING])
|
||||
watk += sc->data[SC_CHATTERING]->val2;
|
||||
if (sc->data[SC_SUNSTANCE])
|
||||
watk += watk * sc->data[SC_SUNSTANCE]->val2 / 100;
|
||||
if (sc->data[SC_SOULFALCON])
|
||||
watk += sc->data[SC_SOULFALCON]->val2;
|
||||
|
||||
return (unsigned short)cap_value(watk,0,USHRT_MAX);
|
||||
}
|
||||
@ -6553,8 +6493,6 @@ static unsigned short status_calc_ematk(struct block_list *bl, struct status_cha
|
||||
matk += sc->data[SC_CHATTERING]->val2;
|
||||
if (sc->data[SC_DORAM_MATK])
|
||||
matk += sc->data[SC_DORAM_MATK]->val1;
|
||||
if (sc->data[SC_SOULFAIRY])
|
||||
matk += sc->data[SC_SOULFAIRY]->val2;
|
||||
|
||||
return (unsigned short)cap_value(matk,0,USHRT_MAX);
|
||||
}
|
||||
@ -6666,8 +6604,6 @@ static signed short status_calc_critical(struct block_list *bl, struct status_ch
|
||||
critical -= sc->data[SC__UNLUCKY]->val2;
|
||||
if(sc->data[SC_BEYONDOFWARCRY])
|
||||
critical += sc->data[SC_BEYONDOFWARCRY]->val3;
|
||||
if (sc->data[SC_SOULSHADOW])
|
||||
critical += 10 * sc->data[SC_SOULSHADOW]->val3;
|
||||
|
||||
return (short)cap_value(critical,10,SHRT_MAX);
|
||||
}
|
||||
@ -6732,8 +6668,6 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change
|
||||
if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_HIT)
|
||||
hit += 50;
|
||||
#endif
|
||||
if (sc->data[SC_SOULFALCON])
|
||||
hit += sc->data[SC_SOULFALCON]->val3;
|
||||
|
||||
return (short)cap_value(hit,1,SHRT_MAX);
|
||||
}
|
||||
@ -6967,8 +6901,6 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc,
|
||||
def -= def * sc->data[SC_OVERED_BOOST]->val4 / 100;
|
||||
if(sc->data[SC_GLASTHEIM_ITEMDEF])
|
||||
def += sc->data[SC_GLASTHEIM_ITEMDEF]->val1;
|
||||
if (sc->data[SC_SOULGOLEM])
|
||||
def += sc->data[SC_SOULGOLEM]->val2;
|
||||
|
||||
return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX);
|
||||
}
|
||||
@ -7095,8 +7027,6 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc,
|
||||
mdef -= 20 * sc->data[SC_ODINS_POWER]->val1;
|
||||
if(sc->data[SC_GLASTHEIM_ITEMDEF])
|
||||
mdef += sc->data[SC_GLASTHEIM_ITEMDEF]->val2;
|
||||
if (sc->data[SC_SOULGOLEM])
|
||||
mdef += sc->data[SC_SOULGOLEM]->val3;
|
||||
|
||||
return (defType)cap_value(mdef,DEFTYPE_MIN,DEFTYPE_MAX);
|
||||
}
|
||||
@ -7256,10 +7186,6 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha
|
||||
val = max( val, sc->data[SC_B_TRAP]->val3 );
|
||||
if (sc->data[SC_CATNIPPOWDER])
|
||||
val = max(val, sc->data[SC_CATNIPPOWDER]->val3);
|
||||
if (sc->data[SC_SP_SHA])
|
||||
val = max(val, sc->data[SC_SP_SHA]->val2);
|
||||
if (sc->data[SC_CREATINGSTAR])
|
||||
val = max(val, 90);
|
||||
|
||||
if( sd && sd->bonus.speed_rate + sd->bonus.speed_add_rate > 0 ) // Permanent item-based speedup
|
||||
val = max( val, sd->bonus.speed_rate + sd->bonus.speed_add_rate );
|
||||
@ -7502,8 +7428,6 @@ static short status_calc_fix_aspd(struct block_list *bl, struct status_change *s
|
||||
aspd -= sc->data[SC_MTF_ASPD]->val1;
|
||||
if (sc->data[SC_MTF_ASPD2])
|
||||
aspd -= sc->data[SC_MTF_ASPD2]->val1;
|
||||
if (sc->data[SC_SOULSHADOW])
|
||||
aspd -= 10 * sc->data[SC_SOULSHADOW]->val2;
|
||||
|
||||
return cap_value(aspd, 0, 2000); // Will be recap for proper bl anyway
|
||||
}
|
||||
@ -7654,8 +7578,6 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change *
|
||||
aspd_rate -= sc->data[SC_GOLDENE_FERSE]->val3 * 10;
|
||||
if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2)
|
||||
aspd_rate -= 100;
|
||||
if (sc->data[SC_STARSTANCE])
|
||||
aspd_rate -= 10 * sc->data[SC_STARSTANCE]->val2;
|
||||
|
||||
return (short)cap_value(aspd_rate,0,SHRT_MAX);
|
||||
}
|
||||
@ -8971,9 +8893,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if (status_change_isDisabledOnMap(type, map_getmapdata(bl->m)))
|
||||
return 0;
|
||||
|
||||
if (sc->data[SC_GRAVITYCONTROL])
|
||||
return 0; // !TODO: Confirm what statuses/conditions (if not all) are blocked.
|
||||
|
||||
// Uncomment to prevent status adding hp to gvg mob (like bloodylust=hp*3 etc...
|
||||
// if (bl->type == BL_MOB)
|
||||
// if (status_get_race2(bl) == RC2_GVG && status_sc2scb_flag(type)&SCB_MAXHP) return 0;
|
||||
@ -9059,7 +8978,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_DECREASEAGI:
|
||||
case SC_QUAGMIRE:
|
||||
case SC_DONTFORGETME:
|
||||
case SC_CREATINGSTAR:
|
||||
if(sc->data[SC_SPEEDUP1])
|
||||
return 0;
|
||||
break;
|
||||
@ -9205,10 +9123,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if( sd && pc_checkskill(sd, AS_CLOAKING) < 3 && !skill_check_cloaking(bl,NULL) )
|
||||
return 0;
|
||||
break;
|
||||
case SC_NEWMOON:
|
||||
if (sc->data[SC_BITE])
|
||||
return 0;
|
||||
break;
|
||||
case SC_MODECHANGE:
|
||||
{
|
||||
enum e_mode mode;
|
||||
@ -9483,7 +9397,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_CATNIPPOWDER:
|
||||
case SC_SV_ROOTTWIST:
|
||||
case SC_BITESCAR:
|
||||
case SC_SP_SHA:
|
||||
case SC_FRESHSHRIMP:
|
||||
return 0;
|
||||
}
|
||||
@ -9602,30 +9515,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
// Cancels Normal Overthrust. [Skotlex]
|
||||
status_change_end(bl, SC_OVERTHRUST, INVALID_TIMER);
|
||||
break;
|
||||
case SC_SUNSTANCE:
|
||||
case SC_LUNARSTANCE:
|
||||
case SC_STARSTANCE:
|
||||
case SC_UNIVERSESTANCE:
|
||||
if (sc->data[type])
|
||||
break;
|
||||
status_change_end(bl, SC_SUNSTANCE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_LUNARSTANCE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_STARSTANCE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_UNIVERSESTANCE, INVALID_TIMER);
|
||||
break;
|
||||
case SC_SPIRIT:
|
||||
case SC_SOULGOLEM:
|
||||
case SC_SOULSHADOW:
|
||||
case SC_SOULFALCON:
|
||||
case SC_SOULFAIRY:
|
||||
if (sc->data[type])
|
||||
break;
|
||||
status_change_end(bl, SC_SPIRIT, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULGOLEM, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULSHADOW, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULFALCON, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULFAIRY, INVALID_TIMER);
|
||||
break;
|
||||
case SC_MAGNIFICAT:
|
||||
status_change_end(bl,SC_OFFERTORIUM,INVALID_TIMER);
|
||||
break;
|
||||
@ -10004,8 +9893,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_LHZ_DUN_N2:
|
||||
case SC_LHZ_DUN_N3:
|
||||
case SC_LHZ_DUN_N4:
|
||||
case SC_FLASHKICK:
|
||||
case SC_SOULUNITY:
|
||||
break;
|
||||
case SC_GOSPEL:
|
||||
// Must not override a casting gospel char.
|
||||
@ -11875,83 +11762,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
val2 = 30; // SP Recovery rate bonus
|
||||
break;
|
||||
|
||||
case SC_SUNSTANCE:
|
||||
val2 = 2 + val1; // ATK Increase
|
||||
tick = INFINITE_TICK;
|
||||
break;
|
||||
case SC_LUNARSTANCE:
|
||||
val2 = 2 + val1; // MaxHP Increase
|
||||
tick = INFINITE_TICK;
|
||||
break;
|
||||
case SC_STARSTANCE:
|
||||
val2 = 4 + 2 * val1; // ASPD Increase
|
||||
tick = INFINITE_TICK;
|
||||
break;
|
||||
case SC_UNIVERSESTANCE:
|
||||
val2 = 2 + val1; // All Stats Increase
|
||||
tick = INFINITE_TICK;
|
||||
break;
|
||||
case SC_NEWMOON:
|
||||
val2 = 7; // Number of Regular Attacks Until Reveal
|
||||
tick_time = 1000;
|
||||
val4 = tick / tick_time;
|
||||
break;
|
||||
case SC_FALLINGSTAR:
|
||||
val2 = 8 + 2 * (1 + val1) / 2; // Autocast Chance
|
||||
if (val1 >= 7)
|
||||
val2 += 1; // Make it 15% at level 7.
|
||||
break;
|
||||
case SC_CREATINGSTAR:
|
||||
tick_time = 500;
|
||||
val4 = tick / tick_time;
|
||||
break;
|
||||
case SC_LIGHTOFSUN:
|
||||
case SC_LIGHTOFMOON:
|
||||
case SC_LIGHTOFSTAR:
|
||||
val2 = 5 * val1; // Skill Damage Increase.
|
||||
break;
|
||||
case SC_SOULGOLEM:
|
||||
val2 = 60 * val1; // DEF Increase
|
||||
val3 = 15 + 5 * val1; // MDEF Increase
|
||||
break;
|
||||
case SC_SOULSHADOW:
|
||||
val2 = (1 + val1) / 2; // ASPD Increase
|
||||
val3 = 10 + 2 * val1; // CRIT Increase
|
||||
break;
|
||||
case SC_SOULFALCON:
|
||||
val2 = 10 * val1; // WATK Increase
|
||||
val3 = 10; // HIT Increase
|
||||
if (val1 >= 3)
|
||||
val3 += 3;
|
||||
else if (val1 >= 5)
|
||||
val3 += 5;
|
||||
break;
|
||||
case SC_SOULFAIRY:
|
||||
val2 = 10 * val1; // MATK Increase
|
||||
val3 = 5; // Variable Cast Time Reduction
|
||||
if (val1 >= 3)
|
||||
val3 += 2;
|
||||
else if (val1 >= 5)
|
||||
val3 += 5;
|
||||
break;
|
||||
case SC_SOULUNITY:
|
||||
tick_time = 3000;
|
||||
val4 = tick / tick_time;
|
||||
break;
|
||||
case SC_SOULDIVISION:
|
||||
val2 = 10 * val1; // Skill Aftercast Increase
|
||||
break;
|
||||
case SC_SOULREAPER:
|
||||
val2 = 10 + 5 * val1; // Chance of Getting A Soul Sphere.
|
||||
break;
|
||||
case SC_SOULCOLLECT:
|
||||
val2 = 5 + 3 * val2; // Max Soul Sphere's.
|
||||
val3 = tick > 0 ? tick : 60000;
|
||||
break;
|
||||
case SC_SP_SHA:
|
||||
val2 = 50; // Move speed reduction
|
||||
break;
|
||||
|
||||
default:
|
||||
if( calc_flag == SCB_NONE && StatusSkillChangeTable[type] == -1 && StatusIconChangeTable[type] == EFST_BLANK ) {
|
||||
// Status change with no calc, no icon, and no skill associated...?
|
||||
@ -12109,7 +11919,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
pc_setstand(sd, true);
|
||||
case SC_FREEZE:
|
||||
case SC_STUN:
|
||||
case SC_GRAVITYCONTROL:
|
||||
if (sc->data[SC_DANCING])
|
||||
unit_stop_walking(bl, 1);
|
||||
case SC_TRICKDEAD:
|
||||
@ -12179,7 +11988,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_HANBOK:
|
||||
case SC_OKTOBERFEST:
|
||||
case SC_DRESSUP:
|
||||
case SC_NEWMOON:
|
||||
case SC_SUHIDE:
|
||||
unit_stop_attack(bl);
|
||||
break;
|
||||
@ -12314,7 +12122,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_CLOAKING:
|
||||
case SC_CLOAKINGEXCEED:
|
||||
case SC__INVISIBILITY:
|
||||
case SC_NEWMOON:
|
||||
sc->option |= OPTION_CLOAK;
|
||||
case SC_CAMOUFLAGE:
|
||||
case SC_STEALTHFIELD:
|
||||
@ -12876,7 +12683,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
|
||||
int damage = status->max_hp*sce->val3/100;
|
||||
if(status->hp < damage) // to not kill him
|
||||
damage = status->hp-1;
|
||||
status_damage(NULL,bl,damage,0,0,1,0);
|
||||
status_damage(NULL,bl,damage,0,0,1);
|
||||
}
|
||||
break;
|
||||
case SC_PYROCLASTIC:
|
||||
@ -12948,26 +12755,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
|
||||
}
|
||||
break;
|
||||
|
||||
case SC_FLASHKICK: {
|
||||
map_session_data *tsd;
|
||||
|
||||
if (!(tsd = map_id2sd(sce->val1)))
|
||||
break;
|
||||
|
||||
tsd->stellar_mark[sce->val2] = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case SC_SOULUNITY: {
|
||||
map_session_data *tsd;
|
||||
|
||||
if (!(tsd = map_id2sd(sce->val2)))
|
||||
break;
|
||||
|
||||
tsd->united_soul[sce->val3] = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case SC_BLADESTOP:
|
||||
if(sce->val4) {
|
||||
int tid2 = sce->val4; //stop the status for the other guy of bladestop as well
|
||||
@ -13174,7 +12961,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
|
||||
struct block_list* src = map_id2bl(sce->val2);
|
||||
if( tid == -1 || !src)
|
||||
break; // Terminated by Damage
|
||||
status_fix_damage(src,bl,400*sce->val1,clif_damage(bl,bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false),WL_WHITEIMPRISON);
|
||||
status_fix_damage(src,bl,400*sce->val1,clif_damage(bl,bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false));
|
||||
}
|
||||
break;
|
||||
case SC_WUGDASH:
|
||||
@ -13264,32 +13051,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
|
||||
case SC_INTRAVISION:
|
||||
calc_flag = SCB_ALL; // Required for overlapping
|
||||
break;
|
||||
|
||||
case SC_SUNSTANCE:
|
||||
status_change_end(bl, SC_LIGHTOFSUN, INVALID_TIMER);
|
||||
break;
|
||||
case SC_LUNARSTANCE:
|
||||
status_change_end(bl, SC_NEWMOON, INVALID_TIMER);
|
||||
status_change_end(bl, SC_LIGHTOFMOON, INVALID_TIMER);
|
||||
break;
|
||||
case SC_STARSTANCE:
|
||||
status_change_end(bl, SC_FALLINGSTAR, INVALID_TIMER);
|
||||
status_change_end(bl, SC_LIGHTOFSTAR, INVALID_TIMER);
|
||||
break;
|
||||
case SC_UNIVERSESTANCE:
|
||||
status_change_end(bl, SC_LIGHTOFSUN, INVALID_TIMER);
|
||||
status_change_end(bl, SC_NEWMOON, INVALID_TIMER);
|
||||
status_change_end(bl, SC_LIGHTOFMOON, INVALID_TIMER);
|
||||
status_change_end(bl, SC_FALLINGSTAR, INVALID_TIMER);
|
||||
status_change_end(bl, SC_LIGHTOFSTAR, INVALID_TIMER);
|
||||
status_change_end(bl, SC_DIMENSION, INVALID_TIMER);
|
||||
break;
|
||||
case SC_GRAVITYCONTROL:
|
||||
status_fix_damage(bl, bl, sce->val2, clif_damage(bl, bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0);
|
||||
clif_specialeffect(bl, 223, AREA);
|
||||
clif_specialeffect(bl, 330, AREA);
|
||||
break;
|
||||
|
||||
case SC_OVERED_BOOST:
|
||||
switch (bl->type) {
|
||||
case BL_HOM: {
|
||||
@ -13397,7 +13158,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
|
||||
case SC_CLOAKING:
|
||||
case SC_CLOAKINGEXCEED:
|
||||
case SC__INVISIBILITY:
|
||||
case SC_NEWMOON:
|
||||
sc->option &= ~OPTION_CLOAK;
|
||||
case SC_CAMOUFLAGE:
|
||||
case SC_STEALTHFIELD:
|
||||
@ -13758,7 +13518,7 @@ TIMER_FUNC(status_change_timer){
|
||||
int64 damage = 1000 + (3 * status->max_hp) / 100; // Deals fixed (1000 + 3%*MaxHP)
|
||||
map_freeblock_lock();
|
||||
dounlock = true;
|
||||
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0);
|
||||
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -13766,7 +13526,7 @@ TIMER_FUNC(status_change_timer){
|
||||
if (sce->val4 >= 0) { // Damage is every 10 seconds including 3%sp drain.
|
||||
map_freeblock_lock();
|
||||
dounlock = true;
|
||||
status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0);
|
||||
status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -13819,7 +13579,7 @@ TIMER_FUNC(status_change_timer){
|
||||
if (sce->val4 >= 0) {
|
||||
map_freeblock_lock();
|
||||
dounlock = true;
|
||||
status_fix_damage(bl, bl, 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0);
|
||||
status_fix_damage(bl, bl, 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -13828,7 +13588,7 @@ TIMER_FUNC(status_change_timer){
|
||||
int64 damage = status->vit * (sce->val1 - 3) + (int)status->max_hp / 100; // {Target VIT x (New Poison Research Skill Level - 3)} + (Target HP/100)
|
||||
map_freeblock_lock();
|
||||
dounlock = true;
|
||||
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false),0);
|
||||
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false));
|
||||
unit_skillcastcancel(bl, 2);
|
||||
}
|
||||
break;
|
||||
@ -14148,7 +13908,7 @@ TIMER_FUNC(status_change_timer){
|
||||
damage = 1;
|
||||
else
|
||||
damage = 200 + 100 * sce->val1 + status_get_int(src);
|
||||
status_damage(src, bl, damage, 0, clif_damage(bl,bl,tick,status->amotion,status->dmotion+200,damage,1,DMG_NORMAL,0,false), 0, 0);
|
||||
status_damage(src, bl, damage, 0, clif_damage(bl,bl,tick,status->amotion,status->dmotion+200,damage,1,DMG_NORMAL,0,false), 0);
|
||||
unit_skillcastcancel(bl,1);
|
||||
if ( sc->data[type] ) {
|
||||
sc_timer_next(1000 + tick);
|
||||
@ -14264,7 +14024,7 @@ TIMER_FUNC(status_change_timer){
|
||||
if (damage >= status->hp)
|
||||
damage = status->hp - 1; // Do not kill, just keep you with 1 hp minimum
|
||||
map_freeblock_lock();
|
||||
status_fix_damage(NULL, bl, damage, clif_damage(bl, bl, tick, 0, 0, damage, 0, DMG_NORMAL, 0, false),0);
|
||||
status_fix_damage(NULL, bl, damage, clif_damage(bl, bl, tick, 0, 0, damage, 0, DMG_NORMAL, 0, false));
|
||||
if (sc->data[type]) {
|
||||
sc_timer_next(1000 + tick);
|
||||
}
|
||||
@ -14351,7 +14111,7 @@ TIMER_FUNC(status_change_timer){
|
||||
|
||||
map_freeblock_lock();
|
||||
clif_damage(bl, bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false);
|
||||
status_damage(src, bl, damage,0, 0, 1, 0);
|
||||
status_damage(src, bl, damage,0, 0, 1);
|
||||
if( sc->data[type] ) {
|
||||
sc_timer_next(2000 + tick);
|
||||
}
|
||||
@ -14545,46 +14305,6 @@ TIMER_FUNC(status_change_timer){
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case SC_NEWMOON:
|
||||
if (--(sce->val4) >= 0) {
|
||||
if (!status_charge(bl, 0, 1))
|
||||
break;
|
||||
sc_timer_next(1000 + tick);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case SC_CREATINGSTAR:
|
||||
if (--(sce->val4) >= 0) { // Needed to check who the caster is and what AoE is giving the status.
|
||||
struct block_list *star_caster = map_id2bl(sce->val2), *star_aoe = map_id2bl(sce->val3);
|
||||
|
||||
if (!star_caster || status_isdead(star_caster) || star_caster->m != bl->m)
|
||||
break;
|
||||
|
||||
map_freeblock_lock();
|
||||
if (star_aoe)
|
||||
skill_attack(BF_WEAPON,star_caster,star_aoe,bl,SJ_BOOKOFCREATINGSTAR,sce->val1,tick,0);
|
||||
if (sc->data[type])
|
||||
sc_timer_next(500 + tick);
|
||||
map_freeblock_unlock();
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case SC_SOULUNITY:
|
||||
if (--(sce->val4) >= 0) { // Needed to check the caster's location for the range check.
|
||||
struct block_list *unity_src = map_id2bl(sce->val2);
|
||||
|
||||
if (!unity_src || status_isdead(unity_src) || unity_src->m != bl->m || !check_distance_bl(bl, unity_src, 11))
|
||||
break;
|
||||
|
||||
status_heal(bl, 150 * sce->val1, 0, 2);
|
||||
sc_timer_next(3000 + tick);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case SC_SOULCOLLECT:
|
||||
pc_addsoulball(sd, skill_get_time2(SP_SOULCOLLECT, sce->val1), sce->val2);
|
||||
sc_timer_next(sce->val3 + tick);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// If status has an interval and there is at least 100ms remaining time, wait for next interval
|
||||
@ -14629,19 +14349,17 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
|
||||
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_NEWMOON, INVALID_TIMER);
|
||||
if (tsc && tsc->data[SC__SHADOWFORM] && (sce && sce->val4 > 0 && sce->val4%2000 == 0) && // For every 2 seconds do the checking
|
||||
rnd()%100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
|
||||
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
||||
break;
|
||||
case SC_RUWACH: // Reveal hidden target and deal little dammages if enemy
|
||||
if (tsc && (tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] ||
|
||||
tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_NEWMOON] || tsc->data[SC_CLOAKINGEXCEED])) {
|
||||
tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_CLOAKINGEXCEED])) {
|
||||
status_change_end(bl, SC_HIDING, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
||||
status_change_end(bl, SC_NEWMOON, INVALID_TIMER);
|
||||
if(battle_check_target( src, bl, BCT_ENEMY ) > 0)
|
||||
skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,1,tick,0);
|
||||
}
|
||||
@ -14892,7 +14610,6 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type)
|
||||
case SC_FEAR:
|
||||
case SC_MAGNETICFIELD:
|
||||
case SC_NETHERWORLD:
|
||||
case SC_CREATINGSTAR:
|
||||
if (!(type&SCCB_DEBUFFS))
|
||||
continue;
|
||||
break;
|
||||
|
@ -887,39 +887,6 @@ enum sc_type : int16 {
|
||||
SC_ENTRY_QUEUE_APPLY_DELAY,
|
||||
SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT,
|
||||
|
||||
// Star Emperor
|
||||
SC_LIGHTOFMOON,
|
||||
SC_LIGHTOFSUN,
|
||||
SC_LIGHTOFSTAR,
|
||||
SC_LUNARSTANCE,
|
||||
SC_UNIVERSESTANCE,
|
||||
SC_SUNSTANCE,
|
||||
SC_FLASHKICK,
|
||||
SC_NEWMOON,
|
||||
SC_STARSTANCE,
|
||||
SC_DIMENSION,
|
||||
SC_DIMENSION1,
|
||||
SC_DIMENSION2,
|
||||
SC_CREATINGSTAR,
|
||||
SC_FALLINGSTAR,
|
||||
SC_NOVAEXPLOSING,
|
||||
SC_GRAVITYCONTROL,
|
||||
|
||||
// Soul Reaper
|
||||
SC_SOULCOLLECT,
|
||||
SC_SOULREAPER,
|
||||
SC_SOULUNITY,
|
||||
SC_SOULSHADOW,
|
||||
SC_SOULFAIRY,
|
||||
SC_SOULFALCON,
|
||||
SC_SOULGOLEM,
|
||||
SC_SOULDIVISION,
|
||||
SC_SOULENERGY,
|
||||
SC_USE_SKILL_SP_SPA,
|
||||
SC_USE_SKILL_SP_SHA,
|
||||
SC_SP_SHA,
|
||||
SC_SOULCURSE,
|
||||
|
||||
#ifdef RENEWAL
|
||||
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
|
||||
#endif
|
||||
@ -2465,13 +2432,13 @@ int status_sc2skill(sc_type sc);
|
||||
unsigned int status_sc2scb_flag(sc_type sc);
|
||||
int status_type2relevant_bl_types(int type);
|
||||
|
||||
int status_damage(struct block_list *src,struct block_list *target,int64 dhp,int64 dsp, t_tick walkdelay, int flag, uint16 skill_id);
|
||||
int status_damage(struct block_list *src,struct block_list *target,int64 dhp,int64 dsp, t_tick walkdelay, int flag);
|
||||
//Define for standard HP damage attacks.
|
||||
#define status_fix_damage(src, target, hp, walkdelay, skill) status_damage(src, target, hp, 0, walkdelay, 0, skill)
|
||||
#define status_fix_damage(src, target, hp, walkdelay) status_damage(src, target, hp, 0, walkdelay, 0)
|
||||
//Define for standard SP damage attacks.
|
||||
#define status_fix_spdamage(src, target, sp, walkdelay, skill) status_damage(src, target, 0, sp, walkdelay, 0, skill)
|
||||
#define status_fix_spdamage(src, target, sp, walkdelay) status_damage(src, target, 0, sp, walkdelay, 0)
|
||||
//Define for standard HP/SP damage triggers.
|
||||
#define status_zap(bl, hp, sp) status_damage(NULL, bl, hp, sp, 0, 1, 0)
|
||||
#define status_zap(bl, hp, sp) status_damage(NULL, bl, hp, sp, 0, 1)
|
||||
//Define for standard HP/SP skill-related cost triggers (mobs require no HP/SP to use skills)
|
||||
int64 status_charge(struct block_list* bl, int64 hp, int64 sp);
|
||||
int status_percent_change(struct block_list *src, struct block_list *target, int8 hp_rate, int8 sp_rate, uint8 flag);
|
||||
|
@ -1924,10 +1924,6 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
||||
|
||||
if (!src->prev)
|
||||
return 0;
|
||||
} else if (sc->data[SC_NEWMOON] && skill_id != SJ_NEWMOONKICK) {
|
||||
status_change_end(src, SC_NEWMOON, INVALID_TIMER);
|
||||
if (!src->prev)
|
||||
return 0; // Warped away!
|
||||
}
|
||||
}
|
||||
|
||||
@ -2101,11 +2097,6 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
|
||||
} else if (sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4)) {
|
||||
status_change_end(src, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
||||
|
||||
if (!src->prev)
|
||||
return 0;
|
||||
} else if (sc->data[SC_NEWMOON]) {
|
||||
status_change_end(src, SC_NEWMOON, INVALID_TIMER);
|
||||
|
||||
if (!src->prev)
|
||||
return 0;
|
||||
}
|
||||
@ -2913,8 +2904,6 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
|
||||
status_change_end(bl, SC_CLOSECONFINE2, INVALID_TIMER);
|
||||
status_change_end(bl, SC_TINDER_BREAKER, INVALID_TIMER);
|
||||
status_change_end(bl, SC_TINDER_BREAKER2, INVALID_TIMER);
|
||||
status_change_end(bl, SC_FLASHKICK, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SOULUNITY, INVALID_TIMER);
|
||||
status_change_end(bl, SC_HIDING, INVALID_TIMER);
|
||||
// Ensure the bl is a PC; if so, we'll handle the removal of cloaking and cloaking exceed later
|
||||
if ( bl->type != BL_PC ) {
|
||||
@ -2935,7 +2924,6 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
|
||||
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
|
||||
status_change_end(bl, SC__MANHOLE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_VACUUM_EXTREME, INVALID_TIMER);
|
||||
status_change_end(bl, SC_NEWMOON, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CURSEDCIRCLE_ATKER, INVALID_TIMER); // callme before warp
|
||||
status_change_end(bl, SC_SUHIDE, INVALID_TIMER);
|
||||
}
|
||||
@ -3274,7 +3262,6 @@ int unit_free(struct block_list *bl, clr_type clrtype)
|
||||
pc_inventory_rental_clear(sd);
|
||||
pc_delspiritball(sd, sd->spiritball, 1);
|
||||
pc_delspiritcharm(sd, sd->spiritcharm, sd->spiritcharm_type);
|
||||
pc_delsoulball(sd,sd->soulball, 1);
|
||||
|
||||
if( sd->st && sd->st->state != RUN ) {// free attached scripts that are waiting
|
||||
script_free_state(sd->st);
|
||||
|
Loading…
x
Reference in New Issue
Block a user