Compare commits
3 Commits
master
...
script/epi
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f73a858d6c | ||
![]() |
150fc78866 | ||
![]() |
7b816e18fb |
@ -1032,11 +1032,6 @@ Body:
|
||||
- Command: setcard
|
||||
Help: |
|
||||
Adds a card or enchant to the specific slot of the equipment.
|
||||
- Command: resetcooltime
|
||||
Aliases:
|
||||
- resetcooldown
|
||||
Help: |
|
||||
Resets the cooldown of all skills of the player and if active also of the homunculus or the mercenary.
|
||||
|
||||
Footer:
|
||||
Imports:
|
||||
|
@ -295,8 +295,8 @@ trait_points_job_change: 7
|
||||
|
||||
// Max trait stats cap.
|
||||
// Trait Stats: POW, STA, WIS, SPL, CON, CRT
|
||||
// Official is 110.
|
||||
max_trait_parameter: 110
|
||||
// Official is 100.
|
||||
max_trait_parameter: 100
|
||||
|
||||
// Max percent of RES/MRES that can be ignored by item bonus/skill.
|
||||
// Default: 50
|
||||
|
@ -1823,8 +1823,5 @@
|
||||
1534: Usage: @stockall {<type>}
|
||||
1535: %d items are transferred (%d skipped)!
|
||||
|
||||
1536: Log configuration has been reloaded.
|
||||
1537: Found skill '%s', unblocking...
|
||||
|
||||
//Custom translations
|
||||
import: conf/msg_conf/import/map_msg_eng_conf.txt
|
||||
|
@ -47,6 +47,8 @@ Body:
|
||||
Value: 5
|
||||
- Name: REPUTATION_EP18
|
||||
Value: 3
|
||||
- Name: REPUTATION_EP19
|
||||
Value: 4
|
||||
|
||||
Footer:
|
||||
Imports:
|
||||
|
@ -30822,6 +30822,7 @@ Body:
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
AfterCastActDelay: 1000
|
||||
AfterCastWalkDelay: 1000
|
||||
Requires:
|
||||
@ -30833,6 +30834,7 @@ Body:
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
AfterCastActDelay: 30000
|
||||
AfterCastWalkDelay: 1000
|
||||
Duration1:
|
||||
@ -30863,6 +30865,8 @@ Body:
|
||||
Name: HAMI_SKIN
|
||||
Description: Adamantium Skin
|
||||
MaxLevel: 5
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
- Id: 8008
|
||||
Name: HAMI_BLOODLUST
|
||||
Description: Bloodlust
|
||||
@ -30870,6 +30874,7 @@ Body:
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
AfterCastActDelay:
|
||||
- Level: 1
|
||||
Time: 300000
|
||||
|
@ -552,33 +552,3 @@ Body:
|
||||
Points: 4545
|
||||
- Level: 260
|
||||
Points: 4545
|
||||
- Level: 261
|
||||
Points: 4545
|
||||
- Level: 262
|
||||
Points: 4545
|
||||
- Level: 263
|
||||
Points: 4545
|
||||
- Level: 264
|
||||
Points: 4545
|
||||
- Level: 265
|
||||
Points: 4545
|
||||
- Level: 266
|
||||
Points: 4545
|
||||
- Level: 267
|
||||
Points: 4545
|
||||
- Level: 268
|
||||
Points: 4545
|
||||
- Level: 269
|
||||
Points: 4545
|
||||
- Level: 270
|
||||
Points: 4545
|
||||
- Level: 271
|
||||
Points: 4545
|
||||
- Level: 272
|
||||
Points: 4545
|
||||
- Level: 273
|
||||
Points: 4545
|
||||
- Level: 274
|
||||
Points: 4545
|
||||
- Level: 275
|
||||
Points: 4545
|
||||
|
@ -2496,9 +2496,6 @@ Body:
|
||||
CalcFlags:
|
||||
Batk: true
|
||||
Watk: true
|
||||
Flags:
|
||||
NoSave: true
|
||||
RemoveFromHomOnWarp: true
|
||||
- Status: Fleet
|
||||
DurationLookup: HFLI_FLEET
|
||||
CalcFlags:
|
||||
@ -2513,10 +2510,6 @@ Body:
|
||||
DurationLookup: HAMI_DEFENCE
|
||||
CalcFlags:
|
||||
Def: true
|
||||
Vit: true
|
||||
Flags:
|
||||
NoSave: true
|
||||
RemoveFromHomOnWarp: true
|
||||
- Status: Incaspdrate
|
||||
CalcFlags:
|
||||
Aspd: true
|
||||
@ -3974,7 +3967,7 @@ Body:
|
||||
Unlimitedhummingvoice: true
|
||||
Sircleofnature: true
|
||||
- Status: Deepsleep
|
||||
Icon: EFST_DEEP_SLEEP
|
||||
Icon: EFST_HANDICAPSTATE_DEEP_SLEEP
|
||||
DurationLookup: WM_LULLABY_DEEPSLEEP
|
||||
States:
|
||||
NoCast: true
|
||||
|
@ -76,15 +76,15 @@ Body:
|
||||
- Refine: 15
|
||||
Chance: 7000
|
||||
- Refine: 16
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
- Refine: 17
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
- Refine: 18
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
- Refine: 19
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
- Refine: 20
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
Bonus: 10
|
||||
Catalyst:
|
||||
Item: Blessed_Etel_Dust
|
||||
@ -116,15 +116,15 @@ Body:
|
||||
- Refine: 15
|
||||
Chance: 6000
|
||||
- Refine: 16
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
- Refine: 17
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
- Refine: 18
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
- Refine: 19
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
- Refine: 20
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
Bonus: 30
|
||||
Catalyst:
|
||||
Item: Blessed_Etel_Dust
|
||||
@ -154,15 +154,15 @@ Body:
|
||||
- Refine: 15
|
||||
Chance: 5000
|
||||
- Refine: 16
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
- Refine: 17
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
- Refine: 18
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
- Refine: 19
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
- Refine: 20
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
Bonus: 50
|
||||
AnnounceFail: true
|
||||
Catalyst:
|
||||
@ -193,15 +193,15 @@ Body:
|
||||
- Refine: 15
|
||||
Chance: 4000
|
||||
- Refine: 16
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
- Refine: 17
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
- Refine: 18
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
- Refine: 19
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
- Refine: 20
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
Bonus: 100
|
||||
AnnounceFail: true
|
||||
Catalyst:
|
||||
@ -240,15 +240,15 @@ Body:
|
||||
- Refine: 15
|
||||
Chance: 7000
|
||||
- Refine: 16
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
- Refine: 17
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
- Refine: 18
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
- Refine: 19
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
- Refine: 20
|
||||
Chance: 8000
|
||||
Chance: 7000
|
||||
Bonus: 10
|
||||
Catalyst:
|
||||
Item: Blessed_Etel_Dust
|
||||
@ -280,15 +280,15 @@ Body:
|
||||
- Refine: 15
|
||||
Chance: 6000
|
||||
- Refine: 16
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
- Refine: 17
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
- Refine: 18
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
- Refine: 19
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
- Refine: 20
|
||||
Chance: 7000
|
||||
Chance: 6000
|
||||
Bonus: 30
|
||||
Catalyst:
|
||||
Item: Blessed_Etel_Dust
|
||||
@ -318,15 +318,15 @@ Body:
|
||||
- Refine: 15
|
||||
Chance: 5000
|
||||
- Refine: 16
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
- Refine: 17
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
- Refine: 18
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
- Refine: 19
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
- Refine: 20
|
||||
Chance: 6000
|
||||
Chance: 5000
|
||||
Bonus: 50
|
||||
AnnounceFail: true
|
||||
Catalyst:
|
||||
@ -357,15 +357,15 @@ Body:
|
||||
- Refine: 15
|
||||
Chance: 4000
|
||||
- Refine: 16
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
- Refine: 17
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
- Refine: 18
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
- Refine: 19
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
- Refine: 20
|
||||
Chance: 5000
|
||||
Chance: 4000
|
||||
Bonus: 100
|
||||
AnnounceFail: true
|
||||
Catalyst:
|
||||
|
@ -83053,7 +83053,7 @@ Body:
|
||||
Hunter: true
|
||||
Rogue: true
|
||||
Locations:
|
||||
Both_Hand: true
|
||||
Right_Hand: true
|
||||
WeaponLevel: 4
|
||||
EquipLevelMin: 70
|
||||
Refineable: true
|
||||
@ -112246,7 +112246,8 @@ Body:
|
||||
Defense: 30
|
||||
Slots: 1
|
||||
Classes:
|
||||
All: true
|
||||
All_Third: true
|
||||
Fourth: true
|
||||
Locations:
|
||||
Garment: true
|
||||
ArmorLevel: 1
|
||||
@ -112275,7 +112276,8 @@ Body:
|
||||
Defense: 30
|
||||
Slots: 1
|
||||
Classes:
|
||||
All: true
|
||||
All_Third: true
|
||||
Fourth: true
|
||||
Locations:
|
||||
Garment: true
|
||||
ArmorLevel: 1
|
||||
@ -112304,7 +112306,8 @@ Body:
|
||||
Defense: 30
|
||||
Slots: 1
|
||||
Classes:
|
||||
All: true
|
||||
All_Third: true
|
||||
Fourth: true
|
||||
Locations:
|
||||
Garment: true
|
||||
ArmorLevel: 1
|
||||
@ -139532,7 +139535,7 @@ Body:
|
||||
AegisName: Ein_BHAXE
|
||||
Name: Saw Axe
|
||||
Type: Weapon
|
||||
SubType: 2hAxe
|
||||
SubType: 1hAxe
|
||||
Weight: 5000
|
||||
Attack: 350
|
||||
Range: 1
|
||||
@ -169197,8 +169200,6 @@ Body:
|
||||
Defense: 12
|
||||
Slots: 1
|
||||
Jobs:
|
||||
Crusader: true
|
||||
Knight: true
|
||||
Swordman: true
|
||||
Classes:
|
||||
All_Upper: true
|
||||
@ -169219,8 +169220,6 @@ Body:
|
||||
Defense: 12
|
||||
Slots: 1
|
||||
Jobs:
|
||||
Crusader: true
|
||||
Knight: true
|
||||
Swordman: true
|
||||
Classes:
|
||||
All_Upper: true
|
||||
@ -202634,17 +202633,6 @@ Body:
|
||||
}
|
||||
}
|
||||
}
|
||||
- Id: 480470
|
||||
AegisName: C_Summer_Beach
|
||||
Name: Costume Summer Beach # !todo check english name
|
||||
Type: Armor
|
||||
Locations:
|
||||
Costume_Garment: true
|
||||
ArmorLevel: 1
|
||||
Script: |
|
||||
hateffect HAT_EF_VACATION,true;
|
||||
UnEquipScript: |
|
||||
hateffect HAT_EF_VACATION,false;
|
||||
- Id: 490004
|
||||
AegisName: Atker_Ring
|
||||
Name: Attacker Booster Ring
|
||||
|
@ -80408,28 +80408,6 @@ Body:
|
||||
Name: Footprint Effect
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
hateffect FOOTPRINT_EF_BASE,true;
|
||||
UnEquipScript: |
|
||||
hateffect FOOTPRINT_EF_BASE,false;
|
||||
- Id: 313067
|
||||
AegisName: aegis_313067
|
||||
Name: Purple Star Footprint
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
hateffect FOOTPRINT_EF_PURPLESTAR,true;
|
||||
UnEquipScript: |
|
||||
hateffect FOOTPRINT_EF_PURPLESTAR,false;
|
||||
- Id: 313068
|
||||
AegisName: aegis_313068
|
||||
Name: Yellow Star Footprint
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
hateffect FOOTPRINT_EF_YELLOWSTAR,true;
|
||||
UnEquipScript: |
|
||||
hateffect FOOTPRINT_EF_YELLOWSTAR,false;
|
||||
- Id: 313070
|
||||
AegisName: Ep21_4_Def
|
||||
Name: Forest Magic Orb (Physical Defense)
|
||||
@ -81918,15 +81896,6 @@ Body:
|
||||
Script: |
|
||||
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||
- Id: 313345
|
||||
AegisName: aegis_313345
|
||||
Name: Puppy Footprint
|
||||
Type: Card
|
||||
SubType: Enchant
|
||||
Script: |
|
||||
hateffect FOOTPRINT_EF_DOGFOOT,true;
|
||||
UnEquipScript: |
|
||||
hateffect FOOTPRINT_EF_DOGFOOT,false;
|
||||
- Id: 1000000
|
||||
AegisName: IDTest_event
|
||||
Name: IDTest event
|
||||
@ -89471,11 +89440,6 @@ Body:
|
||||
Name: Footprint Effect (Garment)
|
||||
Type: Etc
|
||||
Weight: 100
|
||||
- Id: 1001617
|
||||
AegisName: PurpleStar_Foot_Robe
|
||||
Name: Purple Star Footprint (Garment)
|
||||
Type: Etc
|
||||
Weight: 100
|
||||
- Id: 1001618
|
||||
AegisName: aegis_1001618
|
||||
Name: Wigner Premium Exchange Ticket
|
||||
@ -89745,11 +89709,6 @@ Body:
|
||||
Weight: 10
|
||||
Flags:
|
||||
BuyingStore: true
|
||||
- Id: 1001650
|
||||
AegisName: YellowStar_Foot_Robe
|
||||
Name: Yellow Star Footprint (Garment)
|
||||
Type: Etc
|
||||
Weight: 100
|
||||
- Id: 1001653
|
||||
AegisName: Ep21_Armor_E_Stone1
|
||||
Name: Turquoise Magic Stone
|
||||
@ -90363,11 +90322,6 @@ Body:
|
||||
NoGuildStorage: true
|
||||
NoMail: true
|
||||
NoAuction: true
|
||||
- Id: 1001772
|
||||
AegisName: aegis_1001772
|
||||
Name: Puppy Footprint (Garment)
|
||||
Type: Etc
|
||||
Weight: 100
|
||||
- Id: 1200000
|
||||
AegisName: IDTest_arrow
|
||||
Name: IDTest arrow
|
||||
@ -90430,7 +90384,7 @@ Body:
|
||||
Ammo: true
|
||||
EquipLevelMin: 1
|
||||
Script: |
|
||||
bonus bAtkEle,Ele_Ghost;
|
||||
bonus bAtkEle,Ele_Neutral;
|
||||
- Id: 1220003
|
||||
AegisName: Kunai_Of_Shadow
|
||||
Name: Kunai Of Shadow
|
||||
|
@ -78855,11 +78855,6 @@ Body:
|
||||
NoAuction: true
|
||||
Script: |
|
||||
getgroupitem(IG_STOVE_CHANNELING_BOX_4);
|
||||
- Id: 103263
|
||||
AegisName: Summer_Select_Box4
|
||||
Name: Star Footprint Selection Box (Summer Beach)
|
||||
Type: Usable
|
||||
Weight: 10
|
||||
- Id: 200000
|
||||
AegisName: IDTest_Cash
|
||||
Name: IDTest Cash
|
||||
|
@ -113439,3 +113439,216 @@ Body:
|
||||
- Index: 2
|
||||
Item: Enchant_Stone_Box35
|
||||
Amount: 10
|
||||
# custom rates
|
||||
- Group: D_GW_EXTRACTOR
|
||||
SubGroups:
|
||||
- SubGroup: 1
|
||||
List:
|
||||
- Index: 0
|
||||
Item: EP19_D_P_Ore
|
||||
Amount: 1
|
||||
Rate: 5
|
||||
- Index: 1
|
||||
Item: EP19_N_P_Ore
|
||||
Amount: 1
|
||||
Rate: 3
|
||||
- Index: 2
|
||||
Item: EP19_D_P_Crystal
|
||||
Amount: 1
|
||||
Rate: 2
|
||||
- Index: 3
|
||||
Item: EP19_N_P_Crystal
|
||||
Amount: 1
|
||||
Rate: 1
|
||||
- Index: 4
|
||||
Item: EP19_D_P_Stone
|
||||
Amount: 1
|
||||
Rate: 1
|
||||
- Index: 5
|
||||
Item: EP19_S_F_1_Extract
|
||||
Amount: 1
|
||||
Rate: 1
|
||||
- Index: 6
|
||||
Item: EP19_S_F_2_Extract
|
||||
Amount: 1
|
||||
Rate: 1
|
||||
- Index: 7
|
||||
Item: EP19_S_F_3_Extract
|
||||
Amount: 1
|
||||
Rate: 1
|
||||
- Index: 8
|
||||
Item: EP19_Gla_Extract
|
||||
Amount: 1
|
||||
Rate: 1
|
||||
- Index: 9
|
||||
Item: Snow_F_Ore
|
||||
Amount: 1
|
||||
Rate: 12
|
||||
- Index: 10
|
||||
Item: Snow_F_Stone1
|
||||
Amount: 1
|
||||
Rate: 5
|
||||
- Index: 11
|
||||
Item: Snow_F_Stone2
|
||||
Amount: 1
|
||||
Rate: 3
|
||||
- Index: 12
|
||||
Item: Snow_F_Stone3
|
||||
Amount: 1
|
||||
Rate: 1
|
||||
- Index: 13
|
||||
Item: EP19_D_P_Ore
|
||||
Amount: 2
|
||||
Rate: 5
|
||||
- Index: 14
|
||||
Item: EP19_N_P_Ore
|
||||
Amount: 2
|
||||
Rate: 3
|
||||
- Index: 15
|
||||
Item: EP19_D_P_Crystal
|
||||
Amount: 2
|
||||
Rate: 2
|
||||
- Index: 16
|
||||
Item: EP19_N_P_Crystal
|
||||
Amount: 2
|
||||
Rate: 1
|
||||
- Index: 17
|
||||
Item: EP19_D_P_Stone
|
||||
Amount: 2
|
||||
Rate: 1
|
||||
- Index: 18
|
||||
Item: EP19_S_F_1_Extract
|
||||
Amount: 2
|
||||
Rate: 1
|
||||
- Index: 19
|
||||
Item: EP19_S_F_2_Extract
|
||||
Amount: 2
|
||||
Rate: 1
|
||||
- Index: 20
|
||||
Item: EP19_S_F_3_Extract
|
||||
Amount: 2
|
||||
Rate: 1
|
||||
- Index: 21
|
||||
Item: EP19_Gla_Extract
|
||||
Amount: 2
|
||||
Rate: 1
|
||||
- Index: 22
|
||||
Item: Snow_F_Ore
|
||||
Amount: 2
|
||||
Rate: 12
|
||||
- Index: 23
|
||||
Item: Snow_F_Stone1
|
||||
Amount: 2
|
||||
Rate: 5
|
||||
- Index: 24
|
||||
Item: Snow_F_Stone2
|
||||
Amount: 2
|
||||
Rate: 3
|
||||
- Index: 25
|
||||
Item: Snow_F_Stone3
|
||||
Amount: 2
|
||||
Rate: 1
|
||||
- Index: 26
|
||||
Item: EP19_D_P_Ore
|
||||
Amount: 3
|
||||
Rate: 5
|
||||
- Index: 27
|
||||
Item: EP19_N_P_Ore
|
||||
Amount: 3
|
||||
Rate: 3
|
||||
- Index: 28
|
||||
Item: EP19_D_P_Crystal
|
||||
Amount: 3
|
||||
Rate: 2
|
||||
- Index: 29
|
||||
Item: EP19_N_P_Crystal
|
||||
Amount: 3
|
||||
Rate: 1
|
||||
- Index: 30
|
||||
Item: EP19_D_P_Stone
|
||||
Amount: 3
|
||||
Rate: 1
|
||||
- Index: 31
|
||||
Item: EP19_S_F_1_Extract
|
||||
Amount: 3
|
||||
Rate: 1
|
||||
- Index: 32
|
||||
Item: EP19_S_F_2_Extract
|
||||
Amount: 3
|
||||
Rate: 1
|
||||
- Index: 33
|
||||
Item: EP19_S_F_3_Extract
|
||||
Amount: 3
|
||||
Rate: 1
|
||||
- Index: 34
|
||||
Item: EP19_Gla_Extract
|
||||
Amount: 3
|
||||
Rate: 1
|
||||
- Index: 35
|
||||
Item: Snow_F_Ore
|
||||
Amount: 3
|
||||
Rate: 12
|
||||
- Index: 36
|
||||
Item: Snow_F_Stone1
|
||||
Amount: 3
|
||||
Rate: 5
|
||||
- Index: 37
|
||||
Item: Snow_F_Stone2
|
||||
Amount: 3
|
||||
Rate: 3
|
||||
- Index: 38
|
||||
Item: Snow_F_Stone3
|
||||
Amount: 3
|
||||
Rate: 1
|
||||
- Index: 39
|
||||
Item: EP19_D_P_Ore
|
||||
Amount: 4
|
||||
Rate: 5
|
||||
- Index: 40
|
||||
Item: EP19_N_P_Ore
|
||||
Amount: 4
|
||||
Rate: 3
|
||||
- Index: 41
|
||||
Item: EP19_D_P_Crystal
|
||||
Amount: 4
|
||||
Rate: 2
|
||||
- Index: 42
|
||||
Item: EP19_N_P_Crystal
|
||||
Amount: 4
|
||||
Rate: 1
|
||||
- Index: 43
|
||||
Item: EP19_D_P_Stone
|
||||
Amount: 4
|
||||
Rate: 1
|
||||
- Index: 44
|
||||
Item: EP19_S_F_1_Extract
|
||||
Amount: 4
|
||||
Rate: 1
|
||||
- Index: 45
|
||||
Item: EP19_S_F_2_Extract
|
||||
Amount: 4
|
||||
Rate: 1
|
||||
- Index: 46
|
||||
Item: EP19_S_F_3_Extract
|
||||
Amount: 4
|
||||
Rate: 1
|
||||
- Index: 47
|
||||
Item: EP19_Gla_Extract
|
||||
Amount: 4
|
||||
Rate: 1
|
||||
- Index: 48
|
||||
Item: Snow_F_Ore
|
||||
Amount: 4
|
||||
Rate: 12
|
||||
- Index: 49
|
||||
Item: Snow_F_Stone1
|
||||
Amount: 4
|
||||
Rate: 5
|
||||
- Index: 50
|
||||
Item: Snow_F_Stone2
|
||||
Amount: 4
|
||||
Rate: 3
|
||||
- Index: 51
|
||||
Item: Snow_F_Stone3
|
||||
Amount: 4
|
||||
Rate: 1
|
||||
|
@ -980,13 +980,3 @@ Body:
|
||||
- Group: 1
|
||||
Items:
|
||||
- Item: C_Chaos_Emerald
|
||||
- Item: Summer_Select_Box4
|
||||
Groups:
|
||||
- Group: 0
|
||||
Items:
|
||||
- Item: PurpleStar_Foot_Robe
|
||||
- Item: C_Summer_Beach
|
||||
- Group: 1
|
||||
Items:
|
||||
- Item: YellowStar_Foot_Robe
|
||||
- Item: C_Summer_Beach
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -3365,7 +3365,7 @@ Body:
|
||||
Night_Watch: true
|
||||
Hyper_Novice: true
|
||||
Spirit_Handler: true
|
||||
MaxBaseLevel: 275
|
||||
MaxBaseLevel: 260
|
||||
BaseExp:
|
||||
- Level: 1
|
||||
Exp: 658
|
||||
@ -3886,36 +3886,6 @@ Body:
|
||||
- Level: 259
|
||||
Exp: 270217017679
|
||||
- Level: 260
|
||||
Exp: 283727868563
|
||||
- Level: 261
|
||||
Exp: 297914261991
|
||||
- Level: 262
|
||||
Exp: 312809975091
|
||||
- Level: 263
|
||||
Exp: 328450473845
|
||||
- Level: 264
|
||||
Exp: 344872997537
|
||||
- Level: 265
|
||||
Exp: 353494822476
|
||||
- Level: 266
|
||||
Exp: 362332193038
|
||||
- Level: 267
|
||||
Exp: 371390497864
|
||||
- Level: 268
|
||||
Exp: 380675260310
|
||||
- Level: 269
|
||||
Exp: 390192141818
|
||||
- Level: 270
|
||||
Exp: 397995984654
|
||||
- Level: 271
|
||||
Exp: 405955904348
|
||||
- Level: 272
|
||||
Exp: 414075022434
|
||||
- Level: 273
|
||||
Exp: 422356522883
|
||||
- Level: 274
|
||||
Exp: 430803653341
|
||||
- Level: 275
|
||||
Exp: 999999999999
|
||||
- Jobs:
|
||||
Dragon_Knight: true
|
||||
@ -3942,7 +3912,7 @@ Body:
|
||||
Night_Watch: true
|
||||
Hyper_Novice: true
|
||||
Spirit_Handler: true
|
||||
MaxJobLevel: 60
|
||||
MaxJobLevel: 55
|
||||
JobExp:
|
||||
- Level: 1
|
||||
Exp: 4700000
|
||||
@ -4053,14 +4023,4 @@ Body:
|
||||
- Level: 54
|
||||
Exp: 6559840847
|
||||
- Level: 55
|
||||
Exp: 7543816974
|
||||
- Level: 56
|
||||
Exp: 8675389520
|
||||
- Level: 57
|
||||
Exp: 9976697948
|
||||
- Level: 58
|
||||
Exp: 11473202640
|
||||
- Level: 59
|
||||
Exp: 13194183036
|
||||
- Level: 60
|
||||
Exp: 99999999999
|
||||
Exp: 9999999999
|
||||
|
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_earring
|
||||
- Item: S_Caster_Pendant
|
||||
# - Item: Ice_F_Stone_Box2
|
||||
# RewardGroup: ICE_F_STONE_BOX2
|
||||
# RequiredRequirementsCount: 3
|
||||
# Requirements:
|
||||
# - Item: Ice_F_Stone_Str
|
||||
# - Item: Ice_F_Stone_Dex
|
||||
# - Item: Ice_F_Stone_Agi
|
||||
# - Item: Ice_F_Stone_Int
|
||||
# - Item: Ice_F_Stone_Vit
|
||||
# - Item: Ice_F_Stone_luk
|
||||
# - Item: Ice_F_Stone_Def
|
||||
# - Item: Ice_F_Stone_Mdef
|
||||
# - Item: Ice_F_Stone_Ran
|
||||
# - Item: Ice_F_Stone_War
|
||||
# - Item: Ice_F_Stone_Mag
|
||||
# - Item: Ice_F_Stone_R_Reject
|
||||
# - Item: Ice_F_Stone_Force
|
||||
# - Item: Ice_F_Stone_S_Delay
|
||||
# - Item: Ice_F_Stone_Skill_1
|
||||
# - Item: Ice_F_Stone_Skill_2
|
||||
# - Item: Ice_F_Stone_Skill_3
|
||||
# - Item: Ice_F_Stone_Skill_4
|
||||
# - Item: Ice_F_Stone_Skill_5
|
||||
# - Item: Ice_F_Stone_Skill_6
|
||||
# - Item: Ice_F_Stone_Skill_7
|
||||
# - Item: Ice_F_Stone_Skill_8
|
||||
# - Item: Ice_F_Stone_Skill_9
|
||||
# - Item: Ice_F_Stone_Skill_10
|
||||
# - Item: Ice_F_Stone_Skill_11
|
||||
# - Item: Ice_F_Stone_Skill_12
|
||||
# - Item: Ice_F_Stone_Skill_13
|
||||
# - Item: Ice_F_Stone_Skill_14
|
||||
# - Item: Ice_F_Stone_Skill_15
|
||||
# - Item: Ice_F_Stone_Skill_16
|
||||
# - Item: Ice_F_Stone_Skill_17
|
||||
# - Item: Ice_F_Stone_Skill_18
|
||||
# - Item: Ice_F_Stone_Skill_19
|
||||
# - Item: Ice_F_Stone_Skill_20
|
||||
# - Item: Ice_F_Stone_Skill_21
|
||||
# - Item: Ice_F_Stone_Skill_22
|
||||
# - Item: Ice_F_Stone_Skill_23
|
||||
# - Item: Ice_F_Stone_Skill_24
|
||||
# - Item: Ice_F_Stone_Skill_25
|
||||
# - Item: Ice_F_Stone_Skill_26
|
||||
# - Item: Ice_F_Stone_Skill_27
|
||||
# - Item: Ice_F_Stone_Skill_28
|
||||
# - Item: Ice_F_Stone_Skill_29
|
||||
# - Item: Ice_F_Stone_Skill_30
|
||||
# - Item: Ice_F_Stone_Skill_31
|
||||
# - Item: Ice_F_Stone_Skill_32
|
||||
# - Item: Ice_F_Stone_Skill_33
|
||||
# - Item: Ice_F_Stone_Skill_34
|
||||
# - Item: Ice_F_Stone_Skill_35
|
||||
# - Item: Ice_F_Stone_Skill_36
|
||||
# - Item: Ice_F_Stone_Skill_37
|
||||
# - Item: Ice_F_Stone_Skill_38
|
||||
# - Item: Ice_F_Stone_Skill_39
|
||||
# - Item: Ice_F_Stone_Skill_40
|
||||
# - Item: Ice_F_Stone_Skill_41
|
||||
# - Item: Ice_F_Stone_Skill_42
|
||||
# - Item: Ice_F_Stone_Skill_43
|
||||
# - Item: Ice_F_Stone_Skill_44
|
||||
# - Item: Ice_F_Stone_Skill_45
|
||||
# - Item: Ice_F_Stone_Skill_46
|
||||
# - Item: Ice_F_Stone_Skill_47
|
||||
# - Item: Ice_F_Stone_Skill_48
|
||||
# - Item: Ice_F_Stone_Skill_49
|
||||
# - Item: Ice_F_Stone_Skill_50
|
||||
# - Item: Ice_F_Stone_Skill_51
|
||||
# - Item: Ice_F_Stone_Skill_52
|
||||
# - Item: Ice_F_Stone_Skill_53
|
||||
# - Item: Ice_F_Stone_Skill_54
|
||||
# - Item: Ice_F_Stone_Speed
|
||||
# - Item: Ice_F_Stone_Caster
|
||||
# - Item: Ice_F_Stone_Critical
|
||||
# - Item: Ice_F_Stone_Guide
|
||||
# - Item: Ice_F_Stone_Above
|
||||
# - Item: Ice_F_Stone_P_Full
|
||||
# - Item: Ice_F_Stone_M_Counter
|
||||
# - Item: Ice_F_Stone_Hp
|
||||
# - Item: Ice_F_Stone_Sp
|
||||
# - Item: Ice_F_Stone_Heal
|
||||
# - Item: Ice_F_Stone_Robust
|
||||
# - Item: Ice_F_Stone_F_Cast
|
||||
# - Item: Ice_F_Stone_M_F
|
||||
# - Item: Ice_F_Stone_P_F
|
||||
# - Item: Ice_F_Stone_Un_Vit
|
||||
# - Item: Ice_F_Stone_Sp_Int
|
||||
# - Item: Ice_F_Stone_Fi_Dex
|
||||
# - Item: Ice_F_Stone_Ov_Str
|
||||
# - Item: Ice_F_Stone_Fa_Agi
|
||||
# - Item: Ice_F_Stone_Lu_Luk
|
||||
# - Item: Ice_F_Stone_A_Delay
|
||||
# - Item: Ice_F_Stone_E_Archer
|
||||
# - Item: Ice_F_Stone_Fatal
|
||||
# - Item: Ice_F_Stone_F_Spirit
|
||||
# - Item: Ice_F_Stone_Spell
|
||||
# - Item: Ice_F_Stone_HealHP
|
||||
# - Item: Ice_F_Stone_HealSP
|
||||
# - Item: Ice_F_Stone_Life
|
||||
# - Item: Ice_F_Stone_Soul
|
||||
# - Item: Ice_F_Stone_M_Heal
|
||||
# - Item: Ice_F_Stone_M_Soul
|
||||
# - Item: Ice_F_Stone_A_Force
|
||||
- Item: Ice_F_Stone_Box2
|
||||
RewardGroup: ICE_F_STONE_BOX
|
||||
RequiredRequirementsCount: 3
|
||||
Requirements:
|
||||
- Item: Ice_F_Stone_Str
|
||||
- Item: Ice_F_Stone_Dex
|
||||
- Item: Ice_F_Stone_Agi
|
||||
- Item: Ice_F_Stone_Int
|
||||
- Item: Ice_F_Stone_Vit
|
||||
- Item: Ice_F_Stone_luk
|
||||
- Item: Ice_F_Stone_Def
|
||||
- Item: Ice_F_Stone_Mdef
|
||||
- Item: Ice_F_Stone_Ran
|
||||
- Item: Ice_F_Stone_War
|
||||
- Item: Ice_F_Stone_Mag
|
||||
- Item: Ice_F_Stone_R_Reject
|
||||
- Item: Ice_F_Stone_Force
|
||||
- Item: Ice_F_Stone_S_Delay
|
||||
- Item: Ice_F_Stone_Skill_1
|
||||
- Item: Ice_F_Stone_Skill_2
|
||||
- Item: Ice_F_Stone_Skill_3
|
||||
- Item: Ice_F_Stone_Skill_4
|
||||
- Item: Ice_F_Stone_Skill_5
|
||||
- Item: Ice_F_Stone_Skill_6
|
||||
- Item: Ice_F_Stone_Skill_7
|
||||
- Item: Ice_F_Stone_Skill_8
|
||||
- Item: Ice_F_Stone_Skill_9
|
||||
- Item: Ice_F_Stone_Skill_10
|
||||
- Item: Ice_F_Stone_Skill_11
|
||||
- Item: Ice_F_Stone_Skill_12
|
||||
- Item: Ice_F_Stone_Skill_13
|
||||
- Item: Ice_F_Stone_Skill_14
|
||||
- Item: Ice_F_Stone_Skill_15
|
||||
- Item: Ice_F_Stone_Skill_16
|
||||
- Item: Ice_F_Stone_Skill_17
|
||||
- Item: Ice_F_Stone_Skill_18
|
||||
- Item: Ice_F_Stone_Skill_19
|
||||
- Item: Ice_F_Stone_Skill_20
|
||||
- Item: Ice_F_Stone_Skill_21
|
||||
- Item: Ice_F_Stone_Skill_22
|
||||
- Item: Ice_F_Stone_Skill_23
|
||||
- Item: Ice_F_Stone_Skill_24
|
||||
- Item: Ice_F_Stone_Skill_25
|
||||
- Item: Ice_F_Stone_Skill_26
|
||||
- Item: Ice_F_Stone_Skill_27
|
||||
- Item: Ice_F_Stone_Skill_28
|
||||
- Item: Ice_F_Stone_Skill_29
|
||||
- Item: Ice_F_Stone_Skill_30
|
||||
- Item: Ice_F_Stone_Skill_31
|
||||
- Item: Ice_F_Stone_Skill_32
|
||||
- Item: Ice_F_Stone_Skill_33
|
||||
- Item: Ice_F_Stone_Skill_34
|
||||
- Item: Ice_F_Stone_Skill_35
|
||||
- Item: Ice_F_Stone_Skill_36
|
||||
- Item: Ice_F_Stone_Skill_37
|
||||
- Item: Ice_F_Stone_Skill_38
|
||||
- Item: Ice_F_Stone_Skill_39
|
||||
- Item: Ice_F_Stone_Skill_40
|
||||
- Item: Ice_F_Stone_Skill_41
|
||||
- Item: Ice_F_Stone_Skill_42
|
||||
- Item: Ice_F_Stone_Skill_43
|
||||
- Item: Ice_F_Stone_Skill_44
|
||||
- Item: Ice_F_Stone_Skill_45
|
||||
- Item: Ice_F_Stone_Skill_46
|
||||
- Item: Ice_F_Stone_Skill_47
|
||||
- Item: Ice_F_Stone_Skill_48
|
||||
- Item: Ice_F_Stone_Skill_49
|
||||
- Item: Ice_F_Stone_Skill_50
|
||||
- Item: Ice_F_Stone_Skill_51
|
||||
- Item: Ice_F_Stone_Skill_52
|
||||
- Item: Ice_F_Stone_Skill_53
|
||||
- Item: Ice_F_Stone_Skill_54
|
||||
- Item: Ice_F_Stone_Speed
|
||||
- Item: Ice_F_Stone_Caster
|
||||
- Item: Ice_F_Stone_Critical
|
||||
- Item: Ice_F_Stone_Guide
|
||||
- Item: Ice_F_Stone_Above
|
||||
- Item: Ice_F_Stone_P_Full
|
||||
- Item: Ice_F_Stone_M_Counter
|
||||
- Item: Ice_F_Stone_Hp
|
||||
- Item: Ice_F_Stone_Sp
|
||||
- Item: Ice_F_Stone_Heal
|
||||
- Item: Ice_F_Stone_Robust
|
||||
- Item: Ice_F_Stone_F_Cast
|
||||
- Item: Ice_F_Stone_M_F
|
||||
- Item: Ice_F_Stone_P_F
|
||||
- Item: Ice_F_Stone_Un_Vit
|
||||
- Item: Ice_F_Stone_Sp_Int
|
||||
- Item: Ice_F_Stone_Fi_Dex
|
||||
- Item: Ice_F_Stone_Ov_Str
|
||||
- Item: Ice_F_Stone_Fa_Agi
|
||||
- Item: Ice_F_Stone_Lu_Luk
|
||||
- Item: Ice_F_Stone_A_Delay
|
||||
- Item: Ice_F_Stone_E_Archer
|
||||
- Item: Ice_F_Stone_Fatal
|
||||
- Item: Ice_F_Stone_F_Spirit
|
||||
- Item: Ice_F_Stone_Spell
|
||||
- Item: Ice_F_Stone_HealHP
|
||||
- Item: Ice_F_Stone_HealSP
|
||||
- Item: Ice_F_Stone_Life
|
||||
- Item: Ice_F_Stone_Soul
|
||||
- Item: Ice_F_Stone_M_Heal
|
||||
- Item: Ice_F_Stone_M_Soul
|
||||
- Item: Ice_F_Stone_A_Force
|
||||
- Item: R_BearersShadow_Mix
|
||||
RewardGroup: R_BEARERSSHADOW_MIX
|
||||
RequiredRequirementsCount: 6
|
||||
@ -4812,3 +4812,33 @@ Body:
|
||||
# Amount: 100
|
||||
# - Item: Crystal_Of_Pollution
|
||||
# Amount: 100
|
||||
- Item: D_Gw_Extractor
|
||||
RewardGroup: D_GW_EXTRACTOR
|
||||
RequiredRequirementsCount: 3
|
||||
Requirements:
|
||||
- Item: D_Glacier_T_Sword
|
||||
- Item: D_Glacier_Lance
|
||||
- Item: D_Glacier_Sword
|
||||
- Item: D_Glacier_B_Sword
|
||||
- Item: D_Glacier_Spear
|
||||
- Item: D_Glacier_T_Axe
|
||||
- Item: D_Glacier_Axe
|
||||
- Item: D_Glacier_Mace
|
||||
- Item: D_Glacier_M_Mace
|
||||
- Item: D_Glacier_R_Knife
|
||||
- Item: D_Glacier_B_Knife
|
||||
- Item: D_Glacier_Bow
|
||||
- Item: D_Glacier_Knuckle
|
||||
- Item: D_Glacier_Book
|
||||
- Item: D_Glacier_Katar
|
||||
- Item: D_Glacier_Wand
|
||||
- Item: D_Glacier_Staff
|
||||
- Item: D_Glacier_Foxtail
|
||||
- Item: D_Glacier_Violin
|
||||
- Item: D_Glacier_Whip
|
||||
- Item: D_Glacier_Humma
|
||||
- Item: D_Glacier_Revolver
|
||||
- Item: D_Glacier_Rifle
|
||||
- Item: D_Glacier_Shotgun
|
||||
- Item: D_Glacier_Gatling
|
||||
- Item: D_Glacier_Launcher
|
||||
|
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"
|
||||
- Id: 5942
|
||||
Title: Flower Room Opening Ceremony
|
||||
- Id: 5972
|
||||
Title: Eagle Patrol
|
||||
- Id: 5973
|
||||
Title: "[Standby] Patrol with Iwin"
|
||||
TimeLimit: 4h
|
||||
- Id: 5974
|
||||
Title: Patrol with Iwin (1)
|
||||
- Id: 5975
|
||||
Title: Patrol with Iwin (2)
|
||||
- Id: 5976
|
||||
Title: Supplier Goror
|
||||
- Id: 5977
|
||||
Title: "[Standby] Do not feed"
|
||||
TimeLimit: 4h
|
||||
- Id: 5978
|
||||
Title: Do not feed me (1)
|
||||
- Id: 5979
|
||||
Title: Do not feed me (2)
|
||||
- Id: 5980
|
||||
Title: Secret fun
|
||||
- Id: 5981
|
||||
Title: "[Standby] Secret Fun"
|
||||
TimeLimit: 4h
|
||||
- Id: 5982
|
||||
Title: Secret fun
|
||||
- Id: 5983
|
||||
Title: Test Subject 210426 Encounter
|
||||
- Id: 5984
|
||||
Title: Rgan Transformation Scroll
|
||||
- Id: 5985
|
||||
Title: "[Standby] Lunch menu selection"
|
||||
TimeLimit: 4h
|
||||
- Id: 5986
|
||||
Title: Lunch's menu selection
|
||||
- Id: 5987
|
||||
Title: Lunch's menu selection
|
||||
- Id: 5988
|
||||
Title: Lunch's menu selection
|
||||
- Id: 5989
|
||||
Title: Lunch's menu selection
|
||||
- Id: 5990
|
||||
Title: Lunch's menu selection
|
||||
- Id: 5991
|
||||
Title: Lunch's menu selection
|
||||
- Id: 5992
|
||||
Title: Lunch's menu selection
|
||||
- Id: 5993
|
||||
Title: Lunch's menu selection
|
||||
- Id: 5994
|
||||
Title: Lunch's menu selection
|
||||
- Id: 5995
|
||||
Title: Lunch's menu selection
|
||||
- Id: 6000
|
||||
Title: Job Change to Taekwon
|
||||
- Id: 6001
|
||||
@ -6418,6 +6470,64 @@ Body:
|
||||
- Id: 8738
|
||||
Title: Shared Memories - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 8784
|
||||
Title: Help Moryara Fishing
|
||||
Targets:
|
||||
- Mob: EP19_SHINING_SEAWEED
|
||||
Count: 20
|
||||
- Id: 8785
|
||||
Title: Moryara's Fishing Help - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 8786
|
||||
Title: Help Moryara Fishing
|
||||
Targets:
|
||||
- Mob: EP19_SHINING_SEAWEED
|
||||
Count: 20
|
||||
- Id: 8787
|
||||
Title: Lunch time with Zoryara
|
||||
- Id: 8788
|
||||
Title: Happy Lunch with Zoryara - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 8789
|
||||
Title: Lunch time with Zoryara
|
||||
- Id: 8790
|
||||
Title: Priest, have mercy?
|
||||
- Id: 8791
|
||||
Title: Priest, have mercy? - Wait
|
||||
TimeLimit: 4h
|
||||
- Id: 8792
|
||||
Title: Priest, have mercy??
|
||||
- Id: 8793
|
||||
Title: Things to ask
|
||||
- Id: 8794
|
||||
Title: Old Snake
|
||||
- Id: 8795
|
||||
Title: Doctrine and Preaching
|
||||
- Id: 8796
|
||||
Title: You're the first girl I've ever seen
|
||||
Targets:
|
||||
- Mob: EP19_RGAN_A
|
||||
Count: 20
|
||||
- Id: 8797
|
||||
Title: Rgan to work-Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 8798
|
||||
Title: Rgan to make work
|
||||
Targets:
|
||||
- Mob: EP19_RGAN_A
|
||||
Count: 20
|
||||
- Id: 8799
|
||||
Title: Hatchery's Rgan (1)
|
||||
- Id: 8800
|
||||
Title: Hatchery's Rgan (2)
|
||||
- Id: 8801
|
||||
Title: Hatchery's Rgan (3)
|
||||
- Id: 8802
|
||||
Title: The 1st Rgan in the Hatchery
|
||||
- Id: 8803
|
||||
Title: Hatchery's 2nd Rgan
|
||||
- Id: 8804
|
||||
Title: The 3rd Rgan in the Hatchery
|
||||
- Id: 9000
|
||||
Title: Job Change to Knight
|
||||
- Id: 9001
|
||||
@ -8297,6 +8407,356 @@ Body:
|
||||
- Id: 11739
|
||||
Title: "[Cooldown] Oz Labyrinth 2F"
|
||||
TimeLimit: 4h
|
||||
- Id: 11794
|
||||
Title: The Lady of Purification
|
||||
- Id: 11795
|
||||
Title: The Lady of Purification
|
||||
- Id: 11796
|
||||
Title: The Lady of Purification
|
||||
- Id: 11797
|
||||
Title: The Lady of Purification
|
||||
- Id: 11798
|
||||
Title: The Lady of Purification
|
||||
- Id: 11799
|
||||
Title: The Lady of Purification
|
||||
- Id: 11800
|
||||
Title: The Lady of Purification
|
||||
- Id: 11801
|
||||
Title: The Lady of Purification
|
||||
- Id: 11802
|
||||
Title: The Lady of Purification
|
||||
- Id: 11803
|
||||
Title: The Lady of Purification
|
||||
- Id: 11804
|
||||
Title: The Lady of Purification
|
||||
- Id: 11805
|
||||
Title: The Lady of Purification
|
||||
- Id: 11806
|
||||
Title: The Lady of Purification
|
||||
- Id: 11807
|
||||
Title: The Lady of Purification
|
||||
- Id: 11808
|
||||
Title: The Lady of Purification
|
||||
- Id: 11809
|
||||
Title: The Lady of Purification
|
||||
- Id: 11810
|
||||
Title: The Lady of Purification
|
||||
- Id: 11811
|
||||
Title: The Lady of Purification
|
||||
- Id: 11812
|
||||
Title: Friederike's Day
|
||||
- Id: 11813
|
||||
Title: Friederike's Day
|
||||
Targets:
|
||||
- Mob: EP19_RGAN_A
|
||||
Count: 10
|
||||
- Mob: EP19_RGAN_B
|
||||
Count: 10
|
||||
Drops:
|
||||
- Mob: EP19_RGAN_A
|
||||
Item: Ep19_Rgan_Core
|
||||
Rate: 5000
|
||||
- Mob: EP19_RGAN_B
|
||||
Item: Ep19_Rgan_Core
|
||||
Rate: 5000
|
||||
- Id: 11814
|
||||
Title: Friederike's Day - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 11815
|
||||
Title: Frozen Sea
|
||||
- Id: 11816
|
||||
Title: Frozen Sea
|
||||
- Id: 11817
|
||||
Title: Frozen Sea
|
||||
- Id: 11818
|
||||
Title: Frozen Sea
|
||||
- Id: 11819
|
||||
Title: Frozen Sea
|
||||
- Id: 11820
|
||||
Title: Frozen Sea
|
||||
- Id: 11821
|
||||
Title: Frozen Sea
|
||||
- Id: 11822
|
||||
Title: Frozen Sea
|
||||
Targets:
|
||||
- Id: 1
|
||||
Count: 10
|
||||
Location: jor_back2
|
||||
MapMobTargets:
|
||||
EP19_UNFROST_FLOWER: true
|
||||
EP19_ICE_GANGU: true
|
||||
EP19_ICE_STRAW: true
|
||||
EP19_LIMACINA: true
|
||||
Drops:
|
||||
- Mob: EP19_UNFROST_FLOWER
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_ICE_GANGU
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_ICE_STRAW
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_LIMACINA
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Id: 11823
|
||||
Title: Frozen Sea
|
||||
- Id: 11824
|
||||
Title: Frozen Sea
|
||||
- Id: 11825
|
||||
Title: Frozen Sea
|
||||
Targets:
|
||||
- Id: 1
|
||||
Count: 5
|
||||
Location: jor_ab01
|
||||
MapMobTargets:
|
||||
EP19_WASTED_RGAN_A: true
|
||||
EP19_CAVE_CALMARING: true
|
||||
EP19_CAVE_FLOWER: true
|
||||
EP19_HALLUCIGENIA_BABY: true
|
||||
EP19_RE_RGAN_E: true
|
||||
Drops:
|
||||
- Mob: EP19_WASTED_RGAN_A
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_CAVE_CALMARING
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_CAVE_FLOWER
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_HALLUCIGENIA_BABY
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_RE_RGAN_E
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Id: 11826
|
||||
Title: Frozen Sea
|
||||
Targets:
|
||||
- Id: 1
|
||||
Count: 5
|
||||
Location: jor_ab01
|
||||
MapMobTargets:
|
||||
EP19_WASTED_RGAN_A: true
|
||||
EP19_CAVE_CALMARING: true
|
||||
EP19_CAVE_FLOWER: true
|
||||
EP19_HALLUCIGENIA_BABY: true
|
||||
EP19_RE_RGAN_E: true
|
||||
Drops:
|
||||
- Mob: EP19_WASTED_RGAN_A
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_CAVE_CALMARING
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_CAVE_FLOWER
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_HALLUCIGENIA_BABY
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_RE_RGAN_E
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Id: 11827
|
||||
Title: Frozen Sea
|
||||
Targets:
|
||||
- Id: 1
|
||||
Count: 5
|
||||
Location: jor_ab01
|
||||
MapMobTargets:
|
||||
EP19_WASTED_RGAN_A: true
|
||||
EP19_CAVE_CALMARING: true
|
||||
EP19_CAVE_FLOWER: true
|
||||
EP19_HALLUCIGENIA_BABY: true
|
||||
EP19_RE_RGAN_E: true
|
||||
Drops:
|
||||
- Mob: EP19_WASTED_RGAN_A
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_CAVE_CALMARING
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_CAVE_FLOWER
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_HALLUCIGENIA_BABY
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_RE_RGAN_E
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Id: 11828
|
||||
Title: Frozen Sea
|
||||
Targets:
|
||||
- Id: 1
|
||||
Count: 10
|
||||
Location: jor_ab02
|
||||
MapMobTargets:
|
||||
EP19_WASTED_RGAN_C: true
|
||||
EP19_HALLUCIGENIA: true
|
||||
EP19_ONE_EYE_DOLLOCARIS: true
|
||||
EP19_DOLLOCARIS: true
|
||||
EP19_ET_RGAN_D: true
|
||||
Drops:
|
||||
- Mob: EP19_WASTED_RGAN_C
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_HALLUCIGENIA
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_ONE_EYE_DOLLOCARIS
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_DOLLOCARIS
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_ET_RGAN_D
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Id: 11829
|
||||
Title: Frozen Sea
|
||||
- Id: 11830
|
||||
Title: Abandoned Pit
|
||||
- Id: 11831
|
||||
Title: A place that deserves to be abandoned
|
||||
Targets:
|
||||
- Id: 1
|
||||
Count: 40
|
||||
Location: jor_ab01
|
||||
MapMobTargets:
|
||||
EP19_WASTED_RGAN_A: true
|
||||
EP19_CAVE_CALMARING: true
|
||||
EP19_CAVE_FLOWER: true
|
||||
EP19_HALLUCIGENIA_BABY: true
|
||||
EP19_RE_RGAN_E: true
|
||||
Drops:
|
||||
- Mob: EP19_WASTED_RGAN_A
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_CAVE_CALMARING
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_CAVE_FLOWER
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_HALLUCIGENIA_BABY
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_RE_RGAN_E
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Id: 11832
|
||||
Title: Place to be abandoned (1) - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 11833
|
||||
Title: A place that deserves to be abandoned
|
||||
Targets:
|
||||
- Id: 1
|
||||
Count: 40
|
||||
Location: jor_ab02
|
||||
MapMobTargets:
|
||||
EP19_WASTED_RGAN_C: true
|
||||
EP19_HALLUCIGENIA: true
|
||||
EP19_ONE_EYE_DOLLOCARIS: true
|
||||
EP19_DOLLOCARIS: true
|
||||
EP19_ET_RGAN_D: true
|
||||
Drops:
|
||||
- Mob: EP19_WASTED_RGAN_C
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_HALLUCIGENIA
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_ONE_EYE_DOLLOCARIS
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_DOLLOCARIS
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_ET_RGAN_D
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Id: 11834
|
||||
Title: Place to be Abandoned (2) - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 11835
|
||||
Title: Digging and Digging
|
||||
- Id: 11836
|
||||
Title: Digging and Digging
|
||||
- Id: 11837
|
||||
Title: Digging and Digging
|
||||
- Id: 11838
|
||||
Title: Digging and Digging
|
||||
- Id: 11839
|
||||
Title: Digging and Digging
|
||||
- Id: 11840
|
||||
Title: Digging and Digging
|
||||
- Id: 11841
|
||||
Title: Digging and Digging
|
||||
- Id: 11842
|
||||
Title: Digging and Digging
|
||||
- Id: 11843
|
||||
Title: Digging and Digging
|
||||
- Id: 11844
|
||||
Title: Digging and Digging
|
||||
- Id: 11845
|
||||
Title: Digging and Digging
|
||||
- Id: 11846
|
||||
Title: Digging and Digging
|
||||
- Id: 11847
|
||||
Title: Digging and Digging
|
||||
- Id: 11848
|
||||
Title: Digging and Digging
|
||||
- Id: 11849
|
||||
Title: Digging and Digging
|
||||
- Id: 11850
|
||||
Title: Digging and Digging - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 11851
|
||||
Title: Do you need a refrigerator?
|
||||
- Id: 11852
|
||||
Title: Do you need a refrigerator?
|
||||
Targets:
|
||||
- Id: 1
|
||||
Count: 20
|
||||
Location: jor_back2
|
||||
MapMobTargets:
|
||||
EP19_UNFROST_FLOWER: true
|
||||
EP19_ICE_GANGU: true
|
||||
EP19_ICE_STRAW: true
|
||||
EP19_LIMACINA: true
|
||||
Drops:
|
||||
- Mob: EP19_UNFROST_FLOWER
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_ICE_GANGU
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_ICE_STRAW
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Mob: EP19_LIMACINA
|
||||
Item: Ep19_Ice_Meat
|
||||
Rate: 5000
|
||||
- Id: 11853
|
||||
Title: Do you need a refrigerator? - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 11854
|
||||
Title: Crunchy Tools
|
||||
- Id: 11855
|
||||
Title: Crunchy Tools
|
||||
- Id: 11856
|
||||
Title: Crunchy Tools
|
||||
- Id: 11857
|
||||
Title: Crunchy Tools
|
||||
- Id: 11858
|
||||
Title: Crunchy Tools
|
||||
- Id: 11859
|
||||
Title: Crunchy Tools - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 12000
|
||||
Title: An old friend
|
||||
- Id: 12001
|
||||
@ -9361,6 +9821,14 @@ Body:
|
||||
Title: Scattered Goods (East)
|
||||
- Id: 12539
|
||||
Title: Scattered Goods (South)
|
||||
- Id: 12560
|
||||
Title: Standby: Neutralizing Aircraft
|
||||
TimeLimit: 4h
|
||||
- Id: 12561
|
||||
Title: Disable the Core
|
||||
Targets:
|
||||
- Mob: EP19_MD_AQUILA
|
||||
Count: 1
|
||||
- Id: 13000
|
||||
Title: RWC2011Card Gathering
|
||||
- Id: 13001
|
||||
@ -11592,6 +12060,69 @@ Body:
|
||||
Title: The Price of Labor (1)
|
||||
- Id: 16585
|
||||
Title: The Price of Labor (2)
|
||||
- Id: 16636
|
||||
Title: Looking for clues - Juncea's Lab
|
||||
- Id: 16637
|
||||
Title: Find Clues - Bagot's Lab
|
||||
- Id: 16638
|
||||
Title: Find Clues - Rgan Guard
|
||||
- Id: 16639
|
||||
Title: Juncea's Lab
|
||||
- Id: 16640
|
||||
Title: Juncea's Lab
|
||||
- Id: 16641
|
||||
Title: Laboratory of Bagot
|
||||
- Id: 16642
|
||||
Title: Laboratory of Bagot
|
||||
- Id: 16643
|
||||
Title: Rgan Guard
|
||||
- Id: 16644
|
||||
Title: Rgan Guard
|
||||
- Id: 16645
|
||||
Title: Share the clue
|
||||
- Id: 16646
|
||||
Title: Infiltrate without a sound
|
||||
- Id: 16647
|
||||
Title: Infiltrate without a sound
|
||||
- Id: 16648
|
||||
Title: Infiltrate without a sound
|
||||
- Id: 16649
|
||||
Title: Infiltrate without a sound
|
||||
- Id: 16650
|
||||
Title: Infiltrate without a sound
|
||||
- Id: 16651
|
||||
Title: Infiltrate without a sound
|
||||
- Id: 16652
|
||||
Title: Infiltrate without a sound
|
||||
- Id: 16653
|
||||
Title: The Doubts That Build Up
|
||||
- Id: 16654
|
||||
Title: The Doubts That Build Up
|
||||
- Id: 16655
|
||||
Title: Intermittent difference
|
||||
- Id: 16656
|
||||
Title: Intermittent difference
|
||||
- Id: 16657
|
||||
Title: Intermittent difference
|
||||
- Id: 16658
|
||||
Title: Intermittent difference
|
||||
- Id: 16659
|
||||
Title: Intermittent difference
|
||||
- Id: 16660
|
||||
Title: Intermittent difference
|
||||
Targets:
|
||||
- Mob: EP19_MD_JUNCEA
|
||||
Count: 1
|
||||
- Id: 16661
|
||||
Title: Intermittent difference
|
||||
- Id: 16662
|
||||
Title: Simulation Battle
|
||||
Targets:
|
||||
- Mob: EP19_MD_JUNCEA_S
|
||||
Count: 1
|
||||
- Id: 16663
|
||||
Title: Simulation Battle-Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 17000
|
||||
Title: Meet with Father Bamph
|
||||
- Id: 17001
|
||||
@ -11914,6 +12445,96 @@ Body:
|
||||
- Id: 17566
|
||||
Title: (Standby) Code name! Is it a star button?
|
||||
TimeLimit: 4h
|
||||
- Id: 17619
|
||||
Title: Lazy's Plan
|
||||
- Id: 17620
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17621
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17622
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17623
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17624
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17625
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17626
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17627
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17628
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17629
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17630
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17631
|
||||
Title: Infiltrating the Snake's Nest
|
||||
- Id: 17632
|
||||
Title: Interim Report of Infiltration Operation
|
||||
- Id: 17633
|
||||
Title: Interim Report of Infiltration Operation
|
||||
- Id: 17634
|
||||
Title: Interim Report of Infiltration Operation
|
||||
- Id: 17635
|
||||
Title: Interim Report of Infiltration Operation
|
||||
- Id: 17636
|
||||
Title: Interim Report of Infiltration Operation
|
||||
- Id: 17637
|
||||
Title: Operation of Aircraft Destruction
|
||||
- Id: 17638
|
||||
Title: Vulnerability Investigation
|
||||
- Id: 17639
|
||||
Title: Accompanying Reconnaissance Report
|
||||
- Id: 17640
|
||||
Title: The Confused Snake's Nest
|
||||
- Id: 17641
|
||||
Title: The Confused Snake's Nest
|
||||
- Id: 17642
|
||||
Title: The Confused Snake's Nest
|
||||
- Id: 17643
|
||||
Title: The Confused Snake's Nest
|
||||
- Id: 17644
|
||||
Title: The Confused Snake's Nest
|
||||
- Id: 17645
|
||||
Title: The Confused Snake's Nest
|
||||
- Id: 17646
|
||||
Title: The Confused Snake's Nest
|
||||
- Id: 17647
|
||||
Title: The Confused Snake's Nest
|
||||
- Id: 17648
|
||||
Title: The Confused Snake's Nest
|
||||
- Id: 17649
|
||||
Title: Those who disappeared
|
||||
- Id: 17650
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17651
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17652
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17653
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17654
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17655
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17656
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17657
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17658
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17659
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17660
|
||||
Title: Finding an underground hideout on the ground
|
||||
- Id: 17661
|
||||
Title: Standby: Finding an Underground Hideout on the Ground
|
||||
TimeLimit: 4h
|
||||
- Id: 17662
|
||||
Title: Standby: Finding an Underground Hideout on the Ground
|
||||
TimeLimit: 4h
|
||||
- Id: 18000
|
||||
Title: Ready to enter
|
||||
- Id: 18001
|
||||
@ -12092,11 +12713,72 @@ Body:
|
||||
- Id: 18118
|
||||
Title: Mysterious Musical Instrument
|
||||
- Id: 18119
|
||||
Title: Gusli
|
||||
Title: The Guest Who Ride the North Wind 1
|
||||
- Id: 18120
|
||||
Title: Gusli
|
||||
Title: Guest from the North Wind 2
|
||||
- Id: 18121
|
||||
Title: Shafka
|
||||
Title: Guardian's Chest and Invitation 1
|
||||
- Id: 18122
|
||||
Title: Guardian's Box and Invitation 2
|
||||
- Id: 18123
|
||||
Title: Guardian's Box and Invitation 3
|
||||
- Id: 18124
|
||||
Title: Guardian's Chest and Invitation 5
|
||||
- Id: 18125
|
||||
Title: To the Ice Castle
|
||||
- Id: 18126
|
||||
Title: Meeting the Ice Castle
|
||||
- Id: 18127
|
||||
Title: Let's meet the Iwin Scouts.
|
||||
- Id: 18128
|
||||
Title: Let's meet Boclind.
|
||||
- Id: 18129
|
||||
Title: Guardian's Chest and Invitation 4
|
||||
- Id: 18130
|
||||
Title: Procurement of research materials for Belgund
|
||||
- Id: 18131
|
||||
Title: Procurement of research materials for Belgund - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 18132
|
||||
Title: I need someone.
|
||||
- Id: 18133
|
||||
Title: Leon's Story
|
||||
- Id: 18134
|
||||
Title: Search for the Displaced - Frozen Glacier
|
||||
- Id: 18135
|
||||
Title: Searching for the Lost - Frozen Plains
|
||||
- Id: 18136
|
||||
Title: Complete rescue of survivors
|
||||
- Id: 18137
|
||||
Title: Search for survivors - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 18138
|
||||
Title: Special way to survive
|
||||
Targets:
|
||||
- Mob: EP19_RGAN_A
|
||||
Count: 10
|
||||
- Mob: EP19_RGAN_B
|
||||
Count: 10
|
||||
- Id: 18139
|
||||
Title: Our precious food
|
||||
- Id: 18140
|
||||
Title: Our precious food - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 18141
|
||||
Title: A noble hobby
|
||||
- Id: 18142
|
||||
Title: A noble hobby - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 18143
|
||||
Title: For Safe Work
|
||||
Targets:
|
||||
- Mob: EP19_LIMACINA
|
||||
Count: 20
|
||||
- Mob: EP19_CALMARING
|
||||
Count: 20
|
||||
- Id: 18144
|
||||
Title: For Safe Work - Standby
|
||||
TimeLimit: 4h
|
||||
- Id: 19001
|
||||
Title: The earth where the flowers have blossomed - Waiting
|
||||
TimeLimit: 4h
|
||||
|
@ -7535,7 +7535,7 @@ Body:
|
||||
TargetTrap: true
|
||||
Range: 9
|
||||
Hit: Multi_Hit
|
||||
HitCount: -5
|
||||
HitCount: 5
|
||||
Element: Weapon
|
||||
CopyFlags:
|
||||
Skill:
|
||||
@ -15918,6 +15918,15 @@ Body:
|
||||
- Level: 5
|
||||
Time: 350000
|
||||
FixedCastTime: 1000
|
||||
- Id: 578
|
||||
Name: DE_BERSERKAIZER # TODO: effect? The skill is only used to display a visual effect for now
|
||||
Description: Berserkaizer
|
||||
MaxLevel: 1
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
HitCount: 1
|
||||
Duration1: -1
|
||||
- Id: 653
|
||||
Name: NPC_EARTHQUAKE
|
||||
Description: Earthquake
|
||||
@ -43106,6 +43115,7 @@ Body:
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
AfterCastWalkDelay: 1000
|
||||
Cooldown: 1000
|
||||
Requires:
|
||||
@ -43117,6 +43127,7 @@ Body:
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
AfterCastWalkDelay: 1000
|
||||
Duration1:
|
||||
- Level: 1
|
||||
@ -43147,6 +43158,8 @@ Body:
|
||||
Name: HAMI_SKIN
|
||||
Description: Adamantium Skin
|
||||
MaxLevel: 5
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
- Id: 8008
|
||||
Name: HAMI_BLOODLUST
|
||||
Description: Bloodlust
|
||||
@ -43154,6 +43167,7 @@ Body:
|
||||
TargetType: Self
|
||||
DamageFlags:
|
||||
NoDamage: true
|
||||
Hit: Single
|
||||
AfterCastWalkDelay: 1000
|
||||
Duration1:
|
||||
- Level: 1
|
||||
|
@ -612,48 +612,3 @@ Body:
|
||||
- Level: 260
|
||||
Points: 4099
|
||||
TraitPoints: 228
|
||||
- Level: 261
|
||||
Points: 4099
|
||||
TraitPoints: 231
|
||||
- Level: 262
|
||||
Points: 4099
|
||||
TraitPoints: 234
|
||||
- Level: 263
|
||||
Points: 4099
|
||||
TraitPoints: 237
|
||||
- Level: 264
|
||||
Points: 4099
|
||||
TraitPoints: 240
|
||||
- Level: 265
|
||||
Points: 4099
|
||||
TraitPoints: 247
|
||||
- Level: 266
|
||||
Points: 4099
|
||||
TraitPoints: 250
|
||||
- Level: 267
|
||||
Points: 4099
|
||||
TraitPoints: 253
|
||||
- Level: 268
|
||||
Points: 4099
|
||||
TraitPoints: 256
|
||||
- Level: 269
|
||||
Points: 4099
|
||||
TraitPoints: 259
|
||||
- Level: 270
|
||||
Points: 4099
|
||||
TraitPoints: 266
|
||||
- Level: 271
|
||||
Points: 4099
|
||||
TraitPoints: 269
|
||||
- Level: 272
|
||||
Points: 4099
|
||||
TraitPoints: 272
|
||||
- Level: 273
|
||||
Points: 4099
|
||||
TraitPoints: 275
|
||||
- Level: 274
|
||||
Points: 4099
|
||||
TraitPoints: 278
|
||||
- Level: 275
|
||||
Points: 4099
|
||||
TraitPoints: 285
|
||||
|
@ -1822,7 +1822,6 @@ Body:
|
||||
Icon: EFST_ETERNALCHAOS
|
||||
DurationLookup: BD_ETERNALCHAOS
|
||||
CalcFlags:
|
||||
Def: true
|
||||
Def2: true
|
||||
Flags:
|
||||
NoDispell: true
|
||||
@ -2619,9 +2618,6 @@ Body:
|
||||
CalcFlags:
|
||||
Batk: true
|
||||
Watk: true
|
||||
Flags:
|
||||
NoSave: true
|
||||
RemoveFromHomOnMapWarp: true
|
||||
- Status: Fleet
|
||||
DurationLookup: HFLI_FLEET
|
||||
CalcFlags:
|
||||
@ -2635,11 +2631,7 @@ Body:
|
||||
- Status: Defence
|
||||
DurationLookup: HAMI_DEFENCE
|
||||
CalcFlags:
|
||||
Def: true
|
||||
Vit: true
|
||||
Flags:
|
||||
NoSave: true
|
||||
RemoveFromHomOnMapWarp: true
|
||||
- Status: Incaspdrate
|
||||
CalcFlags:
|
||||
Aspd: true
|
||||
@ -4138,7 +4130,7 @@ Body:
|
||||
Unlimitedhummingvoice: true
|
||||
Sircleofnature: true
|
||||
- Status: Deepsleep
|
||||
Icon: EFST_DEEP_SLEEP
|
||||
Icon: EFST_HANDICAPSTATE_DEEP_SLEEP
|
||||
DurationLookup: WM_LULLABY_DEEPSLEEP
|
||||
States:
|
||||
NoCast: true
|
||||
@ -7022,9 +7014,7 @@ Body:
|
||||
CalcFlags:
|
||||
Regen: true
|
||||
- Status: Earthshaker
|
||||
Icon: EFST_EARTHSHAKER
|
||||
Flags:
|
||||
BlEffect: true
|
||||
NoWarning: true
|
||||
- Status: Weaponblock_On
|
||||
Icon: EFST_WEAPONBLOCK_ON
|
||||
@ -7039,7 +7029,6 @@ Body:
|
||||
Icon: EFST_SPORE_EXPLOSION_DEBUFF
|
||||
DurationLookup: GN_SPORE_EXPLOSION
|
||||
Flags:
|
||||
BlEffect: true
|
||||
NoDispell: true
|
||||
NoBanishingBuster: true
|
||||
NoClearance: true
|
||||
@ -7461,7 +7450,7 @@ Body:
|
||||
NoClearance: true
|
||||
NoClearbuff: true
|
||||
- Status: Madogear
|
||||
Icon: EFST_MADOGEAR_TYPE
|
||||
Icon: EFST_MADOGEAR
|
||||
CalcFlags:
|
||||
Speed: true
|
||||
Flags:
|
||||
@ -7975,8 +7964,6 @@ Body:
|
||||
DurationLookup: EM_SPELL_ENCHANTING
|
||||
CalcFlags:
|
||||
Smatk: true
|
||||
Flags:
|
||||
DisplayPc: true
|
||||
- Status: Summon_Elemental_Ardor
|
||||
Icon: EFST_SUMMON_ELEMENTAL_ARDOR
|
||||
DurationLookup: EM_SUMMON_ELEMENTAL_ARDOR
|
||||
@ -8028,23 +8015,17 @@ Body:
|
||||
DurationLookup: TR_MUSICAL_INTERLUDE
|
||||
CalcFlags:
|
||||
Res: true
|
||||
Flags:
|
||||
DisplayPc: true
|
||||
- Status: Jawaii_Serenade
|
||||
Icon: EFST_JAWAII_SERENADE
|
||||
DurationLookup: TR_JAWAII_SERENADE
|
||||
CalcFlags:
|
||||
Smatk: true
|
||||
Speed: true
|
||||
Flags:
|
||||
DisplayPc: true
|
||||
- Status: Pron_March
|
||||
Icon: EFST_PRON_MARCH
|
||||
DurationLookup: TR_PRON_MARCH
|
||||
CalcFlags:
|
||||
Patk: true
|
||||
Flags:
|
||||
DisplayPc: true
|
||||
- Status: Roseblossom
|
||||
Icon: EFST_ROSEBLOSSOM
|
||||
DurationLookup: TR_ROSEBLOSSOM
|
||||
@ -8058,8 +8039,6 @@ Body:
|
||||
Powerful_Faith: true
|
||||
Firm_Faith: true
|
||||
Sincere_Faith: true
|
||||
Flags:
|
||||
DisplayPc: true
|
||||
- Status: Sincere_Faith
|
||||
Icon: EFST_SINCERE_FAITH
|
||||
DurationLookup: IQ_SINCERE_FAITH
|
||||
|
@ -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 |
|
||||
==============================
|
||||
|
@ -118,8 +118,24 @@ is disabled in '/conf/battle/items.conf'.
|
||||
*nomvploot
|
||||
|
||||
Disables normal monsters and MVPs from dropping items on a map. Looted items will always drop.
|
||||
'nomobloot' prevents monsters and MVPs from dropping items from the 'Drops' table.
|
||||
'nomvploot' prevents MVPs from giving MVP prize items from the 'MvpDrops' table.
|
||||
'noloot' is the same as 'nomobloot' and 'nomvploot' combined.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
*nolootnormalmob
|
||||
|
||||
Disables normal monsters type (only) from dropping items on a map. Looted items will always drop.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
*no_npc_selfdestruction_on_all
|
||||
|
||||
A quick mapflag to change the behaviour of the NPC_SELFDESTRUCTION skill.
|
||||
When defined, the skill always and only hits enemy type instead of all units.
|
||||
|
||||
|
||||
---------------------------------------
|
||||
|
||||
*noexp
|
||||
|
@ -1012,12 +1012,9 @@ SC_CHANGE (EFST_HLIF_CHANGE)
|
||||
val2: VIT increase (20 * val1)
|
||||
val3: INT increase (30 * val1)
|
||||
|
||||
SC_BLOODLUST (EFST_HAMI_BLOODLUST)
|
||||
desc: Increase the homunculus ATK and has a chance to leech HP from the target
|
||||
val1: Skill Level
|
||||
val2: ATK increase (20 + (10 * val1))
|
||||
val3: Chance to leech HP (9 * val1)%
|
||||
val4: Leeched HP percentage 20%
|
||||
SC_BLOODLUST ()
|
||||
desc:
|
||||
val1:
|
||||
|
||||
SC_FLEET ()
|
||||
desc:
|
||||
@ -1027,10 +1024,10 @@ SC_SPEED ()
|
||||
desc:
|
||||
val1:
|
||||
|
||||
SC_DEFENCE (EFST_HAMI_DEFENCE)
|
||||
desc: Increase VIT and as result VIT-based DEF of the Player and plain VIT of the Homunculus
|
||||
val1: Skill Level
|
||||
val2: VIT increase for players, DEF increase for homunculus (5 + (5 * val1)) [Renewal], (2 * val1) [Pre-Renewal]
|
||||
SC_DEFENCE ()
|
||||
desc: Increase Defense, HAMI_DEFENCE effect
|
||||
val1: (none)
|
||||
val2: + Def(Pre-renewal) or VIT (Renewal)
|
||||
|
||||
SC_INCASPDRATE ()
|
||||
desc: Increase ASPD
|
||||
|
@ -1,9 +1,15 @@
|
||||
//===== rAthena Script =======================================
|
||||
//= Assassin Job Quest
|
||||
//===== By: ==================================================
|
||||
//= kobra_k88
|
||||
//===== Current Version: =====================================
|
||||
//= 3.7
|
||||
//===== Compatible With: =====================================
|
||||
//= rAthena Project
|
||||
//===== Description: =========================================
|
||||
//= [Official Conversion]
|
||||
//= Job Change quest for Assassin class.
|
||||
//===== Changelog: ===========================================
|
||||
//===== Additional Comments: =================================
|
||||
//= 1.0 Used some dialogue from the aegis Assassin script translated By: Pgro Team (OwNaGe)
|
||||
//= Also converted the booby traps from the aegis script.[kobra_k88]
|
||||
//= 1.1 Made adjustments to ontouch npcs to work with the new "ontouch" functionality.
|
||||
@ -44,7 +50,7 @@
|
||||
//= 3.5 Fixed the waitingroom where player can enter the Test Area without passing the written exam. Now player will not be warp inside the Test Area when did not passed the written exam instead the player will be warp back to the written exam entrance [JayPee]
|
||||
//= 3.6 Fixed broken event calls. [Euphy]
|
||||
//= 3.7 Fixed issue that the player can't progress in the quest if timed out at weapon reward step. This issue is fixed on iRO but not on kRO. [https://forums.warpportal.com/index.php?/topic/130060-didnt-receive-necklace-of-oblivion-when-changing-assassin/#entry1496042] [MrAntares]
|
||||
//= 3.8 Another 'unofficial fix'. Player can't change job if time out after the necklace is deleted. [Atemo]
|
||||
//= 3.8 Another 'unofficial fix'. Player can't change job if time out after the necklace is deleted.
|
||||
//============================================================
|
||||
|
||||
in_moc_16,19,33,1 script Guildsman#asn 55,{
|
||||
@ -80,7 +86,7 @@ in_moc_16,19,33,1 script Guildsman#asn 55,{
|
||||
mes "Well then,";
|
||||
mes "go for it!";
|
||||
close2;
|
||||
ASSIN_Q = 0;
|
||||
set ASSIN_Q,0;
|
||||
warp "in_moc_16",19,76;
|
||||
end;
|
||||
}
|
||||
@ -90,10 +96,9 @@ in_moc_16,19,33,1 script Guildsman#asn 55,{
|
||||
mes "[Ferocious-looking guy]";
|
||||
mes "You'll have to walk if you want to get back to town. Oh, and don't forget to save your spawn point, alright?";
|
||||
close2;
|
||||
ASSIN_Q = 0;
|
||||
ASSIN_Q2 = 0;
|
||||
if (ASSIN_Q3 < 3)
|
||||
ASSIN_Q3 = 0;
|
||||
set ASSIN_Q,0;
|
||||
set ASSIN_Q2,0;
|
||||
set ASSIN_Q3,0;
|
||||
savepoint "in_moc_16",18,14,1,1;
|
||||
warp "in_moc_16",18,14;
|
||||
end;
|
||||
@ -252,7 +257,7 @@ in_moc_16,19,33,1 script Guildsman#asn 55,{
|
||||
mes "It's been a while since I've received a guest. I'm sending";
|
||||
mes "you to the office.";
|
||||
close2;
|
||||
ASSIN_Q = 0;
|
||||
set ASSIN_Q,0;
|
||||
if (checkquest(8000) != -1) {
|
||||
changequest 8000,8001;
|
||||
} else {
|
||||
@ -548,9 +553,8 @@ OnTouch_:
|
||||
mes "Alright then,";
|
||||
mes "best of luck to you!";
|
||||
close2;
|
||||
if (ASSIN_Q3 < 3)
|
||||
ASSIN_Q3 = 1;
|
||||
ASSIN_Q = 1;
|
||||
set ASSIN_Q3,1;
|
||||
set ASSIN_Q,1;
|
||||
changequest 8001,8002;
|
||||
warp "in_moc_16",19,144;
|
||||
end;
|
||||
@ -572,9 +576,8 @@ OnTouch_:
|
||||
mes "to the Test Hall.";
|
||||
mes "Best of luck~";
|
||||
close2;
|
||||
if (ASSIN_Q3 < 3)
|
||||
ASSIN_Q3 = 2;
|
||||
ASSIN_Q = 1;
|
||||
set ASSIN_Q3,2;
|
||||
set ASSIN_Q,1;
|
||||
changequest 8001,8002;
|
||||
warp "in_moc_16",19,144;
|
||||
end;
|
||||
@ -599,8 +602,9 @@ OnTouch_:
|
||||
mes "Eh, get outta here.";
|
||||
mes "Stop wastin' my time...";
|
||||
close2;
|
||||
ASSIN_Q = 0;
|
||||
ASSIN_Q2 = 0;
|
||||
set ASSIN_Q,0;
|
||||
set ASSIN_Q3,0;
|
||||
set ASSIN_Q2,0;
|
||||
erasequest 8001;
|
||||
warp "moc_fild16",206,229;
|
||||
end;
|
||||
@ -626,9 +630,8 @@ OnTouch_:
|
||||
mes "[Assassin 'Khai']";
|
||||
mes "Are you done filling out the form? Alright, give it to me so I can send you to the Test Hall. Good luck~";
|
||||
next;
|
||||
if (ASSIN_Q3 < 3)
|
||||
ASSIN_Q3 = 1;
|
||||
ASSIN_Q = 1;
|
||||
set ASSIN_Q3,1;
|
||||
set ASSIN_Q,1;
|
||||
changequest 8001,8002;
|
||||
warp "in_moc_16",19,144;
|
||||
end;
|
||||
@ -641,9 +644,8 @@ OnTouch_:
|
||||
mes "Then give me the form so that I can send you to the Test Hall, alright?";
|
||||
mes "Good luck...";
|
||||
next;
|
||||
if (ASSIN_Q3 < 3)
|
||||
ASSIN_Q3 = 2;
|
||||
ASSIN_Q = 1;
|
||||
set ASSIN_Q3,2;
|
||||
set ASSIN_Q,1;
|
||||
changequest 8001,8002;
|
||||
warp "in_moc_16",19,144;
|
||||
end;
|
||||
@ -709,7 +711,7 @@ OnTouch_:
|
||||
mes "Although I am heartless,";
|
||||
mes "I am not necessarily cruel. Before we proceed, is there anything you wish to know?";
|
||||
next;
|
||||
ASSIN_Q2 = 0;
|
||||
set ASSIN_Q2,0;
|
||||
while(ASSIN_Q2 < 3) {
|
||||
switch(select("...Skills?:...Stats?:Hmpf, I know it all.")) {
|
||||
case 1:
|
||||
@ -772,7 +774,7 @@ OnTouch_:
|
||||
mes "Now...";
|
||||
mes "That's all I have to tell you";
|
||||
mes "about Assassin skills.";
|
||||
ASSIN_Q2 = 1;
|
||||
set ASSIN_Q2,1;
|
||||
next;
|
||||
break;
|
||||
case 2:
|
||||
@ -785,7 +787,7 @@ OnTouch_:
|
||||
next;
|
||||
mes "[The Anonymous One]";
|
||||
mes "I cannot give you better advice than that in regards to Stats. You should research and see which stats suit you, and decide what kind of Assassin you want to be.";
|
||||
ASSIN_Q2 = 2;
|
||||
set ASSIN_Q2,2;
|
||||
next;
|
||||
break;
|
||||
case 3:
|
||||
@ -795,7 +797,7 @@ OnTouch_:
|
||||
mes "I'll be the judge of that!";
|
||||
next;
|
||||
}
|
||||
ASSIN_Q2 = 3;
|
||||
set ASSIN_Q2,3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -845,53 +847,53 @@ OnTouch_:
|
||||
mes "1. Choose skill that is not required to learn Grimtooth.";
|
||||
next;
|
||||
if (select("Cloaking level 2:Sonic Blow level 5:Katar Mastery level 4:Right hand Mastery level 2") == 4)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "2. What property does Enchant Poison possess?";
|
||||
next;
|
||||
if (select("Poison:Earth:Fire:Wind") == 1)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "3. How does Level 4 Right Hand Mastery work?";
|
||||
next;
|
||||
if (select("Recover 80% of damage decrease:Recover 90% of damage decrease:Increase 90% of damage:Increase 108% of damage") == 2)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "4. What is the item required for using Venom Dust?";
|
||||
next;
|
||||
if (select("Red Blood:Blue Gemstone:Yellow Gemstone:Red Gemstone") == 4)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "5. Which skill can you learn when you reach Level 5 Enchant Poison?";
|
||||
next;
|
||||
if (select("Envenom:Sonic Blow:Venom Splasher:Venom Dust") == 4)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "6. Among the following skills, which allows you to walk while invisible?";
|
||||
next;
|
||||
if (select("Hiding:Back Slide:Cloaking:Sand Attack") == 3)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "7. Choose the condition that is unrelated to Venom Splasher.";
|
||||
next;
|
||||
if (select("Poisoned target.:Red Gemstone.:Remaing HP of Target.") == 2)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "8. Which monster is weak to a weapon with Vadon card (adds 20% damage on Fire property monster)?";
|
||||
next;
|
||||
if (select("Steel Chonchon:Deviruchi:Elder Willow:Baphomet") == 3)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "9. How much SP does";
|
||||
mes "Double Attack need?";
|
||||
next;
|
||||
if (select("15:It's a passive skill, so SP use is 0.:It's passive skill, so SP use is 10.:54") == 2)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "10. What is the best elemental Main Gauche weapon for hunting in Izlude dungeon?";
|
||||
next;
|
||||
if (select("Wind Main Gauche:Ice Main Gauche:Earth Main Gauche:Fire Main Gauche") == 1)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
break;
|
||||
case 2:
|
||||
mes "[The Anonymous One]";
|
||||
@ -899,104 +901,104 @@ OnTouch_:
|
||||
mes "drops a slotted Katar?";
|
||||
next;
|
||||
if (select("Thief Bug:Peco Peco:Desert Wolf:Hammer Cobolt") == 3)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "2. Which monster";
|
||||
mes "drops a slotted Jur?";
|
||||
next;
|
||||
if (select("Martin:Desert Wolf:Marionette:Myst") == 1)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "3. Which class is allowed to craft elemental weapons?";
|
||||
next;
|
||||
if (select("Merchant:Blacksmith:Thief:Priest") == 2)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "4. Choose the weapon which is not in the Katar class.";
|
||||
next;
|
||||
if (select("Jamadhar:Jur:Katar:Gladius") == 4)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "5. What property do Izlude dungeon monsters posses?";
|
||||
next;
|
||||
if (select("Water:Fire:Wind:Earth") == 1)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "6. Which monster";
|
||||
mes "cannot be a Cute Pet?";
|
||||
next;
|
||||
if (select("Poporing:Roda Frog:Smokie:Poison Spore") == 2)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "7. Choose a monster that Fire property Daggers work the best on.";
|
||||
next;
|
||||
if (select("Dagger Goblin:Mace Goblin:Morning Star Goblin:Hammer Goblin") == 4)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "8. Choose the non-elemental Katar from the following:";
|
||||
next;
|
||||
if (select("Katar of Raging Blaze:Katar of Dusty Thornbush:Sharpened Legbone of Ghoul:Infiltrator") == 4)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "9. Which is the uncommon monster?";
|
||||
next;
|
||||
if (select("Poring:Mastering:Ghostring:Spore") == 3)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "10. Choose the monster";
|
||||
mes "that is not Undead.";
|
||||
next;
|
||||
if (select("Drake:Megalodon:Spore:Khalitzburg") == 3)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
break;
|
||||
case 3:
|
||||
mes "[The Anonymous One]";
|
||||
mes "1. Choose the correct amount of the maximum dodge rate increase from the 'Increase Dodge' skill when at level 10.";
|
||||
next;
|
||||
if (select("30:40:160:20") == 1)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "2. Choose a monster which detects hiding/cloaking Thieves and Assassins.";
|
||||
next;
|
||||
if (select("Worm Tail:Andre:Mummy:Soldier Skeleton") == 2)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "3. Choose a group of weapons that cannot be used by an Assassin at once.";
|
||||
next;
|
||||
if (select("Main Gaughe + Gladius:Stiletto + Main Gauche:Katar + Maingauche:Hammer + Stiletto") == 3)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "4. Choose the town where Thieves can change their jobs.";
|
||||
next;
|
||||
if (select("Prontera:Lutie:Alberta:Morocc") == 4)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "5. Choose a card that does not affect the AGI stat.";
|
||||
next;
|
||||
if (select("Baphomet Jr. card:Whisper Card:Female Thiefbug card:Male Thiefbug card") == 2)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "6. Choose the correct specialty of the Assassin class.";
|
||||
next;
|
||||
if (select("Excellent singing talent:Excellent reading talent:Excellent dancing talent:Excellent dodge ability") == 4)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "7. Choose the maximum AGI bonus an Assassin can get at job level 50.";
|
||||
next;
|
||||
if (select("7:8:9:10") == 4)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "8. Choose the item that an Assassin cannot equip.";
|
||||
next;
|
||||
if (select("Dagger:Helm:Boots:Brooch") == 2)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
mes "[The Anonymous One]";
|
||||
mes "9. Choose the job change item for Thief.";
|
||||
next;
|
||||
switch(select("Orange Gooey Mushroom:Red Gooey Mushroom:Orange Net Mushroom:Orange Hair Mushroom")) {
|
||||
case 1:
|
||||
case 3:
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1005,7 +1007,7 @@ OnTouch_:
|
||||
mes "10. Choose a card that would typically benefit an Assassin the least.";
|
||||
next;
|
||||
if (select("Whisper card:Elder Willow card:Soldier Skeleton card:Cobold card") == 2)
|
||||
.@assassin_t += 10;
|
||||
set .@assassin_t,.@assassin_t+10;
|
||||
break;
|
||||
}
|
||||
if (ASSIN_Q2 == 3) {
|
||||
@ -1021,7 +1023,7 @@ OnTouch_:
|
||||
mes "You scored";
|
||||
mes "" + .@assassin_t + " percent...";
|
||||
if (.@assassin_t > 80) {
|
||||
ASSIN_Q2 = 5;
|
||||
set ASSIN_Q2,5;
|
||||
changequest 8002,8003;
|
||||
mes "Well done.";
|
||||
mes "You pass.";
|
||||
@ -1031,7 +1033,7 @@ OnTouch_:
|
||||
close;
|
||||
}
|
||||
else {
|
||||
ASSIN_Q2 = 4;
|
||||
set ASSIN_Q2,4;
|
||||
mes "That means you fail!";
|
||||
next;
|
||||
mes "[The Anonymous One]";
|
||||
@ -1058,7 +1060,7 @@ OnTouch_:
|
||||
mes "You scored";
|
||||
mes "" + .@assassin_t + " points...";
|
||||
if (.@assassin_t > 80) {
|
||||
ASSIN_Q2 = 5;
|
||||
set ASSIN_Q2,5;
|
||||
changequest 8002,8003;
|
||||
next;
|
||||
mes "[The Anonymous One]";
|
||||
@ -1066,7 +1068,7 @@ OnTouch_:
|
||||
close;
|
||||
}
|
||||
else {
|
||||
ASSIN_Q2 = 4;
|
||||
set ASSIN_Q2,4;
|
||||
mes "You failed!";
|
||||
next;
|
||||
mes "[The Anonymous One]";
|
||||
@ -1192,8 +1194,9 @@ OnTouch_:
|
||||
mes "I guess you";
|
||||
mes "could use a break...";
|
||||
close2;
|
||||
ASSIN_Q = 0;
|
||||
ASSIN_Q2 = 0;
|
||||
set ASSIN_Q,0;
|
||||
set ASSIN_Q3,0;
|
||||
set ASSIN_Q2,0;
|
||||
changequest 8003,8000;
|
||||
warp "in_moc_16",19,13;
|
||||
end;
|
||||
@ -1204,7 +1207,7 @@ in_moc_16,1,1,0 script Beholder#ASNTEST -1,{
|
||||
end;
|
||||
|
||||
OnEnable:
|
||||
.MyMobs = 6;
|
||||
set .MyMobs,6;
|
||||
// Target mobs
|
||||
monster "in_moc_16",62,161,"Job change target",1002,1,"Beholder#ASNTEST::OnMyMobDead";
|
||||
monster "in_moc_16",85,169,"Job change target",1063,1,"Beholder#ASNTEST::OnMyMobDead";
|
||||
@ -1264,15 +1267,15 @@ OnResetmob:
|
||||
end;
|
||||
|
||||
OnMyMobDead:
|
||||
.MyMobs--;
|
||||
set .MyMobs,.MyMobs-1;
|
||||
if (.MyMobs < 1) {
|
||||
mapannounce "in_moc_16","You seem to be doing quite well. Keep it up!",bc_map;
|
||||
ASSIN_Q = 3;
|
||||
set ASSIN_Q,3;
|
||||
changequest 8003,8004;
|
||||
donpcevent "timestopper#1::OnEnable";
|
||||
donpcevent "Keeper of the Door#ASN::OnEnable";
|
||||
donpcevent "Beholder#ASNTEST::OnResetmob";
|
||||
.DisableTraps = 1;
|
||||
set .DisableTraps,1;
|
||||
stopnpctimer;
|
||||
}
|
||||
else {
|
||||
@ -1282,7 +1285,7 @@ OnMyMobDead:
|
||||
|
||||
OnMyMobDead2:
|
||||
mapannounce "in_moc_16",strcharinfo(0) + "! You made a mistake! I'm bringing you back!",bc_map;
|
||||
ASSIN_Q = 2;
|
||||
set ASSIN_Q,2;
|
||||
warp "in_moc_16",19,161;
|
||||
donpcevent "Beholder#ASNTEST::OnReset";
|
||||
end;
|
||||
@ -1338,7 +1341,7 @@ OnTimer184000:
|
||||
OnTimer185000:
|
||||
mapannounce "in_moc_16","Time's up!",bc_map;
|
||||
mapannounce "in_moc_16","Well, good job... If you wanted to waste your time. You'll have to try again!",bc_map;
|
||||
//ASSIN_Q = 2;
|
||||
//set ASSIN_Q,2;
|
||||
end;
|
||||
|
||||
OnTimer186000:
|
||||
@ -1354,7 +1357,7 @@ in_moc_16,68,158,0 script 01_1::SinTrap -1,0,0,{
|
||||
OnTouch_:
|
||||
if (getvariableofnpc(.DisableTraps,"Beholder#ASNTEST") < 1) {
|
||||
mapannounce "in_moc_16",strcharinfo(0) + ", you're trapped. You will be sent back.",bc_map;
|
||||
ASSIN_Q = 2;
|
||||
set ASSIN_Q,2;
|
||||
warp "in_moc_16",19,161;
|
||||
donpcevent "Beholder#ASNTEST::OnResetmob";
|
||||
donpcevent "Standby Room#ASNTEST::OnStart";
|
||||
@ -1454,9 +1457,9 @@ OnInit:
|
||||
OnTouch_:
|
||||
donpcevent "Thomas#ASNTEST::OnDisable";
|
||||
if (ASSIN_Q == 3)
|
||||
ASSIN_Q = 3;
|
||||
set ASSIN_Q,3;
|
||||
else
|
||||
ASSIN_Q = 4;
|
||||
set ASSIN_Q,4;
|
||||
warp "in_moc_16",87,102;
|
||||
savepoint "in_moc_16",16,13,1,1;
|
||||
end;
|
||||
@ -1488,9 +1491,9 @@ OnDisable:
|
||||
OnMyMobDead:
|
||||
mapannounce "in_moc_16","Hey, what the hell was that?! I told you: No killing monsters!",bc_map;
|
||||
mapannounce "in_moc_16","I'm bringing you back... *Sigh...*",bc_map;
|
||||
ASSIN_Q = 3;
|
||||
set ASSIN_Q,3;
|
||||
warp "in_moc_16",87,102;
|
||||
killmonster "in_moc_16","timestopper#1::OnMyMobDead";
|
||||
killmonsterall "in_moc_16";
|
||||
end;
|
||||
}
|
||||
|
||||
@ -1522,8 +1525,9 @@ OnTouch_:
|
||||
mes "Oh hey, don't forget to save your respawn point in town.";
|
||||
close2;
|
||||
mapannounce "in_moc_16",strcharinfo(0) + " got scared and quit the test...Who's Next?!",bc_map;
|
||||
ASSIN_Q = 0;
|
||||
ASSIN_Q2 = 0;
|
||||
set ASSIN_Q,0;
|
||||
set ASSIN_Q2,0;
|
||||
set ASSIN_Q3,0;
|
||||
changequest 8004,8000;
|
||||
savepoint "in_moc_16",18,14,1,1;
|
||||
warp "in_moc_16",18,14;
|
||||
@ -1544,7 +1548,7 @@ OnTouch_:
|
||||
mes "[Thomas]";
|
||||
mes "If you run away, get a nose bleed and pass out or something like that, I'll fail ya'. Enough talk. Let's see what you got.";
|
||||
close2;
|
||||
ASSIN_Q = 4;
|
||||
set ASSIN_Q,4;
|
||||
|
||||
monster "in_moc_16",81,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead";
|
||||
monster "in_moc_16",82,77,"Mummy",1041,1,"timestopper#1::OnMyMobDead";
|
||||
@ -1579,7 +1583,7 @@ OnTouch_:
|
||||
|
||||
OnDisable:
|
||||
donpcevent "Standby Room#ASNTEST::OnStart";
|
||||
killmonster "in_moc_16","timestopper#1::OnMyMobDead";
|
||||
killmonsterall "in_moc_16";
|
||||
end;
|
||||
}
|
||||
|
||||
@ -1592,7 +1596,7 @@ OnTouch_:
|
||||
mes "Oh! Congratulations!";
|
||||
mes "You may now proceed to our Guildmaster's room. Good luck!!";
|
||||
close2;
|
||||
ASSIN_Q = 5;
|
||||
set ASSIN_Q,5;
|
||||
changequest 8004,8005;
|
||||
warp "in_moc_16",181,183;
|
||||
end;
|
||||
@ -1602,7 +1606,7 @@ in_moc_16,182,169,0 script Maze Assistant 45,1,1,{
|
||||
OnTouch_:
|
||||
if (ASSIN_Q == 5 || ASSIN_Q == 6) {
|
||||
warp "in_moc_16",181,183;
|
||||
ASSIN_Q++;
|
||||
set ASSIN_Q,ASSIN_Q+1;
|
||||
if (!isbegin_quest(8006))
|
||||
changequest 8005,8006;
|
||||
}
|
||||
@ -1644,7 +1648,7 @@ OnTouch_:
|
||||
else
|
||||
savepoint "moc_ruins",79,99,1,1;
|
||||
if (ASSIN_Q == 7 && BaseJob == Job_Thief) {
|
||||
ASSIN_Q = 8;
|
||||
set ASSIN_Q,8;
|
||||
mes "[Guildmaster]";
|
||||
mes "Welcome.";
|
||||
mes "I apologize for";
|
||||
@ -1678,6 +1682,7 @@ OnTouch_:
|
||||
next;
|
||||
switch(select("Revenge...!:Money~:I want to travel.")) {
|
||||
case 1:
|
||||
set ASSIN_Q,8;
|
||||
mes "[Guildmaster]";
|
||||
mes "Revenge...?";
|
||||
mes "Yes, I understand. All of us hold grudges against someone else eventually.";
|
||||
@ -1691,7 +1696,7 @@ OnTouch_:
|
||||
next;
|
||||
break;
|
||||
case 2:
|
||||
ASSIN_Q = 9;
|
||||
set ASSIN_Q,9;
|
||||
mes "[Guildmaster]";
|
||||
mes "Financial reasons...? I won't deny that we all need money to live. But being Assassin means living for a higher purpose.";
|
||||
next;
|
||||
@ -1702,7 +1707,7 @@ OnTouch_:
|
||||
next;
|
||||
break;
|
||||
case 3:
|
||||
ASSIN_Q = 10;
|
||||
set ASSIN_Q,10;
|
||||
mes "[Guildmaster]";
|
||||
mes "Good idea. Traveling around the world will allow you to broaden your experiences.";
|
||||
next;
|
||||
@ -1731,7 +1736,7 @@ OnTouch_:
|
||||
next;
|
||||
switch(select("I like the solitude.:Making money being an Assassin.:They just look interesting.")) {
|
||||
case 1:
|
||||
ASSIN_Q = 11;
|
||||
set ASSIN_Q,11;
|
||||
mes "[Guildmaster]";
|
||||
mes "You got the point...";
|
||||
mes "We are lonely. We will always be alone, even amongst each other...";
|
||||
@ -1746,13 +1751,13 @@ OnTouch_:
|
||||
next;
|
||||
break;
|
||||
case 2:
|
||||
ASSIN_Q = 12;
|
||||
set ASSIN_Q,12;
|
||||
mes "[Guildmaster]";
|
||||
mes "Well, I can't deny it, we do need money to make a living. But don't you think we should pursue something even more important than money?";
|
||||
next;
|
||||
break;
|
||||
case 3:
|
||||
ASSIN_Q = 13;
|
||||
set ASSIN_Q,13;
|
||||
mes "[Guildmaster]";
|
||||
mes "Style and appearance is only superficial. It is sad that many people think this way...";
|
||||
next;
|
||||
@ -1777,7 +1782,7 @@ OnTouch_:
|
||||
next;
|
||||
switch(select("To broaden my skills.:It's a goal of mine.:For spiritual improvement.")) {
|
||||
case 1:
|
||||
ASSIN_Q = 14;
|
||||
set ASSIN_Q,14;
|
||||
mes "[Guildmaster]";
|
||||
mes "Learning skills comes naturally with the Assassin job. But don't think of skills as the best value of your training.";
|
||||
next;
|
||||
@ -1786,7 +1791,7 @@ OnTouch_:
|
||||
next;
|
||||
break;
|
||||
case 2:
|
||||
ASSIN_Q = 15;
|
||||
set ASSIN_Q,15;
|
||||
mes "[Guildmaster]";
|
||||
mes "It's a goal of yours, eh? Well, I guess you've got to have goals...";
|
||||
next;
|
||||
@ -1800,7 +1805,7 @@ OnTouch_:
|
||||
next;
|
||||
break;
|
||||
case 3:
|
||||
ASSIN_Q = 16;
|
||||
set ASSIN_Q,16;
|
||||
mes "[Guildmaster]";
|
||||
mes "Good idea...";
|
||||
mes "That is a good way to improve yourself. I've seen many people who know how to be strong physically but not in their mental state.";
|
||||
@ -1832,14 +1837,14 @@ OnTouch_:
|
||||
next;
|
||||
switch(select("I would level up fast.:I want to explore my Assassin skills.:I will go where I couldn't go as a Thief.")) {
|
||||
case 1:
|
||||
.@assassin_sangdam += 10;
|
||||
set .@assassin_sangdam,.@assassin_sangdam+10;
|
||||
mes "[Guildmaster]";
|
||||
mes "Don't act recklessly...";
|
||||
mes "Being an Assassin never makes you a different person. And don't rely on chance.";
|
||||
next;
|
||||
break;
|
||||
case 2:
|
||||
.@assassin_sangdam += 5;
|
||||
set .@assassin_sangdam,.@assassin_sangdam+5;
|
||||
mes "[Guildmaster]";
|
||||
mes "It is good for one to examine oneself. I can understand that you will be excited by the great change in your ability.";
|
||||
next;
|
||||
@ -1866,14 +1871,14 @@ OnTouch_:
|
||||
next;
|
||||
switch(select("My friends.:My Guildsmen.:My lover.")) {
|
||||
case 1:
|
||||
.@assassin_sangdam += 5;
|
||||
set .@assassin_sangdam,.@assassin_sangdam+5;
|
||||
mes "[Guildmaster]";
|
||||
mes "I see...";
|
||||
mes "Appreciate them for caring about you, even when you're alone.";
|
||||
next;
|
||||
break;
|
||||
case 2:
|
||||
.@assassin_sangdam += 5;
|
||||
set .@assassin_sangdam,.@assassin_sangdam+5;
|
||||
mes "[Guildmaster]";
|
||||
mes "Great...";
|
||||
mes "Comrades for whom you would die for...";
|
||||
@ -1904,7 +1909,7 @@ OnTouch_:
|
||||
next;
|
||||
switch(select("Places where Assassins can level up...:Main goals as an Assassin.:Financial consulting.")) {
|
||||
case 1:
|
||||
.@assassin_sangdam += 5;
|
||||
set .@assassin_sangdam,.@assassin_sangdam+5;
|
||||
mes "[Guildmaster]";
|
||||
mes "It all depends on your mind. Any place could be the best to level up according to your mind state.";
|
||||
next;
|
||||
@ -1922,7 +1927,7 @@ OnTouch_:
|
||||
next;
|
||||
break;
|
||||
case 3:
|
||||
.@assassin_sangdam += 10;
|
||||
set .@assassin_sangdam,.@assassin_sangdam+10;
|
||||
mes "[Guildmaster]";
|
||||
mes "Oh my lord...";
|
||||
mes "Are you planning to become an Assassin in order to make money?";
|
||||
@ -1974,7 +1979,7 @@ OnTouch_:
|
||||
mes "supports you. How";
|
||||
mes "about you, Huey?";
|
||||
next;
|
||||
if (ASSIN_Q3 == 1) { // player Job Level was above 48
|
||||
if (ASSIN_Q3 == 1) {
|
||||
mes "[Huey]";
|
||||
mes "A rarity.";
|
||||
mes "You can tell";
|
||||
@ -1984,7 +1989,7 @@ OnTouch_:
|
||||
mes "I agree with";
|
||||
mes "the Anonymous One.";
|
||||
}
|
||||
else { // player Job Level was below 48
|
||||
else {
|
||||
mes "[Huey]";
|
||||
mes "Although "+ strcharinfo(0) +" looks too mellow and gentle, kind of like a pussycat, "+ strcharinfo(0) +" has the stuff.";
|
||||
next;
|
||||
@ -2059,8 +2064,7 @@ OnTouch_:
|
||||
mes "I believe you stand out amongst them...";
|
||||
next;
|
||||
}
|
||||
switch(ASSIN_Q3) {
|
||||
case 1: // player Job Level was above 48
|
||||
if (ASSIN_Q3 == 1 && BaseJob == Job_Thief && ASSIN_Q > 6 && ASSIN_Q < 17) {
|
||||
mes "[Guildmaster]";
|
||||
mes "Well, I've said too much. Please choose a weapon as a present.";
|
||||
next;
|
||||
@ -2094,10 +2098,10 @@ OnTouch_:
|
||||
mes "It used to rule over the Assassin weapon market. Please take care of my gladius.";
|
||||
getitem 1220,1; //Gladius_
|
||||
}
|
||||
ASSIN_Q3 = 3;
|
||||
ASSIN_Q3 = 2;
|
||||
next;
|
||||
break;
|
||||
case 2: // player Job Level was below 48
|
||||
}
|
||||
else if (ASSIN_Q3 != 2) {
|
||||
mes "[Guildmaster]";
|
||||
mes "Well, I talked too much.";
|
||||
mes "Please take this first.";
|
||||
@ -2118,7 +2122,7 @@ OnTouch_:
|
||||
case 5:
|
||||
getitem 1252,1; //Katar
|
||||
}
|
||||
ASSIN_Q3 = 3;
|
||||
ASSIN_Q3 = 2;
|
||||
}
|
||||
mes "[Guildmaster]";
|
||||
mes "Well, I am giving you a token. Please return to the Assassin expert, the Ferocious-Looking Huey, at the entrance.";
|
||||
@ -2161,7 +2165,7 @@ OnTouch_:
|
||||
end;
|
||||
}
|
||||
else if (ASSIN_Q > 7 && ASSIN_Q < 17) {
|
||||
ASSIN_Q = 7;
|
||||
set ASSIN_Q,7;
|
||||
mes "[Guildmaster]";
|
||||
mes "What the hell? You pressed 'Cancel' during the process. Do you want to change your job or what?";
|
||||
next;
|
||||
|
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/mysterious_cookie_shop.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
|
||||
Amount: 350
|
||||
- Index: 7
|
||||
Item: Gray_W_Ring
|
||||
Item: Gray_W_Robe
|
||||
RequiredItems:
|
||||
- Index: 0
|
||||
Item: Ep18_Amethyst_Fragment
|
||||
Amount: 350
|
||||
- Index: 8
|
||||
Item: Gray_W_Earing
|
||||
Item: Gray_W_Ring
|
||||
RequiredItems:
|
||||
- Index: 0
|
||||
Item: Ep18_Amethyst_Fragment
|
||||
Amount: 350
|
||||
- Index: 9
|
||||
Item: Gray_W_Necklace
|
||||
Item: Gray_W_Earing
|
||||
RequiredItems:
|
||||
- Index: 0
|
||||
Item: Ep18_Amethyst_Fragment
|
||||
|
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: =================================
|
||||
//= 1.0 First version.
|
||||
// Venomous Chimera spawn timer is custom. [Capuche]
|
||||
//= 1.1 Updated Venomous Chimera spawn timer. [Capuche]
|
||||
//============================================================
|
||||
|
||||
slabw01 monster Human Chimera 3631,45
|
||||
slabw01 monster Material Chimera 3632,45
|
||||
slabw01 boss_monster Venomous Chimera 3633,1,3600000,600000,0
|
||||
// unknown timer
|
||||
slabw01 monster Venomous Chimera 3633,1,18000000,600000,0
|
||||
|
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;
|
||||
}
|
||||
|
||||
// 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?";
|
||||
next;
|
||||
}
|
||||
switch( checkquest(5937,PLAYTIME) ) {
|
||||
case -1:
|
||||
break;
|
||||
case 0:
|
||||
case 1:
|
||||
setpcblock PCBLOCK_NPC, true;
|
||||
if (checkquest(5937,PLAYTIME) != 2)
|
||||
npctalk "Mejai: Hello. Let's do our best today too.", "Mejai#E18_7", bc_self;
|
||||
else {
|
||||
npctalk "Mejai: Come on! Today's work is done.", "Mejai#E18_7", bc_self;
|
||||
sleep2 1000;
|
||||
setpcblock PCBLOCK_NPC, false;
|
||||
npctalk "Mejai: Go home and be faithful to your family. It's not like this is the only thing you have to do.", "Mejai#E18_7", bc_self;
|
||||
end;
|
||||
case 2:
|
||||
setpcblock PCBLOCK_NPC, true;
|
||||
npctalk "Mejai: Hello. Let's do our best today too.", "Mejai#E18_7", bc_self;
|
||||
}
|
||||
sleep2 1000;
|
||||
setpcblock PCBLOCK_NPC, false;
|
||||
break;
|
||||
}
|
||||
switch( select( "I'm currently busy..", "Harvesting Half Flowers", "Delivering Half Flowers" ) ) {
|
||||
case 1:
|
||||
npctalk "Mejai: It seems you're busy with something? Please come see me when you're free.", "Mejai#E18_7", bc_self;
|
||||
@ -13018,7 +13012,7 @@ wolfvill,164,137,3 script Emmet#emet 4_EP18_GW_WOMAN01,{
|
||||
mes "I mean, the Amethyst Fragment.";
|
||||
mes "Please select the part you want to enchant.";
|
||||
next;
|
||||
switch( select( "Armor", "Garment", "Shoes", "Right(R) Accessory", "Left(L) Accessory" ) ) {
|
||||
switch( select( "Armor", "Coat", "Shoes", "Right(R) Accessory", "Left(L) Accessory" ) ) {
|
||||
case 1:
|
||||
mes "[Emmet]";
|
||||
mes "You're enchanting the armor, I see.";
|
||||
@ -13027,7 +13021,7 @@ wolfvill,164,137,3 script Emmet#emet 4_EP18_GW_WOMAN01,{
|
||||
end;
|
||||
case 2:
|
||||
mes "[Emmet]";
|
||||
mes "You're enchanting the garment, I see.";
|
||||
mes "You're enchanting the footwear, I see.";
|
||||
close2;
|
||||
item_enchant(2);
|
||||
end;
|
||||
|
17224
npc/re/quests/quests_19.txt
Normal file
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 ---------------------------
|
||||
npc: npc/re/instances/AirshipAssault.txt
|
||||
npc: npc/re/instances/AirshipDestruction.txt
|
||||
npc: npc/re/instances/BaggotLaboratory.txt
|
||||
npc: npc/re/instances/BakonawaLake.txt
|
||||
npc: npc/re/instances/BangungotHospital.txt
|
||||
npc: npc/re/instances/BuwayaCave.txt
|
||||
npc: npc/re/instances/CentralLaboratory.txt
|
||||
npc: npc/re/instances/CharlestonCrisis.txt
|
||||
npc: npc/re/instances/ConfusedSnakesNest.txt
|
||||
npc: npc/re/instances/CorOperation.txt
|
||||
npc: npc/re/instances/DevilTower.txt
|
||||
npc: npc/re/instances/EclageInterior.txt
|
||||
@ -81,6 +84,7 @@ npc: npc/re/instances/HeartHunterWarBase.txt
|
||||
npc: npc/re/instances/HiddenGarden.txt
|
||||
npc: npc/re/instances/InfiniteSpace.txt
|
||||
npc: npc/re/instances/IsleOfBios.txt
|
||||
npc: npc/re/instances/IwinPatrol.txt
|
||||
npc: npc/re/instances/LastRoom.txt
|
||||
npc: npc/re/instances/LostFarm.txt
|
||||
npc: npc/re/instances/MalangdoCulvert.txt
|
||||
@ -143,6 +147,7 @@ npc: npc/re/merchants/enchan_rockridge.txt
|
||||
npc: npc/re/merchants/enchan_sage_legacy_17_2.txt
|
||||
npc: npc/re/merchants/enchan_verus.txt
|
||||
npc: npc/re/merchants/enchantgrade.txt
|
||||
npc: npc/re/merchants/episode_19.txt
|
||||
npc: npc/re/merchants/Extended_Ammunition.txt
|
||||
npc: npc/re/merchants/Extended_Stylist.txt
|
||||
npc: npc/re/merchants/flute.txt
|
||||
@ -243,6 +248,7 @@ npc: npc/re/quests/quests_illusion_dungeons.txt
|
||||
npc: npc/re/quests/quests_17_1.txt
|
||||
npc: npc/re/quests/quests_17_2.txt
|
||||
npc: npc/re/quests/quests_18.txt
|
||||
npc: npc/re/quests/quests_19.txt
|
||||
npc: npc/re/quests/quests_aldebaran.txt
|
||||
npc: npc/re/quests/quests_dewata.txt
|
||||
npc: npc/re/quests/quests_dicastes.txt
|
||||
|
@ -39,6 +39,8 @@ npc: npc/re/mobs/dungeons/gon_dun.txt
|
||||
npc: npc/re/mobs/dungeons/ice_dun.txt
|
||||
npc: npc/re/mobs/dungeons/in_sphinx.txt
|
||||
npc: npc/re/mobs/dungeons/iz_dun.txt
|
||||
npc: npc/re/mobs/dungeons/jor_ab.txt
|
||||
npc: npc/re/mobs/dungeons/jor_dun.txt
|
||||
npc: npc/re/mobs/dungeons/juperos.txt
|
||||
npc: npc/re/mobs/dungeons/kh_dun.txt
|
||||
npc: npc/re/mobs/dungeons/lhz_dun.txt
|
||||
@ -89,6 +91,7 @@ npc: npc/re/mobs/fields/geffen.txt
|
||||
npc: npc/re/mobs/fields/gonryun.txt
|
||||
npc: npc/re/mobs/fields/gw_fild.txt
|
||||
npc: npc/re/mobs/fields/hugel.txt
|
||||
npc: npc/re/mobs/fields/jor_back.txt
|
||||
npc: npc/re/mobs/fields/lighthalzen.txt
|
||||
npc: npc/re/mobs/fields/louyang.txt
|
||||
npc: npc/re/mobs/fields/lutie.txt
|
||||
|
@ -527,7 +527,6 @@ CREATE TABLE IF NOT EXISTS `guild_expulsion` (
|
||||
`account_id` int(11) unsigned NOT NULL default '0',
|
||||
`name` varchar(24) NOT NULL default '',
|
||||
`mes` varchar(40) NOT NULL default '',
|
||||
`char_id` int(11) unsigned NOT NULL default '0',
|
||||
PRIMARY KEY (`guild_id`,`name`)
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
//checking guild_expulsion_db
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes`,`char_id` FROM `%s` LIMIT 1;", schema_config.guild_expulsion_db) ){
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes` FROM `%s` LIMIT 1;", schema_config.guild_expulsion_db) ){
|
||||
Sql_ShowDebug(sql_handle);
|
||||
return false;
|
||||
}
|
||||
|
@ -309,10 +309,8 @@ int chclif_parse_pincode_setnew( int fd, struct char_session_data* sd ){
|
||||
if( charserv_config.pincode_config.pincode_enabled==0 || RFIFOL(fd,2) != sd->account_id ) {
|
||||
set_eof(fd);
|
||||
return 1;
|
||||
} else if (strnlen(sd->pincode, PINCODE_LENGTH) > 0) {
|
||||
set_eof(fd);
|
||||
return 1;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
char newpin[PINCODE_LENGTH+1];
|
||||
memset(newpin,0,PINCODE_LENGTH+1);
|
||||
strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH );
|
||||
|
@ -308,8 +308,8 @@ int inter_guild_tosql( mmo_guild &g, int flag ){
|
||||
|
||||
Sql_EscapeStringLen(sql_handle, esc_name, e->name, strnlen(e->name, NAME_LENGTH));
|
||||
Sql_EscapeStringLen(sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes)));
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`,`char_id`) "
|
||||
"VALUES ('%u','%u','%s','%s','%u')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes, e->char_id) )
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`) "
|
||||
"VALUES ('%d','%d','%s','%s')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes) )
|
||||
Sql_ShowDebug(sql_handle);
|
||||
}
|
||||
}
|
||||
@ -487,7 +487,7 @@ std::shared_ptr<CharGuild> inter_guild_fromsql( int32 guild_id ){
|
||||
}
|
||||
|
||||
//printf("- Read guild_expulsion %d from sql \n",guild_id);
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name`,`mes`,`char_id` FROM `%s` WHERE `guild_id`='%d'", schema_config.guild_expulsion_db, guild_id) )
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name`,`mes` FROM `%s` WHERE `guild_id`='%d'", schema_config.guild_expulsion_db, guild_id) )
|
||||
{
|
||||
Sql_ShowDebug(sql_handle);
|
||||
return nullptr;
|
||||
@ -499,7 +499,6 @@ std::shared_ptr<CharGuild> inter_guild_fromsql( int32 guild_id ){
|
||||
Sql_GetData(sql_handle, 0, &data, nullptr); e->account_id = atoi(data);
|
||||
Sql_GetData(sql_handle, 1, &data, &len); memcpy(e->name, data, zmin(len, NAME_LENGTH));
|
||||
Sql_GetData(sql_handle, 2, &data, &len); memcpy(e->mes, data, zmin(len, sizeof(e->mes)));
|
||||
Sql_GetData(sql_handle, 3, &data, nullptr); e->char_id = strtoul(data, nullptr, 10);
|
||||
}
|
||||
|
||||
//printf("- Read guild_skill %d from sql \n",guild_id);
|
||||
@ -1344,7 +1343,6 @@ int mapif_parse_GuildLeave(int fd, int guild_id, uint32 account_id, uint32 char_
|
||||
}
|
||||
// Save the expulsion entry
|
||||
g->guild.expulsion[j].account_id = account_id;
|
||||
g->guild.expulsion[j].char_id = char_id;
|
||||
safestrncpy(g->guild.expulsion[j].name, g->guild.member[i].name, NAME_LENGTH);
|
||||
safestrncpy(g->guild.expulsion[j].mes, mes, 40);
|
||||
}
|
||||
|
@ -741,7 +741,6 @@ struct guild_expulsion {
|
||||
char name[NAME_LENGTH];
|
||||
char mes[40];
|
||||
uint32 account_id;
|
||||
uint32 char_id;
|
||||
};
|
||||
|
||||
struct guild_skill {
|
||||
|
@ -1150,51 +1150,6 @@ ACMD_FUNC(hide)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ACMD_FUNC(resetcooltime)
|
||||
{
|
||||
nullpo_retr(-1, sd);
|
||||
|
||||
for( size_t i = 0; i < ARRAYLENGTH( sd->scd ); i++ ){
|
||||
if( sd->scd[i] != nullptr ) {
|
||||
sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( sd->scd[i]->skill_id )->name ); // Found skill '%s', unblocking...
|
||||
clif_displaymessage( sd->fd, atcmd_output );
|
||||
|
||||
if (battle_config.display_status_timers)
|
||||
clif_skill_cooldown( *sd, sd->scd[i]->skill_id, 0 );
|
||||
|
||||
delete_timer(sd->scd[i]->timer, skill_blockpc_end);
|
||||
aFree(sd->scd[i]);
|
||||
sd->scd[i] = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
if( sd->hd != nullptr && hom_is_active( sd->hd ) ){
|
||||
for( const uint16& skill_id : sd->hd->blockskill ){
|
||||
sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( skill_id )->name ); // Found skill '%s', unblocking...
|
||||
clif_displaymessage( sd->fd, atcmd_output );
|
||||
|
||||
if (battle_config.display_status_timers)
|
||||
clif_skill_cooldown( *sd, skill_id, 0 );
|
||||
}
|
||||
|
||||
sd->hd->blockskill.clear();
|
||||
}
|
||||
|
||||
if( sd->md != nullptr ){
|
||||
for( const uint16& skill_id : sd->md->blockskill ){
|
||||
sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( skill_id )->name ); // Found skill '%s', unblocking...
|
||||
clif_displaymessage( sd->fd, atcmd_output );
|
||||
|
||||
if (battle_config.display_status_timers)
|
||||
clif_skill_cooldown( *sd, skill_id, 0 );
|
||||
}
|
||||
|
||||
sd->md->blockskill.clear();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* Changes a character's class
|
||||
*------------------------------------------*/
|
||||
@ -1286,7 +1241,7 @@ ACMD_FUNC(alive)
|
||||
clif_displaymessage(fd, msg_txt(sd,667)); // You're not dead.
|
||||
return -1;
|
||||
}
|
||||
clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4);
|
||||
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
|
||||
clif_displaymessage(fd, msg_txt(sd,16)); // You've been revived! It's a miracle!
|
||||
return 0;
|
||||
}
|
||||
@ -1359,7 +1314,7 @@ ACMD_FUNC(heal)
|
||||
|
||||
if ( hp < 0 && sp <= 0 ) {
|
||||
status_damage(nullptr, &sd->bl, -hp, -sp, 0, 0, 0);
|
||||
clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
||||
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
||||
clif_displaymessage(fd, msg_txt(sd,156)); // HP or/and SP modified.
|
||||
return 0;
|
||||
}
|
||||
@ -1370,7 +1325,7 @@ ACMD_FUNC(heal)
|
||||
status_heal(&sd->bl, hp, 0, 0);
|
||||
else {
|
||||
status_damage(nullptr, &sd->bl, -hp, 0, 0, 0, 0);
|
||||
clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
||||
clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3592,7 +3547,7 @@ static void atcommand_raise_sub(map_session_data* sd) {
|
||||
|
||||
status_revive(&sd->bl, 100, 100);
|
||||
|
||||
clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4);
|
||||
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
|
||||
clif_displaymessage(sd->fd, msg_txt(sd,63)); // Mercy has been shown.
|
||||
}
|
||||
|
||||
@ -3792,7 +3747,7 @@ ACMD_FUNC(lostskill)
|
||||
|
||||
sd->status.skill[sk_idx].lv = 0;
|
||||
sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT;
|
||||
clif_deleteskill(*sd,skill_id);
|
||||
clif_deleteskill(sd,skill_id);
|
||||
clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill.
|
||||
|
||||
return 0;
|
||||
@ -4375,9 +4330,6 @@ ACMD_FUNC(reload) {
|
||||
}else if( strstr( command, "barterdb" ) || strncmp( message, "barterdb", 4 ) == 0 ){
|
||||
barter_db.reload();
|
||||
clif_displaymessage(fd, msg_txt(sd, 830)); // Barter database has been reloaded.
|
||||
} else if (strstr(command, "logconf") || strncmp(message, "logconf", 3) == 0) {
|
||||
log_config_read(LOG_CONF_NAME);
|
||||
clif_displaymessage(fd, msg_txt(sd,1536)); // Log configuration has been reloaded.
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -6297,6 +6249,7 @@ ACMD_FUNC(useskill)
|
||||
*------------------------------------------*/
|
||||
ACMD_FUNC(displayskill)
|
||||
{
|
||||
struct status_data * status;
|
||||
t_tick tick;
|
||||
uint16 skill_id;
|
||||
uint16 skill_lv = 1;
|
||||
@ -6309,15 +6262,14 @@ ACMD_FUNC(displayskill)
|
||||
clif_displaymessage(fd, msg_txt(sd,825));// Effect Types: 0: All, 1: Damage, 2: Splash Dmg, 3: No Damage, 4: Ground
|
||||
return -1;
|
||||
}
|
||||
|
||||
status_data* status = status_get_status_data(sd->bl);
|
||||
status = status_get_status_data(&sd->bl);
|
||||
tick = gettick();
|
||||
if (type == 0 || type == 1)
|
||||
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||
if (type == 0 || type == 2)
|
||||
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH);
|
||||
if (type == 0 || type == 3)
|
||||
clif_skill_nodamage(&sd->bl, sd->bl, skill_id, skill_lv);
|
||||
clif_skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1);
|
||||
if (type == 0 || type == 4)
|
||||
clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
|
||||
return 0;
|
||||
@ -8229,6 +8181,7 @@ ACMD_FUNC(homtalk)
|
||||
ACMD_FUNC(hominfo)
|
||||
{
|
||||
struct homun_data *hd;
|
||||
struct status_data *status;
|
||||
nullpo_retr(-1, sd);
|
||||
|
||||
if ( !hom_is_active(sd->hd) ) {
|
||||
@ -8237,7 +8190,7 @@ ACMD_FUNC(hominfo)
|
||||
}
|
||||
|
||||
hd = sd->hd;
|
||||
status_data* status = status_get_status_data(hd->bl);
|
||||
status = status_get_status_data(&hd->bl);
|
||||
clif_displaymessage(fd, msg_txt(sd,1261)); // Homunculus stats:
|
||||
|
||||
snprintf(atcmd_output, sizeof(atcmd_output) ,msg_txt(sd,1262), // HP: %d/%d - SP: %d/%d
|
||||
@ -11064,7 +11017,6 @@ void atcommand_basecommands(void) {
|
||||
ACMD_DEF(guildstorage),
|
||||
ACMD_DEF(option),
|
||||
ACMD_DEF(hide), // + /hide
|
||||
ACMD_DEF(resetcooltime), // + /resetcooltime
|
||||
ACMD_DEFR(jobchange, ATCMD_NOCONSOLE),
|
||||
ACMD_DEF(kill),
|
||||
ACMD_DEF(alive),
|
||||
|
@ -161,7 +161,7 @@ static int battle_getenemy_sub(struct block_list *bl, va_list ap)
|
||||
if (*c >= 24)
|
||||
return 0;
|
||||
|
||||
if (status_isdead(*bl))
|
||||
if (status_isdead(bl))
|
||||
return 0;
|
||||
|
||||
if (battle_check_target(target, bl, BCT_ENEMY) > 0) {
|
||||
@ -219,7 +219,7 @@ static int battle_getenemyarea_sub(struct block_list *bl, va_list ap)
|
||||
if( *c >= 23 )
|
||||
return 0;
|
||||
|
||||
if( status_isdead(*bl) )
|
||||
if( status_isdead(bl) )
|
||||
return 0;
|
||||
|
||||
if( battle_check_target(src, bl, BCT_ENEMY) > 0 ) {// Is Enemy!...
|
||||
@ -286,7 +286,7 @@ int battle_damage(struct block_list *src, struct block_list *target, int64 damag
|
||||
dmg_change = status_damage(src, target, damage, 0, delay, 16, skill_id); // Coma attack
|
||||
else
|
||||
dmg_change = status_fix_damage(src, target, damage, delay, skill_id);
|
||||
if (attack_type && !status_isdead(*target) && additional_effects)
|
||||
if (attack_type && !status_isdead(target) && additional_effects)
|
||||
skill_additional_effect(src, target, skill_id, skill_lv, attack_type, dmg_lv, tick);
|
||||
if (dmg_lv > ATK_BLOCK && attack_type && additional_effects)
|
||||
skill_counter_additional_effect(src, target, skill_id, skill_lv, attack_type, tick);
|
||||
@ -296,7 +296,7 @@ int battle_damage(struct block_list *src, struct block_list *target, int64 damag
|
||||
|
||||
if (md != nullptr) {
|
||||
// Trigger monster skill condition for non-skill attacks.
|
||||
if (!status_isdead(*target) && src != target) {
|
||||
if (!status_isdead(target) && src != target) {
|
||||
if (damage > 0)
|
||||
mobskill_event(md, src, tick, attack_type, damage);
|
||||
if (skill_id > 0)
|
||||
@ -335,7 +335,7 @@ TIMER_FUNC(battle_delay_damage_sub){
|
||||
struct block_list* src = map_id2bl(dat->src_id);
|
||||
struct block_list* target = map_id2bl(dat->target_id);
|
||||
|
||||
if (target && !status_isdead(*target)) {
|
||||
if (target && !status_isdead(target)) {
|
||||
if( src && target->m == src->m &&
|
||||
(target->type != BL_PC || ((TBL_PC*)target)->invincible_timer == INVALID_TIMER) &&
|
||||
check_distance_bl(src, target, dat->distance) ) //Check to see if you haven't teleported. [Skotlex]
|
||||
@ -507,7 +507,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
|
||||
struct block_list *src2;
|
||||
|
||||
if( !su || !su->alive || (sg = su->group) == nullptr || !sg || sg->val3 == -1 ||
|
||||
(src2 = map_id2bl(sg->src_id)) == nullptr || status_isdead(*src2) )
|
||||
(src2 = map_id2bl(sg->src_id)) == nullptr || status_isdead(src2) )
|
||||
return 0;
|
||||
|
||||
if( sg->unit_id != UNT_FIREWALL ) {
|
||||
@ -696,6 +696,8 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
|
||||
std::vector<e_race2> s_race2, /// Attacker Race2
|
||||
t_race2; ///< Target Race2
|
||||
enum e_element s_defele; ///< Attacker Element (not a weapon or skill element!)
|
||||
struct status_data *sstatus, ///< Attacker status data
|
||||
*tstatus; ///< Target status data
|
||||
int64 original_damage;
|
||||
|
||||
if( !damage )
|
||||
@ -707,10 +709,8 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
|
||||
tsd = BL_CAST(BL_PC, target);
|
||||
t_class = status_get_class(target);
|
||||
s_class = status_get_class(src);
|
||||
///< Attacker status data
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
///< Target status data
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
sstatus = status_get_status_data(src);
|
||||
tstatus = status_get_status_data(target);
|
||||
s_race2 = status_get_race2(src);
|
||||
t_race2 = status_get_race2(target);
|
||||
s_defele = (tsd) ? (enum e_element)status_get_element(src) : ELE_NONE;
|
||||
@ -1167,7 +1167,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
||||
|
||||
int element;
|
||||
if (flag & BF_WEAPON) {
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
if(sstatus->rhw.ele == ELE_NEUTRAL && sstatus->lhw.ele > sstatus->rhw.ele)
|
||||
element = battle_get_weapon_element(d, src, target, skill_id, skill_lv, EQI_HAND_L, false);
|
||||
else
|
||||
@ -1290,7 +1290,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
||||
|
||||
// Weapon Blocking can be triggered while the above statuses are active.
|
||||
if ((sce = sc->getSCE(SC_WEAPONBLOCKING)) && flag & (BF_SHORT | BF_WEAPON) && rnd() % 100 < sce->val2) {
|
||||
clif_skill_nodamage(target, *src, GC_WEAPONBLOCKING, sce->val1);
|
||||
clif_skill_nodamage(target, src, GC_WEAPONBLOCKING, sce->val1, 1);
|
||||
sc_start(src, target, SC_WEAPONBLOCK_ON, 100, src->id, skill_get_time2(GC_WEAPONBLOCKING, sce->val1));
|
||||
d->dmg_lv = ATK_BLOCK;
|
||||
return false;
|
||||
@ -1358,7 +1358,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
||||
skill_id == WL_SOULEXPANSION ||
|
||||
skill_id == AG_SOUL_VC_STRIKE ||
|
||||
(skill_id && skill_get_ele(skill_id, skill_lv) == ELE_GHOST) ||
|
||||
(skill_id == 0 && (status_get_status_data(*src))->rhw.ele == ELE_GHOST))
|
||||
(skill_id == 0 && (status_get_status_data(src))->rhw.ele == ELE_GHOST))
|
||||
{
|
||||
if (skill_id == WL_SOULEXPANSION)
|
||||
damage *= 2; // If used against a player in White Imprison, the skill deals double damage.
|
||||
@ -1407,12 +1407,12 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
||||
(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == target->id)) &&
|
||||
check_distance_bl(target, d_bl, sce_d->val3))
|
||||
{ //If player is target of devotion, show guard effect on the devotion caster rather than the target
|
||||
clif_skill_nodamage(d_bl, *d_bl, CR_AUTOGUARD, sce->val1);
|
||||
clif_skill_nodamage(d_bl, d_bl, CR_AUTOGUARD, sce->val1, 1);
|
||||
unit_set_walkdelay(d_bl, gettick(), delay, 1);
|
||||
d->dmg_lv = ATK_MISS;
|
||||
return false;
|
||||
} else {
|
||||
clif_skill_nodamage(target, *target, CR_AUTOGUARD, sce->val1);
|
||||
clif_skill_nodamage(target, target, CR_AUTOGUARD, sce->val1, 1);
|
||||
unit_set_walkdelay(target, gettick(), delay, 1);
|
||||
#ifdef RENEWAL
|
||||
if (sc->getSCE(SC_SHRINK))
|
||||
@ -1455,7 +1455,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
||||
return false;
|
||||
|
||||
if ((sce = sc->getSCE(SC_PARRYING)) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd() % 100 < sce->val2) {
|
||||
clif_skill_nodamage(target, *target, LK_PARRYING, sce->val1);
|
||||
clif_skill_nodamage(target, target, LK_PARRYING, sce->val1, 1);
|
||||
|
||||
if (skill_id == LK_PARRYING) {
|
||||
unit_data *ud = unit_bl2ud(target);
|
||||
@ -1471,7 +1471,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
||||
|
||||
if (sd && pc_issit(sd))
|
||||
pc_setstand(sd, true); //Stand it to dodge.
|
||||
clif_skill_nodamage(target, *target, TK_DODGE, 1);
|
||||
clif_skill_nodamage(target, target, TK_DODGE, 1, 1);
|
||||
sc_start4(src, target, SC_COMBO, 100, TK_JUMPKICK, src->id, 1, 0, 2000);
|
||||
return false;
|
||||
}
|
||||
@ -1494,7 +1494,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
|
||||
|
||||
if (((sce = sc->getSCE(SC_UTSUSEMI)) || sc->getSCE(SC_BUNSINJYUTSU)) && flag&BF_WEAPON && !skill_get_inf2(skill_id, INF2_IGNORECICADA)) {
|
||||
skill_additional_effect(src, target, skill_id, skill_lv, flag, ATK_BLOCK, gettick());
|
||||
if (!status_isdead(*src))
|
||||
if (!status_isdead(src))
|
||||
skill_counter_additional_effect(src, target, skill_id, skill_lv, flag, gettick());
|
||||
if (sce) {
|
||||
clif_specialeffect(target, EF_STORMKICK4, AREA);
|
||||
@ -1792,7 +1792,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
#endif
|
||||
) )
|
||||
{
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
struct status_data *status = status_get_status_data(bl);
|
||||
int per = 100*status->sp / status->max_sp -1; //100% should be counted as the 80~99% interval
|
||||
per /=20; //Uses 20% SP intervals.
|
||||
//SP Cost: 1% + 0.5% per every 20% SP
|
||||
@ -1900,8 +1900,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
}
|
||||
}
|
||||
|
||||
if ((sce = sc->getSCE(SC_BLOODLUST)) && flag & BF_WEAPON && damage > 0 && rnd_chance(sce->val3, 100))
|
||||
status_heal(src, damage * sce->val4 / 100, 0, 1);
|
||||
if ((sce = sc->getSCE(SC_BLOODLUST)) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3)
|
||||
status_heal(src, damage * sce->val4 / 100, 0, 3);
|
||||
|
||||
if ((sce = sc->getSCE(SC_BLOODSUCKER)) && flag & BF_WEAPON && damage > 0 && rnd() % 100 < (2 * sce->val1 - 1))
|
||||
status_heal(src, damage * sce->val1 / 100, 0, 3);
|
||||
@ -2234,7 +2234,7 @@ static int battle_calc_drain(int64 damage, int rate, int per)
|
||||
int64 battle_addmastery(map_session_data *sd,struct block_list *target,int64 dmg,int type)
|
||||
{
|
||||
int64 damage;
|
||||
status_data* status = status_get_status_data(*target);
|
||||
struct status_data *status = status_get_status_data(target);
|
||||
int weapon, skill;
|
||||
|
||||
#ifdef RENEWAL
|
||||
@ -2399,7 +2399,7 @@ static int battle_calc_sizefix(int64 damage, map_session_data *sd, unsigned char
|
||||
*/
|
||||
static int battle_calc_base_weapon_attack(struct block_list *src, struct status_data *tstatus, struct weapon_atk *wa, map_session_data *sd, bool critical)
|
||||
{
|
||||
status_data* status = status_get_status_data(*src);
|
||||
struct status_data *status = status_get_status_data(src);
|
||||
uint8 type = (wa == &status->lhw)?EQI_HAND_L:EQI_HAND_R;
|
||||
uint16 atkmin = (type == EQI_HAND_L)?status->watk2:status->watk;
|
||||
uint16 atkmax = atkmin;
|
||||
@ -2835,7 +2835,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
||||
*/
|
||||
bool is_infinite_defense(struct block_list *target, int flag)
|
||||
{
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
|
||||
if(target->type == BL_SKILL) {
|
||||
TBL_SKILL *su = ((TBL_SKILL*)target);
|
||||
@ -2871,7 +2871,7 @@ bool is_infinite_defense(struct block_list *target, int flag)
|
||||
static bool is_skill_using_arrow(struct block_list *src, int skill_id)
|
||||
{
|
||||
if(src != nullptr) {
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
|
||||
return ((sd && sd->state.arrow_atk) || (!sd && ((skill_id && skill_get_ammotype(skill_id)) || sstatus->rhw.range>3))
|
||||
@ -2922,7 +2922,7 @@ static bool is_attack_left_handed(struct block_list *src, int skill_id)
|
||||
return true;
|
||||
}
|
||||
|
||||
struct status_data *sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
|
||||
if (sstatus->lhw.atk)
|
||||
return true;
|
||||
@ -2950,7 +2950,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
|
||||
if( skill_id && !skill_get_nk(skill_id,NK_CRITICAL) )
|
||||
return false;
|
||||
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
|
||||
if( sstatus->cri )
|
||||
{
|
||||
@ -2964,7 +2964,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
|
||||
return false;
|
||||
}
|
||||
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_change *tsc = status_get_sc(target);
|
||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||
@ -3060,7 +3060,7 @@ static int is_attack_piercing(struct Damage* wd, struct block_list *src, struct
|
||||
|
||||
if(src != nullptr) {
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
|
||||
if( skill_id != PA_SACRIFICE && skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS && skill_id != PA_SHIELDCHAIN && skill_id != KO_HAPPOKUNAI
|
||||
#ifndef RENEWAL
|
||||
@ -3118,8 +3118,8 @@ static std::bitset<NK_MAX> battle_skill_get_damage_properties(uint16 skill_id, i
|
||||
*/
|
||||
static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct block_list *target, int skill_id, int skill_lv, bool first_call)
|
||||
{
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_change *tsc = status_get_sc(target);
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
@ -3312,7 +3312,7 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct
|
||||
*/
|
||||
static bool attack_ignores_def(struct Damage* wd, struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, short weapon_position)
|
||||
{
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
status_change *sc = status_get_sc(src);
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag);
|
||||
@ -3417,7 +3417,7 @@ static int battle_calc_equip_attack(struct block_list *src, int skill_id)
|
||||
{
|
||||
if(src != nullptr) {
|
||||
int eatk = 0;
|
||||
status_data* status = status_get_status_data(*src);
|
||||
struct status_data *status = status_get_status_data(src);
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
|
||||
// Add arrow atk if using an applicable skill
|
||||
@ -3446,7 +3446,7 @@ int battle_get_weapon_element(struct Damage* wd, struct block_list *src, struct
|
||||
{
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
int element = skill_get_ele(skill_id, skill_lv);
|
||||
|
||||
//Take weapon's element
|
||||
@ -3549,7 +3549,7 @@ int battle_get_magic_element(struct block_list* src, struct block_list* target,
|
||||
int element = skill_get_ele(skill_id, skill_lv);
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
|
||||
if (element == ELE_WEAPON) { // pl=-1 : the skill takes the weapon's element
|
||||
element = sstatus->rhw.ele;
|
||||
@ -3693,12 +3693,6 @@ static int battle_get_spiritball_damage(struct Damage& wd, struct block_list& sr
|
||||
// These skills used as many spheres as they do hits
|
||||
damage = (wd.div_ + sd->spiritball) * 3;
|
||||
break;
|
||||
#ifdef RENEWAL
|
||||
case MO_FINGEROFFENSIVE:
|
||||
// These skills store the spheres used in spiritball_old
|
||||
damage = (sd->spiritball_old + sd->spiritball) * 3;
|
||||
break;
|
||||
#endif
|
||||
case MO_EXTREMITYFIST:
|
||||
// These skills store the number of spheres the player had before cast
|
||||
damage = sd->spiritball_old * 3;
|
||||
@ -3725,8 +3719,8 @@ static void battle_calc_element_damage(struct Damage* wd, struct block_list *src
|
||||
std::bitset<NK_MAX> nk = battle_skill_get_damage_properties(skill_id, wd->miscflag);
|
||||
map_session_data* sd = BL_CAST(BL_PC, src);
|
||||
status_change* sc = status_get_sc(src);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data* sstatus = status_get_status_data(src);
|
||||
struct status_data* tstatus = status_get_status_data(target);
|
||||
int right_element = battle_get_weapon_element(wd, src, target, skill_id, skill_lv, EQI_HAND_R, true);
|
||||
|
||||
// Elemental attribute fix
|
||||
@ -3859,7 +3853,7 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
|
||||
{
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
int t_class = status_get_class(target);
|
||||
|
||||
#ifndef RENEWAL
|
||||
@ -3919,7 +3913,7 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
|
||||
case NC_ARMSCANNON:
|
||||
// Arrow attack of these skills is not influenced by P.ATK so we add it as mastery attack
|
||||
if (sd != nullptr) {
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data* tstatus = status_get_status_data(target);
|
||||
ATK_ADD(wd->masteryAtk, wd->masteryAtk2, battle_attr_fix(src, target, sd->bonus.arrow_atk, sd->bonus.arrow_ele, tstatus->def_ele, tstatus->ele_lv));
|
||||
}
|
||||
break;
|
||||
@ -3965,8 +3959,8 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s
|
||||
*/
|
||||
static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv)
|
||||
{
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
bool critical = false;
|
||||
|
||||
@ -4040,8 +4034,8 @@ static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,s
|
||||
static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv)
|
||||
{
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||
|
||||
@ -4335,7 +4329,7 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_change *tsc = status_get_sc(target);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
|
||||
if( sd && !skill_id ) { // if no skill_id passed, check for double attack [helvetica]
|
||||
short i;
|
||||
@ -4532,8 +4526,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_change *tsc = status_get_sc(target);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
int skillratio = 100;
|
||||
int i;
|
||||
|
||||
@ -6295,8 +6289,8 @@ static int64 battle_calc_skill_constant_addition(struct Damage* wd, struct block
|
||||
{
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
int64 atk = 0;
|
||||
|
||||
//Constant/misc additions from skills
|
||||
@ -6347,8 +6341,8 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st
|
||||
{
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
uint8 anger_id = 0; // SLS Anger
|
||||
|
||||
// Kagerou/Oboro Earth Charm effect +15% wATK
|
||||
@ -6536,8 +6530,8 @@ static void battle_calc_defense_reduction(struct Damage* wd, struct block_list *
|
||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_change *tsc = status_get_sc(target);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
|
||||
//Defense reduction
|
||||
short vit_def;
|
||||
@ -6707,7 +6701,7 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list
|
||||
{
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
|
||||
// Post skill/vit reduction damage increases
|
||||
#ifndef RENEWAL
|
||||
@ -6762,7 +6756,7 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list
|
||||
*/
|
||||
static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,struct block_list *target, uint16 skill_id, uint16 skill_lv)
|
||||
{
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
bool attack_hits = is_attack_hitting(wd, src, target, skill_id, skill_lv, false);
|
||||
|
||||
if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM)
|
||||
@ -6809,9 +6803,9 @@ static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,s
|
||||
return;
|
||||
}
|
||||
|
||||
// Triple Attack and Finger Offensive have a special property, they do not split damage on plant mode
|
||||
// Triple Attack has a special property that it does not split damage on plant mode
|
||||
// In pre-renewal, it requires the monster to have exactly 100 def
|
||||
if ((skill_id == MO_TRIPLEATTACK || skill_id == MO_FINGEROFFENSIVE) && wd->div_ < 0
|
||||
if (skill_id == MO_TRIPLEATTACK && wd->div_ < 0
|
||||
#ifndef RENEWAL
|
||||
&& tstatus->def == 100
|
||||
#endif
|
||||
@ -6919,14 +6913,14 @@ static void battle_calc_attack_gvg_bg(struct Damage* wd, struct block_list *src,
|
||||
(src->type == BL_SKILL && (skill_id == SG_SUN_WARM || skill_id == SG_MOON_WARM || skill_id == SG_STAR_WARM))) ) {
|
||||
int64 damage = wd->damage + wd->damage2, rdamage = 0;
|
||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
t_tick tick = gettick(), rdelay = 0;
|
||||
|
||||
rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id, false);
|
||||
if( rdamage > 0 ) { //Item reflect gets calculated before any mapflag reducing is applicated
|
||||
struct block_list *d_bl = battle_check_devotion(src);
|
||||
|
||||
rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
|
||||
rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
|
||||
if( tsd )
|
||||
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
|
||||
//Use Reflect Shield to signal this kind of skill trigger [Skotlex]
|
||||
@ -6981,8 +6975,8 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
|
||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_change *tsc = status_get_sc(target);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
int skill_damage = 0;
|
||||
|
||||
//Reject Sword bugreport:4493 by Daegaladh
|
||||
@ -6996,9 +6990,9 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
|
||||
)
|
||||
{
|
||||
ATK_RATER(wd->damage, 50)
|
||||
clif_skill_nodamage(target, *target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1);
|
||||
battle_fix_damage(target,src,wd->damage,clif_damage(*target,*src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD);
|
||||
if (status_isdead(*target))
|
||||
clif_skill_nodamage(target,target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1,1);
|
||||
battle_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD);
|
||||
if (status_isdead(target))
|
||||
return;
|
||||
if( --(tsc->getSCE(SC_REJECTSWORD)->val3) <= 0 )
|
||||
status_change_end(target, SC_REJECTSWORD);
|
||||
@ -7014,7 +7008,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
|
||||
skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE);
|
||||
clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage,
|
||||
1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE); // This is how official does
|
||||
clif_damage(*src, *target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
|
||||
clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
|
||||
battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW);
|
||||
status_damage(src, target, rdamage/10, 0, 0, 1, 0);
|
||||
status_change_end(target, SC_CRESCENTELBOW);
|
||||
@ -7076,8 +7070,8 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
|
||||
*/
|
||||
static struct Damage initialize_weapon_data(struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int wflag)
|
||||
{
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
status_change *sc = status_get_sc(src);
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
struct Damage wd;
|
||||
@ -7270,7 +7264,7 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
|
||||
int64 damage = wd->damage + wd->damage2, rdamage = 0;
|
||||
map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||
status_change *tsc = status_get_sc(target);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct unit_data *ud = unit_bl2ud(target);
|
||||
t_tick tick = gettick(), rdelay = 0;
|
||||
|
||||
@ -7296,7 +7290,7 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr
|
||||
if( attack_type == BF_WEAPON && tsc->getSCE(SC_REFLECTDAMAGE) ) // Don't reflect your own damage (Grand Cross)
|
||||
map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag);
|
||||
else if( attack_type == BF_WEAPON || attack_type == BF_MISC) {
|
||||
rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
|
||||
rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false);
|
||||
if( tsd )
|
||||
battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_);
|
||||
// It appears that official servers give skill reflect damage a longer delay
|
||||
@ -7321,8 +7315,8 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
struct Damage wd;
|
||||
status_change *sc = status_get_sc(src);
|
||||
status_change *tsc = status_get_sc(target);
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
int right_element, left_element;
|
||||
bool infdef = false;
|
||||
|
||||
@ -7396,7 +7390,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
|
||||
#ifdef RENEWAL
|
||||
if(skill_id == HW_MAGICCRASHER) { // Add weapon attack for MATK onto Magic Crasher
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
|
||||
if (sstatus->matk_max > sstatus->matk_min) {
|
||||
ATK_ADD(wd.weaponAtk, wd.weaponAtk2, sstatus->matk_min+rnd()%(sstatus->matk_max-sstatus->matk_min));
|
||||
@ -7602,7 +7596,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
|
||||
ATK_ADD(wd.damage, wd.damage2, skill_lv * 240 + status_get_lv(target) * 40);
|
||||
break;
|
||||
case SR_GATEOFHELL: {
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data *sstatus = status_get_status_data(src);
|
||||
double bonus = 1 + skill_lv * 2 / 10;
|
||||
|
||||
ATK_ADD(wd.damage, wd.damage2, sstatus->max_hp - sstatus->hp);
|
||||
@ -7727,6 +7721,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
TBL_PC *tsd;
|
||||
status_change *sc, *tsc;
|
||||
struct Damage ad;
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
struct {
|
||||
unsigned imdef : 1;
|
||||
unsigned infdef : 1;
|
||||
@ -7739,10 +7735,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
nullpo_info(NLP_MARK);
|
||||
return ad;
|
||||
}
|
||||
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
|
||||
// Initial Values
|
||||
// Set to 1 because magic damage on plants is 1 per hit; if target is not a plant this gets reinitialized to 0 later
|
||||
ad.damage = 1;
|
||||
@ -8462,6 +8454,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
break;
|
||||
case AG_ASTRAL_STRIKE_ATK:
|
||||
skillratio += -100 + 650 * skill_lv + 10 * sstatus->spl;
|
||||
// Not confirmed, but if the main hit deal additional damage
|
||||
// on certain races then the repeated damage should too right?
|
||||
// Guessing a formula here for now. [Rytech]
|
||||
if (tstatus->race == RC_UNDEAD || tstatus->race == RC_DRAGON)
|
||||
skillratio += 200 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case AG_ROCK_DOWN:
|
||||
@ -8964,6 +8961,8 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
||||
|
||||
map_session_data *sd, *tsd;
|
||||
struct Damage md; //DO NOT CONFUSE with md of mob_data!
|
||||
struct status_data *sstatus = status_get_status_data(src);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
status_change *ssc = status_get_sc(src);
|
||||
|
||||
memset(&md,0,sizeof(md));
|
||||
@ -8973,9 +8972,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
||||
return md;
|
||||
}
|
||||
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
|
||||
//Some initial values
|
||||
md.amotion = (skill_get_inf(skill_id)&INF_GROUND_SKILL ? 0 : sstatus->amotion);
|
||||
md.dmotion = tstatus->dmotion;
|
||||
@ -9440,7 +9436,7 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl
|
||||
status_change_entry *tsce = tsc->getSCE(SC_WEAPONBLOCKING);
|
||||
|
||||
if (attack_type == BF_WEAPON && rnd() % 100 < tsce->val2) {
|
||||
clif_skill_nodamage(target, *bl, GC_WEAPONBLOCKING, tsce->val1);
|
||||
clif_skill_nodamage(target, bl, GC_WEAPONBLOCKING, tsce->val1, 1);
|
||||
sc_start(bl, target, SC_WEAPONBLOCK_ON, 100, bl->id, skill_get_time2(GC_WEAPONBLOCKING, tsce->val1));
|
||||
}
|
||||
}
|
||||
@ -9580,7 +9576,7 @@ int64 battle_calc_return_damage(struct block_list* tbl, struct block_list *src,
|
||||
*/
|
||||
bool battle_check_coma(map_session_data& sd, struct block_list& target, e_battle_flag attack_type)
|
||||
{
|
||||
status_data* tstatus = status_get_status_data(target);
|
||||
struct status_data* tstatus = status_get_status_data(&target);
|
||||
mob_data* dstmd = BL_CAST(BL_MOB, &target);
|
||||
|
||||
// Coma
|
||||
@ -9615,7 +9611,7 @@ bool battle_vellum_damage(map_session_data *sd, struct block_list *target, struc
|
||||
nullpo_retr(false, target);
|
||||
nullpo_retr(false, wd);
|
||||
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
struct status_data *tstatus = status_get_status_data(target);
|
||||
// bHPVanishRaceRate
|
||||
int16 vellum_rate_hp = cap_value(sd->hp_vanish_race[tstatus->race].rate + sd->hp_vanish_race[RC_ALL].rate, 0, INT16_MAX);
|
||||
int8 vellum_hp = cap_value(sd->hp_vanish_race[tstatus->race].per + sd->hp_vanish_race[RC_ALL].per, INT8_MIN, INT8_MAX);
|
||||
@ -9737,7 +9733,7 @@ int battle_damage_area(struct block_list *bl, va_list ap) {
|
||||
battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true,false);
|
||||
else
|
||||
battle_fix_damage(src,bl,damage,0,LG_REFLECTDAMAGE);
|
||||
clif_damage(*bl,*bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false);
|
||||
clif_damage(bl,bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false);
|
||||
skill_additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
|
||||
map_freeblock_unlock();
|
||||
}
|
||||
@ -9794,6 +9790,7 @@ void battle_autocast_elembuff_skill(map_session_data* sd, struct block_list* tar
|
||||
*------------------------------------------*/
|
||||
enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* target, t_tick tick, int flag) {
|
||||
map_session_data *sd = nullptr, *tsd = nullptr;
|
||||
struct status_data *sstatus, *tstatus;
|
||||
status_change *sc, *tsc;
|
||||
int64 damage;
|
||||
int skillv;
|
||||
@ -9809,8 +9806,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
sd = BL_CAST(BL_PC, src);
|
||||
tsd = BL_CAST(BL_PC, target);
|
||||
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
sstatus = status_get_status_data(src);
|
||||
tstatus = status_get_status_data(target);
|
||||
|
||||
sc = status_get_sc(src);
|
||||
tsc = status_get_sc(target);
|
||||
@ -9883,7 +9880,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
uint16 skill_lv = tsc->getSCE(SC_AUTOCOUNTER)->val1;
|
||||
|
||||
clif_skillcastcancel( *target ); //Remove the casting bar. [Skotlex]
|
||||
clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
||||
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
||||
status_change_end(target, SC_AUTOCOUNTER);
|
||||
skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
|
||||
return ATK_BLOCK;
|
||||
@ -9906,7 +9903,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
status_change_end(target, SC_BLADESTOP_WAIT);
|
||||
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
|
||||
{ //Target locked.
|
||||
clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
||||
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
|
||||
clif_bladestop(target, src->id, 1);
|
||||
sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
|
||||
return ATK_BLOCK;
|
||||
@ -9979,7 +9976,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
}
|
||||
|
||||
if (tsc && tsc->getSCE(SC_MTF_MLEATKED) && rnd()%100 < tsc->getSCE(SC_MTF_MLEATKED)->val2)
|
||||
clif_skill_nodamage(target, *target, SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1, sc_start(src, target, SC_ENDURE, 100, tsc->getSCE(SC_MTF_MLEATKED)->val1, skill_get_time(SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1)));
|
||||
clif_skill_nodamage(target, target, SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1, sc_start(src, target, SC_ENDURE, 100, tsc->getSCE(SC_MTF_MLEATKED)->val1, skill_get_time(SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1)));
|
||||
|
||||
if(tsc && tsc->getSCE(SC_KAAHI) && tstatus->hp < tstatus->max_hp && status_charge(target, 0, tsc->getSCE(SC_KAAHI)->val3)) {
|
||||
int hp_heal = tstatus->max_hp - tstatus->hp;
|
||||
@ -10048,7 +10045,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
}
|
||||
}
|
||||
|
||||
wd.dmotion = clif_damage(*src, *target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , wd.type, wd.damage2, wd.isspdamage);
|
||||
wd.dmotion = clif_damage(src, target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , wd.type, wd.damage2, wd.isspdamage);
|
||||
|
||||
if (sd && sd->bonus.splash_range > 0 && damage > 0)
|
||||
skill_castend_damage_id(src, target, 0, 1, tick, 0);
|
||||
@ -10068,7 +10065,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
map_freeblock_lock();
|
||||
|
||||
if( !(tsc && tsc->getSCE(SC_DEVOTION)) && !vellum_damage && skill_check_shadowform(target, damage, wd.div_) ) {
|
||||
if( !status_isdead(*target) )
|
||||
if( !status_isdead(target) )
|
||||
skill_additional_effect(src, target, 0, 0, wd.flag, wd.dmg_lv, tick);
|
||||
if( wd.dmg_lv > ATK_BLOCK )
|
||||
skill_counter_additional_effect(src, target, 0, 0, wd.flag, tick);
|
||||
@ -10101,7 +10098,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
if (d_sc && d_sc->getSCE(SC_REBOUND_S))
|
||||
devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100;
|
||||
|
||||
clif_damage(*d_bl, *d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false);
|
||||
clif_damage(d_bl, d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false);
|
||||
battle_fix_damage(src, d_bl, devotion_damage, 0, CR_DEVOTION);
|
||||
}
|
||||
}
|
||||
@ -10119,8 +10116,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
if (tsc->getSCE(SC_WATER_SCREEN_OPTION)) {
|
||||
struct block_list *e_bl = map_id2bl(tsc->getSCE(SC_WATER_SCREEN_OPTION)->val1);
|
||||
|
||||
if (e_bl && !status_isdead(*e_bl)) {
|
||||
clif_damage(*e_bl, *e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
|
||||
if (e_bl && !status_isdead(e_bl)) {
|
||||
clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false);
|
||||
battle_fix_damage(src, e_bl, damage, 0, EL_WATER_SCREEN);
|
||||
}
|
||||
}
|
||||
|
@ -627,11 +627,11 @@ void buyingstore_reopen( map_session_data* sd ){
|
||||
{
|
||||
// Make buyer look perfect
|
||||
pc_setdir(sd, at->dir, at->head_dir);
|
||||
clif_changed_dir(sd->bl, AREA_WOS);
|
||||
clif_changed_dir(&sd->bl, AREA_WOS);
|
||||
if( at->sit ) {
|
||||
pc_setsit(sd);
|
||||
skill_sit(sd, 1);
|
||||
clif_sitting(sd->bl);
|
||||
clif_sitting(&sd->bl);
|
||||
}
|
||||
|
||||
// Immediate save
|
||||
|
@ -108,7 +108,7 @@ int chat_createpcchat(map_session_data* sd, const char* title, const char* pass,
|
||||
clif_createchat( *sd, CREATEROOM_SUCCESS );
|
||||
clif_dispchat(cd,0);
|
||||
|
||||
if (status_isdead(sd->bl))
|
||||
if (status_isdead(&sd->bl))
|
||||
achievement_update_objective(sd, AG_CHATTING_DYING, 1, 1);
|
||||
else
|
||||
achievement_update_objective(sd, AG_CHATTING_CREATE, 1, 1);
|
||||
@ -168,8 +168,7 @@ int chat_joinchat(map_session_data* sd, int chatid, const char* pass)
|
||||
|
||||
pc_setchatid(sd,cd->bl.id);
|
||||
|
||||
// To the person who newly joined the chat
|
||||
clif_joinchatok(*sd, *cd);
|
||||
clif_joinchatok(sd, cd); //To the person who newly joined the list of all
|
||||
clif_addchat(cd, sd); //Reports To the person who already in the chat
|
||||
clif_dispchat(cd, 0); //Reported number of changes to the people around
|
||||
|
||||
@ -218,7 +217,7 @@ int chat_leavechat(map_session_data* sd, bool kicked)
|
||||
cd->usersd[i] = cd->usersd[i+1];
|
||||
|
||||
if( cd->users == 0 && cd->owner->type == BL_PC ) { // Delete empty chatroom
|
||||
clif_clearchat(*cd);
|
||||
clif_clearchat(cd, 0);
|
||||
db_destroy(cd->kick_list);
|
||||
map_deliddb(&cd->bl);
|
||||
map_delblock(&cd->bl);
|
||||
@ -235,7 +234,7 @@ int chat_leavechat(map_session_data* sd, bool kicked)
|
||||
if( leavechar == 0 && cd->owner->type == BL_PC ) { // Set and announce new owner
|
||||
cd->owner = (struct block_list*) cd->usersd[0];
|
||||
clif_changechatowner(cd, cd->usersd[0]);
|
||||
clif_clearchat(*cd);
|
||||
clif_clearchat(cd, 0);
|
||||
|
||||
//Adjust Chat location after owner has been changed.
|
||||
map_delblock( &cd->bl );
|
||||
@ -276,7 +275,7 @@ int chat_changechatowner(map_session_data* sd, const char* nextownername)
|
||||
return -1; // name not found
|
||||
|
||||
// erase temporarily
|
||||
clif_clearchat(*cd);
|
||||
clif_clearchat(cd,0);
|
||||
|
||||
// set new owner
|
||||
cd->owner = (struct block_list*) cd->usersd[i];
|
||||
@ -326,7 +325,7 @@ int chat_changechatstatus(map_session_data* sd, const char* title, const char* p
|
||||
cd->limit = min(limit, ARRAYLENGTH(cd->usersd));
|
||||
cd->pub = pub;
|
||||
|
||||
clif_changechatstatus(*cd);
|
||||
clif_changechatstatus(cd);
|
||||
clif_dispchat(cd,0);
|
||||
|
||||
return 0;
|
||||
@ -437,7 +436,7 @@ int chat_deletenpcchat(struct npc_data* nd)
|
||||
return 0;
|
||||
|
||||
chat_npckickall(cd);
|
||||
clif_clearchat(*cd);
|
||||
clif_clearchat(cd, 0);
|
||||
map_deliddb(&cd->bl);
|
||||
map_delblock(&cd->bl);
|
||||
map_freeblock(&cd->bl);
|
||||
|
@ -1065,7 +1065,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
|
||||
sd->status.skill[idx].id = 0;
|
||||
sd->status.skill[idx].lv = 0;
|
||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||
clif_deleteskill(*sd,WE_CALLBABY);
|
||||
clif_deleteskill(sd,WE_CALLBABY);
|
||||
}
|
||||
|
||||
if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) {
|
||||
@ -1073,7 +1073,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
|
||||
sd->status.skill[idx].id = 0;
|
||||
sd->status.skill[idx].lv = 0;
|
||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||
clif_deleteskill(*sd,WE_CALLBABY);
|
||||
clif_deleteskill(sd,WE_CALLBABY);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
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 "script.hpp"
|
||||
#include "trade.hpp"
|
||||
|
||||
struct Channel;
|
||||
struct clan;
|
||||
@ -839,7 +838,7 @@ void clif_move( struct unit_data& ud ); //area
|
||||
void clif_changemap( map_session_data& sd, short m, uint16 x, uint16 y );
|
||||
void clif_changemapserver( map_session_data& sd, const char* map, uint16 x, uint16 y, uint32 ip, uint16 port );
|
||||
void clif_blown(struct block_list *bl); // area
|
||||
void clif_slide(block_list& bl, int x, int y); // area
|
||||
void clif_slide(struct block_list *bl, int x, int y); // area
|
||||
void clif_fixpos( block_list& bl );
|
||||
void clif_npcbuysell( map_session_data& sd, npc_data& nd );
|
||||
void clif_buylist( map_session_data& sd, npc_data& nd );
|
||||
@ -862,10 +861,10 @@ void clif_delitem( map_session_data& sd, int index, int amount, short reason );
|
||||
void clif_update_hp(map_session_data &sd);
|
||||
void clif_updatestatus( map_session_data& sd, _sp type );
|
||||
void clif_changemanner( map_session_data& sd );
|
||||
int clif_damage(block_list& src, block_list& dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage); // area
|
||||
void clif_takeitem(block_list& src, block_list& dst);
|
||||
void clif_sitting(block_list& bl);
|
||||
void clif_standing(block_list& bl);
|
||||
int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage); // area
|
||||
void clif_takeitem(struct block_list* src, struct block_list* dst);
|
||||
void clif_sitting(struct block_list* bl);
|
||||
void clif_standing(struct block_list* bl);
|
||||
void clif_sprite_change(struct block_list *bl, int id, int type, int val, int val2, enum send_target target);
|
||||
void clif_changelook(struct block_list *bl,int type,int val); // area
|
||||
void clif_changetraplook(struct block_list *bl,int val); // area
|
||||
@ -875,7 +874,7 @@ void clif_arrow_fail( map_session_data& sd, e_action_failure type );
|
||||
void clif_arrow_create_list( map_session_data& sd );
|
||||
void clif_statusupack( map_session_data& sd, int32 type, bool success, int32 val = 0 );
|
||||
void clif_equipitemack( map_session_data& sd, uint8 flag, int index, int pos = 0 ); // self
|
||||
void clif_unequipitemack( map_session_data& sd, uint16 server_index, int32 pos, bool success );
|
||||
void clif_unequipitemack(map_session_data *sd,int n,int pos,int ok); // self
|
||||
void clif_misceffect( block_list& bl, e_notify_effect type );
|
||||
void clif_changeoption_target(struct block_list* bl, struct block_list* target);
|
||||
#define clif_changeoption(bl) clif_changeoption_target(bl, nullptr) // area
|
||||
@ -885,12 +884,12 @@ void clif_GlobalMessage( block_list& bl, const char* message, enum send_target t
|
||||
void clif_createchat( map_session_data& sd, e_create_chatroom flag );
|
||||
void clif_dispchat(struct chat_data* cd, int fd); // area or fd
|
||||
void clif_joinchatfail( map_session_data& sd, e_refuse_enter_room result );
|
||||
void clif_joinchatok(map_session_data& sd,chat_data& cd);
|
||||
void clif_joinchatok(map_session_data *sd,struct chat_data* cd); // self
|
||||
void clif_addchat(struct chat_data* cd,map_session_data *sd); // chat
|
||||
void clif_changechatowner(struct chat_data* cd, map_session_data* sd); // chat
|
||||
void clif_clearchat(chat_data &cd);
|
||||
void clif_clearchat(struct chat_data *cd,int fd); // area or fd
|
||||
void clif_leavechat(struct chat_data* cd, map_session_data* sd, bool flag); // chat
|
||||
void clif_changechatstatus(chat_data& cd);
|
||||
void clif_changechatstatus(struct chat_data* cd); // chat
|
||||
void clif_refresh_storagewindow(map_session_data *sd);
|
||||
void clif_refresh(map_session_data *sd); // self
|
||||
|
||||
@ -901,13 +900,13 @@ void clif_divorced(map_session_data* sd, const char* name);
|
||||
void clif_callpartner(map_session_data& sd);
|
||||
void clif_playBGM( map_session_data& sd, const char* name );
|
||||
void clif_soundeffect( struct block_list& bl, const char* name, int type, enum send_target target );
|
||||
void clif_parse_ActionRequest_sub( map_session_data& sd, uint8 action_type, int target_id, t_tick tick );
|
||||
void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int target_id, t_tick tick );
|
||||
void clif_parse_LoadEndAck(int fd,map_session_data *sd);
|
||||
void clif_hotkeys_send(map_session_data *sd, int tab);
|
||||
|
||||
// trade
|
||||
void clif_traderequest(map_session_data& sd, const char* name);
|
||||
void clif_traderesponse( map_session_data& sd, e_ack_trade_response result );
|
||||
void clif_traderequest(map_session_data* sd, const char* name);
|
||||
void clif_tradestart(map_session_data* sd, uint8 type);
|
||||
void clif_tradeadditem(map_session_data* sd, map_session_data* tsd, int index, int amount);
|
||||
void clif_tradeitemok(map_session_data& sd, int index, e_exitem_add_result result);
|
||||
void clif_tradedeal_lock( map_session_data& sd, bool who );
|
||||
@ -933,7 +932,7 @@ void clif_skillinfoblock(map_session_data *sd);
|
||||
void clif_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable);
|
||||
void clif_skillinfo(map_session_data *sd,int skill_id, int inf);
|
||||
void clif_addskill(map_session_data *sd, int skill_id);
|
||||
void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock = false);
|
||||
void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock = false);
|
||||
|
||||
void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime);
|
||||
void clif_skillcastcancel( block_list& bl );
|
||||
@ -941,10 +940,10 @@ void clif_skill_fail( map_session_data& sd, uint16 skill_id, enum useskill_fail_
|
||||
void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick );
|
||||
int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
|
||||
//int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type);
|
||||
bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int32 heal, bool success = true );
|
||||
bool clif_skill_nodamage(struct block_list *src,struct block_list *dst,uint16 skill_id,int heal,t_tick tick);
|
||||
void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,int y,t_tick tick);
|
||||
void clif_skill_estimation(map_session_data *sd,struct block_list *dst);
|
||||
void clif_skill_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, std::vector<std::string>& maps );
|
||||
void clif_skill_warppoint( map_session_data* sd, uint16 skill_id, uint16 skill_lv, const char* map1, const char* map2 = "", const char* map3 = "", const char* map4 = "" );
|
||||
void clif_skill_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result );
|
||||
void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result );
|
||||
void clif_skill_produce_mix_list( map_session_data& sd, int skill_id, int trigger );
|
||||
@ -1008,7 +1007,7 @@ void clif_mvp_effect(map_session_data *sd);
|
||||
void clif_mvp_item(map_session_data *sd, t_itemid nameid);
|
||||
void clif_mvp_exp(map_session_data *sd, t_exp exp);
|
||||
void clif_mvp_noitem(map_session_data* sd);
|
||||
void clif_changed_dir(block_list& bl, enum send_target target);
|
||||
void clif_changed_dir(struct block_list *bl, enum send_target target);
|
||||
|
||||
// vending
|
||||
void clif_openvendingreq( map_session_data& sd, uint16 num );
|
||||
@ -1041,9 +1040,9 @@ void clif_party_dead( map_session_data& sd );
|
||||
// guild
|
||||
void clif_guild_created( map_session_data& sd, int flag );
|
||||
void clif_guild_belonginfo( map_session_data& sd );
|
||||
void clif_guild_masterormember(map_session_data& sd);
|
||||
void clif_guild_masterormember(map_session_data *sd);
|
||||
void clif_guild_basicinfo( map_session_data& sd );
|
||||
void clif_guild_allianceinfo(map_session_data& sd);
|
||||
void clif_guild_allianceinfo(map_session_data *sd);
|
||||
void clif_guild_memberlist( map_session_data& sd );
|
||||
void clif_guild_skillinfo( map_session_data& sd );
|
||||
void clif_guild_send_onlineinfo(map_session_data *sd); //[LuzZza]
|
||||
@ -1057,11 +1056,11 @@ void clif_guild_memberpositionchanged(const struct mmo_guild &g,int idx);
|
||||
void clif_guild_emblem(const map_session_data &sd, const struct mmo_guild &g);
|
||||
void clif_guild_emblem_area(struct block_list* bl);
|
||||
void clif_guild_notice( map_session_data& sd );
|
||||
void clif_guild_message( const struct mmo_guild& g, const char* mes, size_t len );
|
||||
void clif_guild_reqalliance(map_session_data& sd,uint32 account_id,const char *name);
|
||||
void clif_guild_allianceack(map_session_data& sd, uint8 flag);
|
||||
void clif_guild_delalliance(map_session_data& sd,uint32 guild_id,uint32 flag);
|
||||
void clif_guild_oppositionack(map_session_data& sd,uint8 flag);
|
||||
void clif_guild_message( const struct mmo_guild& g, uint32 account_id, const char* mes, size_t len );
|
||||
void clif_guild_reqalliance(map_session_data *sd,uint32 account_id,const char *name);
|
||||
void clif_guild_allianceack(map_session_data *sd,int flag);
|
||||
void clif_guild_delalliance(map_session_data *sd,int guild_id,int flag);
|
||||
void clif_guild_oppositionack(map_session_data *sd,int flag);
|
||||
void clif_guild_broken( map_session_data& sd, int flag );
|
||||
void clif_guild_xy( map_session_data& sd );
|
||||
void clif_guild_xy_single( map_session_data& sd, map_session_data& tsd );
|
||||
|
@ -37,16 +37,20 @@
|
||||
packet(0x0084,2);
|
||||
parseable_packet(0x0085,5,clif_parse_WalkToXY,2);
|
||||
parseable_packet(0x0089,7,clif_parse_ActionRequest,2,6);
|
||||
packet(0x008a,29);
|
||||
packet(0x008b,2);
|
||||
parseable_packet(0x008c,-1,clif_parse_GlobalMessage,2,4);
|
||||
packet(0x008d,-1);
|
||||
packet(0x008e,-1);
|
||||
//packet(0x008f,-1);
|
||||
parseable_packet(0x0090,7,clif_parse_NpcClicked,2,6);
|
||||
packet(0x0093,2);
|
||||
parseable_packet(0x0094,6,clif_parse_GetCharNameRequest,2);
|
||||
parseable_packet(0x0096,-1,clif_parse_WisMessage,2,4,28);
|
||||
parseable_packet(0x0099,-1,clif_parse_Broadcast,2,4);
|
||||
packet(0x009a,-1);
|
||||
parseable_packet(0x009b,5,clif_parse_ChangeDir,2,4);
|
||||
packet(0x009c,9);
|
||||
packet( HEADER_ZC_ITEM_ENTRY, sizeof( struct PACKET_ZC_ITEM_ENTRY ) );
|
||||
packet(0x009e,17);
|
||||
parseable_packet(0x009f,6,clif_parse_TakeItem,2);
|
||||
@ -59,6 +63,8 @@
|
||||
packet( useItemAckType, sizeof( struct PACKET_ZC_USE_ITEM_ACK ) );
|
||||
parseable_packet(0x00a9,6,clif_parse_EquipItem,2,4);
|
||||
parseable_packet(0x00ab,4,clif_parse_UnequipItem,2);
|
||||
packet(0x00ac,7);
|
||||
//packet(0x00ad,-1);
|
||||
packet(0x00ae,-1);
|
||||
parseable_packet(0x00b2,3,clif_parse_Restart,2);
|
||||
parseable_packet(0x00b8,7,clif_parse_NpcSelectMenu,2,6);
|
||||
@ -68,6 +74,7 @@
|
||||
parseable_packet(0x00bf,3,clif_parse_Emotion,2);
|
||||
packet(0x00c0,7);
|
||||
parseable_packet(0x00c1,2,clif_parse_HowManyConnections,0);
|
||||
packet(0x00c2,6);
|
||||
packet(0x00c3,8);
|
||||
parseable_packet(0x00c5,7,clif_parse_NpcBuySellSelected,2,6);
|
||||
packet(0x00c6,-1);
|
||||
@ -86,10 +93,13 @@
|
||||
packet(0x00d4,-1);
|
||||
parseable_packet(0x00d5,-1,clif_parse_CreateChatRoom,2,4,6,7,15);
|
||||
packet(0x00d7,-1);
|
||||
packet(0x00d8,6);
|
||||
parseable_packet(0x00d9,14,clif_parse_ChatAddMember,2,6);
|
||||
packet(0x00db,-1);
|
||||
packet(0x00dc,28);
|
||||
packet(0x00dd,29);
|
||||
parseable_packet(0x00de,-1,clif_parse_ChatRoomStatusChange,2,4,6,7,15);
|
||||
packet(0x00df,-1);
|
||||
parseable_packet(0x00e0,30,clif_parse_ChangeChatOwner,2,6);
|
||||
packet(0x00e1,30);
|
||||
parseable_packet(0x00e2,26,clif_parse_KickFromChat,2);
|
||||
@ -97,6 +107,7 @@
|
||||
parseable_packet(0x00e4,6,clif_parse_TradeRequest,2);
|
||||
packet(0x00e5,26);
|
||||
parseable_packet(0x00e6,3,clif_parse_TradeAck,2);
|
||||
packet(0x00e7,3);
|
||||
parseable_packet(0x00e8,8,clif_parse_TradeAddItem,2,4);
|
||||
packet(0x00ea,5);
|
||||
parseable_packet(0x00eb,2,clif_parse_TradeOk,0);
|
||||
@ -133,7 +144,9 @@
|
||||
packet(0x0117,18);
|
||||
parseable_packet(0x0118,2,clif_parse_StopAttack,0);
|
||||
packet(0x0119,13);
|
||||
packet(0x011a,15);
|
||||
parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4);
|
||||
packet(0x011c,68);
|
||||
parseable_packet(0x011d,2,clif_parse_RequestMemo,0);
|
||||
packet(0x011f,16);
|
||||
packet( cartlistequipType, -1 );
|
||||
@ -159,7 +172,9 @@
|
||||
parseable_packet(0x0149,9,clif_parse_GMReqNoChat,2,6,7);
|
||||
packet(0x014a,6);
|
||||
packet(0x014b,27);
|
||||
packet(0x014c,-1);
|
||||
parseable_packet(0x014d,2,clif_parse_GuildCheckMaster,0);
|
||||
packet(0x014e,6);
|
||||
parseable_packet(0x014f,6,clif_parse_GuildRequestInfo,2);
|
||||
packet(0x0150,110);
|
||||
parseable_packet(0x0151,6,clif_parse_GuildRequestEmblem,2);
|
||||
@ -174,7 +189,9 @@
|
||||
parseable_packet( HEADER_CZ_REQ_BAN_GUILD, sizeof( PACKET_CZ_REQ_BAN_GUILD ), clif_parse_GuildExpulsion, 0 );
|
||||
parseable_packet( HEADER_CZ_REQ_DISORGANIZE_GUILD, sizeof( PACKET_CZ_REQ_DISORGANIZE_GUILD ), clif_parse_GuildBreak, 0 );
|
||||
packet(0x015f,42);
|
||||
packet(0x0160,-1);
|
||||
parseable_packet(0x0161,-1,clif_parse_GuildChangePositionInfo,2,4);
|
||||
packet(0x0163,-1);
|
||||
packet(0x0164,-1);
|
||||
parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6);
|
||||
packet(0x0166,-1);
|
||||
@ -184,7 +201,9 @@
|
||||
packet(0x016d,14);
|
||||
parseable_packet(0x016e,186,clif_parse_GuildChangeNotice,2,6,66);
|
||||
parseable_packet(0x0170,14,clif_parse_GuildRequestAlliance,2,6,10);
|
||||
packet(0x0171,30);
|
||||
parseable_packet(0x0172,10,clif_parse_GuildReplyAlliance,2,6);
|
||||
packet(0x0173,3);
|
||||
packet(0x0174,-1);
|
||||
packet(0x0175,6);
|
||||
packet(0x0176,106);
|
||||
@ -194,10 +213,14 @@
|
||||
packet(0x017b,-1);
|
||||
parseable_packet(0x017c,6,clif_parse_InsertCard,2,4);
|
||||
parseable_packet(0x017e,-1,clif_parse_GuildMessage,2,4);
|
||||
packet(0x017f,-1);
|
||||
parseable_packet(0x0180,6,clif_parse_GuildOpposition,2);
|
||||
packet(0x0181,3);
|
||||
packet(0x0182,106);
|
||||
parseable_packet(0x0183,10,clif_parse_GuildDelAlliance,2,6);
|
||||
packet(0x0184,10);
|
||||
packet(0x0185,34);
|
||||
//packet(0x0186,-1);
|
||||
packet(0x0187,6);
|
||||
parseable_packet(0x018a,4,clif_parse_QuitGame,2);
|
||||
packet(0x018b,4);
|
||||
@ -252,6 +275,7 @@
|
||||
packet(0x01c6,4);
|
||||
packet(0x01c7,2);
|
||||
packet(0x01c9,97);
|
||||
//packet(0x01ca,-1);
|
||||
packet(0x01cb,9);
|
||||
packet(0x01cc,9);
|
||||
parseable_packet(0x01ce,6,clif_parse_AutoSpell,2);
|
||||
@ -285,6 +309,8 @@
|
||||
packet(0x01f1,-1);
|
||||
packet(0x01f2,20);
|
||||
packet(0x01f3,10);
|
||||
packet(0x01f4,32);
|
||||
packet(0x01f5,9);
|
||||
packet(0x01f6,34);
|
||||
parseable_packet(0x01f7,14,clif_parse_Adopt_reply,2,6,10);
|
||||
packet(0x01f8,2);
|
||||
@ -293,6 +319,7 @@
|
||||
packet(0x01fb,56);
|
||||
packet(0x01fc,-1);
|
||||
parseable_packet( HEADER_CZ_REQ_ITEMREPAIR1, sizeof( struct PACKET_CZ_REQ_ITEMREPAIR1 ), clif_parse_RepairItem, 0 );
|
||||
packet(0x01ff,10);
|
||||
packet(0x0200,26);
|
||||
packet(0x0201,-1);
|
||||
parseable_packet(0x0202,26,clif_parse_FriendsListAdd,2);
|
||||
@ -304,6 +331,8 @@
|
||||
parseable_packet(0x0208,11,clif_parse_FriendsListReply,2,6,10);
|
||||
packet(0x0209,36);
|
||||
packet(0x020a,10);
|
||||
//packet(0x020b,-1);
|
||||
//packet(0x020c,-1);
|
||||
packet(0x020d,-1);
|
||||
packet(0x8b3,-1);
|
||||
|
||||
@ -992,8 +1021,14 @@
|
||||
packet(0x029b,80);
|
||||
#endif
|
||||
|
||||
// 2007-11-13aSakexe
|
||||
#if PACKETVER >= 20071113
|
||||
packet(0x02e1,33);
|
||||
#endif
|
||||
|
||||
// 2007-11-20aSakexe
|
||||
#if PACKETVER >= 20071120
|
||||
//packet(0x01df,10 <- ???);
|
||||
packet(0x02e2,14);
|
||||
packet(0x02e3,25);
|
||||
packet(0x02e4,8);
|
||||
@ -1209,6 +1244,7 @@
|
||||
// 2008-11-26aSakexe
|
||||
#if PACKETVER >= 20081126
|
||||
packet(0x01a2,37);
|
||||
packet(0x0441,4);
|
||||
#endif
|
||||
|
||||
// 2008-12-10aSakexe
|
||||
@ -1280,12 +1316,15 @@
|
||||
|
||||
// 2008-11-12aRagexeRE
|
||||
#if PACKETVER >= 20081112
|
||||
//packet(0x043e,-1);
|
||||
packet(0x043f,8);
|
||||
#endif
|
||||
|
||||
// 2008-12-17aRagexeRE
|
||||
#if PACKETVER >= 20081217
|
||||
packet(0x01a2,37);
|
||||
//packet(0x0441,4);
|
||||
//packet(0x0443,8);
|
||||
#endif
|
||||
|
||||
// 2008-12-17bRagexeRE
|
||||
@ -1296,10 +1335,39 @@
|
||||
// 2009-01-21aRagexeRE
|
||||
#if PACKETVER >= 20090121
|
||||
packet(0x043f,25);
|
||||
//packet(0x0444,-1);
|
||||
//packet(0x0445,10);
|
||||
#endif
|
||||
|
||||
// 2009-02-18aRagexeRE
|
||||
#if PACKETVER >= 20090218
|
||||
//packet(0x0446,14);
|
||||
#endif
|
||||
|
||||
// 2009-02-26cRagexeRE
|
||||
#if PACKETVER >= 20090226
|
||||
//packet(0x0448,-1);
|
||||
#endif
|
||||
|
||||
// 2009-04-01aRagexeRE
|
||||
#if PACKETVER >= 20090401
|
||||
//packet(0x0449,4);
|
||||
#endif
|
||||
|
||||
// 2009-05-14aRagexeRE
|
||||
#if PACKETVER >= 20090514
|
||||
//packet(0x044b,2);
|
||||
#endif
|
||||
|
||||
// 2009-05-20aRagexeRE
|
||||
#if PACKETVER >= 20090520
|
||||
//packet(0x07d0,6);
|
||||
//packet(0x07d1,2);
|
||||
//packet(0x07d2,-1);
|
||||
//packet(0x07d3,4);
|
||||
//packet(0x07d4,4);
|
||||
//packet(0x07d5,4);
|
||||
//packet(0x07d6,4);
|
||||
parseable_packet( 0x0447, 2, clif_parse_blocking_playcancel, 0 );
|
||||
#endif
|
||||
|
||||
@ -1311,9 +1379,29 @@
|
||||
parseable_packet(0x07da,6,clif_parse_PartyChangeLeader,2);
|
||||
#endif
|
||||
|
||||
// 2009-06-10aRagexeRE
|
||||
#if PACKETVER >= 20090610
|
||||
//packet(0x07db,8);
|
||||
#endif
|
||||
|
||||
// 2009-06-17aRagexeRE
|
||||
#if PACKETVER >= 20090617
|
||||
packet(0x07d9,268);
|
||||
//packet(0x07dc,6);
|
||||
//packet(0x07dd,54);
|
||||
//packet(0x07de,30);
|
||||
//packet(0x07df,54);
|
||||
#endif
|
||||
|
||||
// 2009-07-01aRagexeRE
|
||||
#if PACKETVER >= 20090701
|
||||
//packet(0x0275,37);
|
||||
//packet(0x0276,-1);
|
||||
#endif
|
||||
|
||||
// 2009-07-08aRagexeRE
|
||||
#if PACKETVER >= 20090708
|
||||
//packet(0x07e0,58);
|
||||
#endif
|
||||
|
||||
// 2009-07-15aRagexeRE
|
||||
@ -1335,6 +1423,7 @@
|
||||
|
||||
// 2009-08-25aRagexeRE
|
||||
#if PACKETVER >= 20090825
|
||||
//packet(0x07e6,28);
|
||||
packet(0x07e7,5);
|
||||
#endif
|
||||
|
||||
@ -1347,6 +1436,30 @@
|
||||
packet(0x07e9,5);
|
||||
#endif
|
||||
|
||||
// 2009-09-29aRagexeRE
|
||||
#if PACKETVER >= 20090929
|
||||
//packet(0x07ea,2);
|
||||
//packet(0x07eb,-1);
|
||||
//packet(0x07ec,6);
|
||||
//packet(0x07ed,8);
|
||||
//packet(0x07ee,6);
|
||||
//packet(0x07ef,8);
|
||||
//packet(0x07f0,4);
|
||||
//packet(0x07f2,4);
|
||||
//packet(0x07f3,3);
|
||||
#endif
|
||||
|
||||
// 2009-10-06aRagexeRE
|
||||
#if PACKETVER >= 20091006
|
||||
//packet(0x07ec,8);
|
||||
//packet(0x07ed,10);
|
||||
//packet(0x07f0,8);
|
||||
//packet(0x07f1,15);
|
||||
//packet(0x07f2,6);
|
||||
//packet(0x07f3,4);
|
||||
//packet(0x07f4,3);
|
||||
#endif
|
||||
|
||||
// 2009-10-27aRagexeRE
|
||||
#if PACKETVER >= 20091027
|
||||
parseable_packet(0x07f5,6,clif_parse_GMFullStrip,2);
|
||||
@ -1368,6 +1481,7 @@
|
||||
// 2009-12-01aRagexeRE
|
||||
#if PACKETVER >= 20091201
|
||||
packet(0x07fc,10);
|
||||
//packet(0x07ff,-1);
|
||||
#endif
|
||||
|
||||
// 2009-12-22aRagexeRE
|
||||
@ -1377,7 +1491,12 @@
|
||||
packet(0x0804,8); // Booking System
|
||||
packet(0x0805,-1);
|
||||
parseable_packet(0x0806,4,clif_parse_PartyBookingDeleteReq,2); // Booking System
|
||||
//packet(0x0807,2);
|
||||
packet(0x0808,4); // Booking System
|
||||
//packet(0x0809,14);
|
||||
//packet(0x080A,50);
|
||||
//packet(0x080B,18);
|
||||
//packet(0x080C,6);
|
||||
#endif
|
||||
|
||||
// 2009-12-29aRagexeRE
|
||||
@ -1396,20 +1515,59 @@
|
||||
parseable_packet( HEADER_CZ_PC_PURCHASE_ITEMLIST_FROMMC2, -1, clif_parse_PurchaseReq2, 0 );
|
||||
#endif
|
||||
|
||||
// 2010-01-26aRagexeRE
|
||||
#if PACKETVER >= 20100126
|
||||
//packet(0x080C,2);
|
||||
//packet(0x080D,3);
|
||||
#endif
|
||||
|
||||
// 2010-02-09aRagexeRE
|
||||
#if PACKETVER >= 20100209
|
||||
//packet(0x07F0,6);
|
||||
#endif
|
||||
|
||||
// 2010-03-03aRagexeRE
|
||||
#if PACKETVER >= 20100303
|
||||
packet(0x0810,3);
|
||||
parseable_packet(0x0811,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
|
||||
//packet(0x0812,86);
|
||||
//packet(0x0815,-1);
|
||||
//packet(0x0817,-1);
|
||||
//packet(0x0819,4);
|
||||
#endif
|
||||
|
||||
// 2010-03-09aRagexeRE
|
||||
#if PACKETVER >= 20100309
|
||||
//packet(0x0815,6);
|
||||
//packet(0x0819,10);
|
||||
//packet(0x081A,4);
|
||||
//packet(0x081B,4);
|
||||
//packet(0x081C,6);
|
||||
packet(0x081d,22);
|
||||
#endif
|
||||
|
||||
// 2010-03-23aRagexeRE
|
||||
#if PACKETVER >= 20100323
|
||||
//packet(0x081F,-1);
|
||||
#endif
|
||||
|
||||
// 2010-04-06aRagexeRE
|
||||
#if PACKETVER >= 20100406
|
||||
//packet(0x081A,6);
|
||||
#endif
|
||||
|
||||
// 2010-04-13aRagexeRE
|
||||
#if PACKETVER >= 20100413
|
||||
//packet(0x081A,10);
|
||||
packet(0x0820,11);
|
||||
//packet(0x0821,2);
|
||||
//packet(0x0822,9);
|
||||
//packet(0x0823,-1);
|
||||
#endif
|
||||
|
||||
// 2010-04-14dRagexeRE
|
||||
#if PACKETVER >= 20100414
|
||||
//packet(0x081B,8);
|
||||
#endif
|
||||
|
||||
// 2010-04-20aRagexeRE
|
||||
@ -1431,12 +1589,46 @@
|
||||
parseable_packet( HEADER_CZ_SSILIST_ITEM_CLICK, sizeof( struct PACKET_CZ_SSILIST_ITEM_CLICK ), clif_parse_SearchStoreInfoListItemClick, 0 );
|
||||
#endif
|
||||
|
||||
// 2010-06-15aRagexeRE
|
||||
#if PACKETVER >= 20100615
|
||||
//packet(0x083E,26);
|
||||
#endif
|
||||
|
||||
// 2010-06-22aRagexeRE
|
||||
#if PACKETVER >= 20100622
|
||||
//packet(0x083F,22);
|
||||
#endif
|
||||
|
||||
// 2010-06-29aRagexeRE
|
||||
#if PACKETVER >= 20100629
|
||||
//packet(0x07F1,18);
|
||||
//packet(0x07F2,8);
|
||||
//packet(0x07F3,6);
|
||||
#endif
|
||||
|
||||
// 2010-07-06aRagexeRE
|
||||
#if PACKETVER_MAIN_NUM >= 20100817 || PACKETVER_RE_NUM >= 20100706 || defined(PACKETVER_ZERO)
|
||||
parseable_packet(0x0835, -1, clif_parse_SearchStoreInfo, 2, 4, 5, 9, 13, 14, 15);
|
||||
packet(HEADER_ZC_SEARCH_STORE_INFO_ACK, -1);
|
||||
#endif
|
||||
|
||||
// 2010-07-13aRagexeRE
|
||||
#if PACKETVER >= 20100713
|
||||
//packet(0x0827,6);
|
||||
//packet(0x0828,14);
|
||||
//packet(0x0829,6);
|
||||
//packet(0x082A,10);
|
||||
//packet(0x082B,6);
|
||||
//packet(0x082C,14);
|
||||
//packet(0x0840,-1);
|
||||
//packet(0x0841,19);
|
||||
#endif
|
||||
|
||||
// 2010-07-14aRagexeRE
|
||||
#if PACKETVER >= 20100714
|
||||
//packet(0x0841,4);
|
||||
#endif
|
||||
|
||||
// 2010-08-03aRagexeRE
|
||||
#if PACKETVER >= 20100803
|
||||
parseable_packet(0x0842,6,clif_parse_GMRecall2,2);
|
||||
@ -1482,6 +1674,7 @@
|
||||
parseable_packet(0x0838,6,clif_parse_SolveCharName,2);
|
||||
parseable_packet(0x0439,8,clif_parse_UseItem,2,4);
|
||||
packet(0x08d2,10);
|
||||
packet(0x08d1,7);
|
||||
#endif
|
||||
|
||||
// 2011-11-02aRagexe
|
||||
@ -1714,8 +1907,10 @@
|
||||
parseable_packet(0x0978,6,clif_parse_reqworldinfo,2);
|
||||
packet(0x0979,50); //ackworldinfo
|
||||
parseable_packet(0x0998,8,clif_parse_EquipItem,2,4); // CZ_REQ_WEAR_EQUIP_V5
|
||||
packet(0x099a,9); // take_off_equipv5
|
||||
packet(0x099b,8); //maptypeproperty2
|
||||
// New Packets
|
||||
packet(0x08C8,34); // ZC_NOTIFY_ACT3
|
||||
packet(0x08ff,24); // ZC_EFST_SET_ENTER
|
||||
packet(0x0984,28); // ZC_EFST_SET_ENTER2
|
||||
packet(0x099f,22); // ZC_SKILL_ENTRY4
|
||||
@ -1744,6 +1939,7 @@
|
||||
// 2013-07-31cRagexe
|
||||
#if PACKETVER >= 20130731
|
||||
packet(0x09ca,23); // ZC_SKILL_ENTRY5
|
||||
packet(0x09cb,17); // ZC_USE_SKILL2
|
||||
#endif
|
||||
|
||||
// 2013-08-07Ragexe
|
||||
@ -1929,8 +2125,9 @@
|
||||
parseable_packet( HEADER_CZ_REQ_RANDOM_COMBINE_ITEM, -1, clif_parse_laphine_synthesis, 0 );
|
||||
#endif
|
||||
|
||||
#if PACKETVER_MAIN_NUM >= 20160622 || PACKETVER_RE_NUM >= 20160622 || defined(PACKETVER_ZERO)
|
||||
parseable_packet( HEADER_CZ_CMD_RESETCOOLTIME, sizeof( PACKET_CZ_CMD_RESETCOOLTIME ), clif_parse_gm_resetcooltime, 0 );
|
||||
// 2016-06-22aRagexeRE
|
||||
#if PACKETVER >= 20160622
|
||||
packet(0x0A84,94);
|
||||
#endif
|
||||
|
||||
// 2016-10-12aRagexeRE
|
||||
|
@ -847,7 +847,7 @@ int guild_recv_info(const struct mmo_guild &sg) {
|
||||
sd->guild = g;
|
||||
sd->state.gmaster_flag = 1;
|
||||
clif_name_area(&sd->bl); // [LuzZza]
|
||||
clif_guild_masterormember(*sd);
|
||||
clif_guild_masterormember(sd);
|
||||
}
|
||||
} else {
|
||||
before = g->guild;
|
||||
@ -893,10 +893,6 @@ int guild_recv_info(const struct mmo_guild &sg) {
|
||||
clif_guild_skillinfo( *sd ); // Submit information skills
|
||||
|
||||
if (guild_new) { // Send information and affiliation if unsent
|
||||
#if PACKETVER >= 20200902
|
||||
// Clients after this version need this packet to show the guild name on alt+a
|
||||
clif_guild_basicinfo( *sd );
|
||||
#endif
|
||||
clif_guild_belonginfo( *sd );
|
||||
clif_guild_notice( *sd );
|
||||
sd->guild_emblem_id = g->guild.emblem_id;
|
||||
@ -963,7 +959,7 @@ bool guild_invite( map_session_data& sd, map_session_data* tsd ){
|
||||
}
|
||||
|
||||
// Checking if there no other invitation pending
|
||||
if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){
|
||||
if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){
|
||||
clif_guild_inviteack( sd, 0 );
|
||||
return false;
|
||||
}
|
||||
@ -1380,10 +1376,6 @@ int guild_send_memberinfoshort(map_session_data *sd,int online) { // cleaned up
|
||||
}
|
||||
|
||||
if(sd->state.connect_new) { //Note that this works because it is invoked in parse_LoadEndAck before connect_new is cleared.
|
||||
#if PACKETVER >= 20200902
|
||||
// Clients after this version need this packet to show the guild name on alt+a
|
||||
clif_guild_basicinfo( *sd );
|
||||
#endif
|
||||
clif_guild_belonginfo( *sd );
|
||||
sd->guild_emblem_id = g->guild.emblem_id;
|
||||
}
|
||||
@ -1476,7 +1468,7 @@ int guild_recv_message( int guild_id, uint32 account_id, const char *mes, size_t
|
||||
auto g = guild_search(guild_id);
|
||||
if (!g)
|
||||
return 0;
|
||||
clif_guild_message(g->guild,mes,len);
|
||||
clif_guild_message(g->guild,account_id,mes,len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1862,7 +1854,7 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
|
||||
|
||||
// Check, is tsd guild master, if not - cancel alliance. [f0und3r]
|
||||
if (battle_config.guild_alliance_onlygm && !tsd->state.gmaster_flag) {
|
||||
clif_guild_allianceack(*sd, 5);
|
||||
clif_guild_allianceack(sd, 5);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1877,23 +1869,23 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
|
||||
return 0;
|
||||
|
||||
if( guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance ) {
|
||||
clif_guild_allianceack(*sd,4);
|
||||
clif_guild_allianceack(sd,4);
|
||||
return 0;
|
||||
}
|
||||
if( guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance ) {
|
||||
clif_guild_allianceack(*sd,3);
|
||||
clif_guild_allianceack(sd,3);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( tsd->guild_alliance>0 ){
|
||||
clif_guild_allianceack(*sd,1);
|
||||
clif_guild_allianceack(sd,1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_GUILDALLIANCE; i++) { // check if already allied
|
||||
if( g->guild.alliance[i].guild_id==tsd->status.guild_id &&
|
||||
g->guild.alliance[i].opposition==0){
|
||||
clif_guild_allianceack(*sd,0);
|
||||
clif_guild_allianceack(sd,0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -1901,7 +1893,7 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) {
|
||||
tsd->guild_alliance=sd->status.guild_id;
|
||||
tsd->guild_alliance_account=sd->status.account_id;
|
||||
|
||||
clif_guild_reqalliance(*tsd,sd->status.account_id,g->guild.name);
|
||||
clif_guild_reqalliance(tsd,sd->status.account_id,g->guild.name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1914,7 +1906,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
|
||||
nullpo_ret(sd);
|
||||
tsd= map_id2sd( account_id );
|
||||
if (!tsd) { //Character left? Cancel alliance.
|
||||
clif_guild_allianceack(*sd,3);
|
||||
clif_guild_allianceack(sd,3);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1928,13 +1920,13 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
|
||||
auto &tg = tsd->guild;
|
||||
|
||||
if (!g || guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance) {
|
||||
clif_guild_allianceack(*sd,4);
|
||||
clif_guild_allianceack(*tsd,3);
|
||||
clif_guild_allianceack(sd,4);
|
||||
clif_guild_allianceack(tsd,3);
|
||||
return 0;
|
||||
}
|
||||
if (!tg || guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance) {
|
||||
clif_guild_allianceack(*sd,3);
|
||||
clif_guild_allianceack(*tsd,4);
|
||||
if (!g || guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance) {
|
||||
clif_guild_allianceack(sd,3);
|
||||
clif_guild_allianceack(tsd,4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1959,7 +1951,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) {
|
||||
sd->guild_alliance=0;
|
||||
sd->guild_alliance_account=0;
|
||||
if(tsd!=nullptr)
|
||||
clif_guild_allianceack(*tsd,3);
|
||||
clif_guild_allianceack(tsd,3);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -1996,14 +1988,14 @@ int guild_opposition(map_session_data *sd,map_session_data *tsd) {
|
||||
return 0;
|
||||
|
||||
if( guild_get_alliance_count(g->guild,1) >= battle_config.max_guild_alliance ) {
|
||||
clif_guild_oppositionack(*sd,1);
|
||||
clif_guild_oppositionack(sd,1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_GUILDALLIANCE; i++) { // checking relations
|
||||
if(g->guild.alliance[i].guild_id==tsd->status.guild_id){
|
||||
if (g->guild.alliance[i].opposition == 1) { // check if not already hostile
|
||||
clif_guild_oppositionack(*sd,2);
|
||||
clif_guild_oppositionack(sd,2);
|
||||
return 0;
|
||||
}
|
||||
if(is_agit_start()) // Prevent the changing of alliances to oppositions during WoE.
|
||||
@ -2049,7 +2041,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
|
||||
if (flag & 0x70) { // failure
|
||||
for(i=0;i<2-(flag&1);i++)
|
||||
if( sd[i]!=nullptr )
|
||||
clif_guild_allianceack(*sd[i],((flag>>4)==i+1)?3:4);
|
||||
clif_guild_allianceack(sd[i],((flag>>4)==i+1)?3:4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2073,16 +2065,16 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
|
||||
g[i]->alliance[j].guild_id = 0;
|
||||
}
|
||||
if (sd[i] != nullptr) // notify players
|
||||
clif_guild_delalliance(*sd[i],guild_id[1-i],(flag&1));
|
||||
clif_guild_delalliance(sd[i],guild_id[1-i],(flag&1));
|
||||
}
|
||||
}
|
||||
|
||||
if ((flag & 0x0f) == 0) { // alliance notification
|
||||
if( sd[1]!=nullptr )
|
||||
clif_guild_allianceack(*sd[1],2);
|
||||
clif_guild_allianceack(sd[1],2);
|
||||
} else if ((flag & 0x0f) == 1) { // enemy notification
|
||||
if( sd[0]!=nullptr )
|
||||
clif_guild_oppositionack(*sd[0],0);
|
||||
clif_guild_oppositionack(sd[0],0);
|
||||
}
|
||||
|
||||
|
||||
@ -2091,7 +2083,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco
|
||||
for(j=0;j<g[i]->max_member;j++) {
|
||||
map_session_data *sd_mem = g[i]->member[j].sd;
|
||||
if( sd_mem!=nullptr){
|
||||
clif_guild_allianceinfo(*sd_mem);
|
||||
clif_guild_allianceinfo(sd_mem);
|
||||
|
||||
// join ally channel
|
||||
if( channel_config.ally_tmpl.name[0] && (channel_config.ally_tmpl.opt&CHAN_OPT_AUTOJOIN) ) {
|
||||
@ -2112,7 +2104,7 @@ int guild_broken_sub(struct mmo_guild &g, int guild_id) {
|
||||
if (g.alliance[i].guild_id == guild_id) {
|
||||
for (int j = 0; j < g.max_member; j++) {
|
||||
if (g.member[j].sd)
|
||||
clif_guild_delalliance(*g.member[j].sd, guild_id, g.alliance[i].opposition);
|
||||
clif_guild_delalliance(g.member[j].sd, guild_id, g.alliance[i].opposition);
|
||||
}
|
||||
intif_guild_alliance(g.guild_id, guild_id, 0, 0, g.alliance[i].opposition | 8);
|
||||
g.alliance[i].guild_id = 0;
|
||||
|
@ -279,7 +279,7 @@ int hom_vaporize(map_session_data *sd, int flag)
|
||||
if (!hd || hd->homunculus.vaporize)
|
||||
return 0;
|
||||
|
||||
if (status_isdead(hd->bl))
|
||||
if (status_isdead(&hd->bl))
|
||||
return 0; //Can't vaporize a dead homun.
|
||||
|
||||
if (flag == HOM_ST_REST && get_percentage(hd->battle_status.hp, hd->battle_status.max_hp) < 80)
|
||||
@ -1280,7 +1280,7 @@ int hom_ressurect(map_session_data* sd, unsigned char per, short x, short y)
|
||||
if (hd->homunculus.vaporize == HOM_ST_REST)
|
||||
return 0; // vaporized homunculi need to be 'called'
|
||||
|
||||
if (!status_isdead(hd->bl))
|
||||
if (!status_isdead(&hd->bl))
|
||||
return 0; // already alive
|
||||
|
||||
hom_init_timers(hd);
|
||||
|
@ -2843,6 +2843,7 @@ enum e_random_item_group {
|
||||
IG_COSTUMEMILEPACK_35_1,
|
||||
IG_COSTUMEMILEPACK_35_2,
|
||||
IG_COSTUMEMILEPACK_35_3,
|
||||
IG_D_GW_EXTRACTOR,
|
||||
|
||||
IG_MAX,
|
||||
};
|
||||
|
@ -67,7 +67,7 @@ void map_msg_reload(void);
|
||||
#define NATURAL_HEAL_INTERVAL 500
|
||||
#define MIN_FLOORITEM 2
|
||||
#define MAX_FLOORITEM START_ACCOUNT_NUM
|
||||
#define MAX_LEVEL 275
|
||||
#define MAX_LEVEL 260
|
||||
#define MAX_DROP_PER_MAP 48
|
||||
#define MAX_IGNORE_LIST 20 // official is 14
|
||||
#define MAX_VENDING 12
|
||||
@ -677,6 +677,8 @@ enum e_mapflag : int16 {
|
||||
MF_NODYNAMICNPC,
|
||||
MF_NOBANK,
|
||||
MF_SPECIALPOPUP,
|
||||
MF_NOLOOTNORMALMOB,
|
||||
MF_NO_NPC_SELFDESTRUCTION_ON_ALL,
|
||||
MF_MAX
|
||||
};
|
||||
|
||||
|
@ -1443,7 +1443,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,t_tick tick)
|
||||
|
||||
bl=map_id2bl(md->master_id);
|
||||
|
||||
if (!bl || status_isdead(*bl)) {
|
||||
if (!bl || status_isdead(bl)) {
|
||||
status_kill(&md->bl);
|
||||
return 1;
|
||||
}
|
||||
@ -1934,7 +1934,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick)
|
||||
|
||||
if (pcdb_checkid(md->vd->class_))
|
||||
{ //Give them walk act/delay to properly mimic players. [Skotlex]
|
||||
clif_takeitem(md->bl,*tbl);
|
||||
clif_takeitem(&md->bl,tbl);
|
||||
md->ud.canact_tick = tick + md->status.amotion;
|
||||
unit_set_walkdelay(&md->bl, tick, md->status.amotion, 1);
|
||||
}
|
||||
@ -2889,7 +2889,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
||||
}
|
||||
}
|
||||
|
||||
if( !(type&1) && !map_getmapflag(m, MF_NOMOBLOOT) && !md->state.rebirth && (
|
||||
if( !(type&1) && !map_getmapflag(m, MF_NOMOBLOOT) && !(md->get_bosstype() == BOSSTYPE_NONE && map_getmapflag(m, MF_NOLOOTNORMALMOB)) && !md->state.rebirth && (
|
||||
!md->special_state.ai || //Non special mob
|
||||
battle_config.alchemist_summon_reward == 2 || //All summoned give drops
|
||||
(md->special_state.ai==AI_SPHERE && battle_config.alchemist_summon_reward == 1) //Marine Sphere Drops items.
|
||||
@ -3682,7 +3682,7 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,uint16 skill_id)
|
||||
if (md2->state.copy_master_mode)
|
||||
md->status.mode = md2->status.mode;
|
||||
|
||||
clif_skill_nodamage(&md->bl,md->bl,skill_id,amount);
|
||||
clif_skill_nodamage(&md->bl,&md->bl,skill_id,amount,1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1528,11 +1528,6 @@ enum e_job_types
|
||||
JT_4_EP21_TAN_S,
|
||||
|
||||
JT_4_M_VACATION_MARAM = 10595,
|
||||
JT_4_CLB_SS_FC,
|
||||
JT_4_CLB_SS_TZ,
|
||||
JT_4_CLB_SS_AJ,
|
||||
JT_4_CLB_SS_LK,
|
||||
JT_4_SMART_ANDRE,
|
||||
|
||||
JT_ROZ_MQ_XAVIER = 13000,
|
||||
JT_ROZ_MQ_MOCLORD,
|
||||
@ -1552,7 +1547,7 @@ enum e_job_types
|
||||
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
|
||||
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
|
||||
|
||||
//Checks if a given id is a valid npc id.
|
||||
//Checks if a given id is a valid npc id. [Skotlex]
|
||||
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
|
||||
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )
|
||||
|
||||
|
@ -32,12 +32,6 @@
|
||||
#pragma pack( push, 1 )
|
||||
#endif
|
||||
|
||||
struct PACKET_ZC_USER_COUNT{
|
||||
uint16 packetType;
|
||||
int32 playersCount;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_USER_COUNT, 0xc2)
|
||||
|
||||
struct PACKET_ZC_PC_PURCHASE_RESULT{
|
||||
int16 packetType;
|
||||
uint8 result;
|
||||
@ -362,38 +356,6 @@ struct PACKET_ZC_ACK_OPEN_BANKING{
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_ACK_OPEN_BANKING, 0x9b7)
|
||||
|
||||
#if PACKETVER > 6
|
||||
struct PACKET_ZC_REQ_EXCHANGE_ITEM{
|
||||
uint16 packetType;
|
||||
char requesterName[NAME_LENGTH];
|
||||
uint32 targetId;
|
||||
uint16 targetLv;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x1f4)
|
||||
#else
|
||||
struct PACKET_ZC_REQ_EXCHANGE_ITEM{
|
||||
uint16 packetType;
|
||||
char requesterName[NAME_LENGTH];
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x9a)
|
||||
#endif
|
||||
|
||||
#if PACKETVER > 6
|
||||
struct PACKET_ZC_ACK_EXCHANGE_ITEM{
|
||||
uint16 packetType;
|
||||
uint8 result;
|
||||
uint32 targetId;
|
||||
uint16 targetLv;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0x1f5)
|
||||
#else
|
||||
struct PACKET_ZC_ACK_EXCHANGE_ITEM{
|
||||
uint16 packetType;
|
||||
uint8 result;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0xe7)
|
||||
#endif
|
||||
|
||||
struct PACKET_ZC_ACK_ADD_EXCHANGE_ITEM {
|
||||
int16 packetType;
|
||||
uint16 index;
|
||||
@ -667,14 +629,6 @@ struct PACKET_ZC_NOTIFY_PLAYERMOVE {
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_PLAYERMOVE, 0x87);
|
||||
|
||||
struct PACKET_ZC_CHANGE_DIRECTION{
|
||||
int16 packetType;
|
||||
uint32 srcId;
|
||||
uint16 headDir;
|
||||
uint8 dir;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_CHANGE_DIRECTION, 0x9c)
|
||||
|
||||
struct PACKET_ZC_NPCACK_MAPMOVE {
|
||||
int16 packetType;
|
||||
char mapName[MAP_NAME_LENGTH_EXT];
|
||||
@ -760,32 +714,6 @@ struct PACKET_ZC_OPEN_EDITDLGSTR {
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_OPEN_EDITDLGSTR, 0x1d4)
|
||||
|
||||
struct PACKET_ZC_ACK_REQ_ALLY_GUILD {
|
||||
int16 packetType;
|
||||
uint8 flag;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_ACK_REQ_ALLY_GUILD, 0x173)
|
||||
|
||||
struct PACKET_ZC_DELETE_RELATED_GUILD {
|
||||
int16 packetType;
|
||||
uint32 allyID;
|
||||
uint32 flag;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_DELETE_RELATED_GUILD, 0x184)
|
||||
|
||||
struct PACKET_ZC_REQ_ALLY_GUILD {
|
||||
int16 packetType;
|
||||
uint32 inviterId;
|
||||
char inviterGuildName[NAME_LENGTH];
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_REQ_ALLY_GUILD, 0x171)
|
||||
|
||||
struct PACKET_ZC_ACK_REQ_HOSTILE_GUILD {
|
||||
int16 packetType;
|
||||
uint8 flag;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_ACK_REQ_HOSTILE_GUILD, 0x181)
|
||||
|
||||
struct PACKET_ZC_COMPASS {
|
||||
int16 packetType;
|
||||
uint32 npcId;
|
||||
@ -817,12 +745,6 @@ struct PACKET_ZC_CARTOFF {
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_CARTOFF, 0x12b)
|
||||
|
||||
struct PACKET_ZC_ACK_GUILD_MENUINTERFACE {
|
||||
int16 packetType;
|
||||
int menuFlag;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_ACK_GUILD_MENUINTERFACE, 0x014e)
|
||||
|
||||
struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM {
|
||||
int16 packetType;
|
||||
uint32 aid;
|
||||
@ -831,13 +753,6 @@ struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM {
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_POSITION_TO_GUILDM, 0x1eb)
|
||||
|
||||
struct PACKET_ZC_GUILD_CHAT {
|
||||
int16 packetType;
|
||||
int16 packetLength;
|
||||
char message[];
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_GUILD_CHAT, 0x17f)
|
||||
|
||||
struct PACKET_ZC_STATUS {
|
||||
int16 packetType;
|
||||
uint16 point;
|
||||
@ -917,50 +832,12 @@ struct PACKET_ZC_PAR_CHANGE_USER {
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_PAR_CHANGE_USER, 0x1ab)
|
||||
|
||||
struct PACKET_ZC_CHANGE_CHATROOM{
|
||||
uint16 packetType;
|
||||
uint16 packetSize;
|
||||
uint32 ownerId;
|
||||
uint32 chatId;
|
||||
uint16 limit;
|
||||
uint16 users;
|
||||
uint8 flag;
|
||||
char title[];
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_CHANGE_CHATROOM, 0xdf);
|
||||
|
||||
struct PACKET_ZC_EQUIP_ARROW {
|
||||
int16 packetType;
|
||||
uint16 index;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_EQUIP_ARROW, 0x13c)
|
||||
|
||||
#if PACKETVER >= 20130000
|
||||
struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{
|
||||
uint16 packetType;
|
||||
uint16 index;
|
||||
uint32 wearLocation;
|
||||
uint8 flag;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0x99a)
|
||||
#elif PACKETVER >= 20110824
|
||||
struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{
|
||||
uint16 packetType;
|
||||
uint16 index;
|
||||
uint16 wearLocation;
|
||||
uint8 flag;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0x8d1)
|
||||
#else
|
||||
struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{
|
||||
uint16 packetType;
|
||||
uint16 index;
|
||||
uint16 wearLocation;
|
||||
bool flag;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0xac)
|
||||
#endif
|
||||
|
||||
struct PACKET_ZC_CLOSE_STORE {
|
||||
int16 packetType;
|
||||
} __attribute__((packed));
|
||||
@ -1015,25 +892,6 @@ struct PACKET_ZC_REFUSE_ENTER_ROOM {
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_REFUSE_ENTER_ROOM, 0xda);
|
||||
|
||||
struct PACKET_ZC_DESTROY_ROOM {
|
||||
int16 packetType;
|
||||
uint32 chatId;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_DESTROY_ROOM, 0xd8);
|
||||
|
||||
struct PACKET_ZC_ENTER_ROOM_sub{
|
||||
uint32 flag;
|
||||
char name[NAME_LENGTH];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct PACKET_ZC_ENTER_ROOM{
|
||||
uint16 packetType;
|
||||
uint16 packetSize;
|
||||
uint32 chatId;
|
||||
PACKET_ZC_ENTER_ROOM_sub members[];
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_ENTER_ROOM, 0xdb);
|
||||
|
||||
struct PACKET_ZC_NPC_SHOWEFST_UPDATE {
|
||||
int16 packetType;
|
||||
uint32 gid;
|
||||
@ -1118,26 +976,12 @@ struct PACKET_ZC_SKILL_DISAPPEAR {
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120);
|
||||
|
||||
struct PACKET_ZC_SKILLINFO_DELETE {
|
||||
uint16 packetType;
|
||||
uint16 skillID;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_SKILLINFO_DELETE, 0x441);
|
||||
|
||||
struct PACKET_ZC_SKILL_UPDATE {
|
||||
int16 packetType;
|
||||
uint32 GID;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_SKILL_UPDATE, 0x1ac);
|
||||
|
||||
struct PACKET_ZC_HIGHJUMP{
|
||||
uint16 packetType;
|
||||
uint32 srcId;
|
||||
uint16 x;
|
||||
uint16 y;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_HIGHJUMP, 0x01ff);
|
||||
|
||||
#if PACKETVER >= 20141022
|
||||
struct PACKET_ZC_RECOVERY {
|
||||
int16 packetType;
|
||||
@ -1317,51 +1161,6 @@ struct PACKET_ZC_EL_PAR_CHANGE {
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_EL_PAR_CHANGE, 0x81e);
|
||||
|
||||
#if PACKETVER >= 20131223
|
||||
struct PACKET_ZC_NOTIFY_ACT{
|
||||
int16 packetType;
|
||||
int32 srcID;
|
||||
int32 targetID;
|
||||
int32 serverTick;
|
||||
int32 srcSpeed;
|
||||
int32 dmgSpeed;
|
||||
int32 damage;
|
||||
int8 isSPDamage;
|
||||
uint16 div;
|
||||
uint8 type;
|
||||
int32 damage2;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8c8);
|
||||
#elif PACKETVER >= 20071113
|
||||
struct PACKET_ZC_NOTIFY_ACT{
|
||||
int16 packetType;
|
||||
int32 srcID;
|
||||
int32 targetID;
|
||||
int32 serverTick;
|
||||
int32 srcSpeed;
|
||||
int32 dmgSpeed;
|
||||
int32 damage;
|
||||
uint16 div;
|
||||
uint8 type;
|
||||
int32 damage2;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x2e1);
|
||||
#else
|
||||
struct PACKET_ZC_NOTIFY_ACT{
|
||||
int16 packetType;
|
||||
int32 srcID;
|
||||
int32 targetID;
|
||||
int32 serverTick;
|
||||
int32 srcSpeed;
|
||||
int32 dmgSpeed;
|
||||
int16 damage;
|
||||
uint16 div;
|
||||
uint8 type;
|
||||
int16 damage2;
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a);
|
||||
#endif
|
||||
|
||||
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
|
||||
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
|
||||
#pragma pack( pop )
|
||||
@ -1407,12 +1206,6 @@ DEFINE_PACKET_HEADER(CZ_REQ_STYLE_CHANGE2, 0xafc)
|
||||
DEFINE_PACKET_HEADER(ZC_REMOVE_EFFECT, 0x0b0d)
|
||||
DEFINE_PACKET_HEADER(ZC_FEED_MER, 0x22f)
|
||||
DEFINE_PACKET_HEADER(ZC_FEED_PET, 0x1a3)
|
||||
#if PACKETVER_MAIN_NUM >= 20170502 || PACKETVER_RE_NUM >= 20170419 || defined(PACKETVER_ZERO)
|
||||
DEFINE_PACKET_HEADER(ZC_WARPLIST, 0xabe)
|
||||
#else
|
||||
DEFINE_PACKET_HEADER(ZC_WARPLIST, 0x11c)
|
||||
#endif
|
||||
|
||||
|
||||
const int16 MAX_INVENTORY_ITEM_PACKET_NORMAL = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_normal ) - ( sizeof( struct NORMALITEM_INFO ) * MAX_ITEMLIST) ) ) / sizeof( struct NORMALITEM_INFO ) );
|
||||
const int16 MAX_INVENTORY_ITEM_PACKET_EQUIP = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_equip ) - ( sizeof( struct EQUIPITEM_INFO ) * MAX_ITEMLIST ) ) ) / sizeof( struct EQUIPITEM_INFO ) );
|
||||
|
@ -4998,17 +4998,15 @@ struct PACKET_ZC_POSITION_ID_NAME_INFO {
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
|
||||
|
||||
struct PACKET_ZC_POSITION_INFO_sub {
|
||||
struct PACKET_ZC_POSITION_INFO {
|
||||
int16 PacketType;
|
||||
int16 PacketLength;
|
||||
struct {
|
||||
int positionID;
|
||||
int right;
|
||||
int ranking;
|
||||
int payRate;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct PACKET_ZC_POSITION_INFO {
|
||||
int16 PacketType;
|
||||
int16 PacketLength;
|
||||
struct PACKET_ZC_POSITION_INFO_sub posInfo[];
|
||||
} posInfo[MAX_GUILDPOSITION];
|
||||
} __attribute__((packed));
|
||||
DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160);
|
||||
|
||||
|
@ -446,7 +446,7 @@ bool party_invite( map_session_data& sd, map_session_data *tsd ){
|
||||
return false;
|
||||
}
|
||||
|
||||
if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){
|
||||
if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){
|
||||
clif_party_invite_reply( sd, tsd->status.name, PARTY_REPLY_JOIN_OTHER_PARTY );
|
||||
return false;
|
||||
}
|
||||
|
@ -1801,35 +1801,13 @@ uint8 pc_isequip(map_session_data *sd,int n)
|
||||
|
||||
if(item == nullptr)
|
||||
return ITEM_EQUIP_ACK_FAIL;
|
||||
|
||||
if (sd->sc.count && sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SUPERNOVICE) {
|
||||
//Spirit of Super Novice equip bonuses. [Skotlex]
|
||||
if (sd->status.base_level >= 90 && item->equip & EQP_HELM)
|
||||
return ITEM_EQUIP_ACK_OK; //Can equip all helms
|
||||
|
||||
if (sd->status.base_level >= 96 && item->equip & EQP_ARMS && item->type == IT_WEAPON && item->weapon_level == 4)
|
||||
switch (item->subtype) { //In weapons, the look determines type of weapon.
|
||||
case W_DAGGER: //All level 4 - Daggers
|
||||
case W_1HSWORD: //All level 4 - 1H Swords
|
||||
case W_1HAXE: //All level 4 - 1H Axes
|
||||
case W_MACE: //All level 4 - 1H Maces
|
||||
case W_STAFF: //All level 4 - 1H Staves
|
||||
case W_2HSTAFF: //All level 4 - 2H Staves
|
||||
return ITEM_EQUIP_ACK_OK;
|
||||
}
|
||||
}
|
||||
|
||||
if(item->elv && sd->status.base_level < static_cast<unsigned int>(item->elv))
|
||||
if(item->elv && sd->status.base_level < (unsigned int)item->elv)
|
||||
return ITEM_EQUIP_ACK_FAILLEVEL;
|
||||
if(item->elvmax && sd->status.base_level > static_cast<unsigned int>(item->elvmax))
|
||||
if(item->elvmax && sd->status.base_level > (unsigned int)item->elvmax)
|
||||
return ITEM_EQUIP_ACK_FAILLEVEL;
|
||||
if(item->sex != SEX_BOTH && sd->status.sex != item->sex)
|
||||
return ITEM_EQUIP_ACK_FAIL;
|
||||
|
||||
// Broken equip
|
||||
if (sd->inventory.u.items_inventory[n].attribute == 1)
|
||||
return ITEM_EQUIP_ACK_FAIL;
|
||||
|
||||
//fail to equip if item is restricted
|
||||
if (!battle_config.allow_equip_restricted_item && itemdb_isNoEquip(item, sd->bl.m))
|
||||
return ITEM_EQUIP_ACK_FAIL;
|
||||
@ -1896,6 +1874,23 @@ uint8 pc_isequip(map_session_data *sd,int n)
|
||||
return ITEM_EQUIP_ACK_FAIL;
|
||||
if(item->equip && (sd->sc.getSCE(SC_KYOUGAKU) || sd->sc.getSCE(SC_SUHIDE)))
|
||||
return ITEM_EQUIP_ACK_FAIL;
|
||||
|
||||
if (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SUPERNOVICE) {
|
||||
//Spirit of Super Novice equip bonuses. [Skotlex]
|
||||
if (sd->status.base_level > 90 && item->equip & EQP_HELM)
|
||||
return ITEM_EQUIP_ACK_OK; //Can equip all helms
|
||||
|
||||
if (sd->status.base_level > 96 && item->equip & EQP_ARMS && item->type == IT_WEAPON && item->weapon_level == 4)
|
||||
switch(item->subtype) { //In weapons, the look determines type of weapon.
|
||||
case W_DAGGER: //All level 4 - Daggers
|
||||
case W_1HSWORD: //All level 4 - 1H Swords
|
||||
case W_1HAXE: //All level 4 - 1H Axes
|
||||
case W_MACE: //All level 4 - 1H Maces
|
||||
case W_STAFF: //All level 4 - 1H Staves
|
||||
case W_2HSTAFF: //All level 4 - 2H Staves
|
||||
return ITEM_EQUIP_ACK_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Not equipable by class. [Skotlex]
|
||||
@ -5345,7 +5340,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_
|
||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||
if (level == 0) { //Remove skill.
|
||||
sd->status.skill[idx].id = 0;
|
||||
clif_deleteskill(*sd,skill_id);
|
||||
clif_deleteskill(sd,skill_id);
|
||||
} else
|
||||
clif_addskill(sd,skill_id);
|
||||
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
||||
@ -5380,7 +5375,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_
|
||||
sd->status.skill[idx].flag = SKILL_FLAG_PERM_GRANTED;
|
||||
if (level == 0) { //Remove skill.
|
||||
sd->status.skill[idx].id = 0;
|
||||
clif_deleteskill(*sd,skill_id);
|
||||
clif_deleteskill(sd,skill_id);
|
||||
} else
|
||||
clif_addskill(sd,skill_id);
|
||||
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
||||
@ -5462,7 +5457,7 @@ bool pc_skill_plagiarism_reset(map_session_data &sd, uint8 type)
|
||||
sd.status.skill[idx].id = 0;
|
||||
sd.status.skill[idx].lv = 0;
|
||||
sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||
clif_deleteskill(sd, skill_id);
|
||||
clif_deleteskill(&sd, skill_id);
|
||||
|
||||
if (type == 1) {
|
||||
sd.cloneskill_idx = 0;
|
||||
@ -6133,7 +6128,7 @@ bool pc_takeitem(map_session_data *sd,struct flooritem_data *fitem)
|
||||
|
||||
//Display pickup animation.
|
||||
pc_stop_attack(sd);
|
||||
clif_takeitem(sd->bl,fitem->bl);
|
||||
clif_takeitem(&sd->bl,&fitem->bl);
|
||||
|
||||
if (fitem->mob_id &&
|
||||
(itemdb_search(fitem->item.nameid))->flag.broadcast &&
|
||||
@ -6680,6 +6675,7 @@ bool pc_steal_item(map_session_data *sd,struct block_list *bl, uint16 skill_lv)
|
||||
t_itemid itemid;
|
||||
double rate;
|
||||
unsigned char flag = 0;
|
||||
struct status_data *sd_status, *md_status;
|
||||
struct mob_data *md;
|
||||
|
||||
if(!sd || !bl || bl->type!=BL_MOB)
|
||||
@ -6690,11 +6686,11 @@ bool pc_steal_item(map_session_data *sd,struct block_list *bl, uint16 skill_lv)
|
||||
if(md->state.steal_flag == UCHAR_MAX || ( md->sc.opt1 && md->sc.opt1 != OPT1_BURNING ) ) //already stolen from / status change check
|
||||
return false;
|
||||
|
||||
status_data* sd_status = status_get_status_data(sd->bl);
|
||||
status_data* md_status = status_get_status_data(*bl);
|
||||
sd_status= status_get_status_data(&sd->bl);
|
||||
md_status= status_get_status_data(bl);
|
||||
|
||||
if (md->master_id || status_has_mode(md_status, MD_STATUSIMMUNE) || util::vector_exists(status_get_race2(&md->bl), RC2_TREASURE) ||
|
||||
map_getmapflag(bl->m, MF_NOMOBLOOT) || // check noloot map flag [Lorky]
|
||||
map_getmapflag(bl->m, MF_NOMOBLOOT) || md->get_bosstype() == BOSSTYPE_NONE && map_getmapflag(bl->m, MF_NOLOOTNORMALMOB) || // check noloot map flag [Lorky]
|
||||
(battle_config.skill_steal_max_tries && //Reached limit of steal attempts. [Lupus]
|
||||
md->state.steal_flag++ >= battle_config.skill_steal_max_tries)
|
||||
) { //Can't steal from
|
||||
@ -8239,7 +8235,7 @@ static void pc_calcexp(map_session_data *sd, t_exp *base_exp, t_exp *job_exp, st
|
||||
int bonus = 0, vip_bonus_base = 0, vip_bonus_job = 0;
|
||||
|
||||
if (src) {
|
||||
status_data* status = status_get_status_data(*src);
|
||||
struct status_data *status = status_get_status_data(src);
|
||||
|
||||
if( sd->indexed_bonus.expaddrace[status->race] )
|
||||
bonus += sd->indexed_bonus.expaddrace[status->race];
|
||||
@ -10053,7 +10049,7 @@ bool pc_revive_item(map_session_data *sd) {
|
||||
else
|
||||
pc_delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME);
|
||||
|
||||
clif_skill_nodamage(&sd->bl, sd->bl, ALL_RESURRECTION, 4);
|
||||
clif_skill_nodamage(&sd->bl, &sd->bl, ALL_RESURRECTION, 4, 1);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -11921,7 +11917,7 @@ bool pc_equipitem(map_session_data *sd,short n,int req_pos,bool equipswitch)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(pos&req_pos) || sd->inventory.u.items_inventory[n].equip != 0) {
|
||||
if (!(pos&req_pos) || sd->inventory.u.items_inventory[n].equip != 0 || sd->inventory.u.items_inventory[n].attribute==1 ) { // [Valaris]
|
||||
if( equipswitch ){
|
||||
clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
|
||||
}else{
|
||||
@ -12262,18 +12258,18 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
|
||||
nullpo_retr(false,sd);
|
||||
|
||||
if (n < 0 || n >= MAX_INVENTORY) {
|
||||
clif_unequipitemack(*sd,0,0,false);
|
||||
clif_unequipitemack(sd,0,0,0);
|
||||
return false;
|
||||
}
|
||||
if (!(pos = sd->inventory.u.items_inventory[n].equip)) {
|
||||
clif_unequipitemack(*sd,n,0,false);
|
||||
clif_unequipitemack(sd,n,0,0);
|
||||
return false; //Nothing to unequip
|
||||
}
|
||||
// status change that makes player cannot unequip equipment
|
||||
if (!(flag&2) && sd->sc.count &&( sd->sc.cant.unequip ||
|
||||
(sd->sc.getSCE(SC_PYROCLASTIC) && sd->inventory_data[n]->type == IT_WEAPON))) // can't switch weapon
|
||||
{
|
||||
clif_unequipitemack(*sd,n,0,false);
|
||||
clif_unequipitemack(sd,n,0,0);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -12312,7 +12308,7 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
|
||||
if(pos & EQP_SHOES)
|
||||
clif_changelook(&sd->bl,LOOK_SHOES,0);
|
||||
|
||||
clif_unequipitemack(*sd,n,pos,true);
|
||||
clif_unequipitemack(sd,n,pos,1);
|
||||
pc_set_costume_view(sd);
|
||||
|
||||
status_db.removeByStatusFlag(&sd->bl, { SCF_REMOVEONUNEQUIP });
|
||||
@ -12333,7 +12329,7 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) {
|
||||
|
||||
if (idx >= 0) {
|
||||
sd->equip_index[EQI_AMMO] = -1;
|
||||
clif_unequipitemack(*sd, idx, sd->inventory.u.items_inventory[idx].equip, true);
|
||||
clif_unequipitemack(sd, idx, sd->inventory.u.items_inventory[idx].equip, 1);
|
||||
pc_unequipitem_sub(sd, idx, 0);
|
||||
}
|
||||
}
|
||||
@ -12974,7 +12970,7 @@ bool pc_setstand(map_session_data *sd, bool force){
|
||||
|
||||
status_change_end(&sd->bl, SC_TENSIONRELAX);
|
||||
clif_status_load(&sd->bl,EFST_SIT,0);
|
||||
clif_standing(sd->bl); //Inform area PC is standing
|
||||
clif_standing(&sd->bl); //Inform area PC is standing
|
||||
//Reset sitting tick.
|
||||
sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0;
|
||||
if( pc_isdead( sd ) ){
|
||||
|
@ -706,11 +706,7 @@ public:
|
||||
int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united.
|
||||
int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign.
|
||||
|
||||
struct{
|
||||
uint32 id;
|
||||
unsigned int lv;
|
||||
}trade_partner;
|
||||
|
||||
int trade_partner;
|
||||
struct s_deal {
|
||||
struct s_item {
|
||||
short index, amount;
|
||||
@ -1236,7 +1232,7 @@ enum e_mado_type : uint16 {
|
||||
#define pc_rightside_def(sd) ((sd)->battle_status.def)
|
||||
#define pc_leftside_mdef(sd) ((sd)->battle_status.mdef2)
|
||||
#define pc_rightside_mdef(sd) ((sd)->battle_status.mdef)
|
||||
#define pc_leftside_matk(sd) (status_base_matk_min(&(sd)->bl, status_get_status_data((sd)->bl), (sd)->status.base_level))
|
||||
#define pc_leftside_matk(sd) (status_base_matk_min(&(sd)->bl, status_get_status_data(&(sd)->bl), (sd)->status.base_level))
|
||||
#define pc_rightside_matk(sd) ((sd)->battle_status.rhw.matk+(sd)->battle_status.lhw.matk+(sd)->bonus.ematk)
|
||||
#else
|
||||
#define pc_leftside_atk(sd) ((sd)->battle_status.batk + (sd)->battle_status.rhw.atk + (sd)->battle_status.lhw.atk)
|
||||
|
@ -714,7 +714,7 @@ int pet_attackskill(struct pet_data *pd, int target_id)
|
||||
|
||||
bl = map_id2bl(target_id);
|
||||
|
||||
if(bl == nullptr || pd->bl.m != bl->m || bl->prev == nullptr || status_isdead(*bl) ||
|
||||
if(bl == nullptr || pd->bl.m != bl->m || bl->prev == nullptr || status_isdead(bl) ||
|
||||
!check_distance_bl(&pd->bl, bl, pd->db->range3))
|
||||
return 0;
|
||||
|
||||
@ -1192,7 +1192,7 @@ int pet_select_egg(map_session_data *sd,short egg_index)
|
||||
if(egg_index < 0 || egg_index >= MAX_INVENTORY)
|
||||
return 0; //Forged packet!
|
||||
|
||||
if(sd->state.trading) //The player have trade in progress.
|
||||
if(sd->trade_partner) //The player have trade in progress.
|
||||
return 0;
|
||||
|
||||
std::shared_ptr<s_pet_db> pet = pet_db_search(sd->inventory.u.items_inventory[egg_index].nameid, PET_EGG);
|
||||
@ -1791,7 +1791,7 @@ static int pet_ai_sub_hard(struct pet_data *pd, map_session_data *sd, t_tick tic
|
||||
if (pd->target_id) {
|
||||
target = map_id2bl(pd->target_id);
|
||||
|
||||
if (!target || pd->bl.m != target->m || status_isdead(*target) ||
|
||||
if (!target || pd->bl.m != target->m || status_isdead(target) ||
|
||||
!check_distance_bl(&pd->bl, target, pd->db->range3)) {
|
||||
target = nullptr;
|
||||
pet_unlocktarget(pd);
|
||||
@ -2073,7 +2073,7 @@ TIMER_FUNC(pet_recovery_timer){
|
||||
if(sd->sc.getSCE(pd->recovery->type)) {
|
||||
//Display a heal animation?
|
||||
//Detoxify is chosen for now.
|
||||
clif_skill_nodamage(&pd->bl,sd->bl,TF_DETOXIFY,1);
|
||||
clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1);
|
||||
status_change_end(&sd->bl, pd->recovery->type);
|
||||
clif_emotion(&pd->bl, ET_OK);
|
||||
}
|
||||
@ -2090,6 +2090,7 @@ TIMER_FUNC(pet_recovery_timer){
|
||||
*/
|
||||
TIMER_FUNC(pet_heal_timer){
|
||||
map_session_data *sd = map_id2sd(id);
|
||||
struct status_data *status;
|
||||
struct pet_data *pd;
|
||||
unsigned int rate = 100;
|
||||
|
||||
@ -2103,7 +2104,7 @@ TIMER_FUNC(pet_heal_timer){
|
||||
return 0;
|
||||
}
|
||||
|
||||
status_data* status = status_get_status_data(sd->bl);
|
||||
status = status_get_status_data(&sd->bl);
|
||||
|
||||
if(pc_isdead(sd) ||
|
||||
(rate = get_percentage(status->sp, status->max_sp)) > pd->s_skill->sp ||
|
||||
@ -2116,7 +2117,7 @@ TIMER_FUNC(pet_heal_timer){
|
||||
|
||||
pet_stop_attack(pd);
|
||||
pet_stop_walking(pd,1);
|
||||
clif_skill_nodamage(&pd->bl,sd->bl,AL_HEAL,pd->s_skill->lv);
|
||||
clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->s_skill->lv,1);
|
||||
status_heal(&sd->bl, pd->s_skill->lv,0, 0);
|
||||
pd->s_skill->timer = add_timer(tick+pd->s_skill->delay*1000,pet_heal_timer,sd->bl.id,0);
|
||||
return 0;
|
||||
@ -2133,6 +2134,7 @@ TIMER_FUNC(pet_heal_timer){
|
||||
TIMER_FUNC(pet_skill_support_timer){
|
||||
map_session_data *sd = map_id2sd(id);
|
||||
struct pet_data *pd;
|
||||
struct status_data *status;
|
||||
short rate = 100;
|
||||
|
||||
if(sd == nullptr || sd->pd == nullptr || sd->pd->s_skill == nullptr)
|
||||
@ -2145,7 +2147,7 @@ TIMER_FUNC(pet_skill_support_timer){
|
||||
return 0;
|
||||
}
|
||||
|
||||
status_data* status = status_get_status_data(sd->bl);
|
||||
status = status_get_status_data(&sd->bl);
|
||||
|
||||
if (DIFF_TICK(pd->ud.canact_tick, tick) > 0) {
|
||||
//Wait until the pet can act again.
|
||||
|
@ -242,7 +242,7 @@ uint64 QuestDatabase::parseBodyNode(const ryml::NodeRef& node) {
|
||||
}
|
||||
|
||||
if (constant < SZ_SMALL || constant > SZ_ALL) {
|
||||
this->invalidWarning(targetNode["Size"], "Unsupported size %s, skipping.\n", size_.c_str());
|
||||
this->invalidWarning(targetNode["size"], "Unsupported size %s, skipping.\n", size_.c_str());
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -385,7 +385,7 @@ uint64 QuestDatabase::parseBodyNode(const ryml::NodeRef& node) {
|
||||
}
|
||||
|
||||
if (!this->nodeExists(dropNode, "Rate")) {
|
||||
this->invalidWarning(dropNode["Rate"], "Drops has no Rate value specified, skipping.\n");
|
||||
this->invalidWarning(dropNode["Item"], "Drops has no Rate value specified, skipping.\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -15343,7 +15343,7 @@ static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16
|
||||
clif_skill_poseffect(&bl, skill_id, skill_lv, x, y, gettick());
|
||||
break;
|
||||
case CAST_NODAMAGE:
|
||||
clif_skill_nodamage(&bl, bl, skill_id, skill_lv);
|
||||
clif_skill_nodamage(&bl, &bl, skill_id, skill_lv, 1);
|
||||
break;
|
||||
case CAST_DAMAGE:
|
||||
clif_skill_damage(&bl, &bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
|
||||
@ -15389,7 +15389,7 @@ BUILDIN_FUNC(skilleffect)
|
||||
|
||||
if (pc_issit(sd) && pc_setstand(sd, false)) {
|
||||
skill_sit(sd, 0);
|
||||
clif_standing(sd->bl);
|
||||
clif_standing(&sd->bl);
|
||||
}
|
||||
}
|
||||
|
||||
@ -19910,7 +19910,7 @@ BUILDIN_FUNC(unitattack)
|
||||
case BL_PC: {
|
||||
map_session_data* sd = (map_session_data*)unit_bl;
|
||||
|
||||
clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? DMG_REPEAT : DMG_NORMAL, target_bl->id, gettick() );
|
||||
clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? 0x07 : 0x00, target_bl->id, gettick() );
|
||||
script_pushint(st, sd->ud.target == target_bl->id);
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
@ -23150,7 +23150,7 @@ BUILDIN_FUNC(sit)
|
||||
if( !pc_issit(sd) ) {
|
||||
pc_setsit(sd);
|
||||
skill_sit(sd, 1);
|
||||
clif_sitting(sd->bl);
|
||||
clif_sitting(&sd->bl);
|
||||
}
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
@ -23167,7 +23167,7 @@ BUILDIN_FUNC(stand)
|
||||
|
||||
if( pc_issit(sd) && pc_setstand(sd, false)) {
|
||||
skill_sit(sd, 0);
|
||||
clif_standing(sd->bl);
|
||||
clif_standing(&sd->bl);
|
||||
}
|
||||
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
@ -27412,6 +27412,27 @@ BUILDIN_FUNC(permission_add)
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
|
||||
BUILDIN_FUNC(unitisforcewalk)
|
||||
{
|
||||
block_list *bl = nullptr;
|
||||
bool force_walk = false;
|
||||
|
||||
if (script_getnum(st, 2))
|
||||
bl = map_id2bl(script_getnum(st,2));
|
||||
else
|
||||
bl = map_id2bl(st->rid);
|
||||
|
||||
if (bl != nullptr) {
|
||||
struct unit_data *ud = unit_bl2ud(bl);
|
||||
|
||||
if (ud != nullptr)
|
||||
force_walk = (ud->walktimer == INVALID_TIMER && ud->state.force_walk);
|
||||
}
|
||||
script_pushint(st, force_walk);
|
||||
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
|
||||
#include <custom/script.inc>
|
||||
|
||||
// declarations that were supposed to be exported from npc_chat.cpp
|
||||
@ -28182,6 +28203,8 @@ struct script_function buildin_func[] = {
|
||||
BUILDIN_DEF(permission_add, "i?"),
|
||||
BUILDIN_DEF2(permission_add, "permission_remove", "i?"),
|
||||
|
||||
BUILDIN_DEF(unitisforcewalk, "i"),
|
||||
|
||||
#include <custom/script_def.inc>
|
||||
|
||||
{nullptr,nullptr,nullptr},
|
||||
|
@ -2128,21 +2128,7 @@ enum e_hat_effects : int16{
|
||||
HAT_EF_C_BABY_GLOOM,
|
||||
HAT_EF_WINTERNIGHTBELLS,
|
||||
HAT_EF_NIGHTSKYOFRUTIE,
|
||||
FOOTPRINT_EF_BASE,
|
||||
FOOTPRINT_EF_STR_BASE,
|
||||
FOOTPRINT_EF_PURPLESTAR,
|
||||
FOOTPRINT_EF_YELLOWSTAR,
|
||||
FOOTPRINT_EF_REDSTAR,
|
||||
HAT_EF_RAINBOW_POISON_MASTER,
|
||||
HAT_EF_C_ANCIENT_RUNE,
|
||||
HAT_EF_C_DRAGON_GREEN_AURA,
|
||||
HAT_EF_C_DRAGON_RED_AURA,
|
||||
HAT_EF_C_DRAGON_YELLOW_AURA,
|
||||
HAT_EF_INTERDIMENSIONAL_RIFT,
|
||||
HAT_EF_C_CLB_SS_LL,
|
||||
HAT_EF_VACATION,
|
||||
HAT_EF_C_FH_LOSTWING,
|
||||
FOOTPRINT_EF_DOGFOOT,
|
||||
HAT_EF_MAX
|
||||
};
|
||||
|
||||
|
@ -539,6 +539,8 @@
|
||||
export_constant(MF_NODYNAMICNPC);
|
||||
export_constant(MF_NOBANK);
|
||||
export_constant(MF_SPECIALPOPUP);
|
||||
export_constant(MF_NOLOOTNORMALMOB);
|
||||
export_constant(MF_NO_NPC_SELFDESTRUCTION_ON_ALL);
|
||||
|
||||
/* setcell types */
|
||||
export_constant(CELL_WALKABLE);
|
||||
@ -3203,7 +3205,7 @@
|
||||
export_constant(EFST_SPELLFIST);
|
||||
export_constant(EFST_NETHERWORLD);
|
||||
export_constant(EFST_SIREN);
|
||||
export_constant(EFST_DEEP_SLEEP);
|
||||
export_constant(EFST_HANDICAPSTATE_DEEP_SLEEP);
|
||||
export_constant(EFST_SIRCLEOFNATURE);
|
||||
export_constant(EFST_COLD);
|
||||
export_constant(EFST_GLOOMYDAY);
|
||||
@ -3266,7 +3268,7 @@
|
||||
export_constant(EFST_DROCERA_HERB_STEAMED);
|
||||
export_constant(EFST_PUTTI_TAILS_NOODLES);
|
||||
export_constant(EFST_BANANA_BOMB);
|
||||
export_constant(EFST_SUMMON_AGNI);
|
||||
export_constant(XXX_EFST_SM_ELEMENTAL);
|
||||
export_constant(EFST_SPELLBOOK4);
|
||||
export_constant(EFST_SPELLBOOK5);
|
||||
export_constant(EFST_SPELLBOOK6);
|
||||
@ -3400,8 +3402,8 @@
|
||||
export_constant(EFST_SET_NUM_MDEF);
|
||||
export_constant(EFST_SET_PER_DEF);
|
||||
export_constant(EFST_SET_PER_MDEF);
|
||||
export_constant(EFST_PARTYBOOKING_SEARCH_DEALY);
|
||||
export_constant(EFST_PARTYBOOKING_REGISTER_DEALY);
|
||||
export_constant(EFST_PARTYBOOKING_SEARCH_DELAY);
|
||||
export_constant(EFST_PARTYBOOKING_REGISTER_DELAY);
|
||||
export_constant(EFST_PERIOD_TIME_CHECK_DETECT_SKILL);
|
||||
export_constant(EFST_KO_JYUMONJIKIRI);
|
||||
export_constant(EFST_MEIKYOUSISUI);
|
||||
@ -3442,7 +3444,7 @@
|
||||
export_constant(EFST_GLASTHEIM_STATE);
|
||||
export_constant(EFST_GLASTHEIM_ITEMDEF);
|
||||
export_constant(EFST_GLASTHEIM_HPSP);
|
||||
export_constant(EFST_HOMUN_SKILL_POSTDELAY);
|
||||
export_constant(EFST_FOLLOWER_NPC_SKILL_POSTDELAY);
|
||||
export_constant(EFST_ALMIGHTY);
|
||||
export_constant(EFST_GVG_GIANT);
|
||||
export_constant(EFST_GVG_GOLEM);
|
||||
@ -3468,7 +3470,7 @@
|
||||
export_constant(EFST_QUEST_BUFF3);
|
||||
export_constant(EFST_REUSE_LIMIT_RECALL);
|
||||
export_constant(EFST_SAVEPOSITION);
|
||||
export_constant(EFST_HANDICAPSTATE_ICEEXPLO);
|
||||
export_constant(EFST_NPC_ICEEXPLO);
|
||||
export_constant(EFST_FENRIR_CARD);
|
||||
export_constant(EFST_REUSE_LIMIT_ASPD_POTION);
|
||||
export_constant(EFST_MAXPAIN);
|
||||
@ -3572,7 +3574,7 @@
|
||||
export_constant(EFST_GC_POISONINGWEAPON_OPERATOR);
|
||||
export_constant(EFST_WS_WEAPONREFINE_OPERATOR);
|
||||
export_constant(EFST_BS_REPAIRWEAPON_OPERATOR);
|
||||
export_constant(EFST_GET_MAILBOX);
|
||||
export_constant(EFST_UNREADMAIL_CHECK);
|
||||
export_constant(EFST_JUMPINGCLAN);
|
||||
export_constant(EFST_JP_OTP);
|
||||
export_constant(EFST_HANDICAPTOLERANCE_LEVELGAP);
|
||||
@ -3891,13 +3893,13 @@
|
||||
export_constant(EFST_PERIOD_USE_WORLDMAP);
|
||||
export_constant(EFST_MISTY_FROST);
|
||||
export_constant(EFST_MAGIC_POISON);
|
||||
export_constant(EFST_MOVE_AGIT);
|
||||
export_constant(EFST_KAUTE);
|
||||
export_constant(EFST_REUSE_JPNONLY_LIMIT_I);
|
||||
export_constant(EFST_REUSE_JPNONLY_LIMIT_J);
|
||||
export_constant(EFST_REUSE_JPNONLY_LIMIT_K);
|
||||
export_constant(EFST_JPNONLY_TACTICS);
|
||||
export_constant(EFST_PRISON);
|
||||
export_constant(EFST_MADOGEAR_TYPE);
|
||||
export_constant(EFST_MADOGEAR);
|
||||
export_constant(EFST_DEADLY_DEFEASANCE);
|
||||
export_constant(EFST_CLIMAX_DES_HU);
|
||||
export_constant(EFST_CLIMAX);
|
||||
@ -4172,44 +4174,6 @@
|
||||
export_constant(EFST_C_RATE_PLUS);
|
||||
export_constant(EFST_RESIST_PLUS);
|
||||
export_constant(EFST_PVP_DUN_BUFF);
|
||||
export_constant(EFST_TARGET_MARKER);
|
||||
export_constant(EFST_BLOCK_SEAL);
|
||||
export_constant(EFST_FROST_STORM);
|
||||
export_constant(EFST_GROGGY);
|
||||
export_constant(EFST_WARM_SHIELD);
|
||||
export_constant(EFST_CONTENTS_1);
|
||||
export_constant(EFST_CONTENTS_2);
|
||||
export_constant(EFST_CONTENTS_3);
|
||||
export_constant(EFST_CONTENTS_4);
|
||||
export_constant(EFST_CONTENTS_5);
|
||||
export_constant(EFST_CONTENTS_6);
|
||||
export_constant(EFST_CONTENTS_7);
|
||||
export_constant(EFST_CONTENTS_8);
|
||||
export_constant(EFST_CONTENTS_9);
|
||||
export_constant(EFST_CONTENTS_10);
|
||||
export_constant(EFST_CONTENTS_11);
|
||||
export_constant(EFST_CONTENTS_12);
|
||||
export_constant(EFST_CONTENTS_13);
|
||||
export_constant(EFST_CONTENTS_14);
|
||||
export_constant(EFST_CONTENTS_15);
|
||||
export_constant(EFST_CONTENTS_16);
|
||||
export_constant(EFST_CONTENTS_17);
|
||||
export_constant(EFST_CONTENTS_18);
|
||||
export_constant(EFST_CONTENTS_19);
|
||||
export_constant(EFST_CONTENTS_20);
|
||||
export_constant(EFST_CONTENTS_21);
|
||||
export_constant(EFST_CONTENTS_22);
|
||||
export_constant(EFST_CONTENTS_23);
|
||||
export_constant(EFST_CONTENTS_24);
|
||||
export_constant(EFST_CONTENTS_25);
|
||||
export_constant(EFST_C_BUFF_1);
|
||||
export_constant(EFST_C_BUFF_2);
|
||||
export_constant(EFST_CHASING);
|
||||
export_constant(EFST_MYSTERY_POWDER);
|
||||
export_constant(EFST_FIRE_CHARM_POWER);
|
||||
export_constant(EFST_WATER_CHARM_POWER);
|
||||
export_constant(EFST_WIND_CHARM_POWER);
|
||||
export_constant(EFST_GROUND_CHARM_POWER);
|
||||
/// @APIHOOK_END
|
||||
/// Do not modify code above this, since it will be automatically generated by the API again
|
||||
export_constant(EFST_MAX);
|
||||
@ -7847,6 +7811,7 @@
|
||||
export_constant(IG_COSTUMEMILEPACK_35_1);
|
||||
export_constant(IG_COSTUMEMILEPACK_35_2);
|
||||
export_constant(IG_COSTUMEMILEPACK_35_3);
|
||||
export_constant(IG_D_GW_EXTRACTOR);
|
||||
|
||||
/* unit stop walking */
|
||||
export_constant(USW_NONE);
|
||||
@ -9186,11 +9151,6 @@
|
||||
export_constant_npc(JT_4_EP21_HOWELL_S);
|
||||
export_constant_npc(JT_4_EP21_TAN_S);
|
||||
export_constant_npc(JT_4_M_VACATION_MARAM);
|
||||
export_constant_npc(JT_4_CLB_SS_FC);
|
||||
export_constant_npc(JT_4_CLB_SS_TZ);
|
||||
export_constant_npc(JT_4_CLB_SS_AJ);
|
||||
export_constant_npc(JT_4_CLB_SS_LK);
|
||||
export_constant_npc(JT_4_SMART_ANDRE);
|
||||
export_constant_npc(JT_ROZ_MQ_XAVIER);
|
||||
export_constant_npc(JT_ROZ_MQ_MOCLORD);
|
||||
export_constant_npc(JT_ROZ_MQ_SKULD);
|
||||
@ -10555,21 +10515,7 @@
|
||||
export_constant(HAT_EF_C_BABY_GLOOM);
|
||||
export_constant(HAT_EF_WINTERNIGHTBELLS);
|
||||
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
|
||||
export_constant(FOOTPRINT_EF_BASE);
|
||||
export_constant(FOOTPRINT_EF_STR_BASE);
|
||||
export_constant(FOOTPRINT_EF_PURPLESTAR);
|
||||
export_constant(FOOTPRINT_EF_YELLOWSTAR);
|
||||
export_constant(FOOTPRINT_EF_REDSTAR);
|
||||
export_constant(HAT_EF_RAINBOW_POISON_MASTER);
|
||||
export_constant(HAT_EF_C_ANCIENT_RUNE);
|
||||
export_constant(HAT_EF_C_DRAGON_GREEN_AURA);
|
||||
export_constant(HAT_EF_C_DRAGON_RED_AURA);
|
||||
export_constant(HAT_EF_C_DRAGON_YELLOW_AURA);
|
||||
export_constant(HAT_EF_INTERDIMENSIONAL_RIFT);
|
||||
export_constant(HAT_EF_C_CLB_SS_LL);
|
||||
export_constant(HAT_EF_VACATION);
|
||||
export_constant(HAT_EF_C_FH_LOSTWING);
|
||||
export_constant(FOOTPRINT_EF_DOGFOOT);
|
||||
|
||||
/* pet catch */
|
||||
export_constant(PET_CATCH_UNIVERSAL);
|
||||
|
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_CURSE_OF_RED_CUBE,
|
||||
NPC_CURSE_OF_BLUE_CUBE,
|
||||
NPC_KILLING_AURA,
|
||||
ALL_EVENT_20TH_ANNIVERSARY,
|
||||
NPC_TARGET_MARKER,
|
||||
NPC_AIMED_SHOWER,
|
||||
NPC_BLAZING_ERUPTION,
|
||||
NPC_BLOCK_SEAL,
|
||||
NPC_BLOCK_EXPLOSION,
|
||||
NPC_FROST_FIELD,
|
||||
NPC_LIGHTNING_JUDGEMENT,
|
||||
NPC_GROGGY_ON,
|
||||
NPC_RESET_EFST, //793
|
||||
NPC_KILLING_AURA, // 783
|
||||
|
||||
KN_CHARGEATK = 1001,
|
||||
CR_SHRINK,
|
||||
@ -2342,10 +2332,6 @@ enum e_skill {
|
||||
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
|
||||
SS_FUUMAKOUCHIKU_BLASTING,
|
||||
|
||||
SS_FOUR_CHARM = 5499,
|
||||
NW_WILD_SHOT,
|
||||
NW_MIDNIGHT_FALLEN,
|
||||
|
||||
DK_DRAGONIC_BREATH = 6001,
|
||||
MT_SPARK_BLASTER,
|
||||
MT_TRIPLE_LASER,
|
||||
@ -2353,21 +2339,6 @@ enum e_skill {
|
||||
BO_EXPLOSIVE_POWDER,
|
||||
BO_MAYHEMIC_THORNS,
|
||||
|
||||
IG_RADIANT_SPEAR = 6503,
|
||||
IG_IMPERIAL_CROSS,
|
||||
|
||||
MT_RUSH_STRIKE = 6506,
|
||||
MT_POWERFUL_SWING,
|
||||
MT_ENERGY_CANNONADE,
|
||||
BO_MYSTERY_POWDER,
|
||||
BO_DUST_EXPLOSION,
|
||||
SHC_CROSS_SLASH,
|
||||
ABC_HIT_AND_SLIDING,
|
||||
ABC_CHASING_BREAK,
|
||||
ABC_CHASING_SHOT,
|
||||
|
||||
TR_RHYTHMICAL_WAVE = 6521,
|
||||
|
||||
HLIF_HEAL = 8001,
|
||||
HLIF_AVOID,
|
||||
HLIF_BRAIN,
|
||||
|
@ -1243,11 +1243,10 @@ static inline void status_cpy(struct status_data* a, const struct status_data* b
|
||||
*/
|
||||
int status_set_hp(struct block_list *bl, unsigned int hp, int flag)
|
||||
{
|
||||
struct status_data *status;
|
||||
if (hp < 1)
|
||||
return 0;
|
||||
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
|
||||
status = status_get_status_data(bl);
|
||||
if (status == &dummy_status)
|
||||
return 0;
|
||||
|
||||
@ -1270,13 +1269,12 @@ int status_set_hp(struct block_list *bl, unsigned int hp, int flag)
|
||||
*/
|
||||
int status_set_maxhp(struct block_list *bl, unsigned int maxhp, int flag)
|
||||
{
|
||||
struct status_data *status;
|
||||
int64 heal;
|
||||
|
||||
if (maxhp < 1)
|
||||
return 0;
|
||||
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
|
||||
status = status_get_status_data(bl);
|
||||
if (status == &dummy_status)
|
||||
return 0;
|
||||
|
||||
@ -1304,8 +1302,9 @@ int status_set_maxhp(struct block_list *bl, unsigned int maxhp, int flag)
|
||||
*/
|
||||
int status_set_sp(struct block_list *bl, unsigned int sp, int flag)
|
||||
{
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
struct status_data *status;
|
||||
|
||||
status = status_get_status_data(bl);
|
||||
if (status == &dummy_status)
|
||||
return 0;
|
||||
|
||||
@ -1328,11 +1327,10 @@ int status_set_sp(struct block_list *bl, unsigned int sp, int flag)
|
||||
*/
|
||||
int status_set_maxsp(struct block_list *bl, unsigned int maxsp, int flag)
|
||||
{
|
||||
struct status_data *status;
|
||||
if (maxsp < 1)
|
||||
return 0;
|
||||
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
|
||||
status = status_get_status_data(bl);
|
||||
if (status == &dummy_status)
|
||||
return 0;
|
||||
|
||||
@ -1357,7 +1355,7 @@ int status_set_maxsp(struct block_list *bl, unsigned int maxsp, int flag)
|
||||
*/
|
||||
int status_set_ap(struct block_list *bl, unsigned int ap, int flag)
|
||||
{
|
||||
status_data *status = status_get_status_data(*bl);
|
||||
status_data *status = status_get_status_data(bl);
|
||||
|
||||
if (status == &dummy_status)
|
||||
return 0;
|
||||
@ -1384,7 +1382,7 @@ int status_set_maxap(struct block_list *bl, unsigned int maxap, int flag)
|
||||
if (maxap < 1)
|
||||
return 0;
|
||||
|
||||
status_data *status = status_get_status_data(*bl);
|
||||
status_data *status = status_get_status_data(bl);
|
||||
|
||||
if (status == &dummy_status)
|
||||
return 0;
|
||||
@ -1436,6 +1434,7 @@ int64 status_charge(struct block_list* bl, int64 hp, int64 sp)
|
||||
*/
|
||||
int status_damage(struct block_list *src,struct block_list *target,int64 dhp, int64 dsp, int64 dap, t_tick walkdelay, int flag, uint16 skill_id)
|
||||
{
|
||||
struct status_data *status;
|
||||
status_change *sc;
|
||||
int hp = (int)cap_value(dhp,INT_MIN,INT_MAX);
|
||||
int sp = (int)cap_value(dsp,INT_MIN,INT_MAX);
|
||||
@ -1470,9 +1469,8 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
|
||||
return 0;
|
||||
}
|
||||
|
||||
status_data* status = status_get_status_data(*target);
|
||||
|
||||
if( status == &dummy_status )
|
||||
status = status_get_status_data(target);
|
||||
if(!status || status == &dummy_status )
|
||||
return 0;
|
||||
|
||||
if ((unsigned int)hp >= status->hp) {
|
||||
@ -1647,7 +1645,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
|
||||
else
|
||||
status_revive(target, sc->getSCE(SC_KAIZEL)->val2, 0);
|
||||
status_change_clear(target,0);
|
||||
clif_skill_nodamage(target,*target,ALL_RESURRECTION,1);
|
||||
clif_skill_nodamage(target,target,ALL_RESURRECTION,1,1);
|
||||
sc_start(src,target,SC_KYRIE,100,10,time);
|
||||
|
||||
if( target->type == BL_MOB )
|
||||
@ -1660,7 +1658,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
|
||||
if (sc && sc->getSCE(SC_ULTIMATE_S) && !map_flag_gvg2(target->m)) {
|
||||
status_revive(target, 100, 100);
|
||||
status_change_clear(target, 0);
|
||||
clif_skill_nodamage(target, *target, ALL_RESURRECTION, 1);
|
||||
clif_skill_nodamage(target, target, ALL_RESURRECTION, 1, 1);
|
||||
|
||||
if (target->type == BL_MOB)
|
||||
((TBL_MOB*)target)->state.rebirth = 1;
|
||||
@ -1722,12 +1720,13 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
|
||||
*/
|
||||
int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag)
|
||||
{
|
||||
struct status_data *status;
|
||||
status_change *sc;
|
||||
int hp = (int)cap_value(hhp,INT_MIN,INT_MAX);
|
||||
int sp = (int)cap_value(hsp,INT_MIN,INT_MAX);
|
||||
int ap = (int)cap_value(hap,INT_MIN,INT_MAX);
|
||||
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
status = status_get_status_data(bl);
|
||||
|
||||
if (status == &dummy_status || !status->hp)
|
||||
return 0;
|
||||
@ -1822,8 +1821,11 @@ int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag)
|
||||
*/
|
||||
int status_percent_change(struct block_list *src, struct block_list *target, int8 hp_rate, int8 sp_rate, int8 ap_rate, uint8 flag)
|
||||
{
|
||||
struct status_data *status;
|
||||
unsigned int hp = 0, sp = 0, ap = 0;
|
||||
status_data* status = status_get_status_data(*target);
|
||||
|
||||
status = status_get_status_data(target);
|
||||
|
||||
|
||||
// It's safe now [MarkZD]
|
||||
if (hp_rate > 99)
|
||||
@ -1900,11 +1902,11 @@ int status_percent_change(struct block_list *src, struct block_list *target, int
|
||||
*/
|
||||
int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp, unsigned char per_ap)
|
||||
{
|
||||
struct status_data *status;
|
||||
unsigned int hp, sp, ap;
|
||||
if (!status_isdead(*bl)) return 0;
|
||||
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
if (!status_isdead(bl)) return 0;
|
||||
|
||||
status = status_get_status_data(bl);
|
||||
if (status == &dummy_status)
|
||||
return 0; // Invalid target.
|
||||
|
||||
@ -1956,13 +1958,13 @@ int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per
|
||||
* @author [Skotlex]
|
||||
*/
|
||||
bool status_check_skilluse(struct block_list *src, struct block_list *target, uint16 skill_id, int flag) {
|
||||
status_data* status;
|
||||
struct status_data *status;
|
||||
int hide_flag;
|
||||
|
||||
if (src) {
|
||||
if (src->type != BL_PC && status_isdead(*src))
|
||||
if (src->type != BL_PC && status_isdead(src))
|
||||
return false;
|
||||
status = status_get_status_data(*src);
|
||||
status = status_get_status_data(src);
|
||||
}else{
|
||||
status = &dummy_status;
|
||||
}
|
||||
@ -1978,7 +1980,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
|
||||
return false;
|
||||
// Dead state is not checked for skills as some skills can be used
|
||||
// on dead characters, said checks are left to skill.cpp [Skotlex]
|
||||
if (target && status_isdead(*target))
|
||||
if (target && status_isdead(target))
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1990,7 +1992,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
|
||||
break;
|
||||
#endif
|
||||
case GN_WALLOFTHORN:
|
||||
if( target && status_isdead(*target) )
|
||||
if( target && status_isdead(target) )
|
||||
return false;
|
||||
break;
|
||||
case AL_TELEPORT:
|
||||
@ -2220,6 +2222,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
|
||||
int status_check_visibility(struct block_list *src, struct block_list *target)
|
||||
{
|
||||
int view_range;
|
||||
struct status_data* status = status_get_status_data(src);
|
||||
status_change* tsc = status_get_sc(target);
|
||||
switch (src->type) {
|
||||
case BL_MOB:
|
||||
@ -2240,7 +2243,7 @@ int status_check_visibility(struct block_list *src, struct block_list *target)
|
||||
|
||||
if (tsc) {
|
||||
bool is_boss = (status_get_class_(src) == CLASS_BOSS);
|
||||
bool is_detector = status_bl_has_mode(src,MD_DETECTOR);
|
||||
bool is_detector = status_has_mode(status,MD_DETECTOR);
|
||||
|
||||
switch (target->type) { // Check for chase-walk/hiding/cloaking opponents.
|
||||
case BL_PC: {
|
||||
@ -2874,24 +2877,18 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
|
||||
}
|
||||
case NC_SILVERSNIPER:
|
||||
{
|
||||
status_data* mstatus = status_get_status_data(*mbl);
|
||||
|
||||
// TODO: check if dummy_status? Can never be nullptr [Lemongrass]
|
||||
struct status_data *mstatus = status_get_status_data(mbl);
|
||||
if(!mstatus)
|
||||
break;
|
||||
|
||||
status->max_hp = (1000 * ud->skill_lv) + (mstatus->hp / 3) + (status_get_lv(mbl) * 12);
|
||||
status->batk = 200 * ud->skill_lv;
|
||||
break;
|
||||
}
|
||||
case NC_MAGICDECOY:
|
||||
{
|
||||
status_data* mstatus = status_get_status_data(*mbl);
|
||||
|
||||
// TODO: check if dummy_status? Can never be nullptr [Lemongrass]
|
||||
struct status_data *mstatus = status_get_status_data(mbl);
|
||||
if(!mstatus)
|
||||
break;
|
||||
|
||||
status->max_hp = (1000 * ((TBL_PC*)mbl)->menuskill_val) + (mstatus->sp * 4) + (status_get_lv(mbl) * 12);
|
||||
status->matk_min = status->matk_max = 250 + 50*((TBL_PC*)mbl)->menuskill_val;
|
||||
break;
|
||||
@ -2901,9 +2898,8 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
|
||||
case MT_SUMMON_ABR_MOTHER_NET:
|
||||
case MT_SUMMON_ABR_INFINITY: {
|
||||
map_session_data *msd = BL_CAST(BL_PC, mbl);
|
||||
status_data* mstatus = status_get_status_data(*mbl);
|
||||
status_data *mstatus = status_get_status_data(mbl);
|
||||
|
||||
// TODO: check if mstatus is dummy_status? Can never be nullptr [Lemongrass]
|
||||
if (msd == nullptr || mstatus == nullptr)
|
||||
break;
|
||||
|
||||
@ -2937,9 +2933,8 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
|
||||
case BO_CREEPER:
|
||||
case BO_HELLTREE: {
|
||||
map_session_data *msd = BL_CAST(BL_PC, mbl);
|
||||
status_data* mstatus = status_get_status_data(*mbl);
|
||||
status_data *mstatus = status_get_status_data(mbl);
|
||||
|
||||
// TODO: check if mstatus is dummy_status? Can never be nullptr [Lemongrass]
|
||||
if (msd == nullptr || mstatus == nullptr)
|
||||
break;
|
||||
|
||||
@ -4914,7 +4909,7 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt)
|
||||
// Client doesn't delete unavailable skills even if we refresh the skill tree, individually delete them.
|
||||
for (i = 0; i < MAX_SKILL; i++) {
|
||||
if (b_skill[i].id != 0 && sd->status.skill[i].id == 0)
|
||||
clif_deleteskill(*sd, b_skill[i].id, true);
|
||||
clif_deleteskill(sd, b_skill[i].id, true);
|
||||
}
|
||||
#endif
|
||||
clif_skillinfoblock(sd);
|
||||
@ -5601,7 +5596,7 @@ void status_calc_state( struct block_list *bl, status_change *sc, std::bitset<SC
|
||||
void status_calc_bl_main(struct block_list& bl, std::bitset<SCB_MAX> flag)
|
||||
{
|
||||
const struct status_data *b_status = status_get_base_status(&bl); // Base Status
|
||||
status_data* status = status_get_status_data(bl); // Battle Status
|
||||
struct status_data *status = status_get_status_data(&bl); // Battle Status
|
||||
status_change *sc = status_get_sc(&bl);
|
||||
TBL_PC *sd = BL_CAST(BL_PC,&bl);
|
||||
int temp;
|
||||
@ -5956,9 +5951,12 @@ void status_calc_bl_main(struct block_list& bl, std::bitset<SCB_MAX> flag)
|
||||
* No status changes alter these yet.
|
||||
* if(flag[SCB_SIZE])
|
||||
* if(flag[SCB_RACE])
|
||||
* if(flag[SCB_RANGE])
|
||||
**/
|
||||
|
||||
if (flag[SCB_RANGE]) {
|
||||
status->rhw.range = b_status->rhw.range;
|
||||
}
|
||||
|
||||
if(flag[SCB_MAXHP]) {
|
||||
if( bl.type == BL_PC ) {
|
||||
status->max_hp = status_calc_maxhpsp_pc(sd,status->vit,true);
|
||||
@ -6244,6 +6242,9 @@ void status_calc_bl_main(struct block_list& bl, std::bitset<SCB_MAX> flag)
|
||||
*/
|
||||
void status_calc_bl_(struct block_list* bl, std::bitset<SCB_MAX> flag, uint8 opt)
|
||||
{
|
||||
struct status_data b_status; // Previous battle status
|
||||
struct status_data* status; // Pointer to current battle status
|
||||
|
||||
if (bl->type == BL_PC) {
|
||||
map_session_data *sd = BL_CAST(BL_PC, bl);
|
||||
|
||||
@ -6257,14 +6258,9 @@ void status_calc_bl_(struct block_list* bl, std::bitset<SCB_MAX> flag, uint8 opt
|
||||
}
|
||||
}
|
||||
|
||||
// Pointer to current battle status
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
|
||||
// Previous battle status
|
||||
status_data b_status;
|
||||
|
||||
// Remember previous values
|
||||
memcpy(&b_status, status, sizeof(b_status));
|
||||
status = status_get_status_data(bl);
|
||||
memcpy(&b_status, status, sizeof(struct status_data));
|
||||
|
||||
if( flag[SCB_BASE] ) { // Calculate the object's base status too
|
||||
switch( bl->type ) {
|
||||
@ -6686,8 +6682,10 @@ static unsigned short status_calc_vit(struct block_list *bl, status_change *sc,
|
||||
vit -= vit * sc->getSCE(SC_STRIPARMOR)->val2/100;
|
||||
if(sc->getSCE(SC_FULL_THROTTLE))
|
||||
vit += vit * sc->getSCE(SC_FULL_THROTTLE)->val3 / 100;
|
||||
if(bl->type == BL_PC && sc->getSCE(SC_DEFENCE))
|
||||
#ifdef RENEWAL
|
||||
if(sc->getSCE(SC_DEFENCE))
|
||||
vit += sc->getSCE(SC_DEFENCE)->val2;
|
||||
#endif
|
||||
if(sc->getSCE(SC_CHEERUP))
|
||||
vit += 3;
|
||||
if(sc->getSCE(SC_GLASTHEIM_STATE))
|
||||
@ -7683,10 +7681,6 @@ static defType status_calc_def(struct block_list *bl, status_change *sc, int def
|
||||
|
||||
if(sc->getSCE(SC_BERSERK))
|
||||
return 0;
|
||||
#ifdef RENEWAL
|
||||
if(sc->getSCE(SC_ETERNALCHAOS))
|
||||
return 0;
|
||||
#endif
|
||||
if(sc->getSCE(SC_BARRIER))
|
||||
return 100;
|
||||
if(sc->getSCE(SC_KEEPING))
|
||||
@ -7709,9 +7703,10 @@ static defType status_calc_def(struct block_list *bl, status_change *sc, int def
|
||||
#ifdef RENEWAL
|
||||
if (sc->getSCE(SC_ASSUMPTIO))
|
||||
def += sc->getSCE(SC_ASSUMPTIO)->val1 * 50;
|
||||
#endif
|
||||
if (bl->type == BL_HOM && sc->getSCE(SC_DEFENCE))
|
||||
#else
|
||||
if(sc->getSCE(SC_DEFENCE))
|
||||
def += sc->getSCE(SC_DEFENCE)->val2;
|
||||
#endif
|
||||
if(sc->getSCE(SC_INCDEFRATE))
|
||||
def += def * sc->getSCE(SC_INCDEFRATE)->val1/100;
|
||||
if(sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 2)
|
||||
@ -8999,29 +8994,18 @@ struct regen_data *status_get_regen_data(struct block_list *bl)
|
||||
* @param bl: Object whose status to get [PC|MOB|PET|HOM|MER|ELEM|NPC]
|
||||
* @return status or "dummy_status" if any other bl->type than noted above
|
||||
*/
|
||||
status_data* status_get_status_data(block_list& bl){
|
||||
switch (bl.type) {
|
||||
case BL_PC:
|
||||
return &reinterpret_cast<map_session_data*>( &bl )->battle_status;
|
||||
case BL_MOB:
|
||||
return &reinterpret_cast<mob_data*>( &bl )->status;
|
||||
case BL_PET:
|
||||
return &reinterpret_cast<pet_data*>( &bl )->status;
|
||||
case BL_HOM:
|
||||
return &reinterpret_cast<homun_data*>( &bl )->battle_status;
|
||||
case BL_MER:
|
||||
return &reinterpret_cast<s_mercenary_data*>( &bl )->battle_status;
|
||||
case BL_ELEM:
|
||||
return &reinterpret_cast<s_elemental_data*>( &bl )->battle_status;
|
||||
case BL_NPC: {
|
||||
npc_data* nd = reinterpret_cast<npc_data*>( &bl );
|
||||
struct status_data *status_get_status_data(struct block_list *bl)
|
||||
{
|
||||
nullpo_retr(&dummy_status, bl);
|
||||
|
||||
if( mobdb_checkid( nd->class_ ) == 0 ){
|
||||
return &nd->status;
|
||||
}else{
|
||||
return &dummy_status;
|
||||
}
|
||||
}
|
||||
switch (bl->type) {
|
||||
case BL_PC: return &((TBL_PC*)bl)->battle_status;
|
||||
case BL_MOB: return &((TBL_MOB*)bl)->status;
|
||||
case BL_PET: return &((TBL_PET*)bl)->status;
|
||||
case BL_HOM: return &((TBL_HOM*)bl)->battle_status;
|
||||
case BL_MER: return &((TBL_MER*)bl)->battle_status;
|
||||
case BL_ELEM: return &((TBL_ELEM*)bl)->battle_status;
|
||||
case BL_NPC: return ((mobdb_checkid(((TBL_NPC*)bl)->class_) == 0) ? &((TBL_NPC*)bl)->status : &dummy_status);
|
||||
default:
|
||||
return &dummy_status;
|
||||
}
|
||||
@ -9056,8 +9040,7 @@ struct status_data *status_get_base_status(struct block_list *bl)
|
||||
defType status_get_def(struct block_list *bl)
|
||||
{
|
||||
struct unit_data *ud;
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
// TODO: check if dummy_status? Can never be nullptr [Lemongrass]
|
||||
struct status_data *status = status_get_status_data(bl);
|
||||
int def = status?status->def:0;
|
||||
ud = unit_bl2ud(bl);
|
||||
if (ud && ud->skilltimer != INVALID_TIMER)
|
||||
@ -9073,10 +9056,9 @@ defType status_get_def(struct block_list *bl)
|
||||
*/
|
||||
unsigned short status_get_speed(struct block_list *bl)
|
||||
{
|
||||
// TODO: is the statement of Skotlex still true? And would it not be better to check for dummy_status instead? [Lemongrass]
|
||||
if(bl->type==BL_NPC)// Only BL with speed data but no status_data [Skotlex]
|
||||
return ((struct npc_data *)bl)->speed;
|
||||
return status_get_status_data(*bl)->speed;
|
||||
return status_get_status_data(bl)->speed;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -9242,7 +9224,9 @@ std::vector<e_race2> status_get_race2(struct block_list *bl)
|
||||
* @param bl: Object to check [PC|MOB|HOM|MER|ELEM]
|
||||
* @return 1: Is dead or 0: Is alive
|
||||
*/
|
||||
bool status_isdead(block_list &bl){
|
||||
int status_isdead(struct block_list *bl)
|
||||
{
|
||||
nullpo_ret(bl);
|
||||
return status_get_status_data(bl)->hp == 0;
|
||||
}
|
||||
|
||||
@ -9544,6 +9528,8 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
|
||||
/// Example: 25% (2500) -> sc_def2 = 2000 -> 5%;
|
||||
/// 2500ms -> tick_def2=2000 -> 500ms
|
||||
int sc_def2 = 0, tick_def2 = 0;
|
||||
|
||||
struct status_data *status, *status_src;
|
||||
status_change *sc;
|
||||
map_session_data *sd;
|
||||
|
||||
@ -9566,8 +9552,8 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_
|
||||
}
|
||||
|
||||
sd = BL_CAST(BL_PC,bl);
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
status_data* status_src = status_get_status_data(*src);
|
||||
status = status_get_status_data(bl);
|
||||
status_src = status_get_status_data(src);
|
||||
sc = status_get_sc(bl);
|
||||
if( sc && !sc->count )
|
||||
sc = nullptr;
|
||||
@ -10043,6 +10029,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
map_session_data *sd = nullptr;
|
||||
status_change* sc;
|
||||
struct status_change_entry* sce;
|
||||
struct status_data *status;
|
||||
struct view_data *vd;
|
||||
int undead_flag, tick_time = 0;
|
||||
bool sc_isnew = true;
|
||||
@ -10050,6 +10037,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
|
||||
nullpo_ret(bl);
|
||||
sc = status_get_sc(bl);
|
||||
status = status_get_status_data(bl);
|
||||
|
||||
if( !scdb ) {
|
||||
ShowError("status_change_start: Invalid status change (%d)!\n", type);
|
||||
@ -10059,7 +10047,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if( !sc )
|
||||
return 0; // Unable to receive status changes
|
||||
|
||||
if( bl->type != BL_NPC && status_isdead(*bl) && ( type != SC_NOCHAT && type != SC_JAILED ) ) // SC_NOCHAT and SC_JAILED should work even on dead characters
|
||||
if( bl->type != BL_NPC && status_isdead(bl) && ( type != SC_NOCHAT && type != SC_JAILED ) ) // SC_NOCHAT and SC_JAILED should work even on dead characters
|
||||
return 0;
|
||||
|
||||
if (status_change_isDisabledOnMap(type, map_getmapdata(bl->m)))
|
||||
@ -10076,8 +10064,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if (sc->option&OPTION_MADOGEAR && flag&SCSTART_NOAVOID && scdb->flag[SCF_FAILEDMADO])
|
||||
return 0;
|
||||
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
|
||||
// Check for Boss resistances
|
||||
if(status->mode&MD_STATUSIMMUNE && !(flag&SCSTART_NOAVOID) && scdb->flag[SCF_BOSSRESIST])
|
||||
return 0;
|
||||
@ -11174,7 +11160,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if (sd) {
|
||||
pc_setsit(sd);
|
||||
skill_sit(sd, true);
|
||||
clif_sitting(sd->bl);
|
||||
clif_sitting(&sd->bl);
|
||||
}
|
||||
val2 = 12; // SP cost
|
||||
tick_time = 10000; // Decrease at 10secs intervals.
|
||||
@ -11236,13 +11222,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
struct block_list *pbl = map_id2bl(val1);
|
||||
status_change *psc = pbl?status_get_sc(pbl):nullptr;
|
||||
struct status_change_entry *psce = psc?psc->getSCE(SC_MARIONETTE):nullptr;
|
||||
// Fetch target's stats
|
||||
struct status_data* status2 = status_get_status_data(bl); // Battle status
|
||||
|
||||
if (!psce)
|
||||
return 0;
|
||||
|
||||
// Fetch target's stats
|
||||
status_data* status2 = status_get_status_data(*bl); // Battle status
|
||||
|
||||
val3 = 0;
|
||||
val4 = 0;
|
||||
max_stat = battle_config.max_parameter; // Cap to 99 (default)
|
||||
@ -11258,7 +11243,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
//1st Transcendent Spirit works similar to Marionette Control
|
||||
if(sd && val2 == SL_HIGH) {
|
||||
int stat,max_stat;
|
||||
status_data *status2 = status_get_base_status(bl);
|
||||
struct status_data *status2 = status_get_base_status(bl);
|
||||
|
||||
val3 = 0;
|
||||
val4 = 0;
|
||||
@ -11507,21 +11492,16 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
val2 = 10 * val1;
|
||||
break;
|
||||
case SC_DEFENCE:
|
||||
// Vit bonus for players / Def bonus for homunculus
|
||||
#ifdef RENEWAL
|
||||
val2 = 5 + (5 * val1);
|
||||
val2 = 5 + (val1 * 5); // Vit bonus
|
||||
#else
|
||||
val2 = 2 * val1;
|
||||
val2 = 2*val1; // Def bonus
|
||||
#endif
|
||||
break;
|
||||
case SC_BLOODLUST:
|
||||
// Atk rate change
|
||||
val2 = 20 + (10 * val1);
|
||||
// Leech chance
|
||||
// It's actually 9 * level on both pre-re and renewal, despite the description
|
||||
val3 = 9 * val1;
|
||||
// Leech percent
|
||||
val4 = 20;
|
||||
val2 = 20+10*val1; // Atk rate change.
|
||||
val3 = 3*val1; // Leech chance
|
||||
val4 = 20; // Leech percent
|
||||
break;
|
||||
case SC_FLEET:
|
||||
val2 = 30*val1; // Aspd change
|
||||
@ -11958,7 +11938,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if( sd && !pc_issit(sd) ) {
|
||||
pc_setsit(sd);
|
||||
skill_sit(sd, true);
|
||||
clif_sitting(*bl);
|
||||
clif_sitting(bl);
|
||||
}
|
||||
break;
|
||||
case SC_DANCEWITHWUG:
|
||||
@ -13137,19 +13117,19 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
switch(sce->val1) {
|
||||
case TK_STORMKICK:
|
||||
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
|
||||
clif_skill_nodamage(bl,*bl,TK_READYSTORM,1);
|
||||
clif_skill_nodamage(bl,bl,TK_READYSTORM,1,1);
|
||||
break;
|
||||
case TK_DOWNKICK:
|
||||
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
|
||||
clif_skill_nodamage(bl,*bl,TK_READYDOWN,1);
|
||||
clif_skill_nodamage(bl,bl,TK_READYDOWN,1,1);
|
||||
break;
|
||||
case TK_TURNKICK:
|
||||
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
|
||||
clif_skill_nodamage(bl,*bl,TK_READYTURN,1);
|
||||
clif_skill_nodamage(bl,bl,TK_READYTURN,1,1);
|
||||
break;
|
||||
case TK_COUNTER:
|
||||
skill_combo_toggle_inf(bl, TK_JUMPKICK, 0);
|
||||
clif_skill_nodamage(bl,*bl,TK_READYCOUNTER,1);
|
||||
clif_skill_nodamage(bl,bl,TK_READYCOUNTER,1,1);
|
||||
break;
|
||||
default: // Rest just toggle inf to enable autotarget
|
||||
skill_combo_toggle_inf(bl,sce->val1,INF_SELF_SKILL);
|
||||
@ -13269,12 +13249,14 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
||||
map_session_data *sd;
|
||||
status_change *sc;
|
||||
struct status_change_entry *sce;
|
||||
struct status_data *status;
|
||||
struct view_data *vd;
|
||||
std::shared_ptr<s_status_change_db> scdb = status_db.find(type);
|
||||
|
||||
nullpo_ret(bl);
|
||||
|
||||
sc = status_get_sc(bl);
|
||||
status = status_get_status_data(bl);
|
||||
|
||||
if(!sc || !(sce = sc->getSCE(type)) || !scdb)
|
||||
return 0;
|
||||
@ -13320,7 +13302,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
||||
sce->val4 = 0;
|
||||
if (group)
|
||||
skill_delunitgroup(group);
|
||||
if (!status_isdead(*bl) && (sce->val2 || sce->val3 || sce->val4))
|
||||
if (!status_isdead(bl) && (sce->val2 || sce->val3 || sce->val4))
|
||||
return 0; //Don't end the status change yet as there are still unit groups associated with it
|
||||
}
|
||||
if (sce->timer != INVALID_TIMER) // Could be a SC with infinite duration
|
||||
@ -13339,7 +13321,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
||||
|
||||
vd = status_get_viewdata(bl);
|
||||
std::bitset<SCB_MAX> calc_flag = scdb->calc_flag;
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
|
||||
switch(type) {
|
||||
case SC_KEEPING:
|
||||
@ -13643,7 +13624,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
||||
struct block_list* src = map_id2bl(sce->val2);
|
||||
if( tid == -1 || !src)
|
||||
break; // Terminated by Damage
|
||||
status_fix_damage(src,bl,400*sce->val1,clif_damage(*bl,*bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false),WL_WHITEIMPRISON);
|
||||
status_fix_damage(src,bl,400*sce->val1,clif_damage(bl,bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false),WL_WHITEIMPRISON);
|
||||
}
|
||||
break;
|
||||
case SC_WUGDASH:
|
||||
@ -13716,7 +13697,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
||||
break;
|
||||
|
||||
case SC_GRAVITYCONTROL:
|
||||
status_fix_damage(bl, bl, sce->val2, clif_damage(*bl, *bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0);
|
||||
status_fix_damage(bl, bl, sce->val2, clif_damage(bl, bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0);
|
||||
clif_specialeffect(bl, 223, AREA);
|
||||
clif_specialeffect(bl, 330, AREA);
|
||||
break;
|
||||
@ -13769,7 +13750,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
||||
if( tid != INVALID_TIMER ){
|
||||
map_session_data *caster = nullptr;
|
||||
|
||||
if (status_isdead(*bl) || !(caster = map_id2sd(sce->val2)))
|
||||
if (status_isdead(bl) || !(caster = map_id2sd(sce->val2)))
|
||||
break;
|
||||
|
||||
std::shared_ptr<s_skill_db> skill = skill_db.find(RL_H_MINE);
|
||||
@ -13953,7 +13934,7 @@ TIMER_FUNC(status_change_timer){
|
||||
}
|
||||
|
||||
status_change * const sc = status_get_sc(bl);
|
||||
|
||||
struct status_data * const status = status_get_status_data(bl);
|
||||
if(!sc) {
|
||||
ShowDebug("status_change_timer: Null pointer id: %d data: %" PRIdPTR " bl-type: %d\n", id, data, bl->type);
|
||||
return 0;
|
||||
@ -13969,8 +13950,6 @@ TIMER_FUNC(status_change_timer){
|
||||
return 0;
|
||||
}
|
||||
|
||||
const status_data* status = status_get_status_data(*bl);
|
||||
|
||||
sd = BL_CAST(BL_PC, bl);
|
||||
|
||||
std::function<void (t_tick)> sc_timer_next = [&sce, &bl, &data](t_tick t) {
|
||||
@ -14070,7 +14049,7 @@ TIMER_FUNC(status_change_timer){
|
||||
int64 damage = 1000 + (3 * status->max_hp) / 100; // Deals fixed (1000 + 3%*MaxHP)
|
||||
map_freeblock_lock();
|
||||
dounlock = true;
|
||||
status_fix_damage(bl, bl, damage, clif_damage(*bl, *bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0);
|
||||
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -14079,7 +14058,7 @@ TIMER_FUNC(status_change_timer){
|
||||
if (sce->val3 == 1) { // Target
|
||||
map_freeblock_lock();
|
||||
dounlock = true;
|
||||
status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0);
|
||||
status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0);
|
||||
} else { // Caster
|
||||
interval = 1000; // Assign here since status_get_sc_internval() contains the target interval.
|
||||
|
||||
@ -14138,7 +14117,7 @@ TIMER_FUNC(status_change_timer){
|
||||
if (sce->val4 >= 0) {
|
||||
map_freeblock_lock();
|
||||
dounlock = true;
|
||||
status_fix_damage(bl, bl, 100, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0);
|
||||
status_fix_damage(bl, bl, 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0);
|
||||
unit_skillcastcancel(bl, 2);
|
||||
}
|
||||
break;
|
||||
@ -14148,7 +14127,7 @@ TIMER_FUNC(status_change_timer){
|
||||
int64 damage = status->vit * (sce->val1 - 3) + (int)status->max_hp / 100; // {Target VIT x (New Poison Research Skill Level - 3)} + (Target HP/100)
|
||||
map_freeblock_lock();
|
||||
dounlock = true;
|
||||
status_fix_damage(bl, bl, damage, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false),0);
|
||||
status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false),0);
|
||||
unit_skillcastcancel(bl, 2);
|
||||
}
|
||||
break;
|
||||
@ -14588,7 +14567,7 @@ TIMER_FUNC(status_change_timer){
|
||||
if (--(sce->val4) >= 0) {
|
||||
struct block_list *src = map_id2bl(sce->val2);
|
||||
|
||||
if (!src || (src && (status_isdead(*src) || src->m != bl->m)))
|
||||
if (!src || (src && (status_isdead(src) || src->m != bl->m)))
|
||||
break;
|
||||
map_freeblock_lock();
|
||||
if (!status_charge(bl, 0, 50))
|
||||
@ -14675,7 +14654,7 @@ TIMER_FUNC(status_change_timer){
|
||||
int damage = sce->val2;
|
||||
|
||||
map_freeblock_lock();
|
||||
clif_damage(*bl, *bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false);
|
||||
clif_damage(bl, bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false);
|
||||
status_damage(src, bl, damage,0, 0, 1, 0);
|
||||
if( sc->getSCE(type) ) {
|
||||
sc_timer_next(2000 + tick);
|
||||
@ -14697,7 +14676,7 @@ TIMER_FUNC(status_change_timer){
|
||||
if( sd && !pc_issit(sd) ) { // Force to sit every 10 seconds.
|
||||
pc_setsit(sd);
|
||||
skill_sit(sd, true);
|
||||
clif_sitting(*bl);
|
||||
clif_sitting(bl);
|
||||
}
|
||||
sc_timer_next(10000 + tick);
|
||||
return 0;
|
||||
@ -14794,7 +14773,7 @@ TIMER_FUNC(status_change_timer){
|
||||
uint16 x = sce->val3 >> 16, y = sce->val3 & 0xFFFF;
|
||||
|
||||
if (distance_xy(x, y, bl->x, bl->y) <= skill_get_unit_range(SO_VACUUM_EXTREME, sce->val1) && unit_movepos(bl, x, y, 0, false)) {
|
||||
clif_slide(*bl, x, y);
|
||||
clif_slide(bl, x, y);
|
||||
clif_fixpos( *bl );
|
||||
}
|
||||
}
|
||||
@ -14888,7 +14867,7 @@ TIMER_FUNC(status_change_timer){
|
||||
struct block_list *star_caster = map_id2bl(sce->val2);
|
||||
struct skill_unit *star_aoe = (struct skill_unit *)map_id2bl(sce->val3);
|
||||
|
||||
if (star_caster == nullptr || status_isdead(*star_caster) || star_caster->m != bl->m || star_aoe == nullptr)
|
||||
if (star_caster == nullptr || status_isdead(star_caster) || star_caster->m != bl->m || star_aoe == nullptr)
|
||||
break;
|
||||
|
||||
sc_timer_next(500 + tick);
|
||||
@ -14902,7 +14881,7 @@ TIMER_FUNC(status_change_timer){
|
||||
if (--(sce->val4) >= 0) { // Needed to check the caster's location for the range check.
|
||||
struct block_list *unity_src = map_id2bl(sce->val2);
|
||||
|
||||
if (!unity_src || status_isdead(*unity_src) || unity_src->m != bl->m || !check_distance_bl(bl, unity_src, 11))
|
||||
if (!unity_src || status_isdead(unity_src) || unity_src->m != bl->m || !check_distance_bl(bl, unity_src, 11))
|
||||
break;
|
||||
|
||||
status_heal(bl, 150 * sce->val1, 0, 2);
|
||||
@ -15028,7 +15007,7 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
|
||||
enum sc_type type = (sc_type)va_arg(ap,int); // gcc: enum args get promoted to int
|
||||
t_tick tick = va_arg(ap,t_tick);
|
||||
|
||||
if (status_isdead(*bl))
|
||||
if (status_isdead(bl))
|
||||
return 0;
|
||||
|
||||
tsc = status_get_sc(bl);
|
||||
@ -15232,6 +15211,7 @@ static t_tick natural_heal_prev_tick,natural_heal_diff_tick;
|
||||
static int status_natural_heal(struct block_list* bl, va_list args)
|
||||
{
|
||||
struct regen_data *regen;
|
||||
struct status_data *status;
|
||||
status_change *sc;
|
||||
struct unit_data *ud;
|
||||
struct view_data *vd = nullptr;
|
||||
@ -15242,9 +15222,7 @@ static int status_natural_heal(struct block_list* bl, va_list args)
|
||||
regen = status_get_regen_data(bl);
|
||||
if (!regen)
|
||||
return 0;
|
||||
|
||||
status_data* status = status_get_status_data(*bl);
|
||||
|
||||
status = status_get_status_data(bl);
|
||||
sc = status_get_sc(bl);
|
||||
if (sc && !sc->count)
|
||||
sc = nullptr;
|
||||
@ -15262,7 +15240,7 @@ static int status_natural_heal(struct block_list* bl, va_list args)
|
||||
flag &= ~RGN_SSP;
|
||||
|
||||
if (flag && (
|
||||
status_isdead(*bl) ||
|
||||
status_isdead(bl) ||
|
||||
(sc && (sc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || sc->getSCE(SC__INVISIBILITY)))
|
||||
))
|
||||
flag = RGN_NONE;
|
||||
|
@ -1755,7 +1755,7 @@ enum efst_type : short{
|
||||
EFST_SPELLFIST,
|
||||
EFST_NETHERWORLD,
|
||||
EFST_SIREN,
|
||||
EFST_DEEP_SLEEP,
|
||||
EFST_HANDICAPSTATE_DEEP_SLEEP,
|
||||
EFST_SIRCLEOFNATURE,
|
||||
EFST_COLD,
|
||||
EFST_GLOOMYDAY,
|
||||
@ -1818,7 +1818,7 @@ enum efst_type : short{
|
||||
EFST_DROCERA_HERB_STEAMED,
|
||||
EFST_PUTTI_TAILS_NOODLES,
|
||||
EFST_BANANA_BOMB,
|
||||
EFST_SUMMON_AGNI,
|
||||
XXX_EFST_SM_ELEMENTAL,
|
||||
EFST_SPELLBOOK4,
|
||||
EFST_SPELLBOOK5,
|
||||
EFST_SPELLBOOK6,
|
||||
@ -1953,8 +1953,8 @@ enum efst_type : short{
|
||||
EFST_SET_NUM_MDEF,
|
||||
EFST_SET_PER_DEF,
|
||||
EFST_SET_PER_MDEF,
|
||||
EFST_PARTYBOOKING_SEARCH_DEALY,
|
||||
EFST_PARTYBOOKING_REGISTER_DEALY,
|
||||
EFST_PARTYBOOKING_SEARCH_DELAY,
|
||||
EFST_PARTYBOOKING_REGISTER_DELAY,
|
||||
EFST_PERIOD_TIME_CHECK_DETECT_SKILL,
|
||||
EFST_KO_JYUMONJIKIRI,
|
||||
EFST_MEIKYOUSISUI,
|
||||
@ -1995,7 +1995,7 @@ enum efst_type : short{
|
||||
EFST_GLASTHEIM_STATE,
|
||||
EFST_GLASTHEIM_ITEMDEF,
|
||||
EFST_GLASTHEIM_HPSP,
|
||||
EFST_HOMUN_SKILL_POSTDELAY,
|
||||
EFST_FOLLOWER_NPC_SKILL_POSTDELAY,
|
||||
EFST_ALMIGHTY,
|
||||
EFST_GVG_GIANT,
|
||||
EFST_GVG_GOLEM,
|
||||
@ -2021,7 +2021,7 @@ enum efst_type : short{
|
||||
EFST_QUEST_BUFF3,
|
||||
EFST_REUSE_LIMIT_RECALL,
|
||||
EFST_SAVEPOSITION,
|
||||
EFST_HANDICAPSTATE_ICEEXPLO,
|
||||
EFST_NPC_ICEEXPLO,
|
||||
EFST_FENRIR_CARD,
|
||||
EFST_REUSE_LIMIT_ASPD_POTION,
|
||||
EFST_MAXPAIN,
|
||||
@ -2125,7 +2125,7 @@ enum efst_type : short{
|
||||
EFST_GC_POISONINGWEAPON_OPERATOR,
|
||||
EFST_WS_WEAPONREFINE_OPERATOR,
|
||||
EFST_BS_REPAIRWEAPON_OPERATOR,
|
||||
EFST_GET_MAILBOX,
|
||||
EFST_UNREADMAIL_CHECK,
|
||||
EFST_JUMPINGCLAN,
|
||||
EFST_JP_OTP,
|
||||
EFST_HANDICAPTOLERANCE_LEVELGAP,
|
||||
@ -2446,13 +2446,13 @@ enum efst_type : short{
|
||||
EFST_PERIOD_USE_WORLDMAP,
|
||||
EFST_MISTY_FROST,
|
||||
EFST_MAGIC_POISON,
|
||||
EFST_MOVE_AGIT,
|
||||
EFST_KAUTE,
|
||||
EFST_REUSE_JPNONLY_LIMIT_I,
|
||||
EFST_REUSE_JPNONLY_LIMIT_J,
|
||||
EFST_REUSE_JPNONLY_LIMIT_K,
|
||||
EFST_JPNONLY_TACTICS,
|
||||
EFST_PRISON,
|
||||
EFST_MADOGEAR_TYPE,
|
||||
EFST_MADOGEAR,
|
||||
EFST_DEADLY_DEFEASANCE,
|
||||
EFST_CLIMAX_DES_HU,
|
||||
EFST_CLIMAX,
|
||||
@ -2736,50 +2736,6 @@ enum efst_type : short{
|
||||
EFST_C_RATE_PLUS,
|
||||
EFST_RESIST_PLUS,
|
||||
EFST_PVP_DUN_BUFF,
|
||||
|
||||
EFST_TARGET_MARKER = 1453,
|
||||
EFST_BLOCK_SEAL,
|
||||
EFST_FROST_STORM,
|
||||
EFST_GROGGY,
|
||||
EFST_WARM_SHIELD, //1457
|
||||
|
||||
EFST_CONTENTS_1 = 1459,
|
||||
EFST_CONTENTS_2,
|
||||
EFST_CONTENTS_3,
|
||||
EFST_CONTENTS_4,
|
||||
EFST_CONTENTS_5,
|
||||
EFST_CONTENTS_6,
|
||||
EFST_CONTENTS_7,
|
||||
EFST_CONTENTS_8,
|
||||
EFST_CONTENTS_9,
|
||||
EFST_CONTENTS_10,
|
||||
EFST_CONTENTS_11,
|
||||
EFST_CONTENTS_12,
|
||||
EFST_CONTENTS_13,
|
||||
EFST_CONTENTS_14,
|
||||
EFST_CONTENTS_15,
|
||||
EFST_CONTENTS_16,
|
||||
EFST_CONTENTS_17,
|
||||
EFST_CONTENTS_18,
|
||||
EFST_CONTENTS_19,
|
||||
EFST_CONTENTS_20,
|
||||
EFST_CONTENTS_21,
|
||||
EFST_CONTENTS_22,
|
||||
EFST_CONTENTS_23,
|
||||
EFST_CONTENTS_24,
|
||||
EFST_CONTENTS_25, //1483
|
||||
|
||||
EFST_C_BUFF_1 = 1509,
|
||||
EFST_C_BUFF_2,
|
||||
|
||||
EFST_CHASING = 1560,
|
||||
|
||||
EFST_MYSTERY_POWDER = 1665,
|
||||
|
||||
EFST_FIRE_CHARM_POWER = 1667,
|
||||
EFST_WATER_CHARM_POWER,
|
||||
EFST_WIND_CHARM_POWER,
|
||||
EFST_GROUND_CHARM_POWER,
|
||||
/// @APIHOOK_END
|
||||
/// Do not modify code above this, since it will be automatically generated by the API again
|
||||
EFST_MAX,
|
||||
@ -3399,68 +3355,68 @@ static int status_heal( struct block_list *bl,int64 hhp,int64 hsp, int flag ){
|
||||
int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp, unsigned char per_ap = 0);
|
||||
|
||||
struct regen_data *status_get_regen_data(struct block_list *bl);
|
||||
status_data* status_get_status_data(block_list& bl);
|
||||
struct status_data *status_get_status_data(struct block_list *bl);
|
||||
struct status_data *status_get_base_status(struct block_list *bl);
|
||||
const char * status_get_name(struct block_list *bl);
|
||||
int status_get_class(struct block_list *bl);
|
||||
int status_get_lv(struct block_list *bl);
|
||||
#define status_get_range(bl) status_get_status_data(*bl)->rhw.range
|
||||
#define status_get_hp(bl) status_get_status_data(*bl)->hp
|
||||
#define status_get_max_hp(bl) status_get_status_data(*bl)->max_hp
|
||||
#define status_get_sp(bl) status_get_status_data(*bl)->sp
|
||||
#define status_get_max_sp(bl) status_get_status_data(*bl)->max_sp
|
||||
#define status_get_ap(bl) status_get_status_data(*bl)->ap
|
||||
#define status_get_max_ap(bl) status_get_status_data(*bl)->max_ap
|
||||
#define status_get_str(bl) status_get_status_data(*bl)->str
|
||||
#define status_get_agi(bl) status_get_status_data(*bl)->agi
|
||||
#define status_get_vit(bl) status_get_status_data(*bl)->vit
|
||||
#define status_get_int(bl) status_get_status_data(*bl)->int_
|
||||
#define status_get_dex(bl) status_get_status_data(*bl)->dex
|
||||
#define status_get_luk(bl) status_get_status_data(*bl)->luk
|
||||
#define status_get_pow(bl) status_get_status_data(*bl)->pow
|
||||
#define status_get_sta(bl) status_get_status_data(*bl)->sta
|
||||
#define status_get_wis(bl) status_get_status_data(*bl)->wis
|
||||
#define status_get_spl(bl) status_get_status_data(*bl)->spl
|
||||
#define status_get_con(bl) status_get_status_data(*bl)->con
|
||||
#define status_get_crt(bl) status_get_status_data(*bl)->crt
|
||||
#define status_get_hit(bl) status_get_status_data(*bl)->hit
|
||||
#define status_get_flee(bl) status_get_status_data(*bl)->flee
|
||||
#define status_get_range(bl) status_get_status_data(bl)->rhw.range
|
||||
#define status_get_hp(bl) status_get_status_data(bl)->hp
|
||||
#define status_get_max_hp(bl) status_get_status_data(bl)->max_hp
|
||||
#define status_get_sp(bl) status_get_status_data(bl)->sp
|
||||
#define status_get_max_sp(bl) status_get_status_data(bl)->max_sp
|
||||
#define status_get_ap(bl) status_get_status_data(bl)->ap
|
||||
#define status_get_max_ap(bl) status_get_status_data(bl)->max_ap
|
||||
#define status_get_str(bl) status_get_status_data(bl)->str
|
||||
#define status_get_agi(bl) status_get_status_data(bl)->agi
|
||||
#define status_get_vit(bl) status_get_status_data(bl)->vit
|
||||
#define status_get_int(bl) status_get_status_data(bl)->int_
|
||||
#define status_get_dex(bl) status_get_status_data(bl)->dex
|
||||
#define status_get_luk(bl) status_get_status_data(bl)->luk
|
||||
#define status_get_pow(bl) status_get_status_data(bl)->pow
|
||||
#define status_get_sta(bl) status_get_status_data(bl)->sta
|
||||
#define status_get_wis(bl) status_get_status_data(bl)->wis
|
||||
#define status_get_spl(bl) status_get_status_data(bl)->spl
|
||||
#define status_get_con(bl) status_get_status_data(bl)->con
|
||||
#define status_get_crt(bl) status_get_status_data(bl)->crt
|
||||
#define status_get_hit(bl) status_get_status_data(bl)->hit
|
||||
#define status_get_flee(bl) status_get_status_data(bl)->flee
|
||||
defType status_get_def(struct block_list *bl);
|
||||
#define status_get_mdef(bl) status_get_status_data(*bl)->mdef
|
||||
#define status_get_flee2(bl) status_get_status_data(*bl)->flee2
|
||||
#define status_get_def2(bl) status_get_status_data(*bl)->def2
|
||||
#define status_get_mdef2(bl) status_get_status_data(*bl)->mdef2
|
||||
#define status_get_critical(bl) status_get_status_data(*bl)->cri
|
||||
#define status_get_batk(bl) status_get_status_data(*bl)->batk
|
||||
#define status_get_watk(bl) status_get_status_data(*bl)->rhw.atk
|
||||
#define status_get_watk2(bl) status_get_status_data(*bl)->rhw.atk2
|
||||
#define status_get_matk_max(bl) status_get_status_data(*bl)->matk_max
|
||||
#define status_get_matk_min(bl) status_get_status_data(*bl)->matk_min
|
||||
#define status_get_lwatk(bl) status_get_status_data(*bl)->lhw.atk
|
||||
#define status_get_lwatk2(bl) status_get_status_data(*bl)->lhw.atk2
|
||||
#define status_get_mdef(bl) status_get_status_data(bl)->mdef
|
||||
#define status_get_flee2(bl) status_get_status_data(bl)->flee2
|
||||
#define status_get_def2(bl) status_get_status_data(bl)->def2
|
||||
#define status_get_mdef2(bl) status_get_status_data(bl)->mdef2
|
||||
#define status_get_critical(bl) status_get_status_data(bl)->cri
|
||||
#define status_get_batk(bl) status_get_status_data(bl)->batk
|
||||
#define status_get_watk(bl) status_get_status_data(bl)->rhw.atk
|
||||
#define status_get_watk2(bl) status_get_status_data(bl)->rhw.atk2
|
||||
#define status_get_matk_max(bl) status_get_status_data(bl)->matk_max
|
||||
#define status_get_matk_min(bl) status_get_status_data(bl)->matk_min
|
||||
#define status_get_lwatk(bl) status_get_status_data(bl)->lhw.atk
|
||||
#define status_get_lwatk2(bl) status_get_status_data(bl)->lhw.atk2
|
||||
unsigned short status_get_speed(struct block_list *bl);
|
||||
#define status_get_adelay(bl) status_get_status_data(*bl)->adelay
|
||||
#define status_get_amotion(bl) status_get_status_data(*bl)->amotion
|
||||
#define status_get_clientamotion(bl) status_get_status_data(*bl)->clientamotion
|
||||
#define status_get_dmotion(bl) status_get_status_data(*bl)->dmotion
|
||||
#define status_get_patk(bl) status_get_status_data(*bl)->patk
|
||||
#define status_get_smatk(bl) status_get_status_data(*bl)->smatk
|
||||
#define status_get_res(bl) status_get_status_data(*bl)->res
|
||||
#define status_get_mres(bl) status_get_status_data(*bl)->mres
|
||||
#define status_get_hplus(bl) status_get_status_data(*bl)->hplus
|
||||
#define status_get_crate(bl) status_get_status_data(*bl)->crate
|
||||
#define status_get_element(bl) status_get_status_data(*bl)->def_ele
|
||||
#define status_get_element_level(bl) status_get_status_data(*bl)->ele_lv
|
||||
#define status_get_adelay(bl) status_get_status_data(bl)->adelay
|
||||
#define status_get_amotion(bl) status_get_status_data(bl)->amotion
|
||||
#define status_get_clientamotion(bl) status_get_status_data(bl)->clientamotion
|
||||
#define status_get_dmotion(bl) status_get_status_data(bl)->dmotion
|
||||
#define status_get_patk(bl) status_get_status_data(bl)->patk
|
||||
#define status_get_smatk(bl) status_get_status_data(bl)->smatk
|
||||
#define status_get_res(bl) status_get_status_data(bl)->res
|
||||
#define status_get_mres(bl) status_get_status_data(bl)->mres
|
||||
#define status_get_hplus(bl) status_get_status_data(bl)->hplus
|
||||
#define status_get_crate(bl) status_get_status_data(bl)->crate
|
||||
#define status_get_element(bl) status_get_status_data(bl)->def_ele
|
||||
#define status_get_element_level(bl) status_get_status_data(bl)->ele_lv
|
||||
unsigned char status_calc_attack_element(struct block_list *bl, status_change *sc, int element);
|
||||
#define status_get_attack_sc_element(bl, sc) status_calc_attack_element(bl, sc, 0)
|
||||
#define status_get_attack_element(bl) status_get_status_data(*bl)->rhw.ele
|
||||
#define status_get_attack_lelement(bl) status_get_status_data(*bl)->lhw.ele
|
||||
#define status_get_race(bl) status_get_status_data(*bl)->race
|
||||
#define status_get_class_(bl) status_get_status_data(*bl)->class_
|
||||
#define status_get_size(bl) status_get_status_data(*bl)->size
|
||||
#define status_get_mode(bl) status_get_status_data(*bl)->mode
|
||||
#define status_get_attack_element(bl) status_get_status_data(bl)->rhw.ele
|
||||
#define status_get_attack_lelement(bl) status_get_status_data(bl)->lhw.ele
|
||||
#define status_get_race(bl) status_get_status_data(bl)->race
|
||||
#define status_get_class_(bl) status_get_status_data(bl)->class_
|
||||
#define status_get_size(bl) status_get_status_data(bl)->size
|
||||
#define status_get_mode(bl) status_get_status_data(bl)->mode
|
||||
#define status_has_mode(status,md) (((status)->mode&(md)) == (md))
|
||||
#define status_bl_has_mode(bl,md) status_has_mode(status_get_status_data(*(bl)),(md))
|
||||
#define status_bl_has_mode(bl,md) status_has_mode(status_get_status_data((bl)),(md))
|
||||
|
||||
#define status_get_homstr(bl) (status->str + ((TBL_HOM*)bl)->homunculus.str_value)
|
||||
#define status_get_homagi(bl) (status->agi + ((TBL_HOM*)bl)->homunculus.agi_value)
|
||||
@ -3479,7 +3435,7 @@ void status_set_viewdata(struct block_list *bl, int class_);
|
||||
void status_change_init(struct block_list *bl);
|
||||
status_change *status_get_sc(struct block_list *bl);
|
||||
|
||||
bool status_isdead(block_list &bl);
|
||||
int status_isdead(struct block_list *bl);
|
||||
int status_isimmune(struct block_list *bl);
|
||||
|
||||
t_tick status_get_sc_def(struct block_list *src,struct block_list *bl, enum sc_type type, int rate, t_tick tick, unsigned char flag);
|
||||
|
@ -38,58 +38,54 @@ void trade_traderequest(map_session_data *sd, map_session_data *target_sd)
|
||||
}
|
||||
|
||||
if (target_sd == nullptr || sd == target_sd) {
|
||||
clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST);
|
||||
clif_tradestart(sd, 1); // character does not exist
|
||||
return;
|
||||
}
|
||||
|
||||
if (target_sd->npc_id) { // Trade fails if you are using an NPC.
|
||||
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
||||
clif_tradestart(sd, 2);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!battle_config.invite_request_check) {
|
||||
if (target_sd->guild_invite > 0 || target_sd->party_invite > 0 || target_sd->adopt_invite) {
|
||||
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
||||
clif_tradestart(sd, 2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( sd->trade_partner.id != 0 ) { // If a character tries to trade to another one then cancel the previous one
|
||||
map_session_data *previous_sd = map_id2sd(sd->trade_partner.id);
|
||||
if ( sd->trade_partner != 0 ) { // If a character tries to trade to another one then cancel the previous one
|
||||
map_session_data *previous_sd = map_id2sd(sd->trade_partner);
|
||||
|
||||
if( previous_sd != nullptr ){
|
||||
previous_sd->trade_partner = {0,0};
|
||||
previous_sd->trade_partner = 0;
|
||||
clif_tradecancelled( *previous_sd );
|
||||
} // Once cancelled then continue to the new one.
|
||||
sd->trade_partner = {0,0};
|
||||
sd->trade_partner = 0;
|
||||
clif_tradecancelled( *sd );
|
||||
}
|
||||
|
||||
if (target_sd->trade_partner.id != 0) {
|
||||
clif_traderesponse(*sd, TRADE_ACK_FAILED); // person is in another trade
|
||||
if (target_sd->trade_partner != 0) {
|
||||
clif_tradestart(sd, 2); // person is in another trade
|
||||
return;
|
||||
}
|
||||
|
||||
if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) { // check if both GMs are allowed to trade
|
||||
clif_displaymessage(sd->fd, msg_txt(sd,246));
|
||||
clif_traderesponse(*sd, TRADE_ACK_FAILED); // GM is not allowed to trade
|
||||
clif_tradestart(sd, 2); // GM is not allowed to trade
|
||||
return;
|
||||
}
|
||||
|
||||
// Players can not request trade from far away, unless they are allowed to use @trade.
|
||||
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
||||
(sd->bl.m != target_sd->bl.m || !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE))) {
|
||||
clif_traderesponse(*sd, TRADE_ACK_TOOFAR);
|
||||
clif_tradestart(sd, 0); // too far
|
||||
return ;
|
||||
}
|
||||
|
||||
target_sd->trade_partner.id = sd->status.account_id;
|
||||
target_sd->trade_partner.lv = sd->status.base_level;
|
||||
|
||||
sd->trade_partner.id = target_sd->status.account_id;
|
||||
sd->trade_partner.lv = target_sd->status.base_level;
|
||||
|
||||
clif_traderequest(*target_sd, sd->status.name);
|
||||
target_sd->trade_partner = sd->status.account_id;
|
||||
sd->trade_partner = target_sd->status.account_id;
|
||||
clif_traderequest(target_sd, sd->status.name);
|
||||
}
|
||||
|
||||
|
||||
@ -111,28 +107,28 @@ void trade_tradeack(map_session_data *sd, int type)
|
||||
|
||||
nullpo_retv(sd);
|
||||
|
||||
if (sd->state.trading || !sd->trade_partner.id)
|
||||
if (sd->state.trading || !sd->trade_partner)
|
||||
return; // Already trading or no partner set.
|
||||
|
||||
if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) {
|
||||
clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST);
|
||||
sd->trade_partner = {0,0};
|
||||
if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) {
|
||||
clif_tradestart(sd, 1); // Character does not exist
|
||||
sd->trade_partner=0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (tsd->state.trading || tsd->trade_partner.id != sd->bl.id) {
|
||||
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
||||
sd->trade_partner = {0,0};
|
||||
if (tsd->state.trading || tsd->trade_partner != sd->bl.id) {
|
||||
clif_tradestart(sd, 2);
|
||||
sd->trade_partner=0;
|
||||
return; // Already trading or wrong partner.
|
||||
}
|
||||
|
||||
if (type == 4) { // Cancel
|
||||
clif_traderesponse(*tsd, TRADE_ACK_CANCEL);
|
||||
clif_traderesponse(*sd, TRADE_ACK_CANCEL);
|
||||
clif_tradestart(tsd, type);
|
||||
clif_tradestart(sd, type);
|
||||
sd->state.deal_locked = 0;
|
||||
sd->trade_partner = {0,0};
|
||||
sd->trade_partner = 0;
|
||||
tsd->state.deal_locked = 0;
|
||||
tsd->trade_partner = {0,0};
|
||||
tsd->trade_partner = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -143,21 +139,21 @@ void trade_tradeack(map_session_data *sd, int type)
|
||||
// Check here as well since the original character could had warped.
|
||||
if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) &&
|
||||
(sd->bl.m != tsd->bl.m || !check_distance_bl(&sd->bl, &tsd->bl, TRADE_DISTANCE))) {
|
||||
clif_traderesponse(*sd, TRADE_ACK_TOOFAR);
|
||||
sd->trade_partner = {0,0};
|
||||
tsd->trade_partner = {0,0};
|
||||
clif_tradestart(sd, 0); // too far
|
||||
sd->trade_partner=0;
|
||||
tsd->trade_partner = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if you can start trade.
|
||||
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag ||
|
||||
tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag) { // Fail
|
||||
clif_traderesponse(*sd, TRADE_ACK_FAILED);
|
||||
clif_traderesponse(*tsd, TRADE_ACK_FAILED);
|
||||
clif_tradestart(sd, 2);
|
||||
clif_tradestart(tsd, 2);
|
||||
sd->state.deal_locked = 0;
|
||||
sd->trade_partner = {0,0};
|
||||
sd->trade_partner = 0;
|
||||
tsd->state.deal_locked = 0;
|
||||
tsd->trade_partner = {0,0};
|
||||
tsd->trade_partner = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -166,8 +162,8 @@ void trade_tradeack(map_session_data *sd, int type)
|
||||
tsd->state.trading = 1;
|
||||
memset(&sd->deal, 0, sizeof(sd->deal));
|
||||
memset(&tsd->deal, 0, sizeof(tsd->deal));
|
||||
clif_traderesponse(*tsd, static_cast<e_ack_trade_response>( type ));
|
||||
clif_traderesponse(*sd, static_cast<e_ack_trade_response>( type ));
|
||||
clif_tradestart(tsd, type);
|
||||
clif_tradestart(sd, type);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -360,7 +356,7 @@ void trade_tradeadditem(map_session_data *sd, short index, short amount)
|
||||
if( !sd->state.trading || sd->state.deal_locked > 0 )
|
||||
return; // Can't add stuff.
|
||||
|
||||
if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) {
|
||||
if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) {
|
||||
trade_tradecancel(sd);
|
||||
return;
|
||||
}
|
||||
@ -457,7 +453,7 @@ void trade_tradeaddzeny(map_session_data* sd, int amount)
|
||||
if( !sd->state.trading || sd->state.deal_locked > 0 )
|
||||
return; //Can't add stuff.
|
||||
|
||||
if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) {
|
||||
if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) {
|
||||
trade_tradecancel(sd);
|
||||
return;
|
||||
}
|
||||
@ -482,7 +478,7 @@ void trade_tradeok(map_session_data *sd)
|
||||
if(sd->state.deal_locked || !sd->state.trading)
|
||||
return;
|
||||
|
||||
if ((target_sd = map_id2sd(sd->trade_partner.id)) == nullptr) {
|
||||
if ((target_sd = map_id2sd(sd->trade_partner)) == nullptr) {
|
||||
trade_tradecancel(sd);
|
||||
return;
|
||||
}
|
||||
@ -504,15 +500,15 @@ void trade_tradecancel(map_session_data *sd)
|
||||
|
||||
nullpo_retv(sd);
|
||||
|
||||
target_sd = map_id2sd(sd->trade_partner.id);
|
||||
target_sd = map_id2sd(sd->trade_partner);
|
||||
sd->state.isBoundTrading = 0;
|
||||
|
||||
if(!sd->state.trading) { // Not trade accepted
|
||||
if( target_sd != nullptr ) {
|
||||
target_sd->trade_partner = {0,0};
|
||||
target_sd->trade_partner = 0;
|
||||
clif_tradecancelled( *target_sd );
|
||||
}
|
||||
sd->trade_partner = {0,0};
|
||||
sd->trade_partner = 0;
|
||||
clif_tradecancelled( *sd );
|
||||
return;
|
||||
}
|
||||
@ -533,7 +529,7 @@ void trade_tradecancel(map_session_data *sd)
|
||||
|
||||
sd->state.deal_locked = 0;
|
||||
sd->state.trading = 0;
|
||||
sd->trade_partner = {0,0};
|
||||
sd->trade_partner = 0;
|
||||
clif_tradecancelled( *sd );
|
||||
|
||||
if (!target_sd)
|
||||
@ -553,7 +549,7 @@ void trade_tradecancel(map_session_data *sd)
|
||||
}
|
||||
|
||||
target_sd->state.deal_locked = 0;
|
||||
target_sd->trade_partner = {0,0};
|
||||
target_sd->trade_partner = 0;
|
||||
target_sd->state.trading = 0;
|
||||
clif_tradecancelled( *target_sd );
|
||||
}
|
||||
@ -573,7 +569,7 @@ void trade_tradecommit(map_session_data *sd)
|
||||
if (!sd->state.trading || !sd->state.deal_locked) //Locked should be 1 (pressed ok) before you can press trade.
|
||||
return;
|
||||
|
||||
if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) {
|
||||
if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) {
|
||||
trade_tradecancel(sd);
|
||||
return;
|
||||
}
|
||||
@ -646,12 +642,12 @@ void trade_tradecommit(map_session_data *sd)
|
||||
}
|
||||
|
||||
sd->state.deal_locked = 0;
|
||||
sd->trade_partner = {0,0};
|
||||
sd->trade_partner = 0;
|
||||
sd->state.trading = 0;
|
||||
sd->state.isBoundTrading = 0;
|
||||
|
||||
tsd->state.deal_locked = 0;
|
||||
tsd->trade_partner = {0,0};
|
||||
tsd->trade_partner = 0;
|
||||
tsd->state.trading = 0;
|
||||
tsd->state.isBoundTrading = 0;
|
||||
|
||||
|
@ -4,19 +4,8 @@
|
||||
#ifndef TRADE_HPP
|
||||
#define TRADE_HPP
|
||||
|
||||
#include <common/cbasetypes.hpp>
|
||||
|
||||
class map_session_data;
|
||||
|
||||
enum e_ack_trade_response : uint8 {
|
||||
TRADE_ACK_TOOFAR = 0,
|
||||
TRADE_ACK_CHARNOTEXIST,
|
||||
TRADE_ACK_FAILED,
|
||||
TRADE_ACK_ACCEPT,
|
||||
TRADE_ACK_CANCEL,
|
||||
TRADE_ACK_BUSY
|
||||
};
|
||||
|
||||
void trade_traderequest(map_session_data *sd, map_session_data *target_sd);
|
||||
void trade_tradeack(map_session_data *sd,int type);
|
||||
void trade_tradeadditem(map_session_data *sd,short index,short amount);
|
||||
|
@ -507,7 +507,7 @@ static TIMER_FUNC(unit_walktoxy_timer)
|
||||
ud->state.walk_script = false;
|
||||
|
||||
// Check if the unit was killed
|
||||
if( status_isdead(*bl) ){
|
||||
if( status_isdead(bl) ){
|
||||
struct mob_data* md = BL_CAST(BL_MOB, bl);
|
||||
|
||||
if( md && !md->spawn ){
|
||||
@ -1132,7 +1132,7 @@ bool unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, boo
|
||||
|
||||
if( flag ) {
|
||||
unit_movepos(pbl,sd->bl.x,sd->bl.y, 0, 0);
|
||||
clif_slide(*pbl,pbl->x,pbl->y);
|
||||
clif_slide(pbl,pbl->x,pbl->y);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1166,7 +1166,7 @@ bool unit_setdir(block_list *bl, uint8 dir, bool send_update)
|
||||
}
|
||||
|
||||
if (send_update)
|
||||
clif_changed_dir(*bl, AREA);
|
||||
clif_changed_dir(bl, AREA);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -1639,9 +1639,9 @@ TIMER_FUNC(unit_resume_running){
|
||||
TBL_PC *sd = map_id2sd(id);
|
||||
|
||||
if (sd && pc_isridingwug(sd))
|
||||
clif_skill_nodamage(ud->bl,*ud->bl,RA_WUGDASH,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_WUGDASH,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
|
||||
clif_skill_nodamage(ud->bl,ud->bl,RA_WUGDASH,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_WUGDASH,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
|
||||
else
|
||||
clif_skill_nodamage(ud->bl,*ud->bl,TK_RUN,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_RUN,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
|
||||
clif_skill_nodamage(ud->bl,ud->bl,TK_RUN,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_RUN,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0));
|
||||
|
||||
if (sd)
|
||||
clif_walkok(*sd);
|
||||
@ -1668,7 +1668,7 @@ int unit_set_walkdelay(struct block_list *bl, t_tick tick, t_tick delay, int typ
|
||||
|
||||
if (type) {
|
||||
//Bosses can ignore skill induced walkdelay (but not damage induced)
|
||||
if(bl->type == BL_MOB && status_has_mode(status_get_status_data(*bl),MD_STATUSIMMUNE))
|
||||
if(bl->type == BL_MOB && status_has_mode(status_get_status_data(bl),MD_STATUSIMMUNE))
|
||||
return 0;
|
||||
//Make sure walk delay is not decreased
|
||||
if (DIFF_TICK(ud->canmove_tick, tick+delay) > 0)
|
||||
@ -1724,6 +1724,7 @@ int unit_set_walkdelay(struct block_list *bl, t_tick tick, t_tick delay, int typ
|
||||
int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, uint16 skill_lv, int casttime, int castcancel, bool ignore_range)
|
||||
{
|
||||
struct unit_data *ud;
|
||||
struct status_data *tstatus;
|
||||
status_change *sc;
|
||||
map_session_data *sd = nullptr;
|
||||
struct block_list * target = nullptr;
|
||||
@ -1732,7 +1733,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
||||
|
||||
nullpo_ret(src);
|
||||
|
||||
if(status_isdead(*src))
|
||||
if(status_isdead(src))
|
||||
return 0; // Do not continue source is dead
|
||||
|
||||
sd = BL_CAST(BL_PC, src);
|
||||
@ -1872,7 +1873,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
||||
return 0;
|
||||
}
|
||||
|
||||
status_data* tstatus = status_get_status_data(*target);
|
||||
tstatus = status_get_status_data(target);
|
||||
|
||||
// Record the status of the previous skill)
|
||||
if(sd) {
|
||||
@ -2017,7 +2018,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
||||
case ALL_RESURRECTION:
|
||||
if(battle_check_undead(tstatus->race,tstatus->def_ele))
|
||||
combo = 1;
|
||||
else if (!status_isdead(*target))
|
||||
else if (!status_isdead(target))
|
||||
return 0; // Can't cast on non-dead characters.
|
||||
break;
|
||||
case MO_FINGEROFFENSIVE:
|
||||
@ -2250,7 +2251,7 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
|
||||
if (!src->prev)
|
||||
return 0; // Not on the map
|
||||
|
||||
if(status_isdead(*src))
|
||||
if(status_isdead(src))
|
||||
return 0;
|
||||
|
||||
sd = BL_CAST(BL_PC, src);
|
||||
@ -2538,7 +2539,7 @@ int unit_attack(struct block_list *src,int target_id,int continuous)
|
||||
nullpo_ret(ud = unit_bl2ud(src));
|
||||
|
||||
target = map_id2bl(target_id);
|
||||
if( target == nullptr || status_isdead(*target) ) {
|
||||
if( target == nullptr || status_isdead(target) ) {
|
||||
unit_unattackable(src);
|
||||
return 1;
|
||||
}
|
||||
@ -2796,6 +2797,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
|
||||
{
|
||||
struct block_list *target;
|
||||
struct unit_data *ud;
|
||||
struct status_data *sstatus;
|
||||
map_session_data *sd = nullptr;
|
||||
struct mob_data *md = nullptr;
|
||||
int range;
|
||||
@ -2816,7 +2818,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
|
||||
if( src == nullptr || src->prev == nullptr || target==nullptr || target->prev == nullptr )
|
||||
return 0;
|
||||
|
||||
if( status_isdead(*src) || status_isdead(*target) ||
|
||||
if( status_isdead(src) || status_isdead(target) ||
|
||||
battle_check_target(src,target,BCT_ENEMY) <= 0 || !status_check_skilluse(src, target, 0, 0)
|
||||
#ifdef OFFICIAL_WALKPATH
|
||||
|| !path_search_long(nullptr, src->m, src->x, src->y, target->x, target->y, CELL_CHKWALL)
|
||||
@ -2854,7 +2856,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, t_tick tick)
|
||||
return 1;
|
||||
}
|
||||
|
||||
status_data* sstatus = status_get_status_data(*src);
|
||||
sstatus = status_get_status_data(src);
|
||||
range = sstatus->rhw.range;
|
||||
|
||||
if( (unit_is_walking(target) || ud->state.step_attack)
|
||||
@ -3130,44 +3132,32 @@ int unit_counttargeted(struct block_list* bl)
|
||||
* @param src Current target
|
||||
* @param target New target
|
||||
**/
|
||||
int unit_changetarget(block_list *bl, va_list ap) {
|
||||
if (bl == nullptr)
|
||||
return 1;
|
||||
unit_data *ud = unit_bl2ud(bl);
|
||||
block_list *src = va_arg(ap, block_list *);
|
||||
block_list *target = va_arg(ap, block_list *);
|
||||
int unit_changetarget(struct block_list *bl, va_list ap) {
|
||||
struct unit_data *ud = unit_bl2ud(bl);
|
||||
struct block_list *src = va_arg(ap,struct block_list *);
|
||||
struct block_list *target = va_arg(ap,struct block_list *);
|
||||
|
||||
if (ud == nullptr || src == nullptr || target == nullptr || ud->target == target->id)
|
||||
if (!ud || !target || ud->target == target->id)
|
||||
return 1;
|
||||
if (ud->target <= 0 && ud->target_to <= 0)
|
||||
if (!ud->target && !ud->target_to)
|
||||
return 1;
|
||||
if (ud->target != src->id && ud->target_to != src->id)
|
||||
return 1;
|
||||
|
||||
unit_changetarget_sub(*ud, *target);
|
||||
if (bl->type == BL_MOB)
|
||||
(BL_CAST(BL_MOB,bl))->target_id = target->id;
|
||||
if (ud->target_to)
|
||||
ud->target_to = target->id;
|
||||
else
|
||||
ud->target_to = 0;
|
||||
if (ud->skilltarget)
|
||||
ud->skilltarget = target->id;
|
||||
unit_set_target(ud, target->id);
|
||||
|
||||
//unit_attack(bl, target->id, ud->state.attack_continue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the target of a unit
|
||||
* @param ud: Unit data
|
||||
* @param target: New target data
|
||||
**/
|
||||
void unit_changetarget_sub(unit_data& ud, block_list& target) {
|
||||
if (status_isdead(target))
|
||||
return;
|
||||
|
||||
if (ud.bl->type == BL_MOB)
|
||||
reinterpret_cast<mob_data*>(ud.bl)->target_id = target.id;
|
||||
if (ud.target_to > 0)
|
||||
ud.target_to = target.id;
|
||||
if (ud.skilltarget > 0)
|
||||
ud.skilltarget = target.id;
|
||||
unit_set_target(&ud, target.id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a bl/ud from the map
|
||||
* On kill specifics are not performed here, check status_damage()
|
||||
@ -3239,7 +3229,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
|
||||
if(sd->chatID)
|
||||
chat_leavechat(sd,0);
|
||||
|
||||
if(sd->trade_partner.id > 0)
|
||||
if(sd->trade_partner)
|
||||
trade_tradecancel(sd);
|
||||
|
||||
searchstore_close(*sd);
|
||||
@ -3422,7 +3412,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
|
||||
break;
|
||||
case BL_MOB:
|
||||
// /BL_MOB is handled by mob_dead unless the monster is not dead.
|
||||
if (status_isdead(*bl)) {
|
||||
if (status_isdead(bl)) {
|
||||
map_delblock(bl);
|
||||
break;
|
||||
}
|
||||
@ -3532,7 +3522,7 @@ int unit_free(struct block_list *bl, clr_type clrtype)
|
||||
map_session_data *sd = (map_session_data*)bl;
|
||||
int i;
|
||||
|
||||
if( status_isdead(*bl) )
|
||||
if( status_isdead(bl) )
|
||||
pc_setrestartvalue(sd,2);
|
||||
|
||||
pc_delinvincibletimer(sd);
|
||||
|
@ -172,8 +172,8 @@ void unit_free_pc(map_session_data *sd);
|
||||
#define unit_remove_map(bl,clrtype) unit_remove_map_(bl,clrtype,__FILE__,__LINE__,__func__)
|
||||
int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, int line, const char* func);
|
||||
int unit_free(struct block_list *bl, clr_type clrtype);
|
||||
int unit_changetarget(block_list *bl,va_list ap);
|
||||
void unit_changetarget_sub(unit_data& ud, block_list& target);
|
||||
int unit_changeviewsize(struct block_list *bl,short size);
|
||||
int unit_changetarget(struct block_list *bl,va_list ap);
|
||||
|
||||
// Shadow Scar
|
||||
void unit_addshadowscar(unit_data &ud, int interval);
|
||||
|
@ -562,11 +562,11 @@ void vending_reopen( map_session_data& sd )
|
||||
if( (fail = vending_openvending(sd, at->title, data, count, at)) == 0 ) {
|
||||
// Make vendor look perfect
|
||||
pc_setdir(&sd, at->dir, at->head_dir);
|
||||
clif_changed_dir(sd.bl, AREA_WOS);
|
||||
clif_changed_dir(&sd.bl, AREA_WOS);
|
||||
if( at->sit ) {
|
||||
pc_setsit(&sd);
|
||||
skill_sit(&sd, 1);
|
||||
clif_sitting(sd.bl);
|
||||
clif_sitting(&sd.bl);
|
||||
}
|
||||
|
||||
// Immediate save
|
||||
|
Loading…
x
Reference in New Issue
Block a user