Compare commits

..

3 Commits

Author SHA1 Message Date
Atemo
f73a858d6c Merge branch 'master' into script/episode19 2024-08-10 15:27:57 +02:00
Atemo
150fc78866 Corrected NPCs name 2024-08-10 15:15:24 +02:00
Atemo
7b816e18fb Initial release of episode 19 - Walkthrough Conversion 2024-07-30 17:03:13 +02:00
82 changed files with 28350 additions and 4502 deletions

View File

@ -1032,11 +1032,6 @@ Body:
- Command: setcard
Help: |
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:
Imports:

View File

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

View File

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

View File

@ -47,6 +47,8 @@ Body:
Value: 5
- Name: REPUTATION_EP18
Value: 3
- Name: REPUTATION_EP19
Value: 4
Footer:
Imports:

View File

@ -30822,6 +30822,7 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Hit: Single
AfterCastActDelay: 1000
AfterCastWalkDelay: 1000
Requires:
@ -30833,6 +30834,7 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Hit: Single
AfterCastActDelay: 30000
AfterCastWalkDelay: 1000
Duration1:
@ -30863,6 +30865,8 @@ Body:
Name: HAMI_SKIN
Description: Adamantium Skin
MaxLevel: 5
DamageFlags:
NoDamage: true
- Id: 8008
Name: HAMI_BLOODLUST
Description: Bloodlust
@ -30870,6 +30874,7 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Hit: Single
AfterCastActDelay:
- Level: 1
Time: 300000

View File

@ -552,33 +552,3 @@ Body:
Points: 4545
- Level: 260
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

@ -2496,9 +2496,6 @@ Body:
CalcFlags:
Batk: true
Watk: true
Flags:
NoSave: true
RemoveFromHomOnWarp: true
- Status: Fleet
DurationLookup: HFLI_FLEET
CalcFlags:
@ -2513,10 +2510,6 @@ Body:
DurationLookup: HAMI_DEFENCE
CalcFlags:
Def: true
Vit: true
Flags:
NoSave: true
RemoveFromHomOnWarp: true
- Status: Incaspdrate
CalcFlags:
Aspd: true
@ -3974,7 +3967,7 @@ Body:
Unlimitedhummingvoice: true
Sircleofnature: true
- Status: Deepsleep
Icon: EFST_DEEP_SLEEP
Icon: EFST_HANDICAPSTATE_DEEP_SLEEP
DurationLookup: WM_LULLABY_DEEPSLEEP
States:
NoCast: true

View File

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

View File

@ -83053,7 +83053,7 @@ Body:
Hunter: true
Rogue: true
Locations:
Both_Hand: true
Right_Hand: true
WeaponLevel: 4
EquipLevelMin: 70
Refineable: true
@ -112246,7 +112246,8 @@ Body:
Defense: 30
Slots: 1
Classes:
All: true
All_Third: true
Fourth: true
Locations:
Garment: true
ArmorLevel: 1
@ -112275,7 +112276,8 @@ Body:
Defense: 30
Slots: 1
Classes:
All: true
All_Third: true
Fourth: true
Locations:
Garment: true
ArmorLevel: 1
@ -112304,7 +112306,8 @@ Body:
Defense: 30
Slots: 1
Classes:
All: true
All_Third: true
Fourth: true
Locations:
Garment: true
ArmorLevel: 1
@ -139532,7 +139535,7 @@ Body:
AegisName: Ein_BHAXE
Name: Saw Axe
Type: Weapon
SubType: 2hAxe
SubType: 1hAxe
Weight: 5000
Attack: 350
Range: 1
@ -169197,8 +169200,6 @@ Body:
Defense: 12
Slots: 1
Jobs:
Crusader: true
Knight: true
Swordman: true
Classes:
All_Upper: true
@ -169219,8 +169220,6 @@ Body:
Defense: 12
Slots: 1
Jobs:
Crusader: true
Knight: true
Swordman: true
Classes:
All_Upper: true
@ -202634,17 +202633,6 @@ 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
AegisName: Atker_Ring
Name: Attacker Booster Ring

View File

@ -80408,28 +80408,6 @@ Body:
Name: Footprint Effect
Type: Card
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
AegisName: Ep21_4_Def
Name: Forest Magic Orb (Physical Defense)
@ -81918,15 +81896,6 @@ Body:
Script: |
bonus bLongAtkRate,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
AegisName: IDTest_event
Name: IDTest event
@ -89471,11 +89440,6 @@ Body:
Name: Footprint Effect (Garment)
Type: Etc
Weight: 100
- Id: 1001617
AegisName: PurpleStar_Foot_Robe
Name: Purple Star Footprint (Garment)
Type: Etc
Weight: 100
- Id: 1001618
AegisName: aegis_1001618
Name: Wigner Premium Exchange Ticket
@ -89745,11 +89709,6 @@ Body:
Weight: 10
Flags:
BuyingStore: true
- Id: 1001650
AegisName: YellowStar_Foot_Robe
Name: Yellow Star Footprint (Garment)
Type: Etc
Weight: 100
- Id: 1001653
AegisName: Ep21_Armor_E_Stone1
Name: Turquoise Magic Stone
@ -90363,11 +90322,6 @@ Body:
NoGuildStorage: true
NoMail: true
NoAuction: true
- Id: 1001772
AegisName: aegis_1001772
Name: Puppy Footprint (Garment)
Type: Etc
Weight: 100
- Id: 1200000
AegisName: IDTest_arrow
Name: IDTest arrow
@ -90430,7 +90384,7 @@ Body:
Ammo: true
EquipLevelMin: 1
Script: |
bonus bAtkEle,Ele_Ghost;
bonus bAtkEle,Ele_Neutral;
- Id: 1220003
AegisName: Kunai_Of_Shadow
Name: Kunai Of Shadow

View File

@ -78855,11 +78855,6 @@ Body:
NoAuction: true
Script: |
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
AegisName: IDTest_Cash
Name: IDTest Cash

View File

@ -113439,3 +113439,216 @@ Body:
- Index: 2
Item: Enchant_Stone_Box35
Amount: 10
# custom rates
- Group: D_GW_EXTRACTOR
SubGroups:
- SubGroup: 1
List:
- Index: 0
Item: EP19_D_P_Ore
Amount: 1
Rate: 5
- Index: 1
Item: EP19_N_P_Ore
Amount: 1
Rate: 3
- Index: 2
Item: EP19_D_P_Crystal
Amount: 1
Rate: 2
- Index: 3
Item: EP19_N_P_Crystal
Amount: 1
Rate: 1
- Index: 4
Item: EP19_D_P_Stone
Amount: 1
Rate: 1
- Index: 5
Item: EP19_S_F_1_Extract
Amount: 1
Rate: 1
- Index: 6
Item: EP19_S_F_2_Extract
Amount: 1
Rate: 1
- Index: 7
Item: EP19_S_F_3_Extract
Amount: 1
Rate: 1
- Index: 8
Item: EP19_Gla_Extract
Amount: 1
Rate: 1
- Index: 9
Item: Snow_F_Ore
Amount: 1
Rate: 12
- Index: 10
Item: Snow_F_Stone1
Amount: 1
Rate: 5
- Index: 11
Item: Snow_F_Stone2
Amount: 1
Rate: 3
- Index: 12
Item: Snow_F_Stone3
Amount: 1
Rate: 1
- Index: 13
Item: EP19_D_P_Ore
Amount: 2
Rate: 5
- Index: 14
Item: EP19_N_P_Ore
Amount: 2
Rate: 3
- Index: 15
Item: EP19_D_P_Crystal
Amount: 2
Rate: 2
- Index: 16
Item: EP19_N_P_Crystal
Amount: 2
Rate: 1
- Index: 17
Item: EP19_D_P_Stone
Amount: 2
Rate: 1
- Index: 18
Item: EP19_S_F_1_Extract
Amount: 2
Rate: 1
- Index: 19
Item: EP19_S_F_2_Extract
Amount: 2
Rate: 1
- Index: 20
Item: EP19_S_F_3_Extract
Amount: 2
Rate: 1
- Index: 21
Item: EP19_Gla_Extract
Amount: 2
Rate: 1
- Index: 22
Item: Snow_F_Ore
Amount: 2
Rate: 12
- Index: 23
Item: Snow_F_Stone1
Amount: 2
Rate: 5
- Index: 24
Item: Snow_F_Stone2
Amount: 2
Rate: 3
- Index: 25
Item: Snow_F_Stone3
Amount: 2
Rate: 1
- Index: 26
Item: EP19_D_P_Ore
Amount: 3
Rate: 5
- Index: 27
Item: EP19_N_P_Ore
Amount: 3
Rate: 3
- Index: 28
Item: EP19_D_P_Crystal
Amount: 3
Rate: 2
- Index: 29
Item: EP19_N_P_Crystal
Amount: 3
Rate: 1
- Index: 30
Item: EP19_D_P_Stone
Amount: 3
Rate: 1
- Index: 31
Item: EP19_S_F_1_Extract
Amount: 3
Rate: 1
- Index: 32
Item: EP19_S_F_2_Extract
Amount: 3
Rate: 1
- Index: 33
Item: EP19_S_F_3_Extract
Amount: 3
Rate: 1
- Index: 34
Item: EP19_Gla_Extract
Amount: 3
Rate: 1
- Index: 35
Item: Snow_F_Ore
Amount: 3
Rate: 12
- Index: 36
Item: Snow_F_Stone1
Amount: 3
Rate: 5
- Index: 37
Item: Snow_F_Stone2
Amount: 3
Rate: 3
- Index: 38
Item: Snow_F_Stone3
Amount: 3
Rate: 1
- Index: 39
Item: EP19_D_P_Ore
Amount: 4
Rate: 5
- Index: 40
Item: EP19_N_P_Ore
Amount: 4
Rate: 3
- Index: 41
Item: EP19_D_P_Crystal
Amount: 4
Rate: 2
- Index: 42
Item: EP19_N_P_Crystal
Amount: 4
Rate: 1
- Index: 43
Item: EP19_D_P_Stone
Amount: 4
Rate: 1
- Index: 44
Item: EP19_S_F_1_Extract
Amount: 4
Rate: 1
- Index: 45
Item: EP19_S_F_2_Extract
Amount: 4
Rate: 1
- Index: 46
Item: EP19_S_F_3_Extract
Amount: 4
Rate: 1
- Index: 47
Item: EP19_Gla_Extract
Amount: 4
Rate: 1
- Index: 48
Item: Snow_F_Ore
Amount: 4
Rate: 12
- Index: 49
Item: Snow_F_Stone1
Amount: 4
Rate: 5
- Index: 50
Item: Snow_F_Stone2
Amount: 4
Rate: 3
- Index: 51
Item: Snow_F_Stone3
Amount: 4
Rate: 1

View File

@ -980,13 +980,3 @@ Body:
- Group: 1
Items:
- 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
Hyper_Novice: true
Spirit_Handler: true
MaxBaseLevel: 275
MaxBaseLevel: 260
BaseExp:
- Level: 1
Exp: 658
@ -3886,36 +3886,6 @@ Body:
- Level: 259
Exp: 270217017679
- 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
- Jobs:
Dragon_Knight: true
@ -3942,7 +3912,7 @@ Body:
Night_Watch: true
Hyper_Novice: true
Spirit_Handler: true
MaxJobLevel: 60
MaxJobLevel: 55
JobExp:
- Level: 1
Exp: 4700000
@ -4053,14 +4023,4 @@ Body:
- Level: 54
Exp: 6559840847
- Level: 55
Exp: 7543816974
- Level: 56
Exp: 8675389520
- Level: 57
Exp: 9976697948
- Level: 58
Exp: 11473202640
- Level: 59
Exp: 13194183036
- Level: 60
Exp: 99999999999
Exp: 9999999999

File diff suppressed because it is too large Load Diff

View File

@ -4359,110 +4359,110 @@ Body:
- Item: S_Caster_Weapon
- Item: S_Caster_earring
- Item: S_Caster_Pendant
# - Item: Ice_F_Stone_Box2
# RewardGroup: ICE_F_STONE_BOX2
# RequiredRequirementsCount: 3
# Requirements:
# - Item: Ice_F_Stone_Str
# - Item: Ice_F_Stone_Dex
# - Item: Ice_F_Stone_Agi
# - Item: Ice_F_Stone_Int
# - Item: Ice_F_Stone_Vit
# - Item: Ice_F_Stone_luk
# - Item: Ice_F_Stone_Def
# - Item: Ice_F_Stone_Mdef
# - Item: Ice_F_Stone_Ran
# - Item: Ice_F_Stone_War
# - Item: Ice_F_Stone_Mag
# - Item: Ice_F_Stone_R_Reject
# - Item: Ice_F_Stone_Force
# - Item: Ice_F_Stone_S_Delay
# - Item: Ice_F_Stone_Skill_1
# - Item: Ice_F_Stone_Skill_2
# - Item: Ice_F_Stone_Skill_3
# - Item: Ice_F_Stone_Skill_4
# - Item: Ice_F_Stone_Skill_5
# - Item: Ice_F_Stone_Skill_6
# - Item: Ice_F_Stone_Skill_7
# - Item: Ice_F_Stone_Skill_8
# - Item: Ice_F_Stone_Skill_9
# - Item: Ice_F_Stone_Skill_10
# - Item: Ice_F_Stone_Skill_11
# - Item: Ice_F_Stone_Skill_12
# - Item: Ice_F_Stone_Skill_13
# - Item: Ice_F_Stone_Skill_14
# - Item: Ice_F_Stone_Skill_15
# - Item: Ice_F_Stone_Skill_16
# - Item: Ice_F_Stone_Skill_17
# - Item: Ice_F_Stone_Skill_18
# - Item: Ice_F_Stone_Skill_19
# - Item: Ice_F_Stone_Skill_20
# - Item: Ice_F_Stone_Skill_21
# - Item: Ice_F_Stone_Skill_22
# - Item: Ice_F_Stone_Skill_23
# - Item: Ice_F_Stone_Skill_24
# - Item: Ice_F_Stone_Skill_25
# - Item: Ice_F_Stone_Skill_26
# - Item: Ice_F_Stone_Skill_27
# - Item: Ice_F_Stone_Skill_28
# - Item: Ice_F_Stone_Skill_29
# - Item: Ice_F_Stone_Skill_30
# - Item: Ice_F_Stone_Skill_31
# - Item: Ice_F_Stone_Skill_32
# - Item: Ice_F_Stone_Skill_33
# - Item: Ice_F_Stone_Skill_34
# - Item: Ice_F_Stone_Skill_35
# - Item: Ice_F_Stone_Skill_36
# - Item: Ice_F_Stone_Skill_37
# - Item: Ice_F_Stone_Skill_38
# - Item: Ice_F_Stone_Skill_39
# - Item: Ice_F_Stone_Skill_40
# - Item: Ice_F_Stone_Skill_41
# - Item: Ice_F_Stone_Skill_42
# - Item: Ice_F_Stone_Skill_43
# - Item: Ice_F_Stone_Skill_44
# - Item: Ice_F_Stone_Skill_45
# - Item: Ice_F_Stone_Skill_46
# - Item: Ice_F_Stone_Skill_47
# - Item: Ice_F_Stone_Skill_48
# - Item: Ice_F_Stone_Skill_49
# - Item: Ice_F_Stone_Skill_50
# - Item: Ice_F_Stone_Skill_51
# - Item: Ice_F_Stone_Skill_52
# - Item: Ice_F_Stone_Skill_53
# - Item: Ice_F_Stone_Skill_54
# - Item: Ice_F_Stone_Speed
# - Item: Ice_F_Stone_Caster
# - Item: Ice_F_Stone_Critical
# - Item: Ice_F_Stone_Guide
# - Item: Ice_F_Stone_Above
# - Item: Ice_F_Stone_P_Full
# - Item: Ice_F_Stone_M_Counter
# - Item: Ice_F_Stone_Hp
# - Item: Ice_F_Stone_Sp
# - Item: Ice_F_Stone_Heal
# - Item: Ice_F_Stone_Robust
# - Item: Ice_F_Stone_F_Cast
# - Item: Ice_F_Stone_M_F
# - Item: Ice_F_Stone_P_F
# - Item: Ice_F_Stone_Un_Vit
# - Item: Ice_F_Stone_Sp_Int
# - Item: Ice_F_Stone_Fi_Dex
# - Item: Ice_F_Stone_Ov_Str
# - Item: Ice_F_Stone_Fa_Agi
# - Item: Ice_F_Stone_Lu_Luk
# - Item: Ice_F_Stone_A_Delay
# - Item: Ice_F_Stone_E_Archer
# - Item: Ice_F_Stone_Fatal
# - Item: Ice_F_Stone_F_Spirit
# - Item: Ice_F_Stone_Spell
# - Item: Ice_F_Stone_HealHP
# - Item: Ice_F_Stone_HealSP
# - Item: Ice_F_Stone_Life
# - Item: Ice_F_Stone_Soul
# - Item: Ice_F_Stone_M_Heal
# - Item: Ice_F_Stone_M_Soul
# - Item: Ice_F_Stone_A_Force
- Item: Ice_F_Stone_Box2
RewardGroup: ICE_F_STONE_BOX
RequiredRequirementsCount: 3
Requirements:
- Item: Ice_F_Stone_Str
- Item: Ice_F_Stone_Dex
- Item: Ice_F_Stone_Agi
- Item: Ice_F_Stone_Int
- Item: Ice_F_Stone_Vit
- Item: Ice_F_Stone_luk
- Item: Ice_F_Stone_Def
- Item: Ice_F_Stone_Mdef
- Item: Ice_F_Stone_Ran
- Item: Ice_F_Stone_War
- Item: Ice_F_Stone_Mag
- Item: Ice_F_Stone_R_Reject
- Item: Ice_F_Stone_Force
- Item: Ice_F_Stone_S_Delay
- Item: Ice_F_Stone_Skill_1
- Item: Ice_F_Stone_Skill_2
- Item: Ice_F_Stone_Skill_3
- Item: Ice_F_Stone_Skill_4
- Item: Ice_F_Stone_Skill_5
- Item: Ice_F_Stone_Skill_6
- Item: Ice_F_Stone_Skill_7
- Item: Ice_F_Stone_Skill_8
- Item: Ice_F_Stone_Skill_9
- Item: Ice_F_Stone_Skill_10
- Item: Ice_F_Stone_Skill_11
- Item: Ice_F_Stone_Skill_12
- Item: Ice_F_Stone_Skill_13
- Item: Ice_F_Stone_Skill_14
- Item: Ice_F_Stone_Skill_15
- Item: Ice_F_Stone_Skill_16
- Item: Ice_F_Stone_Skill_17
- Item: Ice_F_Stone_Skill_18
- Item: Ice_F_Stone_Skill_19
- Item: Ice_F_Stone_Skill_20
- Item: Ice_F_Stone_Skill_21
- Item: Ice_F_Stone_Skill_22
- Item: Ice_F_Stone_Skill_23
- Item: Ice_F_Stone_Skill_24
- Item: Ice_F_Stone_Skill_25
- Item: Ice_F_Stone_Skill_26
- Item: Ice_F_Stone_Skill_27
- Item: Ice_F_Stone_Skill_28
- Item: Ice_F_Stone_Skill_29
- Item: Ice_F_Stone_Skill_30
- Item: Ice_F_Stone_Skill_31
- Item: Ice_F_Stone_Skill_32
- Item: Ice_F_Stone_Skill_33
- Item: Ice_F_Stone_Skill_34
- Item: Ice_F_Stone_Skill_35
- Item: Ice_F_Stone_Skill_36
- Item: Ice_F_Stone_Skill_37
- Item: Ice_F_Stone_Skill_38
- Item: Ice_F_Stone_Skill_39
- Item: Ice_F_Stone_Skill_40
- Item: Ice_F_Stone_Skill_41
- Item: Ice_F_Stone_Skill_42
- Item: Ice_F_Stone_Skill_43
- Item: Ice_F_Stone_Skill_44
- Item: Ice_F_Stone_Skill_45
- Item: Ice_F_Stone_Skill_46
- Item: Ice_F_Stone_Skill_47
- Item: Ice_F_Stone_Skill_48
- Item: Ice_F_Stone_Skill_49
- Item: Ice_F_Stone_Skill_50
- Item: Ice_F_Stone_Skill_51
- Item: Ice_F_Stone_Skill_52
- Item: Ice_F_Stone_Skill_53
- Item: Ice_F_Stone_Skill_54
- Item: Ice_F_Stone_Speed
- Item: Ice_F_Stone_Caster
- Item: Ice_F_Stone_Critical
- Item: Ice_F_Stone_Guide
- Item: Ice_F_Stone_Above
- Item: Ice_F_Stone_P_Full
- Item: Ice_F_Stone_M_Counter
- Item: Ice_F_Stone_Hp
- Item: Ice_F_Stone_Sp
- Item: Ice_F_Stone_Heal
- Item: Ice_F_Stone_Robust
- Item: Ice_F_Stone_F_Cast
- Item: Ice_F_Stone_M_F
- Item: Ice_F_Stone_P_F
- Item: Ice_F_Stone_Un_Vit
- Item: Ice_F_Stone_Sp_Int
- Item: Ice_F_Stone_Fi_Dex
- Item: Ice_F_Stone_Ov_Str
- Item: Ice_F_Stone_Fa_Agi
- Item: Ice_F_Stone_Lu_Luk
- Item: Ice_F_Stone_A_Delay
- Item: Ice_F_Stone_E_Archer
- Item: Ice_F_Stone_Fatal
- Item: Ice_F_Stone_F_Spirit
- Item: Ice_F_Stone_Spell
- Item: Ice_F_Stone_HealHP
- Item: Ice_F_Stone_HealSP
- Item: Ice_F_Stone_Life
- Item: Ice_F_Stone_Soul
- Item: Ice_F_Stone_M_Heal
- Item: Ice_F_Stone_M_Soul
- Item: Ice_F_Stone_A_Force
- Item: R_BearersShadow_Mix
RewardGroup: R_BEARERSSHADOW_MIX
RequiredRequirementsCount: 6
@ -4812,3 +4812,33 @@ Body:
# Amount: 100
# - Item: Crystal_Of_Pollution
# Amount: 100
- Item: D_Gw_Extractor
RewardGroup: D_GW_EXTRACTOR
RequiredRequirementsCount: 3
Requirements:
- Item: D_Glacier_T_Sword
- Item: D_Glacier_Lance
- Item: D_Glacier_Sword
- Item: D_Glacier_B_Sword
- Item: D_Glacier_Spear
- Item: D_Glacier_T_Axe
- Item: D_Glacier_Axe
- Item: D_Glacier_Mace
- Item: D_Glacier_M_Mace
- Item: D_Glacier_R_Knife
- Item: D_Glacier_B_Knife
- Item: D_Glacier_Bow
- Item: D_Glacier_Knuckle
- Item: D_Glacier_Book
- Item: D_Glacier_Katar
- Item: D_Glacier_Wand
- Item: D_Glacier_Staff
- Item: D_Glacier_Foxtail
- Item: D_Glacier_Violin
- Item: D_Glacier_Whip
- Item: D_Glacier_Humma
- Item: D_Glacier_Revolver
- Item: D_Glacier_Rifle
- Item: D_Glacier_Shotgun
- Item: D_Glacier_Gatling
- Item: D_Glacier_Launcher

File diff suppressed because it is too large Load Diff

View File

@ -3256,6 +3256,58 @@ Body:
Title: "[Daily] Half Flower Gathering"
- Id: 5942
Title: Flower Room Opening Ceremony
- Id: 5972
Title: Eagle Patrol
- Id: 5973
Title: "[Standby] Patrol with Iwin"
TimeLimit: 4h
- Id: 5974
Title: Patrol with Iwin (1)
- Id: 5975
Title: Patrol with Iwin (2)
- Id: 5976
Title: Supplier Goror
- Id: 5977
Title: "[Standby] Do not feed"
TimeLimit: 4h
- Id: 5978
Title: Do not feed me (1)
- Id: 5979
Title: Do not feed me (2)
- Id: 5980
Title: Secret fun
- Id: 5981
Title: "[Standby] Secret Fun"
TimeLimit: 4h
- Id: 5982
Title: Secret fun
- Id: 5983
Title: Test Subject 210426 Encounter
- Id: 5984
Title: Rgan Transformation Scroll
- Id: 5985
Title: "[Standby] Lunch menu selection"
TimeLimit: 4h
- Id: 5986
Title: Lunch's menu selection
- Id: 5987
Title: Lunch's menu selection
- Id: 5988
Title: Lunch's menu selection
- Id: 5989
Title: Lunch's menu selection
- Id: 5990
Title: Lunch's menu selection
- Id: 5991
Title: Lunch's menu selection
- Id: 5992
Title: Lunch's menu selection
- Id: 5993
Title: Lunch's menu selection
- Id: 5994
Title: Lunch's menu selection
- Id: 5995
Title: Lunch's menu selection
- Id: 6000
Title: Job Change to Taekwon
- Id: 6001
@ -6418,6 +6470,64 @@ Body:
- Id: 8738
Title: Shared Memories - Standby
TimeLimit: 4h
- Id: 8784
Title: Help Moryara Fishing
Targets:
- Mob: EP19_SHINING_SEAWEED
Count: 20
- Id: 8785
Title: Moryara's Fishing Help - Standby
TimeLimit: 4h
- Id: 8786
Title: Help Moryara Fishing
Targets:
- Mob: EP19_SHINING_SEAWEED
Count: 20
- Id: 8787
Title: Lunch time with Zoryara
- Id: 8788
Title: Happy Lunch with Zoryara - Standby
TimeLimit: 4h
- Id: 8789
Title: Lunch time with Zoryara
- Id: 8790
Title: Priest, have mercy?
- Id: 8791
Title: Priest, have mercy? - Wait
TimeLimit: 4h
- Id: 8792
Title: Priest, have mercy??
- Id: 8793
Title: Things to ask
- Id: 8794
Title: Old Snake
- Id: 8795
Title: Doctrine and Preaching
- Id: 8796
Title: You're the first girl I've ever seen
Targets:
- Mob: EP19_RGAN_A
Count: 20
- Id: 8797
Title: Rgan to work-Standby
TimeLimit: 4h
- Id: 8798
Title: Rgan to make work
Targets:
- Mob: EP19_RGAN_A
Count: 20
- Id: 8799
Title: Hatchery's Rgan (1)
- Id: 8800
Title: Hatchery's Rgan (2)
- Id: 8801
Title: Hatchery's Rgan (3)
- Id: 8802
Title: The 1st Rgan in the Hatchery
- Id: 8803
Title: Hatchery's 2nd Rgan
- Id: 8804
Title: The 3rd Rgan in the Hatchery
- Id: 9000
Title: Job Change to Knight
- Id: 9001
@ -8297,6 +8407,356 @@ Body:
- Id: 11739
Title: "[Cooldown] Oz Labyrinth 2F"
TimeLimit: 4h
- Id: 11794
Title: The Lady of Purification
- Id: 11795
Title: The Lady of Purification
- Id: 11796
Title: The Lady of Purification
- Id: 11797
Title: The Lady of Purification
- Id: 11798
Title: The Lady of Purification
- Id: 11799
Title: The Lady of Purification
- Id: 11800
Title: The Lady of Purification
- Id: 11801
Title: The Lady of Purification
- Id: 11802
Title: The Lady of Purification
- Id: 11803
Title: The Lady of Purification
- Id: 11804
Title: The Lady of Purification
- Id: 11805
Title: The Lady of Purification
- Id: 11806
Title: The Lady of Purification
- Id: 11807
Title: The Lady of Purification
- Id: 11808
Title: The Lady of Purification
- Id: 11809
Title: The Lady of Purification
- Id: 11810
Title: The Lady of Purification
- Id: 11811
Title: The Lady of Purification
- Id: 11812
Title: Friederike's Day
- Id: 11813
Title: Friederike's Day
Targets:
- Mob: EP19_RGAN_A
Count: 10
- Mob: EP19_RGAN_B
Count: 10
Drops:
- Mob: EP19_RGAN_A
Item: Ep19_Rgan_Core
Rate: 5000
- Mob: EP19_RGAN_B
Item: Ep19_Rgan_Core
Rate: 5000
- Id: 11814
Title: Friederike's Day - Standby
TimeLimit: 4h
- Id: 11815
Title: Frozen Sea
- Id: 11816
Title: Frozen Sea
- Id: 11817
Title: Frozen Sea
- Id: 11818
Title: Frozen Sea
- Id: 11819
Title: Frozen Sea
- Id: 11820
Title: Frozen Sea
- Id: 11821
Title: Frozen Sea
- Id: 11822
Title: Frozen Sea
Targets:
- Id: 1
Count: 10
Location: jor_back2
MapMobTargets:
EP19_UNFROST_FLOWER: true
EP19_ICE_GANGU: true
EP19_ICE_STRAW: true
EP19_LIMACINA: true
Drops:
- Mob: EP19_UNFROST_FLOWER
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_ICE_GANGU
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_ICE_STRAW
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_LIMACINA
Item: Ep19_Ice_Meat
Rate: 5000
- Id: 11823
Title: Frozen Sea
- Id: 11824
Title: Frozen Sea
- Id: 11825
Title: Frozen Sea
Targets:
- Id: 1
Count: 5
Location: jor_ab01
MapMobTargets:
EP19_WASTED_RGAN_A: true
EP19_CAVE_CALMARING: true
EP19_CAVE_FLOWER: true
EP19_HALLUCIGENIA_BABY: true
EP19_RE_RGAN_E: true
Drops:
- Mob: EP19_WASTED_RGAN_A
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_CAVE_CALMARING
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_CAVE_FLOWER
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_HALLUCIGENIA_BABY
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_RE_RGAN_E
Item: Ep19_Ice_Meat
Rate: 5000
- Id: 11826
Title: Frozen Sea
Targets:
- Id: 1
Count: 5
Location: jor_ab01
MapMobTargets:
EP19_WASTED_RGAN_A: true
EP19_CAVE_CALMARING: true
EP19_CAVE_FLOWER: true
EP19_HALLUCIGENIA_BABY: true
EP19_RE_RGAN_E: true
Drops:
- Mob: EP19_WASTED_RGAN_A
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_CAVE_CALMARING
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_CAVE_FLOWER
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_HALLUCIGENIA_BABY
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_RE_RGAN_E
Item: Ep19_Ice_Meat
Rate: 5000
- Id: 11827
Title: Frozen Sea
Targets:
- Id: 1
Count: 5
Location: jor_ab01
MapMobTargets:
EP19_WASTED_RGAN_A: true
EP19_CAVE_CALMARING: true
EP19_CAVE_FLOWER: true
EP19_HALLUCIGENIA_BABY: true
EP19_RE_RGAN_E: true
Drops:
- Mob: EP19_WASTED_RGAN_A
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_CAVE_CALMARING
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_CAVE_FLOWER
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_HALLUCIGENIA_BABY
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_RE_RGAN_E
Item: Ep19_Ice_Meat
Rate: 5000
- Id: 11828
Title: Frozen Sea
Targets:
- Id: 1
Count: 10
Location: jor_ab02
MapMobTargets:
EP19_WASTED_RGAN_C: true
EP19_HALLUCIGENIA: true
EP19_ONE_EYE_DOLLOCARIS: true
EP19_DOLLOCARIS: true
EP19_ET_RGAN_D: true
Drops:
- Mob: EP19_WASTED_RGAN_C
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_HALLUCIGENIA
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_ONE_EYE_DOLLOCARIS
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_DOLLOCARIS
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_ET_RGAN_D
Item: Ep19_Ice_Meat
Rate: 5000
- Id: 11829
Title: Frozen Sea
- Id: 11830
Title: Abandoned Pit
- Id: 11831
Title: A place that deserves to be abandoned
Targets:
- Id: 1
Count: 40
Location: jor_ab01
MapMobTargets:
EP19_WASTED_RGAN_A: true
EP19_CAVE_CALMARING: true
EP19_CAVE_FLOWER: true
EP19_HALLUCIGENIA_BABY: true
EP19_RE_RGAN_E: true
Drops:
- Mob: EP19_WASTED_RGAN_A
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_CAVE_CALMARING
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_CAVE_FLOWER
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_HALLUCIGENIA_BABY
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_RE_RGAN_E
Item: Ep19_Ice_Meat
Rate: 5000
- Id: 11832
Title: Place to be abandoned (1) - Standby
TimeLimit: 4h
- Id: 11833
Title: A place that deserves to be abandoned
Targets:
- Id: 1
Count: 40
Location: jor_ab02
MapMobTargets:
EP19_WASTED_RGAN_C: true
EP19_HALLUCIGENIA: true
EP19_ONE_EYE_DOLLOCARIS: true
EP19_DOLLOCARIS: true
EP19_ET_RGAN_D: true
Drops:
- Mob: EP19_WASTED_RGAN_C
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_HALLUCIGENIA
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_ONE_EYE_DOLLOCARIS
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_DOLLOCARIS
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_ET_RGAN_D
Item: Ep19_Ice_Meat
Rate: 5000
- Id: 11834
Title: Place to be Abandoned (2) - Standby
TimeLimit: 4h
- Id: 11835
Title: Digging and Digging
- Id: 11836
Title: Digging and Digging
- Id: 11837
Title: Digging and Digging
- Id: 11838
Title: Digging and Digging
- Id: 11839
Title: Digging and Digging
- Id: 11840
Title: Digging and Digging
- Id: 11841
Title: Digging and Digging
- Id: 11842
Title: Digging and Digging
- Id: 11843
Title: Digging and Digging
- Id: 11844
Title: Digging and Digging
- Id: 11845
Title: Digging and Digging
- Id: 11846
Title: Digging and Digging
- Id: 11847
Title: Digging and Digging
- Id: 11848
Title: Digging and Digging
- Id: 11849
Title: Digging and Digging
- Id: 11850
Title: Digging and Digging - Standby
TimeLimit: 4h
- Id: 11851
Title: Do you need a refrigerator?
- Id: 11852
Title: Do you need a refrigerator?
Targets:
- Id: 1
Count: 20
Location: jor_back2
MapMobTargets:
EP19_UNFROST_FLOWER: true
EP19_ICE_GANGU: true
EP19_ICE_STRAW: true
EP19_LIMACINA: true
Drops:
- Mob: EP19_UNFROST_FLOWER
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_ICE_GANGU
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_ICE_STRAW
Item: Ep19_Ice_Meat
Rate: 5000
- Mob: EP19_LIMACINA
Item: Ep19_Ice_Meat
Rate: 5000
- Id: 11853
Title: Do you need a refrigerator? - Standby
TimeLimit: 4h
- Id: 11854
Title: Crunchy Tools
- Id: 11855
Title: Crunchy Tools
- Id: 11856
Title: Crunchy Tools
- Id: 11857
Title: Crunchy Tools
- Id: 11858
Title: Crunchy Tools
- Id: 11859
Title: Crunchy Tools - Standby
TimeLimit: 4h
- Id: 12000
Title: An old friend
- Id: 12001
@ -9361,6 +9821,14 @@ Body:
Title: Scattered Goods (East)
- Id: 12539
Title: Scattered Goods (South)
- Id: 12560
Title: Standby: Neutralizing Aircraft
TimeLimit: 4h
- Id: 12561
Title: Disable the Core
Targets:
- Mob: EP19_MD_AQUILA
Count: 1
- Id: 13000
Title: RWC2011Card Gathering
- Id: 13001
@ -11592,6 +12060,69 @@ Body:
Title: The Price of Labor (1)
- Id: 16585
Title: The Price of Labor (2)
- Id: 16636
Title: Looking for clues - Juncea's Lab
- Id: 16637
Title: Find Clues - Bagot's Lab
- Id: 16638
Title: Find Clues - Rgan Guard
- Id: 16639
Title: Juncea's Lab
- Id: 16640
Title: Juncea's Lab
- Id: 16641
Title: Laboratory of Bagot
- Id: 16642
Title: Laboratory of Bagot
- Id: 16643
Title: Rgan Guard
- Id: 16644
Title: Rgan Guard
- Id: 16645
Title: Share the clue
- Id: 16646
Title: Infiltrate without a sound
- Id: 16647
Title: Infiltrate without a sound
- Id: 16648
Title: Infiltrate without a sound
- Id: 16649
Title: Infiltrate without a sound
- Id: 16650
Title: Infiltrate without a sound
- Id: 16651
Title: Infiltrate without a sound
- Id: 16652
Title: Infiltrate without a sound
- Id: 16653
Title: The Doubts That Build Up
- Id: 16654
Title: The Doubts That Build Up
- Id: 16655
Title: Intermittent difference
- Id: 16656
Title: Intermittent difference
- Id: 16657
Title: Intermittent difference
- Id: 16658
Title: Intermittent difference
- Id: 16659
Title: Intermittent difference
- Id: 16660
Title: Intermittent difference
Targets:
- Mob: EP19_MD_JUNCEA
Count: 1
- Id: 16661
Title: Intermittent difference
- Id: 16662
Title: Simulation Battle
Targets:
- Mob: EP19_MD_JUNCEA_S
Count: 1
- Id: 16663
Title: Simulation Battle-Standby
TimeLimit: 4h
- Id: 17000
Title: Meet with Father Bamph
- Id: 17001
@ -11914,6 +12445,96 @@ Body:
- Id: 17566
Title: (Standby) Code name! Is it a star button?
TimeLimit: 4h
- Id: 17619
Title: Lazy's Plan
- Id: 17620
Title: Infiltrating the Snake's Nest
- Id: 17621
Title: Infiltrating the Snake's Nest
- Id: 17622
Title: Infiltrating the Snake's Nest
- Id: 17623
Title: Infiltrating the Snake's Nest
- Id: 17624
Title: Infiltrating the Snake's Nest
- Id: 17625
Title: Infiltrating the Snake's Nest
- Id: 17626
Title: Infiltrating the Snake's Nest
- Id: 17627
Title: Infiltrating the Snake's Nest
- Id: 17628
Title: Infiltrating the Snake's Nest
- Id: 17629
Title: Infiltrating the Snake's Nest
- Id: 17630
Title: Infiltrating the Snake's Nest
- Id: 17631
Title: Infiltrating the Snake's Nest
- Id: 17632
Title: Interim Report of Infiltration Operation
- Id: 17633
Title: Interim Report of Infiltration Operation
- Id: 17634
Title: Interim Report of Infiltration Operation
- Id: 17635
Title: Interim Report of Infiltration Operation
- Id: 17636
Title: Interim Report of Infiltration Operation
- Id: 17637
Title: Operation of Aircraft Destruction
- Id: 17638
Title: Vulnerability Investigation
- Id: 17639
Title: Accompanying Reconnaissance Report
- Id: 17640
Title: The Confused Snake's Nest
- Id: 17641
Title: The Confused Snake's Nest
- Id: 17642
Title: The Confused Snake's Nest
- Id: 17643
Title: The Confused Snake's Nest
- Id: 17644
Title: The Confused Snake's Nest
- Id: 17645
Title: The Confused Snake's Nest
- Id: 17646
Title: The Confused Snake's Nest
- Id: 17647
Title: The Confused Snake's Nest
- Id: 17648
Title: The Confused Snake's Nest
- Id: 17649
Title: Those who disappeared
- Id: 17650
Title: Finding an underground hideout on the ground
- Id: 17651
Title: Finding an underground hideout on the ground
- Id: 17652
Title: Finding an underground hideout on the ground
- Id: 17653
Title: Finding an underground hideout on the ground
- Id: 17654
Title: Finding an underground hideout on the ground
- Id: 17655
Title: Finding an underground hideout on the ground
- Id: 17656
Title: Finding an underground hideout on the ground
- Id: 17657
Title: Finding an underground hideout on the ground
- Id: 17658
Title: Finding an underground hideout on the ground
- Id: 17659
Title: Finding an underground hideout on the ground
- Id: 17660
Title: Finding an underground hideout on the ground
- Id: 17661
Title: Standby: Finding an Underground Hideout on the Ground
TimeLimit: 4h
- Id: 17662
Title: Standby: Finding an Underground Hideout on the Ground
TimeLimit: 4h
- Id: 18000
Title: Ready to enter
- Id: 18001
@ -12092,11 +12713,72 @@ Body:
- Id: 18118
Title: Mysterious Musical Instrument
- Id: 18119
Title: Gusli
Title: The Guest Who Ride the North Wind 1
- Id: 18120
Title: Gusli
Title: Guest from the North Wind 2
- Id: 18121
Title: Shafka
Title: Guardian's Chest and Invitation 1
- Id: 18122
Title: Guardian's Box and Invitation 2
- Id: 18123
Title: Guardian's Box and Invitation 3
- Id: 18124
Title: Guardian's Chest and Invitation 5
- Id: 18125
Title: To the Ice Castle
- Id: 18126
Title: Meeting the Ice Castle
- Id: 18127
Title: Let's meet the Iwin Scouts.
- Id: 18128
Title: Let's meet Boclind.
- Id: 18129
Title: Guardian's Chest and Invitation 4
- Id: 18130
Title: Procurement of research materials for Belgund
- Id: 18131
Title: Procurement of research materials for Belgund - Standby
TimeLimit: 4h
- Id: 18132
Title: I need someone.
- Id: 18133
Title: Leon's Story
- Id: 18134
Title: Search for the Displaced - Frozen Glacier
- Id: 18135
Title: Searching for the Lost - Frozen Plains
- Id: 18136
Title: Complete rescue of survivors
- Id: 18137
Title: Search for survivors - Standby
TimeLimit: 4h
- Id: 18138
Title: Special way to survive
Targets:
- Mob: EP19_RGAN_A
Count: 10
- Mob: EP19_RGAN_B
Count: 10
- Id: 18139
Title: Our precious food
- Id: 18140
Title: Our precious food - Standby
TimeLimit: 4h
- Id: 18141
Title: A noble hobby
- Id: 18142
Title: A noble hobby - Standby
TimeLimit: 4h
- Id: 18143
Title: For Safe Work
Targets:
- Mob: EP19_LIMACINA
Count: 20
- Mob: EP19_CALMARING
Count: 20
- Id: 18144
Title: For Safe Work - Standby
TimeLimit: 4h
- Id: 19001
Title: The earth where the flowers have blossomed - Waiting
TimeLimit: 4h

View File

@ -7535,7 +7535,7 @@ Body:
TargetTrap: true
Range: 9
Hit: Multi_Hit
HitCount: -5
HitCount: 5
Element: Weapon
CopyFlags:
Skill:
@ -15918,6 +15918,15 @@ Body:
- Level: 5
Time: 350000
FixedCastTime: 1000
- Id: 578
Name: DE_BERSERKAIZER # TODO: effect? The skill is only used to display a visual effect for now
Description: Berserkaizer
MaxLevel: 1
TargetType: Self
DamageFlags:
NoDamage: true
HitCount: 1
Duration1: -1
- Id: 653
Name: NPC_EARTHQUAKE
Description: Earthquake
@ -43106,6 +43115,7 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Hit: Single
AfterCastWalkDelay: 1000
Cooldown: 1000
Requires:
@ -43117,6 +43127,7 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Hit: Single
AfterCastWalkDelay: 1000
Duration1:
- Level: 1
@ -43147,6 +43158,8 @@ Body:
Name: HAMI_SKIN
Description: Adamantium Skin
MaxLevel: 5
DamageFlags:
NoDamage: true
- Id: 8008
Name: HAMI_BLOODLUST
Description: Bloodlust
@ -43154,6 +43167,7 @@ Body:
TargetType: Self
DamageFlags:
NoDamage: true
Hit: Single
AfterCastWalkDelay: 1000
Duration1:
- Level: 1

View File

@ -612,48 +612,3 @@ Body:
- Level: 260
Points: 4099
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,7 +1822,6 @@ Body:
Icon: EFST_ETERNALCHAOS
DurationLookup: BD_ETERNALCHAOS
CalcFlags:
Def: true
Def2: true
Flags:
NoDispell: true
@ -2619,9 +2618,6 @@ Body:
CalcFlags:
Batk: true
Watk: true
Flags:
NoSave: true
RemoveFromHomOnMapWarp: true
- Status: Fleet
DurationLookup: HFLI_FLEET
CalcFlags:
@ -2635,11 +2631,7 @@ Body:
- Status: Defence
DurationLookup: HAMI_DEFENCE
CalcFlags:
Def: true
Vit: true
Flags:
NoSave: true
RemoveFromHomOnMapWarp: true
- Status: Incaspdrate
CalcFlags:
Aspd: true
@ -4138,7 +4130,7 @@ Body:
Unlimitedhummingvoice: true
Sircleofnature: true
- Status: Deepsleep
Icon: EFST_DEEP_SLEEP
Icon: EFST_HANDICAPSTATE_DEEP_SLEEP
DurationLookup: WM_LULLABY_DEEPSLEEP
States:
NoCast: true
@ -7022,9 +7014,7 @@ Body:
CalcFlags:
Regen: true
- Status: Earthshaker
Icon: EFST_EARTHSHAKER
Flags:
BlEffect: true
NoWarning: true
- Status: Weaponblock_On
Icon: EFST_WEAPONBLOCK_ON
@ -7039,7 +7029,6 @@ Body:
Icon: EFST_SPORE_EXPLOSION_DEBUFF
DurationLookup: GN_SPORE_EXPLOSION
Flags:
BlEffect: true
NoDispell: true
NoBanishingBuster: true
NoClearance: true
@ -7461,7 +7450,7 @@ Body:
NoClearance: true
NoClearbuff: true
- Status: Madogear
Icon: EFST_MADOGEAR_TYPE
Icon: EFST_MADOGEAR
CalcFlags:
Speed: true
Flags:
@ -7975,8 +7964,6 @@ Body:
DurationLookup: EM_SPELL_ENCHANTING
CalcFlags:
Smatk: true
Flags:
DisplayPc: true
- Status: Summon_Elemental_Ardor
Icon: EFST_SUMMON_ELEMENTAL_ARDOR
DurationLookup: EM_SUMMON_ELEMENTAL_ARDOR
@ -8028,23 +8015,17 @@ Body:
DurationLookup: TR_MUSICAL_INTERLUDE
CalcFlags:
Res: true
Flags:
DisplayPc: true
- Status: Jawaii_Serenade
Icon: EFST_JAWAII_SERENADE
DurationLookup: TR_JAWAII_SERENADE
CalcFlags:
Smatk: true
Speed: true
Flags:
DisplayPc: true
- Status: Pron_March
Icon: EFST_PRON_MARCH
DurationLookup: TR_PRON_MARCH
CalcFlags:
Patk: true
Flags:
DisplayPc: true
- Status: Roseblossom
Icon: EFST_ROSEBLOSSOM
DurationLookup: TR_ROSEBLOSSOM
@ -8058,8 +8039,6 @@ Body:
Powerful_Faith: true
Firm_Faith: true
Sincere_Faith: true
Flags:
DisplayPc: true
- Status: Sincere_Faith
Icon: EFST_SINCERE_FAITH
DurationLookup: IQ_SINCERE_FAITH

View File

@ -1250,11 +1250,6 @@ 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 |
==============================

View File

@ -118,8 +118,24 @@ is disabled in '/conf/battle/items.conf'.
*nomvploot
Disables normal monsters and MVPs from dropping items on a map. Looted items will always drop.
'nomobloot' prevents monsters and MVPs from dropping items from the 'Drops' table.
'nomvploot' prevents MVPs from giving MVP prize items from the 'MvpDrops' table.
'noloot' is the same as 'nomobloot' and 'nomvploot' combined.
---------------------------------------
*nolootnormalmob
Disables normal monsters type (only) from dropping items on a map. Looted items will always drop.
---------------------------------------
*no_npc_selfdestruction_on_all
A quick mapflag to change the behaviour of the NPC_SELFDESTRUCTION skill.
When defined, the skill always and only hits enemy type instead of all units.
---------------------------------------
*noexp

View File

@ -1012,12 +1012,9 @@ SC_CHANGE (EFST_HLIF_CHANGE)
val2: VIT increase (20 * val1)
val3: INT increase (30 * val1)
SC_BLOODLUST (EFST_HAMI_BLOODLUST)
desc: Increase the homunculus ATK and has a chance to leech HP from the target
val1: Skill Level
val2: ATK increase (20 + (10 * val1))
val3: Chance to leech HP (9 * val1)%
val4: Leeched HP percentage 20%
SC_BLOODLUST ()
desc:
val1:
SC_FLEET ()
desc:
@ -1027,10 +1024,10 @@ SC_SPEED ()
desc:
val1:
SC_DEFENCE (EFST_HAMI_DEFENCE)
desc: Increase VIT and as result VIT-based DEF of the Player and plain VIT of the Homunculus
val1: Skill Level
val2: VIT increase for players, DEF increase for homunculus (5 + (5 * val1)) [Renewal], (2 * val1) [Pre-Renewal]
SC_DEFENCE ()
desc: Increase Defense, HAMI_DEFENCE effect
val1: (none)
val2: + Def(Pre-renewal) or VIT (Renewal)
SC_INCASPDRATE ()
desc: Increase ASPD

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,489 @@
//===== rAthena Script =======================================
//= 2 Instances:
// - Bagot Laboratory
// - Simulation Battle
//===== Description: =========================================
//- [Walkthrough conversion]
//- Instance of episode 19 (same map).
//===== Changelogs: ==========================================
//= 1.0 First version. [Atemo]
//============================================================
// Bagot Laboratory
// ------------------------------
// Main Quest: Step 58
jor_dun03,57,63,3 script(CLOAKED) Juncea#ep19re2 4_EP19_JUNCEA,{
if (ep19_main == 49) { // Step 58
cutin "ep19_juncea04.png",2;
mes "[Juncea]";
mes "Oh, I want to talk to you alone. Are you okay?";
next;
cutin "",255;
mes "- ^0000ffLet's have a party of 1 and listen to Juncea's story.^000000 -";
erasequest 16659;
setquest 16660;
ep19_main = 50;
close;
}
if (ep19_main == 50) {
if (is_party_leader() == false) {
mes "[Juncea]";
mes "I can only open the secret passage for party leaders. Please have your party leader talk to me.";
close;
}
.@md_name$ = "Bagot Laboratory";
switch( select( "Prepare to enter " + .@md_name$, "Enter " + .@md_name$ ) ) {
case 1:
if (is_party_leader() == false) {
mes "[Juncea]";
mes "I can only open the secret passage for party leaders. Please have your party leader talk to me.";
close;
}
mes "- ^0000ffPreparation for entry has started. After you are ready, press the button to enter " + .@md_name$ + ".^000000 -";
instance_create(.@md_name$);
close;
case 2:
if (is_party_leader() == false) {
mes "[Juncea]";
mes "I can only open the secret passage for party leaders. Please have your party leader talk to me.";
close;
}
switch( instance_enter(.@md_name$) ) {
case IE_OTHER:
mes "An unknown error occurred.";
close;
case IE_NOINSTANCE:
mes "- ^0000ffMemorial dungeon not created. Please check again.^000000 -";
close;
case IE_NOMEMBER:
mes "[Juncea]";
mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000";
close;
case IE_OK:
// warp "1@jorlab",57,45;
end;
}
end;
}
end;
}
end;
OnInit:
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(16659) == 1" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(16660) == 1" );
end;
}
1@jorlab,1,1,0 script #jorlab_main -1,{
end;
OnInstanceInit:
'map_jorlab$ = instance_mapname("1@jorlab");
'event = 0;
.@md_name$ = "Bagot Laboratory";
disablenpc instance_npcname("Juncea#ep19re4");
if (instance_live_info(ILI_NAME) == .@md_name$) // MD "Bagot Laboratory"
disablenpc instance_npcname("Summon Device#ep19re1");
else { // MD "Simulation"
disablenpc instance_npcname("#jorlab_hw1");
disablenpc instance_npcname("Juncea#ep19re3");
}
end;
}
1@jorlab,58,45,0 script #jorlab_hw1 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
disablenpc();
if (ep19_main == 50) {
if ('event != 0)
end;
if (is_party_leader() == false)
end;
enablenpc instance_npcname("Juncea#ep19re3");
end;
}
end;
}
// Main Quest: Step 59
1@jorlab,58,67,3 script Juncea#ep19re3 4_EP19_JUNCEA,{
if (ep19_main != 50)
end;
if (is_party_leader() == false)
end;
.@npc_name$ = instance_npcname("Juncea#ep19re3");
if ('event == 0) {
cutin "ep19_juncea04.png",2;
mes "[Juncea]";
mes "Oh, I'm here. Welcome.";
next;
cutin "",255;
mes "[" + strcharinfo(0) + "]";
mes "Why do you want it to be just the two of us?";
mes "Although, I had some questions for you too.";
next;
cutin "ep19_juncea04.png",2;
mes "[Juncea]";
mes "Oh, I thought so.";
mes "But listen to me first.";
next;
mes "[Juncea]";
mes "You are in a lot of trouble.";
mes "It must be hard to be someone you're not.";
next;
cutin "",255;
mes "[" + strcharinfo(0) + "]";
mes "What do you mean? What's wrong? You're a bit strange. You scare me.";
next;
cutin "ep19_juncea04.png",2;
mes "[Juncea]";
mes "What are you afraid of? You've done a good job of pretending to be friendly so far. Why are you suddenly acting scared again?";
next;
cutin "",255;
mes "[" + strcharinfo(0) + "]";
mes "I didn't pretend to be friendly. I really want to become friends with you.";
next;
cutin "ep19_juncea04.png",2;
mes "[Juncea]";
mes "Whoa, that's why you were so hard on me to gossip about Bagot? It's a good way, it's a good way.";
mes "There is no faster way to make friends than to curse the same person.";
next;
mes "[Juncea]";
mes "However, you chose the wrong opponent. Idiot.";
next;
mes "[Juncea]";
mes "The great... Bagot, do you think you will... fall for such a shallow... masterpiece?";
next;
cutin "",255;
mes "[" + strcharinfo(0) + "]";
mes "Are you the great Bagot?";
next;
cutin "ep19_juncea04.png",2;
mes "[Juncea]";
mes "Yeah... It's already reading your thoughts...";
next;
mes "[Juncea]";
mes "You know... you're trying to... use me.";
next;
mes "[Juncea]";
mes "So I...";
next;
mes "[Juncea]";
mes "I am... Who am I? This is...";
next;
cutin "",255;
mes "[" + strcharinfo(0) + "]";
mes "(Juncea is weird..., did Bagot do something?)";
next;
cutin "ep19_juncea04.png",2;
mes "[Juncea]";
mes "Even if I jumped... you're already in Bagot's palm.";
next;
cutin "ep19_juncea00.png",1;
setnpcdisplay( .@npc_name$, 4_EP19_JUNCEA_M );
mes "[Juncea]";
mes "Here... I'll take care of it...!";
next;
cutin "",255;
mes "[" + strcharinfo(0) + "]";
mes "(...I don't have time to ask anyone for help! I have to do that myself!)";
if ('event == 0)
'event = 1;
close;
}
if ('event == 1) {
cutin "ep19_juncea04.png",2;
setnpcdisplay( .@npc_name$, 4_EP19_JUNCEA );
mes "[Juncea]";
mes "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!";
next;
cutin "ep19_juncea00.png",1;
sleep2 500;
setnpcdisplay( .@npc_name$, 4_EP19_JUNCEA_M );
mes "[Juncea]";
mes "Everything is... Bagot's... Meaning...!";
next;
cutin "ep19_juncea04.png",2;
sleep2 500;
setnpcdisplay( .@npc_name$, 4_EP19_JUNCEA );
mes "[Juncea]";
mes "Aaaaaaah!";
setnpcdisplay( .@npc_name$, 4_EP19_JUNCEA_M );
setnpcdisplay( .@npc_name$, 4_EP19_JUNCEA );
setnpcdisplay( .@npc_name$, 4_EP19_JUNCEA_M );
sleep2 500;
setnpcdisplay( .@npc_name$, 4_EP19_JUNCEA );
next;
cutin "ep19_juncea00.png",1;
sleep2 500;
setnpcdisplay( .@npc_name$, 4_EP19_JUNCEA_M );
mes "[Juncea]";
mes "As intended... I will punish you!";
close2;
cutin "",255;
if ('event != 1)
end;
'event = 2;
disablenpc();
donpcevent instance_npcname("jorlab_boss") + "::OnStart";
end;
}
end;
}
1@jorlab,1,1,0 script jorlab_boss -1,{
end;
OnStart:
sleep 500;
monster 'map_jorlab$,58,67,"--ja--",21532,1, instance_npcname("jorlab_boss") + "::OnMobDead"; // EP19_MD_JUNCEA
end;
OnMobDead:
if ('event != 2)
end;
'event = 3;
enablenpc instance_npcname("Juncea#ep19re4");
end;
}
// Main Quest: Step 60
1@jorlab,58,67,3 script Juncea#ep19re4 4_EP19_JUNCEA_D,{
if (ep19_main != 50) {
warp "icecastle",27,123;
end;
}
if ('event != 3)
end;
if (is_party_leader() == false)
end;
mes "[" + strcharinfo(0) + "]";
mes "(Barely subdued. Juncea lost her mind...)";
next;
mes "[" + strcharinfo(0) + "]";
mes "(Bagot... What did you do to Juncea? You've turned her into a monster right?)";
next;
mes "[" + strcharinfo(0) + "]";
mes "(If everything went according to plan, we should have persuaded her and taken her out, but we should have taken her out even in this condition.)";
mapannounce 'map_jorlab$, "Bagot: Oh, it was not enough to use Juncea as a vessel.", bc_map, 0xFFFF;
next;
mes "[" + strcharinfo(0) + "]";
mes "(I used the Ragan Transformation Scroll on Juncea as I had planned...)";
mapannounce 'map_jorlab$, "Bagot: This time, my prediction was wrong.", bc_map, 0xFFFF;
next;
setnpcdisplay( instance_npcname("Juncea#ep19re4"), 4_EP19_RGAN_R1 );
mes "[" + strcharinfo(0) + "]";
mes "(For now, let's take her back to the village.)";
mapannounce 'map_jorlab$, "Bagot: By the way, there were scrolls like that... I knew they were cheating, but the existence of such a thing is interesting.", bc_map, 0xFFFF;
next;
mes "[" + strcharinfo(0) + "]";
mes "(I think I heard something... I must have heard it wrong?)";
mapannounce 'map_jorlab$, "Bagot: Whoops.", bc_map, 0xFFFF;
erasequest 16660;
setquest 16661;
ep19_main = 51;
close2;
warp "icecastle",27,123;
end;
OnInstanceInit:
questinfo( QTYPE_QUEST, QMARK_NONE, "checkquest(16660,HUNTING) == 2" );
end;
}
// Simulation Battle
// ------------------------------
jor_nest,66,260,3 script Arolong#ep19re2 4_EP19_IWIN,{
if (ep19_main < 100)
end;
if (checkweight(1000811,1) == 0) {
mes "[Arolong]";
mes "- Your bag is full. Please check the weight and quantity of items you have and then talk to us again. -";
close;
}
switch( checkquest(16663,PLAYTIME) ) {
case -1:
break;
case 0:
case 1:
mes "[Arolong]";
mes "Today's challenge is over.";
mes "If you come back tomorrow, please let me in.";
next;
mes "[Arolong]";
mes "Okay?";
mes "Have a good rest, see you again tomorrow.";
close;
case 2:
erasequest 16663;
break;
}
if (checkquest(16662,HUNTING) == 2) {
mes "[Arolong]";
mes "Societyless Simulation with Juncea";
mes "Did you win a fight and come back?";
next;
mes "[Arolong]";
mes "Child, it's okay if you don't answer.";
mes "I've seen it all here.";
next;
mes "[Arolong]";
mes "Well done.";
mes "It's a great win and come back.";
next;
mes "[Arolong]";
mes "The data are paired, so our researchers also";
mes "Your calf.";
mes "Then, please accept the promised reward.";
next;
mes "[Arolong]";
mes "Have a good rest, see you again tomorrow.";
mes "I'll try again tomorrow.";
close2;
erasequest 16662;
setquest 16663;
getitem 1000811,1; // Snow_F_Ore
// todo
end;
}
// Note: Player can re-enter / re-create an instance until the boss is defeated
cutin "ep19_iwin01.png",2;
mes "[Arolong]";
mes "The battle with Juncea wasn't thrilling, wasn't it?";
mes "You want to fight again, don't you think?";
next;
cutin "",255;
if (select( "Lift", "Don't lift" ) == 2) {
cutin "ep19_iwin01.png",2;
mes "[Arolong]";
mes "Is that so?";
mes "I'm sorry.";
close3;
}
cutin "ep19_iwin01.png",2;
mes "[Arolong]";
mes "It was prepared for such an adventurer.";
mes "Exciting simulation battles with simulation data Juncea.";
next;
mes "[Arolong]";
mes "I prepared it at the Ice Castle, so it's safe.";
mes "Defeat " + getmonsterinfo("EP19_MD_JUNCEA_S", MOB_NAME) + " once a day.";
next;
mes "[Arolong]";
mes "But you can try again and again until you defeat it.";
mes "Would you like to try it?";
next;
.@md_name$ = "Simulation Battle";
if (is_party_leader() == true)
.@menu$ = "Prepare to enter Bagot's lab";
cutin "",255;
switch( select( .@menu$, "Enter Bagot's Lab", "Do not challenge" ) ) {
case 1:
mes "- ^0000ff Preparation for entry has started. After you are ready, press the button to enter the lab in Bagot.^000000 -";
instance_create(.@md_name$);
close;
case 2:
switch( instance_enter(.@md_name$) ) {
case IE_OTHER:
mes "An unknown error occurred.";
close;
case IE_NOINSTANCE:
mes "- ^0000ff Memorial dungeon not created. Please check again.^000000 -";
close;
case IE_NOMEMBER:
mes "[Juncea]";
mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000";
close;
case IE_OK:
if (isbegin_quest(16662) == 0)
setquest 16662;
// warp "1@jorlab",57,45;
end;
}
end;
case 3:
cutin "ep19_iwin01.png",2;
mes "[Arolong]";
mes "Heh, what a boring adventure.";
close3;
}
end;
OnInit:
cloakonnpc();
questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "ep19_main >= 100 && checkquest(16662,HUNTING) != 2 && checkquest(16663,PLAYTIME) == -1" );
questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(16663,PLAYTIME) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(16662,HUNTING) == 2" );
end;
}
1@jorlab,58,67,3 script Summon Device#ep19re1 PORTAL,{
if ('event == 2) {
mes "[Summon Device]";
mes "Battle complete, save data.";
mes "Press the Yes button to exit the lab";
mes "Please press";
next;
if (select( "Yes", "No" ) == 2) {
mes "[Summon Device]";
mes "Exit.";
close;
}
mes "[Summon Device]";
mes "3, 2, 1. Ready to move.";
close2;
warp "jor_nest",63,257;
end;
}
if (is_party_leader() == false || 'event != 0) {
mes "[Summon Device]";
mes "- I am talking with another party member. Please listen together for a moment. -";
mes "- If the conversation ended due to an error, you will be able to talk 5 minutes after the conversation starts. -";
close;
}
mes "[Summon Device]";
mes "Start a simulation battle.";
mes "When you are ready, click the Yes button.";
next;
mes "[Summon Device]";
mes "Are you ready?";
next;
if (select( "Yes", "No" ) == 2) {
mes "[Summon Device]";
mes "Exit.";
close;
}
mes "[Summon Device]";
mes "Summon " + getmonsterinfo("EP19_MD_JUNCEA_S", MOB_NAME) + ".";
mes "3, 2, 1. Ready to summon.";
close2;
if ('event == 0) {
'event = 1;
disablenpc();
donpcevent instance_npcname("ep19_simulation_battle") + "::OnStart";
}
end;
}
1@jorlab,1,1,0 script ep19_simulation_battle -1,{
end;
OnStart:
monster 'map_jorlab$,58,67,"--ja--","EP19_MD_JUNCEA_S",1, instance_npcname("ep19_simulation_battle") + "::OnBossDead";
end;
OnBossDead:
if ('event != 1)
end;
'event = 2;
enablenpc instance_npcname("Summon Device#ep19re1");
end;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -61,3 +61,4 @@ Footer:
- Path: npc/re/merchants/barters/quests_exp_175.yml
- Path: npc/re/merchants/barters/mysterious_cookie_shop.yml
- Path: npc/re/merchants/barters/quests_18.yml
- Path: npc/re/merchants/barters/quests_19.yml

View File

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

View File

@ -0,0 +1,289 @@
# This file is a part of rAthena.
# Copyright(C) 2022 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###########################################################################
# Barter Database
###########################################################################
#
# Barter Settings
#
###########################################################################
# - Name NPC name.
# Map Map name. (Default: not on a map)
# X Map x coordinate. (Default: 0)
# Y Map y coordinate. (Default: 0)
# Direction Direction the NPC is looking. (Default: North)
# Sprite Sprite name of the NPC. (Default: FakeNpc)
# Items: List of sold items.
# - Index Index of the item inside the shop. (0-...)
# Maximum index depends on client.
# Item Aegis name of the item.
# Stock Amount of item in stock. 0 means unlimited. (Default: 0)
# Zeny Cost of them item in Zeny. (Default: 0)
# RequiredItems: List of required items (Optional)
# - Index Index of the required item. (0-4)
# Item Aegis name of required item.
# Amount Amount of required item. (Default: 1)
# Refine Refine level of required item. (Default: 0)
###########################################################################
Header:
Type: BARTER_DB
Version: 1
Body:
- Name: barter_Ep19_Rgan_Scroll
Items:
- Index: 0
Item: Ep19_Rgan_Scroll
Zeny: 2000
RequiredItems:
- Index: 0
Item: Ep19_Rgan_Core_F
Amount: 2
- Name: barter_ep19_snow_stone
Items:
- Index: 0
Item: Snow_F_Stone1
RequiredItems:
- Index: 0
Item: Snow_F_Ore
Amount: 5
- Index: 1
Item: Snow_F_Stone2
RequiredItems:
- Index: 0
Item: Snow_F_Stone1
Amount: 5
- Index: 2
Item: Snow_F_Stone3
RequiredItems:
- Index: 0
Item: Snow_F_Stone2
Amount: 5
- Name: barter_ep19_repu_1
Items:
- Index: 0
Item: Snow_F_Refine
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 200
- Index: 1
Item: Glacier_W_Refine
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 500
- Index: 2
Item: Teleport_Ep19_01
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
- Name: barter_ep19_repu_2
Items:
- Index: 0
Item: Snow_F_Refine
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 200
- Index: 1
Item: Glacier_W_Refine
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 500
- Index: 2
Item: Teleport_Ep19_01
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
- Index: 3
Item: Ep19_Dry_Icegangu
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
- Index: 4
Item: C_Ep19_Rgan
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 1000
- Index: 5
Item: C_Ep19_Iwin
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 1000
- Name: barter_ep19_snow_armor
Items:
- Index: 0
Item: Snowflower_Armor
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Index: 1
Item: Snowflower_Robe
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Index: 2
Item: Snowflower_Manteau
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Index: 3
Item: Snowflower_Muffler
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Index: 4
Item: Snowflower_Boots
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Index: 5
Item: Snowflower_Shoes
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Index: 6
Item: Snowflower_Pendant
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Index: 7
Item: Snowflower_Ring
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Index: 8
Item: Snowflower_Necklace
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Index: 9
Item: Snowflower_Earring
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 100
- Name: barter_ep19_new_content
Items:
- Index: 0
Item: EP19_N_P_Ore
RequiredItems:
- Index: 0
Item: EP19_D_P_Ore
Amount: 3
- Index: 1
Item: Ep19_Snow_Flower
Amount: 5
- Index: 2
Item: Ep18_Amethyst_Fragment
Amount: 25
- Index: 1
Item: EP19_D_P_Crystal
RequiredItems:
- Index: 0
Item: EP19_D_P_Ore
Amount: 15
- Index: 1
Item: Ep19_Snow_Flower
Amount: 30
- Index: 2
Item: Ep18_Amethyst_Fragment
Amount: 150
- Index: 2
Item: EP19_N_P_Crystal
RequiredItems:
- Index: 0
Item: EP19_N_P_Ore
Amount: 5
- Index: 1
Item: Ep19_Snow_Flower
Amount: 5
- Index: 2
Item: Ep18_Amethyst_Fragment
Amount: 25
- Index: 3
Item: EP19_S_F_1_Extract
RequiredItems:
- Index: 0
Item: Snow_F_Stone1
Amount: 20
- Index: 1
Item: Ep19_Snow_Flower
Amount: 5
- Index: 2
Item: Ep18_Amethyst_Fragment
Amount: 25
- Index: 4
Item: EP19_S_F_2_Extract
RequiredItems:
- Index: 0
Item: Snow_F_Stone2
Amount: 15
- Index: 1
Item: Ep19_Snow_Flower
Amount: 10
- Index: 2
Item: Ep18_Amethyst_Fragment
Amount: 50
- Index: 5
Item: EP19_S_F_3_Extract
RequiredItems:
- Index: 0
Item: Snow_F_Stone3
Amount: 10
- Index: 1
Item: Ep19_Snow_Flower
Amount: 15
- Index: 2
Item: Ep18_Amethyst_Fragment
Amount: 75
- Index: 6
Item: EP19_Gla_Extract
RequiredItems:
- Index: 0
Item: Ep19_Snow_Flower
Amount: 40
- Index: 1
Item: Ep18_Amethyst_Fragment
Amount: 200
- Index: 7
Item: EP19_DGW_Refine
RequiredItems:
- Index: 0
Item: EP19_D_P_Stone
Amount: 1
- Index: 1
Item: EP19_D_P_Crystal
Amount: 10
- Index: 2
Item: EP19_N_P_Crystal
Amount: 10

View File

@ -0,0 +1,97 @@
//===== rAthena Script =======================================
//= Episode 19 NPCs.
//===== Description: =========================================
//- [Walkthrough conversion]
//- Related to new content.
//===== Changelogs: ==========================================
//= 1.0 First version. [Capuche]
//============================================================
icas_in,192,57,3 script Incineration Furnace#ep19 4_POINT_RED,{
mes "There is a brazier where you can feel the heat.";
mes "If you have useless Dim Glacier weapons, put them in and melt them.";
close2;
laphine_synthesis("Dim Glacier Extractor");
end;
}
icas_in,188,60,3 script Forr#ep19 4_EP19_IWIN,{
cutin "ep19_iwin11.png",2;
mes "[Forr]";
mes "Did you know that weapons are being found in recently abandoned pits and the like?";
mes "It is called Dim Glacier because it is an object imbued with unusual magical powers.";
next;
mes "[Forr]";
mes "I've done some research with Vellgunde, and I've found that it has the magical powers of mutated Jormungand.";
mes "If you have Dim Glacier, try adjusting your magic to increase the weapon's performance.";
next;
mes "[Forr]";
mes "I need some tricky refining materials, but how about exchanging them appropriately for what I'm lacking?";
next;
switch( select( "Exchange materials.", "Awaken Dim Glacier's potential.", "What do you do with unnecessary weapons?", "Okay." ) ) {
case 1:
mes "[Forr]";
mes "The amethyst shards brought by Maram helped make various containers.";
mes "It's something you can't get here, so you might ask for it often.";
close2;
cutin "",255;
callshop "barter_ep19_new_content";
end;
case 2:
mes "[Forr]";
mes "I wish you good luck";
close2;
cutin "",255;
item_enchant(47);
end;
case 3:
mes "[Forr]";
mes "Can you see the brazier down there?";
mes "I made it for the incineration of useless things that have been researched.";
next;
mes "[Forr]";
mes "If you're going to throw it away, use that incinerator.";
mes "Dim Glacier has magical powers, so if you melt it, whatever comes out will come out.";
close3;
case 4:
mes "[Forr]";
mes "I will stay for a while to help Vellgunde-sama.";
mes "Come to me anytime.";
close3;
}
}
// Storage
icas_in,169,70,3 script Card#ep19 4_POINT_BLUE,{
.@total_storage = 1; // by default rAthena just open the basic storage (but 3 on kRO)
cutin "ep19_iwin02.png",2;
mes "[Hoyoyo]";
mes "Are you going to use the closet?";
mes "Hyo, hy, hyo, put in a coin from the continent.";
mes "Hey... Would you like to put 500zeny in it?";
next;
cutin "",255;
for ( .@i = 0; .@i < .@total_storage; .@i++ )
.@menu$ += "Storage " + (.@i+1) + ":";
.@menu$ += "Stop.";
.@s = select( .@menu$ ) - 2;
if (.@s == (.@total_storage - 1)) {
mes "I decided to use it next time.";
close;
}
if (Zeny < 500) {
mes "Looks like you have to put 500 zeny to use the closet.";
close3;
}
mes "When a coin was inserted, the cabinet opened with a rattling sound.";
close2;
Zeny -= 500;
if (.@s == -1) // basic storage
openstorage;
else // "premium" storage starting from index 0
openstorage2 .@s, STOR_MODE_GET|STOR_MODE_PUT; // note: opened before close button
end;
}

View File

@ -0,0 +1,19 @@
//===== rAthena Script =======================================
//= jor_ab Monsters Spawn Script
//===== Current Version: =====================================
//= 1.0
//===== Additional Comments: =================================
//= 1.0 First version. [Atemo]
//============================================================
jor_ab01 monster --ja-- 21538,65
jor_ab01 monster --ja-- 21540,65
jor_ab01 monster --ja-- 21541,35
jor_ab01 monster --ja-- 21543,35
jor_ab01 monster --ja-- 21600,10
jor_ab02 monster --ja-- 21539,55
jor_ab02 monster --ja-- 21542,55
jor_ab02 monster --ja-- 21544,40
jor_ab02 monster --ja-- 21545,40
jor_ab02 monster --ja-- 21601,10

View File

@ -0,0 +1,20 @@
//===== rAthena Script =======================================
//= jor_dun Monsters Spawn Script
//===== Current Version: =====================================
//= 1.0
//===== Additional Comments: =================================
//= 1.0 First version. [Atemo]
//============================================================
jor_dun01 monster --ja-- 21526,80
jor_dun01 monster --ja-- 21527,50
jor_dun01 monster --ja-- 21528,20
jor_dun01 monster --ja-- 21599,10
jor_dun02 monster --ja-- 21527,60
jor_dun02 monster --ja-- 21528,50
jor_dun02 monster --ja-- 21529,15
jor_dun02 monster --ja-- 21599,10
jor_que monster --ja-- 21534,3
jor_que monster --ja-- 21535,5

View File

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

View File

@ -0,0 +1,24 @@
//===== rAthena Script =======================================
//= jor_back Monsters Spawn Script
//===== Current Version: =====================================
//= 1.0
//===== Additional Comments: =================================
//= 1.0 First version. [Atemo]
//============================================================
jor_back1 monster --ja-- 21524,60
jor_back1 monster --ja-- 21525,60
jor_back1 monster --ja-- 21523,80
jor_back2 monster --ja-- 21521,70
jor_back2 monster --ja-- 21525,25
jor_back2 monster --ja-- 21523,35
jor_back2 monster --ja-- 21520,70
jor_back3 monster --ja-- 21526,30
jor_back3 monster --ja-- 21527,15
jor_back3 monster --ja-- 21525,20
jor_back3 monster --ja-- 21522,70
jor_back3 monster --ja-- 21520,70
// unknown delay
jor_back3 boss_monster --ja-- 21537,1,7200000,600000,1

View File

@ -66,3 +66,22 @@ function script F_queststatus {
}
end;
}
// Return a value referring to the state of the quests in range.
// -1 : at least on of the quest doesn't have the same state
// 0 : all the quests are in the state 0 (not in quest log)
// 1 : all the quests are in the state 1 (given)
// 2 : all the quests are in the state 2 (completed)
function script F_queststatus_between {
.@start = getarg(0);
.@end = getarg(1);
.@state = isbegin_quest(.@start);
for ( .@i = .@start+1; .@i <= .@end; ++.@i ) {
if (isbegin_quest(.@i) != .@state) {
.@state = -1;
break;
}
}
return .@state;
}

View File

@ -12253,24 +12253,18 @@ rachel,70,135,4 script(CLOAKED) Mejai#E18_7 4_M_DST_CHILD,{
mes "Grand opening over! Shall we now put our hearts into our work?";
next;
}
switch( checkquest(5937,PLAYTIME) ) {
case -1:
break;
case 0:
case 1:
setpcblock PCBLOCK_NPC, true;
if (checkquest(5937,PLAYTIME) != 2)
npctalk "Mejai: Hello. Let's do our best today too.", "Mejai#E18_7", bc_self;
else {
npctalk "Mejai: Come on! Today's work is done.", "Mejai#E18_7", bc_self;
sleep2 1000;
setpcblock PCBLOCK_NPC, false;
npctalk "Mejai: Go home and be faithful to your family. It's not like this is the only thing you have to do.", "Mejai#E18_7", bc_self;
end;
case 2:
setpcblock PCBLOCK_NPC, true;
npctalk "Mejai: Hello. Let's do our best today too.", "Mejai#E18_7", bc_self;
}
sleep2 1000;
setpcblock PCBLOCK_NPC, false;
break;
}
switch( select( "I'm currently busy..", "Harvesting Half Flowers", "Delivering Half Flowers" ) ) {
case 1:
npctalk "Mejai: It seems you're busy with something? Please come see me when you're free.", "Mejai#E18_7", bc_self;
@ -13018,7 +13012,7 @@ wolfvill,164,137,3 script Emmet#emet 4_EP18_GW_WOMAN01,{
mes "I mean, the Amethyst Fragment.";
mes "Please select the part you want to enchant.";
next;
switch( select( "Armor", "Garment", "Shoes", "Right(R) Accessory", "Left(L) Accessory" ) ) {
switch( select( "Armor", "Coat", "Shoes", "Right(R) Accessory", "Left(L) Accessory" ) ) {
case 1:
mes "[Emmet]";
mes "You're enchanting the armor, I see.";
@ -13027,7 +13021,7 @@ wolfvill,164,137,3 script Emmet#emet 4_EP18_GW_WOMAN01,{
end;
case 2:
mes "[Emmet]";
mes "You're enchanting the garment, I see.";
mes "You're enchanting the footwear, I see.";
close2;
item_enchant(2);
end;

17224
npc/re/quests/quests_19.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@ -63,11 +63,14 @@ npc: npc/re/guides/guides_woe_te.txt
// ------------------------ Instances ---------------------------
npc: npc/re/instances/AirshipAssault.txt
npc: npc/re/instances/AirshipDestruction.txt
npc: npc/re/instances/BaggotLaboratory.txt
npc: npc/re/instances/BakonawaLake.txt
npc: npc/re/instances/BangungotHospital.txt
npc: npc/re/instances/BuwayaCave.txt
npc: npc/re/instances/CentralLaboratory.txt
npc: npc/re/instances/CharlestonCrisis.txt
npc: npc/re/instances/ConfusedSnakesNest.txt
npc: npc/re/instances/CorOperation.txt
npc: npc/re/instances/DevilTower.txt
npc: npc/re/instances/EclageInterior.txt
@ -81,6 +84,7 @@ npc: npc/re/instances/HeartHunterWarBase.txt
npc: npc/re/instances/HiddenGarden.txt
npc: npc/re/instances/InfiniteSpace.txt
npc: npc/re/instances/IsleOfBios.txt
npc: npc/re/instances/IwinPatrol.txt
npc: npc/re/instances/LastRoom.txt
npc: npc/re/instances/LostFarm.txt
npc: npc/re/instances/MalangdoCulvert.txt
@ -143,6 +147,7 @@ npc: npc/re/merchants/enchan_rockridge.txt
npc: npc/re/merchants/enchan_sage_legacy_17_2.txt
npc: npc/re/merchants/enchan_verus.txt
npc: npc/re/merchants/enchantgrade.txt
npc: npc/re/merchants/episode_19.txt
npc: npc/re/merchants/Extended_Ammunition.txt
npc: npc/re/merchants/Extended_Stylist.txt
npc: npc/re/merchants/flute.txt
@ -243,6 +248,7 @@ npc: npc/re/quests/quests_illusion_dungeons.txt
npc: npc/re/quests/quests_17_1.txt
npc: npc/re/quests/quests_17_2.txt
npc: npc/re/quests/quests_18.txt
npc: npc/re/quests/quests_19.txt
npc: npc/re/quests/quests_aldebaran.txt
npc: npc/re/quests/quests_dewata.txt
npc: npc/re/quests/quests_dicastes.txt

View File

@ -39,6 +39,8 @@ npc: npc/re/mobs/dungeons/gon_dun.txt
npc: npc/re/mobs/dungeons/ice_dun.txt
npc: npc/re/mobs/dungeons/in_sphinx.txt
npc: npc/re/mobs/dungeons/iz_dun.txt
npc: npc/re/mobs/dungeons/jor_ab.txt
npc: npc/re/mobs/dungeons/jor_dun.txt
npc: npc/re/mobs/dungeons/juperos.txt
npc: npc/re/mobs/dungeons/kh_dun.txt
npc: npc/re/mobs/dungeons/lhz_dun.txt
@ -89,6 +91,7 @@ npc: npc/re/mobs/fields/geffen.txt
npc: npc/re/mobs/fields/gonryun.txt
npc: npc/re/mobs/fields/gw_fild.txt
npc: npc/re/mobs/fields/hugel.txt
npc: npc/re/mobs/fields/jor_back.txt
npc: npc/re/mobs/fields/lighthalzen.txt
npc: npc/re/mobs/fields/louyang.txt
npc: npc/re/mobs/fields/lutie.txt

View File

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

View File

@ -1 +0,0 @@
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;
}
//checking 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) ){
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes` FROM `%s` LIMIT 1;", schema_config.guild_expulsion_db) ){
Sql_ShowDebug(sql_handle);
return false;
}

View File

@ -309,10 +309,8 @@ 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 ) {
set_eof(fd);
return 1;
} else if (strnlen(sd->pincode, PINCODE_LENGTH) > 0) {
set_eof(fd);
return 1;
} else {
}
else {
char newpin[PINCODE_LENGTH+1];
memset(newpin,0,PINCODE_LENGTH+1);
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_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`,`char_id`) "
"VALUES ('%u','%u','%s','%s','%u')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes, e->char_id) )
if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`) "
"VALUES ('%d','%d','%s','%s')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes) )
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);
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) )
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) )
{
Sql_ShowDebug(sql_handle);
return nullptr;
@ -499,7 +499,6 @@ 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, 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, 3, &data, nullptr); e->char_id = strtoul(data, nullptr, 10);
}
//printf("- Read guild_skill %d from sql \n",guild_id);
@ -1344,7 +1343,6 @@ int mapif_parse_GuildLeave(int fd, int guild_id, uint32 account_id, uint32 char_
}
// Save the expulsion entry
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].mes, mes, 40);
}

View File

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

View File

@ -1150,51 +1150,6 @@ ACMD_FUNC(hide)
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
*------------------------------------------*/
@ -1286,7 +1241,7 @@ ACMD_FUNC(alive)
clif_displaymessage(fd, msg_txt(sd,667)); // You're not dead.
return -1;
}
clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4);
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
clif_displaymessage(fd, msg_txt(sd,16)); // You've been revived! It's a miracle!
return 0;
}
@ -1359,7 +1314,7 @@ ACMD_FUNC(heal)
if ( hp < 0 && sp <= 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.
return 0;
}
@ -1370,7 +1325,7 @@ ACMD_FUNC(heal)
status_heal(&sd->bl, hp, 0, 0);
else {
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);
}
}
@ -3592,7 +3547,7 @@ static void atcommand_raise_sub(map_session_data* sd) {
status_revive(&sd->bl, 100, 100);
clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4);
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
clif_displaymessage(sd->fd, msg_txt(sd,63)); // Mercy has been shown.
}
@ -3792,7 +3747,7 @@ ACMD_FUNC(lostskill)
sd->status.skill[sk_idx].lv = 0;
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.
return 0;
@ -4375,9 +4330,6 @@ ACMD_FUNC(reload) {
}else if( strstr( command, "barterdb" ) || strncmp( message, "barterdb", 4 ) == 0 ){
barter_db.reload();
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;
@ -6297,6 +6249,7 @@ ACMD_FUNC(useskill)
*------------------------------------------*/
ACMD_FUNC(displayskill)
{
struct status_data * status;
t_tick tick;
uint16 skill_id;
uint16 skill_lv = 1;
@ -6309,15 +6262,14 @@ ACMD_FUNC(displayskill)
clif_displaymessage(fd, msg_txt(sd,825));// Effect Types: 0: All, 1: Damage, 2: Splash Dmg, 3: No Damage, 4: Ground
return -1;
}
status_data* status = status_get_status_data(sd->bl);
status = status_get_status_data(&sd->bl);
tick = gettick();
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);
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);
if (type == 0 || type == 3)
clif_skill_nodamage(&sd->bl, sd->bl, skill_id, skill_lv);
clif_skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1);
if (type == 0 || type == 4)
clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
return 0;
@ -8229,6 +8181,7 @@ ACMD_FUNC(homtalk)
ACMD_FUNC(hominfo)
{
struct homun_data *hd;
struct status_data *status;
nullpo_retr(-1, sd);
if ( !hom_is_active(sd->hd) ) {
@ -8237,7 +8190,7 @@ ACMD_FUNC(hominfo)
}
hd = sd->hd;
status_data* status = status_get_status_data(hd->bl);
status = status_get_status_data(&hd->bl);
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
@ -11064,7 +11017,6 @@ void atcommand_basecommands(void) {
ACMD_DEF(guildstorage),
ACMD_DEF(option),
ACMD_DEF(hide), // + /hide
ACMD_DEF(resetcooltime), // + /resetcooltime
ACMD_DEFR(jobchange, ATCMD_NOCONSOLE),
ACMD_DEF(kill),
ACMD_DEF(alive),

View File

@ -161,7 +161,7 @@ static int battle_getenemy_sub(struct block_list *bl, va_list ap)
if (*c >= 24)
return 0;
if (status_isdead(*bl))
if (status_isdead(bl))
return 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 )
return 0;
if( status_isdead(*bl) )
if( status_isdead(bl) )
return 0;
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
else
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);
if (dmg_lv > ATK_BLOCK && attack_type && additional_effects)
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) {
// Trigger monster skill condition for non-skill attacks.
if (!status_isdead(*target) && src != target) {
if (!status_isdead(target) && src != target) {
if (damage > 0)
mobskill_event(md, src, tick, attack_type, damage);
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* target = map_id2bl(dat->target_id);
if (target && !status_isdead(*target)) {
if (target && !status_isdead(target)) {
if( src && target->m == src->m &&
(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]
@ -507,7 +507,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
struct block_list *src2;
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;
if( sg->unit_id != UNT_FIREWALL ) {
@ -696,6 +696,8 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
std::vector<e_race2> s_race2, /// Attacker Race2
t_race2; ///< Target Race2
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;
if( !damage )
@ -707,10 +709,8 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
tsd = BL_CAST(BL_PC, target);
t_class = status_get_class(target);
s_class = status_get_class(src);
///< Attacker status data
status_data* sstatus = status_get_status_data(*src);
///< Target status data
status_data* tstatus = status_get_status_data(*target);
sstatus = status_get_status_data(src);
tstatus = status_get_status_data(target);
s_race2 = status_get_race2(src);
t_race2 = status_get_race2(target);
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;
if (flag & BF_WEAPON) {
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
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);
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.
if ((sce = sc->getSCE(SC_WEAPONBLOCKING)) && flag & (BF_SHORT | BF_WEAPON) && rnd() % 100 < sce->val2) {
clif_skill_nodamage(target, *src, GC_WEAPONBLOCKING, sce->val1);
clif_skill_nodamage(target, src, GC_WEAPONBLOCKING, sce->val1, 1);
sc_start(src, target, SC_WEAPONBLOCK_ON, 100, src->id, skill_get_time2(GC_WEAPONBLOCKING, sce->val1));
d->dmg_lv = ATK_BLOCK;
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 == AG_SOUL_VC_STRIKE ||
(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)
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)) &&
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
clif_skill_nodamage(d_bl, *d_bl, CR_AUTOGUARD, sce->val1);
clif_skill_nodamage(d_bl, d_bl, CR_AUTOGUARD, sce->val1, 1);
unit_set_walkdelay(d_bl, gettick(), delay, 1);
d->dmg_lv = ATK_MISS;
return false;
} else {
clif_skill_nodamage(target, *target, CR_AUTOGUARD, sce->val1);
clif_skill_nodamage(target, target, CR_AUTOGUARD, sce->val1, 1);
unit_set_walkdelay(target, gettick(), delay, 1);
#ifdef RENEWAL
if (sc->getSCE(SC_SHRINK))
@ -1455,7 +1455,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
return false;
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);
clif_skill_nodamage(target, target, LK_PARRYING, sce->val1, 1);
if (skill_id == LK_PARRYING) {
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))
pc_setstand(sd, true); //Stand it to dodge.
clif_skill_nodamage(target, *target, TK_DODGE, 1);
clif_skill_nodamage(target, target, TK_DODGE, 1, 1);
sc_start4(src, target, SC_COMBO, 100, TK_JUMPKICK, src->id, 1, 0, 2000);
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)) {
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());
if (sce) {
clif_specialeffect(target, EF_STORMKICK4, AREA);
@ -1792,7 +1792,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
#endif
) )
{
status_data* status = status_get_status_data(*bl);
struct 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
per /=20; //Uses 20% SP intervals.
//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_chance(sce->val3, 100))
status_heal(src, damage * sce->val4 / 100, 0, 1);
if ((sce = sc->getSCE(SC_BLOODLUST)) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3)
status_heal(src, damage * sce->val4 / 100, 0, 3);
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);
@ -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 damage;
status_data* status = status_get_status_data(*target);
struct status_data *status = status_get_status_data(target);
int weapon, skill;
#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)
{
status_data* status = status_get_status_data(*src);
struct status_data *status = status_get_status_data(src);
uint8 type = (wa == &status->lhw)?EQI_HAND_L:EQI_HAND_R;
uint16 atkmin = (type == EQI_HAND_L)?status->watk2:status->watk;
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)
{
status_data* tstatus = status_get_status_data(*target);
struct status_data *tstatus = status_get_status_data(target);
if(target->type == BL_SKILL) {
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)
{
if(src != nullptr) {
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(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))
@ -2922,7 +2922,7 @@ static bool is_attack_left_handed(struct block_list *src, int skill_id)
return true;
}
struct status_data *sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
if (sstatus->lhw.atk)
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) )
return false;
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
if( sstatus->cri )
{
@ -2964,7 +2964,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
return false;
}
status_data* tstatus = status_get_status_data(*target);
struct status_data *tstatus = status_get_status_data(target);
status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target);
map_session_data *tsd = BL_CAST(BL_PC, target);
@ -3060,7 +3060,7 @@ static int is_attack_piercing(struct Damage* wd, struct block_list *src, struct
if(src != nullptr) {
map_session_data *sd = BL_CAST(BL_PC, src);
status_data* tstatus = status_get_status_data(*target);
struct 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
#ifndef RENEWAL
@ -3118,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)
{
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target);
map_session_data *sd = BL_CAST(BL_PC, src);
@ -3312,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)
{
status_data* tstatus = status_get_status_data(*target);
struct status_data *tstatus = status_get_status_data(target);
status_change *sc = status_get_sc(src);
map_session_data *sd = BL_CAST(BL_PC, src);
std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag);
@ -3417,7 +3417,7 @@ static int battle_calc_equip_attack(struct block_list *src, int skill_id)
{
if(src != nullptr) {
int eatk = 0;
status_data* status = status_get_status_data(*src);
struct status_data *status = status_get_status_data(src);
map_session_data *sd = BL_CAST(BL_PC, src);
// Add arrow atk if using an applicable skill
@ -3446,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);
status_change *sc = status_get_sc(src);
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
int element = skill_get_ele(skill_id, skill_lv);
//Take weapon's element
@ -3549,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);
map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src);
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
if (element == ELE_WEAPON) { // pl=-1 : the skill takes the weapon's element
element = sstatus->rhw.ele;
@ -3693,12 +3693,6 @@ static int battle_get_spiritball_damage(struct Damage& wd, struct block_list& sr
// These skills used as many spheres as they do hits
damage = (wd.div_ + sd->spiritball) * 3;
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:
// These skills store the number of spheres the player had before cast
damage = sd->spiritball_old * 3;
@ -3725,8 +3719,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);
map_session_data* sd = BL_CAST(BL_PC, src);
status_change* sc = status_get_sc(src);
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data* sstatus = status_get_status_data(src);
struct 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);
// Elemental attribute fix
@ -3859,7 +3853,7 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
{
map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src);
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
int t_class = status_get_class(target);
#ifndef RENEWAL
@ -3919,7 +3913,7 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
case NC_ARMSCANNON:
// Arrow attack of these skills is not influenced by P.ATK so we add it as mastery attack
if (sd != nullptr) {
status_data* tstatus = status_get_status_data(*target);
struct 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));
}
break;
@ -3965,8 +3959,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)
{
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
map_session_data *sd = BL_CAST(BL_PC, src);
bool critical = false;
@ -4040,8 +4034,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)
{
status_change *sc = status_get_sc(src);
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
map_session_data *sd = BL_CAST(BL_PC, src);
map_session_data *tsd = BL_CAST(BL_PC, target);
@ -4335,7 +4329,7 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s
map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target);
status_data* tstatus = status_get_status_data(*target);
struct status_data *tstatus = status_get_status_data(target);
if( sd && !skill_id ) { // if no skill_id passed, check for double attack [helvetica]
short i;
@ -4532,8 +4526,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
map_session_data *tsd = BL_CAST(BL_PC, target);
status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target);
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
int skillratio = 100;
int i;
@ -6295,8 +6289,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 *tsd = BL_CAST(BL_PC, target);
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
int64 atk = 0;
//Constant/misc additions from skills
@ -6347,8 +6341,8 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st
{
map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src);
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
uint8 anger_id = 0; // SLS Anger
// Kagerou/Oboro Earth Charm effect +15% wATK
@ -6536,8 +6530,8 @@ static void battle_calc_defense_reduction(struct Damage* wd, struct block_list *
map_session_data *tsd = BL_CAST(BL_PC, target);
status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target);
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
//Defense reduction
short vit_def;
@ -6707,7 +6701,7 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list
{
map_session_data *sd = BL_CAST(BL_PC, src);
status_change *sc = status_get_sc(src);
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
// Post skill/vit reduction damage increases
#ifndef RENEWAL
@ -6762,7 +6756,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)
{
status_data* tstatus = status_get_status_data(*target);
struct status_data *tstatus = status_get_status_data(target);
bool attack_hits = is_attack_hitting(wd, src, target, skill_id, skill_lv, false);
if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM)
@ -6809,9 +6803,9 @@ static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,s
return;
}
// Triple Attack and Finger Offensive have a special property, they do not split damage on plant mode
// Triple Attack has a special property that it does not split damage on plant mode
// In pre-renewal, it requires the monster to have exactly 100 def
if ((skill_id == MO_TRIPLEATTACK || skill_id == MO_FINGEROFFENSIVE) && wd->div_ < 0
if (skill_id == MO_TRIPLEATTACK && wd->div_ < 0
#ifndef RENEWAL
&& tstatus->def == 100
#endif
@ -6919,14 +6913,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))) ) {
int64 damage = wd->damage + wd->damage2, rdamage = 0;
map_session_data *tsd = BL_CAST(BL_PC, target);
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
t_tick tick = gettick(), rdelay = 0;
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
struct block_list *d_bl = battle_check_devotion(src);
rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
if( tsd )
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
//Use Reflect Shield to signal this kind of skill trigger [Skotlex]
@ -6981,8 +6975,8 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
map_session_data *tsd = BL_CAST(BL_PC, target);
status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target);
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
int skill_damage = 0;
//Reject Sword bugreport:4493 by Daegaladh
@ -6996,9 +6990,9 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
)
{
ATK_RATER(wd->damage, 50)
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);
if (status_isdead(*target))
clif_skill_nodamage(target,target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1,1);
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))
return;
if( --(tsc->getSCE(SC_REJECTSWORD)->val3) <= 0 )
status_change_end(target, SC_REJECTSWORD);
@ -7014,7 +7008,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);
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
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);
status_damage(src, target, rdamage/10, 0, 0, 1, 0);
status_change_end(target, SC_CRESCENTELBOW);
@ -7076,8 +7070,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)
{
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
status_change *sc = status_get_sc(src);
map_session_data *sd = BL_CAST(BL_PC, src);
struct Damage wd;
@ -7270,7 +7264,7 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
int64 damage = wd->damage + wd->damage2, rdamage = 0;
map_session_data *tsd = BL_CAST(BL_PC, target);
status_change *tsc = status_get_sc(target);
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
struct unit_data *ud = unit_bl2ud(target);
t_tick tick = gettick(), rdelay = 0;
@ -7296,7 +7290,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)
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) {
rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
if( tsd )
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
// It appears that official servers give skill reflect damage a longer delay
@ -7321,8 +7315,8 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
struct Damage wd;
status_change *sc = status_get_sc(src);
status_change *tsc = status_get_sc(target);
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
int right_element, left_element;
bool infdef = false;
@ -7396,7 +7390,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
#ifdef RENEWAL
if(skill_id == HW_MAGICCRASHER) { // Add weapon attack for MATK onto Magic Crasher
status_data* sstatus = status_get_status_data(*src);
struct status_data *sstatus = status_get_status_data(src);
if (sstatus->matk_max > sstatus->matk_min) {
ATK_ADD(wd.weaponAtk, wd.weaponAtk2, sstatus->matk_min+rnd()%(sstatus->matk_max-sstatus->matk_min));
@ -7602,7 +7596,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);
break;
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;
ATK_ADD(wd.damage, wd.damage2, sstatus->max_hp - sstatus->hp);
@ -7727,6 +7721,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
TBL_PC *tsd;
status_change *sc, *tsc;
struct Damage ad;
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
struct {
unsigned imdef : 1;
unsigned infdef : 1;
@ -7739,10 +7735,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
nullpo_info(NLP_MARK);
return ad;
}
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
// 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
ad.damage = 1;
@ -8462,6 +8454,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
break;
case AG_ASTRAL_STRIKE_ATK:
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);
break;
case AG_ROCK_DOWN:
@ -8964,6 +8961,8 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
map_session_data *sd, *tsd;
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);
memset(&md,0,sizeof(md));
@ -8973,9 +8972,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
return md;
}
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
//Some initial values
md.amotion = (skill_get_inf(skill_id)&INF_GROUND_SKILL ? 0 : sstatus->amotion);
md.dmotion = tstatus->dmotion;
@ -9440,7 +9436,7 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl
status_change_entry *tsce = tsc->getSCE(SC_WEAPONBLOCKING);
if (attack_type == BF_WEAPON && rnd() % 100 < tsce->val2) {
clif_skill_nodamage(target, *bl, GC_WEAPONBLOCKING, tsce->val1);
clif_skill_nodamage(target, bl, GC_WEAPONBLOCKING, tsce->val1, 1);
sc_start(bl, target, SC_WEAPONBLOCK_ON, 100, bl->id, skill_get_time2(GC_WEAPONBLOCKING, tsce->val1));
}
}
@ -9580,7 +9576,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)
{
status_data* tstatus = status_get_status_data(target);
struct status_data* tstatus = status_get_status_data(&target);
mob_data* dstmd = BL_CAST(BL_MOB, &target);
// Coma
@ -9615,7 +9611,7 @@ bool battle_vellum_damage(map_session_data *sd, struct block_list *target, struc
nullpo_retr(false, target);
nullpo_retr(false, wd);
status_data* tstatus = status_get_status_data(*target);
struct status_data *tstatus = status_get_status_data(target);
// bHPVanishRaceRate
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);
@ -9737,7 +9733,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);
else
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);
map_freeblock_unlock();
}
@ -9794,6 +9790,7 @@ 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) {
map_session_data *sd = nullptr, *tsd = nullptr;
struct status_data *sstatus, *tstatus;
status_change *sc, *tsc;
int64 damage;
int skillv;
@ -9809,8 +9806,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
sd = BL_CAST(BL_PC, src);
tsd = BL_CAST(BL_PC, target);
status_data* sstatus = status_get_status_data(*src);
status_data* tstatus = status_get_status_data(*target);
sstatus = status_get_status_data(src);
tstatus = status_get_status_data(target);
sc = status_get_sc(src);
tsc = status_get_sc(target);
@ -9883,7 +9880,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
uint16 skill_lv = tsc->getSCE(SC_AUTOCOUNTER)->val1;
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);
skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
return ATK_BLOCK;
@ -9906,7 +9903,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
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))
{ //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);
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
return ATK_BLOCK;
@ -9979,7 +9976,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)
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)) {
int hp_heal = tstatus->max_hp - tstatus->hp;
@ -10048,7 +10045,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)
skill_castend_damage_id(src, target, 0, 1, tick, 0);
@ -10068,7 +10065,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
map_freeblock_lock();
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);
if( wd.dmg_lv > ATK_BLOCK )
skill_counter_additional_effect(src, target, 0, 0, wd.flag, tick);
@ -10101,7 +10098,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if (d_sc && d_sc->getSCE(SC_REBOUND_S))
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);
}
}
@ -10119,8 +10116,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if (tsc->getSCE(SC_WATER_SCREEN_OPTION)) {
struct block_list *e_bl = map_id2bl(tsc->getSCE(SC_WATER_SCREEN_OPTION)->val1);
if (e_bl && !status_isdead(*e_bl)) {
clif_damage(*e_bl, *e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
if (e_bl && !status_isdead(e_bl)) {
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);
}
}

View File

@ -627,11 +627,11 @@ void buyingstore_reopen( map_session_data* sd ){
{
// Make buyer look perfect
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 ) {
pc_setsit(sd);
skill_sit(sd, 1);
clif_sitting(sd->bl);
clif_sitting(&sd->bl);
}
// 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_dispchat(cd,0);
if (status_isdead(sd->bl))
if (status_isdead(&sd->bl))
achievement_update_objective(sd, AG_CHATTING_DYING, 1, 1);
else
achievement_update_objective(sd, AG_CHATTING_CREATE, 1, 1);
@ -168,8 +168,7 @@ int chat_joinchat(map_session_data* sd, int chatid, const char* pass)
pc_setchatid(sd,cd->bl.id);
// To the person who newly joined the chat
clif_joinchatok(*sd, *cd);
clif_joinchatok(sd, cd); //To the person who newly joined the list of all
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
@ -218,7 +217,7 @@ int chat_leavechat(map_session_data* sd, bool kicked)
cd->usersd[i] = cd->usersd[i+1];
if( cd->users == 0 && cd->owner->type == BL_PC ) { // Delete empty chatroom
clif_clearchat(*cd);
clif_clearchat(cd, 0);
db_destroy(cd->kick_list);
map_deliddb(&cd->bl);
map_delblock(&cd->bl);
@ -235,7 +234,7 @@ int chat_leavechat(map_session_data* sd, bool kicked)
if( leavechar == 0 && cd->owner->type == BL_PC ) { // Set and announce new owner
cd->owner = (struct block_list*) cd->usersd[0];
clif_changechatowner(cd, cd->usersd[0]);
clif_clearchat(*cd);
clif_clearchat(cd, 0);
//Adjust Chat location after owner has been changed.
map_delblock( &cd->bl );
@ -276,7 +275,7 @@ int chat_changechatowner(map_session_data* sd, const char* nextownername)
return -1; // name not found
// erase temporarily
clif_clearchat(*cd);
clif_clearchat(cd,0);
// set new owner
cd->owner = (struct block_list*) cd->usersd[i];
@ -326,7 +325,7 @@ int chat_changechatstatus(map_session_data* sd, const char* title, const char* p
cd->limit = min(limit, ARRAYLENGTH(cd->usersd));
cd->pub = pub;
clif_changechatstatus(*cd);
clif_changechatstatus(cd);
clif_dispchat(cd,0);
return 0;
@ -437,7 +436,7 @@ int chat_deletenpcchat(struct npc_data* nd)
return 0;
chat_npckickall(cd);
clif_clearchat(*cd);
clif_clearchat(cd, 0);
map_deliddb(&cd->bl);
map_delblock(&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].lv = 0;
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 ) {
@ -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].lv = 0;
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
clif_deleteskill(*sd,WE_CALLBABY);
clif_deleteskill(sd,WE_CALLBABY);
}
return 0;

File diff suppressed because it is too large Load Diff

View File

@ -14,7 +14,6 @@
#include "packets.hpp"
#include "script.hpp"
#include "trade.hpp"
struct Channel;
struct clan;
@ -839,7 +838,7 @@ void clif_move( struct unit_data& ud ); //area
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_blown(struct block_list *bl); // area
void clif_slide(block_list& bl, int x, int y); // area
void clif_slide(struct block_list *bl, int x, int y); // area
void clif_fixpos( block_list& bl );
void clif_npcbuysell( map_session_data& sd, npc_data& nd );
void clif_buylist( map_session_data& sd, npc_data& nd );
@ -862,10 +861,10 @@ void clif_delitem( map_session_data& sd, int index, int amount, short reason );
void clif_update_hp(map_session_data &sd);
void clif_updatestatus( map_session_data& sd, _sp type );
void clif_changemanner( map_session_data& sd );
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(block_list& src, block_list& dst);
void clif_sitting(block_list& bl);
void clif_standing(block_list& bl);
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
void clif_takeitem(struct block_list* src, struct block_list* dst);
void clif_sitting(struct block_list* bl);
void clif_standing(struct 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_changelook(struct block_list *bl,int type,int val); // area
void clif_changetraplook(struct block_list *bl,int val); // area
@ -875,7 +874,7 @@ void clif_arrow_fail( map_session_data& sd, e_action_failure type );
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_equipitemack( map_session_data& sd, uint8 flag, int index, int pos = 0 ); // self
void clif_unequipitemack( map_session_data& sd, uint16 server_index, int32 pos, bool success );
void clif_unequipitemack(map_session_data *sd,int n,int pos,int ok); // self
void clif_misceffect( block_list& bl, e_notify_effect type );
void clif_changeoption_target(struct block_list* bl, struct block_list* target);
#define clif_changeoption(bl) clif_changeoption_target(bl, nullptr) // area
@ -885,12 +884,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_dispchat(struct chat_data* cd, int fd); // area or fd
void clif_joinchatfail( map_session_data& sd, e_refuse_enter_room result );
void clif_joinchatok(map_session_data& sd,chat_data& cd);
void clif_joinchatok(map_session_data *sd,struct chat_data* cd); // self
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_clearchat(chat_data &cd);
void clif_clearchat(struct chat_data *cd,int fd); // area or fd
void clif_leavechat(struct chat_data* cd, map_session_data* sd, bool flag); // chat
void clif_changechatstatus(chat_data& cd);
void clif_changechatstatus(struct chat_data* cd); // chat
void clif_refresh_storagewindow(map_session_data *sd);
void clif_refresh(map_session_data *sd); // self
@ -901,13 +900,13 @@ void clif_divorced(map_session_data* sd, const char* name);
void clif_callpartner(map_session_data& sd);
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_parse_ActionRequest_sub( map_session_data& sd, uint8 action_type, int target_id, t_tick tick );
void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int target_id, t_tick tick );
void clif_parse_LoadEndAck(int fd,map_session_data *sd);
void clif_hotkeys_send(map_session_data *sd, int tab);
// trade
void clif_traderequest(map_session_data& sd, const char* name);
void clif_traderesponse( map_session_data& sd, e_ack_trade_response result );
void clif_traderequest(map_session_data* sd, const char* name);
void clif_tradestart(map_session_data* sd, uint8 type);
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_tradedeal_lock( map_session_data& sd, bool who );
@ -933,7 +932,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_skillinfo(map_session_data *sd,int skill_id, int inf);
void clif_addskill(map_session_data *sd, int skill_id);
void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock = false);
void clif_deleteskill(map_session_data *sd, int 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_skillcastcancel( block_list& bl );
@ -941,10 +940,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 );
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);
bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int32 heal, bool success = true );
bool clif_skill_nodamage(struct block_list *src,struct block_list *dst,uint16 skill_id,int heal,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_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, std::vector<std::string>& maps );
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_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_produce_mix_list( map_session_data& sd, int skill_id, int trigger );
@ -1008,7 +1007,7 @@ void clif_mvp_effect(map_session_data *sd);
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_noitem(map_session_data* sd);
void clif_changed_dir(block_list& bl, enum send_target target);
void clif_changed_dir(struct block_list *bl, enum send_target target);
// vending
void clif_openvendingreq( map_session_data& sd, uint16 num );
@ -1041,9 +1040,9 @@ void clif_party_dead( map_session_data& sd );
// guild
void clif_guild_created( map_session_data& sd, int flag );
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_allianceinfo(map_session_data& sd);
void clif_guild_allianceinfo(map_session_data *sd);
void clif_guild_memberlist( map_session_data& sd );
void clif_guild_skillinfo( map_session_data& sd );
void clif_guild_send_onlineinfo(map_session_data *sd); //[LuzZza]
@ -1057,11 +1056,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_area(struct block_list* bl);
void clif_guild_notice( map_session_data& sd );
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_allianceack(map_session_data& sd, uint8 flag);
void clif_guild_delalliance(map_session_data& sd,uint32 guild_id,uint32 flag);
void clif_guild_oppositionack(map_session_data& sd,uint8 flag);
void clif_guild_message( const struct mmo_guild& g, uint32 account_id, const char* mes, size_t len );
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_delalliance(map_session_data *sd,int guild_id,int flag);
void clif_guild_oppositionack(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_single( map_session_data& sd, map_session_data& tsd );

View File

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

View File

@ -847,7 +847,7 @@ int guild_recv_info(const struct mmo_guild &sg) {
sd->guild = g;
sd->state.gmaster_flag = 1;
clif_name_area(&sd->bl); // [LuzZza]
clif_guild_masterormember(*sd);
clif_guild_masterormember(sd);
}
} else {
before = g->guild;
@ -893,10 +893,6 @@ int guild_recv_info(const struct mmo_guild &sg) {
clif_guild_skillinfo( *sd ); // Submit information skills
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_notice( *sd );
sd->guild_emblem_id = g->guild.emblem_id;
@ -963,7 +959,7 @@ bool guild_invite( map_session_data& sd, map_session_data* tsd ){
}
// Checking if there no other invitation pending
if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){
if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){
clif_guild_inviteack( sd, 0 );
return false;
}
@ -1380,10 +1376,6 @@ 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 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 );
sd->guild_emblem_id = g->guild.emblem_id;
}
@ -1476,7 +1468,7 @@ int guild_recv_message( int guild_id, uint32 account_id, const char *mes, size_t
auto g = guild_search(guild_id);
if (!g)
return 0;
clif_guild_message(g->guild,mes,len);
clif_guild_message(g->guild,account_id,mes,len);
return 0;
}
@ -1862,7 +1854,7 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
// Check, is tsd guild master, if not - cancel alliance. [f0und3r]
if (battle_config.guild_alliance_onlygm && !tsd->state.gmaster_flag) {
clif_guild_allianceack(*sd, 5);
clif_guild_allianceack(sd, 5);
return 0;
}
@ -1877,23 +1869,23 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
return 0;
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;
}
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;
}
if( tsd->guild_alliance>0 ){
clif_guild_allianceack(*sd,1);
clif_guild_allianceack(sd,1);
return 0;
}
for (i = 0; i < MAX_GUILDALLIANCE; i++) { // check if already allied
if( g->guild.alliance[i].guild_id==tsd->status.guild_id &&
g->guild.alliance[i].opposition==0){
clif_guild_allianceack(*sd,0);
clif_guild_allianceack(sd,0);
return 0;
}
}
@ -1901,7 +1893,7 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
tsd->guild_alliance=sd->status.guild_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;
}
@ -1914,7 +1906,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
nullpo_ret(sd);
tsd= map_id2sd( account_id );
if (!tsd) { //Character left? Cancel alliance.
clif_guild_allianceack(*sd,3);
clif_guild_allianceack(sd,3);
return 0;
}
@ -1928,13 +1920,13 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
auto &tg = tsd->guild;
if (!g || guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance) {
clif_guild_allianceack(*sd,4);
clif_guild_allianceack(*tsd,3);
clif_guild_allianceack(sd,4);
clif_guild_allianceack(tsd,3);
return 0;
}
if (!tg || guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance) {
clif_guild_allianceack(*sd,3);
clif_guild_allianceack(*tsd,4);
if (!g || guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance) {
clif_guild_allianceack(sd,3);
clif_guild_allianceack(tsd,4);
return 0;
}
@ -1959,7 +1951,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
sd->guild_alliance=0;
sd->guild_alliance_account=0;
if(tsd!=nullptr)
clif_guild_allianceack(*tsd,3);
clif_guild_allianceack(tsd,3);
}
return 0;
}
@ -1996,14 +1988,14 @@ int guild_opposition(map_session_data *sd,map_session_data *tsd) {
return 0;
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;
}
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].opposition == 1) { // check if not already hostile
clif_guild_oppositionack(*sd,2);
clif_guild_oppositionack(sd,2);
return 0;
}
if(is_agit_start()) // Prevent the changing of alliances to oppositions during WoE.
@ -2049,7 +2041,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
if (flag & 0x70) { // failure
for(i=0;i<2-(flag&1);i++)
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;
}
@ -2073,16 +2065,16 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
g[i]->alliance[j].guild_id = 0;
}
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( sd[1]!=nullptr )
clif_guild_allianceack(*sd[1],2);
clif_guild_allianceack(sd[1],2);
} else if ((flag & 0x0f) == 1) { // enemy notification
if( sd[0]!=nullptr )
clif_guild_oppositionack(*sd[0],0);
clif_guild_oppositionack(sd[0],0);
}
@ -2091,7 +2083,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
for(j=0;j<g[i]->max_member;j++) {
map_session_data *sd_mem = g[i]->member[j].sd;
if( sd_mem!=nullptr){
clif_guild_allianceinfo(*sd_mem);
clif_guild_allianceinfo(sd_mem);
// join ally channel
if( channel_config.ally_tmpl.name[0] && (channel_config.ally_tmpl.opt&CHAN_OPT_AUTOJOIN) ) {
@ -2112,7 +2104,7 @@ int guild_broken_sub(struct mmo_guild &g, int guild_id) {
if (g.alliance[i].guild_id == guild_id) {
for (int j = 0; j < g.max_member; j++) {
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);
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)
return 0;
if (status_isdead(hd->bl))
if (status_isdead(&hd->bl))
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)
@ -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)
return 0; // vaporized homunculi need to be 'called'
if (!status_isdead(hd->bl))
if (!status_isdead(&hd->bl))
return 0; // already alive
hom_init_timers(hd);

View File

@ -2843,6 +2843,7 @@ enum e_random_item_group {
IG_COSTUMEMILEPACK_35_1,
IG_COSTUMEMILEPACK_35_2,
IG_COSTUMEMILEPACK_35_3,
IG_D_GW_EXTRACTOR,
IG_MAX,
};

View File

@ -67,7 +67,7 @@ void map_msg_reload(void);
#define NATURAL_HEAL_INTERVAL 500
#define MIN_FLOORITEM 2
#define MAX_FLOORITEM START_ACCOUNT_NUM
#define MAX_LEVEL 275
#define MAX_LEVEL 260
#define MAX_DROP_PER_MAP 48
#define MAX_IGNORE_LIST 20 // official is 14
#define MAX_VENDING 12
@ -677,6 +677,8 @@ enum e_mapflag : int16 {
MF_NODYNAMICNPC,
MF_NOBANK,
MF_SPECIALPOPUP,
MF_NOLOOTNORMALMOB,
MF_NO_NPC_SELFDESTRUCTION_ON_ALL,
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);
if (!bl || status_isdead(*bl)) {
if (!bl || status_isdead(bl)) {
status_kill(&md->bl);
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_))
{ //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;
unit_set_walkdelay(&md->bl, tick, md->status.amotion, 1);
}
@ -2889,7 +2889,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
}
}
if( !(type&1) && !map_getmapflag(m, MF_NOMOBLOOT) && !md->state.rebirth && (
if( !(type&1) && !map_getmapflag(m, MF_NOMOBLOOT) && !(md->get_bosstype() == BOSSTYPE_NONE && map_getmapflag(m, MF_NOLOOTNORMALMOB)) && !md->state.rebirth && (
!md->special_state.ai || //Non special mob
battle_config.alchemist_summon_reward == 2 || //All summoned give drops
(md->special_state.ai==AI_SPHERE && battle_config.alchemist_summon_reward == 1) //Marine Sphere Drops items.
@ -3682,7 +3682,7 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,uint16 skill_id)
if (md2->state.copy_master_mode)
md->status.mode = md2->status.mode;
clif_skill_nodamage(&md->bl,md->bl,skill_id,amount);
clif_skill_nodamage(&md->bl,&md->bl,skill_id,amount,1);
}
return 0;

View File

@ -1528,11 +1528,6 @@ enum e_job_types
JT_4_EP21_TAN_S,
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_MOCLORD,
@ -1552,7 +1547,7 @@ enum e_job_types
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
//Checks if a given id is a valid npc id.
//Checks if a given id is a valid npc id. [Skotlex]
//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 ) )

View File

@ -32,12 +32,6 @@
#pragma pack( push, 1 )
#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{
int16 packetType;
uint8 result;
@ -362,38 +356,6 @@ struct PACKET_ZC_ACK_OPEN_BANKING{
} __attribute__((packed));
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 {
int16 packetType;
uint16 index;
@ -667,14 +629,6 @@ struct PACKET_ZC_NOTIFY_PLAYERMOVE {
} __attribute__((packed));
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 {
int16 packetType;
char mapName[MAP_NAME_LENGTH_EXT];
@ -760,32 +714,6 @@ struct PACKET_ZC_OPEN_EDITDLGSTR {
} __attribute__((packed));
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 {
int16 packetType;
uint32 npcId;
@ -817,12 +745,6 @@ struct PACKET_ZC_CARTOFF {
} __attribute__((packed));
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 {
int16 packetType;
uint32 aid;
@ -831,13 +753,6 @@ struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM {
} __attribute__((packed));
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 {
int16 packetType;
uint16 point;
@ -917,50 +832,12 @@ struct PACKET_ZC_PAR_CHANGE_USER {
} __attribute__((packed));
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 {
int16 packetType;
uint16 index;
} __attribute__((packed));
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 {
int16 packetType;
} __attribute__((packed));
@ -1015,25 +892,6 @@ struct PACKET_ZC_REFUSE_ENTER_ROOM {
} __attribute__((packed));
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 {
int16 packetType;
uint32 gid;
@ -1118,26 +976,12 @@ struct PACKET_ZC_SKILL_DISAPPEAR {
} __attribute__((packed));
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 {
int16 packetType;
uint32 GID;
} __attribute__((packed));
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
struct PACKET_ZC_RECOVERY {
int16 packetType;
@ -1317,51 +1161,6 @@ struct PACKET_ZC_EL_PAR_CHANGE {
} __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
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
#pragma pack( pop )
@ -1407,12 +1206,6 @@ DEFINE_PACKET_HEADER(CZ_REQ_STYLE_CHANGE2, 0xafc)
DEFINE_PACKET_HEADER(ZC_REMOVE_EFFECT, 0x0b0d)
DEFINE_PACKET_HEADER(ZC_FEED_MER, 0x22f)
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_EQUIP = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_equip ) - ( sizeof( struct EQUIPITEM_INFO ) * MAX_ITEMLIST ) ) ) / sizeof( struct EQUIPITEM_INFO ) );

View File

@ -4998,17 +4998,15 @@ struct PACKET_ZC_POSITION_ID_NAME_INFO {
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
struct PACKET_ZC_POSITION_INFO_sub {
struct PACKET_ZC_POSITION_INFO {
int16 PacketType;
int16 PacketLength;
struct {
int positionID;
int right;
int ranking;
int payRate;
} __attribute__((packed));
struct PACKET_ZC_POSITION_INFO {
int16 PacketType;
int16 PacketLength;
struct PACKET_ZC_POSITION_INFO_sub posInfo[];
} posInfo[MAX_GUILDPOSITION];
} __attribute__((packed));
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;
}
if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){
if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){
clif_party_invite_reply( sd, tsd->status.name, PARTY_REPLY_JOIN_OTHER_PARTY );
return false;
}

View File

@ -1801,35 +1801,13 @@ uint8 pc_isequip(map_session_data *sd,int n)
if(item == nullptr)
return ITEM_EQUIP_ACK_FAIL;
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))
if(item->elv && sd->status.base_level < (unsigned int)item->elv)
return ITEM_EQUIP_ACK_FAILLEVEL;
if(item->elvmax && sd->status.base_level > static_cast<unsigned int>(item->elvmax))
if(item->elvmax && sd->status.base_level > (unsigned int)item->elvmax)
return ITEM_EQUIP_ACK_FAILLEVEL;
if(item->sex != SEX_BOTH && sd->status.sex != item->sex)
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
if (!battle_config.allow_equip_restricted_item && itemdb_isNoEquip(item, sd->bl.m))
return ITEM_EQUIP_ACK_FAIL;
@ -1896,6 +1874,23 @@ uint8 pc_isequip(map_session_data *sd,int n)
return ITEM_EQUIP_ACK_FAIL;
if(item->equip && (sd->sc.getSCE(SC_KYOUGAKU) || sd->sc.getSCE(SC_SUHIDE)))
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]
@ -5345,7 +5340,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
if (level == 0) { //Remove skill.
sd->status.skill[idx].id = 0;
clif_deleteskill(*sd,skill_id);
clif_deleteskill(sd,skill_id);
} else
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.
@ -5380,7 +5375,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;
if (level == 0) { //Remove skill.
sd->status.skill[idx].id = 0;
clif_deleteskill(*sd,skill_id);
clif_deleteskill(sd,skill_id);
} else
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.
@ -5462,7 +5457,7 @@ bool pc_skill_plagiarism_reset(map_session_data &sd, uint8 type)
sd.status.skill[idx].id = 0;
sd.status.skill[idx].lv = 0;
sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT;
clif_deleteskill(sd, skill_id);
clif_deleteskill(&sd, skill_id);
if (type == 1) {
sd.cloneskill_idx = 0;
@ -6133,7 +6128,7 @@ bool pc_takeitem(map_session_data *sd,struct flooritem_data *fitem)
//Display pickup animation.
pc_stop_attack(sd);
clif_takeitem(sd->bl,fitem->bl);
clif_takeitem(&sd->bl,&fitem->bl);
if (fitem->mob_id &&
(itemdb_search(fitem->item.nameid))->flag.broadcast &&
@ -6680,6 +6675,7 @@ bool pc_steal_item(map_session_data *sd,struct block_list *bl, uint16 skill_lv)
t_itemid itemid;
double rate;
unsigned char flag = 0;
struct status_data *sd_status, *md_status;
struct mob_data *md;
if(!sd || !bl || bl->type!=BL_MOB)
@ -6690,11 +6686,11 @@ 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
return false;
status_data* sd_status = status_get_status_data(sd->bl);
status_data* md_status = status_get_status_data(*bl);
sd_status= status_get_status_data(&sd->bl);
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) ||
map_getmapflag(bl->m, MF_NOMOBLOOT) || // check noloot map flag [Lorky]
map_getmapflag(bl->m, MF_NOMOBLOOT) || md->get_bosstype() == BOSSTYPE_NONE && map_getmapflag(bl->m, MF_NOLOOTNORMALMOB) || // check noloot map flag [Lorky]
(battle_config.skill_steal_max_tries && //Reached limit of steal attempts. [Lupus]
md->state.steal_flag++ >= battle_config.skill_steal_max_tries)
) { //Can't steal from
@ -8239,7 +8235,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;
if (src) {
status_data* status = status_get_status_data(*src);
struct status_data *status = status_get_status_data(src);
if( sd->indexed_bonus.expaddrace[status->race] )
bonus += sd->indexed_bonus.expaddrace[status->race];
@ -10053,7 +10049,7 @@ bool pc_revive_item(map_session_data *sd) {
else
pc_delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME);
clif_skill_nodamage(&sd->bl, sd->bl, ALL_RESURRECTION, 4);
clif_skill_nodamage(&sd->bl, &sd->bl, ALL_RESURRECTION, 4, 1);
return true;
}
@ -11921,7 +11917,7 @@ bool pc_equipitem(map_session_data *sd,short n,int req_pos,bool equipswitch)
return false;
}
if (!(pos&req_pos) || sd->inventory.u.items_inventory[n].equip != 0) {
if (!(pos&req_pos) || sd->inventory.u.items_inventory[n].equip != 0 || sd->inventory.u.items_inventory[n].attribute==1 ) { // [Valaris]
if( equipswitch ){
clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
}else{
@ -12262,18 +12258,18 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
nullpo_retr(false,sd);
if (n < 0 || n >= MAX_INVENTORY) {
clif_unequipitemack(*sd,0,0,false);
clif_unequipitemack(sd,0,0,0);
return false;
}
if (!(pos = sd->inventory.u.items_inventory[n].equip)) {
clif_unequipitemack(*sd,n,0,false);
clif_unequipitemack(sd,n,0,0);
return false; //Nothing to unequip
}
// status change that makes player cannot unequip equipment
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
{
clif_unequipitemack(*sd,n,0,false);
clif_unequipitemack(sd,n,0,0);
return false;
}
@ -12312,7 +12308,7 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
if(pos & EQP_SHOES)
clif_changelook(&sd->bl,LOOK_SHOES,0);
clif_unequipitemack(*sd,n,pos,true);
clif_unequipitemack(sd,n,pos,1);
pc_set_costume_view(sd);
status_db.removeByStatusFlag(&sd->bl, { SCF_REMOVEONUNEQUIP });
@ -12333,7 +12329,7 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
if (idx >= 0) {
sd->equip_index[EQI_AMMO] = -1;
clif_unequipitemack(*sd, idx, sd->inventory.u.items_inventory[idx].equip, true);
clif_unequipitemack(sd, idx, sd->inventory.u.items_inventory[idx].equip, 1);
pc_unequipitem_sub(sd, idx, 0);
}
}
@ -12974,7 +12970,7 @@ bool pc_setstand(map_session_data *sd, bool force){
status_change_end(&sd->bl, SC_TENSIONRELAX);
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.
sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0;
if( pc_isdead( sd ) ){

View File

@ -706,11 +706,7 @@ public:
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.
struct{
uint32 id;
unsigned int lv;
}trade_partner;
int trade_partner;
struct s_deal {
struct s_item {
short index, amount;
@ -1236,7 +1232,7 @@ enum e_mado_type : uint16 {
#define pc_rightside_def(sd) ((sd)->battle_status.def)
#define pc_leftside_mdef(sd) ((sd)->battle_status.mdef2)
#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)
#else
#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);
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))
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)
return 0; //Forged packet!
if(sd->state.trading) //The player have trade in progress.
if(sd->trade_partner) //The player have trade in progress.
return 0;
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) {
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)) {
target = nullptr;
pet_unlocktarget(pd);
@ -2073,7 +2073,7 @@ TIMER_FUNC(pet_recovery_timer){
if(sd->sc.getSCE(pd->recovery->type)) {
//Display a heal animation?
//Detoxify is chosen for now.
clif_skill_nodamage(&pd->bl,sd->bl,TF_DETOXIFY,1);
clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1);
status_change_end(&sd->bl, pd->recovery->type);
clif_emotion(&pd->bl, ET_OK);
}
@ -2090,6 +2090,7 @@ TIMER_FUNC(pet_recovery_timer){
*/
TIMER_FUNC(pet_heal_timer){
map_session_data *sd = map_id2sd(id);
struct status_data *status;
struct pet_data *pd;
unsigned int rate = 100;
@ -2103,7 +2104,7 @@ TIMER_FUNC(pet_heal_timer){
return 0;
}
status_data* status = status_get_status_data(sd->bl);
status = status_get_status_data(&sd->bl);
if(pc_isdead(sd) ||
(rate = get_percentage(status->sp, status->max_sp)) > pd->s_skill->sp ||
@ -2116,7 +2117,7 @@ TIMER_FUNC(pet_heal_timer){
pet_stop_attack(pd);
pet_stop_walking(pd,1);
clif_skill_nodamage(&pd->bl,sd->bl,AL_HEAL,pd->s_skill->lv);
clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->s_skill->lv,1);
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);
return 0;
@ -2133,6 +2134,7 @@ TIMER_FUNC(pet_heal_timer){
TIMER_FUNC(pet_skill_support_timer){
map_session_data *sd = map_id2sd(id);
struct pet_data *pd;
struct status_data *status;
short rate = 100;
if(sd == nullptr || sd->pd == nullptr || sd->pd->s_skill == nullptr)
@ -2145,7 +2147,7 @@ TIMER_FUNC(pet_skill_support_timer){
return 0;
}
status_data* status = status_get_status_data(sd->bl);
status = status_get_status_data(&sd->bl);
if (DIFF_TICK(pd->ud.canact_tick, tick) > 0) {
//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) {
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;
}
@ -385,7 +385,7 @@ uint64 QuestDatabase::parseBodyNode(const ryml::NodeRef& node) {
}
if (!this->nodeExists(dropNode, "Rate")) {
this->invalidWarning(dropNode["Rate"], "Drops has no Rate value specified, skipping.\n");
this->invalidWarning(dropNode["Item"], "Drops has no Rate value specified, skipping.\n");
continue;
}

View File

@ -15343,7 +15343,7 @@ static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16
clif_skill_poseffect(&bl, skill_id, skill_lv, x, y, gettick());
break;
case CAST_NODAMAGE:
clif_skill_nodamage(&bl, bl, skill_id, skill_lv);
clif_skill_nodamage(&bl, &bl, skill_id, skill_lv, 1);
break;
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));
@ -15389,7 +15389,7 @@ BUILDIN_FUNC(skilleffect)
if (pc_issit(sd) && pc_setstand(sd, false)) {
skill_sit(sd, 0);
clif_standing(sd->bl);
clif_standing(&sd->bl);
}
}
@ -19910,7 +19910,7 @@ BUILDIN_FUNC(unitattack)
case BL_PC: {
map_session_data* sd = (map_session_data*)unit_bl;
clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? DMG_REPEAT : DMG_NORMAL, target_bl->id, gettick() );
clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? 0x07 : 0x00, target_bl->id, gettick() );
script_pushint(st, sd->ud.target == target_bl->id);
return SCRIPT_CMD_SUCCESS;
}
@ -23150,7 +23150,7 @@ BUILDIN_FUNC(sit)
if( !pc_issit(sd) ) {
pc_setsit(sd);
skill_sit(sd, 1);
clif_sitting(sd->bl);
clif_sitting(&sd->bl);
}
return SCRIPT_CMD_SUCCESS;
}
@ -23167,7 +23167,7 @@ BUILDIN_FUNC(stand)
if( pc_issit(sd) && pc_setstand(sd, false)) {
skill_sit(sd, 0);
clif_standing(sd->bl);
clif_standing(&sd->bl);
}
return SCRIPT_CMD_SUCCESS;
@ -27412,6 +27412,27 @@ BUILDIN_FUNC(permission_add)
return SCRIPT_CMD_SUCCESS;
}
BUILDIN_FUNC(unitisforcewalk)
{
block_list *bl = nullptr;
bool force_walk = false;
if (script_getnum(st, 2))
bl = map_id2bl(script_getnum(st,2));
else
bl = map_id2bl(st->rid);
if (bl != nullptr) {
struct unit_data *ud = unit_bl2ud(bl);
if (ud != nullptr)
force_walk = (ud->walktimer == INVALID_TIMER && ud->state.force_walk);
}
script_pushint(st, force_walk);
return SCRIPT_CMD_SUCCESS;
}
#include <custom/script.inc>
// declarations that were supposed to be exported from npc_chat.cpp
@ -28182,6 +28203,8 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(permission_add, "i?"),
BUILDIN_DEF2(permission_add, "permission_remove", "i?"),
BUILDIN_DEF(unitisforcewalk, "i"),
#include <custom/script_def.inc>
{nullptr,nullptr,nullptr},

View File

@ -2128,21 +2128,7 @@ enum e_hat_effects : int16{
HAT_EF_C_BABY_GLOOM,
HAT_EF_WINTERNIGHTBELLS,
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_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
};

View File

@ -539,6 +539,8 @@
export_constant(MF_NODYNAMICNPC);
export_constant(MF_NOBANK);
export_constant(MF_SPECIALPOPUP);
export_constant(MF_NOLOOTNORMALMOB);
export_constant(MF_NO_NPC_SELFDESTRUCTION_ON_ALL);
/* setcell types */
export_constant(CELL_WALKABLE);
@ -3203,7 +3205,7 @@
export_constant(EFST_SPELLFIST);
export_constant(EFST_NETHERWORLD);
export_constant(EFST_SIREN);
export_constant(EFST_DEEP_SLEEP);
export_constant(EFST_HANDICAPSTATE_DEEP_SLEEP);
export_constant(EFST_SIRCLEOFNATURE);
export_constant(EFST_COLD);
export_constant(EFST_GLOOMYDAY);
@ -3266,7 +3268,7 @@
export_constant(EFST_DROCERA_HERB_STEAMED);
export_constant(EFST_PUTTI_TAILS_NOODLES);
export_constant(EFST_BANANA_BOMB);
export_constant(EFST_SUMMON_AGNI);
export_constant(XXX_EFST_SM_ELEMENTAL);
export_constant(EFST_SPELLBOOK4);
export_constant(EFST_SPELLBOOK5);
export_constant(EFST_SPELLBOOK6);
@ -3400,8 +3402,8 @@
export_constant(EFST_SET_NUM_MDEF);
export_constant(EFST_SET_PER_DEF);
export_constant(EFST_SET_PER_MDEF);
export_constant(EFST_PARTYBOOKING_SEARCH_DEALY);
export_constant(EFST_PARTYBOOKING_REGISTER_DEALY);
export_constant(EFST_PARTYBOOKING_SEARCH_DELAY);
export_constant(EFST_PARTYBOOKING_REGISTER_DELAY);
export_constant(EFST_PERIOD_TIME_CHECK_DETECT_SKILL);
export_constant(EFST_KO_JYUMONJIKIRI);
export_constant(EFST_MEIKYOUSISUI);
@ -3442,7 +3444,7 @@
export_constant(EFST_GLASTHEIM_STATE);
export_constant(EFST_GLASTHEIM_ITEMDEF);
export_constant(EFST_GLASTHEIM_HPSP);
export_constant(EFST_HOMUN_SKILL_POSTDELAY);
export_constant(EFST_FOLLOWER_NPC_SKILL_POSTDELAY);
export_constant(EFST_ALMIGHTY);
export_constant(EFST_GVG_GIANT);
export_constant(EFST_GVG_GOLEM);
@ -3468,7 +3470,7 @@
export_constant(EFST_QUEST_BUFF3);
export_constant(EFST_REUSE_LIMIT_RECALL);
export_constant(EFST_SAVEPOSITION);
export_constant(EFST_HANDICAPSTATE_ICEEXPLO);
export_constant(EFST_NPC_ICEEXPLO);
export_constant(EFST_FENRIR_CARD);
export_constant(EFST_REUSE_LIMIT_ASPD_POTION);
export_constant(EFST_MAXPAIN);
@ -3572,7 +3574,7 @@
export_constant(EFST_GC_POISONINGWEAPON_OPERATOR);
export_constant(EFST_WS_WEAPONREFINE_OPERATOR);
export_constant(EFST_BS_REPAIRWEAPON_OPERATOR);
export_constant(EFST_GET_MAILBOX);
export_constant(EFST_UNREADMAIL_CHECK);
export_constant(EFST_JUMPINGCLAN);
export_constant(EFST_JP_OTP);
export_constant(EFST_HANDICAPTOLERANCE_LEVELGAP);
@ -3891,13 +3893,13 @@
export_constant(EFST_PERIOD_USE_WORLDMAP);
export_constant(EFST_MISTY_FROST);
export_constant(EFST_MAGIC_POISON);
export_constant(EFST_MOVE_AGIT);
export_constant(EFST_KAUTE);
export_constant(EFST_REUSE_JPNONLY_LIMIT_I);
export_constant(EFST_REUSE_JPNONLY_LIMIT_J);
export_constant(EFST_REUSE_JPNONLY_LIMIT_K);
export_constant(EFST_JPNONLY_TACTICS);
export_constant(EFST_PRISON);
export_constant(EFST_MADOGEAR_TYPE);
export_constant(EFST_MADOGEAR);
export_constant(EFST_DEADLY_DEFEASANCE);
export_constant(EFST_CLIMAX_DES_HU);
export_constant(EFST_CLIMAX);
@ -4172,44 +4174,6 @@
export_constant(EFST_C_RATE_PLUS);
export_constant(EFST_RESIST_PLUS);
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
/// Do not modify code above this, since it will be automatically generated by the API again
export_constant(EFST_MAX);
@ -7847,6 +7811,7 @@
export_constant(IG_COSTUMEMILEPACK_35_1);
export_constant(IG_COSTUMEMILEPACK_35_2);
export_constant(IG_COSTUMEMILEPACK_35_3);
export_constant(IG_D_GW_EXTRACTOR);
/* unit stop walking */
export_constant(USW_NONE);
@ -9186,11 +9151,6 @@
export_constant_npc(JT_4_EP21_HOWELL_S);
export_constant_npc(JT_4_EP21_TAN_S);
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_MOCLORD);
export_constant_npc(JT_ROZ_MQ_SKULD);
@ -10555,21 +10515,7 @@
export_constant(HAT_EF_C_BABY_GLOOM);
export_constant(HAT_EF_WINTERNIGHTBELLS);
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_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 */
export_constant(PET_CATCH_UNIVERSAL);

File diff suppressed because it is too large Load Diff

View File

@ -1500,17 +1500,7 @@ enum e_skill {
NPC_CANE_OF_EVIL_EYE,
NPC_CURSE_OF_RED_CUBE,
NPC_CURSE_OF_BLUE_CUBE,
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
NPC_KILLING_AURA, // 783
KN_CHARGEATK = 1001,
CR_SHRINK,
@ -2342,10 +2332,6 @@ enum e_skill {
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
SS_FUUMAKOUCHIKU_BLASTING,
SS_FOUR_CHARM = 5499,
NW_WILD_SHOT,
NW_MIDNIGHT_FALLEN,
DK_DRAGONIC_BREATH = 6001,
MT_SPARK_BLASTER,
MT_TRIPLE_LASER,
@ -2353,21 +2339,6 @@ enum e_skill {
BO_EXPLOSIVE_POWDER,
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_AVOID,
HLIF_BRAIN,

View File

@ -1243,11 +1243,10 @@ static inline void status_cpy(struct status_data* a, const struct status_data* b
*/
int status_set_hp(struct block_list *bl, unsigned int hp, int flag)
{
struct status_data *status;
if (hp < 1)
return 0;
status_data* status = status_get_status_data(*bl);
status = status_get_status_data(bl);
if (status == &dummy_status)
return 0;
@ -1270,13 +1269,12 @@ int status_set_hp(struct block_list *bl, unsigned int hp, int flag)
*/
int status_set_maxhp(struct block_list *bl, unsigned int maxhp, int flag)
{
struct status_data *status;
int64 heal;
if (maxhp < 1)
return 0;
status_data* status = status_get_status_data(*bl);
status = status_get_status_data(bl);
if (status == &dummy_status)
return 0;
@ -1304,8 +1302,9 @@ int status_set_maxhp(struct block_list *bl, unsigned int maxhp, int flag)
*/
int status_set_sp(struct block_list *bl, unsigned int sp, int flag)
{
status_data* status = status_get_status_data(*bl);
struct status_data *status;
status = status_get_status_data(bl);
if (status == &dummy_status)
return 0;
@ -1328,11 +1327,10 @@ int status_set_sp(struct block_list *bl, unsigned int sp, int flag)
*/
int status_set_maxsp(struct block_list *bl, unsigned int maxsp, int flag)
{
struct status_data *status;
if (maxsp < 1)
return 0;
status_data* status = status_get_status_data(*bl);
status = status_get_status_data(bl);
if (status == &dummy_status)
return 0;
@ -1357,7 +1355,7 @@ int status_set_maxsp(struct block_list *bl, unsigned int maxsp, int flag)
*/
int status_set_ap(struct block_list *bl, unsigned int ap, int flag)
{
status_data *status = status_get_status_data(*bl);
status_data *status = status_get_status_data(bl);
if (status == &dummy_status)
return 0;
@ -1384,7 +1382,7 @@ int status_set_maxap(struct block_list *bl, unsigned int maxap, int flag)
if (maxap < 1)
return 0;
status_data *status = status_get_status_data(*bl);
status_data *status = status_get_status_data(bl);
if (status == &dummy_status)
return 0;
@ -1436,6 +1434,7 @@ int64 status_charge(struct block_list* bl, int64 hp, int64 sp)
*/
int status_damage(struct block_list *src,struct block_list *target,int64 dhp, int64 dsp, int64 dap, t_tick walkdelay, int flag, uint16 skill_id)
{
struct status_data *status;
status_change *sc;
int hp = (int)cap_value(dhp,INT_MIN,INT_MAX);
int sp = (int)cap_value(dsp,INT_MIN,INT_MAX);
@ -1470,9 +1469,8 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
return 0;
}
status_data* status = status_get_status_data(*target);
if( status == &dummy_status )
status = status_get_status_data(target);
if(!status || status == &dummy_status )
return 0;
if ((unsigned int)hp >= status->hp) {
@ -1647,7 +1645,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
else
status_revive(target, sc->getSCE(SC_KAIZEL)->val2, 0);
status_change_clear(target,0);
clif_skill_nodamage(target,*target,ALL_RESURRECTION,1);
clif_skill_nodamage(target,target,ALL_RESURRECTION,1,1);
sc_start(src,target,SC_KYRIE,100,10,time);
if( target->type == BL_MOB )
@ -1660,7 +1658,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
if (sc && sc->getSCE(SC_ULTIMATE_S) && !map_flag_gvg2(target->m)) {
status_revive(target, 100, 100);
status_change_clear(target, 0);
clif_skill_nodamage(target, *target, ALL_RESURRECTION, 1);
clif_skill_nodamage(target, target, ALL_RESURRECTION, 1, 1);
if (target->type == BL_MOB)
((TBL_MOB*)target)->state.rebirth = 1;
@ -1722,12 +1720,13 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
*/
int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag)
{
struct status_data *status;
status_change *sc;
int hp = (int)cap_value(hhp,INT_MIN,INT_MAX);
int sp = (int)cap_value(hsp,INT_MIN,INT_MAX);
int ap = (int)cap_value(hap,INT_MIN,INT_MAX);
status_data* status = status_get_status_data(*bl);
status = status_get_status_data(bl);
if (status == &dummy_status || !status->hp)
return 0;
@ -1822,8 +1821,11 @@ int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag)
*/
int status_percent_change(struct block_list *src, struct block_list *target, int8 hp_rate, int8 sp_rate, int8 ap_rate, uint8 flag)
{
struct status_data *status;
unsigned int hp = 0, sp = 0, ap = 0;
status_data* status = status_get_status_data(*target);
status = status_get_status_data(target);
// It's safe now [MarkZD]
if (hp_rate > 99)
@ -1900,11 +1902,11 @@ int status_percent_change(struct block_list *src, struct block_list *target, int
*/
int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp, unsigned char per_ap)
{
struct status_data *status;
unsigned int hp, sp, ap;
if (!status_isdead(*bl)) return 0;
status_data* status = status_get_status_data(*bl);
if (!status_isdead(bl)) return 0;
status = status_get_status_data(bl);
if (status == &dummy_status)
return 0; // Invalid target.
@ -1956,13 +1958,13 @@ int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per
* @author [Skotlex]
*/
bool status_check_skilluse(struct block_list *src, struct block_list *target, uint16 skill_id, int flag) {
status_data* status;
struct status_data *status;
int hide_flag;
if (src) {
if (src->type != BL_PC && status_isdead(*src))
if (src->type != BL_PC && status_isdead(src))
return false;
status = status_get_status_data(*src);
status = status_get_status_data(src);
}else{
status = &dummy_status;
}
@ -1978,7 +1980,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
return false;
// Dead state is not checked for skills as some skills can be used
// on dead characters, said checks are left to skill.cpp [Skotlex]
if (target && status_isdead(*target))
if (target && status_isdead(target))
return false;
}
@ -1990,7 +1992,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
break;
#endif
case GN_WALLOFTHORN:
if( target && status_isdead(*target) )
if( target && status_isdead(target) )
return false;
break;
case AL_TELEPORT:
@ -2220,6 +2222,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
int status_check_visibility(struct block_list *src, struct block_list *target)
{
int view_range;
struct status_data* status = status_get_status_data(src);
status_change* tsc = status_get_sc(target);
switch (src->type) {
case BL_MOB:
@ -2240,7 +2243,7 @@ int status_check_visibility(struct block_list *src, struct block_list *target)
if (tsc) {
bool is_boss = (status_get_class_(src) == CLASS_BOSS);
bool is_detector = status_bl_has_mode(src,MD_DETECTOR);
bool is_detector = status_has_mode(status,MD_DETECTOR);
switch (target->type) { // Check for chase-walk/hiding/cloaking opponents.
case BL_PC: {
@ -2874,24 +2877,18 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
}
case NC_SILVERSNIPER:
{
status_data* mstatus = status_get_status_data(*mbl);
// TODO: check if dummy_status? Can never be nullptr [Lemongrass]
struct status_data *mstatus = status_get_status_data(mbl);
if(!mstatus)
break;
status->max_hp = (1000 * ud->skill_lv) + (mstatus->hp / 3) + (status_get_lv(mbl) * 12);
status->batk = 200 * ud->skill_lv;
break;
}
case NC_MAGICDECOY:
{
status_data* mstatus = status_get_status_data(*mbl);
// TODO: check if dummy_status? Can never be nullptr [Lemongrass]
struct status_data *mstatus = status_get_status_data(mbl);
if(!mstatus)
break;
status->max_hp = (1000 * ((TBL_PC*)mbl)->menuskill_val) + (mstatus->sp * 4) + (status_get_lv(mbl) * 12);
status->matk_min = status->matk_max = 250 + 50*((TBL_PC*)mbl)->menuskill_val;
break;
@ -2901,9 +2898,8 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
case MT_SUMMON_ABR_MOTHER_NET:
case MT_SUMMON_ABR_INFINITY: {
map_session_data *msd = BL_CAST(BL_PC, mbl);
status_data* mstatus = status_get_status_data(*mbl);
status_data *mstatus = status_get_status_data(mbl);
// TODO: check if mstatus is dummy_status? Can never be nullptr [Lemongrass]
if (msd == nullptr || mstatus == nullptr)
break;
@ -2937,9 +2933,8 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
case BO_CREEPER:
case BO_HELLTREE: {
map_session_data *msd = BL_CAST(BL_PC, mbl);
status_data* mstatus = status_get_status_data(*mbl);
status_data *mstatus = status_get_status_data(mbl);
// TODO: check if mstatus is dummy_status? Can never be nullptr [Lemongrass]
if (msd == nullptr || mstatus == nullptr)
break;
@ -4914,7 +4909,7 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt)
// Client doesn't delete unavailable skills even if we refresh the skill tree, individually delete them.
for (i = 0; i < MAX_SKILL; i++) {
if (b_skill[i].id != 0 && sd->status.skill[i].id == 0)
clif_deleteskill(*sd, b_skill[i].id, true);
clif_deleteskill(sd, b_skill[i].id, true);
}
#endif
clif_skillinfoblock(sd);
@ -5601,7 +5596,7 @@ void status_calc_state( struct block_list *bl, status_change *sc, std::bitset<SC
void status_calc_bl_main(struct block_list& bl, std::bitset<SCB_MAX> flag)
{
const struct status_data *b_status = status_get_base_status(&bl); // Base Status
status_data* status = status_get_status_data(bl); // Battle Status
struct status_data *status = status_get_status_data(&bl); // Battle Status
status_change *sc = status_get_sc(&bl);
TBL_PC *sd = BL_CAST(BL_PC,&bl);
int temp;
@ -5956,9 +5951,12 @@ void status_calc_bl_main(struct block_list& bl, std::bitset<SCB_MAX> flag)
* No status changes alter these yet.
* if(flag[SCB_SIZE])
* if(flag[SCB_RACE])
* if(flag[SCB_RANGE])
**/
if (flag[SCB_RANGE]) {
status->rhw.range = b_status->rhw.range;
}
if(flag[SCB_MAXHP]) {
if( bl.type == BL_PC ) {
status->max_hp = status_calc_maxhpsp_pc(sd,status->vit,true);
@ -6244,6 +6242,9 @@ void status_calc_bl_main(struct block_list& bl, std::bitset<SCB_MAX> flag)
*/
void status_calc_bl_(struct block_list* bl, std::bitset<SCB_MAX> flag, uint8 opt)
{
struct status_data b_status; // Previous battle status
struct status_data* status; // Pointer to current battle status
if (bl->type == BL_PC) {
map_session_data *sd = BL_CAST(BL_PC, bl);
@ -6257,14 +6258,9 @@ void status_calc_bl_(struct block_list* bl, std::bitset<SCB_MAX> flag, uint8 opt
}
}
// Pointer to current battle status
status_data* status = status_get_status_data(*bl);
// Previous battle status
status_data b_status;
// Remember previous values
memcpy(&b_status, status, sizeof(b_status));
status = status_get_status_data(bl);
memcpy(&b_status, status, sizeof(struct status_data));
if( flag[SCB_BASE] ) { // Calculate the object's base status too
switch( bl->type ) {
@ -6686,8 +6682,10 @@ static unsigned short status_calc_vit(struct block_list *bl, status_change *sc,
vit -= vit * sc->getSCE(SC_STRIPARMOR)->val2/100;
if(sc->getSCE(SC_FULL_THROTTLE))
vit += vit * sc->getSCE(SC_FULL_THROTTLE)->val3 / 100;
if(bl->type == BL_PC && sc->getSCE(SC_DEFENCE))
#ifdef RENEWAL
if(sc->getSCE(SC_DEFENCE))
vit += sc->getSCE(SC_DEFENCE)->val2;
#endif
if(sc->getSCE(SC_CHEERUP))
vit += 3;
if(sc->getSCE(SC_GLASTHEIM_STATE))
@ -7683,10 +7681,6 @@ static defType status_calc_def(struct block_list *bl, status_change *sc, int def
if(sc->getSCE(SC_BERSERK))
return 0;
#ifdef RENEWAL
if(sc->getSCE(SC_ETERNALCHAOS))
return 0;
#endif
if(sc->getSCE(SC_BARRIER))
return 100;
if(sc->getSCE(SC_KEEPING))
@ -7709,9 +7703,10 @@ static defType status_calc_def(struct block_list *bl, status_change *sc, int def
#ifdef RENEWAL
if (sc->getSCE(SC_ASSUMPTIO))
def += sc->getSCE(SC_ASSUMPTIO)->val1 * 50;
#endif
if (bl->type == BL_HOM && sc->getSCE(SC_DEFENCE))
#else
if(sc->getSCE(SC_DEFENCE))
def += sc->getSCE(SC_DEFENCE)->val2;
#endif
if(sc->getSCE(SC_INCDEFRATE))
def += def * sc->getSCE(SC_INCDEFRATE)->val1/100;
if(sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 2)
@ -8999,29 +8994,18 @@ struct regen_data *status_get_regen_data(struct block_list *bl)
* @param bl: Object whose status to get [PC|MOB|PET|HOM|MER|ELEM|NPC]
* @return status or "dummy_status" if any other bl->type than noted above
*/
status_data* status_get_status_data(block_list& bl){
switch (bl.type) {
case BL_PC:
return &reinterpret_cast<map_session_data*>( &bl )->battle_status;
case BL_MOB:
return &reinterpret_cast<mob_data*>( &bl )->status;
case BL_PET:
return &reinterpret_cast<pet_data*>( &bl )->status;
case BL_HOM:
return &reinterpret_cast<homun_data*>( &bl )->battle_status;
case BL_MER:
return &reinterpret_cast<s_mercenary_data*>( &bl )->battle_status;
case BL_ELEM:
return &reinterpret_cast<s_elemental_data*>( &bl )->battle_status;
case BL_NPC: {
npc_data* nd = reinterpret_cast<npc_data*>( &bl );
struct status_data *status_get_status_data(struct block_list *bl)
{
nullpo_retr(&dummy_status, bl);
if( mobdb_checkid( nd->class_ ) == 0 ){
return &nd->status;
}else{
return &dummy_status;
}
}
switch (bl->type) {
case BL_PC: return &((TBL_PC*)bl)->battle_status;
case BL_MOB: return &((TBL_MOB*)bl)->status;
case BL_PET: return &((TBL_PET*)bl)->status;
case BL_HOM: return &((TBL_HOM*)bl)->battle_status;
case BL_MER: return &((TBL_MER*)bl)->battle_status;
case BL_ELEM: return &((TBL_ELEM*)bl)->battle_status;
case BL_NPC: return ((mobdb_checkid(((TBL_NPC*)bl)->class_) == 0) ? &((TBL_NPC*)bl)->status : &dummy_status);
default:
return &dummy_status;
}
@ -9056,8 +9040,7 @@ struct status_data *status_get_base_status(struct block_list *bl)
defType status_get_def(struct block_list *bl)
{
struct unit_data *ud;
status_data* status = status_get_status_data(*bl);
// TODO: check if dummy_status? Can never be nullptr [Lemongrass]
struct status_data *status = status_get_status_data(bl);
int def = status?status->def:0;
ud = unit_bl2ud(bl);
if (ud && ud->skilltimer != INVALID_TIMER)
@ -9073,10 +9056,9 @@ defType status_get_def(struct block_list *bl)
*/
unsigned short status_get_speed(struct block_list *bl)
{
// TODO: is the statement of Skotlex still true? And would it not be better to check for dummy_status instead? [Lemongrass]
if(bl->type==BL_NPC)// Only BL with speed data but no status_data [Skotlex]
return ((struct npc_data *)bl)->speed;
return status_get_status_data(*bl)->speed;
return status_get_status_data(bl)->speed;
}
/**
@ -9242,7 +9224,9 @@ std::vector<e_race2> status_get_race2(struct block_list *bl)
* @param bl: Object to check [PC|MOB|HOM|MER|ELEM]
* @return 1: Is dead or 0: Is alive
*/
bool status_isdead(block_list &bl){
int status_isdead(struct block_list *bl)
{
nullpo_ret(bl);
return status_get_status_data(bl)->hp == 0;
}
@ -9544,6 +9528,8 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
/// Example: 25% (2500) -> sc_def2 = 2000 -> 5%;
/// 2500ms -> tick_def2=2000 -> 500ms
int sc_def2 = 0, tick_def2 = 0;
struct status_data *status, *status_src;
status_change *sc;
map_session_data *sd;
@ -9566,8 +9552,8 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
}
sd = BL_CAST(BL_PC,bl);
status_data* status = status_get_status_data(*bl);
status_data* status_src = status_get_status_data(*src);
status = status_get_status_data(bl);
status_src = status_get_status_data(src);
sc = status_get_sc(bl);
if( sc && !sc->count )
sc = nullptr;
@ -10043,6 +10029,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
map_session_data *sd = nullptr;
status_change* sc;
struct status_change_entry* sce;
struct status_data *status;
struct view_data *vd;
int undead_flag, tick_time = 0;
bool sc_isnew = true;
@ -10050,6 +10037,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
nullpo_ret(bl);
sc = status_get_sc(bl);
status = status_get_status_data(bl);
if( !scdb ) {
ShowError("status_change_start: Invalid status change (%d)!\n", type);
@ -10059,7 +10047,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if( !sc )
return 0; // Unable to receive status changes
if( bl->type != BL_NPC && status_isdead(*bl) && ( type != SC_NOCHAT && type != SC_JAILED ) ) // SC_NOCHAT and SC_JAILED should work even on dead characters
if( bl->type != BL_NPC && status_isdead(bl) && ( type != SC_NOCHAT && type != SC_JAILED ) ) // SC_NOCHAT and SC_JAILED should work even on dead characters
return 0;
if (status_change_isDisabledOnMap(type, map_getmapdata(bl->m)))
@ -10076,8 +10064,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if (sc->option&OPTION_MADOGEAR && flag&SCSTART_NOAVOID && scdb->flag[SCF_FAILEDMADO])
return 0;
status_data* status = status_get_status_data(*bl);
// Check for Boss resistances
if(status->mode&MD_STATUSIMMUNE && !(flag&SCSTART_NOAVOID) && scdb->flag[SCF_BOSSRESIST])
return 0;
@ -11174,7 +11160,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if (sd) {
pc_setsit(sd);
skill_sit(sd, true);
clif_sitting(sd->bl);
clif_sitting(&sd->bl);
}
val2 = 12; // SP cost
tick_time = 10000; // Decrease at 10secs intervals.
@ -11236,13 +11222,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
struct block_list *pbl = map_id2bl(val1);
status_change *psc = pbl?status_get_sc(pbl):nullptr;
struct status_change_entry *psce = psc?psc->getSCE(SC_MARIONETTE):nullptr;
// Fetch target's stats
struct status_data* status2 = status_get_status_data(bl); // Battle status
if (!psce)
return 0;
// Fetch target's stats
status_data* status2 = status_get_status_data(*bl); // Battle status
val3 = 0;
val4 = 0;
max_stat = battle_config.max_parameter; // Cap to 99 (default)
@ -11258,7 +11243,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
//1st Transcendent Spirit works similar to Marionette Control
if(sd && val2 == SL_HIGH) {
int stat,max_stat;
status_data *status2 = status_get_base_status(bl);
struct status_data *status2 = status_get_base_status(bl);
val3 = 0;
val4 = 0;
@ -11507,21 +11492,16 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val2 = 10 * val1;
break;
case SC_DEFENCE:
// Vit bonus for players / Def bonus for homunculus
#ifdef RENEWAL
val2 = 5 + (5 * val1);
val2 = 5 + (val1 * 5); // Vit bonus
#else
val2 = 2 * val1;
val2 = 2*val1; // Def bonus
#endif
break;
case SC_BLOODLUST:
// Atk rate change
val2 = 20 + (10 * val1);
// Leech chance
// It's actually 9 * level on both pre-re and renewal, despite the description
val3 = 9 * val1;
// Leech percent
val4 = 20;
val2 = 20+10*val1; // Atk rate change.
val3 = 3*val1; // Leech chance
val4 = 20; // Leech percent
break;
case SC_FLEET:
val2 = 30*val1; // Aspd change
@ -11958,7 +11938,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if( sd && !pc_issit(sd) ) {
pc_setsit(sd);
skill_sit(sd, true);
clif_sitting(*bl);
clif_sitting(bl);
}
break;
case SC_DANCEWITHWUG:
@ -13137,19 +13117,19 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
switch(sce->val1) {
case TK_STORMKICK:
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
clif_skill_nodamage(bl,*bl,TK_READYSTORM,1);
clif_skill_nodamage(bl,bl,TK_READYSTORM,1,1);
break;
case TK_DOWNKICK:
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
clif_skill_nodamage(bl,*bl,TK_READYDOWN,1);
clif_skill_nodamage(bl,bl,TK_READYDOWN,1,1);
break;
case TK_TURNKICK:
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
clif_skill_nodamage(bl,*bl,TK_READYTURN,1);
clif_skill_nodamage(bl,bl,TK_READYTURN,1,1);
break;
case TK_COUNTER:
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
clif_skill_nodamage(bl,*bl,TK_READYCOUNTER,1);
clif_skill_nodamage(bl,bl,TK_READYCOUNTER,1,1);
break;
default: // Rest just toggle inf to enable autotarget
skill_combo_toggle_inf(bl,sce->val1,INF_SELF_SKILL);
@ -13269,12 +13249,14 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
map_session_data *sd;
status_change *sc;
struct status_change_entry *sce;
struct status_data *status;
struct view_data *vd;
std::shared_ptr<s_status_change_db> scdb = status_db.find(type);
nullpo_ret(bl);
sc = status_get_sc(bl);
status = status_get_status_data(bl);
if(!sc || !(sce = sc->getSCE(type)) || !scdb)
return 0;
@ -13320,7 +13302,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
sce->val4 = 0;
if (group)
skill_delunitgroup(group);
if (!status_isdead(*bl) && (sce->val2 || sce->val3 || sce->val4))
if (!status_isdead(bl) && (sce->val2 || sce->val3 || sce->val4))
return 0; //Don't end the status change yet as there are still unit groups associated with it
}
if (sce->timer != INVALID_TIMER) // Could be a SC with infinite duration
@ -13339,7 +13321,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
vd = status_get_viewdata(bl);
std::bitset<SCB_MAX> calc_flag = scdb->calc_flag;
status_data* status = status_get_status_data(*bl);
switch(type) {
case SC_KEEPING:
@ -13643,7 +13624,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
struct block_list* src = map_id2bl(sce->val2);
if( tid == -1 || !src)
break; // Terminated by Damage
status_fix_damage(src,bl,400*sce->val1,clif_damage(*bl,*bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false),WL_WHITEIMPRISON);
status_fix_damage(src,bl,400*sce->val1,clif_damage(bl,bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false),WL_WHITEIMPRISON);
}
break;
case SC_WUGDASH:
@ -13716,7 +13697,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
break;
case SC_GRAVITYCONTROL:
status_fix_damage(bl, bl, sce->val2, clif_damage(*bl, *bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0);
status_fix_damage(bl, bl, sce->val2, clif_damage(bl, bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0);
clif_specialeffect(bl, 223, AREA);
clif_specialeffect(bl, 330, AREA);
break;
@ -13769,7 +13750,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
if( tid != INVALID_TIMER ){
map_session_data *caster = nullptr;
if (status_isdead(*bl) || !(caster = map_id2sd(sce->val2)))
if (status_isdead(bl) || !(caster = map_id2sd(sce->val2)))
break;
std::shared_ptr<s_skill_db> skill = skill_db.find(RL_H_MINE);
@ -13953,7 +13934,7 @@ TIMER_FUNC(status_change_timer){
}
status_change * const sc = status_get_sc(bl);
struct status_data * const status = status_get_status_data(bl);
if(!sc) {
ShowDebug("status_change_timer: Null pointer id: %d data: %" PRIdPTR " bl-type: %d\n", id, data, bl->type);
return 0;
@ -13969,8 +13950,6 @@ TIMER_FUNC(status_change_timer){
return 0;
}
const status_data* status = status_get_status_data(*bl);
sd = BL_CAST(BL_PC, bl);
std::function<void (t_tick)> sc_timer_next = [&sce, &bl, &data](t_tick t) {
@ -14070,7 +14049,7 @@ TIMER_FUNC(status_change_timer){
int64 damage = 1000 + (3 * status->max_hp) / 100; // Deals fixed (1000 + 3%*MaxHP)
map_freeblock_lock();
dounlock = true;
status_fix_damage(bl, bl, damage, clif_damage(*bl, *bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0);
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0);
}
break;
@ -14079,7 +14058,7 @@ TIMER_FUNC(status_change_timer){
if (sce->val3 == 1) { // Target
map_freeblock_lock();
dounlock = true;
status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0);
status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0);
} else { // Caster
interval = 1000; // Assign here since status_get_sc_internval() contains the target interval.
@ -14138,7 +14117,7 @@ TIMER_FUNC(status_change_timer){
if (sce->val4 >= 0) {
map_freeblock_lock();
dounlock = true;
status_fix_damage(bl, bl, 100, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0);
status_fix_damage(bl, bl, 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0);
unit_skillcastcancel(bl, 2);
}
break;
@ -14148,7 +14127,7 @@ TIMER_FUNC(status_change_timer){
int64 damage = status->vit * (sce->val1 - 3) + (int)status->max_hp / 100; // {Target VIT x (New Poison Research Skill Level - 3)} + (Target HP/100)
map_freeblock_lock();
dounlock = true;
status_fix_damage(bl, bl, damage, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false),0);
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false),0);
unit_skillcastcancel(bl, 2);
}
break;
@ -14588,7 +14567,7 @@ TIMER_FUNC(status_change_timer){
if (--(sce->val4) >= 0) {
struct block_list *src = map_id2bl(sce->val2);
if (!src || (src && (status_isdead(*src) || src->m != bl->m)))
if (!src || (src && (status_isdead(src) || src->m != bl->m)))
break;
map_freeblock_lock();
if (!status_charge(bl, 0, 50))
@ -14675,7 +14654,7 @@ TIMER_FUNC(status_change_timer){
int damage = sce->val2;
map_freeblock_lock();
clif_damage(*bl, *bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false);
clif_damage(bl, bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false);
status_damage(src, bl, damage,0, 0, 1, 0);
if( sc->getSCE(type) ) {
sc_timer_next(2000 + tick);
@ -14697,7 +14676,7 @@ TIMER_FUNC(status_change_timer){
if( sd && !pc_issit(sd) ) { // Force to sit every 10 seconds.
pc_setsit(sd);
skill_sit(sd, true);
clif_sitting(*bl);
clif_sitting(bl);
}
sc_timer_next(10000 + tick);
return 0;
@ -14794,7 +14773,7 @@ TIMER_FUNC(status_change_timer){
uint16 x = sce->val3 >> 16, y = sce->val3 & 0xFFFF;
if (distance_xy(x, y, bl->x, bl->y) <= skill_get_unit_range(SO_VACUUM_EXTREME, sce->val1) && unit_movepos(bl, x, y, 0, false)) {
clif_slide(*bl, x, y);
clif_slide(bl, x, y);
clif_fixpos( *bl );
}
}
@ -14888,7 +14867,7 @@ TIMER_FUNC(status_change_timer){
struct block_list *star_caster = map_id2bl(sce->val2);
struct skill_unit *star_aoe = (struct skill_unit *)map_id2bl(sce->val3);
if (star_caster == nullptr || status_isdead(*star_caster) || star_caster->m != bl->m || star_aoe == nullptr)
if (star_caster == nullptr || status_isdead(star_caster) || star_caster->m != bl->m || star_aoe == nullptr)
break;
sc_timer_next(500 + tick);
@ -14902,7 +14881,7 @@ TIMER_FUNC(status_change_timer){
if (--(sce->val4) >= 0) { // Needed to check the caster's location for the range check.
struct block_list *unity_src = map_id2bl(sce->val2);
if (!unity_src || status_isdead(*unity_src) || unity_src->m != bl->m || !check_distance_bl(bl, unity_src, 11))
if (!unity_src || status_isdead(unity_src) || unity_src->m != bl->m || !check_distance_bl(bl, unity_src, 11))
break;
status_heal(bl, 150 * sce->val1, 0, 2);
@ -15028,7 +15007,7 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
enum sc_type type = (sc_type)va_arg(ap,int); // gcc: enum args get promoted to int
t_tick tick = va_arg(ap,t_tick);
if (status_isdead(*bl))
if (status_isdead(bl))
return 0;
tsc = status_get_sc(bl);
@ -15232,6 +15211,7 @@ static t_tick natural_heal_prev_tick,natural_heal_diff_tick;
static int status_natural_heal(struct block_list* bl, va_list args)
{
struct regen_data *regen;
struct status_data *status;
status_change *sc;
struct unit_data *ud;
struct view_data *vd = nullptr;
@ -15242,9 +15222,7 @@ static int status_natural_heal(struct block_list* bl, va_list args)
regen = status_get_regen_data(bl);
if (!regen)
return 0;
status_data* status = status_get_status_data(*bl);
status = status_get_status_data(bl);
sc = status_get_sc(bl);
if (sc && !sc->count)
sc = nullptr;
@ -15262,7 +15240,7 @@ static int status_natural_heal(struct block_list* bl, va_list args)
flag &= ~RGN_SSP;
if (flag && (
status_isdead(*bl) ||
status_isdead(bl) ||
(sc && (sc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || sc->getSCE(SC__INVISIBILITY)))
))
flag = RGN_NONE;

View File

@ -1755,7 +1755,7 @@ enum efst_type : short{
EFST_SPELLFIST,
EFST_NETHERWORLD,
EFST_SIREN,
EFST_DEEP_SLEEP,
EFST_HANDICAPSTATE_DEEP_SLEEP,
EFST_SIRCLEOFNATURE,
EFST_COLD,
EFST_GLOOMYDAY,
@ -1818,7 +1818,7 @@ enum efst_type : short{
EFST_DROCERA_HERB_STEAMED,
EFST_PUTTI_TAILS_NOODLES,
EFST_BANANA_BOMB,
EFST_SUMMON_AGNI,
XXX_EFST_SM_ELEMENTAL,
EFST_SPELLBOOK4,
EFST_SPELLBOOK5,
EFST_SPELLBOOK6,
@ -1953,8 +1953,8 @@ enum efst_type : short{
EFST_SET_NUM_MDEF,
EFST_SET_PER_DEF,
EFST_SET_PER_MDEF,
EFST_PARTYBOOKING_SEARCH_DEALY,
EFST_PARTYBOOKING_REGISTER_DEALY,
EFST_PARTYBOOKING_SEARCH_DELAY,
EFST_PARTYBOOKING_REGISTER_DELAY,
EFST_PERIOD_TIME_CHECK_DETECT_SKILL,
EFST_KO_JYUMONJIKIRI,
EFST_MEIKYOUSISUI,
@ -1995,7 +1995,7 @@ enum efst_type : short{
EFST_GLASTHEIM_STATE,
EFST_GLASTHEIM_ITEMDEF,
EFST_GLASTHEIM_HPSP,
EFST_HOMUN_SKILL_POSTDELAY,
EFST_FOLLOWER_NPC_SKILL_POSTDELAY,
EFST_ALMIGHTY,
EFST_GVG_GIANT,
EFST_GVG_GOLEM,
@ -2021,7 +2021,7 @@ enum efst_type : short{
EFST_QUEST_BUFF3,
EFST_REUSE_LIMIT_RECALL,
EFST_SAVEPOSITION,
EFST_HANDICAPSTATE_ICEEXPLO,
EFST_NPC_ICEEXPLO,
EFST_FENRIR_CARD,
EFST_REUSE_LIMIT_ASPD_POTION,
EFST_MAXPAIN,
@ -2125,7 +2125,7 @@ enum efst_type : short{
EFST_GC_POISONINGWEAPON_OPERATOR,
EFST_WS_WEAPONREFINE_OPERATOR,
EFST_BS_REPAIRWEAPON_OPERATOR,
EFST_GET_MAILBOX,
EFST_UNREADMAIL_CHECK,
EFST_JUMPINGCLAN,
EFST_JP_OTP,
EFST_HANDICAPTOLERANCE_LEVELGAP,
@ -2446,13 +2446,13 @@ enum efst_type : short{
EFST_PERIOD_USE_WORLDMAP,
EFST_MISTY_FROST,
EFST_MAGIC_POISON,
EFST_MOVE_AGIT,
EFST_KAUTE,
EFST_REUSE_JPNONLY_LIMIT_I,
EFST_REUSE_JPNONLY_LIMIT_J,
EFST_REUSE_JPNONLY_LIMIT_K,
EFST_JPNONLY_TACTICS,
EFST_PRISON,
EFST_MADOGEAR_TYPE,
EFST_MADOGEAR,
EFST_DEADLY_DEFEASANCE,
EFST_CLIMAX_DES_HU,
EFST_CLIMAX,
@ -2736,50 +2736,6 @@ enum efst_type : short{
EFST_C_RATE_PLUS,
EFST_RESIST_PLUS,
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
/// Do not modify code above this, since it will be automatically generated by the API again
EFST_MAX,
@ -3399,68 +3355,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);
struct regen_data *status_get_regen_data(struct block_list *bl);
status_data* status_get_status_data(block_list& bl);
struct status_data *status_get_status_data(struct block_list *bl);
struct status_data *status_get_base_status(struct block_list *bl);
const char * status_get_name(struct block_list *bl);
int status_get_class(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_hp(bl) status_get_status_data(*bl)->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_max_sp(bl) status_get_status_data(*bl)->max_sp
#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_str(bl) status_get_status_data(*bl)->str
#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_int(bl) status_get_status_data(*bl)->int_
#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_pow(bl) status_get_status_data(*bl)->pow
#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_spl(bl) status_get_status_data(*bl)->spl
#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_hit(bl) status_get_status_data(*bl)->hit
#define status_get_flee(bl) status_get_status_data(*bl)->flee
#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_max_hp(bl) status_get_status_data(bl)->max_hp
#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_ap(bl) status_get_status_data(bl)->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_agi(bl) status_get_status_data(bl)->agi
#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_dex(bl) status_get_status_data(bl)->dex
#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_sta(bl) status_get_status_data(bl)->sta
#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_con(bl) status_get_status_data(bl)->con
#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_flee(bl) status_get_status_data(bl)->flee
defType status_get_def(struct block_list *bl);
#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_def2(bl) status_get_status_data(*bl)->def2
#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_batk(bl) status_get_status_data(*bl)->batk
#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_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_lwatk(bl) status_get_status_data(*bl)->lhw.atk
#define status_get_lwatk2(bl) status_get_status_data(*bl)->lhw.atk2
#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_def2(bl) status_get_status_data(bl)->def2
#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_batk(bl) status_get_status_data(bl)->batk
#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_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_lwatk(bl) status_get_status_data(bl)->lhw.atk
#define status_get_lwatk2(bl) status_get_status_data(bl)->lhw.atk2
unsigned short status_get_speed(struct block_list *bl);
#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_clientamotion(bl) status_get_status_data(*bl)->clientamotion
#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_smatk(bl) status_get_status_data(*bl)->smatk
#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_hplus(bl) status_get_status_data(*bl)->hplus
#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_level(bl) status_get_status_data(*bl)->ele_lv
#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_clientamotion(bl) status_get_status_data(bl)->clientamotion
#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_smatk(bl) status_get_status_data(bl)->smatk
#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_hplus(bl) status_get_status_data(bl)->hplus
#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_level(bl) status_get_status_data(bl)->ele_lv
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_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_race(bl) status_get_status_data(*bl)->race
#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_mode(bl) status_get_status_data(*bl)->mode
#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_race(bl) status_get_status_data(bl)->race
#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_mode(bl) status_get_status_data(bl)->mode
#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_homagi(bl) (status->agi + ((TBL_HOM*)bl)->homunculus.agi_value)
@ -3479,7 +3435,7 @@ void status_set_viewdata(struct block_list *bl, int class_);
void status_change_init(struct block_list *bl);
status_change *status_get_sc(struct block_list *bl);
bool status_isdead(block_list &bl);
int status_isdead(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);

View File

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

View File

@ -4,19 +4,8 @@
#ifndef TRADE_HPP
#define TRADE_HPP
#include <common/cbasetypes.hpp>
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_tradeack(map_session_data *sd,int type);
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;
// Check if the unit was killed
if( status_isdead(*bl) ){
if( status_isdead(bl) ){
struct mob_data* md = BL_CAST(BL_MOB, bl);
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 ) {
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)
clif_changed_dir(*bl, AREA);
clif_changed_dir(bl, AREA);
return true;
}
@ -1639,9 +1639,9 @@ TIMER_FUNC(unit_resume_running){
TBL_PC *sd = map_id2sd(id);
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
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)
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) {
//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;
//Make sure walk delay is not decreased
if (DIFF_TICK(ud->canmove_tick, tick+delay) > 0)
@ -1724,6 +1724,7 @@ 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)
{
struct unit_data *ud;
struct status_data *tstatus;
status_change *sc;
map_session_data *sd = nullptr;
struct block_list * target = nullptr;
@ -1732,7 +1733,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
nullpo_ret(src);
if(status_isdead(*src))
if(status_isdead(src))
return 0; // Do not continue source is dead
sd = BL_CAST(BL_PC, src);
@ -1872,7 +1873,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
return 0;
}
status_data* tstatus = status_get_status_data(*target);
tstatus = status_get_status_data(target);
// Record the status of the previous skill)
if(sd) {
@ -2017,7 +2018,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
case ALL_RESURRECTION:
if(battle_check_undead(tstatus->race,tstatus->def_ele))
combo = 1;
else if (!status_isdead(*target))
else if (!status_isdead(target))
return 0; // Can't cast on non-dead characters.
break;
case MO_FINGEROFFENSIVE:
@ -2250,7 +2251,7 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
if (!src->prev)
return 0; // Not on the map
if(status_isdead(*src))
if(status_isdead(src))
return 0;
sd = BL_CAST(BL_PC, src);
@ -2538,7 +2539,7 @@ int unit_attack(struct block_list *src,int target_id,int continuous)
nullpo_ret(ud = unit_bl2ud(src));
target = map_id2bl(target_id);
if( target == nullptr || status_isdead(*target) ) {
if( target == nullptr || status_isdead(target) ) {
unit_unattackable(src);
return 1;
}
@ -2796,6 +2797,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
{
struct block_list *target;
struct unit_data *ud;
struct status_data *sstatus;
map_session_data *sd = nullptr;
struct mob_data *md = nullptr;
int range;
@ -2816,7 +2818,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 )
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)
#ifdef OFFICIAL_WALKPATH
|| !path_search_long(nullptr, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL)
@ -2854,7 +2856,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
return 1;
}
status_data* sstatus = status_get_status_data(*src);
sstatus = status_get_status_data(src);
range = sstatus->rhw.range;
if( (unit_is_walking(target) || ud->state.step_attack)
@ -3130,44 +3132,32 @@ int unit_counttargeted(struct block_list* bl)
* @param src Current target
* @param target New target
**/
int unit_changetarget(block_list *bl, va_list ap) {
if (bl == nullptr)
return 1;
unit_data *ud = unit_bl2ud(bl);
block_list *src = va_arg(ap, block_list *);
block_list *target = va_arg(ap, block_list *);
int unit_changetarget(struct block_list *bl, va_list ap) {
struct unit_data *ud = unit_bl2ud(bl);
struct block_list *src = va_arg(ap,struct block_list *);
struct block_list *target = va_arg(ap,struct block_list *);
if (ud == nullptr || src == nullptr || target == nullptr || ud->target == target->id)
if (!ud || !target || ud->target == target->id)
return 1;
if (ud->target <= 0 && ud->target_to <= 0)
if (!ud->target && !ud->target_to)
return 1;
if (ud->target != src->id && ud->target_to != src->id)
return 1;
unit_changetarget_sub(*ud, *target);
if (bl->type == BL_MOB)
(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);
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
* On kill specifics are not performed here, check status_damage()
@ -3239,7 +3229,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
if(sd->chatID)
chat_leavechat(sd,0);
if(sd->trade_partner.id > 0)
if(sd->trade_partner)
trade_tradecancel(sd);
searchstore_close(*sd);
@ -3422,7 +3412,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
break;
case BL_MOB:
// /BL_MOB is handled by mob_dead unless the monster is not dead.
if (status_isdead(*bl)) {
if (status_isdead(bl)) {
map_delblock(bl);
break;
}
@ -3532,7 +3522,7 @@ int unit_free(struct block_list *bl, clr_type clrtype)
map_session_data *sd = (map_session_data*)bl;
int i;
if( status_isdead(*bl) )
if( status_isdead(bl) )
pc_setrestartvalue(sd,2);
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__)
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_changetarget(block_list *bl,va_list ap);
void unit_changetarget_sub(unit_data& ud, block_list& target);
int unit_changeviewsize(struct block_list *bl,short size);
int unit_changetarget(struct block_list *bl,va_list ap);
// Shadow Scar
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 ) {
// Make vendor look perfect
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 ) {
pc_setsit(&sd);
skill_sit(&sd, 1);
clif_sitting(sd.bl);
clif_sitting(&sd.bl);
}
// Immediate save