Compare commits

..

74 Commits

Author SHA1 Message Date
Playtester
d6d850ba6e
Third Job Stats Level 61-70 (#8669)
- Combined trans and non-trans 3rd jobs in job_stats.yml as they have the exact same values
- Added job bonus stats for level 61-70 for 3rd jobs
- Added job bonus stats for level 51-70 for various extended classes
2024-09-22 10:05:14 +02:00
Playtester
63baa62f70
Finger Offensive Renewal Damage (#8668)
- Fixed damage of Finger Offensive being 5 times too high
- Added job stat bonus for Sura job level 61
- Fixes #8667
2024-09-21 18:15:38 +02:00
AoShinHo
8bd89b7fc0
Added Footprint related items (#8660)
* Added Footprint Enchants
* Summer_Select_Box4 package
2024-09-21 14:49:32 +02:00
Daegaladh
8c9e447fd5
Fixed Castling not getting the correct target (#8657)
Follow-up to ffead570b20060da5885f6babd28d5cc5b14eef0
2024-09-20 10:23:53 +02:00
AoShinHo
fa145ac838
New NPC, Hateffects & Skill Constants (#8656) 2024-09-18 17:28:21 +02:00
Lemongrass3110
7880596b03 Fixed clif_guild_positioninfolist
Fixes #8648

Thanks to @thanna, @laziem, @skstrife and @AoShinRO
2024-09-17 17:10:27 +02:00
Jittapan Pluemsumran
f3f8e63448
Don't allow setting "first pincode" if pincode is already set (#8654) 2024-09-17 16:29:36 +02:00
Kanin Temsrisuk
29671fa5cd
Fixed Realgar_Shooter_EXE location (#8647) 2024-09-15 09:41:05 +02:00
AoShinHo
077f714e05
Converted ZC_SKILLINFO_DELETE to struct (#8595)
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-15 02:49:31 +02:00
AoShinHo
61b3f4a34d
Converted ZC_USE_SKILL to struct (#8599)
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-15 01:42:12 +02:00
AoShinHo
d382b3f55a
Converted ZC_DESTROY_ROOM to struct (#8591)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-15 01:17:17 +02:00
AoShinHo
82a0c503ce
Converted ZC_ACK_GUILD_MENUINTERFACE to struct (#8627)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-15 00:29:05 +02:00
AoShinHo
f3d1541e44
Converted ZC_MYGUILD_BASIC_INFO to struct (#8628)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 23:57:41 +02:00
AoShinHo
c92a7e529b
Converted ZC_POSITION_INFO to struct (#8629)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 23:06:38 +02:00
AoShinHo
ca86ac12c8
Implemented ZC_BAN_LIST3 packet (#8632)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 22:41:36 +02:00
AoShinHo
fca803220b
Implemented ZC_WARPLIST packet (#8600)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 20:06:41 +02:00
AoShinHo
70e8518a32
Implemented /resetcooltime (#8613)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 19:26:49 +02:00
Jannik
6c41f9bb3f
Fix typos in quest_db parser (#8642) 2024-09-14 18:56:01 +02:00
AoShinHo
5c7c874f72
Converted ZC_GUILD_CHAT to struct (#8634)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 18:25:04 +02:00
AoShinHo
9761fdf4da
Converted ZC_DELETE_RELATED_GUILD to struct (#8638)
Co-authored-by: Daegaladh <Daegaladh@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 17:44:30 +02:00
AoShinHo
1425705a2a
Converted ZC_ACK_REQ_ALLY_GUILD to struct (#8637)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-14 12:47:52 +02:00
AoShinHo
d2809156bc
Converted ZC_ACK_REQ_HOSTILE_GUILD to struct (#8639)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-13 17:57:26 +02:00
AoShinHo
06e2fc95a1
Converted ZC_REQ_ALLY_GUILD to struct (#8636) 2024-09-13 10:53:23 +02:00
AoShinHo
c4b77f1942
Converted ZC_CHANGE_CHATROOM to struct (#8589)
---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-09-12 14:51:13 -04:00
AoShinHo
ae0bb4929c
Converted ZC_REQ_EXCHANGE_ITEM&ZC_ACK_EXCHANGE_ITEM to struct (#8581)
---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-09-12 14:17:54 -04:00
AoShinHo
00c88167ce
Converted ZC_REQ_TAKEOFF_EQUIP_ACK to struct (#8580)
---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2024-09-12 10:47:16 -04:00
Haydrich
1f25ebc90a
Corrected Spore Explosion and Earth Shaker skills effect (#8611) 2024-09-11 15:25:35 +02:00
Atemo
5bc79f9d0a
Fixed UNT_JACK_FROST_NOVA and UNT_GROUND_GRAVITATION (#8619)
* Added missing UNT_JACK_FROST_NOVA and UNT_GROUND_GRAVITATION in skill_unit_onplace_timer
(damage over time were missing)
2024-09-11 14:27:40 +02:00
Atemo
d815fabc28
Corrected jobs of items 400488 and 400489 (#8624)
Fixes #8616

Thanks to @kaninhot004
2024-09-11 01:52:33 +02:00
Lemongrass3110
88223c56b8
Fixed subtype of 28140 (#8622)
Fixes #8601

Thanks to @gmragnarok
2024-09-11 00:32:02 +02:00
Atemo
5fcbcda76f
Corrected "Venomous Chimera" re-spawn timer (#8621) 2024-09-11 00:00:34 +02:00
Atemo
c7d9c2cedd
Corrected enchant grade chances from refined level 16+ (#8620)
Updated according to https://probability.gnjoy.com/RO/GRADEBUILD/GRADEBUILD/0001
2024-09-10 23:31:57 +02:00
Singe Horizontal
5452ae4038
Enable Log reloading (#8612) 2024-09-10 22:19:47 +02:00
Lemongrass3110
baf7ec23d8
Removed commented packetdb entries (#8617) 2024-09-10 07:55:21 +02:00
Jittapan Pluemsumran
a687ddeb85
Eternal Chaos now reduces both hard DEF and soft DEF (#8609) 2024-09-05 23:46:02 +07:00
Jittapan Pluemsumran
540a9a0f30
Fixed wrong null pointer check in guild_reply_reqalliance. (#8610) 2024-09-05 19:01:20 +07:00
AoShinHo
d6f2f49b6d
Converted ZC_ENTER_ROOM to struct (#8590)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-03 18:16:18 +02:00
Playtester
247483c538
Super Novice Soul Link Equip Checks (#8605)
- Fixed base level requirements for SN soul link to take effect (91->90, 97->96)
- Fixed SN soul link not ignoring the item's base level restrictions
- SN soul link now allows you to equip items even if a status change would usually prevent you from doing so
- SN soul link now allows you to equip broken helmets and broken level 4 weapons
- Fixes #8604
2024-09-03 18:06:05 +02:00
Daegaladh
418873f25e
Assassin quest fixes and cleanup (#8498)
-Fixes killmonsterall killing monsters from other part of the quest
-Follow-up to 979e13dd66103e3b6387e9acfa48642a57b66a26 preventing players with level under 49 to get the reward
-New header style
-Cleaned up set commands
2024-09-02 20:29:46 +02:00
alexxus
d8dc0e6f41
Fixed static cast (#8603)
Fixes #8602
2024-09-02 17:57:21 +02:00
AoShinHo
37bc0f4c10
PACKET_ZC_HIGHJUMP (#8588) 2024-08-29 07:50:39 +02:00
Daegaladh
ffead570b2
Fixed Homunculus Amistr skills (#8556) 2024-08-27 20:32:15 +02:00
AoShinHo
5138ae74fc
Converted ZC_CHANGE_DIRECTION to struct (#8584)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-27 19:04:38 +02:00
AoShinHo
e0d1250645
Converted ZC_USER_COUNT to struct (#8585)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-27 15:50:00 +02:00
AoShinHo
dc6aab3d92
Fixed guild name on alt+a (#8574)
Fixes #8522

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-27 13:05:03 +02:00
AoShinHo
d5267c63a9
Converted ZC_NOTIFY_ACT to struct (#8571)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-27 09:59:26 +02:00
Lemongrass3110
baded8330f
Fixed Candy Pouch Bag class requirements (#8577)
Fixes #8573

Thanks to @llchrisll
2024-08-26 14:27:47 +02:00
AoShinHo
f3c8c70c81
Improved status_isdead and status_get_status_data (#8570)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-22 22:36:29 +02:00
Atemo
295c5ba0f5
Corrections in episode 18 npcs (#8569)
* Corrected shop barter_ep18_1
* Corrected wolfvill enchant NPC

Fixed #8561
2024-08-21 13:43:29 +02:00
Aleos
dd1c12f624
Fix GD_CHARGESHOUT_BEATING check (#8564)
Add missing parentheses to ensure the player is in a guild and avoid a short circuit check.

Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2024-08-19 09:07:39 +02:00
Atemo
1818600e50
Fixed episode 18, Mejai's daily quest (#8557)
Follow-up : 75c3fd1fc3

Thanks to @monbazko
2024-08-17 23:34:53 +02:00
Atemo
870227ff5e
Remove racial bonus of skill AG_ASTRAL_STRIKE_ATK (#8560)
Fixed #8559
2024-08-17 21:08:19 +02:00
Atemo
a9e51c09cc
Added some missing DisplayPc in status_db.yml (#8441)
* Added some missing DisplayPc in status_db.yml
  Some status should be displayed again to client around when the affected unit appears in the client's range

Status updated :
SC_SPELL_ENCHANTING from skill EM_SPELL_ENCHANTING
SC_MUSICAL_INTERLUDE from skill TR_MUSICAL_INTERLUDE
SC_JAWAII_SERENADE from skill TR_JAWAII_SERENADE
SC_PRON_MARCH from skill TR_PRON_MARCH
SC_POWERFUL_FAITH from skill IQ_POWERFUL_FAITH
2024-08-16 16:58:26 +02:00
Pokye
be3cc19fac
Updated Level 260/55 to 275/60 (#8546)
* Updated Level 260/55 to 275/60.
* Hp and Sp are unknown.
2024-08-16 16:18:20 +02:00
Atemo
37f402aca7
Updated EFST datas (#8553) 2024-08-16 15:44:27 +02:00
Haydrich
6f44b98fe9
Correct the element of Kunai of Shadow (#8554)
* Kunai of Shadow must be a Ghost element instead of Neutral.
2024-08-16 08:08:36 -04:00
Atemo
a5c939bec9
Updated addhomintimacy script command (#8551)
* The command now fails silently when no players are attached or if the player has no homunculus (like other homunculus script command)

Fixed #8534
2024-08-09 23:33:43 +02:00
Atemo
88ce3fe5d3
Adjusts the value of SC_HOLY_OIL debuff from IQ_OLEUM_SANCTUM skill (#8552)
* The debuff causing that the targets take more damage from long ranged physical damage for the skill duration is corrected from 50% to 3x(Skill Lv)%

Fixed #8520
2024-08-09 22:18:22 +02:00
Daegaladh
59c716ce23
Fixed Mars Armor-LT increasing nonexistent skill (#8549) 2024-08-08 11:48:54 +02:00
Atemo
5928ad75c6
Corrected TARGET of NPC_DAMAGE_HEAL in mob_skill_db.txt (#8540)
Fixed #8532
2024-08-06 22:33:58 +02:00
Haydrich
203b9d740d
Fixed an issue in rockridge quest (#8539)
* Corrected npcs Cactus Gunslinger hidden name
2024-08-06 14:13:10 +02:00
Atemo
75c3fd1fc3
Updated episode 18 dialogues (#8537)
Updated episode 18 dialogues using iRO text.
Renamed ep18_1_main variable by ep18_main (see sql update)
2024-08-04 15:47:47 +02:00
Atemo
e803ba5f8a
Updated renewal mob_db.yml (#8499)
* Updated map drops db
2024-08-03 21:17:22 +02:00
Playtester
c3ff38865e
Earth Spike and Heaven's Drive (#8536)
- Earth Spike now has the same cast time and aftercast delay as bolt spells (pre-re)
- Heaven's Drive now has an aftercast delay of 1000ms (pre-re)
- Fixes #8533
2024-08-03 18:55:19 +02:00
Aleos
94a731aad0
Correct Death Valley behavior (#8502)
* Follow up to 4b32621.
* The target player should be healed from the remaining SP before the SP reduction is applied.
* Update HP/SP without sending extra packets.
* Fix SP ratio.

---------

Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-08-02 09:33:53 -04:00
Atemo
effd55d1ce
Updated "skilleffect" script command (#8505)
* Added an optional parameter to "skilleffect" script command to display the given skill effect on the specified ID (default : attached player).
2024-08-02 14:11:38 +02:00
Daegaladh
aacca52eec
Fixed Elemental SP recalc and packet conversion (#8531) 2024-08-02 13:58:24 +02:00
elanosilveira
4cab85cb19
Update hair_dyer.txt (#8519)
* Properly close the message box at the end of the dialogue instead of sending the player back to the main menu.

---------

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-08-01 09:50:30 -04:00
eppc0330
54dc915661
Add mapflag specialpopup (#8365)
* Add packet ZC_SPECIALPOPUP.
* Add mapflag and script command specialpopup.
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2024-08-01 09:05:54 -04:00
Singe Horizontal
612bf702ba
Restore a correct packet header (#8530)
Fixes #8529
2024-07-31 19:53:54 +02:00
Daegaladh
6f6c74b723
Fixed slow potion effect on pre-re (#8528) 2024-07-31 16:35:01 +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
91 changed files with 31966 additions and 24776 deletions

View File

@ -1032,6 +1032,11 @@ Body:
- Command: setcard - Command: setcard
Help: | Help: |
Adds a card or enchant to the specific slot of the equipment. Adds a card or enchant to the specific slot of the equipment.
- Command: resetcooltime
Aliases:
- resetcooldown
Help: |
Resets the cooldown of all skills of the player and if active also of the homunculus or the mercenary.
Footer: Footer:
Imports: Imports:

View File

@ -17,10 +17,18 @@
// 0x10: They display luk/3+1 instead of their actual critical in the // 0x10: They display luk/3+1 instead of their actual critical in the
// stat window (by default they don't crit) // stat window (by default they don't crit)
// 0x20: Their Min-Matk is always the same as their max // 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 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) // The rate a homunculus will get friendly by feeding it. (Note 2)
homunculus_friendly_rate: 100 homunculus_friendly_rate: 100

View File

@ -295,8 +295,8 @@ trait_points_job_change: 7
// Max trait stats cap. // Max trait stats cap.
// Trait Stats: POW, STA, WIS, SPL, CON, CRT // Trait Stats: POW, STA, WIS, SPL, CON, CRT
// Official is 100. // Official is 110.
max_trait_parameter: 100 max_trait_parameter: 110
// Max percent of RES/MRES that can be ignored by item bonus/skill. // Max percent of RES/MRES that can be ignored by item bonus/skill.
// Default: 50 // Default: 50

View File

@ -1823,5 +1823,8 @@
1534: Usage: @stockall {<type>} 1534: Usage: @stockall {<type>}
1535: %d items are transferred (%d skipped)! 1535: %d items are transferred (%d skipped)!
1536: Log configuration has been reloaded.
1537: Found skill '%s', unblocking...
//Custom translations //Custom translations
import: conf/msg_conf/import/map_msg_eng_conf.txt import: conf/msg_conf/import/map_msg_eng_conf.txt

View File

@ -2613,7 +2613,7 @@ Body:
Flags: Flags:
BuyingStore: true BuyingStore: true
Script: | Script: |
sc_start SC_SlowDown,5000,0; sc_start SC_SLOWDOWN,5000,100;
- Id: 12018 - Id: 12018
AegisName: Fire_Cracker AegisName: Fire_Cracker
Name: Firecracker Name: Firecracker

View File

@ -3660,17 +3660,27 @@ Body:
Reproduce: true Reproduce: true
CastCancel: true CastCancel: true
CastTime: CastTime:
- Level: 1
Time: 700
- Level: 2
Time: 1400
- Level: 3
Time: 2100
- Level: 4
Time: 2800
- Level: 5
Time: 3500
AfterCastActDelay:
- Level: 1 - Level: 1
Time: 1000 Time: 1000
- Level: 2 - Level: 2
Time: 2000 Time: 1200
- Level: 3 - Level: 3
Time: 3000 Time: 1400
- Level: 4 - Level: 4
Time: 4000 Time: 1600
- Level: 5 - Level: 5
Time: 5000 Time: 1800
AfterCastActDelay: 700
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -3722,7 +3732,7 @@ Body:
Time: 4000 Time: 4000
- Level: 5 - Level: 5
Time: 5000 Time: 5000
AfterCastActDelay: 700 AfterCastActDelay: 1000
Duration1: 100 Duration1: 100
Requires: Requires:
SpCost: SpCost:
@ -30726,10 +30736,8 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Range: 9
Hit: Single
HitCount: 1
AfterCastActDelay: 2000 AfterCastActDelay: 2000
AfterCastWalkDelay: 1000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -30752,11 +30760,8 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Splash: true
Hit: Single
HitCount: 1
SplashArea: -1
AfterCastActDelay: 35000 AfterCastActDelay: 35000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 40000 Time: 40000
@ -30785,7 +30790,6 @@ Body:
Name: HLIF_BRAIN Name: HLIF_BRAIN
Description: Brain Surgery Description: Brain Surgery
MaxLevel: 5 MaxLevel: 5
SplashArea: 1
- Id: 8004 - Id: 8004
Name: HLIF_CHANGE Name: HLIF_CHANGE
Description: Change Description: Change
@ -30793,7 +30797,14 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single AfterCastActDelay:
- Level: 1
Time: 600000
- Level: 2
Time: 900000
- Level: 3
Time: 1200000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -30801,13 +30812,6 @@ Body:
Time: 180000 Time: 180000
- Level: 3 - Level: 3
Time: 300000 Time: 300000
Duration2:
- Level: 1
Time: 600000
- Level: 2
Time: 900000
- Level: 3
Time: 1200000
Requires: Requires:
SpCost: 100 SpCost: 100
Status: Change Status: Change
@ -30818,8 +30822,8 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single AfterCastActDelay: 1000
Duration2: 1000 AfterCastWalkDelay: 1000
Requires: Requires:
SpCost: 10 SpCost: 10
- Id: 8006 - Id: 8006
@ -30829,8 +30833,8 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single
AfterCastActDelay: 30000 AfterCastActDelay: 30000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 40000 Time: 40000
@ -30859,8 +30863,6 @@ Body:
Name: HAMI_SKIN Name: HAMI_SKIN
Description: Adamantium Skin Description: Adamantium Skin
MaxLevel: 5 MaxLevel: 5
DamageFlags:
NoDamage: true
- Id: 8008 - Id: 8008
Name: HAMI_BLOODLUST Name: HAMI_BLOODLUST
Description: Bloodlust Description: Bloodlust
@ -30868,7 +30870,14 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single AfterCastActDelay:
- Level: 1
Time: 300000
- Level: 2
Time: 600000
- Level: 3
Time: 900000
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -30876,13 +30885,6 @@ Body:
Time: 180000 Time: 180000
- Level: 3 - Level: 3
Time: 300000 Time: 300000
Duration2:
- Level: 1
Time: 300000
- Level: 2
Time: 600000
- Level: 3
Time: 900000
Requires: Requires:
SpCost: 120 SpCost: 120
Status: Bloodlust Status: Bloodlust
@ -30905,7 +30907,6 @@ Body:
Count: -2 Count: -2
- Level: 5 - Level: 5
Count: -3 Count: -3
AfterCastWalkDelay: 2000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -30926,6 +30927,18 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single 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: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -30937,17 +30950,6 @@ Body:
Time: 45000 Time: 45000
- Level: 5 - Level: 5
Time: 40000 Time: 40000
Duration2:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -30971,6 +30973,18 @@ Body:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
CastCancel: true 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: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -30982,17 +30996,6 @@ Body:
Time: 45000 Time: 45000
- Level: 5 - Level: 5
Time: 40000 Time: 40000
Duration2:
- Level: 1
Time: 60000
- Level: 2
Time: 70000
- Level: 3
Time: 80000
- Level: 4
Time: 90000
- Level: 5
Time: 120000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -31015,7 +31018,6 @@ Body:
Range: 15 Range: 15
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
AfterCastActDelay: 1000
Requires: Requires:
SpCost: 1 SpCost: 1
- Id: 8013 - Id: 8013
@ -31037,17 +31039,6 @@ Body:
Count: 4 Count: 4
- Level: 5 - Level: 5
Count: 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: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -31068,8 +31059,7 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastActDelay: 3000 AfterCastWalkDelay: 1500
AfterCastWalkDelay: 3000
Requires: Requires:
SpCost: 40 SpCost: 40
- Id: 8015 - Id: 8015
@ -31093,7 +31083,6 @@ Body:
HitCount: 1 HitCount: 1
Element: Weapon Element: Weapon
SplashArea: 4 SplashArea: 4
AfterCastWalkDelay: 1000
Requires: Requires:
SpCost: 1 SpCost: 1
- Id: 8018 - Id: 8018

View File

@ -552,3 +552,33 @@ Body:
Points: 4545 Points: 4545
- Level: 260 - Level: 260
Points: 4545 Points: 4545
- Level: 261
Points: 4545
- Level: 262
Points: 4545
- Level: 263
Points: 4545
- Level: 264
Points: 4545
- Level: 265
Points: 4545
- Level: 266
Points: 4545
- Level: 267
Points: 4545
- Level: 268
Points: 4545
- Level: 269
Points: 4545
- Level: 270
Points: 4545
- Level: 271
Points: 4545
- Level: 272
Points: 4545
- Level: 273
Points: 4545
- Level: 274
Points: 4545
- Level: 275
Points: 4545

View File

@ -2478,13 +2478,17 @@ Body:
DurationLookup: HLIF_AVOID DurationLookup: HLIF_AVOID
CalcFlags: CalcFlags:
Speed: true Speed: true
Flags:
NoSave: true
RemoveFromHomOnWarp: true
- Status: Change - Status: Change
DurationLookup: HLIF_CHANGE DurationLookup: HLIF_CHANGE
CalcFlags: CalcFlags:
Vit: true Vit: true
Int: true Int: true
Flags: Flags:
RemoveOnChangeMap: true NoSave: true
RemoveFromHomOnWarp: true
Fail: Fail:
Change: true Change: true
- Status: Bloodlust - Status: Bloodlust
@ -2492,6 +2496,9 @@ Body:
CalcFlags: CalcFlags:
Batk: true Batk: true
Watk: true Watk: true
Flags:
NoSave: true
RemoveFromHomOnWarp: true
- Status: Fleet - Status: Fleet
DurationLookup: HFLI_FLEET DurationLookup: HFLI_FLEET
CalcFlags: CalcFlags:
@ -2506,6 +2513,10 @@ Body:
DurationLookup: HAMI_DEFENCE DurationLookup: HAMI_DEFENCE
CalcFlags: CalcFlags:
Def: true Def: true
Vit: true
Flags:
NoSave: true
RemoveFromHomOnWarp: true
- Status: Incaspdrate - Status: Incaspdrate
CalcFlags: CalcFlags:
Aspd: true Aspd: true
@ -3963,7 +3974,7 @@ Body:
Unlimitedhummingvoice: true Unlimitedhummingvoice: true
Sircleofnature: true Sircleofnature: true
- Status: Deepsleep - Status: Deepsleep
Icon: EFST_HANDICAPSTATE_DEEP_SLEEP Icon: EFST_DEEP_SLEEP
DurationLookup: WM_LULLABY_DEEPSLEEP DurationLookup: WM_LULLABY_DEEPSLEEP
States: States:
NoCast: true NoCast: true

View File

@ -76,15 +76,15 @@ Body:
- Refine: 15 - Refine: 15
Chance: 7000 Chance: 7000
- Refine: 16 - Refine: 16
Chance: 7000 Chance: 8000
- Refine: 17 - Refine: 17
Chance: 7000 Chance: 8000
- Refine: 18 - Refine: 18
Chance: 7000 Chance: 8000
- Refine: 19 - Refine: 19
Chance: 7000 Chance: 8000
- Refine: 20 - Refine: 20
Chance: 7000 Chance: 8000
Bonus: 10 Bonus: 10
Catalyst: Catalyst:
Item: Blessed_Etel_Dust Item: Blessed_Etel_Dust
@ -116,15 +116,15 @@ Body:
- Refine: 15 - Refine: 15
Chance: 6000 Chance: 6000
- Refine: 16 - Refine: 16
Chance: 6000 Chance: 7000
- Refine: 17 - Refine: 17
Chance: 6000 Chance: 7000
- Refine: 18 - Refine: 18
Chance: 6000 Chance: 7000
- Refine: 19 - Refine: 19
Chance: 6000 Chance: 7000
- Refine: 20 - Refine: 20
Chance: 6000 Chance: 7000
Bonus: 30 Bonus: 30
Catalyst: Catalyst:
Item: Blessed_Etel_Dust Item: Blessed_Etel_Dust
@ -154,15 +154,15 @@ Body:
- Refine: 15 - Refine: 15
Chance: 5000 Chance: 5000
- Refine: 16 - Refine: 16
Chance: 5000 Chance: 6000
- Refine: 17 - Refine: 17
Chance: 5000 Chance: 6000
- Refine: 18 - Refine: 18
Chance: 5000 Chance: 6000
- Refine: 19 - Refine: 19
Chance: 5000 Chance: 6000
- Refine: 20 - Refine: 20
Chance: 5000 Chance: 6000
Bonus: 50 Bonus: 50
AnnounceFail: true AnnounceFail: true
Catalyst: Catalyst:
@ -193,15 +193,15 @@ Body:
- Refine: 15 - Refine: 15
Chance: 4000 Chance: 4000
- Refine: 16 - Refine: 16
Chance: 4000 Chance: 5000
- Refine: 17 - Refine: 17
Chance: 4000 Chance: 5000
- Refine: 18 - Refine: 18
Chance: 4000 Chance: 5000
- Refine: 19 - Refine: 19
Chance: 4000 Chance: 5000
- Refine: 20 - Refine: 20
Chance: 4000 Chance: 5000
Bonus: 100 Bonus: 100
AnnounceFail: true AnnounceFail: true
Catalyst: Catalyst:
@ -240,15 +240,15 @@ Body:
- Refine: 15 - Refine: 15
Chance: 7000 Chance: 7000
- Refine: 16 - Refine: 16
Chance: 7000 Chance: 8000
- Refine: 17 - Refine: 17
Chance: 7000 Chance: 8000
- Refine: 18 - Refine: 18
Chance: 7000 Chance: 8000
- Refine: 19 - Refine: 19
Chance: 7000 Chance: 8000
- Refine: 20 - Refine: 20
Chance: 7000 Chance: 8000
Bonus: 10 Bonus: 10
Catalyst: Catalyst:
Item: Blessed_Etel_Dust Item: Blessed_Etel_Dust
@ -280,15 +280,15 @@ Body:
- Refine: 15 - Refine: 15
Chance: 6000 Chance: 6000
- Refine: 16 - Refine: 16
Chance: 6000 Chance: 7000
- Refine: 17 - Refine: 17
Chance: 6000 Chance: 7000
- Refine: 18 - Refine: 18
Chance: 6000 Chance: 7000
- Refine: 19 - Refine: 19
Chance: 6000 Chance: 7000
- Refine: 20 - Refine: 20
Chance: 6000 Chance: 7000
Bonus: 30 Bonus: 30
Catalyst: Catalyst:
Item: Blessed_Etel_Dust Item: Blessed_Etel_Dust
@ -318,15 +318,15 @@ Body:
- Refine: 15 - Refine: 15
Chance: 5000 Chance: 5000
- Refine: 16 - Refine: 16
Chance: 5000 Chance: 6000
- Refine: 17 - Refine: 17
Chance: 5000 Chance: 6000
- Refine: 18 - Refine: 18
Chance: 5000 Chance: 6000
- Refine: 19 - Refine: 19
Chance: 5000 Chance: 6000
- Refine: 20 - Refine: 20
Chance: 5000 Chance: 6000
Bonus: 50 Bonus: 50
AnnounceFail: true AnnounceFail: true
Catalyst: Catalyst:
@ -357,15 +357,15 @@ Body:
- Refine: 15 - Refine: 15
Chance: 4000 Chance: 4000
- Refine: 16 - Refine: 16
Chance: 4000 Chance: 5000
- Refine: 17 - Refine: 17
Chance: 4000 Chance: 5000
- Refine: 18 - Refine: 18
Chance: 4000 Chance: 5000
- Refine: 19 - Refine: 19
Chance: 4000 Chance: 5000
- Refine: 20 - Refine: 20
Chance: 4000 Chance: 5000
Bonus: 100 Bonus: 100
AnnounceFail: true AnnounceFail: true
Catalyst: Catalyst:

View File

@ -501,19 +501,19 @@ Body:
7@thts: true 7@thts: true
8@thts: true 8@thts: true
- Id: 67 - Id: 67
Name: The Maze of Oz Name: Oz Labyrinth
Enter: Enter:
Map: 1@oz Map: 1@oz
X: 284 X: 284
Y: 167 Y: 167
- Id: 68 - Id: 68
Name: Thor Gunsu Base Name: Thor Military Base
Enter: Enter:
Map: 1@tcamp Map: 1@tcamp
X: 103 X: 103
Y: 237 Y: 237
- Id: 69 - Id: 69
Name: A Gathering Place of Wolves Name: Wolves Gathering Place
Enter: Enter:
Map: 1@nyr Map: 1@nyr
X: 194 X: 194
@ -529,7 +529,7 @@ Body:
AdditionalMaps: AdditionalMaps:
2@nyr: true 2@nyr: true
- Id: 71 - Id: 71
Name: Villa of High Priest Name: High Priest's Villa
Enter: Enter:
Map: 1@adv Map: 1@adv
X: 123 X: 123

View File

@ -83053,7 +83053,7 @@ Body:
Hunter: true Hunter: true
Rogue: true Rogue: true
Locations: Locations:
Right_Hand: true Both_Hand: true
WeaponLevel: 4 WeaponLevel: 4
EquipLevelMin: 70 EquipLevelMin: 70
Refineable: true Refineable: true
@ -112246,8 +112246,7 @@ Body:
Defense: 30 Defense: 30
Slots: 1 Slots: 1
Classes: Classes:
All_Third: true All: true
Fourth: true
Locations: Locations:
Garment: true Garment: true
ArmorLevel: 1 ArmorLevel: 1
@ -112276,8 +112275,7 @@ Body:
Defense: 30 Defense: 30
Slots: 1 Slots: 1
Classes: Classes:
All_Third: true All: true
Fourth: true
Locations: Locations:
Garment: true Garment: true
ArmorLevel: 1 ArmorLevel: 1
@ -112306,8 +112304,7 @@ Body:
Defense: 30 Defense: 30
Slots: 1 Slots: 1
Classes: Classes:
All_Third: true All: true
Fourth: true
Locations: Locations:
Garment: true Garment: true
ArmorLevel: 1 ArmorLevel: 1
@ -139535,7 +139532,7 @@ Body:
AegisName: Ein_BHAXE AegisName: Ein_BHAXE
Name: Saw Axe Name: Saw Axe
Type: Weapon Type: Weapon
SubType: 1hAxe SubType: 2hAxe
Weight: 5000 Weight: 5000
Attack: 350 Attack: 350
Range: 1 Range: 1
@ -169200,6 +169197,8 @@ Body:
Defense: 12 Defense: 12
Slots: 1 Slots: 1
Jobs: Jobs:
Crusader: true
Knight: true
Swordman: true Swordman: true
Classes: Classes:
All_Upper: true All_Upper: true
@ -169220,6 +169219,8 @@ Body:
Defense: 12 Defense: 12
Slots: 1 Slots: 1
Jobs: Jobs:
Crusader: true
Knight: true
Swordman: true Swordman: true
Classes: Classes:
All_Upper: true All_Upper: true
@ -187652,7 +187653,7 @@ Body:
bonus2 bSkillAtk,"GC_CROSSIMPACT",20*(.@r/3); bonus2 bSkillAtk,"GC_CROSSIMPACT",20*(.@r/3);
bonus2 bSkillAtk,"GC_ROLLINGCUTTER",20*(.@r/3); bonus2 bSkillAtk,"GC_ROLLINGCUTTER",20*(.@r/3);
bonus2 bSkillAtk,"SC_TRIANGLESHOT",20*(.@r/3); bonus2 bSkillAtk,"SC_TRIANGLESHOT",20*(.@r/3);
bonus2 bSkillAtk,"SC_STARTMARK",20*(.@r/3); bonus2 bSkillAtk,"SC_FATALMENACE",20*(.@r/3);
if (.@r>=9) { if (.@r>=9) {
bonus bLongAtkRate,10; bonus bLongAtkRate,10;
bonus bShortAtkRate,10; bonus bShortAtkRate,10;
@ -202633,6 +202634,17 @@ Body:
} }
} }
} }
- Id: 480470
AegisName: C_Summer_Beach
Name: Costume Summer Beach # !todo check english name
Type: Armor
Locations:
Costume_Garment: true
ArmorLevel: 1
Script: |
hateffect HAT_EF_VACATION,true;
UnEquipScript: |
hateffect HAT_EF_VACATION,false;
- Id: 490004 - Id: 490004
AegisName: Atker_Ring AegisName: Atker_Ring
Name: Attacker Booster Ring Name: Attacker Booster Ring

View File

@ -80408,6 +80408,28 @@ Body:
Name: Footprint Effect Name: Footprint Effect
Type: Card Type: Card
SubType: Enchant SubType: Enchant
Script: |
hateffect FOOTPRINT_EF_BASE,true;
UnEquipScript: |
hateffect FOOTPRINT_EF_BASE,false;
- Id: 313067
AegisName: aegis_313067
Name: Purple Star Footprint
Type: Card
SubType: Enchant
Script: |
hateffect FOOTPRINT_EF_PURPLESTAR,true;
UnEquipScript: |
hateffect FOOTPRINT_EF_PURPLESTAR,false;
- Id: 313068
AegisName: aegis_313068
Name: Yellow Star Footprint
Type: Card
SubType: Enchant
Script: |
hateffect FOOTPRINT_EF_YELLOWSTAR,true;
UnEquipScript: |
hateffect FOOTPRINT_EF_YELLOWSTAR,false;
- Id: 313070 - Id: 313070
AegisName: Ep21_4_Def AegisName: Ep21_4_Def
Name: Forest Magic Orb (Physical Defense) Name: Forest Magic Orb (Physical Defense)
@ -81896,6 +81918,15 @@ Body:
Script: | Script: |
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO"); bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO"); bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
- Id: 313345
AegisName: aegis_313345
Name: Puppy Footprint
Type: Card
SubType: Enchant
Script: |
hateffect FOOTPRINT_EF_DOGFOOT,true;
UnEquipScript: |
hateffect FOOTPRINT_EF_DOGFOOT,false;
- Id: 1000000 - Id: 1000000
AegisName: IDTest_event AegisName: IDTest_event
Name: IDTest event Name: IDTest event
@ -86200,31 +86231,31 @@ Body:
Flags: Flags:
BuyingStore: true BuyingStore: true
- Id: 1001072 - Id: 1001072
AegisName: aegis_1001072 AegisName: Evil_Black_Bid
Name: Evil Orb Name: Evil Orb
Type: Etc Type: Etc
Buy: 1480 Buy: 1480
Weight: 10 Weight: 10
- Id: 1001073 - Id: 1001073
AegisName: aegis_1001073 AegisName: Ectoplasmic_Stone
Name: Ectoplasmic Stone Name: Ectoplasmic Stone
Type: Etc Type: Etc
Buy: 1460 Buy: 1460
Weight: 10 Weight: 10
- Id: 1001074 - Id: 1001074
AegisName: aegis_1001074 AegisName: Heavy_Chain
Name: Heavy Chain Name: Heavy Chain
Type: Etc Type: Etc
Buy: 1480 Buy: 1480
Weight: 10 Weight: 10
- Id: 1001075 - Id: 1001075
AegisName: aegis_1001075 AegisName: Evil_Minded_Ruby
Name: Evil Minded Ruby Name: Evil Minded Ruby
Type: Etc Type: Etc
Buy: 1500 Buy: 1500
Weight: 10 Weight: 10
- Id: 1001076 - Id: 1001076
AegisName: aegis_1001076 AegisName: Small_Sewing_Box
Name: Small Sewing Kit Name: Small Sewing Kit
Type: Etc Type: Etc
Buy: 1640 Buy: 1640
@ -86236,37 +86267,37 @@ Body:
Buy: 1600 Buy: 1600
Weight: 10 Weight: 10
- Id: 1001078 - Id: 1001078
AegisName: aegis_1001078 AegisName: Blue_Moon_Stone
Name: Fragments of the Blue Moon Name: Fragments of the Blue Moon
Type: Etc Type: Etc
Buy: 1720 Buy: 1720
Weight: 10 Weight: 10
- Id: 1001079 - Id: 1001079
AegisName: aegis_1001079 AegisName: Weird_Tentacle
Name: Monstrous Tentacles Name: Monstrous Tentacles
Type: Etc Type: Etc
Buy: 1520 Buy: 1520
Weight: 10 Weight: 10
- Id: 1001080 - Id: 1001080
AegisName: aegis_1001080 AegisName: Congealed_Poison
Name: Congealed Poison Name: Congealed Poison
Type: Etc Type: Etc
Buy: 1600 Buy: 1600
Weight: 10 Weight: 10
- Id: 1001081 - Id: 1001081
AegisName: aegis_1001081 AegisName: Slicky_Fluid
Name: Slimy Fluid Name: Slimy Fluid
Type: Etc Type: Etc
Buy: 1560 Buy: 1560
Weight: 10 Weight: 10
- Id: 1001082 - Id: 1001082
AegisName: aegis_1001082 AegisName: Reptile_Stone
Name: Monster's Stone Name: Monster's Stone
Type: Etc Type: Etc
Buy: 1720 Buy: 1720
Weight: 10 Weight: 10
- Id: 1001083 - Id: 1001083
AegisName: aegis_1001083 AegisName: Turn_Yellow_Leaf
Name: Maple Leaves Name: Maple Leaves
Type: Etc Type: Etc
Buy: 1640 Buy: 1640
@ -86278,13 +86309,13 @@ Body:
Buy: 1480 Buy: 1480
Weight: 10 Weight: 10
- Id: 1001085 - Id: 1001085
AegisName: aegis_1001085 AegisName: Cool_Liquid
Name: Cool Liquid Name: Cool Liquid
Type: Etc Type: Etc
Buy: 1460 Buy: 1460
Weight: 10 Weight: 10
- Id: 1001086 - Id: 1001086
AegisName: aegis_1001086 AegisName: Green_Crystal_Fragment
Name: Blue Crystal Shard Name: Blue Crystal Shard
Type: Etc Type: Etc
Buy: 1480 Buy: 1480
@ -86296,7 +86327,7 @@ Body:
Buy: 1600 Buy: 1600
Weight: 10 Weight: 10
- Id: 1001088 - Id: 1001088
AegisName: aegis_1001088 AegisName: Fresh_Pear
Name: Fresh Pear Name: Fresh Pear
Type: Etc Type: Etc
Buy: 1640 Buy: 1640
@ -89440,6 +89471,11 @@ Body:
Name: Footprint Effect (Garment) Name: Footprint Effect (Garment)
Type: Etc Type: Etc
Weight: 100 Weight: 100
- Id: 1001617
AegisName: PurpleStar_Foot_Robe
Name: Purple Star Footprint (Garment)
Type: Etc
Weight: 100
- Id: 1001618 - Id: 1001618
AegisName: aegis_1001618 AegisName: aegis_1001618
Name: Wigner Premium Exchange Ticket Name: Wigner Premium Exchange Ticket
@ -89709,6 +89745,11 @@ Body:
Weight: 10 Weight: 10
Flags: Flags:
BuyingStore: true BuyingStore: true
- Id: 1001650
AegisName: YellowStar_Foot_Robe
Name: Yellow Star Footprint (Garment)
Type: Etc
Weight: 100
- Id: 1001653 - Id: 1001653
AegisName: Ep21_Armor_E_Stone1 AegisName: Ep21_Armor_E_Stone1
Name: Turquoise Magic Stone Name: Turquoise Magic Stone
@ -90322,6 +90363,11 @@ Body:
NoGuildStorage: true NoGuildStorage: true
NoMail: true NoMail: true
NoAuction: true NoAuction: true
- Id: 1001772
AegisName: aegis_1001772
Name: Puppy Footprint (Garment)
Type: Etc
Weight: 100
- Id: 1200000 - Id: 1200000
AegisName: IDTest_arrow AegisName: IDTest_arrow
Name: IDTest arrow Name: IDTest arrow
@ -90384,7 +90430,7 @@ Body:
Ammo: true Ammo: true
EquipLevelMin: 1 EquipLevelMin: 1
Script: | Script: |
bonus bAtkEle,Ele_Neutral; bonus bAtkEle,Ele_Ghost;
- Id: 1220003 - Id: 1220003
AegisName: Kunai_Of_Shadow AegisName: Kunai_Of_Shadow
Name: Kunai Of Shadow Name: Kunai Of Shadow

View File

@ -78855,6 +78855,11 @@ Body:
NoAuction: true NoAuction: true
Script: | Script: |
getgroupitem(IG_STOVE_CHANNELING_BOX_4); getgroupitem(IG_STOVE_CHANNELING_BOX_4);
- Id: 103263
AegisName: Summer_Select_Box4
Name: Star Footprint Selection Box (Summer Beach)
Type: Usable
Weight: 10
- Id: 200000 - Id: 200000
AegisName: IDTest_Cash AegisName: IDTest_Cash
Name: IDTest Cash Name: IDTest Cash

View File

@ -980,3 +980,13 @@ Body:
- Group: 1 - Group: 1
Items: Items:
- Item: C_Chaos_Emerald - Item: C_Chaos_Emerald
- Item: Summer_Select_Box4
Groups:
- Group: 0
Items:
- Item: PurpleStar_Foot_Robe
- Item: C_Summer_Beach
- Group: 1
Items:
- Item: YellowStar_Foot_Robe
- Item: C_Summer_Beach

File diff suppressed because it is too large Load Diff

View File

@ -3365,7 +3365,7 @@ Body:
Night_Watch: true Night_Watch: true
Hyper_Novice: true Hyper_Novice: true
Spirit_Handler: true Spirit_Handler: true
MaxBaseLevel: 260 MaxBaseLevel: 275
BaseExp: BaseExp:
- Level: 1 - Level: 1
Exp: 658 Exp: 658
@ -3886,6 +3886,36 @@ Body:
- Level: 259 - Level: 259
Exp: 270217017679 Exp: 270217017679
- Level: 260 - Level: 260
Exp: 283727868563
- Level: 261
Exp: 297914261991
- Level: 262
Exp: 312809975091
- Level: 263
Exp: 328450473845
- Level: 264
Exp: 344872997537
- Level: 265
Exp: 353494822476
- Level: 266
Exp: 362332193038
- Level: 267
Exp: 371390497864
- Level: 268
Exp: 380675260310
- Level: 269
Exp: 390192141818
- Level: 270
Exp: 397995984654
- Level: 271
Exp: 405955904348
- Level: 272
Exp: 414075022434
- Level: 273
Exp: 422356522883
- Level: 274
Exp: 430803653341
- Level: 275
Exp: 999999999999 Exp: 999999999999
- Jobs: - Jobs:
Dragon_Knight: true Dragon_Knight: true
@ -3912,7 +3942,7 @@ Body:
Night_Watch: true Night_Watch: true
Hyper_Novice: true Hyper_Novice: true
Spirit_Handler: true Spirit_Handler: true
MaxJobLevel: 55 MaxJobLevel: 60
JobExp: JobExp:
- Level: 1 - Level: 1
Exp: 4700000 Exp: 4700000
@ -4023,4 +4053,14 @@ Body:
- Level: 54 - Level: 54
Exp: 6559840847 Exp: 6559840847
- Level: 55 - Level: 55
Exp: 9999999999 Exp: 7543816974
- Level: 56
Exp: 8675389520
- Level: 57
Exp: 9976697948
- Level: 58
Exp: 11473202640
- Level: 59
Exp: 13194183036
- Level: 60
Exp: 99999999999

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -13606,7 +13606,7 @@
20811,ILL_KRAKEN@NPC_HELLJUDGEMENT2,chase,768,2,3000,500,5000,no,target,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_HELLJUDGEMENT2,chase,768,2,3000,500,5000,no,target,always,0,,,,,,,
20811,ILL_KRAKEN@NPC_HELLJUDGEMENT2,attack,768,2,3000,500,5000,no,target,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_HELLJUDGEMENT2,attack,768,2,3000,500,5000,no,target,always,0,,,,,,,
20811,ILL_KRAKEN@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,,
20811,ILL_KRAKEN@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,target,myhpltmaxrate,10,,,,,,, 20811,ILL_KRAKEN@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,self,myhpltmaxrate,10,,,,,,,
20811,ILL_KRAKEN@NPC_PHANTOMTHRUST,chase,741,5,1000,0,5000,no,self,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_PHANTOMTHRUST,chase,741,5,1000,0,5000,no,self,always,0,,,,,,,
20811,ILL_KRAKEN@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,, 20811,ILL_KRAKEN@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,,
20843,ILL_ABYSMAL_WITCH@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
@ -13638,7 +13638,7 @@
20843,ILL_ABYSMAL_WITCH@NPC_HELLJUDGEMENT2,chase,768,2,2000,500,5000,no,target,always,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_HELLJUDGEMENT2,chase,768,2,2000,500,5000,no,target,always,0,,,,,,,
20843,ILL_ABYSMAL_WITCH@NPC_HELLJUDGEMENT2,attack,768,2,2000,500,5000,no,target,always,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_HELLJUDGEMENT2,attack,768,2,2000,500,5000,no,target,always,0,,,,,,,
20843,ILL_ABYSMAL_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,,
20843,ILL_ABYSMAL_WITCH@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,target,myhpltmaxrate,10,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,self,myhpltmaxrate,10,,,,,,,
20843,ILL_ABYSMAL_WITCH@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,, 20843,ILL_ABYSMAL_WITCH@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,,
// Episode 17.2 - Sage's Legacy // Episode 17.2 - Sage's Legacy
@ -14239,7 +14239,7 @@
20934,R001_BESTIA@NPC_EARTHQUAKE,attack,653,5,10000,500,20000,no,self,myhpltmaxrate,40,,,,,,, 20934,R001_BESTIA@NPC_EARTHQUAKE,attack,653,5,10000,500,20000,no,self,myhpltmaxrate,40,,,,,,,
20934,R001_BESTIA@NPC_PULSESTRIKE,attack,661,5,10000,0,15000,no,self,myhpltmaxrate,60,,,,,,, 20934,R001_BESTIA@NPC_PULSESTRIKE,attack,661,5,10000,0,15000,no,self,myhpltmaxrate,60,,,,,,,
20934,R001_BESTIA@NPC_DRAGONFEAR,attack,659,5,10000,0,10000,no,self,always,0,,,,,,, 20934,R001_BESTIA@NPC_DRAGONFEAR,attack,659,5,10000,0,10000,no,self,always,0,,,,,,,
// 20934,R001_BESTIA@NPC_DAMAGE_HEAL,attack,753,1,3000,1500,40000,no,target,myhpltmaxrate,20,,,,,,, // 20934,R001_BESTIA@NPC_DAMAGE_HEAL,attack,753,1,3000,1500,40000,no,self,myhpltmaxrate,20,,,,,,,
// nif_dun // nif_dun
20935,GAN_CEANN@NPC_CRITICALSLASH,attack,170,1,1000,500,5000,no,target,always,0,,,,,,, 20935,GAN_CEANN@NPC_CRITICALSLASH,attack,170,1,1000,500,5000,no,target,always,0,,,,,,,
@ -14339,7 +14339,7 @@
20943,DEATH_WITCH@NPC_HELLJUDGEMENT,chase,662,2,2000,500,5000,no,self,always,0,,,,,,, 20943,DEATH_WITCH@NPC_HELLJUDGEMENT,chase,662,2,2000,500,5000,no,self,always,0,,,,,,,
20943,DEATH_WITCH@NPC_HELLJUDGEMENT,attack,662,2,2000,500,5000,no,self,always,0,,,,,,, 20943,DEATH_WITCH@NPC_HELLJUDGEMENT,attack,662,2,2000,500,5000,no,self,always,0,,,,,,,
20943,DEATH_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,, 20943,DEATH_WITCH@NPC_CLOUD_KILL,attack,739,5,2000,500,16000,no,target,always,0,,,,,,,
// 20943,DEATH_WITCH@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,target,myhpltmaxrate,10,,,,,,, // 20943,DEATH_WITCH@NPC_DAMAGE_HEAL,attack,753,1,10000,1000,60000,no,self,myhpltmaxrate,10,,,,,,,
20943,DEATH_WITCH@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,, 20943,DEATH_WITCH@NPC_CALLSLAVE,idle,352,1,5000,0,30000,yes,self,always,0,,,,,,,
20943,DEATH_WITCH@NPC_CALLSLAVE,attack,352,1,5000,0,30000,yes,self,always,0,,,,,,, 20943,DEATH_WITCH@NPC_CALLSLAVE,attack,352,1,5000,0,30000,yes,self,always,0,,,,,,,
@ -14570,7 +14570,7 @@
21395,ILL_MAYA@NPC_CRITICALWOUND,attack,673,1,500,0,5000,yes,target,always,0,,,,,,, 21395,ILL_MAYA@NPC_CRITICALWOUND,attack,673,1,500,0,5000,yes,target,always,0,,,,,,,
21395,ILL_MAYA@NPC_IMMUNE_PROPERTY,chase,754,4,1500,1500,60000,no,self,casttargeted,0,,,,,,, 21395,ILL_MAYA@NPC_IMMUNE_PROPERTY,chase,754,4,1500,1500,60000,no,self,casttargeted,0,,,,,,,
21395,ILL_MAYA@NPC_IMMUNE_PROPERTY,attack,754,1,1500,1500,60000,no,self,longrangeattacked,0,,,,,,, 21395,ILL_MAYA@NPC_IMMUNE_PROPERTY,attack,754,1,1500,1500,60000,no,self,longrangeattacked,0,,,,,,,
21395,ILL_MAYA@NPC_DAMAGE_HEAL,attack,753,1,500,1500,120000,no,target,myhpltmaxrate,50,,,,,,32, 21395,ILL_MAYA@NPC_DAMAGE_HEAL,attack,753,1,500,1500,120000,no,self,myhpltmaxrate,50,,,,,,32,
21395,ILL_MAYA@NPC_ALL_STAT_DOWN,attack,751,5,5000,1500,45000,no,target,always,0,,,,,,18, 21395,ILL_MAYA@NPC_ALL_STAT_DOWN,attack,751,5,5000,1500,45000,no,target,always,0,,,,,,18,
// Episode 18 // Episode 18

View File

@ -1578,26 +1578,26 @@ Body:
- Id: 3495 - Id: 3495
Title: Conversation with Jeojin Title: Conversation with Jeojin
- Id: 3496 - Id: 3496
Title: Conversation with Squain Title: Conversation with Skuain
- Id: 3497 - Id: 3497
Title: Conversation with Senado Title: Conversation with Senado
- Id: 3498 - Id: 3498
Title: Conversation with Japer Title: Conversation with Japer
- Id: 3499 - Id: 3499
Title: Conversation with Shirouan Title: Conversation with Shiroan
- Id: 3500 - Id: 3500
Title: Conversation with Ishira Title: Conversation with Isira
- Id: 3501 - Id: 3501
Title: Conversation with Gina Title: Conversation with Dina
- Id: 3502 - Id: 3502
Title: Conversation with Hari Title: Conversation with Hari
- Id: 3503 - Id: 3503
Title: Examine the Sky Title: "[Daily] Opinion Gathering"
- Id: 3504 - Id: 3504
Title: Look at the Sky - Standby Title: "[Cooldown] Opinion Gathering"
- Id: 3505
Title: Report to Junok
TimeLimit: 4h TimeLimit: 4h
- Id: 3505
Title: Completed Opinion Gathering
- Id: 3507 - Id: 3507
Title: Illusion Investigation Team - Sheshin Title: Illusion Investigation Team - Sheshin
- Id: 3508 - Id: 3508
@ -3234,26 +3234,28 @@ Body:
Title: "[Standby] Subjugation-Yanggeochon" Title: "[Standby] Subjugation-Yanggeochon"
TimeLimit: 4h TimeLimit: 4h
- Id: 5932 - Id: 5932
Title: The Abused Child Title: Abused Child
- Id: 5933 - Id: 5933
Title: Business Plan Presentation Title: Business Plan
- Id: 5934 - Id: 5934
Title: Gathering Training (1) Title: Foraging Practice (1)
- Id: 5935 - Id: 5935
Title: Gathering Training (2) Title: Foraging Practice (2)
- Id: 5936 - Id: 5936
Title: Gathering Training (3) Title: Foraging Practice (3)
- Id: 5937 - Id: 5937
Title: "[Standby] Flower Room's work" Title: "[Cooldown] Half Flower Gathering"
TimeLimit: 4h TimeLimit: 4h
- Id: 5938 - Id: 5938
Title: Gathering Half Flower Title: "[Daily] Half Flower Gathering"
- Id: 5939 - Id: 5939
Title: Gathering Half Flower Title: "[Daily] Half Flower Gathering"
- Id: 5940 - Id: 5940
Title: Gathering Half Flower Title: "[Daily] Half Flower Gathering"
- Id: 5941 - Id: 5941
Title: Gathering Half Flower Title: "[Daily] Half Flower Gathering"
- Id: 5942
Title: Flower Room Opening Ceremony
- Id: 6000 - Id: 6000
Title: Job Change to Taekwon Title: Job Change to Taekwon
- Id: 6001 - Id: 6001
@ -6316,55 +6318,55 @@ Body:
DROSERA: true DROSERA: true
MUSCIPULAR: true MUSCIPULAR: true
- Id: 8681 - Id: 8681
Title: To Rachel (1) Title: Towards Rachel (1)
- Id: 8682 - Id: 8682
Title: To Rachel (2) Title: Towards Rachel (2)
- Id: 8683 - Id: 8683
Title: Please stop fighting Title: Heated Argument
- Id: 8684 - Id: 8684
Title: It's over Title: State of Conflict
- Id: 8685 - Id: 8685
Title: A suspicious movement detected in the temple Title: Suspicious Movement
- Id: 8686 - Id: 8686
Title: The Intruder of the Temple Title: Intruder of the Temple
- Id: 8687 - Id: 8687
Title: Did you break it? Title: Staged Plot
- Id: 8688 - Id: 8688
Title: Thanks for today's daily food Title: Today's Daily Bread
- Id: 8689 - Id: 8689
Title: Today's Daily food - Standby Title: "[Cooldown] Today's Daily Bread"
TimeLimit: 4h TimeLimit: 4h
- Id: 8690 - Id: 8690
Title: Thanks for today's daily food Title: "[Daily] Today's Daily Bread"
- Id: 8691 - Id: 8691
Title: Sacred Relics for Essence (1) Title: Water Purification (1)
- Id: 8692 - Id: 8692
Title: Sacred Relics for Essence (2) Title: Water Purification (2)
- Id: 8693 - Id: 8693
Title: Sacred Relics for Essence (3) Title: Water Purification (3)
- Id: 8694 - Id: 8694
Title: Clean Water Procurement - Standby Title: "[Cooldown] Water Purification"
TimeLimit: 4h TimeLimit: 4h
- Id: 8695 - Id: 8695
Title: Procurement of clean water (1) Title: "[Daily] Water Purification (1)"
- Id: 8696 - Id: 8696
Title: Procurement of clean water (2) Title: "[Daily] Water Purification (2)"
- Id: 8697 - Id: 8697
Title: Procurement of clean water (3) Title: "[Daily] Water Purification (3)"
- Id: 8698 - Id: 8698
Title: Late migration Title: Horim's Bizarre Adventure (1)
- Id: 8699 - Id: 8699
Title: First Step Out of the City Title: Horim's Bizarre Adventure (2)
- Id: 8700 - Id: 8700
Title: I couldn't even come halfway Title: Horim's Bizarre Adventure (3)
- Id: 8701 - Id: 8701
Title: Scenery I've Seen for the First Time Title: Horim's Bizarre Adventure (4)
- Id: 8702 - Id: 8702
Title: Smell of Volcanic Ash Title: Horim's Bizarre Adventure (5)
- Id: 8703 - Id: 8703
Title: The easy way to go Title: Horim's Bizarre Adventure (6)
- Id: 8718 - Id: 8718
Title: My friend's regards Title: Greetings from a Friend
- Id: 8719 - Id: 8719
Title: A new area somewhere in the anthill Title: A new area somewhere in the anthill
- Id: 8720 - Id: 8720
@ -8196,104 +8198,104 @@ Body:
Title: Squirrels are rats, too? Standby Title: Squirrels are rats, too? Standby
TimeLimit: 4h TimeLimit: 4h
- Id: 11696 - Id: 11696
Title: Niren's Request Title: Niren's Request (1)
- Id: 11697 - Id: 11697
Title: Niren's Request Title: Niren's Request (2)
- Id: 11698 - Id: 11698
Title: Niren's Request Title: Niren's Request (3)
- Id: 11699 - Id: 11699
Title: Niren's Request Title: Niren's Request (4)
- Id: 11700 - Id: 11700
Title: Niren's Request Title: Niren's Request (5)
- Id: 11701 - Id: 11701
Title: Niren's Request Title: Niren's Request (6)
- Id: 11702 - Id: 11702
Title: Niren's Request Title: Niren's Request (7)
- Id: 11703 - Id: 11703
Title: Niren's Request Title: Niren's Request (8)
- Id: 11704 - Id: 11704
Title: Niren's Request Title: Gray Children (1)
- Id: 11705 - Id: 11705
Title: Children of Grey Title: Gray Children (2)
- Id: 11706 - Id: 11706
Title: Children of Grey Title: Gray Children (3)
- Id: 11707 - Id: 11707
Title: Children of Grey Title: Gray Children (4)
- Id: 11708 - Id: 11708
Title: Children of Grey Title: Gray Children (5)
- Id: 11709 - Id: 11709
Title: Children of Grey Title: Gray Children (6)
- Id: 11710 - Id: 11710
Title: Children of Grey Title: Gray Children (7)
- Id: 11711 - Id: 11711
Title: Children of Grey Title: Gray Children (8)
- Id: 11712 - Id: 11712
Title: Children of Grey Title: Gray Children (9)
- Id: 11713 - Id: 11713
Title: Children of Grey Title: Gray Children (10)
- Id: 11714 - Id: 11714
Title: Children of Grey Title: Gray Children (11)
- Id: 11715 - Id: 11715
Title: Children of Grey Title: Gray Children (12)
- Id: 11716 - Id: 11716
Title: Children of Grey Title: Gray Children (13)
- Id: 11717 - Id: 11717
Title: Children of Grey Title: Gray Children (14)
- Id: 11718 - Id: 11718
Title: Children of Grey Title: Gray Children (15)
- Id: 11719 - Id: 11719
Title: Children of Grey Title: Gray Children (16)
- Id: 11720 - Id: 11720
Title: Children of Grey Title: Gray Children (17)
- Id: 11721 - Id: 11721
Title: Children of Grey Title: Gray Children (18)
- Id: 11722 - Id: 11722
Title: Children of Grey Title: Gray Children (19)
- Id: 11723 - Id: 11723
Title: Children of Grey Title: Gray Children (20)
- Id: 11724 - Id: 11724
Title: Children of Grey Title: Gray Children (21)
- Id: 11725 - Id: 11725
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (1)
- Id: 11726 - Id: 11726
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (2)
- Id: 11727 - Id: 11727
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (3)
- Id: 11728 - Id: 11728
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (4)
- Id: 11729 - Id: 11729
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (5)
- Id: 11730 - Id: 11730
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (6)
Targets: Targets:
- Id: 1 - Id: 1
Location: oz_dun01 Location: oz_dun01
Count: 10 Count: 10
- Id: 11731 - Id: 11731
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (7)
- Id: 11732 - Id: 11732
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (8)
- Id: 11733 - Id: 11733
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (9)
- Id: 11734 - Id: 11734
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (10)
- Id: 11735 - Id: 11735
Title: Investigation of Oz Labyrinth Title: The Labyrinth and the Merchant (11)
- Id: 11736 - Id: 11736
Title: Maze of Oz 1st Floor (170lv) Title: Oz Labyrinth 1F (170lv)
Targets: Targets:
- Mob: EP18_ASH_TOAD - Mob: EP18_ASH_TOAD
Count: 20 Count: 20
- Id: 11737 - Id: 11737
Title: Maze of Oz Level 1 - Standby Title: "[Cooldown] Oz Labyrinth 1F"
TimeLimit: 4h TimeLimit: 4h
- Id: 11738 - Id: 11738
Title: Maze of Oz Level 2 (200lv) Title: Oz Labyrinth 2F (200lv)
Targets: Targets:
- Mob: EP18_HOT_MOLAR - Mob: EP18_HOT_MOLAR
Count: 20 Count: 20
- Id: 11739 - Id: 11739
Title: Maze of Oz Level 2 (200lv) Title: "[Cooldown] Oz Labyrinth 2F"
TimeLimit: 4h TimeLimit: 4h
- Id: 12000 - Id: 12000
Title: An old friend Title: An old friend
@ -9335,30 +9337,30 @@ Body:
Title: Let's try again to seal the crack Title: Let's try again to seal the crack
TimeLimit: 4h TimeLimit: 4h
- Id: 12520 - Id: 12520
Title: Villa of Deception Title: "[Normal] Villa of Deception"
- Id: 12521 - Id: 12521
Title: Villa of Deception Hard Title: "[Hard] Villa of Deception"
- Id: 12522 - Id: 12522
Title: Cooldown: Villa of Deception Title: "[Cooldown] Villa of Deception"
TimeLimit: 4h TimeLimit: 4h
- Id: 12531 - Id: 12531
Title: Future General Candidate Title: Transporting Goods
- Id: 12532 - Id: 12532
Title: Trouble at the Top Title: Broken Wagon
- Id: 12533 - Id: 12533
Title: The Hidden Helper Title: Hidden Helper
- Id: 12534 - Id: 12534
Title: The Missing Camille Title: Missing Camille
- Id: 12535 - Id: 12535
Title: The Governor's Decision Title: Chief Decision
- Id: 12536 - Id: 12536
Title: The Scattered Luggage (North) Title: Scattered Goods (North)
- Id: 12537 - Id: 12537
Title: Scattered Luggage (West) Title: Scattered Goods (West)
- Id: 12538 - Id: 12538
Title: The Scattered Luggage (East) Title: Scattered Goods (East)
- Id: 12539 - Id: 12539
Title: Scattered Luggage (South) Title: Scattered Goods (South)
- Id: 13000 - Id: 13000
Title: RWC2011Card Gathering Title: RWC2011Card Gathering
- Id: 13001 - Id: 13001
@ -11512,84 +11514,84 @@ Body:
- Mob: EP18_FIREWIND_KITE - Mob: EP18_FIREWIND_KITE
Count: 30 Count: 30
- Id: 16549 - Id: 16549
Title: I can't sleep Title: "[Daily] I can't sleep"
Targets: Targets:
- Mob: EP18_FIREWIND_KITE - Mob: EP18_FIREWIND_KITE
Count: 30 Count: 30
- Id: 16550 - Id: 16550
Title: I Can't Sleep - Wait Title: "[Cooldown] I can't sleep"
TimeLimit: 4h TimeLimit: 4h
- Id: 16551 - Id: 16551
Title: The Story of Dinar Title: Collecting Folklore (1)
- Id: 16552 - Id: 16552
Title: Amira's Story Title: Collecting Folklore (2)
- Id: 16553 - Id: 16553
Title: Shanina's Grandma's Story Title: Collecting Folklore (3)
- Id: 16554 - Id: 16554
Title: Please collect the stories Title: Collecting Folklore (4)
- Id: 16555 - Id: 16555
Title: The Story of Dinar Title: "[Daily] Dinar's Story"
- Id: 16556 - Id: 16556
Title: Amira's Story Title: "[Daily] Amira's Story"
- Id: 16557 - Id: 16557
Title: Shanina's Grandma's Story Title: "[Daily] Shanina's Story"
- Id: 16558 - Id: 16558
Title: Please collect the stories Title: "[Daily] Collecting Folklore"
- Id: 16559 - Id: 16559
Title: Please collect the stories - Standby Title: "[Cooldown] Collecting Folklore"
TimeLimit: 4h TimeLimit: 4h
- Id: 16560 - Id: 16560
Title: This is not the place Title: Ahab's Gossip (1)
- Id: 16561 - Id: 16561
Title: This is not the place Title: Ahab's Gossip (2)
- Id: 16562 - Id: 16562
Title: This is not the place Title: Ahab's Gossip (3)
- Id: 16563 - Id: 16563
Title: This is not the place Title: Ahab's Gossip (4)
- Id: 16564 - Id: 16564
Title: This is not the place Title: Ahab's Gossip (5)
- Id: 16565 - Id: 16565
Title: This is not the place Title: Ahab's Gossip (6)
- Id: 16566 - Id: 16566
Title: This is not the place Title: Ahab's Gossip (7)
- Id: 16567 - Id: 16567
Title: The Contest of the Grey Wolf Forest Title: Gray Wolf Forest Tournament (1)
- Id: 16568 - Id: 16568
Title: Everyone's Opinion Title: People's Opinion (1)
- Id: 16569 - Id: 16569
Title: Everyone's Opinion Title: People's Opinion (2)
- Id: 16570 - Id: 16570
Title: Everyone's Opinion Title: People's Opinion (3)
- Id: 16571 - Id: 16571
Title: Everyone's Opinion Title: People's Opinion (4)
- Id: 16572 - Id: 16572
Title: The Contest of the Grey Wolf Forest Title: Gray Wolf Forest Tournament (2)
- Id: 16573 - Id: 16573
Title: Source of Weapon Title: Source of Weapons (1)
- Id: 16574 - Id: 16574
Title: Source of Weapon Title: Source of Weapons (2)
- Id: 16575 - Id: 16575
Title: Source of Weapon Title: Source of Weapons (3)
- Id: 16576 - Id: 16576
Title: Source of Weapon Title: Source of Weapons (4)
- Id: 16577 - Id: 16577
Title: Source of Weapon Title: Source of Weapons (5)
- Id: 16578 - Id: 16578
Title: Source of Weapon Title: Source of Weapons (6)
- Id: 16579 - Id: 16579
Title: Source of Weapon Title: Source of Weapons (7)
- Id: 16580 - Id: 16580
Title: Source of Weapon Title: Source of Weapons (8)
- Id: 16581 - Id: 16581
Title: Children Know It Title: Even children know (1)
- Id: 16582 - Id: 16582
Title: Children Know It Title: Even children know (2)
- Id: 16583 - Id: 16583
Title: Children Know It Title: Even children know (3)
- Id: 16584 - Id: 16584
Title: The Price of Labor Title: The Price of Labor (1)
- Id: 16585 - Id: 16585
Title: The Price of Labor Title: The Price of Labor (2)
- Id: 17000 - Id: 17000
Title: Meet with Father Bamph Title: Meet with Father Bamph
- Id: 17001 - Id: 17001
@ -11852,62 +11854,62 @@ Body:
Title: (Standby) Thanatos Tower, 12th floor Title: (Standby) Thanatos Tower, 12th floor
TimeLimit: 4h TimeLimit: 4h
- Id: 17504 - Id: 17504
Title: Where's My Home Title: Where is My Home (1)
- Id: 17505 - Id: 17505
Title: Where's My Home Title: Where is My Home (2)
- Id: 17506 - Id: 17506
Title: Where's My Home Title: Where is My Home (3)
- Id: 17507 - Id: 17507
Title: Where's My Home Title: Where is My Home (4)
- Id: 17508 - Id: 17508
Title: Lack of Supplies Title: "[Daily] Shortage of Supplies"
Drops: Drops:
- Mob: EP18_GREY_WOLF - Mob: EP18_GREY_WOLF
Item: Ep18_Very_Ddan_Crystal Item: Ep18_Very_Ddan_Crystal
Rate: 5000 Rate: 5000
- Id: 17509 - Id: 17509
Title: (Standby) Lack of supplies Title: "[Cooldown] Shortage of Supplies"
TimeLimit: 4h TimeLimit: 4h
- Id: 17510 - Id: 17510
Title: There are no bad beasts in the world Title: There are no evil beasts in this world (1)
- Id: 17511 - Id: 17511
Title: There are no bad beasts in the world Title: There are no evil beasts in this world (2)
- Id: 17512 - Id: 17512
Title: There are no bad beasts in the world Title: There are no evil beasts in this world (3)
- Id: 17513 - Id: 17513
Title: The Unexpected Shepherd Title: An Unexpected Shepherd (1)
- Id: 17514 - Id: 17514
Title: The Unexpected Shepherd Title: An Unexpected Shepherd (2)
Targets: Targets:
- Mob: EP18_ASHRING - Mob: EP18_ASHRING
Count: 20 Count: 20
- Id: 17515 - Id: 17515
Title: The Unexpected Shepherd Title: An Unexpected Shepherd (3)
- Id: 17516 - Id: 17516
Title: (Standby) Unexpected shepherd Title: "[Cooldown] An Unexpected Shepherd"
TimeLimit: 4h TimeLimit: 4h
- Id: 17517 - Id: 17517
Title: The Rebels Title: Rebellion (1)
- Id: 17518 - Id: 17518
Title: The Rebels Title: Rebellion (2)
- Id: 17519 - Id: 17519
Title: The Rebels Title: Rebellion (3)
- Id: 17520 - Id: 17520
Title: Wolf in the Sheep Title: Wolf Among Sheep (1)
- Id: 17521 - Id: 17521
Title: When you need a conversation Title: Wolf Among Sheep (2)
- Id: 17522 - Id: 17522
Title: Cleaning the Traitors Title: Wolf Among Sheep (3)
- Id: 17523 - Id: 17523
Title: Purification of the Sanctuary Title: Sanctuary Purification
- Id: 17524 - Id: 17524
Title: Cleaning the Traitors Title: "[Completed] Renegade Cleaning"
- Id: 17525 - Id: 17525
Title: When you need a conversation Title: Aftermath
- Id: 17526 - Id: 17526
Title: Purification of the Sanctuary Title: "[Completed] Sanctuary Purification"
- Id: 17527 - Id: 17527
Title: (Standby) Cleaning strategy Title: "[Cooldown] Sanctuary Purification"
TimeLimit: 4h TimeLimit: 4h
- Id: 17566 - Id: 17566
Title: (Standby) Code name! Is it a star button? Title: (Standby) Code name! Is it a star button?
@ -12035,21 +12037,21 @@ Body:
Title: Goseong dungeon 1st floor attack Title: Goseong dungeon 1st floor attack
TimeLimit: 4h TimeLimit: 4h
- Id: 18082 - Id: 18082
Title: Eligibility to Participate in the Competition Title: Eligibility to attend the competition
- Id: 18083 - Id: 18083
Title: Investigation of Daishinkan's Villa Title: High Priest's Villa
- Id: 18084 - Id: 18084
Title: Fact Investigation Title: Fact Finding
- Id: 18085 - Id: 18085
Title: The Direction of Prayer Title: Direction of Prayer
- Id: 18086 - Id: 18086
Title: Make the Grey Wolf Forest Safer Title: "[Daily] Gray Wolf Forest Hunting"
Targets: Targets:
- Id: 1 - Id: 1
Location: gw_fild01 Location: gw_fild01
Count: 30 Count: 30
- Id: 18087 - Id: 18087
Title: Safer in the Gray Wolf Forest - Standby Title: "[Cooldown] Gray Wolf Forest Hunting"
TimeLimit: 4h TimeLimit: 4h
- Id: 18100 - Id: 18100
Title: Legends from Moscovia Title: Legends from Moscovia

View File

@ -7535,7 +7535,7 @@ Body:
TargetTrap: true TargetTrap: true
Range: 9 Range: 9
Hit: Multi_Hit Hit: Multi_Hit
HitCount: 5 HitCount: -5
Element: Weapon Element: Weapon
CopyFlags: CopyFlags:
Skill: Skill:
@ -41424,489 +41424,6 @@ Body:
SplashArea: 6 SplashArea: 6
Requires: Requires:
SpCost: 1 SpCost: 1
- Id: 5433
Name: SH_MYSTICAL_CREATURE_MASTERY
Description: Mystical Creature Mastery
MaxLevel: 10
- Id: 5434
Name: SH_COMMUNE_WITH_CHUL_HO
Description: Commune with Chulho
MaxLevel: 1
- Id: 5435
Name: SH_CHUL_HO_SONIC_CLAW
Description: Chulho Sonic Claw
MaxLevel: 7
Type: Weapon
TargetType: Attack
DamageFlags:
Critical: true
Range: -11
Hit: Multi_Hit
HitCount: -2
GiveAp: 1
Element: Weapon
AfterCastActDelay: 500
Cooldown:
- Level: 1
Time: 1150
- Level: 2
Time: 1000
- Level: 3
Time: 850
- Level: 4
Time: 700
- Level: 5
Time: 550
- Level: 6
Time: 400
- Level: 7
Time: 250
Requires:
SpCost:
- Level: 1
Amount: 42
- Level: 2
Amount: 44
- Level: 3
Amount: 46
- Level: 4
Amount: 48
- Level: 5
Amount: 50
- Level: 6
Amount: 52
- Level: 7
Amount: 54
- Id: 5436
Name: SH_HOWLING_OF_CHUL_HO
Description: Howling of Chulho
MaxLevel: 7
Type: Weapon
TargetType: Self
Range: -9
Hit: Multi_Hit
HitCount: -3
GiveAp: 2
Element: Weapon
DamageFlags:
Splash: true
SplashArea:
- Level: 1
Area: 2
- Level: 2
Area: 2
- Level: 3
Area: 2
- Level: 4
Area: 3
- Level: 5
Area: 3
- Level: 6
Area: 3
- Level: 7
Area: 4
Duration1: 12000
Cooldown: 1000
CastCancel: true
FixedCastTime: 1000
Requires:
SpCost: 72
Status: Hogogong
- Id: 5437
Name: SH_HOGOGONG_STRIKE
Description: Hogogong Strike
MaxLevel: 7
Type: Weapon
TargetType: Self
Range: -9
Hit: Multi_Hit
HitCount: 3
GiveAp: 1
Element: Weapon
DamageFlags:
Splash: true
Critical: true
SplashArea:
- Level: 1
Area: 3
- Level: 2
Area: 3
- Level: 3
Area: 3
- Level: 4
Area: 4
- Level: 5
Area: 4
- Level: 6
Area: 4
- Level: 7
Area: 5
Cooldown: 350
CastCancel: true
FixedCastTime: 1000
Requires:
SpCost:
- Level: 1
Amount: 67
- Level: 2
Amount: 70
- Level: 3
Amount: 73
- Level: 4
Amount: 76
- Level: 5
Amount: 79
- Level: 6
Amount: 82
- Level: 7
Amount: 85
- Id: 5438
Name: SH_COMMUNE_WITH_KI_SUL
Description: Commune with Kisul
MaxLevel: 1
- Id: 5439
Name: SH_KI_SUL_WATER_SPRAYING
Description: Kisul Water Spraying
MaxLevel: 7
Type: Magic
TargetType: Self
GiveAp: 1
DamageFlags:
NoDamage: true
Splash: true
SplashArea:
- Level: 1
Area: 3
- Level: 2
Area: 3
- Level: 3
Area: 4
- Level: 4
Area: 4
- Level: 5
Area: 5
- Level: 6
Area: 5
- Level: 7
Area: 6
CastCancel: true
CastTime: 1700
AfterCastActDelay: 1000
FixedCastTime: 1000
Cooldown: 300
Requires:
SpCost:
- Level: 1
Amount: 61
- Level: 2
Amount: 65
- Level: 3
Amount: 69
- Level: 4
Amount: 73
- Level: 5
Amount: 77
- Level: 6
Amount: 81
- Level: 7
Amount: 85
- Id: 5440
Name: SH_MARINE_FESTIVAL_OF_KI_SUL
Description: Marine Festival of Kisul
MaxLevel: 5
Type: Magic
TargetType: Self
DamageFlags:
NoDamage: true
Splash: true
GiveAp: 4
SplashArea:
- Level: 1
Area: 2
- Level: 2
Area: 3
- Level: 3
Area: 4
- Level: 4
Area: 5
- Level: 5
Area: 6
Duration1:
- Level: 1
Time: 60000
- Level: 2
Time: 75000
- Level: 3
Time: 90000
- Level: 4
Time: 105000
- Level: 5
Time: 120000
CastCancel: true
CastTime: 1700
AfterCastActDelay: 1000
FixedCastTime: 1000
Cooldown: 2000
Requires:
SpCost:
- Level: 1
Amount: 80
- Level: 2
Amount: 90
- Level: 3
Amount: 100
- Level: 4
Amount: 110
- Level: 5
Amount: 120
Status: Marine_Festival
- Id: 5441
Name: SH_SANDY_FESTIVAL_OF_KI_SUL
Description: Sandy Festival of Kisul
MaxLevel: 5
Type: Magic
TargetType: Self
DamageFlags:
NoDamage: true
Splash: true
GiveAp: 4
SplashArea:
- Level: 1
Area: 2
- Level: 2
Area: 3
- Level: 3
Area: 4
- Level: 4
Area: 5
- Level: 5
Area: 6
Duration1:
- Level: 1
Time: 60000
- Level: 2
Time: 75000
- Level: 3
Time: 90000
- Level: 4
Time: 105000
- Level: 5
Time: 120000
CastCancel: true
CastTime: 1700
AfterCastActDelay: 1000
FixedCastTime: 1000
Cooldown: 2000
Requires:
SpCost:
- Level: 1
Amount: 80
- Level: 2
Amount: 90
- Level: 3
Amount: 100
- Level: 4
Amount: 110
- Level: 5
Amount: 120
Status: Sandy_Festival
- Id: 5442
Name: SH_KI_SUL_RAMPAGE
Description: Kisul Rampage
MaxLevel: 7
Type: Magic
TargetType: Self
DamageFlags:
NoDamage: true
Splash: true
SplashArea: 3
Duration1:
- Level: 1
Time: 4000
- Level: 2
Time: 5000
- Level: 3
Time: 6000
- Level: 4
Time: 7000
- Level: 5
Time: 8000
- Level: 6
Time: 9000
- Level: 7
Time: 10000
CastCancel: true
CastTime: 3000
AfterCastActDelay: 1000
Cooldown: 60000
FixedCastTime: 1500
Requires:
SpCost:
- Level: 1
Amount: 90
- Level: 2
Amount: 100
- Level: 3
Amount: 110
- Level: 4
Amount: 120
- Level: 5
Amount: 130
- Level: 6
Amount: 140
- Level: 7
Amount: 150
Status: Ki_Sul_Rampage
- Id: 5443
Name: SH_COMMUNE_WITH_HYUN_ROK
Description: Commune with Hyunrok
MaxLevel: 1
- Id: 5444
Name: SH_COLORS_OF_HYUN_ROK
Description: Colors of Hyunrok
MaxLevel: 7
Type: Magic
TargetType: Self
DamageFlags:
NoDamage: true
Duration1: 300000
CastCancel: true
CastTime: 1700
FixedCastTime: 1000
Requires:
SpCost: 90
- Id: 5445
Name: SH_HYUN_ROKS_BREEZE
Description: Hyunrok Breeze
MaxLevel: 7
Type: Magic
TargetType: Ground
Hit: Single
HitCount: 1
Range: 9
GiveAp: 4
CastCancel: true
CastTime: 3000
AfterCastActDelay: 500
Cooldown: 4500
FixedCastTime: 1500
Duration1: 4500
Requires:
SpCost:
- Level: 1
Amount: 58
- Level: 2
Amount: 64
- Level: 3
Amount: 70
- Level: 4
Amount: 76
- Level: 5
Amount: 82
- Level: 6
Amount: 88
- Level: 7
Amount: 94
Unit:
Id: HYUN_ROKS_BREEZE
Range:
- Level: 1
Size: 2
- Level: 2
Size: 2
- Level: 3
Size: 3
- Level: 4
Size: 3
- Level: 5
Size: 4
- Level: 6
Size: 4
- Level: 7
Size: 5
Interval: 300
Target: Enemy
Flag:
NoOverlap: true
PathCheck: true
- Id: 5446
Name: SH_HYUN_ROK_CANNON
Description: Hyunrok Cannon
MaxLevel: 7
Type: Magic
TargetType: Attack
Range: -11
GiveAp: 1
Hit: Single
HitCount: 1
CastCancel: true
CastTime: 2000
Cooldown: 300
FixedCastTime: 1500
Requires:
SpCost:
- Level: 1
Amount: 47
- Level: 2
Amount: 50
- Level: 3
Amount: 53
- Level: 4
Amount: 56
- Level: 5
Amount: 59
- Level: 6
Amount: 62
- Level: 7
Amount: 65
- Id: 5447
Name: SH_TEMPORARY_COMMUNION
Description: Temporary Communion
MaxLevel: 5
Type: Magic
TargetType: Self
DamageFlags:
NoDamage: true
CastCancel: true
CastTime: 2000
AfterCastActDelay: 500
Cooldown: 60000
FixedCastTime: 1500
Duration1:
- Level: 1
Time: 30000
- Level: 2
Time: 60000
- Level: 3
Time: 90000
- Level: 4
Time: 12000
- Level: 5
Time: 150000
Requires:
SpCost: 100
ApCost: 150
Status: Temporary_Communion
- Id: 5448
Name: SH_BLESSING_OF_MYSTICAL_CREATURES
Description: Blessing of Mystical Creatures
MaxLevel: 5
Type: Magic
TargetType: Support
Range: -9
DamageFlags:
NoDamage: true
CastCancel: true
CastTime: 2000
AfterCastActDelay: 500
Cooldown: 60000
FixedCastTime: 1500
Duration1: 10000
Duration2: 60000
Requires:
SpCost: 100
ApCost: 100
Status: Blessing_of_M_Creatures
- Id: 5401 - Id: 5401
Name: NW_P_F_I Name: NW_P_F_I
Description: P.F.I Description: P.F.I
@ -43501,10 +43018,10 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Range: 9 Flags:
Hit: Single IgnoreGtb: true
HitCount: 1 AfterCastWalkDelay: 1000
AfterCastActDelay: 2000 Cooldown: 20000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -43527,11 +43044,7 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Splash: true AfterCastWalkDelay: 1000
Hit: Single
HitCount: 1
SplashArea: -1
AfterCastActDelay: 35000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 40000 Time: 40000
@ -43543,6 +43056,7 @@ Body:
Time: 25000 Time: 25000
- Level: 5 - Level: 5
Time: 20000 Time: 20000
Cooldown: 35000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -43560,7 +43074,6 @@ Body:
Name: HLIF_BRAIN Name: HLIF_BRAIN
Description: Brain Surgery Description: Brain Surgery
MaxLevel: 5 MaxLevel: 5
SplashArea: 1
- Id: 8004 - Id: 8004
Name: HLIF_CHANGE Name: HLIF_CHANGE
Description: Change Description: Change
@ -43568,7 +43081,7 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -43576,7 +43089,7 @@ Body:
Time: 180000 Time: 180000
- Level: 3 - Level: 3
Time: 300000 Time: 300000
Duration2: Cooldown:
- Level: 1 - Level: 1
Time: 600000 Time: 600000
- Level: 2 - Level: 2
@ -43593,8 +43106,8 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single AfterCastWalkDelay: 1000
Duration2: 1000 Cooldown: 1000
Requires: Requires:
SpCost: 10 SpCost: 10
- Id: 8006 - Id: 8006
@ -43604,8 +43117,7 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single AfterCastWalkDelay: 1000
AfterCastActDelay: 30000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 40000 Time: 40000
@ -43617,6 +43129,7 @@ Body:
Time: 25000 Time: 25000
- Level: 5 - Level: 5
Time: 20000 Time: 20000
Cooldown: 30000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -43634,8 +43147,6 @@ Body:
Name: HAMI_SKIN Name: HAMI_SKIN
Description: Adamantium Skin Description: Adamantium Skin
MaxLevel: 5 MaxLevel: 5
DamageFlags:
NoDamage: true
- Id: 8008 - Id: 8008
Name: HAMI_BLOODLUST Name: HAMI_BLOODLUST
Description: Bloodlust Description: Bloodlust
@ -43643,7 +43154,7 @@ Body:
TargetType: Self TargetType: Self
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -43651,7 +43162,7 @@ Body:
Time: 180000 Time: 180000
- Level: 3 - Level: 3
Time: 300000 Time: 300000
Duration2: Cooldown:
- Level: 1 - Level: 1
Time: 300000 Time: 300000
- Level: 2 - Level: 2
@ -43680,7 +43191,7 @@ Body:
Count: -2 Count: -2
- Level: 5 - Level: 5
Count: -3 Count: -3
AfterCastWalkDelay: 2000 Cooldown: 2000
Requires: Requires:
SpCost: SpCost:
- Level: 1 - Level: 1
@ -43701,6 +43212,7 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -43712,7 +43224,7 @@ Body:
Time: 45000 Time: 45000
- Level: 5 - Level: 5
Time: 40000 Time: 40000
Duration2: Cooldown:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
- Level: 2 - Level: 2
@ -43746,6 +43258,7 @@ Body:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
CastCancel: true CastCancel: true
AfterCastWalkDelay: 1000
Duration1: Duration1:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
@ -43757,7 +43270,7 @@ Body:
Time: 45000 Time: 45000
- Level: 5 - Level: 5
Time: 40000 Time: 40000
Duration2: Cooldown:
- Level: 1 - Level: 1
Time: 60000 Time: 60000
- Level: 2 - Level: 2
@ -43790,7 +43303,7 @@ Body:
Range: 15 Range: 15
Hit: Single Hit: Single
HitCount: 1 HitCount: 1
AfterCastActDelay: 1000 Cooldown: 1000
Requires: Requires:
SpCost: 1 SpCost: 1
- Id: 8013 - Id: 8013
@ -43812,7 +43325,7 @@ Body:
Count: 4 Count: 4
- Level: 5 - Level: 5
Count: 5 Count: 5
AfterCastActDelay: Cooldown:
- Level: 1 - Level: 1
Time: 2000 Time: 2000
- Level: 2 - Level: 2
@ -43843,8 +43356,8 @@ Body:
DamageFlags: DamageFlags:
NoDamage: true NoDamage: true
Hit: Single Hit: Single
AfterCastActDelay: 3000 AfterCastWalkDelay: 1500
AfterCastWalkDelay: 3000 Cooldown: 3000
Requires: Requires:
SpCost: 40 SpCost: 40
- Id: 8015 - Id: 8015
@ -43868,7 +43381,8 @@ Body:
HitCount: 1 HitCount: 1
Element: Weapon Element: Weapon
SplashArea: 4 SplashArea: 4
AfterCastWalkDelay: 1000 AfterCastActDelay: 5000
CoolDown: 1000
Requires: Requires:
SpCost: 1 SpCost: 1
- Id: 8018 - Id: 8018

View File

@ -8039,108 +8039,3 @@ Body:
Level: 5 Level: 5
- Name: HN_NAPALM_VULCAN_STRIKE - Name: HN_NAPALM_VULCAN_STRIKE
Level: 5 Level: 5
- Job: Spirit_Handler
Inherit:
Summoner: true
Tree:
- Name: SH_MYSTICAL_CREATURE_MASTERY
MaxLevel: 10
- Name: SH_CHUL_HO_SONIC_CLAW
MaxLevel: 7
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 1
- Name: SH_KI_SUL_WATER_SPRAYING
MaxLevel: 7
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 1
- Name: SH_COLORS_OF_HYUN_ROK
MaxLevel: 7
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 1
- Name: SH_HOWLING_OF_CHUL_HO
MaxLevel: 7
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 3
- Name: SH_CHUL_HO_SONIC_CLAW
Level: 3
- Name: SH_MARINE_FESTIVAL_OF_KI_SUL
MaxLevel: 5
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 3
- Name: SH_KI_SUL_WATER_SPRAYING
Level: 3
- Name: SH_SANDY_FESTIVAL_OF_KI_SUL
MaxLevel: 5
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 3
- Name: SH_KI_SUL_WATER_SPRAYING
Level: 3
- Name: SH_HYUN_ROKS_BREEZE
MaxLevel: 7
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 3
- Name: SH_COLORS_OF_HYUN_ROK
Level: 3
- Name: SH_HOGOGONG_STRIKE
MaxLevel: 7
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 5
- Name: SH_CHUL_HO_SONIC_CLAW
Level: 3
- Name: SH_KI_SUL_RAMPAGE
MaxLevel: 7
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 5
- Name: SH_MARINE_FESTIVAL_OF_KI_SUL
Level: 2
- Name: SH_SANDY_FESTIVAL_OF_KI_SUL
Level: 2
- Name: SH_HYUN_ROK_CANNON
MaxLevel: 7
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 5
- Name: SH_HYUN_ROKS_BREEZE
Level: 3
- Name: SH_COMMUNE_WITH_CHUL_HO
MaxLevel: 1
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 7
- Name: SH_HOGOGONG_STRIKE
Level: 3
- Name: SH_COMMUNE_WITH_KI_SUL
MaxLevel: 1
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 7
- Name: SH_KI_SUL_RAMPAGE
Level: 3
- Name: SH_COMMUNE_WITH_HYUN_ROK
MaxLevel: 1
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 7
- Name: SH_HYUN_ROK_CANNON
Level: 3
- Name: SH_TEMPORARY_COMMUNION
MaxLevel: 5
Requires:
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 10
- Name: SH_BLESSING_OF_MYSTICAL_CREATURES
MaxLevel: 5
Requires:
- Name: SH_COMMUNE_WITH_KI_SUL
Level: 1
- Name: SH_MYSTICAL_CREATURE_MASTERY
Level: 10

View File

@ -612,3 +612,48 @@ Body:
- Level: 260 - Level: 260
Points: 4099 Points: 4099
TraitPoints: 228 TraitPoints: 228
- Level: 261
Points: 4099
TraitPoints: 231
- Level: 262
Points: 4099
TraitPoints: 234
- Level: 263
Points: 4099
TraitPoints: 237
- Level: 264
Points: 4099
TraitPoints: 240
- Level: 265
Points: 4099
TraitPoints: 247
- Level: 266
Points: 4099
TraitPoints: 250
- Level: 267
Points: 4099
TraitPoints: 253
- Level: 268
Points: 4099
TraitPoints: 256
- Level: 269
Points: 4099
TraitPoints: 259
- Level: 270
Points: 4099
TraitPoints: 266
- Level: 271
Points: 4099
TraitPoints: 269
- Level: 272
Points: 4099
TraitPoints: 272
- Level: 273
Points: 4099
TraitPoints: 275
- Level: 274
Points: 4099
TraitPoints: 278
- Level: 275
Points: 4099
TraitPoints: 285

View File

@ -1822,6 +1822,7 @@ Body:
Icon: EFST_ETERNALCHAOS Icon: EFST_ETERNALCHAOS
DurationLookup: BD_ETERNALCHAOS DurationLookup: BD_ETERNALCHAOS
CalcFlags: CalcFlags:
Def: true
Def2: true Def2: true
Flags: Flags:
NoDispell: true NoDispell: true
@ -2600,13 +2601,17 @@ Body:
DurationLookup: HLIF_AVOID DurationLookup: HLIF_AVOID
CalcFlags: CalcFlags:
Speed: true Speed: true
Flags:
NoSave: true
RemoveFromHomOnMapWarp: true
- Status: Change - Status: Change
DurationLookup: HLIF_CHANGE DurationLookup: HLIF_CHANGE
CalcFlags: CalcFlags:
Vit: true Vit: true
Int: true Int: true
Flags: Flags:
RemoveOnChangeMap: true NoSave: true
RemoveFromHomOnMapWarp: true
Fail: Fail:
Change: true Change: true
- Status: Bloodlust - Status: Bloodlust
@ -2614,6 +2619,9 @@ Body:
CalcFlags: CalcFlags:
Batk: true Batk: true
Watk: true Watk: true
Flags:
NoSave: true
RemoveFromHomOnMapWarp: true
- Status: Fleet - Status: Fleet
DurationLookup: HFLI_FLEET DurationLookup: HFLI_FLEET
CalcFlags: CalcFlags:
@ -2627,7 +2635,11 @@ Body:
- Status: Defence - Status: Defence
DurationLookup: HAMI_DEFENCE DurationLookup: HAMI_DEFENCE
CalcFlags: CalcFlags:
Def: true
Vit: true Vit: true
Flags:
NoSave: true
RemoveFromHomOnMapWarp: true
- Status: Incaspdrate - Status: Incaspdrate
CalcFlags: CalcFlags:
Aspd: true Aspd: true
@ -4126,7 +4138,7 @@ Body:
Unlimitedhummingvoice: true Unlimitedhummingvoice: true
Sircleofnature: true Sircleofnature: true
- Status: Deepsleep - Status: Deepsleep
Icon: EFST_HANDICAPSTATE_DEEP_SLEEP Icon: EFST_DEEP_SLEEP
DurationLookup: WM_LULLABY_DEEPSLEEP DurationLookup: WM_LULLABY_DEEPSLEEP
States: States:
NoCast: true NoCast: true
@ -7010,7 +7022,9 @@ Body:
CalcFlags: CalcFlags:
Regen: true Regen: true
- Status: Earthshaker - Status: Earthshaker
Icon: EFST_EARTHSHAKER
Flags: Flags:
BlEffect: true
NoWarning: true NoWarning: true
- Status: Weaponblock_On - Status: Weaponblock_On
Icon: EFST_WEAPONBLOCK_ON Icon: EFST_WEAPONBLOCK_ON
@ -7025,6 +7039,7 @@ Body:
Icon: EFST_SPORE_EXPLOSION_DEBUFF Icon: EFST_SPORE_EXPLOSION_DEBUFF
DurationLookup: GN_SPORE_EXPLOSION DurationLookup: GN_SPORE_EXPLOSION
Flags: Flags:
BlEffect: true
NoDispell: true NoDispell: true
NoBanishingBuster: true NoBanishingBuster: true
NoClearance: true NoClearance: true
@ -7446,7 +7461,7 @@ Body:
NoClearance: true NoClearance: true
NoClearbuff: true NoClearbuff: true
- Status: Madogear - Status: Madogear
Icon: EFST_MADOGEAR Icon: EFST_MADOGEAR_TYPE
CalcFlags: CalcFlags:
Speed: true Speed: true
Flags: Flags:
@ -7828,8 +7843,6 @@ Body:
Flags: Flags:
BlEffect: true BlEffect: true
DisplayPc: true DisplayPc: true
EndOnStart:
Sandy_Festival: true
- Status: Benedictum - Status: Benedictum
Icon: EFST_BENEDICTUM Icon: EFST_BENEDICTUM
DurationLookup: CD_BENEDICTUM DurationLookup: CD_BENEDICTUM
@ -7840,8 +7853,6 @@ Body:
Flags: Flags:
BlEffect: true BlEffect: true
DisplayPc: true DisplayPc: true
EndOnStart:
Marine_Festival: true
- Status: Axe_Stomp - Status: Axe_Stomp
Icon: EFST_AXE_STOMP Icon: EFST_AXE_STOMP
DurationLookup: MT_AXE_STOMP DurationLookup: MT_AXE_STOMP
@ -7964,6 +7975,8 @@ Body:
DurationLookup: EM_SPELL_ENCHANTING DurationLookup: EM_SPELL_ENCHANTING
CalcFlags: CalcFlags:
Smatk: true Smatk: true
Flags:
DisplayPc: true
- Status: Summon_Elemental_Ardor - Status: Summon_Elemental_Ardor
Icon: EFST_SUMMON_ELEMENTAL_ARDOR Icon: EFST_SUMMON_ELEMENTAL_ARDOR
DurationLookup: EM_SUMMON_ELEMENTAL_ARDOR DurationLookup: EM_SUMMON_ELEMENTAL_ARDOR
@ -8015,17 +8028,23 @@ Body:
DurationLookup: TR_MUSICAL_INTERLUDE DurationLookup: TR_MUSICAL_INTERLUDE
CalcFlags: CalcFlags:
Res: true Res: true
Flags:
DisplayPc: true
- Status: Jawaii_Serenade - Status: Jawaii_Serenade
Icon: EFST_JAWAII_SERENADE Icon: EFST_JAWAII_SERENADE
DurationLookup: TR_JAWAII_SERENADE DurationLookup: TR_JAWAII_SERENADE
CalcFlags: CalcFlags:
Smatk: true Smatk: true
Speed: true Speed: true
Flags:
DisplayPc: true
- Status: Pron_March - Status: Pron_March
Icon: EFST_PRON_MARCH Icon: EFST_PRON_MARCH
DurationLookup: TR_PRON_MARCH DurationLookup: TR_PRON_MARCH
CalcFlags: CalcFlags:
Patk: true Patk: true
Flags:
DisplayPc: true
- Status: Roseblossom - Status: Roseblossom
Icon: EFST_ROSEBLOSSOM Icon: EFST_ROSEBLOSSOM
DurationLookup: TR_ROSEBLOSSOM DurationLookup: TR_ROSEBLOSSOM
@ -8039,6 +8058,8 @@ Body:
Powerful_Faith: true Powerful_Faith: true
Firm_Faith: true Firm_Faith: true
Sincere_Faith: true Sincere_Faith: true
Flags:
DisplayPc: true
- Status: Sincere_Faith - Status: Sincere_Faith
Icon: EFST_SINCERE_FAITH Icon: EFST_SINCERE_FAITH
DurationLookup: IQ_SINCERE_FAITH DurationLookup: IQ_SINCERE_FAITH
@ -8948,106 +8969,3 @@ Body:
Bleeding: true Bleeding: true
Confusion: true Confusion: true
Freeze: true Freeze: true
- Status: Hogogong
Icon: EFST_HOGOGONG
DurationLookup: SH_HOWLING_OF_CHUL_HO
Flags:
Debuff: true
BlEffect: true
DisplayPc: true
- Status: Temporary_Communion
Icon: EFST_TEMPORARY_COMMUNION
DurationLookup: SH_TEMPORARY_COMMUNION
CalcFlags:
Patk: true
Smatk: true
Hplus: true
- Status: Marine_Festival
Icon: EFST_MARINE_FESTIVAL
DurationLookup: SH_MARINE_FESTIVAL_OF_KI_SUL
CalcFlags:
Pow: true
Con: true
Crt: true
EndOnStart:
Benedictum: true
- Status: Sandy_Festival
Icon: EFST_SANDY_FESTIVAL
DurationLookup: SH_SANDY_FESTIVAL_OF_KI_SUL
CalcFlags:
Spl: true
Wis: true
Sta: true
EndOnStart:
Religio: true
- Status: Ki_Sul_Rampage
Icon: EFST_KI_SUL_RAMPAGE
DurationLookup: SH_KI_SUL_RAMPAGE
States:
NoCast: true
- Status: Colors_of_Hyun_Rok_Buff
Icon: EFST_COLORS_OF_HYUN_ROK_BUFF
DurationLookup: SH_COLORS_OF_HYUN_ROK
- Status: Colors_of_Hyun_Rok_1
Icon: EFST_COLORS_OF_HYUN_ROK_1
DurationLookup: SH_COLORS_OF_HYUN_ROK
EndOnStart:
Colors_of_Hyun_Rok_2: true
Colors_of_Hyun_Rok_3: true
Colors_of_Hyun_Rok_4: true
Colors_of_Hyun_Rok_5: true
Colors_of_Hyun_Rok_6: true
- Status: Colors_of_Hyun_Rok_2
Icon: EFST_COLORS_OF_HYUN_ROK_2
DurationLookup: SH_COLORS_OF_HYUN_ROK
EndOnStart:
Colors_of_Hyun_Rok_1: true
Colors_of_Hyun_Rok_3: true
Colors_of_Hyun_Rok_4: true
Colors_of_Hyun_Rok_5: true
Colors_of_Hyun_Rok_6: true
- Status: Colors_of_Hyun_Rok_3
Icon: EFST_COLORS_OF_HYUN_ROK_3
DurationLookup: SH_COLORS_OF_HYUN_ROK
EndOnStart:
Colors_of_Hyun_Rok_1: true
Colors_of_Hyun_Rok_2: true
Colors_of_Hyun_Rok_4: true
Colors_of_Hyun_Rok_5: true
Colors_of_Hyun_Rok_6: true
- Status: Colors_of_Hyun_Rok_4
Icon: EFST_COLORS_OF_HYUN_ROK_4
DurationLookup: SH_COLORS_OF_HYUN_ROK
EndOnStart:
Colors_of_Hyun_Rok_1: true
Colors_of_Hyun_Rok_2: true
Colors_of_Hyun_Rok_3: true
Colors_of_Hyun_Rok_5: true
Colors_of_Hyun_Rok_6: true
- Status: Colors_of_Hyun_Rok_5
Icon: EFST_COLORS_OF_HYUN_ROK_5
DurationLookup: SH_COLORS_OF_HYUN_ROK
EndOnStart:
Colors_of_Hyun_Rok_1: true
Colors_of_Hyun_Rok_2: true
Colors_of_Hyun_Rok_3: true
Colors_of_Hyun_Rok_4: true
Colors_of_Hyun_Rok_6: true
- Status: Colors_of_Hyun_Rok_6
Icon: EFST_COLORS_OF_HYUN_ROK_6
DurationLookup: SH_COLORS_OF_HYUN_ROK
EndOnStart:
Colors_of_Hyun_Rok_1: true
Colors_of_Hyun_Rok_2: true
Colors_of_Hyun_Rok_3: true
Colors_of_Hyun_Rok_4: true
Colors_of_Hyun_Rok_5: true
- Status: Blessing_of_M_Creatures
Icon: EFST_BLESSING_OF_M_CREATURES
DurationLookup: SH_BLESSING_OF_MYSTICAL_CREATURES
CalcFlags:
Patk: true
Smatk: true
- Status: Blessing_of_M_C_Debuff
Icon: EFST_BLESSING_OF_M_C_DEBUFF
DurationLookup: SH_BLESSING_OF_MYSTICAL_CREATURES

View File

@ -1250,6 +1250,11 @@ Adds a card or enchant to the specific slot of the equipment.
--------------------------------------- ---------------------------------------
@resetcooltime
/resetcooltime
Resets the cooldown of all skills of the player and if active also of the homunculus or the mercenary.
============================== ==============================
| 5. Administrative Commands | | 5. Administrative Commands |
============================== ==============================

View File

@ -474,3 +474,9 @@ Hides monster's HP bar on a map.
Ignores config value of 'monster_hp_bars_info'. Ignores config value of 'monster_hp_bars_info'.
--------------------------------------- ---------------------------------------
*specialpopup <popup ID>
Displays a special popup when a player enters the map. See script command "specialpopup" for details on different popup types.
---------------------------------------

View File

@ -6124,11 +6124,12 @@ will always return 0.
--------------------------------------- ---------------------------------------
*skilleffect <skill id>,<number>; *skilleffect <skill id>,<number>{,<game ID>};
*skilleffect "<skill name>",<number>; *skilleffect "<skill name>",<number>{,<game ID>};
This command displays visual and aural effects of given skill on currently This command displays visual and aural effects of given skill on currently
attached character. The number parameter is for skill whose visual effect attached character or, when defined, on any unit with the given ID.
The number parameter is for skill whose visual effect
involves displaying of a number (healing or damaging). Note, that this command involves displaying of a number (healing or damaging). Note, that this command
will not actually use the skill, it is intended for scripts, which simulate will not actually use the skill, it is intended for scripts, which simulate
skill usage by the NPC, such as buffs, by setting appropriate status and skill usage by the NPC, such as buffs, by setting appropriate status and
@ -8508,6 +8509,15 @@ Opens the tip box UI for the attached player or the given character ID.
This command requires packet version 2017-11-22 or newer. This command requires packet version 2017-11-22 or newer.
---------------------------------------
*specialpopup(<popup ID>);
Open popup and/or show text by ID from list defined in the client spopup.lub file.
Popup and text is only visible if the player warped from one map to another map.
This command requires packet version 2022-10-05 or newer.
--------------------------------------- ---------------------------------------
\\ \\
6,1.- Unit-related commands 6,1.- Unit-related commands
@ -10681,6 +10691,7 @@ current invoking character.
*addhomintimacy <amount>{,<char_id>}; *addhomintimacy <amount>{,<char_id>};
Increase or decrease a homunculus' intimacy value by the given <amount>. 100000 is full loyalty. Increase or decrease a homunculus' intimacy value by the given <amount>. 100000 is full loyalty.
Fails silently when no players are attached or if the player has no homunculus.
--------------------------------------- ---------------------------------------

View File

@ -254,6 +254,9 @@ Flags: Various status flags for specific status change events.
SuperNoviceAngel - Status that is given from Super Novice Angel. SuperNoviceAngel - Status that is given from Super Novice Angel.
TaekwonAngel - Status that is given from Taekwon 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. MinDuration: Minimum duration, in milliseconds, after reduction calculation for status resistance.

View File

@ -1001,17 +1001,23 @@ SC_FLING ()
desc: desc:
val1: val1:
SC_AVOID () SC_AVOID (EFST_HLIF_AVOID)
desc: desc: Increase walkspeed for Players and Homunculus
val1: val1: Skill Level
val2: Walkspeed increase (10 * val1 for Players, 40 * val1 for Homunculus)
SC_CHANGE () SC_CHANGE (EFST_HLIF_CHANGE)
desc: 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: val1: Skill Level
val2: VIT increase (20 * val1)
val3: INT increase (30 * val1)
SC_BLOODLUST () SC_BLOODLUST (EFST_HAMI_BLOODLUST)
desc: desc: Increase the homunculus ATK and has a chance to leech HP from the target
val1: val1: Skill Level
val2: ATK increase (20 + (10 * val1))
val3: Chance to leech HP (9 * val1)%
val4: Leeched HP percentage 20%
SC_FLEET () SC_FLEET ()
desc: desc:
@ -1021,10 +1027,10 @@ SC_SPEED ()
desc: desc:
val1: val1:
SC_DEFENCE () SC_DEFENCE (EFST_HAMI_DEFENCE)
desc: Increase Defense, HAMI_DEFENCE effect desc: Increase VIT and as result VIT-based DEF of the Player and plain VIT of the Homunculus
val1: (none) val1: Skill Level
val2: + Def(Pre-renewal) or VIT (Renewal) val2: VIT increase for players, DEF increase for homunculus (5 + (5 * val1)) [Renewal], (2 * val1) [Pre-Renewal]
SC_INCASPDRATE () SC_INCASPDRATE ()
desc: Increase ASPD desc: Increase ASPD

View File

@ -1,15 +1,9 @@
//===== rAthena Script ======================================= //===== rAthena Script =======================================
//= Assassin Job Quest //= Assassin Job Quest
//===== By: ==================================================
//= kobra_k88
//===== Current Version: =====================================
//= 3.7
//===== Compatible With: =====================================
//= rAthena Project
//===== Description: ========================================= //===== Description: =========================================
//= [Official Conversion] //= [Official Conversion]
//= Job Change quest for Assassin class. //= Job Change quest for Assassin class.
//===== Additional Comments: ================================= //===== Changelog: ===========================================
//= 1.0 Used some dialogue from the aegis Assassin script translated By: Pgro Team (OwNaGe) //= 1.0 Used some dialogue from the aegis Assassin script translated By: Pgro Team (OwNaGe)
//= Also converted the booby traps from the aegis script.[kobra_k88] //= Also converted the booby traps from the aegis script.[kobra_k88]
//= 1.1 Made adjustments to ontouch npcs to work with the new "ontouch" functionality. //= 1.1 Made adjustments to ontouch npcs to work with the new "ontouch" functionality.
@ -50,7 +44,7 @@
//= 3.5 Fixed the waitingroom where player can enter the Test Area without passing the written exam. Now player will not be warp inside the Test Area when did not passed the written exam instead the player will be warp back to the written exam entrance [JayPee] //= 3.5 Fixed the waitingroom where player can enter the Test Area without passing the written exam. Now player will not be warp inside the Test Area when did not passed the written exam instead the player will be warp back to the written exam entrance [JayPee]
//= 3.6 Fixed broken event calls. [Euphy] //= 3.6 Fixed broken event calls. [Euphy]
//= 3.7 Fixed issue that the player can't progress in the quest if timed out at weapon reward step. This issue is fixed on iRO but not on kRO. [https://forums.warpportal.com/index.php?/topic/130060-didnt-receive-necklace-of-oblivion-when-changing-assassin/#entry1496042] [MrAntares] //= 3.7 Fixed issue that the player can't progress in the quest if timed out at weapon reward step. This issue is fixed on iRO but not on kRO. [https://forums.warpportal.com/index.php?/topic/130060-didnt-receive-necklace-of-oblivion-when-changing-assassin/#entry1496042] [MrAntares]
//= 3.8 Another 'unofficial fix'. Player can't change job if time out after the necklace is deleted. //= 3.8 Another 'unofficial fix'. Player can't change job if time out after the necklace is deleted. [Atemo]
//============================================================ //============================================================
in_moc_16,19,33,1 script Guildsman#asn 55,{ in_moc_16,19,33,1 script Guildsman#asn 55,{
@ -86,7 +80,7 @@ in_moc_16,19,33,1 script Guildsman#asn 55,{
mes "Well then,"; mes "Well then,";
mes "go for it!"; mes "go for it!";
close2; close2;
set ASSIN_Q,0; ASSIN_Q = 0;
warp "in_moc_16",19,76; warp "in_moc_16",19,76;
end; end;
} }
@ -96,9 +90,10 @@ in_moc_16,19,33,1 script Guildsman#asn 55,{
mes "[Ferocious-looking guy]"; mes "[Ferocious-looking guy]";
mes "You'll have to walk if you want to get back to town. Oh, and don't forget to save your spawn point, alright?"; mes "You'll have to walk if you want to get back to town. Oh, and don't forget to save your spawn point, alright?";
close2; close2;
set ASSIN_Q,0; ASSIN_Q = 0;
set ASSIN_Q2,0; ASSIN_Q2 = 0;
set ASSIN_Q3,0; if (ASSIN_Q3 < 3)
ASSIN_Q3 = 0;
savepoint "in_moc_16",18,14,1,1; savepoint "in_moc_16",18,14,1,1;
warp "in_moc_16",18,14; warp "in_moc_16",18,14;
end; end;
@ -257,7 +252,7 @@ in_moc_16,19,33,1 script Guildsman#asn 55,{
mes "It's been a while since I've received a guest. I'm sending"; mes "It's been a while since I've received a guest. I'm sending";
mes "you to the office."; mes "you to the office.";
close2; close2;
set ASSIN_Q,0; ASSIN_Q = 0;
if (checkquest(8000) != -1) { if (checkquest(8000) != -1) {
changequest 8000,8001; changequest 8000,8001;
} else { } else {
@ -553,8 +548,9 @@ OnTouch_:
mes "Alright then,"; mes "Alright then,";
mes "best of luck to you!"; mes "best of luck to you!";
close2; close2;
set ASSIN_Q3,1; if (ASSIN_Q3 < 3)
set ASSIN_Q,1; ASSIN_Q3 = 1;
ASSIN_Q = 1;
changequest 8001,8002; changequest 8001,8002;
warp "in_moc_16",19,144; warp "in_moc_16",19,144;
end; end;
@ -576,8 +572,9 @@ OnTouch_:
mes "to the Test Hall."; mes "to the Test Hall.";
mes "Best of luck~"; mes "Best of luck~";
close2; close2;
set ASSIN_Q3,2; if (ASSIN_Q3 < 3)
set ASSIN_Q,1; ASSIN_Q3 = 2;
ASSIN_Q = 1;
changequest 8001,8002; changequest 8001,8002;
warp "in_moc_16",19,144; warp "in_moc_16",19,144;
end; end;
@ -602,9 +599,8 @@ OnTouch_:
mes "Eh, get outta here."; mes "Eh, get outta here.";
mes "Stop wastin' my time..."; mes "Stop wastin' my time...";
close2; close2;
set ASSIN_Q,0; ASSIN_Q = 0;
set ASSIN_Q3,0; ASSIN_Q2 = 0;
set ASSIN_Q2,0;
erasequest 8001; erasequest 8001;
warp "moc_fild16",206,229; warp "moc_fild16",206,229;
end; end;
@ -630,8 +626,9 @@ OnTouch_:
mes "[Assassin 'Khai']"; mes "[Assassin 'Khai']";
mes "Are you done filling out the form? Alright, give it to me so I can send you to the Test Hall. Good luck~"; mes "Are you done filling out the form? Alright, give it to me so I can send you to the Test Hall. Good luck~";
next; next;
set ASSIN_Q3,1; if (ASSIN_Q3 < 3)
set ASSIN_Q,1; ASSIN_Q3 = 1;
ASSIN_Q = 1;
changequest 8001,8002; changequest 8001,8002;
warp "in_moc_16",19,144; warp "in_moc_16",19,144;
end; end;
@ -644,8 +641,9 @@ OnTouch_:
mes "Then give me the form so that I can send you to the Test Hall, alright?"; mes "Then give me the form so that I can send you to the Test Hall, alright?";
mes "Good luck..."; mes "Good luck...";
next; next;
set ASSIN_Q3,2; if (ASSIN_Q3 < 3)
set ASSIN_Q,1; ASSIN_Q3 = 2;
ASSIN_Q = 1;
changequest 8001,8002; changequest 8001,8002;
warp "in_moc_16",19,144; warp "in_moc_16",19,144;
end; end;
@ -711,7 +709,7 @@ OnTouch_:
mes "Although I am heartless,"; mes "Although I am heartless,";
mes "I am not necessarily cruel. Before we proceed, is there anything you wish to know?"; mes "I am not necessarily cruel. Before we proceed, is there anything you wish to know?";
next; next;
set ASSIN_Q2,0; ASSIN_Q2 = 0;
while(ASSIN_Q2 < 3) { while(ASSIN_Q2 < 3) {
switch(select("...Skills?:...Stats?:Hmpf, I know it all.")) { switch(select("...Skills?:...Stats?:Hmpf, I know it all.")) {
case 1: case 1:
@ -774,7 +772,7 @@ OnTouch_:
mes "Now..."; mes "Now...";
mes "That's all I have to tell you"; mes "That's all I have to tell you";
mes "about Assassin skills."; mes "about Assassin skills.";
set ASSIN_Q2,1; ASSIN_Q2 = 1;
next; next;
break; break;
case 2: case 2:
@ -787,7 +785,7 @@ OnTouch_:
next; next;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "I cannot give you better advice than that in regards to Stats. You should research and see which stats suit you, and decide what kind of Assassin you want to be."; mes "I cannot give you better advice than that in regards to Stats. You should research and see which stats suit you, and decide what kind of Assassin you want to be.";
set ASSIN_Q2,2; ASSIN_Q2 = 2;
next; next;
break; break;
case 3: case 3:
@ -797,7 +795,7 @@ OnTouch_:
mes "I'll be the judge of that!"; mes "I'll be the judge of that!";
next; next;
} }
set ASSIN_Q2,3; ASSIN_Q2 = 3;
break; break;
} }
} }
@ -847,53 +845,53 @@ OnTouch_:
mes "1. Choose skill that is not required to learn Grimtooth."; mes "1. Choose skill that is not required to learn Grimtooth.";
next; next;
if (select("Cloaking level 2:Sonic Blow level 5:Katar Mastery level 4:Right hand Mastery level 2") == 4) if (select("Cloaking level 2:Sonic Blow level 5:Katar Mastery level 4:Right hand Mastery level 2") == 4)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "2. What property does Enchant Poison possess?"; mes "2. What property does Enchant Poison possess?";
next; next;
if (select("Poison:Earth:Fire:Wind") == 1) if (select("Poison:Earth:Fire:Wind") == 1)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "3. How does Level 4 Right Hand Mastery work?"; mes "3. How does Level 4 Right Hand Mastery work?";
next; next;
if (select("Recover 80% of damage decrease:Recover 90% of damage decrease:Increase 90% of damage:Increase 108% of damage") == 2) if (select("Recover 80% of damage decrease:Recover 90% of damage decrease:Increase 90% of damage:Increase 108% of damage") == 2)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "4. What is the item required for using Venom Dust?"; mes "4. What is the item required for using Venom Dust?";
next; next;
if (select("Red Blood:Blue Gemstone:Yellow Gemstone:Red Gemstone") == 4) if (select("Red Blood:Blue Gemstone:Yellow Gemstone:Red Gemstone") == 4)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "5. Which skill can you learn when you reach Level 5 Enchant Poison?"; mes "5. Which skill can you learn when you reach Level 5 Enchant Poison?";
next; next;
if (select("Envenom:Sonic Blow:Venom Splasher:Venom Dust") == 4) if (select("Envenom:Sonic Blow:Venom Splasher:Venom Dust") == 4)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "6. Among the following skills, which allows you to walk while invisible?"; mes "6. Among the following skills, which allows you to walk while invisible?";
next; next;
if (select("Hiding:Back Slide:Cloaking:Sand Attack") == 3) if (select("Hiding:Back Slide:Cloaking:Sand Attack") == 3)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "7. Choose the condition that is unrelated to Venom Splasher."; mes "7. Choose the condition that is unrelated to Venom Splasher.";
next; next;
if (select("Poisoned target.:Red Gemstone.:Remaing HP of Target.") == 2) if (select("Poisoned target.:Red Gemstone.:Remaing HP of Target.") == 2)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "8. Which monster is weak to a weapon with Vadon card (adds 20% damage on Fire property monster)?"; mes "8. Which monster is weak to a weapon with Vadon card (adds 20% damage on Fire property monster)?";
next; next;
if (select("Steel Chonchon:Deviruchi:Elder Willow:Baphomet") == 3) if (select("Steel Chonchon:Deviruchi:Elder Willow:Baphomet") == 3)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "9. How much SP does"; mes "9. How much SP does";
mes "Double Attack need?"; mes "Double Attack need?";
next; next;
if (select("15:It's a passive skill, so SP use is 0.:It's passive skill, so SP use is 10.:54") == 2) if (select("15:It's a passive skill, so SP use is 0.:It's passive skill, so SP use is 10.:54") == 2)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "10. What is the best elemental Main Gauche weapon for hunting in Izlude dungeon?"; mes "10. What is the best elemental Main Gauche weapon for hunting in Izlude dungeon?";
next; next;
if (select("Wind Main Gauche:Ice Main Gauche:Earth Main Gauche:Fire Main Gauche") == 1) if (select("Wind Main Gauche:Ice Main Gauche:Earth Main Gauche:Fire Main Gauche") == 1)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
break; break;
case 2: case 2:
mes "[The Anonymous One]"; mes "[The Anonymous One]";
@ -901,104 +899,104 @@ OnTouch_:
mes "drops a slotted Katar?"; mes "drops a slotted Katar?";
next; next;
if (select("Thief Bug:Peco Peco:Desert Wolf:Hammer Cobolt") == 3) if (select("Thief Bug:Peco Peco:Desert Wolf:Hammer Cobolt") == 3)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "2. Which monster"; mes "2. Which monster";
mes "drops a slotted Jur?"; mes "drops a slotted Jur?";
next; next;
if (select("Martin:Desert Wolf:Marionette:Myst") == 1) if (select("Martin:Desert Wolf:Marionette:Myst") == 1)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "3. Which class is allowed to craft elemental weapons?"; mes "3. Which class is allowed to craft elemental weapons?";
next; next;
if (select("Merchant:Blacksmith:Thief:Priest") == 2) if (select("Merchant:Blacksmith:Thief:Priest") == 2)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "4. Choose the weapon which is not in the Katar class."; mes "4. Choose the weapon which is not in the Katar class.";
next; next;
if (select("Jamadhar:Jur:Katar:Gladius") == 4) if (select("Jamadhar:Jur:Katar:Gladius") == 4)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "5. What property do Izlude dungeon monsters posses?"; mes "5. What property do Izlude dungeon monsters posses?";
next; next;
if (select("Water:Fire:Wind:Earth") == 1) if (select("Water:Fire:Wind:Earth") == 1)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "6. Which monster"; mes "6. Which monster";
mes "cannot be a Cute Pet?"; mes "cannot be a Cute Pet?";
next; next;
if (select("Poporing:Roda Frog:Smokie:Poison Spore") == 2) if (select("Poporing:Roda Frog:Smokie:Poison Spore") == 2)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "7. Choose a monster that Fire property Daggers work the best on."; mes "7. Choose a monster that Fire property Daggers work the best on.";
next; next;
if (select("Dagger Goblin:Mace Goblin:Morning Star Goblin:Hammer Goblin") == 4) if (select("Dagger Goblin:Mace Goblin:Morning Star Goblin:Hammer Goblin") == 4)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "8. Choose the non-elemental Katar from the following:"; mes "8. Choose the non-elemental Katar from the following:";
next; next;
if (select("Katar of Raging Blaze:Katar of Dusty Thornbush:Sharpened Legbone of Ghoul:Infiltrator") == 4) if (select("Katar of Raging Blaze:Katar of Dusty Thornbush:Sharpened Legbone of Ghoul:Infiltrator") == 4)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "9. Which is the uncommon monster?"; mes "9. Which is the uncommon monster?";
next; next;
if (select("Poring:Mastering:Ghostring:Spore") == 3) if (select("Poring:Mastering:Ghostring:Spore") == 3)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "10. Choose the monster"; mes "10. Choose the monster";
mes "that is not Undead."; mes "that is not Undead.";
next; next;
if (select("Drake:Megalodon:Spore:Khalitzburg") == 3) if (select("Drake:Megalodon:Spore:Khalitzburg") == 3)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
break; break;
case 3: case 3:
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "1. Choose the correct amount of the maximum dodge rate increase from the 'Increase Dodge' skill when at level 10."; mes "1. Choose the correct amount of the maximum dodge rate increase from the 'Increase Dodge' skill when at level 10.";
next; next;
if (select("30:40:160:20") == 1) if (select("30:40:160:20") == 1)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "2. Choose a monster which detects hiding/cloaking Thieves and Assassins."; mes "2. Choose a monster which detects hiding/cloaking Thieves and Assassins.";
next; next;
if (select("Worm Tail:Andre:Mummy:Soldier Skeleton") == 2) if (select("Worm Tail:Andre:Mummy:Soldier Skeleton") == 2)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "3. Choose a group of weapons that cannot be used by an Assassin at once."; mes "3. Choose a group of weapons that cannot be used by an Assassin at once.";
next; next;
if (select("Main Gaughe + Gladius:Stiletto + Main Gauche:Katar + Maingauche:Hammer + Stiletto") == 3) if (select("Main Gaughe + Gladius:Stiletto + Main Gauche:Katar + Maingauche:Hammer + Stiletto") == 3)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "4. Choose the town where Thieves can change their jobs."; mes "4. Choose the town where Thieves can change their jobs.";
next; next;
if (select("Prontera:Lutie:Alberta:Morocc") == 4) if (select("Prontera:Lutie:Alberta:Morocc") == 4)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "5. Choose a card that does not affect the AGI stat."; mes "5. Choose a card that does not affect the AGI stat.";
next; next;
if (select("Baphomet Jr. card:Whisper Card:Female Thiefbug card:Male Thiefbug card") == 2) if (select("Baphomet Jr. card:Whisper Card:Female Thiefbug card:Male Thiefbug card") == 2)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "6. Choose the correct specialty of the Assassin class."; mes "6. Choose the correct specialty of the Assassin class.";
next; next;
if (select("Excellent singing talent:Excellent reading talent:Excellent dancing talent:Excellent dodge ability") == 4) if (select("Excellent singing talent:Excellent reading talent:Excellent dancing talent:Excellent dodge ability") == 4)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "7. Choose the maximum AGI bonus an Assassin can get at job level 50."; mes "7. Choose the maximum AGI bonus an Assassin can get at job level 50.";
next; next;
if (select("7:8:9:10") == 4) if (select("7:8:9:10") == 4)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "8. Choose the item that an Assassin cannot equip."; mes "8. Choose the item that an Assassin cannot equip.";
next; next;
if (select("Dagger:Helm:Boots:Brooch") == 2) if (select("Dagger:Helm:Boots:Brooch") == 2)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
mes "9. Choose the job change item for Thief."; mes "9. Choose the job change item for Thief.";
next; next;
switch(select("Orange Gooey Mushroom:Red Gooey Mushroom:Orange Net Mushroom:Orange Hair Mushroom")) { switch(select("Orange Gooey Mushroom:Red Gooey Mushroom:Orange Net Mushroom:Orange Hair Mushroom")) {
case 1: case 1:
case 3: case 3:
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
break; break;
default: default:
break; break;
@ -1007,7 +1005,7 @@ OnTouch_:
mes "10. Choose a card that would typically benefit an Assassin the least."; mes "10. Choose a card that would typically benefit an Assassin the least.";
next; next;
if (select("Whisper card:Elder Willow card:Soldier Skeleton card:Cobold card") == 2) if (select("Whisper card:Elder Willow card:Soldier Skeleton card:Cobold card") == 2)
set .@assassin_t,.@assassin_t+10; .@assassin_t += 10;
break; break;
} }
if (ASSIN_Q2 == 3) { if (ASSIN_Q2 == 3) {
@ -1023,7 +1021,7 @@ OnTouch_:
mes "You scored"; mes "You scored";
mes "" + .@assassin_t + " percent..."; mes "" + .@assassin_t + " percent...";
if (.@assassin_t > 80) { if (.@assassin_t > 80) {
set ASSIN_Q2,5; ASSIN_Q2 = 5;
changequest 8002,8003; changequest 8002,8003;
mes "Well done."; mes "Well done.";
mes "You pass."; mes "You pass.";
@ -1033,7 +1031,7 @@ OnTouch_:
close; close;
} }
else { else {
set ASSIN_Q2,4; ASSIN_Q2 = 4;
mes "That means you fail!"; mes "That means you fail!";
next; next;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
@ -1060,7 +1058,7 @@ OnTouch_:
mes "You scored"; mes "You scored";
mes "" + .@assassin_t + " points..."; mes "" + .@assassin_t + " points...";
if (.@assassin_t > 80) { if (.@assassin_t > 80) {
set ASSIN_Q2,5; ASSIN_Q2 = 5;
changequest 8002,8003; changequest 8002,8003;
next; next;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
@ -1068,7 +1066,7 @@ OnTouch_:
close; close;
} }
else { else {
set ASSIN_Q2,4; ASSIN_Q2 = 4;
mes "You failed!"; mes "You failed!";
next; next;
mes "[The Anonymous One]"; mes "[The Anonymous One]";
@ -1194,9 +1192,8 @@ OnTouch_:
mes "I guess you"; mes "I guess you";
mes "could use a break..."; mes "could use a break...";
close2; close2;
set ASSIN_Q,0; ASSIN_Q = 0;
set ASSIN_Q3,0; ASSIN_Q2 = 0;
set ASSIN_Q2,0;
changequest 8003,8000; changequest 8003,8000;
warp "in_moc_16",19,13; warp "in_moc_16",19,13;
end; end;
@ -1207,7 +1204,7 @@ in_moc_16,1,1,0 script Beholder#ASNTEST -1,{
end; end;
OnEnable: OnEnable:
set .MyMobs,6; .MyMobs = 6;
// Target mobs // Target mobs
monster "in_moc_16",62,161,"Job change target",1002,1,"Beholder#ASNTEST::OnMyMobDead"; monster "in_moc_16",62,161,"Job change target",1002,1,"Beholder#ASNTEST::OnMyMobDead";
monster "in_moc_16",85,169,"Job change target",1063,1,"Beholder#ASNTEST::OnMyMobDead"; monster "in_moc_16",85,169,"Job change target",1063,1,"Beholder#ASNTEST::OnMyMobDead";
@ -1267,15 +1264,15 @@ OnResetmob:
end; end;
OnMyMobDead: OnMyMobDead:
set .MyMobs,.MyMobs-1; .MyMobs--;
if (.MyMobs < 1) { if (.MyMobs < 1) {
mapannounce "in_moc_16","You seem to be doing quite well. Keep it up!",bc_map; mapannounce "in_moc_16","You seem to be doing quite well. Keep it up!",bc_map;
set ASSIN_Q,3; ASSIN_Q = 3;
changequest 8003,8004; changequest 8003,8004;
donpcevent "timestopper#1::OnEnable"; donpcevent "timestopper#1::OnEnable";
donpcevent "Keeper of the Door#ASN::OnEnable"; donpcevent "Keeper of the Door#ASN::OnEnable";
donpcevent "Beholder#ASNTEST::OnResetmob"; donpcevent "Beholder#ASNTEST::OnResetmob";
set .DisableTraps,1; .DisableTraps = 1;
stopnpctimer; stopnpctimer;
} }
else { else {
@ -1285,7 +1282,7 @@ OnMyMobDead:
OnMyMobDead2: OnMyMobDead2:
mapannounce "in_moc_16",strcharinfo(0) + "! You made a mistake! I'm bringing you back!",bc_map; mapannounce "in_moc_16",strcharinfo(0) + "! You made a mistake! I'm bringing you back!",bc_map;
set ASSIN_Q,2; ASSIN_Q = 2;
warp "in_moc_16",19,161; warp "in_moc_16",19,161;
donpcevent "Beholder#ASNTEST::OnReset"; donpcevent "Beholder#ASNTEST::OnReset";
end; end;
@ -1341,7 +1338,7 @@ OnTimer184000:
OnTimer185000: OnTimer185000:
mapannounce "in_moc_16","Time's up!",bc_map; mapannounce "in_moc_16","Time's up!",bc_map;
mapannounce "in_moc_16","Well, good job... If you wanted to waste your time. You'll have to try again!",bc_map; mapannounce "in_moc_16","Well, good job... If you wanted to waste your time. You'll have to try again!",bc_map;
//set ASSIN_Q,2; //ASSIN_Q = 2;
end; end;
OnTimer186000: OnTimer186000:
@ -1357,7 +1354,7 @@ in_moc_16,68,158,0 script 01_1::SinTrap -1,0,0,{
OnTouch_: OnTouch_:
if (getvariableofnpc(.DisableTraps,"Beholder#ASNTEST") < 1) { if (getvariableofnpc(.DisableTraps,"Beholder#ASNTEST") < 1) {
mapannounce "in_moc_16",strcharinfo(0) + ", you're trapped. You will be sent back.",bc_map; mapannounce "in_moc_16",strcharinfo(0) + ", you're trapped. You will be sent back.",bc_map;
set ASSIN_Q,2; ASSIN_Q = 2;
warp "in_moc_16",19,161; warp "in_moc_16",19,161;
donpcevent "Beholder#ASNTEST::OnResetmob"; donpcevent "Beholder#ASNTEST::OnResetmob";
donpcevent "Standby Room#ASNTEST::OnStart"; donpcevent "Standby Room#ASNTEST::OnStart";
@ -1457,9 +1454,9 @@ OnInit:
OnTouch_: OnTouch_:
donpcevent "Thomas#ASNTEST::OnDisable"; donpcevent "Thomas#ASNTEST::OnDisable";
if (ASSIN_Q == 3) if (ASSIN_Q == 3)
set ASSIN_Q,3; ASSIN_Q = 3;
else else
set ASSIN_Q,4; ASSIN_Q = 4;
warp "in_moc_16",87,102; warp "in_moc_16",87,102;
savepoint "in_moc_16",16,13,1,1; savepoint "in_moc_16",16,13,1,1;
end; end;
@ -1491,9 +1488,9 @@ OnDisable:
OnMyMobDead: OnMyMobDead:
mapannounce "in_moc_16","Hey, what the hell was that?! I told you: No killing monsters!",bc_map; mapannounce "in_moc_16","Hey, what the hell was that?! I told you: No killing monsters!",bc_map;
mapannounce "in_moc_16","I'm bringing you back... *Sigh...*",bc_map; mapannounce "in_moc_16","I'm bringing you back... *Sigh...*",bc_map;
set ASSIN_Q,3; ASSIN_Q = 3;
warp "in_moc_16",87,102; warp "in_moc_16",87,102;
killmonsterall "in_moc_16"; killmonster "in_moc_16","timestopper#1::OnMyMobDead";
end; end;
} }
@ -1525,9 +1522,8 @@ OnTouch_:
mes "Oh hey, don't forget to save your respawn point in town."; mes "Oh hey, don't forget to save your respawn point in town.";
close2; close2;
mapannounce "in_moc_16",strcharinfo(0) + " got scared and quit the test...Who's Next?!",bc_map; mapannounce "in_moc_16",strcharinfo(0) + " got scared and quit the test...Who's Next?!",bc_map;
set ASSIN_Q,0; ASSIN_Q = 0;
set ASSIN_Q2,0; ASSIN_Q2 = 0;
set ASSIN_Q3,0;
changequest 8004,8000; changequest 8004,8000;
savepoint "in_moc_16",18,14,1,1; savepoint "in_moc_16",18,14,1,1;
warp "in_moc_16",18,14; warp "in_moc_16",18,14;
@ -1548,7 +1544,7 @@ OnTouch_:
mes "[Thomas]"; mes "[Thomas]";
mes "If you run away, get a nose bleed and pass out or something like that, I'll fail ya'. Enough talk. Let's see what you got."; mes "If you run away, get a nose bleed and pass out or something like that, I'll fail ya'. Enough talk. Let's see what you got.";
close2; close2;
set ASSIN_Q,4; ASSIN_Q = 4;
monster "in_moc_16",81,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead"; monster "in_moc_16",81,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead";
monster "in_moc_16",82,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead"; monster "in_moc_16",82,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead";
@ -1583,7 +1579,7 @@ OnTouch_:
OnDisable: OnDisable:
donpcevent "Standby Room#ASNTEST::OnStart"; donpcevent "Standby Room#ASNTEST::OnStart";
killmonsterall "in_moc_16"; killmonster "in_moc_16","timestopper#1::OnMyMobDead";
end; end;
} }
@ -1596,7 +1592,7 @@ OnTouch_:
mes "Oh! Congratulations!"; mes "Oh! Congratulations!";
mes "You may now proceed to our Guildmaster's room. Good luck!!"; mes "You may now proceed to our Guildmaster's room. Good luck!!";
close2; close2;
set ASSIN_Q,5; ASSIN_Q = 5;
changequest 8004,8005; changequest 8004,8005;
warp "in_moc_16",181,183; warp "in_moc_16",181,183;
end; end;
@ -1606,7 +1602,7 @@ in_moc_16,182,169,0 script Maze Assistant 45,1,1,{
OnTouch_: OnTouch_:
if (ASSIN_Q == 5 || ASSIN_Q == 6) { if (ASSIN_Q == 5 || ASSIN_Q == 6) {
warp "in_moc_16",181,183; warp "in_moc_16",181,183;
set ASSIN_Q,ASSIN_Q+1; ASSIN_Q++;
if (!isbegin_quest(8006)) if (!isbegin_quest(8006))
changequest 8005,8006; changequest 8005,8006;
} }
@ -1648,7 +1644,7 @@ OnTouch_:
else else
savepoint "moc_ruins",79,99,1,1; savepoint "moc_ruins",79,99,1,1;
if (ASSIN_Q == 7 && BaseJob == Job_Thief) { if (ASSIN_Q == 7 && BaseJob == Job_Thief) {
set ASSIN_Q,8; ASSIN_Q = 8;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Welcome."; mes "Welcome.";
mes "I apologize for"; mes "I apologize for";
@ -1682,7 +1678,6 @@ OnTouch_:
next; next;
switch(select("Revenge...!:Money~:I want to travel.")) { switch(select("Revenge...!:Money~:I want to travel.")) {
case 1: case 1:
set ASSIN_Q,8;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Revenge...?"; mes "Revenge...?";
mes "Yes, I understand. All of us hold grudges against someone else eventually."; mes "Yes, I understand. All of us hold grudges against someone else eventually.";
@ -1696,7 +1691,7 @@ OnTouch_:
next; next;
break; break;
case 2: case 2:
set ASSIN_Q,9; ASSIN_Q = 9;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Financial reasons...? I won't deny that we all need money to live. But being Assassin means living for a higher purpose."; mes "Financial reasons...? I won't deny that we all need money to live. But being Assassin means living for a higher purpose.";
next; next;
@ -1707,7 +1702,7 @@ OnTouch_:
next; next;
break; break;
case 3: case 3:
set ASSIN_Q,10; ASSIN_Q = 10;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Good idea. Traveling around the world will allow you to broaden your experiences."; mes "Good idea. Traveling around the world will allow you to broaden your experiences.";
next; next;
@ -1736,7 +1731,7 @@ OnTouch_:
next; next;
switch(select("I like the solitude.:Making money being an Assassin.:They just look interesting.")) { switch(select("I like the solitude.:Making money being an Assassin.:They just look interesting.")) {
case 1: case 1:
set ASSIN_Q,11; ASSIN_Q = 11;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "You got the point..."; mes "You got the point...";
mes "We are lonely. We will always be alone, even amongst each other..."; mes "We are lonely. We will always be alone, even amongst each other...";
@ -1751,13 +1746,13 @@ OnTouch_:
next; next;
break; break;
case 2: case 2:
set ASSIN_Q,12; ASSIN_Q = 12;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Well, I can't deny it, we do need money to make a living. But don't you think we should pursue something even more important than money?"; mes "Well, I can't deny it, we do need money to make a living. But don't you think we should pursue something even more important than money?";
next; next;
break; break;
case 3: case 3:
set ASSIN_Q,13; ASSIN_Q = 13;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Style and appearance is only superficial. It is sad that many people think this way..."; mes "Style and appearance is only superficial. It is sad that many people think this way...";
next; next;
@ -1782,7 +1777,7 @@ OnTouch_:
next; next;
switch(select("To broaden my skills.:It's a goal of mine.:For spiritual improvement.")) { switch(select("To broaden my skills.:It's a goal of mine.:For spiritual improvement.")) {
case 1: case 1:
set ASSIN_Q,14; ASSIN_Q = 14;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Learning skills comes naturally with the Assassin job. But don't think of skills as the best value of your training."; mes "Learning skills comes naturally with the Assassin job. But don't think of skills as the best value of your training.";
next; next;
@ -1791,7 +1786,7 @@ OnTouch_:
next; next;
break; break;
case 2: case 2:
set ASSIN_Q,15; ASSIN_Q = 15;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "It's a goal of yours, eh? Well, I guess you've got to have goals..."; mes "It's a goal of yours, eh? Well, I guess you've got to have goals...";
next; next;
@ -1805,7 +1800,7 @@ OnTouch_:
next; next;
break; break;
case 3: case 3:
set ASSIN_Q,16; ASSIN_Q = 16;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Good idea..."; mes "Good idea...";
mes "That is a good way to improve yourself. I've seen many people who know how to be strong physically but not in their mental state."; mes "That is a good way to improve yourself. I've seen many people who know how to be strong physically but not in their mental state.";
@ -1837,14 +1832,14 @@ OnTouch_:
next; next;
switch(select("I would level up fast.:I want to explore my Assassin skills.:I will go where I couldn't go as a Thief.")) { switch(select("I would level up fast.:I want to explore my Assassin skills.:I will go where I couldn't go as a Thief.")) {
case 1: case 1:
set .@assassin_sangdam,.@assassin_sangdam+10; .@assassin_sangdam += 10;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Don't act recklessly..."; mes "Don't act recklessly...";
mes "Being an Assassin never makes you a different person. And don't rely on chance."; mes "Being an Assassin never makes you a different person. And don't rely on chance.";
next; next;
break; break;
case 2: case 2:
set .@assassin_sangdam,.@assassin_sangdam+5; .@assassin_sangdam += 5;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "It is good for one to examine oneself. I can understand that you will be excited by the great change in your ability."; mes "It is good for one to examine oneself. I can understand that you will be excited by the great change in your ability.";
next; next;
@ -1871,14 +1866,14 @@ OnTouch_:
next; next;
switch(select("My friends.:My Guildsmen.:My lover.")) { switch(select("My friends.:My Guildsmen.:My lover.")) {
case 1: case 1:
set .@assassin_sangdam,.@assassin_sangdam+5; .@assassin_sangdam += 5;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "I see..."; mes "I see...";
mes "Appreciate them for caring about you, even when you're alone."; mes "Appreciate them for caring about you, even when you're alone.";
next; next;
break; break;
case 2: case 2:
set .@assassin_sangdam,.@assassin_sangdam+5; .@assassin_sangdam += 5;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Great..."; mes "Great...";
mes "Comrades for whom you would die for..."; mes "Comrades for whom you would die for...";
@ -1909,7 +1904,7 @@ OnTouch_:
next; next;
switch(select("Places where Assassins can level up...:Main goals as an Assassin.:Financial consulting.")) { switch(select("Places where Assassins can level up...:Main goals as an Assassin.:Financial consulting.")) {
case 1: case 1:
set .@assassin_sangdam,.@assassin_sangdam+5; .@assassin_sangdam += 5;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "It all depends on your mind. Any place could be the best to level up according to your mind state."; mes "It all depends on your mind. Any place could be the best to level up according to your mind state.";
next; next;
@ -1927,7 +1922,7 @@ OnTouch_:
next; next;
break; break;
case 3: case 3:
set .@assassin_sangdam,.@assassin_sangdam+10; .@assassin_sangdam += 10;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Oh my lord..."; mes "Oh my lord...";
mes "Are you planning to become an Assassin in order to make money?"; mes "Are you planning to become an Assassin in order to make money?";
@ -1979,7 +1974,7 @@ OnTouch_:
mes "supports you. How"; mes "supports you. How";
mes "about you, Huey?"; mes "about you, Huey?";
next; next;
if (ASSIN_Q3 == 1) { if (ASSIN_Q3 == 1) { // player Job Level was above 48
mes "[Huey]"; mes "[Huey]";
mes "A rarity."; mes "A rarity.";
mes "You can tell"; mes "You can tell";
@ -1989,7 +1984,7 @@ OnTouch_:
mes "I agree with"; mes "I agree with";
mes "the Anonymous One."; mes "the Anonymous One.";
} }
else { else { // player Job Level was below 48
mes "[Huey]"; mes "[Huey]";
mes "Although "+ strcharinfo(0) +" looks too mellow and gentle, kind of like a pussycat, "+ strcharinfo(0) +" has the stuff."; mes "Although "+ strcharinfo(0) +" looks too mellow and gentle, kind of like a pussycat, "+ strcharinfo(0) +" has the stuff.";
next; next;
@ -2064,7 +2059,8 @@ OnTouch_:
mes "I believe you stand out amongst them..."; mes "I believe you stand out amongst them...";
next; next;
} }
if (ASSIN_Q3 == 1 && BaseJob == Job_Thief && ASSIN_Q > 6 && ASSIN_Q < 17) { switch(ASSIN_Q3) {
case 1: // player Job Level was above 48
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Well, I've said too much. Please choose a weapon as a present."; mes "Well, I've said too much. Please choose a weapon as a present.";
next; next;
@ -2098,10 +2094,10 @@ OnTouch_:
mes "It used to rule over the Assassin weapon market. Please take care of my gladius."; mes "It used to rule over the Assassin weapon market. Please take care of my gladius.";
getitem 1220,1; //Gladius_ getitem 1220,1; //Gladius_
} }
ASSIN_Q3 = 2; ASSIN_Q3 = 3;
next; next;
} break;
else if (ASSIN_Q3 != 2) { case 2: // player Job Level was below 48
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Well, I talked too much."; mes "Well, I talked too much.";
mes "Please take this first."; mes "Please take this first.";
@ -2122,7 +2118,7 @@ OnTouch_:
case 5: case 5:
getitem 1252,1; //Katar getitem 1252,1; //Katar
} }
ASSIN_Q3 = 2; ASSIN_Q3 = 3;
} }
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "Well, I am giving you a token. Please return to the Assassin expert, the Ferocious-Looking Huey, at the entrance."; mes "Well, I am giving you a token. Please return to the Assassin expert, the Ferocious-Looking Huey, at the entrance.";
@ -2165,7 +2161,7 @@ OnTouch_:
end; end;
} }
else if (ASSIN_Q > 7 && ASSIN_Q < 17) { else if (ASSIN_Q > 7 && ASSIN_Q < 17) {
set ASSIN_Q,7; ASSIN_Q = 7;
mes "[Guildmaster]"; mes "[Guildmaster]";
mes "What the hell? You pressed 'Cancel' during the process. Do you want to change your job or what?"; mes "What the hell? You pressed 'Cancel' during the process. Do you want to change your job or what?";
next; next;

View File

@ -136,7 +136,7 @@ prt_in,243,168,4 script Jovovich 91,{
mes "* Fees and Information *"; mes "* Fees and Information *";
mes "- 1 Dyestuffs item of the color of hair you want."; mes "- 1 Dyestuffs item of the color of hair you want.";
mes "- 1000 zeny fee."; mes "- 1000 zeny fee.";
break; close;
case 3: case 3:
mes "[Hairdresser Jovovich]"; mes "[Hairdresser Jovovich]";

View File

@ -2,34 +2,35 @@
//= Instance: The Maze of Oz. //= Instance: The Maze of Oz.
//===== Description: ========================================= //===== Description: =========================================
//- [Walkthrough conversion] //- [Walkthrough conversion]
//- Part of the episode 18.1 main quest. //- Part of the Episode 18 main quest.
//===== Changelogs: ========================================== //===== Changelogs: ==========================================
//= 1.0 First version. [Capuche] //= 1.0 First version. [Capuche]
//============================================================ //============================================================
// Main Quest: Step 28. // Main Quest: Step 28.
ra_fild10,179,176,5 script Merchant#ep18_gorge 4_EP18_MERCHANT,{ ra_fild10,179,176,5 script Merchant#ep18_gorge 4_EP18_MERCHANT,{
.@md_name$ = "The Maze of Oz"; .@md_name$ = "Oz Labyrinth";
if (ep18_1_main == 29) { if (ep18_main == 29) {
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "From now on <FONT SIZE = 14><B>^e5555e" + .@md_name$ + "^000000</FONT></B>"; mes "We are now entering the <FONT SIZE = 14><B>^e5555eMaze of Oz^000000</FONT></B>.";
mes "^e5555ePrepare yourself and talk to me again^000000"; mes "^e5555ePlease finish your preparations^000000 and come back to me.";
cutin "ep18_merchant.png",2; cutin "ep18_merchant.png",2;
changequest 11717,11719; erasequest 11717;
ep18_1_main = 30; setquest 11719;
ep18_main = 30;
close3; close3;
} }
if (ep18_1_main == 30) { if (ep18_main == 30) {
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "Then I'll start the ^e5555e" + .@md_name$ + "^000000"; mes "Then let's head to ^e5555e" + .@md_name$ + "^000000";
next; next;
if (getcharid(1) == 0 || is_party_leader() == false) { if (getcharid(1) == 0 || is_party_leader() == false) {
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "I think it would be a good idea to form a ^ff0000party before enter ^000000.."; mes "I think it would be a good idea to form a ^ff0000party before enter^000000..";
close; close;
} }
switch( select( "Open the door", "Enter", "Stop" ) ) { switch( select( "Open the door.", "Enter.", "Quit." ) ) {
case 1: case 1:
if (instance_create(.@md_name$) < 0) { if (instance_create(.@md_name$) < 0) {
mes "Party: " + getpartyname(getcharid(1)) + ""; mes "Party: " + getpartyname(getcharid(1)) + "";
@ -37,21 +38,21 @@ ra_fild10,179,176,5 script Merchant#ep18_gorge 4_EP18_MERCHANT,{
mes "^0000ff" + .@md_name$ + " ^000000- Unknown error"; mes "^0000ff" + .@md_name$ + " ^000000- Unknown error";
close; close;
} }
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "You'd better wait a little before you go in."; mes "It's better to wait a bit before entering.";
close; close;
case 2: case 2:
switch( instance_enter(.@md_name$) ) { switch( instance_enter(.@md_name$) ) {
case IE_OTHER: case IE_OTHER:
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "^ff0000An unknown error occurred.^000000"; mes "^ff0000An unknown error occurred.^000000";
close; close;
case IE_NOINSTANCE: case IE_NOINSTANCE:
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "^ff0000Your party leader has not yet created the dungeon.^000000"; mes "Let's wait a bit and try again.";
close; close;
case IE_NOMEMBER: case IE_NOMEMBER:
mes "[Miriam in disguise]"; mes "[Disguised Miriam]";
mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000"; mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000";
close; close;
case IE_OK: case IE_OK:
@ -62,24 +63,25 @@ ra_fild10,179,176,5 script Merchant#ep18_gorge 4_EP18_MERCHANT,{
end; end;
} }
} }
mes "[Merchant]";
mes "It seems like someone was nearby but disappeared quickly.";
mes "Where did they go?";
cutin "ep18_merchant.png",2; cutin "ep18_merchant.png",2;
mes "[Vendor]";
mes "Someone must have been around here, but they just disappeared. Where did they go?";
close3; close3;
OnInit: OnInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(11717) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(11717) == 1" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(11719) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(11719) == 1" );
end; end;
} }
// Step 1 // Step 1
1@oz,284,164,3 script Rope#outoz 4_ROPEPILE,{ 1@oz,284,164,3 script Rope#outoz 4_ROPEPILE,{
mes "I think I can climb up with a rope."; mes "I think we can use the rope to climb up.";
next; next;
if (select( "Use a rope to climb", "Do not use" ) == 2) if (select( "Use the rope to climb up.", "Do not use." ) == 2)
end; end;
warp "ra_fild10",180,174; warp "ra_fild10",173,176;
end; end;
} }
@ -88,64 +90,64 @@ OnInit:
end; end;
'event_oz = 1; 'event_oz = 1;
.@miriam1$ = instance_npcname("Miriam#ozmd1"); .@miriam1$ = instance_npcname("Miriam#ozmd1");
.@maggi1$ = instance_npcname("Magi#ozmd1"); .@maggi1$ = instance_npcname("Maggi#ozmd1");
.@mark1$ = instance_npcname("Mark#ozmd1"); .@mark1$ = instance_npcname("Mark#ozmd1");
.@tamarin1$ = instance_npcname("Tamarin#ozmd1"); .@tamarin1$ = instance_npcname("Tamarin#ozmd1");
.@miriam2$ = instance_npcname("Miriam#ozmd2"); .@miriam2$ = instance_npcname("Miriam#ozmd2");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
npctalk "Miriam: This is the entrance to the labyrinth of Oz.", .@miriam1$; npctalk "Miriam: This is the entrance to the Labyrinth of Oz.", .@miriam1$;
cutin "ep18_miriam_03.png",2; cutin "ep18_miriam_03.png",2;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Everyone, please move carefully.", .@miriam1$; npctalk "Miriam: Everyone, please move carefully.", .@miriam1$;
sleep2 2000; sleep2 2000;
npctalk "Magi: Something hot and dusty...", .@maggi1$; npctalk "Magi: Something hot and dusty...", .@maggi1$;
cutin "4job_maggi_02.PNG",2; cutin "4job_maggi_02.PNG",2;
enablenpc .@maggi1$; cloakoffnpcself( .@maggi1$ );
enablenpc .@mark1$; cloakoffnpcself( .@mark1$ );
enablenpc .@tamarin1$; cloakoffnpcself( .@tamarin1$ );
sleep2 2000; sleep2 2000;
npctalk "Mark: Are you okay?", .@mark1$; npctalk "Mark: Are you okay?", .@mark1$;
cutin "ep18_mark_01.png",2; cutin "ep18_mark_01.png",2;
sleep2 2000; sleep2 2000;
npctalk "Miriam: There is lava flowing right below it, always scattering ashes.", .@miriam1$; npctalk "Miriam: Lava is flowing right below, so ash is always flying.", .@miriam1$;
cutin "ep18_miriam_03.png",2; cutin "ep18_miriam_03.png",2;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Beware there may be embers in the lava ash.", .@miriam1$; npctalk "Miriam: There may be embers left in the lava ash, so please be careful.", .@miriam1$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: If you inhale incorrectly, you will burn your lungs.", .@miriam1$; npctalk "Miriam: If you inhale it incorrectly, it will burn your lungs.", .@miriam1$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: There don't seem to be any monsters around here, so it's better to move slowly and check the situation again.", .@miriam1$; npctalk "Miriam: There don't seem to be any monsters around here, so it would be better to move slowly and check the situation again.", .@miriam1$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Please follow the road to the north first.", .@miriam1$; npctalk "Miriam: First, please follow the road to the north.", .@miriam1$;
sleep2 2000; sleep2 2000;
cutin "",255; cutin "",255;
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
disablenpc .@maggi1$; cloakonnpcself( .@maggi1$ );
disablenpc .@mark1$; cloakonnpcself( .@mark1$ );
disablenpc .@tamarin1$; cloakonnpcself( .@tamarin1$ );
disablenpc .@miriam1$; disablenpc .@miriam1$;
enablenpc .@miriam2$; enablenpc .@miriam2$;
end; end;
} }
1@oz,279,175,5 duplicate(dummy_npc) Magi#ozmd1 4_4JOB_MAGGI 1@oz,279,175,5 duplicate(dummy_cloaked_npc) Maggi#ozmd1 4_4JOB_MAGGI
1@oz,280,175,3 duplicate(dummy_npc) Mark#ozmd1 4_EP18_MARK 1@oz,280,175,3 duplicate(dummy_cloaked_npc) Mark#ozmd1 4_EP18_MARK
1@oz,279,177,3 duplicate(dummy_npc) Tamarin#ozmd1 4_EP18_TAMARIN 1@oz,279,177,3 duplicate(dummy_cloaked_npc) Tamarin#ozmd1 4_EP18_TAMARIN
// Step 2 // Step 2
1@oz,271,272,3 script Miriam#ozmd2 4_EP18_MIRIAM,{ 1@oz,271,272,3 script(DISABLED) Miriam#ozmd2 4_EP18_MIRIAM,{
if ('event_oz != 1) if ('event_oz != 1)
end; end;
'event_oz = 2; 'event_oz = 2;
.@miriam2$ = instance_npcname("Miriam#ozmd2"); .@miriam2$ = instance_npcname("Miriam#ozmd2");
'miriam3$ = instance_npcname("Miriam#ozmd3"); 'miriam3$ = instance_npcname("Miriam#ozmd3");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
npctalk "Miriam: If you cross the bridge in front of you, it's a real maze.", .@miriam2$; npctalk "Miriam: If you cross the bridge in front of you, it's the real Maze of Oz.", .@miriam2$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: We must be very careful crossing the bridge, let's talk again after.", .@miriam2$; npctalk "Miriam: You have to be very careful when crossing the bridge, so let's talk again at the bridge.", .@miriam2$;
sleep2 2000; sleep2 2000;
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
disablenpc .@miriam2$; disablenpc .@miriam2$;
@ -153,69 +155,43 @@ OnInit:
end; end;
OnInstanceInit: OnInstanceInit:
'miriam3_id = 0;
'event_oz = 0; 'event_oz = 0;
'map_name$ = instance_mapname("1@oz"); 'map_name$ = instance_mapname("1@oz");
disablenpc instance_npcname("Miriam#ozmd2");
disablenpc instance_npcname("Miriam#ozmd3");
disablenpc instance_npcname("Miriam#ozmd4");
disablenpc instance_npcname("Maram#ozmd5");
disablenpc instance_npcname("Miriam#ozmd5");
disablenpc instance_npcname("Maram#ozmd7");
disablenpc instance_npcname("#oz_way");
disablenpc instance_npcname("Maram#ozmd6");
disablenpc instance_npcname("Magi#ozmd1");
disablenpc instance_npcname("Mark#ozmd1");
disablenpc instance_npcname("Tamarin#ozmd1");
disablenpc instance_npcname("Magi#ozmd3");
disablenpc instance_npcname("Mark#ozmd3");
disablenpc instance_npcname("Tamarin#ozmd3");
disablenpc instance_npcname("Maram#ozmd4");
disablenpc instance_npcname("Magi#ozmd5");
disablenpc instance_npcname("Mark#ozmd5");
disablenpc instance_npcname("Tamarin#ozmd5");
disablenpc instance_npcname("Maram#ozmd8");
disablenpc instance_npcname("Magi#ozmd6");
disablenpc instance_npcname("Mark#ozmd6");
disablenpc instance_npcname("Tamarin#ozmd6");
disablenpc instance_npcname("Miriam#ozmd7");
disablenpc instance_npcname("Imril#ozmd7");
end; end;
} }
// Step 3 // Step 3
1@oz,241,272,3 script Miriam#ozmd3 EP18_NPC_MIRIAM,{ 1@oz,241,272,3 script(DISABLED) Miriam#ozmd3 EP18_NPC_MIRIAM,{
if ('event_oz != 2) if ('event_oz != 2)
end; end;
'event_oz = 3; 'event_oz = 3;
'miriam3$ = instance_npcname("Miriam#ozmd3"); .@maggi3$ = instance_npcname("Maggi#ozmd3");
.@maggi3$ = instance_npcname("Magi#ozmd3");
.@mark3$ = instance_npcname("Mark#ozmd3"); .@mark3$ = instance_npcname("Mark#ozmd3");
.@tamarin3$ = instance_npcname("Tamarin#ozmd3"); .@tamarin3$ = instance_npcname("Tamarin#ozmd3");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
npctalk "Miriam: This bridge is dangerous, so it's best to split your luggage and cross in turn.", 'miriam3$; npctalk "Miriam: This bridge is dangerous, so it would be better to share the luggage and cross it one at a time.", 'miriam3$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Then I will cross first, so please follow slowly. It will help not to look under your feet.", 'miriam3$; npctalk "Miriam: Then, I will cross first, so please follow me slowly. It will be helpful not to look under your feet.", 'miriam3$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: Wow I can't see the bottom.", .@tamarin3$; npctalk "Tamarin: Wow... I can't see the bottom.", .@tamarin3$;
enablenpc .@maggi3$; cloakoffnpcself( .@maggi3$ );
enablenpc .@mark3$; cloakoffnpcself( .@mark3$ );
enablenpc .@tamarin3$; cloakoffnpcself( .@tamarin3$ );
sleep2 2000; sleep2 2000;
npctalk "Magi: Your legs look very old...", .@maggi3$; npctalk "Magi: My legs look really worn out...", .@maggi3$;
sleep2 2000; sleep2 2000;
npctalk "Mark: Everyone be careful", .@mark3$; npctalk "Mark: Everyone be careful.", .@mark3$;
sleep2 2000; sleep2 2000;
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
disablenpc .@maggi3$; cloakonnpcself( .@maggi3$ );
disablenpc .@mark3$; cloakonnpcself( .@mark3$ );
disablenpc .@tamarin3$; cloakonnpcself( .@tamarin3$ );
'miriam3_id = getnpcid(0); 'miriam3_id = getnpcid(0);
unitwalk 'miriam3_id,231,272, 'miriam3$ + "::OnEvent1"; // several events are required to palliate to our too short value of MAX_WALKPATH (32) used to calculate the pathing unitwalk 'miriam3_id,231,272, 'miriam3$ + "::OnEvent1";
end; end;
OnEvent1: OnEvent1:
unitwalk 'miriam3_id,211,272, 'miriam3$ + "::OnEvent2"; unitwalk 'miriam3_id,211,272, 'miriam3$ + "::OnEvent2";
@ -236,13 +212,13 @@ OnEvent5:
end; end;
} }
1@oz,245,272,3 duplicate(dummy_npc) Magi#ozmd3 4_4JOB_MAGGI 1@oz,245,272,3 duplicate(dummy_cloaked_npc) Maggi#ozmd3 4_4JOB_MAGGI
1@oz,244,273,3 duplicate(dummy_npc) Mark#ozmd3 4_EP18_MARK 1@oz,244,273,3 duplicate(dummy_cloaked_npc) Mark#ozmd3 4_EP18_MARK
1@oz,244,270,3 duplicate(dummy_npc) Tamarin#ozmd3 4_EP18_TAMARIN 1@oz,244,270,3 duplicate(dummy_cloaked_npc) Tamarin#ozmd3 4_EP18_TAMARIN
// Step 4 + 5 // Step 4 + 5
1@oz,157,272,3 script Miriam#ozmd4 4_EP18_MIRIAM,{ 1@oz,157,272,3 script(DISABLED) Miriam#ozmd4 4_EP18_MIRIAM,{
if ('event_oz != 3) if ('event_oz != 3)
end; end;
'event_oz = 4; 'event_oz = 4;
@ -250,25 +226,25 @@ OnEvent5:
.@miriam4$ = instance_npcname("Miriam#ozmd4"); .@miriam4$ = instance_npcname("Miriam#ozmd4");
.@tamarin4$ = instance_npcname("Tamarin#ozmd4"); .@tamarin4$ = instance_npcname("Tamarin#ozmd4");
.@ashtoad2$ = instance_npcname("Ash Toad#ozmd2"); .@ashtoad2$ = instance_npcname("Ash Toad#ozmd2");
.@maggi4$ = instance_npcname("Magi#ozmd4"); .@maggi4$ = instance_npcname("Maggi#ozmd4");
.@mark4$ = instance_npcname("Mark#ozmd4"); .@mark4$ = instance_npcname("Mark#ozmd4");
.@ashtoad3$ = instance_npcname("Ash Toad#ozmd3"); .@ashtoad3$ = instance_npcname("Ash Toad#ozmd3");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
mapannounce 'map_name$, "Miriam: Ah!! A monster!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Miriam: Ah!! A monster!!!", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 1500; sleep2 1500;
mapannounce 'map_name$, "Miriam: I'll take this rude bastard.", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Miriam: I will take care of this rude guy.", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 1500; sleep2 1500;
mapannounce 'map_name$, "Tamarin: Appeared in the back!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Tamarin: It also appeared in the back!!!", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 2000; sleep2 2000;
enablenpc .@tamarin4$; enablenpc .@tamarin4$;
sleep2 500; sleep2 500;
enablenpc .@ashtoad2$; enablenpc .@ashtoad2$;
mapannounce 'map_name$, "Magi: Crazy!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Magi: Aaaah!!!", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 500; sleep2 500;
enablenpc .@maggi4$; enablenpc .@maggi4$;
enablenpc .@mark4$; enablenpc .@mark4$;
mapannounce 'map_name$, "Mark: Please support me in the front!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "Mark: Please support the front!!!", bc_map, 0xB7EE,FW_NORMAL,16;
sleep2 1000; sleep2 1000;
'mob_count_oz = 0; 'mob_count_oz = 0;
monster 'map_name$,145,274,"Ash Toad",21295,1, .@miriam4$ + "::OnMobDead"; // EP18_ASH_TOAD monster 'map_name$,145,274,"Ash Toad",21295,1, .@miriam4$ + "::OnMobDead"; // EP18_ASH_TOAD
@ -289,7 +265,7 @@ OnMobDead:
.@tamarin4$ = instance_npcname("Tamarin#ozmd4"); .@tamarin4$ = instance_npcname("Tamarin#ozmd4");
.@ashtoad2$ = instance_npcname("Ash Toad#ozmd2"); .@ashtoad2$ = instance_npcname("Ash Toad#ozmd2");
.@maggi4$ = instance_npcname("Magi#ozmd4"); .@maggi4$ = instance_npcname("Maggi#ozmd4");
.@mark4$ = instance_npcname("Mark#ozmd4"); .@mark4$ = instance_npcname("Mark#ozmd4");
.@ashtoad3$ = instance_npcname("Ash Toad#ozmd3"); .@ashtoad3$ = instance_npcname("Ash Toad#ozmd3");
.@maram4$ = instance_npcname("Maram#ozmd4"); .@maram4$ = instance_npcname("Maram#ozmd4");
@ -301,60 +277,59 @@ OnMobDead:
npctalk "Tamarin: I did it!!!", .@tamarin4$; npctalk "Tamarin: I did it!!!", .@tamarin4$;
disablenpc .@ashtoad2$; disablenpc .@ashtoad2$;
sleep2 2000; sleep2 2000;
npctalk "Magi: Me too!!", .@maggi4$; npctalk "Magi: This way too!!", .@maggi4$;
disablenpc .@ashtoad3$; disablenpc .@ashtoad3$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Huh It wasn't a great monster, but it would have been dangerous if they were ordinary merchants.", .@miriam4$; npctalk "Miriam: Huh... It wasn't a great monster, but it would have been dangerous for ordinary merchants.", .@miriam4$;
disablenpc .@ashtoad1$; disablenpc .@ashtoad1$;
sleep2 2000; sleep2 2000;
npctalk "Maram : " + strcharinfo(0) + " Are you okay?", .@maram4$; cloakoffnpcself( .@maram4$ );
enablenpc .@maram4$; npctalk "Maram : " + strcharinfo(0) + ", are you okay?", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: You're late! Maram!!!", .@miriam4$; npctalk "Miriam: You're late! Maram!!!", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: I met a monster on the way, so I'm a little late.", .@maram4$; npctalk "Maram: I was a little late because I met a monster on the way.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: There were no monsters on the road we passed earlier.", .@miriam4$; npctalk "Miriam: There were no monsters on the road we passed earlier.", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Yeah? Where the hell do monsters spring up like this...", .@maram4$; npctalk "Maram: Really? Where on earth do monsters like this come from?", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It's a big deal because it's getting harder and harder to move goods because of these monsters.", .@maram4$; npctalk "Maram: It's a big problem because it's getting harder to move supplies because of these monsters.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: If you go to the ground?", .@tamarin4$; npctalk "Tamarin: What if you travel by land?", .@tamarin4$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: I heard there used to be a bridge to cross a canyon?", .@tamarin4$; npctalk "Tamarin: I heard there used to be a bridge across the canyon?", .@tamarin4$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: Because there are still remains...", .@tamarin4$; npctalk "Tamarin: There are still remains left...", .@tamarin4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It is said that the bridge above was destroyed when they saw the natives crossing to escape the hardliners' attacks.", .@maram4$; npctalk "Maram: It is said that the bridge above was destroyed after seeing natives crossing it while fleeing an attack by hardliners.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: The land across the bridge has become uninhabitable due to volcanic ash, so it must have been the intention to dry it to death.", .@maram4$; npctalk "Maram: The area across the bridge has become uninhabitable due to volcanic ash, so they must have been trying to kill him.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It's not difficult to make a bridge again...", .@maram4$; npctalk "Maram: It's not difficult to build a bridge again...", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: You can't advertise that you're hiding here by making a bridge because you're in hiding.", .@maram4$; npctalk "Maram: Since we are in a hiding position, we can't build a bridge or something and advertise that we are hiding here.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It's dangerous and inconvenient right now, but I have no choice but to use the maze of Oz.", .@maram4$; npctalk "Maram: Although it is dangerous and inconvenient now, we have no choice but to use the Maze of Oz.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: In this state, it may not have been noticed until now.", .@maram4$; npctalk "Maram: Because it's in this condition, it may be that it hasn't been discovered until now.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Without the Maze of Oz...", .@miriam4$; npctalk "Miriam: If the Maze of Oz didn't exist...", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: It must have been a lot harder than it is now.", .@miriam4$; npctalk "Miriam: It must have been much harder than it is now.", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: That's right", .@maram4$; npctalk "Maram: That's right.", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Now, shall we walk the lovely maze of Oz again?", .@maram4$; npctalk "Maram: Now then, shall we walk down the lovely maze of Oz again?", .@maram4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: What do you mean", .@miriam4$; npctalk "Miriam: What do you mean...", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam : " + strcharinfo(0) + " From now on, go all the way down until you come to a fork.", .@miriam4$; npctalk "Miriam : " + strcharinfo(0) + " , from now on, just keep going down until you reach a fork in the road.", .@miriam4$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: It would be nice if the monsters didn't appear...", .@miriam4$; npctalk "Miriam: It would be nice if monsters didn't appear, but...", .@miriam4$;
sleep2 1000; sleep2 1000;
disablenpc .@maram4$; cloakonnpcself( .@maram4$ );
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
disablenpc .@maggi4$; disablenpc .@maggi4$;
disablenpc .@mark4$; disablenpc .@mark4$;
disablenpc .@tamarin4$; disablenpc .@tamarin4$;
@ -366,43 +341,43 @@ OnMobDead:
1@oz,156,272,5 duplicate(dummy_disabled_npc) Ash Toad#ozmd1 EP18_ASH_TOAD 1@oz,156,272,5 duplicate(dummy_disabled_npc) Ash Toad#ozmd1 EP18_ASH_TOAD
1@oz,164,272,3 duplicate(dummy_disabled_npc) Ash Toad#ozmd2 EP18_ASH_TOAD 1@oz,164,272,3 duplicate(dummy_disabled_npc) Ash Toad#ozmd2 EP18_ASH_TOAD
1@oz,153,275,5 duplicate(dummy_disabled_npc) Ash Toad#ozmd3 EP18_ASH_TOAD 1@oz,153,275,5 duplicate(dummy_disabled_npc) Ash Toad#ozmd3 EP18_ASH_TOAD
1@oz,155,275,3 duplicate(dummy_disabled_npc) Magi#ozmd4 4_4JOB_MAGGI 1@oz,155,275,3 duplicate(dummy_disabled_npc) Maggi#ozmd4 4_4JOB_MAGGI
1@oz,156,274,3 duplicate(dummy_disabled_npc) Mark#ozmd4 4_EP18_MARK 1@oz,156,274,3 duplicate(dummy_disabled_npc) Mark#ozmd4 4_EP18_MARK
1@oz,161,272,5 duplicate(dummy_disabled_npc) Tamarin#ozmd4 4_EP18_TAMARIN 1@oz,161,272,5 duplicate(dummy_disabled_npc) Tamarin#ozmd4 4_EP18_TAMARIN
1@oz,162,275,3 duplicate(dummy_npc) Maram#ozmd4 4_EP18_MARAM 1@oz,162,275,3 duplicate(dummy_cloaked_npc) Maram#ozmd4 4_EP18_MARAM
// Step 6 // Step 6
1@oz,98,172,3 script Maram#ozmd5 EP18_NPC_MARAM,{ 1@oz,98,172,3 script(DISABLED) Maram#ozmd5 EP18_NPC_MARAM,{
if ('event_oz != 5) if ('event_oz != 5)
end; end;
'event_oz = 6; 'event_oz = 6;
.@miriam$ = instance_npcname("Miriam#ozmd5"); .@miriam$ = instance_npcname("Miriam#ozmd5");
.@maram$ = instance_npcname("Maram#ozmd5"); .@maram$ = instance_npcname("Maram#ozmd5");
npctalk "Maram: It wasn't like this before, but as the ground below begins to melt, perhaps due to the effects of Mount Tor, more monsters are appearing.", .@maram$;
cloakoffnpcself( "Maggi#ozmd5" );
cloakoffnpcself( "Mark#ozmd5" );
cloakoffnpcself( "Tamarin#ozmd5" );
enablenpc .@miriam$; enablenpc .@miriam$;
enablenpc instance_npcname("Magi#ozmd5");
enablenpc instance_npcname("Mark#ozmd5");
enablenpc instance_npcname("Tamarin#ozmd5");
npctalk "Maram: It wasn't like this before, but maybe it's the effect of Tor Volcano, as the ground below starts to melt, so more monsters are appearing.";
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
sleep2 2000; sleep2 2000;
npctalk "Maram: Especially in areas with a lot of molten ground, when trying to avoid monsters, the lava Because there are many people who are seriously injured or never come back... "; npctalk "Maram: Especially in areas where the ground has melted a lot, there are many people who try to avoid monsters and end up seriously injured or unable to return due to the lava...", .@maram$;
sleep2 2000; sleep2 2000;
npctalk "Maram: How long will the maze of Oz last..."; npctalk "Maram: How long will the maze of Oz endure...", .@maram$;
sleep2 3000; sleep2 3000;
mapannounce 'map_name$, "??? : ugh!!!!!!!!!!!!!!!!!!!", bc_map, 0x00B7EE,FW_NORMAL,16; mapannounce 'map_name$, "??? : Ugh!!!!!", bc_map, 0x00B7EE,FW_NORMAL,16;
sleep2 2000; sleep2 2000;
npctalk "Maram: This voice?!?!?!?!?"; npctalk "Maram: What is this voice?!?!?!?!?", .@maram$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Imril!!!!", .@miriam$; npctalk "Miriam: Imril!!!!", .@miriam$;
sleep2 2000; sleep2 2000;
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
npctalk "Maram: I think your friend is in trouble! I'll go first, so please follow me carefully!"; npctalk "Maram: I think my friend is in trouble! I'll go first, so be careful and follow me!", .@maram$;
disablenpc instance_npcname("Magi#ozmd5"); cloakonnpcself( "Maggi#ozmd5" );
disablenpc instance_npcname("Mark#ozmd5"); cloakonnpcself( "Mark#ozmd5" );
disablenpc instance_npcname("Tamarin#ozmd5"); cloakonnpcself( "Tamarin#ozmd5" );
unitwalk getnpcid(0),68,165, .@maram$ + "::OnMove"; unitwalk getnpcid(0),68,165, .@maram$ + "::OnMove";
donpcevent .@miriam$ + "::OnMove"; donpcevent .@miriam$ + "::OnMove";
end; end;
@ -413,33 +388,33 @@ OnMove:
end; end;
} }
1@oz,97,167,3 script Miriam#ozmd5 EP18_NPC_MIRIAM,{ 1@oz,97,167,3 script(DISABLED) Miriam#ozmd5 EP18_NPC_MIRIAM,{
end; end;
OnMove: OnMove:
npcwalkto 67,164; npcwalkto 67,164;
end; end;
} }
1@oz,92,170,3 duplicate(dummy_npc) Magi#ozmd5 4_4JOB_MAGGI 1@oz,92,170,3 duplicate(dummy_cloaked_npc) Maggi#ozmd5 4_4JOB_MAGGI
1@oz,91,169,3 duplicate(dummy_npc) Mark#ozmd5 4_EP18_MARK 1@oz,91,169,3 duplicate(dummy_cloaked_npc) Mark#ozmd5 4_EP18_MARK
1@oz,89,170,5 duplicate(dummy_npc) Tamarin#ozmd5 4_EP18_TAMARIN 1@oz,89,170,5 duplicate(dummy_cloaked_npc) Tamarin#ozmd5 4_EP18_TAMARIN
// Step 7 // Step 7
1@oz,68,165,3 script Maram#ozmd7 4_EP18_MARAM,{ 1@oz,68,165,3 script(DISABLED) Maram#ozmd7 4_EP18_MARAM,{
if ('event_oz != 6) if ('event_oz != 6)
end; end;
'event_oz = 7; 'event_oz = 7;
npctalk "Maram: Are you okay, Imril?"; npctalk "Maram: Imril are you okay?";
donpcevent instance_npcname("Imril#ozmd6") + "::OnStart"; donpcevent instance_npcname("Imril#ozmd6") + "::OnStart";
disablenpc instance_npcname("Maram#ozmd7"); disablenpc();
end; end;
} }
// Step 8 // Step 8
1@oz,61,163,5 script Imril#ozmd6 4_EP18_IMRIL,{ 1@oz,61,163,5 script(DISABLED) Imril#ozmd6 4_EP18_IMRIL,{
end; end;
OnStart: OnStart:
@ -460,56 +435,57 @@ OnMobDead:
.@maram8$ = instance_npcname("Maram#ozmd8"); .@maram8$ = instance_npcname("Maram#ozmd8");
.@imril6$ = instance_npcname("Imril#ozmd6"); .@imril6$ = instance_npcname("Imril#ozmd6");
.@miriam5$ = instance_npcname("Miriam#ozmd5"); .@miriam5$ = instance_npcname("Miriam#ozmd5");
.@maggi6$ = instance_npcname("Magi#ozmd6"); .@maggi6$ = instance_npcname("Maggi#ozmd6");
.@mark6$ = instance_npcname("Mark#ozmd6"); .@mark6$ = instance_npcname("Mark#ozmd6");
.@tamarin6$ = instance_npcname("Tamarin#ozmd6"); .@tamarin6$ = instance_npcname("Tamarin#ozmd6");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
enablenpc .@maram8$;
npctalk "Imril: Thanks! We almost died!", .@imril6$; cloakoffnpcself( .@maram8$ );
npctalk "Imril: Thank you! I almost died!", .@imril6$;
sleep2 2000; sleep2 2000;
npctalk "Imril: Don't go downstairs because the atmosphere isn't too bad.", .@imril6$; npctalk "Imril: The atmosphere is unusual, so don't go downstairs.", .@imril6$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: You seem to see monsters more often than last time.", .@miriam5$; npctalk "Miriam: It seems like I see monsters more often than last time.", .@miriam5$;
sleep2 2000; sleep2 2000;
npctalk "Imril: But what about those people?", .@imril6$; npctalk "Imril: And what about those people?", .@imril6$;
enablenpc .@maggi6$; cloakoffnpcself( .@maggi6$ );
enablenpc .@mark6$; cloakoffnpcself( .@mark6$ );
enablenpc .@tamarin6$; cloakoffnpcself( .@tamarin6$ );
sleep2 2000; sleep2 2000;
npctalk "Maram: They are adventurers who sometimes help with mother's work.", .@maram8$; npctalk "Maram: They are adventurers who sometimes help my mother with her work.", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Trustworthy people, don't be so wary.", .@maram8$; npctalk "Maram: These are trustworthy people, so don't be so wary.", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Imril: Because you trust people too easily.", .@imril6$; npctalk "Imril: I heard you trust people too easily.", .@imril6$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Yes.", .@miriam5$; npctalk "Miriam: Yes.", .@miriam5$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Anyway, let's escape before more monsters come out.", .@maram8$; npctalk "Maram: Anyway, let's escape quickly before more monsters appear.", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Maram: Not long left.", .@maram8$; npctalk "Maram: Not much left.", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Maram: It's hard to see, but just follow the road up here!", .@maram8$; npctalk "Maram: It's hard to see, but you can follow the road up here and keep moving!", .@maram8$;
sleep2 2000; sleep2 2000;
npctalk "Tamarin: I think this is the way!", .@tamarin6$; npctalk "Tamarin: I think this is the way!", .@tamarin6$;
disablenpc .@maggi6$; cloakonnpcself( .@maggi6$ );
disablenpc .@mark6$; cloakonnpcself( .@mark6$ );
disablenpc .@tamarin6$; cloakonnpcself( .@tamarin6$ );
disablenpc .@maram8$; cloakonnpcself( .@maram8$ );
enablenpc instance_npcname("#oz_way"); enablenpc instance_npcname("#oz_way");
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
end; end;
} }
1@oz,68,165,3 duplicate(dummy_npc) Maram#ozmd8 4_EP18_MARAM 1@oz,68,165,3 duplicate(dummy_cloaked_npc) Maram#ozmd8 4_EP18_MARAM
1@oz,61,168,3 duplicate(dummy_npc) Magi#ozmd6 4_4JOB_MAGGI 1@oz,61,168,3 duplicate(dummy_cloaked_npc) Maggi#ozmd6 4_4JOB_MAGGI
1@oz,65,167,3 duplicate(dummy_npc) Mark#ozmd6 4_EP18_MARK 1@oz,65,167,3 duplicate(dummy_cloaked_npc) Mark#ozmd6 4_EP18_MARK
1@oz,59,171,3 duplicate(dummy_npc) Tamarin#ozmd6 4_EP18_TAMARIN 1@oz,59,171,3 duplicate(dummy_cloaked_npc) Tamarin#ozmd6 4_EP18_TAMARIN
// Step 9 // Step 9
1@oz,58,256,5 script #oz_way 1_SHADOW_NPC,3,3,{ 1@oz,58,256,5 script(DISABLED) #oz_way 1_SHADOW_NPC,3,3,{
end; end;
OnTouch: OnTouch:
if ('event_oz != 8) if ('event_oz != 8)
@ -520,11 +496,11 @@ OnTouch:
} }
// Step 10 (maybe not required ?) // Step 10 (maybe not required ?)
1@oz,44,255,5 script Maram#ozmd6 4_EP18_MARAM,{ 1@oz,44,255,5 script(DISABLED) Maram#ozmd6 4_EP18_MARAM,{
if ('event_oz != 9) if ('event_oz != 9)
end; end;
'event_oz = 10; 'event_oz = 10;
npctalk "Maram: This way!!!"; npctalk "Maram: Go down this road.";
initnpctimer; initnpctimer;
end; end;
OnTimer2000: OnTimer2000:
@ -536,7 +512,7 @@ OnTimer2000:
// Step 11 // Step 11
// (Step 29 on the main quest). // (Step 29 on the main quest).
1@oz,21,189,5 script Maram#ozmd9 4_EP18_MARAM,{ 1@oz,21,189,5 script(DISABLED) Maram#ozmd9 4_EP18_MARAM,{
if ('event_oz != 10) if ('event_oz != 10)
end; end;
'event_oz = 11; 'event_oz = 11;
@ -546,50 +522,47 @@ OnTimer2000:
.@imril7$ = instance_npcname("Imril#ozmd7"); .@imril7$ = instance_npcname("Imril#ozmd7");
setpcblock PCBLOCK_NPC, true; setpcblock PCBLOCK_NPC, true;
npctalk "Maram: Climb up the rope in front of this to get out.", .@maram9$; npctalk "Maram: If you climb up the rope in front of here, you can go outside.", .@maram9$;
enablenpc .@miriam7$; cloakoffnpcself( .@miriam7$ );
enablenpc .@imril7$; cloakoffnpcself( .@imril7$ );
sleep2 2000; sleep2 2000;
npctalk "Imril: I'll go get some hidden stuff here, so go up first.", .@imril7$; npctalk "Imril: I'll take some hidden items here, so go up first.", .@imril7$;
sleep2 2000; sleep2 2000;
npctalk "Miriam: Everyone is very tired. Let's go upstairs.", .@miriam7$; npctalk "Miriam: Everyone is very tired. Let's go up quickly.", .@miriam7$;
if (ep18_1_main == 30) { if (ep18_main == 30) {
changequest 11719,11720; erasequest 11719;
ep18_1_main = 31; setquest 11720;
ep18_main = 31;
} }
disablenpc .@miriam7$; cloakonnpcself( .@miriam7$ );
disablenpc .@imril7$; cloakonnpcself( .@imril7$ );
setpcblock PCBLOCK_NPC, false; setpcblock PCBLOCK_NPC, false;
end; end;
OnInstanceInit: OnInstanceInit:
disablenpc instance_npcname("Maram#ozmd9"); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(11719) == 1" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(11719) == 1" );
end; end;
} }
1@oz,22,187,5 duplicate(dummy_npc) Miriam#ozmd7 4_EP18_MIRIAM 1@oz,22,187,5 duplicate(dummy_cloaked_npc) Miriam#ozmd7 4_EP18_MIRIAM
1@oz,16,185,3 duplicate(dummy_npc) Imril#ozmd7 4_EP18_IMRIL 1@oz,16,185,3 duplicate(dummy_cloaked_npc) Imril#ozmd7 4_EP18_IMRIL
// Step 12 // Step 12
1@oz,28,190,3 script(DISABLED) Rope#outoz2 4_ROPEPILE,{ 1@oz,28,190,3 script(DISABLED) Rope#outoz2 4_ROPEPILE,{
if ('event_oz < 11) if ('event_oz != 11) {
end; mes "It can't be used yet. Let's talk to Maram first.";
mes "I think I can climb up with a rope."; close;
next;
switch( select( "Use a rope to climb", "Do not use" ) ) {
case 1:
close2;
warp "gw_fild01",275,337;
end;
case 2:
end;
} }
mes "I think I can climb up using the rope.";
next;
if (select( "Use the rope to climb up.", "Do not use." ) == 2)
end;
warp "gw_fild01",275,337;
end; end;
OnInstanceInit: OnInstanceInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(11720) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(11720) == 1" );
end; end;
} }
@ -601,7 +574,7 @@ OnTouch_:
getmapxy .@map$,.@x,.@y, BL_NPC; getmapxy .@map$,.@x,.@y, BL_NPC;
monster 'map_name$,.@x-1,.@y,"Ash Toad",21295,1; // EP18_ASH_TOAD monster 'map_name$,.@x-1,.@y,"Ash Toad",21295,1; // EP18_ASH_TOAD
monster 'map_name$,.@x+1,.@y,"Rake Hand",21296,1; // EP18_RAKEHAND monster 'map_name$,.@x+1,.@y,"Rake Hand",21296,1; // EP18_RAKEHAND
disablenpc instance_npcname( strnpcinfo(0) ); cloakonnpcself();
end; end;
} }
@ -612,4 +585,3 @@ OnTouch_:
1@oz,79,203,5 duplicate(#oz01) #oz06 1_SHADOW_NPC,4,4 1@oz,79,203,5 duplicate(#oz01) #oz06 1_SHADOW_NPC,4,4
1@oz,124,261,5 duplicate(#oz01) #oz07 1_SHADOW_NPC,4,4 1@oz,124,261,5 duplicate(#oz01) #oz07 1_SHADOW_NPC,4,4
1@oz,139,279,5 duplicate(#oz01) #oz08 1_SHADOW_NPC,4,4 1@oz,139,279,5 duplicate(#oz01) #oz08 1_SHADOW_NPC,4,4

View File

@ -2,54 +2,56 @@
//= Instance: Thor Gunsu Base. //= Instance: Thor Gunsu Base.
//===== Description: ========================================= //===== Description: =========================================
//- [Walkthrough conversion] //- [Walkthrough conversion]
//- Part of the episode 18.1 main quest. //- Part of the Episode 18 main quest.
//===== Changelogs: ========================================== //===== Changelogs: ==========================================
//= 1.0 First version. [Capuche] //= 1.0 First version. [Capuche]
//============================================================ //============================================================
// Main Quest: Step 47. // Main Quest: Step 47.
que_thr,133,53,5 script Maram#Armybase1 4_EP18_MARAM,{ que_thr,133,53,5 script Maram#Armybase1 4_EP18_MARAM,{
if (ep18_1_main != 45 && ep18_1_main != 46) if (ep18_main < 45 || ep18_main > 46)
end; end;
if (ep18_1_main == 45) { if (ep18_main == 45) {
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "You have arrived, adventurer!"; mes "You've arrived, adventurer!";
mes "You did a great job getting here."; mes "Thank you for coming all the way here.";
next; next;
cutin "ep18_maram_03.png",2; cutin "ep18_maram_03.png",2;
mes "[Maram]"; mes "[Maram]";
mes "After all, it looks like this next one is real. The guards are different from before..."; mes "It seems like this is the real deal after all. The security here is different from what it has been so far....";
mes "Let's look inside, being careful not to be caught by the guards."; mes "Let's be careful not to be caught by the guards and explore the inside.";
next; next;
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "Make sure to move out of sight of the guards as much as possible."; mes "Try to move away from the security guard's line of sight as much as possible.";
mes "If you make a mistake, you will be attacked, so if you don't break through, we'll meet again here."; mes "If you get caught, you might be attacked, so if you can't break through, we'll meet again here.";
changequest 16577,16578; erasequest 16577;
ep18_1_main = 46; setquest 16578;
ep18_main = 46;
next; next;
} }
else if (ep18_1_main == 46) { else if (ep18_main == 46) {
cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "Let's try to get in as far as possible from the guard tower."; mes "Let's try to go in while avoiding the guard tower as much as possible.";
next; next;
} }
.@md_name$ = "Thor Gunsu Base"; .@md_name$ = "Thor Military Base";
cutin "",255; cutin "",255;
mes "^FF0000 Any arbitrary processing such as taming monsters in the dungeon is not considered normal. Please note.^000000"; mes "^FF0000Caution : If you perform arbitrary processing within the dungeon, such as monster taming, it will not be considered normal progress.^000000";
next; next;
// player has party // player has party
if (is_party_leader()) { if (is_party_leader())
// player is leader of the party // player is leader of the party
.@create$ = "Open " + .@md_name$; .@create$ = "Apply for entry to " + .@md_name$ + "";
}
switch( select( .@create$, .@md_name$ + " entry" ) ) { switch( select( .@create$, "Enter " + .@md_name$ + "" ) ) {
case 1: case 1:
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "When the application is complete, talk to me again and select ^0000CD Thor military base entry^000000"; mes "When the application is complete, talk to me again and select ^0000CD" + .@md_name$ + " entry^000000";
if (instance_create(.@md_name$) < 0) { if (instance_create(.@md_name$) < 0) {
mes "Party: " + getpartyname(getcharid(1)) + ""; mes "Party: " + getpartyname(getcharid(1)) + "";
mes "Leader: " + strcharinfo(0) + ""; mes "Leader: " + strcharinfo(0) + "";
@ -67,14 +69,14 @@ que_thr,133,53,5 script Maram#Armybase1 4_EP18_MARAM,{
case IE_NOINSTANCE: case IE_NOINSTANCE:
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "I don't think the dungeon has been created yet? Please check later."; mes "It seems like you haven't created the dungeon yet. Please check again in a moment.";
close3; close3;
case IE_NOMEMBER: case IE_NOMEMBER:
mes "[Maram]"; mes "[Maram]";
mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000"; mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000";
close; close;
case IE_OK: case IE_OK:
mapannounce "que_thr", "" + strcharinfo(0) + " of the party, " + getpartyname( getcharid(1) ) + ", is entering " + .@md_name$ + ".",bc_map,"0x00ff99",FW_NORMAL,12; mapannounce "que_thr", "" + strcharinfo(0) + " of the party, " + getpartyname( getcharid(1) ) + ", is entering " + .@md_name$ + ".", bc_map, 0xFF99;
// warp 1@tcamp,103,237; // warp 1@tcamp,103,237;
end; end;
} }
@ -82,34 +84,24 @@ que_thr,133,53,5 script Maram#Armybase1 4_EP18_MARAM,{
end; end;
OnInit: OnInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(16577) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(16577) == 1" );
end; end;
} }
1@tcamp,106,237,3 script Maram#base1 4_EP18_MARAM,{ 1@tcamp,106,237,3 script Maram#Base1 4_EP18_MARAM,{
cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "Be careful and explore the inside."; mes "Be careful and explore inside.";
mes "I heard from Mr. Dandelion earlier, there aren't many people, but there are Watch Towers here and there that monitor a fairly wide area."; mes "From what I heard from Dandelion earlier, there aren't many people, but there are watchtowers here and there that monitor a fairly wide area.";
next; next;
mes "[Maram]"; mes "[Maram]";
mes "If you get caught by the Watch Tower, soldiers will appear, so be careful not to get caught."; mes "If you get caught by the watchtower, soldiers will appear, so be careful not to get caught.";
mes "Well, if you find something, please contact me!"; mes "Well, if you find anything, please contact me!";
close3; close;
OnInstanceInit: OnInstanceInit:
'step = 0;
'map_tcamp$ = instance_mapname("1@tcamp"); 'map_tcamp$ = instance_mapname("1@tcamp");
disablenpc instance_npcname("Document Pile#Site1");
disablenpc instance_npcname("Document Pile#Site2");
disablenpc instance_npcname("Document Pile#Site3");
disablenpc instance_npcname("Document Pile#Site4");
disablenpc instance_npcname("Document Pile#Site5");
disablenpc instance_npcname("Maram#Lock1");
disablenpc instance_npcname("Maram#Lock2");
disablenpc instance_npcname("Maram#Lock3");
disablenpc instance_npcname("Maram#Lock4");
setcell 'map_tcamp$,137,216,142,216,cell_walkable,0; setcell 'map_tcamp$,137,216,142,216,cell_walkable,0;
setcell 'map_tcamp$,135,145,144,145,cell_walkable,0; setcell 'map_tcamp$,135,145,144,145,cell_walkable,0;
setcell 'map_tcamp$,223,105,223,110,cell_walkable,0; setcell 'map_tcamp$,223,105,223,110,cell_walkable,0;
@ -128,11 +120,11 @@ OnInstanceInit:
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Traps // Traps
//------------------------------------------------------------------- //-------------------------------------------------------------------
1@tcamp,120,228,3 script Watch Tower#Watch1 4_SYSTEM_BOX,7,7,{ 1@tcamp,120,228,3 script Watchtower#Watch1 4_SYSTEM_BOX,7,7,{
end; end;
OnTouch: // note: hidden player trigger the event OnTouch: // note: hidden player trigger the event
npctalk "Detect intruders. Exclude them."; npctalk "Intruder detected !!";
mapannounce 'map_tcamp$, "Intruder detected, intruder detected. We rule out immediately.", bc_map, 0xFF0000; mapannounce 'map_tcamp$, "Intruder found, intruder found. Ruled out immediately.", bc_map, 0xFF0000;
getmapxy .@map$,.@x,.@y, BL_NPC; getmapxy .@map$,.@x,.@y, BL_NPC;
areamonster 'map_tcamp$,.@x-2,.@y-2,.@x+2,.@y+2,"Base Soldier",21309,3; // EP18_MD_THOR_GUARD areamonster 'map_tcamp$,.@x-2,.@y-2,.@x+2,.@y+2,"Base Soldier",21309,3; // EP18_MD_THOR_GUARD
@ -147,186 +139,198 @@ OnInstanceInit:
end; end;
} }
1@tcamp,135,228,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch2 4_SYSTEM_BOX,7,7 1@tcamp,135,228,3 duplicate(Watchtower#Watch1) Watchtower#Watch2 4_SYSTEM_BOX,7,7
1@tcamp,152,133,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch3 4_SYSTEM_BOX,7,7 1@tcamp,152,133,3 duplicate(Watchtower#Watch1) Watchtower#Watch3 4_SYSTEM_BOX,7,7
1@tcamp,167,133,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch4 4_SYSTEM_BOX,7,7 1@tcamp,167,133,3 duplicate(Watchtower#Watch1) Watchtower#Watch4 4_SYSTEM_BOX,7,7
1@tcamp,182,133,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch5 4_SYSTEM_BOX,7,7 1@tcamp,182,133,3 duplicate(Watchtower#Watch1) Watchtower#Watch5 4_SYSTEM_BOX,7,7
1@tcamp,161,96,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch6 4_SYSTEM_BOX,7,7 1@tcamp,161,96,3 duplicate(Watchtower#Watch1) Watchtower#Watch6 4_SYSTEM_BOX,7,7
1@tcamp,146,96,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch7 4_SYSTEM_BOX,7,7 1@tcamp,146,96,3 duplicate(Watchtower#Watch1) Watchtower#Watch7 4_SYSTEM_BOX,7,7
1@tcamp,116,102,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch8 4_SYSTEM_BOX,7,7 1@tcamp,116,102,3 duplicate(Watchtower#Watch1) Watchtower#Watch8 4_SYSTEM_BOX,7,7
1@tcamp,88,92,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch9 4_SYSTEM_BOX,7,7 1@tcamp,88,92,3 duplicate(Watchtower#Watch1) Watchtower#Watch9 4_SYSTEM_BOX,7,7
1@tcamp,240,148,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch10 4_SYSTEM_BOX,7,7 1@tcamp,240,148,3 duplicate(Watchtower#Watch1) Watchtower#Watch10 4_SYSTEM_BOX,7,7
1@tcamp,156,71,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch11 4_SYSTEM_BOX,7,7 1@tcamp,156,71,3 duplicate(Watchtower#Watch1) Watchtower#Watch11 4_SYSTEM_BOX,7,7
1@tcamp,176,194,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch12 4_SYSTEM_BOX,7,7 1@tcamp,176,194,3 duplicate(Watchtower#Watch1) Watchtower#Watch12 4_SYSTEM_BOX,7,7
1@tcamp,192,194,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch13 4_SYSTEM_BOX,7,7 1@tcamp,192,194,3 duplicate(Watchtower#Watch1) Watchtower#Watch13 4_SYSTEM_BOX,7,7
1@tcamp,142,153,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch14 4_SYSTEM_BOX,7,7 1@tcamp,142,153,3 duplicate(Watchtower#Watch1) Watchtower#Watch14 4_SYSTEM_BOX,7,7
1@tcamp,142,168,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch15 4_SYSTEM_BOX,7,7 1@tcamp,142,168,3 duplicate(Watchtower#Watch1) Watchtower#Watch15 4_SYSTEM_BOX,7,7
1@tcamp,192,179,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch16 4_SYSTEM_BOX,7,7 1@tcamp,192,179,3 duplicate(Watchtower#Watch1) Watchtower#Watch16 4_SYSTEM_BOX,7,7
1@tcamp,237,90,3 duplicate(Watch Tower#Watch1) Watch Tower#Watch17 4_SYSTEM_BOX,7,7 1@tcamp,237,90,3 duplicate(Watchtower#Watch1) Watchtower#Watch17 4_SYSTEM_BOX,7,7
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Walls // Walls
//------------------------------------------------------------------- //-------------------------------------------------------------------
1@tcamp,138,216,3 script Lock#1-1 4_ROPEPILE,{ 1@tcamp,138,216,3 script Lock Device#1-1 4_ROPEPILE,{
.@maram$ = instance_npcname("Maram#Lock1"); .@maram$ = instance_npcname("Maram#Lock Device1");
enablenpc .@maram$; enablenpc .@maram$;
npctalk "Maram: Wait a minute. I know how to open it.", .@maram$; npctalk "Maram: Please wait a moment. I know how to open it.", .@maram$;
progressbar_npc "3131FF",10; progressbar_npc "3131FF",10;
npctalk "Maram: Now we can pass!", .@maram$; npctalk "Maram: Well, we can pass now!", .@maram$;
disablenpc instance_npcname("Lock#1-1"); disablenpc instance_npcname("Lock Device#1-1");
disablenpc instance_npcname("Lock#1-2"); disablenpc instance_npcname("Lock Device#1-2");
disablenpc .@maram$; disablenpc .@maram$;
setcell 'map_tcamp$,137,216,142,216,cell_walkable,1; setcell 'map_tcamp$,137,216,142,216,cell_walkable,1;
end; end;
} }
1@tcamp,141,216,3 duplicate(Lock#1-1) Lock#1-2 4_ROPEPILE 1@tcamp,141,216,3 duplicate(Lock Device#1-1) Lock Device#1-2 4_ROPEPILE
1@tcamp,140,218,3 duplicate(dummy_npc) Maram#Lock1 4_EP18_MARAM 1@tcamp,140,218,3 duplicate(dummy_disabled_npc) Maram#Lock Device1 4_EP18_MARAM
1@tcamp,136,145,3 script Lock#2-1 4_ROPEPILE,{ 1@tcamp,136,145,3 script Lock Device#2-1 4_ROPEPILE,{
.@maram$ = instance_npcname("Maram#Lock2"); .@maram$ = instance_npcname("Maram#Lock Device2");
enablenpc .@maram$; enablenpc .@maram$;
progressbar_npc "3131FF",10; progressbar_npc "3131FF",10;
npctalk "It would be better to proceed with caution.", .@maram$; npctalk "It would be better to proceed with caution.", .@maram$;
disablenpc instance_npcname("Lock#2-1"); disablenpc instance_npcname("Lock Device#2-1");
disablenpc instance_npcname("Lock#2-2"); disablenpc instance_npcname("Lock Device#2-2");
disablenpc instance_npcname("Lock#2-3"); disablenpc instance_npcname("Lock Device#2-3");
disablenpc instance_npcname("Lock#2-4"); disablenpc instance_npcname("Lock Device#2-4");
disablenpc .@maram$; disablenpc .@maram$;
setcell 'map_tcamp$,135,145,144,145,cell_walkable,1; setcell 'map_tcamp$,135,145,144,145,cell_walkable,1;
end; end;
} }
1@tcamp,138,145,3 duplicate(Lock#2-1) Lock#2-2 4_ROPEPILE 1@tcamp,138,145,3 duplicate(Lock Device#2-1) Lock Device#2-2 4_ROPEPILE
1@tcamp,141,145,3 duplicate(Lock#2-1) Lock#2-3 4_ROPEPILE 1@tcamp,141,145,3 duplicate(Lock Device#2-1) Lock Device#2-3 4_ROPEPILE
1@tcamp,143,145,3 duplicate(Lock#2-1) Lock#2-4 4_ROPEPILE 1@tcamp,143,145,3 duplicate(Lock Device#2-1) Lock Device#2-4 4_ROPEPILE
1@tcamp,142,147,3 duplicate(dummy_npc) Maram#Lock2 4_EP18_MARAM 1@tcamp,142,147,3 duplicate(dummy_disabled_npc) Maram#Lock Device2 4_EP18_MARAM
1@tcamp,223,109,3 script Lock#3-1 4_ROPEPILE,{ 1@tcamp,223,109,3 script Lock Device#3-1 4_ROPEPILE,{
.@maram$ = instance_npcname("Maram#Lock3"); .@maram$ = instance_npcname("Maram#Lock Device3");
enablenpc .@maram$; enablenpc .@maram$;
npctalk "Maram: This building looks pretty suspicious, right? There must be a surveillance system in it as well.", .@maram$; npctalk "Maram: This building looks quite suspicious, right? There must be a surveillance system in here too.", .@maram$;
progressbar_npc "3131FF",10; progressbar_npc "3131FF",10;
npctalk "Maram: Let's explore carefully, being careful not to get caught this time.", .@maram$; npctalk "Maram: Let's explore carefully this time, being careful not to get caught.", .@maram$;
disablenpc instance_npcname("Lock#3-1"); disablenpc instance_npcname("Lock Device#3-1");
disablenpc instance_npcname("Lock#3-2"); disablenpc instance_npcname("Lock Device#3-2");
disablenpc .@maram$; disablenpc .@maram$;
setcell 'map_tcamp$,223,105,223,110,cell_walkable,1; setcell 'map_tcamp$,223,105,223,110,cell_walkable,1;
end; end;
} }
1@tcamp,223,106,3 duplicate(Lock#3-1) Lock#3-2 4_ROPEPILE 1@tcamp,223,106,3 duplicate(Lock Device#3-1) Lock Device#3-2 4_ROPEPILE
1@tcamp,226,114,3 duplicate(dummy_npc) Maram#Lock3 4_EP18_MARAM 1@tcamp,226,114,3 duplicate(dummy_disabled_npc) Maram#Lock Device3 4_EP18_MARAM
1@tcamp,80,99,3 script Lock#4-1 4_ROPEPILE,{ 1@tcamp,80,99,3 script Lock Device#4-1 4_ROPEPILE,{
.@maram$ = instance_npcname("Maram#Lock4"); .@maram$ = instance_npcname("Maram#Lock Device4");
enablenpc .@maram$; enablenpc .@maram$;
npctalk "Maram: I think you've gotten pretty deep. You should be able to find what you need safely.", .@maram$; npctalk "Maram: Looks like we're in pretty deep. We should be able to safely find what we need.", .@maram$;
progressbar_npc "3131FF",10; progressbar_npc "3131FF",10;
npctalk "Maram: Shall we wish you luck?", .@maram$; npctalk "Maram: Shall we wish you good luck?", .@maram$;
disablenpc instance_npcname("Lock#4-1"); disablenpc instance_npcname("Lock Device#4-1");
disablenpc instance_npcname("Lock#4-2"); disablenpc instance_npcname("Lock Device#4-2");
disablenpc instance_npcname("Lock#4-3"); disablenpc instance_npcname("Lock Device#4-3");
disablenpc .@maram$; disablenpc .@maram$;
setcell 'map_tcamp$,80,94,80,100,cell_walkable,1; setcell 'map_tcamp$,80,94,80,100,cell_walkable,1;
enablenpc instance_npcname("Document Pile#Site1"); enablenpc instance_npcname("Pile of documents#Base1");
enablenpc instance_npcname("Document Pile#Site2"); enablenpc instance_npcname("Pile of documents#Base2");
enablenpc instance_npcname("Document Pile#Site3"); enablenpc instance_npcname("Pile of documents#Base3");
enablenpc instance_npcname("Document Pile#Site4"); enablenpc instance_npcname("Pile of documents#Base4");
enablenpc instance_npcname("Document Pile#Site5"); enablenpc instance_npcname("Pile of documents#Base5");
enablenpc instance_npcname("Miriam#base1"); enablenpc instance_npcname("Miriam#Base1");
enablenpc instance_npcname("Maram#base5"); enablenpc instance_npcname("Maram#Base5");
if ('step == 0)
'step = 1;
end; end;
} }
1@tcamp,80,97,3 duplicate(Lock#4-1) Lock#4-2 4_ROPEPILE 1@tcamp,80,97,3 duplicate(Lock Device#4-1) Lock Device#4-2 4_ROPEPILE
1@tcamp,80,95,3 duplicate(Lock#4-1) Lock#4-3 4_ROPEPILE 1@tcamp,80,95,3 duplicate(Lock Device#4-1) Lock Device#4-3 4_ROPEPILE
1@tcamp,82,100,3 duplicate(dummy_npc) Maram#Lock4 4_EP18_MARAM 1@tcamp,82,100,3 duplicate(dummy_disabled_npc) Maram#Lock Device4 4_EP18_MARAM
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Final // Final
//------------------------------------------------------------------- //-------------------------------------------------------------------
1@tcamp,32,100,3 script Document Pile#Site1 4_EP18_PAPERS,{ 1@tcamp,32,100,3 script(DISABLED) Pile of documents#Base1 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "I took out a few sheets from the middle These are the expiry date of the weapon and the sales statement."; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "I took out a few pages from the middle and found that they were weapons expiration dates and sales records.";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "Even the date is very recent. There is a record of handing over a large number of weapons to Mr. Dandelion."; mes "Even the date is very recent. There is also a record of handing over a large amount of weapons to Mr. Dandelion.";
mes "I think I found what I was looking for. I put the documents in my pocket."; mes "It looks like I found what I was looking for. I put the documents in my arms.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site1") ); cloakonnpcself();
end; end;
} }
1@tcamp,49,123,3 script Document Pile#Site2 4_EP18_PAPERS,{ 1@tcamp,49,123,3 script(DISABLED) Pile of documents#Base2 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "At the top of the page the final menu for luncheon dinner?"; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "On the top page... is it a battle to decide the menu for lunch?";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "It seems that the menu is fried fish with sauce."; mes "It looks like the menu has been set on fried fish covered in sauce....";
mes "You seem to have left unimportant documents. Let's take care of them first."; mes "It looks like he left behind only unimportant documents. Let's take care of them for now.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site2") ); cloakonnpcself();
end; end;
} }
1@tcamp,29,86,3 script Document Pile#Site3 4_EP18_PAPERS,{ 1@tcamp,29,86,3 script(DISABLED) Pile of documents#Base3 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "I took one out of the middle The layout of the military base guards?"; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "I took one out from the middle and saw... a map of the security guards at the military base?";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "Looking at the date, it was a long time ago."; mes "Looking at the date, it's a long time ago document.";
mes "You seem to have left unimportant documents. Let's take care of them first."; mes "It looks like he left behind only unimportant documents. Let's take care of them for now.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site3") ); cloakonnpcself();
end; end;
} }
1@tcamp,60,122,3 script Document Pile#Site4 4_EP18_PAPERS,{ 1@tcamp,60,122,3 script(DISABLED) Pile of documents#Base4 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "The top one... 'If you feed the magmaring potatoes and hunt them after a while, will they drop the baked potatoes?'"; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "The top chapter is... ¡®If you feed a magmaring a potato and then hunt it after a while, should it drop a baked potato?'";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "why is this here. But I'm curious about the result!"; mes "...Why is this here? But I'm curious about the results!";
mes "You seem to have left unimportant documents. Let's take care of them first."; mes "It looks like he left behind only unimportant documents. Let's take care of them for now.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site4") ); cloakonnpcself();
end; end;
} }
1@tcamp,31,84,3 script Document Pile#Site5 4_EP18_PAPERS,{ 1@tcamp,31,84,3 script(DISABLED) Pile of documents#Base5 4_EP18_PAPERS,{
mes "[Pile of Papers]"; if ('step != 1)
mes "All the papers are jumbled up."; end;
mes "Picking one out of the middle I found an illustration of the Pope drawn by icing the Pope's cookie icing with a pen."; mes "[Pile of documents]";
mes "All kinds of documents are all mixed up.";
mes "When I pulled one out from the middle... I found an illustration of the Pope drawn with Pope cookie icing using a pen.";
next; next;
mes "[Pile of Papers]"; mes "[Pile of documents]";
mes "What kind of picture is it? Besides, you drew it very well."; mes "What kind of picture is this? And it's really well drawn....";
mes "You seem to have left unimportant documents. Let's take care of them first."; mes "It looks like he left behind only unimportant documents. Let's take care of them for now.";
close2; close2;
getitem 1000409,1; // Ep18_Docu_File getitem 1000409,1; // Ep18_Docu_File
cloakonnpcself( instance_npcname("Document Pile#Site5") ); cloakonnpcself();
end; end;
} }
1@tcamp,34,100,3 script Miriam#base1 4_EP18_MIRIAM,3,3,{ 1@tcamp,34,100,3 script(DISABLED) Miriam#Base1 4_EP18_MIRIAM,3,3,{
disable_items; if ('step == 1) {
if (countitem(1000409) < 5) { // Ep18_Docu_File if (countitem(1000409) < 5) { // Ep18_Docu_File
cutin "ep18_miriam_02.png",2; cutin "ep18_miriam_02.png",2;
mes "[Miriam]"; mes "[Miriam]";
mes "As expected, you are talented, adventurer. I used all sorts of connections to find the position."; mes "As expected, you are talented, adventurer. I used all my connections to find out the location.";
mes "It seems that Adventurer and Maram found it at once."; mes "It looks like you found the adventurer and Maram right away.";
next; next;
mes "[Miriam]"; mes "[Miriam]";
mes "Read some of the documents here. We have what we were looking for."; mes "Please read these documents. They contain what we are looking for.";
mes "I think it would be better to come and see it firsthand than to explain everything."; mes "Rather than having me explain everything to you, I think it would be better for you to see it for yourself.";
close3; close3;
} }
if (getequipid(EQI_HEAD_TOP) != 400127) { // Ep18_Mini_Elly if (getequipid(EQI_HEAD_TOP) != 400127) { // Ep18_Mini_Elly
@ -334,23 +338,22 @@ OnInstanceInit:
mes "Get it out of the bag. Put it on your head."; mes "Get it out of the bag. Put it on your head.";
close; close;
} }
cutin "ep18_miriam_02.png",2;
mes "[Miriam]"; mes "[Miriam]";
mes "."; mes ".......";
next; next;
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "No, Miriam! How are you here?"; mes "No, Miriam! How are you here?";
mes "They said they would investigate separately!"; mes "They said they would conduct a separate investigation!";
next; next;
cutin "ep18_miriam_01.png",2; cutin "ep18_miriam_01.png",2;
mes "[Miriam]"; mes "[Miriam]";
mes "How did you and the adventurer dig this far?"; mes "How did you and the adventurer dig this far?";
mes "You have good skills, too. It was a location that I found using all kinds of connections, but you found it at once."; mes "As expected, your skills are good. I used all my connections to find out the location, but you found it right away.";
next; next;
cutin "ep18_maram_02.png",2; cutin "ep18_maram_02.png",2;
mes "[Maram]"; mes "[Maram]";
mes "Let's do some, right, adventurer?"; mes "Let's do something about it, right, adventurer?";
mes "Anyway, what information did you get?"; mes "Anyway, what information did you get?";
next; next;
cutin "ep18_miriam_02.png",2; cutin "ep18_miriam_02.png",2;
@ -359,104 +362,115 @@ OnInstanceInit:
next; next;
cutin "",255; cutin "",255;
mes "[Mini Elly]"; mes "[Mini Elly]";
mes "This is a sales statement for arms. Show it to me as well."; mes "This document is a weapon sales record. Please show it to me.";
mes "The weapons and firearms these men have disposed of are all less than a year old."; mes "All of the weapons and firearms that these people disposed of have less than a year left before their expiration date.";
next; next;
cutin "ep18_miriam_03.png",2; cutin "ep18_miriam_03.png",2;
mes "[Miriam]"; mes "[Miriam]";
mes "How dare you sell such weapons."; mes "You sell weapons like this so recklessly.";
mes "A weapon that is not properly maintained may not function properly."; mes "If a weapon is not properly maintained, it may not function properly.";
next; next;
cutin "ep18_maram_03.png",2; cutin "ep18_maram_03.png",2;
mes "[Maram]"; mes "[Maram]";
mes "The weapons that come out of the back hole are all the same."; mes "The quality of all weapons coming out of the back hole is the same.";
mes "but, at least it's at this point."; mes "...But I guess it's at this point in time.";
next; next;
mes "[Maram]"; mes "[Maram]";
mes "A year is not a long term, but it is not tight."; mes "One year is not a long expiration date, but it is not too tight.";
mes "Why did we pour out at this moment in preparation for the protest?"; mes "Why did it pour out at this moment when we were preparing for the protest?";
next; next;
mes "[Maram]"; mes "[Maram]";
mes "You wouldn't have to dispose of it right away."; mes "There wouldn't have been a need to dispose of it right away.";
next; next;
npctalk "Maram: haha, this is so funny", instance_npcname("Maram#base5");
sleep2 300;
cutin "ep18_miriam_02.png",2; cutin "ep18_miriam_02.png",2;
mes "[Miriam]"; mes "[Miriam]";
mes "This is one of the military bases managed by my stepfather."; mes "This is one of the military bases managed by my adoptive father.";
mes "Just by chance, it really came out at a time like this."; mes "I was wondering if it would really pop out at a time like this.";
next; next;
cutin "",255; cutin "",255;
select( "If your stepfather is a priest, Youth Amal?", "The hard-line and pro-war stepfather?" ); select( "If it's your adoptive father, is it Priest Amal?", "That adoptive father who is a hardliner and pro-war?" );
cutin "ep18_miriam_02.png",2; cutin "ep18_miriam_02.png",2;
mes "[Miriam]"; mes "[Miriam]";
mes "That's right, adventurer. Looking at the ledger, it doesn't seem like the stepfather was involved."; mes "That's right, adventurer. When I looked at the ledger, it doesn't seem like my adoptive father was involved.";
mes "I think it was a single corruption at the end, the weapon leak case."; mes "I think it's an isolated corruption at the lowest level, the weapons leak incident.";
next; next;
mes "[Miriam]"; mes "[Miriam]";
mes "I'll have to dig a little deeper, but that's my guess for now."; mes "I'll have to dig a little deeper, but that's my guess for now.";
mes "Oh, give me the documents. I'll take it as evidence."; mes "Oh, please give me the documents. I'll take them as evidence.";
delitem 1000409,5; // Ep18_Docu_File delitem 1000409,5; // Ep18_Docu_File
if ('step == 1)
'step = 2;
if (isbegin_quest(16578) == 1) { if (isbegin_quest(16578) == 1) {
erasequest 16578; erasequest 16578;
setquest 16579; setquest 16579;
} }
close2; close2;
cutin "",255; cutin "",255;
npctalk "Maram: haha, this is so funny", instance_npcname("Maram#base5"); npctalk "Maram: Ha, this is really fun.", instance_npcname("Maram#Base5");
end;
}
if ('step == 2) {
cutin "ep18_miriam_02.png",2;
mes "[Miriam]";
mes "...Just a moment, I'm reading the document.";
close;
}
end; end;
OnTouch: OnTouch:
npctalk "Miriam: Oh, adventurer? Maram you too!?"; if (countitem(1000409) < 5)
npctalk "Miriam: Oh, adventurer? Maram, you too!?";
end; end;
OnInstanceInit: OnInstanceInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(16578) == 1 && countitem(1000409) > 4" ); // Ep18_Docu_File questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(16578) == 1 && countitem(1000409) > 4" ); // Ep18_Docu_File
disablenpc instance_npcname("Miriam#base1");
end; end;
} }
1@tcamp,32,102,3 script Maram#base5 4_EP18_MARAM,{ 1@tcamp,32,102,3 script(DISABLED) Maram#Base5 4_EP18_MARAM,{
if (isbegin_quest(16579) == 0) { if ('step == 1) {
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "I didn't know Miriam was here, right, adventurer?"; mes "I didn't know Miriam would be here. Right, adventurer?";
close3; close3;
} }
cutin "ep18_maram_02.png",2; if ('step == 2) {
mes "[Maram]"; mes "[Maram]";
mes "We moved separately, but in the end we are in the same position."; mes "They moved separately, but ended up in the same place.";
mes "Still, what I got in the process was different, so I guess it has its own meaning."; mes "Still, what I gained from the process was different, so I guess it has some meaning.";
next; next;
cutin "ep18_miriam_02.png",2; cutin "ep18_miriam_02.png",2;
mes "[Miriam]"; mes "[Miriam]";
mes "Then I must be away for a while."; mes "Then I guess I'll have to leave for a while.";
mes "I'm going to pass on my findings to my stepfather."; mes "I'll have to relay what I found out to my adoptive father.";
next; next;
mes "[Miriam]"; mes "[Miriam]";
mes "Because there is a possibility that the adoptive father may not know yet if it is a single corruption."; mes "If it's an isolated corruption, there's a chance that even my adoptive father doesn't know about it yet.";
next; next;
cutin "ep18_maram_03.png",2; cutin "ep18_maram_03.png",2;
mes "[Maram]"; mes "[Maram]";
mes "Is it really an independent corruption? That's probably what bothers me."; mes "Is this really an isolated case of corruption? That is something that bothers me.";
mes "I have something to give to Rachel, Miriam, let's go together."; mes "I also have something to deliver to Rachel, so Miriam, let's go together.";
next; next;
cutin "ep18_maram_01.png",2; cutin "ep18_maram_01.png",2;
mes "[Maram]"; mes "[Maram]";
mes "I'll give you a shortcut, so can you please tell Suad what you found out here?"; mes "I will tell you a shortcut to get out, so would you, adventurer, tell Suad what you found out here?";
mes "We will follow soon, so please go ahead and tell me."; mes "We will follow shortly, so please go and tell us first.";
if (ep18_1_main == 46) { if (ep18_main == 46) {
ep18_1_main = 47; ep18_main = 47;
erasequest 16579; erasequest 16579;
setquest 16580; setquest 16580;
getitem "Ep18_Amethyst_Fragment",50; getitem 1000405,50; // Ep18_Amethyst_Fragment
} }
close2; close2;
warp "wolfvill",162,154; warp "wolfvill",162,154;
end; end;
}
// debug
warp "wolfvill",162,154;
end;
OnInstanceInit: OnInstanceInit:
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(16579) == 1" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(16579) == 1" );
disablenpc instance_npcname("Maram#base5");
end; end;
} }

View File

@ -2,7 +2,7 @@
//= Instance Villa of Deception. //= Instance Villa of Deception.
//===== Description: ========================================= //===== Description: =========================================
//- [Walkthrough conversion] //- [Walkthrough conversion]
//- Require to complete the episode 18.1 main quest. //- Require to complete the Episode 18 main quest.
//- The function to drop an item with random option is defined in re/other/glocal_npc2.txt //- The function to drop an item with random option is defined in re/other/glocal_npc2.txt
// Notes: // Notes:
// Some of the setting can be modified in 'Optional settings'. // Some of the setting can be modified in 'Optional settings'.
@ -16,14 +16,14 @@
wolfvill,79,260,0 script #con_wp11 HIDDEN_WARP_NPC,4,4,{ wolfvill,79,260,0 script #con_wp11 HIDDEN_WARP_NPC,4,4,{
end; end;
OnTouch: OnTouch:
if (ep18_1_main < 57) if (ep18_main < 57)
end; end;
cloakoffnpcself( "Aira#con" ); cloakoffnpcself( "Aira#con" );
end; end;
} }
wolfvill,79,260,4 script(CLOAKED) Aira#con 4_M_BRZ_JACI,{ wolfvill,79,260,4 script(CLOAKED) Aira#con 4_M_BRZ_JACI,{
if (ep18_1_main < 57) if (ep18_main < 57)
end; end;
switch( checkquest(12522,PLAYTIME) ) { switch( checkquest(12522,PLAYTIME) ) {
case -1: case -1:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,50 @@
//===== rAthena Script =======================================
//= Mapflag: special popup map setting.
//===== Description: =========================================
//= Displays a special popup when a player enters the map.
//===== Additional Comments: =================================
//= 1.0 Initial script. [eppc0330]
//============================================================
herosria mapflag specialpopup 1
hero_in1 mapflag specialpopup 1
hero_in2 mapflag specialpopup 1
hero_in3 mapflag specialpopup 1
hero_in4 mapflag specialpopup 1
hero_out1 mapflag specialpopup 1
hero_out2 mapflag specialpopup 1
hero_out3 mapflag specialpopup 1
hero_out4 mapflag specialpopup 1
hero_ent1 mapflag specialpopup 1
hero_ent2 mapflag specialpopup 1
hero_ent3 mapflag specialpopup 1
hero_tra mapflag specialpopup 2
hero_dun1 mapflag specialpopup 2
bl_ice mapflag specialpopup 3
bl_lava mapflag specialpopup 3
bl_grass mapflag specialpopup 3
bl_death mapflag specialpopup 3
bl_soul mapflag specialpopup 3
bl_venom mapflag specialpopup 3
bl_temple mapflag specialpopup 3
thana_step mapflag specialpopup 4
tha_t07 mapflag specialpopup 4
tha_t08 mapflag specialpopup 4
tha_t09 mapflag specialpopup 4
tha_t10 mapflag specialpopup 4
tha_t11 mapflag specialpopup 4
tha_t12 mapflag specialpopup 4
ama_dun01 mapflag specialpopup 5
lhz_dun_n mapflag specialpopup 6
bl_depth1 mapflag specialpopup 7
for_dun01 mapflag specialpopup 8
for_dun02 mapflag specialpopup 8
bl_depth2 mapflag specialpopup 9

View File

@ -60,4 +60,4 @@ Footer:
- Path: npc/re/merchants/barters/enchan_illusion_dungeons.yml - Path: npc/re/merchants/barters/enchan_illusion_dungeons.yml
- Path: npc/re/merchants/barters/quests_exp_175.yml - Path: npc/re/merchants/barters/quests_exp_175.yml
- Path: npc/re/merchants/barters/mysterious_cookie_shop.yml - Path: npc/re/merchants/barters/mysterious_cookie_shop.yml
- Path: npc/re/merchants/barters/quests_18_1.yml - Path: npc/re/merchants/barters/quests_18.yml

View File

@ -91,23 +91,23 @@ Body:
Item: Ep18_Amethyst_Fragment Item: Ep18_Amethyst_Fragment
Amount: 350 Amount: 350
- Index: 7 - Index: 7
Item: Gray_W_Robe
RequiredItems:
- Index: 0
Item: Ep18_Amethyst_Fragment
Amount: 350
- Index: 8
Item: Gray_W_Ring Item: Gray_W_Ring
RequiredItems: RequiredItems:
- Index: 0 - Index: 0
Item: Ep18_Amethyst_Fragment Item: Ep18_Amethyst_Fragment
Amount: 350 Amount: 350
- Index: 9 - Index: 8
Item: Gray_W_Earing Item: Gray_W_Earing
RequiredItems: RequiredItems:
- Index: 0 - Index: 0
Item: Ep18_Amethyst_Fragment Item: Ep18_Amethyst_Fragment
Amount: 350 Amount: 350
- Index: 9
Item: Gray_W_Necklace
RequiredItems:
- Index: 0
Item: Ep18_Amethyst_Fragment
Amount: 350
- Name: barter_ep18_2 - Name: barter_ep18_2
Items: Items:
- Index: 0 - Index: 0

View File

@ -5,9 +5,9 @@
//===== Additional Comments: ================================= //===== Additional Comments: =================================
//= 1.0 First version. //= 1.0 First version.
// Venomous Chimera spawn timer is custom. [Capuche] // Venomous Chimera spawn timer is custom. [Capuche]
//= 1.1 Updated Venomous Chimera spawn timer. [Capuche]
//============================================================ //============================================================
slabw01 monster Human Chimera 3631,45 slabw01 monster Human Chimera 3631,45
slabw01 monster Material Chimera 3632,45 slabw01 monster Material Chimera 3632,45
// unknown timer slabw01 boss_monster Venomous Chimera 3633,1,3600000,600000,0
slabw01 monster Venomous Chimera 3633,1,18000000,600000,0

View File

@ -4007,8 +4007,8 @@ OnInit:
} }
// ba_in01,26,266,3 script Smart Ellie#ep18ely01 4_EP17_TABLET,{ // ba_in01,26,266,3 script Smart Elly#ep18ely01 4_EP17_TABLET,{
ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{ ba_in01,26,266,3 script Smart Elly#ep172_ely01 4_EP17_TABLET,{
if (checkweight(1000103,15) == 0) { if (checkweight(1000103,15) == 0) {
mes "You cannot proceed with the quest because you have too many items in your possession."; mes "You cannot proceed with the quest because you have too many items in your possession.";
mes "Please clean up your inventory and try again."; mes "Please clean up your inventory and try again.";
@ -4016,39 +4016,39 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
} }
if (ep17_2_main < 32) { if (ep17_2_main < 32) {
cutin "ep172_beta.bmp", 2; cutin "ep172_beta.bmp", 2;
mes "[Ellie]"; mes "[Elly]";
mes "Hello, guest."; mes "Hello, guest.";
mes "I'm responsible for the airship hangar's information."; mes "I'm responsible for the airship hangar's information.";
mes "Please call me Ellie."; mes "Please call me Elly.";
close3; close3;
} }
if (ep17_2_main == 32) { if (ep17_2_main == 32) {
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "Hello, guest."; mes "Hello, guest.";
mes "I'm responsible for the airship hangar's information."; mes "I'm responsible for the airship hangar's information.";
mes "Please call me Ellie."; mes "Please call me Elly.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "After the master had destroyed this place, I have been doing something else for a while, but..."; mes "After the master had destroyed this place, I have been doing something else for a while, but...";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Now I'm back at Alpha's request."; mes "Now I'm back at Alpha's request.";
mes "Please leave the hangar's matters to me, Ellie."; mes "Please leave the hangar's matters to me, Elly.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The leader of the 'intruders' had freely access the area for the master's collection 3..."; mes "The leader of the 'intruders' had freely access the area for the master's collection 3...";
mes "I returned here to manage it."; mes "I returned here to manage it.";
npctalk "Sounds troublesome.", "", bc_self; npctalk "Sounds troublesome.", "", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "We are currently tracking the expected path after receiving the incident report."; mes "We are currently tracking the expected path after receiving the incident report.";
mes "However, tracking it is not easy because the main system of No. 3 is completely disconnected."; mes "However, tracking it is not easy because the main system of No. 3 is completely disconnected.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The 'invaders' which the 'guests' calls the 'Illusions' has a 99.9% chance that they made modifications on the system."; mes "The 'invaders' which the 'guests' calls the 'Illusions' has a 99.9% chance that they made modifications on the system.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Dear 'guests', are you here?"; mes "Dear 'guests', are you here?";
cloakoffnpcself( "Est#ep172_est02" ); cloakoffnpcself( "Est#ep172_est02" );
cloakoffnpcself( "Rookie#ep172_rk03" ); cloakoffnpcself( "Rookie#ep172_rk03" );
@ -4063,15 +4063,15 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
mes "I told Alpha that the analysisable data in the current state is over."; mes "I told Alpha that the analysisable data in the current state is over.";
next; next;
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "Yes. I have sent the data."; mes "Yes. I have sent the data.";
mes "Currently, there is no reception from the master's collection 3, but we have caught some unusual signals."; mes "Currently, there is no reception from the master's collection 3, but we have caught some unusual signals.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "This facility has not been used for a long time, but it has been secretly used by the 'intruders' and..."; mes "This facility has not been used for a long time, but it has been secretly used by the 'intruders' and...";
npctalk "Unusual signal?", "Rookie#ep172_rk03", bc_self; npctalk "Unusual signal?", "Rookie#ep172_rk03", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "There are traces of magical communication with certain places outside the mansion."; mes "There are traces of magical communication with certain places outside the mansion.";
mes "It's an intermittent signal."; mes "It's an intermittent signal.";
next; next;
@ -4081,16 +4081,16 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
mes "Where? the enterprise?"; mes "Where? the enterprise?";
next; next;
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "According to the analysis, it's a one-way reception."; mes "According to the analysis, it's a one-way reception.";
mes "It appears to be collecting reports from the outside..."; mes "It appears to be collecting reports from the outside...";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "It will take some time to completely analyze the code because it was used by the 'intruders' for one-way reception."; mes "It will take some time to completely analyze the code because it was used by the 'intruders' for one-way reception.";
next; next;
cutin "16loo_01",0; cutin "16loo_01",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Then, Ellie, I'll ask for one thing."; mes "Then, Elly, I'll ask for one thing.";
mes "Continue receiving the signals as if the 'intruders' leader is still here."; mes "Continue receiving the signals as if the 'intruders' leader is still here.";
next; next;
cutin "ep162_est01",1; cutin "ep162_est01",1;
@ -4099,7 +4099,7 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
mes "With that, we'll be able to trace back the other collaborators out there."; mes "With that, we'll be able to trace back the other collaborators out there.";
next; next;
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "I will do as you say."; mes "I will do as you say.";
mes "We will maintain information patters of the 'intruders' and collect information received from their accomplices from outside the mansion."; mes "We will maintain information patters of the 'intruders' and collect information received from their accomplices from outside the mansion.";
next; next;
@ -4135,10 +4135,10 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
cutin "16loo_03",0; cutin "16loo_03",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Then I'll let everyone and help Alpha."; mes "Then I'll let everyone and help Alpha.";
mes "Take good care of Ellie!"; mes "Take good care of Elly!";
next; next;
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "Do not worry about this place."; mes "Do not worry about this place.";
mes "Me and Almond will take care of it."; mes "Me and Almond will take care of it.";
mes "You can be rest assured."; mes "You can be rest assured.";
@ -4148,189 +4148,190 @@ ba_in01,26,266,3 script Smart Ellie#ep172_ely01 4_EP17_TABLET,{
cloakonnpcself( "Rookie#ep172_rk03" ); cloakonnpcself( "Rookie#ep172_rk03" );
end; end;
} }
if (ep18_1_main == 0 && BaseLevel >= 170) { if (ep18_main == 0 && BaseLevel >= 170) {
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "The periodic signal has not yet been received."; mes "No regular signals have been received yet.";
mes "The whereabouts of your master's collection#3 are also being tracked."; mes "We're also tracking the whereabouts of your collection #3.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Don't worry."; mes "No worries.";
mes "Time is on our side"; mes "Time is on our side.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "I and Alpha will analyze the information properly, so if you clean up the abandoned remnants... Ah!"; mes "We'll properly analyze the information, so it would be great if the guest could clean up the remnants left behind... Oh!";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Please don't go anywhere for a moment."; mes "Just a moment, please stay here.";
mes "It will be over soon"; mes "It'll be over soon.";
mes "Time was on our side, wasn't it?"; mes "Time is on our side, right?";
next; next;
// note: progressbar_npc must be after "next" otherwise the client may crash mes "[Elly]";
progressbar_npc "FFFF00",4;
mes "[Ellie]";
mes "Wait a minute..."; mes "Wait a minute...";
mes "..."; mes "...";
mes "..."; mes "...";
// note: progressbar_npc must be after "next" otherwise the client may crash
// progressbar_npc "FFFF00",4;
next; next;
mes "[Ellie]"; progressbar_npc "FFFF00",4;
mes "As soon as the password is decrypted, it will be fast."; mes "[Elly]";
mes "The thing that took the longest is an instant."; mes "Once we decrypt the code, it'll be quick.";
mes "The longest part is over, so it feels like it went by in a flash.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "There is something in ^0000FFRachel^000000"; mes "There is something in ^0000FFRachel^000000.";
mes "Of course I've only heard of Rachel, but I've never been there."; mes "Of course, I've only heard of Rachel, and I've never been there.";
mes "The 'collaborators' there don't seem to know that their heads have moved yet."; mes "The 'collaborators' at that location seem unaware of their leaders' movements as of yet.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Although we don't know where your master's Collection#3 is yet, we'll have to keep an eye out for information coming in here..."; mes "Although we still don't know the whereabouts of Master's Collection No. 3, we need to continue to gather information coming in from here...";
mes "what if?"; mes "What should we do?";
next; next;
select( "What?" ); select( "What?" );
mes "[" + strcharinfo(0) + "]"; mes "[" + strcharinfo(0) + "]";
mes "What are you doing?"; mes "What should I do?";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The collaborator's position has been roughly secured. Reportedly 'waiting for your next instruction',"; mes "The location of the collaborator has been roughly secured. According to the report, they are awaiting further instructions, so...";
mes "Then, before the next instruction is issued, we should catch up on that side as soon as possible..."; mes "In that case, we should thoroughly investigate that area before the next instructions are given...";
cloakoffnpcself( "Rookie#ep181_rk01" ); cloakoffnpcself( "Rookie#ep181_rk01" );
cloakoffnpcself( "EST#ep181_est01" ); cloakoffnpcself( "Est#ep181_est01" );
npctalk "Rookie: Did you call?", "Rookie#ep181_rk01", bc_self; npctalk "Rookie: Did you call me?", "Rookie#ep181_rk01", bc_self;
npctalk "EST: It ended sooner than I thought.", "EST#ep181_est01", bc_self; npctalk "Est: That was quicker than I thought.", "Est#ep181_est01", bc_self;
next; next;
cutin "ep162_est01.bmp",1; cutin "ep162_est01.bmp",1;
mes "[EST]"; mes "[Est]";
mes "Okay then Rachel..."; mes "Okay, so Rachel...";
next; next;
cutin "16loo_01.bmp",0; cutin "16loo_01.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Rachel... who's going?"; mes "Rachel... Who's going?";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Is this a conflict of opinion?"; mes "Are we having a difference of opinion?";
next; next;
cutin "16loo_03.bmp",0; cutin "16loo_03.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "It's not like that..."; mes "Not really...";
mes "I think it will be a bit difficult if we all go."; mes "I think it would be a little awkward if we all went.";
next; next;
cutin "ep162_est01.bmp",1; cutin "ep162_est01.bmp",1;
mes "[EST]"; mes "[Est]";
mes "Ah... I see."; mes "Ah, I see.";
mes "Yes. If 'Rebellion' moves, it could become a diplomatic matter."; mes "Yes. If the Rebellion moves, it could become a diplomatic issue.";
next; next;
cutin "16loo_03.bmp",0; cutin "16loo_03.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Yes. Especially if it's Rachel."; mes "Yes, even more so if it's Rachel.";
mes "The problem between the mansion and the business has not yet been fully resolved..."; mes "...and the problems between the mansion and the company haven't all been solved yet.";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Okay."; mes "I see.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Then..."; mes "If so, then...";
next; next;
select( "Why are you looking at me?" ); select( "Why are they looking at me?" );
cutin "",255; cutin "",255;
mes "[" + strcharinfo(0) + "]"; mes "[" + strcharinfo(0) + "]";
mes "what are you doing?"; mes "What do I do?";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Let's go, Rachel."; mes "Let's go, Rachel.";
npctalk "Rookie: name.", "Rookie#ep181_rk01", bc_self; npctalk "Rookie: So it's a place name, huh?", "Rookie#ep181_rk01", bc_self;
npctalk "Est: Name.", "EST#ep181_est01", bc_self; npctalk "Est: A place name.", "Est#ep181_est01", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Are other guests affiliated?"; mes "But the other guests have affiliations, don't they?";
mes "It is difficult when disputes arise because of jurisdiction."; mes "It will be difficult if there is a conflict due to jurisdiction.";
mes "You never know how long it will take, so it's not suitable for a companion."; mes "You don't know how long it will take, so it's not a good idea to accompany them.";
next; next;
cutin "ep162_est01.bmp",1; cutin "ep162_est01.bmp",1;
mes "[EST]"; mes "[Est]";
mes "It sounds like you want to go there yourself."; mes "That sounds like you're saying you're definitely going to go in person.";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Yes."; mes "Yes, it is.";
mes "Please wait a minute."; mes "Please wait a moment.";
next; next;
progressbar_npc "00CCFF",7; progressbar_npc "CCFF",7;
mes "[Ellie]"; mes "[Elly]";
mes "..."; mes "...";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "You have permission."; mes "You're authorized.";
npctalk "Meeting ended.", "", bc_self; npctalk "The meeting has ended.", "Smart Elly#ep18ely01", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The purpose is support, not hindrance."; mes "The purpose is not to hinder but to support.";
mes "I will follow you without burden."; mes "We'll follow along, no pressure.";
mes "I'll give you this."; mes "I will give this to you.";
next; next;
cutin "",255; cutin "",255;
mes "What Ellie gave her was a doll with a slightly droopy feel that resembled Ellie."; mes "What Elly gave was a doll that looked exactly like Elly and felt a little stretched out.";
mes "It may not necessarily be Ellie."; mes "It may not be Elly, but...";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "We have equipment that can transmit and receive data over long distances."; mes "We also have equipment capable of long-distance data transmission and reception.";
mes "Because we are such beings."; mes "Because that's who we are.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "But things are a little different now, so I'll give you a simple beta."; mes "But things are a little different now, so I'll give you a beta version.";
npctalk "Be sure to take it with you", "", bc_self; npctalk "Don't forget to take it with you.", "Smart Elly#ep18ely01", bc_self;
next; next;
cutin "16loo_02.bmp",0; cutin "16loo_02.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Uh... Mini Ellie?"; mes "Uh... Mini Elly?";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "Okay. I'll take that name."; mes "Great, I'm adopting that name.";
mes "Using the resources of the main body, it is possible to collect visual and auditory information and communicate like a clone."; mes "I can collect information like vision and hearing and communicate like an avatar using my own resources.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "There is no individual core, so the information obtained is not shared between betas unless I update it,"; mes "There are no individual cores, so the information I get is not shared between betas unless I update it,";
mes "If communication is lost, it's just a doll."; mes "If communication is lost, it's just a puppet.";
next; next;
cutin "16loo_01.bmp",0; cutin "16loo_01.bmp",0;
mes "[Rookie]"; mes "[Rookie]";
mes "Then call us if you need assistance."; mes "Then call us if you need our support.";
mes "Like Ellie, we will provide generous support except for the manpower."; mes "I will support you without reservation, just like Elly, except for manpower.";
next; next;
cutin "ep172_beta.bmp",2; cutin "ep172_beta.bmp",2;
mes "[Ellie]"; mes "[Elly]";
mes "It will be so"; mes "Yes, I will do that.";
mes "Please take care of yourself."; mes "Please take care of yourself.";
npctalk "I'm going with you, but it's strange to greet you like this.", "", bc_self; npctalk "It's strange to be greeting each other like this when we're going together.", "Smart Elly#ep18ely01", bc_self;
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "The almost exact coordinates from which the signal was sent..."; mes "The nearly exact coordinates of the signal's origin are...";
mes "About <NAVI>[here]<INFO>rachel,182,176,0,101,0</INFO></NAVI>"; mes "around <NAVI>[here]<INFO>rachel,182,176,0,101,0</INFO></NAVI> or so.";
ep18_1_main = 1; ep18_main = 1;
setquest 8681; setquest 8681;
getitem 400127,1; // Ep18_Mini_Elly getitem 400127,1; // Ep18_Mini_Elly
close3; close3;
} }
if (ep18_1_main == 1) { if (ep18_main == 1) {
mes "[Ellie]"; mes "[Elly]";
mes "Please be safe."; mes "Safe travels to Rachel.";
close; close;
} }
cutin "ep172_beta",2; cutin "ep172_beta",2;
mes "[Ellie]"; mes "[Elly]";
mes "No intermittent signal has been received yet."; mes "No intermittent signal has been received yet.";
mes "The whereabouts of the master's collection 3 are also being tracked at the same time."; mes "The whereabouts of the master's collection 3 are also being tracked at the same time.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Don't worry."; mes "Don't worry.";
mes "Time is on our side."; mes "Time is on our side.";
next; next;
mes "[Ellie]"; mes "[Elly]";
mes "Me and Alpha will analyze the information properly, so I'd like you to clean up the intruders remnant."; mes "Me and Alpha will analyze the information properly, so I'd like you to clean up the intruders remnant.";
close3; close3;
@ -4339,7 +4340,7 @@ OnInit:
// questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(18018) == 1" ); // questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(18018) == 1" );
// check for episode 17.2 completion // check for episode 17.2 completion
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(8681) == 0 && isbegin_quest(18018) == 2 && BaseLevel >= 170" ); questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(8681) == 0 && isbegin_quest(18018) == 2 && BaseLevel >= 170" );
end; end;
} }
@ -9389,8 +9390,8 @@ ba_in01,32,250,3 script Sweety#ep172_swty 4_EP17_SWEETY,{
mes "[Almond]"; mes "[Almond]";
mes "Not possible."; mes "Not possible.";
mes "You won't be able to receieve it even if it came."; mes "You won't be able to receieve it even if it came.";
mes "Ellie took your receiving chip while we're repairing you."; mes "Elly took your receiving chip while we're repairing you.";
mes "Doesn't that mean Ellie will take the orders for you?"; mes "Doesn't that mean Elly will take the orders for you?";
npctalk "No! I'll receive my next orders soon!", "", bc_self; npctalk "No! I'll receive my next orders soon!", "", bc_self;
next; next;
mes "[Almond]"; mes "[Almond]";

13102
npc/re/quests/quests_18.txt Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1225,9 +1225,9 @@ OnInit:
rockrdg1,160,306,3 duplicate(dummy_cloaked_npc) Johnny James#revt04 4_M_JOHNNYJAMES rockrdg1,160,306,3 duplicate(dummy_cloaked_npc) Johnny James#revt04 4_M_JOHNNYJAMES
rockrdg1,168,306,3 duplicate(dummy_cloaked_npc) Albert Ford#revt08 4_M_ALBERTFORD rockrdg1,168,306,3 duplicate(dummy_cloaked_npc) Albert Ford#revt08 4_M_ALBERTFORD
rockrdg1,156,302,7 duplicate(dummy_cloaked_npc) Ivoka Skudi#revt02 4_M_EVOKASCUDI rockrdg1,156,302,7 duplicate(dummy_cloaked_npc) Ivoka Skudi#revt02 4_M_EVOKASCUDI
rockrdg1,156,306,5 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt01 4_M_EVOKASCUDI rockrdg1,156,306,5 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt05 4_M_EVOKASCUDI
rockrdg1,161,302,1 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt02 4_M_EVOKASCUDI rockrdg1,161,302,1 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt06 4_M_EVOKASCUDI
rockrdg1,164,306,3 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt03 4_M_EVOKASCUDI rockrdg1,164,306,3 duplicate(dummy_cloaked_npc) Cactus Gunslinger#revt07 4_M_EVOKASCUDI
rockrdg1,156,312,3 script Unmoving Freight Train# 4_ENERGY_RED,{ rockrdg1,156,312,3 script Unmoving Freight Train# 4_ENERGY_RED,{
if (rock_main_quest == 5) { if (rock_main_quest == 5) {

View File

@ -242,7 +242,7 @@ npc: npc/re/quests/quests_16_2.txt
npc: npc/re/quests/quests_illusion_dungeons.txt npc: npc/re/quests/quests_illusion_dungeons.txt
npc: npc/re/quests/quests_17_1.txt npc: npc/re/quests/quests_17_1.txt
npc: npc/re/quests/quests_17_2.txt npc: npc/re/quests/quests_17_2.txt
npc: npc/re/quests/quests_18_1.txt npc: npc/re/quests/quests_18.txt
npc: npc/re/quests/quests_aldebaran.txt npc: npc/re/quests/quests_aldebaran.txt
npc: npc/re/quests/quests_dewata.txt npc: npc/re/quests/quests_dewata.txt
npc: npc/re/quests/quests_dicastes.txt npc: npc/re/quests/quests_dicastes.txt

View File

@ -22,3 +22,4 @@ npc: npc/re/mapflag/town.txt
npc: npc/re/mapflag/reset.txt npc: npc/re/mapflag/reset.txt
npc: npc/re/mapflag/skill_duration.txt npc: npc/re/mapflag/skill_duration.txt
npc: npc/re/mapflag/nodynamicnpc.txt npc: npc/re/mapflag/nodynamicnpc.txt
npc: npc/re/mapflag/specialpopup.txt

View File

@ -527,6 +527,7 @@ CREATE TABLE IF NOT EXISTS `guild_expulsion` (
`account_id` int(11) unsigned NOT NULL default '0', `account_id` int(11) unsigned NOT NULL default '0',
`name` varchar(24) NOT NULL default '', `name` varchar(24) NOT NULL default '',
`mes` varchar(40) NOT NULL default '', `mes` varchar(40) NOT NULL default '',
`char_id` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`guild_id`,`name`) PRIMARY KEY (`guild_id`,`name`)
) ENGINE=MyISAM; ) ENGINE=MyISAM;

View File

@ -0,0 +1 @@
UPDATE `char_reg_num` SET `key` = 'ep18_main' WHERE `key` = 'ep18_1_main';

View File

@ -0,0 +1 @@
ALTER TABLE `guild_expulsion` ADD COLUMN `char_id` int(11) unsigned NOT NULL default '0';

View File

@ -2425,7 +2425,7 @@ bool char_checkdb(void){
return false; return false;
} }
//checking guild_expulsion_db //checking guild_expulsion_db
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes` FROM `%s` LIMIT 1;", schema_config.guild_expulsion_db) ){ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes`,`char_id` FROM `%s` LIMIT 1;", schema_config.guild_expulsion_db) ){
Sql_ShowDebug(sql_handle); Sql_ShowDebug(sql_handle);
return false; return false;
} }

View File

@ -309,8 +309,10 @@ int chclif_parse_pincode_setnew( int fd, struct char_session_data* sd ){
if( charserv_config.pincode_config.pincode_enabled==0 || RFIFOL(fd,2) != sd->account_id ) { if( charserv_config.pincode_config.pincode_enabled==0 || RFIFOL(fd,2) != sd->account_id ) {
set_eof(fd); set_eof(fd);
return 1; return 1;
} } else if (strnlen(sd->pincode, PINCODE_LENGTH) > 0) {
else { set_eof(fd);
return 1;
} else {
char newpin[PINCODE_LENGTH+1]; char newpin[PINCODE_LENGTH+1];
memset(newpin,0,PINCODE_LENGTH+1); memset(newpin,0,PINCODE_LENGTH+1);
strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH ); strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH );

View File

@ -308,8 +308,8 @@ int inter_guild_tosql( mmo_guild &g, int flag ){
Sql_EscapeStringLen(sql_handle, esc_name, e->name, strnlen(e->name, NAME_LENGTH)); Sql_EscapeStringLen(sql_handle, esc_name, e->name, strnlen(e->name, NAME_LENGTH));
Sql_EscapeStringLen(sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes))); Sql_EscapeStringLen(sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes)));
if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`) " if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`,`char_id`) "
"VALUES ('%d','%d','%s','%s')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes) ) "VALUES ('%u','%u','%s','%s','%u')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes, e->char_id) )
Sql_ShowDebug(sql_handle); Sql_ShowDebug(sql_handle);
} }
} }
@ -487,7 +487,7 @@ std::shared_ptr<CharGuild> inter_guild_fromsql( int32 guild_id ){
} }
//printf("- Read guild_expulsion %d from sql \n",guild_id); //printf("- Read guild_expulsion %d from sql \n",guild_id);
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name`,`mes` FROM `%s` WHERE `guild_id`='%d'", schema_config.guild_expulsion_db, guild_id) ) if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name`,`mes`,`char_id` FROM `%s` WHERE `guild_id`='%d'", schema_config.guild_expulsion_db, guild_id) )
{ {
Sql_ShowDebug(sql_handle); Sql_ShowDebug(sql_handle);
return nullptr; return nullptr;
@ -499,6 +499,7 @@ std::shared_ptr<CharGuild> inter_guild_fromsql( int32 guild_id ){
Sql_GetData(sql_handle, 0, &data, nullptr); e->account_id = atoi(data); Sql_GetData(sql_handle, 0, &data, nullptr); e->account_id = atoi(data);
Sql_GetData(sql_handle, 1, &data, &len); memcpy(e->name, data, zmin(len, NAME_LENGTH)); Sql_GetData(sql_handle, 1, &data, &len); memcpy(e->name, data, zmin(len, NAME_LENGTH));
Sql_GetData(sql_handle, 2, &data, &len); memcpy(e->mes, data, zmin(len, sizeof(e->mes))); Sql_GetData(sql_handle, 2, &data, &len); memcpy(e->mes, data, zmin(len, sizeof(e->mes)));
Sql_GetData(sql_handle, 3, &data, nullptr); e->char_id = strtoul(data, nullptr, 10);
} }
//printf("- Read guild_skill %d from sql \n",guild_id); //printf("- Read guild_skill %d from sql \n",guild_id);
@ -1343,6 +1344,7 @@ int mapif_parse_GuildLeave(int fd, int guild_id, uint32 account_id, uint32 char_
} }
// Save the expulsion entry // Save the expulsion entry
g->guild.expulsion[j].account_id = account_id; g->guild.expulsion[j].account_id = account_id;
g->guild.expulsion[j].char_id = char_id;
safestrncpy(g->guild.expulsion[j].name, g->guild.member[i].name, NAME_LENGTH); safestrncpy(g->guild.expulsion[j].name, g->guild.member[i].name, NAME_LENGTH);
safestrncpy(g->guild.expulsion[j].mes, mes, 40); safestrncpy(g->guild.expulsion[j].mes, mes, 40);
} }

View File

@ -741,6 +741,7 @@ struct guild_expulsion {
char name[NAME_LENGTH]; char name[NAME_LENGTH];
char mes[40]; char mes[40];
uint32 account_id; uint32 account_id;
uint32 char_id;
}; };
struct guild_skill { struct guild_skill {

View File

@ -1150,6 +1150,51 @@ ACMD_FUNC(hide)
return 0; return 0;
} }
ACMD_FUNC(resetcooltime)
{
nullpo_retr(-1, sd);
for( size_t i = 0; i < ARRAYLENGTH( sd->scd ); i++ ){
if( sd->scd[i] != nullptr ) {
sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( sd->scd[i]->skill_id )->name ); // Found skill '%s', unblocking...
clif_displaymessage( sd->fd, atcmd_output );
if (battle_config.display_status_timers)
clif_skill_cooldown( *sd, sd->scd[i]->skill_id, 0 );
delete_timer(sd->scd[i]->timer, skill_blockpc_end);
aFree(sd->scd[i]);
sd->scd[i] = nullptr;
}
}
if( sd->hd != nullptr && hom_is_active( sd->hd ) ){
for( const uint16& skill_id : sd->hd->blockskill ){
sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( skill_id )->name ); // Found skill '%s', unblocking...
clif_displaymessage( sd->fd, atcmd_output );
if (battle_config.display_status_timers)
clif_skill_cooldown( *sd, skill_id, 0 );
}
sd->hd->blockskill.clear();
}
if( sd->md != nullptr ){
for( const uint16& skill_id : sd->md->blockskill ){
sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( skill_id )->name ); // Found skill '%s', unblocking...
clif_displaymessage( sd->fd, atcmd_output );
if (battle_config.display_status_timers)
clif_skill_cooldown( *sd, skill_id, 0 );
}
sd->md->blockskill.clear();
}
return 0;
}
/*========================================== /*==========================================
* Changes a character's class * Changes a character's class
*------------------------------------------*/ *------------------------------------------*/
@ -1241,7 +1286,7 @@ ACMD_FUNC(alive)
clif_displaymessage(fd, msg_txt(sd,667)); // You're not dead. clif_displaymessage(fd, msg_txt(sd,667)); // You're not dead.
return -1; return -1;
} }
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1); clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4);
clif_displaymessage(fd, msg_txt(sd,16)); // You've been revived! It's a miracle! clif_displaymessage(fd, msg_txt(sd,16)); // You've been revived! It's a miracle!
return 0; return 0;
} }
@ -1314,7 +1359,7 @@ ACMD_FUNC(heal)
if ( hp < 0 && sp <= 0 ) { if ( hp < 0 && sp <= 0 ) {
status_damage(nullptr, &sd->bl, -hp, -sp, 0, 0, 0); status_damage(nullptr, &sd->bl, -hp, -sp, 0, 0, 0);
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false); clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
clif_displaymessage(fd, msg_txt(sd,156)); // HP or/and SP modified. clif_displaymessage(fd, msg_txt(sd,156)); // HP or/and SP modified.
return 0; return 0;
} }
@ -1325,7 +1370,7 @@ ACMD_FUNC(heal)
status_heal(&sd->bl, hp, 0, 0); status_heal(&sd->bl, hp, 0, 0);
else { else {
status_damage(nullptr, &sd->bl, -hp, 0, 0, 0, 0); status_damage(nullptr, &sd->bl, -hp, 0, 0, 0, 0);
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false); clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
} }
} }
@ -3547,7 +3592,7 @@ static void atcommand_raise_sub(map_session_data* sd) {
status_revive(&sd->bl, 100, 100); status_revive(&sd->bl, 100, 100);
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1); clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4);
clif_displaymessage(sd->fd, msg_txt(sd,63)); // Mercy has been shown. clif_displaymessage(sd->fd, msg_txt(sd,63)); // Mercy has been shown.
} }
@ -3747,7 +3792,7 @@ ACMD_FUNC(lostskill)
sd->status.skill[sk_idx].lv = 0; sd->status.skill[sk_idx].lv = 0;
sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT; sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT;
clif_deleteskill(sd,skill_id); clif_deleteskill(*sd,skill_id);
clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill. clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill.
return 0; return 0;
@ -4330,6 +4375,9 @@ ACMD_FUNC(reload) {
}else if( strstr( command, "barterdb" ) || strncmp( message, "barterdb", 4 ) == 0 ){ }else if( strstr( command, "barterdb" ) || strncmp( message, "barterdb", 4 ) == 0 ){
barter_db.reload(); barter_db.reload();
clif_displaymessage(fd, msg_txt(sd, 830)); // Barter database has been reloaded. clif_displaymessage(fd, msg_txt(sd, 830)); // Barter database has been reloaded.
} else if (strstr(command, "logconf") || strncmp(message, "logconf", 3) == 0) {
log_config_read(LOG_CONF_NAME);
clif_displaymessage(fd, msg_txt(sd,1536)); // Log configuration has been reloaded.
} }
return 0; return 0;
@ -6249,7 +6297,6 @@ ACMD_FUNC(useskill)
*------------------------------------------*/ *------------------------------------------*/
ACMD_FUNC(displayskill) ACMD_FUNC(displayskill)
{ {
struct status_data * status;
t_tick tick; t_tick tick;
uint16 skill_id; uint16 skill_id;
uint16 skill_lv = 1; uint16 skill_lv = 1;
@ -6262,14 +6309,15 @@ ACMD_FUNC(displayskill)
clif_displaymessage(fd, msg_txt(sd,825));// Effect Types: 0: All, 1: Damage, 2: Splash Dmg, 3: No Damage, 4: Ground clif_displaymessage(fd, msg_txt(sd,825));// Effect Types: 0: All, 1: Damage, 2: Splash Dmg, 3: No Damage, 4: Ground
return -1; return -1;
} }
status = status_get_status_data(&sd->bl);
status_data* status = status_get_status_data(sd->bl);
tick = gettick(); tick = gettick();
if (type == 0 || type == 1) if (type == 0 || type == 1)
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE); clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE);
if (type == 0 || type == 2) if (type == 0 || type == 2)
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH); clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH);
if (type == 0 || type == 3) if (type == 0 || type == 3)
clif_skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1); clif_skill_nodamage(&sd->bl, sd->bl, skill_id, skill_lv);
if (type == 0 || type == 4) if (type == 0 || type == 4)
clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick); clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
return 0; return 0;
@ -8181,7 +8229,6 @@ ACMD_FUNC(homtalk)
ACMD_FUNC(hominfo) ACMD_FUNC(hominfo)
{ {
struct homun_data *hd; struct homun_data *hd;
struct status_data *status;
nullpo_retr(-1, sd); nullpo_retr(-1, sd);
if ( !hom_is_active(sd->hd) ) { if ( !hom_is_active(sd->hd) ) {
@ -8190,7 +8237,7 @@ ACMD_FUNC(hominfo)
} }
hd = sd->hd; hd = sd->hd;
status = status_get_status_data(&hd->bl); status_data* status = status_get_status_data(hd->bl);
clif_displaymessage(fd, msg_txt(sd,1261)); // Homunculus stats: clif_displaymessage(fd, msg_txt(sd,1261)); // Homunculus stats:
snprintf(atcmd_output, sizeof(atcmd_output) ,msg_txt(sd,1262), // HP: %d/%d - SP: %d/%d snprintf(atcmd_output, sizeof(atcmd_output) ,msg_txt(sd,1262), // HP: %d/%d - SP: %d/%d
@ -11017,6 +11064,7 @@ void atcommand_basecommands(void) {
ACMD_DEF(guildstorage), ACMD_DEF(guildstorage),
ACMD_DEF(option), ACMD_DEF(option),
ACMD_DEF(hide), // + /hide ACMD_DEF(hide), // + /hide
ACMD_DEF(resetcooltime), // + /resetcooltime
ACMD_DEFR(jobchange, ATCMD_NOCONSOLE), ACMD_DEFR(jobchange, ATCMD_NOCONSOLE),
ACMD_DEF(kill), ACMD_DEF(kill),
ACMD_DEF(alive), ACMD_DEF(alive),

View File

@ -161,7 +161,7 @@ static int battle_getenemy_sub(struct block_list *bl, va_list ap)
if (*c >= 24) if (*c >= 24)
return 0; return 0;
if (status_isdead(bl)) if (status_isdead(*bl))
return 0; return 0;
if (battle_check_target(target, bl, BCT_ENEMY) > 0) { if (battle_check_target(target, bl, BCT_ENEMY) > 0) {
@ -219,7 +219,7 @@ static int battle_getenemyarea_sub(struct block_list *bl, va_list ap)
if( *c >= 23 ) if( *c >= 23 )
return 0; return 0;
if( status_isdead(bl) ) if( status_isdead(*bl) )
return 0; return 0;
if( battle_check_target(src, bl, BCT_ENEMY) > 0 ) {// Is Enemy!... if( battle_check_target(src, bl, BCT_ENEMY) > 0 ) {// Is Enemy!...
@ -286,7 +286,7 @@ int battle_damage(struct block_list *src, struct block_list *target, int64 damag
dmg_change = status_damage(src, target, damage, 0, delay, 16, skill_id); // Coma attack dmg_change = status_damage(src, target, damage, 0, delay, 16, skill_id); // Coma attack
else else
dmg_change = status_fix_damage(src, target, damage, delay, skill_id); dmg_change = status_fix_damage(src, target, damage, delay, skill_id);
if (attack_type && !status_isdead(target) && additional_effects) if (attack_type && !status_isdead(*target) && additional_effects)
skill_additional_effect(src, target, skill_id, skill_lv, attack_type, dmg_lv, tick); skill_additional_effect(src, target, skill_id, skill_lv, attack_type, dmg_lv, tick);
if (dmg_lv > ATK_BLOCK && attack_type && additional_effects) if (dmg_lv > ATK_BLOCK && attack_type && additional_effects)
skill_counter_additional_effect(src, target, skill_id, skill_lv, attack_type, tick); skill_counter_additional_effect(src, target, skill_id, skill_lv, attack_type, tick);
@ -296,7 +296,7 @@ int battle_damage(struct block_list *src, struct block_list *target, int64 damag
if (md != nullptr) { if (md != nullptr) {
// Trigger monster skill condition for non-skill attacks. // Trigger monster skill condition for non-skill attacks.
if (!status_isdead(target) && src != target) { if (!status_isdead(*target) && src != target) {
if (damage > 0) if (damage > 0)
mobskill_event(md, src, tick, attack_type, damage); mobskill_event(md, src, tick, attack_type, damage);
if (skill_id > 0) if (skill_id > 0)
@ -335,7 +335,7 @@ TIMER_FUNC(battle_delay_damage_sub){
struct block_list* src = map_id2bl(dat->src_id); struct block_list* src = map_id2bl(dat->src_id);
struct block_list* target = map_id2bl(dat->target_id); struct block_list* target = map_id2bl(dat->target_id);
if (target && !status_isdead(target)) { if (target && !status_isdead(*target)) {
if( src && target->m == src->m && if( src && target->m == src->m &&
(target->type != BL_PC || ((TBL_PC*)target)->invincible_timer == INVALID_TIMER) && (target->type != BL_PC || ((TBL_PC*)target)->invincible_timer == INVALID_TIMER) &&
check_distance_bl(src, target, dat->distance) ) //Check to see if you haven't teleported. [Skotlex] check_distance_bl(src, target, dat->distance) ) //Check to see if you haven't teleported. [Skotlex]
@ -507,7 +507,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
struct block_list *src2; struct block_list *src2;
if( !su || !su->alive || (sg = su->group) == nullptr || !sg || sg->val3 == -1 || if( !su || !su->alive || (sg = su->group) == nullptr || !sg || sg->val3 == -1 ||
(src2 = map_id2bl(sg->src_id)) == nullptr || status_isdead(src2) ) (src2 = map_id2bl(sg->src_id)) == nullptr || status_isdead(*src2) )
return 0; return 0;
if( sg->unit_id != UNT_FIREWALL ) { if( sg->unit_id != UNT_FIREWALL ) {
@ -696,8 +696,6 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
std::vector<e_race2> s_race2, /// Attacker Race2 std::vector<e_race2> s_race2, /// Attacker Race2
t_race2; ///< Target Race2 t_race2; ///< Target Race2
enum e_element s_defele; ///< Attacker Element (not a weapon or skill element!) enum e_element s_defele; ///< Attacker Element (not a weapon or skill element!)
struct status_data *sstatus, ///< Attacker status data
*tstatus; ///< Target status data
int64 original_damage; int64 original_damage;
if( !damage ) if( !damage )
@ -709,8 +707,10 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
tsd = BL_CAST(BL_PC, target); tsd = BL_CAST(BL_PC, target);
t_class = status_get_class(target); t_class = status_get_class(target);
s_class = status_get_class(src); s_class = status_get_class(src);
sstatus = status_get_status_data(src); ///< Attacker status data
tstatus = status_get_status_data(target); status_data* sstatus = status_get_status_data(*src);
///< Target status data
status_data* tstatus = status_get_status_data(*target);
s_race2 = status_get_race2(src); s_race2 = status_get_race2(src);
t_race2 = status_get_race2(target); t_race2 = status_get_race2(target);
s_defele = (tsd) ? (enum e_element)status_get_element(src) : ELE_NONE; s_defele = (tsd) ? (enum e_element)status_get_element(src) : ELE_NONE;
@ -1167,7 +1167,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
int element; int element;
if (flag & BF_WEAPON) { if (flag & BF_WEAPON) {
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
if(sstatus->rhw.ele == ELE_NEUTRAL && sstatus->lhw.ele > sstatus->rhw.ele) if(sstatus->rhw.ele == ELE_NEUTRAL && sstatus->lhw.ele > sstatus->rhw.ele)
element = battle_get_weapon_element(d, src, target, skill_id, skill_lv, EQI_HAND_L, false); element = battle_get_weapon_element(d, src, target, skill_id, skill_lv, EQI_HAND_L, false);
else else
@ -1290,7 +1290,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
// Weapon Blocking can be triggered while the above statuses are active. // Weapon Blocking can be triggered while the above statuses are active.
if ((sce = sc->getSCE(SC_WEAPONBLOCKING)) && flag & (BF_SHORT | BF_WEAPON) && rnd() % 100 < sce->val2) { if ((sce = sc->getSCE(SC_WEAPONBLOCKING)) && flag & (BF_SHORT | BF_WEAPON) && rnd() % 100 < sce->val2) {
clif_skill_nodamage(target, src, GC_WEAPONBLOCKING, sce->val1, 1); clif_skill_nodamage(target, *src, GC_WEAPONBLOCKING, sce->val1);
sc_start(src, target, SC_WEAPONBLOCK_ON, 100, src->id, skill_get_time2(GC_WEAPONBLOCKING, sce->val1)); sc_start(src, target, SC_WEAPONBLOCK_ON, 100, src->id, skill_get_time2(GC_WEAPONBLOCKING, sce->val1));
d->dmg_lv = ATK_BLOCK; d->dmg_lv = ATK_BLOCK;
return false; return false;
@ -1358,7 +1358,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
skill_id == WL_SOULEXPANSION || skill_id == WL_SOULEXPANSION ||
skill_id == AG_SOUL_VC_STRIKE || skill_id == AG_SOUL_VC_STRIKE ||
(skill_id && skill_get_ele(skill_id, skill_lv) == ELE_GHOST) || (skill_id && skill_get_ele(skill_id, skill_lv) == ELE_GHOST) ||
(skill_id == 0 && (status_get_status_data(src))->rhw.ele == ELE_GHOST)) (skill_id == 0 && (status_get_status_data(*src))->rhw.ele == ELE_GHOST))
{ {
if (skill_id == WL_SOULEXPANSION) if (skill_id == WL_SOULEXPANSION)
damage *= 2; // If used against a player in White Imprison, the skill deals double damage. damage *= 2; // If used against a player in White Imprison, the skill deals double damage.
@ -1407,12 +1407,12 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == target->id)) && (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == target->id)) &&
check_distance_bl(target, d_bl, sce_d->val3)) check_distance_bl(target, d_bl, sce_d->val3))
{ //If player is target of devotion, show guard effect on the devotion caster rather than the target { //If player is target of devotion, show guard effect on the devotion caster rather than the target
clif_skill_nodamage(d_bl, d_bl, CR_AUTOGUARD, sce->val1, 1); clif_skill_nodamage(d_bl, *d_bl, CR_AUTOGUARD, sce->val1);
unit_set_walkdelay(d_bl, gettick(), delay, 1); unit_set_walkdelay(d_bl, gettick(), delay, 1);
d->dmg_lv = ATK_MISS; d->dmg_lv = ATK_MISS;
return false; return false;
} else { } else {
clif_skill_nodamage(target, target, CR_AUTOGUARD, sce->val1, 1); clif_skill_nodamage(target, *target, CR_AUTOGUARD, sce->val1);
unit_set_walkdelay(target, gettick(), delay, 1); unit_set_walkdelay(target, gettick(), delay, 1);
#ifdef RENEWAL #ifdef RENEWAL
if (sc->getSCE(SC_SHRINK)) if (sc->getSCE(SC_SHRINK))
@ -1455,7 +1455,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
return false; return false;
if ((sce = sc->getSCE(SC_PARRYING)) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd() % 100 < sce->val2) { if ((sce = sc->getSCE(SC_PARRYING)) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd() % 100 < sce->val2) {
clif_skill_nodamage(target, target, LK_PARRYING, sce->val1, 1); clif_skill_nodamage(target, *target, LK_PARRYING, sce->val1);
if (skill_id == LK_PARRYING) { if (skill_id == LK_PARRYING) {
unit_data *ud = unit_bl2ud(target); unit_data *ud = unit_bl2ud(target);
@ -1471,7 +1471,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
if (sd && pc_issit(sd)) if (sd && pc_issit(sd))
pc_setstand(sd, true); //Stand it to dodge. pc_setstand(sd, true); //Stand it to dodge.
clif_skill_nodamage(target, target, TK_DODGE, 1, 1); clif_skill_nodamage(target, *target, TK_DODGE, 1);
sc_start4(src, target, SC_COMBO, 100, TK_JUMPKICK, src->id, 1, 0, 2000); sc_start4(src, target, SC_COMBO, 100, TK_JUMPKICK, src->id, 1, 0, 2000);
return false; return false;
} }
@ -1494,7 +1494,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
if (((sce = sc->getSCE(SC_UTSUSEMI)) || sc->getSCE(SC_BUNSINJYUTSU)) && flag&BF_WEAPON && !skill_get_inf2(skill_id, INF2_IGNORECICADA)) { if (((sce = sc->getSCE(SC_UTSUSEMI)) || sc->getSCE(SC_BUNSINJYUTSU)) && flag&BF_WEAPON && !skill_get_inf2(skill_id, INF2_IGNORECICADA)) {
skill_additional_effect(src, target, skill_id, skill_lv, flag, ATK_BLOCK, gettick()); skill_additional_effect(src, target, skill_id, skill_lv, flag, ATK_BLOCK, gettick());
if (!status_isdead(src)) if (!status_isdead(*src))
skill_counter_additional_effect(src, target, skill_id, skill_lv, flag, gettick()); skill_counter_additional_effect(src, target, skill_id, skill_lv, flag, gettick());
if (sce) { if (sce) {
clif_specialeffect(target, EF_STORMKICK4, AREA); clif_specialeffect(target, EF_STORMKICK4, AREA);
@ -1675,7 +1675,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
damage += damage * bonus / 100; damage += damage * bonus / 100;
} }
if (tsc->getSCE(SC_HOLY_OIL) && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) if (tsc->getSCE(SC_HOLY_OIL) && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON))
damage += damage * 50 / 100;// Need official adjustment. [Rytech] damage += damage * (3 * tsc->getSCE(SC_HOLY_OIL)->val1) / 100;
if( tsc->getSCE( SC_RUSH_QUAKE1 ) && ( flag&BF_WEAPON ) == BF_WEAPON ){ if( tsc->getSCE( SC_RUSH_QUAKE1 ) && ( flag&BF_WEAPON ) == BF_WEAPON ){
damage += damage * 50 / 100; damage += damage * 50 / 100;
@ -1792,7 +1792,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
#endif #endif
) ) ) )
{ {
struct status_data *status = status_get_status_data(bl); status_data* status = status_get_status_data(*bl);
int per = 100*status->sp / status->max_sp -1; //100% should be counted as the 80~99% interval int per = 100*status->sp / status->max_sp -1; //100% should be counted as the 80~99% interval
per /=20; //Uses 20% SP intervals. per /=20; //Uses 20% SP intervals.
//SP Cost: 1% + 0.5% per every 20% SP //SP Cost: 1% + 0.5% per every 20% SP
@ -1900,8 +1900,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
} }
} }
if ((sce = sc->getSCE(SC_BLOODLUST)) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3) if ((sce = sc->getSCE(SC_BLOODLUST)) && flag & BF_WEAPON && damage > 0 && rnd_chance(sce->val3, 100))
status_heal(src, damage * sce->val4 / 100, 0, 3); status_heal(src, damage * sce->val4 / 100, 0, 1);
if ((sce = sc->getSCE(SC_BLOODSUCKER)) && flag & BF_WEAPON && damage > 0 && rnd() % 100 < (2 * sce->val1 - 1)) if ((sce = sc->getSCE(SC_BLOODSUCKER)) && flag & BF_WEAPON && damage > 0 && rnd() % 100 < (2 * sce->val1 - 1))
status_heal(src, damage * sce->val1 / 100, 0, 3); status_heal(src, damage * sce->val1 / 100, 0, 3);
@ -2234,7 +2234,7 @@ static int battle_calc_drain(int64 damage, int rate, int per)
int64 battle_addmastery(map_session_data *sd,struct block_list *target,int64 dmg,int type) int64 battle_addmastery(map_session_data *sd,struct block_list *target,int64 dmg,int type)
{ {
int64 damage; int64 damage;
struct status_data *status = status_get_status_data(target); status_data* status = status_get_status_data(*target);
int weapon, skill; int weapon, skill;
#ifdef RENEWAL #ifdef RENEWAL
@ -2399,7 +2399,7 @@ static int battle_calc_sizefix(int64 damage, map_session_data *sd, unsigned char
*/ */
static int battle_calc_base_weapon_attack(struct block_list *src, struct status_data *tstatus, struct weapon_atk *wa, map_session_data *sd, bool critical) static int battle_calc_base_weapon_attack(struct block_list *src, struct status_data *tstatus, struct weapon_atk *wa, map_session_data *sd, bool critical)
{ {
struct status_data *status = status_get_status_data(src); status_data* status = status_get_status_data(*src);
uint8 type = (wa == &status->lhw)?EQI_HAND_L:EQI_HAND_R; uint8 type = (wa == &status->lhw)?EQI_HAND_L:EQI_HAND_R;
uint16 atkmin = (type == EQI_HAND_L)?status->watk2:status->watk; uint16 atkmin = (type == EQI_HAND_L)?status->watk2:status->watk;
uint16 atkmax = atkmin; uint16 atkmax = atkmin;
@ -2835,7 +2835,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
*/ */
bool is_infinite_defense(struct block_list *target, int flag) bool is_infinite_defense(struct block_list *target, int flag)
{ {
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
if(target->type == BL_SKILL) { if(target->type == BL_SKILL) {
TBL_SKILL *su = ((TBL_SKILL*)target); TBL_SKILL *su = ((TBL_SKILL*)target);
@ -2871,7 +2871,7 @@ bool is_infinite_defense(struct block_list *target, int flag)
static bool is_skill_using_arrow(struct block_list *src, int skill_id) static bool is_skill_using_arrow(struct block_list *src, int skill_id)
{ {
if(src != nullptr) { if(src != nullptr) {
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
return ((sd && sd->state.arrow_atk) || (!sd && ((skill_id && skill_get_ammotype(skill_id)) || sstatus->rhw.range>3)) return ((sd && sd->state.arrow_atk) || (!sd && ((skill_id && skill_get_ammotype(skill_id)) || sstatus->rhw.range>3))
@ -2922,7 +2922,7 @@ static bool is_attack_left_handed(struct block_list *src, int skill_id)
return true; return true;
} }
struct status_data *sstatus = status_get_status_data(src); struct status_data *sstatus = status_get_status_data(*src);
if (sstatus->lhw.atk) if (sstatus->lhw.atk)
return true; return true;
@ -2950,7 +2950,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
if( skill_id && !skill_get_nk(skill_id,NK_CRITICAL) ) if( skill_id && !skill_get_nk(skill_id,NK_CRITICAL) )
return false; return false;
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
if( sstatus->cri ) if( sstatus->cri )
{ {
@ -2964,7 +2964,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
return false; return false;
} }
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target); status_change *tsc = status_get_sc(target);
map_session_data *tsd = BL_CAST(BL_PC, target); map_session_data *tsd = BL_CAST(BL_PC, target);
@ -3037,10 +3037,6 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
return false; return false;
} }
break; break;
case SH_CHUL_HO_SONIC_CLAW:
if (pc_checkskill(sd, SH_COMMUNE_WITH_CHUL_HO) == 0 && !(sc && sc->getSCE(SC_TEMPORARY_COMMUNION)))
return false;
break;
} }
if(tsd && tsd->bonus.critical_def) if(tsd && tsd->bonus.critical_def)
cri = cri * ( 100 - tsd->bonus.critical_def ) / 100; cri = cri * ( 100 - tsd->bonus.critical_def ) / 100;
@ -3064,7 +3060,7 @@ static int is_attack_piercing(struct Damage* wd, struct block_list *src, struct
if(src != nullptr) { if(src != nullptr) {
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
if( skill_id != PA_SACRIFICE && skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS && skill_id != PA_SHIELDCHAIN && skill_id != KO_HAPPOKUNAI if( skill_id != PA_SACRIFICE && skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS && skill_id != PA_SHIELDCHAIN && skill_id != KO_HAPPOKUNAI
#ifndef RENEWAL #ifndef RENEWAL
@ -3122,8 +3118,8 @@ static std::bitset<NK_MAX> battle_skill_get_damage_properties(uint16 skill_id, i
*/ */
static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct block_list *target, int skill_id, int skill_lv, bool first_call) static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct block_list *target, int skill_id, int skill_lv, bool first_call)
{ {
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target); status_change *tsc = status_get_sc(target);
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
@ -3316,7 +3312,7 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct
*/ */
static bool attack_ignores_def(struct Damage* wd, struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, short weapon_position) static bool attack_ignores_def(struct Damage* wd, struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, short weapon_position)
{ {
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag); std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag);
@ -3421,7 +3417,7 @@ static int battle_calc_equip_attack(struct block_list *src, int skill_id)
{ {
if(src != nullptr) { if(src != nullptr) {
int eatk = 0; int eatk = 0;
struct status_data *status = status_get_status_data(src); status_data* status = status_get_status_data(*src);
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
// Add arrow atk if using an applicable skill // Add arrow atk if using an applicable skill
@ -3450,7 +3446,7 @@ int battle_get_weapon_element(struct Damage* wd, struct block_list *src, struct
{ {
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
int element = skill_get_ele(skill_id, skill_lv); int element = skill_get_ele(skill_id, skill_lv);
//Take weapon's element //Take weapon's element
@ -3553,7 +3549,7 @@ int battle_get_magic_element(struct block_list* src, struct block_list* target,
int element = skill_get_ele(skill_id, skill_lv); int element = skill_get_ele(skill_id, skill_lv);
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
if (element == ELE_WEAPON) { // pl=-1 : the skill takes the weapon's element if (element == ELE_WEAPON) { // pl=-1 : the skill takes the weapon's element
element = sstatus->rhw.ele; element = sstatus->rhw.ele;
@ -3613,25 +3609,6 @@ int battle_get_magic_element(struct block_list* src, struct block_list* target,
if (sd) if (sd)
element = sd->bonus.arrow_ele; element = sd->bonus.arrow_ele;
break; break;
case SU_CN_METEOR:
case SU_CN_METEOR2:
case SH_HYUN_ROKS_BREEZE:
case SH_HYUN_ROK_CANNON:
if (sc && sc->count) {
if (sc->getSCE(SC_COLORS_OF_HYUN_ROK_1))
element = ELE_WATER;
else if (sc->getSCE(SC_COLORS_OF_HYUN_ROK_2))
element = ELE_WIND;
else if (sc->getSCE(SC_COLORS_OF_HYUN_ROK_3))
element = ELE_EARTH;
else if (sc->getSCE(SC_COLORS_OF_HYUN_ROK_4))
element = ELE_FIRE;
else if (sc->getSCE(SC_COLORS_OF_HYUN_ROK_5))
element = ELE_DARK;
else if (sc->getSCE(SC_COLORS_OF_HYUN_ROK_6))
element = ELE_HOLY;
}
break;
} }
return element; return element;
@ -3716,6 +3693,12 @@ static int battle_get_spiritball_damage(struct Damage& wd, struct block_list& sr
// These skills used as many spheres as they do hits // These skills used as many spheres as they do hits
damage = (wd.div_ + sd->spiritball) * 3; damage = (wd.div_ + sd->spiritball) * 3;
break; break;
#ifdef RENEWAL
case MO_FINGEROFFENSIVE:
// These skills store the spheres used in spiritball_old
damage = (sd->spiritball_old + sd->spiritball) * 3;
break;
#endif
case MO_EXTREMITYFIST: case MO_EXTREMITYFIST:
// These skills store the number of spheres the player had before cast // These skills store the number of spheres the player had before cast
damage = sd->spiritball_old * 3; damage = sd->spiritball_old * 3;
@ -3742,8 +3725,8 @@ static void battle_calc_element_damage(struct Damage* wd, struct block_list *src
std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag); std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag);
map_session_data* sd = BL_CAST(BL_PC, src); map_session_data* sd = BL_CAST(BL_PC, src);
status_change* sc = status_get_sc(src); status_change* sc = status_get_sc(src);
struct status_data* sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data* tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, true); int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, true);
// Elemental attribute fix // Elemental attribute fix
@ -3876,7 +3859,7 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
{ {
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
int t_class = status_get_class(target); int t_class = status_get_class(target);
#ifndef RENEWAL #ifndef RENEWAL
@ -3936,7 +3919,7 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
case NC_ARMSCANNON: case NC_ARMSCANNON:
// Arrow attack of these skills is not influenced by P.ATK so we add it as mastery attack // Arrow attack of these skills is not influenced by P.ATK so we add it as mastery attack
if (sd != nullptr) { if (sd != nullptr) {
struct status_data* tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
ATK_ADD(wd->masteryAtk, wd->masteryAtk2, battle_attr_fix(src, target, sd->bonus.arrow_atk, sd->bonus.arrow_ele, tstatus->def_ele, tstatus->ele_lv)); ATK_ADD(wd->masteryAtk, wd->masteryAtk2, battle_attr_fix(src, target, sd->bonus.arrow_atk, sd->bonus.arrow_ele, tstatus->def_ele, tstatus->ele_lv));
} }
break; break;
@ -3982,8 +3965,8 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
*/ */
static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv) static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv)
{ {
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
bool critical = false; bool critical = false;
@ -4057,8 +4040,8 @@ static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,s
static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv) static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv)
{ {
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
map_session_data *tsd = BL_CAST(BL_PC, target); map_session_data *tsd = BL_CAST(BL_PC, target);
@ -4352,7 +4335,7 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target); status_change *tsc = status_get_sc(target);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
if( sd && !skill_id ) { // if no skill_id passed, check for double attack [helvetica] if( sd && !skill_id ) { // if no skill_id passed, check for double attack [helvetica]
short i; short i;
@ -4549,8 +4532,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
map_session_data *tsd = BL_CAST(BL_PC, target); map_session_data *tsd = BL_CAST(BL_PC, target);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target); status_change *tsc = status_get_sc(target);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
int skillratio = 100; int skillratio = 100;
int i; int i;
@ -6296,39 +6279,6 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += 5 * sstatus->con; skillratio += 5 * sstatus->con;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case SH_CHUL_HO_SONIC_CLAW:
skillratio += -100 + 850 + 1650 * skill_lv;
skillratio += 50 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
skillratio += 5 * sstatus->pow;
if (pc_checkskill(sd, SH_COMMUNE_WITH_CHUL_HO) > 0 || (sc && sc->getSCE(SC_TEMPORARY_COMMUNION))) {
skillratio += 100 + 400 * skill_lv;
skillratio += 50 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
}
RE_LVL_DMOD(100);
break;
case SH_HOWLING_OF_CHUL_HO:
skillratio += -100 + 600 + 1050 * skill_lv;
skillratio += 50 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
skillratio += 5 * sstatus->pow;
if (pc_checkskill(sd, SH_COMMUNE_WITH_CHUL_HO) > 0 || (sc && sc->getSCE(SC_TEMPORARY_COMMUNION))) {
skillratio += 100 + 100 * skill_lv;
skillratio += 50 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
}
RE_LVL_DMOD(100);
break;
case SH_HOGOGONG_STRIKE:
skillratio += -100 + 180 + 200 * skill_lv;
skillratio += 10 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
skillratio += 5 * sstatus->pow;
if (pc_checkskill(sd, SH_COMMUNE_WITH_CHUL_HO) > 0 || (sc && sc->getSCE(SC_TEMPORARY_COMMUNION))) {
skillratio += 70 + 150 * skill_lv;
skillratio += 10 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
}
RE_LVL_DMOD(100);
break;
} }
return skillratio; return skillratio;
} }
@ -6345,8 +6295,8 @@ static int64 battle_calc_skill_constant_addition(struct Damage* wd, struct block
{ {
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
map_session_data *tsd = BL_CAST(BL_PC, target); map_session_data *tsd = BL_CAST(BL_PC, target);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
int64 atk = 0; int64 atk = 0;
//Constant/misc additions from skills //Constant/misc additions from skills
@ -6397,8 +6347,8 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st
{ {
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
uint8 anger_id = 0; // SLS Anger uint8 anger_id = 0; // SLS Anger
// Kagerou/Oboro Earth Charm effect +15% wATK // Kagerou/Oboro Earth Charm effect +15% wATK
@ -6586,8 +6536,8 @@ static void battle_calc_defense_reduction(struct Damage* wd, struct block_list *
map_session_data *tsd = BL_CAST(BL_PC, target); map_session_data *tsd = BL_CAST(BL_PC, target);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target); status_change *tsc = status_get_sc(target);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
//Defense reduction //Defense reduction
short vit_def; short vit_def;
@ -6757,7 +6707,7 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list
{ {
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
// Post skill/vit reduction damage increases // Post skill/vit reduction damage increases
#ifndef RENEWAL #ifndef RENEWAL
@ -6812,7 +6762,7 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list
*/ */
static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,struct block_list *target, uint16 skill_id, uint16 skill_lv) static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,struct block_list *target, uint16 skill_id, uint16 skill_lv)
{ {
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
bool attack_hits = is_attack_hitting(wd, src, target, skill_id, skill_lv, false); bool attack_hits = is_attack_hitting(wd, src, target, skill_id, skill_lv, false);
if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM) if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM)
@ -6859,9 +6809,9 @@ static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,s
return; return;
} }
// Triple Attack has a special property that it does not split damage on plant mode // Triple Attack and Finger Offensive have a special property, they do not split damage on plant mode
// In pre-renewal, it requires the monster to have exactly 100 def // In pre-renewal, it requires the monster to have exactly 100 def
if (skill_id == MO_TRIPLEATTACK && wd->div_ < 0 if ((skill_id == MO_TRIPLEATTACK || skill_id == MO_FINGEROFFENSIVE) && wd->div_ < 0
#ifndef RENEWAL #ifndef RENEWAL
&& tstatus->def == 100 && tstatus->def == 100
#endif #endif
@ -6969,14 +6919,14 @@ static void battle_calc_attack_gvg_bg(struct Damage* wd, struct block_list *src,
(src->type == BL_SKILL && (skill_id == SG_SUN_WARM || skill_id == SG_MOON_WARM || skill_id == SG_STAR_WARM))) ) { (src->type == BL_SKILL && (skill_id == SG_SUN_WARM || skill_id == SG_MOON_WARM || skill_id == SG_STAR_WARM))) ) {
int64 damage = wd->damage + wd->damage2, rdamage = 0; int64 damage = wd->damage + wd->damage2, rdamage = 0;
map_session_data *tsd = BL_CAST(BL_PC, target); map_session_data *tsd = BL_CAST(BL_PC, target);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
t_tick tick = gettick(), rdelay = 0; t_tick tick = gettick(), rdelay = 0;
rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id, false); rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id, false);
if( rdamage > 0 ) { //Item reflect gets calculated before any mapflag reducing is applicated if( rdamage > 0 ) { //Item reflect gets calculated before any mapflag reducing is applicated
struct block_list *d_bl = battle_check_devotion(src); struct block_list *d_bl = battle_check_devotion(src);
rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false); rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
if( tsd ) if( tsd )
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_); battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
//Use Reflect Shield to signal this kind of skill trigger [Skotlex] //Use Reflect Shield to signal this kind of skill trigger [Skotlex]
@ -7031,8 +6981,8 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
map_session_data *tsd = BL_CAST(BL_PC, target); map_session_data *tsd = BL_CAST(BL_PC, target);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target); status_change *tsc = status_get_sc(target);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
int skill_damage = 0; int skill_damage = 0;
//Reject Sword bugreport:4493 by Daegaladh //Reject Sword bugreport:4493 by Daegaladh
@ -7046,9 +6996,9 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
) )
{ {
ATK_RATER(wd->damage, 50) ATK_RATER(wd->damage, 50)
clif_skill_nodamage(target,target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1,1); clif_skill_nodamage(target, *target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1);
battle_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD); battle_fix_damage(target,src,wd->damage,clif_damage(*target,*src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD);
if (status_isdead(target)) if (status_isdead(*target))
return; return;
if( --(tsc->getSCE(SC_REJECTSWORD)->val3) <= 0 ) if( --(tsc->getSCE(SC_REJECTSWORD)->val3) <= 0 )
status_change_end(target, SC_REJECTSWORD); status_change_end(target, SC_REJECTSWORD);
@ -7064,7 +7014,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE); skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE);
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage, clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE); // This is how official does 1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE); // This is how official does
clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false); clif_damage(*src, *target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW); battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW);
status_damage(src, target, rdamage/10, 0, 0, 1, 0); status_damage(src, target, rdamage/10, 0, 0, 1, 0);
status_change_end(target, SC_CRESCENTELBOW); status_change_end(target, SC_CRESCENTELBOW);
@ -7126,8 +7076,8 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
*/ */
static struct Damage initialize_weapon_data(struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int wflag) static struct Damage initialize_weapon_data(struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int wflag)
{ {
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
map_session_data *sd = BL_CAST(BL_PC, src); map_session_data *sd = BL_CAST(BL_PC, src);
struct Damage wd; struct Damage wd;
@ -7320,7 +7270,7 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
int64 damage = wd->damage + wd->damage2, rdamage = 0; int64 damage = wd->damage + wd->damage2, rdamage = 0;
map_session_data *tsd = BL_CAST(BL_PC, target); map_session_data *tsd = BL_CAST(BL_PC, target);
status_change *tsc = status_get_sc(target); status_change *tsc = status_get_sc(target);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct unit_data *ud = unit_bl2ud(target); struct unit_data *ud = unit_bl2ud(target);
t_tick tick = gettick(), rdelay = 0; t_tick tick = gettick(), rdelay = 0;
@ -7346,7 +7296,7 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
if( attack_type == BF_WEAPON && tsc->getSCE(SC_REFLECTDAMAGE) ) // Don't reflect your own damage (Grand Cross) if( attack_type == BF_WEAPON && tsc->getSCE(SC_REFLECTDAMAGE) ) // Don't reflect your own damage (Grand Cross)
map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag); map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag);
else if( attack_type == BF_WEAPON || attack_type == BF_MISC) { else if( attack_type == BF_WEAPON || attack_type == BF_MISC) {
rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false); rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
if( tsd ) if( tsd )
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_); battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
// It appears that official servers give skill reflect damage a longer delay // It appears that official servers give skill reflect damage a longer delay
@ -7371,8 +7321,8 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
struct Damage wd; struct Damage wd;
status_change *sc = status_get_sc(src); status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target); status_change *tsc = status_get_sc(target);
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
int right_element, left_element; int right_element, left_element;
bool infdef = false; bool infdef = false;
@ -7446,7 +7396,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
#ifdef RENEWAL #ifdef RENEWAL
if(skill_id == HW_MAGICCRASHER) { // Add weapon attack for MATK onto Magic Crasher if(skill_id == HW_MAGICCRASHER) { // Add weapon attack for MATK onto Magic Crasher
struct status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
if (sstatus->matk_max > sstatus->matk_min) { if (sstatus->matk_max > sstatus->matk_min) {
ATK_ADD(wd.weaponAtk, wd.weaponAtk2, sstatus->matk_min+rnd()%(sstatus->matk_max-sstatus->matk_min)); ATK_ADD(wd.weaponAtk, wd.weaponAtk2, sstatus->matk_min+rnd()%(sstatus->matk_max-sstatus->matk_min));
@ -7652,7 +7602,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
ATK_ADD(wd.damage, wd.damage2, skill_lv * 240 + status_get_lv(target) * 40); ATK_ADD(wd.damage, wd.damage2, skill_lv * 240 + status_get_lv(target) * 40);
break; break;
case SR_GATEOFHELL: { case SR_GATEOFHELL: {
status_data *sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
double bonus = 1 + skill_lv * 2 / 10; double bonus = 1 + skill_lv * 2 / 10;
ATK_ADD(wd.damage, wd.damage2, sstatus->max_hp - sstatus->hp); ATK_ADD(wd.damage, wd.damage2, sstatus->max_hp - sstatus->hp);
@ -7777,8 +7727,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
TBL_PC *tsd; TBL_PC *tsd;
status_change *sc, *tsc; status_change *sc, *tsc;
struct Damage ad; struct Damage ad;
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
struct { struct {
unsigned imdef : 1; unsigned imdef : 1;
unsigned infdef : 1; unsigned infdef : 1;
@ -7791,6 +7739,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
nullpo_info(NLP_MARK); nullpo_info(NLP_MARK);
return ad; return ad;
} }
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
// Initial Values // Initial Values
// Set to 1 because magic damage on plants is 1 per hit; if target is not a plant this gets reinitialized to 0 later // Set to 1 because magic damage on plants is 1 per hit; if target is not a plant this gets reinitialized to 0 later
ad.damage = 1; ad.damage = 1;
@ -8386,8 +8338,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
case SU_CN_METEOR: case SU_CN_METEOR:
case SU_CN_METEOR2: case SU_CN_METEOR2:
skillratio += 100 + 100 * skill_lv + sstatus->int_ * 5; // !TODO: Confirm INT bonus skillratio += 100 + 100 * skill_lv + sstatus->int_ * 5; // !TODO: Confirm INT bonus
if (sc && sc->getSCE(SC_COLORS_OF_HYUN_ROK_BUFF))
skillratio += skillratio * 50 / 100;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case NPC_VENOMFOG: case NPC_VENOMFOG:
@ -8512,11 +8462,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
break; break;
case AG_ASTRAL_STRIKE_ATK: case AG_ASTRAL_STRIKE_ATK:
skillratio += -100 + 650 * skill_lv + 10 * sstatus->spl; skillratio += -100 + 650 * skill_lv + 10 * sstatus->spl;
// Not confirmed, but if the main hit deal additional damage
// on certain races then the repeated damage should too right?
// Guessing a formula here for now. [Rytech]
if (tstatus->race == RC_UNDEAD || tstatus->race == RC_DRAGON)
skillratio += 200 * skill_lv;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case AG_ROCK_DOWN: case AG_ROCK_DOWN:
@ -8781,28 +8726,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
skillratio += 5 * sstatus->spl; skillratio += 5 * sstatus->spl;
RE_LVL_DMOD(100); RE_LVL_DMOD(100);
break; break;
case SH_HYUN_ROKS_BREEZE:
skillratio += -100 + 650 + 750 * skill_lv;
skillratio += 20 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
skillratio += 5 * sstatus->spl;
if (pc_checkskill(sd, SH_COMMUNE_WITH_HYUN_ROK) > 0 || (sc && sc->getSCE(SC_TEMPORARY_COMMUNION))) {
skillratio += 100 + 200 * skill_lv;
skillratio += 20 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
}
RE_LVL_DMOD(100);
break;
case SH_HYUN_ROK_CANNON:
skillratio += -100 + 1050 + 1550 * skill_lv;
skillratio += 50 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
skillratio += 5 * sstatus->spl;
if (pc_checkskill(sd, SH_COMMUNE_WITH_HYUN_ROK) > 0 || (sc && sc->getSCE(SC_TEMPORARY_COMMUNION))) {
skillratio += 300 * skill_lv;
skillratio += 25 * pc_checkskill(sd, SH_MYSTICAL_CREATURE_MASTERY);
}
RE_LVL_DMOD(100);
break;
} }
if (sc) {// Insignia's increases the damage of offensive magic by a fixed percentage depending on the element. if (sc) {// Insignia's increases the damage of offensive magic by a fixed percentage depending on the element.
@ -9041,8 +8964,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
map_session_data *sd, *tsd; map_session_data *sd, *tsd;
struct Damage md; //DO NOT CONFUSE with md of mob_data! struct Damage md; //DO NOT CONFUSE with md of mob_data!
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
status_change *ssc = status_get_sc(src); status_change *ssc = status_get_sc(src);
memset(&md,0,sizeof(md)); memset(&md,0,sizeof(md));
@ -9052,6 +8973,9 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
return md; return md;
} }
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
//Some initial values //Some initial values
md.amotion = (skill_get_inf(skill_id)&INF_GROUND_SKILL ? 0 : sstatus->amotion); md.amotion = (skill_get_inf(skill_id)&INF_GROUND_SKILL ? 0 : sstatus->amotion);
md.dmotion = tstatus->dmotion; md.dmotion = tstatus->dmotion;
@ -9516,7 +9440,7 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl
status_change_entry *tsce = tsc->getSCE(SC_WEAPONBLOCKING); status_change_entry *tsce = tsc->getSCE(SC_WEAPONBLOCKING);
if (attack_type == BF_WEAPON && rnd() % 100 < tsce->val2) { if (attack_type == BF_WEAPON && rnd() % 100 < tsce->val2) {
clif_skill_nodamage(target, bl, GC_WEAPONBLOCKING, tsce->val1, 1); clif_skill_nodamage(target, *bl, GC_WEAPONBLOCKING, tsce->val1);
sc_start(bl, target, SC_WEAPONBLOCK_ON, 100, bl->id, skill_get_time2(GC_WEAPONBLOCKING, tsce->val1)); sc_start(bl, target, SC_WEAPONBLOCK_ON, 100, bl->id, skill_get_time2(GC_WEAPONBLOCKING, tsce->val1));
} }
} }
@ -9656,7 +9580,7 @@ int64 battle_calc_return_damage(struct block_list* tbl, struct block_list *src,
*/ */
bool battle_check_coma(map_session_data& sd, struct block_list& target, e_battle_flag attack_type) bool battle_check_coma(map_session_data& sd, struct block_list& target, e_battle_flag attack_type)
{ {
struct status_data* tstatus = status_get_status_data(&target); status_data* tstatus = status_get_status_data(target);
mob_data* dstmd = BL_CAST(BL_MOB, &target); mob_data* dstmd = BL_CAST(BL_MOB, &target);
// Coma // Coma
@ -9691,7 +9615,7 @@ bool battle_vellum_damage(map_session_data *sd, struct block_list *target, struc
nullpo_retr(false, target); nullpo_retr(false, target);
nullpo_retr(false, wd); nullpo_retr(false, wd);
struct status_data *tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
// bHPVanishRaceRate // bHPVanishRaceRate
int16 vellum_rate_hp = cap_value(sd->hp_vanish_race[tstatus->race].rate + sd->hp_vanish_race[RC_ALL].rate, 0, INT16_MAX); int16 vellum_rate_hp = cap_value(sd->hp_vanish_race[tstatus->race].rate + sd->hp_vanish_race[RC_ALL].rate, 0, INT16_MAX);
int8 vellum_hp = cap_value(sd->hp_vanish_race[tstatus->race].per + sd->hp_vanish_race[RC_ALL].per, INT8_MIN, INT8_MAX); int8 vellum_hp = cap_value(sd->hp_vanish_race[tstatus->race].per + sd->hp_vanish_race[RC_ALL].per, INT8_MIN, INT8_MAX);
@ -9813,7 +9737,7 @@ int battle_damage_area(struct block_list *bl, va_list ap) {
battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true,false); battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true,false);
else else
battle_fix_damage(src,bl,damage,0,LG_REFLECTDAMAGE); battle_fix_damage(src,bl,damage,0,LG_REFLECTDAMAGE);
clif_damage(bl,bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false); clif_damage(*bl,*bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false);
skill_additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick); skill_additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
map_freeblock_unlock(); map_freeblock_unlock();
} }
@ -9870,7 +9794,6 @@ void battle_autocast_elembuff_skill(map_session_data* sd, struct block_list* tar
*------------------------------------------*/ *------------------------------------------*/
enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* target, t_tick tick, int flag) { enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* target, t_tick tick, int flag) {
map_session_data *sd = nullptr, *tsd = nullptr; map_session_data *sd = nullptr, *tsd = nullptr;
struct status_data *sstatus, *tstatus;
status_change *sc, *tsc; status_change *sc, *tsc;
int64 damage; int64 damage;
int skillv; int skillv;
@ -9886,8 +9809,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
sd = BL_CAST(BL_PC, src); sd = BL_CAST(BL_PC, src);
tsd = BL_CAST(BL_PC, target); tsd = BL_CAST(BL_PC, target);
sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
sc = status_get_sc(src); sc = status_get_sc(src);
tsc = status_get_sc(target); tsc = status_get_sc(target);
@ -9960,7 +9883,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
uint16 skill_lv = tsc->getSCE(SC_AUTOCOUNTER)->val1; uint16 skill_lv = tsc->getSCE(SC_AUTOCOUNTER)->val1;
clif_skillcastcancel( *target ); //Remove the casting bar. [Skotlex] clif_skillcastcancel( *target ); //Remove the casting bar. [Skotlex]
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
status_change_end(target, SC_AUTOCOUNTER); status_change_end(target, SC_AUTOCOUNTER);
skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0); skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
return ATK_BLOCK; return ATK_BLOCK;
@ -9983,7 +9906,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
status_change_end(target, SC_BLADESTOP_WAIT); status_change_end(target, SC_BLADESTOP_WAIT);
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration)) if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
{ //Target locked. { //Target locked.
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
clif_bladestop(target, src->id, 1); clif_bladestop(target, src->id, 1);
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration); sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
return ATK_BLOCK; return ATK_BLOCK;
@ -10056,7 +9979,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
} }
if (tsc && tsc->getSCE(SC_MTF_MLEATKED) && rnd()%100 < tsc->getSCE(SC_MTF_MLEATKED)->val2) if (tsc && tsc->getSCE(SC_MTF_MLEATKED) && rnd()%100 < tsc->getSCE(SC_MTF_MLEATKED)->val2)
clif_skill_nodamage(target, target, SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1, sc_start(src, target, SC_ENDURE, 100, tsc->getSCE(SC_MTF_MLEATKED)->val1, skill_get_time(SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1))); clif_skill_nodamage(target, *target, SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1, sc_start(src, target, SC_ENDURE, 100, tsc->getSCE(SC_MTF_MLEATKED)->val1, skill_get_time(SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1)));
if(tsc && tsc->getSCE(SC_KAAHI) && tstatus->hp < tstatus->max_hp && status_charge(target, 0, tsc->getSCE(SC_KAAHI)->val3)) { if(tsc && tsc->getSCE(SC_KAAHI) && tstatus->hp < tstatus->max_hp && status_charge(target, 0, tsc->getSCE(SC_KAAHI)->val3)) {
int hp_heal = tstatus->max_hp - tstatus->hp; int hp_heal = tstatus->max_hp - tstatus->hp;
@ -10125,7 +10048,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
} }
} }
wd.dmotion = clif_damage(src, target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , wd.type, wd.damage2, wd.isspdamage); wd.dmotion = clif_damage(*src, *target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , wd.type, wd.damage2, wd.isspdamage);
if (sd && sd->bonus.splash_range > 0 && damage > 0) if (sd && sd->bonus.splash_range > 0 && damage > 0)
skill_castend_damage_id(src, target, 0, 1, tick, 0); skill_castend_damage_id(src, target, 0, 1, tick, 0);
@ -10145,7 +10068,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
map_freeblock_lock(); map_freeblock_lock();
if( !(tsc && tsc->getSCE(SC_DEVOTION)) && !vellum_damage && skill_check_shadowform(target, damage, wd.div_) ) { if( !(tsc && tsc->getSCE(SC_DEVOTION)) && !vellum_damage && skill_check_shadowform(target, damage, wd.div_) ) {
if( !status_isdead(target) ) if( !status_isdead(*target) )
skill_additional_effect(src, target, 0, 0, wd.flag, wd.dmg_lv, tick); skill_additional_effect(src, target, 0, 0, wd.flag, wd.dmg_lv, tick);
if( wd.dmg_lv > ATK_BLOCK ) if( wd.dmg_lv > ATK_BLOCK )
skill_counter_additional_effect(src, target, 0, 0, wd.flag, tick); skill_counter_additional_effect(src, target, 0, 0, wd.flag, tick);
@ -10178,7 +10101,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if (d_sc && d_sc->getSCE(SC_REBOUND_S)) if (d_sc && d_sc->getSCE(SC_REBOUND_S))
devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100; devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100;
clif_damage(d_bl, d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false); clif_damage(*d_bl, *d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false);
battle_fix_damage(src, d_bl, devotion_damage, 0, CR_DEVOTION); battle_fix_damage(src, d_bl, devotion_damage, 0, CR_DEVOTION);
} }
} }
@ -10196,8 +10119,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if (tsc->getSCE(SC_WATER_SCREEN_OPTION)) { if (tsc->getSCE(SC_WATER_SCREEN_OPTION)) {
struct block_list *e_bl = map_id2bl(tsc->getSCE(SC_WATER_SCREEN_OPTION)->val1); struct block_list *e_bl = map_id2bl(tsc->getSCE(SC_WATER_SCREEN_OPTION)->val1);
if (e_bl && !status_isdead(e_bl)) { if (e_bl && !status_isdead(*e_bl)) {
clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false); clif_damage(*e_bl, *e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
battle_fix_damage(src, e_bl, damage, 0, EL_WATER_SCREEN); battle_fix_damage(src, e_bl, damage, 0, EL_WATER_SCREEN);
} }
} }
@ -11609,6 +11532,13 @@ static const struct _battle_data {
#endif #endif
{ "synchronize_damage", &battle_config.synchronize_damage, 0, 0, 1, }, { "synchronize_damage", &battle_config.synchronize_damage, 0, 0, 1, },
{ "item_stacking", &battle_config.item_stacking, 1, 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> #include <custom/battle_config_init.inc>
}; };

View File

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

View File

@ -627,11 +627,11 @@ void buyingstore_reopen( map_session_data* sd ){
{ {
// Make buyer look perfect // Make buyer look perfect
pc_setdir(sd, at->dir, at->head_dir); pc_setdir(sd, at->dir, at->head_dir);
clif_changed_dir(&sd->bl, AREA_WOS); clif_changed_dir(sd->bl, AREA_WOS);
if( at->sit ) { if( at->sit ) {
pc_setsit(sd); pc_setsit(sd);
skill_sit(sd, 1); skill_sit(sd, 1);
clif_sitting(&sd->bl); clif_sitting(sd->bl);
} }
// Immediate save // Immediate save

View File

@ -108,7 +108,7 @@ int chat_createpcchat(map_session_data* sd, const char* title, const char* pass,
clif_createchat( *sd, CREATEROOM_SUCCESS ); clif_createchat( *sd, CREATEROOM_SUCCESS );
clif_dispchat(cd,0); clif_dispchat(cd,0);
if (status_isdead(&sd->bl)) if (status_isdead(sd->bl))
achievement_update_objective(sd, AG_CHATTING_DYING, 1, 1); achievement_update_objective(sd, AG_CHATTING_DYING, 1, 1);
else else
achievement_update_objective(sd, AG_CHATTING_CREATE, 1, 1); achievement_update_objective(sd, AG_CHATTING_CREATE, 1, 1);
@ -168,7 +168,8 @@ int chat_joinchat(map_session_data* sd, int chatid, const char* pass)
pc_setchatid(sd,cd->bl.id); pc_setchatid(sd,cd->bl.id);
clif_joinchatok(sd, cd); //To the person who newly joined the list of all // To the person who newly joined the chat
clif_joinchatok(*sd, *cd);
clif_addchat(cd, sd); //Reports To the person who already in the chat clif_addchat(cd, sd); //Reports To the person who already in the chat
clif_dispchat(cd, 0); //Reported number of changes to the people around clif_dispchat(cd, 0); //Reported number of changes to the people around
@ -217,7 +218,7 @@ int chat_leavechat(map_session_data* sd, bool kicked)
cd->usersd[i] = cd->usersd[i+1]; cd->usersd[i] = cd->usersd[i+1];
if( cd->users == 0 && cd->owner->type == BL_PC ) { // Delete empty chatroom if( cd->users == 0 && cd->owner->type == BL_PC ) { // Delete empty chatroom
clif_clearchat(cd, 0); clif_clearchat(*cd);
db_destroy(cd->kick_list); db_destroy(cd->kick_list);
map_deliddb(&cd->bl); map_deliddb(&cd->bl);
map_delblock(&cd->bl); map_delblock(&cd->bl);
@ -234,7 +235,7 @@ int chat_leavechat(map_session_data* sd, bool kicked)
if( leavechar == 0 && cd->owner->type == BL_PC ) { // Set and announce new owner if( leavechar == 0 && cd->owner->type == BL_PC ) { // Set and announce new owner
cd->owner = (struct block_list*) cd->usersd[0]; cd->owner = (struct block_list*) cd->usersd[0];
clif_changechatowner(cd, cd->usersd[0]); clif_changechatowner(cd, cd->usersd[0]);
clif_clearchat(cd, 0); clif_clearchat(*cd);
//Adjust Chat location after owner has been changed. //Adjust Chat location after owner has been changed.
map_delblock( &cd->bl ); map_delblock( &cd->bl );
@ -275,7 +276,7 @@ int chat_changechatowner(map_session_data* sd, const char* nextownername)
return -1; // name not found return -1; // name not found
// erase temporarily // erase temporarily
clif_clearchat(cd,0); clif_clearchat(*cd);
// set new owner // set new owner
cd->owner = (struct block_list*) cd->usersd[i]; cd->owner = (struct block_list*) cd->usersd[i];
@ -325,7 +326,7 @@ int chat_changechatstatus(map_session_data* sd, const char* title, const char* p
cd->limit = min(limit, ARRAYLENGTH(cd->usersd)); cd->limit = min(limit, ARRAYLENGTH(cd->usersd));
cd->pub = pub; cd->pub = pub;
clif_changechatstatus(cd); clif_changechatstatus(*cd);
clif_dispchat(cd,0); clif_dispchat(cd,0);
return 0; return 0;
@ -436,7 +437,7 @@ int chat_deletenpcchat(struct npc_data* nd)
return 0; return 0;
chat_npckickall(cd); chat_npckickall(cd);
clif_clearchat(cd, 0); clif_clearchat(*cd);
map_deliddb(&cd->bl); map_deliddb(&cd->bl);
map_delblock(&cd->bl); map_delblock(&cd->bl);
map_freeblock(&cd->bl); map_freeblock(&cd->bl);

View File

@ -1065,7 +1065,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
sd->status.skill[idx].id = 0; sd->status.skill[idx].id = 0;
sd->status.skill[idx].lv = 0; sd->status.skill[idx].lv = 0;
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT; sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
clif_deleteskill(sd,WE_CALLBABY); clif_deleteskill(*sd,WE_CALLBABY);
} }
if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) { if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) {
@ -1073,7 +1073,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
sd->status.skill[idx].id = 0; sd->status.skill[idx].id = 0;
sd->status.skill[idx].lv = 0; sd->status.skill[idx].lv = 0;
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT; sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
clif_deleteskill(sd,WE_CALLBABY); clif_deleteskill(*sd,WE_CALLBABY);
} }
return 0; return 0;

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,7 @@
#include "packets.hpp" #include "packets.hpp"
#include "script.hpp" #include "script.hpp"
#include "trade.hpp"
struct Channel; struct Channel;
struct clan; struct clan;
@ -838,7 +839,7 @@ void clif_move( struct unit_data& ud ); //area
void clif_changemap( map_session_data& sd, short m, uint16 x, uint16 y ); void clif_changemap( map_session_data& sd, short m, uint16 x, uint16 y );
void clif_changemapserver( map_session_data& sd, const char* map, uint16 x, uint16 y, uint32 ip, uint16 port ); void clif_changemapserver( map_session_data& sd, const char* map, uint16 x, uint16 y, uint32 ip, uint16 port );
void clif_blown(struct block_list *bl); // area void clif_blown(struct block_list *bl); // area
void clif_slide(struct block_list *bl, int x, int y); // area void clif_slide(block_list& bl, int x, int y); // area
void clif_fixpos( block_list& bl ); void clif_fixpos( block_list& bl );
void clif_npcbuysell( map_session_data& sd, npc_data& nd ); void clif_npcbuysell( map_session_data& sd, npc_data& nd );
void clif_buylist( map_session_data& sd, npc_data& nd ); void clif_buylist( map_session_data& sd, npc_data& nd );
@ -861,10 +862,10 @@ void clif_delitem( map_session_data& sd, int index, int amount, short reason );
void clif_update_hp(map_session_data &sd); void clif_update_hp(map_session_data &sd);
void clif_updatestatus( map_session_data& sd, _sp type ); void clif_updatestatus( map_session_data& sd, _sp type );
void clif_changemanner( map_session_data& sd ); void clif_changemanner( map_session_data& sd );
int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage); // area int clif_damage(block_list& src, block_list& dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage); // area
void clif_takeitem(struct block_list* src, struct block_list* dst); void clif_takeitem(block_list& src, block_list& dst);
void clif_sitting(struct block_list* bl); void clif_sitting(block_list& bl);
void clif_standing(struct block_list* bl); void clif_standing(block_list& bl);
void clif_sprite_change(struct block_list *bl, int id, int type, int val, int val2, enum send_target target); void clif_sprite_change(struct block_list *bl, int id, int type, int val, int val2, enum send_target target);
void clif_changelook(struct block_list *bl,int type,int val); // area void clif_changelook(struct block_list *bl,int type,int val); // area
void clif_changetraplook(struct block_list *bl,int val); // area void clif_changetraplook(struct block_list *bl,int val); // area
@ -874,7 +875,7 @@ void clif_arrow_fail( map_session_data& sd, e_action_failure type );
void clif_arrow_create_list( map_session_data& sd ); void clif_arrow_create_list( map_session_data& sd );
void clif_statusupack( map_session_data& sd, int32 type, bool success, int32 val = 0 ); void clif_statusupack( map_session_data& sd, int32 type, bool success, int32 val = 0 );
void clif_equipitemack( map_session_data& sd, uint8 flag, int index, int pos = 0 ); // self void clif_equipitemack( map_session_data& sd, uint8 flag, int index, int pos = 0 ); // self
void clif_unequipitemack(map_session_data *sd,int n,int pos,int ok); // self void clif_unequipitemack( map_session_data& sd, uint16 server_index, int32 pos, bool success );
void clif_misceffect( block_list& bl, e_notify_effect type ); void clif_misceffect( block_list& bl, e_notify_effect type );
void clif_changeoption_target(struct block_list* bl, struct block_list* target); void clif_changeoption_target(struct block_list* bl, struct block_list* target);
#define clif_changeoption(bl) clif_changeoption_target(bl, nullptr) // area #define clif_changeoption(bl) clif_changeoption_target(bl, nullptr) // area
@ -884,12 +885,12 @@ void clif_GlobalMessage( block_list& bl, const char* message, enum send_target t
void clif_createchat( map_session_data& sd, e_create_chatroom flag ); void clif_createchat( map_session_data& sd, e_create_chatroom flag );
void clif_dispchat(struct chat_data* cd, int fd); // area or fd void clif_dispchat(struct chat_data* cd, int fd); // area or fd
void clif_joinchatfail( map_session_data& sd, e_refuse_enter_room result ); void clif_joinchatfail( map_session_data& sd, e_refuse_enter_room result );
void clif_joinchatok(map_session_data *sd,struct chat_data* cd); // self void clif_joinchatok(map_session_data& sd,chat_data& cd);
void clif_addchat(struct chat_data* cd,map_session_data *sd); // chat void clif_addchat(struct chat_data* cd,map_session_data *sd); // chat
void clif_changechatowner(struct chat_data* cd, map_session_data* sd); // chat void clif_changechatowner(struct chat_data* cd, map_session_data* sd); // chat
void clif_clearchat(struct chat_data *cd,int fd); // area or fd void clif_clearchat(chat_data &cd);
void clif_leavechat(struct chat_data* cd, map_session_data* sd, bool flag); // chat void clif_leavechat(struct chat_data* cd, map_session_data* sd, bool flag); // chat
void clif_changechatstatus(struct chat_data* cd); // chat void clif_changechatstatus(chat_data& cd);
void clif_refresh_storagewindow(map_session_data *sd); void clif_refresh_storagewindow(map_session_data *sd);
void clif_refresh(map_session_data *sd); // self void clif_refresh(map_session_data *sd); // self
@ -900,13 +901,13 @@ void clif_divorced(map_session_data* sd, const char* name);
void clif_callpartner(map_session_data& sd); void clif_callpartner(map_session_data& sd);
void clif_playBGM( map_session_data& sd, const char* name ); void clif_playBGM( map_session_data& sd, const char* name );
void clif_soundeffect( struct block_list& bl, const char* name, int type, enum send_target target ); void clif_soundeffect( struct block_list& bl, const char* name, int type, enum send_target target );
void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int target_id, t_tick tick ); void clif_parse_ActionRequest_sub( map_session_data& sd, uint8 action_type, int target_id, t_tick tick );
void clif_parse_LoadEndAck(int fd,map_session_data *sd); void clif_parse_LoadEndAck(int fd,map_session_data *sd);
void clif_hotkeys_send(map_session_data *sd, int tab); void clif_hotkeys_send(map_session_data *sd, int tab);
// trade // trade
void clif_traderequest(map_session_data* sd, const char* name); void clif_traderequest(map_session_data& sd, const char* name);
void clif_tradestart(map_session_data* sd, uint8 type); void clif_traderesponse( map_session_data& sd, e_ack_trade_response result );
void clif_tradeadditem(map_session_data* sd, map_session_data* tsd, int index, int amount); void clif_tradeadditem(map_session_data* sd, map_session_data* tsd, int index, int amount);
void clif_tradeitemok(map_session_data& sd, int index, e_exitem_add_result result); void clif_tradeitemok(map_session_data& sd, int index, e_exitem_add_result result);
void clif_tradedeal_lock( map_session_data& sd, bool who ); void clif_tradedeal_lock( map_session_data& sd, bool who );
@ -932,7 +933,7 @@ void clif_skillinfoblock(map_session_data *sd);
void clif_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable); void clif_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable);
void clif_skillinfo(map_session_data *sd,int skill_id, int inf); void clif_skillinfo(map_session_data *sd,int skill_id, int inf);
void clif_addskill(map_session_data *sd, int skill_id); void clif_addskill(map_session_data *sd, int skill_id);
void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock = false); void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock = false);
void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime); void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime);
void clif_skillcastcancel( block_list& bl ); void clif_skillcastcancel( block_list& bl );
@ -940,10 +941,10 @@ void clif_skill_fail( map_session_data& sd, uint16 skill_id, enum useskill_fail_
void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick ); void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick );
int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type); int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
//int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type); //int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
bool clif_skill_nodamage(struct block_list *src,struct block_list *dst,uint16 skill_id,int heal,t_tick tick); bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int32 heal, bool success = true );
void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,int y,t_tick tick); void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,int y,t_tick tick);
void clif_skill_estimation(map_session_data *sd,struct block_list *dst); void clif_skill_estimation(map_session_data *sd,struct block_list *dst);
void clif_skill_warppoint( map_session_data* sd, uint16 skill_id, uint16 skill_lv, const char* map1, const char* map2 = "", const char* map3 = "", const char* map4 = "" ); void clif_skill_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, std::vector<std::string>& maps );
void clif_skill_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result ); void clif_skill_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result );
void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result ); void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result );
void clif_skill_produce_mix_list( map_session_data& sd, int skill_id, int trigger ); void clif_skill_produce_mix_list( map_session_data& sd, int skill_id, int trigger );
@ -1007,7 +1008,7 @@ void clif_mvp_effect(map_session_data *sd);
void clif_mvp_item(map_session_data *sd, t_itemid nameid); void clif_mvp_item(map_session_data *sd, t_itemid nameid);
void clif_mvp_exp(map_session_data *sd, t_exp exp); void clif_mvp_exp(map_session_data *sd, t_exp exp);
void clif_mvp_noitem(map_session_data* sd); void clif_mvp_noitem(map_session_data* sd);
void clif_changed_dir(struct block_list *bl, enum send_target target); void clif_changed_dir(block_list& bl, enum send_target target);
// vending // vending
void clif_openvendingreq( map_session_data& sd, uint16 num ); void clif_openvendingreq( map_session_data& sd, uint16 num );
@ -1040,9 +1041,9 @@ void clif_party_dead( map_session_data& sd );
// guild // guild
void clif_guild_created( map_session_data& sd, int flag ); void clif_guild_created( map_session_data& sd, int flag );
void clif_guild_belonginfo( map_session_data& sd ); void clif_guild_belonginfo( map_session_data& sd );
void clif_guild_masterormember(map_session_data *sd); void clif_guild_masterormember(map_session_data& sd);
void clif_guild_basicinfo( map_session_data& sd ); void clif_guild_basicinfo( map_session_data& sd );
void clif_guild_allianceinfo(map_session_data *sd); void clif_guild_allianceinfo(map_session_data& sd);
void clif_guild_memberlist( map_session_data& sd ); void clif_guild_memberlist( map_session_data& sd );
void clif_guild_skillinfo( map_session_data& sd ); void clif_guild_skillinfo( map_session_data& sd );
void clif_guild_send_onlineinfo(map_session_data *sd); //[LuzZza] void clif_guild_send_onlineinfo(map_session_data *sd); //[LuzZza]
@ -1056,11 +1057,11 @@ void clif_guild_memberpositionchanged(const struct mmo_guild &g,int idx);
void clif_guild_emblem(const map_session_data &sd, const struct mmo_guild &g); void clif_guild_emblem(const map_session_data &sd, const struct mmo_guild &g);
void clif_guild_emblem_area(struct block_list* bl); void clif_guild_emblem_area(struct block_list* bl);
void clif_guild_notice( map_session_data& sd ); void clif_guild_notice( map_session_data& sd );
void clif_guild_message( const struct mmo_guild& g, uint32 account_id, const char* mes, size_t len ); void clif_guild_message( const struct mmo_guild& g, const char* mes, size_t len );
void clif_guild_reqalliance(map_session_data *sd,uint32 account_id,const char *name); void clif_guild_reqalliance(map_session_data& sd,uint32 account_id,const char *name);
void clif_guild_allianceack(map_session_data *sd,int flag); void clif_guild_allianceack(map_session_data& sd, uint8 flag);
void clif_guild_delalliance(map_session_data *sd,int guild_id,int flag); void clif_guild_delalliance(map_session_data& sd,uint32 guild_id,uint32 flag);
void clif_guild_oppositionack(map_session_data *sd,int flag); void clif_guild_oppositionack(map_session_data& sd,uint8 flag);
void clif_guild_broken( map_session_data& sd, int flag ); void clif_guild_broken( map_session_data& sd, int flag );
void clif_guild_xy( map_session_data& sd ); void clif_guild_xy( map_session_data& sd );
void clif_guild_xy_single( map_session_data& sd, map_session_data& tsd ); void clif_guild_xy_single( map_session_data& sd, map_session_data& tsd );
@ -1299,7 +1300,7 @@ void clif_autoshadowspell_list( map_session_data& sd );
int clif_skill_itemlistwindow( map_session_data *sd, uint16 skill_id, uint16 skill_lv ); int clif_skill_itemlistwindow( map_session_data *sd, uint16 skill_id, uint16 skill_lv );
void clif_elemental_info(map_session_data *sd); void clif_elemental_info(map_session_data *sd);
void clif_elemental_updatestatus(map_session_data *sd, int type); void clif_elemental_updatestatus(map_session_data& sd, _sp type);
void clif_spiritcharm( map_session_data& sd ); void clif_spiritcharm( map_session_data& sd );
@ -1456,4 +1457,6 @@ void clif_set_npc_window_pos_percent(map_session_data& sd, int x, int y);
void clif_noask_sub( map_session_data& sd, map_session_data& tsd, int type ); void clif_noask_sub( map_session_data& sd, map_session_data& tsd, int type );
void clif_specialpopup(map_session_data& sd, int32 id);
#endif /* CLIF_HPP */ #endif /* CLIF_HPP */

View File

@ -37,20 +37,16 @@
packet(0x0084,2); packet(0x0084,2);
parseable_packet(0x0085,5,clif_parse_WalkToXY,2); parseable_packet(0x0085,5,clif_parse_WalkToXY,2);
parseable_packet(0x0089,7,clif_parse_ActionRequest,2,6); parseable_packet(0x0089,7,clif_parse_ActionRequest,2,6);
packet(0x008a,29);
packet(0x008b,2); packet(0x008b,2);
parseable_packet(0x008c,-1,clif_parse_GlobalMessage,2,4); parseable_packet(0x008c,-1,clif_parse_GlobalMessage,2,4);
packet(0x008d,-1); packet(0x008d,-1);
packet(0x008e,-1); packet(0x008e,-1);
//packet(0x008f,-1);
parseable_packet(0x0090,7,clif_parse_NpcClicked,2,6); parseable_packet(0x0090,7,clif_parse_NpcClicked,2,6);
packet(0x0093,2); packet(0x0093,2);
parseable_packet(0x0094,6,clif_parse_GetCharNameRequest,2); parseable_packet(0x0094,6,clif_parse_GetCharNameRequest,2);
parseable_packet(0x0096,-1,clif_parse_WisMessage,2,4,28); parseable_packet(0x0096,-1,clif_parse_WisMessage,2,4,28);
parseable_packet(0x0099,-1,clif_parse_Broadcast,2,4); parseable_packet(0x0099,-1,clif_parse_Broadcast,2,4);
packet(0x009a,-1);
parseable_packet(0x009b,5,clif_parse_ChangeDir,2,4); parseable_packet(0x009b,5,clif_parse_ChangeDir,2,4);
packet(0x009c,9);
packet( HEADER_ZC_ITEM_ENTRY, sizeof( struct PACKET_ZC_ITEM_ENTRY ) ); packet( HEADER_ZC_ITEM_ENTRY, sizeof( struct PACKET_ZC_ITEM_ENTRY ) );
packet(0x009e,17); packet(0x009e,17);
parseable_packet(0x009f,6,clif_parse_TakeItem,2); parseable_packet(0x009f,6,clif_parse_TakeItem,2);
@ -63,8 +59,6 @@
packet( useItemAckType, sizeof( struct PACKET_ZC_USE_ITEM_ACK ) ); packet( useItemAckType, sizeof( struct PACKET_ZC_USE_ITEM_ACK ) );
parseable_packet(0x00a9,6,clif_parse_EquipItem,2,4); parseable_packet(0x00a9,6,clif_parse_EquipItem,2,4);
parseable_packet(0x00ab,4,clif_parse_UnequipItem,2); parseable_packet(0x00ab,4,clif_parse_UnequipItem,2);
packet(0x00ac,7);
//packet(0x00ad,-1);
packet(0x00ae,-1); packet(0x00ae,-1);
parseable_packet(0x00b2,3,clif_parse_Restart,2); parseable_packet(0x00b2,3,clif_parse_Restart,2);
parseable_packet(0x00b8,7,clif_parse_NpcSelectMenu,2,6); parseable_packet(0x00b8,7,clif_parse_NpcSelectMenu,2,6);
@ -74,7 +68,6 @@
parseable_packet(0x00bf,3,clif_parse_Emotion,2); parseable_packet(0x00bf,3,clif_parse_Emotion,2);
packet(0x00c0,7); packet(0x00c0,7);
parseable_packet(0x00c1,2,clif_parse_HowManyConnections,0); parseable_packet(0x00c1,2,clif_parse_HowManyConnections,0);
packet(0x00c2,6);
packet(0x00c3,8); packet(0x00c3,8);
parseable_packet(0x00c5,7,clif_parse_NpcBuySellSelected,2,6); parseable_packet(0x00c5,7,clif_parse_NpcBuySellSelected,2,6);
packet(0x00c6,-1); packet(0x00c6,-1);
@ -93,13 +86,10 @@
packet(0x00d4,-1); packet(0x00d4,-1);
parseable_packet(0x00d5,-1,clif_parse_CreateChatRoom,2,4,6,7,15); parseable_packet(0x00d5,-1,clif_parse_CreateChatRoom,2,4,6,7,15);
packet(0x00d7,-1); packet(0x00d7,-1);
packet(0x00d8,6);
parseable_packet(0x00d9,14,clif_parse_ChatAddMember,2,6); parseable_packet(0x00d9,14,clif_parse_ChatAddMember,2,6);
packet(0x00db,-1);
packet(0x00dc,28); packet(0x00dc,28);
packet(0x00dd,29); packet(0x00dd,29);
parseable_packet(0x00de,-1,clif_parse_ChatRoomStatusChange,2,4,6,7,15); parseable_packet(0x00de,-1,clif_parse_ChatRoomStatusChange,2,4,6,7,15);
packet(0x00df,-1);
parseable_packet(0x00e0,30,clif_parse_ChangeChatOwner,2,6); parseable_packet(0x00e0,30,clif_parse_ChangeChatOwner,2,6);
packet(0x00e1,30); packet(0x00e1,30);
parseable_packet(0x00e2,26,clif_parse_KickFromChat,2); parseable_packet(0x00e2,26,clif_parse_KickFromChat,2);
@ -107,7 +97,6 @@
parseable_packet(0x00e4,6,clif_parse_TradeRequest,2); parseable_packet(0x00e4,6,clif_parse_TradeRequest,2);
packet(0x00e5,26); packet(0x00e5,26);
parseable_packet(0x00e6,3,clif_parse_TradeAck,2); parseable_packet(0x00e6,3,clif_parse_TradeAck,2);
packet(0x00e7,3);
parseable_packet(0x00e8,8,clif_parse_TradeAddItem,2,4); parseable_packet(0x00e8,8,clif_parse_TradeAddItem,2,4);
packet(0x00ea,5); packet(0x00ea,5);
parseable_packet(0x00eb,2,clif_parse_TradeOk,0); parseable_packet(0x00eb,2,clif_parse_TradeOk,0);
@ -144,9 +133,7 @@
packet(0x0117,18); packet(0x0117,18);
parseable_packet(0x0118,2,clif_parse_StopAttack,0); parseable_packet(0x0118,2,clif_parse_StopAttack,0);
packet(0x0119,13); packet(0x0119,13);
packet(0x011a,15);
parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4); parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4);
packet(0x011c,68);
parseable_packet(0x011d,2,clif_parse_RequestMemo,0); parseable_packet(0x011d,2,clif_parse_RequestMemo,0);
packet(0x011f,16); packet(0x011f,16);
packet( cartlistequipType, -1 ); packet( cartlistequipType, -1 );
@ -172,9 +159,7 @@
parseable_packet(0x0149,9,clif_parse_GMReqNoChat,2,6,7); parseable_packet(0x0149,9,clif_parse_GMReqNoChat,2,6,7);
packet(0x014a,6); packet(0x014a,6);
packet(0x014b,27); packet(0x014b,27);
packet(0x014c,-1);
parseable_packet(0x014d,2,clif_parse_GuildCheckMaster,0); parseable_packet(0x014d,2,clif_parse_GuildCheckMaster,0);
packet(0x014e,6);
parseable_packet(0x014f,6,clif_parse_GuildRequestInfo,2); parseable_packet(0x014f,6,clif_parse_GuildRequestInfo,2);
packet(0x0150,110); packet(0x0150,110);
parseable_packet(0x0151,6,clif_parse_GuildRequestEmblem,2); parseable_packet(0x0151,6,clif_parse_GuildRequestEmblem,2);
@ -189,9 +174,7 @@
parseable_packet( HEADER_CZ_REQ_BAN_GUILD, sizeof( PACKET_CZ_REQ_BAN_GUILD ), clif_parse_GuildExpulsion, 0 ); parseable_packet( HEADER_CZ_REQ_BAN_GUILD, sizeof( PACKET_CZ_REQ_BAN_GUILD ), clif_parse_GuildExpulsion, 0 );
parseable_packet( HEADER_CZ_REQ_DISORGANIZE_GUILD, sizeof( PACKET_CZ_REQ_DISORGANIZE_GUILD ), clif_parse_GuildBreak, 0 ); parseable_packet( HEADER_CZ_REQ_DISORGANIZE_GUILD, sizeof( PACKET_CZ_REQ_DISORGANIZE_GUILD ), clif_parse_GuildBreak, 0 );
packet(0x015f,42); packet(0x015f,42);
packet(0x0160,-1);
parseable_packet(0x0161,-1,clif_parse_GuildChangePositionInfo,2,4); parseable_packet(0x0161,-1,clif_parse_GuildChangePositionInfo,2,4);
packet(0x0163,-1);
packet(0x0164,-1); packet(0x0164,-1);
parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6); parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6);
packet(0x0166,-1); packet(0x0166,-1);
@ -201,9 +184,7 @@
packet(0x016d,14); packet(0x016d,14);
parseable_packet(0x016e,186,clif_parse_GuildChangeNotice,2,6,66); parseable_packet(0x016e,186,clif_parse_GuildChangeNotice,2,6,66);
parseable_packet(0x0170,14,clif_parse_GuildRequestAlliance,2,6,10); parseable_packet(0x0170,14,clif_parse_GuildRequestAlliance,2,6,10);
packet(0x0171,30);
parseable_packet(0x0172,10,clif_parse_GuildReplyAlliance,2,6); parseable_packet(0x0172,10,clif_parse_GuildReplyAlliance,2,6);
packet(0x0173,3);
packet(0x0174,-1); packet(0x0174,-1);
packet(0x0175,6); packet(0x0175,6);
packet(0x0176,106); packet(0x0176,106);
@ -213,14 +194,10 @@
packet(0x017b,-1); packet(0x017b,-1);
parseable_packet(0x017c,6,clif_parse_InsertCard,2,4); parseable_packet(0x017c,6,clif_parse_InsertCard,2,4);
parseable_packet(0x017e,-1,clif_parse_GuildMessage,2,4); parseable_packet(0x017e,-1,clif_parse_GuildMessage,2,4);
packet(0x017f,-1);
parseable_packet(0x0180,6,clif_parse_GuildOpposition,2); parseable_packet(0x0180,6,clif_parse_GuildOpposition,2);
packet(0x0181,3);
packet(0x0182,106); packet(0x0182,106);
parseable_packet(0x0183,10,clif_parse_GuildDelAlliance,2,6); parseable_packet(0x0183,10,clif_parse_GuildDelAlliance,2,6);
packet(0x0184,10);
packet(0x0185,34); packet(0x0185,34);
//packet(0x0186,-1);
packet(0x0187,6); packet(0x0187,6);
parseable_packet(0x018a,4,clif_parse_QuitGame,2); parseable_packet(0x018a,4,clif_parse_QuitGame,2);
packet(0x018b,4); packet(0x018b,4);
@ -275,7 +252,6 @@
packet(0x01c6,4); packet(0x01c6,4);
packet(0x01c7,2); packet(0x01c7,2);
packet(0x01c9,97); packet(0x01c9,97);
//packet(0x01ca,-1);
packet(0x01cb,9); packet(0x01cb,9);
packet(0x01cc,9); packet(0x01cc,9);
parseable_packet(0x01ce,6,clif_parse_AutoSpell,2); parseable_packet(0x01ce,6,clif_parse_AutoSpell,2);
@ -309,8 +285,6 @@
packet(0x01f1,-1); packet(0x01f1,-1);
packet(0x01f2,20); packet(0x01f2,20);
packet(0x01f3,10); packet(0x01f3,10);
packet(0x01f4,32);
packet(0x01f5,9);
packet(0x01f6,34); packet(0x01f6,34);
parseable_packet(0x01f7,14,clif_parse_Adopt_reply,2,6,10); parseable_packet(0x01f7,14,clif_parse_Adopt_reply,2,6,10);
packet(0x01f8,2); packet(0x01f8,2);
@ -319,7 +293,6 @@
packet(0x01fb,56); packet(0x01fb,56);
packet(0x01fc,-1); packet(0x01fc,-1);
parseable_packet( HEADER_CZ_REQ_ITEMREPAIR1, sizeof( struct PACKET_CZ_REQ_ITEMREPAIR1 ), clif_parse_RepairItem, 0 ); parseable_packet( HEADER_CZ_REQ_ITEMREPAIR1, sizeof( struct PACKET_CZ_REQ_ITEMREPAIR1 ), clif_parse_RepairItem, 0 );
packet(0x01ff,10);
packet(0x0200,26); packet(0x0200,26);
packet(0x0201,-1); packet(0x0201,-1);
parseable_packet(0x0202,26,clif_parse_FriendsListAdd,2); parseable_packet(0x0202,26,clif_parse_FriendsListAdd,2);
@ -331,8 +304,6 @@
parseable_packet(0x0208,11,clif_parse_FriendsListReply,2,6,10); parseable_packet(0x0208,11,clif_parse_FriendsListReply,2,6,10);
packet(0x0209,36); packet(0x0209,36);
packet(0x020a,10); packet(0x020a,10);
//packet(0x020b,-1);
//packet(0x020c,-1);
packet(0x020d,-1); packet(0x020d,-1);
packet(0x8b3,-1); packet(0x8b3,-1);
@ -1021,14 +992,8 @@
packet(0x029b,80); packet(0x029b,80);
#endif #endif
// 2007-11-13aSakexe
#if PACKETVER >= 20071113
packet(0x02e1,33);
#endif
// 2007-11-20aSakexe // 2007-11-20aSakexe
#if PACKETVER >= 20071120 #if PACKETVER >= 20071120
//packet(0x01df,10 <- ???);
packet(0x02e2,14); packet(0x02e2,14);
packet(0x02e3,25); packet(0x02e3,25);
packet(0x02e4,8); packet(0x02e4,8);
@ -1244,7 +1209,6 @@
// 2008-11-26aSakexe // 2008-11-26aSakexe
#if PACKETVER >= 20081126 #if PACKETVER >= 20081126
packet(0x01a2,37); packet(0x01a2,37);
packet(0x0441,4);
#endif #endif
// 2008-12-10aSakexe // 2008-12-10aSakexe
@ -1316,15 +1280,12 @@
// 2008-11-12aRagexeRE // 2008-11-12aRagexeRE
#if PACKETVER >= 20081112 #if PACKETVER >= 20081112
//packet(0x043e,-1);
packet(0x043f,8); packet(0x043f,8);
#endif #endif
// 2008-12-17aRagexeRE // 2008-12-17aRagexeRE
#if PACKETVER >= 20081217 #if PACKETVER >= 20081217
packet(0x01a2,37); packet(0x01a2,37);
//packet(0x0441,4);
//packet(0x0443,8);
#endif #endif
// 2008-12-17bRagexeRE // 2008-12-17bRagexeRE
@ -1335,39 +1296,10 @@
// 2009-01-21aRagexeRE // 2009-01-21aRagexeRE
#if PACKETVER >= 20090121 #if PACKETVER >= 20090121
packet(0x043f,25); packet(0x043f,25);
//packet(0x0444,-1);
//packet(0x0445,10);
#endif
// 2009-02-18aRagexeRE
#if PACKETVER >= 20090218
//packet(0x0446,14);
#endif
// 2009-02-26cRagexeRE
#if PACKETVER >= 20090226
//packet(0x0448,-1);
#endif
// 2009-04-01aRagexeRE
#if PACKETVER >= 20090401
//packet(0x0449,4);
#endif
// 2009-05-14aRagexeRE
#if PACKETVER >= 20090514
//packet(0x044b,2);
#endif #endif
// 2009-05-20aRagexeRE // 2009-05-20aRagexeRE
#if PACKETVER >= 20090520 #if PACKETVER >= 20090520
//packet(0x07d0,6);
//packet(0x07d1,2);
//packet(0x07d2,-1);
//packet(0x07d3,4);
//packet(0x07d4,4);
//packet(0x07d5,4);
//packet(0x07d6,4);
parseable_packet( 0x0447, 2, clif_parse_blocking_playcancel, 0 ); parseable_packet( 0x0447, 2, clif_parse_blocking_playcancel, 0 );
#endif #endif
@ -1379,29 +1311,9 @@
parseable_packet(0x07da,6,clif_parse_PartyChangeLeader,2); parseable_packet(0x07da,6,clif_parse_PartyChangeLeader,2);
#endif #endif
// 2009-06-10aRagexeRE
#if PACKETVER >= 20090610
//packet(0x07db,8);
#endif
// 2009-06-17aRagexeRE // 2009-06-17aRagexeRE
#if PACKETVER >= 20090617 #if PACKETVER >= 20090617
packet(0x07d9,268); packet(0x07d9,268);
//packet(0x07dc,6);
//packet(0x07dd,54);
//packet(0x07de,30);
//packet(0x07df,54);
#endif
// 2009-07-01aRagexeRE
#if PACKETVER >= 20090701
//packet(0x0275,37);
//packet(0x0276,-1);
#endif
// 2009-07-08aRagexeRE
#if PACKETVER >= 20090708
//packet(0x07e0,58);
#endif #endif
// 2009-07-15aRagexeRE // 2009-07-15aRagexeRE
@ -1423,7 +1335,6 @@
// 2009-08-25aRagexeRE // 2009-08-25aRagexeRE
#if PACKETVER >= 20090825 #if PACKETVER >= 20090825
//packet(0x07e6,28);
packet(0x07e7,5); packet(0x07e7,5);
#endif #endif
@ -1436,30 +1347,6 @@
packet(0x07e9,5); packet(0x07e9,5);
#endif #endif
// 2009-09-29aRagexeRE
#if PACKETVER >= 20090929
//packet(0x07ea,2);
//packet(0x07eb,-1);
//packet(0x07ec,6);
//packet(0x07ed,8);
//packet(0x07ee,6);
//packet(0x07ef,8);
//packet(0x07f0,4);
//packet(0x07f2,4);
//packet(0x07f3,3);
#endif
// 2009-10-06aRagexeRE
#if PACKETVER >= 20091006
//packet(0x07ec,8);
//packet(0x07ed,10);
//packet(0x07f0,8);
//packet(0x07f1,15);
//packet(0x07f2,6);
//packet(0x07f3,4);
//packet(0x07f4,3);
#endif
// 2009-10-27aRagexeRE // 2009-10-27aRagexeRE
#if PACKETVER >= 20091027 #if PACKETVER >= 20091027
parseable_packet(0x07f5,6,clif_parse_GMFullStrip,2); parseable_packet(0x07f5,6,clif_parse_GMFullStrip,2);
@ -1481,7 +1368,6 @@
// 2009-12-01aRagexeRE // 2009-12-01aRagexeRE
#if PACKETVER >= 20091201 #if PACKETVER >= 20091201
packet(0x07fc,10); packet(0x07fc,10);
//packet(0x07ff,-1);
#endif #endif
// 2009-12-22aRagexeRE // 2009-12-22aRagexeRE
@ -1491,12 +1377,7 @@
packet(0x0804,8); // Booking System packet(0x0804,8); // Booking System
packet(0x0805,-1); packet(0x0805,-1);
parseable_packet(0x0806,4,clif_parse_PartyBookingDeleteReq,2); // Booking System parseable_packet(0x0806,4,clif_parse_PartyBookingDeleteReq,2); // Booking System
//packet(0x0807,2);
packet(0x0808,4); // Booking System packet(0x0808,4); // Booking System
//packet(0x0809,14);
//packet(0x080A,50);
//packet(0x080B,18);
//packet(0x080C,6);
#endif #endif
// 2009-12-29aRagexeRE // 2009-12-29aRagexeRE
@ -1515,60 +1396,20 @@
parseable_packet( HEADER_CZ_PC_PURCHASE_ITEMLIST_FROMMC2, -1, clif_parse_PurchaseReq2, 0 ); parseable_packet( HEADER_CZ_PC_PURCHASE_ITEMLIST_FROMMC2, -1, clif_parse_PurchaseReq2, 0 );
#endif #endif
// 2010-01-26aRagexeRE
#if PACKETVER >= 20100126
//packet(0x080C,2);
//packet(0x080D,3);
#endif
// 2010-02-09aRagexeRE
#if PACKETVER >= 20100209
//packet(0x07F0,6);
#endif
// 2010-03-03aRagexeRE // 2010-03-03aRagexeRE
#if PACKETVER >= 20100303 #if PACKETVER >= 20100303
packet(0x0810,3); packet(0x0810,3);
parseable_packet(0x0811,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89); parseable_packet(0x0811,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
//packet(0x0812,86);
//packet(0x0815,-1);
//packet(0x0817,-1);
//packet(0x0819,4);
#endif #endif
// 2010-03-09aRagexeRE // 2010-03-09aRagexeRE
#if PACKETVER >= 20100309 #if PACKETVER >= 20100309
//packet(0x0815,6);
//packet(0x0819,10);
//packet(0x081A,4);
//packet(0x081B,4);
//packet(0x081C,6);
packet(0x081d,22); packet(0x081d,22);
packet(0x081e,8);
#endif
// 2010-03-23aRagexeRE
#if PACKETVER >= 20100323
//packet(0x081F,-1);
#endif
// 2010-04-06aRagexeRE
#if PACKETVER >= 20100406
//packet(0x081A,6);
#endif #endif
// 2010-04-13aRagexeRE // 2010-04-13aRagexeRE
#if PACKETVER >= 20100413 #if PACKETVER >= 20100413
//packet(0x081A,10);
packet(0x0820,11); packet(0x0820,11);
//packet(0x0821,2);
//packet(0x0822,9);
//packet(0x0823,-1);
#endif
// 2010-04-14dRagexeRE
#if PACKETVER >= 20100414
//packet(0x081B,8);
#endif #endif
// 2010-04-20aRagexeRE // 2010-04-20aRagexeRE
@ -1590,46 +1431,12 @@
parseable_packet( HEADER_CZ_SSILIST_ITEM_CLICK, sizeof( struct PACKET_CZ_SSILIST_ITEM_CLICK ), clif_parse_SearchStoreInfoListItemClick, 0 ); parseable_packet( HEADER_CZ_SSILIST_ITEM_CLICK, sizeof( struct PACKET_CZ_SSILIST_ITEM_CLICK ), clif_parse_SearchStoreInfoListItemClick, 0 );
#endif #endif
// 2010-06-15aRagexeRE
#if PACKETVER >= 20100615
//packet(0x083E,26);
#endif
// 2010-06-22aRagexeRE
#if PACKETVER >= 20100622
//packet(0x083F,22);
#endif
// 2010-06-29aRagexeRE
#if PACKETVER >= 20100629
//packet(0x07F1,18);
//packet(0x07F2,8);
//packet(0x07F3,6);
#endif
// 2010-07-06aRagexeRE // 2010-07-06aRagexeRE
#if PACKETVER_MAIN_NUM >= 20100817 || PACKETVER_RE_NUM >= 20100706 || defined(PACKETVER_ZERO) #if PACKETVER_MAIN_NUM >= 20100817 || PACKETVER_RE_NUM >= 20100706 || defined(PACKETVER_ZERO)
parseable_packet(0x0835, -1, clif_parse_SearchStoreInfo, 2, 4, 5, 9, 13, 14, 15); parseable_packet(0x0835, -1, clif_parse_SearchStoreInfo, 2, 4, 5, 9, 13, 14, 15);
packet(HEADER_ZC_SEARCH_STORE_INFO_ACK, -1); packet(HEADER_ZC_SEARCH_STORE_INFO_ACK, -1);
#endif #endif
// 2010-07-13aRagexeRE
#if PACKETVER >= 20100713
//packet(0x0827,6);
//packet(0x0828,14);
//packet(0x0829,6);
//packet(0x082A,10);
//packet(0x082B,6);
//packet(0x082C,14);
//packet(0x0840,-1);
//packet(0x0841,19);
#endif
// 2010-07-14aRagexeRE
#if PACKETVER >= 20100714
//packet(0x0841,4);
#endif
// 2010-08-03aRagexeRE // 2010-08-03aRagexeRE
#if PACKETVER >= 20100803 #if PACKETVER >= 20100803
parseable_packet(0x0842,6,clif_parse_GMRecall2,2); parseable_packet(0x0842,6,clif_parse_GMRecall2,2);
@ -1675,7 +1482,6 @@
parseable_packet(0x0838,6,clif_parse_SolveCharName,2); parseable_packet(0x0838,6,clif_parse_SolveCharName,2);
parseable_packet(0x0439,8,clif_parse_UseItem,2,4); parseable_packet(0x0439,8,clif_parse_UseItem,2,4);
packet(0x08d2,10); packet(0x08d2,10);
packet(0x08d1,7);
#endif #endif
// 2011-11-02aRagexe // 2011-11-02aRagexe
@ -1908,10 +1714,8 @@
parseable_packet(0x0978,6,clif_parse_reqworldinfo,2); parseable_packet(0x0978,6,clif_parse_reqworldinfo,2);
packet(0x0979,50); //ackworldinfo packet(0x0979,50); //ackworldinfo
parseable_packet(0x0998,8,clif_parse_EquipItem,2,4); // CZ_REQ_WEAR_EQUIP_V5 parseable_packet(0x0998,8,clif_parse_EquipItem,2,4); // CZ_REQ_WEAR_EQUIP_V5
packet(0x099a,9); // take_off_equipv5
packet(0x099b,8); //maptypeproperty2 packet(0x099b,8); //maptypeproperty2
// New Packets // New Packets
packet(0x08C8,34); // ZC_NOTIFY_ACT3
packet(0x08ff,24); // ZC_EFST_SET_ENTER packet(0x08ff,24); // ZC_EFST_SET_ENTER
packet(0x0984,28); // ZC_EFST_SET_ENTER2 packet(0x0984,28); // ZC_EFST_SET_ENTER2
packet(0x099f,22); // ZC_SKILL_ENTRY4 packet(0x099f,22); // ZC_SKILL_ENTRY4
@ -1940,7 +1744,6 @@
// 2013-07-31cRagexe // 2013-07-31cRagexe
#if PACKETVER >= 20130731 #if PACKETVER >= 20130731
packet(0x09ca,23); // ZC_SKILL_ENTRY5 packet(0x09ca,23); // ZC_SKILL_ENTRY5
packet(0x09cb,17); // ZC_USE_SKILL2
#endif #endif
// 2013-08-07Ragexe // 2013-08-07Ragexe
@ -2126,9 +1929,8 @@
parseable_packet( HEADER_CZ_REQ_RANDOM_COMBINE_ITEM, -1, clif_parse_laphine_synthesis, 0 ); parseable_packet( HEADER_CZ_REQ_RANDOM_COMBINE_ITEM, -1, clif_parse_laphine_synthesis, 0 );
#endif #endif
// 2016-06-22aRagexeRE #if PACKETVER_MAIN_NUM >= 20160622 || PACKETVER_RE_NUM >= 20160622 || defined(PACKETVER_ZERO)
#if PACKETVER >= 20160622 parseable_packet( HEADER_CZ_CMD_RESETCOOLTIME, sizeof( PACKET_CZ_CMD_RESETCOOLTIME ), clif_parse_gm_resetcooltime, 0 );
packet(0x0A84,94);
#endif #endif
// 2016-10-12aRagexeRE // 2016-10-12aRagexeRE

View File

@ -282,9 +282,9 @@ int elemental_data_received(s_elemental *ele, bool flag) {
return 0; return 0;
clif_spawn(&ed->bl); clif_spawn(&ed->bl);
clif_elemental_info(sd); clif_elemental_info(sd);
clif_elemental_updatestatus(sd,SP_HP); clif_elemental_updatestatus(*sd, SP_HP);
clif_hpmeter_single( *sd, ed->bl.id, ed->battle_status.hp, ed->battle_status.max_hp ); clif_hpmeter_single( *sd, ed->bl.id, ed->battle_status.hp, ed->battle_status.max_hp );
clif_elemental_updatestatus(sd,SP_SP); clif_elemental_updatestatus(*sd, SP_SP);
} }
return 1; return 1;
@ -441,9 +441,9 @@ void elemental_heal(s_elemental_data *ed, int hp, int sp) {
if (ed->master == nullptr) if (ed->master == nullptr)
return; return;
if( hp ) if( hp )
clif_elemental_updatestatus(ed->master, SP_HP); clif_elemental_updatestatus(*ed->master, SP_HP);
if( sp ) if( sp )
clif_elemental_updatestatus(ed->master, SP_SP); clif_elemental_updatestatus(*ed->master, SP_SP);
} }
int elemental_dead(s_elemental_data *ed) { int elemental_dead(s_elemental_data *ed) {
@ -595,8 +595,8 @@ static int elemental_ai_sub_timer(s_elemental_data *ed, map_session_data *sd, t_
if( master_dist > AREA_SIZE ) { // Master out of vision range. if( master_dist > AREA_SIZE ) { // Master out of vision range.
elemental_unlocktarget(ed); elemental_unlocktarget(ed);
unit_warp(&ed->bl,sd->bl.m,sd->bl.x,sd->bl.y,CLR_TELEPORT); unit_warp(&ed->bl,sd->bl.m,sd->bl.x,sd->bl.y,CLR_TELEPORT);
clif_elemental_updatestatus(sd,SP_HP); clif_elemental_updatestatus(*sd, SP_HP);
clif_elemental_updatestatus(sd,SP_SP); clif_elemental_updatestatus(*sd, SP_SP);
return 0; return 0;
} else if( master_dist > MAX_ELEDISTANCE ) { // Master too far, chase. } else if( master_dist > MAX_ELEDISTANCE ) { // Master too far, chase.
short x = sd->bl.x, y = sd->bl.y; short x = sd->bl.x, y = sd->bl.y;

View File

@ -847,7 +847,7 @@ int guild_recv_info(const struct mmo_guild &sg) {
sd->guild = g; sd->guild = g;
sd->state.gmaster_flag = 1; sd->state.gmaster_flag = 1;
clif_name_area(&sd->bl); // [LuzZza] clif_name_area(&sd->bl); // [LuzZza]
clif_guild_masterormember(sd); clif_guild_masterormember(*sd);
} }
} else { } else {
before = g->guild; before = g->guild;
@ -893,6 +893,10 @@ int guild_recv_info(const struct mmo_guild &sg) {
clif_guild_skillinfo( *sd ); // Submit information skills clif_guild_skillinfo( *sd ); // Submit information skills
if (guild_new) { // Send information and affiliation if unsent if (guild_new) { // Send information and affiliation if unsent
#if PACKETVER >= 20200902
// Clients after this version need this packet to show the guild name on alt+a
clif_guild_basicinfo( *sd );
#endif
clif_guild_belonginfo( *sd ); clif_guild_belonginfo( *sd );
clif_guild_notice( *sd ); clif_guild_notice( *sd );
sd->guild_emblem_id = g->guild.emblem_id; sd->guild_emblem_id = g->guild.emblem_id;
@ -959,7 +963,7 @@ bool guild_invite( map_session_data& sd, map_session_data* tsd ){
} }
// Checking if there no other invitation pending // Checking if there no other invitation pending
if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){ if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){
clif_guild_inviteack( sd, 0 ); clif_guild_inviteack( sd, 0 );
return false; return false;
} }
@ -1376,6 +1380,10 @@ int guild_send_memberinfoshort(map_session_data *sd,int online) { // cleaned up
} }
if(sd->state.connect_new) { //Note that this works because it is invoked in parse_LoadEndAck before connect_new is cleared. if(sd->state.connect_new) { //Note that this works because it is invoked in parse_LoadEndAck before connect_new is cleared.
#if PACKETVER >= 20200902
// Clients after this version need this packet to show the guild name on alt+a
clif_guild_basicinfo( *sd );
#endif
clif_guild_belonginfo( *sd ); clif_guild_belonginfo( *sd );
sd->guild_emblem_id = g->guild.emblem_id; sd->guild_emblem_id = g->guild.emblem_id;
} }
@ -1468,7 +1476,7 @@ int guild_recv_message( int guild_id, uint32 account_id, const char *mes, size_t
auto g = guild_search(guild_id); auto g = guild_search(guild_id);
if (!g) if (!g)
return 0; return 0;
clif_guild_message(g->guild,account_id,mes,len); clif_guild_message(g->guild,mes,len);
return 0; return 0;
} }
@ -1854,7 +1862,7 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
// Check, is tsd guild master, if not - cancel alliance. [f0und3r] // Check, is tsd guild master, if not - cancel alliance. [f0und3r]
if (battle_config.guild_alliance_onlygm && !tsd->state.gmaster_flag) { if (battle_config.guild_alliance_onlygm && !tsd->state.gmaster_flag) {
clif_guild_allianceack(sd, 5); clif_guild_allianceack(*sd, 5);
return 0; return 0;
} }
@ -1869,23 +1877,23 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
return 0; return 0;
if( guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance ) { if( guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance ) {
clif_guild_allianceack(sd,4); clif_guild_allianceack(*sd,4);
return 0; return 0;
} }
if( guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance ) { if( guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance ) {
clif_guild_allianceack(sd,3); clif_guild_allianceack(*sd,3);
return 0; return 0;
} }
if( tsd->guild_alliance>0 ){ if( tsd->guild_alliance>0 ){
clif_guild_allianceack(sd,1); clif_guild_allianceack(*sd,1);
return 0; return 0;
} }
for (i = 0; i < MAX_GUILDALLIANCE; i++) { // check if already allied for (i = 0; i < MAX_GUILDALLIANCE; i++) { // check if already allied
if( g->guild.alliance[i].guild_id==tsd->status.guild_id && if( g->guild.alliance[i].guild_id==tsd->status.guild_id &&
g->guild.alliance[i].opposition==0){ g->guild.alliance[i].opposition==0){
clif_guild_allianceack(sd,0); clif_guild_allianceack(*sd,0);
return 0; return 0;
} }
} }
@ -1893,7 +1901,7 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
tsd->guild_alliance=sd->status.guild_id; tsd->guild_alliance=sd->status.guild_id;
tsd->guild_alliance_account=sd->status.account_id; tsd->guild_alliance_account=sd->status.account_id;
clif_guild_reqalliance(tsd,sd->status.account_id,g->guild.name); clif_guild_reqalliance(*tsd,sd->status.account_id,g->guild.name);
return 0; return 0;
} }
@ -1906,7 +1914,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
nullpo_ret(sd); nullpo_ret(sd);
tsd= map_id2sd( account_id ); tsd= map_id2sd( account_id );
if (!tsd) { //Character left? Cancel alliance. if (!tsd) { //Character left? Cancel alliance.
clif_guild_allianceack(sd,3); clif_guild_allianceack(*sd,3);
return 0; return 0;
} }
@ -1920,13 +1928,13 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
auto &tg = tsd->guild; auto &tg = tsd->guild;
if (!g || guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance) { if (!g || guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance) {
clif_guild_allianceack(sd,4); clif_guild_allianceack(*sd,4);
clif_guild_allianceack(tsd,3); clif_guild_allianceack(*tsd,3);
return 0; return 0;
} }
if (!g || guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance) { if (!tg || guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance) {
clif_guild_allianceack(sd,3); clif_guild_allianceack(*sd,3);
clif_guild_allianceack(tsd,4); clif_guild_allianceack(*tsd,4);
return 0; return 0;
} }
@ -1951,7 +1959,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
sd->guild_alliance=0; sd->guild_alliance=0;
sd->guild_alliance_account=0; sd->guild_alliance_account=0;
if(tsd!=nullptr) if(tsd!=nullptr)
clif_guild_allianceack(tsd,3); clif_guild_allianceack(*tsd,3);
} }
return 0; return 0;
} }
@ -1988,14 +1996,14 @@ int guild_opposition(map_session_data *sd,map_session_data *tsd) {
return 0; return 0;
if( guild_get_alliance_count(g->guild,1) >= battle_config.max_guild_alliance ) { if( guild_get_alliance_count(g->guild,1) >= battle_config.max_guild_alliance ) {
clif_guild_oppositionack(sd,1); clif_guild_oppositionack(*sd,1);
return 0; return 0;
} }
for (i = 0; i < MAX_GUILDALLIANCE; i++) { // checking relations for (i = 0; i < MAX_GUILDALLIANCE; i++) { // checking relations
if(g->guild.alliance[i].guild_id==tsd->status.guild_id){ if(g->guild.alliance[i].guild_id==tsd->status.guild_id){
if (g->guild.alliance[i].opposition == 1) { // check if not already hostile if (g->guild.alliance[i].opposition == 1) { // check if not already hostile
clif_guild_oppositionack(sd,2); clif_guild_oppositionack(*sd,2);
return 0; return 0;
} }
if(is_agit_start()) // Prevent the changing of alliances to oppositions during WoE. if(is_agit_start()) // Prevent the changing of alliances to oppositions during WoE.
@ -2041,7 +2049,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
if (flag & 0x70) { // failure if (flag & 0x70) { // failure
for(i=0;i<2-(flag&1);i++) for(i=0;i<2-(flag&1);i++)
if( sd[i]!=nullptr ) if( sd[i]!=nullptr )
clif_guild_allianceack(sd[i],((flag>>4)==i+1)?3:4); clif_guild_allianceack(*sd[i],((flag>>4)==i+1)?3:4);
return 0; return 0;
} }
@ -2065,16 +2073,16 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
g[i]->alliance[j].guild_id = 0; g[i]->alliance[j].guild_id = 0;
} }
if (sd[i] != nullptr) // notify players if (sd[i] != nullptr) // notify players
clif_guild_delalliance(sd[i],guild_id[1-i],(flag&1)); clif_guild_delalliance(*sd[i],guild_id[1-i],(flag&1));
} }
} }
if ((flag & 0x0f) == 0) { // alliance notification if ((flag & 0x0f) == 0) { // alliance notification
if( sd[1]!=nullptr ) if( sd[1]!=nullptr )
clif_guild_allianceack(sd[1],2); clif_guild_allianceack(*sd[1],2);
} else if ((flag & 0x0f) == 1) { // enemy notification } else if ((flag & 0x0f) == 1) { // enemy notification
if( sd[0]!=nullptr ) if( sd[0]!=nullptr )
clif_guild_oppositionack(sd[0],0); clif_guild_oppositionack(*sd[0],0);
} }
@ -2083,7 +2091,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
for(j=0;j<g[i]->max_member;j++) { for(j=0;j<g[i]->max_member;j++) {
map_session_data *sd_mem = g[i]->member[j].sd; map_session_data *sd_mem = g[i]->member[j].sd;
if( sd_mem!=nullptr){ if( sd_mem!=nullptr){
clif_guild_allianceinfo(sd_mem); clif_guild_allianceinfo(*sd_mem);
// join ally channel // join ally channel
if( channel_config.ally_tmpl.name[0] && (channel_config.ally_tmpl.opt&CHAN_OPT_AUTOJOIN) ) { if( channel_config.ally_tmpl.name[0] && (channel_config.ally_tmpl.opt&CHAN_OPT_AUTOJOIN) ) {
@ -2104,7 +2112,7 @@ int guild_broken_sub(struct mmo_guild &g, int guild_id) {
if (g.alliance[i].guild_id == guild_id) { if (g.alliance[i].guild_id == guild_id) {
for (int j = 0; j < g.max_member; j++) { for (int j = 0; j < g.max_member; j++) {
if (g.member[j].sd) if (g.member[j].sd)
clif_guild_delalliance(g.member[j].sd, guild_id, g.alliance[i].opposition); clif_guild_delalliance(*g.member[j].sd, guild_id, g.alliance[i].opposition);
} }
intif_guild_alliance(g.guild_id, guild_id, 0, 0, g.alliance[i].opposition | 8); intif_guild_alliance(g.guild_id, guild_id, 0, 0, g.alliance[i].opposition | 8);
g.alliance[i].guild_id = 0; g.alliance[i].guild_id = 0;

View File

@ -279,7 +279,7 @@ int hom_vaporize(map_session_data *sd, int flag)
if (!hd || hd->homunculus.vaporize) if (!hd || hd->homunculus.vaporize)
return 0; return 0;
if (status_isdead(&hd->bl)) if (status_isdead(hd->bl))
return 0; //Can't vaporize a dead homun. return 0; //Can't vaporize a dead homun.
if (flag == HOM_ST_REST && get_percentage(hd->battle_status.hp, hd->battle_status.max_hp) < 80) if (flag == HOM_ST_REST && get_percentage(hd->battle_status.hp, hd->battle_status.max_hp) < 80)
@ -289,10 +289,11 @@ int hom_vaporize(map_session_data *sd, int flag)
//Delete timers when vaporized. //Delete timers when vaporized.
hom_hungry_timer_delete(hd); hom_hungry_timer_delete(hd);
hd->homunculus.vaporize = flag ? flag : HOM_ST_REST; 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.clear();
hd->blockskill.shrink_to_fit(); hd->blockskill.shrink_to_fit();
} }
status_change_clear(&hd->bl, 1);
clif_hominfo(sd, sd->hd, 0); clif_hominfo(sd, sd->hd, 0);
hom_save(hd); hom_save(hd);
@ -1138,7 +1139,6 @@ bool hom_call(map_session_data *sd)
clif_hominfo(sd,hd,1); clif_hominfo(sd,hd,1);
clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89] clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89]
clif_homskillinfoblock( *hd ); 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); hom_save(hd);
} else } else
@ -1280,7 +1280,7 @@ int hom_ressurect(map_session_data* sd, unsigned char per, short x, short y)
if (hd->homunculus.vaporize == HOM_ST_REST) if (hd->homunculus.vaporize == HOM_ST_REST)
return 0; // vaporized homunculi need to be 'called' return 0; // vaporized homunculi need to be 'called'
if (!status_isdead(&hd->bl)) if (!status_isdead(hd->bl))
return 0; // already alive return 0; // already alive
hom_init_timers(hd); hom_init_timers(hd);

View File

@ -168,8 +168,6 @@ enum homun_setting : uint8 {
HOMSET_COPY_SPEED = 0x08, /// Copy their master's speed on spawn/map-change 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_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_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 { enum e_homun_grade : uint8 {

View File

@ -4785,6 +4785,14 @@ bool map_setmapflag_sub(int16 m, enum e_mapflag mapflag, bool status, union u_ma
mapdata->setMapFlag(MF_NOBASEEXP, false); mapdata->setMapFlag(MF_NOBASEEXP, false);
ShowWarning("map_setmapflag: Unable to set No Base EXP and BEXP flags for the same map! Removing No Base EXP flag from %s.\n", mapdata->name); ShowWarning("map_setmapflag: Unable to set No Base EXP and BEXP flags for the same map! Removing No Base EXP flag from %s.\n", mapdata->name);
} }
mapdata->setMapFlag(mapflag, args->flag_val);
} else
mapdata->setMapFlag(mapflag, false);
break;
case MF_SPECIALPOPUP:
if (status) {
nullpo_retr(false, args);
mapdata->setMapFlag(mapflag, args->flag_val); mapdata->setMapFlag(mapflag, args->flag_val);
} else } else
mapdata->setMapFlag(mapflag, false); mapdata->setMapFlag(mapflag, false);

View File

@ -67,7 +67,7 @@ void map_msg_reload(void);
#define NATURAL_HEAL_INTERVAL 500 #define NATURAL_HEAL_INTERVAL 500
#define MIN_FLOORITEM 2 #define MIN_FLOORITEM 2
#define MAX_FLOORITEM START_ACCOUNT_NUM #define MAX_FLOORITEM START_ACCOUNT_NUM
#define MAX_LEVEL 260 #define MAX_LEVEL 275
#define MAX_DROP_PER_MAP 48 #define MAX_DROP_PER_MAP 48
#define MAX_IGNORE_LIST 20 // official is 14 #define MAX_IGNORE_LIST 20 // official is 14
#define MAX_VENDING 12 #define MAX_VENDING 12
@ -676,6 +676,7 @@ enum e_mapflag : int16 {
MF_NOBUYINGSTORE, MF_NOBUYINGSTORE,
MF_NODYNAMICNPC, MF_NODYNAMICNPC,
MF_NOBANK, MF_NOBANK,
MF_SPECIALPOPUP,
MF_MAX MF_MAX
}; };

View File

@ -1443,7 +1443,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,t_tick tick)
bl=map_id2bl(md->master_id); bl=map_id2bl(md->master_id);
if (!bl || status_isdead(bl)) { if (!bl || status_isdead(*bl)) {
status_kill(&md->bl); status_kill(&md->bl);
return 1; return 1;
} }
@ -1934,7 +1934,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick)
if (pcdb_checkid(md->vd->class_)) if (pcdb_checkid(md->vd->class_))
{ //Give them walk act/delay to properly mimic players. [Skotlex] { //Give them walk act/delay to properly mimic players. [Skotlex]
clif_takeitem(&md->bl,tbl); clif_takeitem(md->bl,*tbl);
md->ud.canact_tick = tick + md->status.amotion; md->ud.canact_tick = tick + md->status.amotion;
unit_set_walkdelay(&md->bl, tick, md->status.amotion, 1); unit_set_walkdelay(&md->bl, tick, md->status.amotion, 1);
} }
@ -3682,7 +3682,7 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,uint16 skill_id)
if (md2->state.copy_master_mode) if (md2->state.copy_master_mode)
md->status.mode = md2->status.mode; md->status.mode = md2->status.mode;
clif_skill_nodamage(&md->bl,&md->bl,skill_id,amount,1); clif_skill_nodamage(&md->bl,md->bl,skill_id,amount);
} }
return 0; return 0;

View File

@ -5508,6 +5508,16 @@ static const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, con
} }
break; break;
case MF_SPECIALPOPUP: {
union u_mapflag_args args = {};
if (sscanf(w4, "%11d", &args.flag_val) < 1)
args.flag_val = 0;
map_setmapflag_sub(m, mapflag, state, &args);
}
break;
case MF_SKILL_DAMAGE: { case MF_SKILL_DAMAGE: {
char skill_name[SKILL_NAME_LENGTH]; char skill_name[SKILL_NAME_LENGTH];
char caster_constant[NAME_LENGTH]; char caster_constant[NAME_LENGTH];

View File

@ -1528,6 +1528,11 @@ enum e_job_types
JT_4_EP21_TAN_S, JT_4_EP21_TAN_S,
JT_4_M_VACATION_MARAM = 10595, JT_4_M_VACATION_MARAM = 10595,
JT_4_CLB_SS_FC,
JT_4_CLB_SS_TZ,
JT_4_CLB_SS_AJ,
JT_4_CLB_SS_LK,
JT_4_SMART_ANDRE,
JT_ROZ_MQ_XAVIER = 13000, JT_ROZ_MQ_XAVIER = 13000,
JT_ROZ_MQ_MOCLORD, JT_ROZ_MQ_MOCLORD,
@ -1547,7 +1552,7 @@ enum e_job_types
#define MAX_NPC_CLASS2_START NPC_RANGE3_START #define MAX_NPC_CLASS2_START NPC_RANGE3_START
#define MAX_NPC_CLASS2_END NPC_RANGE3_END #define MAX_NPC_CLASS2_END NPC_RANGE3_END
//Checks if a given id is a valid npc id. [Skotlex] //Checks if a given id is a valid npc id.
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001) //Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) ) #define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )

View File

@ -32,6 +32,12 @@
#pragma pack( push, 1 ) #pragma pack( push, 1 )
#endif #endif
struct PACKET_ZC_USER_COUNT{
uint16 packetType;
int32 playersCount;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_USER_COUNT, 0xc2)
struct PACKET_ZC_PC_PURCHASE_RESULT{ struct PACKET_ZC_PC_PURCHASE_RESULT{
int16 packetType; int16 packetType;
uint8 result; uint8 result;
@ -356,6 +362,38 @@ struct PACKET_ZC_ACK_OPEN_BANKING{
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ACK_OPEN_BANKING, 0x9b7) DEFINE_PACKET_HEADER(ZC_ACK_OPEN_BANKING, 0x9b7)
#if PACKETVER > 6
struct PACKET_ZC_REQ_EXCHANGE_ITEM{
uint16 packetType;
char requesterName[NAME_LENGTH];
uint32 targetId;
uint16 targetLv;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x1f4)
#else
struct PACKET_ZC_REQ_EXCHANGE_ITEM{
uint16 packetType;
char requesterName[NAME_LENGTH];
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x9a)
#endif
#if PACKETVER > 6
struct PACKET_ZC_ACK_EXCHANGE_ITEM{
uint16 packetType;
uint8 result;
uint32 targetId;
uint16 targetLv;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0x1f5)
#else
struct PACKET_ZC_ACK_EXCHANGE_ITEM{
uint16 packetType;
uint8 result;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0xe7)
#endif
struct PACKET_ZC_ACK_ADD_EXCHANGE_ITEM { struct PACKET_ZC_ACK_ADD_EXCHANGE_ITEM {
int16 packetType; int16 packetType;
uint16 index; uint16 index;
@ -629,6 +667,14 @@ struct PACKET_ZC_NOTIFY_PLAYERMOVE {
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_NOTIFY_PLAYERMOVE, 0x87); DEFINE_PACKET_HEADER(ZC_NOTIFY_PLAYERMOVE, 0x87);
struct PACKET_ZC_CHANGE_DIRECTION{
int16 packetType;
uint32 srcId;
uint16 headDir;
uint8 dir;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_CHANGE_DIRECTION, 0x9c)
struct PACKET_ZC_NPCACK_MAPMOVE { struct PACKET_ZC_NPCACK_MAPMOVE {
int16 packetType; int16 packetType;
char mapName[MAP_NAME_LENGTH_EXT]; char mapName[MAP_NAME_LENGTH_EXT];
@ -714,6 +760,32 @@ struct PACKET_ZC_OPEN_EDITDLGSTR {
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_OPEN_EDITDLGSTR, 0x1d4) DEFINE_PACKET_HEADER(ZC_OPEN_EDITDLGSTR, 0x1d4)
struct PACKET_ZC_ACK_REQ_ALLY_GUILD {
int16 packetType;
uint8 flag;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ACK_REQ_ALLY_GUILD, 0x173)
struct PACKET_ZC_DELETE_RELATED_GUILD {
int16 packetType;
uint32 allyID;
uint32 flag;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_DELETE_RELATED_GUILD, 0x184)
struct PACKET_ZC_REQ_ALLY_GUILD {
int16 packetType;
uint32 inviterId;
char inviterGuildName[NAME_LENGTH];
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_REQ_ALLY_GUILD, 0x171)
struct PACKET_ZC_ACK_REQ_HOSTILE_GUILD {
int16 packetType;
uint8 flag;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ACK_REQ_HOSTILE_GUILD, 0x181)
struct PACKET_ZC_COMPASS { struct PACKET_ZC_COMPASS {
int16 packetType; int16 packetType;
uint32 npcId; uint32 npcId;
@ -745,6 +817,12 @@ struct PACKET_ZC_CARTOFF {
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_CARTOFF, 0x12b) DEFINE_PACKET_HEADER(ZC_CARTOFF, 0x12b)
struct PACKET_ZC_ACK_GUILD_MENUINTERFACE {
int16 packetType;
int menuFlag;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ACK_GUILD_MENUINTERFACE, 0x014e)
struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM { struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM {
int16 packetType; int16 packetType;
uint32 aid; uint32 aid;
@ -753,6 +831,13 @@ struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM {
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_NOTIFY_POSITION_TO_GUILDM, 0x1eb) DEFINE_PACKET_HEADER(ZC_NOTIFY_POSITION_TO_GUILDM, 0x1eb)
struct PACKET_ZC_GUILD_CHAT {
int16 packetType;
int16 packetLength;
char message[];
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_GUILD_CHAT, 0x17f)
struct PACKET_ZC_STATUS { struct PACKET_ZC_STATUS {
int16 packetType; int16 packetType;
uint16 point; uint16 point;
@ -832,12 +917,50 @@ struct PACKET_ZC_PAR_CHANGE_USER {
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_PAR_CHANGE_USER, 0x1ab) DEFINE_PACKET_HEADER(ZC_PAR_CHANGE_USER, 0x1ab)
struct PACKET_ZC_CHANGE_CHATROOM{
uint16 packetType;
uint16 packetSize;
uint32 ownerId;
uint32 chatId;
uint16 limit;
uint16 users;
uint8 flag;
char title[];
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_CHANGE_CHATROOM, 0xdf);
struct PACKET_ZC_EQUIP_ARROW { struct PACKET_ZC_EQUIP_ARROW {
int16 packetType; int16 packetType;
uint16 index; uint16 index;
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_EQUIP_ARROW, 0x13c) DEFINE_PACKET_HEADER(ZC_EQUIP_ARROW, 0x13c)
#if PACKETVER >= 20130000
struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{
uint16 packetType;
uint16 index;
uint32 wearLocation;
uint8 flag;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0x99a)
#elif PACKETVER >= 20110824
struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{
uint16 packetType;
uint16 index;
uint16 wearLocation;
uint8 flag;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0x8d1)
#else
struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{
uint16 packetType;
uint16 index;
uint16 wearLocation;
bool flag;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0xac)
#endif
struct PACKET_ZC_CLOSE_STORE { struct PACKET_ZC_CLOSE_STORE {
int16 packetType; int16 packetType;
} __attribute__((packed)); } __attribute__((packed));
@ -892,6 +1015,25 @@ struct PACKET_ZC_REFUSE_ENTER_ROOM {
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_REFUSE_ENTER_ROOM, 0xda); DEFINE_PACKET_HEADER(ZC_REFUSE_ENTER_ROOM, 0xda);
struct PACKET_ZC_DESTROY_ROOM {
int16 packetType;
uint32 chatId;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_DESTROY_ROOM, 0xd8);
struct PACKET_ZC_ENTER_ROOM_sub{
uint32 flag;
char name[NAME_LENGTH];
} __attribute__((packed));
struct PACKET_ZC_ENTER_ROOM{
uint16 packetType;
uint16 packetSize;
uint32 chatId;
PACKET_ZC_ENTER_ROOM_sub members[];
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ENTER_ROOM, 0xdb);
struct PACKET_ZC_NPC_SHOWEFST_UPDATE { struct PACKET_ZC_NPC_SHOWEFST_UPDATE {
int16 packetType; int16 packetType;
uint32 gid; uint32 gid;
@ -976,12 +1118,26 @@ struct PACKET_ZC_SKILL_DISAPPEAR {
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120); DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120);
struct PACKET_ZC_SKILLINFO_DELETE {
uint16 packetType;
uint16 skillID;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_SKILLINFO_DELETE, 0x441);
struct PACKET_ZC_SKILL_UPDATE { struct PACKET_ZC_SKILL_UPDATE {
int16 packetType; int16 packetType;
uint32 GID; uint32 GID;
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_SKILL_UPDATE, 0x1ac); DEFINE_PACKET_HEADER(ZC_SKILL_UPDATE, 0x1ac);
struct PACKET_ZC_HIGHJUMP{
uint16 packetType;
uint32 srcId;
uint16 x;
uint16 y;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_HIGHJUMP, 0x01ff);
#if PACKETVER >= 20141022 #if PACKETVER >= 20141022
struct PACKET_ZC_RECOVERY { struct PACKET_ZC_RECOVERY {
int16 packetType; int16 packetType;
@ -1154,6 +1310,58 @@ struct PACKET_CZ_PARTY_JOIN_REQ_ACK{
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(CZ_PARTY_JOIN_REQ_ACK, 0x2c7); DEFINE_PACKET_HEADER(CZ_PARTY_JOIN_REQ_ACK, 0x2c7);
struct PACKET_ZC_EL_PAR_CHANGE {
int16 packetType;
uint16 type;
uint32 value;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_EL_PAR_CHANGE, 0x81e);
#if PACKETVER >= 20131223
struct PACKET_ZC_NOTIFY_ACT{
int16 packetType;
int32 srcID;
int32 targetID;
int32 serverTick;
int32 srcSpeed;
int32 dmgSpeed;
int32 damage;
int8 isSPDamage;
uint16 div;
uint8 type;
int32 damage2;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8c8);
#elif PACKETVER >= 20071113
struct PACKET_ZC_NOTIFY_ACT{
int16 packetType;
int32 srcID;
int32 targetID;
int32 serverTick;
int32 srcSpeed;
int32 dmgSpeed;
int32 damage;
uint16 div;
uint8 type;
int32 damage2;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x2e1);
#else
struct PACKET_ZC_NOTIFY_ACT{
int16 packetType;
int32 srcID;
int32 targetID;
int32 serverTick;
int32 srcSpeed;
int32 dmgSpeed;
int16 damage;
uint16 div;
uint8 type;
int16 damage2;
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a);
#endif
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 ) #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
#pragma pack( pop ) #pragma pack( pop )
@ -1199,6 +1407,12 @@ DEFINE_PACKET_HEADER(CZ_REQ_STYLE_CHANGE2, 0xafc)
DEFINE_PACKET_HEADER(ZC_REMOVE_EFFECT, 0x0b0d) DEFINE_PACKET_HEADER(ZC_REMOVE_EFFECT, 0x0b0d)
DEFINE_PACKET_HEADER(ZC_FEED_MER, 0x22f) DEFINE_PACKET_HEADER(ZC_FEED_MER, 0x22f)
DEFINE_PACKET_HEADER(ZC_FEED_PET, 0x1a3) DEFINE_PACKET_HEADER(ZC_FEED_PET, 0x1a3)
#if PACKETVER_MAIN_NUM >= 20170502 || PACKETVER_RE_NUM >= 20170419 || defined(PACKETVER_ZERO)
DEFINE_PACKET_HEADER(ZC_WARPLIST, 0xabe)
#else
DEFINE_PACKET_HEADER(ZC_WARPLIST, 0x11c)
#endif
const int16 MAX_INVENTORY_ITEM_PACKET_NORMAL = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_normal ) - ( sizeof( struct NORMALITEM_INFO ) * MAX_ITEMLIST) ) ) / sizeof( struct NORMALITEM_INFO ) ); const int16 MAX_INVENTORY_ITEM_PACKET_NORMAL = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_normal ) - ( sizeof( struct NORMALITEM_INFO ) * MAX_ITEMLIST) ) ) / sizeof( struct NORMALITEM_INFO ) );
const int16 MAX_INVENTORY_ITEM_PACKET_EQUIP = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_equip ) - ( sizeof( struct EQUIPITEM_INFO ) * MAX_ITEMLIST ) ) ) / sizeof( struct EQUIPITEM_INFO ) ); const int16 MAX_INVENTORY_ITEM_PACKET_EQUIP = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_equip ) - ( sizeof( struct EQUIPITEM_INFO ) * MAX_ITEMLIST ) ) ) / sizeof( struct EQUIPITEM_INFO ) );

View File

@ -4998,15 +4998,17 @@ struct PACKET_ZC_POSITION_ID_NAME_INFO {
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166); DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
struct PACKET_ZC_POSITION_INFO { struct PACKET_ZC_POSITION_INFO_sub {
int16 PacketType;
int16 PacketLength;
struct {
int positionID; int positionID;
int right; int right;
int ranking; int ranking;
int payRate; int payRate;
} posInfo[MAX_GUILDPOSITION]; } __attribute__((packed));
struct PACKET_ZC_POSITION_INFO {
int16 PacketType;
int16 PacketLength;
struct PACKET_ZC_POSITION_INFO_sub posInfo[];
} __attribute__((packed)); } __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160); DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160);

View File

@ -446,7 +446,7 @@ bool party_invite( map_session_data& sd, map_session_data *tsd ){
return false; return false;
} }
if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){ if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){
clif_party_invite_reply( sd, tsd->status.name, PARTY_REPLY_JOIN_OTHER_PARTY ); clif_party_invite_reply( sd, tsd->status.name, PARTY_REPLY_JOIN_OTHER_PARTY );
return false; return false;
} }

View File

@ -1801,13 +1801,35 @@ uint8 pc_isequip(map_session_data *sd,int n)
if(item == nullptr) if(item == nullptr)
return ITEM_EQUIP_ACK_FAIL; return ITEM_EQUIP_ACK_FAIL;
if(item->elv && sd->status.base_level < (unsigned int)item->elv)
if (sd->sc.count && sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SUPERNOVICE) {
//Spirit of Super Novice equip bonuses. [Skotlex]
if (sd->status.base_level >= 90 && item->equip & EQP_HELM)
return ITEM_EQUIP_ACK_OK; //Can equip all helms
if (sd->status.base_level >= 96 && item->equip & EQP_ARMS && item->type == IT_WEAPON && item->weapon_level == 4)
switch (item->subtype) { //In weapons, the look determines type of weapon.
case W_DAGGER: //All level 4 - Daggers
case W_1HSWORD: //All level 4 - 1H Swords
case W_1HAXE: //All level 4 - 1H Axes
case W_MACE: //All level 4 - 1H Maces
case W_STAFF: //All level 4 - 1H Staves
case W_2HSTAFF: //All level 4 - 2H Staves
return ITEM_EQUIP_ACK_OK;
}
}
if(item->elv && sd->status.base_level < static_cast<unsigned int>(item->elv))
return ITEM_EQUIP_ACK_FAILLEVEL; return ITEM_EQUIP_ACK_FAILLEVEL;
if(item->elvmax && sd->status.base_level > (unsigned int)item->elvmax) if(item->elvmax && sd->status.base_level > static_cast<unsigned int>(item->elvmax))
return ITEM_EQUIP_ACK_FAILLEVEL; return ITEM_EQUIP_ACK_FAILLEVEL;
if(item->sex != SEX_BOTH && sd->status.sex != item->sex) if(item->sex != SEX_BOTH && sd->status.sex != item->sex)
return ITEM_EQUIP_ACK_FAIL; return ITEM_EQUIP_ACK_FAIL;
// Broken equip
if (sd->inventory.u.items_inventory[n].attribute == 1)
return ITEM_EQUIP_ACK_FAIL;
//fail to equip if item is restricted //fail to equip if item is restricted
if (!battle_config.allow_equip_restricted_item && itemdb_isNoEquip(item, sd->bl.m)) if (!battle_config.allow_equip_restricted_item && itemdb_isNoEquip(item, sd->bl.m))
return ITEM_EQUIP_ACK_FAIL; return ITEM_EQUIP_ACK_FAIL;
@ -1874,23 +1896,6 @@ uint8 pc_isequip(map_session_data *sd,int n)
return ITEM_EQUIP_ACK_FAIL; return ITEM_EQUIP_ACK_FAIL;
if(item->equip && (sd->sc.getSCE(SC_KYOUGAKU) || sd->sc.getSCE(SC_SUHIDE))) if(item->equip && (sd->sc.getSCE(SC_KYOUGAKU) || sd->sc.getSCE(SC_SUHIDE)))
return ITEM_EQUIP_ACK_FAIL; return ITEM_EQUIP_ACK_FAIL;
if (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SUPERNOVICE) {
//Spirit of Super Novice equip bonuses. [Skotlex]
if (sd->status.base_level > 90 && item->equip & EQP_HELM)
return ITEM_EQUIP_ACK_OK; //Can equip all helms
if (sd->status.base_level > 96 && item->equip & EQP_ARMS && item->type == IT_WEAPON && item->weapon_level == 4)
switch(item->subtype) { //In weapons, the look determines type of weapon.
case W_DAGGER: //All level 4 - Daggers
case W_1HSWORD: //All level 4 - 1H Swords
case W_1HAXE: //All level 4 - 1H Axes
case W_MACE: //All level 4 - 1H Maces
case W_STAFF: //All level 4 - 1H Staves
case W_2HSTAFF: //All level 4 - 2H Staves
return ITEM_EQUIP_ACK_OK;
}
}
} }
//Not equipable by class. [Skotlex] //Not equipable by class. [Skotlex]
@ -5340,7 +5345,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT; sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
if (level == 0) { //Remove skill. if (level == 0) { //Remove skill.
sd->status.skill[idx].id = 0; sd->status.skill[idx].id = 0;
clif_deleteskill(sd,skill_id); clif_deleteskill(*sd,skill_id);
} else } else
clif_addskill(sd,skill_id); clif_addskill(sd,skill_id);
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills. if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
@ -5375,7 +5380,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_
sd->status.skill[idx].flag = SKILL_FLAG_PERM_GRANTED; sd->status.skill[idx].flag = SKILL_FLAG_PERM_GRANTED;
if (level == 0) { //Remove skill. if (level == 0) { //Remove skill.
sd->status.skill[idx].id = 0; sd->status.skill[idx].id = 0;
clif_deleteskill(sd,skill_id); clif_deleteskill(*sd,skill_id);
} else } else
clif_addskill(sd,skill_id); clif_addskill(sd,skill_id);
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills. if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
@ -5457,7 +5462,7 @@ bool pc_skill_plagiarism_reset(map_session_data &sd, uint8 type)
sd.status.skill[idx].id = 0; sd.status.skill[idx].id = 0;
sd.status.skill[idx].lv = 0; sd.status.skill[idx].lv = 0;
sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT; sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT;
clif_deleteskill(&sd, skill_id); clif_deleteskill(sd, skill_id);
if (type == 1) { if (type == 1) {
sd.cloneskill_idx = 0; sd.cloneskill_idx = 0;
@ -6128,7 +6133,7 @@ bool pc_takeitem(map_session_data *sd,struct flooritem_data *fitem)
//Display pickup animation. //Display pickup animation.
pc_stop_attack(sd); pc_stop_attack(sd);
clif_takeitem(&sd->bl,&fitem->bl); clif_takeitem(sd->bl,fitem->bl);
if (fitem->mob_id && if (fitem->mob_id &&
(itemdb_search(fitem->item.nameid))->flag.broadcast && (itemdb_search(fitem->item.nameid))->flag.broadcast &&
@ -6675,7 +6680,6 @@ bool pc_steal_item(map_session_data *sd,struct block_list *bl, uint16 skill_lv)
t_itemid itemid; t_itemid itemid;
double rate; double rate;
unsigned char flag = 0; unsigned char flag = 0;
struct status_data *sd_status, *md_status;
struct mob_data *md; struct mob_data *md;
if(!sd || !bl || bl->type!=BL_MOB) if(!sd || !bl || bl->type!=BL_MOB)
@ -6686,8 +6690,8 @@ bool pc_steal_item(map_session_data *sd,struct block_list *bl, uint16 skill_lv)
if(md->state.steal_flag == UCHAR_MAX || ( md->sc.opt1 && md->sc.opt1 != OPT1_BURNING ) ) //already stolen from / status change check if(md->state.steal_flag == UCHAR_MAX || ( md->sc.opt1 && md->sc.opt1 != OPT1_BURNING ) ) //already stolen from / status change check
return false; return false;
sd_status= status_get_status_data(&sd->bl); status_data* sd_status = status_get_status_data(sd->bl);
md_status= status_get_status_data(bl); status_data* md_status = status_get_status_data(*bl);
if (md->master_id || status_has_mode(md_status, MD_STATUSIMMUNE) || util::vector_exists(status_get_race2(&md->bl), RC2_TREASURE) || if (md->master_id || status_has_mode(md_status, MD_STATUSIMMUNE) || util::vector_exists(status_get_race2(&md->bl), RC2_TREASURE) ||
map_getmapflag(bl->m, MF_NOMOBLOOT) || // check noloot map flag [Lorky] map_getmapflag(bl->m, MF_NOMOBLOOT) || // check noloot map flag [Lorky]
@ -7008,6 +7012,16 @@ enum e_setpos pc_setpos(map_session_data* sd, unsigned short mapindex, int x, in
if( hom_is_active(sd->hd) ) 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();
}
sd->hd->bl.m = m; sd->hd->bl.m = m;
sd->hd->bl.x = sd->hd->ud.to_x = x; sd->hd->bl.x = sd->hd->ud.to_x = x;
sd->hd->bl.y = sd->hd->ud.to_y = y; sd->hd->bl.y = sd->hd->ud.to_y = y;
@ -7182,11 +7196,10 @@ int pc_get_skillcooldown(map_session_data *sd, uint16 skill_id, uint16 skill_lv)
*------------------------------------------*/ *------------------------------------------*/
uint8 pc_checkskill(map_session_data *sd, uint16 skill_id) uint8 pc_checkskill(map_session_data *sd, uint16 skill_id)
{ {
uint16 idx = 0;
if (sd == nullptr) if (sd == nullptr)
return 0; return 0;
uint16 idx = 0;
#ifdef RENEWAL #ifdef RENEWAL
if ((idx = skill_get_index(skill_id)) == 0) { if ((idx = skill_get_index(skill_id)) == 0) {
#else #else
@ -8226,7 +8239,7 @@ static void pc_calcexp(map_session_data *sd, t_exp *base_exp, t_exp *job_exp, st
int bonus = 0, vip_bonus_base = 0, vip_bonus_job = 0; int bonus = 0, vip_bonus_base = 0, vip_bonus_job = 0;
if (src) { if (src) {
struct status_data *status = status_get_status_data(src); status_data* status = status_get_status_data(*src);
if( sd->indexed_bonus.expaddrace[status->race] ) if( sd->indexed_bonus.expaddrace[status->race] )
bonus += sd->indexed_bonus.expaddrace[status->race]; bonus += sd->indexed_bonus.expaddrace[status->race];
@ -10040,7 +10053,7 @@ bool pc_revive_item(map_session_data *sd) {
else else
pc_delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME); pc_delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME);
clif_skill_nodamage(&sd->bl, &sd->bl, ALL_RESURRECTION, 4, 1); clif_skill_nodamage(&sd->bl, sd->bl, ALL_RESURRECTION, 4);
return true; return true;
} }
@ -11908,7 +11921,7 @@ bool pc_equipitem(map_session_data *sd,short n,int req_pos,bool equipswitch)
return false; return false;
} }
if (!(pos&req_pos) || sd->inventory.u.items_inventory[n].equip != 0 || sd->inventory.u.items_inventory[n].attribute==1 ) { // [Valaris] if (!(pos&req_pos) || sd->inventory.u.items_inventory[n].equip != 0) {
if( equipswitch ){ if( equipswitch ){
clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL ); clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
}else{ }else{
@ -12249,18 +12262,18 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
nullpo_retr(false,sd); nullpo_retr(false,sd);
if (n < 0 || n >= MAX_INVENTORY) { if (n < 0 || n >= MAX_INVENTORY) {
clif_unequipitemack(sd,0,0,0); clif_unequipitemack(*sd,0,0,false);
return false; return false;
} }
if (!(pos = sd->inventory.u.items_inventory[n].equip)) { if (!(pos = sd->inventory.u.items_inventory[n].equip)) {
clif_unequipitemack(sd,n,0,0); clif_unequipitemack(*sd,n,0,false);
return false; //Nothing to unequip return false; //Nothing to unequip
} }
// status change that makes player cannot unequip equipment // status change that makes player cannot unequip equipment
if (!(flag&2) && sd->sc.count &&( sd->sc.cant.unequip || if (!(flag&2) && sd->sc.count &&( sd->sc.cant.unequip ||
(sd->sc.getSCE(SC_PYROCLASTIC) && sd->inventory_data[n]->type == IT_WEAPON))) // can't switch weapon (sd->sc.getSCE(SC_PYROCLASTIC) && sd->inventory_data[n]->type == IT_WEAPON))) // can't switch weapon
{ {
clif_unequipitemack(sd,n,0,0); clif_unequipitemack(*sd,n,0,false);
return false; return false;
} }
@ -12299,7 +12312,7 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
if(pos & EQP_SHOES) if(pos & EQP_SHOES)
clif_changelook(&sd->bl,LOOK_SHOES,0); clif_changelook(&sd->bl,LOOK_SHOES,0);
clif_unequipitemack(sd,n,pos,1); clif_unequipitemack(*sd,n,pos,true);
pc_set_costume_view(sd); pc_set_costume_view(sd);
status_db.removeByStatusFlag(&sd->bl, { SCF_REMOVEONUNEQUIP }); status_db.removeByStatusFlag(&sd->bl, { SCF_REMOVEONUNEQUIP });
@ -12320,7 +12333,7 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
if (idx >= 0) { if (idx >= 0) {
sd->equip_index[EQI_AMMO] = -1; sd->equip_index[EQI_AMMO] = -1;
clif_unequipitemack(sd, idx, sd->inventory.u.items_inventory[idx].equip, 1); clif_unequipitemack(*sd, idx, sd->inventory.u.items_inventory[idx].equip, true);
pc_unequipitem_sub(sd, idx, 0); pc_unequipitem_sub(sd, idx, 0);
} }
} }
@ -12961,7 +12974,7 @@ bool pc_setstand(map_session_data *sd, bool force){
status_change_end(&sd->bl, SC_TENSIONRELAX); status_change_end(&sd->bl, SC_TENSIONRELAX);
clif_status_load(&sd->bl,EFST_SIT,0); clif_status_load(&sd->bl,EFST_SIT,0);
clif_standing(&sd->bl); //Inform area PC is standing clif_standing(sd->bl); //Inform area PC is standing
//Reset sitting tick. //Reset sitting tick.
sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0; sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0;
if( pc_isdead( sd ) ){ if( pc_isdead( sd ) ){

View File

@ -706,7 +706,11 @@ public:
int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united. int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united.
int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign. int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign.
int trade_partner; struct{
uint32 id;
unsigned int lv;
}trade_partner;
struct s_deal { struct s_deal {
struct s_item { struct s_item {
short index, amount; short index, amount;
@ -1232,7 +1236,7 @@ enum e_mado_type : uint16 {
#define pc_rightside_def(sd) ((sd)->battle_status.def) #define pc_rightside_def(sd) ((sd)->battle_status.def)
#define pc_leftside_mdef(sd) ((sd)->battle_status.mdef2) #define pc_leftside_mdef(sd) ((sd)->battle_status.mdef2)
#define pc_rightside_mdef(sd) ((sd)->battle_status.mdef) #define pc_rightside_mdef(sd) ((sd)->battle_status.mdef)
#define pc_leftside_matk(sd) (status_base_matk_min(&(sd)->bl, status_get_status_data(&(sd)->bl), (sd)->status.base_level)) #define pc_leftside_matk(sd) (status_base_matk_min(&(sd)->bl, status_get_status_data((sd)->bl), (sd)->status.base_level))
#define pc_rightside_matk(sd) ((sd)->battle_status.rhw.matk+(sd)->battle_status.lhw.matk+(sd)->bonus.ematk) #define pc_rightside_matk(sd) ((sd)->battle_status.rhw.matk+(sd)->battle_status.lhw.matk+(sd)->bonus.ematk)
#else #else
#define pc_leftside_atk(sd) ((sd)->battle_status.batk + (sd)->battle_status.rhw.atk + (sd)->battle_status.lhw.atk) #define pc_leftside_atk(sd) ((sd)->battle_status.batk + (sd)->battle_status.rhw.atk + (sd)->battle_status.lhw.atk)

View File

@ -714,7 +714,7 @@ int pet_attackskill(struct pet_data *pd, int target_id)
bl = map_id2bl(target_id); bl = map_id2bl(target_id);
if(bl == nullptr || pd->bl.m != bl->m || bl->prev == nullptr || status_isdead(bl) || if(bl == nullptr || pd->bl.m != bl->m || bl->prev == nullptr || status_isdead(*bl) ||
!check_distance_bl(&pd->bl, bl, pd->db->range3)) !check_distance_bl(&pd->bl, bl, pd->db->range3))
return 0; return 0;
@ -1192,7 +1192,7 @@ int pet_select_egg(map_session_data *sd,short egg_index)
if(egg_index < 0 || egg_index >= MAX_INVENTORY) if(egg_index < 0 || egg_index >= MAX_INVENTORY)
return 0; //Forged packet! return 0; //Forged packet!
if(sd->trade_partner) //The player have trade in progress. if(sd->state.trading) //The player have trade in progress.
return 0; return 0;
std::shared_ptr<s_pet_db> pet = pet_db_search(sd->inventory.u.items_inventory[egg_index].nameid, PET_EGG); std::shared_ptr<s_pet_db> pet = pet_db_search(sd->inventory.u.items_inventory[egg_index].nameid, PET_EGG);
@ -1791,7 +1791,7 @@ static int pet_ai_sub_hard(struct pet_data *pd, map_session_data *sd, t_tick tic
if (pd->target_id) { if (pd->target_id) {
target = map_id2bl(pd->target_id); target = map_id2bl(pd->target_id);
if (!target || pd->bl.m != target->m || status_isdead(target) || if (!target || pd->bl.m != target->m || status_isdead(*target) ||
!check_distance_bl(&pd->bl, target, pd->db->range3)) { !check_distance_bl(&pd->bl, target, pd->db->range3)) {
target = nullptr; target = nullptr;
pet_unlocktarget(pd); pet_unlocktarget(pd);
@ -2073,7 +2073,7 @@ TIMER_FUNC(pet_recovery_timer){
if(sd->sc.getSCE(pd->recovery->type)) { if(sd->sc.getSCE(pd->recovery->type)) {
//Display a heal animation? //Display a heal animation?
//Detoxify is chosen for now. //Detoxify is chosen for now.
clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1); clif_skill_nodamage(&pd->bl,sd->bl,TF_DETOXIFY,1);
status_change_end(&sd->bl, pd->recovery->type); status_change_end(&sd->bl, pd->recovery->type);
clif_emotion(&pd->bl, ET_OK); clif_emotion(&pd->bl, ET_OK);
} }
@ -2090,7 +2090,6 @@ TIMER_FUNC(pet_recovery_timer){
*/ */
TIMER_FUNC(pet_heal_timer){ TIMER_FUNC(pet_heal_timer){
map_session_data *sd = map_id2sd(id); map_session_data *sd = map_id2sd(id);
struct status_data *status;
struct pet_data *pd; struct pet_data *pd;
unsigned int rate = 100; unsigned int rate = 100;
@ -2104,7 +2103,7 @@ TIMER_FUNC(pet_heal_timer){
return 0; return 0;
} }
status = status_get_status_data(&sd->bl); status_data* status = status_get_status_data(sd->bl);
if(pc_isdead(sd) || if(pc_isdead(sd) ||
(rate = get_percentage(status->sp, status->max_sp)) > pd->s_skill->sp || (rate = get_percentage(status->sp, status->max_sp)) > pd->s_skill->sp ||
@ -2117,7 +2116,7 @@ TIMER_FUNC(pet_heal_timer){
pet_stop_attack(pd); pet_stop_attack(pd);
pet_stop_walking(pd,1); pet_stop_walking(pd,1);
clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->s_skill->lv,1); clif_skill_nodamage(&pd->bl,sd->bl,AL_HEAL,pd->s_skill->lv);
status_heal(&sd->bl, pd->s_skill->lv,0, 0); status_heal(&sd->bl, pd->s_skill->lv,0, 0);
pd->s_skill->timer = add_timer(tick+pd->s_skill->delay*1000,pet_heal_timer,sd->bl.id,0); pd->s_skill->timer = add_timer(tick+pd->s_skill->delay*1000,pet_heal_timer,sd->bl.id,0);
return 0; return 0;
@ -2134,7 +2133,6 @@ TIMER_FUNC(pet_heal_timer){
TIMER_FUNC(pet_skill_support_timer){ TIMER_FUNC(pet_skill_support_timer){
map_session_data *sd = map_id2sd(id); map_session_data *sd = map_id2sd(id);
struct pet_data *pd; struct pet_data *pd;
struct status_data *status;
short rate = 100; short rate = 100;
if(sd == nullptr || sd->pd == nullptr || sd->pd->s_skill == nullptr) if(sd == nullptr || sd->pd == nullptr || sd->pd->s_skill == nullptr)
@ -2147,7 +2145,7 @@ TIMER_FUNC(pet_skill_support_timer){
return 0; return 0;
} }
status = status_get_status_data(&sd->bl); status_data* status = status_get_status_data(sd->bl);
if (DIFF_TICK(pd->ud.canact_tick, tick) > 0) { if (DIFF_TICK(pd->ud.canact_tick, tick) > 0) {
//Wait until the pet can act again. //Wait until the pet can act again.

View File

@ -242,7 +242,7 @@ uint64 QuestDatabase::parseBodyNode(const ryml::NodeRef& node) {
} }
if (constant < SZ_SMALL || constant > SZ_ALL) { if (constant < SZ_SMALL || constant > SZ_ALL) {
this->invalidWarning(targetNode["size"], "Unsupported size %s, skipping.\n", size_.c_str()); this->invalidWarning(targetNode["Size"], "Unsupported size %s, skipping.\n", size_.c_str());
return 0; return 0;
} }
@ -385,7 +385,7 @@ uint64 QuestDatabase::parseBodyNode(const ryml::NodeRef& node) {
} }
if (!this->nodeExists(dropNode, "Rate")) { if (!this->nodeExists(dropNode, "Rate")) {
this->invalidWarning(dropNode["Item"], "Drops has no Rate value specified, skipping.\n"); this->invalidWarning(dropNode["Rate"], "Drops has no Rate value specified, skipping.\n");
continue; continue;
} }

View File

@ -15337,18 +15337,16 @@ BUILDIN_FUNC(petskillsupport)
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
static inline void script_skill_effect(block_list *bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y) { static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y ) {
nullpo_retv(bl);
switch (skill_get_casttype(skill_id)) { switch (skill_get_casttype(skill_id)) {
case CAST_GROUND: case CAST_GROUND:
clif_skill_poseffect(bl, skill_id, skill_lv, x, y, gettick()); clif_skill_poseffect(&bl, skill_id, skill_lv, x, y, gettick());
break; break;
case CAST_NODAMAGE: case CAST_NODAMAGE:
clif_skill_nodamage(bl, bl, skill_id, skill_lv, 1); clif_skill_nodamage(&bl, bl, skill_id, skill_lv);
break; break;
case CAST_DAMAGE: case CAST_DAMAGE:
clif_skill_damage(bl, bl, gettick(), status_get_amotion(bl), status_get_dmotion(bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id)); clif_skill_damage(&bl, &bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
break; break;
} }
} }
@ -15356,32 +15354,46 @@ static inline void script_skill_effect(block_list *bl, uint16 skill_id, uint16 s
/*========================================== /*==========================================
* Scripted skill effects [Celest] * Scripted skill effects [Celest]
*------------------------------------------*/ *------------------------------------------*/
/// skilleffect <skill id>,<level> /// skilleffect <skill id>,<level>{,<game id>}
/// skilleffect "<skill name>",<level> /// skilleffect "<skill name>",<level>{,<game id>}
BUILDIN_FUNC(skilleffect) BUILDIN_FUNC(skilleffect)
{ {
TBL_PC *sd; block_list* bl;
uint16 skill_id, skill_lv; map_session_data* sd;
if( !script_rid2sd(sd) ) if (script_hasdata(st, 4)) {
return SCRIPT_CMD_FAILURE; if (!script_rid2bl(4, bl))
return SCRIPT_CMD_SUCCESS;
}
else {
// target is the character attached (default)
if (!script_rid2sd(sd))
return SCRIPT_CMD_SUCCESS;
skill_id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); bl = &sd->bl;
skill_lv = script_getnum(st,3); }
uint16 skill_id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st, 2)) : script_getnum(st, 2) );
if (skill_db.find(skill_id) == nullptr) { if (skill_db.find(skill_id) == nullptr) {
ShowError("buildin_skilleffect: Invalid skill defined (%s)!\n", script_getstr(st, 2)); ShowError("buildin_skilleffect: Invalid skill defined (%s)!\n", script_getstr(st, 2));
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_FAILURE;
} }
uint16 skill_lv = script_getnum(st, 3);
if (bl->type == BL_PC) {
/* Ensure we're standing because the following packet causes the client to virtually set the char to stand, /* Ensure we're standing because the following packet causes the client to virtually set the char to stand,
* which leaves the server thinking it still is sitting. */ * which leaves the server thinking it still is sitting. */
if( pc_issit(sd) && pc_setstand(sd, false) ) { sd = reinterpret_cast<map_session_data*>( bl );
if (pc_issit(sd) && pc_setstand(sd, false)) {
skill_sit(sd, 0); skill_sit(sd, 0);
clif_standing(&sd->bl); clif_standing(sd->bl);
}
} }
script_skill_effect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y); script_skill_effect( *bl, skill_id, skill_lv, bl->x, bl->y );
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
@ -15413,7 +15425,7 @@ BUILDIN_FUNC(npcskilleffect)
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_FAILURE;
} }
script_skill_effect(bl, skill_id, skill_lv, bl->x, bl->y); script_skill_effect( *bl, skill_id, skill_lv, bl->x, bl->y );
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
@ -15849,7 +15861,7 @@ BUILDIN_FUNC(addhomintimacy)
homun_data *hd; homun_data *hd;
if (!script_charid2sd(3, sd) || !(hd = sd->hd)) if (!script_charid2sd(3, sd) || !(hd = sd->hd))
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_SUCCESS;
int32 value = script_getnum(st, 2); int32 value = script_getnum(st, 2);
@ -19898,7 +19910,7 @@ BUILDIN_FUNC(unitattack)
case BL_PC: { case BL_PC: {
map_session_data* sd = (map_session_data*)unit_bl; map_session_data* sd = (map_session_data*)unit_bl;
clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? 0x07 : 0x00, target_bl->id, gettick() ); clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? DMG_REPEAT : DMG_NORMAL, target_bl->id, gettick() );
script_pushint(st, sd->ud.target == target_bl->id); script_pushint(st, sd->ud.target == target_bl->id);
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
@ -23138,7 +23150,7 @@ BUILDIN_FUNC(sit)
if( !pc_issit(sd) ) { if( !pc_issit(sd) ) {
pc_setsit(sd); pc_setsit(sd);
skill_sit(sd, 1); skill_sit(sd, 1);
clif_sitting(&sd->bl); clif_sitting(sd->bl);
} }
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
@ -23155,7 +23167,7 @@ BUILDIN_FUNC(stand)
if( pc_issit(sd) && pc_setstand(sd, false)) { if( pc_issit(sd) && pc_setstand(sd, false)) {
skill_sit(sd, 0); skill_sit(sd, 0);
clif_standing(&sd->bl); clif_standing(sd->bl);
} }
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
@ -27234,6 +27246,22 @@ BUILDIN_FUNC(opentips){
#endif #endif
} }
/**
* Displays a special popup.
* specialpopup(<popup id>);
*/
BUILDIN_FUNC(specialpopup) {
map_session_data* sd;
if( !script_rid2sd(sd) )
return SCRIPT_CMD_FAILURE;
int32 id = script_getnum(st,2);
clif_specialpopup(*sd, id);
return SCRIPT_CMD_SUCCESS;
}
BUILDIN_FUNC(setdialogalign){ BUILDIN_FUNC(setdialogalign){
map_session_data *sd; map_session_data *sd;
@ -27711,7 +27739,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(petskillattack,"viii"), // [Skotlex] BUILDIN_DEF(petskillattack,"viii"), // [Skotlex]
BUILDIN_DEF(petskillattack2,"viiii"), // [Valaris] BUILDIN_DEF(petskillattack2,"viiii"), // [Valaris]
BUILDIN_DEF(petskillsupport,"viiii"), // [Skotlex] BUILDIN_DEF(petskillsupport,"viiii"), // [Skotlex]
BUILDIN_DEF(skilleffect,"vi"), // skill effect [Celest] BUILDIN_DEF(skilleffect,"vi?"), // skill effect [Celest]
BUILDIN_DEF(npcskilleffect,"viii"), // npc skill effect [Valaris] BUILDIN_DEF(npcskilleffect,"viii"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect,"i??"), // npc skill effect [Valaris] BUILDIN_DEF(specialeffect,"i??"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect2,"i??"), // skill effect on players[Valaris] BUILDIN_DEF(specialeffect2,"i??"), // skill effect on players[Valaris]
@ -28143,6 +28171,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(has_autoloot,"?"), BUILDIN_DEF(has_autoloot,"?"),
BUILDIN_DEF(autoloot,"??"), BUILDIN_DEF(autoloot,"??"),
BUILDIN_DEF(opentips, "i?"), BUILDIN_DEF(opentips, "i?"),
BUILDIN_DEF(specialpopup,"i"),
BUILDIN_DEF(setdialogalign, "i"), BUILDIN_DEF(setdialogalign, "i"),
BUILDIN_DEF(setdialogsize, "ii"), BUILDIN_DEF(setdialogsize, "ii"),

View File

@ -2128,7 +2128,21 @@ enum e_hat_effects : int16{
HAT_EF_C_BABY_GLOOM, HAT_EF_C_BABY_GLOOM,
HAT_EF_WINTERNIGHTBELLS, HAT_EF_WINTERNIGHTBELLS,
HAT_EF_NIGHTSKYOFRUTIE, HAT_EF_NIGHTSKYOFRUTIE,
FOOTPRINT_EF_BASE,
FOOTPRINT_EF_STR_BASE,
FOOTPRINT_EF_PURPLESTAR,
FOOTPRINT_EF_YELLOWSTAR,
FOOTPRINT_EF_REDSTAR,
HAT_EF_RAINBOW_POISON_MASTER, HAT_EF_RAINBOW_POISON_MASTER,
HAT_EF_C_ANCIENT_RUNE,
HAT_EF_C_DRAGON_GREEN_AURA,
HAT_EF_C_DRAGON_RED_AURA,
HAT_EF_C_DRAGON_YELLOW_AURA,
HAT_EF_INTERDIMENSIONAL_RIFT,
HAT_EF_C_CLB_SS_LL,
HAT_EF_VACATION,
HAT_EF_C_FH_LOSTWING,
FOOTPRINT_EF_DOGFOOT,
HAT_EF_MAX HAT_EF_MAX
}; };

View File

@ -538,6 +538,7 @@
export_constant(MF_NOBUYINGSTORE); export_constant(MF_NOBUYINGSTORE);
export_constant(MF_NODYNAMICNPC); export_constant(MF_NODYNAMICNPC);
export_constant(MF_NOBANK); export_constant(MF_NOBANK);
export_constant(MF_SPECIALPOPUP);
/* setcell types */ /* setcell types */
export_constant(CELL_WALKABLE); export_constant(CELL_WALKABLE);
@ -1915,20 +1916,6 @@
export_constant(SC_POWERUP); export_constant(SC_POWERUP);
export_constant(SC_AGIUP); export_constant(SC_AGIUP);
export_constant(SC_PROTECTION); export_constant(SC_PROTECTION);
export_constant(SC_HOGOGONG);
export_constant(SC_MARINE_FESTIVAL);
export_constant(SC_SANDY_FESTIVAL);
export_constant(SC_KI_SUL_RAMPAGE);
export_constant(SC_COLORS_OF_HYUN_ROK_1);
export_constant(SC_COLORS_OF_HYUN_ROK_2);
export_constant(SC_COLORS_OF_HYUN_ROK_3);
export_constant(SC_COLORS_OF_HYUN_ROK_4);
export_constant(SC_COLORS_OF_HYUN_ROK_5);
export_constant(SC_COLORS_OF_HYUN_ROK_6);
export_constant(SC_COLORS_OF_HYUN_ROK_BUFF);
export_constant(SC_TEMPORARY_COMMUNION);
export_constant(SC_BLESSING_OF_M_CREATURES);
export_constant(SC_BLESSING_OF_M_C_DEBUFF);
/* status icons */ /* status icons */
export_deprecated_constant2("SI_BLANK",-1); export_deprecated_constant2("SI_BLANK",-1);
@ -3216,7 +3203,7 @@
export_constant(EFST_SPELLFIST); export_constant(EFST_SPELLFIST);
export_constant(EFST_NETHERWORLD); export_constant(EFST_NETHERWORLD);
export_constant(EFST_SIREN); export_constant(EFST_SIREN);
export_constant(EFST_HANDICAPSTATE_DEEP_SLEEP); export_constant(EFST_DEEP_SLEEP);
export_constant(EFST_SIRCLEOFNATURE); export_constant(EFST_SIRCLEOFNATURE);
export_constant(EFST_COLD); export_constant(EFST_COLD);
export_constant(EFST_GLOOMYDAY); export_constant(EFST_GLOOMYDAY);
@ -3279,7 +3266,7 @@
export_constant(EFST_DROCERA_HERB_STEAMED); export_constant(EFST_DROCERA_HERB_STEAMED);
export_constant(EFST_PUTTI_TAILS_NOODLES); export_constant(EFST_PUTTI_TAILS_NOODLES);
export_constant(EFST_BANANA_BOMB); export_constant(EFST_BANANA_BOMB);
export_constant(XXX_EFST_SM_ELEMENTAL); export_constant(EFST_SUMMON_AGNI);
export_constant(EFST_SPELLBOOK4); export_constant(EFST_SPELLBOOK4);
export_constant(EFST_SPELLBOOK5); export_constant(EFST_SPELLBOOK5);
export_constant(EFST_SPELLBOOK6); export_constant(EFST_SPELLBOOK6);
@ -3413,8 +3400,8 @@
export_constant(EFST_SET_NUM_MDEF); export_constant(EFST_SET_NUM_MDEF);
export_constant(EFST_SET_PER_DEF); export_constant(EFST_SET_PER_DEF);
export_constant(EFST_SET_PER_MDEF); export_constant(EFST_SET_PER_MDEF);
export_constant(EFST_PARTYBOOKING_SEARCH_DELAY); export_constant(EFST_PARTYBOOKING_SEARCH_DEALY);
export_constant(EFST_PARTYBOOKING_REGISTER_DELAY); export_constant(EFST_PARTYBOOKING_REGISTER_DEALY);
export_constant(EFST_PERIOD_TIME_CHECK_DETECT_SKILL); export_constant(EFST_PERIOD_TIME_CHECK_DETECT_SKILL);
export_constant(EFST_KO_JYUMONJIKIRI); export_constant(EFST_KO_JYUMONJIKIRI);
export_constant(EFST_MEIKYOUSISUI); export_constant(EFST_MEIKYOUSISUI);
@ -3455,7 +3442,7 @@
export_constant(EFST_GLASTHEIM_STATE); export_constant(EFST_GLASTHEIM_STATE);
export_constant(EFST_GLASTHEIM_ITEMDEF); export_constant(EFST_GLASTHEIM_ITEMDEF);
export_constant(EFST_GLASTHEIM_HPSP); export_constant(EFST_GLASTHEIM_HPSP);
export_constant(EFST_FOLLOWER_NPC_SKILL_POSTDELAY); export_constant(EFST_HOMUN_SKILL_POSTDELAY);
export_constant(EFST_ALMIGHTY); export_constant(EFST_ALMIGHTY);
export_constant(EFST_GVG_GIANT); export_constant(EFST_GVG_GIANT);
export_constant(EFST_GVG_GOLEM); export_constant(EFST_GVG_GOLEM);
@ -3481,7 +3468,7 @@
export_constant(EFST_QUEST_BUFF3); export_constant(EFST_QUEST_BUFF3);
export_constant(EFST_REUSE_LIMIT_RECALL); export_constant(EFST_REUSE_LIMIT_RECALL);
export_constant(EFST_SAVEPOSITION); export_constant(EFST_SAVEPOSITION);
export_constant(EFST_NPC_ICEEXPLO); export_constant(EFST_HANDICAPSTATE_ICEEXPLO);
export_constant(EFST_FENRIR_CARD); export_constant(EFST_FENRIR_CARD);
export_constant(EFST_REUSE_LIMIT_ASPD_POTION); export_constant(EFST_REUSE_LIMIT_ASPD_POTION);
export_constant(EFST_MAXPAIN); export_constant(EFST_MAXPAIN);
@ -3585,7 +3572,7 @@
export_constant(EFST_GC_POISONINGWEAPON_OPERATOR); export_constant(EFST_GC_POISONINGWEAPON_OPERATOR);
export_constant(EFST_WS_WEAPONREFINE_OPERATOR); export_constant(EFST_WS_WEAPONREFINE_OPERATOR);
export_constant(EFST_BS_REPAIRWEAPON_OPERATOR); export_constant(EFST_BS_REPAIRWEAPON_OPERATOR);
export_constant(EFST_UNREADMAIL_CHECK); export_constant(EFST_GET_MAILBOX);
export_constant(EFST_JUMPINGCLAN); export_constant(EFST_JUMPINGCLAN);
export_constant(EFST_JP_OTP); export_constant(EFST_JP_OTP);
export_constant(EFST_HANDICAPTOLERANCE_LEVELGAP); export_constant(EFST_HANDICAPTOLERANCE_LEVELGAP);
@ -3904,13 +3891,13 @@
export_constant(EFST_PERIOD_USE_WORLDMAP); export_constant(EFST_PERIOD_USE_WORLDMAP);
export_constant(EFST_MISTY_FROST); export_constant(EFST_MISTY_FROST);
export_constant(EFST_MAGIC_POISON); export_constant(EFST_MAGIC_POISON);
export_constant(EFST_KAUTE); export_constant(EFST_MOVE_AGIT);
export_constant(EFST_REUSE_JPNONLY_LIMIT_I); export_constant(EFST_REUSE_JPNONLY_LIMIT_I);
export_constant(EFST_REUSE_JPNONLY_LIMIT_J); export_constant(EFST_REUSE_JPNONLY_LIMIT_J);
export_constant(EFST_REUSE_JPNONLY_LIMIT_K); export_constant(EFST_REUSE_JPNONLY_LIMIT_K);
export_constant(EFST_JPNONLY_TACTICS); export_constant(EFST_JPNONLY_TACTICS);
export_constant(EFST_PRISON); export_constant(EFST_PRISON);
export_constant(EFST_MADOGEAR); export_constant(EFST_MADOGEAR_TYPE);
export_constant(EFST_DEADLY_DEFEASANCE); export_constant(EFST_DEADLY_DEFEASANCE);
export_constant(EFST_CLIMAX_DES_HU); export_constant(EFST_CLIMAX_DES_HU);
export_constant(EFST_CLIMAX); export_constant(EFST_CLIMAX);
@ -4185,6 +4172,44 @@
export_constant(EFST_C_RATE_PLUS); export_constant(EFST_C_RATE_PLUS);
export_constant(EFST_RESIST_PLUS); export_constant(EFST_RESIST_PLUS);
export_constant(EFST_PVP_DUN_BUFF); export_constant(EFST_PVP_DUN_BUFF);
export_constant(EFST_TARGET_MARKER);
export_constant(EFST_BLOCK_SEAL);
export_constant(EFST_FROST_STORM);
export_constant(EFST_GROGGY);
export_constant(EFST_WARM_SHIELD);
export_constant(EFST_CONTENTS_1);
export_constant(EFST_CONTENTS_2);
export_constant(EFST_CONTENTS_3);
export_constant(EFST_CONTENTS_4);
export_constant(EFST_CONTENTS_5);
export_constant(EFST_CONTENTS_6);
export_constant(EFST_CONTENTS_7);
export_constant(EFST_CONTENTS_8);
export_constant(EFST_CONTENTS_9);
export_constant(EFST_CONTENTS_10);
export_constant(EFST_CONTENTS_11);
export_constant(EFST_CONTENTS_12);
export_constant(EFST_CONTENTS_13);
export_constant(EFST_CONTENTS_14);
export_constant(EFST_CONTENTS_15);
export_constant(EFST_CONTENTS_16);
export_constant(EFST_CONTENTS_17);
export_constant(EFST_CONTENTS_18);
export_constant(EFST_CONTENTS_19);
export_constant(EFST_CONTENTS_20);
export_constant(EFST_CONTENTS_21);
export_constant(EFST_CONTENTS_22);
export_constant(EFST_CONTENTS_23);
export_constant(EFST_CONTENTS_24);
export_constant(EFST_CONTENTS_25);
export_constant(EFST_C_BUFF_1);
export_constant(EFST_C_BUFF_2);
export_constant(EFST_CHASING);
export_constant(EFST_MYSTERY_POWDER);
export_constant(EFST_FIRE_CHARM_POWER);
export_constant(EFST_WATER_CHARM_POWER);
export_constant(EFST_WIND_CHARM_POWER);
export_constant(EFST_GROUND_CHARM_POWER);
/// @APIHOOK_END /// @APIHOOK_END
/// Do not modify code above this, since it will be automatically generated by the API again /// Do not modify code above this, since it will be automatically generated by the API again
export_constant(EFST_MAX); export_constant(EFST_MAX);
@ -9161,6 +9186,11 @@
export_constant_npc(JT_4_EP21_HOWELL_S); export_constant_npc(JT_4_EP21_HOWELL_S);
export_constant_npc(JT_4_EP21_TAN_S); export_constant_npc(JT_4_EP21_TAN_S);
export_constant_npc(JT_4_M_VACATION_MARAM); export_constant_npc(JT_4_M_VACATION_MARAM);
export_constant_npc(JT_4_CLB_SS_FC);
export_constant_npc(JT_4_CLB_SS_TZ);
export_constant_npc(JT_4_CLB_SS_AJ);
export_constant_npc(JT_4_CLB_SS_LK);
export_constant_npc(JT_4_SMART_ANDRE);
export_constant_npc(JT_ROZ_MQ_XAVIER); export_constant_npc(JT_ROZ_MQ_XAVIER);
export_constant_npc(JT_ROZ_MQ_MOCLORD); export_constant_npc(JT_ROZ_MQ_MOCLORD);
export_constant_npc(JT_ROZ_MQ_SKULD); export_constant_npc(JT_ROZ_MQ_SKULD);
@ -10525,7 +10555,21 @@
export_constant(HAT_EF_C_BABY_GLOOM); export_constant(HAT_EF_C_BABY_GLOOM);
export_constant(HAT_EF_WINTERNIGHTBELLS); export_constant(HAT_EF_WINTERNIGHTBELLS);
export_constant(HAT_EF_NIGHTSKYOFRUTIE); export_constant(HAT_EF_NIGHTSKYOFRUTIE);
export_constant(FOOTPRINT_EF_BASE);
export_constant(FOOTPRINT_EF_STR_BASE);
export_constant(FOOTPRINT_EF_PURPLESTAR);
export_constant(FOOTPRINT_EF_YELLOWSTAR);
export_constant(FOOTPRINT_EF_REDSTAR);
export_constant(HAT_EF_RAINBOW_POISON_MASTER); export_constant(HAT_EF_RAINBOW_POISON_MASTER);
export_constant(HAT_EF_C_ANCIENT_RUNE);
export_constant(HAT_EF_C_DRAGON_GREEN_AURA);
export_constant(HAT_EF_C_DRAGON_RED_AURA);
export_constant(HAT_EF_C_DRAGON_YELLOW_AURA);
export_constant(HAT_EF_INTERDIMENSIONAL_RIFT);
export_constant(HAT_EF_C_CLB_SS_LL);
export_constant(HAT_EF_VACATION);
export_constant(HAT_EF_C_FH_LOSTWING);
export_constant(FOOTPRINT_EF_DOGFOOT);
/* pet catch */ /* pet catch */
export_constant(PET_CATCH_UNIVERSAL); export_constant(PET_CATCH_UNIVERSAL);
@ -11311,6 +11355,8 @@
export_constant(SCF_REMOVEONUNEQUIPARMOR); export_constant(SCF_REMOVEONUNEQUIPARMOR);
export_constant(SCF_REMOVEONHERMODE); export_constant(SCF_REMOVEONHERMODE);
export_constant(SCF_REQUIRENOWEAPON); export_constant(SCF_REQUIRENOWEAPON);
export_constant(SCF_REMOVEFROMHOMONWARP);
export_constant(SCF_REMOVEFROMHOMONMAPWARP);
/* enchantgrades */ /* enchantgrades */
export_constant(ENCHANTGRADE_NONE); export_constant(ENCHANTGRADE_NONE);

File diff suppressed because it is too large Load Diff

View File

@ -33,8 +33,8 @@ class status_change;
#define MAX_SKILL_LEVEL 13 /// Max Skill Level (for skill_db storage) #define MAX_SKILL_LEVEL 13 /// Max Skill Level (for skill_db storage)
#define MAX_MOBSKILL_LEVEL 100 /// Max monster skill level (on skill usage) #define MAX_MOBSKILL_LEVEL 100 /// Max monster skill level (on skill usage)
#define MAX_SKILL_CRIMSON_MARKER 3 /// Max Crimson Marker targets (RL_C_MARKER) #define MAX_SKILL_CRIMSON_MARKER 3 /// Max Crimson Marker targets (RL_C_MARKER)
#define SKILL_NAME_LENGTH 40 /// Max Skill Name length #define SKILL_NAME_LENGTH 31 /// Max Skill Name length
#define SKILL_DESC_LENGTH 40 /// Max Skill Desc length #define SKILL_DESC_LENGTH 31 /// Max Skill Desc length
/// Used with tracking the hitcount of Earthquake for skills that can avoid the first attack /// Used with tracking the hitcount of Earthquake for skills that can avoid the first attack
#define NPC_EARTHQUAKE_FLAG 0x800 #define NPC_EARTHQUAKE_FLAG 0x800
@ -1500,7 +1500,17 @@ enum e_skill {
NPC_CANE_OF_EVIL_EYE, NPC_CANE_OF_EVIL_EYE,
NPC_CURSE_OF_RED_CUBE, NPC_CURSE_OF_RED_CUBE,
NPC_CURSE_OF_BLUE_CUBE, NPC_CURSE_OF_BLUE_CUBE,
NPC_KILLING_AURA, // 783 NPC_KILLING_AURA,
ALL_EVENT_20TH_ANNIVERSARY,
NPC_TARGET_MARKER,
NPC_AIMED_SHOWER,
NPC_BLAZING_ERUPTION,
NPC_BLOCK_SEAL,
NPC_BLOCK_EXPLOSION,
NPC_FROST_FIELD,
NPC_LIGHTNING_JUDGEMENT,
NPC_GROGGY_ON,
NPC_RESET_EFST, //793
KN_CHARGEATK = 1001, KN_CHARGEATK = 1001,
CR_SHRINK, CR_SHRINK,
@ -2332,6 +2342,10 @@ enum e_skill {
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN, NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
SS_FUUMAKOUCHIKU_BLASTING, SS_FUUMAKOUCHIKU_BLASTING,
SS_FOUR_CHARM = 5499,
NW_WILD_SHOT,
NW_MIDNIGHT_FALLEN,
DK_DRAGONIC_BREATH = 6001, DK_DRAGONIC_BREATH = 6001,
MT_SPARK_BLASTER, MT_SPARK_BLASTER,
MT_TRIPLE_LASER, MT_TRIPLE_LASER,
@ -2339,6 +2353,21 @@ enum e_skill {
BO_EXPLOSIVE_POWDER, BO_EXPLOSIVE_POWDER,
BO_MAYHEMIC_THORNS, BO_MAYHEMIC_THORNS,
IG_RADIANT_SPEAR = 6503,
IG_IMPERIAL_CROSS,
MT_RUSH_STRIKE = 6506,
MT_POWERFUL_SWING,
MT_ENERGY_CANNONADE,
BO_MYSTERY_POWDER,
BO_DUST_EXPLOSION,
SHC_CROSS_SLASH,
ABC_HIT_AND_SLIDING,
ABC_CHASING_BREAK,
ABC_CHASING_SHOT,
TR_RHYTHMICAL_WAVE = 6521,
HLIF_HEAL = 8001, HLIF_HEAL = 8001,
HLIF_AVOID, HLIF_AVOID,
HLIF_BRAIN, HLIF_BRAIN,
@ -2796,7 +2825,6 @@ void skill_combo(struct block_list* src,struct block_list *dsrc, struct block_li
enum sc_type skill_get_sc(int16 skill_id); enum sc_type skill_get_sc(int16 skill_id);
void skill_reveal_trap_inarea(struct block_list *src, int range, int x, int y); void skill_reveal_trap_inarea(struct block_list *src, int range, int x, int y);
int skill_get_time3(struct map_data *mapdata, uint16 skill_id, uint16 skill_lv); int skill_get_time3(struct map_data *mapdata, uint16 skill_id, uint16 skill_lv);
int skill_area_sub(struct block_list *bl, va_list ap);
/// Variable name of copied skill by Plagiarism /// Variable name of copied skill by Plagiarism
#define SKILL_VAR_PLAGIARISM "CLONE_SKILL" #define SKILL_VAR_PLAGIARISM "CLONE_SKILL"

File diff suppressed because it is too large Load Diff

View File

@ -1312,22 +1312,6 @@ enum sc_type : int16 {
SC_AGIUP, SC_AGIUP,
SC_PROTECTION, SC_PROTECTION,
// Spirit Handler
SC_HOGOGONG,
SC_MARINE_FESTIVAL,
SC_SANDY_FESTIVAL,
SC_KI_SUL_RAMPAGE,
SC_COLORS_OF_HYUN_ROK_1,
SC_COLORS_OF_HYUN_ROK_2,
SC_COLORS_OF_HYUN_ROK_3,
SC_COLORS_OF_HYUN_ROK_4,
SC_COLORS_OF_HYUN_ROK_5,
SC_COLORS_OF_HYUN_ROK_6,
SC_COLORS_OF_HYUN_ROK_BUFF,
SC_TEMPORARY_COMMUNION,
SC_BLESSING_OF_M_CREATURES,
SC_BLESSING_OF_M_C_DEBUFF,
SC_MAX, //Automatically updated max, used in for's to check we are within bounds. SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
}; };
@ -1771,7 +1755,7 @@ enum efst_type : short{
EFST_SPELLFIST, EFST_SPELLFIST,
EFST_NETHERWORLD, EFST_NETHERWORLD,
EFST_SIREN, EFST_SIREN,
EFST_HANDICAPSTATE_DEEP_SLEEP, EFST_DEEP_SLEEP,
EFST_SIRCLEOFNATURE, EFST_SIRCLEOFNATURE,
EFST_COLD, EFST_COLD,
EFST_GLOOMYDAY, EFST_GLOOMYDAY,
@ -1834,7 +1818,7 @@ enum efst_type : short{
EFST_DROCERA_HERB_STEAMED, EFST_DROCERA_HERB_STEAMED,
EFST_PUTTI_TAILS_NOODLES, EFST_PUTTI_TAILS_NOODLES,
EFST_BANANA_BOMB, EFST_BANANA_BOMB,
XXX_EFST_SM_ELEMENTAL, EFST_SUMMON_AGNI,
EFST_SPELLBOOK4, EFST_SPELLBOOK4,
EFST_SPELLBOOK5, EFST_SPELLBOOK5,
EFST_SPELLBOOK6, EFST_SPELLBOOK6,
@ -1969,8 +1953,8 @@ enum efst_type : short{
EFST_SET_NUM_MDEF, EFST_SET_NUM_MDEF,
EFST_SET_PER_DEF, EFST_SET_PER_DEF,
EFST_SET_PER_MDEF, EFST_SET_PER_MDEF,
EFST_PARTYBOOKING_SEARCH_DELAY, EFST_PARTYBOOKING_SEARCH_DEALY,
EFST_PARTYBOOKING_REGISTER_DELAY, EFST_PARTYBOOKING_REGISTER_DEALY,
EFST_PERIOD_TIME_CHECK_DETECT_SKILL, EFST_PERIOD_TIME_CHECK_DETECT_SKILL,
EFST_KO_JYUMONJIKIRI, EFST_KO_JYUMONJIKIRI,
EFST_MEIKYOUSISUI, EFST_MEIKYOUSISUI,
@ -2011,7 +1995,7 @@ enum efst_type : short{
EFST_GLASTHEIM_STATE, EFST_GLASTHEIM_STATE,
EFST_GLASTHEIM_ITEMDEF, EFST_GLASTHEIM_ITEMDEF,
EFST_GLASTHEIM_HPSP, EFST_GLASTHEIM_HPSP,
EFST_FOLLOWER_NPC_SKILL_POSTDELAY, EFST_HOMUN_SKILL_POSTDELAY,
EFST_ALMIGHTY, EFST_ALMIGHTY,
EFST_GVG_GIANT, EFST_GVG_GIANT,
EFST_GVG_GOLEM, EFST_GVG_GOLEM,
@ -2037,7 +2021,7 @@ enum efst_type : short{
EFST_QUEST_BUFF3, EFST_QUEST_BUFF3,
EFST_REUSE_LIMIT_RECALL, EFST_REUSE_LIMIT_RECALL,
EFST_SAVEPOSITION, EFST_SAVEPOSITION,
EFST_NPC_ICEEXPLO, EFST_HANDICAPSTATE_ICEEXPLO,
EFST_FENRIR_CARD, EFST_FENRIR_CARD,
EFST_REUSE_LIMIT_ASPD_POTION, EFST_REUSE_LIMIT_ASPD_POTION,
EFST_MAXPAIN, EFST_MAXPAIN,
@ -2141,7 +2125,7 @@ enum efst_type : short{
EFST_GC_POISONINGWEAPON_OPERATOR, EFST_GC_POISONINGWEAPON_OPERATOR,
EFST_WS_WEAPONREFINE_OPERATOR, EFST_WS_WEAPONREFINE_OPERATOR,
EFST_BS_REPAIRWEAPON_OPERATOR, EFST_BS_REPAIRWEAPON_OPERATOR,
EFST_UNREADMAIL_CHECK, EFST_GET_MAILBOX,
EFST_JUMPINGCLAN, EFST_JUMPINGCLAN,
EFST_JP_OTP, EFST_JP_OTP,
EFST_HANDICAPTOLERANCE_LEVELGAP, EFST_HANDICAPTOLERANCE_LEVELGAP,
@ -2462,13 +2446,13 @@ enum efst_type : short{
EFST_PERIOD_USE_WORLDMAP, EFST_PERIOD_USE_WORLDMAP,
EFST_MISTY_FROST, EFST_MISTY_FROST,
EFST_MAGIC_POISON, EFST_MAGIC_POISON,
EFST_KAUTE, EFST_MOVE_AGIT,
EFST_REUSE_JPNONLY_LIMIT_I, EFST_REUSE_JPNONLY_LIMIT_I,
EFST_REUSE_JPNONLY_LIMIT_J, EFST_REUSE_JPNONLY_LIMIT_J,
EFST_REUSE_JPNONLY_LIMIT_K, EFST_REUSE_JPNONLY_LIMIT_K,
EFST_JPNONLY_TACTICS, EFST_JPNONLY_TACTICS,
EFST_PRISON, EFST_PRISON,
EFST_MADOGEAR, EFST_MADOGEAR_TYPE,
EFST_DEADLY_DEFEASANCE, EFST_DEADLY_DEFEASANCE,
EFST_CLIMAX_DES_HU, EFST_CLIMAX_DES_HU,
EFST_CLIMAX, EFST_CLIMAX,
@ -2752,6 +2736,50 @@ enum efst_type : short{
EFST_C_RATE_PLUS, EFST_C_RATE_PLUS,
EFST_RESIST_PLUS, EFST_RESIST_PLUS,
EFST_PVP_DUN_BUFF, EFST_PVP_DUN_BUFF,
EFST_TARGET_MARKER = 1453,
EFST_BLOCK_SEAL,
EFST_FROST_STORM,
EFST_GROGGY,
EFST_WARM_SHIELD, //1457
EFST_CONTENTS_1 = 1459,
EFST_CONTENTS_2,
EFST_CONTENTS_3,
EFST_CONTENTS_4,
EFST_CONTENTS_5,
EFST_CONTENTS_6,
EFST_CONTENTS_7,
EFST_CONTENTS_8,
EFST_CONTENTS_9,
EFST_CONTENTS_10,
EFST_CONTENTS_11,
EFST_CONTENTS_12,
EFST_CONTENTS_13,
EFST_CONTENTS_14,
EFST_CONTENTS_15,
EFST_CONTENTS_16,
EFST_CONTENTS_17,
EFST_CONTENTS_18,
EFST_CONTENTS_19,
EFST_CONTENTS_20,
EFST_CONTENTS_21,
EFST_CONTENTS_22,
EFST_CONTENTS_23,
EFST_CONTENTS_24,
EFST_CONTENTS_25, //1483
EFST_C_BUFF_1 = 1509,
EFST_C_BUFF_2,
EFST_CHASING = 1560,
EFST_MYSTERY_POWDER = 1665,
EFST_FIRE_CHARM_POWER = 1667,
EFST_WATER_CHARM_POWER,
EFST_WIND_CHARM_POWER,
EFST_GROUND_CHARM_POWER,
/// @APIHOOK_END /// @APIHOOK_END
/// Do not modify code above this, since it will be automatically generated by the API again /// Do not modify code above this, since it will be automatically generated by the API again
EFST_MAX, EFST_MAX,
@ -3074,6 +3102,8 @@ enum e_status_change_flag : uint16 {
SCF_REMOVEONUNEQUIPARMOR, SCF_REMOVEONUNEQUIPARMOR,
SCF_REMOVEONHERMODE, SCF_REMOVEONHERMODE,
SCF_REQUIRENOWEAPON, SCF_REQUIRENOWEAPON,
SCF_REMOVEFROMHOMONWARP,
SCF_REMOVEFROMHOMONMAPWARP,
SCF_MAX SCF_MAX
}; };
@ -3369,68 +3399,68 @@ static int status_heal( struct block_list *bl,int64 hhp,int64 hsp, int flag ){
int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp, unsigned char per_ap = 0); int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp, unsigned char per_ap = 0);
struct regen_data *status_get_regen_data(struct block_list *bl); struct regen_data *status_get_regen_data(struct block_list *bl);
struct status_data *status_get_status_data(struct block_list *bl); status_data* status_get_status_data(block_list& bl);
struct status_data *status_get_base_status(struct block_list *bl); struct status_data *status_get_base_status(struct block_list *bl);
const char * status_get_name(struct block_list *bl); const char * status_get_name(struct block_list *bl);
int status_get_class(struct block_list *bl); int status_get_class(struct block_list *bl);
int status_get_lv(struct block_list *bl); int status_get_lv(struct block_list *bl);
#define status_get_range(bl) status_get_status_data(bl)->rhw.range #define status_get_range(bl) status_get_status_data(*bl)->rhw.range
#define status_get_hp(bl) status_get_status_data(bl)->hp #define status_get_hp(bl) status_get_status_data(*bl)->hp
#define status_get_max_hp(bl) status_get_status_data(bl)->max_hp #define status_get_max_hp(bl) status_get_status_data(*bl)->max_hp
#define status_get_sp(bl) status_get_status_data(bl)->sp #define status_get_sp(bl) status_get_status_data(*bl)->sp
#define status_get_max_sp(bl) status_get_status_data(bl)->max_sp #define status_get_max_sp(bl) status_get_status_data(*bl)->max_sp
#define status_get_ap(bl) status_get_status_data(bl)->ap #define status_get_ap(bl) status_get_status_data(*bl)->ap
#define status_get_max_ap(bl) status_get_status_data(bl)->max_ap #define status_get_max_ap(bl) status_get_status_data(*bl)->max_ap
#define status_get_str(bl) status_get_status_data(bl)->str #define status_get_str(bl) status_get_status_data(*bl)->str
#define status_get_agi(bl) status_get_status_data(bl)->agi #define status_get_agi(bl) status_get_status_data(*bl)->agi
#define status_get_vit(bl) status_get_status_data(bl)->vit #define status_get_vit(bl) status_get_status_data(*bl)->vit
#define status_get_int(bl) status_get_status_data(bl)->int_ #define status_get_int(bl) status_get_status_data(*bl)->int_
#define status_get_dex(bl) status_get_status_data(bl)->dex #define status_get_dex(bl) status_get_status_data(*bl)->dex
#define status_get_luk(bl) status_get_status_data(bl)->luk #define status_get_luk(bl) status_get_status_data(*bl)->luk
#define status_get_pow(bl) status_get_status_data(bl)->pow #define status_get_pow(bl) status_get_status_data(*bl)->pow
#define status_get_sta(bl) status_get_status_data(bl)->sta #define status_get_sta(bl) status_get_status_data(*bl)->sta
#define status_get_wis(bl) status_get_status_data(bl)->wis #define status_get_wis(bl) status_get_status_data(*bl)->wis
#define status_get_spl(bl) status_get_status_data(bl)->spl #define status_get_spl(bl) status_get_status_data(*bl)->spl
#define status_get_con(bl) status_get_status_data(bl)->con #define status_get_con(bl) status_get_status_data(*bl)->con
#define status_get_crt(bl) status_get_status_data(bl)->crt #define status_get_crt(bl) status_get_status_data(*bl)->crt
#define status_get_hit(bl) status_get_status_data(bl)->hit #define status_get_hit(bl) status_get_status_data(*bl)->hit
#define status_get_flee(bl) status_get_status_data(bl)->flee #define status_get_flee(bl) status_get_status_data(*bl)->flee
defType status_get_def(struct block_list *bl); defType status_get_def(struct block_list *bl);
#define status_get_mdef(bl) status_get_status_data(bl)->mdef #define status_get_mdef(bl) status_get_status_data(*bl)->mdef
#define status_get_flee2(bl) status_get_status_data(bl)->flee2 #define status_get_flee2(bl) status_get_status_data(*bl)->flee2
#define status_get_def2(bl) status_get_status_data(bl)->def2 #define status_get_def2(bl) status_get_status_data(*bl)->def2
#define status_get_mdef2(bl) status_get_status_data(bl)->mdef2 #define status_get_mdef2(bl) status_get_status_data(*bl)->mdef2
#define status_get_critical(bl) status_get_status_data(bl)->cri #define status_get_critical(bl) status_get_status_data(*bl)->cri
#define status_get_batk(bl) status_get_status_data(bl)->batk #define status_get_batk(bl) status_get_status_data(*bl)->batk
#define status_get_watk(bl) status_get_status_data(bl)->rhw.atk #define status_get_watk(bl) status_get_status_data(*bl)->rhw.atk
#define status_get_watk2(bl) status_get_status_data(bl)->rhw.atk2 #define status_get_watk2(bl) status_get_status_data(*bl)->rhw.atk2
#define status_get_matk_max(bl) status_get_status_data(bl)->matk_max #define status_get_matk_max(bl) status_get_status_data(*bl)->matk_max
#define status_get_matk_min(bl) status_get_status_data(bl)->matk_min #define status_get_matk_min(bl) status_get_status_data(*bl)->matk_min
#define status_get_lwatk(bl) status_get_status_data(bl)->lhw.atk #define status_get_lwatk(bl) status_get_status_data(*bl)->lhw.atk
#define status_get_lwatk2(bl) status_get_status_data(bl)->lhw.atk2 #define status_get_lwatk2(bl) status_get_status_data(*bl)->lhw.atk2
unsigned short status_get_speed(struct block_list *bl); unsigned short status_get_speed(struct block_list *bl);
#define status_get_adelay(bl) status_get_status_data(bl)->adelay #define status_get_adelay(bl) status_get_status_data(*bl)->adelay
#define status_get_amotion(bl) status_get_status_data(bl)->amotion #define status_get_amotion(bl) status_get_status_data(*bl)->amotion
#define status_get_clientamotion(bl) status_get_status_data(bl)->clientamotion #define status_get_clientamotion(bl) status_get_status_data(*bl)->clientamotion
#define status_get_dmotion(bl) status_get_status_data(bl)->dmotion #define status_get_dmotion(bl) status_get_status_data(*bl)->dmotion
#define status_get_patk(bl) status_get_status_data(bl)->patk #define status_get_patk(bl) status_get_status_data(*bl)->patk
#define status_get_smatk(bl) status_get_status_data(bl)->smatk #define status_get_smatk(bl) status_get_status_data(*bl)->smatk
#define status_get_res(bl) status_get_status_data(bl)->res #define status_get_res(bl) status_get_status_data(*bl)->res
#define status_get_mres(bl) status_get_status_data(bl)->mres #define status_get_mres(bl) status_get_status_data(*bl)->mres
#define status_get_hplus(bl) status_get_status_data(bl)->hplus #define status_get_hplus(bl) status_get_status_data(*bl)->hplus
#define status_get_crate(bl) status_get_status_data(bl)->crate #define status_get_crate(bl) status_get_status_data(*bl)->crate
#define status_get_element(bl) status_get_status_data(bl)->def_ele #define status_get_element(bl) status_get_status_data(*bl)->def_ele
#define status_get_element_level(bl) status_get_status_data(bl)->ele_lv #define status_get_element_level(bl) status_get_status_data(*bl)->ele_lv
unsigned char status_calc_attack_element(struct block_list *bl, status_change *sc, int element); unsigned char status_calc_attack_element(struct block_list *bl, status_change *sc, int element);
#define status_get_attack_sc_element(bl, sc) status_calc_attack_element(bl, sc, 0) #define status_get_attack_sc_element(bl, sc) status_calc_attack_element(bl, sc, 0)
#define status_get_attack_element(bl) status_get_status_data(bl)->rhw.ele #define status_get_attack_element(bl) status_get_status_data(*bl)->rhw.ele
#define status_get_attack_lelement(bl) status_get_status_data(bl)->lhw.ele #define status_get_attack_lelement(bl) status_get_status_data(*bl)->lhw.ele
#define status_get_race(bl) status_get_status_data(bl)->race #define status_get_race(bl) status_get_status_data(*bl)->race
#define status_get_class_(bl) status_get_status_data(bl)->class_ #define status_get_class_(bl) status_get_status_data(*bl)->class_
#define status_get_size(bl) status_get_status_data(bl)->size #define status_get_size(bl) status_get_status_data(*bl)->size
#define status_get_mode(bl) status_get_status_data(bl)->mode #define status_get_mode(bl) status_get_status_data(*bl)->mode
#define status_has_mode(status,md) (((status)->mode&(md)) == (md)) #define status_has_mode(status,md) (((status)->mode&(md)) == (md))
#define status_bl_has_mode(bl,md) status_has_mode(status_get_status_data((bl)),(md)) #define status_bl_has_mode(bl,md) status_has_mode(status_get_status_data(*(bl)),(md))
#define status_get_homstr(bl) (status->str + ((TBL_HOM*)bl)->homunculus.str_value) #define status_get_homstr(bl) (status->str + ((TBL_HOM*)bl)->homunculus.str_value)
#define status_get_homagi(bl) (status->agi + ((TBL_HOM*)bl)->homunculus.agi_value) #define status_get_homagi(bl) (status->agi + ((TBL_HOM*)bl)->homunculus.agi_value)
@ -3449,7 +3479,7 @@ void status_set_viewdata(struct block_list *bl, int class_);
void status_change_init(struct block_list *bl); void status_change_init(struct block_list *bl);
status_change *status_get_sc(struct block_list *bl); status_change *status_get_sc(struct block_list *bl);
int status_isdead(struct block_list *bl); bool status_isdead(block_list &bl);
int status_isimmune(struct block_list *bl); int status_isimmune(struct block_list *bl);
t_tick status_get_sc_def(struct block_list *src,struct block_list *bl, enum sc_type type, int rate, t_tick tick, unsigned char flag); t_tick status_get_sc_def(struct block_list *src,struct block_list *bl, enum sc_type type, int rate, t_tick tick, unsigned char flag);

View File

@ -38,54 +38,58 @@ void trade_traderequest(map_session_data *sd, map_session_data *target_sd)
} }
if (target_sd == nullptr || sd == target_sd) { if (target_sd == nullptr || sd == target_sd) {
clif_tradestart(sd, 1); // character does not exist clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST);
return; return;
} }
if (target_sd->npc_id) { // Trade fails if you are using an NPC. if (target_sd->npc_id) { // Trade fails if you are using an NPC.
clif_tradestart(sd, 2); clif_traderesponse(*sd, TRADE_ACK_FAILED);
return; return;
} }
if (!battle_config.invite_request_check) { if (!battle_config.invite_request_check) {
if (target_sd->guild_invite > 0 || target_sd->party_invite > 0 || target_sd->adopt_invite) { if (target_sd->guild_invite > 0 || target_sd->party_invite > 0 || target_sd->adopt_invite) {
clif_tradestart(sd, 2); clif_traderesponse(*sd, TRADE_ACK_FAILED);
return; return;
} }
} }
if ( sd->trade_partner != 0 ) { // If a character tries to trade to another one then cancel the previous one if ( sd->trade_partner.id != 0 ) { // If a character tries to trade to another one then cancel the previous one
map_session_data *previous_sd = map_id2sd(sd->trade_partner); map_session_data *previous_sd = map_id2sd(sd->trade_partner.id);
if( previous_sd != nullptr ){ if( previous_sd != nullptr ){
previous_sd->trade_partner = 0; previous_sd->trade_partner = {0,0};
clif_tradecancelled( *previous_sd ); clif_tradecancelled( *previous_sd );
} // Once cancelled then continue to the new one. } // Once cancelled then continue to the new one.
sd->trade_partner = 0; sd->trade_partner = {0,0};
clif_tradecancelled( *sd ); clif_tradecancelled( *sd );
} }
if (target_sd->trade_partner != 0) { if (target_sd->trade_partner.id != 0) {
clif_tradestart(sd, 2); // person is in another trade clif_traderesponse(*sd, TRADE_ACK_FAILED); // person is in another trade
return; return;
} }
if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) { // check if both GMs are allowed to trade if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) { // check if both GMs are allowed to trade
clif_displaymessage(sd->fd, msg_txt(sd,246)); clif_displaymessage(sd->fd, msg_txt(sd,246));
clif_tradestart(sd, 2); // GM is not allowed to trade clif_traderesponse(*sd, TRADE_ACK_FAILED); // GM is not allowed to trade
return; return;
} }
// Players can not request trade from far away, unless they are allowed to use @trade. // Players can not request trade from far away, unless they are allowed to use @trade.
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) && if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
(sd->bl.m != target_sd->bl.m || !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE))) { (sd->bl.m != target_sd->bl.m || !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE))) {
clif_tradestart(sd, 0); // too far clif_traderesponse(*sd, TRADE_ACK_TOOFAR);
return ; return ;
} }
target_sd->trade_partner = sd->status.account_id; target_sd->trade_partner.id = sd->status.account_id;
sd->trade_partner = target_sd->status.account_id; target_sd->trade_partner.lv = sd->status.base_level;
clif_traderequest(target_sd, sd->status.name);
sd->trade_partner.id = target_sd->status.account_id;
sd->trade_partner.lv = target_sd->status.base_level;
clif_traderequest(*target_sd, sd->status.name);
} }
@ -107,28 +111,28 @@ void trade_tradeack(map_session_data *sd, int type)
nullpo_retv(sd); nullpo_retv(sd);
if (sd->state.trading || !sd->trade_partner) if (sd->state.trading || !sd->trade_partner.id)
return; // Already trading or no partner set. return; // Already trading or no partner set.
if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) { if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) {
clif_tradestart(sd, 1); // Character does not exist clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST);
sd->trade_partner=0; sd->trade_partner = {0,0};
return; return;
} }
if (tsd->state.trading || tsd->trade_partner != sd->bl.id) { if (tsd->state.trading || tsd->trade_partner.id != sd->bl.id) {
clif_tradestart(sd, 2); clif_traderesponse(*sd, TRADE_ACK_FAILED);
sd->trade_partner=0; sd->trade_partner = {0,0};
return; // Already trading or wrong partner. return; // Already trading or wrong partner.
} }
if (type == 4) { // Cancel if (type == 4) { // Cancel
clif_tradestart(tsd, type); clif_traderesponse(*tsd, TRADE_ACK_CANCEL);
clif_tradestart(sd, type); clif_traderesponse(*sd, TRADE_ACK_CANCEL);
sd->state.deal_locked = 0; sd->state.deal_locked = 0;
sd->trade_partner = 0; sd->trade_partner = {0,0};
tsd->state.deal_locked = 0; tsd->state.deal_locked = 0;
tsd->trade_partner = 0; tsd->trade_partner = {0,0};
return; return;
} }
@ -139,21 +143,21 @@ void trade_tradeack(map_session_data *sd, int type)
// Check here as well since the original character could had warped. // Check here as well since the original character could had warped.
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) && if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
(sd->bl.m != tsd->bl.m || !check_distance_bl(&sd->bl, &tsd->bl, TRADE_DISTANCE))) { (sd->bl.m != tsd->bl.m || !check_distance_bl(&sd->bl, &tsd->bl, TRADE_DISTANCE))) {
clif_tradestart(sd, 0); // too far clif_traderesponse(*sd, TRADE_ACK_TOOFAR);
sd->trade_partner=0; sd->trade_partner = {0,0};
tsd->trade_partner = 0; tsd->trade_partner = {0,0};
return; return;
} }
// Check if you can start trade. // Check if you can start trade.
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag || if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag ||
tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag) { // Fail tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag) { // Fail
clif_tradestart(sd, 2); clif_traderesponse(*sd, TRADE_ACK_FAILED);
clif_tradestart(tsd, 2); clif_traderesponse(*tsd, TRADE_ACK_FAILED);
sd->state.deal_locked = 0; sd->state.deal_locked = 0;
sd->trade_partner = 0; sd->trade_partner = {0,0};
tsd->state.deal_locked = 0; tsd->state.deal_locked = 0;
tsd->trade_partner = 0; tsd->trade_partner = {0,0};
return; return;
} }
@ -162,8 +166,8 @@ void trade_tradeack(map_session_data *sd, int type)
tsd->state.trading = 1; tsd->state.trading = 1;
memset(&sd->deal, 0, sizeof(sd->deal)); memset(&sd->deal, 0, sizeof(sd->deal));
memset(&tsd->deal, 0, sizeof(tsd->deal)); memset(&tsd->deal, 0, sizeof(tsd->deal));
clif_tradestart(tsd, type); clif_traderesponse(*tsd, static_cast<e_ack_trade_response>( type ));
clif_tradestart(sd, type); clif_traderesponse(*sd, static_cast<e_ack_trade_response>( type ));
} }
/** /**
@ -356,7 +360,7 @@ void trade_tradeadditem(map_session_data *sd, short index, short amount)
if( !sd->state.trading || sd->state.deal_locked > 0 ) if( !sd->state.trading || sd->state.deal_locked > 0 )
return; // Can't add stuff. return; // Can't add stuff.
if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) { if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) {
trade_tradecancel(sd); trade_tradecancel(sd);
return; return;
} }
@ -453,7 +457,7 @@ void trade_tradeaddzeny(map_session_data* sd, int amount)
if( !sd->state.trading || sd->state.deal_locked > 0 ) if( !sd->state.trading || sd->state.deal_locked > 0 )
return; //Can't add stuff. return; //Can't add stuff.
if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) { if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) {
trade_tradecancel(sd); trade_tradecancel(sd);
return; return;
} }
@ -478,7 +482,7 @@ void trade_tradeok(map_session_data *sd)
if(sd->state.deal_locked || !sd->state.trading) if(sd->state.deal_locked || !sd->state.trading)
return; return;
if ((target_sd = map_id2sd(sd->trade_partner)) == nullptr) { if ((target_sd = map_id2sd(sd->trade_partner.id)) == nullptr) {
trade_tradecancel(sd); trade_tradecancel(sd);
return; return;
} }
@ -500,15 +504,15 @@ void trade_tradecancel(map_session_data *sd)
nullpo_retv(sd); nullpo_retv(sd);
target_sd = map_id2sd(sd->trade_partner); target_sd = map_id2sd(sd->trade_partner.id);
sd->state.isBoundTrading = 0; sd->state.isBoundTrading = 0;
if(!sd->state.trading) { // Not trade accepted if(!sd->state.trading) { // Not trade accepted
if( target_sd != nullptr ) { if( target_sd != nullptr ) {
target_sd->trade_partner = 0; target_sd->trade_partner = {0,0};
clif_tradecancelled( *target_sd ); clif_tradecancelled( *target_sd );
} }
sd->trade_partner = 0; sd->trade_partner = {0,0};
clif_tradecancelled( *sd ); clif_tradecancelled( *sd );
return; return;
} }
@ -529,7 +533,7 @@ void trade_tradecancel(map_session_data *sd)
sd->state.deal_locked = 0; sd->state.deal_locked = 0;
sd->state.trading = 0; sd->state.trading = 0;
sd->trade_partner = 0; sd->trade_partner = {0,0};
clif_tradecancelled( *sd ); clif_tradecancelled( *sd );
if (!target_sd) if (!target_sd)
@ -549,7 +553,7 @@ void trade_tradecancel(map_session_data *sd)
} }
target_sd->state.deal_locked = 0; target_sd->state.deal_locked = 0;
target_sd->trade_partner = 0; target_sd->trade_partner = {0,0};
target_sd->state.trading = 0; target_sd->state.trading = 0;
clif_tradecancelled( *target_sd ); clif_tradecancelled( *target_sd );
} }
@ -569,7 +573,7 @@ void trade_tradecommit(map_session_data *sd)
if (!sd->state.trading || !sd->state.deal_locked) //Locked should be 1 (pressed ok) before you can press trade. if (!sd->state.trading || !sd->state.deal_locked) //Locked should be 1 (pressed ok) before you can press trade.
return; return;
if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) { if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) {
trade_tradecancel(sd); trade_tradecancel(sd);
return; return;
} }
@ -642,12 +646,12 @@ void trade_tradecommit(map_session_data *sd)
} }
sd->state.deal_locked = 0; sd->state.deal_locked = 0;
sd->trade_partner = 0; sd->trade_partner = {0,0};
sd->state.trading = 0; sd->state.trading = 0;
sd->state.isBoundTrading = 0; sd->state.isBoundTrading = 0;
tsd->state.deal_locked = 0; tsd->state.deal_locked = 0;
tsd->trade_partner = 0; tsd->trade_partner = {0,0};
tsd->state.trading = 0; tsd->state.trading = 0;
tsd->state.isBoundTrading = 0; tsd->state.isBoundTrading = 0;

View File

@ -4,8 +4,19 @@
#ifndef TRADE_HPP #ifndef TRADE_HPP
#define TRADE_HPP #define TRADE_HPP
#include <common/cbasetypes.hpp>
class map_session_data; class map_session_data;
enum e_ack_trade_response : uint8 {
TRADE_ACK_TOOFAR = 0,
TRADE_ACK_CHARNOTEXIST,
TRADE_ACK_FAILED,
TRADE_ACK_ACCEPT,
TRADE_ACK_CANCEL,
TRADE_ACK_BUSY
};
void trade_traderequest(map_session_data *sd, map_session_data *target_sd); void trade_traderequest(map_session_data *sd, map_session_data *target_sd);
void trade_tradeack(map_session_data *sd,int type); void trade_tradeack(map_session_data *sd,int type);
void trade_tradeadditem(map_session_data *sd,short index,short amount); void trade_tradeadditem(map_session_data *sd,short index,short amount);

View File

@ -507,7 +507,7 @@ static TIMER_FUNC(unit_walktoxy_timer)
ud->state.walk_script = false; ud->state.walk_script = false;
// Check if the unit was killed // Check if the unit was killed
if( status_isdead(bl) ){ if( status_isdead(*bl) ){
struct mob_data* md = BL_CAST(BL_MOB, bl); struct mob_data* md = BL_CAST(BL_MOB, bl);
if( md && !md->spawn ){ if( md && !md->spawn ){
@ -1132,7 +1132,7 @@ bool unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, boo
if( flag ) { if( flag ) {
unit_movepos(pbl,sd->bl.x,sd->bl.y, 0, 0); unit_movepos(pbl,sd->bl.x,sd->bl.y, 0, 0);
clif_slide(pbl,pbl->x,pbl->y); clif_slide(*pbl,pbl->x,pbl->y);
} }
} }
} }
@ -1166,7 +1166,7 @@ bool unit_setdir(block_list *bl, uint8 dir, bool send_update)
} }
if (send_update) if (send_update)
clif_changed_dir(bl, AREA); clif_changed_dir(*bl, AREA);
return true; return true;
} }
@ -1639,9 +1639,9 @@ TIMER_FUNC(unit_resume_running){
TBL_PC *sd = map_id2sd(id); TBL_PC *sd = map_id2sd(id);
if (sd && pc_isridingwug(sd)) if (sd && pc_isridingwug(sd))
clif_skill_nodamage(ud->bl,ud->bl,RA_WUGDASH,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_WUGDASH,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0)); clif_skill_nodamage(ud->bl,*ud->bl,RA_WUGDASH,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_WUGDASH,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
else else
clif_skill_nodamage(ud->bl,ud->bl,TK_RUN,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_RUN,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0)); clif_skill_nodamage(ud->bl,*ud->bl,TK_RUN,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_RUN,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
if (sd) if (sd)
clif_walkok(*sd); clif_walkok(*sd);
@ -1668,7 +1668,7 @@ int unit_set_walkdelay(struct block_list *bl, t_tick tick, t_tick delay, int typ
if (type) { if (type) {
//Bosses can ignore skill induced walkdelay (but not damage induced) //Bosses can ignore skill induced walkdelay (but not damage induced)
if(bl->type == BL_MOB && status_has_mode(status_get_status_data(bl),MD_STATUSIMMUNE)) if(bl->type == BL_MOB && status_has_mode(status_get_status_data(*bl),MD_STATUSIMMUNE))
return 0; return 0;
//Make sure walk delay is not decreased //Make sure walk delay is not decreased
if (DIFF_TICK(ud->canmove_tick, tick+delay) > 0) if (DIFF_TICK(ud->canmove_tick, tick+delay) > 0)
@ -1724,7 +1724,6 @@ int unit_set_walkdelay(struct block_list *bl, t_tick tick, t_tick delay, int typ
int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, uint16 skill_lv, int casttime, int castcancel, bool ignore_range) int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, uint16 skill_lv, int casttime, int castcancel, bool ignore_range)
{ {
struct unit_data *ud; struct unit_data *ud;
struct status_data *tstatus;
status_change *sc; status_change *sc;
map_session_data *sd = nullptr; map_session_data *sd = nullptr;
struct block_list * target = nullptr; struct block_list * target = nullptr;
@ -1733,7 +1732,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
nullpo_ret(src); nullpo_ret(src);
if(status_isdead(src)) if(status_isdead(*src))
return 0; // Do not continue source is dead return 0; // Do not continue source is dead
sd = BL_CAST(BL_PC, src); sd = BL_CAST(BL_PC, src);
@ -1873,7 +1872,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
return 0; return 0;
} }
tstatus = status_get_status_data(target); status_data* tstatus = status_get_status_data(*target);
// Record the status of the previous skill) // Record the status of the previous skill)
if(sd) { if(sd) {
@ -2018,7 +2017,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
case ALL_RESURRECTION: case ALL_RESURRECTION:
if(battle_check_undead(tstatus->race,tstatus->def_ele)) if(battle_check_undead(tstatus->race,tstatus->def_ele))
combo = 1; combo = 1;
else if (!status_isdead(target)) else if (!status_isdead(*target))
return 0; // Can't cast on non-dead characters. return 0; // Can't cast on non-dead characters.
break; break;
case MO_FINGEROFFENSIVE: case MO_FINGEROFFENSIVE:
@ -2251,7 +2250,7 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
if (!src->prev) if (!src->prev)
return 0; // Not on the map return 0; // Not on the map
if(status_isdead(src)) if(status_isdead(*src))
return 0; return 0;
sd = BL_CAST(BL_PC, src); sd = BL_CAST(BL_PC, src);
@ -2539,7 +2538,7 @@ int unit_attack(struct block_list *src,int target_id,int continuous)
nullpo_ret(ud = unit_bl2ud(src)); nullpo_ret(ud = unit_bl2ud(src));
target = map_id2bl(target_id); target = map_id2bl(target_id);
if( target == nullptr || status_isdead(target) ) { if( target == nullptr || status_isdead(*target) ) {
unit_unattackable(src); unit_unattackable(src);
return 1; return 1;
} }
@ -2797,7 +2796,6 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
{ {
struct block_list *target; struct block_list *target;
struct unit_data *ud; struct unit_data *ud;
struct status_data *sstatus;
map_session_data *sd = nullptr; map_session_data *sd = nullptr;
struct mob_data *md = nullptr; struct mob_data *md = nullptr;
int range; int range;
@ -2818,7 +2816,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
if( src == nullptr || src->prev == nullptr || target==nullptr || target->prev == nullptr ) if( src == nullptr || src->prev == nullptr || target==nullptr || target->prev == nullptr )
return 0; return 0;
if( status_isdead(src) || status_isdead(target) || if( status_isdead(*src) || status_isdead(*target) ||
battle_check_target(src,target,BCT_ENEMY) <= 0 || !status_check_skilluse(src, target, 0, 0) battle_check_target(src,target,BCT_ENEMY) <= 0 || !status_check_skilluse(src, target, 0, 0)
#ifdef OFFICIAL_WALKPATH #ifdef OFFICIAL_WALKPATH
|| !path_search_long(nullptr, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL) || !path_search_long(nullptr, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL)
@ -2856,7 +2854,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
return 1; return 1;
} }
sstatus = status_get_status_data(src); status_data* sstatus = status_get_status_data(*src);
range = sstatus->rhw.range; range = sstatus->rhw.range;
if( (unit_is_walking(target) || ud->state.step_attack) if( (unit_is_walking(target) || ud->state.step_attack)
@ -3132,32 +3130,44 @@ int unit_counttargeted(struct block_list* bl)
* @param src Current target * @param src Current target
* @param target New target * @param target New target
**/ **/
int unit_changetarget(struct block_list *bl, va_list ap) { int unit_changetarget(block_list *bl, va_list ap) {
struct unit_data *ud = unit_bl2ud(bl); if (bl == nullptr)
struct block_list *src = va_arg(ap,struct block_list *);
struct block_list *target = va_arg(ap,struct block_list *);
if (!ud || !target || ud->target == target->id)
return 1; return 1;
if (!ud->target && !ud->target_to) unit_data *ud = unit_bl2ud(bl);
block_list *src = va_arg(ap, block_list *);
block_list *target = va_arg(ap, block_list *);
if (ud == nullptr || src == nullptr || target == nullptr || ud->target == target->id)
return 1;
if (ud->target <= 0 && ud->target_to <= 0)
return 1; return 1;
if (ud->target != src->id && ud->target_to != src->id) if (ud->target != src->id && ud->target_to != src->id)
return 1; return 1;
if (bl->type == BL_MOB) unit_changetarget_sub(*ud, *target);
(BL_CAST(BL_MOB,bl))->target_id = target->id;
if (ud->target_to)
ud->target_to = target->id;
else
ud->target_to = 0;
if (ud->skilltarget)
ud->skilltarget = target->id;
unit_set_target(ud, target->id);
//unit_attack(bl, target->id, ud->state.attack_continue); //unit_attack(bl, target->id, ud->state.attack_continue);
return 0; return 0;
} }
/**
* Changes the target of a unit
* @param ud: Unit data
* @param target: New target data
**/
void unit_changetarget_sub(unit_data& ud, block_list& target) {
if (status_isdead(target))
return;
if (ud.bl->type == BL_MOB)
reinterpret_cast<mob_data*>(ud.bl)->target_id = target.id;
if (ud.target_to > 0)
ud.target_to = target.id;
if (ud.skilltarget > 0)
ud.skilltarget = target.id;
unit_set_target(&ud, target.id);
}
/** /**
* Removes a bl/ud from the map * Removes a bl/ud from the map
* On kill specifics are not performed here, check status_damage() * On kill specifics are not performed here, check status_damage()
@ -3229,7 +3239,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
if(sd->chatID) if(sd->chatID)
chat_leavechat(sd,0); chat_leavechat(sd,0);
if(sd->trade_partner) if(sd->trade_partner.id > 0)
trade_tradecancel(sd); trade_tradecancel(sd);
searchstore_close(*sd); searchstore_close(*sd);
@ -3412,7 +3422,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
break; break;
case BL_MOB: case BL_MOB:
// /BL_MOB is handled by mob_dead unless the monster is not dead. // /BL_MOB is handled by mob_dead unless the monster is not dead.
if (status_isdead(bl)) { if (status_isdead(*bl)) {
map_delblock(bl); map_delblock(bl);
break; break;
} }
@ -3522,7 +3532,7 @@ int unit_free(struct block_list *bl, clr_type clrtype)
map_session_data *sd = (map_session_data*)bl; map_session_data *sd = (map_session_data*)bl;
int i; int i;
if( status_isdead(bl) ) if( status_isdead(*bl) )
pc_setrestartvalue(sd,2); pc_setrestartvalue(sd,2);
pc_delinvincibletimer(sd); pc_delinvincibletimer(sd);

View File

@ -172,8 +172,8 @@ void unit_free_pc(map_session_data *sd);
#define unit_remove_map(bl,clrtype) unit_remove_map_(bl,clrtype,__FILE__,__LINE__,__func__) #define unit_remove_map(bl,clrtype) unit_remove_map_(bl,clrtype,__FILE__,__LINE__,__func__)
int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, int line, const char* func); int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, int line, const char* func);
int unit_free(struct block_list *bl, clr_type clrtype); int unit_free(struct block_list *bl, clr_type clrtype);
int unit_changeviewsize(struct block_list *bl,short size); int unit_changetarget(block_list *bl,va_list ap);
int unit_changetarget(struct block_list *bl,va_list ap); void unit_changetarget_sub(unit_data& ud, block_list& target);
// Shadow Scar // Shadow Scar
void unit_addshadowscar(unit_data &ud, int interval); void unit_addshadowscar(unit_data &ud, int interval);

View File

@ -562,11 +562,11 @@ void vending_reopen( map_session_data& sd )
if( (fail = vending_openvending(sd, at->title, data, count, at)) == 0 ) { if( (fail = vending_openvending(sd, at->title, data, count, at)) == 0 ) {
// Make vendor look perfect // Make vendor look perfect
pc_setdir(&sd, at->dir, at->head_dir); pc_setdir(&sd, at->dir, at->head_dir);
clif_changed_dir(&sd.bl, AREA_WOS); clif_changed_dir(sd.bl, AREA_WOS);
if( at->sit ) { if( at->sit ) {
pc_setsit(&sd); pc_setsit(&sd);
skill_sit(&sd, 1); skill_sit(&sd, 1);
clif_sitting(&sd.bl); clif_sitting(sd.bl);
} }
// Immediate save // Immediate save