Compare commits

..

6 Commits

Author SHA1 Message Date
Daegaladh
9fde55170e Clears the cooldown timer display 2024-07-29 19:52:56 +02:00
Daegaladh
48b105405a Fixed Homunculus Lif skills (#8513) 2024-07-28 18:56:47 +02:00
Daegaladh
3908b0e9ee Fixed homunculus cooldown and aftercast delays (#8508)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-07-27 16:07:54 +02:00
Playtester
3cc32b6727 Removed Gunslinger Mine Damage Delay (#8517)
- Gunslinger Mine no longer has damage delay
- Freeze from Cryo Sphere / Ice Bullet will no longer be immediately broken by its own damage
- Fixes #8516
2024-07-26 20:43:46 +02:00
Atemo
e39fa4b66a Corrected pet_db.yml script (#8509) 2024-07-21 14:12:23 +02:00
Atemo
c5eaa1544f Updated Old Glast Heim instance (#8504)
Updated dialog and system of Old Glast Heim instance.
* Added missing checkweight
* Added missing dialogue and warp when a player did not receive the reward after killing the first mvp "Corrupted Soul"
* Corrected monster re-spawn on map 2 : previous monster spawn by the npc are now killed before new spawn
2024-07-16 22:33:34 +02:00
31 changed files with 1157 additions and 3143 deletions

View File

@@ -17,10 +17,18 @@
// 0x10: They display luk/3+1 instead of their actual critical in the
// stat window (by default they don't crit)
// 0x20: Their Min-Matk is always the same as their max
// 0x40: Skill re-use delay is reset when they are vaporized.
// 0x80: Skill re-use delay is reset when they are warped (by skill or item) with player.
hom_setting: 0x3D
// Should the cooldown or aftercast delay of homunculi skills be reset when
// the homunculus is vaporized?
// Default on official servers: yes for Pre-renewal, no for Renewal
//hom_delay_reset_vaporize: no
// Should the cooldown or aftercast delay of homunculi skills be reset when
// warping or changing maps?
// Default on official servers: yes for Pre-renewal, no for Renewal
//hom_delay_reset_warp: no
// The rate a homunculus will get friendly by feeding it. (Note 2)
homunculus_friendly_rate: 100

View File

@@ -30726,10 +30726,8 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Range: 9
Hit: Single
HitCount: 1
AfterCastActDelay: 2000
AfterCastWalkDelay: 1000
Requires:
SpCost:
- Level: 1
@@ -30752,11 +30750,8 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Splash: true
Hit: Single
HitCount: 1
SplashArea: -1
AfterCastActDelay: 35000
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 40000
@@ -30785,7 +30780,6 @@ Body:
Name: HLIF_BRAIN
Description: Brain Surgery
MaxLevel: 5
SplashArea: 1
- Id: 8004
Name: HLIF_CHANGE
Description: Change
@@ -30793,7 +30787,14 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Hit: Single
AfterCastActDelay:
- Level: 1
Time: 600000
- Level: 2
Time: 900000
- Level: 3
Time: 1200000
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 60000
@@ -30801,13 +30802,6 @@ Body:
Time: 180000
- Level: 3
Time: 300000
Duration2:
- Level: 1
Time: 600000
- Level: 2
Time: 900000
- Level: 3
Time: 1200000
Requires:
SpCost: 100
Status: Change
@@ -30819,7 +30813,8 @@ Body:
DamageFlags:
NoDamage: true
Hit: Single
Duration2: 1000
AfterCastActDelay: 1000
AfterCastWalkDelay: 1000
Requires:
SpCost: 10
- Id: 8006
@@ -30831,6 +30826,7 @@ Body:
NoDamage: true
Hit: Single
AfterCastActDelay: 30000
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 40000
@@ -30869,6 +30865,14 @@ Body:
DamageFlags:
NoDamage: true
Hit: Single
AfterCastActDelay:
- Level: 1
Time: 300000
- Level: 2
Time: 600000
- Level: 3
Time: 900000
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 60000
@@ -30876,13 +30880,6 @@ Body:
Time: 180000
- Level: 3
Time: 300000
Duration2:
- Level: 1
Time: 300000
- Level: 2
Time: 600000
- Level: 3
Time: 900000
Requires:
SpCost: 120
Status: Bloodlust
@@ -30905,7 +30902,6 @@ Body:
Count: -2
- Level: 5
Count: -3
AfterCastWalkDelay: 2000
Requires:
SpCost:
- Level: 1
@@ -30926,6 +30922,18 @@ Body:
DamageFlags:
NoDamage: true
Hit: Single
AfterCastActDelay:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 60000
@@ -30937,17 +30945,6 @@ Body:
Time: 45000
- Level: 5
Time: 40000
Duration2:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
Requires:
SpCost:
- Level: 1
@@ -30971,6 +30968,18 @@ Body:
NoDamage: true
Hit: Single
CastCancel: true
AfterCastActDelay:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 60000
@@ -30982,17 +30991,6 @@ Body:
Time: 45000
- Level: 5
Time: 40000
Duration2:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
Requires:
SpCost:
- Level: 1
@@ -31015,7 +31013,6 @@ Body:
Range: 15
Hit: Single
HitCount: 1
AfterCastActDelay: 1000
Requires:
SpCost: 1
- Id: 8013
@@ -31037,17 +31034,6 @@ Body:
Count: 4
- Level: 5
Count: 5
AfterCastActDelay:
- Level: 1
Time: 2000
- Level: 2
Time: 2200
- Level: 3
Time: 2400
- Level: 4
Time: 2600
- Level: 5
Time: 2800
Requires:
SpCost:
- Level: 1
@@ -31068,8 +31054,7 @@ Body:
DamageFlags:
NoDamage: true
Hit: Single
AfterCastActDelay: 3000
AfterCastWalkDelay: 3000
AfterCastWalkDelay: 1500
Requires:
SpCost: 40
- Id: 8015
@@ -31093,7 +31078,6 @@ Body:
HitCount: 1
Element: Weapon
SplashArea: 4
AfterCastWalkDelay: 1000
Requires:
SpCost: 1
- Id: 8018

View File

@@ -2478,13 +2478,17 @@ Body:
DurationLookup: HLIF_AVOID
CalcFlags:
Speed: true
Flags:
NoSave: true
RemoveFromHomOnWarp: true
- Status: Change
DurationLookup: HLIF_CHANGE
CalcFlags:
Vit: true
Int: true
Flags:
RemoveOnChangeMap: true
NoSave: true
RemoveFromHomOnWarp: true
Fail:
Change: true
- Status: Bloodlust

View File

@@ -205,137 +205,3 @@ Body:
- Index: 7
Item: S_Turtle_Is_Box_IL
Rate: 150
- Map: prt_mz03_i
SpecificDrops:
- Monster: ILL_BAPHOMET
Drops:
- Index: 0
Item: Bazerald_IL
Rate: 5000
RandomOptionGroup: ILL_MAGIC_BOSS
- Index: 1
Item: Butcher_IL
Rate: 5000
RandomOptionGroup: ILL_PHYSIC_BOSS
- Index: 2
Item: Gold_Lux_IL
Rate: 5000
RandomOptionGroup: ILL_PHYSIC_BOSS
- Index: 3
Item: Morpheus_Armlet_IL
Rate: 5000
- Index: 4
Item: Morpheus_Hood_IL
Rate: 5000
- Index: 5
Item: Morpheus_Ring_IL
Rate: 5000
- Index: 6
Item: Morpheus_Shawl_IL
Rate: 5000
- Index: 7
Item: IllusionStone
Rate: 15000
- Index: 8
Item: Taegoolyeon_IL
Rate: 5000
RandomOptionGroup: ILL_PHYSIC_BOSS
- Index: 9
Item: S_Teddy_Labyrinth_IL
Rate: 150
- Monster: ILL_BAPHOMET_J
Drops:
- Index: 0
Item: Gold_Lux_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_SIDE_WINDER
Drops:
- Index: 0
Item: Bazerald_IL
Rate: 25
RandomOptionGroup: ILL_MAGIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_HUNTER_FLY
Drops:
- Index: 0
Item: IllusionStone
Rate: 10
- Index: 1
Item: Taegoolyeon_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_MANTIS
Drops:
- Index: 0
Item: Butcher_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_GHOSTRING
Drops:
- Index: 0
Item: IllusionStone
Rate: 10
- Index: 1
Item: Taegoolyeon_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_KILLER_MANTIS
Drops:
- Index: 0
Item: Butcher_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_POPORING
Drops:
- Index: 0
Item: Bazerald_IL
Rate: 25
RandomOptionGroup: ILL_MAGIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_STEM_WORM
Drops:
- Index: 0
Item: Gold_Lux_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5

View File

@@ -99586,625 +99586,34 @@ Body:
# AegisName: E_MD_LUDE
# - Id: 20519
# AegisName: E_MD_JACK_GAINT
- Id: 20520
AegisName: ILL_BAPHOMET
Name: Chaos Baphomet
Level: 178
Hp: 21278744
BaseExp: 4255749
JobExp: 2979024
#MvpExp:
Attack: 6141
Attack2: 3168
Defense: 343
MagicDefense: 122
Str: 276
Agi: 188
Vit: 55
Int: 267
Dex: 244
Luk: 99
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Large
Race: Demon
Element: Dark
ElementLevel: 3
WalkSpeed: 100
AttackDelay: 768
AttackMotion: 576
DamageMotion: 768
Ai: 21
Class: Boss
MvpDrops:
- Item: Old_Violet_Box
Rate: 3000
- Item: Old_Card_Album
Rate: 4000
- Item: Magic_Card_Album
Rate: 5000
Drops:
- Item: Bapho_Doll
Rate: 1000
- Item: Crescent_Scythe
Rate: 150
- Item: Essence_Of_Demon
Rate: 5000
- Item: Tae_Goo_Lyeon
Rate: 100
- Item: Evil_Horn
Rate: 3500
- Item: Bazerald
Rate: 200
- Item: Apple
Rate: 1
- Item: Chaos_Baphomet_Card
Rate: 1
StealProtected: true
- Id: 20521
AegisName: ILL_ANDREA
Name: Chaotic Andrea
Level: 177
Hp: 1057547
BaseExp: 96141
JobExp: 67298
Attack: 4248
Attack2: 1337
Defense: 330
MagicDefense: 110
Str: 192
Agi: 122
Vit: 51
Int: 175
Dex: 188
Luk: 68
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demihuman
Element: Neutral
ElementLevel: 3
WalkSpeed: 130
AttackDelay: 576
AttackMotion: 432
DamageMotion: 288
Ai: 04
Drops:
- Item: Brigan
Rate: 5000
- Item: Fragment_Of_Crystal
Rate: 2500
- Item: Morpheus's_Ring
Rate: 100
- Item: Yggdrasilberry
Rate: 50
- Item: Seed_Of_Yggdrasil
Rate: 50
- Item: Chaos_Acolyte_Card
Rate: 1
StealProtected: true
- Id: 20522
AegisName: ILL_ANES
Name: Chaotic Anes
Level: 177
Hp: 1057444
BaseExp: 96131
JobExp: 67292
Attack: 4314
Attack2: 1369
Defense: 327
MagicDefense: 110
Str: 195
Agi: 122
Vit: 50
Int: 174
Dex: 178
Luk: 61
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demihuman
Element: Neutral
ElementLevel: 3
WalkSpeed: 130
AttackDelay: 567
AttackMotion: 432
DamageMotion: 288
Ai: 04
Drops:
- Item: Brigan
Rate: 5000
- Item: Fragment_Of_Crystal
Rate: 3500
- Item: Morpheus's_Hood
Rate: 100
- Item: Seed_Of_Yggdrasil
Rate: 50
- Item: Yggdrasilberry
Rate: 50
- Item: Chaos_Acolyte_Card
Rate: 1
StealProtected: true
- Id: 20523
AegisName: ILL_SILVANO
Name: Chaotic Silvano
Level: 177
Hp: 1057650
BaseExp: 96150
JobExp: 67305
Attack: 4292
Attack2: 1385
Defense: 333
MagicDefense: 111
Str: 194
Agi: 122
Vit: 52
Int: 176
Dex: 184
Luk: 57
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demihuman
Element: Neutral
ElementLevel: 3
WalkSpeed: 130
AttackDelay: 576
AttackMotion: 432
DamageMotion: 288
Ai: 04
Drops:
- Item: Brigan
Rate: 5000
- Item: Fragment_Of_Crystal
Rate: 3500
- Item: Yggdrasilberry
Rate: 50
- Item: Seed_Of_Yggdrasil
Rate: 50
- Item: Morpheus's_Shawl
Rate: 100
- Item: Chaos_Acolyte_Card
Rate: 1
StealProtected: true
- Id: 20524
AegisName: ILL_CECILIA
Name: Chaotic Cecilia
Level: 177
Hp: 1056411
BaseExp: 96037
JobExp: 67226
Attack: 4359
Attack2: 1392
Defense: 297
MagicDefense: 111
Str: 197
Agi: 122
Vit: 40
Int: 177
Dex: 186
Luk: 61
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demihuman
Element: Neutral
ElementLevel: 3
WalkSpeed: 130
AttackDelay: 576
AttackMotion: 432
DamageMotion: 288
Ai: 04
Drops:
- Item: Brigan
Rate: 5000
- Item: Fragment_Of_Crystal
Rate: 3500
- Item: Yggdrasilberry
Rate: 50
- Item: Seed_Of_Yggdrasil
Rate: 50
- Item: Morpheus's_Armlet
Rate: 100
- Item: Chaos_Acolyte_Card
Rate: 1
StealProtected: true
- Id: 20525
AegisName: ILL_BAPHOMET_J
Name: Chaos Baphomet Jr.
Level: 177
Hp: 1057444
BaseExp: 173089
JobExp: 121125
Attack: 4093
Attack2: 847
Defense: 327
MagicDefense: 108
Str: 185
Agi: 101
Vit: 50
Int: 158
Dex: 178
Luk: 77
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Small
Race: Formless
Element: Dark
ElementLevel: 1
WalkSpeed: 100
AttackDelay: 868
AttackMotion: 480
DamageMotion: 120
Ai: 04
Drops:
- Item: Brigan
Rate: 2500
- Item: Evil_Horn
Rate: 1750
- Item: Yellow_Herb
Rate: 1750
- Item: Oridecon
Rate: 100
- Item: Short_Rope
Rate: 1250
- Item: Gold_Lux
Rate: 25
- Item: Chaos_Ba_Jr_Card
Rate: 1
StealProtected: true
- Id: 20526
AegisName: ILL_SIDE_WINDER
Name: Chaos Side Winder
Level: 176
Hp: 1051983
BaseExp: 172143
JobExp: 120499
Attack: 4026
Attack2: 832
Defense: 341
MagicDefense: 108
Str: 183
Agi: 94
Vit: 55
Int: 156
Dex: 177
Luk: 70
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Brute
Element: Poison
ElementLevel: 1
WalkSpeed: 200
AttackDelay: 1576
AttackMotion: 576
DamageMotion: 576
Ai: 04
Drops:
- Item: Scale_Of_Snakes
Rate: 2500
- Item: Posionous_Canine
Rate: 1750
- Item: Karvodailnirol
Rate: 5
- Item: Tsurugi
Rate: 25
- Item: White_Herb
Rate: 700
- Item: Snake_Deadly_Poison
Rate: 1250
- Item: Chaos_S_Winder_Card
Rate: 1
StealProtected: true
- Id: 20527
AegisName: ILL_HUNTER_FLY
Name: Chaos Hunter Fly
Level: 175
Hp: 1045087
BaseExp: 171014
JobExp: 119710
Attack: 3916
Attack2: 817
Defense: 313
MagicDefense: 107
Str: 179
Agi: 115
Vit: 46
Int: 154
Dex: 189
Luk: 66
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Small
Race: Formless
Element: Wind
ElementLevel: 2
WalkSpeed: 150
AttackDelay: 676
AttackMotion: 576
DamageMotion: 480
Ai: 04
Drops:
- Item: Solid_Shell
Rate: 2500
- Item: Steel
Rate: 50
- Item: Zargon
Rate: 1750
- Item: Oridecon_Stone
Rate: 70
- Item: Delicious_Juice
Rate: 1250
- Item: Rough_Wind
Rate: 20
- Item: Chaos_H_Fly_Card
Rate: 1
StealProtected: true
- Id: 20528
AegisName: ILL_MANTIS
Name: Chaos Mantis
Level: 174
Hp: 1039216
BaseExp: 170053
JobExp: 119037
Attack: 3937
Attack2: 817
Defense: 315
MagicDefense: 71
Str: 181
Agi: 96
Vit: 47
Int: 155
Dex: 184
Luk: 67
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Insect
Element: Earth
ElementLevel: 1
WalkSpeed: 200
AttackDelay: 1528
AttackMotion: 660
DamageMotion: 432
Ai: 04
Modes:
Detector: true
Drops:
- Item: Limb_Of_Mantis
Rate: 2250
- Item: Yellow_Live
Rate: 60
- Item: Solid_Shell
Rate: 1000
- Item: Mantis_Flower
Rate: 1250
- Item: Azure_Jewel
Rate: 10
- Item: Red_Herb
Rate: 500
- Item: Chaos_Mantis_Card
Rate: 1
StealProtected: true
- Id: 20529
AegisName: ILL_GHOSTRING
Name: Chaos Ghostring
Level: 173
Hp: 1033446
BaseExp: 169110
JobExp: 118377
Attack: 3979
Attack2: 834
Defense: 320
MagicDefense: 71
Str: 184
Agi: 87
Vit: 49
Int: 159
Dex: 182
Luk: 61
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demon
Element: Ghost
ElementLevel: 2
WalkSpeed: 300
AttackDelay: 1220
AttackMotion: 1080
DamageMotion: 648
Ai: 04
Modes:
Detector: true
Drops:
- Item: Transparent_Cloth
Rate: 2500
- Item: Soft_Silk_Cloth
Rate: 1750
- Item: Scell
Rate: 1000
- Item: Fragment_Of_Crystal
Rate: 1750
- Item: Soft_Scarf
Rate: 1250
- Item: Chaos_Goring_Card
Rate: 1
StealProtected: true
- Id: 20530
AegisName: ILL_KILLER_MANTIS
Name: Chaos Killer Mantis
Level: 177
Hp: 1058167
BaseExp: 173154
JobExp: 121280
Attack: 4027
Attack2: 842
Defense: 348
MagicDefense: 72
Str: 182
Agi: 105
Vit: 57
Int: 157
Dex: 194
Luk: 47
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Insect
Element: Earth
ElementLevel: 1
WalkSpeed: 175
AttackDelay: 1528
AttackMotion: 660
DamageMotion: 432
Ai: 04
Modes:
Detector: true
Drops:
- Item: Limb_Of_Mantis
Rate: 2500
- Item: Solid_Shell
Rate: 1250
- Item: Yggdrasilberry
Rate: 15
- Item: Yellow_Live
Rate: 70
- Item: Butcher
Rate: 25
- Item: Purple_Solid_Shell
Rate: 1250
- Item: Chaos_K_Mantis_Card
Rate: 1
StealProtected: true
- Id: 20531
AegisName: ILL_POPORING
Name: Chaos Poporing
Level: 173
Hp: 1032638
BaseExp: 168976
JobExp: 118283
Attack: 3828
Attack2: 797
Defense: 296
MagicDefense: 70
Str: 177
Agi: 85
Vit: 41
Int: 152
Dex: 172
Luk: 29
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Plant
Element: Poison
ElementLevel: 3
WalkSpeed: 300
AttackDelay: 1672
AttackMotion: 672
DamageMotion: 480
Ai: 02
Drops:
- Item: Sticky_Mucus
Rate: 2500
- Item: Green_Herb
Rate: 1000
- Item: Seed_Of_Yggdrasil
Rate: 20
- Item: Fragment_Of_Crystal
Rate: 1750
- Item: Brilliant_Jelly
Rate: 1250
- Item: Elunium
Rate: 50
- Item: Chaos_Poporing_Card
Rate: 1
StealProtected: true
- Id: 20532
AegisName: ILL_STEM_WORM
Name: Chaotic Stem Worm
Level: 172
Hp: 1027071
BaseExp: 168066
JobExp: 117646
Attack: 3917
Attack2: 804
Defense: 307
MagicDefense: 70
Str: 180
Agi: 95
Vit: 45
Int: 156
Dex: 187
Luk: 69
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Plant
Element: Wind
ElementLevel: 1
WalkSpeed: 300
AttackDelay: 1956
AttackMotion: 756
DamageMotion: 528
Ai: 04
Drops:
- Item: Tough_Scalelike_Stem
Rate: 2500
- Item: White_Herb
Rate: 1000
- Item: Oridecon
Rate: 100
- Item: Great_Nature
Rate: 20
- Item: Suspicious_Sap
Rate: 1250
- Item: Seed_Of_Yggdrasil
Rate: 20
- Item: Chaos_Stem_W_Card
Rate: 1
StealProtected: true
- Id: 20533
AegisName: G_ILL_BAPHOMET_J
Name: Chaos Baphomet Jr.
Level: 177
Hp: 105744
Attack: 4093
Attack2: 847
Defense: 327
MagicDefense: 108
Str: 185
Agi: 101
Vit: 50
Int: 158
Dex: 178
Luk: 77
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Small
Race: Formless
Element: Dark
ElementLevel: 1
WalkSpeed: 100
AttackDelay: 868
AttackMotion: 481
DamageMotion: 120
Ai: 24
# - Id: 20520
# AegisName: ILL_BAPHOMET
# - Id: 20521
# AegisName: ILL_ANDREA
# - Id: 20522
# AegisName: ILL_ANES
# - Id: 20523
# AegisName: ILL_SILVANO
# - Id: 20524
# AegisName: ILL_CECILIA
# - Id: 20525
# AegisName: ILL_BAPHOMET_J
# - Id: 20526
# AegisName: ILL_SIDE_WINDER
# - Id: 20527
# AegisName: ILL_HUNTER_FLY
# - Id: 20528
# AegisName: ILL_MANTIS
# - Id: 20529
# AegisName: ILL_GHOSTRING
# - Id: 20530
# AegisName: ILL_KILLER_MANTIS
# - Id: 20531
# AegisName: ILL_POPORING
# - Id: 20532
# AegisName: ILL_STEM_WORM
# - Id: 20533
# AegisName: G_ILL_BAPHOMET_J
# - Id: 20534
# AegisName: G_REGINLEIF
# - Id: 20535

View File

@@ -14164,165 +14164,6 @@
20603,ABYSSMAN@NPC_COMBOATTACK,attack,171,2,2000,500,5000,no,target,always,0,,,,,,,
20603,ABYSSMAN@NPC_BLOODDRAIN,attack,199,1,500,0,5000,yes,target,always,0,,,,,,29,
// Illusion of Labyrinth
20520,ILL_BAPHOMET@NPC_DARKSTRIKE,chase,340,10,2000,0,1000,yes,target,always,0,,,,,,,
20520,ILL_BAPHOMET@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20520,ILL_BAPHOMET@AL_TELEPORT,walk,26,1,5000,0,5000,yes,self,rudeattacked,0,,,,,,,
20520,ILL_BAPHOMET@KN_BRANDISHSPEAR,attack,57,10,2000,500,5000,no,target,always,0,,,,,,29,
20520,ILL_BAPHOMET@NPC_EARTHQUAKE,chase,653,5,10000,1500,30000,no,self,myhpltmaxrate,80,,,,,,6,
20520,ILL_BAPHOMET@NPC_EARTHQUAKE,attack,653,5,10000,1500,30000,no,self,myhpltmaxrate,80,,,,,,6,
// 20520,ILL_BAPHOMET@NPC_EARTHQUAKE_K,chase,750,5,10000,1500,30000,no,self,myhpltmaxrate,80,,,,,,6,
// 20520,ILL_BAPHOMET@NPC_EARTHQUAKE_K,attack,750,5,10000,1500,30000,no,self,myhpltmaxrate,80,,,,,,6,
20520,ILL_BAPHOMET@NPC_POWERUP,attack,349,5,10000,0,30000,yes,self,myhpltmaxrate,30,,,,,,6,
20520,ILL_BAPHOMET@NPC_CALLSLAVE,attack,352,1,10000,0,30000,yes,self,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_CALLSLAVE,idle,352,1,10000,0,30000,yes,self,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_HELLJUDGEMENT2,chase,768,5,10000,800,10000,no,target,always,0,,,,,,6,
20520,ILL_BAPHOMET@NPC_HELLJUDGEMENT2,attack,768,5,10000,800,10000,no,target,always,0,,,,,,6,
20520,ILL_BAPHOMET@NPC_DARKBREATH,attack,202,5,2000,800,5000,no,target,always,0,,,,,,29,
20520,ILL_BAPHOMET@NPC_ARMORBRAKE,attack,344,10,2000,0,5000,no,target,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_GUIDEDATTACK,attack,172,5,500,0,20000,no,target,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_SUMMONSLAVE,attack,196,1,10000,700,10000,no,self,slavele,3,20533,,,,,,
20520,ILL_BAPHOMET@NPC_SUMMONSLAVE,idle,196,1,10000,700,10000,no,self,slavele,3,20533,,,,,,
20520,ILL_BAPHOMET@WZ_VERMILION,attack,85,21,2000,500,2000,no,target,always,0,,,,,,29,
20520,ILL_BAPHOMET@WZ_VERMILION,chase,85,21,5000,500,2000,no,target,skillused,18,,,,,,29,
20520,ILL_BAPHOMET@WZ_VERMILION,chase,85,21,2000,500,2000,no,target,always,0,,,,,,29,
20520,ILL_BAPHOMET@AL_HEAL,idle,28,11,10000,0,5000,yes,friend,myhpltmaxrate,50,,,,,,,
20520,ILL_BAPHOMET@NPC_CRITICALWOUND,attack,673,3,500,0,5000,yes,target,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_BLEEDING2,attack,764,3,500,0,5000,yes,target,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_GRADUAL_GRAVITY,attack,752,3,3000,0,5000,yes,target,myhpltmaxrate,20,,,,,,,
20520,ILL_BAPHOMET@NPC_DAMAGE_HEAL,attack,753,1,10000,1500,60000,no,target,myhpltmaxrate,10,,,,,,,
20521,ILL_ANDREA@AL_PNEUMA,idle,25,1,5000,0,10000,yes,target,longrangeattacked,0,,,,,,22,
20521,ILL_ANDREA@NPC_CHEAL,attack,729,5,5000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20521,ILL_ANDREA@AL_HEAL,attack,28,11,5000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20521,ILL_ANDREA@NPC_CHEAL,idle,729,5,10000,500,5000,yes,self,friendhpltmaxrate,60,,,,,,3,
20521,ILL_ANDREA@AL_HEAL,idle,28,11,10000,500,5000,yes,friend,myhpltmaxrate,30,,,,,,3,
20521,ILL_ANDREA@NPC_CHEAL,chase,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20521,ILL_ANDREA@AL_HEAL,chase,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20521,ILL_ANDREA@NPC_HOLYATTACK,attack,189,5,500,0,5000,yes,target,always,0,,,,,,,
20521,ILL_ANDREA@NPC_BLINDATTACK,attack,177,5,1000,700,5000,no,target,always,0,,,,,,,
20521,ILL_ANDREA@AL_DECAGI,attack,30,48,500,1000,5000,no,target,always,0,,,,,,29,
20521,ILL_ANDREA@CR_HOLYCROSS,attack,253,5,1000,0,5000,yes,target,always,0,,,,,,,
20521,ILL_ANDREA@AL_DECAGI,chase,30,1,2000,1000,20000,no,target,always,0,,,,,,29,
20521,ILL_ANDREA@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20521,ILL_ANDREA@AL_DECAGI,chase,30,48,2000,1000,20000,no,target,always,0,,,,,,29,
20521,ILL_ANDREA@SM_BASH,attack,5,10,500,0,5000,yes,target,always,0,,,,,,,
20522,ILL_ANES@AL_PNEUMA,idle,25,1,5000,0,10000,yes,target,longrangeattacked,0,,,,,,22,
20522,ILL_ANES@NPC_CHEAL,attack,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20522,ILL_ANES@AL_HEAL,attack,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20522,ILL_ANES@NPC_CHEAL,idle,729,5,10000,500,5000,yes,self,friendhpltmaxrate,60,,,,,,3,
20522,ILL_ANES@AL_HEAL,idle,28,11,10000,500,5000,yes,friend,myhpltmaxrate,30,,,,,,3,
20522,ILL_ANES@NPC_CHEAL,chase,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20522,ILL_ANES@AL_HEAL,chase,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20522,ILL_ANES@NPC_HOLYATTACK,attack,189,5,500,0,5000,yes,target,always,0,,,,,,,
20522,ILL_ANES@NPC_SILENCEATTACK,attack,178,5,1000,700,5000,no,target,always,0,,,,,,,
20522,ILL_ANES@AL_DECAGI,attack,30,48,500,1000,5000,no,target,always,0,,,,,,29,
20522,ILL_ANES@MG_SAFETYWALL,attack,12,10,500,1000,5000,no,target,always,0,,,,,,29,
20522,ILL_ANES@AL_DECAGI,chase,30,48,2000,1000,20000,no,target,always,0,,,,,,29,
20522,ILL_ANES@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20522,ILL_ANES@SM_BASH,attack,5,10,500,0,5000,yes,target,always,0,,,,,,29,
20523,ILL_SILVANO@AL_PNEUMA,idle,25,1,5000,0,10000,yes,target,longrangeattacked,0,,,,,,22,
20523,ILL_SILVANO@NPC_CHEAL,attack,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20523,ILL_SILVANO@AL_HEAL,attack,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20523,ILL_SILVANO@NPC_CHEAL,idle,729,5,10000,500,5000,yes,self,friendhpltmaxrate,60,,,,,,3,
20523,ILL_SILVANO@AL_HEAL,idle,28,11,10000,500,5000,yes,friend,myhpltmaxrate,30,,,,,,3,
20523,ILL_SILVANO@NPC_CHEAL,chase,729,5,10000,500,5000,no,self,friendhpltmaxrate,0,,,,,,3,
20523,ILL_SILVANO@AL_HEAL,chase,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20523,ILL_SILVANO@NPC_HOLYATTACK,attack,189,5,500,0,5000,yes,target,always,0,,,,,,,
20523,ILL_SILVANO@NPC_STUNATTACK,attack,179,5,1000,700,5000,no,target,always,0,,,,,,,
20523,ILL_SILVANO@CR_GRANDCROSS,attack,254,5,500,1000,5000,no,self,always,0,,,,,,,
20523,ILL_SILVANO@AL_DECAGI,attack,30,48,500,1000,5000,no,target,always,0,,,,,,29,
20523,ILL_SILVANO@AL_DECAGI,chase,30,48,2000,1000,20000,no,target,always,0,,,,,,29,
20523,ILL_SILVANO@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20523,ILL_SILVANO@SM_BASH,attack,5,10,500,0,5000,yes,target,always,0,,,,,,29,
20524,ILL_CECILIA@AL_PNEUMA,idle,25,1,5000,0,10000,yes,target,longrangeattacked,0,,,,,,22,
20524,ILL_CECILIA@NPC_CHEAL,attack,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20524,ILL_CECILIA@AL_HEAL,attack,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20524,ILL_CECILIA@NPC_CHEAL,idle,729,5,10000,500,5000,yes,self,friendhpltmaxrate,60,,,,,,3,
20524,ILL_CECILIA@AL_HEAL,idle,28,11,10000,500,5000,yes,friend,myhpltmaxrate,30,,,,,,3,
20524,ILL_CECILIA@NPC_CHEAL,chase,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20524,ILL_CECILIA@AL_HEAL,chase,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20524,ILL_CECILIA@NPC_HOLYATTACK,attack,189,5,500,0,5000,yes,target,always,0,,,,,,,
20524,ILL_CECILIA@NPC_CURSEATTACK,attack,181,5,1000,700,5000,no,target,always,0,,,,,,,
20524,ILL_CECILIA@NPC_LEX_AETERNA,attack,727,3,1000,0,5000,yes,target,always,0,,,,,,,
20524,ILL_CECILIA@AL_DECAGI,attack,30,48,500,1000,5000,no,target,always,0,,,,,,29,
20524,ILL_CECILIA@AL_DECAGI,chase,30,48,2000,1000,20000,no,target,always,0,,,,,,29,
20524,ILL_CECILIA@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20524,ILL_CECILIA@SM_BASH,attack,5,10,500,0,5000,yes,target,always,0,,,,,,29,
20525,ILL_BAPHOMET_J@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20525,ILL_BAPHOMET_J@NPC_CURSEATTACK,attack,181,3,1000,800,5000,no,target,always,0,,,,,,29,
20525,ILL_BAPHOMET_J@NPC_DARKNESSATTACK,attack,190,3,1000,500,5000,no,target,always,0,,,,,,6,
20525,ILL_BAPHOMET_J@NPC_EMOTION,walk,197,1,2000,0,5000,yes,self,always,0,,,,,,2,
20525,ILL_BAPHOMET_J@NPC_HALLUCINATION,attack,207,1,300,500,5000,yes,target,always,0,,,,,,29,
20525,ILL_BAPHOMET_J@NPC_HALLUCINATION,chase,207,1,300,500,5000,yes,target,always,0,,,,,,29,
20525,ILL_BAPHOMET_J@NPC_FIREATTACK,chase,186,3,1000,0,5000,yes,target,always,0,,,,,,19,
20525,ILL_BAPHOMET_J@NPC_DARKSTRIKE,chase,340,4,1500,500,5000,no,target,always,0,,,,,,,
20525,ILL_BAPHOMET_J@NPC_DARKCROSS,attack,338,3,300,0,5000,yes,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_POISONATTACK,chase,188,5,3000,0,5000,yes,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@KN_PIERCE,attack,56,5,500,700,5000,no,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_POISON,attack,176,3,500,800,5000,no,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_POISONATTACK,attack,188,3,500,500,5000,no,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_COMBOATTACK,attack,171,1,500,0,5000,yes,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@CR_AUTOGUARD,attack,249,10,500,0,300000,yes,self,always,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_CRITICALSLASH,attack,170,1,500,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@AL_TELEPORT,idle,26,1,500,0,5000,yes,self,always,0,,,,,,,
20527,ILL_HUNTER_FLY@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20527,ILL_HUNTER_FLY@MG_LIGHTNINGBOLT,chase,20,9,3000,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@NPC_BLOODDRAIN,attack,199,1,500,0,5000,yes,target,always,0,,,,,,2,
20527,ILL_HUNTER_FLY@NPC_COMBOATTACK,attack,171,1,500,0,5000,yes,target,always,0,,,,,,6,
20527,ILL_HUNTER_FLY@NPC_WINDATTACK,attack,187,3,2000,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@NPC_CRITICALSLASH,attack,170,1,500,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@MG_LIGHTNINGBOLT,attack,20,9,500,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@NPC_GUIDEDATTACK,attack,172,5,500,0,60000,yes,target,always,0,,,,,,,
20528,ILL_MANTIS@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20528,ILL_MANTIS@NPC_COMBOATTACK,attack,171,1,500,700,5000,no,target,always,0,,,,,,6,
20528,ILL_MANTIS@NPC_GROUNDATTACK,attack,185,3,500,500,5000,no,target,always,0,,,,,,6,
20528,ILL_MANTIS@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,0x0081,,,,,19,
20528,ILL_MANTIS@NPC_EMOTION,idle,197,1,2000,0,5000,yes,self,always,0,0x3095,,,,,9,
20529,ILL_GHOSTRING@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,28,
20529,ILL_GHOSTRING@NPC_CHEAL,idle,729,5,3000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20529,ILL_GHOSTRING@AL_HEAL,idle,28,11,3000,500,5000,no,friend,myhpltmaxrate,60,,,,,,3,
20529,ILL_GHOSTRING@NPC_INVISIBLE,attack,353,1,2000,200,5000,yes,self,always,0,,,,,,,
20529,ILL_GHOSTRING@NPC_INVISIBLE,idle,353,1,2000,200,5000,yes,self,always,0,,,,,,,
20529,ILL_GHOSTRING@NPC_INVISIBLE,chase,353,1,2000,200,5000,yes,self,always,0,,,,,,,
20529,ILL_GHOSTRING@MG_SOULSTRIKE,chase,13,4,2000,500,1000,yes,target,always,0,,,,,,,
20529,ILL_GHOSTRING@NPC_DARKBREATH,attack,202,4,500,800,5000,no,target,always,0,,,,,,28,
20529,ILL_GHOSTRING@NPC_TELEKINESISATTACK,attack,191,5,500,0,5000,yes,target,always,0,,,,,,28,
20529,ILL_GHOSTRING@NPC_DARKSTRIKE,chase,340,4,2000,500,1000,yes,target,always,0,,,,,,,
20530,ILL_KILLER_MANTIS@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20530,ILL_KILLER_MANTIS@NPC_COMBOATTACK,attack,171,1,500,0,5000,yes,target,always,0,,,,,,,
20530,ILL_KILLER_MANTIS@NPC_CRITICALSLASH,attack,170,1,500,0,5000,yes,target,always,0,,,,,,6,
20530,ILL_KILLER_MANTIS@NPC_GROUNDATTACK,attack,185,3,500,0,5000,yes,target,always,0,,,,,,6,
20530,ILL_KILLER_MANTIS@WZ_EARTHSPIKE,attack,90,3,500,500,5000,no,target,always,0,,,,,,,
20530,ILL_KILLER_MANTIS@WZ_EARTHSPIKE,chase,90,3,1000,500,5000,no,target,always,0,,,,,,,
20530,ILL_KILLER_MANTIS@WZ_HEAVENDRIVE,attack,91,3,500,800,5000,no,target,always,0,,,,,,,
20531,ILL_POPORING@NPC_AGIUP,loot,350,1,1000,0,10000,yes,self,always,0,,,,,,2,
20531,ILL_POPORING@NPC_AGIUP,idle,350,1,0,0,10000,yes,self,always,0,,,,,,,
20531,ILL_POPORING@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20531,ILL_POPORING@NPC_POISON,attack,176,3,500,800,5000,no,target,always,0,,,,,,,
20531,ILL_POPORING@NPC_POISONATTACK,attack,188,3,2000,0,5000,yes,target,always,0,,,,,,,
20531,ILL_POPORING@SM_MAGNUM,attack,7,5,500,0,10000,yes,self,always,0,,,,,,,
20531,ILL_POPORING@NPC_VENOMIMPRESS,attack,738,2,5000,0,30000,yes,target,always,0,,,,,,,
20532,ILL_STEM_WORM@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20532,ILL_STEM_WORM@NPC_GUIDEDATTACK,attack,172,5,500,0,20000,yes,target,always,0,,,,,,,
20532,ILL_STEM_WORM@NPC_WINDATTACK,attack,187,3,500,0,5000,yes,target,always,0,,,,,,6,
20532,ILL_STEM_WORM@NPC_GROUNDATTACK,attack,185,3,500,0,5000,yes,target,always,0,,,,,,6,
20532,ILL_STEM_WORM@KN_TWOHANDQUICKEN,chase,60,30,3000,0,120000,yes,self,always,0,,,,,,,
20532,ILL_STEM_WORM@NPC_DEFENDER,chase,205,1,1500,0,300000,yes,self,longrangeattacked,0,,,,,,,
20532,ILL_STEM_WORM@AS_SONICBLOW,attack,136,5,500,0,5000,yes,target,always,0,,,,,,,
20532,ILL_STEM_WORM@NPC_DEFENDER,attack,205,1,1000,0,300000,yes,self,longrangeattacked,0,,,,,,,
20532,ILL_STEM_WORM@NPC_CHEAL,idle,729,5,3000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20532,ILL_STEM_WORM@AL_HEAL,idle,28,11,3000,500,5000,no,friend,myhpltmaxrate,60,,,,,,3,
20532,ILL_STEM_WORM@NPC_CHEAL,chase,729,5,3000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20532,ILL_STEM_WORM@AL_HEAL,chase,28,11,3000,500,5000,no,friend,myhpltmaxrate,60,,,,,,3,
20533,G_ILL_BAPHOMET_J@NPC_CURSEATTACK,attack,181,3,1000,800,5000,no,target,always,0,,,,,,29,
20533,G_ILL_BAPHOMET_J@NPC_DARKNESSATTACK,attack,190,3,1000,500,5000,no,target,always,0,,,,,,6,
20533,G_ILL_BAPHOMET_J@NPC_HALLUCINATION,attack,207,1,300,500,5000,yes,target,always,0,,,,,,29,
20533,G_ILL_BAPHOMET_J@NPC_HALLUCINATION,chase,207,1,300,500,5000,yes,target,always,0,,,,,,29,
20533,G_ILL_BAPHOMET_J@NPC_FIREATTACK,chase,186,3,1000,0,5000,yes,target,always,0,,,,,,19,
20533,G_ILL_BAPHOMET_J@NPC_DARKSTRIKE,chase,340,4,1500,500,5000,no,target,always,0,,,,,,,
20533,G_ILL_BAPHOMET_J@NPC_DARKCROSS,attack,338,3,300,0,5000,yes,target,always,0,,,,,,,
// Meister ABR's (Automated Battle Robot)
20834,ABR_BATTLE_WARIOR@ABR_BATTLE_BUSTER,chase,8601,1,10000,500,5000,yes,target,always,0,,,,,,,
20834,ABR_BATTLE_WARIOR@ABR_BATTLE_BUSTER,attack,8601,1,10000,500,5000,yes,target,always,0,,,,,,,

File diff suppressed because it is too large Load Diff

View File

@@ -1459,21 +1459,21 @@ Body:
TimeLimit: 4h
- Id: 3464
Title: Illusion Investigation Team - Terrian
- Id: 3465
Title: Illusion of Labyrinth 100 Kills
Targets:
- Id: 1
Count: 100
Location: prt_mz03_i
MapMobTargets:
ILL_STEM_WORM: true
ILL_GHOSTRING: true
ILL_POPORING: true
ILL_MANTIS: true
ILL_HUNTER_FLY: true
ILL_SIDE_WINDER: true
ILL_BAPHOMET_J: true
ILL_KILLER_MANTIS: true
# - Id: 3465
# Title: Illusion of Labyrinth 100 Kills
# Targets:
# - Id: 1
# Count: 100
# Location: prt_mz03_i
# MapMobTargets:
# ILL_STEM_WORM: true
# ILL_GHOSTRING: true
# ILL_POPORING: true
# ILL_MANTIS: true
# ILL_HUNTER_FLY: true
# ILL_SIDE_WINDER: true
# ILL_BAPHOMET_J: true
# ILL_KILLER_MANTIS: true
- Id: 3466
Title: Illusion of Labyrinth 100 Kills - Standby
TimeLimit: 4h
@@ -9307,90 +9307,9 @@ Body:
- Id: 12461
Title: The aftereffects of powerful death
TimeLimit: 3d 4h
- Id: 12470
Title: "[Daily] Andrea's Revenge I"
Targets:
- Mob: ILL_BAPHOMET_J
Count: 5
- Id: 12471
Title: "[Daily] Andrea's Revenge II"
Targets:
- Mob: ILL_GHOSTRING
Count: 2
- Id: 12472
Title: "[Daily] Anes' Revenge I"
Targets:
- Mob: ILL_HUNTER_FLY
Count: 5
- Id: 12473
Title: "[Daily] Anes' Revenge II"
Targets:
- Mob: ILL_KILLER_MANTIS
Count: 5
- Id: 12474
Title: "[Daily] Silvano's Revenge I"
Targets:
- Mob: ILL_MANTIS
Count: 5
- Id: 12475
Title: "[Daily] Silvano's Revenge II"
Targets:
- Mob: ILL_POPORING
Count: 5
- Id: 12476
Title: "[Daily] Cecilia's Revenge I"
Targets:
- Mob: ILL_SIDE_WINDER
Count: 5
- Id: 12477
Title: "[Daily] Cecilia's Revenge II"
Targets:
- Mob: ILL_STEM_WORM
Count: 3
- Id: 12478
Title: "[Weekly] Soul Purification - Andrea"
Targets:
- Mob: ILL_ANDREA
Count: 1
- Id: 12479
Title: "[Weekly] Soul Purification - Anes"
Targets:
- Mob: ILL_ANES
Count: 1
- Id: 12480
Title: "[Weekly] Soul Purification - Silvano"
Targets:
- Mob: ILL_SILVANO
Count: 1
- Id: 12481
Title: "[Weekly] Soul Purification - Cecilia"
Targets:
- Mob: ILL_CECILIA
Count: 1
- Id: 12482
Title: Disappearance of a Colleague
- Id: 12483
Title: Follow Up
- Id: 12484
Title: Searching for Traces - Andrea
- Id: 12485
Title: Searching for Traces - Anes
- Id: 12486
Title: Searching for Traces - Silvano
- Id: 12487
Title: Searching for Traces - Cecilia
- Id: 12488
Title: Search Result
- Id: 12489
Title: Guest Guild Member
- Id: 12490
Title: "[Cooldown] Daily Mission"
Title: Receive today's mission
TimeLimit: 4h
- Id: 12491
Title: "[Cooldown] Weekly Mission"
TimeLimit: Monday 4h
- Id: 12492
Title: Esmeralda
- Id: 12493
Title: The aftereffect of the challenge
TimeLimit: 3d 4h

View File

@@ -43018,10 +43018,10 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Range: 9
Hit: Single
HitCount: 1
AfterCastActDelay: 2000
Flags:
IgnoreGtb: true
AfterCastWalkDelay: 1000
Cooldown: 20000
Requires:
SpCost:
- Level: 1
@@ -43044,11 +43044,7 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Splash: true
Hit: Single
HitCount: 1
SplashArea: -1
AfterCastActDelay: 35000
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 40000
@@ -43060,6 +43056,7 @@ Body:
Time: 25000
- Level: 5
Time: 20000
Cooldown: 35000
Requires:
SpCost:
- Level: 1
@@ -43077,7 +43074,6 @@ Body:
Name: HLIF_BRAIN
Description: Brain Surgery
MaxLevel: 5
SplashArea: 1
- Id: 8004
Name: HLIF_CHANGE
Description: Change
@@ -43085,7 +43081,7 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Hit: Single
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 60000
@@ -43093,7 +43089,7 @@ Body:
Time: 180000
- Level: 3
Time: 300000
Duration2:
Cooldown:
- Level: 1
Time: 600000
- Level: 2
@@ -43111,7 +43107,8 @@ Body:
DamageFlags:
NoDamage: true
Hit: Single
Duration2: 1000
AfterCastWalkDelay: 1000
Cooldown: 1000
Requires:
SpCost: 10
- Id: 8006
@@ -43122,7 +43119,7 @@ Body:
DamageFlags:
NoDamage: true
Hit: Single
AfterCastActDelay: 30000
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 40000
@@ -43134,6 +43131,7 @@ Body:
Time: 25000
- Level: 5
Time: 20000
Cooldown: 30000
Requires:
SpCost:
- Level: 1
@@ -43161,6 +43159,7 @@ Body:
DamageFlags:
NoDamage: true
Hit: Single
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 60000
@@ -43168,7 +43167,7 @@ Body:
Time: 180000
- Level: 3
Time: 300000
Duration2:
Cooldown:
- Level: 1
Time: 300000
- Level: 2
@@ -43197,7 +43196,7 @@ Body:
Count: -2
- Level: 5
Count: -3
AfterCastWalkDelay: 2000
Cooldown: 2000
Requires:
SpCost:
- Level: 1
@@ -43218,6 +43217,7 @@ Body:
DamageFlags:
NoDamage: true
Hit: Single
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 60000
@@ -43229,7 +43229,7 @@ Body:
Time: 45000
- Level: 5
Time: 40000
Duration2:
Cooldown:
- Level: 1
Time: 60000
- Level: 2
@@ -43263,6 +43263,7 @@ Body:
NoDamage: true
Hit: Single
CastCancel: true
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
Time: 60000
@@ -43274,7 +43275,7 @@ Body:
Time: 45000
- Level: 5
Time: 40000
Duration2:
Cooldown:
- Level: 1
Time: 60000
- Level: 2
@@ -43307,7 +43308,7 @@ Body:
Range: 15
Hit: Single
HitCount: 1
AfterCastActDelay: 1000
Cooldown: 1000
Requires:
SpCost: 1
- Id: 8013
@@ -43329,7 +43330,7 @@ Body:
Count: 4
- Level: 5
Count: 5
AfterCastActDelay:
Cooldown:
- Level: 1
Time: 2000
- Level: 2
@@ -43360,8 +43361,8 @@ Body:
DamageFlags:
NoDamage: true
Hit: Single
AfterCastActDelay: 3000
AfterCastWalkDelay: 3000
AfterCastWalkDelay: 1500
Cooldown: 3000
Requires:
SpCost: 40
- Id: 8015
@@ -43385,7 +43386,8 @@ Body:
HitCount: 1
Element: Weapon
SplashArea: 4
AfterCastWalkDelay: 1000
AfterCastActDelay: 5000
CoolDown: 1000
Requires:
SpCost: 1
- Id: 8018

View File

@@ -2600,13 +2600,17 @@ Body:
DurationLookup: HLIF_AVOID
CalcFlags:
Speed: true
Flags:
NoSave: true
RemoveFromHomOnMapWarp: true
- Status: Change
DurationLookup: HLIF_CHANGE
CalcFlags:
Vit: true
Int: true
Flags:
RemoveOnChangeMap: true
NoSave: true
RemoveFromHomOnMapWarp: true
Fail:
Change: true
- Status: Bloodlust

View File

@@ -254,6 +254,9 @@ Flags: Various status flags for specific status change events.
SuperNoviceAngel - Status that is given from Super Novice Angel.
TaekwonAngel - Status that is given from Taekwon Angel.
RemoveFromHomOnWarp - Removes the status from the Homunculus when teleporting or warping to another map.
RemoveFromHomOnMapWarp - Removes the status from the Homunculus when warping to another map.
---------------------------------------
MinDuration: Minimum duration, in milliseconds, after reduction calculation for status resistance.

View File

@@ -1001,13 +1001,16 @@ SC_FLING ()
desc:
val1:
SC_AVOID ()
desc:
val1:
SC_AVOID (EFST_HLIF_AVOID)
desc: Increase walkspeed for Players and Homunculus
val1: Skill Level
val2: Walkspeed increase (10 * val1 for Players, 40 * val1 for Homunculus)
SC_CHANGE ()
desc:
val1:
SC_CHANGE (EFST_HLIF_CHANGE)
desc: Increase some Homunculus' statuses (VIT, INT); Uses MATK for damage calculation; Sets Homunculus' HP and SP to 10 on expiration; On Pre-Renewal, sets Homunculus' HP and SP to 100% on cast
val1: Skill Level
val2: VIT increase (20 * val1)
val3: INT increase (30 * val1)
SC_BLOODLUST ()
desc:

View File

@@ -163,7 +163,7 @@ glast_01,204,273,5 script Hugin 4_M_SAGE_C,{
1@gl_k,206,79,0 warp #3Control2 2,2,1@gl_k,195,79
1@gl_k,227,216,0 warp #4Control 2,2,1@gl_k,215,216
1@gl_k,222,216,0 warp #4Control2 2,2,1@gl_k,233,216
1@gl_k,150,284,0 warp #2F Entrance 2,2,2@gl_k,150,46
// 1@gl_k,150,284,0 warp #2F Entrance 2,2,2@gl_k,150,46
2@gl_k,149,32,0 warp #1 Control 2,2,1@gl_k,150,270
2@gl_k,145,123,0 warp #22 Control 2,2,2@gl_k,126,123
2@gl_k,136,122,0 warp #22 Control2 2,2,2@gl_k,150,116
@@ -188,8 +188,8 @@ glast_01,204,273,5 script Hugin 4_M_SAGE_C,{
next;
if (select( "Omit moderately.", "Appreciate everything." ) == 1) {
cutin "GL_BARMUND1.bmp",2;
mes "[Barmund]";
mes "Have I seen you " + strcharinfo(0) + "";
mes "[Varmundt]";
mes "I've seen you, " + strcharinfo(0) + ".";
mes "I'm sure I can trust you. Let's leave right away.";
close2;
cutin "",255;
@@ -1073,8 +1073,13 @@ OnTimer5000:
close3;
}
// note: never hidden
1@gl_k,156,258,3 script Varmundt#2 4_M_BARMUND,{
if ('step < 6)
end;
if (checkweight(6607,1, 6608,1) == 0) {
mes "^ff0000It seems like you have too many types or weights of items. Please organize your inventory.^000000";
close;
}
cutin "gl_barmund1",2;
mes "[Varmundt]";
if (checkquest(12318,HUNTING) != 2) {
@@ -1216,10 +1221,24 @@ OnMyMobDead:
enablenpc instance_npcname("Varmundt#21");
donpcevent instance_npcname("#ghmemorialmob05") + "::OnStart";
disablenpc instance_npcname("#ghmemorialmob04");
'step = 6;
}
end;
}
1@gl_k,150,284,0 script #2F Entrance WARPNPC,2,2,{
end;
OnTouch:
if (checkquest(12318,HUNTING) == 2) {
mes "^0000ffIt seems that you did not receive a reward for clearing the first floor. Talk to Varmundt and receive your reward.^000000";
close2;
warp 'map_name$[0],156,256;
end;
}
warp 'map_name$[1],150,46;
end;
}
// Floor 2
//============================================================
2@gl_k,148,67,1 script Heinrich#21 4_M_HEINRICH,{
@@ -1246,9 +1265,9 @@ OnEffect:
2@gl_k,150,66,0 script #Servanton HIDDEN_WARP_NPC,7,7,{
end;
OnTouch_:
if ('step != 5)
if ('step != 6)
end;
'step = 6;
'step = 7;
disablenpc();
if ('mode == 1)
donpcevent instance_npcname("#talkinstance5") + "::OnStart";
@@ -1372,16 +1391,18 @@ OnTouch_:
disablenpc();
.@hidden_name$ = strnpcinfo(2);
.@event_type = atoi( charat(.@hidden_name$,4) );
.@event_number = atoi( charat(.@hidden_name$,6) );
if (.@event_type == 2)
.@label$ = instance_npcname("#ghmemorialmob05") + "::OnMyMobDead";
.@event$ = instance_npcname("#ghmemorialmob05") + "::OnMyMobDead" + .@event_number; // left side
else
.@label$ = instance_npcname("#ghmemorialmob06") + "::OnMyMobDead";
.@event$ = instance_npcname("#ghmemorialmob06") + "::OnMyMobDead" + .@event_number; // right side
killmonster 'map_name$[1], .@event$;
getmapxy .@map$,.@x,.@y, BL_NPC;
monster .@map$,.@x,.@y, "Corrupted Palace Guard", 2468,1, .@label$;
monster .@map$,.@x,.@y, "Archer of Death", 2469,1, .@label$;
monster .@map$,.@x,.@y, "Corrupted Abysmal Knight", 2470,1, .@label$;
monster .@map$,.@x,.@y, "Suffered Khalitzburg", 2471,1, .@label$;
monster .@map$,.@x,.@y, "Bloody Knight", 2472,1, .@label$;
monster .@map$,.@x,.@y, "Corrupted Palace Guard", 2468,1, .@event$;
monster .@map$,.@x,.@y, "Archer of Death", 2469,1, .@event$;
monster .@map$,.@x,.@y, "Corrupted Abysmal Knight", 2470,1, .@event$;
monster .@map$,.@x,.@y, "Suffered Khalitzburg", 2471,1, .@event$;
monster .@map$,.@x,.@y, "Bloody Knight", 2472,1, .@event$;
initnpctimer;
end;
OnTimer30000:
@@ -1417,7 +1438,13 @@ OnStart:
enablenpc instance_npcname("#ogh_2-" + .@i);
end;
OnMyMobDead:
OnMyMobDead1:
OnMyMobDead2:
OnMyMobDead3:
OnMyMobDead4:
OnMyMobDead5:
OnMyMobDead6:
OnMyMobDead7:
if (mobcount('map_name$[1], instance_npcname("#ghmemorialmob05") + "::OnBossDead") > 0) // Prevent boss re-spawn
end;
if ('mode == 2) // Higher (but unknown) spawn rate in fast mode
@@ -1445,7 +1472,9 @@ OnBossDead:
for ( .@i = 1; .@i <= 7; .@i++ )
donpcevent instance_npcname("#ogh_2-" + .@i) + "::OnStop";
killmonster 'map_name$[1], instance_npcname("#ghmemorialmob05") + "::OnMyMobDead";
.@npc_name$ = instance_npcname("#ghmemorialmob05");
for ( .@i = 1; .@i <= 7; .@i++ )
killmonster 'map_name$[1], .@npc_name$ + "::OnMyMobDead" + .@i;
end;
}
@@ -1506,6 +1535,13 @@ OnStart:
end;
OnMyMobDead:
OnMyMobDead1:
OnMyMobDead2:
OnMyMobDead3:
OnMyMobDead4:
OnMyMobDead5:
OnMyMobDead6:
OnMyMobDead7:
if (mobcount('map_name$[1], instance_npcname("#ghmemorialmob06") + "::OnBossDead") > 0) // Prevent boss re-spawn
end;
if ('mode == 2) // Higher (but unknown) spawn rate in fast mode
@@ -1535,7 +1571,10 @@ OnBossDead:
for ( .@i = 1; .@i <= 7; .@i++ )
donpcevent instance_npcname("#ogh_3-" + .@i) + "::OnStop";
killmonster 'map_name$[1], instance_npcname("#ghmemorialmob06") + "::OnMyMobDead";
.@npc_name$ = instance_npcname("#ghmemorialmob06");
killmonster 'map_name$[1], .@npc_name$ + "::OnMyMobDead";
for ( .@i = 1; .@i <= 7; .@i++ )
killmonster 'map_name$[1], .@npc_name$ + "::OnMyMobDead" + .@i;
// Hidden mobs
setarray .@coord[0],
@@ -1552,9 +1591,9 @@ OnBossDead:
2@gl_k,150,180,0 script #Geron HIDDEN_WARP_NPC,7,7,{
end;
OnTouch_:
if ('step != 6)
if ('step != 7)
end;
'step = 7;
'step = 8;
disablenpc instance_npcname("#Geron");
mapannounce 'map_name$[1], "???: Do not come here! It's a trap... Kkkkah!!!", bc_map,0xFF7777,FW_NORMAL,15;
enablenpc instance_npcname("Himelmez#22");
@@ -1574,15 +1613,19 @@ OnTouch_:
else if (.@i == 3) .@mobs = 5;
else if (.@i < 7) .@mobs = 6;
else .@mobs = 7;
.@event$ = instance_npcname( strnpcinfo(0) ) + "::OnMobDead";
killmonster 'map_name$[1], .@event$;
getmapxy .@map$,.@x,.@y, BL_NPC;
specialeffect EF_VENOMDUST;
monster .@map$,.@x,.@y,"Maggot",2467,.@mobs;
monster .@map$,.@x,.@y,"Maggot",2467,.@mobs, .@event$;
initnpctimer;
end;
OnTimer45000:
enablenpc();
stopnpctimer;
end;
OnMobDead:
end;
}
2@gl_k,145,236,4 duplicate(Decomposed body#1) Decomposed body#2 4_M_DIEMAN,5,5
2@gl_k,141,222,2 duplicate(Decomposed body#1) Decomposed body#3 4_M_DIEMAN,5,5
@@ -1646,9 +1689,9 @@ OnTimer45000:
mes "That is amazing ~ you made it all the way here. May I say thank you?";
close3;
OnTouch_:
if ('step != 7)
if ('step != 8)
end;
'step = 8;
'step = 9;
disablenpc();
if ('mode == 1)
donpcevent instance_npcname("#talkinstance7") + "::OnStart";
@@ -1972,9 +2015,13 @@ OnTimer10000:
2@gl_k,158,241,1 script Hugin#21 4_M_SAGE_C,{
if ('step != 8)
if ('step != 9)
end;
if (checkquest(12319,HUNTING) == 2) {// note: complete hunting 'Corrupted Soul Hunt' prerequis
if (checkweight(6607,5, 6608,5) == 0) {
mes "^ff0000It seems like you have too many types or weights of items. Please organize your inventory.^000000";
close;
}
mes "[Hugin]";
mes "Hm, you are very well. First of all, let me give you some loot from Amdarais.";
erasequest 12319;
@@ -2031,7 +2078,7 @@ OnTimer10000:
// Treasure Room
//============================================================
1@gl_k,165,136,3 script Strange crack#2 CLEAR_NPC,{
if ('step != 8)
if ('step != 9)
end;
if (isbegin_quest(12322) == 0) {// Space Distortion
mes "The crack looks suspicious but nothing more to check.";

View File

@@ -945,117 +945,3 @@ Body:
- Index: 4
Item: Clay_Doll
Amount: 5
- Name: barter_ill_labyrinth
Items:
- Index: 0
Item: Morpheus_Hood_IL
RequiredItems:
- Index: 0
Item: Morpheus's_Hood
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 100
- Index: 2
Item: Soft_Scarf
Amount: 100
- Index: 3
Item: Cold_Holy_Water
Amount: 50
- Index: 1
Item: Morpheus_Shawl_IL
RequiredItems:
- Index: 0
Item: Morpheus's_Shawl
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 100
- Index: 2
Item: Brilliant_Jelly
Amount: 100
- Index: 3
Item: Medicinal_Stuff
Amount: 50
- Index: 2
Item: Morpheus_Ring_IL
RequiredItems:
- Index: 0
Item: Morpheus's_Ring
- Index: 1
Item: IllusionStone
Amount: 100
- Index: 2
Item: Purple_Solid_Shell
Amount: 100
- Index: 3
Item: Little_Lovely_Candle
Amount: 50
- Index: 4
Item: Essence_Of_Demon
Amount: 15
- Index: 3
Item: Morpheus_Armlet_IL
RequiredItems:
- Index: 0
Item: Morpheus's_Armlet
- Index: 1
Item: IllusionStone
Amount: 100
- Index: 2
Item: Suspicious_Sap
Amount: 100
- Index: 3
Item: Small_Flashlight
Amount: 50
- Index: 4
Item: Essence_Of_Demon
Amount: 15
- Index: 4
Item: Butcher_IL
RequiredItems:
- Index: 0
Item: Butcher_
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 120
- Index: 2
Item: Delicious_Juice
Amount: 150
- Index: 5
Item: Taegoolyeon_IL
RequiredItems:
- Index: 0
Item: Tae_Goo_Lyeon
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 120
- Index: 2
Item: Short_Rope
Amount: 150
- Index: 6
Item: Gold_Lux_IL
RequiredItems:
- Index: 0
Item: Gold_Lux
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 120
- Index: 2
Item: Snake_Deadly_Poison
Amount: 150
- Index: 7
Item: Bazerald_IL
RequiredItems:
- Index: 0
Item: Bazerald
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 120
- Index: 2
Item: Mantis_Flower
Amount: 150

View File

@@ -16,7 +16,6 @@
//= 1.7 Added Illusion of Twins enchanter [Capuche]
//= 1.8 Added Illusion Merchant [Haydrich]
//= 1.9 Added Illusion of Teddy Bear exchange [Atemo]
//= 1.10 Added Illusion of Labyrinth enchanter [Atemo]
//============================================================
//============================================================
@@ -936,86 +935,3 @@ ein_d02_i,177,158,3 script Bear Wanting Illusion Stone#ITB 4_NASARIAN,{
}
end;
}
//============================================================
//= Illusion of Labyrinth
//============================================================
prt_fild01,137,365,0 script #iol005 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 6) {
cloakoffnpcself( "Esmeralda#5" );
end;
}
end;
}
prt_fild01,141,367,3 script(CLOAKED) Esmeralda#5 4_GEFFEN_09,{
if (checkweight(1201,3) == 0) {
mes "You seem to have too many types or weights of items. Please clean up your inventory.";
close;
}
if (ill_laby < 6)
end;
if (isbegin_quest(12492) == 0) {
mes "[Esmeralda]";
mes "Oh, I thought we parted ways without even saying goodbye, but I guess you decided to work as a guest guild member for us?";
next;
select( "It happened to be like that", "I don't think it's any harm" );
mes "[Esmeralda]";
mes "It's a good choice. We will be of great help to each other.";
next;
select( "Why don't you send other guild members?" );
mes "[Esmeralda]";
mes "There is a reason for that.";
mes "Those guys didn't make a contract with the Guardian Relic. So, there is no insurance whatsoever. If I send other members to perform exorcism, those lost souls will be gone forever.";
next;
mes "[Esmeralda]";
mes "I thought it would be safer to stay here for the time being, so I gave instructions to keep myself hidden and only appear to you who helped me.";
next;
mes "[Esmeralda]";
mes "First of all, since the guild has very little funds, it will likely take quite some time for them to be fully revived. So, I'm thinking of stopping running the guild for a while and starting a business here.";
next;
select( "What kind of business are you planning on doing?" );
mes "[Esmeralda]";
mes "As you know, items called Illusion Stone appear in unknown dungeons all over the continent these days. That... is a very valuable item in this world.";
next;
mes "[Esmeralda]";
mes "I heard that there is a guild that started exploring this dungeon first. And I also received information that Illusion Stone was also found.";
next;
mes "[Esmeralda]";
mes "I'm thinking of doing something like equipment upgrade service near the entrance. Of course, you will receive Illusion Stone and various materials as payment.";
next;
mes "[Esmeralda]";
mes "I think that if I work hard for a few months, I will soon have enough money to revive my guild members.";
mes "This is probably the best for now.";
next;
select( "Is that all it is?" );
mes "[Esmeralda]";
mes "Well... there are countless other places to put money. I will skip explaining it in detail.";
next;
mes "[Esmeralda]";
mes "Anyway, next time I come, will I see you as a customer and vendor? Please continue to take good care of me.";
close2;
setquest 12492;
completequest 12492;
end;
}
mes "[Esmeralda]";
mes "If you have the equipment listed below, you can upgrade it with items obtained from the Illusion of Labyrinth.";
next;
if (select( "Cancel", "View illusion upgrade equipment." ) == 1) {
mes "[Esmeralda]";
mes "All right. Please stop by again next time.";
close;
}
mes "[Esmeralda]";
mes "Please note that if the equipment you wish to upgrade contains the effects of a card or enchantment, it will be ^ff0000destroyed when used as a material^000000.";
close2;
callshop( "barter_ill_labyrinth" );
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild Leader>" );
end;
}

View File

@@ -11,7 +11,6 @@
//= 1.3 Some small fixes [Playtester]
//= 1.4 Corrected MVP spawn variance. [L0ne_W0lf]
//= 1.5 Correct Spawn by Navigation's mob data. [attackjom]
//= 1.6 Added Illusion of Labyrinth. [Atemo]
//============================================================
//==================================================
@@ -102,56 +101,3 @@ prt_maze03,99,21,10,10 monster Black Mushroom 1084,3,180000,90000
prt_maze03,54,15,10,10 monster Black Mushroom 1084,3,180000,90000
prt_maze03,171,180,3,3 monster Red Mushroom 1085,2,180000,90000
prt_maze03,174,187,3,3 monster Red Mushroom 1085,3,180000,90000
//==================================================
// Added Illusion of Labyrinth
//==================================================
prt_mz03_i monster Chaos Poporing 20531,10,5000
prt_mz03_i monster Chaos Side Winder 20526,10,5000
prt_mz03_i monster Chaos Hunter Fly 20527,10,5000
prt_mz03_i monster Chaos Ghostring 20529,4,5000
prt_mz03_i monster Chaos Killer Mantis 20530,10,5000
prt_mz03_i monster Chaos Mantis 20528,10,5000
prt_mz03_i monster Chaos Baphomet Jr. 20525,10,5000
prt_mz03_i monster Chaotic Stem Worm 20532,6,5000
prt_mz03_i monster Chaotic Andrea 20521,1,3600000,0,"prt_mz03_i_boss::OnMobDead"
prt_mz03_i monster Chaotic Anes 20522,1,3600000,0,"prt_mz03_i_boss::OnMobDead"
prt_mz03_i monster Chaotic Silvano 20523,1,3600000,0,"prt_mz03_i_boss::OnMobDead"
prt_mz03_i monster Chaotic Cecilia 20524,1,3600000,0,"prt_mz03_i_boss::OnMobDead"
- script prt_mz03_i_boss -1,{
end;
OnMobDead:
if (playerattached() < 1)
end;
if (.boss_spawn || .cooldown || .count[killedrid] == 1)
end;
.count[killedrid] = 1;
if (.count[20521] == 1 && .count[20522] == 1 && .count[20523] == 1 && .count[20524] == 1) {
.boss_spawn = true;
.count[20521] = 0;
.count[20522] = 0;
.count[20523] = 0;
.count[20524] = 0;
killmonster "prt_mz03_i", "prt_mz03_i_boss::OnBossDeath";
mapannounce "prt_mz03_i", "A terrible presence has descended from beyond the chaos of the deep abyss.", bc_map, 0x70dbdb;
getunitdata( killedgid, .@data );
monster "prt_mz03_i", .@data[UMOB_X], .@data[UMOB_Y], "--ja--", 20520,1, "prt_mz03_i_boss::OnBossDeath"; // ILL_BAPHOMET
end;
}
end;
OnBossDeath:
mapannounce "prt_mz03_i", "The Invincible state of Chaos Baphomet has been lifted.", bc_map, 0x70dbdb;
killmonster "prt_mz03_i", "prt_mz03_i_boss::OnBossDeath";
.boss_spawn = false;
.cooldown = true;
initnpctimer;
end;
OnTimer7200000:
.cooldown = false;
stopnpctimer;
end;
}

View File

@@ -48,40 +48,21 @@ function script F_22507 {// ShabbyOldScroll
// 2 : All the quests are completed
function script F_queststatus {
.@type = getarg(0);
.@status = checkquest(getarg(1),.@type);
switch( .@status ) {
case -1:
.@status = 0;
break;
case 0:
case 1:
.@status = 1;
break;
case 2:
.@status = 2;
break;
}
.@base = checkquest(getarg(1),.@type);
.@size = getargcount();
for ( .@i = 2; .@i < .@size; ++.@i ) {
.@next_status = checkquest(getarg(.@i),.@type);
switch( .@next_status ) {
case -1:
.@next_status = 0;
break;
case 0:
case 1:
.@next_status = 1;
break;
case 2:
.@next_status = 2;
break;
}
if (.@next_status != .@status)
if (checkquest(getarg(.@i),.@type) != .@base)
return -1;
}
return .@status;
switch( .@base ) {
case -1:
return 0;
case 0:
case 1:
return 1;
case 2:
return 2;
}
end;
}

View File

@@ -1226,22 +1226,8 @@ OnInit:
end;
}
prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
mes "[Therian]";
mes "Are there any difficulties in carrying out the mission?";
mes "If you want to get out of the Twisted Labyrinth, I can guide you.";
next;
if (select( "Let's continue talking about the investigation.", "I want to go out." ) == 2) {
mes "[Therian]";
mes "I will guide you to where the entrance to the Twisted Labyrinth was.";
close2;
warp "prt_maze01",99,29;
end;
}
mes "[Therian]";
mes "I understand.";
mes "Then let's talk about the investigation.";
next;
/*
prt_fild01,131,364,5 script Terrian#terian 4W_M_02,{
if (BaseLevel < 170) {
mes "[Terrian]";
mes "It's nice weather.";
@@ -1275,9 +1261,9 @@ prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
mes "If you don't mind, please apply for membership with the Commander <NAVI>[Joel]<INFO>prt_in,136,34,</INFO></NAVI> in Prontera.";
close;
}
if (isbegin_quest(3464) == 0) {
if (isbegin_quest(3467) == 0) {
mes "[Terrian]";
mes "The weather is nice.";
mes "The weather is nice";
next;
mes "[Terrian]";
mes "I'm a Terrian from the Illusion Investigation Corps.";
@@ -1295,7 +1281,7 @@ prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
mes "After the flowers wither in winter, they will bloom again in spring. They always bloom in the place where the flowers withered and fell off.";
next;
mes "[Terrian]";
mes "It's the same with animals, the appearance of each of which varies innumerable, but for hundreds of years it has been discovered that there has always been a completely identical appearance.";
mes "It's the same with animals, the appearance of each of which varies innumerable, but for hundreds of years it has been discovered that there has always been a completely identical appearance";
next;
mes "[Terrian]";
mes "This is the core of the theory of reincarnation, and it takes a very long time to observe and investigate it.";
@@ -1318,7 +1304,7 @@ prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
close;
}
mes "[Terrian]";
mes "Thank you.";
mes "Thank you";
next;
mes "[Terrian]";
mes "In order to determine the individual recovery rate, we need to reduce the number of monsters as quickly as possible.";
@@ -1366,7 +1352,7 @@ prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
close;
}
mes "[Terrian]";
mes "Thank you.";
mes "Thank you";
next;
mes "[Terrian]";
mes "In order to determine the individual recovery rate, we need to reduce the number of monsters as quickly as possible.";
@@ -1403,11 +1389,10 @@ OnInit:
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(3465,HUNTING) == 2" );
questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "isbegin_quest(3464) == 2 && checkquest(3466,PLAYTIME) == -1 && checkquest(3465,HUNTING) == -1" );
// No questinfo when expired
// questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(3466,PLAYTIME) == 2" );
questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(3466,PLAYTIME) == 2" );
end;
}
*/
iz_d04_i,127,224,5 script Lister#ristar 4_F_01,{
if (BaseLevel < 180) {

View File

@@ -15,7 +15,6 @@
//= 1.6 Added Illusion of Underwater [Capuche]
//= 1.7 Added Illusion of Twins [Capuche]
//= 1.8 Added Illusion of Teddy Bear [Atemo]
//= 1.9 Added Illusion of Labyrinth [Atemo]
//============================================================
//============================================================
@@ -12806,738 +12805,3 @@ ein_d02_i,169,244,1 script Sirumsireum Teddy Bear#ITBz02 4_TEDDY_BEAR_B_L,{
npctalk "Teddy Bear: What have you done to me...", "", bc_self;
end;
}
//============================================================
//= Illusion of Labyrinth
//============================================================
prt_maze01,99,27,0 script #iol000 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (BaseLevel < 170)
end;
.@npc_name$ = "Twisted Crack#1";
removespecialeffect EF_GROUNDSAMPLE, AREA, .@npc_name$;
removespecialeffect EF_ICEWALL, AREA, .@npc_name$;
specialeffect EF_GROUNDSAMPLE, AREA, .@npc_name$;
specialeffect EF_ICEWALL, AREA, .@npc_name$;
cloakoffnpcself( .@npc_name$ );
if (ill_laby < 2) {
cloakoffnpcself( "Irene#1" );
end;
}
if (ill_laby == 2) {
cloakoffnpcself( "Irene#1" );
cloakoffnpcself( "Esmeralda#1" );
end;
}
if (ill_laby < 5) {
cloakoffnpcself( "Esmeralda#1" );
end;
}
cloakoffnpcself( "Andrea#1" );
cloakoffnpcself( "Anes#1" );
cloakoffnpcself( "Silvano#1" );
cloakoffnpcself( "Cecilia#1" );
end;
}
prt_maze01,97,21,7 script(CLOAKED) Andrea#1 4_M_ANDREA,{
if (ill_laby < 5)
end;
if (ill_laby == 5) {
mes "[Andrea]";
mes "I heard the story from the guild leader Esmeralda. You are the one who saved us.";
next;
select( "It's not like I did anything particularly grand." );
mes "[Andrea]";
mes "What humble words these are. I almost couldn't come back to life even as a soul. Thank you so much.";
next;
select( "Where did Esmeralda go?" );
mes "[Andrea]";
mes "Oh, the guild leader said she had a few things to prepare and end;ed to the guild base for a moment. She said she would end; straight to the entrance of the labyrinth.";
next;
mes "[Andrea]";
mes "Also, she asked me whether " + strcharinfo(0) + " wants to join us as guest member of the guild.";
next;
mes "[Andrea]";
mes "We don't have the manpower to raise funds for the guild revival. So, we are in a situation where even one hand is lacking.";
next;
mes "[Andrea]";
mes "If we can conquer this newly revealed twisted labyrinth, it will be a spark that can revive our guild. The only person around guild who can do that is " + strcharinfo(0) + ".";
next;
mes "[Andrea]";
mes "" + strcharinfo(0) + ", would you be able to work as a guest guild member for our guild?";
next;
if (select( "I guess that's too much.", "What are the benefits of being one?" ) == 1) {
mes "[Andrea]";
mes "Ah... right, I think it was a bit of an unreasonable request.";
close;
}
mes "[Andrea]";
mes "Even though we are only souls, we have a lot of knowledge gained while wandering through this twisted labyrinth.";
next;
mes "[Andrea]";
mes "We will give you several requests and provide you with appropriate compensation. Would you like to work as a guest guild member?";
next;
if (select( "I think I'll pass", "Yes for compensation!" ) == 1) {
mes "[Andrea]";
mes "Ah... right, I think it was a bit of an unreasonable request.";
close;
}
mes "[Andrea]";
mes "Thank you. Now, on behalf of the guild, we would like to ask " + strcharinfo(0) + " a request related to this twisted labyrinth.";
ill_laby = 6;
completequest 12489;
close;
}
switch( checkquest(12490,PLAYTIME) ) {
case -1:
break;
case 0:
case 1:
mes "[Andrea]";
mes "It's not time to make a new request yet. For now, please complete the previous request first.";
close;
case 2:
erasequest 12490;
break;
}
mes "[Andrea]";
if (F_queststatus(HAVEQUEST,12470,12471,12472,12473,12474,12475,12476,12477) != 0)
mes "You still have quests you couldn't complete yesterday. ^ff0000If you accept a new quest now, the quest you couldn't complete yesterday will be continued today.^000000 Do you want to accept all today's quests?";
else
mes "" + strcharinfo(0) + ", I have a lot of requests for you. Do you want to accept all requests?";
next;
if (select( "Not now", "Accept all" ) == 1) {
mes "[Andrea]";
mes "Please come back when you are ready to receive another request.";
close;
}
setquest 12490;
for ( .@quest_id = 12470; .@quest_id <= 12477; ++.@quest_id ) {
if (isbegin_quest(.@quest_id) == 0)
setquest .@quest_id;
}
mes "[Andrea]";
mes "Please work hard today as well.";
mes "Thank you always.";
close;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild New Member>" );
// Main quest
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(12489) == 1" );
// Daily quest
questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "ill_laby == 6 && checkquest(12490,PLAYTIME) == -1" ); // note: no questinfo when playtime == 2
end;
}
prt_maze01,101,25,3 script(CLOAKED) Silvano#1 4_M_SILVANO,{
if (checkweight(1201,3) == 0) {
mes "You seem to have too many types or weights of items. Please clean up your inventory.";
close;
}
removespecialeffect 1090;
if (ill_laby < 6) {
mes "[Silvano]";
mes "Thank you for your help, " + strcharinfo(0) + ". Guild leader left a message through ^0000ffAndrea^000000.";
close;
}
mes "[Silvano]";
mes "If you have completed a quest, you can receive a reward. Would you like to receive it now?";
next;
if (select( "Not now", "Yes, please" ) == 1) {
mes "[Silvano]";
mes "I'll wait as long as I can.";
close;
}
.@quest_12470 = checkquest(12470,HUNTING);
.@quest_12471 = checkquest(12471,HUNTING);
.@quest_12472 = checkquest(12472,HUNTING);
.@quest_12473 = checkquest(12473,HUNTING);
.@quest_12474 = checkquest(12474,HUNTING);
.@quest_12475 = checkquest(12475,HUNTING);
.@quest_12476 = checkquest(12476,HUNTING);
.@quest_12477 = checkquest(12477,HUNTING);
.@quest_12478 = checkquest(12478,HUNTING);
.@quest_12479 = checkquest(12479,HUNTING);
.@quest_12480 = checkquest(12480,HUNTING);
.@quest_12481 = checkquest(12481,HUNTING);
if (.@quest_12470 != 2 && .@quest_12471 != 2 && .@quest_12472 != 2 && .@quest_12473 != 2 && .@quest_12474 != 2 && .@quest_12475 != 2 && .@quest_12476 != 2 && .@quest_12477 != 2 && .@quest_12478 != 2 && .@quest_12479 != 2 && .@quest_12480 != 2 && .@quest_12481 != 2) { // no daily quest done
mes "[Silvano]";
mes "There are no completed quests. Please come back to me after completing at least one request.";
close;
}
if (.@quest_12470 == 2) {
getexp 1750000,1137500;
getitem 25271,1; // IllusionStone
erasequest 12470;
mes "^0000ff[Daily] Andrea's Revenge I^000000 completed";
next;
}
if (.@quest_12471 == 2) {
getexp 1750000,1137500;
getitem 25271,1; // IllusionStone
erasequest 12471;
mes "^0000ff[Daily] Andrea's Revenge II^000000 completed";
next;
}
if (.@quest_12472 == 2) {
getexp 1750000,1137500;
getitem 25271,1; // IllusionStone
erasequest 12472;
mes "^0000ff[Daily] Anes' Revenge I^000000 completed";
next;
}
if (.@quest_12473 == 2) {
getexp 1750000,1137500;
getitem 25271,1; // IllusionStone
erasequest 12473;
mes "^0000ff[Daily] Anes' Revenge II^000000 completed";
next;
}
if (.@quest_12474 == 2) {
getexp 1750000,1137500;
getitem 25781,1; // Little_Lovely_Candle
erasequest 12474;
mes "^0000ff[Daily] Silvano's Revenge I^000000 completed";
next;
}
if (.@quest_12475 == 2) {
getexp 1750000,1137500;
getitem 25782,1; // Medicinal_Stuff
erasequest 12475;
mes "^0000ff[Daily] Silvano's Revenge II^000000 completed";
next;
}
if (.@quest_12476 == 2) {
getexp 1750000,1137500;
getitem 25783,1; // Cold_Holy_Water
erasequest 12476;
mes "^0000ff[Daily] Cecilia's Revenge I^000000 completed";
next;
}
if (.@quest_12477 == 2) {
getexp 1750000,1137500;
getitem 25784,1; // Small_Flashlight
erasequest 12477;
mes "^0000ff[Daily] Cecilia's Revenge II^000000 completed";
next;
}
if (.@quest_12478 == 2) {
getexp 2500000,1625000;
getitem 25781,3;
erasequest 12478;
mes "^0000ff[Weekly] Soul Purification - Andrea^000000 completed";
next;
}
if (.@quest_12479 == 2) {
getexp 2500000,1625000;
getitem 25782,3;
erasequest 12479;
mes "^0000ff[Weekly] Soul Purification - Anes^000000 completed";
next;
}
if (.@quest_12480 == 2) {
getexp 2500000,1625000;
getitem 25783,3;
erasequest 12480;
mes "^0000ff[Weekly] Soul Purification - Silvano^000000 completed";
next;
}
if (.@quest_12481 == 2) {
getexp 2500000,1625000;
getitem 25784,3; // Small_Flashlight
erasequest 12481;
mes "^0000ff[Weekly] Soul Purification - Cecilia^000000 completed";
next;
}
mes "[Silvano]";
mes "All compensation payments for completed quests have been completed.";
close;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild New Member>" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12470,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12471,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12472,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12473,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12474,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12475,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12476,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12477,HUNTING) == 2" );
end;
}
prt_maze01,101,21,1 script(CLOAKED) Cecilia#1 4_F_CECILIA,{
if (ill_laby < 6) {
mes "[Cecilia]";
mes "Thank you for your help, " + strcharinfo(0) + ". Guild leader left a message through ^0000ffAndrea^000000.";
close;
}
mes "[Cecilia]";
mes "Is there anything I can help you with?";
next;
if (select( "Nothing", "Can you send me outside?" ) == 1) {
mes "[Cecilia]";
mes "I'm sorry I couldn't help you.";
close;
}
warp "prt_fild01",136,365;
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild New Member>" );
end;
}
prt_maze01,97,25,5 script(CLOAKED) Anes#1 4_F_ANES,{
if (checkweight(1201,3) == 0) {
mes "You seem to have too many types or weights of items. Please clean up your inventory.";
close;
}
if (ill_laby < 5)
end;
if (ill_laby == 5) {
mes "[Anes]";
mes "Thank you for your help, " + strcharinfo(0) + ". Guild leader left a message through ^0000ffAndrea^000000.";
close;
}
.@quest_12478 = checkquest(12478,HUNTING);
.@quest_12479 = checkquest(12479,HUNTING);
.@quest_12480 = checkquest(12480,HUNTING);
.@quest_12481 = checkquest(12481,HUNTING);
if (.@quest_12478 == -1 && .@quest_12479 == -1 && .@quest_12480 == -1 && .@quest_12481 == -1)
.@state = 0;
else if (.@quest_12478 == 2 || .@quest_12479 == 2 || .@quest_12480 == 2 || .@quest_12481 == 2)
.@state = 2;
else
.@state = 1;
switch( checkquest(12491,PLAYTIME) ) {
case -1:
break;
case 0:
case 1:
mes "[Anes]";
mes "It's not time to make a new request yet. For now, please complete the previous quest first.";
close;
case 2:
erasequest 12491;
break;
}
switch( .@state ) {
case 0:
mes "[Anes]";
mes "" + strcharinfo(0) + ", there is one weekly request that you can receive weekly. Would you like to receive it?";
next;
if (select( "Not now", "Receive 1 weekly request" ) == 1) {
mes "[Anes]";
mes "Please come back when you are ready to receive another request.";
close;
}
setquest 12491;
setquest rand(12478, 12481);
mes "[Anes]";
mes "I hope that God's blessings will be with you this week as well.";
close;
case 1:
mes "[Anes]";
mes "There are still uncompleted quests. ^ff0000If you accept new quests now, the unfinished quests from last week will be deleted.^000000 Would you like to accept new weekly quests?";
next;
if (select( "Cancel", "Receive the weekly request" ) == 1) {
mes "[Anes]";
mes "Come back when you're ready to accept the quest.";
close;
}
if (isbegin_quest(12478) > 0)
erasequest 12478;
if (isbegin_quest(12479) > 0)
erasequest 12479;
if (isbegin_quest(12480) > 0)
erasequest 12480;
if (isbegin_quest(12481) > 0)
erasequest 12481;
setquest 12491;
setquest rand(12478, 12481);
mes "[Anes]";
mes "May God bless you this week as well.";
close;
case 2:
end;
}
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild New Member>" );
questinfo( QTYPE_EVENT, QMARK_YELLOW, "ill_laby == 6 && checkquest(12491,PLAYTIME) == -1" ); // note: type event is not a mistake
// no questinfo when playtime 2
// questinfo( QTYPE_EVENT, QMARK_YELLOW, "checkquest(12491,PLAYTIME) == 2" );
// unknown questinfo hunting completed
end;
}
prt_maze01,99,23,5 script(CLOAKED) Twisted Crack#1 CLEAR_NPC,{
if (BaseLevel < 170)
end;
if (ill_laby < 2) {
mes "Beyond the twisted crack, a familiar yet unfamiliar labyrinth unfolds.";
close;
}
mes "Beyond the twisted crack, a familiar yet unfamiliar labyrinth unfolds.";
mes "^ff0000If you step in, you may not be able to get out again.^000000";
next;
if (select( "Pretend you didn't see it", "Enter through the crack" ) == 1) {
mes "^0000ffCuriosity killed the cat. Let's bury it quietly.^000000";
close;
}
warp "prt_mz03_i",99,26;
end;
OnInit:
questinfo( QTYPE_CLICKME, QMARK_YELLOW, "isbegin_quest(12484) == 1 || isbegin_quest(12485) == 1 || isbegin_quest(12486) == 1 || isbegin_quest(12487) == 1" );
end;
}
prt_maze01,97,26,5 script(CLOAKED) Irene#1 4_F_ERENE,2,2,{
if (BaseLevel < 170)
end;
if (ill_laby == 0) {
mes "[Irene]";
mes "Ouch! Sorry. I didn't mean to surprise you!";
next;
select( "Whoua! You surprised me!" );
mes "[Irene]";
mes "Please don't point your weapon at me and hear me out! Please.";
next;
select( "Calm down." );
mes "[Irene]";
mes "Thank you. My name is Irene, member of the Prontera Priests' Guild. Ah.. There is a bit of reason why this is happening right now.";
next;
select( "Did you die while hunting?" );
mes "[Irene]";
mes "Yes... I found this suspicious crack during training with 4 other new guild members. They rushed into this place, so I followed them...";
next;
mes "[Irene]";
mes "Please, I would like you to inform our guild leader of the current situation. We are currently recruiting people near the cathedral in Prontera. I will wait for other guild members who might come out of here...";
next;
if (select( "Sorry, I can't help you.", "Alright, no problem." ) == 1) {
mes "[Irene]";
mes "Well yeah.. it must have been an unreasonable request... sorry..";
close;
}
mes "[Irene]";
mes "Thank you! Here's a note with the guild leader's location! Please!";
next;
select( "Let's go outside first." );
ill_laby = 1;
setquest 12482;
warp "prt_fild01",136,365;
end;
}
if (ill_laby == 1) {
mes "[Irene]";
mes "If you look at the note I gave you, the guild leader's location is written down.";
close2;
warp "prt_fild01",136,365;
end;
}
if (ill_laby == 2) {
mes "[Irene]";
mes "Ugh, it looks like there's no trace of my remains...";
next;
mes "[Esmeralda]";
mes "Fortunately, your guardian relic is stored in the guild, so resurrection is possible. It might cost some money, though.";
next;
mes "[Irene]";
mes "I'm sorry...";
close;
}
if (ill_laby == 3) {
mes "[Irene]";
mes "I need to go back to the guild soon. It's quite embarrassing because of the state of my soul.";
close2;
cloakonnpcself();
end;
}
end;
OnTouch:
if (ill_laby == 0) {
npctalk "Ouch! Sorry. I didn't mean to surprise you!", "", bc_self;
end;
}
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild Member>" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "BaseLevel >= 170 && ill_laby == 0" );
end;
}
prt_maze01,101,26,3 script(CLOAKED) Esmeralda#1 4_GEFFEN_09,{
if (ill_laby < 2)
end;
if (ill_laby == 2) {
mes "[Esmeralda]";
mes "Irene, stop crying and come to your senses.";
next;
mes "[Esmeralda]";
mes "Fortunately, your guardian relic is stored in the guild, so resurrection is possible. It might cost some money, though.";
next;
mes "[Irene]";
mes "I'm sorry...";
next;
mes "[Esmeralda]";
mes "We need to resurrect this troublemaker as soon as possible, so I'll send her back to the guild first.";
next;
mes "[Esmeralda]";
mes "I have to say thank you, but since you have already helped me, can I ask you one more favor?";
next;
if (select( "You really have no shame.", "Uh... of course." ) == 1) {
mes "[Esmeralda]";
mes "Ah, I guess that's it. I really have no shame. We'll take care of the rest.";
close;
}
mes "[Esmeralda]";
mes "Irene made a soul contract with the guardian relic a long time ago, so I don't think there will be any problems with her resurrection.";
next;
mes "[Esmeralda]";
mes "There are a total of 4 more people missing. These guys don't have a contract with the guardian relic, so they don't appear in spirit form. Ha... really...";
next;
select( "Is signing a contract with a guardian relic like insurance?" );
mes "[Esmeralda]";
mes "Yes, since our guild is made up of only priests, fatal accidents are unexpectedly rare, but they are very frequent.";
next;
mes "[Esmeralda]";
mes "As soon as you join, you enter into a contract with a guardian relic and undergo a ceremony that completely resurrects your soul and body even after death.";
next;
mes "[Esmeralda]";
mes "The problem is that the four new recruits who disappeared today are the ones who didn't even go through that process.";
next;
select( "Do I have to retrieve the remains and bring them back?" );
mes "[Esmeralda]";
mes "Ah... well, even the smallest traces of the body are fine. The more intact it is, the cheaper the resurrection price will be, but you have to save it first.";
next;
select( "(It feels like furniture repair)" );
mes "[Esmeralda]";
mes "Priests train in various things. During the training process, there are many things that are not quite beautiful.";
next;
if (select( "Well, it looks dangerous so I...", "Alright, I will do it" ) == 1) {
mes "[Esmeralda]";
mes "Ah, I guess that's it. We'll take care of the rest.";
close;
}
mes "[Esmeralda]";
mes "Thank you. I've collected information about the four guild members, so if you need anything, please check it. Perhaps traces of my members lie beyond this twisted rift.";
close2;
ill_laby = 3;
erasequest 12483;
setquest 12484;
setquest 12485;
setquest 12486;
setquest 12487;
end;
}
if (ill_laby == 3) {
mes "[Esmeralda]";
mes "I've collected information about the four guild members, so if you need anything, please check it. Perhaps traces of my members lie beyond this twisted rift.";
close;
}
if (ill_laby == 4) {
mes "[Esmeralda]";
mes "Oh, thank you. I almost gave up, but you really saved all of our new recruits.";
next;
select( "(Can these remains really be called new recruits?)" );
mes "[Esmeralda]";
mes "Thank you so much. First, we need to summon the souls of our guild members to this area. I think this place will be better than the city until complete revival work is done.";
next;
mes "[Esmeralda]";
mes "Oh, and it's a bit difficult to show our guild's soul summoning process if you're not a member of the guild. Could you please go outside the dungeon for a moment?";
next;
if (select( "Can't I just watch?", "Of course" ) == 1) {
mes "[Esmeralda]";
mes "Ah, it would be a bit awkward to show this to someone outside the guild...";
close;
}
mes "[Esmeralda]";
mes "Thank you for your consideration. Then I'll send you outside for a while.";
close2;
ill_laby = 5;
erasequest 12488;
setquest 12489;
warp "prt_fild01",136,365;
end;
}
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild Leader>" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(12483) == 1" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(12488) == 1" );
end;
}
prontera,212,320,0 script #iol002 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 1) {
cloakoffnpcself( "Esmeralda#2" );
end;
}
end;
}
prontera,212,320,3 script(CLOAKED) Esmeralda#2 4_GEFFEN_09,2,3,{
if (ill_laby == 1) {
mes "[Esmeralda]";
mes "Huh? What's going on? Did something happen to our guild members?";
next;
select( "(Inform her terrible thing that happened to the priests' guild)" );
mes "[Esmeralda]";
mes "Our new recruits are missing?";
mes "Sigh... Is it a guild tradition? It always like this every year...";
next;
mes "[Esmeralda]";
mes "Thanks for telling me. I guess I'll have to go take care of these guys. God's blessings be with you, adventurer...";
close2;
ill_laby = 2;
erasequest 12482;
setquest 12483;
cloakonnpcself();
end;
}
end;
OnTouch:
if (ill_laby == 1) {
npctalk "Guided by the light, the Prontera Priests Guild is recruiting new guild members", "", bc_self;
end;
}
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild Leader>" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(12482) == 1" );
end;
}
prt_mz03_i,107,104,0 script #iold01 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 3 && isbegin_quest(12484) == 1) {
cloakoffnpcself( "Trace of Andrea#D" );
end;
}
end;
}
prt_mz03_i,10,18,0 script #iold02 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 3 && isbegin_quest(12485) == 1) {
cloakoffnpcself( "Trace of Anes#D" );
end;
}
end;
}
prt_mz03_i,135,68,0 script #iold03 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 3 && isbegin_quest(12486) == 1) {
cloakoffnpcself( "Trace of Silvano#D" );
end;
}
end;
}
prt_mz03_i,183,26,0 script #iold04 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 3 && isbegin_quest(12487) == 1) {
cloakoffnpcself( "Trace of Cecilia#D" );
end;
}
end;
}
prt_mz03_i,107,104,3 script(CLOAKED) Trace of Andrea#D 4_M_ANDREA_D,{
getmapxy .@map$,.@x,.@y, BL_NPC;
switch( .@x ) {
case 107: // Trace of Andrea#D
.@quest_id = 12484;
break;
case 10: // Trace of Anes#D
.@quest_id = 12485;
break;
case 135: // Trace of Silvano#D
.@quest_id = 12486;
break;
case 183: // Trace of Cecilia#D
.@quest_id = 12487;
break;
}
if (ill_laby == 3 && isbegin_quest(.@quest_id) == 1) {
mes "^0000ffYou found the " + strnpcinfo(1) + ". Would you like to take care of it?^000000";
next;
if (select( "Cancel", "Take care of it" ) == 1) {
mes "^0000ffCancelled the process.^000000";
close;
}
progressbar "FFFF00",5;
specialeffect EF_HO_UP;
erasequest .@quest_id;
cloakonnpcself();
if (F_queststatus(HAVEQUEST,12484,12485,12486,12487) == 0) {
ill_laby = 4;
setquest 12488;
mes "^0000ffYou found traces of guild members. Let's go find Esmeralda inside the labyrinth.^000000";
close2;
warp "prt_fild01",136,365;
end;
}
end;
}
end;
OnInit:
getmapxy .@map$,.@x,.@y, BL_NPC;
switch( .@x ) {
case 107: // Trace of Andrea#D
.@quest_id = 12484;
break;
case 10: // Trace of Anes#D
.@quest_id = 12485;
break;
case 135: // Trace of Silvano#D
.@quest_id = 12486;
break;
case 183: // Trace of Cecilia#D
.@quest_id = 12487;
break;
}
questinfo( QTYPE_CLICKME, QMARK_YELLOW, "isbegin_quest(" + .@quest_id + ") == 1" );
end;
}
prt_mz03_i,10,18,3 duplicate(Trace of Andrea#D) Trace of Anes#D 4_F_ANES_D
prt_mz03_i,135,68,3 duplicate(Trace of Andrea#D) Trace of Silvano#D 4_M_SILVANO_D
prt_mz03_i,183,26,3 duplicate(Trace of Andrea#D) Trace of Cecilia#D 4_F_CECILIA_D

View File

@@ -30,7 +30,6 @@ npc: npc/re/warps/dungeons/mag_dun.txt
npc: npc/re/warps/dungeons/moc_pryd.txt
npc: npc/re/warps/dungeons/nif_dun.txt
npc: npc/re/warps/dungeons/oz_dun.txt
npc: npc/re/warps/dungeons/prt_mz03_i.txt
npc: npc/re/warps/dungeons/rockmi1.txt
npc: npc/re/warps/dungeons/sp_rudus.txt
npc: npc/re/warps/dungeons/slabw01.txt

View File

@@ -1,144 +0,0 @@
//===== rAthena Script =======================================
//= Illusion of Labyrinth Warp Script
//===== Changelogs: ==========================================
//= 1.0 First version. [Atemo]
//============================================================
prt_mz03_i,5,186,0 warp2 3maze1a1_3maze2d2 1,1,prt_mz03_i,151,134
prt_mz03_i,22,194,0 warp2 3maze1a2_3maze4e1 1,1,prt_mz03_i,175,48
prt_mz03_i,85,174,0 warp2 3maze1c1_3maze4a3 1,1,prt_mz03_i,14,48
prt_mz03_i,102,165,0 warp2 3maze1c2_3maze4d2 1,1,prt_mz03_i,137,71
prt_mz03_i,125,171,0 warp2 3maze1d1_3maze3c2 1,1,prt_mz03_i,105,111
prt_mz03_i,154,181,0 warp2 3maze1d2_3maze4d1 1,1,prt_mz03_i,139,48
prt_mz03_i,175,165,0 warp2 3maze1e1_3maze5b3 1,1,prt_mz03_i,71,12
prt_mz03_i,194,175,0 warp2 3maze1e2_3maze2e2 1,1,prt_mz03_i,191,139
prt_mz03_i,5,140,0 warp2 3maze2a1_3maze4c4 1,1,prt_mz03_i,111,56
prt_mz03_i,18,154,0 warp2 3maze2a2_3maze5b1 1,1,prt_mz03_i,48,21
prt_mz03_i,23,125,0 warp2 3maze2a3_3maze4e2 1,1,prt_mz03_i,177,71
prt_mz03_i,54,154,0 warp2 3maze2b1_3maze3d2 1,1,prt_mz03_i,142,111
prt_mz03_i,63,125,0 warp2 3maze2b2_3maze3c1 1,1,prt_mz03_i,88,97
prt_mz03_i,85,146,0 warp2 3maze2c1_3maze3a2 1,1,prt_mz03_i,22,88
prt_mz03_i,98,154,0 warp2 3maze2c2_3maze5c2 1,1,prt_mz03_i,99,31
prt_mz03_i,114,145,0 warp2 3maze2c3_3maze5e1 1,1,prt_mz03_i,168,22
prt_mz03_i,137,125,0 warp2 3maze2d1_3maze4b2 1,1,prt_mz03_i,71,71
prt_mz03_i,154,134,0 warp2 3maze2d2_3maze1a1 1,1,prt_mz03_i,8,186
prt_mz03_i,166,139,0 warp2 3maze2e1_3maze3b4 1,1,prt_mz03_i,63,88
prt_mz03_i,194,139,0 warp2 3maze2e2_3maze1e2 1,1,prt_mz03_i,191,175
prt_mz03_i,17,114,0 warp2 3maze3a1_3maze3d1 1,1,prt_mz03_i,129,102
prt_mz03_i,22,85,0 warp2 3maze3a2_3maze2c1 1,1,prt_mz03_i,88,146
prt_mz03_i,45,104,0 warp2 3maze3b1_3maze4c3 1,1,prt_mz03_i,96,48
prt_mz03_i,63,114,0 warp2 3maze3b2_3maze4a2 1,1,prt_mz03_i,14,71
prt_mz03_i,74,97,0 warp2 3maze3b3_3maze5b2 1,1,prt_mz03_i,56,8
prt_mz03_i,63,85,0 warp2 3maze3b4_3maze2e1 1,1,prt_mz03_i,169,139
prt_mz03_i,85,97,0 warp2 3maze3c1_3maze2b2 1,1,prt_mz03_i,63,128
prt_mz03_i,105,114,0 warp2 3maze3c2_3maze1d1 1,1,prt_mz03_i,128,174
prt_mz03_i,114,95,0 warp2 3maze3c3_3maze5e2 1,1,prt_mz03_i,176,8
prt_mz03_i,125,105,0 warp2 3maze3d1_3maze1b1 1,1,prt_mz03_i,58,191
prt_mz03_i,142,114,0 warp2 3maze3d2_3maze2b1 1,1,prt_mz03_i,54,151
prt_mz03_i,168,94,0 warp2 3maze3e1_3maze4e3 1,1,prt_mz03_i,191,54
prt_mz03_i,182,85,0 warp2 3maze3e2_23maze3 1,1,prt_maze02,100,179
prt_mz03_i,194,94,0 warp2 3maze3e3_3maze5d1 1,1,prt_mz03_i,151,22
prt_mz03_i,5,58,0 warp2 3maze4a1_3maze5e4 1,1,prt_mz03_i,191,15
prt_mz03_i,14,74,0 warp2 3maze4a2_3maze3b2 1,1,prt_mz03_i,63,111
prt_mz03_i,14,45,0 warp2 3maze4a3_3maze1c1 1,1,prt_mz03_i,88,174
prt_mz03_i,52,45,0 warp2 3maze4b1_3maze5a2 1,1,prt_mz03_i,16,31
prt_mz03_i,85,56,0 warp2 3maze4c1_3maze5e3 1,1,prt_mz03_i,176,31
prt_mz03_i,104,74,0 warp2 3maze4c2_3maze5c3 1,1,prt_mz03_i,111,22
prt_mz03_i,96,45,0 warp2 3maze4c3_3maze3b1 1,1,prt_mz03_i,48,104
prt_mz03_i,114,56,0 warp2 3maze4c4_3maze2a1 1,1,prt_mz03_i,8,140
prt_mz03_i,137,74,0 warp2 3maze4d2_3maze1c2 1,1,prt_mz03_i,102,168
prt_mz03_i,175,45,0 warp2 3maze4e1_3maze1a2 1,1,prt_mz03_i,22,191
prt_mz03_i,177,74,0 warp2 3maze4e2_3maze2a3 1,1,prt_mz03_i,23,128
prt_mz03_i,194,54,0 warp2 3maze4e3_3maze3e1 1,1,prt_mz03_i,171,94
prt_mz03_i,23,5,0 warp2 3maze5a1_3maze5c1 1,1,prt_mz03_i,88,13
prt_mz03_i,16,34,0 warp2 3maze5a2_3maze4b1 1,1,prt_mz03_i,52,48
prt_mz03_i,45,21,0 warp2 3maze5b1_3maze2a2 1,1,prt_mz03_i,18,151
prt_mz03_i,54,5,0 warp2 3maze5b2_3maze3b3 1,1,prt_mz03_i,71,97
prt_mz03_i,74,12,0 warp2 3maze5b3_3maze1e1 1,1,prt_mz03_i,175,168
prt_mz03_i,85,13,0 warp2 3maze5c1_3maze5a1 1,1,prt_mz03_i,23,8
prt_mz03_i,99,34,0 warp2 3maze5c2_3maze2c2 1,1,prt_mz03_i,98,151
prt_mz03_i,114,22,0 warp2 3maze5c3_3maze4c2 1,1,prt_mz03_i,104,71
prt_mz03_i,165,22,0 warp2 3maze5e1_3maze2c3 1,1,prt_mz03_i,111,146
prt_mz03_i,176,5,0 warp2 3maze5e2_3maze3c3 1,1,prt_mz03_i,111,95
prt_mz03_i,176,34,0 warp2 3maze5e3_3maze4c1 1,1,prt_mz03_i,88,56
prt_mz03_i,194,15,0 warp2 3maze5e4_3maze4a1 1,1,prt_mz03_i,8,58
prt_mz03_i,58,194,0 script 3maze1b1_Random1 WARPNPC,1,1,{
end;
OnTouch:
switch( rand(1,4) ) {
case 1:
warp "prt_mz03_i",88,146;
end;
case 2:
warp "prt_mz03_i",8,58;
end;
case 3:
warp "prt_mz03_i",137,128;
end;
case 4:
warp "prt_mz03_i",48,21;
end;
}
end;
}
prt_mz03_i,74,74,0 script 3maze4b2_Random2 WARPNPC,1,1,{
end;
OnTouch:
switch( rand(1,4) ) {
case 1:
warp "prt_mz03_i",88,146;
end;
case 2:
warp "prt_mz03_i",8,58;
end;
case 3:
warp "prt_mz03_i",137,128;
end;
case 4:
warp "prt_mz03_i",48,21;
end;
}
end;
}
prt_mz03_i,139,45,0 script 3maze4d1_Random3 WARPNPC,1,1,{
end;
OnTouch:
switch( rand(1,4) ) {
case 1:
warp "prt_mz03_i",88,146;
end;
case 2:
warp "prt_mz03_i",8,58;
end;
case 3:
warp "prt_mz03_i",137,128;
end;
case 4:
warp "prt_mz03_i",48,21;
end;
}
end;
}
prt_mz03_i,154,22,0 script 3maze5d1_Random4 WARPNPC,1,1,{
end;
OnTouch:
switch( rand(1,4) ) {
case 1:
warp "prt_mz03_i",88,146;
end;
case 2:
warp "prt_mz03_i",8,58;
end;
case 3:
warp "prt_mz03_i",137,128;
end;
case 4:
warp "prt_mz03_i",48,21;
end;
}
end;
}

View File

@@ -11529,6 +11529,13 @@ static const struct _battle_data {
#endif
{ "synchronize_damage", &battle_config.synchronize_damage, 0, 0, 1, },
{ "item_stacking", &battle_config.item_stacking, 1, 0, 1, },
#ifdef RENEWAL
{ "hom_delay_reset_vaporize", &battle_config.hom_delay_reset_vaporize, 0, 0, 1, },
{ "hom_delay_reset_warp", &battle_config.hom_delay_reset_warp, 0, 0, 1, },
#else
{ "hom_delay_reset_vaporize", &battle_config.hom_delay_reset_vaporize, 1, 0, 1, },
{ "hom_delay_reset_warp", &battle_config.hom_delay_reset_warp, 1, 0, 1, },
#endif
#include <custom/battle_config_init.inc>
};

View File

@@ -762,6 +762,8 @@ struct Battle_Config
int instance_allow_reconnect;
int synchronize_damage;
int item_stacking;
int hom_delay_reset_vaporize;
int hom_delay_reset_warp;
#include <custom/battle_config_struct.inc>
};

View File

@@ -1926,6 +1926,17 @@ void clif_homskillinfoblock( homun_data& hd ){
}
clif_send( packet, packet->packetLength, &sd->bl, SELF );
if (battle_config.display_status_timers) {
// Clear cooldown display for skills that are no longer blocked
for (auto& it : hd.homunculus.hskill) {
if (it.id == 0)
continue;
if (util::vector_get(hd.blockskill, it.id) == hd.blockskill.end())
clif_skill_cooldown(*sd, it.id, 0);
}
}
#endif
}
@@ -10804,8 +10815,7 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd)
clif_hominfo(sd,sd->hd,1);
clif_hominfo(sd,sd->hd,0); //for some reason, at least older clients want this sent twice
clif_homskillinfoblock( *sd->hd );
if( battle_config.hom_setting&HOMSET_COPY_SPEED )
status_calc_bl(&sd->hd->bl, { SCB_SPEED }); //Homunc mimic their master's speed on each map change
status_calc_bl(&sd->hd->bl, { SCB_SPEED });
if( !(battle_config.hom_setting&HOMSET_NO_INSTANT_LAND_SKILL) )
skill_unit_move(&sd->hd->bl,gettick(),1); // apply land skills immediately
}

View File

@@ -289,10 +289,15 @@ int hom_vaporize(map_session_data *sd, int flag)
//Delete timers when vaporized.
hom_hungry_timer_delete(hd);
hd->homunculus.vaporize = flag ? flag : HOM_ST_REST;
if (battle_config.hom_setting&HOMSET_RESET_REUSESKILL_VAPORIZED) {
if (battle_config.hom_delay_reset_vaporize) {
hd->blockskill.clear();
hd->blockskill.shrink_to_fit();
// End all cooldown display timers
if (battle_config.display_status_timers)
clif_homskillinfoblock(*sd->hd);
}
status_change_clear(&hd->bl, 1);
clif_hominfo(sd, sd->hd, 0);
hom_save(hd);
@@ -1138,8 +1143,7 @@ bool hom_call(map_session_data *sd)
clif_hominfo(sd,hd,1);
clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89]
clif_homskillinfoblock( *hd );
if (battle_config.hom_setting&HOMSET_COPY_SPEED)
status_calc_bl(&hd->bl, { SCB_SPEED });
status_calc_bl(&hd->bl, { SCB_SPEED });
hom_save(hd);
} else
//Warp him to master.

View File

@@ -168,8 +168,6 @@ enum homun_setting : uint8 {
HOMSET_COPY_SPEED = 0x08, /// Copy their master's speed on spawn/map-change
HOMSET_DISPLAY_LUK = 0x10, /// They display luk/3+1 instead of their actual critical in the stat window, by default they don't crit
HOMSET_SAME_MATK = 0x20, /// Their Min-Matk is always the same as their max
HOMSET_RESET_REUSESKILL_VAPORIZED = 0x40, /// Skill re-use delay is reset when they are vaporized.
HOMSET_RESET_REUSESKILL_TELEPORTED = 0x80, /// Skill re-use delay is reset when they are warped (by skill or item) with player.
};
enum e_homun_grade : uint8 {

View File

@@ -7008,6 +7008,20 @@ enum e_setpos pc_setpos(map_session_data* sd, unsigned short mapindex, int x, in
if( hom_is_active(sd->hd) )
{
if (sd->state.changemap)
status_db.removeByStatusFlag(&sd->hd->bl, { SCF_REMOVEFROMHOMONMAPWARP });
else
status_db.removeByStatusFlag(&sd->hd->bl, { SCF_REMOVEFROMHOMONWARP });
if (battle_config.hom_delay_reset_warp) {
sd->hd->blockskill.clear();
sd->hd->blockskill.shrink_to_fit();
// End all cooldown display timers
if (battle_config.display_status_timers)
clif_homskillinfoblock(*sd->hd);
}
sd->hd->bl.m = m;
sd->hd->bl.x = sd->hd->ud.to_x = x;
sd->hd->bl.y = sd->hd->ud.to_y = y;

View File

@@ -11297,6 +11297,8 @@
export_constant(SCF_REMOVEONUNEQUIPARMOR);
export_constant(SCF_REMOVEONHERMODE);
export_constant(SCF_REQUIRENOWEAPON);
export_constant(SCF_REMOVEFROMHOMONWARP);
export_constant(SCF_REMOVEFROMHOMONMAPWARP);
/* enchantgrades */
export_constant(ENCHANTGRADE_NONE);

View File

@@ -1014,8 +1014,10 @@ bool skill_isNotOk_hom(struct homun_data *hd, uint16 skill_id, uint16 skill_lv)
if (sc && !sc->count)
sc = nullptr;
if (util::vector_exists(hd->blockskill, skill_id))
if (util::vector_exists(hd->blockskill, skill_id)) {
clif_skill_fail(*sd, skill_id, USESKILL_FAIL_SKILLINTERVAL);
return true;
}
switch(skill_id) {
case HFLI_SBR44:
@@ -1120,9 +1122,16 @@ bool skill_isNotOk_hom(struct homun_data *hd, uint16 skill_id, uint16 skill_lv)
* @return true: Skill cannot be used, false: otherwise
*/
bool skill_isNotOk_mercenary( uint16 skill_id, s_mercenary_data& md ){
if (util::vector_exists(md.blockskill, skill_id))
map_session_data* sd = md.master;
if (sd == nullptr)
return true;
if (util::vector_exists(md.blockskill, skill_id)) {
clif_skill_fail(*sd, skill_id, USESKILL_FAIL_SKILLINTERVAL);
return true;
}
if( md.master != nullptr ){
return skill_isNotOk( skill_id, *md.master );
}else{
@@ -3580,7 +3589,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
dmg = battle_calc_attack(attack_type,src,bl,skill_id,skill_lv,flag&0xFFF);
//If the damage source is a unit, the damage is not delayed
if (src != dsrc && skill_id != GS_GROUNDDRIFT)
if (src != dsrc)
dmg.amotion = 0;
//! CHECKME: This check maybe breaks the battle_calc_attack, and maybe need better calculation.
@@ -7313,12 +7322,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
//Check for undead skills that convert a no-damage skill into a damage one. [Skotlex]
switch (skill_id) {
case HLIF_HEAL: //[orn]
if (bl->type != BL_HOM) {
if (sd) clif_skill_fail( *sd, skill_id );
break ;
}
[[fallthrough]];
case AL_HEAL:
case ALL_RESURRECTION:
case PR_ASPERSIO:
@@ -7342,8 +7345,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
ret = skill_castend_pos2(src,src->x,src->y,skill_id,skill_lv,tick,flag); //cast on homon
if(s_src && !skill_check_unit_range(s_src, s_src->x, s_src->y, skill_id, skill_lv))
ret |= skill_castend_pos2(s_src,s_src->x,s_src->y,skill_id,skill_lv,tick,flag); //cast on master
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
return ret;
}
break;
@@ -9330,10 +9331,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break;
}
if (sd->hd && battle_config.hom_setting&HOMSET_RESET_REUSESKILL_TELEPORTED) {
sd->hd->blockskill.clear();
sd->hd->blockskill.shrink_to_fit();
}
if( sd->state.autocast || ( (sd->skillitem == AL_TELEPORT || battle_config.skip_teleport_lv1_menu) && skill_lv == 1 ) || skill_lv == 3 )
{
@@ -10675,11 +10672,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
break;
case HAMI_CASTLE: //[orn]
if (src != bl && rnd()%100 < 20 * skill_lv) {
if (src != bl && rnd_chance(20 * skill_lv, 100)) {
int x = src->x, y = src->y;
if (hd)
skill_blockhomun_start(hd,skill_id,skill_get_time2(skill_id,skill_lv));
// Move source
if (unit_movepos(src,bl->x,bl->y,0,0)) {
clif_skill_nodamage(src,src,skill_id,skill_lv,1); // Homunc
@@ -10717,17 +10712,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
status_heal(bl, i, 0, 0);
}
break;
//Homun single-target support skills [orn]
// Homun single-target support skills [orn]
case HLIF_CHANGE:
#ifndef RENEWAL
status_percent_heal(bl, 100, 100);
[[fallthrough]];
#endif
case HAMI_BLOODLUST:
case HFLI_FLEET:
case HFLI_SPEED:
case HLIF_CHANGE:
case MH_ANGRIFFS_MODUS:
case MH_GOLDENE_FERSE:
clif_skill_nodamage(src,bl,skill_id,skill_lv,
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_time2(skill_id,skill_lv));
break;
case NPC_DRAGONFEAR:
@@ -12356,15 +12353,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
for (i = 0; i < ARRAYLENGTH(scs); i++)
if (tsc->getSCE(scs[i])) status_change_end(bl, scs[i]);
}
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
}
break;
case MH_OVERED_BOOST:
if (hd && battle_get_master(src)) {
sc_start(src, battle_get_master(src), type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
}
break;
case MH_GRANITIC_ARMOR:
@@ -12373,7 +12367,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
struct block_list *s_bl = battle_get_master(src);
if(s_bl) sc_start2(src, s_bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); //start on master
sc_start2(src, bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv));
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
}
break;
case MH_LIGHT_OF_REGENE: //self
@@ -12381,7 +12374,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
struct block_list *s_bl = battle_get_master(src);
if(s_bl) sc_start(src, s_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
sc_start2(src, src, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv));
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
}
break;
case MH_STYLE_CHANGE:
@@ -12407,21 +12399,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
clif_skill_nodamage(src,master_bl,skill_id,skill_lv,1);
sc_start(src, master_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
}
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
} break;
case MH_PAIN_KILLER:
bl = battle_get_master(src);
if (bl != nullptr)
sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
break;
case MH_MAGMA_FLOW:
sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv));
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
break;
case MH_SUMMON_LEGION: {
int summons[5] = {MOBID_S_HORNET, MOBID_S_GIANT_HORNET, MOBID_S_GIANT_HORNET, MOBID_S_LUCIOLA_VESPA, MOBID_S_LUCIOLA_VESPA};
@@ -12448,8 +12433,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
sc_start4(&sum_md->bl,&sum_md->bl, SC_MODECHANGE, 100, 1, 0, MD_CANATTACK|MD_AGGRESSIVE, 0, 60000);
}
}
if (hd)
skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
}
break;
@@ -13398,10 +13381,25 @@ TIMER_FUNC(skill_castend_id){
if (!sd || sd->skillitem != ud->skill_id || skill_get_delay(ud->skill_id, ud->skill_lv))
ud->canact_tick = i64max(tick + skill_delayfix(src, ud->skill_id, ud->skill_lv), ud->canact_tick - SECURITY_CASTTIME);
if (sd) { //Cooldown application
int cooldown = pc_get_skillcooldown(sd,ud->skill_id, ud->skill_lv); // Increases/Decreases cooldown of a skill by item/card bonuses.
if(cooldown) skill_blockpc_start(sd, ud->skill_id, cooldown);
// Cooldown application
switch (src->type) {
case BL_PC:{
// Increases/Decreases cooldown of a skill by item/card bonuses.
int cooldown = pc_get_skillcooldown(sd, ud->skill_id, ud->skill_lv);
if (cooldown > 0)
skill_blockpc_start(sd, ud->skill_id, cooldown);
} break;
case BL_HOM:{
homun_data& hd = reinterpret_cast<homun_data&>(*src);
#ifdef RENEWAL
skill_blockhomun_start(&hd, ud->skill_id, skill_get_cooldown(ud->skill_id, ud->skill_lv));
#else
skill_blockhomun_start(&hd, ud->skill_id, skill_get_delay(ud->skill_id, ud->skill_lv));
#endif
} break;
}
if( battle_config.display_status_timers && sd )
clif_status_change(src, EFST_POSTDELAY, 1, skill_delayfix(src, ud->skill_id, ud->skill_lv), 0, 0, 0);
if( sd )
@@ -23041,13 +23039,17 @@ int skill_blockpc_clear(map_session_data *sd) {
}
TIMER_FUNC(skill_blockhomun_end){
struct homun_data *hd = (TBL_HOM*) map_id2bl(id);
homun_data *hd = reinterpret_cast<homun_data *>(map_id2bl(id));
if (hd) {
auto skill = util::vector_get(hd->blockskill, (uint16)data);
auto skill = util::vector_get(hd->blockskill, static_cast<uint16>(data));
if (skill != hd->blockskill.end())
hd->blockskill.erase(skill);
// Make sure the cooldown display is removed
if (battle_config.display_status_timers)
clif_homskillinfoblock(*hd);
}
return 1;
@@ -23069,6 +23071,12 @@ int skill_blockhomun_start(struct homun_data *hd, uint16 skill_id, int tick) //[
hd->blockskill.push_back(skill_id);
if (battle_config.display_status_timers) {
// Reset the skill cooldown display first
clif_homskillinfoblock(*hd);
clif_skill_cooldown(*hd->master, skill_id, tick);
}
return add_timer(gettick() + tick, skill_blockhomun_end, hd->bl.id, skill_id);
}
@@ -23101,6 +23109,9 @@ int skill_blockmerc_start(s_mercenary_data *md, uint16 skill_id, int tick)
md->blockskill.push_back(skill_id);
if (battle_config.display_status_timers)
clif_skill_cooldown(*md->master, skill_id, tick);
return add_timer(gettick() + tick, skill_blockmerc_end, md->bl.id, skill_id);
}
/**

View File

@@ -5593,12 +5593,12 @@ void status_calc_state( struct block_list *bl, status_change *sc, std::bitset<SC
* @param bl: Object whose status has changed [PC|MOB|HOM|MER|ELEM]
* @param flag: Which status has changed on bl
*/
void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
void status_calc_bl_main(struct block_list& bl, std::bitset<SCB_MAX> flag)
{
const struct status_data *b_status = status_get_base_status(bl); // Base Status
struct status_data *status = status_get_status_data(bl); // Battle Status
status_change *sc = status_get_sc(bl);
TBL_PC *sd = BL_CAST(BL_PC,bl);
const struct status_data *b_status = status_get_base_status(&bl); // Base Status
struct status_data *status = status_get_status_data(&bl); // Battle Status
status_change *sc = status_get_sc(&bl);
TBL_PC *sd = BL_CAST(BL_PC,&bl);
int temp;
if (!b_status || !status)
@@ -5609,7 +5609,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
* we need to update the speed on the client when the last status change ends.
**/
if(flag[SCB_SPEED]) {
struct unit_data *ud = unit_bl2ud(bl);
struct unit_data *ud = unit_bl2ud(&bl);
/** [Skotlex]
* Re-walk to adjust speed (we do not check if walktimer != INVALID_TIMER
* because if you step on something while walking, the moment this
@@ -5620,60 +5620,60 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
}
if(flag[SCB_STR]) {
status->str = status_calc_str(bl, sc, b_status->str);
status->str = status_calc_str(&bl, sc, b_status->str);
flag.set(SCB_BATK);
if( bl->type&BL_HOM )
if( bl.type == BL_HOM )
flag.set(SCB_WATK);
}
if(flag[SCB_AGI]) {
status->agi = status_calc_agi(bl, sc, b_status->agi);
status->agi = status_calc_agi(&bl, sc, b_status->agi);
flag.set(SCB_FLEE);
#ifdef RENEWAL
flag.set(SCB_DEF2);
#endif
if( bl->type&(BL_PC|BL_HOM) ) {
if( bl.type&(BL_PC|BL_HOM) ) {
flag.set(SCB_ASPD);
flag.set(SCB_DSPD);
}
}
if(flag[SCB_VIT]) {
status->vit = status_calc_vit(bl, sc, b_status->vit);
status->vit = status_calc_vit(&bl, sc, b_status->vit);
flag.set(SCB_DEF2);
flag.set(SCB_MDEF2);
if( bl->type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) )
if( bl.type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) )
flag.set(SCB_MAXHP);
if( bl->type&BL_HOM )
if( bl.type == BL_HOM )
flag.set(SCB_DEF);
}
if(flag[SCB_INT]) {
status->int_ = status_calc_int(bl, sc, b_status->int_);
status->int_ = status_calc_int(&bl, sc, b_status->int_);
flag.set(SCB_MATK);
flag.set(SCB_MDEF2);
if( bl->type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) )
if( bl.type&(BL_PC|BL_HOM|BL_MER|BL_ELEM) )
flag.set(SCB_MAXSP);
if( bl->type&BL_HOM )
if( bl.type == BL_HOM )
flag.set(SCB_MDEF);
}
if(flag[SCB_DEX]) {
status->dex = status_calc_dex(bl, sc, b_status->dex);
status->dex = status_calc_dex(&bl, sc, b_status->dex);
flag.set(SCB_BATK);
flag.set(SCB_HIT);
#ifdef RENEWAL
flag.set(SCB_MATK);
flag.set(SCB_MDEF2);
#endif
if( bl->type&(BL_PC|BL_HOM) )
if( bl.type&(BL_PC|BL_HOM) )
flag.set(SCB_ASPD);
if( bl->type&BL_HOM )
if( bl.type == BL_HOM )
flag.set(SCB_WATK);
}
if(flag[SCB_LUK]) {
status->luk = status_calc_luk(bl, sc, b_status->luk);
status->luk = status_calc_luk(&bl, sc, b_status->luk);
flag.set(SCB_BATK);
flag.set(SCB_CRI);
flag.set(SCB_FLEE2);
@@ -5686,29 +5686,29 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
#ifdef RENEWAL
if (flag[SCB_POW]) {
status->pow = status_calc_pow(bl, sc, b_status->pow);
status->pow = status_calc_pow(&bl, sc, b_status->pow);
flag.set(SCB_BATK);
flag.set(SCB_PATK);
}
if (flag[SCB_STA]) {
status->sta = status_calc_sta(bl, sc, b_status->sta);
status->sta = status_calc_sta(&bl, sc, b_status->sta);
flag.set(SCB_RES);
}
if (flag[SCB_WIS]) {
status->wis = status_calc_wis(bl, sc, b_status->wis);
status->wis = status_calc_wis(&bl, sc, b_status->wis);
flag.set(SCB_MRES);
}
if (flag[SCB_SPL]) {
status->spl = status_calc_spl(bl, sc, b_status->spl);
status->spl = status_calc_spl(&bl, sc, b_status->spl);
flag.set(SCB_MATK);
flag.set(SCB_SMATK);
}
if (flag[SCB_CON]) {
status->con = status_calc_con(bl, sc, b_status->con);
status->con = status_calc_con(&bl, sc, b_status->con);
flag.set(SCB_HIT);
flag.set(SCB_FLEE);
flag.set(SCB_PATK);
@@ -5716,47 +5716,47 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
}
if (flag[SCB_CRT]) {
status->crt = status_calc_crt(bl, sc, b_status->crt);
status->crt = status_calc_crt(&bl, sc, b_status->crt);
flag.set(SCB_HPLUS);
flag.set(SCB_CRATE);
}
#endif
if(flag[SCB_BATK] && b_status->batk) {
int lv = status_get_lv(bl);
status->batk = status_base_atk(bl, status, lv);
temp = b_status->batk - status_base_atk(bl, b_status, lv);
int lv = status_get_lv(&bl);
status->batk = status_base_atk(&bl, status, lv);
temp = b_status->batk - status_base_atk(&bl, b_status, lv);
if (temp) {
temp += status->batk;
status->batk = cap_value(temp, 0, USHRT_MAX);
}
status->batk = status_calc_batk(bl, sc, status->batk);
status->batk = status_calc_batk(&bl, sc, status->batk);
}
if(flag[SCB_WATK]) {
#ifndef RENEWAL
status->rhw.atk = status_calc_watk(bl, sc, b_status->rhw.atk);
status->rhw.atk = status_calc_watk(&bl, sc, b_status->rhw.atk);
if (!sd) // Should not affect weapon refine bonus
status->rhw.atk2 = status_calc_watk(bl, sc, b_status->rhw.atk2);
status->rhw.atk2 = status_calc_watk(&bl, sc, b_status->rhw.atk2);
if (sd && sd->bonus.weapon_atk_rate)
status->rhw.atk += status->rhw.atk * sd->bonus.weapon_atk_rate / 100;
if(b_status->lhw.atk) {
if (sd) {
sd->state.lr_flag = 1;
status->lhw.atk = status_calc_watk(bl, sc, b_status->lhw.atk);
status->lhw.atk = status_calc_watk(&bl, sc, b_status->lhw.atk);
sd->state.lr_flag = 0;
} else {
status->lhw.atk = status_calc_watk(bl, sc, b_status->lhw.atk);
status->lhw.atk2= status_calc_watk(bl, sc, b_status->lhw.atk2);
status->lhw.atk = status_calc_watk(&bl, sc, b_status->lhw.atk);
status->lhw.atk2= status_calc_watk(&bl, sc, b_status->lhw.atk2);
}
}
#else
if(!b_status->watk) { // We only have left-hand weapon
status->watk = 0;
status->watk2 = status_calc_watk(bl, sc, b_status->watk2);
status->watk2 = status_calc_watk(&bl, sc, b_status->watk2);
}
else status->watk = status_calc_watk(bl, sc, b_status->watk);
else status->watk = status_calc_watk(&bl, sc, b_status->watk);
#endif
}
@@ -5766,9 +5766,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
&& status->luk == b_status->luk && status->con == b_status->con
#endif
)
status->hit = status_calc_hit(bl, sc, b_status->hit);
status->hit = status_calc_hit(&bl, sc, b_status->hit);
else
status->hit = status_calc_hit(bl, sc, b_status->hit + (status->dex - b_status->dex)
status->hit = status_calc_hit(&bl, sc, b_status->hit + (status->dex - b_status->dex)
#ifdef RENEWAL
+ (status->luk/3 - b_status->luk/3) + 2 * (status->con - b_status->con)
#endif
@@ -5781,9 +5781,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
&& status->luk == b_status->luk && status->con == b_status->con
#endif
)
status->flee = status_calc_flee(bl, sc, b_status->flee);
status->flee = status_calc_flee(&bl, sc, b_status->flee);
else
status->flee = status_calc_flee(bl, sc, b_status->flee +(status->agi - b_status->agi)
status->flee = status_calc_flee(&bl, sc, b_status->flee +(status->agi - b_status->agi)
#ifdef RENEWAL
+ (status->luk/5 - b_status->luk/5) + 2 * (status->con - b_status->con)
#endif
@@ -5791,9 +5791,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
}
if(flag[SCB_DEF]) {
status->def = status_calc_def(bl, sc, b_status->def);
status->def = status_calc_def(&bl, sc, b_status->def);
if( bl->type&BL_HOM )
if( bl.type == BL_HOM )
status->def += (status->vit/5 - b_status->vit/5);
}
@@ -5803,9 +5803,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
&& status->agi == b_status->agi
#endif
)
status->def2 = status_calc_def2(bl, sc, b_status->def2);
status->def2 = status_calc_def2(&bl, sc, b_status->def2);
else
status->def2 = status_calc_def2(bl, sc, b_status->def2
status->def2 = status_calc_def2(&bl, sc, b_status->def2
#ifdef RENEWAL
+ (int)( ((float)status->vit/2 - (float)b_status->vit/2) + ((float)status->agi/5 - (float)b_status->agi/5) )
#else
@@ -5815,9 +5815,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
}
if(flag[SCB_MDEF]) {
status->mdef = status_calc_mdef(bl, sc, b_status->mdef);
status->mdef = status_calc_mdef(&bl, sc, b_status->mdef);
if( bl->type&BL_HOM )
if( bl.type == BL_HOM )
status->mdef += (status->int_/5 - b_status->int_/5);
}
@@ -5827,9 +5827,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
&& status->dex == b_status->dex
#endif
)
status->mdef2 = status_calc_mdef2(bl, sc, b_status->mdef2);
status->mdef2 = status_calc_mdef2(&bl, sc, b_status->mdef2);
else
status->mdef2 = status_calc_mdef2(bl, sc, b_status->mdef2 +(status->int_ - b_status->int_)
status->mdef2 = status_calc_mdef2(&bl, sc, b_status->mdef2 +(status->int_ - b_status->int_)
#ifdef RENEWAL
+ (int)( ((float)status->dex/5 - (float)b_status->dex/5) + ((float)status->vit/5 - (float)b_status->vit/5) )
#else
@@ -5839,29 +5839,67 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
}
if(flag[SCB_SPEED]) {
status->speed = status_calc_speed(bl, sc, b_status->speed);
status->speed = status_calc_speed(&bl, sc, b_status->speed);
if( bl->type&BL_PC && !(sd && sd->state.permanent_speed) && status->speed < battle_config.max_walk_speed )
status->speed = battle_config.max_walk_speed;
switch (bl.type) {
case BL_PC:
if (!sd->state.permanent_speed && status->speed < battle_config.max_walk_speed)
status->speed = battle_config.max_walk_speed;
#ifdef RENEWAL
// Recalculate homunculus speed if the player receives a speed buff/debuff
if (hom_is_active(sd->hd)) {
if (battle_config.hom_setting & HOMSET_COPY_SPEED)
sd->hd->battle_status.speed = status_get_speed(&sd->bl);
if( bl->type&BL_PET && ((TBL_PET*)bl)->master)
status->speed = status_get_speed(&((TBL_PET*)bl)->master->bl);
if( bl->type&BL_HOM && battle_config.hom_setting&HOMSET_COPY_SPEED && ((TBL_HOM*)bl)->master)
status->speed = status_get_speed(&((TBL_HOM*)bl)->master->bl);
if( bl->type&BL_MER && ((TBL_MER*)bl)->master)
status->speed = status_get_speed(&((TBL_MER*)bl)->master->bl);
if( bl->type&BL_ELEM && ((TBL_ELEM*)bl)->master)
status->speed = status_get_speed(&((TBL_ELEM*)bl)->master->bl);
// Homunculus speed buff/debuffs applies over the current speed
sd->hd->battle_status.speed = status_calc_speed(&sd->hd->bl, &sd->hd->sc, sd->hd->battle_status.speed);
}
#endif
break;
case BL_PET:{
pet_data* pd = reinterpret_cast<pet_data*>(&bl);
if (pd->master != nullptr)
status->speed = status_get_speed(&pd->master->bl);
} break;
case BL_HOM:{
homun_data* hd = reinterpret_cast<homun_data*>(&bl);
if (hd->master != nullptr) {
if (battle_config.hom_setting & HOMSET_COPY_SPEED)
status->speed = status_get_speed(&hd->master->bl);
// Homunculus speed buff/debuffs applies over the current speed
status->speed = status_calc_speed(&bl, &hd->sc, status->speed);
}
} break;
case BL_MER:{
s_mercenary_data* mc = reinterpret_cast<s_mercenary_data*>(&bl);
if (mc->master != nullptr)
status->speed = status_get_speed(&mc->master->bl);
} break;
case BL_ELEM:{
s_elemental_data* ed = reinterpret_cast<s_elemental_data*>(&bl);
if (ed->master != nullptr)
status->speed = status_get_speed(&ed->master->bl);
} break;
}
}
if(flag[SCB_CRI] && b_status->cri) {
if (status->luk == b_status->luk)
status->cri = status_calc_critical(bl, sc, b_status->cri);
status->cri = status_calc_critical(&bl, sc, b_status->cri);
else
#ifdef RENEWAL
status->cri = status_calc_critical(bl, sc, b_status->cri + 3*(status->luk - b_status->luk));
status->cri = status_calc_critical(&bl, sc, b_status->cri + 3*(status->luk - b_status->luk));
#else
status->cri = status_calc_critical(bl, sc, b_status->cri + (status->luk - b_status->luk)*10/3);
status->cri = status_calc_critical(&bl, sc, b_status->cri + (status->luk - b_status->luk)*10/3);
#endif
/// After status_calc_critical so the bonus is applied despite if you have or not a sc bugreport:5240
@@ -5873,25 +5911,25 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
if(flag[SCB_FLEE2] && b_status->flee2) {
if (status->luk == b_status->luk)
status->flee2 = status_calc_flee2(bl, sc, b_status->flee2);
status->flee2 = status_calc_flee2(&bl, sc, b_status->flee2);
else
status->flee2 = status_calc_flee2(bl, sc, b_status->flee2 +(status->luk - b_status->luk));
status->flee2 = status_calc_flee2(&bl, sc, b_status->flee2 +(status->luk - b_status->luk));
}
if(flag[SCB_ATK_ELE]) {
status->rhw.ele = status_calc_attack_element(bl, sc, b_status->rhw.ele);
status->rhw.ele = status_calc_attack_element(&bl, sc, b_status->rhw.ele);
if (sd) sd->state.lr_flag = 1;
status->lhw.ele = status_calc_attack_element(bl, sc, b_status->lhw.ele);
status->lhw.ele = status_calc_attack_element(&bl, sc, b_status->lhw.ele);
if (sd) sd->state.lr_flag = 0;
}
if(flag[SCB_DEF_ELE]) {
status->def_ele = status_calc_element(bl, sc, b_status->def_ele);
status->ele_lv = status_calc_element_lv(bl, sc, b_status->ele_lv);
status->def_ele = status_calc_element(&bl, sc, b_status->def_ele);
status->ele_lv = status_calc_element_lv(&bl, sc, b_status->ele_lv);
}
if(flag[SCB_MODE]) {
status->mode = status_calc_mode(bl, sc, b_status->mode);
status->mode = status_calc_mode(&bl, sc, b_status->mode);
if (status_has_mode(status, MD_STATUSIMMUNE|MD_SKILLIMMUNE))
status->class_ = CLASS_BATTLEFIELD;
@@ -5904,9 +5942,9 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
// Since mode changed, reset their state.
if (!status_has_mode(status,MD_CANATTACK))
unit_stop_attack(bl);
unit_stop_attack(&bl);
if (!status_has_mode(status,MD_CANMOVE))
unit_stop_walking(bl,1);
unit_stop_walking(&bl,1);
}
/**
@@ -5917,7 +5955,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
**/
if(flag[SCB_MAXHP]) {
if( bl->type&BL_PC ) {
if( bl.type == BL_PC ) {
status->max_hp = status_calc_maxhpsp_pc(sd,status->vit,true);
if(battle_config.hp_rate != 100)
@@ -5931,7 +5969,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
status->max_hp = umin(status->max_hp,(unsigned int)battle_config.max_hp);
}
else
status->max_hp = status_calc_maxhp(bl, b_status->max_hp);
status->max_hp = status_calc_maxhp(&bl, b_status->max_hp);
if( status->hp > status->max_hp ) { // !FIXME: Should perhaps a status_zap should be issued?
status->hp = status->max_hp;
@@ -5940,7 +5978,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
}
if(flag[SCB_MAXSP]) {
if( bl->type&BL_PC ) {
if( bl.type == BL_PC ) {
status->max_sp = status_calc_maxhpsp_pc(sd,status->int_,false);
if(battle_config.sp_rate != 100)
@@ -5949,7 +5987,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
status->max_sp = umin(status->max_sp,(unsigned int)battle_config.max_sp);
}
else
status->max_sp = status_calc_maxsp(bl, b_status->max_sp);
status->max_sp = status_calc_maxsp(&bl, b_status->max_sp);
if( status->sp > status->max_sp ) {
status->sp = status->max_sp;
@@ -5966,11 +6004,11 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
* RE MATK Formula (from irowiki:http:// irowiki.org/wiki/MATK)
* MATK = (sMATK + wMATK + eMATK) * Multiplicative Modifiers
**/
int lv = status_get_lv(bl);
status->matk_min = status_base_matk_min(bl, status, lv);
status->matk_max = status_base_matk_max(bl, status, lv);
int lv = status_get_lv(&bl);
status->matk_min = status_base_matk_min(&bl, status, lv);
status->matk_max = status_base_matk_max(&bl, status, lv);
switch( bl->type ) {
switch( bl.type ) {
case BL_PC: {
int wMatk = 0;
int variance = 0;
@@ -5987,7 +6025,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
status->matk_min += 15 * skill_lv + (skill_lv > 4 ? 25 : 0);
}
status->matk_min = status_calc_ematk(bl, sc, status->matk_min);
status->matk_min = status_calc_ematk(&bl, sc, status->matk_min);
status->matk_max = status->matk_min;
// This is the only portion in MATK that varies depending on the weapon level and refinement rate.
@@ -6022,12 +6060,12 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
}
#endif
if (bl->type&BL_PC && sd->matk_rate != 100) {
if (bl.type == BL_PC && sd->matk_rate != 100) {
status->matk_max = status->matk_max * sd->matk_rate/100;
status->matk_min = status->matk_min * sd->matk_rate/100;
}
if ((bl->type&BL_HOM && battle_config.hom_setting&HOMSET_SAME_MATK) /// Hom Min Matk is always the same as Max Matk
if ((bl.type == BL_HOM && battle_config.hom_setting&HOMSET_SAME_MATK) /// Hom Min Matk is always the same as Max Matk
|| (sc && sc->getSCE(SC_RECOGNIZEDSPELL)))
status->matk_min = status->matk_max;
@@ -6038,35 +6076,35 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
}
#endif
status->matk_max = status_calc_matk(bl, sc, status->matk_max);
status->matk_min = status_calc_matk(bl, sc, status->matk_min);
status->matk_max = status_calc_matk(&bl, sc, status->matk_max);
status->matk_min = status_calc_matk(&bl, sc, status->matk_min);
}
if(flag[SCB_ASPD]) {
int amotion;
if ( bl->type&BL_HOM ) {
if ( bl.type == BL_HOM ) {
#ifdef RENEWAL_ASPD
amotion = ((TBL_HOM*)bl)->homunculusDB->baseASPD;
amotion = amotion - amotion * status_get_homdex(bl) / 1000 - status_get_homagi(bl) * amotion / 250;
amotion = (amotion * status_calc_aspd(bl, sc, true) + status_calc_aspd(bl, sc, false)) / - 100 + amotion;
amotion = (reinterpret_cast<homun_data*>(&bl))->homunculusDB->baseASPD;
amotion = amotion - amotion * status_get_homdex(&bl) / 1000 - status_get_homagi(&bl) * amotion / 250;
amotion = (amotion * status_calc_aspd(&bl, sc, true) + status_calc_aspd(&bl, sc, false)) / - 100 + amotion;
#else
amotion = (1000 - 4 * status->agi - status->dex) * ((TBL_HOM*)bl)->homunculusDB->baseASPD / 1000;
amotion = (1000 - 4 * status->agi - status->dex) * (reinterpret_cast<homun_data*>(&bl))->homunculusDB->baseASPD / 1000;
amotion = status_calc_aspd_rate(bl, sc, amotion);
amotion = status_calc_aspd_rate(&bl, sc, amotion);
amotion = amotion * status->aspd_rate / 1000;
#endif
amotion = status_calc_fix_aspd(bl, sc, amotion);
amotion = status_calc_fix_aspd(&bl, sc, amotion);
status->amotion = cap_value(amotion, battle_config.max_aspd, 2000);
status->adelay = status->amotion;
} else if ( bl->type&BL_PC ) {
} else if ( bl.type == BL_PC ) {
uint16 skill_lv;
amotion = status_base_amotion_pc(sd,status);
#ifndef RENEWAL_ASPD
status->aspd_rate = status_calc_aspd_rate(bl, sc, b_status->aspd_rate);
status->aspd_rate = status_calc_aspd_rate(&bl, sc, b_status->aspd_rate);
#endif
// Absolute ASPD % modifiers
amotion = amotion * status->aspd_rate / 1000;
@@ -6079,21 +6117,21 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
#ifdef RENEWAL_ASPD
// RE ASPD % modifier
amotion += (max(0xc3 - amotion, 2) * (status->aspd_rate2 + status_calc_aspd(bl, sc, false))) / 100;
amotion += (max(0xc3 - amotion, 2) * (status->aspd_rate2 + status_calc_aspd(&bl, sc, false))) / 100;
amotion = 10 * (200 - amotion);
amotion += sd->bonus.aspd_add;
#endif
amotion = status_calc_fix_aspd(bl, sc, amotion);
amotion = status_calc_fix_aspd(&bl, sc, amotion);
status->amotion = cap_value(amotion,pc_maxaspd(sd),2000);
status->adelay = 2 * status->amotion;
} else { // Mercenary and mobs
amotion = b_status->amotion;
status->aspd_rate = status_calc_aspd_rate(bl, sc, b_status->aspd_rate);
status->aspd_rate = status_calc_aspd_rate(&bl, sc, b_status->aspd_rate);
amotion = amotion*status->aspd_rate/1000;
amotion = status_calc_fix_aspd(bl, sc, amotion);
amotion = status_calc_fix_aspd(&bl, sc, amotion);
status->amotion = cap_value(amotion, battle_config.monster_max_aspd, 2000);
temp = b_status->adelay*status->aspd_rate/1000;
@@ -6103,71 +6141,71 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
if(flag[SCB_DSPD]) {
int dmotion;
if( bl->type&BL_PC ) {
if( bl.type == BL_PC ) {
if (b_status->agi == status->agi)
status->dmotion = status_calc_dmotion(bl, sc, b_status->dmotion);
status->dmotion = status_calc_dmotion(&bl, sc, b_status->dmotion);
else {
dmotion = 800-status->agi*4;
status->dmotion = cap_value(dmotion, 400, 800);
if(battle_config.pc_damage_delay_rate != 100)
status->dmotion = status->dmotion*battle_config.pc_damage_delay_rate/100;
// It's safe to ignore b_status->dmotion since no bonus affects it.
status->dmotion = status_calc_dmotion(bl, sc, status->dmotion);
status->dmotion = status_calc_dmotion(&bl, sc, status->dmotion);
}
} else if( bl->type&BL_HOM ) {
} else if( bl.type == BL_HOM ) {
dmotion = 800-status->agi*4;
status->dmotion = cap_value(dmotion, 400, 800);
status->dmotion = status_calc_dmotion(bl, sc, b_status->dmotion);
status->dmotion = status_calc_dmotion(&bl, sc, b_status->dmotion);
} else { // Mercenary and mobs
status->dmotion = status_calc_dmotion(bl, sc, b_status->dmotion);
status->dmotion = status_calc_dmotion(&bl, sc, b_status->dmotion);
}
}
#ifdef RENEWAL
if (flag[SCB_PATK]) {
if (status->pow == b_status->pow && status->con == b_status->con)
status->patk = status_calc_patk(bl, sc, b_status->patk);
status->patk = status_calc_patk(&bl, sc, b_status->patk);
else
status->patk = status_calc_patk(bl, sc, b_status->patk + (status->pow - b_status->pow) / 3 + (status->con - b_status->con) / 5);
status->patk = status_calc_patk(&bl, sc, b_status->patk + (status->pow - b_status->pow) / 3 + (status->con - b_status->con) / 5);
}
if (flag[SCB_SMATK]) {
if (status->spl == b_status->spl && status->con == b_status->con)
status->smatk = status_calc_smatk(bl, sc, b_status->smatk);
status->smatk = status_calc_smatk(&bl, sc, b_status->smatk);
else
status->smatk = status_calc_smatk(bl, sc, b_status->smatk) + (status->spl - b_status->spl) / 3 + (status->con - b_status->con) / 5;
status->smatk = status_calc_smatk(&bl, sc, b_status->smatk) + (status->spl - b_status->spl) / 3 + (status->con - b_status->con) / 5;
}
if (flag[SCB_RES]) {
if (status->sta == b_status->sta)
status->res = status_calc_res(bl, sc, b_status->res);
status->res = status_calc_res(&bl, sc, b_status->res);
else
status->res = status_calc_res(bl, sc, b_status->res + (status->sta - b_status->sta) + (status->sta - b_status->sta) / 3 * 5);
status->res = status_calc_res(&bl, sc, b_status->res + (status->sta - b_status->sta) + (status->sta - b_status->sta) / 3 * 5);
}
if (flag[SCB_MRES]) {
if (status->wis == b_status->wis)
status->mres = status_calc_mres(bl, sc, b_status->mres);
status->mres = status_calc_mres(&bl, sc, b_status->mres);
else
status->mres = status_calc_mres(bl, sc, b_status->mres + (status->wis - b_status->wis) + (status->wis - b_status->wis) / 3 * 5);
status->mres = status_calc_mres(&bl, sc, b_status->mres + (status->wis - b_status->wis) + (status->wis - b_status->wis) / 3 * 5);
}
if (flag[SCB_HPLUS]) {
if (status->crt == b_status->crt)
status->hplus = status_calc_hplus(bl, sc, b_status->hplus);
status->hplus = status_calc_hplus(&bl, sc, b_status->hplus);
else
status->hplus = status_calc_hplus(bl, sc, b_status->hplus + (status->crt - b_status->crt));
status->hplus = status_calc_hplus(&bl, sc, b_status->hplus + (status->crt - b_status->crt));
}
if (flag[SCB_CRATE]) {
if (status->crt == b_status->crt)
status->crate = status_calc_crate(bl, sc, b_status->crate);
status->crate = status_calc_crate(&bl, sc, b_status->crate);
else
status->crate = status_calc_crate(bl, sc, b_status->crate + (status->crt - b_status->crt) / 3);
status->crate = status_calc_crate(&bl, sc, b_status->crate + (status->crt - b_status->crt) / 3);
}
if (flag[SCB_MAXAP]) {
if (bl->type&BL_PC) {
if (bl.type == BL_PC) {
status->max_ap = status_calc_maxap_pc(sd);
if (battle_config.ap_rate != 100)
@@ -6175,7 +6213,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
status->max_ap = umin(status->max_ap, (unsigned int)battle_config.max_ap);
} else
status->max_ap = status_calc_maxap(bl, b_status->max_ap);
status->max_ap = status_calc_maxap(&bl, b_status->max_ap);
if (status->ap > status->max_ap) {
status->ap = status->max_ap;
@@ -6184,11 +6222,11 @@ void status_calc_bl_main(struct block_list *bl, std::bitset<SCB_MAX> flag)
}
#endif
if((flag[SCB_VIT] || flag[SCB_MAXHP] || flag[SCB_INT] || flag[SCB_MAXSP]) && bl->type &BL_REGEN)
status_calc_regen(bl, status, status_get_regen_data(bl));
if((flag[SCB_VIT] || flag[SCB_MAXHP] || flag[SCB_INT] || flag[SCB_MAXSP]) && bl.type & BL_REGEN)
status_calc_regen(&bl, status, status_get_regen_data(&bl));
if(flag[SCB_REGEN] && bl->type&BL_REGEN)
status_calc_regen_rate(bl, status_get_regen_data(bl), sc);
if(flag[SCB_REGEN] && bl.type & BL_REGEN)
status_calc_regen_rate(&bl, status_get_regen_data(&bl), sc);
}
/**
@@ -6239,7 +6277,7 @@ void status_calc_bl_(struct block_list* bl, std::bitset<SCB_MAX> flag, uint8 opt
if (opt&SCO_FIRST && bl->type == BL_MOB)
return; // Assume there will be no statuses active
status_calc_bl_main(bl, flag);
status_calc_bl_main(*bl, flag);
if (opt&SCO_FIRST && bl->type == BL_HOM)
return; // Client update handled by caller
@@ -8066,7 +8104,7 @@ static unsigned short status_calc_speed(struct block_list *bl, status_change *sc
if( sc->getSCE(SC_RUN) )
val = max( val, 55 );
if( sc->getSCE(SC_AVOID) )
val = max( val, 10 * sc->getSCE(SC_AVOID)->val1 );
val = max( val, sc->getSCE(SC_AVOID)->val2 );
if (sc->getSCE(SC_INVINCIBLE))
val = max(val, sc->getSCE(SC_INVINCIBLE)->val3);
if( sc->getSCE(SC_CLOAKINGEXCEED) )
@@ -11444,7 +11482,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
// val4 signals autoprovoke.
break;
case SC_AVOID:
// val2 = 10*val1; // Speed change rate.
// Speed change rate.
if (bl->type == BL_HOM)
val2 = 40 * val1;
else
val2 = 10 * val1;
break;
case SC_DEFENCE:
#ifdef RENEWAL

View File

@@ -3058,6 +3058,8 @@ enum e_status_change_flag : uint16 {
SCF_REMOVEONUNEQUIPARMOR,
SCF_REMOVEONHERMODE,
SCF_REQUIRENOWEAPON,
SCF_REMOVEFROMHOMONWARP,
SCF_REMOVEFROMHOMONMAPWARP,
SCF_MAX
};