Compare commits
3 Commits
master
...
script/epi
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f73a858d6c | ||
![]() |
150fc78866 | ||
![]() |
7b816e18fb |
@ -1032,11 +1032,6 @@ Body:
|
|||||||
- Command: setcard
|
- Command: setcard
|
||||||
Help: |
|
Help: |
|
||||||
Adds a card or enchant to the specific slot of the equipment.
|
Adds a card or enchant to the specific slot of the equipment.
|
||||||
- Command: resetcooltime
|
|
||||||
Aliases:
|
|
||||||
- resetcooldown
|
|
||||||
Help: |
|
|
||||||
Resets the cooldown of all skills of the player and if active also of the homunculus or the mercenary.
|
|
||||||
|
|
||||||
Footer:
|
Footer:
|
||||||
Imports:
|
Imports:
|
||||||
|
@ -295,8 +295,8 @@ trait_points_job_change: 7
|
|||||||
|
|
||||||
// Max trait stats cap.
|
// Max trait stats cap.
|
||||||
// Trait Stats: POW, STA, WIS, SPL, CON, CRT
|
// Trait Stats: POW, STA, WIS, SPL, CON, CRT
|
||||||
// Official is 110.
|
// Official is 100.
|
||||||
max_trait_parameter: 110
|
max_trait_parameter: 100
|
||||||
|
|
||||||
// Max percent of RES/MRES that can be ignored by item bonus/skill.
|
// Max percent of RES/MRES that can be ignored by item bonus/skill.
|
||||||
// Default: 50
|
// Default: 50
|
||||||
|
@ -1823,8 +1823,5 @@
|
|||||||
1534: Usage: @stockall {<type>}
|
1534: Usage: @stockall {<type>}
|
||||||
1535: %d items are transferred (%d skipped)!
|
1535: %d items are transferred (%d skipped)!
|
||||||
|
|
||||||
1536: Log configuration has been reloaded.
|
|
||||||
1537: Found skill '%s', unblocking...
|
|
||||||
|
|
||||||
//Custom translations
|
//Custom translations
|
||||||
import: conf/msg_conf/import/map_msg_eng_conf.txt
|
import: conf/msg_conf/import/map_msg_eng_conf.txt
|
||||||
|
@ -47,6 +47,8 @@ Body:
|
|||||||
Value: 5
|
Value: 5
|
||||||
- Name: REPUTATION_EP18
|
- Name: REPUTATION_EP18
|
||||||
Value: 3
|
Value: 3
|
||||||
|
- Name: REPUTATION_EP19
|
||||||
|
Value: 4
|
||||||
|
|
||||||
Footer:
|
Footer:
|
||||||
Imports:
|
Imports:
|
||||||
|
@ -30822,6 +30822,7 @@ Body:
|
|||||||
TargetType: Self
|
TargetType: Self
|
||||||
DamageFlags:
|
DamageFlags:
|
||||||
NoDamage: true
|
NoDamage: true
|
||||||
|
Hit: Single
|
||||||
AfterCastActDelay: 1000
|
AfterCastActDelay: 1000
|
||||||
AfterCastWalkDelay: 1000
|
AfterCastWalkDelay: 1000
|
||||||
Requires:
|
Requires:
|
||||||
@ -30833,6 +30834,7 @@ Body:
|
|||||||
TargetType: Self
|
TargetType: Self
|
||||||
DamageFlags:
|
DamageFlags:
|
||||||
NoDamage: true
|
NoDamage: true
|
||||||
|
Hit: Single
|
||||||
AfterCastActDelay: 30000
|
AfterCastActDelay: 30000
|
||||||
AfterCastWalkDelay: 1000
|
AfterCastWalkDelay: 1000
|
||||||
Duration1:
|
Duration1:
|
||||||
@ -30863,6 +30865,8 @@ Body:
|
|||||||
Name: HAMI_SKIN
|
Name: HAMI_SKIN
|
||||||
Description: Adamantium Skin
|
Description: Adamantium Skin
|
||||||
MaxLevel: 5
|
MaxLevel: 5
|
||||||
|
DamageFlags:
|
||||||
|
NoDamage: true
|
||||||
- Id: 8008
|
- Id: 8008
|
||||||
Name: HAMI_BLOODLUST
|
Name: HAMI_BLOODLUST
|
||||||
Description: Bloodlust
|
Description: Bloodlust
|
||||||
@ -30870,6 +30874,7 @@ Body:
|
|||||||
TargetType: Self
|
TargetType: Self
|
||||||
DamageFlags:
|
DamageFlags:
|
||||||
NoDamage: true
|
NoDamage: true
|
||||||
|
Hit: Single
|
||||||
AfterCastActDelay:
|
AfterCastActDelay:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
Time: 300000
|
Time: 300000
|
||||||
|
@ -552,33 +552,3 @@ Body:
|
|||||||
Points: 4545
|
Points: 4545
|
||||||
- Level: 260
|
- Level: 260
|
||||||
Points: 4545
|
Points: 4545
|
||||||
- Level: 261
|
|
||||||
Points: 4545
|
|
||||||
- Level: 262
|
|
||||||
Points: 4545
|
|
||||||
- Level: 263
|
|
||||||
Points: 4545
|
|
||||||
- Level: 264
|
|
||||||
Points: 4545
|
|
||||||
- Level: 265
|
|
||||||
Points: 4545
|
|
||||||
- Level: 266
|
|
||||||
Points: 4545
|
|
||||||
- Level: 267
|
|
||||||
Points: 4545
|
|
||||||
- Level: 268
|
|
||||||
Points: 4545
|
|
||||||
- Level: 269
|
|
||||||
Points: 4545
|
|
||||||
- Level: 270
|
|
||||||
Points: 4545
|
|
||||||
- Level: 271
|
|
||||||
Points: 4545
|
|
||||||
- Level: 272
|
|
||||||
Points: 4545
|
|
||||||
- Level: 273
|
|
||||||
Points: 4545
|
|
||||||
- Level: 274
|
|
||||||
Points: 4545
|
|
||||||
- Level: 275
|
|
||||||
Points: 4545
|
|
||||||
|
@ -2496,9 +2496,6 @@ Body:
|
|||||||
CalcFlags:
|
CalcFlags:
|
||||||
Batk: true
|
Batk: true
|
||||||
Watk: true
|
Watk: true
|
||||||
Flags:
|
|
||||||
NoSave: true
|
|
||||||
RemoveFromHomOnWarp: true
|
|
||||||
- Status: Fleet
|
- Status: Fleet
|
||||||
DurationLookup: HFLI_FLEET
|
DurationLookup: HFLI_FLEET
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
@ -2513,10 +2510,6 @@ Body:
|
|||||||
DurationLookup: HAMI_DEFENCE
|
DurationLookup: HAMI_DEFENCE
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Def: true
|
Def: true
|
||||||
Vit: true
|
|
||||||
Flags:
|
|
||||||
NoSave: true
|
|
||||||
RemoveFromHomOnWarp: true
|
|
||||||
- Status: Incaspdrate
|
- Status: Incaspdrate
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Aspd: true
|
Aspd: true
|
||||||
@ -3974,7 +3967,7 @@ Body:
|
|||||||
Unlimitedhummingvoice: true
|
Unlimitedhummingvoice: true
|
||||||
Sircleofnature: true
|
Sircleofnature: true
|
||||||
- Status: Deepsleep
|
- Status: Deepsleep
|
||||||
Icon: EFST_DEEP_SLEEP
|
Icon: EFST_HANDICAPSTATE_DEEP_SLEEP
|
||||||
DurationLookup: WM_LULLABY_DEEPSLEEP
|
DurationLookup: WM_LULLABY_DEEPSLEEP
|
||||||
States:
|
States:
|
||||||
NoCast: true
|
NoCast: true
|
||||||
|
@ -76,15 +76,15 @@ Body:
|
|||||||
- Refine: 15
|
- Refine: 15
|
||||||
Chance: 7000
|
Chance: 7000
|
||||||
- Refine: 16
|
- Refine: 16
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
- Refine: 17
|
- Refine: 17
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
- Refine: 18
|
- Refine: 18
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
- Refine: 19
|
- Refine: 19
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
- Refine: 20
|
- Refine: 20
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
Bonus: 10
|
Bonus: 10
|
||||||
Catalyst:
|
Catalyst:
|
||||||
Item: Blessed_Etel_Dust
|
Item: Blessed_Etel_Dust
|
||||||
@ -116,15 +116,15 @@ Body:
|
|||||||
- Refine: 15
|
- Refine: 15
|
||||||
Chance: 6000
|
Chance: 6000
|
||||||
- Refine: 16
|
- Refine: 16
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
- Refine: 17
|
- Refine: 17
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
- Refine: 18
|
- Refine: 18
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
- Refine: 19
|
- Refine: 19
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
- Refine: 20
|
- Refine: 20
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
Bonus: 30
|
Bonus: 30
|
||||||
Catalyst:
|
Catalyst:
|
||||||
Item: Blessed_Etel_Dust
|
Item: Blessed_Etel_Dust
|
||||||
@ -154,15 +154,15 @@ Body:
|
|||||||
- Refine: 15
|
- Refine: 15
|
||||||
Chance: 5000
|
Chance: 5000
|
||||||
- Refine: 16
|
- Refine: 16
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
- Refine: 17
|
- Refine: 17
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
- Refine: 18
|
- Refine: 18
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
- Refine: 19
|
- Refine: 19
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
- Refine: 20
|
- Refine: 20
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
Bonus: 50
|
Bonus: 50
|
||||||
AnnounceFail: true
|
AnnounceFail: true
|
||||||
Catalyst:
|
Catalyst:
|
||||||
@ -193,15 +193,15 @@ Body:
|
|||||||
- Refine: 15
|
- Refine: 15
|
||||||
Chance: 4000
|
Chance: 4000
|
||||||
- Refine: 16
|
- Refine: 16
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
- Refine: 17
|
- Refine: 17
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
- Refine: 18
|
- Refine: 18
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
- Refine: 19
|
- Refine: 19
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
- Refine: 20
|
- Refine: 20
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
Bonus: 100
|
Bonus: 100
|
||||||
AnnounceFail: true
|
AnnounceFail: true
|
||||||
Catalyst:
|
Catalyst:
|
||||||
@ -240,15 +240,15 @@ Body:
|
|||||||
- Refine: 15
|
- Refine: 15
|
||||||
Chance: 7000
|
Chance: 7000
|
||||||
- Refine: 16
|
- Refine: 16
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
- Refine: 17
|
- Refine: 17
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
- Refine: 18
|
- Refine: 18
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
- Refine: 19
|
- Refine: 19
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
- Refine: 20
|
- Refine: 20
|
||||||
Chance: 8000
|
Chance: 7000
|
||||||
Bonus: 10
|
Bonus: 10
|
||||||
Catalyst:
|
Catalyst:
|
||||||
Item: Blessed_Etel_Dust
|
Item: Blessed_Etel_Dust
|
||||||
@ -280,15 +280,15 @@ Body:
|
|||||||
- Refine: 15
|
- Refine: 15
|
||||||
Chance: 6000
|
Chance: 6000
|
||||||
- Refine: 16
|
- Refine: 16
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
- Refine: 17
|
- Refine: 17
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
- Refine: 18
|
- Refine: 18
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
- Refine: 19
|
- Refine: 19
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
- Refine: 20
|
- Refine: 20
|
||||||
Chance: 7000
|
Chance: 6000
|
||||||
Bonus: 30
|
Bonus: 30
|
||||||
Catalyst:
|
Catalyst:
|
||||||
Item: Blessed_Etel_Dust
|
Item: Blessed_Etel_Dust
|
||||||
@ -318,15 +318,15 @@ Body:
|
|||||||
- Refine: 15
|
- Refine: 15
|
||||||
Chance: 5000
|
Chance: 5000
|
||||||
- Refine: 16
|
- Refine: 16
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
- Refine: 17
|
- Refine: 17
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
- Refine: 18
|
- Refine: 18
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
- Refine: 19
|
- Refine: 19
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
- Refine: 20
|
- Refine: 20
|
||||||
Chance: 6000
|
Chance: 5000
|
||||||
Bonus: 50
|
Bonus: 50
|
||||||
AnnounceFail: true
|
AnnounceFail: true
|
||||||
Catalyst:
|
Catalyst:
|
||||||
@ -357,15 +357,15 @@ Body:
|
|||||||
- Refine: 15
|
- Refine: 15
|
||||||
Chance: 4000
|
Chance: 4000
|
||||||
- Refine: 16
|
- Refine: 16
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
- Refine: 17
|
- Refine: 17
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
- Refine: 18
|
- Refine: 18
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
- Refine: 19
|
- Refine: 19
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
- Refine: 20
|
- Refine: 20
|
||||||
Chance: 5000
|
Chance: 4000
|
||||||
Bonus: 100
|
Bonus: 100
|
||||||
AnnounceFail: true
|
AnnounceFail: true
|
||||||
Catalyst:
|
Catalyst:
|
||||||
|
@ -83053,7 +83053,7 @@ Body:
|
|||||||
Hunter: true
|
Hunter: true
|
||||||
Rogue: true
|
Rogue: true
|
||||||
Locations:
|
Locations:
|
||||||
Both_Hand: true
|
Right_Hand: true
|
||||||
WeaponLevel: 4
|
WeaponLevel: 4
|
||||||
EquipLevelMin: 70
|
EquipLevelMin: 70
|
||||||
Refineable: true
|
Refineable: true
|
||||||
@ -112246,7 +112246,8 @@ Body:
|
|||||||
Defense: 30
|
Defense: 30
|
||||||
Slots: 1
|
Slots: 1
|
||||||
Classes:
|
Classes:
|
||||||
All: true
|
All_Third: true
|
||||||
|
Fourth: true
|
||||||
Locations:
|
Locations:
|
||||||
Garment: true
|
Garment: true
|
||||||
ArmorLevel: 1
|
ArmorLevel: 1
|
||||||
@ -112275,7 +112276,8 @@ Body:
|
|||||||
Defense: 30
|
Defense: 30
|
||||||
Slots: 1
|
Slots: 1
|
||||||
Classes:
|
Classes:
|
||||||
All: true
|
All_Third: true
|
||||||
|
Fourth: true
|
||||||
Locations:
|
Locations:
|
||||||
Garment: true
|
Garment: true
|
||||||
ArmorLevel: 1
|
ArmorLevel: 1
|
||||||
@ -112304,7 +112306,8 @@ Body:
|
|||||||
Defense: 30
|
Defense: 30
|
||||||
Slots: 1
|
Slots: 1
|
||||||
Classes:
|
Classes:
|
||||||
All: true
|
All_Third: true
|
||||||
|
Fourth: true
|
||||||
Locations:
|
Locations:
|
||||||
Garment: true
|
Garment: true
|
||||||
ArmorLevel: 1
|
ArmorLevel: 1
|
||||||
@ -139532,7 +139535,7 @@ Body:
|
|||||||
AegisName: Ein_BHAXE
|
AegisName: Ein_BHAXE
|
||||||
Name: Saw Axe
|
Name: Saw Axe
|
||||||
Type: Weapon
|
Type: Weapon
|
||||||
SubType: 2hAxe
|
SubType: 1hAxe
|
||||||
Weight: 5000
|
Weight: 5000
|
||||||
Attack: 350
|
Attack: 350
|
||||||
Range: 1
|
Range: 1
|
||||||
@ -169197,8 +169200,6 @@ Body:
|
|||||||
Defense: 12
|
Defense: 12
|
||||||
Slots: 1
|
Slots: 1
|
||||||
Jobs:
|
Jobs:
|
||||||
Crusader: true
|
|
||||||
Knight: true
|
|
||||||
Swordman: true
|
Swordman: true
|
||||||
Classes:
|
Classes:
|
||||||
All_Upper: true
|
All_Upper: true
|
||||||
@ -169219,8 +169220,6 @@ Body:
|
|||||||
Defense: 12
|
Defense: 12
|
||||||
Slots: 1
|
Slots: 1
|
||||||
Jobs:
|
Jobs:
|
||||||
Crusader: true
|
|
||||||
Knight: true
|
|
||||||
Swordman: true
|
Swordman: true
|
||||||
Classes:
|
Classes:
|
||||||
All_Upper: true
|
All_Upper: true
|
||||||
@ -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
|
- Id: 490004
|
||||||
AegisName: Atker_Ring
|
AegisName: Atker_Ring
|
||||||
Name: Attacker Booster Ring
|
Name: Attacker Booster Ring
|
||||||
|
@ -80408,28 +80408,6 @@ Body:
|
|||||||
Name: Footprint Effect
|
Name: Footprint Effect
|
||||||
Type: Card
|
Type: Card
|
||||||
SubType: Enchant
|
SubType: Enchant
|
||||||
Script: |
|
|
||||||
hateffect FOOTPRINT_EF_BASE,true;
|
|
||||||
UnEquipScript: |
|
|
||||||
hateffect FOOTPRINT_EF_BASE,false;
|
|
||||||
- Id: 313067
|
|
||||||
AegisName: aegis_313067
|
|
||||||
Name: Purple Star Footprint
|
|
||||||
Type: Card
|
|
||||||
SubType: Enchant
|
|
||||||
Script: |
|
|
||||||
hateffect FOOTPRINT_EF_PURPLESTAR,true;
|
|
||||||
UnEquipScript: |
|
|
||||||
hateffect FOOTPRINT_EF_PURPLESTAR,false;
|
|
||||||
- Id: 313068
|
|
||||||
AegisName: aegis_313068
|
|
||||||
Name: Yellow Star Footprint
|
|
||||||
Type: Card
|
|
||||||
SubType: Enchant
|
|
||||||
Script: |
|
|
||||||
hateffect FOOTPRINT_EF_YELLOWSTAR,true;
|
|
||||||
UnEquipScript: |
|
|
||||||
hateffect FOOTPRINT_EF_YELLOWSTAR,false;
|
|
||||||
- Id: 313070
|
- Id: 313070
|
||||||
AegisName: Ep21_4_Def
|
AegisName: Ep21_4_Def
|
||||||
Name: Forest Magic Orb (Physical Defense)
|
Name: Forest Magic Orb (Physical Defense)
|
||||||
@ -81918,15 +81896,6 @@ Body:
|
|||||||
Script: |
|
Script: |
|
||||||
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
|
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||||
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
|
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||||
- Id: 313345
|
|
||||||
AegisName: aegis_313345
|
|
||||||
Name: Puppy Footprint
|
|
||||||
Type: Card
|
|
||||||
SubType: Enchant
|
|
||||||
Script: |
|
|
||||||
hateffect FOOTPRINT_EF_DOGFOOT,true;
|
|
||||||
UnEquipScript: |
|
|
||||||
hateffect FOOTPRINT_EF_DOGFOOT,false;
|
|
||||||
- Id: 1000000
|
- Id: 1000000
|
||||||
AegisName: IDTest_event
|
AegisName: IDTest_event
|
||||||
Name: IDTest event
|
Name: IDTest event
|
||||||
@ -89471,11 +89440,6 @@ Body:
|
|||||||
Name: Footprint Effect (Garment)
|
Name: Footprint Effect (Garment)
|
||||||
Type: Etc
|
Type: Etc
|
||||||
Weight: 100
|
Weight: 100
|
||||||
- Id: 1001617
|
|
||||||
AegisName: PurpleStar_Foot_Robe
|
|
||||||
Name: Purple Star Footprint (Garment)
|
|
||||||
Type: Etc
|
|
||||||
Weight: 100
|
|
||||||
- Id: 1001618
|
- Id: 1001618
|
||||||
AegisName: aegis_1001618
|
AegisName: aegis_1001618
|
||||||
Name: Wigner Premium Exchange Ticket
|
Name: Wigner Premium Exchange Ticket
|
||||||
@ -89745,11 +89709,6 @@ Body:
|
|||||||
Weight: 10
|
Weight: 10
|
||||||
Flags:
|
Flags:
|
||||||
BuyingStore: true
|
BuyingStore: true
|
||||||
- Id: 1001650
|
|
||||||
AegisName: YellowStar_Foot_Robe
|
|
||||||
Name: Yellow Star Footprint (Garment)
|
|
||||||
Type: Etc
|
|
||||||
Weight: 100
|
|
||||||
- Id: 1001653
|
- Id: 1001653
|
||||||
AegisName: Ep21_Armor_E_Stone1
|
AegisName: Ep21_Armor_E_Stone1
|
||||||
Name: Turquoise Magic Stone
|
Name: Turquoise Magic Stone
|
||||||
@ -90363,11 +90322,6 @@ Body:
|
|||||||
NoGuildStorage: true
|
NoGuildStorage: true
|
||||||
NoMail: true
|
NoMail: true
|
||||||
NoAuction: true
|
NoAuction: true
|
||||||
- Id: 1001772
|
|
||||||
AegisName: aegis_1001772
|
|
||||||
Name: Puppy Footprint (Garment)
|
|
||||||
Type: Etc
|
|
||||||
Weight: 100
|
|
||||||
- Id: 1200000
|
- Id: 1200000
|
||||||
AegisName: IDTest_arrow
|
AegisName: IDTest_arrow
|
||||||
Name: IDTest arrow
|
Name: IDTest arrow
|
||||||
@ -90430,7 +90384,7 @@ Body:
|
|||||||
Ammo: true
|
Ammo: true
|
||||||
EquipLevelMin: 1
|
EquipLevelMin: 1
|
||||||
Script: |
|
Script: |
|
||||||
bonus bAtkEle,Ele_Ghost;
|
bonus bAtkEle,Ele_Neutral;
|
||||||
- Id: 1220003
|
- Id: 1220003
|
||||||
AegisName: Kunai_Of_Shadow
|
AegisName: Kunai_Of_Shadow
|
||||||
Name: Kunai Of Shadow
|
Name: Kunai Of Shadow
|
||||||
|
@ -78855,11 +78855,6 @@ Body:
|
|||||||
NoAuction: true
|
NoAuction: true
|
||||||
Script: |
|
Script: |
|
||||||
getgroupitem(IG_STOVE_CHANNELING_BOX_4);
|
getgroupitem(IG_STOVE_CHANNELING_BOX_4);
|
||||||
- Id: 103263
|
|
||||||
AegisName: Summer_Select_Box4
|
|
||||||
Name: Star Footprint Selection Box (Summer Beach)
|
|
||||||
Type: Usable
|
|
||||||
Weight: 10
|
|
||||||
- Id: 200000
|
- Id: 200000
|
||||||
AegisName: IDTest_Cash
|
AegisName: IDTest_Cash
|
||||||
Name: IDTest Cash
|
Name: IDTest Cash
|
||||||
|
@ -113439,3 +113439,216 @@ Body:
|
|||||||
- Index: 2
|
- Index: 2
|
||||||
Item: Enchant_Stone_Box35
|
Item: Enchant_Stone_Box35
|
||||||
Amount: 10
|
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
|
||||||
|
@ -980,13 +980,3 @@ Body:
|
|||||||
- Group: 1
|
- Group: 1
|
||||||
Items:
|
Items:
|
||||||
- Item: C_Chaos_Emerald
|
- Item: C_Chaos_Emerald
|
||||||
- Item: Summer_Select_Box4
|
|
||||||
Groups:
|
|
||||||
- Group: 0
|
|
||||||
Items:
|
|
||||||
- Item: PurpleStar_Foot_Robe
|
|
||||||
- Item: C_Summer_Beach
|
|
||||||
- Group: 1
|
|
||||||
Items:
|
|
||||||
- Item: YellowStar_Foot_Robe
|
|
||||||
- Item: C_Summer_Beach
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -3365,7 +3365,7 @@ Body:
|
|||||||
Night_Watch: true
|
Night_Watch: true
|
||||||
Hyper_Novice: true
|
Hyper_Novice: true
|
||||||
Spirit_Handler: true
|
Spirit_Handler: true
|
||||||
MaxBaseLevel: 275
|
MaxBaseLevel: 260
|
||||||
BaseExp:
|
BaseExp:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
Exp: 658
|
Exp: 658
|
||||||
@ -3886,36 +3886,6 @@ Body:
|
|||||||
- Level: 259
|
- Level: 259
|
||||||
Exp: 270217017679
|
Exp: 270217017679
|
||||||
- Level: 260
|
- Level: 260
|
||||||
Exp: 283727868563
|
|
||||||
- Level: 261
|
|
||||||
Exp: 297914261991
|
|
||||||
- Level: 262
|
|
||||||
Exp: 312809975091
|
|
||||||
- Level: 263
|
|
||||||
Exp: 328450473845
|
|
||||||
- Level: 264
|
|
||||||
Exp: 344872997537
|
|
||||||
- Level: 265
|
|
||||||
Exp: 353494822476
|
|
||||||
- Level: 266
|
|
||||||
Exp: 362332193038
|
|
||||||
- Level: 267
|
|
||||||
Exp: 371390497864
|
|
||||||
- Level: 268
|
|
||||||
Exp: 380675260310
|
|
||||||
- Level: 269
|
|
||||||
Exp: 390192141818
|
|
||||||
- Level: 270
|
|
||||||
Exp: 397995984654
|
|
||||||
- Level: 271
|
|
||||||
Exp: 405955904348
|
|
||||||
- Level: 272
|
|
||||||
Exp: 414075022434
|
|
||||||
- Level: 273
|
|
||||||
Exp: 422356522883
|
|
||||||
- Level: 274
|
|
||||||
Exp: 430803653341
|
|
||||||
- Level: 275
|
|
||||||
Exp: 999999999999
|
Exp: 999999999999
|
||||||
- Jobs:
|
- Jobs:
|
||||||
Dragon_Knight: true
|
Dragon_Knight: true
|
||||||
@ -3942,7 +3912,7 @@ Body:
|
|||||||
Night_Watch: true
|
Night_Watch: true
|
||||||
Hyper_Novice: true
|
Hyper_Novice: true
|
||||||
Spirit_Handler: true
|
Spirit_Handler: true
|
||||||
MaxJobLevel: 60
|
MaxJobLevel: 55
|
||||||
JobExp:
|
JobExp:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
Exp: 4700000
|
Exp: 4700000
|
||||||
@ -4053,14 +4023,4 @@ Body:
|
|||||||
- Level: 54
|
- Level: 54
|
||||||
Exp: 6559840847
|
Exp: 6559840847
|
||||||
- Level: 55
|
- Level: 55
|
||||||
Exp: 7543816974
|
Exp: 9999999999
|
||||||
- Level: 56
|
|
||||||
Exp: 8675389520
|
|
||||||
- Level: 57
|
|
||||||
Exp: 9976697948
|
|
||||||
- Level: 58
|
|
||||||
Exp: 11473202640
|
|
||||||
- Level: 59
|
|
||||||
Exp: 13194183036
|
|
||||||
- Level: 60
|
|
||||||
Exp: 99999999999
|
|
||||||
|
1671
db/re/job_stats.yml
1671
db/re/job_stats.yml
File diff suppressed because it is too large
Load Diff
@ -4359,110 +4359,110 @@ Body:
|
|||||||
- Item: S_Caster_Weapon
|
- Item: S_Caster_Weapon
|
||||||
- Item: S_Caster_earring
|
- Item: S_Caster_earring
|
||||||
- Item: S_Caster_Pendant
|
- Item: S_Caster_Pendant
|
||||||
# - Item: Ice_F_Stone_Box2
|
- Item: Ice_F_Stone_Box2
|
||||||
# RewardGroup: ICE_F_STONE_BOX2
|
RewardGroup: ICE_F_STONE_BOX
|
||||||
# RequiredRequirementsCount: 3
|
RequiredRequirementsCount: 3
|
||||||
# Requirements:
|
Requirements:
|
||||||
# - Item: Ice_F_Stone_Str
|
- Item: Ice_F_Stone_Str
|
||||||
# - Item: Ice_F_Stone_Dex
|
- Item: Ice_F_Stone_Dex
|
||||||
# - Item: Ice_F_Stone_Agi
|
- Item: Ice_F_Stone_Agi
|
||||||
# - Item: Ice_F_Stone_Int
|
- Item: Ice_F_Stone_Int
|
||||||
# - Item: Ice_F_Stone_Vit
|
- Item: Ice_F_Stone_Vit
|
||||||
# - Item: Ice_F_Stone_luk
|
- Item: Ice_F_Stone_luk
|
||||||
# - Item: Ice_F_Stone_Def
|
- Item: Ice_F_Stone_Def
|
||||||
# - Item: Ice_F_Stone_Mdef
|
- Item: Ice_F_Stone_Mdef
|
||||||
# - Item: Ice_F_Stone_Ran
|
- Item: Ice_F_Stone_Ran
|
||||||
# - Item: Ice_F_Stone_War
|
- Item: Ice_F_Stone_War
|
||||||
# - Item: Ice_F_Stone_Mag
|
- Item: Ice_F_Stone_Mag
|
||||||
# - Item: Ice_F_Stone_R_Reject
|
- Item: Ice_F_Stone_R_Reject
|
||||||
# - Item: Ice_F_Stone_Force
|
- Item: Ice_F_Stone_Force
|
||||||
# - Item: Ice_F_Stone_S_Delay
|
- Item: Ice_F_Stone_S_Delay
|
||||||
# - Item: Ice_F_Stone_Skill_1
|
- Item: Ice_F_Stone_Skill_1
|
||||||
# - Item: Ice_F_Stone_Skill_2
|
- Item: Ice_F_Stone_Skill_2
|
||||||
# - Item: Ice_F_Stone_Skill_3
|
- Item: Ice_F_Stone_Skill_3
|
||||||
# - Item: Ice_F_Stone_Skill_4
|
- Item: Ice_F_Stone_Skill_4
|
||||||
# - Item: Ice_F_Stone_Skill_5
|
- Item: Ice_F_Stone_Skill_5
|
||||||
# - Item: Ice_F_Stone_Skill_6
|
- Item: Ice_F_Stone_Skill_6
|
||||||
# - Item: Ice_F_Stone_Skill_7
|
- Item: Ice_F_Stone_Skill_7
|
||||||
# - Item: Ice_F_Stone_Skill_8
|
- Item: Ice_F_Stone_Skill_8
|
||||||
# - Item: Ice_F_Stone_Skill_9
|
- Item: Ice_F_Stone_Skill_9
|
||||||
# - Item: Ice_F_Stone_Skill_10
|
- Item: Ice_F_Stone_Skill_10
|
||||||
# - Item: Ice_F_Stone_Skill_11
|
- Item: Ice_F_Stone_Skill_11
|
||||||
# - Item: Ice_F_Stone_Skill_12
|
- Item: Ice_F_Stone_Skill_12
|
||||||
# - Item: Ice_F_Stone_Skill_13
|
- Item: Ice_F_Stone_Skill_13
|
||||||
# - Item: Ice_F_Stone_Skill_14
|
- Item: Ice_F_Stone_Skill_14
|
||||||
# - Item: Ice_F_Stone_Skill_15
|
- Item: Ice_F_Stone_Skill_15
|
||||||
# - Item: Ice_F_Stone_Skill_16
|
- Item: Ice_F_Stone_Skill_16
|
||||||
# - Item: Ice_F_Stone_Skill_17
|
- Item: Ice_F_Stone_Skill_17
|
||||||
# - Item: Ice_F_Stone_Skill_18
|
- Item: Ice_F_Stone_Skill_18
|
||||||
# - Item: Ice_F_Stone_Skill_19
|
- Item: Ice_F_Stone_Skill_19
|
||||||
# - Item: Ice_F_Stone_Skill_20
|
- Item: Ice_F_Stone_Skill_20
|
||||||
# - Item: Ice_F_Stone_Skill_21
|
- Item: Ice_F_Stone_Skill_21
|
||||||
# - Item: Ice_F_Stone_Skill_22
|
- Item: Ice_F_Stone_Skill_22
|
||||||
# - Item: Ice_F_Stone_Skill_23
|
- Item: Ice_F_Stone_Skill_23
|
||||||
# - Item: Ice_F_Stone_Skill_24
|
- Item: Ice_F_Stone_Skill_24
|
||||||
# - Item: Ice_F_Stone_Skill_25
|
- Item: Ice_F_Stone_Skill_25
|
||||||
# - Item: Ice_F_Stone_Skill_26
|
- Item: Ice_F_Stone_Skill_26
|
||||||
# - Item: Ice_F_Stone_Skill_27
|
- Item: Ice_F_Stone_Skill_27
|
||||||
# - Item: Ice_F_Stone_Skill_28
|
- Item: Ice_F_Stone_Skill_28
|
||||||
# - Item: Ice_F_Stone_Skill_29
|
- Item: Ice_F_Stone_Skill_29
|
||||||
# - Item: Ice_F_Stone_Skill_30
|
- Item: Ice_F_Stone_Skill_30
|
||||||
# - Item: Ice_F_Stone_Skill_31
|
- Item: Ice_F_Stone_Skill_31
|
||||||
# - Item: Ice_F_Stone_Skill_32
|
- Item: Ice_F_Stone_Skill_32
|
||||||
# - Item: Ice_F_Stone_Skill_33
|
- Item: Ice_F_Stone_Skill_33
|
||||||
# - Item: Ice_F_Stone_Skill_34
|
- Item: Ice_F_Stone_Skill_34
|
||||||
# - Item: Ice_F_Stone_Skill_35
|
- Item: Ice_F_Stone_Skill_35
|
||||||
# - Item: Ice_F_Stone_Skill_36
|
- Item: Ice_F_Stone_Skill_36
|
||||||
# - Item: Ice_F_Stone_Skill_37
|
- Item: Ice_F_Stone_Skill_37
|
||||||
# - Item: Ice_F_Stone_Skill_38
|
- Item: Ice_F_Stone_Skill_38
|
||||||
# - Item: Ice_F_Stone_Skill_39
|
- Item: Ice_F_Stone_Skill_39
|
||||||
# - Item: Ice_F_Stone_Skill_40
|
- Item: Ice_F_Stone_Skill_40
|
||||||
# - Item: Ice_F_Stone_Skill_41
|
- Item: Ice_F_Stone_Skill_41
|
||||||
# - Item: Ice_F_Stone_Skill_42
|
- Item: Ice_F_Stone_Skill_42
|
||||||
# - Item: Ice_F_Stone_Skill_43
|
- Item: Ice_F_Stone_Skill_43
|
||||||
# - Item: Ice_F_Stone_Skill_44
|
- Item: Ice_F_Stone_Skill_44
|
||||||
# - Item: Ice_F_Stone_Skill_45
|
- Item: Ice_F_Stone_Skill_45
|
||||||
# - Item: Ice_F_Stone_Skill_46
|
- Item: Ice_F_Stone_Skill_46
|
||||||
# - Item: Ice_F_Stone_Skill_47
|
- Item: Ice_F_Stone_Skill_47
|
||||||
# - Item: Ice_F_Stone_Skill_48
|
- Item: Ice_F_Stone_Skill_48
|
||||||
# - Item: Ice_F_Stone_Skill_49
|
- Item: Ice_F_Stone_Skill_49
|
||||||
# - Item: Ice_F_Stone_Skill_50
|
- Item: Ice_F_Stone_Skill_50
|
||||||
# - Item: Ice_F_Stone_Skill_51
|
- Item: Ice_F_Stone_Skill_51
|
||||||
# - Item: Ice_F_Stone_Skill_52
|
- Item: Ice_F_Stone_Skill_52
|
||||||
# - Item: Ice_F_Stone_Skill_53
|
- Item: Ice_F_Stone_Skill_53
|
||||||
# - Item: Ice_F_Stone_Skill_54
|
- Item: Ice_F_Stone_Skill_54
|
||||||
# - Item: Ice_F_Stone_Speed
|
- Item: Ice_F_Stone_Speed
|
||||||
# - Item: Ice_F_Stone_Caster
|
- Item: Ice_F_Stone_Caster
|
||||||
# - Item: Ice_F_Stone_Critical
|
- Item: Ice_F_Stone_Critical
|
||||||
# - Item: Ice_F_Stone_Guide
|
- Item: Ice_F_Stone_Guide
|
||||||
# - Item: Ice_F_Stone_Above
|
- Item: Ice_F_Stone_Above
|
||||||
# - Item: Ice_F_Stone_P_Full
|
- Item: Ice_F_Stone_P_Full
|
||||||
# - Item: Ice_F_Stone_M_Counter
|
- Item: Ice_F_Stone_M_Counter
|
||||||
# - Item: Ice_F_Stone_Hp
|
- Item: Ice_F_Stone_Hp
|
||||||
# - Item: Ice_F_Stone_Sp
|
- Item: Ice_F_Stone_Sp
|
||||||
# - Item: Ice_F_Stone_Heal
|
- Item: Ice_F_Stone_Heal
|
||||||
# - Item: Ice_F_Stone_Robust
|
- Item: Ice_F_Stone_Robust
|
||||||
# - Item: Ice_F_Stone_F_Cast
|
- Item: Ice_F_Stone_F_Cast
|
||||||
# - Item: Ice_F_Stone_M_F
|
- Item: Ice_F_Stone_M_F
|
||||||
# - Item: Ice_F_Stone_P_F
|
- Item: Ice_F_Stone_P_F
|
||||||
# - Item: Ice_F_Stone_Un_Vit
|
- Item: Ice_F_Stone_Un_Vit
|
||||||
# - Item: Ice_F_Stone_Sp_Int
|
- Item: Ice_F_Stone_Sp_Int
|
||||||
# - Item: Ice_F_Stone_Fi_Dex
|
- Item: Ice_F_Stone_Fi_Dex
|
||||||
# - Item: Ice_F_Stone_Ov_Str
|
- Item: Ice_F_Stone_Ov_Str
|
||||||
# - Item: Ice_F_Stone_Fa_Agi
|
- Item: Ice_F_Stone_Fa_Agi
|
||||||
# - Item: Ice_F_Stone_Lu_Luk
|
- Item: Ice_F_Stone_Lu_Luk
|
||||||
# - Item: Ice_F_Stone_A_Delay
|
- Item: Ice_F_Stone_A_Delay
|
||||||
# - Item: Ice_F_Stone_E_Archer
|
- Item: Ice_F_Stone_E_Archer
|
||||||
# - Item: Ice_F_Stone_Fatal
|
- Item: Ice_F_Stone_Fatal
|
||||||
# - Item: Ice_F_Stone_F_Spirit
|
- Item: Ice_F_Stone_F_Spirit
|
||||||
# - Item: Ice_F_Stone_Spell
|
- Item: Ice_F_Stone_Spell
|
||||||
# - Item: Ice_F_Stone_HealHP
|
- Item: Ice_F_Stone_HealHP
|
||||||
# - Item: Ice_F_Stone_HealSP
|
- Item: Ice_F_Stone_HealSP
|
||||||
# - Item: Ice_F_Stone_Life
|
- Item: Ice_F_Stone_Life
|
||||||
# - Item: Ice_F_Stone_Soul
|
- Item: Ice_F_Stone_Soul
|
||||||
# - Item: Ice_F_Stone_M_Heal
|
- Item: Ice_F_Stone_M_Heal
|
||||||
# - Item: Ice_F_Stone_M_Soul
|
- Item: Ice_F_Stone_M_Soul
|
||||||
# - Item: Ice_F_Stone_A_Force
|
- Item: Ice_F_Stone_A_Force
|
||||||
- Item: R_BearersShadow_Mix
|
- Item: R_BearersShadow_Mix
|
||||||
RewardGroup: R_BEARERSSHADOW_MIX
|
RewardGroup: R_BEARERSSHADOW_MIX
|
||||||
RequiredRequirementsCount: 6
|
RequiredRequirementsCount: 6
|
||||||
@ -4812,3 +4812,33 @@ Body:
|
|||||||
# Amount: 100
|
# Amount: 100
|
||||||
# - Item: Crystal_Of_Pollution
|
# - Item: Crystal_Of_Pollution
|
||||||
# Amount: 100
|
# 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
|
||||||
|
1560
db/re/mob_db.yml
1560
db/re/mob_db.yml
File diff suppressed because it is too large
Load Diff
@ -3256,6 +3256,58 @@ Body:
|
|||||||
Title: "[Daily] Half Flower Gathering"
|
Title: "[Daily] Half Flower Gathering"
|
||||||
- Id: 5942
|
- Id: 5942
|
||||||
Title: Flower Room Opening Ceremony
|
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
|
- Id: 6000
|
||||||
Title: Job Change to Taekwon
|
Title: Job Change to Taekwon
|
||||||
- Id: 6001
|
- Id: 6001
|
||||||
@ -6418,6 +6470,64 @@ Body:
|
|||||||
- Id: 8738
|
- Id: 8738
|
||||||
Title: Shared Memories - Standby
|
Title: Shared Memories - Standby
|
||||||
TimeLimit: 4h
|
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
|
- Id: 9000
|
||||||
Title: Job Change to Knight
|
Title: Job Change to Knight
|
||||||
- Id: 9001
|
- Id: 9001
|
||||||
@ -8297,6 +8407,356 @@ Body:
|
|||||||
- Id: 11739
|
- Id: 11739
|
||||||
Title: "[Cooldown] Oz Labyrinth 2F"
|
Title: "[Cooldown] Oz Labyrinth 2F"
|
||||||
TimeLimit: 4h
|
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
|
- Id: 12000
|
||||||
Title: An old friend
|
Title: An old friend
|
||||||
- Id: 12001
|
- Id: 12001
|
||||||
@ -9361,6 +9821,14 @@ Body:
|
|||||||
Title: Scattered Goods (East)
|
Title: Scattered Goods (East)
|
||||||
- Id: 12539
|
- Id: 12539
|
||||||
Title: Scattered Goods (South)
|
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
|
- Id: 13000
|
||||||
Title: RWC2011Card Gathering
|
Title: RWC2011Card Gathering
|
||||||
- Id: 13001
|
- Id: 13001
|
||||||
@ -11592,6 +12060,69 @@ Body:
|
|||||||
Title: The Price of Labor (1)
|
Title: The Price of Labor (1)
|
||||||
- Id: 16585
|
- Id: 16585
|
||||||
Title: The Price of Labor (2)
|
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
|
- Id: 17000
|
||||||
Title: Meet with Father Bamph
|
Title: Meet with Father Bamph
|
||||||
- Id: 17001
|
- Id: 17001
|
||||||
@ -11914,6 +12445,96 @@ Body:
|
|||||||
- Id: 17566
|
- Id: 17566
|
||||||
Title: (Standby) Code name! Is it a star button?
|
Title: (Standby) Code name! Is it a star button?
|
||||||
TimeLimit: 4h
|
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
|
- Id: 18000
|
||||||
Title: Ready to enter
|
Title: Ready to enter
|
||||||
- Id: 18001
|
- Id: 18001
|
||||||
@ -12092,11 +12713,72 @@ Body:
|
|||||||
- Id: 18118
|
- Id: 18118
|
||||||
Title: Mysterious Musical Instrument
|
Title: Mysterious Musical Instrument
|
||||||
- Id: 18119
|
- Id: 18119
|
||||||
Title: Gusli
|
Title: The Guest Who Ride the North Wind 1
|
||||||
- Id: 18120
|
- Id: 18120
|
||||||
Title: Gusli
|
Title: Guest from the North Wind 2
|
||||||
- Id: 18121
|
- 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
|
- Id: 19001
|
||||||
Title: The earth where the flowers have blossomed - Waiting
|
Title: The earth where the flowers have blossomed - Waiting
|
||||||
TimeLimit: 4h
|
TimeLimit: 4h
|
||||||
|
@ -7535,7 +7535,7 @@ Body:
|
|||||||
TargetTrap: true
|
TargetTrap: true
|
||||||
Range: 9
|
Range: 9
|
||||||
Hit: Multi_Hit
|
Hit: Multi_Hit
|
||||||
HitCount: -5
|
HitCount: 5
|
||||||
Element: Weapon
|
Element: Weapon
|
||||||
CopyFlags:
|
CopyFlags:
|
||||||
Skill:
|
Skill:
|
||||||
@ -15918,6 +15918,15 @@ Body:
|
|||||||
- Level: 5
|
- Level: 5
|
||||||
Time: 350000
|
Time: 350000
|
||||||
FixedCastTime: 1000
|
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
|
- Id: 653
|
||||||
Name: NPC_EARTHQUAKE
|
Name: NPC_EARTHQUAKE
|
||||||
Description: Earthquake
|
Description: Earthquake
|
||||||
@ -43106,6 +43115,7 @@ Body:
|
|||||||
TargetType: Self
|
TargetType: Self
|
||||||
DamageFlags:
|
DamageFlags:
|
||||||
NoDamage: true
|
NoDamage: true
|
||||||
|
Hit: Single
|
||||||
AfterCastWalkDelay: 1000
|
AfterCastWalkDelay: 1000
|
||||||
Cooldown: 1000
|
Cooldown: 1000
|
||||||
Requires:
|
Requires:
|
||||||
@ -43117,6 +43127,7 @@ Body:
|
|||||||
TargetType: Self
|
TargetType: Self
|
||||||
DamageFlags:
|
DamageFlags:
|
||||||
NoDamage: true
|
NoDamage: true
|
||||||
|
Hit: Single
|
||||||
AfterCastWalkDelay: 1000
|
AfterCastWalkDelay: 1000
|
||||||
Duration1:
|
Duration1:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
@ -43147,6 +43158,8 @@ Body:
|
|||||||
Name: HAMI_SKIN
|
Name: HAMI_SKIN
|
||||||
Description: Adamantium Skin
|
Description: Adamantium Skin
|
||||||
MaxLevel: 5
|
MaxLevel: 5
|
||||||
|
DamageFlags:
|
||||||
|
NoDamage: true
|
||||||
- Id: 8008
|
- Id: 8008
|
||||||
Name: HAMI_BLOODLUST
|
Name: HAMI_BLOODLUST
|
||||||
Description: Bloodlust
|
Description: Bloodlust
|
||||||
@ -43154,6 +43167,7 @@ Body:
|
|||||||
TargetType: Self
|
TargetType: Self
|
||||||
DamageFlags:
|
DamageFlags:
|
||||||
NoDamage: true
|
NoDamage: true
|
||||||
|
Hit: Single
|
||||||
AfterCastWalkDelay: 1000
|
AfterCastWalkDelay: 1000
|
||||||
Duration1:
|
Duration1:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
|
@ -612,48 +612,3 @@ Body:
|
|||||||
- Level: 260
|
- Level: 260
|
||||||
Points: 4099
|
Points: 4099
|
||||||
TraitPoints: 228
|
TraitPoints: 228
|
||||||
- Level: 261
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 231
|
|
||||||
- Level: 262
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 234
|
|
||||||
- Level: 263
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 237
|
|
||||||
- Level: 264
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 240
|
|
||||||
- Level: 265
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 247
|
|
||||||
- Level: 266
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 250
|
|
||||||
- Level: 267
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 253
|
|
||||||
- Level: 268
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 256
|
|
||||||
- Level: 269
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 259
|
|
||||||
- Level: 270
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 266
|
|
||||||
- Level: 271
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 269
|
|
||||||
- Level: 272
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 272
|
|
||||||
- Level: 273
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 275
|
|
||||||
- Level: 274
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 278
|
|
||||||
- Level: 275
|
|
||||||
Points: 4099
|
|
||||||
TraitPoints: 285
|
|
||||||
|
@ -1822,7 +1822,6 @@ Body:
|
|||||||
Icon: EFST_ETERNALCHAOS
|
Icon: EFST_ETERNALCHAOS
|
||||||
DurationLookup: BD_ETERNALCHAOS
|
DurationLookup: BD_ETERNALCHAOS
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Def: true
|
|
||||||
Def2: true
|
Def2: true
|
||||||
Flags:
|
Flags:
|
||||||
NoDispell: true
|
NoDispell: true
|
||||||
@ -2619,9 +2618,6 @@ Body:
|
|||||||
CalcFlags:
|
CalcFlags:
|
||||||
Batk: true
|
Batk: true
|
||||||
Watk: true
|
Watk: true
|
||||||
Flags:
|
|
||||||
NoSave: true
|
|
||||||
RemoveFromHomOnMapWarp: true
|
|
||||||
- Status: Fleet
|
- Status: Fleet
|
||||||
DurationLookup: HFLI_FLEET
|
DurationLookup: HFLI_FLEET
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
@ -2635,11 +2631,7 @@ Body:
|
|||||||
- Status: Defence
|
- Status: Defence
|
||||||
DurationLookup: HAMI_DEFENCE
|
DurationLookup: HAMI_DEFENCE
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Def: true
|
|
||||||
Vit: true
|
Vit: true
|
||||||
Flags:
|
|
||||||
NoSave: true
|
|
||||||
RemoveFromHomOnMapWarp: true
|
|
||||||
- Status: Incaspdrate
|
- Status: Incaspdrate
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Aspd: true
|
Aspd: true
|
||||||
@ -4138,7 +4130,7 @@ Body:
|
|||||||
Unlimitedhummingvoice: true
|
Unlimitedhummingvoice: true
|
||||||
Sircleofnature: true
|
Sircleofnature: true
|
||||||
- Status: Deepsleep
|
- Status: Deepsleep
|
||||||
Icon: EFST_DEEP_SLEEP
|
Icon: EFST_HANDICAPSTATE_DEEP_SLEEP
|
||||||
DurationLookup: WM_LULLABY_DEEPSLEEP
|
DurationLookup: WM_LULLABY_DEEPSLEEP
|
||||||
States:
|
States:
|
||||||
NoCast: true
|
NoCast: true
|
||||||
@ -7022,9 +7014,7 @@ Body:
|
|||||||
CalcFlags:
|
CalcFlags:
|
||||||
Regen: true
|
Regen: true
|
||||||
- Status: Earthshaker
|
- Status: Earthshaker
|
||||||
Icon: EFST_EARTHSHAKER
|
|
||||||
Flags:
|
Flags:
|
||||||
BlEffect: true
|
|
||||||
NoWarning: true
|
NoWarning: true
|
||||||
- Status: Weaponblock_On
|
- Status: Weaponblock_On
|
||||||
Icon: EFST_WEAPONBLOCK_ON
|
Icon: EFST_WEAPONBLOCK_ON
|
||||||
@ -7039,7 +7029,6 @@ Body:
|
|||||||
Icon: EFST_SPORE_EXPLOSION_DEBUFF
|
Icon: EFST_SPORE_EXPLOSION_DEBUFF
|
||||||
DurationLookup: GN_SPORE_EXPLOSION
|
DurationLookup: GN_SPORE_EXPLOSION
|
||||||
Flags:
|
Flags:
|
||||||
BlEffect: true
|
|
||||||
NoDispell: true
|
NoDispell: true
|
||||||
NoBanishingBuster: true
|
NoBanishingBuster: true
|
||||||
NoClearance: true
|
NoClearance: true
|
||||||
@ -7461,7 +7450,7 @@ Body:
|
|||||||
NoClearance: true
|
NoClearance: true
|
||||||
NoClearbuff: true
|
NoClearbuff: true
|
||||||
- Status: Madogear
|
- Status: Madogear
|
||||||
Icon: EFST_MADOGEAR_TYPE
|
Icon: EFST_MADOGEAR
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Speed: true
|
Speed: true
|
||||||
Flags:
|
Flags:
|
||||||
@ -7975,8 +7964,6 @@ Body:
|
|||||||
DurationLookup: EM_SPELL_ENCHANTING
|
DurationLookup: EM_SPELL_ENCHANTING
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Smatk: true
|
Smatk: true
|
||||||
Flags:
|
|
||||||
DisplayPc: true
|
|
||||||
- Status: Summon_Elemental_Ardor
|
- Status: Summon_Elemental_Ardor
|
||||||
Icon: EFST_SUMMON_ELEMENTAL_ARDOR
|
Icon: EFST_SUMMON_ELEMENTAL_ARDOR
|
||||||
DurationLookup: EM_SUMMON_ELEMENTAL_ARDOR
|
DurationLookup: EM_SUMMON_ELEMENTAL_ARDOR
|
||||||
@ -8028,23 +8015,17 @@ Body:
|
|||||||
DurationLookup: TR_MUSICAL_INTERLUDE
|
DurationLookup: TR_MUSICAL_INTERLUDE
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Res: true
|
Res: true
|
||||||
Flags:
|
|
||||||
DisplayPc: true
|
|
||||||
- Status: Jawaii_Serenade
|
- Status: Jawaii_Serenade
|
||||||
Icon: EFST_JAWAII_SERENADE
|
Icon: EFST_JAWAII_SERENADE
|
||||||
DurationLookup: TR_JAWAII_SERENADE
|
DurationLookup: TR_JAWAII_SERENADE
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Smatk: true
|
Smatk: true
|
||||||
Speed: true
|
Speed: true
|
||||||
Flags:
|
|
||||||
DisplayPc: true
|
|
||||||
- Status: Pron_March
|
- Status: Pron_March
|
||||||
Icon: EFST_PRON_MARCH
|
Icon: EFST_PRON_MARCH
|
||||||
DurationLookup: TR_PRON_MARCH
|
DurationLookup: TR_PRON_MARCH
|
||||||
CalcFlags:
|
CalcFlags:
|
||||||
Patk: true
|
Patk: true
|
||||||
Flags:
|
|
||||||
DisplayPc: true
|
|
||||||
- Status: Roseblossom
|
- Status: Roseblossom
|
||||||
Icon: EFST_ROSEBLOSSOM
|
Icon: EFST_ROSEBLOSSOM
|
||||||
DurationLookup: TR_ROSEBLOSSOM
|
DurationLookup: TR_ROSEBLOSSOM
|
||||||
@ -8058,8 +8039,6 @@ Body:
|
|||||||
Powerful_Faith: true
|
Powerful_Faith: true
|
||||||
Firm_Faith: true
|
Firm_Faith: true
|
||||||
Sincere_Faith: true
|
Sincere_Faith: true
|
||||||
Flags:
|
|
||||||
DisplayPc: true
|
|
||||||
- Status: Sincere_Faith
|
- Status: Sincere_Faith
|
||||||
Icon: EFST_SINCERE_FAITH
|
Icon: EFST_SINCERE_FAITH
|
||||||
DurationLookup: IQ_SINCERE_FAITH
|
DurationLookup: IQ_SINCERE_FAITH
|
||||||
|
@ -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 |
|
| 5. Administrative Commands |
|
||||||
==============================
|
==============================
|
||||||
|
@ -118,8 +118,24 @@ is disabled in '/conf/battle/items.conf'.
|
|||||||
*nomvploot
|
*nomvploot
|
||||||
|
|
||||||
Disables normal monsters and MVPs from dropping items on a map. Looted items will always drop.
|
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.
|
'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
|
*noexp
|
||||||
|
@ -1012,12 +1012,9 @@ SC_CHANGE (EFST_HLIF_CHANGE)
|
|||||||
val2: VIT increase (20 * val1)
|
val2: VIT increase (20 * val1)
|
||||||
val3: INT increase (30 * val1)
|
val3: INT increase (30 * val1)
|
||||||
|
|
||||||
SC_BLOODLUST (EFST_HAMI_BLOODLUST)
|
SC_BLOODLUST ()
|
||||||
desc: Increase the homunculus ATK and has a chance to leech HP from the target
|
desc:
|
||||||
val1: Skill Level
|
val1:
|
||||||
val2: ATK increase (20 + (10 * val1))
|
|
||||||
val3: Chance to leech HP (9 * val1)%
|
|
||||||
val4: Leeched HP percentage 20%
|
|
||||||
|
|
||||||
SC_FLEET ()
|
SC_FLEET ()
|
||||||
desc:
|
desc:
|
||||||
@ -1027,10 +1024,10 @@ SC_SPEED ()
|
|||||||
desc:
|
desc:
|
||||||
val1:
|
val1:
|
||||||
|
|
||||||
SC_DEFENCE (EFST_HAMI_DEFENCE)
|
SC_DEFENCE ()
|
||||||
desc: Increase VIT and as result VIT-based DEF of the Player and plain VIT of the Homunculus
|
desc: Increase Defense, HAMI_DEFENCE effect
|
||||||
val1: Skill Level
|
val1: (none)
|
||||||
val2: VIT increase for players, DEF increase for homunculus (5 + (5 * val1)) [Renewal], (2 * val1) [Pre-Renewal]
|
val2: + Def(Pre-renewal) or VIT (Renewal)
|
||||||
|
|
||||||
SC_INCASPDRATE ()
|
SC_INCASPDRATE ()
|
||||||
desc: Increase ASPD
|
desc: Increase ASPD
|
||||||
|
@ -1,9 +1,15 @@
|
|||||||
//===== rAthena Script =======================================
|
//===== rAthena Script =======================================
|
||||||
//= Assassin Job Quest
|
//= Assassin Job Quest
|
||||||
|
//===== By: ==================================================
|
||||||
|
//= kobra_k88
|
||||||
|
//===== Current Version: =====================================
|
||||||
|
//= 3.7
|
||||||
|
//===== Compatible With: =====================================
|
||||||
|
//= rAthena Project
|
||||||
//===== Description: =========================================
|
//===== Description: =========================================
|
||||||
//= [Official Conversion]
|
//= [Official Conversion]
|
||||||
//= Job Change quest for Assassin class.
|
//= Job Change quest for Assassin class.
|
||||||
//===== Changelog: ===========================================
|
//===== Additional Comments: =================================
|
||||||
//= 1.0 Used some dialogue from the aegis Assassin script translated By: Pgro Team (OwNaGe)
|
//= 1.0 Used some dialogue from the aegis Assassin script translated By: Pgro Team (OwNaGe)
|
||||||
//= Also converted the booby traps from the aegis script.[kobra_k88]
|
//= Also converted the booby traps from the aegis script.[kobra_k88]
|
||||||
//= 1.1 Made adjustments to ontouch npcs to work with the new "ontouch" functionality.
|
//= 1.1 Made adjustments to ontouch npcs to work with the new "ontouch" functionality.
|
||||||
@ -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.5 Fixed the waitingroom where player can enter the Test Area without passing the written exam. Now player will not be warp inside the Test Area when did not passed the written exam instead the player will be warp back to the written exam entrance [JayPee]
|
||||||
//= 3.6 Fixed broken event calls. [Euphy]
|
//= 3.6 Fixed broken event calls. [Euphy]
|
||||||
//= 3.7 Fixed issue that the player can't progress in the quest if timed out at weapon reward step. This issue is fixed on iRO but not on kRO. [https://forums.warpportal.com/index.php?/topic/130060-didnt-receive-necklace-of-oblivion-when-changing-assassin/#entry1496042] [MrAntares]
|
//= 3.7 Fixed issue that the player can't progress in the quest if timed out at weapon reward step. This issue is fixed on iRO but not on kRO. [https://forums.warpportal.com/index.php?/topic/130060-didnt-receive-necklace-of-oblivion-when-changing-assassin/#entry1496042] [MrAntares]
|
||||||
//= 3.8 Another 'unofficial fix'. Player can't change job if time out after the necklace is deleted. [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,{
|
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 "Well then,";
|
||||||
mes "go for it!";
|
mes "go for it!";
|
||||||
close2;
|
close2;
|
||||||
ASSIN_Q = 0;
|
set ASSIN_Q,0;
|
||||||
warp "in_moc_16",19,76;
|
warp "in_moc_16",19,76;
|
||||||
end;
|
end;
|
||||||
}
|
}
|
||||||
@ -90,10 +96,9 @@ in_moc_16,19,33,1 script Guildsman#asn 55,{
|
|||||||
mes "[Ferocious-looking guy]";
|
mes "[Ferocious-looking guy]";
|
||||||
mes "You'll have to walk if you want to get back to town. Oh, and don't forget to save your spawn point, alright?";
|
mes "You'll have to walk if you want to get back to town. Oh, and don't forget to save your spawn point, alright?";
|
||||||
close2;
|
close2;
|
||||||
ASSIN_Q = 0;
|
set ASSIN_Q,0;
|
||||||
ASSIN_Q2 = 0;
|
set ASSIN_Q2,0;
|
||||||
if (ASSIN_Q3 < 3)
|
set ASSIN_Q3,0;
|
||||||
ASSIN_Q3 = 0;
|
|
||||||
savepoint "in_moc_16",18,14,1,1;
|
savepoint "in_moc_16",18,14,1,1;
|
||||||
warp "in_moc_16",18,14;
|
warp "in_moc_16",18,14;
|
||||||
end;
|
end;
|
||||||
@ -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 "It's been a while since I've received a guest. I'm sending";
|
||||||
mes "you to the office.";
|
mes "you to the office.";
|
||||||
close2;
|
close2;
|
||||||
ASSIN_Q = 0;
|
set ASSIN_Q,0;
|
||||||
if (checkquest(8000) != -1) {
|
if (checkquest(8000) != -1) {
|
||||||
changequest 8000,8001;
|
changequest 8000,8001;
|
||||||
} else {
|
} else {
|
||||||
@ -548,9 +553,8 @@ OnTouch_:
|
|||||||
mes "Alright then,";
|
mes "Alright then,";
|
||||||
mes "best of luck to you!";
|
mes "best of luck to you!";
|
||||||
close2;
|
close2;
|
||||||
if (ASSIN_Q3 < 3)
|
set ASSIN_Q3,1;
|
||||||
ASSIN_Q3 = 1;
|
set ASSIN_Q,1;
|
||||||
ASSIN_Q = 1;
|
|
||||||
changequest 8001,8002;
|
changequest 8001,8002;
|
||||||
warp "in_moc_16",19,144;
|
warp "in_moc_16",19,144;
|
||||||
end;
|
end;
|
||||||
@ -572,9 +576,8 @@ OnTouch_:
|
|||||||
mes "to the Test Hall.";
|
mes "to the Test Hall.";
|
||||||
mes "Best of luck~";
|
mes "Best of luck~";
|
||||||
close2;
|
close2;
|
||||||
if (ASSIN_Q3 < 3)
|
set ASSIN_Q3,2;
|
||||||
ASSIN_Q3 = 2;
|
set ASSIN_Q,1;
|
||||||
ASSIN_Q = 1;
|
|
||||||
changequest 8001,8002;
|
changequest 8001,8002;
|
||||||
warp "in_moc_16",19,144;
|
warp "in_moc_16",19,144;
|
||||||
end;
|
end;
|
||||||
@ -599,8 +602,9 @@ OnTouch_:
|
|||||||
mes "Eh, get outta here.";
|
mes "Eh, get outta here.";
|
||||||
mes "Stop wastin' my time...";
|
mes "Stop wastin' my time...";
|
||||||
close2;
|
close2;
|
||||||
ASSIN_Q = 0;
|
set ASSIN_Q,0;
|
||||||
ASSIN_Q2 = 0;
|
set ASSIN_Q3,0;
|
||||||
|
set ASSIN_Q2,0;
|
||||||
erasequest 8001;
|
erasequest 8001;
|
||||||
warp "moc_fild16",206,229;
|
warp "moc_fild16",206,229;
|
||||||
end;
|
end;
|
||||||
@ -626,9 +630,8 @@ OnTouch_:
|
|||||||
mes "[Assassin 'Khai']";
|
mes "[Assassin 'Khai']";
|
||||||
mes "Are you done filling out the form? Alright, give it to me so I can send you to the Test Hall. Good luck~";
|
mes "Are you done filling out the form? Alright, give it to me so I can send you to the Test Hall. Good luck~";
|
||||||
next;
|
next;
|
||||||
if (ASSIN_Q3 < 3)
|
set ASSIN_Q3,1;
|
||||||
ASSIN_Q3 = 1;
|
set ASSIN_Q,1;
|
||||||
ASSIN_Q = 1;
|
|
||||||
changequest 8001,8002;
|
changequest 8001,8002;
|
||||||
warp "in_moc_16",19,144;
|
warp "in_moc_16",19,144;
|
||||||
end;
|
end;
|
||||||
@ -641,9 +644,8 @@ OnTouch_:
|
|||||||
mes "Then give me the form so that I can send you to the Test Hall, alright?";
|
mes "Then give me the form so that I can send you to the Test Hall, alright?";
|
||||||
mes "Good luck...";
|
mes "Good luck...";
|
||||||
next;
|
next;
|
||||||
if (ASSIN_Q3 < 3)
|
set ASSIN_Q3,2;
|
||||||
ASSIN_Q3 = 2;
|
set ASSIN_Q,1;
|
||||||
ASSIN_Q = 1;
|
|
||||||
changequest 8001,8002;
|
changequest 8001,8002;
|
||||||
warp "in_moc_16",19,144;
|
warp "in_moc_16",19,144;
|
||||||
end;
|
end;
|
||||||
@ -709,7 +711,7 @@ OnTouch_:
|
|||||||
mes "Although I am heartless,";
|
mes "Although I am heartless,";
|
||||||
mes "I am not necessarily cruel. Before we proceed, is there anything you wish to know?";
|
mes "I am not necessarily cruel. Before we proceed, is there anything you wish to know?";
|
||||||
next;
|
next;
|
||||||
ASSIN_Q2 = 0;
|
set ASSIN_Q2,0;
|
||||||
while(ASSIN_Q2 < 3) {
|
while(ASSIN_Q2 < 3) {
|
||||||
switch(select("...Skills?:...Stats?:Hmpf, I know it all.")) {
|
switch(select("...Skills?:...Stats?:Hmpf, I know it all.")) {
|
||||||
case 1:
|
case 1:
|
||||||
@ -772,7 +774,7 @@ OnTouch_:
|
|||||||
mes "Now...";
|
mes "Now...";
|
||||||
mes "That's all I have to tell you";
|
mes "That's all I have to tell you";
|
||||||
mes "about Assassin skills.";
|
mes "about Assassin skills.";
|
||||||
ASSIN_Q2 = 1;
|
set ASSIN_Q2,1;
|
||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
@ -785,7 +787,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "I cannot give you better advice than that in regards to Stats. You should research and see which stats suit you, and decide what kind of Assassin you want to be.";
|
mes "I cannot give you better advice than that in regards to Stats. You should research and see which stats suit you, and decide what kind of Assassin you want to be.";
|
||||||
ASSIN_Q2 = 2;
|
set ASSIN_Q2,2;
|
||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
@ -795,7 +797,7 @@ OnTouch_:
|
|||||||
mes "I'll be the judge of that!";
|
mes "I'll be the judge of that!";
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
ASSIN_Q2 = 3;
|
set ASSIN_Q2,3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -845,53 +847,53 @@ OnTouch_:
|
|||||||
mes "1. Choose skill that is not required to learn Grimtooth.";
|
mes "1. Choose skill that is not required to learn Grimtooth.";
|
||||||
next;
|
next;
|
||||||
if (select("Cloaking level 2:Sonic Blow level 5:Katar Mastery level 4:Right hand Mastery level 2") == 4)
|
if (select("Cloaking level 2:Sonic Blow level 5:Katar Mastery level 4:Right hand Mastery level 2") == 4)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "2. What property does Enchant Poison possess?";
|
mes "2. What property does Enchant Poison possess?";
|
||||||
next;
|
next;
|
||||||
if (select("Poison:Earth:Fire:Wind") == 1)
|
if (select("Poison:Earth:Fire:Wind") == 1)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "3. How does Level 4 Right Hand Mastery work?";
|
mes "3. How does Level 4 Right Hand Mastery work?";
|
||||||
next;
|
next;
|
||||||
if (select("Recover 80% of damage decrease:Recover 90% of damage decrease:Increase 90% of damage:Increase 108% of damage") == 2)
|
if (select("Recover 80% of damage decrease:Recover 90% of damage decrease:Increase 90% of damage:Increase 108% of damage") == 2)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "4. What is the item required for using Venom Dust?";
|
mes "4. What is the item required for using Venom Dust?";
|
||||||
next;
|
next;
|
||||||
if (select("Red Blood:Blue Gemstone:Yellow Gemstone:Red Gemstone") == 4)
|
if (select("Red Blood:Blue Gemstone:Yellow Gemstone:Red Gemstone") == 4)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "5. Which skill can you learn when you reach Level 5 Enchant Poison?";
|
mes "5. Which skill can you learn when you reach Level 5 Enchant Poison?";
|
||||||
next;
|
next;
|
||||||
if (select("Envenom:Sonic Blow:Venom Splasher:Venom Dust") == 4)
|
if (select("Envenom:Sonic Blow:Venom Splasher:Venom Dust") == 4)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "6. Among the following skills, which allows you to walk while invisible?";
|
mes "6. Among the following skills, which allows you to walk while invisible?";
|
||||||
next;
|
next;
|
||||||
if (select("Hiding:Back Slide:Cloaking:Sand Attack") == 3)
|
if (select("Hiding:Back Slide:Cloaking:Sand Attack") == 3)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "7. Choose the condition that is unrelated to Venom Splasher.";
|
mes "7. Choose the condition that is unrelated to Venom Splasher.";
|
||||||
next;
|
next;
|
||||||
if (select("Poisoned target.:Red Gemstone.:Remaing HP of Target.") == 2)
|
if (select("Poisoned target.:Red Gemstone.:Remaing HP of Target.") == 2)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "8. Which monster is weak to a weapon with Vadon card (adds 20% damage on Fire property monster)?";
|
mes "8. Which monster is weak to a weapon with Vadon card (adds 20% damage on Fire property monster)?";
|
||||||
next;
|
next;
|
||||||
if (select("Steel Chonchon:Deviruchi:Elder Willow:Baphomet") == 3)
|
if (select("Steel Chonchon:Deviruchi:Elder Willow:Baphomet") == 3)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "9. How much SP does";
|
mes "9. How much SP does";
|
||||||
mes "Double Attack need?";
|
mes "Double Attack need?";
|
||||||
next;
|
next;
|
||||||
if (select("15:It's a passive skill, so SP use is 0.:It's passive skill, so SP use is 10.:54") == 2)
|
if (select("15:It's a passive skill, so SP use is 0.:It's passive skill, so SP use is 10.:54") == 2)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "10. What is the best elemental Main Gauche weapon for hunting in Izlude dungeon?";
|
mes "10. What is the best elemental Main Gauche weapon for hunting in Izlude dungeon?";
|
||||||
next;
|
next;
|
||||||
if (select("Wind Main Gauche:Ice Main Gauche:Earth Main Gauche:Fire Main Gauche") == 1)
|
if (select("Wind Main Gauche:Ice Main Gauche:Earth Main Gauche:Fire Main Gauche") == 1)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
@ -899,104 +901,104 @@ OnTouch_:
|
|||||||
mes "drops a slotted Katar?";
|
mes "drops a slotted Katar?";
|
||||||
next;
|
next;
|
||||||
if (select("Thief Bug:Peco Peco:Desert Wolf:Hammer Cobolt") == 3)
|
if (select("Thief Bug:Peco Peco:Desert Wolf:Hammer Cobolt") == 3)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "2. Which monster";
|
mes "2. Which monster";
|
||||||
mes "drops a slotted Jur?";
|
mes "drops a slotted Jur?";
|
||||||
next;
|
next;
|
||||||
if (select("Martin:Desert Wolf:Marionette:Myst") == 1)
|
if (select("Martin:Desert Wolf:Marionette:Myst") == 1)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "3. Which class is allowed to craft elemental weapons?";
|
mes "3. Which class is allowed to craft elemental weapons?";
|
||||||
next;
|
next;
|
||||||
if (select("Merchant:Blacksmith:Thief:Priest") == 2)
|
if (select("Merchant:Blacksmith:Thief:Priest") == 2)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "4. Choose the weapon which is not in the Katar class.";
|
mes "4. Choose the weapon which is not in the Katar class.";
|
||||||
next;
|
next;
|
||||||
if (select("Jamadhar:Jur:Katar:Gladius") == 4)
|
if (select("Jamadhar:Jur:Katar:Gladius") == 4)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "5. What property do Izlude dungeon monsters posses?";
|
mes "5. What property do Izlude dungeon monsters posses?";
|
||||||
next;
|
next;
|
||||||
if (select("Water:Fire:Wind:Earth") == 1)
|
if (select("Water:Fire:Wind:Earth") == 1)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "6. Which monster";
|
mes "6. Which monster";
|
||||||
mes "cannot be a Cute Pet?";
|
mes "cannot be a Cute Pet?";
|
||||||
next;
|
next;
|
||||||
if (select("Poporing:Roda Frog:Smokie:Poison Spore") == 2)
|
if (select("Poporing:Roda Frog:Smokie:Poison Spore") == 2)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "7. Choose a monster that Fire property Daggers work the best on.";
|
mes "7. Choose a monster that Fire property Daggers work the best on.";
|
||||||
next;
|
next;
|
||||||
if (select("Dagger Goblin:Mace Goblin:Morning Star Goblin:Hammer Goblin") == 4)
|
if (select("Dagger Goblin:Mace Goblin:Morning Star Goblin:Hammer Goblin") == 4)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "8. Choose the non-elemental Katar from the following:";
|
mes "8. Choose the non-elemental Katar from the following:";
|
||||||
next;
|
next;
|
||||||
if (select("Katar of Raging Blaze:Katar of Dusty Thornbush:Sharpened Legbone of Ghoul:Infiltrator") == 4)
|
if (select("Katar of Raging Blaze:Katar of Dusty Thornbush:Sharpened Legbone of Ghoul:Infiltrator") == 4)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "9. Which is the uncommon monster?";
|
mes "9. Which is the uncommon monster?";
|
||||||
next;
|
next;
|
||||||
if (select("Poring:Mastering:Ghostring:Spore") == 3)
|
if (select("Poring:Mastering:Ghostring:Spore") == 3)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "10. Choose the monster";
|
mes "10. Choose the monster";
|
||||||
mes "that is not Undead.";
|
mes "that is not Undead.";
|
||||||
next;
|
next;
|
||||||
if (select("Drake:Megalodon:Spore:Khalitzburg") == 3)
|
if (select("Drake:Megalodon:Spore:Khalitzburg") == 3)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "1. Choose the correct amount of the maximum dodge rate increase from the 'Increase Dodge' skill when at level 10.";
|
mes "1. Choose the correct amount of the maximum dodge rate increase from the 'Increase Dodge' skill when at level 10.";
|
||||||
next;
|
next;
|
||||||
if (select("30:40:160:20") == 1)
|
if (select("30:40:160:20") == 1)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "2. Choose a monster which detects hiding/cloaking Thieves and Assassins.";
|
mes "2. Choose a monster which detects hiding/cloaking Thieves and Assassins.";
|
||||||
next;
|
next;
|
||||||
if (select("Worm Tail:Andre:Mummy:Soldier Skeleton") == 2)
|
if (select("Worm Tail:Andre:Mummy:Soldier Skeleton") == 2)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "3. Choose a group of weapons that cannot be used by an Assassin at once.";
|
mes "3. Choose a group of weapons that cannot be used by an Assassin at once.";
|
||||||
next;
|
next;
|
||||||
if (select("Main Gaughe + Gladius:Stiletto + Main Gauche:Katar + Maingauche:Hammer + Stiletto") == 3)
|
if (select("Main Gaughe + Gladius:Stiletto + Main Gauche:Katar + Maingauche:Hammer + Stiletto") == 3)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "4. Choose the town where Thieves can change their jobs.";
|
mes "4. Choose the town where Thieves can change their jobs.";
|
||||||
next;
|
next;
|
||||||
if (select("Prontera:Lutie:Alberta:Morocc") == 4)
|
if (select("Prontera:Lutie:Alberta:Morocc") == 4)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "5. Choose a card that does not affect the AGI stat.";
|
mes "5. Choose a card that does not affect the AGI stat.";
|
||||||
next;
|
next;
|
||||||
if (select("Baphomet Jr. card:Whisper Card:Female Thiefbug card:Male Thiefbug card") == 2)
|
if (select("Baphomet Jr. card:Whisper Card:Female Thiefbug card:Male Thiefbug card") == 2)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "6. Choose the correct specialty of the Assassin class.";
|
mes "6. Choose the correct specialty of the Assassin class.";
|
||||||
next;
|
next;
|
||||||
if (select("Excellent singing talent:Excellent reading talent:Excellent dancing talent:Excellent dodge ability") == 4)
|
if (select("Excellent singing talent:Excellent reading talent:Excellent dancing talent:Excellent dodge ability") == 4)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "7. Choose the maximum AGI bonus an Assassin can get at job level 50.";
|
mes "7. Choose the maximum AGI bonus an Assassin can get at job level 50.";
|
||||||
next;
|
next;
|
||||||
if (select("7:8:9:10") == 4)
|
if (select("7:8:9:10") == 4)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "8. Choose the item that an Assassin cannot equip.";
|
mes "8. Choose the item that an Assassin cannot equip.";
|
||||||
next;
|
next;
|
||||||
if (select("Dagger:Helm:Boots:Brooch") == 2)
|
if (select("Dagger:Helm:Boots:Brooch") == 2)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
mes "9. Choose the job change item for Thief.";
|
mes "9. Choose the job change item for Thief.";
|
||||||
next;
|
next;
|
||||||
switch(select("Orange Gooey Mushroom:Red Gooey Mushroom:Orange Net Mushroom:Orange Hair Mushroom")) {
|
switch(select("Orange Gooey Mushroom:Red Gooey Mushroom:Orange Net Mushroom:Orange Hair Mushroom")) {
|
||||||
case 1:
|
case 1:
|
||||||
case 3:
|
case 3:
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -1005,7 +1007,7 @@ OnTouch_:
|
|||||||
mes "10. Choose a card that would typically benefit an Assassin the least.";
|
mes "10. Choose a card that would typically benefit an Assassin the least.";
|
||||||
next;
|
next;
|
||||||
if (select("Whisper card:Elder Willow card:Soldier Skeleton card:Cobold card") == 2)
|
if (select("Whisper card:Elder Willow card:Soldier Skeleton card:Cobold card") == 2)
|
||||||
.@assassin_t += 10;
|
set .@assassin_t,.@assassin_t+10;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ASSIN_Q2 == 3) {
|
if (ASSIN_Q2 == 3) {
|
||||||
@ -1021,7 +1023,7 @@ OnTouch_:
|
|||||||
mes "You scored";
|
mes "You scored";
|
||||||
mes "" + .@assassin_t + " percent...";
|
mes "" + .@assassin_t + " percent...";
|
||||||
if (.@assassin_t > 80) {
|
if (.@assassin_t > 80) {
|
||||||
ASSIN_Q2 = 5;
|
set ASSIN_Q2,5;
|
||||||
changequest 8002,8003;
|
changequest 8002,8003;
|
||||||
mes "Well done.";
|
mes "Well done.";
|
||||||
mes "You pass.";
|
mes "You pass.";
|
||||||
@ -1031,7 +1033,7 @@ OnTouch_:
|
|||||||
close;
|
close;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ASSIN_Q2 = 4;
|
set ASSIN_Q2,4;
|
||||||
mes "That means you fail!";
|
mes "That means you fail!";
|
||||||
next;
|
next;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
@ -1058,7 +1060,7 @@ OnTouch_:
|
|||||||
mes "You scored";
|
mes "You scored";
|
||||||
mes "" + .@assassin_t + " points...";
|
mes "" + .@assassin_t + " points...";
|
||||||
if (.@assassin_t > 80) {
|
if (.@assassin_t > 80) {
|
||||||
ASSIN_Q2 = 5;
|
set ASSIN_Q2,5;
|
||||||
changequest 8002,8003;
|
changequest 8002,8003;
|
||||||
next;
|
next;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
@ -1066,7 +1068,7 @@ OnTouch_:
|
|||||||
close;
|
close;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ASSIN_Q2 = 4;
|
set ASSIN_Q2,4;
|
||||||
mes "You failed!";
|
mes "You failed!";
|
||||||
next;
|
next;
|
||||||
mes "[The Anonymous One]";
|
mes "[The Anonymous One]";
|
||||||
@ -1192,8 +1194,9 @@ OnTouch_:
|
|||||||
mes "I guess you";
|
mes "I guess you";
|
||||||
mes "could use a break...";
|
mes "could use a break...";
|
||||||
close2;
|
close2;
|
||||||
ASSIN_Q = 0;
|
set ASSIN_Q,0;
|
||||||
ASSIN_Q2 = 0;
|
set ASSIN_Q3,0;
|
||||||
|
set ASSIN_Q2,0;
|
||||||
changequest 8003,8000;
|
changequest 8003,8000;
|
||||||
warp "in_moc_16",19,13;
|
warp "in_moc_16",19,13;
|
||||||
end;
|
end;
|
||||||
@ -1204,7 +1207,7 @@ in_moc_16,1,1,0 script Beholder#ASNTEST -1,{
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
OnEnable:
|
OnEnable:
|
||||||
.MyMobs = 6;
|
set .MyMobs,6;
|
||||||
// Target mobs
|
// Target mobs
|
||||||
monster "in_moc_16",62,161,"Job change target",1002,1,"Beholder#ASNTEST::OnMyMobDead";
|
monster "in_moc_16",62,161,"Job change target",1002,1,"Beholder#ASNTEST::OnMyMobDead";
|
||||||
monster "in_moc_16",85,169,"Job change target",1063,1,"Beholder#ASNTEST::OnMyMobDead";
|
monster "in_moc_16",85,169,"Job change target",1063,1,"Beholder#ASNTEST::OnMyMobDead";
|
||||||
@ -1264,15 +1267,15 @@ OnResetmob:
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
OnMyMobDead:
|
OnMyMobDead:
|
||||||
.MyMobs--;
|
set .MyMobs,.MyMobs-1;
|
||||||
if (.MyMobs < 1) {
|
if (.MyMobs < 1) {
|
||||||
mapannounce "in_moc_16","You seem to be doing quite well. Keep it up!",bc_map;
|
mapannounce "in_moc_16","You seem to be doing quite well. Keep it up!",bc_map;
|
||||||
ASSIN_Q = 3;
|
set ASSIN_Q,3;
|
||||||
changequest 8003,8004;
|
changequest 8003,8004;
|
||||||
donpcevent "timestopper#1::OnEnable";
|
donpcevent "timestopper#1::OnEnable";
|
||||||
donpcevent "Keeper of the Door#ASN::OnEnable";
|
donpcevent "Keeper of the Door#ASN::OnEnable";
|
||||||
donpcevent "Beholder#ASNTEST::OnResetmob";
|
donpcevent "Beholder#ASNTEST::OnResetmob";
|
||||||
.DisableTraps = 1;
|
set .DisableTraps,1;
|
||||||
stopnpctimer;
|
stopnpctimer;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1282,7 +1285,7 @@ OnMyMobDead:
|
|||||||
|
|
||||||
OnMyMobDead2:
|
OnMyMobDead2:
|
||||||
mapannounce "in_moc_16",strcharinfo(0) + "! You made a mistake! I'm bringing you back!",bc_map;
|
mapannounce "in_moc_16",strcharinfo(0) + "! You made a mistake! I'm bringing you back!",bc_map;
|
||||||
ASSIN_Q = 2;
|
set ASSIN_Q,2;
|
||||||
warp "in_moc_16",19,161;
|
warp "in_moc_16",19,161;
|
||||||
donpcevent "Beholder#ASNTEST::OnReset";
|
donpcevent "Beholder#ASNTEST::OnReset";
|
||||||
end;
|
end;
|
||||||
@ -1338,7 +1341,7 @@ OnTimer184000:
|
|||||||
OnTimer185000:
|
OnTimer185000:
|
||||||
mapannounce "in_moc_16","Time's up!",bc_map;
|
mapannounce "in_moc_16","Time's up!",bc_map;
|
||||||
mapannounce "in_moc_16","Well, good job... If you wanted to waste your time. You'll have to try again!",bc_map;
|
mapannounce "in_moc_16","Well, good job... If you wanted to waste your time. You'll have to try again!",bc_map;
|
||||||
//ASSIN_Q = 2;
|
//set ASSIN_Q,2;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
OnTimer186000:
|
OnTimer186000:
|
||||||
@ -1354,7 +1357,7 @@ in_moc_16,68,158,0 script 01_1::SinTrap -1,0,0,{
|
|||||||
OnTouch_:
|
OnTouch_:
|
||||||
if (getvariableofnpc(.DisableTraps,"Beholder#ASNTEST") < 1) {
|
if (getvariableofnpc(.DisableTraps,"Beholder#ASNTEST") < 1) {
|
||||||
mapannounce "in_moc_16",strcharinfo(0) + ", you're trapped. You will be sent back.",bc_map;
|
mapannounce "in_moc_16",strcharinfo(0) + ", you're trapped. You will be sent back.",bc_map;
|
||||||
ASSIN_Q = 2;
|
set ASSIN_Q,2;
|
||||||
warp "in_moc_16",19,161;
|
warp "in_moc_16",19,161;
|
||||||
donpcevent "Beholder#ASNTEST::OnResetmob";
|
donpcevent "Beholder#ASNTEST::OnResetmob";
|
||||||
donpcevent "Standby Room#ASNTEST::OnStart";
|
donpcevent "Standby Room#ASNTEST::OnStart";
|
||||||
@ -1454,9 +1457,9 @@ OnInit:
|
|||||||
OnTouch_:
|
OnTouch_:
|
||||||
donpcevent "Thomas#ASNTEST::OnDisable";
|
donpcevent "Thomas#ASNTEST::OnDisable";
|
||||||
if (ASSIN_Q == 3)
|
if (ASSIN_Q == 3)
|
||||||
ASSIN_Q = 3;
|
set ASSIN_Q,3;
|
||||||
else
|
else
|
||||||
ASSIN_Q = 4;
|
set ASSIN_Q,4;
|
||||||
warp "in_moc_16",87,102;
|
warp "in_moc_16",87,102;
|
||||||
savepoint "in_moc_16",16,13,1,1;
|
savepoint "in_moc_16",16,13,1,1;
|
||||||
end;
|
end;
|
||||||
@ -1488,9 +1491,9 @@ OnDisable:
|
|||||||
OnMyMobDead:
|
OnMyMobDead:
|
||||||
mapannounce "in_moc_16","Hey, what the hell was that?! I told you: No killing monsters!",bc_map;
|
mapannounce "in_moc_16","Hey, what the hell was that?! I told you: No killing monsters!",bc_map;
|
||||||
mapannounce "in_moc_16","I'm bringing you back... *Sigh...*",bc_map;
|
mapannounce "in_moc_16","I'm bringing you back... *Sigh...*",bc_map;
|
||||||
ASSIN_Q = 3;
|
set ASSIN_Q,3;
|
||||||
warp "in_moc_16",87,102;
|
warp "in_moc_16",87,102;
|
||||||
killmonster "in_moc_16","timestopper#1::OnMyMobDead";
|
killmonsterall "in_moc_16";
|
||||||
end;
|
end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1522,8 +1525,9 @@ OnTouch_:
|
|||||||
mes "Oh hey, don't forget to save your respawn point in town.";
|
mes "Oh hey, don't forget to save your respawn point in town.";
|
||||||
close2;
|
close2;
|
||||||
mapannounce "in_moc_16",strcharinfo(0) + " got scared and quit the test...Who's Next?!",bc_map;
|
mapannounce "in_moc_16",strcharinfo(0) + " got scared and quit the test...Who's Next?!",bc_map;
|
||||||
ASSIN_Q = 0;
|
set ASSIN_Q,0;
|
||||||
ASSIN_Q2 = 0;
|
set ASSIN_Q2,0;
|
||||||
|
set ASSIN_Q3,0;
|
||||||
changequest 8004,8000;
|
changequest 8004,8000;
|
||||||
savepoint "in_moc_16",18,14,1,1;
|
savepoint "in_moc_16",18,14,1,1;
|
||||||
warp "in_moc_16",18,14;
|
warp "in_moc_16",18,14;
|
||||||
@ -1544,7 +1548,7 @@ OnTouch_:
|
|||||||
mes "[Thomas]";
|
mes "[Thomas]";
|
||||||
mes "If you run away, get a nose bleed and pass out or something like that, I'll fail ya'. Enough talk. Let's see what you got.";
|
mes "If you run away, get a nose bleed and pass out or something like that, I'll fail ya'. Enough talk. Let's see what you got.";
|
||||||
close2;
|
close2;
|
||||||
ASSIN_Q = 4;
|
set ASSIN_Q,4;
|
||||||
|
|
||||||
monster "in_moc_16",81,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead";
|
monster "in_moc_16",81,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead";
|
||||||
monster "in_moc_16",82,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead";
|
monster "in_moc_16",82,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead";
|
||||||
@ -1579,7 +1583,7 @@ OnTouch_:
|
|||||||
|
|
||||||
OnDisable:
|
OnDisable:
|
||||||
donpcevent "Standby Room#ASNTEST::OnStart";
|
donpcevent "Standby Room#ASNTEST::OnStart";
|
||||||
killmonster "in_moc_16","timestopper#1::OnMyMobDead";
|
killmonsterall "in_moc_16";
|
||||||
end;
|
end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1592,7 +1596,7 @@ OnTouch_:
|
|||||||
mes "Oh! Congratulations!";
|
mes "Oh! Congratulations!";
|
||||||
mes "You may now proceed to our Guildmaster's room. Good luck!!";
|
mes "You may now proceed to our Guildmaster's room. Good luck!!";
|
||||||
close2;
|
close2;
|
||||||
ASSIN_Q = 5;
|
set ASSIN_Q,5;
|
||||||
changequest 8004,8005;
|
changequest 8004,8005;
|
||||||
warp "in_moc_16",181,183;
|
warp "in_moc_16",181,183;
|
||||||
end;
|
end;
|
||||||
@ -1602,7 +1606,7 @@ in_moc_16,182,169,0 script Maze Assistant 45,1,1,{
|
|||||||
OnTouch_:
|
OnTouch_:
|
||||||
if (ASSIN_Q == 5 || ASSIN_Q == 6) {
|
if (ASSIN_Q == 5 || ASSIN_Q == 6) {
|
||||||
warp "in_moc_16",181,183;
|
warp "in_moc_16",181,183;
|
||||||
ASSIN_Q++;
|
set ASSIN_Q,ASSIN_Q+1;
|
||||||
if (!isbegin_quest(8006))
|
if (!isbegin_quest(8006))
|
||||||
changequest 8005,8006;
|
changequest 8005,8006;
|
||||||
}
|
}
|
||||||
@ -1644,7 +1648,7 @@ OnTouch_:
|
|||||||
else
|
else
|
||||||
savepoint "moc_ruins",79,99,1,1;
|
savepoint "moc_ruins",79,99,1,1;
|
||||||
if (ASSIN_Q == 7 && BaseJob == Job_Thief) {
|
if (ASSIN_Q == 7 && BaseJob == Job_Thief) {
|
||||||
ASSIN_Q = 8;
|
set ASSIN_Q,8;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Welcome.";
|
mes "Welcome.";
|
||||||
mes "I apologize for";
|
mes "I apologize for";
|
||||||
@ -1678,6 +1682,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
switch(select("Revenge...!:Money~:I want to travel.")) {
|
switch(select("Revenge...!:Money~:I want to travel.")) {
|
||||||
case 1:
|
case 1:
|
||||||
|
set ASSIN_Q,8;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Revenge...?";
|
mes "Revenge...?";
|
||||||
mes "Yes, I understand. All of us hold grudges against someone else eventually.";
|
mes "Yes, I understand. All of us hold grudges against someone else eventually.";
|
||||||
@ -1691,7 +1696,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ASSIN_Q = 9;
|
set ASSIN_Q,9;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Financial reasons...? I won't deny that we all need money to live. But being Assassin means living for a higher purpose.";
|
mes "Financial reasons...? I won't deny that we all need money to live. But being Assassin means living for a higher purpose.";
|
||||||
next;
|
next;
|
||||||
@ -1702,7 +1707,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
ASSIN_Q = 10;
|
set ASSIN_Q,10;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Good idea. Traveling around the world will allow you to broaden your experiences.";
|
mes "Good idea. Traveling around the world will allow you to broaden your experiences.";
|
||||||
next;
|
next;
|
||||||
@ -1731,7 +1736,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
switch(select("I like the solitude.:Making money being an Assassin.:They just look interesting.")) {
|
switch(select("I like the solitude.:Making money being an Assassin.:They just look interesting.")) {
|
||||||
case 1:
|
case 1:
|
||||||
ASSIN_Q = 11;
|
set ASSIN_Q,11;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "You got the point...";
|
mes "You got the point...";
|
||||||
mes "We are lonely. We will always be alone, even amongst each other...";
|
mes "We are lonely. We will always be alone, even amongst each other...";
|
||||||
@ -1746,13 +1751,13 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ASSIN_Q = 12;
|
set ASSIN_Q,12;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Well, I can't deny it, we do need money to make a living. But don't you think we should pursue something even more important than money?";
|
mes "Well, I can't deny it, we do need money to make a living. But don't you think we should pursue something even more important than money?";
|
||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
ASSIN_Q = 13;
|
set ASSIN_Q,13;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Style and appearance is only superficial. It is sad that many people think this way...";
|
mes "Style and appearance is only superficial. It is sad that many people think this way...";
|
||||||
next;
|
next;
|
||||||
@ -1777,7 +1782,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
switch(select("To broaden my skills.:It's a goal of mine.:For spiritual improvement.")) {
|
switch(select("To broaden my skills.:It's a goal of mine.:For spiritual improvement.")) {
|
||||||
case 1:
|
case 1:
|
||||||
ASSIN_Q = 14;
|
set ASSIN_Q,14;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Learning skills comes naturally with the Assassin job. But don't think of skills as the best value of your training.";
|
mes "Learning skills comes naturally with the Assassin job. But don't think of skills as the best value of your training.";
|
||||||
next;
|
next;
|
||||||
@ -1786,7 +1791,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ASSIN_Q = 15;
|
set ASSIN_Q,15;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "It's a goal of yours, eh? Well, I guess you've got to have goals...";
|
mes "It's a goal of yours, eh? Well, I guess you've got to have goals...";
|
||||||
next;
|
next;
|
||||||
@ -1800,7 +1805,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
ASSIN_Q = 16;
|
set ASSIN_Q,16;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Good idea...";
|
mes "Good idea...";
|
||||||
mes "That is a good way to improve yourself. I've seen many people who know how to be strong physically but not in their mental state.";
|
mes "That is a good way to improve yourself. I've seen many people who know how to be strong physically but not in their mental state.";
|
||||||
@ -1832,14 +1837,14 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
switch(select("I would level up fast.:I want to explore my Assassin skills.:I will go where I couldn't go as a Thief.")) {
|
switch(select("I would level up fast.:I want to explore my Assassin skills.:I will go where I couldn't go as a Thief.")) {
|
||||||
case 1:
|
case 1:
|
||||||
.@assassin_sangdam += 10;
|
set .@assassin_sangdam,.@assassin_sangdam+10;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Don't act recklessly...";
|
mes "Don't act recklessly...";
|
||||||
mes "Being an Assassin never makes you a different person. And don't rely on chance.";
|
mes "Being an Assassin never makes you a different person. And don't rely on chance.";
|
||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
.@assassin_sangdam += 5;
|
set .@assassin_sangdam,.@assassin_sangdam+5;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "It is good for one to examine oneself. I can understand that you will be excited by the great change in your ability.";
|
mes "It is good for one to examine oneself. I can understand that you will be excited by the great change in your ability.";
|
||||||
next;
|
next;
|
||||||
@ -1866,14 +1871,14 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
switch(select("My friends.:My Guildsmen.:My lover.")) {
|
switch(select("My friends.:My Guildsmen.:My lover.")) {
|
||||||
case 1:
|
case 1:
|
||||||
.@assassin_sangdam += 5;
|
set .@assassin_sangdam,.@assassin_sangdam+5;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "I see...";
|
mes "I see...";
|
||||||
mes "Appreciate them for caring about you, even when you're alone.";
|
mes "Appreciate them for caring about you, even when you're alone.";
|
||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
.@assassin_sangdam += 5;
|
set .@assassin_sangdam,.@assassin_sangdam+5;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Great...";
|
mes "Great...";
|
||||||
mes "Comrades for whom you would die for...";
|
mes "Comrades for whom you would die for...";
|
||||||
@ -1904,7 +1909,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
switch(select("Places where Assassins can level up...:Main goals as an Assassin.:Financial consulting.")) {
|
switch(select("Places where Assassins can level up...:Main goals as an Assassin.:Financial consulting.")) {
|
||||||
case 1:
|
case 1:
|
||||||
.@assassin_sangdam += 5;
|
set .@assassin_sangdam,.@assassin_sangdam+5;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "It all depends on your mind. Any place could be the best to level up according to your mind state.";
|
mes "It all depends on your mind. Any place could be the best to level up according to your mind state.";
|
||||||
next;
|
next;
|
||||||
@ -1922,7 +1927,7 @@ OnTouch_:
|
|||||||
next;
|
next;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
.@assassin_sangdam += 10;
|
set .@assassin_sangdam,.@assassin_sangdam+10;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Oh my lord...";
|
mes "Oh my lord...";
|
||||||
mes "Are you planning to become an Assassin in order to make money?";
|
mes "Are you planning to become an Assassin in order to make money?";
|
||||||
@ -1974,7 +1979,7 @@ OnTouch_:
|
|||||||
mes "supports you. How";
|
mes "supports you. How";
|
||||||
mes "about you, Huey?";
|
mes "about you, Huey?";
|
||||||
next;
|
next;
|
||||||
if (ASSIN_Q3 == 1) { // player Job Level was above 48
|
if (ASSIN_Q3 == 1) {
|
||||||
mes "[Huey]";
|
mes "[Huey]";
|
||||||
mes "A rarity.";
|
mes "A rarity.";
|
||||||
mes "You can tell";
|
mes "You can tell";
|
||||||
@ -1984,7 +1989,7 @@ OnTouch_:
|
|||||||
mes "I agree with";
|
mes "I agree with";
|
||||||
mes "the Anonymous One.";
|
mes "the Anonymous One.";
|
||||||
}
|
}
|
||||||
else { // player Job Level was below 48
|
else {
|
||||||
mes "[Huey]";
|
mes "[Huey]";
|
||||||
mes "Although "+ strcharinfo(0) +" looks too mellow and gentle, kind of like a pussycat, "+ strcharinfo(0) +" has the stuff.";
|
mes "Although "+ strcharinfo(0) +" looks too mellow and gentle, kind of like a pussycat, "+ strcharinfo(0) +" has the stuff.";
|
||||||
next;
|
next;
|
||||||
@ -2059,8 +2064,7 @@ OnTouch_:
|
|||||||
mes "I believe you stand out amongst them...";
|
mes "I believe you stand out amongst them...";
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
switch(ASSIN_Q3) {
|
if (ASSIN_Q3 == 1 && BaseJob == Job_Thief && ASSIN_Q > 6 && ASSIN_Q < 17) {
|
||||||
case 1: // player Job Level was above 48
|
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Well, I've said too much. Please choose a weapon as a present.";
|
mes "Well, I've said too much. Please choose a weapon as a present.";
|
||||||
next;
|
next;
|
||||||
@ -2094,10 +2098,10 @@ OnTouch_:
|
|||||||
mes "It used to rule over the Assassin weapon market. Please take care of my gladius.";
|
mes "It used to rule over the Assassin weapon market. Please take care of my gladius.";
|
||||||
getitem 1220,1; //Gladius_
|
getitem 1220,1; //Gladius_
|
||||||
}
|
}
|
||||||
ASSIN_Q3 = 3;
|
ASSIN_Q3 = 2;
|
||||||
next;
|
next;
|
||||||
break;
|
}
|
||||||
case 2: // player Job Level was below 48
|
else if (ASSIN_Q3 != 2) {
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Well, I talked too much.";
|
mes "Well, I talked too much.";
|
||||||
mes "Please take this first.";
|
mes "Please take this first.";
|
||||||
@ -2118,7 +2122,7 @@ OnTouch_:
|
|||||||
case 5:
|
case 5:
|
||||||
getitem 1252,1; //Katar
|
getitem 1252,1; //Katar
|
||||||
}
|
}
|
||||||
ASSIN_Q3 = 3;
|
ASSIN_Q3 = 2;
|
||||||
}
|
}
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "Well, I am giving you a token. Please return to the Assassin expert, the Ferocious-Looking Huey, at the entrance.";
|
mes "Well, I am giving you a token. Please return to the Assassin expert, the Ferocious-Looking Huey, at the entrance.";
|
||||||
@ -2161,7 +2165,7 @@ OnTouch_:
|
|||||||
end;
|
end;
|
||||||
}
|
}
|
||||||
else if (ASSIN_Q > 7 && ASSIN_Q < 17) {
|
else if (ASSIN_Q > 7 && ASSIN_Q < 17) {
|
||||||
ASSIN_Q = 7;
|
set ASSIN_Q,7;
|
||||||
mes "[Guildmaster]";
|
mes "[Guildmaster]";
|
||||||
mes "What the hell? You pressed 'Cancel' during the process. Do you want to change your job or what?";
|
mes "What the hell? You pressed 'Cancel' during the process. Do you want to change your job or what?";
|
||||||
next;
|
next;
|
||||||
|
1538
npc/re/instances/AirshipDestruction.txt
Normal file
1538
npc/re/instances/AirshipDestruction.txt
Normal file
File diff suppressed because it is too large
Load Diff
489
npc/re/instances/BaggotLaboratory.txt
Normal file
489
npc/re/instances/BaggotLaboratory.txt
Normal 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;
|
||||||
|
}
|
1865
npc/re/instances/ConfusedSnakesNest.txt
Normal file
1865
npc/re/instances/ConfusedSnakesNest.txt
Normal file
File diff suppressed because it is too large
Load Diff
1180
npc/re/instances/IwinPatrol.txt
Normal file
1180
npc/re/instances/IwinPatrol.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -61,3 +61,4 @@ Footer:
|
|||||||
- Path: npc/re/merchants/barters/quests_exp_175.yml
|
- Path: npc/re/merchants/barters/quests_exp_175.yml
|
||||||
- Path: npc/re/merchants/barters/mysterious_cookie_shop.yml
|
- Path: npc/re/merchants/barters/mysterious_cookie_shop.yml
|
||||||
- Path: npc/re/merchants/barters/quests_18.yml
|
- Path: npc/re/merchants/barters/quests_18.yml
|
||||||
|
- Path: npc/re/merchants/barters/quests_19.yml
|
||||||
|
@ -91,19 +91,19 @@ Body:
|
|||||||
Item: Ep18_Amethyst_Fragment
|
Item: Ep18_Amethyst_Fragment
|
||||||
Amount: 350
|
Amount: 350
|
||||||
- Index: 7
|
- Index: 7
|
||||||
Item: Gray_W_Ring
|
Item: Gray_W_Robe
|
||||||
RequiredItems:
|
RequiredItems:
|
||||||
- Index: 0
|
- Index: 0
|
||||||
Item: Ep18_Amethyst_Fragment
|
Item: Ep18_Amethyst_Fragment
|
||||||
Amount: 350
|
Amount: 350
|
||||||
- Index: 8
|
- Index: 8
|
||||||
Item: Gray_W_Earing
|
Item: Gray_W_Ring
|
||||||
RequiredItems:
|
RequiredItems:
|
||||||
- Index: 0
|
- Index: 0
|
||||||
Item: Ep18_Amethyst_Fragment
|
Item: Ep18_Amethyst_Fragment
|
||||||
Amount: 350
|
Amount: 350
|
||||||
- Index: 9
|
- Index: 9
|
||||||
Item: Gray_W_Necklace
|
Item: Gray_W_Earing
|
||||||
RequiredItems:
|
RequiredItems:
|
||||||
- Index: 0
|
- Index: 0
|
||||||
Item: Ep18_Amethyst_Fragment
|
Item: Ep18_Amethyst_Fragment
|
||||||
|
289
npc/re/merchants/barters/quests_19.yml
Normal file
289
npc/re/merchants/barters/quests_19.yml
Normal 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
|
97
npc/re/merchants/episode_19.txt
Normal file
97
npc/re/merchants/episode_19.txt
Normal 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;
|
||||||
|
}
|
19
npc/re/mobs/dungeons/jor_ab.txt
Normal file
19
npc/re/mobs/dungeons/jor_ab.txt
Normal 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
|
20
npc/re/mobs/dungeons/jor_dun.txt
Normal file
20
npc/re/mobs/dungeons/jor_dun.txt
Normal 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
|
@ -5,9 +5,9 @@
|
|||||||
//===== Additional Comments: =================================
|
//===== Additional Comments: =================================
|
||||||
//= 1.0 First version.
|
//= 1.0 First version.
|
||||||
// Venomous Chimera spawn timer is custom. [Capuche]
|
// Venomous Chimera spawn timer is custom. [Capuche]
|
||||||
//= 1.1 Updated Venomous Chimera spawn timer. [Capuche]
|
|
||||||
//============================================================
|
//============================================================
|
||||||
|
|
||||||
slabw01 monster Human Chimera 3631,45
|
slabw01 monster Human Chimera 3631,45
|
||||||
slabw01 monster Material Chimera 3632,45
|
slabw01 monster Material Chimera 3632,45
|
||||||
slabw01 boss_monster Venomous Chimera 3633,1,3600000,600000,0
|
// unknown timer
|
||||||
|
slabw01 monster Venomous Chimera 3633,1,18000000,600000,0
|
||||||
|
24
npc/re/mobs/fields/jor_back.txt
Normal file
24
npc/re/mobs/fields/jor_back.txt
Normal 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
|
@ -66,3 +66,22 @@ function script F_queststatus {
|
|||||||
}
|
}
|
||||||
end;
|
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;
|
||||||
|
}
|
||||||
|
@ -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?";
|
mes "Grand opening over! Shall we now put our hearts into our work?";
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
switch( checkquest(5937,PLAYTIME) ) {
|
|
||||||
case -1:
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
setpcblock PCBLOCK_NPC, true;
|
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;
|
npctalk "Mejai: Come on! Today's work is done.", "Mejai#E18_7", bc_self;
|
||||||
sleep2 1000;
|
sleep2 1000;
|
||||||
setpcblock PCBLOCK_NPC, false;
|
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;
|
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;
|
end;
|
||||||
case 2:
|
}
|
||||||
setpcblock PCBLOCK_NPC, true;
|
|
||||||
npctalk "Mejai: Hello. Let's do our best today too.", "Mejai#E18_7", bc_self;
|
|
||||||
sleep2 1000;
|
sleep2 1000;
|
||||||
setpcblock PCBLOCK_NPC, false;
|
setpcblock PCBLOCK_NPC, false;
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch( select( "I'm currently busy..", "Harvesting Half Flowers", "Delivering Half Flowers" ) ) {
|
switch( select( "I'm currently busy..", "Harvesting Half Flowers", "Delivering Half Flowers" ) ) {
|
||||||
case 1:
|
case 1:
|
||||||
npctalk "Mejai: It seems you're busy with something? Please come see me when you're free.", "Mejai#E18_7", bc_self;
|
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 "I mean, the Amethyst Fragment.";
|
||||||
mes "Please select the part you want to enchant.";
|
mes "Please select the part you want to enchant.";
|
||||||
next;
|
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:
|
case 1:
|
||||||
mes "[Emmet]";
|
mes "[Emmet]";
|
||||||
mes "You're enchanting the armor, I see.";
|
mes "You're enchanting the armor, I see.";
|
||||||
@ -13027,7 +13021,7 @@ wolfvill,164,137,3 script Emmet#emet 4_EP18_GW_WOMAN01,{
|
|||||||
end;
|
end;
|
||||||
case 2:
|
case 2:
|
||||||
mes "[Emmet]";
|
mes "[Emmet]";
|
||||||
mes "You're enchanting the garment, I see.";
|
mes "You're enchanting the footwear, I see.";
|
||||||
close2;
|
close2;
|
||||||
item_enchant(2);
|
item_enchant(2);
|
||||||
end;
|
end;
|
||||||
|
17224
npc/re/quests/quests_19.txt
Normal file
17224
npc/re/quests/quests_19.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -63,11 +63,14 @@ npc: npc/re/guides/guides_woe_te.txt
|
|||||||
|
|
||||||
// ------------------------ Instances ---------------------------
|
// ------------------------ Instances ---------------------------
|
||||||
npc: npc/re/instances/AirshipAssault.txt
|
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/BakonawaLake.txt
|
||||||
npc: npc/re/instances/BangungotHospital.txt
|
npc: npc/re/instances/BangungotHospital.txt
|
||||||
npc: npc/re/instances/BuwayaCave.txt
|
npc: npc/re/instances/BuwayaCave.txt
|
||||||
npc: npc/re/instances/CentralLaboratory.txt
|
npc: npc/re/instances/CentralLaboratory.txt
|
||||||
npc: npc/re/instances/CharlestonCrisis.txt
|
npc: npc/re/instances/CharlestonCrisis.txt
|
||||||
|
npc: npc/re/instances/ConfusedSnakesNest.txt
|
||||||
npc: npc/re/instances/CorOperation.txt
|
npc: npc/re/instances/CorOperation.txt
|
||||||
npc: npc/re/instances/DevilTower.txt
|
npc: npc/re/instances/DevilTower.txt
|
||||||
npc: npc/re/instances/EclageInterior.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/HiddenGarden.txt
|
||||||
npc: npc/re/instances/InfiniteSpace.txt
|
npc: npc/re/instances/InfiniteSpace.txt
|
||||||
npc: npc/re/instances/IsleOfBios.txt
|
npc: npc/re/instances/IsleOfBios.txt
|
||||||
|
npc: npc/re/instances/IwinPatrol.txt
|
||||||
npc: npc/re/instances/LastRoom.txt
|
npc: npc/re/instances/LastRoom.txt
|
||||||
npc: npc/re/instances/LostFarm.txt
|
npc: npc/re/instances/LostFarm.txt
|
||||||
npc: npc/re/instances/MalangdoCulvert.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_sage_legacy_17_2.txt
|
||||||
npc: npc/re/merchants/enchan_verus.txt
|
npc: npc/re/merchants/enchan_verus.txt
|
||||||
npc: npc/re/merchants/enchantgrade.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_Ammunition.txt
|
||||||
npc: npc/re/merchants/Extended_Stylist.txt
|
npc: npc/re/merchants/Extended_Stylist.txt
|
||||||
npc: npc/re/merchants/flute.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_1.txt
|
||||||
npc: npc/re/quests/quests_17_2.txt
|
npc: npc/re/quests/quests_17_2.txt
|
||||||
npc: npc/re/quests/quests_18.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_aldebaran.txt
|
||||||
npc: npc/re/quests/quests_dewata.txt
|
npc: npc/re/quests/quests_dewata.txt
|
||||||
npc: npc/re/quests/quests_dicastes.txt
|
npc: npc/re/quests/quests_dicastes.txt
|
||||||
|
@ -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/ice_dun.txt
|
||||||
npc: npc/re/mobs/dungeons/in_sphinx.txt
|
npc: npc/re/mobs/dungeons/in_sphinx.txt
|
||||||
npc: npc/re/mobs/dungeons/iz_dun.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/juperos.txt
|
||||||
npc: npc/re/mobs/dungeons/kh_dun.txt
|
npc: npc/re/mobs/dungeons/kh_dun.txt
|
||||||
npc: npc/re/mobs/dungeons/lhz_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/gonryun.txt
|
||||||
npc: npc/re/mobs/fields/gw_fild.txt
|
npc: npc/re/mobs/fields/gw_fild.txt
|
||||||
npc: npc/re/mobs/fields/hugel.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/lighthalzen.txt
|
||||||
npc: npc/re/mobs/fields/louyang.txt
|
npc: npc/re/mobs/fields/louyang.txt
|
||||||
npc: npc/re/mobs/fields/lutie.txt
|
npc: npc/re/mobs/fields/lutie.txt
|
||||||
|
@ -527,7 +527,6 @@ CREATE TABLE IF NOT EXISTS `guild_expulsion` (
|
|||||||
`account_id` int(11) unsigned NOT NULL default '0',
|
`account_id` int(11) unsigned NOT NULL default '0',
|
||||||
`name` varchar(24) NOT NULL default '',
|
`name` varchar(24) NOT NULL default '',
|
||||||
`mes` varchar(40) NOT NULL default '',
|
`mes` varchar(40) NOT NULL default '',
|
||||||
`char_id` int(11) unsigned NOT NULL default '0',
|
|
||||||
PRIMARY KEY (`guild_id`,`name`)
|
PRIMARY KEY (`guild_id`,`name`)
|
||||||
) ENGINE=MyISAM;
|
) ENGINE=MyISAM;
|
||||||
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
ALTER TABLE `guild_expulsion` ADD COLUMN `char_id` int(11) unsigned NOT NULL default '0';
|
|
@ -2425,7 +2425,7 @@ bool char_checkdb(void){
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//checking guild_expulsion_db
|
//checking guild_expulsion_db
|
||||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes`,`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);
|
Sql_ShowDebug(sql_handle);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -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 ) {
|
if( charserv_config.pincode_config.pincode_enabled==0 || RFIFOL(fd,2) != sd->account_id ) {
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
return 1;
|
return 1;
|
||||||
} else if (strnlen(sd->pincode, PINCODE_LENGTH) > 0) {
|
}
|
||||||
set_eof(fd);
|
else {
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
char newpin[PINCODE_LENGTH+1];
|
char newpin[PINCODE_LENGTH+1];
|
||||||
memset(newpin,0,PINCODE_LENGTH+1);
|
memset(newpin,0,PINCODE_LENGTH+1);
|
||||||
strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH );
|
strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH );
|
||||||
|
@ -308,8 +308,8 @@ int inter_guild_tosql( mmo_guild &g, int flag ){
|
|||||||
|
|
||||||
Sql_EscapeStringLen(sql_handle, esc_name, e->name, strnlen(e->name, NAME_LENGTH));
|
Sql_EscapeStringLen(sql_handle, esc_name, e->name, strnlen(e->name, NAME_LENGTH));
|
||||||
Sql_EscapeStringLen(sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes)));
|
Sql_EscapeStringLen(sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes)));
|
||||||
if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`,`char_id`) "
|
if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`) "
|
||||||
"VALUES ('%u','%u','%s','%s','%u')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes, e->char_id) )
|
"VALUES ('%d','%d','%s','%s')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes) )
|
||||||
Sql_ShowDebug(sql_handle);
|
Sql_ShowDebug(sql_handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -487,7 +487,7 @@ std::shared_ptr<CharGuild> inter_guild_fromsql( int32 guild_id ){
|
|||||||
}
|
}
|
||||||
|
|
||||||
//printf("- Read guild_expulsion %d from sql \n",guild_id);
|
//printf("- Read guild_expulsion %d from sql \n",guild_id);
|
||||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name`,`mes`,`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);
|
Sql_ShowDebug(sql_handle);
|
||||||
return nullptr;
|
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, 0, &data, nullptr); e->account_id = atoi(data);
|
||||||
Sql_GetData(sql_handle, 1, &data, &len); memcpy(e->name, data, zmin(len, NAME_LENGTH));
|
Sql_GetData(sql_handle, 1, &data, &len); memcpy(e->name, data, zmin(len, NAME_LENGTH));
|
||||||
Sql_GetData(sql_handle, 2, &data, &len); memcpy(e->mes, data, zmin(len, sizeof(e->mes)));
|
Sql_GetData(sql_handle, 2, &data, &len); memcpy(e->mes, data, zmin(len, sizeof(e->mes)));
|
||||||
Sql_GetData(sql_handle, 3, &data, nullptr); e->char_id = strtoul(data, nullptr, 10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("- Read guild_skill %d from sql \n",guild_id);
|
//printf("- Read guild_skill %d from sql \n",guild_id);
|
||||||
@ -1344,7 +1343,6 @@ int mapif_parse_GuildLeave(int fd, int guild_id, uint32 account_id, uint32 char_
|
|||||||
}
|
}
|
||||||
// Save the expulsion entry
|
// Save the expulsion entry
|
||||||
g->guild.expulsion[j].account_id = account_id;
|
g->guild.expulsion[j].account_id = account_id;
|
||||||
g->guild.expulsion[j].char_id = char_id;
|
|
||||||
safestrncpy(g->guild.expulsion[j].name, g->guild.member[i].name, NAME_LENGTH);
|
safestrncpy(g->guild.expulsion[j].name, g->guild.member[i].name, NAME_LENGTH);
|
||||||
safestrncpy(g->guild.expulsion[j].mes, mes, 40);
|
safestrncpy(g->guild.expulsion[j].mes, mes, 40);
|
||||||
}
|
}
|
||||||
|
@ -741,7 +741,6 @@ struct guild_expulsion {
|
|||||||
char name[NAME_LENGTH];
|
char name[NAME_LENGTH];
|
||||||
char mes[40];
|
char mes[40];
|
||||||
uint32 account_id;
|
uint32 account_id;
|
||||||
uint32 char_id;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct guild_skill {
|
struct guild_skill {
|
||||||
|
@ -1150,51 +1150,6 @@ ACMD_FUNC(hide)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ACMD_FUNC(resetcooltime)
|
|
||||||
{
|
|
||||||
nullpo_retr(-1, sd);
|
|
||||||
|
|
||||||
for( size_t i = 0; i < ARRAYLENGTH( sd->scd ); i++ ){
|
|
||||||
if( sd->scd[i] != nullptr ) {
|
|
||||||
sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( sd->scd[i]->skill_id )->name ); // Found skill '%s', unblocking...
|
|
||||||
clif_displaymessage( sd->fd, atcmd_output );
|
|
||||||
|
|
||||||
if (battle_config.display_status_timers)
|
|
||||||
clif_skill_cooldown( *sd, sd->scd[i]->skill_id, 0 );
|
|
||||||
|
|
||||||
delete_timer(sd->scd[i]->timer, skill_blockpc_end);
|
|
||||||
aFree(sd->scd[i]);
|
|
||||||
sd->scd[i] = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( sd->hd != nullptr && hom_is_active( sd->hd ) ){
|
|
||||||
for( const uint16& skill_id : sd->hd->blockskill ){
|
|
||||||
sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( skill_id )->name ); // Found skill '%s', unblocking...
|
|
||||||
clif_displaymessage( sd->fd, atcmd_output );
|
|
||||||
|
|
||||||
if (battle_config.display_status_timers)
|
|
||||||
clif_skill_cooldown( *sd, skill_id, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
sd->hd->blockskill.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( sd->md != nullptr ){
|
|
||||||
for( const uint16& skill_id : sd->md->blockskill ){
|
|
||||||
sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( skill_id )->name ); // Found skill '%s', unblocking...
|
|
||||||
clif_displaymessage( sd->fd, atcmd_output );
|
|
||||||
|
|
||||||
if (battle_config.display_status_timers)
|
|
||||||
clif_skill_cooldown( *sd, skill_id, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
sd->md->blockskill.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* Changes a character's class
|
* Changes a character's class
|
||||||
*------------------------------------------*/
|
*------------------------------------------*/
|
||||||
@ -1286,7 +1241,7 @@ ACMD_FUNC(alive)
|
|||||||
clif_displaymessage(fd, msg_txt(sd,667)); // You're not dead.
|
clif_displaymessage(fd, msg_txt(sd,667)); // You're not dead.
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4);
|
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!
|
clif_displaymessage(fd, msg_txt(sd,16)); // You've been revived! It's a miracle!
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1359,7 +1314,7 @@ ACMD_FUNC(heal)
|
|||||||
|
|
||||||
if ( hp < 0 && sp <= 0 ) {
|
if ( hp < 0 && sp <= 0 ) {
|
||||||
status_damage(nullptr, &sd->bl, -hp, -sp, 0, 0, 0);
|
status_damage(nullptr, &sd->bl, -hp, -sp, 0, 0, 0);
|
||||||
clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
||||||
clif_displaymessage(fd, msg_txt(sd,156)); // HP or/and SP modified.
|
clif_displaymessage(fd, msg_txt(sd,156)); // HP or/and SP modified.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1370,7 +1325,7 @@ ACMD_FUNC(heal)
|
|||||||
status_heal(&sd->bl, hp, 0, 0);
|
status_heal(&sd->bl, hp, 0, 0);
|
||||||
else {
|
else {
|
||||||
status_damage(nullptr, &sd->bl, -hp, 0, 0, 0, 0);
|
status_damage(nullptr, &sd->bl, -hp, 0, 0, 0, 0);
|
||||||
clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3592,7 +3547,7 @@ static void atcommand_raise_sub(map_session_data* sd) {
|
|||||||
|
|
||||||
status_revive(&sd->bl, 100, 100);
|
status_revive(&sd->bl, 100, 100);
|
||||||
|
|
||||||
clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4);
|
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
|
||||||
clif_displaymessage(sd->fd, msg_txt(sd,63)); // Mercy has been shown.
|
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].lv = 0;
|
||||||
sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(*sd,skill_id);
|
clif_deleteskill(sd,skill_id);
|
||||||
clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill.
|
clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill.
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -4375,9 +4330,6 @@ ACMD_FUNC(reload) {
|
|||||||
}else if( strstr( command, "barterdb" ) || strncmp( message, "barterdb", 4 ) == 0 ){
|
}else if( strstr( command, "barterdb" ) || strncmp( message, "barterdb", 4 ) == 0 ){
|
||||||
barter_db.reload();
|
barter_db.reload();
|
||||||
clif_displaymessage(fd, msg_txt(sd, 830)); // Barter database has been reloaded.
|
clif_displaymessage(fd, msg_txt(sd, 830)); // Barter database has been reloaded.
|
||||||
} else if (strstr(command, "logconf") || strncmp(message, "logconf", 3) == 0) {
|
|
||||||
log_config_read(LOG_CONF_NAME);
|
|
||||||
clif_displaymessage(fd, msg_txt(sd,1536)); // Log configuration has been reloaded.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -6297,6 +6249,7 @@ ACMD_FUNC(useskill)
|
|||||||
*------------------------------------------*/
|
*------------------------------------------*/
|
||||||
ACMD_FUNC(displayskill)
|
ACMD_FUNC(displayskill)
|
||||||
{
|
{
|
||||||
|
struct status_data * status;
|
||||||
t_tick tick;
|
t_tick tick;
|
||||||
uint16 skill_id;
|
uint16 skill_id;
|
||||||
uint16 skill_lv = 1;
|
uint16 skill_lv = 1;
|
||||||
@ -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
|
clif_displaymessage(fd, msg_txt(sd,825));// Effect Types: 0: All, 1: Damage, 2: Splash Dmg, 3: No Damage, 4: Ground
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
status = status_get_status_data(&sd->bl);
|
||||||
status_data* status = status_get_status_data(sd->bl);
|
|
||||||
tick = gettick();
|
tick = gettick();
|
||||||
if (type == 0 || type == 1)
|
if (type == 0 || type == 1)
|
||||||
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE);
|
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||||
if (type == 0 || type == 2)
|
if (type == 0 || type == 2)
|
||||||
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH);
|
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH);
|
||||||
if (type == 0 || type == 3)
|
if (type == 0 || type == 3)
|
||||||
clif_skill_nodamage(&sd->bl, sd->bl, skill_id, skill_lv);
|
clif_skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1);
|
||||||
if (type == 0 || type == 4)
|
if (type == 0 || type == 4)
|
||||||
clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
|
clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
|
||||||
return 0;
|
return 0;
|
||||||
@ -8229,6 +8181,7 @@ ACMD_FUNC(homtalk)
|
|||||||
ACMD_FUNC(hominfo)
|
ACMD_FUNC(hominfo)
|
||||||
{
|
{
|
||||||
struct homun_data *hd;
|
struct homun_data *hd;
|
||||||
|
struct status_data *status;
|
||||||
nullpo_retr(-1, sd);
|
nullpo_retr(-1, sd);
|
||||||
|
|
||||||
if ( !hom_is_active(sd->hd) ) {
|
if ( !hom_is_active(sd->hd) ) {
|
||||||
@ -8237,7 +8190,7 @@ ACMD_FUNC(hominfo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
hd = sd->hd;
|
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:
|
clif_displaymessage(fd, msg_txt(sd,1261)); // Homunculus stats:
|
||||||
|
|
||||||
snprintf(atcmd_output, sizeof(atcmd_output) ,msg_txt(sd,1262), // HP: %d/%d - SP: %d/%d
|
snprintf(atcmd_output, sizeof(atcmd_output) ,msg_txt(sd,1262), // HP: %d/%d - SP: %d/%d
|
||||||
@ -11064,7 +11017,6 @@ void atcommand_basecommands(void) {
|
|||||||
ACMD_DEF(guildstorage),
|
ACMD_DEF(guildstorage),
|
||||||
ACMD_DEF(option),
|
ACMD_DEF(option),
|
||||||
ACMD_DEF(hide), // + /hide
|
ACMD_DEF(hide), // + /hide
|
||||||
ACMD_DEF(resetcooltime), // + /resetcooltime
|
|
||||||
ACMD_DEFR(jobchange, ATCMD_NOCONSOLE),
|
ACMD_DEFR(jobchange, ATCMD_NOCONSOLE),
|
||||||
ACMD_DEF(kill),
|
ACMD_DEF(kill),
|
||||||
ACMD_DEF(alive),
|
ACMD_DEF(alive),
|
||||||
|
@ -161,7 +161,7 @@ static int battle_getenemy_sub(struct block_list *bl, va_list ap)
|
|||||||
if (*c >= 24)
|
if (*c >= 24)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (status_isdead(*bl))
|
if (status_isdead(bl))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (battle_check_target(target, bl, BCT_ENEMY) > 0) {
|
if (battle_check_target(target, bl, BCT_ENEMY) > 0) {
|
||||||
@ -219,7 +219,7 @@ static int battle_getenemyarea_sub(struct block_list *bl, va_list ap)
|
|||||||
if( *c >= 23 )
|
if( *c >= 23 )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if( status_isdead(*bl) )
|
if( status_isdead(bl) )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if( battle_check_target(src, bl, BCT_ENEMY) > 0 ) {// Is Enemy!...
|
if( battle_check_target(src, bl, BCT_ENEMY) > 0 ) {// Is Enemy!...
|
||||||
@ -286,7 +286,7 @@ int battle_damage(struct block_list *src, struct block_list *target, int64 damag
|
|||||||
dmg_change = status_damage(src, target, damage, 0, delay, 16, skill_id); // Coma attack
|
dmg_change = status_damage(src, target, damage, 0, delay, 16, skill_id); // Coma attack
|
||||||
else
|
else
|
||||||
dmg_change = status_fix_damage(src, target, damage, delay, skill_id);
|
dmg_change = status_fix_damage(src, target, damage, delay, skill_id);
|
||||||
if (attack_type && !status_isdead(*target) && additional_effects)
|
if (attack_type && !status_isdead(target) && additional_effects)
|
||||||
skill_additional_effect(src, target, skill_id, skill_lv, attack_type, dmg_lv, tick);
|
skill_additional_effect(src, target, skill_id, skill_lv, attack_type, dmg_lv, tick);
|
||||||
if (dmg_lv > ATK_BLOCK && attack_type && additional_effects)
|
if (dmg_lv > ATK_BLOCK && attack_type && additional_effects)
|
||||||
skill_counter_additional_effect(src, target, skill_id, skill_lv, attack_type, tick);
|
skill_counter_additional_effect(src, target, skill_id, skill_lv, attack_type, tick);
|
||||||
@ -296,7 +296,7 @@ int battle_damage(struct block_list *src, struct block_list *target, int64 damag
|
|||||||
|
|
||||||
if (md != nullptr) {
|
if (md != nullptr) {
|
||||||
// Trigger monster skill condition for non-skill attacks.
|
// Trigger monster skill condition for non-skill attacks.
|
||||||
if (!status_isdead(*target) && src != target) {
|
if (!status_isdead(target) && src != target) {
|
||||||
if (damage > 0)
|
if (damage > 0)
|
||||||
mobskill_event(md, src, tick, attack_type, damage);
|
mobskill_event(md, src, tick, attack_type, damage);
|
||||||
if (skill_id > 0)
|
if (skill_id > 0)
|
||||||
@ -335,7 +335,7 @@ TIMER_FUNC(battle_delay_damage_sub){
|
|||||||
struct block_list* src = map_id2bl(dat->src_id);
|
struct block_list* src = map_id2bl(dat->src_id);
|
||||||
struct block_list* target = map_id2bl(dat->target_id);
|
struct block_list* target = map_id2bl(dat->target_id);
|
||||||
|
|
||||||
if (target && !status_isdead(*target)) {
|
if (target && !status_isdead(target)) {
|
||||||
if( src && target->m == src->m &&
|
if( src && target->m == src->m &&
|
||||||
(target->type != BL_PC || ((TBL_PC*)target)->invincible_timer == INVALID_TIMER) &&
|
(target->type != BL_PC || ((TBL_PC*)target)->invincible_timer == INVALID_TIMER) &&
|
||||||
check_distance_bl(src, target, dat->distance) ) //Check to see if you haven't teleported. [Skotlex]
|
check_distance_bl(src, target, dat->distance) ) //Check to see if you haven't teleported. [Skotlex]
|
||||||
@ -507,7 +507,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
|
|||||||
struct block_list *src2;
|
struct block_list *src2;
|
||||||
|
|
||||||
if( !su || !su->alive || (sg = su->group) == nullptr || !sg || sg->val3 == -1 ||
|
if( !su || !su->alive || (sg = su->group) == nullptr || !sg || sg->val3 == -1 ||
|
||||||
(src2 = map_id2bl(sg->src_id)) == nullptr || status_isdead(*src2) )
|
(src2 = map_id2bl(sg->src_id)) == nullptr || status_isdead(src2) )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if( sg->unit_id != UNT_FIREWALL ) {
|
if( sg->unit_id != UNT_FIREWALL ) {
|
||||||
@ -696,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
|
std::vector<e_race2> s_race2, /// Attacker Race2
|
||||||
t_race2; ///< Target Race2
|
t_race2; ///< Target Race2
|
||||||
enum e_element s_defele; ///< Attacker Element (not a weapon or skill element!)
|
enum e_element s_defele; ///< Attacker Element (not a weapon or skill element!)
|
||||||
|
struct status_data *sstatus, ///< Attacker status data
|
||||||
|
*tstatus; ///< Target status data
|
||||||
int64 original_damage;
|
int64 original_damage;
|
||||||
|
|
||||||
if( !damage )
|
if( !damage )
|
||||||
@ -707,10 +709,8 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
|
|||||||
tsd = BL_CAST(BL_PC, target);
|
tsd = BL_CAST(BL_PC, target);
|
||||||
t_class = status_get_class(target);
|
t_class = status_get_class(target);
|
||||||
s_class = status_get_class(src);
|
s_class = status_get_class(src);
|
||||||
///< Attacker status data
|
sstatus = status_get_status_data(src);
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
tstatus = status_get_status_data(target);
|
||||||
///< Target status data
|
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
|
||||||
s_race2 = status_get_race2(src);
|
s_race2 = status_get_race2(src);
|
||||||
t_race2 = status_get_race2(target);
|
t_race2 = status_get_race2(target);
|
||||||
s_defele = (tsd) ? (enum e_element)status_get_element(src) : ELE_NONE;
|
s_defele = (tsd) ? (enum e_element)status_get_element(src) : ELE_NONE;
|
||||||
@ -1167,7 +1167,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
|||||||
|
|
||||||
int element;
|
int element;
|
||||||
if (flag & BF_WEAPON) {
|
if (flag & BF_WEAPON) {
|
||||||
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)
|
if(sstatus->rhw.ele == ELE_NEUTRAL && sstatus->lhw.ele > sstatus->rhw.ele)
|
||||||
element = battle_get_weapon_element(d, src, target, skill_id, skill_lv, EQI_HAND_L, false);
|
element = battle_get_weapon_element(d, src, target, skill_id, skill_lv, EQI_HAND_L, false);
|
||||||
else
|
else
|
||||||
@ -1290,7 +1290,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
|||||||
|
|
||||||
// Weapon Blocking can be triggered while the above statuses are active.
|
// Weapon Blocking can be triggered while the above statuses are active.
|
||||||
if ((sce = sc->getSCE(SC_WEAPONBLOCKING)) && flag & (BF_SHORT | BF_WEAPON) && rnd() % 100 < sce->val2) {
|
if ((sce = sc->getSCE(SC_WEAPONBLOCKING)) && flag & (BF_SHORT | BF_WEAPON) && rnd() % 100 < sce->val2) {
|
||||||
clif_skill_nodamage(target, *src, GC_WEAPONBLOCKING, sce->val1);
|
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));
|
sc_start(src, target, SC_WEAPONBLOCK_ON, 100, src->id, skill_get_time2(GC_WEAPONBLOCKING, sce->val1));
|
||||||
d->dmg_lv = ATK_BLOCK;
|
d->dmg_lv = ATK_BLOCK;
|
||||||
return false;
|
return false;
|
||||||
@ -1358,7 +1358,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
|||||||
skill_id == WL_SOULEXPANSION ||
|
skill_id == WL_SOULEXPANSION ||
|
||||||
skill_id == AG_SOUL_VC_STRIKE ||
|
skill_id == AG_SOUL_VC_STRIKE ||
|
||||||
(skill_id && skill_get_ele(skill_id, skill_lv) == ELE_GHOST) ||
|
(skill_id && skill_get_ele(skill_id, skill_lv) == ELE_GHOST) ||
|
||||||
(skill_id == 0 && (status_get_status_data(*src))->rhw.ele == ELE_GHOST))
|
(skill_id == 0 && (status_get_status_data(src))->rhw.ele == ELE_GHOST))
|
||||||
{
|
{
|
||||||
if (skill_id == WL_SOULEXPANSION)
|
if (skill_id == WL_SOULEXPANSION)
|
||||||
damage *= 2; // If used against a player in White Imprison, the skill deals double damage.
|
damage *= 2; // If used against a player in White Imprison, the skill deals double damage.
|
||||||
@ -1407,12 +1407,12 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
|||||||
(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == target->id)) &&
|
(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == target->id)) &&
|
||||||
check_distance_bl(target, d_bl, sce_d->val3))
|
check_distance_bl(target, d_bl, sce_d->val3))
|
||||||
{ //If player is target of devotion, show guard effect on the devotion caster rather than the target
|
{ //If player is target of devotion, show guard effect on the devotion caster rather than the target
|
||||||
clif_skill_nodamage(d_bl, *d_bl, CR_AUTOGUARD, sce->val1);
|
clif_skill_nodamage(d_bl, d_bl, CR_AUTOGUARD, sce->val1, 1);
|
||||||
unit_set_walkdelay(d_bl, gettick(), delay, 1);
|
unit_set_walkdelay(d_bl, gettick(), delay, 1);
|
||||||
d->dmg_lv = ATK_MISS;
|
d->dmg_lv = ATK_MISS;
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
clif_skill_nodamage(target, *target, CR_AUTOGUARD, sce->val1);
|
clif_skill_nodamage(target, target, CR_AUTOGUARD, sce->val1, 1);
|
||||||
unit_set_walkdelay(target, gettick(), delay, 1);
|
unit_set_walkdelay(target, gettick(), delay, 1);
|
||||||
#ifdef RENEWAL
|
#ifdef RENEWAL
|
||||||
if (sc->getSCE(SC_SHRINK))
|
if (sc->getSCE(SC_SHRINK))
|
||||||
@ -1455,7 +1455,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((sce = sc->getSCE(SC_PARRYING)) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd() % 100 < sce->val2) {
|
if ((sce = sc->getSCE(SC_PARRYING)) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd() % 100 < sce->val2) {
|
||||||
clif_skill_nodamage(target, *target, LK_PARRYING, sce->val1);
|
clif_skill_nodamage(target, target, LK_PARRYING, sce->val1, 1);
|
||||||
|
|
||||||
if (skill_id == LK_PARRYING) {
|
if (skill_id == LK_PARRYING) {
|
||||||
unit_data *ud = unit_bl2ud(target);
|
unit_data *ud = unit_bl2ud(target);
|
||||||
@ -1471,7 +1471,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
|||||||
|
|
||||||
if (sd && pc_issit(sd))
|
if (sd && pc_issit(sd))
|
||||||
pc_setstand(sd, true); //Stand it to dodge.
|
pc_setstand(sd, true); //Stand it to dodge.
|
||||||
clif_skill_nodamage(target, *target, TK_DODGE, 1);
|
clif_skill_nodamage(target, target, TK_DODGE, 1, 1);
|
||||||
sc_start4(src, target, SC_COMBO, 100, TK_JUMPKICK, src->id, 1, 0, 2000);
|
sc_start4(src, target, SC_COMBO, 100, TK_JUMPKICK, src->id, 1, 0, 2000);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1494,7 +1494,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
|||||||
|
|
||||||
if (((sce = sc->getSCE(SC_UTSUSEMI)) || sc->getSCE(SC_BUNSINJYUTSU)) && flag&BF_WEAPON && !skill_get_inf2(skill_id, INF2_IGNORECICADA)) {
|
if (((sce = sc->getSCE(SC_UTSUSEMI)) || sc->getSCE(SC_BUNSINJYUTSU)) && flag&BF_WEAPON && !skill_get_inf2(skill_id, INF2_IGNORECICADA)) {
|
||||||
skill_additional_effect(src, target, skill_id, skill_lv, flag, ATK_BLOCK, gettick());
|
skill_additional_effect(src, target, skill_id, skill_lv, flag, ATK_BLOCK, gettick());
|
||||||
if (!status_isdead(*src))
|
if (!status_isdead(src))
|
||||||
skill_counter_additional_effect(src, target, skill_id, skill_lv, flag, gettick());
|
skill_counter_additional_effect(src, target, skill_id, skill_lv, flag, gettick());
|
||||||
if (sce) {
|
if (sce) {
|
||||||
clif_specialeffect(target, EF_STORMKICK4, AREA);
|
clif_specialeffect(target, EF_STORMKICK4, AREA);
|
||||||
@ -1792,7 +1792,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
|||||||
#endif
|
#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
|
int per = 100*status->sp / status->max_sp -1; //100% should be counted as the 80~99% interval
|
||||||
per /=20; //Uses 20% SP intervals.
|
per /=20; //Uses 20% SP intervals.
|
||||||
//SP Cost: 1% + 0.5% per every 20% SP
|
//SP Cost: 1% + 0.5% per every 20% SP
|
||||||
@ -1900,8 +1900,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sce = sc->getSCE(SC_BLOODLUST)) && flag & BF_WEAPON && damage > 0 && rnd_chance(sce->val3, 100))
|
if ((sce = sc->getSCE(SC_BLOODLUST)) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3)
|
||||||
status_heal(src, damage * sce->val4 / 100, 0, 1);
|
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))
|
if ((sce = sc->getSCE(SC_BLOODSUCKER)) && flag & BF_WEAPON && damage > 0 && rnd() % 100 < (2 * sce->val1 - 1))
|
||||||
status_heal(src, damage * sce->val1 / 100, 0, 3);
|
status_heal(src, damage * sce->val1 / 100, 0, 3);
|
||||||
@ -2234,7 +2234,7 @@ static int battle_calc_drain(int64 damage, int rate, int per)
|
|||||||
int64 battle_addmastery(map_session_data *sd,struct block_list *target,int64 dmg,int type)
|
int64 battle_addmastery(map_session_data *sd,struct block_list *target,int64 dmg,int type)
|
||||||
{
|
{
|
||||||
int64 damage;
|
int64 damage;
|
||||||
status_data* status = status_get_status_data(*target);
|
struct status_data *status = status_get_status_data(target);
|
||||||
int weapon, skill;
|
int weapon, skill;
|
||||||
|
|
||||||
#ifdef RENEWAL
|
#ifdef RENEWAL
|
||||||
@ -2399,7 +2399,7 @@ static int battle_calc_sizefix(int64 damage, map_session_data *sd, unsigned char
|
|||||||
*/
|
*/
|
||||||
static int battle_calc_base_weapon_attack(struct block_list *src, struct status_data *tstatus, struct weapon_atk *wa, map_session_data *sd, bool critical)
|
static int battle_calc_base_weapon_attack(struct block_list *src, struct status_data *tstatus, struct weapon_atk *wa, map_session_data *sd, bool critical)
|
||||||
{
|
{
|
||||||
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;
|
uint8 type = (wa == &status->lhw)?EQI_HAND_L:EQI_HAND_R;
|
||||||
uint16 atkmin = (type == EQI_HAND_L)?status->watk2:status->watk;
|
uint16 atkmin = (type == EQI_HAND_L)?status->watk2:status->watk;
|
||||||
uint16 atkmax = atkmin;
|
uint16 atkmax = atkmin;
|
||||||
@ -2835,7 +2835,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
|||||||
*/
|
*/
|
||||||
bool is_infinite_defense(struct block_list *target, int flag)
|
bool is_infinite_defense(struct block_list *target, int flag)
|
||||||
{
|
{
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
|
|
||||||
if(target->type == BL_SKILL) {
|
if(target->type == BL_SKILL) {
|
||||||
TBL_SKILL *su = ((TBL_SKILL*)target);
|
TBL_SKILL *su = ((TBL_SKILL*)target);
|
||||||
@ -2871,7 +2871,7 @@ bool is_infinite_defense(struct block_list *target, int flag)
|
|||||||
static bool is_skill_using_arrow(struct block_list *src, int skill_id)
|
static bool is_skill_using_arrow(struct block_list *src, int skill_id)
|
||||||
{
|
{
|
||||||
if(src != nullptr) {
|
if(src != nullptr) {
|
||||||
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);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
|
|
||||||
return ((sd && sd->state.arrow_atk) || (!sd && ((skill_id && skill_get_ammotype(skill_id)) || sstatus->rhw.range>3))
|
return ((sd && sd->state.arrow_atk) || (!sd && ((skill_id && skill_get_ammotype(skill_id)) || sstatus->rhw.range>3))
|
||||||
@ -2922,7 +2922,7 @@ static bool is_attack_left_handed(struct block_list *src, int skill_id)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct status_data *sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
|
|
||||||
if (sstatus->lhw.atk)
|
if (sstatus->lhw.atk)
|
||||||
return true;
|
return true;
|
||||||
@ -2950,7 +2950,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
|
|||||||
if( skill_id && !skill_get_nk(skill_id,NK_CRITICAL) )
|
if( skill_id && !skill_get_nk(skill_id,NK_CRITICAL) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
|
|
||||||
if( sstatus->cri )
|
if( sstatus->cri )
|
||||||
{
|
{
|
||||||
@ -2964,7 +2964,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 *sc = status_get_sc(src);
|
||||||
status_change *tsc = status_get_sc(target);
|
status_change *tsc = status_get_sc(target);
|
||||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||||
@ -3060,7 +3060,7 @@ static int is_attack_piercing(struct Damage* wd, struct block_list *src, struct
|
|||||||
|
|
||||||
if(src != nullptr) {
|
if(src != nullptr) {
|
||||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
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
|
if( skill_id != PA_SACRIFICE && skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS && skill_id != PA_SHIELDCHAIN && skill_id != KO_HAPPOKUNAI
|
||||||
#ifndef RENEWAL
|
#ifndef RENEWAL
|
||||||
@ -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)
|
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);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
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 *sc = status_get_sc(src);
|
||||||
status_change *tsc = status_get_sc(target);
|
status_change *tsc = status_get_sc(target);
|
||||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
@ -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)
|
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);
|
status_change *sc = status_get_sc(src);
|
||||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag);
|
std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag);
|
||||||
@ -3417,7 +3417,7 @@ static int battle_calc_equip_attack(struct block_list *src, int skill_id)
|
|||||||
{
|
{
|
||||||
if(src != nullptr) {
|
if(src != nullptr) {
|
||||||
int eatk = 0;
|
int eatk = 0;
|
||||||
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);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
|
|
||||||
// Add arrow atk if using an applicable skill
|
// Add arrow atk if using an applicable skill
|
||||||
@ -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);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
status_change *sc = status_get_sc(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);
|
int element = skill_get_ele(skill_id, skill_lv);
|
||||||
|
|
||||||
//Take weapon's element
|
//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);
|
int element = skill_get_ele(skill_id, skill_lv);
|
||||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
status_change *sc = status_get_sc(src);
|
status_change *sc = status_get_sc(src);
|
||||||
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
|
if (element == ELE_WEAPON) { // pl=-1 : the skill takes the weapon's element
|
||||||
element = sstatus->rhw.ele;
|
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
|
// These skills used as many spheres as they do hits
|
||||||
damage = (wd.div_ + sd->spiritball) * 3;
|
damage = (wd.div_ + sd->spiritball) * 3;
|
||||||
break;
|
break;
|
||||||
#ifdef RENEWAL
|
|
||||||
case MO_FINGEROFFENSIVE:
|
|
||||||
// These skills store the spheres used in spiritball_old
|
|
||||||
damage = (sd->spiritball_old + sd->spiritball) * 3;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case MO_EXTREMITYFIST:
|
case MO_EXTREMITYFIST:
|
||||||
// These skills store the number of spheres the player had before cast
|
// These skills store the number of spheres the player had before cast
|
||||||
damage = sd->spiritball_old * 3;
|
damage = sd->spiritball_old * 3;
|
||||||
@ -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);
|
std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag);
|
||||||
map_session_data* sd = BL_CAST(BL_PC, src);
|
map_session_data* sd = BL_CAST(BL_PC, src);
|
||||||
status_change* sc = status_get_sc(src);
|
status_change* sc = status_get_sc(src);
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data* sstatus = status_get_status_data(src);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
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);
|
int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, true);
|
||||||
|
|
||||||
// Elemental attribute fix
|
// 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);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
status_change *sc = status_get_sc(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);
|
int t_class = status_get_class(target);
|
||||||
|
|
||||||
#ifndef RENEWAL
|
#ifndef RENEWAL
|
||||||
@ -3919,7 +3913,7 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
|
|||||||
case NC_ARMSCANNON:
|
case NC_ARMSCANNON:
|
||||||
// Arrow attack of these skills is not influenced by P.ATK so we add it as mastery attack
|
// Arrow attack of these skills is not influenced by P.ATK so we add it as mastery attack
|
||||||
if (sd != nullptr) {
|
if (sd != nullptr) {
|
||||||
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));
|
ATK_ADD(wd->masteryAtk, wd->masteryAtk2, battle_attr_fix(src, target, sd->bonus.arrow_atk, sd->bonus.arrow_ele, tstatus->def_ele, tstatus->ele_lv));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -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)
|
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);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
bool critical = false;
|
bool critical = false;
|
||||||
|
|
||||||
@ -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)
|
static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv)
|
||||||
{
|
{
|
||||||
status_change *sc = status_get_sc(src);
|
status_change *sc = status_get_sc(src);
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||||
|
|
||||||
@ -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);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
status_change *sc = status_get_sc(src);
|
status_change *sc = status_get_sc(src);
|
||||||
status_change *tsc = status_get_sc(target);
|
status_change *tsc = status_get_sc(target);
|
||||||
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]
|
if( sd && !skill_id ) { // if no skill_id passed, check for double attack [helvetica]
|
||||||
short i;
|
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);
|
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||||
status_change *sc = status_get_sc(src);
|
status_change *sc = status_get_sc(src);
|
||||||
status_change *tsc = status_get_sc(target);
|
status_change *tsc = status_get_sc(target);
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
int skillratio = 100;
|
int skillratio = 100;
|
||||||
int i;
|
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 *sd = BL_CAST(BL_PC, src);
|
||||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
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);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
int64 atk = 0;
|
int64 atk = 0;
|
||||||
|
|
||||||
//Constant/misc additions from skills
|
//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);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
status_change *sc = status_get_sc(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);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
uint8 anger_id = 0; // SLS Anger
|
uint8 anger_id = 0; // SLS Anger
|
||||||
|
|
||||||
// Kagerou/Oboro Earth Charm effect +15% wATK
|
// Kagerou/Oboro Earth Charm effect +15% wATK
|
||||||
@ -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);
|
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||||
status_change *sc = status_get_sc(src);
|
status_change *sc = status_get_sc(src);
|
||||||
status_change *tsc = status_get_sc(target);
|
status_change *tsc = status_get_sc(target);
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
|
|
||||||
//Defense reduction
|
//Defense reduction
|
||||||
short vit_def;
|
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);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
status_change *sc = status_get_sc(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
|
// Post skill/vit reduction damage increases
|
||||||
#ifndef RENEWAL
|
#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)
|
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);
|
bool attack_hits = is_attack_hitting(wd, src, target, skill_id, skill_lv, false);
|
||||||
|
|
||||||
if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM)
|
if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM)
|
||||||
@ -6809,9 +6803,9 @@ static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,s
|
|||||||
return;
|
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
|
// 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
|
#ifndef RENEWAL
|
||||||
&& tstatus->def == 100
|
&& tstatus->def == 100
|
||||||
#endif
|
#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))) ) {
|
(src->type == BL_SKILL && (skill_id == SG_SUN_WARM || skill_id == SG_MOON_WARM || skill_id == SG_STAR_WARM))) ) {
|
||||||
int64 damage = wd->damage + wd->damage2, rdamage = 0;
|
int64 damage = wd->damage + wd->damage2, rdamage = 0;
|
||||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
t_tick tick = gettick(), rdelay = 0;
|
t_tick tick = gettick(), rdelay = 0;
|
||||||
|
|
||||||
rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id, false);
|
rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id, false);
|
||||||
if( rdamage > 0 ) { //Item reflect gets calculated before any mapflag reducing is applicated
|
if( rdamage > 0 ) { //Item reflect gets calculated before any mapflag reducing is applicated
|
||||||
struct block_list *d_bl = battle_check_devotion(src);
|
struct block_list *d_bl = battle_check_devotion(src);
|
||||||
|
|
||||||
rdelay = clif_damage(*src, (d_bl == 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 )
|
if( tsd )
|
||||||
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
|
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
|
||||||
//Use Reflect Shield to signal this kind of skill trigger [Skotlex]
|
//Use Reflect Shield to signal this kind of skill trigger [Skotlex]
|
||||||
@ -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);
|
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||||
status_change *sc = status_get_sc(src);
|
status_change *sc = status_get_sc(src);
|
||||||
status_change *tsc = status_get_sc(target);
|
status_change *tsc = status_get_sc(target);
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
int skill_damage = 0;
|
int skill_damage = 0;
|
||||||
|
|
||||||
//Reject Sword bugreport:4493 by Daegaladh
|
//Reject Sword bugreport:4493 by Daegaladh
|
||||||
@ -6996,9 +6990,9 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
ATK_RATER(wd->damage, 50)
|
ATK_RATER(wd->damage, 50)
|
||||||
clif_skill_nodamage(target, *target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1);
|
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);
|
battle_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD);
|
||||||
if (status_isdead(*target))
|
if (status_isdead(target))
|
||||||
return;
|
return;
|
||||||
if( --(tsc->getSCE(SC_REJECTSWORD)->val3) <= 0 )
|
if( --(tsc->getSCE(SC_REJECTSWORD)->val3) <= 0 )
|
||||||
status_change_end(target, SC_REJECTSWORD);
|
status_change_end(target, SC_REJECTSWORD);
|
||||||
@ -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);
|
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE);
|
||||||
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
|
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
|
||||||
1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE); // This is how official does
|
1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE); // This is how official does
|
||||||
clif_damage(*src, *target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
|
clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
|
||||||
battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW);
|
battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW);
|
||||||
status_damage(src, target, rdamage/10, 0, 0, 1, 0);
|
status_damage(src, target, rdamage/10, 0, 0, 1, 0);
|
||||||
status_change_end(target, SC_CRESCENTELBOW);
|
status_change_end(target, SC_CRESCENTELBOW);
|
||||||
@ -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)
|
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);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
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 *sc = status_get_sc(src);
|
||||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
struct Damage wd;
|
struct Damage wd;
|
||||||
@ -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;
|
int64 damage = wd->damage + wd->damage2, rdamage = 0;
|
||||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||||
status_change *tsc = status_get_sc(target);
|
status_change *tsc = status_get_sc(target);
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
struct unit_data *ud = unit_bl2ud(target);
|
struct unit_data *ud = unit_bl2ud(target);
|
||||||
t_tick tick = gettick(), rdelay = 0;
|
t_tick tick = gettick(), rdelay = 0;
|
||||||
|
|
||||||
@ -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)
|
if( attack_type == BF_WEAPON && tsc->getSCE(SC_REFLECTDAMAGE) ) // Don't reflect your own damage (Grand Cross)
|
||||||
map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag);
|
map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag);
|
||||||
else if( attack_type == BF_WEAPON || attack_type == BF_MISC) {
|
else if( attack_type == BF_WEAPON || attack_type == BF_MISC) {
|
||||||
rdelay = clif_damage(*src, (d_bl == 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 )
|
if( tsd )
|
||||||
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
|
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
|
||||||
// It appears that official servers give skill reflect damage a longer delay
|
// It appears that official servers give skill reflect damage a longer delay
|
||||||
@ -7321,8 +7315,8 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
|||||||
struct Damage wd;
|
struct Damage wd;
|
||||||
status_change *sc = status_get_sc(src);
|
status_change *sc = status_get_sc(src);
|
||||||
status_change *tsc = status_get_sc(target);
|
status_change *tsc = status_get_sc(target);
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
int right_element, left_element;
|
int right_element, left_element;
|
||||||
bool infdef = false;
|
bool infdef = false;
|
||||||
|
|
||||||
@ -7396,7 +7390,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
|||||||
|
|
||||||
#ifdef RENEWAL
|
#ifdef RENEWAL
|
||||||
if(skill_id == HW_MAGICCRASHER) { // Add weapon attack for MATK onto Magic Crasher
|
if(skill_id == HW_MAGICCRASHER) { // Add weapon attack for MATK onto Magic Crasher
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
|
|
||||||
if (sstatus->matk_max > sstatus->matk_min) {
|
if (sstatus->matk_max > sstatus->matk_min) {
|
||||||
ATK_ADD(wd.weaponAtk, wd.weaponAtk2, sstatus->matk_min+rnd()%(sstatus->matk_max-sstatus->matk_min));
|
ATK_ADD(wd.weaponAtk, wd.weaponAtk2, sstatus->matk_min+rnd()%(sstatus->matk_max-sstatus->matk_min));
|
||||||
@ -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);
|
ATK_ADD(wd.damage, wd.damage2, skill_lv * 240 + status_get_lv(target) * 40);
|
||||||
break;
|
break;
|
||||||
case SR_GATEOFHELL: {
|
case SR_GATEOFHELL: {
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
status_data *sstatus = status_get_status_data(src);
|
||||||
double bonus = 1 + skill_lv * 2 / 10;
|
double bonus = 1 + skill_lv * 2 / 10;
|
||||||
|
|
||||||
ATK_ADD(wd.damage, wd.damage2, sstatus->max_hp - sstatus->hp);
|
ATK_ADD(wd.damage, wd.damage2, sstatus->max_hp - sstatus->hp);
|
||||||
@ -7727,6 +7721,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
|||||||
TBL_PC *tsd;
|
TBL_PC *tsd;
|
||||||
status_change *sc, *tsc;
|
status_change *sc, *tsc;
|
||||||
struct Damage ad;
|
struct Damage ad;
|
||||||
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
struct {
|
struct {
|
||||||
unsigned imdef : 1;
|
unsigned imdef : 1;
|
||||||
unsigned infdef : 1;
|
unsigned infdef : 1;
|
||||||
@ -7739,10 +7735,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
|||||||
nullpo_info(NLP_MARK);
|
nullpo_info(NLP_MARK);
|
||||||
return ad;
|
return ad;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
|
||||||
|
|
||||||
// Initial Values
|
// Initial Values
|
||||||
// Set to 1 because magic damage on plants is 1 per hit; if target is not a plant this gets reinitialized to 0 later
|
// Set to 1 because magic damage on plants is 1 per hit; if target is not a plant this gets reinitialized to 0 later
|
||||||
ad.damage = 1;
|
ad.damage = 1;
|
||||||
@ -8462,6 +8454,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
|||||||
break;
|
break;
|
||||||
case AG_ASTRAL_STRIKE_ATK:
|
case AG_ASTRAL_STRIKE_ATK:
|
||||||
skillratio += -100 + 650 * skill_lv + 10 * sstatus->spl;
|
skillratio += -100 + 650 * skill_lv + 10 * sstatus->spl;
|
||||||
|
// Not confirmed, but if the main hit deal additional damage
|
||||||
|
// on certain races then the repeated damage should too right?
|
||||||
|
// Guessing a formula here for now. [Rytech]
|
||||||
|
if (tstatus->race == RC_UNDEAD || tstatus->race == RC_DRAGON)
|
||||||
|
skillratio += 200 * skill_lv;
|
||||||
RE_LVL_DMOD(100);
|
RE_LVL_DMOD(100);
|
||||||
break;
|
break;
|
||||||
case AG_ROCK_DOWN:
|
case AG_ROCK_DOWN:
|
||||||
@ -8964,6 +8961,8 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
|||||||
|
|
||||||
map_session_data *sd, *tsd;
|
map_session_data *sd, *tsd;
|
||||||
struct Damage md; //DO NOT CONFUSE with md of mob_data!
|
struct Damage md; //DO NOT CONFUSE with md of mob_data!
|
||||||
|
struct status_data *sstatus = status_get_status_data(src);
|
||||||
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
status_change *ssc = status_get_sc(src);
|
status_change *ssc = status_get_sc(src);
|
||||||
|
|
||||||
memset(&md,0,sizeof(md));
|
memset(&md,0,sizeof(md));
|
||||||
@ -8973,9 +8972,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
|||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
|
||||||
|
|
||||||
//Some initial values
|
//Some initial values
|
||||||
md.amotion = (skill_get_inf(skill_id)&INF_GROUND_SKILL ? 0 : sstatus->amotion);
|
md.amotion = (skill_get_inf(skill_id)&INF_GROUND_SKILL ? 0 : sstatus->amotion);
|
||||||
md.dmotion = tstatus->dmotion;
|
md.dmotion = tstatus->dmotion;
|
||||||
@ -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);
|
status_change_entry *tsce = tsc->getSCE(SC_WEAPONBLOCKING);
|
||||||
|
|
||||||
if (attack_type == BF_WEAPON && rnd() % 100 < tsce->val2) {
|
if (attack_type == BF_WEAPON && rnd() % 100 < tsce->val2) {
|
||||||
clif_skill_nodamage(target, *bl, GC_WEAPONBLOCKING, tsce->val1);
|
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));
|
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)
|
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);
|
mob_data* dstmd = BL_CAST(BL_MOB, &target);
|
||||||
|
|
||||||
// Coma
|
// 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, target);
|
||||||
nullpo_retr(false, wd);
|
nullpo_retr(false, wd);
|
||||||
|
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
struct status_data *tstatus = status_get_status_data(target);
|
||||||
// bHPVanishRaceRate
|
// bHPVanishRaceRate
|
||||||
int16 vellum_rate_hp = cap_value(sd->hp_vanish_race[tstatus->race].rate + sd->hp_vanish_race[RC_ALL].rate, 0, INT16_MAX);
|
int16 vellum_rate_hp = cap_value(sd->hp_vanish_race[tstatus->race].rate + sd->hp_vanish_race[RC_ALL].rate, 0, INT16_MAX);
|
||||||
int8 vellum_hp = cap_value(sd->hp_vanish_race[tstatus->race].per + sd->hp_vanish_race[RC_ALL].per, INT8_MIN, INT8_MAX);
|
int8 vellum_hp = cap_value(sd->hp_vanish_race[tstatus->race].per + sd->hp_vanish_race[RC_ALL].per, INT8_MIN, INT8_MAX);
|
||||||
@ -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);
|
battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true,false);
|
||||||
else
|
else
|
||||||
battle_fix_damage(src,bl,damage,0,LG_REFLECTDAMAGE);
|
battle_fix_damage(src,bl,damage,0,LG_REFLECTDAMAGE);
|
||||||
clif_damage(*bl,*bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false);
|
clif_damage(bl,bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false);
|
||||||
skill_additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
|
skill_additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
|
||||||
map_freeblock_unlock();
|
map_freeblock_unlock();
|
||||||
}
|
}
|
||||||
@ -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) {
|
enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* target, t_tick tick, int flag) {
|
||||||
map_session_data *sd = nullptr, *tsd = nullptr;
|
map_session_data *sd = nullptr, *tsd = nullptr;
|
||||||
|
struct status_data *sstatus, *tstatus;
|
||||||
status_change *sc, *tsc;
|
status_change *sc, *tsc;
|
||||||
int64 damage;
|
int64 damage;
|
||||||
int skillv;
|
int skillv;
|
||||||
@ -9809,8 +9806,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|||||||
sd = BL_CAST(BL_PC, src);
|
sd = BL_CAST(BL_PC, src);
|
||||||
tsd = BL_CAST(BL_PC, target);
|
tsd = BL_CAST(BL_PC, target);
|
||||||
|
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
sstatus = status_get_status_data(src);
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
tstatus = status_get_status_data(target);
|
||||||
|
|
||||||
sc = status_get_sc(src);
|
sc = status_get_sc(src);
|
||||||
tsc = status_get_sc(target);
|
tsc = status_get_sc(target);
|
||||||
@ -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;
|
uint16 skill_lv = tsc->getSCE(SC_AUTOCOUNTER)->val1;
|
||||||
|
|
||||||
clif_skillcastcancel( *target ); //Remove the casting bar. [Skotlex]
|
clif_skillcastcancel( *target ); //Remove the casting bar. [Skotlex]
|
||||||
clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
||||||
status_change_end(target, SC_AUTOCOUNTER);
|
status_change_end(target, SC_AUTOCOUNTER);
|
||||||
skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
|
skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
|
||||||
return ATK_BLOCK;
|
return ATK_BLOCK;
|
||||||
@ -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);
|
status_change_end(target, SC_BLADESTOP_WAIT);
|
||||||
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
|
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
|
||||||
{ //Target locked.
|
{ //Target locked.
|
||||||
clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
||||||
clif_bladestop(target, src->id, 1);
|
clif_bladestop(target, src->id, 1);
|
||||||
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
|
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
|
||||||
return ATK_BLOCK;
|
return ATK_BLOCK;
|
||||||
@ -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)
|
if (tsc && tsc->getSCE(SC_MTF_MLEATKED) && rnd()%100 < tsc->getSCE(SC_MTF_MLEATKED)->val2)
|
||||||
clif_skill_nodamage(target, *target, SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1, sc_start(src, target, SC_ENDURE, 100, tsc->getSCE(SC_MTF_MLEATKED)->val1, skill_get_time(SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1)));
|
clif_skill_nodamage(target, target, SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1, sc_start(src, target, SC_ENDURE, 100, tsc->getSCE(SC_MTF_MLEATKED)->val1, skill_get_time(SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1)));
|
||||||
|
|
||||||
if(tsc && tsc->getSCE(SC_KAAHI) && tstatus->hp < tstatus->max_hp && status_charge(target, 0, tsc->getSCE(SC_KAAHI)->val3)) {
|
if(tsc && tsc->getSCE(SC_KAAHI) && tstatus->hp < tstatus->max_hp && status_charge(target, 0, tsc->getSCE(SC_KAAHI)->val3)) {
|
||||||
int hp_heal = tstatus->max_hp - tstatus->hp;
|
int hp_heal = tstatus->max_hp - tstatus->hp;
|
||||||
@ -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)
|
if (sd && sd->bonus.splash_range > 0 && damage > 0)
|
||||||
skill_castend_damage_id(src, target, 0, 1, tick, 0);
|
skill_castend_damage_id(src, target, 0, 1, tick, 0);
|
||||||
@ -10068,7 +10065,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
|||||||
map_freeblock_lock();
|
map_freeblock_lock();
|
||||||
|
|
||||||
if( !(tsc && tsc->getSCE(SC_DEVOTION)) && !vellum_damage && skill_check_shadowform(target, damage, wd.div_) ) {
|
if( !(tsc && tsc->getSCE(SC_DEVOTION)) && !vellum_damage && skill_check_shadowform(target, damage, wd.div_) ) {
|
||||||
if( !status_isdead(*target) )
|
if( !status_isdead(target) )
|
||||||
skill_additional_effect(src, target, 0, 0, wd.flag, wd.dmg_lv, tick);
|
skill_additional_effect(src, target, 0, 0, wd.flag, wd.dmg_lv, tick);
|
||||||
if( wd.dmg_lv > ATK_BLOCK )
|
if( wd.dmg_lv > ATK_BLOCK )
|
||||||
skill_counter_additional_effect(src, target, 0, 0, wd.flag, tick);
|
skill_counter_additional_effect(src, target, 0, 0, wd.flag, tick);
|
||||||
@ -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))
|
if (d_sc && d_sc->getSCE(SC_REBOUND_S))
|
||||||
devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100;
|
devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100;
|
||||||
|
|
||||||
clif_damage(*d_bl, *d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false);
|
clif_damage(d_bl, d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false);
|
||||||
battle_fix_damage(src, d_bl, devotion_damage, 0, CR_DEVOTION);
|
battle_fix_damage(src, d_bl, devotion_damage, 0, CR_DEVOTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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)) {
|
if (tsc->getSCE(SC_WATER_SCREEN_OPTION)) {
|
||||||
struct block_list *e_bl = map_id2bl(tsc->getSCE(SC_WATER_SCREEN_OPTION)->val1);
|
struct block_list *e_bl = map_id2bl(tsc->getSCE(SC_WATER_SCREEN_OPTION)->val1);
|
||||||
|
|
||||||
if (e_bl && !status_isdead(*e_bl)) {
|
if (e_bl && !status_isdead(e_bl)) {
|
||||||
clif_damage(*e_bl, *e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
|
clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
|
||||||
battle_fix_damage(src, e_bl, damage, 0, EL_WATER_SCREEN);
|
battle_fix_damage(src, e_bl, damage, 0, EL_WATER_SCREEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -627,11 +627,11 @@ void buyingstore_reopen( map_session_data* sd ){
|
|||||||
{
|
{
|
||||||
// Make buyer look perfect
|
// Make buyer look perfect
|
||||||
pc_setdir(sd, at->dir, at->head_dir);
|
pc_setdir(sd, at->dir, at->head_dir);
|
||||||
clif_changed_dir(sd->bl, AREA_WOS);
|
clif_changed_dir(&sd->bl, AREA_WOS);
|
||||||
if( at->sit ) {
|
if( at->sit ) {
|
||||||
pc_setsit(sd);
|
pc_setsit(sd);
|
||||||
skill_sit(sd, 1);
|
skill_sit(sd, 1);
|
||||||
clif_sitting(sd->bl);
|
clif_sitting(&sd->bl);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Immediate save
|
// Immediate save
|
||||||
|
@ -108,7 +108,7 @@ int chat_createpcchat(map_session_data* sd, const char* title, const char* pass,
|
|||||||
clif_createchat( *sd, CREATEROOM_SUCCESS );
|
clif_createchat( *sd, CREATEROOM_SUCCESS );
|
||||||
clif_dispchat(cd,0);
|
clif_dispchat(cd,0);
|
||||||
|
|
||||||
if (status_isdead(sd->bl))
|
if (status_isdead(&sd->bl))
|
||||||
achievement_update_objective(sd, AG_CHATTING_DYING, 1, 1);
|
achievement_update_objective(sd, AG_CHATTING_DYING, 1, 1);
|
||||||
else
|
else
|
||||||
achievement_update_objective(sd, AG_CHATTING_CREATE, 1, 1);
|
achievement_update_objective(sd, AG_CHATTING_CREATE, 1, 1);
|
||||||
@ -168,8 +168,7 @@ int chat_joinchat(map_session_data* sd, int chatid, const char* pass)
|
|||||||
|
|
||||||
pc_setchatid(sd,cd->bl.id);
|
pc_setchatid(sd,cd->bl.id);
|
||||||
|
|
||||||
// To the person who newly joined the chat
|
clif_joinchatok(sd, cd); //To the person who newly joined the list of all
|
||||||
clif_joinchatok(*sd, *cd);
|
|
||||||
clif_addchat(cd, sd); //Reports To the person who already in the chat
|
clif_addchat(cd, sd); //Reports To the person who already in the chat
|
||||||
clif_dispchat(cd, 0); //Reported number of changes to the people around
|
clif_dispchat(cd, 0); //Reported number of changes to the people around
|
||||||
|
|
||||||
@ -218,7 +217,7 @@ int chat_leavechat(map_session_data* sd, bool kicked)
|
|||||||
cd->usersd[i] = cd->usersd[i+1];
|
cd->usersd[i] = cd->usersd[i+1];
|
||||||
|
|
||||||
if( cd->users == 0 && cd->owner->type == BL_PC ) { // Delete empty chatroom
|
if( cd->users == 0 && cd->owner->type == BL_PC ) { // Delete empty chatroom
|
||||||
clif_clearchat(*cd);
|
clif_clearchat(cd, 0);
|
||||||
db_destroy(cd->kick_list);
|
db_destroy(cd->kick_list);
|
||||||
map_deliddb(&cd->bl);
|
map_deliddb(&cd->bl);
|
||||||
map_delblock(&cd->bl);
|
map_delblock(&cd->bl);
|
||||||
@ -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
|
if( leavechar == 0 && cd->owner->type == BL_PC ) { // Set and announce new owner
|
||||||
cd->owner = (struct block_list*) cd->usersd[0];
|
cd->owner = (struct block_list*) cd->usersd[0];
|
||||||
clif_changechatowner(cd, cd->usersd[0]);
|
clif_changechatowner(cd, cd->usersd[0]);
|
||||||
clif_clearchat(*cd);
|
clif_clearchat(cd, 0);
|
||||||
|
|
||||||
//Adjust Chat location after owner has been changed.
|
//Adjust Chat location after owner has been changed.
|
||||||
map_delblock( &cd->bl );
|
map_delblock( &cd->bl );
|
||||||
@ -276,7 +275,7 @@ int chat_changechatowner(map_session_data* sd, const char* nextownername)
|
|||||||
return -1; // name not found
|
return -1; // name not found
|
||||||
|
|
||||||
// erase temporarily
|
// erase temporarily
|
||||||
clif_clearchat(*cd);
|
clif_clearchat(cd,0);
|
||||||
|
|
||||||
// set new owner
|
// set new owner
|
||||||
cd->owner = (struct block_list*) cd->usersd[i];
|
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->limit = min(limit, ARRAYLENGTH(cd->usersd));
|
||||||
cd->pub = pub;
|
cd->pub = pub;
|
||||||
|
|
||||||
clif_changechatstatus(*cd);
|
clif_changechatstatus(cd);
|
||||||
clif_dispchat(cd,0);
|
clif_dispchat(cd,0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -437,7 +436,7 @@ int chat_deletenpcchat(struct npc_data* nd)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
chat_npckickall(cd);
|
chat_npckickall(cd);
|
||||||
clif_clearchat(*cd);
|
clif_clearchat(cd, 0);
|
||||||
map_deliddb(&cd->bl);
|
map_deliddb(&cd->bl);
|
||||||
map_delblock(&cd->bl);
|
map_delblock(&cd->bl);
|
||||||
map_freeblock(&cd->bl);
|
map_freeblock(&cd->bl);
|
||||||
|
@ -1065,7 +1065,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
|
|||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
sd->status.skill[idx].lv = 0;
|
sd->status.skill[idx].lv = 0;
|
||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(*sd,WE_CALLBABY);
|
clif_deleteskill(sd,WE_CALLBABY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) {
|
if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) {
|
||||||
@ -1073,7 +1073,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
|
|||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
sd->status.skill[idx].lv = 0;
|
sd->status.skill[idx].lv = 0;
|
||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(*sd,WE_CALLBABY);
|
clif_deleteskill(sd,WE_CALLBABY);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
1043
src/map/clif.cpp
1043
src/map/clif.cpp
File diff suppressed because it is too large
Load Diff
@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
#include "packets.hpp"
|
#include "packets.hpp"
|
||||||
#include "script.hpp"
|
#include "script.hpp"
|
||||||
#include "trade.hpp"
|
|
||||||
|
|
||||||
struct Channel;
|
struct Channel;
|
||||||
struct clan;
|
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_changemap( map_session_data& sd, short m, uint16 x, uint16 y );
|
||||||
void clif_changemapserver( map_session_data& sd, const char* map, uint16 x, uint16 y, uint32 ip, uint16 port );
|
void clif_changemapserver( map_session_data& sd, const char* map, uint16 x, uint16 y, uint32 ip, uint16 port );
|
||||||
void clif_blown(struct block_list *bl); // area
|
void clif_blown(struct block_list *bl); // area
|
||||||
void clif_slide(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_fixpos( block_list& bl );
|
||||||
void clif_npcbuysell( map_session_data& sd, npc_data& nd );
|
void clif_npcbuysell( map_session_data& sd, npc_data& nd );
|
||||||
void clif_buylist( map_session_data& sd, npc_data& nd );
|
void clif_buylist( map_session_data& sd, npc_data& nd );
|
||||||
@ -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_update_hp(map_session_data &sd);
|
||||||
void clif_updatestatus( map_session_data& sd, _sp type );
|
void clif_updatestatus( map_session_data& sd, _sp type );
|
||||||
void clif_changemanner( map_session_data& sd );
|
void clif_changemanner( map_session_data& sd );
|
||||||
int clif_damage(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
|
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(block_list& src, block_list& dst);
|
void clif_takeitem(struct block_list* src, struct block_list* dst);
|
||||||
void clif_sitting(block_list& bl);
|
void clif_sitting(struct block_list* bl);
|
||||||
void clif_standing(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_sprite_change(struct block_list *bl, int id, int type, int val, int val2, enum send_target target);
|
||||||
void clif_changelook(struct block_list *bl,int type,int val); // area
|
void clif_changelook(struct block_list *bl,int type,int val); // area
|
||||||
void clif_changetraplook(struct block_list *bl,int val); // area
|
void clif_changetraplook(struct block_list *bl,int val); // area
|
||||||
@ -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_arrow_create_list( map_session_data& sd );
|
||||||
void clif_statusupack( map_session_data& sd, int32 type, bool success, int32 val = 0 );
|
void clif_statusupack( map_session_data& sd, int32 type, bool success, int32 val = 0 );
|
||||||
void clif_equipitemack( map_session_data& sd, uint8 flag, int index, int pos = 0 ); // self
|
void clif_equipitemack( map_session_data& sd, uint8 flag, int index, int pos = 0 ); // self
|
||||||
void clif_unequipitemack( map_session_data& sd, 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_misceffect( block_list& bl, e_notify_effect type );
|
||||||
void clif_changeoption_target(struct block_list* bl, struct block_list* target);
|
void clif_changeoption_target(struct block_list* bl, struct block_list* target);
|
||||||
#define clif_changeoption(bl) clif_changeoption_target(bl, nullptr) // area
|
#define clif_changeoption(bl) clif_changeoption_target(bl, nullptr) // area
|
||||||
@ -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_createchat( map_session_data& sd, e_create_chatroom flag );
|
||||||
void clif_dispchat(struct chat_data* cd, int fd); // area or fd
|
void clif_dispchat(struct chat_data* cd, int fd); // area or fd
|
||||||
void clif_joinchatfail( map_session_data& sd, e_refuse_enter_room result );
|
void clif_joinchatfail( map_session_data& sd, e_refuse_enter_room result );
|
||||||
void clif_joinchatok(map_session_data& sd,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_addchat(struct chat_data* cd,map_session_data *sd); // chat
|
||||||
void clif_changechatowner(struct chat_data* cd, map_session_data* sd); // chat
|
void clif_changechatowner(struct chat_data* cd, map_session_data* sd); // chat
|
||||||
void clif_clearchat(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_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_storagewindow(map_session_data *sd);
|
||||||
void clif_refresh(map_session_data *sd); // self
|
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_callpartner(map_session_data& sd);
|
||||||
void clif_playBGM( map_session_data& sd, const char* name );
|
void clif_playBGM( map_session_data& sd, const char* name );
|
||||||
void clif_soundeffect( struct block_list& bl, const char* name, int type, enum send_target target );
|
void clif_soundeffect( struct block_list& bl, const char* name, int type, enum send_target target );
|
||||||
void clif_parse_ActionRequest_sub( map_session_data& sd, 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_parse_LoadEndAck(int fd,map_session_data *sd);
|
||||||
void clif_hotkeys_send(map_session_data *sd, int tab);
|
void clif_hotkeys_send(map_session_data *sd, int tab);
|
||||||
|
|
||||||
// trade
|
// trade
|
||||||
void clif_traderequest(map_session_data& sd, const char* name);
|
void clif_traderequest(map_session_data* sd, const char* name);
|
||||||
void clif_traderesponse( map_session_data& sd, e_ack_trade_response result );
|
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_tradeadditem(map_session_data* sd, map_session_data* tsd, int index, int amount);
|
||||||
void clif_tradeitemok(map_session_data& sd, int index, e_exitem_add_result result);
|
void clif_tradeitemok(map_session_data& sd, int index, e_exitem_add_result result);
|
||||||
void clif_tradedeal_lock( map_session_data& sd, bool who );
|
void clif_tradedeal_lock( map_session_data& sd, bool who );
|
||||||
@ -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_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable);
|
||||||
void clif_skillinfo(map_session_data *sd,int skill_id, int inf);
|
void clif_skillinfo(map_session_data *sd,int skill_id, int inf);
|
||||||
void clif_addskill(map_session_data *sd, int skill_id);
|
void clif_addskill(map_session_data *sd, int skill_id);
|
||||||
void clif_deleteskill(map_session_data& sd, 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_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime);
|
||||||
void clif_skillcastcancel( block_list& bl );
|
void clif_skillcastcancel( block_list& bl );
|
||||||
@ -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 );
|
void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick );
|
||||||
int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
|
int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
|
||||||
//int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
|
//int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
|
||||||
bool clif_skill_nodamage( 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_poseffect(struct block_list *src,uint16 skill_id,int val,int x,int y,t_tick tick);
|
||||||
void clif_skill_estimation(map_session_data *sd,struct block_list *dst);
|
void clif_skill_estimation(map_session_data *sd,struct block_list *dst);
|
||||||
void clif_skill_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, 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_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result );
|
||||||
void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result );
|
void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result );
|
||||||
void clif_skill_produce_mix_list( map_session_data& sd, int skill_id, int trigger );
|
void clif_skill_produce_mix_list( map_session_data& sd, int skill_id, int trigger );
|
||||||
@ -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_item(map_session_data *sd, t_itemid nameid);
|
||||||
void clif_mvp_exp(map_session_data *sd, t_exp exp);
|
void clif_mvp_exp(map_session_data *sd, t_exp exp);
|
||||||
void clif_mvp_noitem(map_session_data* sd);
|
void clif_mvp_noitem(map_session_data* sd);
|
||||||
void clif_changed_dir(block_list& bl, enum send_target target);
|
void clif_changed_dir(struct block_list *bl, enum send_target target);
|
||||||
|
|
||||||
// vending
|
// vending
|
||||||
void clif_openvendingreq( map_session_data& sd, uint16 num );
|
void clif_openvendingreq( map_session_data& sd, uint16 num );
|
||||||
@ -1041,9 +1040,9 @@ void clif_party_dead( map_session_data& sd );
|
|||||||
// guild
|
// guild
|
||||||
void clif_guild_created( map_session_data& sd, int flag );
|
void clif_guild_created( map_session_data& sd, int flag );
|
||||||
void clif_guild_belonginfo( map_session_data& sd );
|
void clif_guild_belonginfo( map_session_data& sd );
|
||||||
void clif_guild_masterormember(map_session_data& sd);
|
void clif_guild_masterormember(map_session_data *sd);
|
||||||
void clif_guild_basicinfo( map_session_data& sd );
|
void clif_guild_basicinfo( map_session_data& sd );
|
||||||
void clif_guild_allianceinfo(map_session_data& sd);
|
void clif_guild_allianceinfo(map_session_data *sd);
|
||||||
void clif_guild_memberlist( map_session_data& sd );
|
void clif_guild_memberlist( map_session_data& sd );
|
||||||
void clif_guild_skillinfo( map_session_data& sd );
|
void clif_guild_skillinfo( map_session_data& sd );
|
||||||
void clif_guild_send_onlineinfo(map_session_data *sd); //[LuzZza]
|
void clif_guild_send_onlineinfo(map_session_data *sd); //[LuzZza]
|
||||||
@ -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(const map_session_data &sd, const struct mmo_guild &g);
|
||||||
void clif_guild_emblem_area(struct block_list* bl);
|
void clif_guild_emblem_area(struct block_list* bl);
|
||||||
void clif_guild_notice( map_session_data& sd );
|
void clif_guild_notice( map_session_data& sd );
|
||||||
void clif_guild_message( const struct mmo_guild& g, const char* mes, size_t len );
|
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_reqalliance(map_session_data *sd,uint32 account_id,const char *name);
|
||||||
void clif_guild_allianceack(map_session_data& sd, uint8 flag);
|
void clif_guild_allianceack(map_session_data *sd,int flag);
|
||||||
void clif_guild_delalliance(map_session_data& sd,uint32 guild_id,uint32 flag);
|
void clif_guild_delalliance(map_session_data *sd,int guild_id,int flag);
|
||||||
void clif_guild_oppositionack(map_session_data& sd,uint8 flag);
|
void clif_guild_oppositionack(map_session_data *sd,int flag);
|
||||||
void clif_guild_broken( map_session_data& sd, int flag );
|
void clif_guild_broken( map_session_data& sd, int flag );
|
||||||
void clif_guild_xy( map_session_data& sd );
|
void clif_guild_xy( map_session_data& sd );
|
||||||
void clif_guild_xy_single( map_session_data& sd, map_session_data& tsd );
|
void clif_guild_xy_single( map_session_data& sd, map_session_data& tsd );
|
||||||
|
@ -37,16 +37,20 @@
|
|||||||
packet(0x0084,2);
|
packet(0x0084,2);
|
||||||
parseable_packet(0x0085,5,clif_parse_WalkToXY,2);
|
parseable_packet(0x0085,5,clif_parse_WalkToXY,2);
|
||||||
parseable_packet(0x0089,7,clif_parse_ActionRequest,2,6);
|
parseable_packet(0x0089,7,clif_parse_ActionRequest,2,6);
|
||||||
|
packet(0x008a,29);
|
||||||
packet(0x008b,2);
|
packet(0x008b,2);
|
||||||
parseable_packet(0x008c,-1,clif_parse_GlobalMessage,2,4);
|
parseable_packet(0x008c,-1,clif_parse_GlobalMessage,2,4);
|
||||||
packet(0x008d,-1);
|
packet(0x008d,-1);
|
||||||
packet(0x008e,-1);
|
packet(0x008e,-1);
|
||||||
|
//packet(0x008f,-1);
|
||||||
parseable_packet(0x0090,7,clif_parse_NpcClicked,2,6);
|
parseable_packet(0x0090,7,clif_parse_NpcClicked,2,6);
|
||||||
packet(0x0093,2);
|
packet(0x0093,2);
|
||||||
parseable_packet(0x0094,6,clif_parse_GetCharNameRequest,2);
|
parseable_packet(0x0094,6,clif_parse_GetCharNameRequest,2);
|
||||||
parseable_packet(0x0096,-1,clif_parse_WisMessage,2,4,28);
|
parseable_packet(0x0096,-1,clif_parse_WisMessage,2,4,28);
|
||||||
parseable_packet(0x0099,-1,clif_parse_Broadcast,2,4);
|
parseable_packet(0x0099,-1,clif_parse_Broadcast,2,4);
|
||||||
|
packet(0x009a,-1);
|
||||||
parseable_packet(0x009b,5,clif_parse_ChangeDir,2,4);
|
parseable_packet(0x009b,5,clif_parse_ChangeDir,2,4);
|
||||||
|
packet(0x009c,9);
|
||||||
packet( HEADER_ZC_ITEM_ENTRY, sizeof( struct PACKET_ZC_ITEM_ENTRY ) );
|
packet( HEADER_ZC_ITEM_ENTRY, sizeof( struct PACKET_ZC_ITEM_ENTRY ) );
|
||||||
packet(0x009e,17);
|
packet(0x009e,17);
|
||||||
parseable_packet(0x009f,6,clif_parse_TakeItem,2);
|
parseable_packet(0x009f,6,clif_parse_TakeItem,2);
|
||||||
@ -59,6 +63,8 @@
|
|||||||
packet( useItemAckType, sizeof( struct PACKET_ZC_USE_ITEM_ACK ) );
|
packet( useItemAckType, sizeof( struct PACKET_ZC_USE_ITEM_ACK ) );
|
||||||
parseable_packet(0x00a9,6,clif_parse_EquipItem,2,4);
|
parseable_packet(0x00a9,6,clif_parse_EquipItem,2,4);
|
||||||
parseable_packet(0x00ab,4,clif_parse_UnequipItem,2);
|
parseable_packet(0x00ab,4,clif_parse_UnequipItem,2);
|
||||||
|
packet(0x00ac,7);
|
||||||
|
//packet(0x00ad,-1);
|
||||||
packet(0x00ae,-1);
|
packet(0x00ae,-1);
|
||||||
parseable_packet(0x00b2,3,clif_parse_Restart,2);
|
parseable_packet(0x00b2,3,clif_parse_Restart,2);
|
||||||
parseable_packet(0x00b8,7,clif_parse_NpcSelectMenu,2,6);
|
parseable_packet(0x00b8,7,clif_parse_NpcSelectMenu,2,6);
|
||||||
@ -68,6 +74,7 @@
|
|||||||
parseable_packet(0x00bf,3,clif_parse_Emotion,2);
|
parseable_packet(0x00bf,3,clif_parse_Emotion,2);
|
||||||
packet(0x00c0,7);
|
packet(0x00c0,7);
|
||||||
parseable_packet(0x00c1,2,clif_parse_HowManyConnections,0);
|
parseable_packet(0x00c1,2,clif_parse_HowManyConnections,0);
|
||||||
|
packet(0x00c2,6);
|
||||||
packet(0x00c3,8);
|
packet(0x00c3,8);
|
||||||
parseable_packet(0x00c5,7,clif_parse_NpcBuySellSelected,2,6);
|
parseable_packet(0x00c5,7,clif_parse_NpcBuySellSelected,2,6);
|
||||||
packet(0x00c6,-1);
|
packet(0x00c6,-1);
|
||||||
@ -86,10 +93,13 @@
|
|||||||
packet(0x00d4,-1);
|
packet(0x00d4,-1);
|
||||||
parseable_packet(0x00d5,-1,clif_parse_CreateChatRoom,2,4,6,7,15);
|
parseable_packet(0x00d5,-1,clif_parse_CreateChatRoom,2,4,6,7,15);
|
||||||
packet(0x00d7,-1);
|
packet(0x00d7,-1);
|
||||||
|
packet(0x00d8,6);
|
||||||
parseable_packet(0x00d9,14,clif_parse_ChatAddMember,2,6);
|
parseable_packet(0x00d9,14,clif_parse_ChatAddMember,2,6);
|
||||||
|
packet(0x00db,-1);
|
||||||
packet(0x00dc,28);
|
packet(0x00dc,28);
|
||||||
packet(0x00dd,29);
|
packet(0x00dd,29);
|
||||||
parseable_packet(0x00de,-1,clif_parse_ChatRoomStatusChange,2,4,6,7,15);
|
parseable_packet(0x00de,-1,clif_parse_ChatRoomStatusChange,2,4,6,7,15);
|
||||||
|
packet(0x00df,-1);
|
||||||
parseable_packet(0x00e0,30,clif_parse_ChangeChatOwner,2,6);
|
parseable_packet(0x00e0,30,clif_parse_ChangeChatOwner,2,6);
|
||||||
packet(0x00e1,30);
|
packet(0x00e1,30);
|
||||||
parseable_packet(0x00e2,26,clif_parse_KickFromChat,2);
|
parseable_packet(0x00e2,26,clif_parse_KickFromChat,2);
|
||||||
@ -97,6 +107,7 @@
|
|||||||
parseable_packet(0x00e4,6,clif_parse_TradeRequest,2);
|
parseable_packet(0x00e4,6,clif_parse_TradeRequest,2);
|
||||||
packet(0x00e5,26);
|
packet(0x00e5,26);
|
||||||
parseable_packet(0x00e6,3,clif_parse_TradeAck,2);
|
parseable_packet(0x00e6,3,clif_parse_TradeAck,2);
|
||||||
|
packet(0x00e7,3);
|
||||||
parseable_packet(0x00e8,8,clif_parse_TradeAddItem,2,4);
|
parseable_packet(0x00e8,8,clif_parse_TradeAddItem,2,4);
|
||||||
packet(0x00ea,5);
|
packet(0x00ea,5);
|
||||||
parseable_packet(0x00eb,2,clif_parse_TradeOk,0);
|
parseable_packet(0x00eb,2,clif_parse_TradeOk,0);
|
||||||
@ -133,7 +144,9 @@
|
|||||||
packet(0x0117,18);
|
packet(0x0117,18);
|
||||||
parseable_packet(0x0118,2,clif_parse_StopAttack,0);
|
parseable_packet(0x0118,2,clif_parse_StopAttack,0);
|
||||||
packet(0x0119,13);
|
packet(0x0119,13);
|
||||||
|
packet(0x011a,15);
|
||||||
parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4);
|
parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4);
|
||||||
|
packet(0x011c,68);
|
||||||
parseable_packet(0x011d,2,clif_parse_RequestMemo,0);
|
parseable_packet(0x011d,2,clif_parse_RequestMemo,0);
|
||||||
packet(0x011f,16);
|
packet(0x011f,16);
|
||||||
packet( cartlistequipType, -1 );
|
packet( cartlistequipType, -1 );
|
||||||
@ -159,7 +172,9 @@
|
|||||||
parseable_packet(0x0149,9,clif_parse_GMReqNoChat,2,6,7);
|
parseable_packet(0x0149,9,clif_parse_GMReqNoChat,2,6,7);
|
||||||
packet(0x014a,6);
|
packet(0x014a,6);
|
||||||
packet(0x014b,27);
|
packet(0x014b,27);
|
||||||
|
packet(0x014c,-1);
|
||||||
parseable_packet(0x014d,2,clif_parse_GuildCheckMaster,0);
|
parseable_packet(0x014d,2,clif_parse_GuildCheckMaster,0);
|
||||||
|
packet(0x014e,6);
|
||||||
parseable_packet(0x014f,6,clif_parse_GuildRequestInfo,2);
|
parseable_packet(0x014f,6,clif_parse_GuildRequestInfo,2);
|
||||||
packet(0x0150,110);
|
packet(0x0150,110);
|
||||||
parseable_packet(0x0151,6,clif_parse_GuildRequestEmblem,2);
|
parseable_packet(0x0151,6,clif_parse_GuildRequestEmblem,2);
|
||||||
@ -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_BAN_GUILD, sizeof( PACKET_CZ_REQ_BAN_GUILD ), clif_parse_GuildExpulsion, 0 );
|
||||||
parseable_packet( HEADER_CZ_REQ_DISORGANIZE_GUILD, sizeof( PACKET_CZ_REQ_DISORGANIZE_GUILD ), clif_parse_GuildBreak, 0 );
|
parseable_packet( HEADER_CZ_REQ_DISORGANIZE_GUILD, sizeof( PACKET_CZ_REQ_DISORGANIZE_GUILD ), clif_parse_GuildBreak, 0 );
|
||||||
packet(0x015f,42);
|
packet(0x015f,42);
|
||||||
|
packet(0x0160,-1);
|
||||||
parseable_packet(0x0161,-1,clif_parse_GuildChangePositionInfo,2,4);
|
parseable_packet(0x0161,-1,clif_parse_GuildChangePositionInfo,2,4);
|
||||||
|
packet(0x0163,-1);
|
||||||
packet(0x0164,-1);
|
packet(0x0164,-1);
|
||||||
parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6);
|
parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6);
|
||||||
packet(0x0166,-1);
|
packet(0x0166,-1);
|
||||||
@ -184,7 +201,9 @@
|
|||||||
packet(0x016d,14);
|
packet(0x016d,14);
|
||||||
parseable_packet(0x016e,186,clif_parse_GuildChangeNotice,2,6,66);
|
parseable_packet(0x016e,186,clif_parse_GuildChangeNotice,2,6,66);
|
||||||
parseable_packet(0x0170,14,clif_parse_GuildRequestAlliance,2,6,10);
|
parseable_packet(0x0170,14,clif_parse_GuildRequestAlliance,2,6,10);
|
||||||
|
packet(0x0171,30);
|
||||||
parseable_packet(0x0172,10,clif_parse_GuildReplyAlliance,2,6);
|
parseable_packet(0x0172,10,clif_parse_GuildReplyAlliance,2,6);
|
||||||
|
packet(0x0173,3);
|
||||||
packet(0x0174,-1);
|
packet(0x0174,-1);
|
||||||
packet(0x0175,6);
|
packet(0x0175,6);
|
||||||
packet(0x0176,106);
|
packet(0x0176,106);
|
||||||
@ -194,10 +213,14 @@
|
|||||||
packet(0x017b,-1);
|
packet(0x017b,-1);
|
||||||
parseable_packet(0x017c,6,clif_parse_InsertCard,2,4);
|
parseable_packet(0x017c,6,clif_parse_InsertCard,2,4);
|
||||||
parseable_packet(0x017e,-1,clif_parse_GuildMessage,2,4);
|
parseable_packet(0x017e,-1,clif_parse_GuildMessage,2,4);
|
||||||
|
packet(0x017f,-1);
|
||||||
parseable_packet(0x0180,6,clif_parse_GuildOpposition,2);
|
parseable_packet(0x0180,6,clif_parse_GuildOpposition,2);
|
||||||
|
packet(0x0181,3);
|
||||||
packet(0x0182,106);
|
packet(0x0182,106);
|
||||||
parseable_packet(0x0183,10,clif_parse_GuildDelAlliance,2,6);
|
parseable_packet(0x0183,10,clif_parse_GuildDelAlliance,2,6);
|
||||||
|
packet(0x0184,10);
|
||||||
packet(0x0185,34);
|
packet(0x0185,34);
|
||||||
|
//packet(0x0186,-1);
|
||||||
packet(0x0187,6);
|
packet(0x0187,6);
|
||||||
parseable_packet(0x018a,4,clif_parse_QuitGame,2);
|
parseable_packet(0x018a,4,clif_parse_QuitGame,2);
|
||||||
packet(0x018b,4);
|
packet(0x018b,4);
|
||||||
@ -252,6 +275,7 @@
|
|||||||
packet(0x01c6,4);
|
packet(0x01c6,4);
|
||||||
packet(0x01c7,2);
|
packet(0x01c7,2);
|
||||||
packet(0x01c9,97);
|
packet(0x01c9,97);
|
||||||
|
//packet(0x01ca,-1);
|
||||||
packet(0x01cb,9);
|
packet(0x01cb,9);
|
||||||
packet(0x01cc,9);
|
packet(0x01cc,9);
|
||||||
parseable_packet(0x01ce,6,clif_parse_AutoSpell,2);
|
parseable_packet(0x01ce,6,clif_parse_AutoSpell,2);
|
||||||
@ -285,6 +309,8 @@
|
|||||||
packet(0x01f1,-1);
|
packet(0x01f1,-1);
|
||||||
packet(0x01f2,20);
|
packet(0x01f2,20);
|
||||||
packet(0x01f3,10);
|
packet(0x01f3,10);
|
||||||
|
packet(0x01f4,32);
|
||||||
|
packet(0x01f5,9);
|
||||||
packet(0x01f6,34);
|
packet(0x01f6,34);
|
||||||
parseable_packet(0x01f7,14,clif_parse_Adopt_reply,2,6,10);
|
parseable_packet(0x01f7,14,clif_parse_Adopt_reply,2,6,10);
|
||||||
packet(0x01f8,2);
|
packet(0x01f8,2);
|
||||||
@ -293,6 +319,7 @@
|
|||||||
packet(0x01fb,56);
|
packet(0x01fb,56);
|
||||||
packet(0x01fc,-1);
|
packet(0x01fc,-1);
|
||||||
parseable_packet( HEADER_CZ_REQ_ITEMREPAIR1, sizeof( struct PACKET_CZ_REQ_ITEMREPAIR1 ), clif_parse_RepairItem, 0 );
|
parseable_packet( HEADER_CZ_REQ_ITEMREPAIR1, sizeof( struct PACKET_CZ_REQ_ITEMREPAIR1 ), clif_parse_RepairItem, 0 );
|
||||||
|
packet(0x01ff,10);
|
||||||
packet(0x0200,26);
|
packet(0x0200,26);
|
||||||
packet(0x0201,-1);
|
packet(0x0201,-1);
|
||||||
parseable_packet(0x0202,26,clif_parse_FriendsListAdd,2);
|
parseable_packet(0x0202,26,clif_parse_FriendsListAdd,2);
|
||||||
@ -304,6 +331,8 @@
|
|||||||
parseable_packet(0x0208,11,clif_parse_FriendsListReply,2,6,10);
|
parseable_packet(0x0208,11,clif_parse_FriendsListReply,2,6,10);
|
||||||
packet(0x0209,36);
|
packet(0x0209,36);
|
||||||
packet(0x020a,10);
|
packet(0x020a,10);
|
||||||
|
//packet(0x020b,-1);
|
||||||
|
//packet(0x020c,-1);
|
||||||
packet(0x020d,-1);
|
packet(0x020d,-1);
|
||||||
packet(0x8b3,-1);
|
packet(0x8b3,-1);
|
||||||
|
|
||||||
@ -992,8 +1021,14 @@
|
|||||||
packet(0x029b,80);
|
packet(0x029b,80);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// 2007-11-13aSakexe
|
||||||
|
#if PACKETVER >= 20071113
|
||||||
|
packet(0x02e1,33);
|
||||||
|
#endif
|
||||||
|
|
||||||
// 2007-11-20aSakexe
|
// 2007-11-20aSakexe
|
||||||
#if PACKETVER >= 20071120
|
#if PACKETVER >= 20071120
|
||||||
|
//packet(0x01df,10 <- ???);
|
||||||
packet(0x02e2,14);
|
packet(0x02e2,14);
|
||||||
packet(0x02e3,25);
|
packet(0x02e3,25);
|
||||||
packet(0x02e4,8);
|
packet(0x02e4,8);
|
||||||
@ -1209,6 +1244,7 @@
|
|||||||
// 2008-11-26aSakexe
|
// 2008-11-26aSakexe
|
||||||
#if PACKETVER >= 20081126
|
#if PACKETVER >= 20081126
|
||||||
packet(0x01a2,37);
|
packet(0x01a2,37);
|
||||||
|
packet(0x0441,4);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2008-12-10aSakexe
|
// 2008-12-10aSakexe
|
||||||
@ -1280,12 +1316,15 @@
|
|||||||
|
|
||||||
// 2008-11-12aRagexeRE
|
// 2008-11-12aRagexeRE
|
||||||
#if PACKETVER >= 20081112
|
#if PACKETVER >= 20081112
|
||||||
|
//packet(0x043e,-1);
|
||||||
packet(0x043f,8);
|
packet(0x043f,8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2008-12-17aRagexeRE
|
// 2008-12-17aRagexeRE
|
||||||
#if PACKETVER >= 20081217
|
#if PACKETVER >= 20081217
|
||||||
packet(0x01a2,37);
|
packet(0x01a2,37);
|
||||||
|
//packet(0x0441,4);
|
||||||
|
//packet(0x0443,8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2008-12-17bRagexeRE
|
// 2008-12-17bRagexeRE
|
||||||
@ -1296,10 +1335,39 @@
|
|||||||
// 2009-01-21aRagexeRE
|
// 2009-01-21aRagexeRE
|
||||||
#if PACKETVER >= 20090121
|
#if PACKETVER >= 20090121
|
||||||
packet(0x043f,25);
|
packet(0x043f,25);
|
||||||
|
//packet(0x0444,-1);
|
||||||
|
//packet(0x0445,10);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2009-02-18aRagexeRE
|
||||||
|
#if PACKETVER >= 20090218
|
||||||
|
//packet(0x0446,14);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2009-02-26cRagexeRE
|
||||||
|
#if PACKETVER >= 20090226
|
||||||
|
//packet(0x0448,-1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2009-04-01aRagexeRE
|
||||||
|
#if PACKETVER >= 20090401
|
||||||
|
//packet(0x0449,4);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2009-05-14aRagexeRE
|
||||||
|
#if PACKETVER >= 20090514
|
||||||
|
//packet(0x044b,2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2009-05-20aRagexeRE
|
// 2009-05-20aRagexeRE
|
||||||
#if PACKETVER >= 20090520
|
#if PACKETVER >= 20090520
|
||||||
|
//packet(0x07d0,6);
|
||||||
|
//packet(0x07d1,2);
|
||||||
|
//packet(0x07d2,-1);
|
||||||
|
//packet(0x07d3,4);
|
||||||
|
//packet(0x07d4,4);
|
||||||
|
//packet(0x07d5,4);
|
||||||
|
//packet(0x07d6,4);
|
||||||
parseable_packet( 0x0447, 2, clif_parse_blocking_playcancel, 0 );
|
parseable_packet( 0x0447, 2, clif_parse_blocking_playcancel, 0 );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1311,9 +1379,29 @@
|
|||||||
parseable_packet(0x07da,6,clif_parse_PartyChangeLeader,2);
|
parseable_packet(0x07da,6,clif_parse_PartyChangeLeader,2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// 2009-06-10aRagexeRE
|
||||||
|
#if PACKETVER >= 20090610
|
||||||
|
//packet(0x07db,8);
|
||||||
|
#endif
|
||||||
|
|
||||||
// 2009-06-17aRagexeRE
|
// 2009-06-17aRagexeRE
|
||||||
#if PACKETVER >= 20090617
|
#if PACKETVER >= 20090617
|
||||||
packet(0x07d9,268);
|
packet(0x07d9,268);
|
||||||
|
//packet(0x07dc,6);
|
||||||
|
//packet(0x07dd,54);
|
||||||
|
//packet(0x07de,30);
|
||||||
|
//packet(0x07df,54);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2009-07-01aRagexeRE
|
||||||
|
#if PACKETVER >= 20090701
|
||||||
|
//packet(0x0275,37);
|
||||||
|
//packet(0x0276,-1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2009-07-08aRagexeRE
|
||||||
|
#if PACKETVER >= 20090708
|
||||||
|
//packet(0x07e0,58);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2009-07-15aRagexeRE
|
// 2009-07-15aRagexeRE
|
||||||
@ -1335,6 +1423,7 @@
|
|||||||
|
|
||||||
// 2009-08-25aRagexeRE
|
// 2009-08-25aRagexeRE
|
||||||
#if PACKETVER >= 20090825
|
#if PACKETVER >= 20090825
|
||||||
|
//packet(0x07e6,28);
|
||||||
packet(0x07e7,5);
|
packet(0x07e7,5);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1347,6 +1436,30 @@
|
|||||||
packet(0x07e9,5);
|
packet(0x07e9,5);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// 2009-09-29aRagexeRE
|
||||||
|
#if PACKETVER >= 20090929
|
||||||
|
//packet(0x07ea,2);
|
||||||
|
//packet(0x07eb,-1);
|
||||||
|
//packet(0x07ec,6);
|
||||||
|
//packet(0x07ed,8);
|
||||||
|
//packet(0x07ee,6);
|
||||||
|
//packet(0x07ef,8);
|
||||||
|
//packet(0x07f0,4);
|
||||||
|
//packet(0x07f2,4);
|
||||||
|
//packet(0x07f3,3);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2009-10-06aRagexeRE
|
||||||
|
#if PACKETVER >= 20091006
|
||||||
|
//packet(0x07ec,8);
|
||||||
|
//packet(0x07ed,10);
|
||||||
|
//packet(0x07f0,8);
|
||||||
|
//packet(0x07f1,15);
|
||||||
|
//packet(0x07f2,6);
|
||||||
|
//packet(0x07f3,4);
|
||||||
|
//packet(0x07f4,3);
|
||||||
|
#endif
|
||||||
|
|
||||||
// 2009-10-27aRagexeRE
|
// 2009-10-27aRagexeRE
|
||||||
#if PACKETVER >= 20091027
|
#if PACKETVER >= 20091027
|
||||||
parseable_packet(0x07f5,6,clif_parse_GMFullStrip,2);
|
parseable_packet(0x07f5,6,clif_parse_GMFullStrip,2);
|
||||||
@ -1368,6 +1481,7 @@
|
|||||||
// 2009-12-01aRagexeRE
|
// 2009-12-01aRagexeRE
|
||||||
#if PACKETVER >= 20091201
|
#if PACKETVER >= 20091201
|
||||||
packet(0x07fc,10);
|
packet(0x07fc,10);
|
||||||
|
//packet(0x07ff,-1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2009-12-22aRagexeRE
|
// 2009-12-22aRagexeRE
|
||||||
@ -1377,7 +1491,12 @@
|
|||||||
packet(0x0804,8); // Booking System
|
packet(0x0804,8); // Booking System
|
||||||
packet(0x0805,-1);
|
packet(0x0805,-1);
|
||||||
parseable_packet(0x0806,4,clif_parse_PartyBookingDeleteReq,2); // Booking System
|
parseable_packet(0x0806,4,clif_parse_PartyBookingDeleteReq,2); // Booking System
|
||||||
|
//packet(0x0807,2);
|
||||||
packet(0x0808,4); // Booking System
|
packet(0x0808,4); // Booking System
|
||||||
|
//packet(0x0809,14);
|
||||||
|
//packet(0x080A,50);
|
||||||
|
//packet(0x080B,18);
|
||||||
|
//packet(0x080C,6);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2009-12-29aRagexeRE
|
// 2009-12-29aRagexeRE
|
||||||
@ -1396,20 +1515,59 @@
|
|||||||
parseable_packet( HEADER_CZ_PC_PURCHASE_ITEMLIST_FROMMC2, -1, clif_parse_PurchaseReq2, 0 );
|
parseable_packet( HEADER_CZ_PC_PURCHASE_ITEMLIST_FROMMC2, -1, clif_parse_PurchaseReq2, 0 );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// 2010-01-26aRagexeRE
|
||||||
|
#if PACKETVER >= 20100126
|
||||||
|
//packet(0x080C,2);
|
||||||
|
//packet(0x080D,3);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2010-02-09aRagexeRE
|
||||||
|
#if PACKETVER >= 20100209
|
||||||
|
//packet(0x07F0,6);
|
||||||
|
#endif
|
||||||
|
|
||||||
// 2010-03-03aRagexeRE
|
// 2010-03-03aRagexeRE
|
||||||
#if PACKETVER >= 20100303
|
#if PACKETVER >= 20100303
|
||||||
packet(0x0810,3);
|
packet(0x0810,3);
|
||||||
parseable_packet(0x0811,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
|
parseable_packet(0x0811,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
|
||||||
|
//packet(0x0812,86);
|
||||||
|
//packet(0x0815,-1);
|
||||||
|
//packet(0x0817,-1);
|
||||||
|
//packet(0x0819,4);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2010-03-09aRagexeRE
|
// 2010-03-09aRagexeRE
|
||||||
#if PACKETVER >= 20100309
|
#if PACKETVER >= 20100309
|
||||||
|
//packet(0x0815,6);
|
||||||
|
//packet(0x0819,10);
|
||||||
|
//packet(0x081A,4);
|
||||||
|
//packet(0x081B,4);
|
||||||
|
//packet(0x081C,6);
|
||||||
packet(0x081d,22);
|
packet(0x081d,22);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// 2010-03-23aRagexeRE
|
||||||
|
#if PACKETVER >= 20100323
|
||||||
|
//packet(0x081F,-1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2010-04-06aRagexeRE
|
||||||
|
#if PACKETVER >= 20100406
|
||||||
|
//packet(0x081A,6);
|
||||||
|
#endif
|
||||||
|
|
||||||
// 2010-04-13aRagexeRE
|
// 2010-04-13aRagexeRE
|
||||||
#if PACKETVER >= 20100413
|
#if PACKETVER >= 20100413
|
||||||
|
//packet(0x081A,10);
|
||||||
packet(0x0820,11);
|
packet(0x0820,11);
|
||||||
|
//packet(0x0821,2);
|
||||||
|
//packet(0x0822,9);
|
||||||
|
//packet(0x0823,-1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2010-04-14dRagexeRE
|
||||||
|
#if PACKETVER >= 20100414
|
||||||
|
//packet(0x081B,8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2010-04-20aRagexeRE
|
// 2010-04-20aRagexeRE
|
||||||
@ -1431,12 +1589,46 @@
|
|||||||
parseable_packet( HEADER_CZ_SSILIST_ITEM_CLICK, sizeof( struct PACKET_CZ_SSILIST_ITEM_CLICK ), clif_parse_SearchStoreInfoListItemClick, 0 );
|
parseable_packet( HEADER_CZ_SSILIST_ITEM_CLICK, sizeof( struct PACKET_CZ_SSILIST_ITEM_CLICK ), clif_parse_SearchStoreInfoListItemClick, 0 );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// 2010-06-15aRagexeRE
|
||||||
|
#if PACKETVER >= 20100615
|
||||||
|
//packet(0x083E,26);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2010-06-22aRagexeRE
|
||||||
|
#if PACKETVER >= 20100622
|
||||||
|
//packet(0x083F,22);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2010-06-29aRagexeRE
|
||||||
|
#if PACKETVER >= 20100629
|
||||||
|
//packet(0x07F1,18);
|
||||||
|
//packet(0x07F2,8);
|
||||||
|
//packet(0x07F3,6);
|
||||||
|
#endif
|
||||||
|
|
||||||
// 2010-07-06aRagexeRE
|
// 2010-07-06aRagexeRE
|
||||||
#if PACKETVER_MAIN_NUM >= 20100817 || PACKETVER_RE_NUM >= 20100706 || defined(PACKETVER_ZERO)
|
#if PACKETVER_MAIN_NUM >= 20100817 || PACKETVER_RE_NUM >= 20100706 || defined(PACKETVER_ZERO)
|
||||||
parseable_packet(0x0835, -1, clif_parse_SearchStoreInfo, 2, 4, 5, 9, 13, 14, 15);
|
parseable_packet(0x0835, -1, clif_parse_SearchStoreInfo, 2, 4, 5, 9, 13, 14, 15);
|
||||||
packet(HEADER_ZC_SEARCH_STORE_INFO_ACK, -1);
|
packet(HEADER_ZC_SEARCH_STORE_INFO_ACK, -1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// 2010-07-13aRagexeRE
|
||||||
|
#if PACKETVER >= 20100713
|
||||||
|
//packet(0x0827,6);
|
||||||
|
//packet(0x0828,14);
|
||||||
|
//packet(0x0829,6);
|
||||||
|
//packet(0x082A,10);
|
||||||
|
//packet(0x082B,6);
|
||||||
|
//packet(0x082C,14);
|
||||||
|
//packet(0x0840,-1);
|
||||||
|
//packet(0x0841,19);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 2010-07-14aRagexeRE
|
||||||
|
#if PACKETVER >= 20100714
|
||||||
|
//packet(0x0841,4);
|
||||||
|
#endif
|
||||||
|
|
||||||
// 2010-08-03aRagexeRE
|
// 2010-08-03aRagexeRE
|
||||||
#if PACKETVER >= 20100803
|
#if PACKETVER >= 20100803
|
||||||
parseable_packet(0x0842,6,clif_parse_GMRecall2,2);
|
parseable_packet(0x0842,6,clif_parse_GMRecall2,2);
|
||||||
@ -1482,6 +1674,7 @@
|
|||||||
parseable_packet(0x0838,6,clif_parse_SolveCharName,2);
|
parseable_packet(0x0838,6,clif_parse_SolveCharName,2);
|
||||||
parseable_packet(0x0439,8,clif_parse_UseItem,2,4);
|
parseable_packet(0x0439,8,clif_parse_UseItem,2,4);
|
||||||
packet(0x08d2,10);
|
packet(0x08d2,10);
|
||||||
|
packet(0x08d1,7);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2011-11-02aRagexe
|
// 2011-11-02aRagexe
|
||||||
@ -1714,8 +1907,10 @@
|
|||||||
parseable_packet(0x0978,6,clif_parse_reqworldinfo,2);
|
parseable_packet(0x0978,6,clif_parse_reqworldinfo,2);
|
||||||
packet(0x0979,50); //ackworldinfo
|
packet(0x0979,50); //ackworldinfo
|
||||||
parseable_packet(0x0998,8,clif_parse_EquipItem,2,4); // CZ_REQ_WEAR_EQUIP_V5
|
parseable_packet(0x0998,8,clif_parse_EquipItem,2,4); // CZ_REQ_WEAR_EQUIP_V5
|
||||||
|
packet(0x099a,9); // take_off_equipv5
|
||||||
packet(0x099b,8); //maptypeproperty2
|
packet(0x099b,8); //maptypeproperty2
|
||||||
// New Packets
|
// New Packets
|
||||||
|
packet(0x08C8,34); // ZC_NOTIFY_ACT3
|
||||||
packet(0x08ff,24); // ZC_EFST_SET_ENTER
|
packet(0x08ff,24); // ZC_EFST_SET_ENTER
|
||||||
packet(0x0984,28); // ZC_EFST_SET_ENTER2
|
packet(0x0984,28); // ZC_EFST_SET_ENTER2
|
||||||
packet(0x099f,22); // ZC_SKILL_ENTRY4
|
packet(0x099f,22); // ZC_SKILL_ENTRY4
|
||||||
@ -1744,6 +1939,7 @@
|
|||||||
// 2013-07-31cRagexe
|
// 2013-07-31cRagexe
|
||||||
#if PACKETVER >= 20130731
|
#if PACKETVER >= 20130731
|
||||||
packet(0x09ca,23); // ZC_SKILL_ENTRY5
|
packet(0x09ca,23); // ZC_SKILL_ENTRY5
|
||||||
|
packet(0x09cb,17); // ZC_USE_SKILL2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2013-08-07Ragexe
|
// 2013-08-07Ragexe
|
||||||
@ -1929,8 +2125,9 @@
|
|||||||
parseable_packet( HEADER_CZ_REQ_RANDOM_COMBINE_ITEM, -1, clif_parse_laphine_synthesis, 0 );
|
parseable_packet( HEADER_CZ_REQ_RANDOM_COMBINE_ITEM, -1, clif_parse_laphine_synthesis, 0 );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if PACKETVER_MAIN_NUM >= 20160622 || PACKETVER_RE_NUM >= 20160622 || defined(PACKETVER_ZERO)
|
// 2016-06-22aRagexeRE
|
||||||
parseable_packet( HEADER_CZ_CMD_RESETCOOLTIME, sizeof( PACKET_CZ_CMD_RESETCOOLTIME ), clif_parse_gm_resetcooltime, 0 );
|
#if PACKETVER >= 20160622
|
||||||
|
packet(0x0A84,94);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2016-10-12aRagexeRE
|
// 2016-10-12aRagexeRE
|
||||||
|
@ -847,7 +847,7 @@ int guild_recv_info(const struct mmo_guild &sg) {
|
|||||||
sd->guild = g;
|
sd->guild = g;
|
||||||
sd->state.gmaster_flag = 1;
|
sd->state.gmaster_flag = 1;
|
||||||
clif_name_area(&sd->bl); // [LuzZza]
|
clif_name_area(&sd->bl); // [LuzZza]
|
||||||
clif_guild_masterormember(*sd);
|
clif_guild_masterormember(sd);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
before = g->guild;
|
before = g->guild;
|
||||||
@ -893,10 +893,6 @@ int guild_recv_info(const struct mmo_guild &sg) {
|
|||||||
clif_guild_skillinfo( *sd ); // Submit information skills
|
clif_guild_skillinfo( *sd ); // Submit information skills
|
||||||
|
|
||||||
if (guild_new) { // Send information and affiliation if unsent
|
if (guild_new) { // Send information and affiliation if unsent
|
||||||
#if PACKETVER >= 20200902
|
|
||||||
// Clients after this version need this packet to show the guild name on alt+a
|
|
||||||
clif_guild_basicinfo( *sd );
|
|
||||||
#endif
|
|
||||||
clif_guild_belonginfo( *sd );
|
clif_guild_belonginfo( *sd );
|
||||||
clif_guild_notice( *sd );
|
clif_guild_notice( *sd );
|
||||||
sd->guild_emblem_id = g->guild.emblem_id;
|
sd->guild_emblem_id = g->guild.emblem_id;
|
||||||
@ -963,7 +959,7 @@ bool guild_invite( map_session_data& sd, map_session_data* tsd ){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Checking if there no other invitation pending
|
// Checking if there no other invitation pending
|
||||||
if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->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 );
|
clif_guild_inviteack( sd, 0 );
|
||||||
return false;
|
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(sd->state.connect_new) { //Note that this works because it is invoked in parse_LoadEndAck before connect_new is cleared.
|
||||||
#if PACKETVER >= 20200902
|
|
||||||
// Clients after this version need this packet to show the guild name on alt+a
|
|
||||||
clif_guild_basicinfo( *sd );
|
|
||||||
#endif
|
|
||||||
clif_guild_belonginfo( *sd );
|
clif_guild_belonginfo( *sd );
|
||||||
sd->guild_emblem_id = g->guild.emblem_id;
|
sd->guild_emblem_id = g->guild.emblem_id;
|
||||||
}
|
}
|
||||||
@ -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);
|
auto g = guild_search(guild_id);
|
||||||
if (!g)
|
if (!g)
|
||||||
return 0;
|
return 0;
|
||||||
clif_guild_message(g->guild,mes,len);
|
clif_guild_message(g->guild,account_id,mes,len);
|
||||||
return 0;
|
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]
|
// Check, is tsd guild master, if not - cancel alliance. [f0und3r]
|
||||||
if (battle_config.guild_alliance_onlygm && !tsd->state.gmaster_flag) {
|
if (battle_config.guild_alliance_onlygm && !tsd->state.gmaster_flag) {
|
||||||
clif_guild_allianceack(*sd, 5);
|
clif_guild_allianceack(sd, 5);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1877,23 +1869,23 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if( guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance ) {
|
if( guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance ) {
|
||||||
clif_guild_allianceack(*sd,4);
|
clif_guild_allianceack(sd,4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if( guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance ) {
|
if( guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance ) {
|
||||||
clif_guild_allianceack(*sd,3);
|
clif_guild_allianceack(sd,3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( tsd->guild_alliance>0 ){
|
if( tsd->guild_alliance>0 ){
|
||||||
clif_guild_allianceack(*sd,1);
|
clif_guild_allianceack(sd,1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < MAX_GUILDALLIANCE; i++) { // check if already allied
|
for (i = 0; i < MAX_GUILDALLIANCE; i++) { // check if already allied
|
||||||
if( g->guild.alliance[i].guild_id==tsd->status.guild_id &&
|
if( g->guild.alliance[i].guild_id==tsd->status.guild_id &&
|
||||||
g->guild.alliance[i].opposition==0){
|
g->guild.alliance[i].opposition==0){
|
||||||
clif_guild_allianceack(*sd,0);
|
clif_guild_allianceack(sd,0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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=sd->status.guild_id;
|
||||||
tsd->guild_alliance_account=sd->status.account_id;
|
tsd->guild_alliance_account=sd->status.account_id;
|
||||||
|
|
||||||
clif_guild_reqalliance(*tsd,sd->status.account_id,g->guild.name);
|
clif_guild_reqalliance(tsd,sd->status.account_id,g->guild.name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1914,7 +1906,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
|
|||||||
nullpo_ret(sd);
|
nullpo_ret(sd);
|
||||||
tsd= map_id2sd( account_id );
|
tsd= map_id2sd( account_id );
|
||||||
if (!tsd) { //Character left? Cancel alliance.
|
if (!tsd) { //Character left? Cancel alliance.
|
||||||
clif_guild_allianceack(*sd,3);
|
clif_guild_allianceack(sd,3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1928,13 +1920,13 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
|
|||||||
auto &tg = tsd->guild;
|
auto &tg = tsd->guild;
|
||||||
|
|
||||||
if (!g || guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance) {
|
if (!g || guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance) {
|
||||||
clif_guild_allianceack(*sd,4);
|
clif_guild_allianceack(sd,4);
|
||||||
clif_guild_allianceack(*tsd,3);
|
clif_guild_allianceack(tsd,3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!tg || guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance) {
|
if (!g || guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance) {
|
||||||
clif_guild_allianceack(*sd,3);
|
clif_guild_allianceack(sd,3);
|
||||||
clif_guild_allianceack(*tsd,4);
|
clif_guild_allianceack(tsd,4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1959,7 +1951,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
|
|||||||
sd->guild_alliance=0;
|
sd->guild_alliance=0;
|
||||||
sd->guild_alliance_account=0;
|
sd->guild_alliance_account=0;
|
||||||
if(tsd!=nullptr)
|
if(tsd!=nullptr)
|
||||||
clif_guild_allianceack(*tsd,3);
|
clif_guild_allianceack(tsd,3);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1996,14 +1988,14 @@ int guild_opposition(map_session_data *sd,map_session_data *tsd) {
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if( guild_get_alliance_count(g->guild,1) >= battle_config.max_guild_alliance ) {
|
if( guild_get_alliance_count(g->guild,1) >= battle_config.max_guild_alliance ) {
|
||||||
clif_guild_oppositionack(*sd,1);
|
clif_guild_oppositionack(sd,1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < MAX_GUILDALLIANCE; i++) { // checking relations
|
for (i = 0; i < MAX_GUILDALLIANCE; i++) { // checking relations
|
||||||
if(g->guild.alliance[i].guild_id==tsd->status.guild_id){
|
if(g->guild.alliance[i].guild_id==tsd->status.guild_id){
|
||||||
if (g->guild.alliance[i].opposition == 1) { // check if not already hostile
|
if (g->guild.alliance[i].opposition == 1) { // check if not already hostile
|
||||||
clif_guild_oppositionack(*sd,2);
|
clif_guild_oppositionack(sd,2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(is_agit_start()) // Prevent the changing of alliances to oppositions during WoE.
|
if(is_agit_start()) // Prevent the changing of alliances to oppositions during WoE.
|
||||||
@ -2049,7 +2041,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
|
|||||||
if (flag & 0x70) { // failure
|
if (flag & 0x70) { // failure
|
||||||
for(i=0;i<2-(flag&1);i++)
|
for(i=0;i<2-(flag&1);i++)
|
||||||
if( sd[i]!=nullptr )
|
if( sd[i]!=nullptr )
|
||||||
clif_guild_allianceack(*sd[i],((flag>>4)==i+1)?3:4);
|
clif_guild_allianceack(sd[i],((flag>>4)==i+1)?3:4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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;
|
g[i]->alliance[j].guild_id = 0;
|
||||||
}
|
}
|
||||||
if (sd[i] != nullptr) // notify players
|
if (sd[i] != nullptr) // notify players
|
||||||
clif_guild_delalliance(*sd[i],guild_id[1-i],(flag&1));
|
clif_guild_delalliance(sd[i],guild_id[1-i],(flag&1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flag & 0x0f) == 0) { // alliance notification
|
if ((flag & 0x0f) == 0) { // alliance notification
|
||||||
if( sd[1]!=nullptr )
|
if( sd[1]!=nullptr )
|
||||||
clif_guild_allianceack(*sd[1],2);
|
clif_guild_allianceack(sd[1],2);
|
||||||
} else if ((flag & 0x0f) == 1) { // enemy notification
|
} else if ((flag & 0x0f) == 1) { // enemy notification
|
||||||
if( sd[0]!=nullptr )
|
if( sd[0]!=nullptr )
|
||||||
clif_guild_oppositionack(*sd[0],0);
|
clif_guild_oppositionack(sd[0],0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -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++) {
|
for(j=0;j<g[i]->max_member;j++) {
|
||||||
map_session_data *sd_mem = g[i]->member[j].sd;
|
map_session_data *sd_mem = g[i]->member[j].sd;
|
||||||
if( sd_mem!=nullptr){
|
if( sd_mem!=nullptr){
|
||||||
clif_guild_allianceinfo(*sd_mem);
|
clif_guild_allianceinfo(sd_mem);
|
||||||
|
|
||||||
// join ally channel
|
// join ally channel
|
||||||
if( channel_config.ally_tmpl.name[0] && (channel_config.ally_tmpl.opt&CHAN_OPT_AUTOJOIN) ) {
|
if( channel_config.ally_tmpl.name[0] && (channel_config.ally_tmpl.opt&CHAN_OPT_AUTOJOIN) ) {
|
||||||
@ -2112,7 +2104,7 @@ int guild_broken_sub(struct mmo_guild &g, int guild_id) {
|
|||||||
if (g.alliance[i].guild_id == guild_id) {
|
if (g.alliance[i].guild_id == guild_id) {
|
||||||
for (int j = 0; j < g.max_member; j++) {
|
for (int j = 0; j < g.max_member; j++) {
|
||||||
if (g.member[j].sd)
|
if (g.member[j].sd)
|
||||||
clif_guild_delalliance(*g.member[j].sd, guild_id, g.alliance[i].opposition);
|
clif_guild_delalliance(g.member[j].sd, guild_id, g.alliance[i].opposition);
|
||||||
}
|
}
|
||||||
intif_guild_alliance(g.guild_id, guild_id, 0, 0, g.alliance[i].opposition | 8);
|
intif_guild_alliance(g.guild_id, guild_id, 0, 0, g.alliance[i].opposition | 8);
|
||||||
g.alliance[i].guild_id = 0;
|
g.alliance[i].guild_id = 0;
|
||||||
|
@ -279,7 +279,7 @@ int hom_vaporize(map_session_data *sd, int flag)
|
|||||||
if (!hd || hd->homunculus.vaporize)
|
if (!hd || hd->homunculus.vaporize)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (status_isdead(hd->bl))
|
if (status_isdead(&hd->bl))
|
||||||
return 0; //Can't vaporize a dead homun.
|
return 0; //Can't vaporize a dead homun.
|
||||||
|
|
||||||
if (flag == HOM_ST_REST && get_percentage(hd->battle_status.hp, hd->battle_status.max_hp) < 80)
|
if (flag == HOM_ST_REST && get_percentage(hd->battle_status.hp, hd->battle_status.max_hp) < 80)
|
||||||
@ -1280,7 +1280,7 @@ int hom_ressurect(map_session_data* sd, unsigned char per, short x, short y)
|
|||||||
if (hd->homunculus.vaporize == HOM_ST_REST)
|
if (hd->homunculus.vaporize == HOM_ST_REST)
|
||||||
return 0; // vaporized homunculi need to be 'called'
|
return 0; // vaporized homunculi need to be 'called'
|
||||||
|
|
||||||
if (!status_isdead(hd->bl))
|
if (!status_isdead(&hd->bl))
|
||||||
return 0; // already alive
|
return 0; // already alive
|
||||||
|
|
||||||
hom_init_timers(hd);
|
hom_init_timers(hd);
|
||||||
|
@ -2843,6 +2843,7 @@ enum e_random_item_group {
|
|||||||
IG_COSTUMEMILEPACK_35_1,
|
IG_COSTUMEMILEPACK_35_1,
|
||||||
IG_COSTUMEMILEPACK_35_2,
|
IG_COSTUMEMILEPACK_35_2,
|
||||||
IG_COSTUMEMILEPACK_35_3,
|
IG_COSTUMEMILEPACK_35_3,
|
||||||
|
IG_D_GW_EXTRACTOR,
|
||||||
|
|
||||||
IG_MAX,
|
IG_MAX,
|
||||||
};
|
};
|
||||||
|
@ -67,7 +67,7 @@ void map_msg_reload(void);
|
|||||||
#define NATURAL_HEAL_INTERVAL 500
|
#define NATURAL_HEAL_INTERVAL 500
|
||||||
#define MIN_FLOORITEM 2
|
#define MIN_FLOORITEM 2
|
||||||
#define MAX_FLOORITEM START_ACCOUNT_NUM
|
#define MAX_FLOORITEM START_ACCOUNT_NUM
|
||||||
#define MAX_LEVEL 275
|
#define MAX_LEVEL 260
|
||||||
#define MAX_DROP_PER_MAP 48
|
#define MAX_DROP_PER_MAP 48
|
||||||
#define MAX_IGNORE_LIST 20 // official is 14
|
#define MAX_IGNORE_LIST 20 // official is 14
|
||||||
#define MAX_VENDING 12
|
#define MAX_VENDING 12
|
||||||
@ -677,6 +677,8 @@ enum e_mapflag : int16 {
|
|||||||
MF_NODYNAMICNPC,
|
MF_NODYNAMICNPC,
|
||||||
MF_NOBANK,
|
MF_NOBANK,
|
||||||
MF_SPECIALPOPUP,
|
MF_SPECIALPOPUP,
|
||||||
|
MF_NOLOOTNORMALMOB,
|
||||||
|
MF_NO_NPC_SELFDESTRUCTION_ON_ALL,
|
||||||
MF_MAX
|
MF_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1443,7 +1443,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,t_tick tick)
|
|||||||
|
|
||||||
bl=map_id2bl(md->master_id);
|
bl=map_id2bl(md->master_id);
|
||||||
|
|
||||||
if (!bl || status_isdead(*bl)) {
|
if (!bl || status_isdead(bl)) {
|
||||||
status_kill(&md->bl);
|
status_kill(&md->bl);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1934,7 +1934,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick)
|
|||||||
|
|
||||||
if (pcdb_checkid(md->vd->class_))
|
if (pcdb_checkid(md->vd->class_))
|
||||||
{ //Give them walk act/delay to properly mimic players. [Skotlex]
|
{ //Give them walk act/delay to properly mimic players. [Skotlex]
|
||||||
clif_takeitem(md->bl,*tbl);
|
clif_takeitem(&md->bl,tbl);
|
||||||
md->ud.canact_tick = tick + md->status.amotion;
|
md->ud.canact_tick = tick + md->status.amotion;
|
||||||
unit_set_walkdelay(&md->bl, tick, md->status.amotion, 1);
|
unit_set_walkdelay(&md->bl, tick, md->status.amotion, 1);
|
||||||
}
|
}
|
||||||
@ -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
|
!md->special_state.ai || //Non special mob
|
||||||
battle_config.alchemist_summon_reward == 2 || //All summoned give drops
|
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.
|
(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)
|
if (md2->state.copy_master_mode)
|
||||||
md->status.mode = md2->status.mode;
|
md->status.mode = md2->status.mode;
|
||||||
|
|
||||||
clif_skill_nodamage(&md->bl,md->bl,skill_id,amount);
|
clif_skill_nodamage(&md->bl,&md->bl,skill_id,amount,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1528,11 +1528,6 @@ enum e_job_types
|
|||||||
JT_4_EP21_TAN_S,
|
JT_4_EP21_TAN_S,
|
||||||
|
|
||||||
JT_4_M_VACATION_MARAM = 10595,
|
JT_4_M_VACATION_MARAM = 10595,
|
||||||
JT_4_CLB_SS_FC,
|
|
||||||
JT_4_CLB_SS_TZ,
|
|
||||||
JT_4_CLB_SS_AJ,
|
|
||||||
JT_4_CLB_SS_LK,
|
|
||||||
JT_4_SMART_ANDRE,
|
|
||||||
|
|
||||||
JT_ROZ_MQ_XAVIER = 13000,
|
JT_ROZ_MQ_XAVIER = 13000,
|
||||||
JT_ROZ_MQ_MOCLORD,
|
JT_ROZ_MQ_MOCLORD,
|
||||||
@ -1552,7 +1547,7 @@ enum e_job_types
|
|||||||
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
|
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
|
||||||
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
|
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
|
||||||
|
|
||||||
//Checks if a given id is a valid npc id.
|
//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)
|
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
|
||||||
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )
|
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )
|
||||||
|
|
||||||
|
@ -32,12 +32,6 @@
|
|||||||
#pragma pack( push, 1 )
|
#pragma pack( push, 1 )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct PACKET_ZC_USER_COUNT{
|
|
||||||
uint16 packetType;
|
|
||||||
int32 playersCount;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_USER_COUNT, 0xc2)
|
|
||||||
|
|
||||||
struct PACKET_ZC_PC_PURCHASE_RESULT{
|
struct PACKET_ZC_PC_PURCHASE_RESULT{
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint8 result;
|
uint8 result;
|
||||||
@ -362,38 +356,6 @@ struct PACKET_ZC_ACK_OPEN_BANKING{
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_ACK_OPEN_BANKING, 0x9b7)
|
DEFINE_PACKET_HEADER(ZC_ACK_OPEN_BANKING, 0x9b7)
|
||||||
|
|
||||||
#if PACKETVER > 6
|
|
||||||
struct PACKET_ZC_REQ_EXCHANGE_ITEM{
|
|
||||||
uint16 packetType;
|
|
||||||
char requesterName[NAME_LENGTH];
|
|
||||||
uint32 targetId;
|
|
||||||
uint16 targetLv;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x1f4)
|
|
||||||
#else
|
|
||||||
struct PACKET_ZC_REQ_EXCHANGE_ITEM{
|
|
||||||
uint16 packetType;
|
|
||||||
char requesterName[NAME_LENGTH];
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x9a)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PACKETVER > 6
|
|
||||||
struct PACKET_ZC_ACK_EXCHANGE_ITEM{
|
|
||||||
uint16 packetType;
|
|
||||||
uint8 result;
|
|
||||||
uint32 targetId;
|
|
||||||
uint16 targetLv;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0x1f5)
|
|
||||||
#else
|
|
||||||
struct PACKET_ZC_ACK_EXCHANGE_ITEM{
|
|
||||||
uint16 packetType;
|
|
||||||
uint8 result;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0xe7)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct PACKET_ZC_ACK_ADD_EXCHANGE_ITEM {
|
struct PACKET_ZC_ACK_ADD_EXCHANGE_ITEM {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint16 index;
|
uint16 index;
|
||||||
@ -667,14 +629,6 @@ struct PACKET_ZC_NOTIFY_PLAYERMOVE {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_PLAYERMOVE, 0x87);
|
DEFINE_PACKET_HEADER(ZC_NOTIFY_PLAYERMOVE, 0x87);
|
||||||
|
|
||||||
struct PACKET_ZC_CHANGE_DIRECTION{
|
|
||||||
int16 packetType;
|
|
||||||
uint32 srcId;
|
|
||||||
uint16 headDir;
|
|
||||||
uint8 dir;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_CHANGE_DIRECTION, 0x9c)
|
|
||||||
|
|
||||||
struct PACKET_ZC_NPCACK_MAPMOVE {
|
struct PACKET_ZC_NPCACK_MAPMOVE {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
char mapName[MAP_NAME_LENGTH_EXT];
|
char mapName[MAP_NAME_LENGTH_EXT];
|
||||||
@ -760,32 +714,6 @@ struct PACKET_ZC_OPEN_EDITDLGSTR {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_OPEN_EDITDLGSTR, 0x1d4)
|
DEFINE_PACKET_HEADER(ZC_OPEN_EDITDLGSTR, 0x1d4)
|
||||||
|
|
||||||
struct PACKET_ZC_ACK_REQ_ALLY_GUILD {
|
|
||||||
int16 packetType;
|
|
||||||
uint8 flag;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_ACK_REQ_ALLY_GUILD, 0x173)
|
|
||||||
|
|
||||||
struct PACKET_ZC_DELETE_RELATED_GUILD {
|
|
||||||
int16 packetType;
|
|
||||||
uint32 allyID;
|
|
||||||
uint32 flag;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_DELETE_RELATED_GUILD, 0x184)
|
|
||||||
|
|
||||||
struct PACKET_ZC_REQ_ALLY_GUILD {
|
|
||||||
int16 packetType;
|
|
||||||
uint32 inviterId;
|
|
||||||
char inviterGuildName[NAME_LENGTH];
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_REQ_ALLY_GUILD, 0x171)
|
|
||||||
|
|
||||||
struct PACKET_ZC_ACK_REQ_HOSTILE_GUILD {
|
|
||||||
int16 packetType;
|
|
||||||
uint8 flag;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_ACK_REQ_HOSTILE_GUILD, 0x181)
|
|
||||||
|
|
||||||
struct PACKET_ZC_COMPASS {
|
struct PACKET_ZC_COMPASS {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint32 npcId;
|
uint32 npcId;
|
||||||
@ -817,12 +745,6 @@ struct PACKET_ZC_CARTOFF {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_CARTOFF, 0x12b)
|
DEFINE_PACKET_HEADER(ZC_CARTOFF, 0x12b)
|
||||||
|
|
||||||
struct PACKET_ZC_ACK_GUILD_MENUINTERFACE {
|
|
||||||
int16 packetType;
|
|
||||||
int menuFlag;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_ACK_GUILD_MENUINTERFACE, 0x014e)
|
|
||||||
|
|
||||||
struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM {
|
struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint32 aid;
|
uint32 aid;
|
||||||
@ -831,13 +753,6 @@ struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_POSITION_TO_GUILDM, 0x1eb)
|
DEFINE_PACKET_HEADER(ZC_NOTIFY_POSITION_TO_GUILDM, 0x1eb)
|
||||||
|
|
||||||
struct PACKET_ZC_GUILD_CHAT {
|
|
||||||
int16 packetType;
|
|
||||||
int16 packetLength;
|
|
||||||
char message[];
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_GUILD_CHAT, 0x17f)
|
|
||||||
|
|
||||||
struct PACKET_ZC_STATUS {
|
struct PACKET_ZC_STATUS {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint16 point;
|
uint16 point;
|
||||||
@ -917,50 +832,12 @@ struct PACKET_ZC_PAR_CHANGE_USER {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_PAR_CHANGE_USER, 0x1ab)
|
DEFINE_PACKET_HEADER(ZC_PAR_CHANGE_USER, 0x1ab)
|
||||||
|
|
||||||
struct PACKET_ZC_CHANGE_CHATROOM{
|
|
||||||
uint16 packetType;
|
|
||||||
uint16 packetSize;
|
|
||||||
uint32 ownerId;
|
|
||||||
uint32 chatId;
|
|
||||||
uint16 limit;
|
|
||||||
uint16 users;
|
|
||||||
uint8 flag;
|
|
||||||
char title[];
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_CHANGE_CHATROOM, 0xdf);
|
|
||||||
|
|
||||||
struct PACKET_ZC_EQUIP_ARROW {
|
struct PACKET_ZC_EQUIP_ARROW {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint16 index;
|
uint16 index;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_EQUIP_ARROW, 0x13c)
|
DEFINE_PACKET_HEADER(ZC_EQUIP_ARROW, 0x13c)
|
||||||
|
|
||||||
#if PACKETVER >= 20130000
|
|
||||||
struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{
|
|
||||||
uint16 packetType;
|
|
||||||
uint16 index;
|
|
||||||
uint32 wearLocation;
|
|
||||||
uint8 flag;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0x99a)
|
|
||||||
#elif PACKETVER >= 20110824
|
|
||||||
struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{
|
|
||||||
uint16 packetType;
|
|
||||||
uint16 index;
|
|
||||||
uint16 wearLocation;
|
|
||||||
uint8 flag;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0x8d1)
|
|
||||||
#else
|
|
||||||
struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{
|
|
||||||
uint16 packetType;
|
|
||||||
uint16 index;
|
|
||||||
uint16 wearLocation;
|
|
||||||
bool flag;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0xac)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct PACKET_ZC_CLOSE_STORE {
|
struct PACKET_ZC_CLOSE_STORE {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
@ -1015,25 +892,6 @@ struct PACKET_ZC_REFUSE_ENTER_ROOM {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_REFUSE_ENTER_ROOM, 0xda);
|
DEFINE_PACKET_HEADER(ZC_REFUSE_ENTER_ROOM, 0xda);
|
||||||
|
|
||||||
struct PACKET_ZC_DESTROY_ROOM {
|
|
||||||
int16 packetType;
|
|
||||||
uint32 chatId;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_DESTROY_ROOM, 0xd8);
|
|
||||||
|
|
||||||
struct PACKET_ZC_ENTER_ROOM_sub{
|
|
||||||
uint32 flag;
|
|
||||||
char name[NAME_LENGTH];
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
struct PACKET_ZC_ENTER_ROOM{
|
|
||||||
uint16 packetType;
|
|
||||||
uint16 packetSize;
|
|
||||||
uint32 chatId;
|
|
||||||
PACKET_ZC_ENTER_ROOM_sub members[];
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_ENTER_ROOM, 0xdb);
|
|
||||||
|
|
||||||
struct PACKET_ZC_NPC_SHOWEFST_UPDATE {
|
struct PACKET_ZC_NPC_SHOWEFST_UPDATE {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint32 gid;
|
uint32 gid;
|
||||||
@ -1118,26 +976,12 @@ struct PACKET_ZC_SKILL_DISAPPEAR {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120);
|
DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120);
|
||||||
|
|
||||||
struct PACKET_ZC_SKILLINFO_DELETE {
|
|
||||||
uint16 packetType;
|
|
||||||
uint16 skillID;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_SKILLINFO_DELETE, 0x441);
|
|
||||||
|
|
||||||
struct PACKET_ZC_SKILL_UPDATE {
|
struct PACKET_ZC_SKILL_UPDATE {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint32 GID;
|
uint32 GID;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_SKILL_UPDATE, 0x1ac);
|
DEFINE_PACKET_HEADER(ZC_SKILL_UPDATE, 0x1ac);
|
||||||
|
|
||||||
struct PACKET_ZC_HIGHJUMP{
|
|
||||||
uint16 packetType;
|
|
||||||
uint32 srcId;
|
|
||||||
uint16 x;
|
|
||||||
uint16 y;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_HIGHJUMP, 0x01ff);
|
|
||||||
|
|
||||||
#if PACKETVER >= 20141022
|
#if PACKETVER >= 20141022
|
||||||
struct PACKET_ZC_RECOVERY {
|
struct PACKET_ZC_RECOVERY {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
@ -1317,51 +1161,6 @@ struct PACKET_ZC_EL_PAR_CHANGE {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_EL_PAR_CHANGE, 0x81e);
|
DEFINE_PACKET_HEADER(ZC_EL_PAR_CHANGE, 0x81e);
|
||||||
|
|
||||||
#if PACKETVER >= 20131223
|
|
||||||
struct PACKET_ZC_NOTIFY_ACT{
|
|
||||||
int16 packetType;
|
|
||||||
int32 srcID;
|
|
||||||
int32 targetID;
|
|
||||||
int32 serverTick;
|
|
||||||
int32 srcSpeed;
|
|
||||||
int32 dmgSpeed;
|
|
||||||
int32 damage;
|
|
||||||
int8 isSPDamage;
|
|
||||||
uint16 div;
|
|
||||||
uint8 type;
|
|
||||||
int32 damage2;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8c8);
|
|
||||||
#elif PACKETVER >= 20071113
|
|
||||||
struct PACKET_ZC_NOTIFY_ACT{
|
|
||||||
int16 packetType;
|
|
||||||
int32 srcID;
|
|
||||||
int32 targetID;
|
|
||||||
int32 serverTick;
|
|
||||||
int32 srcSpeed;
|
|
||||||
int32 dmgSpeed;
|
|
||||||
int32 damage;
|
|
||||||
uint16 div;
|
|
||||||
uint8 type;
|
|
||||||
int32 damage2;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x2e1);
|
|
||||||
#else
|
|
||||||
struct PACKET_ZC_NOTIFY_ACT{
|
|
||||||
int16 packetType;
|
|
||||||
int32 srcID;
|
|
||||||
int32 targetID;
|
|
||||||
int32 serverTick;
|
|
||||||
int32 srcSpeed;
|
|
||||||
int32 dmgSpeed;
|
|
||||||
int16 damage;
|
|
||||||
uint16 div;
|
|
||||||
uint8 type;
|
|
||||||
int16 damage2;
|
|
||||||
} __attribute__((packed));
|
|
||||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
|
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
|
||||||
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
|
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
|
||||||
#pragma pack( pop )
|
#pragma pack( pop )
|
||||||
@ -1407,12 +1206,6 @@ DEFINE_PACKET_HEADER(CZ_REQ_STYLE_CHANGE2, 0xafc)
|
|||||||
DEFINE_PACKET_HEADER(ZC_REMOVE_EFFECT, 0x0b0d)
|
DEFINE_PACKET_HEADER(ZC_REMOVE_EFFECT, 0x0b0d)
|
||||||
DEFINE_PACKET_HEADER(ZC_FEED_MER, 0x22f)
|
DEFINE_PACKET_HEADER(ZC_FEED_MER, 0x22f)
|
||||||
DEFINE_PACKET_HEADER(ZC_FEED_PET, 0x1a3)
|
DEFINE_PACKET_HEADER(ZC_FEED_PET, 0x1a3)
|
||||||
#if PACKETVER_MAIN_NUM >= 20170502 || PACKETVER_RE_NUM >= 20170419 || defined(PACKETVER_ZERO)
|
|
||||||
DEFINE_PACKET_HEADER(ZC_WARPLIST, 0xabe)
|
|
||||||
#else
|
|
||||||
DEFINE_PACKET_HEADER(ZC_WARPLIST, 0x11c)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
const int16 MAX_INVENTORY_ITEM_PACKET_NORMAL = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_normal ) - ( sizeof( struct NORMALITEM_INFO ) * MAX_ITEMLIST) ) ) / sizeof( struct NORMALITEM_INFO ) );
|
const int16 MAX_INVENTORY_ITEM_PACKET_NORMAL = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_normal ) - ( sizeof( struct NORMALITEM_INFO ) * MAX_ITEMLIST) ) ) / sizeof( struct NORMALITEM_INFO ) );
|
||||||
const int16 MAX_INVENTORY_ITEM_PACKET_EQUIP = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_equip ) - ( sizeof( struct EQUIPITEM_INFO ) * MAX_ITEMLIST ) ) ) / sizeof( struct EQUIPITEM_INFO ) );
|
const int16 MAX_INVENTORY_ITEM_PACKET_EQUIP = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_equip ) - ( sizeof( struct EQUIPITEM_INFO ) * MAX_ITEMLIST ) ) ) / sizeof( struct EQUIPITEM_INFO ) );
|
||||||
|
@ -4998,17 +4998,15 @@ struct PACKET_ZC_POSITION_ID_NAME_INFO {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
|
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
|
||||||
|
|
||||||
struct PACKET_ZC_POSITION_INFO_sub {
|
struct PACKET_ZC_POSITION_INFO {
|
||||||
|
int16 PacketType;
|
||||||
|
int16 PacketLength;
|
||||||
|
struct {
|
||||||
int positionID;
|
int positionID;
|
||||||
int right;
|
int right;
|
||||||
int ranking;
|
int ranking;
|
||||||
int payRate;
|
int payRate;
|
||||||
} __attribute__((packed));
|
} posInfo[MAX_GUILDPOSITION];
|
||||||
|
|
||||||
struct PACKET_ZC_POSITION_INFO {
|
|
||||||
int16 PacketType;
|
|
||||||
int16 PacketLength;
|
|
||||||
struct PACKET_ZC_POSITION_INFO_sub posInfo[];
|
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160);
|
DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160);
|
||||||
|
|
||||||
|
@ -446,7 +446,7 @@ bool party_invite( map_session_data& sd, map_session_data *tsd ){
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->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 );
|
clif_party_invite_reply( sd, tsd->status.name, PARTY_REPLY_JOIN_OTHER_PARTY );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1801,35 +1801,13 @@ uint8 pc_isequip(map_session_data *sd,int n)
|
|||||||
|
|
||||||
if(item == nullptr)
|
if(item == nullptr)
|
||||||
return ITEM_EQUIP_ACK_FAIL;
|
return ITEM_EQUIP_ACK_FAIL;
|
||||||
|
if(item->elv && sd->status.base_level < (unsigned int)item->elv)
|
||||||
if (sd->sc.count && sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SUPERNOVICE) {
|
|
||||||
//Spirit of Super Novice equip bonuses. [Skotlex]
|
|
||||||
if (sd->status.base_level >= 90 && item->equip & EQP_HELM)
|
|
||||||
return ITEM_EQUIP_ACK_OK; //Can equip all helms
|
|
||||||
|
|
||||||
if (sd->status.base_level >= 96 && item->equip & EQP_ARMS && item->type == IT_WEAPON && item->weapon_level == 4)
|
|
||||||
switch (item->subtype) { //In weapons, the look determines type of weapon.
|
|
||||||
case W_DAGGER: //All level 4 - Daggers
|
|
||||||
case W_1HSWORD: //All level 4 - 1H Swords
|
|
||||||
case W_1HAXE: //All level 4 - 1H Axes
|
|
||||||
case W_MACE: //All level 4 - 1H Maces
|
|
||||||
case W_STAFF: //All level 4 - 1H Staves
|
|
||||||
case W_2HSTAFF: //All level 4 - 2H Staves
|
|
||||||
return ITEM_EQUIP_ACK_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(item->elv && sd->status.base_level < static_cast<unsigned int>(item->elv))
|
|
||||||
return ITEM_EQUIP_ACK_FAILLEVEL;
|
return ITEM_EQUIP_ACK_FAILLEVEL;
|
||||||
if(item->elvmax && sd->status.base_level > static_cast<unsigned int>(item->elvmax))
|
if(item->elvmax && sd->status.base_level > (unsigned int)item->elvmax)
|
||||||
return ITEM_EQUIP_ACK_FAILLEVEL;
|
return ITEM_EQUIP_ACK_FAILLEVEL;
|
||||||
if(item->sex != SEX_BOTH && sd->status.sex != item->sex)
|
if(item->sex != SEX_BOTH && sd->status.sex != item->sex)
|
||||||
return ITEM_EQUIP_ACK_FAIL;
|
return ITEM_EQUIP_ACK_FAIL;
|
||||||
|
|
||||||
// Broken equip
|
|
||||||
if (sd->inventory.u.items_inventory[n].attribute == 1)
|
|
||||||
return ITEM_EQUIP_ACK_FAIL;
|
|
||||||
|
|
||||||
//fail to equip if item is restricted
|
//fail to equip if item is restricted
|
||||||
if (!battle_config.allow_equip_restricted_item && itemdb_isNoEquip(item, sd->bl.m))
|
if (!battle_config.allow_equip_restricted_item && itemdb_isNoEquip(item, sd->bl.m))
|
||||||
return ITEM_EQUIP_ACK_FAIL;
|
return ITEM_EQUIP_ACK_FAIL;
|
||||||
@ -1896,6 +1874,23 @@ uint8 pc_isequip(map_session_data *sd,int n)
|
|||||||
return ITEM_EQUIP_ACK_FAIL;
|
return ITEM_EQUIP_ACK_FAIL;
|
||||||
if(item->equip && (sd->sc.getSCE(SC_KYOUGAKU) || sd->sc.getSCE(SC_SUHIDE)))
|
if(item->equip && (sd->sc.getSCE(SC_KYOUGAKU) || sd->sc.getSCE(SC_SUHIDE)))
|
||||||
return ITEM_EQUIP_ACK_FAIL;
|
return ITEM_EQUIP_ACK_FAIL;
|
||||||
|
|
||||||
|
if (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SUPERNOVICE) {
|
||||||
|
//Spirit of Super Novice equip bonuses. [Skotlex]
|
||||||
|
if (sd->status.base_level > 90 && item->equip & EQP_HELM)
|
||||||
|
return ITEM_EQUIP_ACK_OK; //Can equip all helms
|
||||||
|
|
||||||
|
if (sd->status.base_level > 96 && item->equip & EQP_ARMS && item->type == IT_WEAPON && item->weapon_level == 4)
|
||||||
|
switch(item->subtype) { //In weapons, the look determines type of weapon.
|
||||||
|
case W_DAGGER: //All level 4 - Daggers
|
||||||
|
case W_1HSWORD: //All level 4 - 1H Swords
|
||||||
|
case W_1HAXE: //All level 4 - 1H Axes
|
||||||
|
case W_MACE: //All level 4 - 1H Maces
|
||||||
|
case W_STAFF: //All level 4 - 1H Staves
|
||||||
|
case W_2HSTAFF: //All level 4 - 2H Staves
|
||||||
|
return ITEM_EQUIP_ACK_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Not equipable by class. [Skotlex]
|
//Not equipable by class. [Skotlex]
|
||||||
@ -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;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
if (level == 0) { //Remove skill.
|
if (level == 0) { //Remove skill.
|
||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
clif_deleteskill(*sd,skill_id);
|
clif_deleteskill(sd,skill_id);
|
||||||
} else
|
} else
|
||||||
clif_addskill(sd,skill_id);
|
clif_addskill(sd,skill_id);
|
||||||
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
||||||
@ -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;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERM_GRANTED;
|
||||||
if (level == 0) { //Remove skill.
|
if (level == 0) { //Remove skill.
|
||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
clif_deleteskill(*sd,skill_id);
|
clif_deleteskill(sd,skill_id);
|
||||||
} else
|
} else
|
||||||
clif_addskill(sd,skill_id);
|
clif_addskill(sd,skill_id);
|
||||||
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
||||||
@ -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].id = 0;
|
||||||
sd.status.skill[idx].lv = 0;
|
sd.status.skill[idx].lv = 0;
|
||||||
sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(sd, skill_id);
|
clif_deleteskill(&sd, skill_id);
|
||||||
|
|
||||||
if (type == 1) {
|
if (type == 1) {
|
||||||
sd.cloneskill_idx = 0;
|
sd.cloneskill_idx = 0;
|
||||||
@ -6133,7 +6128,7 @@ bool pc_takeitem(map_session_data *sd,struct flooritem_data *fitem)
|
|||||||
|
|
||||||
//Display pickup animation.
|
//Display pickup animation.
|
||||||
pc_stop_attack(sd);
|
pc_stop_attack(sd);
|
||||||
clif_takeitem(sd->bl,fitem->bl);
|
clif_takeitem(&sd->bl,&fitem->bl);
|
||||||
|
|
||||||
if (fitem->mob_id &&
|
if (fitem->mob_id &&
|
||||||
(itemdb_search(fitem->item.nameid))->flag.broadcast &&
|
(itemdb_search(fitem->item.nameid))->flag.broadcast &&
|
||||||
@ -6680,6 +6675,7 @@ bool pc_steal_item(map_session_data *sd,struct block_list *bl, uint16 skill_lv)
|
|||||||
t_itemid itemid;
|
t_itemid itemid;
|
||||||
double rate;
|
double rate;
|
||||||
unsigned char flag = 0;
|
unsigned char flag = 0;
|
||||||
|
struct status_data *sd_status, *md_status;
|
||||||
struct mob_data *md;
|
struct mob_data *md;
|
||||||
|
|
||||||
if(!sd || !bl || bl->type!=BL_MOB)
|
if(!sd || !bl || bl->type!=BL_MOB)
|
||||||
@ -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
|
if(md->state.steal_flag == UCHAR_MAX || ( md->sc.opt1 && md->sc.opt1 != OPT1_BURNING ) ) //already stolen from / status change check
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
status_data* sd_status = status_get_status_data(sd->bl);
|
sd_status= status_get_status_data(&sd->bl);
|
||||||
status_data* md_status = status_get_status_data(*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) ||
|
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]
|
(battle_config.skill_steal_max_tries && //Reached limit of steal attempts. [Lupus]
|
||||||
md->state.steal_flag++ >= battle_config.skill_steal_max_tries)
|
md->state.steal_flag++ >= battle_config.skill_steal_max_tries)
|
||||||
) { //Can't steal from
|
) { //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;
|
int bonus = 0, vip_bonus_base = 0, vip_bonus_job = 0;
|
||||||
|
|
||||||
if (src) {
|
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] )
|
if( sd->indexed_bonus.expaddrace[status->race] )
|
||||||
bonus += 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
|
else
|
||||||
pc_delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME);
|
pc_delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME);
|
||||||
|
|
||||||
clif_skill_nodamage(&sd->bl, sd->bl, ALL_RESURRECTION, 4);
|
clif_skill_nodamage(&sd->bl, &sd->bl, ALL_RESURRECTION, 4, 1);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -11921,7 +11917,7 @@ bool pc_equipitem(map_session_data *sd,short n,int req_pos,bool equipswitch)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(pos&req_pos) || sd->inventory.u.items_inventory[n].equip != 0) {
|
if (!(pos&req_pos) || sd->inventory.u.items_inventory[n].equip != 0 || sd->inventory.u.items_inventory[n].attribute==1 ) { // [Valaris]
|
||||||
if( equipswitch ){
|
if( equipswitch ){
|
||||||
clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
|
clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
|
||||||
}else{
|
}else{
|
||||||
@ -12262,18 +12258,18 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
|
|||||||
nullpo_retr(false,sd);
|
nullpo_retr(false,sd);
|
||||||
|
|
||||||
if (n < 0 || n >= MAX_INVENTORY) {
|
if (n < 0 || n >= MAX_INVENTORY) {
|
||||||
clif_unequipitemack(*sd,0,0,false);
|
clif_unequipitemack(sd,0,0,0);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(pos = sd->inventory.u.items_inventory[n].equip)) {
|
if (!(pos = sd->inventory.u.items_inventory[n].equip)) {
|
||||||
clif_unequipitemack(*sd,n,0,false);
|
clif_unequipitemack(sd,n,0,0);
|
||||||
return false; //Nothing to unequip
|
return false; //Nothing to unequip
|
||||||
}
|
}
|
||||||
// status change that makes player cannot unequip equipment
|
// status change that makes player cannot unequip equipment
|
||||||
if (!(flag&2) && sd->sc.count &&( sd->sc.cant.unequip ||
|
if (!(flag&2) && sd->sc.count &&( sd->sc.cant.unequip ||
|
||||||
(sd->sc.getSCE(SC_PYROCLASTIC) && sd->inventory_data[n]->type == IT_WEAPON))) // can't switch weapon
|
(sd->sc.getSCE(SC_PYROCLASTIC) && sd->inventory_data[n]->type == IT_WEAPON))) // can't switch weapon
|
||||||
{
|
{
|
||||||
clif_unequipitemack(*sd,n,0,false);
|
clif_unequipitemack(sd,n,0,0);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12312,7 +12308,7 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
|
|||||||
if(pos & EQP_SHOES)
|
if(pos & EQP_SHOES)
|
||||||
clif_changelook(&sd->bl,LOOK_SHOES,0);
|
clif_changelook(&sd->bl,LOOK_SHOES,0);
|
||||||
|
|
||||||
clif_unequipitemack(*sd,n,pos,true);
|
clif_unequipitemack(sd,n,pos,1);
|
||||||
pc_set_costume_view(sd);
|
pc_set_costume_view(sd);
|
||||||
|
|
||||||
status_db.removeByStatusFlag(&sd->bl, { SCF_REMOVEONUNEQUIP });
|
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) {
|
if (idx >= 0) {
|
||||||
sd->equip_index[EQI_AMMO] = -1;
|
sd->equip_index[EQI_AMMO] = -1;
|
||||||
clif_unequipitemack(*sd, idx, sd->inventory.u.items_inventory[idx].equip, true);
|
clif_unequipitemack(sd, idx, sd->inventory.u.items_inventory[idx].equip, 1);
|
||||||
pc_unequipitem_sub(sd, idx, 0);
|
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);
|
status_change_end(&sd->bl, SC_TENSIONRELAX);
|
||||||
clif_status_load(&sd->bl,EFST_SIT,0);
|
clif_status_load(&sd->bl,EFST_SIT,0);
|
||||||
clif_standing(sd->bl); //Inform area PC is standing
|
clif_standing(&sd->bl); //Inform area PC is standing
|
||||||
//Reset sitting tick.
|
//Reset sitting tick.
|
||||||
sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0;
|
sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0;
|
||||||
if( pc_isdead( sd ) ){
|
if( pc_isdead( sd ) ){
|
||||||
|
@ -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 united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united.
|
||||||
int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign.
|
int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign.
|
||||||
|
|
||||||
struct{
|
int trade_partner;
|
||||||
uint32 id;
|
|
||||||
unsigned int lv;
|
|
||||||
}trade_partner;
|
|
||||||
|
|
||||||
struct s_deal {
|
struct s_deal {
|
||||||
struct s_item {
|
struct s_item {
|
||||||
short index, amount;
|
short index, amount;
|
||||||
@ -1236,7 +1232,7 @@ enum e_mado_type : uint16 {
|
|||||||
#define pc_rightside_def(sd) ((sd)->battle_status.def)
|
#define pc_rightside_def(sd) ((sd)->battle_status.def)
|
||||||
#define pc_leftside_mdef(sd) ((sd)->battle_status.mdef2)
|
#define pc_leftside_mdef(sd) ((sd)->battle_status.mdef2)
|
||||||
#define pc_rightside_mdef(sd) ((sd)->battle_status.mdef)
|
#define pc_rightside_mdef(sd) ((sd)->battle_status.mdef)
|
||||||
#define pc_leftside_matk(sd) (status_base_matk_min(&(sd)->bl, status_get_status_data((sd)->bl), (sd)->status.base_level))
|
#define pc_leftside_matk(sd) (status_base_matk_min(&(sd)->bl, status_get_status_data(&(sd)->bl), (sd)->status.base_level))
|
||||||
#define pc_rightside_matk(sd) ((sd)->battle_status.rhw.matk+(sd)->battle_status.lhw.matk+(sd)->bonus.ematk)
|
#define pc_rightside_matk(sd) ((sd)->battle_status.rhw.matk+(sd)->battle_status.lhw.matk+(sd)->bonus.ematk)
|
||||||
#else
|
#else
|
||||||
#define pc_leftside_atk(sd) ((sd)->battle_status.batk + (sd)->battle_status.rhw.atk + (sd)->battle_status.lhw.atk)
|
#define pc_leftside_atk(sd) ((sd)->battle_status.batk + (sd)->battle_status.rhw.atk + (sd)->battle_status.lhw.atk)
|
||||||
|
@ -714,7 +714,7 @@ int pet_attackskill(struct pet_data *pd, int target_id)
|
|||||||
|
|
||||||
bl = map_id2bl(target_id);
|
bl = map_id2bl(target_id);
|
||||||
|
|
||||||
if(bl == nullptr || pd->bl.m != bl->m || bl->prev == nullptr || status_isdead(*bl) ||
|
if(bl == nullptr || pd->bl.m != bl->m || bl->prev == nullptr || status_isdead(bl) ||
|
||||||
!check_distance_bl(&pd->bl, bl, pd->db->range3))
|
!check_distance_bl(&pd->bl, bl, pd->db->range3))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1192,7 +1192,7 @@ int pet_select_egg(map_session_data *sd,short egg_index)
|
|||||||
if(egg_index < 0 || egg_index >= MAX_INVENTORY)
|
if(egg_index < 0 || egg_index >= MAX_INVENTORY)
|
||||||
return 0; //Forged packet!
|
return 0; //Forged packet!
|
||||||
|
|
||||||
if(sd->state.trading) //The player have trade in progress.
|
if(sd->trade_partner) //The player have trade in progress.
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
std::shared_ptr<s_pet_db> pet = pet_db_search(sd->inventory.u.items_inventory[egg_index].nameid, PET_EGG);
|
std::shared_ptr<s_pet_db> pet = pet_db_search(sd->inventory.u.items_inventory[egg_index].nameid, PET_EGG);
|
||||||
@ -1791,7 +1791,7 @@ static int pet_ai_sub_hard(struct pet_data *pd, map_session_data *sd, t_tick tic
|
|||||||
if (pd->target_id) {
|
if (pd->target_id) {
|
||||||
target = map_id2bl(pd->target_id);
|
target = map_id2bl(pd->target_id);
|
||||||
|
|
||||||
if (!target || pd->bl.m != target->m || status_isdead(*target) ||
|
if (!target || pd->bl.m != target->m || status_isdead(target) ||
|
||||||
!check_distance_bl(&pd->bl, target, pd->db->range3)) {
|
!check_distance_bl(&pd->bl, target, pd->db->range3)) {
|
||||||
target = nullptr;
|
target = nullptr;
|
||||||
pet_unlocktarget(pd);
|
pet_unlocktarget(pd);
|
||||||
@ -2073,7 +2073,7 @@ TIMER_FUNC(pet_recovery_timer){
|
|||||||
if(sd->sc.getSCE(pd->recovery->type)) {
|
if(sd->sc.getSCE(pd->recovery->type)) {
|
||||||
//Display a heal animation?
|
//Display a heal animation?
|
||||||
//Detoxify is chosen for now.
|
//Detoxify is chosen for now.
|
||||||
clif_skill_nodamage(&pd->bl,sd->bl,TF_DETOXIFY,1);
|
clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1);
|
||||||
status_change_end(&sd->bl, pd->recovery->type);
|
status_change_end(&sd->bl, pd->recovery->type);
|
||||||
clif_emotion(&pd->bl, ET_OK);
|
clif_emotion(&pd->bl, ET_OK);
|
||||||
}
|
}
|
||||||
@ -2090,6 +2090,7 @@ TIMER_FUNC(pet_recovery_timer){
|
|||||||
*/
|
*/
|
||||||
TIMER_FUNC(pet_heal_timer){
|
TIMER_FUNC(pet_heal_timer){
|
||||||
map_session_data *sd = map_id2sd(id);
|
map_session_data *sd = map_id2sd(id);
|
||||||
|
struct status_data *status;
|
||||||
struct pet_data *pd;
|
struct pet_data *pd;
|
||||||
unsigned int rate = 100;
|
unsigned int rate = 100;
|
||||||
|
|
||||||
@ -2103,7 +2104,7 @@ TIMER_FUNC(pet_heal_timer){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_data* status = status_get_status_data(sd->bl);
|
status = status_get_status_data(&sd->bl);
|
||||||
|
|
||||||
if(pc_isdead(sd) ||
|
if(pc_isdead(sd) ||
|
||||||
(rate = get_percentage(status->sp, status->max_sp)) > pd->s_skill->sp ||
|
(rate = get_percentage(status->sp, status->max_sp)) > pd->s_skill->sp ||
|
||||||
@ -2116,7 +2117,7 @@ TIMER_FUNC(pet_heal_timer){
|
|||||||
|
|
||||||
pet_stop_attack(pd);
|
pet_stop_attack(pd);
|
||||||
pet_stop_walking(pd,1);
|
pet_stop_walking(pd,1);
|
||||||
clif_skill_nodamage(&pd->bl,sd->bl,AL_HEAL,pd->s_skill->lv);
|
clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->s_skill->lv,1);
|
||||||
status_heal(&sd->bl, pd->s_skill->lv,0, 0);
|
status_heal(&sd->bl, pd->s_skill->lv,0, 0);
|
||||||
pd->s_skill->timer = add_timer(tick+pd->s_skill->delay*1000,pet_heal_timer,sd->bl.id,0);
|
pd->s_skill->timer = add_timer(tick+pd->s_skill->delay*1000,pet_heal_timer,sd->bl.id,0);
|
||||||
return 0;
|
return 0;
|
||||||
@ -2133,6 +2134,7 @@ TIMER_FUNC(pet_heal_timer){
|
|||||||
TIMER_FUNC(pet_skill_support_timer){
|
TIMER_FUNC(pet_skill_support_timer){
|
||||||
map_session_data *sd = map_id2sd(id);
|
map_session_data *sd = map_id2sd(id);
|
||||||
struct pet_data *pd;
|
struct pet_data *pd;
|
||||||
|
struct status_data *status;
|
||||||
short rate = 100;
|
short rate = 100;
|
||||||
|
|
||||||
if(sd == nullptr || sd->pd == nullptr || sd->pd->s_skill == nullptr)
|
if(sd == nullptr || sd->pd == nullptr || sd->pd->s_skill == nullptr)
|
||||||
@ -2145,7 +2147,7 @@ TIMER_FUNC(pet_skill_support_timer){
|
|||||||
return 0;
|
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) {
|
if (DIFF_TICK(pd->ud.canact_tick, tick) > 0) {
|
||||||
//Wait until the pet can act again.
|
//Wait until the pet can act again.
|
||||||
|
@ -242,7 +242,7 @@ uint64 QuestDatabase::parseBodyNode(const ryml::NodeRef& node) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (constant < SZ_SMALL || constant > SZ_ALL) {
|
if (constant < SZ_SMALL || constant > SZ_ALL) {
|
||||||
this->invalidWarning(targetNode["Size"], "Unsupported size %s, skipping.\n", size_.c_str());
|
this->invalidWarning(targetNode["size"], "Unsupported size %s, skipping.\n", size_.c_str());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,7 +385,7 @@ uint64 QuestDatabase::parseBodyNode(const ryml::NodeRef& node) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!this->nodeExists(dropNode, "Rate")) {
|
if (!this->nodeExists(dropNode, "Rate")) {
|
||||||
this->invalidWarning(dropNode["Rate"], "Drops has no Rate value specified, skipping.\n");
|
this->invalidWarning(dropNode["Item"], "Drops has no Rate value specified, skipping.\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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());
|
clif_skill_poseffect(&bl, skill_id, skill_lv, x, y, gettick());
|
||||||
break;
|
break;
|
||||||
case CAST_NODAMAGE:
|
case CAST_NODAMAGE:
|
||||||
clif_skill_nodamage(&bl, bl, skill_id, skill_lv);
|
clif_skill_nodamage(&bl, &bl, skill_id, skill_lv, 1);
|
||||||
break;
|
break;
|
||||||
case CAST_DAMAGE:
|
case CAST_DAMAGE:
|
||||||
clif_skill_damage(&bl, &bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
|
clif_skill_damage(&bl, &bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
|
||||||
@ -15389,7 +15389,7 @@ BUILDIN_FUNC(skilleffect)
|
|||||||
|
|
||||||
if (pc_issit(sd) && pc_setstand(sd, false)) {
|
if (pc_issit(sd) && pc_setstand(sd, false)) {
|
||||||
skill_sit(sd, 0);
|
skill_sit(sd, 0);
|
||||||
clif_standing(sd->bl);
|
clif_standing(&sd->bl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19910,7 +19910,7 @@ BUILDIN_FUNC(unitattack)
|
|||||||
case BL_PC: {
|
case BL_PC: {
|
||||||
map_session_data* sd = (map_session_data*)unit_bl;
|
map_session_data* sd = (map_session_data*)unit_bl;
|
||||||
|
|
||||||
clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? 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);
|
script_pushint(st, sd->ud.target == target_bl->id);
|
||||||
return SCRIPT_CMD_SUCCESS;
|
return SCRIPT_CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -23150,7 +23150,7 @@ BUILDIN_FUNC(sit)
|
|||||||
if( !pc_issit(sd) ) {
|
if( !pc_issit(sd) ) {
|
||||||
pc_setsit(sd);
|
pc_setsit(sd);
|
||||||
skill_sit(sd, 1);
|
skill_sit(sd, 1);
|
||||||
clif_sitting(sd->bl);
|
clif_sitting(&sd->bl);
|
||||||
}
|
}
|
||||||
return SCRIPT_CMD_SUCCESS;
|
return SCRIPT_CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -23167,7 +23167,7 @@ BUILDIN_FUNC(stand)
|
|||||||
|
|
||||||
if( pc_issit(sd) && pc_setstand(sd, false)) {
|
if( pc_issit(sd) && pc_setstand(sd, false)) {
|
||||||
skill_sit(sd, 0);
|
skill_sit(sd, 0);
|
||||||
clif_standing(sd->bl);
|
clif_standing(&sd->bl);
|
||||||
}
|
}
|
||||||
|
|
||||||
return SCRIPT_CMD_SUCCESS;
|
return SCRIPT_CMD_SUCCESS;
|
||||||
@ -27412,6 +27412,27 @@ BUILDIN_FUNC(permission_add)
|
|||||||
return SCRIPT_CMD_SUCCESS;
|
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>
|
#include <custom/script.inc>
|
||||||
|
|
||||||
// declarations that were supposed to be exported from npc_chat.cpp
|
// 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_DEF(permission_add, "i?"),
|
||||||
BUILDIN_DEF2(permission_add, "permission_remove", "i?"),
|
BUILDIN_DEF2(permission_add, "permission_remove", "i?"),
|
||||||
|
|
||||||
|
BUILDIN_DEF(unitisforcewalk, "i"),
|
||||||
|
|
||||||
#include <custom/script_def.inc>
|
#include <custom/script_def.inc>
|
||||||
|
|
||||||
{nullptr,nullptr,nullptr},
|
{nullptr,nullptr,nullptr},
|
||||||
|
@ -2128,21 +2128,7 @@ enum e_hat_effects : int16{
|
|||||||
HAT_EF_C_BABY_GLOOM,
|
HAT_EF_C_BABY_GLOOM,
|
||||||
HAT_EF_WINTERNIGHTBELLS,
|
HAT_EF_WINTERNIGHTBELLS,
|
||||||
HAT_EF_NIGHTSKYOFRUTIE,
|
HAT_EF_NIGHTSKYOFRUTIE,
|
||||||
FOOTPRINT_EF_BASE,
|
|
||||||
FOOTPRINT_EF_STR_BASE,
|
|
||||||
FOOTPRINT_EF_PURPLESTAR,
|
|
||||||
FOOTPRINT_EF_YELLOWSTAR,
|
|
||||||
FOOTPRINT_EF_REDSTAR,
|
|
||||||
HAT_EF_RAINBOW_POISON_MASTER,
|
HAT_EF_RAINBOW_POISON_MASTER,
|
||||||
HAT_EF_C_ANCIENT_RUNE,
|
|
||||||
HAT_EF_C_DRAGON_GREEN_AURA,
|
|
||||||
HAT_EF_C_DRAGON_RED_AURA,
|
|
||||||
HAT_EF_C_DRAGON_YELLOW_AURA,
|
|
||||||
HAT_EF_INTERDIMENSIONAL_RIFT,
|
|
||||||
HAT_EF_C_CLB_SS_LL,
|
|
||||||
HAT_EF_VACATION,
|
|
||||||
HAT_EF_C_FH_LOSTWING,
|
|
||||||
FOOTPRINT_EF_DOGFOOT,
|
|
||||||
HAT_EF_MAX
|
HAT_EF_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -539,6 +539,8 @@
|
|||||||
export_constant(MF_NODYNAMICNPC);
|
export_constant(MF_NODYNAMICNPC);
|
||||||
export_constant(MF_NOBANK);
|
export_constant(MF_NOBANK);
|
||||||
export_constant(MF_SPECIALPOPUP);
|
export_constant(MF_SPECIALPOPUP);
|
||||||
|
export_constant(MF_NOLOOTNORMALMOB);
|
||||||
|
export_constant(MF_NO_NPC_SELFDESTRUCTION_ON_ALL);
|
||||||
|
|
||||||
/* setcell types */
|
/* setcell types */
|
||||||
export_constant(CELL_WALKABLE);
|
export_constant(CELL_WALKABLE);
|
||||||
@ -3203,7 +3205,7 @@
|
|||||||
export_constant(EFST_SPELLFIST);
|
export_constant(EFST_SPELLFIST);
|
||||||
export_constant(EFST_NETHERWORLD);
|
export_constant(EFST_NETHERWORLD);
|
||||||
export_constant(EFST_SIREN);
|
export_constant(EFST_SIREN);
|
||||||
export_constant(EFST_DEEP_SLEEP);
|
export_constant(EFST_HANDICAPSTATE_DEEP_SLEEP);
|
||||||
export_constant(EFST_SIRCLEOFNATURE);
|
export_constant(EFST_SIRCLEOFNATURE);
|
||||||
export_constant(EFST_COLD);
|
export_constant(EFST_COLD);
|
||||||
export_constant(EFST_GLOOMYDAY);
|
export_constant(EFST_GLOOMYDAY);
|
||||||
@ -3266,7 +3268,7 @@
|
|||||||
export_constant(EFST_DROCERA_HERB_STEAMED);
|
export_constant(EFST_DROCERA_HERB_STEAMED);
|
||||||
export_constant(EFST_PUTTI_TAILS_NOODLES);
|
export_constant(EFST_PUTTI_TAILS_NOODLES);
|
||||||
export_constant(EFST_BANANA_BOMB);
|
export_constant(EFST_BANANA_BOMB);
|
||||||
export_constant(EFST_SUMMON_AGNI);
|
export_constant(XXX_EFST_SM_ELEMENTAL);
|
||||||
export_constant(EFST_SPELLBOOK4);
|
export_constant(EFST_SPELLBOOK4);
|
||||||
export_constant(EFST_SPELLBOOK5);
|
export_constant(EFST_SPELLBOOK5);
|
||||||
export_constant(EFST_SPELLBOOK6);
|
export_constant(EFST_SPELLBOOK6);
|
||||||
@ -3400,8 +3402,8 @@
|
|||||||
export_constant(EFST_SET_NUM_MDEF);
|
export_constant(EFST_SET_NUM_MDEF);
|
||||||
export_constant(EFST_SET_PER_DEF);
|
export_constant(EFST_SET_PER_DEF);
|
||||||
export_constant(EFST_SET_PER_MDEF);
|
export_constant(EFST_SET_PER_MDEF);
|
||||||
export_constant(EFST_PARTYBOOKING_SEARCH_DEALY);
|
export_constant(EFST_PARTYBOOKING_SEARCH_DELAY);
|
||||||
export_constant(EFST_PARTYBOOKING_REGISTER_DEALY);
|
export_constant(EFST_PARTYBOOKING_REGISTER_DELAY);
|
||||||
export_constant(EFST_PERIOD_TIME_CHECK_DETECT_SKILL);
|
export_constant(EFST_PERIOD_TIME_CHECK_DETECT_SKILL);
|
||||||
export_constant(EFST_KO_JYUMONJIKIRI);
|
export_constant(EFST_KO_JYUMONJIKIRI);
|
||||||
export_constant(EFST_MEIKYOUSISUI);
|
export_constant(EFST_MEIKYOUSISUI);
|
||||||
@ -3442,7 +3444,7 @@
|
|||||||
export_constant(EFST_GLASTHEIM_STATE);
|
export_constant(EFST_GLASTHEIM_STATE);
|
||||||
export_constant(EFST_GLASTHEIM_ITEMDEF);
|
export_constant(EFST_GLASTHEIM_ITEMDEF);
|
||||||
export_constant(EFST_GLASTHEIM_HPSP);
|
export_constant(EFST_GLASTHEIM_HPSP);
|
||||||
export_constant(EFST_HOMUN_SKILL_POSTDELAY);
|
export_constant(EFST_FOLLOWER_NPC_SKILL_POSTDELAY);
|
||||||
export_constant(EFST_ALMIGHTY);
|
export_constant(EFST_ALMIGHTY);
|
||||||
export_constant(EFST_GVG_GIANT);
|
export_constant(EFST_GVG_GIANT);
|
||||||
export_constant(EFST_GVG_GOLEM);
|
export_constant(EFST_GVG_GOLEM);
|
||||||
@ -3468,7 +3470,7 @@
|
|||||||
export_constant(EFST_QUEST_BUFF3);
|
export_constant(EFST_QUEST_BUFF3);
|
||||||
export_constant(EFST_REUSE_LIMIT_RECALL);
|
export_constant(EFST_REUSE_LIMIT_RECALL);
|
||||||
export_constant(EFST_SAVEPOSITION);
|
export_constant(EFST_SAVEPOSITION);
|
||||||
export_constant(EFST_HANDICAPSTATE_ICEEXPLO);
|
export_constant(EFST_NPC_ICEEXPLO);
|
||||||
export_constant(EFST_FENRIR_CARD);
|
export_constant(EFST_FENRIR_CARD);
|
||||||
export_constant(EFST_REUSE_LIMIT_ASPD_POTION);
|
export_constant(EFST_REUSE_LIMIT_ASPD_POTION);
|
||||||
export_constant(EFST_MAXPAIN);
|
export_constant(EFST_MAXPAIN);
|
||||||
@ -3572,7 +3574,7 @@
|
|||||||
export_constant(EFST_GC_POISONINGWEAPON_OPERATOR);
|
export_constant(EFST_GC_POISONINGWEAPON_OPERATOR);
|
||||||
export_constant(EFST_WS_WEAPONREFINE_OPERATOR);
|
export_constant(EFST_WS_WEAPONREFINE_OPERATOR);
|
||||||
export_constant(EFST_BS_REPAIRWEAPON_OPERATOR);
|
export_constant(EFST_BS_REPAIRWEAPON_OPERATOR);
|
||||||
export_constant(EFST_GET_MAILBOX);
|
export_constant(EFST_UNREADMAIL_CHECK);
|
||||||
export_constant(EFST_JUMPINGCLAN);
|
export_constant(EFST_JUMPINGCLAN);
|
||||||
export_constant(EFST_JP_OTP);
|
export_constant(EFST_JP_OTP);
|
||||||
export_constant(EFST_HANDICAPTOLERANCE_LEVELGAP);
|
export_constant(EFST_HANDICAPTOLERANCE_LEVELGAP);
|
||||||
@ -3891,13 +3893,13 @@
|
|||||||
export_constant(EFST_PERIOD_USE_WORLDMAP);
|
export_constant(EFST_PERIOD_USE_WORLDMAP);
|
||||||
export_constant(EFST_MISTY_FROST);
|
export_constant(EFST_MISTY_FROST);
|
||||||
export_constant(EFST_MAGIC_POISON);
|
export_constant(EFST_MAGIC_POISON);
|
||||||
export_constant(EFST_MOVE_AGIT);
|
export_constant(EFST_KAUTE);
|
||||||
export_constant(EFST_REUSE_JPNONLY_LIMIT_I);
|
export_constant(EFST_REUSE_JPNONLY_LIMIT_I);
|
||||||
export_constant(EFST_REUSE_JPNONLY_LIMIT_J);
|
export_constant(EFST_REUSE_JPNONLY_LIMIT_J);
|
||||||
export_constant(EFST_REUSE_JPNONLY_LIMIT_K);
|
export_constant(EFST_REUSE_JPNONLY_LIMIT_K);
|
||||||
export_constant(EFST_JPNONLY_TACTICS);
|
export_constant(EFST_JPNONLY_TACTICS);
|
||||||
export_constant(EFST_PRISON);
|
export_constant(EFST_PRISON);
|
||||||
export_constant(EFST_MADOGEAR_TYPE);
|
export_constant(EFST_MADOGEAR);
|
||||||
export_constant(EFST_DEADLY_DEFEASANCE);
|
export_constant(EFST_DEADLY_DEFEASANCE);
|
||||||
export_constant(EFST_CLIMAX_DES_HU);
|
export_constant(EFST_CLIMAX_DES_HU);
|
||||||
export_constant(EFST_CLIMAX);
|
export_constant(EFST_CLIMAX);
|
||||||
@ -4172,44 +4174,6 @@
|
|||||||
export_constant(EFST_C_RATE_PLUS);
|
export_constant(EFST_C_RATE_PLUS);
|
||||||
export_constant(EFST_RESIST_PLUS);
|
export_constant(EFST_RESIST_PLUS);
|
||||||
export_constant(EFST_PVP_DUN_BUFF);
|
export_constant(EFST_PVP_DUN_BUFF);
|
||||||
export_constant(EFST_TARGET_MARKER);
|
|
||||||
export_constant(EFST_BLOCK_SEAL);
|
|
||||||
export_constant(EFST_FROST_STORM);
|
|
||||||
export_constant(EFST_GROGGY);
|
|
||||||
export_constant(EFST_WARM_SHIELD);
|
|
||||||
export_constant(EFST_CONTENTS_1);
|
|
||||||
export_constant(EFST_CONTENTS_2);
|
|
||||||
export_constant(EFST_CONTENTS_3);
|
|
||||||
export_constant(EFST_CONTENTS_4);
|
|
||||||
export_constant(EFST_CONTENTS_5);
|
|
||||||
export_constant(EFST_CONTENTS_6);
|
|
||||||
export_constant(EFST_CONTENTS_7);
|
|
||||||
export_constant(EFST_CONTENTS_8);
|
|
||||||
export_constant(EFST_CONTENTS_9);
|
|
||||||
export_constant(EFST_CONTENTS_10);
|
|
||||||
export_constant(EFST_CONTENTS_11);
|
|
||||||
export_constant(EFST_CONTENTS_12);
|
|
||||||
export_constant(EFST_CONTENTS_13);
|
|
||||||
export_constant(EFST_CONTENTS_14);
|
|
||||||
export_constant(EFST_CONTENTS_15);
|
|
||||||
export_constant(EFST_CONTENTS_16);
|
|
||||||
export_constant(EFST_CONTENTS_17);
|
|
||||||
export_constant(EFST_CONTENTS_18);
|
|
||||||
export_constant(EFST_CONTENTS_19);
|
|
||||||
export_constant(EFST_CONTENTS_20);
|
|
||||||
export_constant(EFST_CONTENTS_21);
|
|
||||||
export_constant(EFST_CONTENTS_22);
|
|
||||||
export_constant(EFST_CONTENTS_23);
|
|
||||||
export_constant(EFST_CONTENTS_24);
|
|
||||||
export_constant(EFST_CONTENTS_25);
|
|
||||||
export_constant(EFST_C_BUFF_1);
|
|
||||||
export_constant(EFST_C_BUFF_2);
|
|
||||||
export_constant(EFST_CHASING);
|
|
||||||
export_constant(EFST_MYSTERY_POWDER);
|
|
||||||
export_constant(EFST_FIRE_CHARM_POWER);
|
|
||||||
export_constant(EFST_WATER_CHARM_POWER);
|
|
||||||
export_constant(EFST_WIND_CHARM_POWER);
|
|
||||||
export_constant(EFST_GROUND_CHARM_POWER);
|
|
||||||
/// @APIHOOK_END
|
/// @APIHOOK_END
|
||||||
/// Do not modify code above this, since it will be automatically generated by the API again
|
/// Do not modify code above this, since it will be automatically generated by the API again
|
||||||
export_constant(EFST_MAX);
|
export_constant(EFST_MAX);
|
||||||
@ -7847,6 +7811,7 @@
|
|||||||
export_constant(IG_COSTUMEMILEPACK_35_1);
|
export_constant(IG_COSTUMEMILEPACK_35_1);
|
||||||
export_constant(IG_COSTUMEMILEPACK_35_2);
|
export_constant(IG_COSTUMEMILEPACK_35_2);
|
||||||
export_constant(IG_COSTUMEMILEPACK_35_3);
|
export_constant(IG_COSTUMEMILEPACK_35_3);
|
||||||
|
export_constant(IG_D_GW_EXTRACTOR);
|
||||||
|
|
||||||
/* unit stop walking */
|
/* unit stop walking */
|
||||||
export_constant(USW_NONE);
|
export_constant(USW_NONE);
|
||||||
@ -9186,11 +9151,6 @@
|
|||||||
export_constant_npc(JT_4_EP21_HOWELL_S);
|
export_constant_npc(JT_4_EP21_HOWELL_S);
|
||||||
export_constant_npc(JT_4_EP21_TAN_S);
|
export_constant_npc(JT_4_EP21_TAN_S);
|
||||||
export_constant_npc(JT_4_M_VACATION_MARAM);
|
export_constant_npc(JT_4_M_VACATION_MARAM);
|
||||||
export_constant_npc(JT_4_CLB_SS_FC);
|
|
||||||
export_constant_npc(JT_4_CLB_SS_TZ);
|
|
||||||
export_constant_npc(JT_4_CLB_SS_AJ);
|
|
||||||
export_constant_npc(JT_4_CLB_SS_LK);
|
|
||||||
export_constant_npc(JT_4_SMART_ANDRE);
|
|
||||||
export_constant_npc(JT_ROZ_MQ_XAVIER);
|
export_constant_npc(JT_ROZ_MQ_XAVIER);
|
||||||
export_constant_npc(JT_ROZ_MQ_MOCLORD);
|
export_constant_npc(JT_ROZ_MQ_MOCLORD);
|
||||||
export_constant_npc(JT_ROZ_MQ_SKULD);
|
export_constant_npc(JT_ROZ_MQ_SKULD);
|
||||||
@ -10555,21 +10515,7 @@
|
|||||||
export_constant(HAT_EF_C_BABY_GLOOM);
|
export_constant(HAT_EF_C_BABY_GLOOM);
|
||||||
export_constant(HAT_EF_WINTERNIGHTBELLS);
|
export_constant(HAT_EF_WINTERNIGHTBELLS);
|
||||||
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
|
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
|
||||||
export_constant(FOOTPRINT_EF_BASE);
|
|
||||||
export_constant(FOOTPRINT_EF_STR_BASE);
|
|
||||||
export_constant(FOOTPRINT_EF_PURPLESTAR);
|
|
||||||
export_constant(FOOTPRINT_EF_YELLOWSTAR);
|
|
||||||
export_constant(FOOTPRINT_EF_REDSTAR);
|
|
||||||
export_constant(HAT_EF_RAINBOW_POISON_MASTER);
|
export_constant(HAT_EF_RAINBOW_POISON_MASTER);
|
||||||
export_constant(HAT_EF_C_ANCIENT_RUNE);
|
|
||||||
export_constant(HAT_EF_C_DRAGON_GREEN_AURA);
|
|
||||||
export_constant(HAT_EF_C_DRAGON_RED_AURA);
|
|
||||||
export_constant(HAT_EF_C_DRAGON_YELLOW_AURA);
|
|
||||||
export_constant(HAT_EF_INTERDIMENSIONAL_RIFT);
|
|
||||||
export_constant(HAT_EF_C_CLB_SS_LL);
|
|
||||||
export_constant(HAT_EF_VACATION);
|
|
||||||
export_constant(HAT_EF_C_FH_LOSTWING);
|
|
||||||
export_constant(FOOTPRINT_EF_DOGFOOT);
|
|
||||||
|
|
||||||
/* pet catch */
|
/* pet catch */
|
||||||
export_constant(PET_CATCH_UNIVERSAL);
|
export_constant(PET_CATCH_UNIVERSAL);
|
||||||
|
1079
src/map/skill.cpp
1079
src/map/skill.cpp
File diff suppressed because it is too large
Load Diff
@ -1500,17 +1500,7 @@ enum e_skill {
|
|||||||
NPC_CANE_OF_EVIL_EYE,
|
NPC_CANE_OF_EVIL_EYE,
|
||||||
NPC_CURSE_OF_RED_CUBE,
|
NPC_CURSE_OF_RED_CUBE,
|
||||||
NPC_CURSE_OF_BLUE_CUBE,
|
NPC_CURSE_OF_BLUE_CUBE,
|
||||||
NPC_KILLING_AURA,
|
NPC_KILLING_AURA, // 783
|
||||||
ALL_EVENT_20TH_ANNIVERSARY,
|
|
||||||
NPC_TARGET_MARKER,
|
|
||||||
NPC_AIMED_SHOWER,
|
|
||||||
NPC_BLAZING_ERUPTION,
|
|
||||||
NPC_BLOCK_SEAL,
|
|
||||||
NPC_BLOCK_EXPLOSION,
|
|
||||||
NPC_FROST_FIELD,
|
|
||||||
NPC_LIGHTNING_JUDGEMENT,
|
|
||||||
NPC_GROGGY_ON,
|
|
||||||
NPC_RESET_EFST, //793
|
|
||||||
|
|
||||||
KN_CHARGEATK = 1001,
|
KN_CHARGEATK = 1001,
|
||||||
CR_SHRINK,
|
CR_SHRINK,
|
||||||
@ -2342,10 +2332,6 @@ enum e_skill {
|
|||||||
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
|
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
|
||||||
SS_FUUMAKOUCHIKU_BLASTING,
|
SS_FUUMAKOUCHIKU_BLASTING,
|
||||||
|
|
||||||
SS_FOUR_CHARM = 5499,
|
|
||||||
NW_WILD_SHOT,
|
|
||||||
NW_MIDNIGHT_FALLEN,
|
|
||||||
|
|
||||||
DK_DRAGONIC_BREATH = 6001,
|
DK_DRAGONIC_BREATH = 6001,
|
||||||
MT_SPARK_BLASTER,
|
MT_SPARK_BLASTER,
|
||||||
MT_TRIPLE_LASER,
|
MT_TRIPLE_LASER,
|
||||||
@ -2353,21 +2339,6 @@ enum e_skill {
|
|||||||
BO_EXPLOSIVE_POWDER,
|
BO_EXPLOSIVE_POWDER,
|
||||||
BO_MAYHEMIC_THORNS,
|
BO_MAYHEMIC_THORNS,
|
||||||
|
|
||||||
IG_RADIANT_SPEAR = 6503,
|
|
||||||
IG_IMPERIAL_CROSS,
|
|
||||||
|
|
||||||
MT_RUSH_STRIKE = 6506,
|
|
||||||
MT_POWERFUL_SWING,
|
|
||||||
MT_ENERGY_CANNONADE,
|
|
||||||
BO_MYSTERY_POWDER,
|
|
||||||
BO_DUST_EXPLOSION,
|
|
||||||
SHC_CROSS_SLASH,
|
|
||||||
ABC_HIT_AND_SLIDING,
|
|
||||||
ABC_CHASING_BREAK,
|
|
||||||
ABC_CHASING_SHOT,
|
|
||||||
|
|
||||||
TR_RHYTHMICAL_WAVE = 6521,
|
|
||||||
|
|
||||||
HLIF_HEAL = 8001,
|
HLIF_HEAL = 8001,
|
||||||
HLIF_AVOID,
|
HLIF_AVOID,
|
||||||
HLIF_BRAIN,
|
HLIF_BRAIN,
|
||||||
|
@ -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)
|
int status_set_hp(struct block_list *bl, unsigned int hp, int flag)
|
||||||
{
|
{
|
||||||
|
struct status_data *status;
|
||||||
if (hp < 1)
|
if (hp < 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
status = status_get_status_data(bl);
|
||||||
status_data* status = status_get_status_data(*bl);
|
|
||||||
|
|
||||||
if (status == &dummy_status)
|
if (status == &dummy_status)
|
||||||
return 0;
|
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)
|
int status_set_maxhp(struct block_list *bl, unsigned int maxhp, int flag)
|
||||||
{
|
{
|
||||||
|
struct status_data *status;
|
||||||
int64 heal;
|
int64 heal;
|
||||||
|
|
||||||
if (maxhp < 1)
|
if (maxhp < 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
status = status_get_status_data(bl);
|
||||||
status_data* status = status_get_status_data(*bl);
|
|
||||||
|
|
||||||
if (status == &dummy_status)
|
if (status == &dummy_status)
|
||||||
return 0;
|
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)
|
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)
|
if (status == &dummy_status)
|
||||||
return 0;
|
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)
|
int status_set_maxsp(struct block_list *bl, unsigned int maxsp, int flag)
|
||||||
{
|
{
|
||||||
|
struct status_data *status;
|
||||||
if (maxsp < 1)
|
if (maxsp < 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
status = status_get_status_data(bl);
|
||||||
status_data* status = status_get_status_data(*bl);
|
|
||||||
|
|
||||||
if (status == &dummy_status)
|
if (status == &dummy_status)
|
||||||
return 0;
|
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)
|
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)
|
if (status == &dummy_status)
|
||||||
return 0;
|
return 0;
|
||||||
@ -1384,7 +1382,7 @@ int status_set_maxap(struct block_list *bl, unsigned int maxap, int flag)
|
|||||||
if (maxap < 1)
|
if (maxap < 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
status_data *status = status_get_status_data(*bl);
|
status_data *status = status_get_status_data(bl);
|
||||||
|
|
||||||
if (status == &dummy_status)
|
if (status == &dummy_status)
|
||||||
return 0;
|
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)
|
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;
|
status_change *sc;
|
||||||
int hp = (int)cap_value(dhp,INT_MIN,INT_MAX);
|
int hp = (int)cap_value(dhp,INT_MIN,INT_MAX);
|
||||||
int sp = (int)cap_value(dsp,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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_data* status = status_get_status_data(*target);
|
status = status_get_status_data(target);
|
||||||
|
if(!status || status == &dummy_status )
|
||||||
if( status == &dummy_status )
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((unsigned int)hp >= status->hp) {
|
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
|
else
|
||||||
status_revive(target, sc->getSCE(SC_KAIZEL)->val2, 0);
|
status_revive(target, sc->getSCE(SC_KAIZEL)->val2, 0);
|
||||||
status_change_clear(target,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);
|
sc_start(src,target,SC_KYRIE,100,10,time);
|
||||||
|
|
||||||
if( target->type == BL_MOB )
|
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)) {
|
if (sc && sc->getSCE(SC_ULTIMATE_S) && !map_flag_gvg2(target->m)) {
|
||||||
status_revive(target, 100, 100);
|
status_revive(target, 100, 100);
|
||||||
status_change_clear(target, 0);
|
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)
|
if (target->type == BL_MOB)
|
||||||
((TBL_MOB*)target)->state.rebirth = 1;
|
((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)
|
int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag)
|
||||||
{
|
{
|
||||||
|
struct status_data *status;
|
||||||
status_change *sc;
|
status_change *sc;
|
||||||
int hp = (int)cap_value(hhp,INT_MIN,INT_MAX);
|
int hp = (int)cap_value(hhp,INT_MIN,INT_MAX);
|
||||||
int sp = (int)cap_value(hsp,INT_MIN,INT_MAX);
|
int sp = (int)cap_value(hsp,INT_MIN,INT_MAX);
|
||||||
int ap = (int)cap_value(hap,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)
|
if (status == &dummy_status || !status->hp)
|
||||||
return 0;
|
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)
|
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;
|
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]
|
// It's safe now [MarkZD]
|
||||||
if (hp_rate > 99)
|
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)
|
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;
|
unsigned int hp, sp, ap;
|
||||||
if (!status_isdead(*bl)) return 0;
|
if (!status_isdead(bl)) return 0;
|
||||||
|
|
||||||
status_data* status = status_get_status_data(*bl);
|
|
||||||
|
|
||||||
|
status = status_get_status_data(bl);
|
||||||
if (status == &dummy_status)
|
if (status == &dummy_status)
|
||||||
return 0; // Invalid target.
|
return 0; // Invalid target.
|
||||||
|
|
||||||
@ -1956,13 +1958,13 @@ int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per
|
|||||||
* @author [Skotlex]
|
* @author [Skotlex]
|
||||||
*/
|
*/
|
||||||
bool status_check_skilluse(struct block_list *src, struct block_list *target, uint16 skill_id, int flag) {
|
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;
|
int hide_flag;
|
||||||
|
|
||||||
if (src) {
|
if (src) {
|
||||||
if (src->type != BL_PC && status_isdead(*src))
|
if (src->type != BL_PC && status_isdead(src))
|
||||||
return false;
|
return false;
|
||||||
status = status_get_status_data(*src);
|
status = status_get_status_data(src);
|
||||||
}else{
|
}else{
|
||||||
status = &dummy_status;
|
status = &dummy_status;
|
||||||
}
|
}
|
||||||
@ -1978,7 +1980,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
|
|||||||
return false;
|
return false;
|
||||||
// Dead state is not checked for skills as some skills can be used
|
// Dead state is not checked for skills as some skills can be used
|
||||||
// on dead characters, said checks are left to skill.cpp [Skotlex]
|
// on dead characters, said checks are left to skill.cpp [Skotlex]
|
||||||
if (target && status_isdead(*target))
|
if (target && status_isdead(target))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1990,7 +1992,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case GN_WALLOFTHORN:
|
case GN_WALLOFTHORN:
|
||||||
if( target && status_isdead(*target) )
|
if( target && status_isdead(target) )
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case AL_TELEPORT:
|
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 status_check_visibility(struct block_list *src, struct block_list *target)
|
||||||
{
|
{
|
||||||
int view_range;
|
int view_range;
|
||||||
|
struct status_data* status = status_get_status_data(src);
|
||||||
status_change* tsc = status_get_sc(target);
|
status_change* tsc = status_get_sc(target);
|
||||||
switch (src->type) {
|
switch (src->type) {
|
||||||
case BL_MOB:
|
case BL_MOB:
|
||||||
@ -2240,7 +2243,7 @@ int status_check_visibility(struct block_list *src, struct block_list *target)
|
|||||||
|
|
||||||
if (tsc) {
|
if (tsc) {
|
||||||
bool is_boss = (status_get_class_(src) == CLASS_BOSS);
|
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.
|
switch (target->type) { // Check for chase-walk/hiding/cloaking opponents.
|
||||||
case BL_PC: {
|
case BL_PC: {
|
||||||
@ -2874,24 +2877,18 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
|
|||||||
}
|
}
|
||||||
case NC_SILVERSNIPER:
|
case NC_SILVERSNIPER:
|
||||||
{
|
{
|
||||||
status_data* mstatus = status_get_status_data(*mbl);
|
struct status_data *mstatus = status_get_status_data(mbl);
|
||||||
|
|
||||||
// TODO: check if dummy_status? Can never be nullptr [Lemongrass]
|
|
||||||
if(!mstatus)
|
if(!mstatus)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
status->max_hp = (1000 * ud->skill_lv) + (mstatus->hp / 3) + (status_get_lv(mbl) * 12);
|
status->max_hp = (1000 * ud->skill_lv) + (mstatus->hp / 3) + (status_get_lv(mbl) * 12);
|
||||||
status->batk = 200 * ud->skill_lv;
|
status->batk = 200 * ud->skill_lv;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NC_MAGICDECOY:
|
case NC_MAGICDECOY:
|
||||||
{
|
{
|
||||||
status_data* mstatus = status_get_status_data(*mbl);
|
struct status_data *mstatus = status_get_status_data(mbl);
|
||||||
|
|
||||||
// TODO: check if dummy_status? Can never be nullptr [Lemongrass]
|
|
||||||
if(!mstatus)
|
if(!mstatus)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
status->max_hp = (1000 * ((TBL_PC*)mbl)->menuskill_val) + (mstatus->sp * 4) + (status_get_lv(mbl) * 12);
|
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;
|
status->matk_min = status->matk_max = 250 + 50*((TBL_PC*)mbl)->menuskill_val;
|
||||||
break;
|
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_MOTHER_NET:
|
||||||
case MT_SUMMON_ABR_INFINITY: {
|
case MT_SUMMON_ABR_INFINITY: {
|
||||||
map_session_data *msd = BL_CAST(BL_PC, mbl);
|
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)
|
if (msd == nullptr || mstatus == nullptr)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2937,9 +2933,8 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
|
|||||||
case BO_CREEPER:
|
case BO_CREEPER:
|
||||||
case BO_HELLTREE: {
|
case BO_HELLTREE: {
|
||||||
map_session_data *msd = BL_CAST(BL_PC, mbl);
|
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)
|
if (msd == nullptr || mstatus == nullptr)
|
||||||
break;
|
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.
|
// Client doesn't delete unavailable skills even if we refresh the skill tree, individually delete them.
|
||||||
for (i = 0; i < MAX_SKILL; i++) {
|
for (i = 0; i < MAX_SKILL; i++) {
|
||||||
if (b_skill[i].id != 0 && sd->status.skill[i].id == 0)
|
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
|
#endif
|
||||||
clif_skillinfoblock(sd);
|
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)
|
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
|
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);
|
status_change *sc = status_get_sc(&bl);
|
||||||
TBL_PC *sd = BL_CAST(BL_PC,&bl);
|
TBL_PC *sd = BL_CAST(BL_PC,&bl);
|
||||||
int temp;
|
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.
|
* No status changes alter these yet.
|
||||||
* if(flag[SCB_SIZE])
|
* if(flag[SCB_SIZE])
|
||||||
* if(flag[SCB_RACE])
|
* if(flag[SCB_RACE])
|
||||||
* if(flag[SCB_RANGE])
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
if (flag[SCB_RANGE]) {
|
||||||
|
status->rhw.range = b_status->rhw.range;
|
||||||
|
}
|
||||||
|
|
||||||
if(flag[SCB_MAXHP]) {
|
if(flag[SCB_MAXHP]) {
|
||||||
if( bl.type == BL_PC ) {
|
if( bl.type == BL_PC ) {
|
||||||
status->max_hp = status_calc_maxhpsp_pc(sd,status->vit,true);
|
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)
|
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) {
|
if (bl->type == BL_PC) {
|
||||||
map_session_data *sd = BL_CAST(BL_PC, bl);
|
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
|
// 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
|
if( flag[SCB_BASE] ) { // Calculate the object's base status too
|
||||||
switch( bl->type ) {
|
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;
|
vit -= vit * sc->getSCE(SC_STRIPARMOR)->val2/100;
|
||||||
if(sc->getSCE(SC_FULL_THROTTLE))
|
if(sc->getSCE(SC_FULL_THROTTLE))
|
||||||
vit += vit * sc->getSCE(SC_FULL_THROTTLE)->val3 / 100;
|
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;
|
vit += sc->getSCE(SC_DEFENCE)->val2;
|
||||||
|
#endif
|
||||||
if(sc->getSCE(SC_CHEERUP))
|
if(sc->getSCE(SC_CHEERUP))
|
||||||
vit += 3;
|
vit += 3;
|
||||||
if(sc->getSCE(SC_GLASTHEIM_STATE))
|
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))
|
if(sc->getSCE(SC_BERSERK))
|
||||||
return 0;
|
return 0;
|
||||||
#ifdef RENEWAL
|
|
||||||
if(sc->getSCE(SC_ETERNALCHAOS))
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
if(sc->getSCE(SC_BARRIER))
|
if(sc->getSCE(SC_BARRIER))
|
||||||
return 100;
|
return 100;
|
||||||
if(sc->getSCE(SC_KEEPING))
|
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
|
#ifdef RENEWAL
|
||||||
if (sc->getSCE(SC_ASSUMPTIO))
|
if (sc->getSCE(SC_ASSUMPTIO))
|
||||||
def += sc->getSCE(SC_ASSUMPTIO)->val1 * 50;
|
def += sc->getSCE(SC_ASSUMPTIO)->val1 * 50;
|
||||||
#endif
|
#else
|
||||||
if (bl->type == BL_HOM && sc->getSCE(SC_DEFENCE))
|
if(sc->getSCE(SC_DEFENCE))
|
||||||
def += sc->getSCE(SC_DEFENCE)->val2;
|
def += sc->getSCE(SC_DEFENCE)->val2;
|
||||||
|
#endif
|
||||||
if(sc->getSCE(SC_INCDEFRATE))
|
if(sc->getSCE(SC_INCDEFRATE))
|
||||||
def += def * sc->getSCE(SC_INCDEFRATE)->val1/100;
|
def += def * sc->getSCE(SC_INCDEFRATE)->val1/100;
|
||||||
if(sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 2)
|
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]
|
* @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
|
* @return status or "dummy_status" if any other bl->type than noted above
|
||||||
*/
|
*/
|
||||||
status_data* status_get_status_data(block_list& bl){
|
struct status_data *status_get_status_data(struct block_list *bl)
|
||||||
switch (bl.type) {
|
{
|
||||||
case BL_PC:
|
nullpo_retr(&dummy_status, bl);
|
||||||
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 );
|
|
||||||
|
|
||||||
if( mobdb_checkid( nd->class_ ) == 0 ){
|
switch (bl->type) {
|
||||||
return &nd->status;
|
case BL_PC: return &((TBL_PC*)bl)->battle_status;
|
||||||
}else{
|
case BL_MOB: return &((TBL_MOB*)bl)->status;
|
||||||
return &dummy_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:
|
default:
|
||||||
return &dummy_status;
|
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)
|
defType status_get_def(struct block_list *bl)
|
||||||
{
|
{
|
||||||
struct unit_data *ud;
|
struct unit_data *ud;
|
||||||
status_data* status = status_get_status_data(*bl);
|
struct status_data *status = status_get_status_data(bl);
|
||||||
// TODO: check if dummy_status? Can never be nullptr [Lemongrass]
|
|
||||||
int def = status?status->def:0;
|
int def = status?status->def:0;
|
||||||
ud = unit_bl2ud(bl);
|
ud = unit_bl2ud(bl);
|
||||||
if (ud && ud->skilltimer != INVALID_TIMER)
|
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)
|
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]
|
if(bl->type==BL_NPC)// Only BL with speed data but no status_data [Skotlex]
|
||||||
return ((struct npc_data *)bl)->speed;
|
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]
|
* @param bl: Object to check [PC|MOB|HOM|MER|ELEM]
|
||||||
* @return 1: Is dead or 0: Is alive
|
* @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;
|
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%;
|
/// Example: 25% (2500) -> sc_def2 = 2000 -> 5%;
|
||||||
/// 2500ms -> tick_def2=2000 -> 500ms
|
/// 2500ms -> tick_def2=2000 -> 500ms
|
||||||
int sc_def2 = 0, tick_def2 = 0;
|
int sc_def2 = 0, tick_def2 = 0;
|
||||||
|
|
||||||
|
struct status_data *status, *status_src;
|
||||||
status_change *sc;
|
status_change *sc;
|
||||||
map_session_data *sd;
|
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);
|
sd = BL_CAST(BL_PC,bl);
|
||||||
status_data* status = status_get_status_data(*bl);
|
status = status_get_status_data(bl);
|
||||||
status_data* status_src = status_get_status_data(*src);
|
status_src = status_get_status_data(src);
|
||||||
sc = status_get_sc(bl);
|
sc = status_get_sc(bl);
|
||||||
if( sc && !sc->count )
|
if( sc && !sc->count )
|
||||||
sc = nullptr;
|
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;
|
map_session_data *sd = nullptr;
|
||||||
status_change* sc;
|
status_change* sc;
|
||||||
struct status_change_entry* sce;
|
struct status_change_entry* sce;
|
||||||
|
struct status_data *status;
|
||||||
struct view_data *vd;
|
struct view_data *vd;
|
||||||
int undead_flag, tick_time = 0;
|
int undead_flag, tick_time = 0;
|
||||||
bool sc_isnew = true;
|
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);
|
nullpo_ret(bl);
|
||||||
sc = status_get_sc(bl);
|
sc = status_get_sc(bl);
|
||||||
|
status = status_get_status_data(bl);
|
||||||
|
|
||||||
if( !scdb ) {
|
if( !scdb ) {
|
||||||
ShowError("status_change_start: Invalid status change (%d)!\n", type);
|
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 )
|
if( !sc )
|
||||||
return 0; // Unable to receive status changes
|
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;
|
return 0;
|
||||||
|
|
||||||
if (status_change_isDisabledOnMap(type, map_getmapdata(bl->m)))
|
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])
|
if (sc->option&OPTION_MADOGEAR && flag&SCSTART_NOAVOID && scdb->flag[SCF_FAILEDMADO])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
status_data* status = status_get_status_data(*bl);
|
|
||||||
|
|
||||||
// Check for Boss resistances
|
// Check for Boss resistances
|
||||||
if(status->mode&MD_STATUSIMMUNE && !(flag&SCSTART_NOAVOID) && scdb->flag[SCF_BOSSRESIST])
|
if(status->mode&MD_STATUSIMMUNE && !(flag&SCSTART_NOAVOID) && scdb->flag[SCF_BOSSRESIST])
|
||||||
return 0;
|
return 0;
|
||||||
@ -11174,7 +11160,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
|||||||
if (sd) {
|
if (sd) {
|
||||||
pc_setsit(sd);
|
pc_setsit(sd);
|
||||||
skill_sit(sd, true);
|
skill_sit(sd, true);
|
||||||
clif_sitting(sd->bl);
|
clif_sitting(&sd->bl);
|
||||||
}
|
}
|
||||||
val2 = 12; // SP cost
|
val2 = 12; // SP cost
|
||||||
tick_time = 10000; // Decrease at 10secs intervals.
|
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);
|
struct block_list *pbl = map_id2bl(val1);
|
||||||
status_change *psc = pbl?status_get_sc(pbl):nullptr;
|
status_change *psc = pbl?status_get_sc(pbl):nullptr;
|
||||||
struct status_change_entry *psce = psc?psc->getSCE(SC_MARIONETTE):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)
|
if (!psce)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// Fetch target's stats
|
|
||||||
status_data* status2 = status_get_status_data(*bl); // Battle status
|
|
||||||
|
|
||||||
val3 = 0;
|
val3 = 0;
|
||||||
val4 = 0;
|
val4 = 0;
|
||||||
max_stat = battle_config.max_parameter; // Cap to 99 (default)
|
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
|
//1st Transcendent Spirit works similar to Marionette Control
|
||||||
if(sd && val2 == SL_HIGH) {
|
if(sd && val2 == SL_HIGH) {
|
||||||
int stat,max_stat;
|
int stat,max_stat;
|
||||||
status_data *status2 = status_get_base_status(bl);
|
struct status_data *status2 = status_get_base_status(bl);
|
||||||
|
|
||||||
val3 = 0;
|
val3 = 0;
|
||||||
val4 = 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;
|
val2 = 10 * val1;
|
||||||
break;
|
break;
|
||||||
case SC_DEFENCE:
|
case SC_DEFENCE:
|
||||||
// Vit bonus for players / Def bonus for homunculus
|
|
||||||
#ifdef RENEWAL
|
#ifdef RENEWAL
|
||||||
val2 = 5 + (5 * val1);
|
val2 = 5 + (val1 * 5); // Vit bonus
|
||||||
#else
|
#else
|
||||||
val2 = 2 * val1;
|
val2 = 2*val1; // Def bonus
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case SC_BLOODLUST:
|
case SC_BLOODLUST:
|
||||||
// Atk rate change
|
val2 = 20+10*val1; // Atk rate change.
|
||||||
val2 = 20 + (10 * val1);
|
val3 = 3*val1; // Leech chance
|
||||||
// Leech chance
|
val4 = 20; // Leech percent
|
||||||
// It's actually 9 * level on both pre-re and renewal, despite the description
|
|
||||||
val3 = 9 * val1;
|
|
||||||
// Leech percent
|
|
||||||
val4 = 20;
|
|
||||||
break;
|
break;
|
||||||
case SC_FLEET:
|
case SC_FLEET:
|
||||||
val2 = 30*val1; // Aspd change
|
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) ) {
|
if( sd && !pc_issit(sd) ) {
|
||||||
pc_setsit(sd);
|
pc_setsit(sd);
|
||||||
skill_sit(sd, true);
|
skill_sit(sd, true);
|
||||||
clif_sitting(*bl);
|
clif_sitting(bl);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SC_DANCEWITHWUG:
|
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) {
|
switch(sce->val1) {
|
||||||
case TK_STORMKICK:
|
case TK_STORMKICK:
|
||||||
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
|
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;
|
break;
|
||||||
case TK_DOWNKICK:
|
case TK_DOWNKICK:
|
||||||
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
|
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;
|
break;
|
||||||
case TK_TURNKICK:
|
case TK_TURNKICK:
|
||||||
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
|
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;
|
break;
|
||||||
case TK_COUNTER:
|
case TK_COUNTER:
|
||||||
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
|
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;
|
break;
|
||||||
default: // Rest just toggle inf to enable autotarget
|
default: // Rest just toggle inf to enable autotarget
|
||||||
skill_combo_toggle_inf(bl,sce->val1,INF_SELF_SKILL);
|
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;
|
map_session_data *sd;
|
||||||
status_change *sc;
|
status_change *sc;
|
||||||
struct status_change_entry *sce;
|
struct status_change_entry *sce;
|
||||||
|
struct status_data *status;
|
||||||
struct view_data *vd;
|
struct view_data *vd;
|
||||||
std::shared_ptr<s_status_change_db> scdb = status_db.find(type);
|
std::shared_ptr<s_status_change_db> scdb = status_db.find(type);
|
||||||
|
|
||||||
nullpo_ret(bl);
|
nullpo_ret(bl);
|
||||||
|
|
||||||
sc = status_get_sc(bl);
|
sc = status_get_sc(bl);
|
||||||
|
status = status_get_status_data(bl);
|
||||||
|
|
||||||
if(!sc || !(sce = sc->getSCE(type)) || !scdb)
|
if(!sc || !(sce = sc->getSCE(type)) || !scdb)
|
||||||
return 0;
|
return 0;
|
||||||
@ -13320,7 +13302,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
|||||||
sce->val4 = 0;
|
sce->val4 = 0;
|
||||||
if (group)
|
if (group)
|
||||||
skill_delunitgroup(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
|
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
|
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);
|
vd = status_get_viewdata(bl);
|
||||||
std::bitset<SCB_MAX> calc_flag = scdb->calc_flag;
|
std::bitset<SCB_MAX> calc_flag = scdb->calc_flag;
|
||||||
status_data* status = status_get_status_data(*bl);
|
|
||||||
|
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case SC_KEEPING:
|
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);
|
struct block_list* src = map_id2bl(sce->val2);
|
||||||
if( tid == -1 || !src)
|
if( tid == -1 || !src)
|
||||||
break; // Terminated by Damage
|
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;
|
break;
|
||||||
case SC_WUGDASH:
|
case SC_WUGDASH:
|
||||||
@ -13716,7 +13697,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SC_GRAVITYCONTROL:
|
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, 223, AREA);
|
||||||
clif_specialeffect(bl, 330, AREA);
|
clif_specialeffect(bl, 330, AREA);
|
||||||
break;
|
break;
|
||||||
@ -13769,7 +13750,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
|||||||
if( tid != INVALID_TIMER ){
|
if( tid != INVALID_TIMER ){
|
||||||
map_session_data *caster = nullptr;
|
map_session_data *caster = nullptr;
|
||||||
|
|
||||||
if (status_isdead(*bl) || !(caster = map_id2sd(sce->val2)))
|
if (status_isdead(bl) || !(caster = map_id2sd(sce->val2)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
std::shared_ptr<s_skill_db> skill = skill_db.find(RL_H_MINE);
|
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);
|
status_change * const sc = status_get_sc(bl);
|
||||||
|
struct status_data * const status = status_get_status_data(bl);
|
||||||
if(!sc) {
|
if(!sc) {
|
||||||
ShowDebug("status_change_timer: Null pointer id: %d data: %" PRIdPTR " bl-type: %d\n", id, data, bl->type);
|
ShowDebug("status_change_timer: Null pointer id: %d data: %" PRIdPTR " bl-type: %d\n", id, data, bl->type);
|
||||||
return 0;
|
return 0;
|
||||||
@ -13969,8 +13950,6 @@ TIMER_FUNC(status_change_timer){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const status_data* status = status_get_status_data(*bl);
|
|
||||||
|
|
||||||
sd = BL_CAST(BL_PC, bl);
|
sd = BL_CAST(BL_PC, bl);
|
||||||
|
|
||||||
std::function<void (t_tick)> sc_timer_next = [&sce, &bl, &data](t_tick t) {
|
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)
|
int64 damage = 1000 + (3 * status->max_hp) / 100; // Deals fixed (1000 + 3%*MaxHP)
|
||||||
map_freeblock_lock();
|
map_freeblock_lock();
|
||||||
dounlock = true;
|
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;
|
break;
|
||||||
|
|
||||||
@ -14079,7 +14058,7 @@ TIMER_FUNC(status_change_timer){
|
|||||||
if (sce->val3 == 1) { // Target
|
if (sce->val3 == 1) { // Target
|
||||||
map_freeblock_lock();
|
map_freeblock_lock();
|
||||||
dounlock = true;
|
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
|
} else { // Caster
|
||||||
interval = 1000; // Assign here since status_get_sc_internval() contains the target interval.
|
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) {
|
if (sce->val4 >= 0) {
|
||||||
map_freeblock_lock();
|
map_freeblock_lock();
|
||||||
dounlock = true;
|
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);
|
unit_skillcastcancel(bl, 2);
|
||||||
}
|
}
|
||||||
break;
|
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)
|
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();
|
map_freeblock_lock();
|
||||||
dounlock = true;
|
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);
|
unit_skillcastcancel(bl, 2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -14588,7 +14567,7 @@ TIMER_FUNC(status_change_timer){
|
|||||||
if (--(sce->val4) >= 0) {
|
if (--(sce->val4) >= 0) {
|
||||||
struct block_list *src = map_id2bl(sce->val2);
|
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;
|
break;
|
||||||
map_freeblock_lock();
|
map_freeblock_lock();
|
||||||
if (!status_charge(bl, 0, 50))
|
if (!status_charge(bl, 0, 50))
|
||||||
@ -14675,7 +14654,7 @@ TIMER_FUNC(status_change_timer){
|
|||||||
int damage = sce->val2;
|
int damage = sce->val2;
|
||||||
|
|
||||||
map_freeblock_lock();
|
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);
|
status_damage(src, bl, damage,0, 0, 1, 0);
|
||||||
if( sc->getSCE(type) ) {
|
if( sc->getSCE(type) ) {
|
||||||
sc_timer_next(2000 + tick);
|
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.
|
if( sd && !pc_issit(sd) ) { // Force to sit every 10 seconds.
|
||||||
pc_setsit(sd);
|
pc_setsit(sd);
|
||||||
skill_sit(sd, true);
|
skill_sit(sd, true);
|
||||||
clif_sitting(*bl);
|
clif_sitting(bl);
|
||||||
}
|
}
|
||||||
sc_timer_next(10000 + tick);
|
sc_timer_next(10000 + tick);
|
||||||
return 0;
|
return 0;
|
||||||
@ -14794,7 +14773,7 @@ TIMER_FUNC(status_change_timer){
|
|||||||
uint16 x = sce->val3 >> 16, y = sce->val3 & 0xFFFF;
|
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)) {
|
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 );
|
clif_fixpos( *bl );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -14888,7 +14867,7 @@ TIMER_FUNC(status_change_timer){
|
|||||||
struct block_list *star_caster = map_id2bl(sce->val2);
|
struct block_list *star_caster = map_id2bl(sce->val2);
|
||||||
struct skill_unit *star_aoe = (struct skill_unit *)map_id2bl(sce->val3);
|
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;
|
break;
|
||||||
|
|
||||||
sc_timer_next(500 + tick);
|
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.
|
if (--(sce->val4) >= 0) { // Needed to check the caster's location for the range check.
|
||||||
struct block_list *unity_src = map_id2bl(sce->val2);
|
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;
|
break;
|
||||||
|
|
||||||
status_heal(bl, 150 * sce->val1, 0, 2);
|
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
|
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);
|
t_tick tick = va_arg(ap,t_tick);
|
||||||
|
|
||||||
if (status_isdead(*bl))
|
if (status_isdead(bl))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
tsc = status_get_sc(bl);
|
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)
|
static int status_natural_heal(struct block_list* bl, va_list args)
|
||||||
{
|
{
|
||||||
struct regen_data *regen;
|
struct regen_data *regen;
|
||||||
|
struct status_data *status;
|
||||||
status_change *sc;
|
status_change *sc;
|
||||||
struct unit_data *ud;
|
struct unit_data *ud;
|
||||||
struct view_data *vd = nullptr;
|
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);
|
regen = status_get_regen_data(bl);
|
||||||
if (!regen)
|
if (!regen)
|
||||||
return 0;
|
return 0;
|
||||||
|
status = status_get_status_data(bl);
|
||||||
status_data* status = status_get_status_data(*bl);
|
|
||||||
|
|
||||||
sc = status_get_sc(bl);
|
sc = status_get_sc(bl);
|
||||||
if (sc && !sc->count)
|
if (sc && !sc->count)
|
||||||
sc = nullptr;
|
sc = nullptr;
|
||||||
@ -15262,7 +15240,7 @@ static int status_natural_heal(struct block_list* bl, va_list args)
|
|||||||
flag &= ~RGN_SSP;
|
flag &= ~RGN_SSP;
|
||||||
|
|
||||||
if (flag && (
|
if (flag && (
|
||||||
status_isdead(*bl) ||
|
status_isdead(bl) ||
|
||||||
(sc && (sc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || sc->getSCE(SC__INVISIBILITY)))
|
(sc && (sc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || sc->getSCE(SC__INVISIBILITY)))
|
||||||
))
|
))
|
||||||
flag = RGN_NONE;
|
flag = RGN_NONE;
|
||||||
|
@ -1755,7 +1755,7 @@ enum efst_type : short{
|
|||||||
EFST_SPELLFIST,
|
EFST_SPELLFIST,
|
||||||
EFST_NETHERWORLD,
|
EFST_NETHERWORLD,
|
||||||
EFST_SIREN,
|
EFST_SIREN,
|
||||||
EFST_DEEP_SLEEP,
|
EFST_HANDICAPSTATE_DEEP_SLEEP,
|
||||||
EFST_SIRCLEOFNATURE,
|
EFST_SIRCLEOFNATURE,
|
||||||
EFST_COLD,
|
EFST_COLD,
|
||||||
EFST_GLOOMYDAY,
|
EFST_GLOOMYDAY,
|
||||||
@ -1818,7 +1818,7 @@ enum efst_type : short{
|
|||||||
EFST_DROCERA_HERB_STEAMED,
|
EFST_DROCERA_HERB_STEAMED,
|
||||||
EFST_PUTTI_TAILS_NOODLES,
|
EFST_PUTTI_TAILS_NOODLES,
|
||||||
EFST_BANANA_BOMB,
|
EFST_BANANA_BOMB,
|
||||||
EFST_SUMMON_AGNI,
|
XXX_EFST_SM_ELEMENTAL,
|
||||||
EFST_SPELLBOOK4,
|
EFST_SPELLBOOK4,
|
||||||
EFST_SPELLBOOK5,
|
EFST_SPELLBOOK5,
|
||||||
EFST_SPELLBOOK6,
|
EFST_SPELLBOOK6,
|
||||||
@ -1953,8 +1953,8 @@ enum efst_type : short{
|
|||||||
EFST_SET_NUM_MDEF,
|
EFST_SET_NUM_MDEF,
|
||||||
EFST_SET_PER_DEF,
|
EFST_SET_PER_DEF,
|
||||||
EFST_SET_PER_MDEF,
|
EFST_SET_PER_MDEF,
|
||||||
EFST_PARTYBOOKING_SEARCH_DEALY,
|
EFST_PARTYBOOKING_SEARCH_DELAY,
|
||||||
EFST_PARTYBOOKING_REGISTER_DEALY,
|
EFST_PARTYBOOKING_REGISTER_DELAY,
|
||||||
EFST_PERIOD_TIME_CHECK_DETECT_SKILL,
|
EFST_PERIOD_TIME_CHECK_DETECT_SKILL,
|
||||||
EFST_KO_JYUMONJIKIRI,
|
EFST_KO_JYUMONJIKIRI,
|
||||||
EFST_MEIKYOUSISUI,
|
EFST_MEIKYOUSISUI,
|
||||||
@ -1995,7 +1995,7 @@ enum efst_type : short{
|
|||||||
EFST_GLASTHEIM_STATE,
|
EFST_GLASTHEIM_STATE,
|
||||||
EFST_GLASTHEIM_ITEMDEF,
|
EFST_GLASTHEIM_ITEMDEF,
|
||||||
EFST_GLASTHEIM_HPSP,
|
EFST_GLASTHEIM_HPSP,
|
||||||
EFST_HOMUN_SKILL_POSTDELAY,
|
EFST_FOLLOWER_NPC_SKILL_POSTDELAY,
|
||||||
EFST_ALMIGHTY,
|
EFST_ALMIGHTY,
|
||||||
EFST_GVG_GIANT,
|
EFST_GVG_GIANT,
|
||||||
EFST_GVG_GOLEM,
|
EFST_GVG_GOLEM,
|
||||||
@ -2021,7 +2021,7 @@ enum efst_type : short{
|
|||||||
EFST_QUEST_BUFF3,
|
EFST_QUEST_BUFF3,
|
||||||
EFST_REUSE_LIMIT_RECALL,
|
EFST_REUSE_LIMIT_RECALL,
|
||||||
EFST_SAVEPOSITION,
|
EFST_SAVEPOSITION,
|
||||||
EFST_HANDICAPSTATE_ICEEXPLO,
|
EFST_NPC_ICEEXPLO,
|
||||||
EFST_FENRIR_CARD,
|
EFST_FENRIR_CARD,
|
||||||
EFST_REUSE_LIMIT_ASPD_POTION,
|
EFST_REUSE_LIMIT_ASPD_POTION,
|
||||||
EFST_MAXPAIN,
|
EFST_MAXPAIN,
|
||||||
@ -2125,7 +2125,7 @@ enum efst_type : short{
|
|||||||
EFST_GC_POISONINGWEAPON_OPERATOR,
|
EFST_GC_POISONINGWEAPON_OPERATOR,
|
||||||
EFST_WS_WEAPONREFINE_OPERATOR,
|
EFST_WS_WEAPONREFINE_OPERATOR,
|
||||||
EFST_BS_REPAIRWEAPON_OPERATOR,
|
EFST_BS_REPAIRWEAPON_OPERATOR,
|
||||||
EFST_GET_MAILBOX,
|
EFST_UNREADMAIL_CHECK,
|
||||||
EFST_JUMPINGCLAN,
|
EFST_JUMPINGCLAN,
|
||||||
EFST_JP_OTP,
|
EFST_JP_OTP,
|
||||||
EFST_HANDICAPTOLERANCE_LEVELGAP,
|
EFST_HANDICAPTOLERANCE_LEVELGAP,
|
||||||
@ -2446,13 +2446,13 @@ enum efst_type : short{
|
|||||||
EFST_PERIOD_USE_WORLDMAP,
|
EFST_PERIOD_USE_WORLDMAP,
|
||||||
EFST_MISTY_FROST,
|
EFST_MISTY_FROST,
|
||||||
EFST_MAGIC_POISON,
|
EFST_MAGIC_POISON,
|
||||||
EFST_MOVE_AGIT,
|
EFST_KAUTE,
|
||||||
EFST_REUSE_JPNONLY_LIMIT_I,
|
EFST_REUSE_JPNONLY_LIMIT_I,
|
||||||
EFST_REUSE_JPNONLY_LIMIT_J,
|
EFST_REUSE_JPNONLY_LIMIT_J,
|
||||||
EFST_REUSE_JPNONLY_LIMIT_K,
|
EFST_REUSE_JPNONLY_LIMIT_K,
|
||||||
EFST_JPNONLY_TACTICS,
|
EFST_JPNONLY_TACTICS,
|
||||||
EFST_PRISON,
|
EFST_PRISON,
|
||||||
EFST_MADOGEAR_TYPE,
|
EFST_MADOGEAR,
|
||||||
EFST_DEADLY_DEFEASANCE,
|
EFST_DEADLY_DEFEASANCE,
|
||||||
EFST_CLIMAX_DES_HU,
|
EFST_CLIMAX_DES_HU,
|
||||||
EFST_CLIMAX,
|
EFST_CLIMAX,
|
||||||
@ -2736,50 +2736,6 @@ enum efst_type : short{
|
|||||||
EFST_C_RATE_PLUS,
|
EFST_C_RATE_PLUS,
|
||||||
EFST_RESIST_PLUS,
|
EFST_RESIST_PLUS,
|
||||||
EFST_PVP_DUN_BUFF,
|
EFST_PVP_DUN_BUFF,
|
||||||
|
|
||||||
EFST_TARGET_MARKER = 1453,
|
|
||||||
EFST_BLOCK_SEAL,
|
|
||||||
EFST_FROST_STORM,
|
|
||||||
EFST_GROGGY,
|
|
||||||
EFST_WARM_SHIELD, //1457
|
|
||||||
|
|
||||||
EFST_CONTENTS_1 = 1459,
|
|
||||||
EFST_CONTENTS_2,
|
|
||||||
EFST_CONTENTS_3,
|
|
||||||
EFST_CONTENTS_4,
|
|
||||||
EFST_CONTENTS_5,
|
|
||||||
EFST_CONTENTS_6,
|
|
||||||
EFST_CONTENTS_7,
|
|
||||||
EFST_CONTENTS_8,
|
|
||||||
EFST_CONTENTS_9,
|
|
||||||
EFST_CONTENTS_10,
|
|
||||||
EFST_CONTENTS_11,
|
|
||||||
EFST_CONTENTS_12,
|
|
||||||
EFST_CONTENTS_13,
|
|
||||||
EFST_CONTENTS_14,
|
|
||||||
EFST_CONTENTS_15,
|
|
||||||
EFST_CONTENTS_16,
|
|
||||||
EFST_CONTENTS_17,
|
|
||||||
EFST_CONTENTS_18,
|
|
||||||
EFST_CONTENTS_19,
|
|
||||||
EFST_CONTENTS_20,
|
|
||||||
EFST_CONTENTS_21,
|
|
||||||
EFST_CONTENTS_22,
|
|
||||||
EFST_CONTENTS_23,
|
|
||||||
EFST_CONTENTS_24,
|
|
||||||
EFST_CONTENTS_25, //1483
|
|
||||||
|
|
||||||
EFST_C_BUFF_1 = 1509,
|
|
||||||
EFST_C_BUFF_2,
|
|
||||||
|
|
||||||
EFST_CHASING = 1560,
|
|
||||||
|
|
||||||
EFST_MYSTERY_POWDER = 1665,
|
|
||||||
|
|
||||||
EFST_FIRE_CHARM_POWER = 1667,
|
|
||||||
EFST_WATER_CHARM_POWER,
|
|
||||||
EFST_WIND_CHARM_POWER,
|
|
||||||
EFST_GROUND_CHARM_POWER,
|
|
||||||
/// @APIHOOK_END
|
/// @APIHOOK_END
|
||||||
/// Do not modify code above this, since it will be automatically generated by the API again
|
/// Do not modify code above this, since it will be automatically generated by the API again
|
||||||
EFST_MAX,
|
EFST_MAX,
|
||||||
@ -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);
|
int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp, unsigned char per_ap = 0);
|
||||||
|
|
||||||
struct regen_data *status_get_regen_data(struct block_list *bl);
|
struct regen_data *status_get_regen_data(struct block_list *bl);
|
||||||
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);
|
struct status_data *status_get_base_status(struct block_list *bl);
|
||||||
const char * status_get_name(struct block_list *bl);
|
const char * status_get_name(struct block_list *bl);
|
||||||
int status_get_class(struct block_list *bl);
|
int status_get_class(struct block_list *bl);
|
||||||
int status_get_lv(struct block_list *bl);
|
int status_get_lv(struct block_list *bl);
|
||||||
#define status_get_range(bl) status_get_status_data(*bl)->rhw.range
|
#define status_get_range(bl) status_get_status_data(bl)->rhw.range
|
||||||
#define status_get_hp(bl) status_get_status_data(*bl)->hp
|
#define status_get_hp(bl) status_get_status_data(bl)->hp
|
||||||
#define status_get_max_hp(bl) status_get_status_data(*bl)->max_hp
|
#define status_get_max_hp(bl) status_get_status_data(bl)->max_hp
|
||||||
#define status_get_sp(bl) status_get_status_data(*bl)->sp
|
#define status_get_sp(bl) status_get_status_data(bl)->sp
|
||||||
#define status_get_max_sp(bl) status_get_status_data(*bl)->max_sp
|
#define status_get_max_sp(bl) status_get_status_data(bl)->max_sp
|
||||||
#define status_get_ap(bl) status_get_status_data(*bl)->ap
|
#define status_get_ap(bl) status_get_status_data(bl)->ap
|
||||||
#define status_get_max_ap(bl) status_get_status_data(*bl)->max_ap
|
#define status_get_max_ap(bl) status_get_status_data(bl)->max_ap
|
||||||
#define status_get_str(bl) status_get_status_data(*bl)->str
|
#define status_get_str(bl) status_get_status_data(bl)->str
|
||||||
#define status_get_agi(bl) status_get_status_data(*bl)->agi
|
#define status_get_agi(bl) status_get_status_data(bl)->agi
|
||||||
#define status_get_vit(bl) status_get_status_data(*bl)->vit
|
#define status_get_vit(bl) status_get_status_data(bl)->vit
|
||||||
#define status_get_int(bl) status_get_status_data(*bl)->int_
|
#define status_get_int(bl) status_get_status_data(bl)->int_
|
||||||
#define status_get_dex(bl) status_get_status_data(*bl)->dex
|
#define status_get_dex(bl) status_get_status_data(bl)->dex
|
||||||
#define status_get_luk(bl) status_get_status_data(*bl)->luk
|
#define status_get_luk(bl) status_get_status_data(bl)->luk
|
||||||
#define status_get_pow(bl) status_get_status_data(*bl)->pow
|
#define status_get_pow(bl) status_get_status_data(bl)->pow
|
||||||
#define status_get_sta(bl) status_get_status_data(*bl)->sta
|
#define status_get_sta(bl) status_get_status_data(bl)->sta
|
||||||
#define status_get_wis(bl) status_get_status_data(*bl)->wis
|
#define status_get_wis(bl) status_get_status_data(bl)->wis
|
||||||
#define status_get_spl(bl) status_get_status_data(*bl)->spl
|
#define status_get_spl(bl) status_get_status_data(bl)->spl
|
||||||
#define status_get_con(bl) status_get_status_data(*bl)->con
|
#define status_get_con(bl) status_get_status_data(bl)->con
|
||||||
#define status_get_crt(bl) status_get_status_data(*bl)->crt
|
#define status_get_crt(bl) status_get_status_data(bl)->crt
|
||||||
#define status_get_hit(bl) status_get_status_data(*bl)->hit
|
#define status_get_hit(bl) status_get_status_data(bl)->hit
|
||||||
#define status_get_flee(bl) status_get_status_data(*bl)->flee
|
#define status_get_flee(bl) status_get_status_data(bl)->flee
|
||||||
defType status_get_def(struct block_list *bl);
|
defType status_get_def(struct block_list *bl);
|
||||||
#define status_get_mdef(bl) status_get_status_data(*bl)->mdef
|
#define status_get_mdef(bl) status_get_status_data(bl)->mdef
|
||||||
#define status_get_flee2(bl) status_get_status_data(*bl)->flee2
|
#define status_get_flee2(bl) status_get_status_data(bl)->flee2
|
||||||
#define status_get_def2(bl) status_get_status_data(*bl)->def2
|
#define status_get_def2(bl) status_get_status_data(bl)->def2
|
||||||
#define status_get_mdef2(bl) status_get_status_data(*bl)->mdef2
|
#define status_get_mdef2(bl) status_get_status_data(bl)->mdef2
|
||||||
#define status_get_critical(bl) status_get_status_data(*bl)->cri
|
#define status_get_critical(bl) status_get_status_data(bl)->cri
|
||||||
#define status_get_batk(bl) status_get_status_data(*bl)->batk
|
#define status_get_batk(bl) status_get_status_data(bl)->batk
|
||||||
#define status_get_watk(bl) status_get_status_data(*bl)->rhw.atk
|
#define status_get_watk(bl) status_get_status_data(bl)->rhw.atk
|
||||||
#define status_get_watk2(bl) status_get_status_data(*bl)->rhw.atk2
|
#define status_get_watk2(bl) status_get_status_data(bl)->rhw.atk2
|
||||||
#define status_get_matk_max(bl) status_get_status_data(*bl)->matk_max
|
#define status_get_matk_max(bl) status_get_status_data(bl)->matk_max
|
||||||
#define status_get_matk_min(bl) status_get_status_data(*bl)->matk_min
|
#define status_get_matk_min(bl) status_get_status_data(bl)->matk_min
|
||||||
#define status_get_lwatk(bl) status_get_status_data(*bl)->lhw.atk
|
#define status_get_lwatk(bl) status_get_status_data(bl)->lhw.atk
|
||||||
#define status_get_lwatk2(bl) status_get_status_data(*bl)->lhw.atk2
|
#define status_get_lwatk2(bl) status_get_status_data(bl)->lhw.atk2
|
||||||
unsigned short status_get_speed(struct block_list *bl);
|
unsigned short status_get_speed(struct block_list *bl);
|
||||||
#define status_get_adelay(bl) status_get_status_data(*bl)->adelay
|
#define status_get_adelay(bl) status_get_status_data(bl)->adelay
|
||||||
#define status_get_amotion(bl) status_get_status_data(*bl)->amotion
|
#define status_get_amotion(bl) status_get_status_data(bl)->amotion
|
||||||
#define status_get_clientamotion(bl) status_get_status_data(*bl)->clientamotion
|
#define status_get_clientamotion(bl) status_get_status_data(bl)->clientamotion
|
||||||
#define status_get_dmotion(bl) status_get_status_data(*bl)->dmotion
|
#define status_get_dmotion(bl) status_get_status_data(bl)->dmotion
|
||||||
#define status_get_patk(bl) status_get_status_data(*bl)->patk
|
#define status_get_patk(bl) status_get_status_data(bl)->patk
|
||||||
#define status_get_smatk(bl) status_get_status_data(*bl)->smatk
|
#define status_get_smatk(bl) status_get_status_data(bl)->smatk
|
||||||
#define status_get_res(bl) status_get_status_data(*bl)->res
|
#define status_get_res(bl) status_get_status_data(bl)->res
|
||||||
#define status_get_mres(bl) status_get_status_data(*bl)->mres
|
#define status_get_mres(bl) status_get_status_data(bl)->mres
|
||||||
#define status_get_hplus(bl) status_get_status_data(*bl)->hplus
|
#define status_get_hplus(bl) status_get_status_data(bl)->hplus
|
||||||
#define status_get_crate(bl) status_get_status_data(*bl)->crate
|
#define status_get_crate(bl) status_get_status_data(bl)->crate
|
||||||
#define status_get_element(bl) status_get_status_data(*bl)->def_ele
|
#define status_get_element(bl) status_get_status_data(bl)->def_ele
|
||||||
#define status_get_element_level(bl) status_get_status_data(*bl)->ele_lv
|
#define status_get_element_level(bl) status_get_status_data(bl)->ele_lv
|
||||||
unsigned char status_calc_attack_element(struct block_list *bl, status_change *sc, int element);
|
unsigned char status_calc_attack_element(struct block_list *bl, status_change *sc, int element);
|
||||||
#define status_get_attack_sc_element(bl, sc) status_calc_attack_element(bl, sc, 0)
|
#define status_get_attack_sc_element(bl, sc) status_calc_attack_element(bl, sc, 0)
|
||||||
#define status_get_attack_element(bl) status_get_status_data(*bl)->rhw.ele
|
#define status_get_attack_element(bl) status_get_status_data(bl)->rhw.ele
|
||||||
#define status_get_attack_lelement(bl) status_get_status_data(*bl)->lhw.ele
|
#define status_get_attack_lelement(bl) status_get_status_data(bl)->lhw.ele
|
||||||
#define status_get_race(bl) status_get_status_data(*bl)->race
|
#define status_get_race(bl) status_get_status_data(bl)->race
|
||||||
#define status_get_class_(bl) status_get_status_data(*bl)->class_
|
#define status_get_class_(bl) status_get_status_data(bl)->class_
|
||||||
#define status_get_size(bl) status_get_status_data(*bl)->size
|
#define status_get_size(bl) status_get_status_data(bl)->size
|
||||||
#define status_get_mode(bl) status_get_status_data(*bl)->mode
|
#define status_get_mode(bl) status_get_status_data(bl)->mode
|
||||||
#define status_has_mode(status,md) (((status)->mode&(md)) == (md))
|
#define status_has_mode(status,md) (((status)->mode&(md)) == (md))
|
||||||
#define status_bl_has_mode(bl,md) status_has_mode(status_get_status_data(*(bl)),(md))
|
#define status_bl_has_mode(bl,md) status_has_mode(status_get_status_data((bl)),(md))
|
||||||
|
|
||||||
#define status_get_homstr(bl) (status->str + ((TBL_HOM*)bl)->homunculus.str_value)
|
#define status_get_homstr(bl) (status->str + ((TBL_HOM*)bl)->homunculus.str_value)
|
||||||
#define status_get_homagi(bl) (status->agi + ((TBL_HOM*)bl)->homunculus.agi_value)
|
#define status_get_homagi(bl) (status->agi + ((TBL_HOM*)bl)->homunculus.agi_value)
|
||||||
@ -3479,7 +3435,7 @@ void status_set_viewdata(struct block_list *bl, int class_);
|
|||||||
void status_change_init(struct block_list *bl);
|
void status_change_init(struct block_list *bl);
|
||||||
status_change *status_get_sc(struct block_list *bl);
|
status_change *status_get_sc(struct block_list *bl);
|
||||||
|
|
||||||
bool status_isdead(block_list &bl);
|
int status_isdead(struct block_list *bl);
|
||||||
int status_isimmune(struct block_list *bl);
|
int status_isimmune(struct block_list *bl);
|
||||||
|
|
||||||
t_tick status_get_sc_def(struct block_list *src,struct block_list *bl, enum sc_type type, int rate, t_tick tick, unsigned char flag);
|
t_tick status_get_sc_def(struct block_list *src,struct block_list *bl, enum sc_type type, int rate, t_tick tick, unsigned char flag);
|
||||||
|
@ -38,58 +38,54 @@ void trade_traderequest(map_session_data *sd, map_session_data *target_sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (target_sd == nullptr || sd == target_sd) {
|
if (target_sd == nullptr || sd == target_sd) {
|
||||||
clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST);
|
clif_tradestart(sd, 1); // character does not exist
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target_sd->npc_id) { // Trade fails if you are using an NPC.
|
if (target_sd->npc_id) { // Trade fails if you are using an NPC.
|
||||||
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
clif_tradestart(sd, 2);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!battle_config.invite_request_check) {
|
if (!battle_config.invite_request_check) {
|
||||||
if (target_sd->guild_invite > 0 || target_sd->party_invite > 0 || target_sd->adopt_invite) {
|
if (target_sd->guild_invite > 0 || target_sd->party_invite > 0 || target_sd->adopt_invite) {
|
||||||
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
clif_tradestart(sd, 2);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( sd->trade_partner.id != 0 ) { // If a character tries to trade to another one then cancel the previous one
|
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.id);
|
map_session_data *previous_sd = map_id2sd(sd->trade_partner);
|
||||||
|
|
||||||
if( previous_sd != nullptr ){
|
if( previous_sd != nullptr ){
|
||||||
previous_sd->trade_partner = {0,0};
|
previous_sd->trade_partner = 0;
|
||||||
clif_tradecancelled( *previous_sd );
|
clif_tradecancelled( *previous_sd );
|
||||||
} // Once cancelled then continue to the new one.
|
} // Once cancelled then continue to the new one.
|
||||||
sd->trade_partner = {0,0};
|
sd->trade_partner = 0;
|
||||||
clif_tradecancelled( *sd );
|
clif_tradecancelled( *sd );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target_sd->trade_partner.id != 0) {
|
if (target_sd->trade_partner != 0) {
|
||||||
clif_traderesponse(*sd, TRADE_ACK_FAILED); // person is in another trade
|
clif_tradestart(sd, 2); // person is in another trade
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) { // check if both GMs are allowed to trade
|
if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) { // check if both GMs are allowed to trade
|
||||||
clif_displaymessage(sd->fd, msg_txt(sd,246));
|
clif_displaymessage(sd->fd, msg_txt(sd,246));
|
||||||
clif_traderesponse(*sd, TRADE_ACK_FAILED); // GM is not allowed to trade
|
clif_tradestart(sd, 2); // GM is not allowed to trade
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Players can not request trade from far away, unless they are allowed to use @trade.
|
// Players can not request trade from far away, unless they are allowed to use @trade.
|
||||||
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
||||||
(sd->bl.m != target_sd->bl.m || !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE))) {
|
(sd->bl.m != target_sd->bl.m || !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE))) {
|
||||||
clif_traderesponse(*sd, TRADE_ACK_TOOFAR);
|
clif_tradestart(sd, 0); // too far
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
target_sd->trade_partner.id = sd->status.account_id;
|
target_sd->trade_partner = sd->status.account_id;
|
||||||
target_sd->trade_partner.lv = sd->status.base_level;
|
sd->trade_partner = target_sd->status.account_id;
|
||||||
|
clif_traderequest(target_sd, sd->status.name);
|
||||||
sd->trade_partner.id = target_sd->status.account_id;
|
|
||||||
sd->trade_partner.lv = target_sd->status.base_level;
|
|
||||||
|
|
||||||
clif_traderequest(*target_sd, sd->status.name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -111,28 +107,28 @@ void trade_tradeack(map_session_data *sd, int type)
|
|||||||
|
|
||||||
nullpo_retv(sd);
|
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.
|
return; // Already trading or no partner set.
|
||||||
|
|
||||||
if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) {
|
if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) {
|
||||||
clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST);
|
clif_tradestart(sd, 1); // Character does not exist
|
||||||
sd->trade_partner = {0,0};
|
sd->trade_partner=0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsd->state.trading || tsd->trade_partner.id != sd->bl.id) {
|
if (tsd->state.trading || tsd->trade_partner != sd->bl.id) {
|
||||||
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
clif_tradestart(sd, 2);
|
||||||
sd->trade_partner = {0,0};
|
sd->trade_partner=0;
|
||||||
return; // Already trading or wrong partner.
|
return; // Already trading or wrong partner.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == 4) { // Cancel
|
if (type == 4) { // Cancel
|
||||||
clif_traderesponse(*tsd, TRADE_ACK_CANCEL);
|
clif_tradestart(tsd, type);
|
||||||
clif_traderesponse(*sd, TRADE_ACK_CANCEL);
|
clif_tradestart(sd, type);
|
||||||
sd->state.deal_locked = 0;
|
sd->state.deal_locked = 0;
|
||||||
sd->trade_partner = {0,0};
|
sd->trade_partner = 0;
|
||||||
tsd->state.deal_locked = 0;
|
tsd->state.deal_locked = 0;
|
||||||
tsd->trade_partner = {0,0};
|
tsd->trade_partner = 0;
|
||||||
return;
|
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.
|
// Check here as well since the original character could had warped.
|
||||||
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
||||||
(sd->bl.m != tsd->bl.m || !check_distance_bl(&sd->bl, &tsd->bl, TRADE_DISTANCE))) {
|
(sd->bl.m != tsd->bl.m || !check_distance_bl(&sd->bl, &tsd->bl, TRADE_DISTANCE))) {
|
||||||
clif_traderesponse(*sd, TRADE_ACK_TOOFAR);
|
clif_tradestart(sd, 0); // too far
|
||||||
sd->trade_partner = {0,0};
|
sd->trade_partner=0;
|
||||||
tsd->trade_partner = {0,0};
|
tsd->trade_partner = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if you can start trade.
|
// Check if you can start trade.
|
||||||
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag ||
|
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag ||
|
||||||
tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag) { // Fail
|
tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag) { // Fail
|
||||||
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
clif_tradestart(sd, 2);
|
||||||
clif_traderesponse(*tsd, TRADE_ACK_FAILED);
|
clif_tradestart(tsd, 2);
|
||||||
sd->state.deal_locked = 0;
|
sd->state.deal_locked = 0;
|
||||||
sd->trade_partner = {0,0};
|
sd->trade_partner = 0;
|
||||||
tsd->state.deal_locked = 0;
|
tsd->state.deal_locked = 0;
|
||||||
tsd->trade_partner = {0,0};
|
tsd->trade_partner = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,8 +162,8 @@ void trade_tradeack(map_session_data *sd, int type)
|
|||||||
tsd->state.trading = 1;
|
tsd->state.trading = 1;
|
||||||
memset(&sd->deal, 0, sizeof(sd->deal));
|
memset(&sd->deal, 0, sizeof(sd->deal));
|
||||||
memset(&tsd->deal, 0, sizeof(tsd->deal));
|
memset(&tsd->deal, 0, sizeof(tsd->deal));
|
||||||
clif_traderesponse(*tsd, static_cast<e_ack_trade_response>( type ));
|
clif_tradestart(tsd, type);
|
||||||
clif_traderesponse(*sd, static_cast<e_ack_trade_response>( 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 )
|
if( !sd->state.trading || sd->state.deal_locked > 0 )
|
||||||
return; // Can't add stuff.
|
return; // Can't add stuff.
|
||||||
|
|
||||||
if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) {
|
if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) {
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -457,7 +453,7 @@ void trade_tradeaddzeny(map_session_data* sd, int amount)
|
|||||||
if( !sd->state.trading || sd->state.deal_locked > 0 )
|
if( !sd->state.trading || sd->state.deal_locked > 0 )
|
||||||
return; //Can't add stuff.
|
return; //Can't add stuff.
|
||||||
|
|
||||||
if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) {
|
if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) {
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -482,7 +478,7 @@ void trade_tradeok(map_session_data *sd)
|
|||||||
if(sd->state.deal_locked || !sd->state.trading)
|
if(sd->state.deal_locked || !sd->state.trading)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((target_sd = map_id2sd(sd->trade_partner.id)) == nullptr) {
|
if ((target_sd = map_id2sd(sd->trade_partner)) == nullptr) {
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -504,15 +500,15 @@ void trade_tradecancel(map_session_data *sd)
|
|||||||
|
|
||||||
nullpo_retv(sd);
|
nullpo_retv(sd);
|
||||||
|
|
||||||
target_sd = map_id2sd(sd->trade_partner.id);
|
target_sd = map_id2sd(sd->trade_partner);
|
||||||
sd->state.isBoundTrading = 0;
|
sd->state.isBoundTrading = 0;
|
||||||
|
|
||||||
if(!sd->state.trading) { // Not trade accepted
|
if(!sd->state.trading) { // Not trade accepted
|
||||||
if( target_sd != nullptr ) {
|
if( target_sd != nullptr ) {
|
||||||
target_sd->trade_partner = {0,0};
|
target_sd->trade_partner = 0;
|
||||||
clif_tradecancelled( *target_sd );
|
clif_tradecancelled( *target_sd );
|
||||||
}
|
}
|
||||||
sd->trade_partner = {0,0};
|
sd->trade_partner = 0;
|
||||||
clif_tradecancelled( *sd );
|
clif_tradecancelled( *sd );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -533,7 +529,7 @@ void trade_tradecancel(map_session_data *sd)
|
|||||||
|
|
||||||
sd->state.deal_locked = 0;
|
sd->state.deal_locked = 0;
|
||||||
sd->state.trading = 0;
|
sd->state.trading = 0;
|
||||||
sd->trade_partner = {0,0};
|
sd->trade_partner = 0;
|
||||||
clif_tradecancelled( *sd );
|
clif_tradecancelled( *sd );
|
||||||
|
|
||||||
if (!target_sd)
|
if (!target_sd)
|
||||||
@ -553,7 +549,7 @@ void trade_tradecancel(map_session_data *sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
target_sd->state.deal_locked = 0;
|
target_sd->state.deal_locked = 0;
|
||||||
target_sd->trade_partner = {0,0};
|
target_sd->trade_partner = 0;
|
||||||
target_sd->state.trading = 0;
|
target_sd->state.trading = 0;
|
||||||
clif_tradecancelled( *target_sd );
|
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.
|
if (!sd->state.trading || !sd->state.deal_locked) //Locked should be 1 (pressed ok) before you can press trade.
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) {
|
if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) {
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -646,12 +642,12 @@ void trade_tradecommit(map_session_data *sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sd->state.deal_locked = 0;
|
sd->state.deal_locked = 0;
|
||||||
sd->trade_partner = {0,0};
|
sd->trade_partner = 0;
|
||||||
sd->state.trading = 0;
|
sd->state.trading = 0;
|
||||||
sd->state.isBoundTrading = 0;
|
sd->state.isBoundTrading = 0;
|
||||||
|
|
||||||
tsd->state.deal_locked = 0;
|
tsd->state.deal_locked = 0;
|
||||||
tsd->trade_partner = {0,0};
|
tsd->trade_partner = 0;
|
||||||
tsd->state.trading = 0;
|
tsd->state.trading = 0;
|
||||||
tsd->state.isBoundTrading = 0;
|
tsd->state.isBoundTrading = 0;
|
||||||
|
|
||||||
|
@ -4,19 +4,8 @@
|
|||||||
#ifndef TRADE_HPP
|
#ifndef TRADE_HPP
|
||||||
#define TRADE_HPP
|
#define TRADE_HPP
|
||||||
|
|
||||||
#include <common/cbasetypes.hpp>
|
|
||||||
|
|
||||||
class map_session_data;
|
class map_session_data;
|
||||||
|
|
||||||
enum e_ack_trade_response : uint8 {
|
|
||||||
TRADE_ACK_TOOFAR = 0,
|
|
||||||
TRADE_ACK_CHARNOTEXIST,
|
|
||||||
TRADE_ACK_FAILED,
|
|
||||||
TRADE_ACK_ACCEPT,
|
|
||||||
TRADE_ACK_CANCEL,
|
|
||||||
TRADE_ACK_BUSY
|
|
||||||
};
|
|
||||||
|
|
||||||
void trade_traderequest(map_session_data *sd, map_session_data *target_sd);
|
void trade_traderequest(map_session_data *sd, map_session_data *target_sd);
|
||||||
void trade_tradeack(map_session_data *sd,int type);
|
void trade_tradeack(map_session_data *sd,int type);
|
||||||
void trade_tradeadditem(map_session_data *sd,short index,short amount);
|
void trade_tradeadditem(map_session_data *sd,short index,short amount);
|
||||||
|
@ -507,7 +507,7 @@ static TIMER_FUNC(unit_walktoxy_timer)
|
|||||||
ud->state.walk_script = false;
|
ud->state.walk_script = false;
|
||||||
|
|
||||||
// Check if the unit was killed
|
// Check if the unit was killed
|
||||||
if( status_isdead(*bl) ){
|
if( status_isdead(bl) ){
|
||||||
struct mob_data* md = BL_CAST(BL_MOB, bl);
|
struct mob_data* md = BL_CAST(BL_MOB, bl);
|
||||||
|
|
||||||
if( md && !md->spawn ){
|
if( md && !md->spawn ){
|
||||||
@ -1132,7 +1132,7 @@ bool unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, boo
|
|||||||
|
|
||||||
if( flag ) {
|
if( flag ) {
|
||||||
unit_movepos(pbl,sd->bl.x,sd->bl.y, 0, 0);
|
unit_movepos(pbl,sd->bl.x,sd->bl.y, 0, 0);
|
||||||
clif_slide(*pbl,pbl->x,pbl->y);
|
clif_slide(pbl,pbl->x,pbl->y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1166,7 +1166,7 @@ bool unit_setdir(block_list *bl, uint8 dir, bool send_update)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (send_update)
|
if (send_update)
|
||||||
clif_changed_dir(*bl, AREA);
|
clif_changed_dir(bl, AREA);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1639,9 +1639,9 @@ TIMER_FUNC(unit_resume_running){
|
|||||||
TBL_PC *sd = map_id2sd(id);
|
TBL_PC *sd = map_id2sd(id);
|
||||||
|
|
||||||
if (sd && pc_isridingwug(sd))
|
if (sd && pc_isridingwug(sd))
|
||||||
clif_skill_nodamage(ud->bl,*ud->bl,RA_WUGDASH,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_WUGDASH,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
|
clif_skill_nodamage(ud->bl,ud->bl,RA_WUGDASH,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_WUGDASH,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
|
||||||
else
|
else
|
||||||
clif_skill_nodamage(ud->bl,*ud->bl,TK_RUN,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_RUN,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
|
clif_skill_nodamage(ud->bl,ud->bl,TK_RUN,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_RUN,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
|
||||||
|
|
||||||
if (sd)
|
if (sd)
|
||||||
clif_walkok(*sd);
|
clif_walkok(*sd);
|
||||||
@ -1668,7 +1668,7 @@ int unit_set_walkdelay(struct block_list *bl, t_tick tick, t_tick delay, int typ
|
|||||||
|
|
||||||
if (type) {
|
if (type) {
|
||||||
//Bosses can ignore skill induced walkdelay (but not damage induced)
|
//Bosses can ignore skill induced walkdelay (but not damage induced)
|
||||||
if(bl->type == BL_MOB && status_has_mode(status_get_status_data(*bl),MD_STATUSIMMUNE))
|
if(bl->type == BL_MOB && status_has_mode(status_get_status_data(bl),MD_STATUSIMMUNE))
|
||||||
return 0;
|
return 0;
|
||||||
//Make sure walk delay is not decreased
|
//Make sure walk delay is not decreased
|
||||||
if (DIFF_TICK(ud->canmove_tick, tick+delay) > 0)
|
if (DIFF_TICK(ud->canmove_tick, tick+delay) > 0)
|
||||||
@ -1724,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)
|
int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, uint16 skill_lv, int casttime, int castcancel, bool ignore_range)
|
||||||
{
|
{
|
||||||
struct unit_data *ud;
|
struct unit_data *ud;
|
||||||
|
struct status_data *tstatus;
|
||||||
status_change *sc;
|
status_change *sc;
|
||||||
map_session_data *sd = nullptr;
|
map_session_data *sd = nullptr;
|
||||||
struct block_list * target = nullptr;
|
struct block_list * target = nullptr;
|
||||||
@ -1732,7 +1733,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
|||||||
|
|
||||||
nullpo_ret(src);
|
nullpo_ret(src);
|
||||||
|
|
||||||
if(status_isdead(*src))
|
if(status_isdead(src))
|
||||||
return 0; // Do not continue source is dead
|
return 0; // Do not continue source is dead
|
||||||
|
|
||||||
sd = BL_CAST(BL_PC, src);
|
sd = BL_CAST(BL_PC, src);
|
||||||
@ -1872,7 +1873,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_data* tstatus = status_get_status_data(*target);
|
tstatus = status_get_status_data(target);
|
||||||
|
|
||||||
// Record the status of the previous skill)
|
// Record the status of the previous skill)
|
||||||
if(sd) {
|
if(sd) {
|
||||||
@ -2017,7 +2018,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
|||||||
case ALL_RESURRECTION:
|
case ALL_RESURRECTION:
|
||||||
if(battle_check_undead(tstatus->race,tstatus->def_ele))
|
if(battle_check_undead(tstatus->race,tstatus->def_ele))
|
||||||
combo = 1;
|
combo = 1;
|
||||||
else if (!status_isdead(*target))
|
else if (!status_isdead(target))
|
||||||
return 0; // Can't cast on non-dead characters.
|
return 0; // Can't cast on non-dead characters.
|
||||||
break;
|
break;
|
||||||
case MO_FINGEROFFENSIVE:
|
case MO_FINGEROFFENSIVE:
|
||||||
@ -2250,7 +2251,7 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
|
|||||||
if (!src->prev)
|
if (!src->prev)
|
||||||
return 0; // Not on the map
|
return 0; // Not on the map
|
||||||
|
|
||||||
if(status_isdead(*src))
|
if(status_isdead(src))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
sd = BL_CAST(BL_PC, src);
|
sd = BL_CAST(BL_PC, src);
|
||||||
@ -2538,7 +2539,7 @@ int unit_attack(struct block_list *src,int target_id,int continuous)
|
|||||||
nullpo_ret(ud = unit_bl2ud(src));
|
nullpo_ret(ud = unit_bl2ud(src));
|
||||||
|
|
||||||
target = map_id2bl(target_id);
|
target = map_id2bl(target_id);
|
||||||
if( target == nullptr || status_isdead(*target) ) {
|
if( target == nullptr || status_isdead(target) ) {
|
||||||
unit_unattackable(src);
|
unit_unattackable(src);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -2796,6 +2797,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
|
|||||||
{
|
{
|
||||||
struct block_list *target;
|
struct block_list *target;
|
||||||
struct unit_data *ud;
|
struct unit_data *ud;
|
||||||
|
struct status_data *sstatus;
|
||||||
map_session_data *sd = nullptr;
|
map_session_data *sd = nullptr;
|
||||||
struct mob_data *md = nullptr;
|
struct mob_data *md = nullptr;
|
||||||
int range;
|
int range;
|
||||||
@ -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 )
|
if( src == nullptr || src->prev == nullptr || target==nullptr || target->prev == nullptr )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if( status_isdead(*src) || status_isdead(*target) ||
|
if( status_isdead(src) || status_isdead(target) ||
|
||||||
battle_check_target(src,target,BCT_ENEMY) <= 0 || !status_check_skilluse(src, target, 0, 0)
|
battle_check_target(src,target,BCT_ENEMY) <= 0 || !status_check_skilluse(src, target, 0, 0)
|
||||||
#ifdef OFFICIAL_WALKPATH
|
#ifdef OFFICIAL_WALKPATH
|
||||||
|| !path_search_long(nullptr, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL)
|
|| !path_search_long(nullptr, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL)
|
||||||
@ -2854,7 +2856,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_data* sstatus = status_get_status_data(*src);
|
sstatus = status_get_status_data(src);
|
||||||
range = sstatus->rhw.range;
|
range = sstatus->rhw.range;
|
||||||
|
|
||||||
if( (unit_is_walking(target) || ud->state.step_attack)
|
if( (unit_is_walking(target) || ud->state.step_attack)
|
||||||
@ -3130,44 +3132,32 @@ int unit_counttargeted(struct block_list* bl)
|
|||||||
* @param src Current target
|
* @param src Current target
|
||||||
* @param target New target
|
* @param target New target
|
||||||
**/
|
**/
|
||||||
int unit_changetarget(block_list *bl, va_list ap) {
|
int unit_changetarget(struct block_list *bl, va_list ap) {
|
||||||
if (bl == nullptr)
|
struct unit_data *ud = unit_bl2ud(bl);
|
||||||
return 1;
|
struct block_list *src = va_arg(ap,struct block_list *);
|
||||||
unit_data *ud = unit_bl2ud(bl);
|
struct block_list *target = va_arg(ap,struct block_list *);
|
||||||
block_list *src = va_arg(ap, block_list *);
|
|
||||||
block_list *target = va_arg(ap, block_list *);
|
|
||||||
|
|
||||||
if (ud == nullptr || src == nullptr || target == nullptr || ud->target == target->id)
|
if (!ud || !target || ud->target == target->id)
|
||||||
return 1;
|
return 1;
|
||||||
if (ud->target <= 0 && ud->target_to <= 0)
|
if (!ud->target && !ud->target_to)
|
||||||
return 1;
|
return 1;
|
||||||
if (ud->target != src->id && ud->target_to != src->id)
|
if (ud->target != src->id && ud->target_to != src->id)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
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);
|
//unit_attack(bl, target->id, ud->state.attack_continue);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the target of a unit
|
|
||||||
* @param ud: Unit data
|
|
||||||
* @param target: New target data
|
|
||||||
**/
|
|
||||||
void unit_changetarget_sub(unit_data& ud, block_list& target) {
|
|
||||||
if (status_isdead(target))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (ud.bl->type == BL_MOB)
|
|
||||||
reinterpret_cast<mob_data*>(ud.bl)->target_id = target.id;
|
|
||||||
if (ud.target_to > 0)
|
|
||||||
ud.target_to = target.id;
|
|
||||||
if (ud.skilltarget > 0)
|
|
||||||
ud.skilltarget = target.id;
|
|
||||||
unit_set_target(&ud, target.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a bl/ud from the map
|
* Removes a bl/ud from the map
|
||||||
* On kill specifics are not performed here, check status_damage()
|
* On kill specifics are not performed here, check status_damage()
|
||||||
@ -3239,7 +3229,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
|
|||||||
if(sd->chatID)
|
if(sd->chatID)
|
||||||
chat_leavechat(sd,0);
|
chat_leavechat(sd,0);
|
||||||
|
|
||||||
if(sd->trade_partner.id > 0)
|
if(sd->trade_partner)
|
||||||
trade_tradecancel(sd);
|
trade_tradecancel(sd);
|
||||||
|
|
||||||
searchstore_close(*sd);
|
searchstore_close(*sd);
|
||||||
@ -3422,7 +3412,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
|
|||||||
break;
|
break;
|
||||||
case BL_MOB:
|
case BL_MOB:
|
||||||
// /BL_MOB is handled by mob_dead unless the monster is not dead.
|
// /BL_MOB is handled by mob_dead unless the monster is not dead.
|
||||||
if (status_isdead(*bl)) {
|
if (status_isdead(bl)) {
|
||||||
map_delblock(bl);
|
map_delblock(bl);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3532,7 +3522,7 @@ int unit_free(struct block_list *bl, clr_type clrtype)
|
|||||||
map_session_data *sd = (map_session_data*)bl;
|
map_session_data *sd = (map_session_data*)bl;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( status_isdead(*bl) )
|
if( status_isdead(bl) )
|
||||||
pc_setrestartvalue(sd,2);
|
pc_setrestartvalue(sd,2);
|
||||||
|
|
||||||
pc_delinvincibletimer(sd);
|
pc_delinvincibletimer(sd);
|
||||||
|
@ -172,8 +172,8 @@ void unit_free_pc(map_session_data *sd);
|
|||||||
#define unit_remove_map(bl,clrtype) unit_remove_map_(bl,clrtype,__FILE__,__LINE__,__func__)
|
#define unit_remove_map(bl,clrtype) unit_remove_map_(bl,clrtype,__FILE__,__LINE__,__func__)
|
||||||
int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, int line, const char* func);
|
int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, int line, const char* func);
|
||||||
int unit_free(struct block_list *bl, clr_type clrtype);
|
int unit_free(struct block_list *bl, clr_type clrtype);
|
||||||
int unit_changetarget(block_list *bl,va_list ap);
|
int unit_changeviewsize(struct block_list *bl,short size);
|
||||||
void unit_changetarget_sub(unit_data& ud, block_list& target);
|
int unit_changetarget(struct block_list *bl,va_list ap);
|
||||||
|
|
||||||
// Shadow Scar
|
// Shadow Scar
|
||||||
void unit_addshadowscar(unit_data &ud, int interval);
|
void unit_addshadowscar(unit_data &ud, int interval);
|
||||||
|
@ -562,11 +562,11 @@ void vending_reopen( map_session_data& sd )
|
|||||||
if( (fail = vending_openvending(sd, at->title, data, count, at)) == 0 ) {
|
if( (fail = vending_openvending(sd, at->title, data, count, at)) == 0 ) {
|
||||||
// Make vendor look perfect
|
// Make vendor look perfect
|
||||||
pc_setdir(&sd, at->dir, at->head_dir);
|
pc_setdir(&sd, at->dir, at->head_dir);
|
||||||
clif_changed_dir(sd.bl, AREA_WOS);
|
clif_changed_dir(&sd.bl, AREA_WOS);
|
||||||
if( at->sit ) {
|
if( at->sit ) {
|
||||||
pc_setsit(&sd);
|
pc_setsit(&sd);
|
||||||
skill_sit(&sd, 1);
|
skill_sit(&sd, 1);
|
||||||
clif_sitting(sd.bl);
|
clif_sitting(&sd.bl);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Immediate save
|
// Immediate save
|
||||||
|
Loading…
x
Reference in New Issue
Block a user