Compare commits
13 Commits
master
...
hotfix/van
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d2c9e90725 | ||
![]() |
4c5ad8d667 | ||
![]() |
7796284d7d | ||
![]() |
0a23c33181 | ||
![]() |
d0990e6ee1 | ||
![]() |
255e69d181 | ||
![]() |
364818e582 | ||
![]() |
d85c709ccb | ||
![]() |
b07fcd3c7c | ||
![]() |
13abe0c66b | ||
![]() |
b3c827fbcf | ||
![]() |
ae501999bb | ||
![]() |
c07f685a31 |
@ -31026,19 +31026,7 @@ Body:
|
|||||||
MaxLevel: 5
|
MaxLevel: 5
|
||||||
Type: Magic
|
Type: Magic
|
||||||
TargetType: Attack
|
TargetType: Attack
|
||||||
Range: 15
|
Range: 9
|
||||||
Hit: Single
|
|
||||||
HitCount:
|
|
||||||
- Level: 1
|
|
||||||
Count: 1
|
|
||||||
- Level: 2
|
|
||||||
Count: 2
|
|
||||||
- Level: 3
|
|
||||||
Count: 3
|
|
||||||
- Level: 4
|
|
||||||
Count: 4
|
|
||||||
- Level: 5
|
|
||||||
Count: 5
|
|
||||||
Requires:
|
Requires:
|
||||||
SpCost:
|
SpCost:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
@ -31055,10 +31043,10 @@ Body:
|
|||||||
Name: HVAN_CHAOTIC
|
Name: HVAN_CHAOTIC
|
||||||
Description: Benediction of Chaos
|
Description: Benediction of Chaos
|
||||||
MaxLevel: 5
|
MaxLevel: 5
|
||||||
|
Type: Magic
|
||||||
TargetType: Self
|
TargetType: Self
|
||||||
DamageFlags:
|
DamageFlags:
|
||||||
NoDamage: true
|
NoDamage: true
|
||||||
Hit: Single
|
|
||||||
AfterCastWalkDelay: 1500
|
AfterCastWalkDelay: 1500
|
||||||
Requires:
|
Requires:
|
||||||
SpCost: 40
|
SpCost: 40
|
||||||
@ -31066,8 +31054,6 @@ Body:
|
|||||||
Name: HVAN_INSTRUCT
|
Name: HVAN_INSTRUCT
|
||||||
Description: Instruct
|
Description: Instruct
|
||||||
MaxLevel: 5
|
MaxLevel: 5
|
||||||
DamageFlags:
|
|
||||||
NoDamage: true
|
|
||||||
- Id: 8016
|
- Id: 8016
|
||||||
Name: HVAN_EXPLOSION
|
Name: HVAN_EXPLOSION
|
||||||
Description: Bio Explosion
|
Description: Bio Explosion
|
||||||
@ -31079,10 +31065,13 @@ Body:
|
|||||||
IgnoreElement: true
|
IgnoreElement: true
|
||||||
IgnoreFlee: true
|
IgnoreFlee: true
|
||||||
IgnoreDefCard: true
|
IgnoreDefCard: true
|
||||||
|
Flags:
|
||||||
|
TargetTrap: true
|
||||||
Hit: Single
|
Hit: Single
|
||||||
HitCount: 1
|
HitCount: 1
|
||||||
Element: Weapon
|
Element: Neutral
|
||||||
SplashArea: 4
|
SplashArea: 5
|
||||||
|
Duration1: 1500
|
||||||
Requires:
|
Requires:
|
||||||
SpCost: 1
|
SpCost: 1
|
||||||
- Id: 8018
|
- Id: 8018
|
||||||
|
@ -202634,17 +202634,6 @@ Body:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
- Id: 480470
|
|
||||||
AegisName: C_Summer_Beach
|
|
||||||
Name: Costume Summer Beach # !todo check english name
|
|
||||||
Type: Armor
|
|
||||||
Locations:
|
|
||||||
Costume_Garment: true
|
|
||||||
ArmorLevel: 1
|
|
||||||
Script: |
|
|
||||||
hateffect HAT_EF_VACATION,true;
|
|
||||||
UnEquipScript: |
|
|
||||||
hateffect HAT_EF_VACATION,false;
|
|
||||||
- Id: 490004
|
- Id: 490004
|
||||||
AegisName: Atker_Ring
|
AegisName: Atker_Ring
|
||||||
Name: Attacker Booster Ring
|
Name: Attacker Booster Ring
|
||||||
|
@ -80408,28 +80408,6 @@ Body:
|
|||||||
Name: Footprint Effect
|
Name: Footprint Effect
|
||||||
Type: Card
|
Type: Card
|
||||||
SubType: Enchant
|
SubType: Enchant
|
||||||
Script: |
|
|
||||||
hateffect FOOTPRINT_EF_BASE,true;
|
|
||||||
UnEquipScript: |
|
|
||||||
hateffect FOOTPRINT_EF_BASE,false;
|
|
||||||
- Id: 313067
|
|
||||||
AegisName: aegis_313067
|
|
||||||
Name: Purple Star Footprint
|
|
||||||
Type: Card
|
|
||||||
SubType: Enchant
|
|
||||||
Script: |
|
|
||||||
hateffect FOOTPRINT_EF_PURPLESTAR,true;
|
|
||||||
UnEquipScript: |
|
|
||||||
hateffect FOOTPRINT_EF_PURPLESTAR,false;
|
|
||||||
- Id: 313068
|
|
||||||
AegisName: aegis_313068
|
|
||||||
Name: Yellow Star Footprint
|
|
||||||
Type: Card
|
|
||||||
SubType: Enchant
|
|
||||||
Script: |
|
|
||||||
hateffect FOOTPRINT_EF_YELLOWSTAR,true;
|
|
||||||
UnEquipScript: |
|
|
||||||
hateffect FOOTPRINT_EF_YELLOWSTAR,false;
|
|
||||||
- Id: 313070
|
- Id: 313070
|
||||||
AegisName: Ep21_4_Def
|
AegisName: Ep21_4_Def
|
||||||
Name: Forest Magic Orb (Physical Defense)
|
Name: Forest Magic Orb (Physical Defense)
|
||||||
@ -81918,15 +81896,6 @@ Body:
|
|||||||
Script: |
|
Script: |
|
||||||
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
|
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||||
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
|
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||||
- Id: 313345
|
|
||||||
AegisName: aegis_313345
|
|
||||||
Name: Puppy Footprint
|
|
||||||
Type: Card
|
|
||||||
SubType: Enchant
|
|
||||||
Script: |
|
|
||||||
hateffect FOOTPRINT_EF_DOGFOOT,true;
|
|
||||||
UnEquipScript: |
|
|
||||||
hateffect FOOTPRINT_EF_DOGFOOT,false;
|
|
||||||
- Id: 1000000
|
- Id: 1000000
|
||||||
AegisName: IDTest_event
|
AegisName: IDTest_event
|
||||||
Name: IDTest event
|
Name: IDTest event
|
||||||
@ -89471,11 +89440,6 @@ Body:
|
|||||||
Name: Footprint Effect (Garment)
|
Name: Footprint Effect (Garment)
|
||||||
Type: Etc
|
Type: Etc
|
||||||
Weight: 100
|
Weight: 100
|
||||||
- Id: 1001617
|
|
||||||
AegisName: PurpleStar_Foot_Robe
|
|
||||||
Name: Purple Star Footprint (Garment)
|
|
||||||
Type: Etc
|
|
||||||
Weight: 100
|
|
||||||
- Id: 1001618
|
- Id: 1001618
|
||||||
AegisName: aegis_1001618
|
AegisName: aegis_1001618
|
||||||
Name: Wigner Premium Exchange Ticket
|
Name: Wigner Premium Exchange Ticket
|
||||||
@ -89745,11 +89709,6 @@ Body:
|
|||||||
Weight: 10
|
Weight: 10
|
||||||
Flags:
|
Flags:
|
||||||
BuyingStore: true
|
BuyingStore: true
|
||||||
- Id: 1001650
|
|
||||||
AegisName: YellowStar_Foot_Robe
|
|
||||||
Name: Yellow Star Footprint (Garment)
|
|
||||||
Type: Etc
|
|
||||||
Weight: 100
|
|
||||||
- Id: 1001653
|
- Id: 1001653
|
||||||
AegisName: Ep21_Armor_E_Stone1
|
AegisName: Ep21_Armor_E_Stone1
|
||||||
Name: Turquoise Magic Stone
|
Name: Turquoise Magic Stone
|
||||||
@ -90363,11 +90322,6 @@ Body:
|
|||||||
NoGuildStorage: true
|
NoGuildStorage: true
|
||||||
NoMail: true
|
NoMail: true
|
||||||
NoAuction: true
|
NoAuction: true
|
||||||
- Id: 1001772
|
|
||||||
AegisName: aegis_1001772
|
|
||||||
Name: Puppy Footprint (Garment)
|
|
||||||
Type: Etc
|
|
||||||
Weight: 100
|
|
||||||
- Id: 1200000
|
- Id: 1200000
|
||||||
AegisName: IDTest_arrow
|
AegisName: IDTest_arrow
|
||||||
Name: IDTest arrow
|
Name: IDTest arrow
|
||||||
|
@ -78855,11 +78855,6 @@ Body:
|
|||||||
NoAuction: true
|
NoAuction: true
|
||||||
Script: |
|
Script: |
|
||||||
getgroupitem(IG_STOVE_CHANNELING_BOX_4);
|
getgroupitem(IG_STOVE_CHANNELING_BOX_4);
|
||||||
- Id: 103263
|
|
||||||
AegisName: Summer_Select_Box4
|
|
||||||
Name: Star Footprint Selection Box (Summer Beach)
|
|
||||||
Type: Usable
|
|
||||||
Weight: 10
|
|
||||||
- Id: 200000
|
- Id: 200000
|
||||||
AegisName: IDTest_Cash
|
AegisName: IDTest_Cash
|
||||||
Name: IDTest Cash
|
Name: IDTest Cash
|
||||||
|
@ -980,13 +980,3 @@ Body:
|
|||||||
- Group: 1
|
- Group: 1
|
||||||
Items:
|
Items:
|
||||||
- Item: C_Chaos_Emerald
|
- Item: C_Chaos_Emerald
|
||||||
- Item: Summer_Select_Box4
|
|
||||||
Groups:
|
|
||||||
- Group: 0
|
|
||||||
Items:
|
|
||||||
- Item: PurpleStar_Foot_Robe
|
|
||||||
- Item: C_Summer_Beach
|
|
||||||
- Group: 1
|
|
||||||
Items:
|
|
||||||
- Item: YellowStar_Foot_Robe
|
|
||||||
- Item: C_Summer_Beach
|
|
||||||
|
1581
db/re/job_stats.yml
1581
db/re/job_stats.yml
File diff suppressed because it is too large
Load Diff
@ -7535,7 +7535,7 @@ Body:
|
|||||||
TargetTrap: true
|
TargetTrap: true
|
||||||
Range: 9
|
Range: 9
|
||||||
Hit: Multi_Hit
|
Hit: Multi_Hit
|
||||||
HitCount: -5
|
HitCount: 5
|
||||||
Element: Weapon
|
Element: Weapon
|
||||||
CopyFlags:
|
CopyFlags:
|
||||||
Skill:
|
Skill:
|
||||||
@ -43312,19 +43312,7 @@ Body:
|
|||||||
MaxLevel: 5
|
MaxLevel: 5
|
||||||
Type: Magic
|
Type: Magic
|
||||||
TargetType: Attack
|
TargetType: Attack
|
||||||
Range: 15
|
Range: 9
|
||||||
Hit: Single
|
|
||||||
HitCount:
|
|
||||||
- Level: 1
|
|
||||||
Count: 1
|
|
||||||
- Level: 2
|
|
||||||
Count: 2
|
|
||||||
- Level: 3
|
|
||||||
Count: 3
|
|
||||||
- Level: 4
|
|
||||||
Count: 4
|
|
||||||
- Level: 5
|
|
||||||
Count: 5
|
|
||||||
Cooldown:
|
Cooldown:
|
||||||
- Level: 1
|
- Level: 1
|
||||||
Time: 2000
|
Time: 2000
|
||||||
@ -43352,10 +43340,10 @@ Body:
|
|||||||
Name: HVAN_CHAOTIC
|
Name: HVAN_CHAOTIC
|
||||||
Description: Benediction of Chaos
|
Description: Benediction of Chaos
|
||||||
MaxLevel: 5
|
MaxLevel: 5
|
||||||
|
Type: Magic
|
||||||
TargetType: Self
|
TargetType: Self
|
||||||
DamageFlags:
|
DamageFlags:
|
||||||
NoDamage: true
|
NoDamage: true
|
||||||
Hit: Single
|
|
||||||
AfterCastWalkDelay: 1500
|
AfterCastWalkDelay: 1500
|
||||||
Cooldown: 3000
|
Cooldown: 3000
|
||||||
Requires:
|
Requires:
|
||||||
@ -43364,8 +43352,6 @@ Body:
|
|||||||
Name: HVAN_INSTRUCT
|
Name: HVAN_INSTRUCT
|
||||||
Description: Instruct
|
Description: Instruct
|
||||||
MaxLevel: 5
|
MaxLevel: 5
|
||||||
DamageFlags:
|
|
||||||
NoDamage: true
|
|
||||||
- Id: 8016
|
- Id: 8016
|
||||||
Name: HVAN_EXPLOSION
|
Name: HVAN_EXPLOSION
|
||||||
Description: Bio Explosion
|
Description: Bio Explosion
|
||||||
@ -43377,11 +43363,13 @@ Body:
|
|||||||
IgnoreElement: true
|
IgnoreElement: true
|
||||||
IgnoreFlee: true
|
IgnoreFlee: true
|
||||||
IgnoreDefCard: true
|
IgnoreDefCard: true
|
||||||
|
Flags:
|
||||||
|
TargetTrap: true
|
||||||
Hit: Single
|
Hit: Single
|
||||||
HitCount: 1
|
HitCount: 1
|
||||||
Element: Weapon
|
Element: Neutral
|
||||||
SplashArea: 4
|
SplashArea: 5
|
||||||
AfterCastActDelay: 5000
|
Duration1: 1500
|
||||||
CoolDown: 1000
|
CoolDown: 1000
|
||||||
Requires:
|
Requires:
|
||||||
SpCost: 1
|
SpCost: 1
|
||||||
|
@ -3693,12 +3693,6 @@ static int battle_get_spiritball_damage(struct Damage& wd, struct block_list& sr
|
|||||||
// These skills used as many spheres as they do hits
|
// These skills used as many spheres as they do hits
|
||||||
damage = (wd.div_ + sd->spiritball) * 3;
|
damage = (wd.div_ + sd->spiritball) * 3;
|
||||||
break;
|
break;
|
||||||
#ifdef RENEWAL
|
|
||||||
case MO_FINGEROFFENSIVE:
|
|
||||||
// These skills store the spheres used in spiritball_old
|
|
||||||
damage = (sd->spiritball_old + sd->spiritball) * 3;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case MO_EXTREMITYFIST:
|
case MO_EXTREMITYFIST:
|
||||||
// These skills store the number of spheres the player had before cast
|
// These skills store the number of spheres the player had before cast
|
||||||
damage = sd->spiritball_old * 3;
|
damage = sd->spiritball_old * 3;
|
||||||
@ -6809,9 +6803,9 @@ static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,s
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Triple Attack and Finger Offensive have a special property, they do not split damage on plant mode
|
// Triple Attack has a special property that it does not split damage on plant mode
|
||||||
// In pre-renewal, it requires the monster to have exactly 100 def
|
// In pre-renewal, it requires the monster to have exactly 100 def
|
||||||
if ((skill_id == MO_TRIPLEATTACK || skill_id == MO_FINGEROFFENSIVE) && wd->div_ < 0
|
if (skill_id == MO_TRIPLEATTACK && wd->div_ < 0
|
||||||
#ifndef RENEWAL
|
#ifndef RENEWAL
|
||||||
&& tstatus->def == 100
|
&& tstatus->def == 100
|
||||||
#endif
|
#endif
|
||||||
|
@ -15460,24 +15460,28 @@ void clif_parse_HomMoveToMaster(int fd, map_session_data *sd){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Request to move homunculus/mercenary (CZ_REQUEST_MOVENPC).
|
/// Request to move homunculus/mercenary.
|
||||||
/// 0232 <id>.L <position data>.3B
|
/// 0232 <id>.L <position data>.3B (CZ_REQUEST_MOVENPC)
|
||||||
void clif_parse_HomMoveTo(int fd, map_session_data *sd){
|
void clif_parse_HomMoveTo(int fd, map_session_data *sd){
|
||||||
struct s_packet_db* info = &packet_db[RFIFOW(fd,0)];
|
#if PACKETVER >= 20050425
|
||||||
int id = RFIFOL(fd,info->pos[0]); // Mercenary or Homunculus
|
const PACKET_CZ_REQUEST_MOVENPC* p = reinterpret_cast<const PACKET_CZ_REQUEST_MOVENPC*>( RFIFOP( fd, 0 ) );
|
||||||
struct block_list *bl = nullptr;
|
struct block_list *bl = nullptr;
|
||||||
short x, y;
|
short x, y;
|
||||||
|
|
||||||
RFIFOPOS(fd, info->pos[1], &x, &y, nullptr);
|
RBUFPOS( p->PosDir, 0, &x, &y, nullptr );
|
||||||
|
|
||||||
if( sd->md && sd->md->bl.id == id )
|
if( sd->md && sd->md->bl.id == p->GID )
|
||||||
bl = &sd->md->bl; // Moving Mercenary
|
bl = &sd->md->bl; // Moving Mercenary
|
||||||
else if( hom_is_active(sd->hd) && sd->hd->bl.id == id )
|
else if( hom_is_active(sd->hd) && sd->hd->bl.id == p->GID )
|
||||||
bl = &sd->hd->bl; // Moving Homunculus
|
bl = &sd->hd->bl; // Moving Homunculus
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (x < 0 || y < 0 || (x == bl->x && y == bl->y))
|
||||||
|
return;
|
||||||
|
|
||||||
unit_walktoxy(bl, x, y, 4);
|
unit_walktoxy(bl, x, y, 4);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -15499,7 +15503,6 @@ void clif_parse_HomAttack(int fd,map_session_data *sd)
|
|||||||
bl = &sd->md->bl;
|
bl = &sd->md->bl;
|
||||||
else return;
|
else return;
|
||||||
|
|
||||||
unit_stop_attack(bl);
|
|
||||||
unit_attack(bl, target_id, action_type != 0);
|
unit_attack(bl, target_id, action_type != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,7 +563,7 @@
|
|||||||
// 2005-04-25aSakexe
|
// 2005-04-25aSakexe
|
||||||
#if PACKETVER >= 20050425
|
#if PACKETVER >= 20050425
|
||||||
parseable_packet(0x022d,5,clif_parse_HomMenu,2,4);
|
parseable_packet(0x022d,5,clif_parse_HomMenu,2,4);
|
||||||
parseable_packet(0x0232,9,clif_parse_HomMoveTo,2,6);
|
parseable_packet( HEADER_CZ_REQUEST_MOVENPC, sizeof( PACKET_CZ_REQUEST_MOVENPC ), clif_parse_HomMoveTo, 0 );
|
||||||
parseable_packet(0x0233,11,clif_parse_HomAttack,2,6,10);
|
parseable_packet(0x0233,11,clif_parse_HomAttack,2,6,10);
|
||||||
parseable_packet(0x0234,6,clif_parse_HomMoveToMaster,2);
|
parseable_packet(0x0234,6,clif_parse_HomMoveToMaster,2);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1528,11 +1528,6 @@ enum e_job_types
|
|||||||
JT_4_EP21_TAN_S,
|
JT_4_EP21_TAN_S,
|
||||||
|
|
||||||
JT_4_M_VACATION_MARAM = 10595,
|
JT_4_M_VACATION_MARAM = 10595,
|
||||||
JT_4_CLB_SS_FC,
|
|
||||||
JT_4_CLB_SS_TZ,
|
|
||||||
JT_4_CLB_SS_AJ,
|
|
||||||
JT_4_CLB_SS_LK,
|
|
||||||
JT_4_SMART_ANDRE,
|
|
||||||
|
|
||||||
JT_ROZ_MQ_XAVIER = 13000,
|
JT_ROZ_MQ_XAVIER = 13000,
|
||||||
JT_ROZ_MQ_MOCLORD,
|
JT_ROZ_MQ_MOCLORD,
|
||||||
@ -1552,7 +1547,7 @@ enum e_job_types
|
|||||||
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
|
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
|
||||||
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
|
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
|
||||||
|
|
||||||
//Checks if a given id is a valid npc id.
|
//Checks if a given id is a valid npc id. [Skotlex]
|
||||||
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
|
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
|
||||||
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )
|
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )
|
||||||
|
|
||||||
|
@ -1362,6 +1362,13 @@ struct PACKET_ZC_NOTIFY_ACT{
|
|||||||
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a);
|
DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct PACKET_CZ_REQUEST_MOVENPC{
|
||||||
|
int16 packetType;
|
||||||
|
uint32 GID;
|
||||||
|
uint8 PosDir[3];
|
||||||
|
} __attribute__((packed));
|
||||||
|
DEFINE_PACKET_HEADER(CZ_REQUEST_MOVENPC, 0x232);
|
||||||
|
|
||||||
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
|
// NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
|
||||||
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
|
#if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
|
||||||
#pragma pack( pop )
|
#pragma pack( pop )
|
||||||
|
@ -2128,21 +2128,7 @@ enum e_hat_effects : int16{
|
|||||||
HAT_EF_C_BABY_GLOOM,
|
HAT_EF_C_BABY_GLOOM,
|
||||||
HAT_EF_WINTERNIGHTBELLS,
|
HAT_EF_WINTERNIGHTBELLS,
|
||||||
HAT_EF_NIGHTSKYOFRUTIE,
|
HAT_EF_NIGHTSKYOFRUTIE,
|
||||||
FOOTPRINT_EF_BASE,
|
|
||||||
FOOTPRINT_EF_STR_BASE,
|
|
||||||
FOOTPRINT_EF_PURPLESTAR,
|
|
||||||
FOOTPRINT_EF_YELLOWSTAR,
|
|
||||||
FOOTPRINT_EF_REDSTAR,
|
|
||||||
HAT_EF_RAINBOW_POISON_MASTER,
|
HAT_EF_RAINBOW_POISON_MASTER,
|
||||||
HAT_EF_C_ANCIENT_RUNE,
|
|
||||||
HAT_EF_C_DRAGON_GREEN_AURA,
|
|
||||||
HAT_EF_C_DRAGON_RED_AURA,
|
|
||||||
HAT_EF_C_DRAGON_YELLOW_AURA,
|
|
||||||
HAT_EF_INTERDIMENSIONAL_RIFT,
|
|
||||||
HAT_EF_C_CLB_SS_LL,
|
|
||||||
HAT_EF_VACATION,
|
|
||||||
HAT_EF_C_FH_LOSTWING,
|
|
||||||
FOOTPRINT_EF_DOGFOOT,
|
|
||||||
HAT_EF_MAX
|
HAT_EF_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -9186,11 +9186,6 @@
|
|||||||
export_constant_npc(JT_4_EP21_HOWELL_S);
|
export_constant_npc(JT_4_EP21_HOWELL_S);
|
||||||
export_constant_npc(JT_4_EP21_TAN_S);
|
export_constant_npc(JT_4_EP21_TAN_S);
|
||||||
export_constant_npc(JT_4_M_VACATION_MARAM);
|
export_constant_npc(JT_4_M_VACATION_MARAM);
|
||||||
export_constant_npc(JT_4_CLB_SS_FC);
|
|
||||||
export_constant_npc(JT_4_CLB_SS_TZ);
|
|
||||||
export_constant_npc(JT_4_CLB_SS_AJ);
|
|
||||||
export_constant_npc(JT_4_CLB_SS_LK);
|
|
||||||
export_constant_npc(JT_4_SMART_ANDRE);
|
|
||||||
export_constant_npc(JT_ROZ_MQ_XAVIER);
|
export_constant_npc(JT_ROZ_MQ_XAVIER);
|
||||||
export_constant_npc(JT_ROZ_MQ_MOCLORD);
|
export_constant_npc(JT_ROZ_MQ_MOCLORD);
|
||||||
export_constant_npc(JT_ROZ_MQ_SKULD);
|
export_constant_npc(JT_ROZ_MQ_SKULD);
|
||||||
@ -10555,21 +10550,7 @@
|
|||||||
export_constant(HAT_EF_C_BABY_GLOOM);
|
export_constant(HAT_EF_C_BABY_GLOOM);
|
||||||
export_constant(HAT_EF_WINTERNIGHTBELLS);
|
export_constant(HAT_EF_WINTERNIGHTBELLS);
|
||||||
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
|
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
|
||||||
export_constant(FOOTPRINT_EF_BASE);
|
|
||||||
export_constant(FOOTPRINT_EF_STR_BASE);
|
|
||||||
export_constant(FOOTPRINT_EF_PURPLESTAR);
|
|
||||||
export_constant(FOOTPRINT_EF_YELLOWSTAR);
|
|
||||||
export_constant(FOOTPRINT_EF_REDSTAR);
|
|
||||||
export_constant(HAT_EF_RAINBOW_POISON_MASTER);
|
export_constant(HAT_EF_RAINBOW_POISON_MASTER);
|
||||||
export_constant(HAT_EF_C_ANCIENT_RUNE);
|
|
||||||
export_constant(HAT_EF_C_DRAGON_GREEN_AURA);
|
|
||||||
export_constant(HAT_EF_C_DRAGON_RED_AURA);
|
|
||||||
export_constant(HAT_EF_C_DRAGON_YELLOW_AURA);
|
|
||||||
export_constant(HAT_EF_INTERDIMENSIONAL_RIFT);
|
|
||||||
export_constant(HAT_EF_C_CLB_SS_LL);
|
|
||||||
export_constant(HAT_EF_VACATION);
|
|
||||||
export_constant(HAT_EF_C_FH_LOSTWING);
|
|
||||||
export_constant(FOOTPRINT_EF_DOGFOOT);
|
|
||||||
|
|
||||||
/* pet catch */
|
/* pet catch */
|
||||||
export_constant(PET_CATCH_UNIVERSAL);
|
export_constant(PET_CATCH_UNIVERSAL);
|
||||||
|
@ -3812,12 +3812,12 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|||||||
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, DMG_SPLASH);
|
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, DMG_SPLASH);
|
||||||
break;
|
break;
|
||||||
//Skills that need be passed as a normal attack for the client to display correctly.
|
//Skills that need be passed as a normal attack for the client to display correctly.
|
||||||
case HVAN_EXPLOSION:
|
|
||||||
case NPC_SELFDESTRUCTION:
|
case NPC_SELFDESTRUCTION:
|
||||||
if(src->type == BL_PC)
|
if(src->type == BL_PC)
|
||||||
dmg.blewcount = 10;
|
dmg.blewcount = 10;
|
||||||
dmg.amotion = 0; //Disable delay or attack will do no damage since source is dead by the time it takes effect. [Skotlex]
|
dmg.amotion = 0; //Disable delay or attack will do no damage since source is dead by the time it takes effect. [Skotlex]
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
|
case HVAN_EXPLOSION:
|
||||||
case KN_AUTOCOUNTER:
|
case KN_AUTOCOUNTER:
|
||||||
case NPC_CRITICALSLASH:
|
case NPC_CRITICALSLASH:
|
||||||
case TF_DOUBLE:
|
case TF_DOUBLE:
|
||||||
@ -4762,6 +4762,9 @@ static TIMER_FUNC(skill_timerskill){
|
|||||||
case ABC_FRENZY_SHOT:
|
case ABC_FRENZY_SHOT:
|
||||||
skill_castend_damage_id(src, target, skl->skill_id, skl->skill_lv, tick, skl->flag);
|
skill_castend_damage_id(src, target, skl->skill_id, skl->skill_lv, tick, skl->flag);
|
||||||
break;
|
break;
|
||||||
|
case HVAN_EXPLOSION:
|
||||||
|
status_kill(src);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
|
skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
|
||||||
break;
|
break;
|
||||||
@ -6195,16 +6198,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
|
|
||||||
case HVAN_CAPRICE: //[blackhole89]
|
case HVAN_CAPRICE: //[blackhole89]
|
||||||
{
|
{
|
||||||
int ran=rnd()%4;
|
static std::vector<e_skill> subskills = { MG_COLDBOLT, MG_FIREBOLT, MG_LIGHTNINGBOLT, WZ_EARTHSPIKE };
|
||||||
int sid = 0;
|
e_skill subskill_id = util::vector_random( subskills );
|
||||||
switch(ran)
|
skill_attack(skill_get_type(subskill_id), src, src, bl, subskill_id, skill_lv, tick, flag);
|
||||||
{
|
|
||||||
case 0: sid=MG_COLDBOLT; break;
|
|
||||||
case 1: sid=MG_FIREBOLT; break;
|
|
||||||
case 2: sid=MG_LIGHTNINGBOLT; break;
|
|
||||||
case 3: sid=WZ_EARTHSPIKE; break;
|
|
||||||
}
|
|
||||||
skill_attack(BF_MAGIC,src,src,bl,sid,skill_lv,tick,flag|SD_LEVEL);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -6324,7 +6320,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case HVAN_EXPLOSION:
|
case HVAN_EXPLOSION:
|
||||||
if (src != bl)
|
if (src != bl)
|
||||||
skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
|
skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Celest
|
// Celest
|
||||||
@ -8817,13 +8813,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
BF_MAGIC, src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY);
|
BF_MAGIC, src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HVAN_EXPLOSION: //[orn]
|
|
||||||
case NPC_SELFDESTRUCTION:
|
case NPC_SELFDESTRUCTION:
|
||||||
//Self Destruction hits everyone in range (allies+enemies)
|
//Self Destruction hits everyone in range (allies+enemies)
|
||||||
//Except for Summoned Marine spheres on non-versus maps, where it's just enemy.
|
//Except for Summoned Marine spheres on non-versus maps, where it's just enemy.
|
||||||
i = ((!md || md->special_state.ai == AI_SPHERE) && !map_flag_vs(src->m))?
|
i = ((!md || md->special_state.ai == AI_SPHERE) && !map_flag_vs(src->m))?
|
||||||
BCT_ENEMY:BCT_ALL;
|
BCT_ENEMY:BCT_ALL;
|
||||||
clif_skill_nodamage(src, *src, skill_id, -1);
|
|
||||||
map_delblock(src); //Required to prevent chain-self-destructions hitting back.
|
map_delblock(src); //Required to prevent chain-self-destructions hitting back.
|
||||||
map_foreachinshootrange(skill_area_sub, bl,
|
map_foreachinshootrange(skill_area_sub, bl,
|
||||||
skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL,
|
skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL,
|
||||||
@ -8833,14 +8827,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
map_freeblock_unlock();
|
map_freeblock_unlock();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
status_damage(src, src, sstatus->max_hp,0,0,1, skill_id);
|
status_kill(src);
|
||||||
if(skill_id == HVAN_EXPLOSION && src->type == BL_HOM) {
|
|
||||||
homun_data& hd = reinterpret_cast<homun_data&>( *src );
|
|
||||||
|
|
||||||
hd.homunculus.intimacy = hom_intimacy_grade2intimacy(HOMGRADE_HATE_WITH_PASSION);
|
|
||||||
|
|
||||||
clif_send_homdata( hd, SP_INTIMATE );
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case AL_ANGELUS:
|
case AL_ANGELUS:
|
||||||
#ifdef RENEWAL
|
#ifdef RENEWAL
|
||||||
@ -10682,7 +10669,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
case HAMI_CASTLE: //[orn]
|
case HAMI_CASTLE: //[orn]
|
||||||
if (src != bl && rnd_chance(20 * skill_lv, 100)) {
|
if (src != bl && rnd_chance(20 * skill_lv, 100)) {
|
||||||
// Get one of the monsters targeting the player and set the homunculus as its new target
|
// Get one of the monsters targeting the player and set the homunculus as its new target
|
||||||
if (block_list* tbl = battle_gettargeted(bl); tbl != nullptr && tbl->type == BL_MOB) {
|
if (block_list* tbl = battle_getenemy(bl, BL_MOB, AREA_SIZE); tbl != nullptr) {
|
||||||
if (unit_data* ud = unit_bl2ud(tbl); ud != nullptr)
|
if (unit_data* ud = unit_bl2ud(tbl); ud != nullptr)
|
||||||
unit_changetarget_sub(*ud, *src);
|
unit_changetarget_sub(*ud, *src);
|
||||||
}
|
}
|
||||||
@ -10703,26 +10690,58 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
else if (sd != nullptr)
|
else if (sd != nullptr)
|
||||||
clif_skill_fail( *sd, skill_id );
|
clif_skill_fail( *sd, skill_id );
|
||||||
break;
|
break;
|
||||||
case HVAN_CHAOTIC: //[orn]
|
case HVAN_CHAOTIC:
|
||||||
{
|
{
|
||||||
static const int per[5][2]={{20,50},{50,60},{25,75},{60,64},{34,67}};
|
// Chance per skill level
|
||||||
int r = rnd()%100;
|
static const uint8 chance_homunculus[5] = {
|
||||||
i = (skill_lv-1)%5;
|
20,
|
||||||
if(r<per[i][0]) //Self
|
50,
|
||||||
bl = src;
|
25,
|
||||||
else if(r<per[i][1]) //Master
|
50,
|
||||||
bl = battle_get_master(src);
|
34
|
||||||
else //Enemy
|
};
|
||||||
bl = map_id2bl(battle_gettarget(src));
|
static const uint8 chance_master[5] = {
|
||||||
|
static_cast<uint8>(chance_homunculus[0] + 30),
|
||||||
|
static_cast<uint8>(chance_homunculus[1] + 10),
|
||||||
|
static_cast<uint8>(chance_homunculus[2] + 50),
|
||||||
|
static_cast<uint8>(chance_homunculus[3] + 4),
|
||||||
|
static_cast<uint8>(chance_homunculus[4] + 33)
|
||||||
|
};
|
||||||
|
|
||||||
if (!bl) bl = src;
|
uint8 chance = rnd_value(1, 100);
|
||||||
i = skill_calc_heal(src, bl, skill_id, 1+rnd()%skill_lv, true);
|
|
||||||
//Eh? why double skill packet?
|
// Homunculus
|
||||||
clif_skill_nodamage(src,*bl,AL_HEAL,i);
|
if (chance <= chance_homunculus[skill_lv - 1])
|
||||||
clif_skill_nodamage(src,*bl,skill_id,i);
|
bl = src;
|
||||||
status_heal(bl, i, 0, 0);
|
// Master
|
||||||
}
|
else if (chance <= chance_master[skill_lv - 1])
|
||||||
break;
|
bl = battle_get_master(src);
|
||||||
|
// Enemy (A random enemy targeting the master)
|
||||||
|
else
|
||||||
|
bl = battle_gettargeted(battle_get_master(src));
|
||||||
|
|
||||||
|
// If there's no enemy the chance reverts to the homunculus
|
||||||
|
if (bl == nullptr)
|
||||||
|
bl = src;
|
||||||
|
|
||||||
|
int32 heal = skill_calc_heal(src, bl, skill_id, rnd_value<uint16>(1, skill_lv), true);
|
||||||
|
|
||||||
|
// Official servers send the Heal skill packet with the healed amount, and then the skill packet with 1 as healed amount
|
||||||
|
clif_skill_nodamage(src, *bl, AL_HEAL, heal);
|
||||||
|
clif_skill_nodamage(src, *bl, skill_id, 1);
|
||||||
|
status_heal(bl, heal, 0, 0);
|
||||||
|
} break;
|
||||||
|
case HVAN_EXPLOSION:
|
||||||
|
if( hd != nullptr ){
|
||||||
|
clif_skill_nodamage(src, *src, skill_id, skill_lv, 1);
|
||||||
|
map_foreachinshootrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR | BL_SKILL, src, skill_id, skill_lv, tick, flag | BCT_ENEMY, skill_castend_damage_id);
|
||||||
|
|
||||||
|
hd->homunculus.intimacy = hom_intimacy_grade2intimacy(HOMGRADE_HATE_WITH_PASSION);
|
||||||
|
clif_send_homdata(*hd, SP_INTIMATE);
|
||||||
|
|
||||||
|
// There's a delay between the explosion and the homunculus death
|
||||||
|
skill_addtimerskill(src, tick + skill_get_time(skill_id, skill_lv), src->id, 0, 0, skill_id, skill_lv, 0, flag);
|
||||||
|
} break;
|
||||||
// Homun single-target support skills [orn]
|
// Homun single-target support skills [orn]
|
||||||
case HLIF_CHANGE:
|
case HLIF_CHANGE:
|
||||||
#ifndef RENEWAL
|
#ifndef RENEWAL
|
||||||
|
@ -1500,17 +1500,7 @@ enum e_skill {
|
|||||||
NPC_CANE_OF_EVIL_EYE,
|
NPC_CANE_OF_EVIL_EYE,
|
||||||
NPC_CURSE_OF_RED_CUBE,
|
NPC_CURSE_OF_RED_CUBE,
|
||||||
NPC_CURSE_OF_BLUE_CUBE,
|
NPC_CURSE_OF_BLUE_CUBE,
|
||||||
NPC_KILLING_AURA,
|
NPC_KILLING_AURA, // 783
|
||||||
ALL_EVENT_20TH_ANNIVERSARY,
|
|
||||||
NPC_TARGET_MARKER,
|
|
||||||
NPC_AIMED_SHOWER,
|
|
||||||
NPC_BLAZING_ERUPTION,
|
|
||||||
NPC_BLOCK_SEAL,
|
|
||||||
NPC_BLOCK_EXPLOSION,
|
|
||||||
NPC_FROST_FIELD,
|
|
||||||
NPC_LIGHTNING_JUDGEMENT,
|
|
||||||
NPC_GROGGY_ON,
|
|
||||||
NPC_RESET_EFST, //793
|
|
||||||
|
|
||||||
KN_CHARGEATK = 1001,
|
KN_CHARGEATK = 1001,
|
||||||
CR_SHRINK,
|
CR_SHRINK,
|
||||||
@ -2342,10 +2332,6 @@ enum e_skill {
|
|||||||
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
|
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
|
||||||
SS_FUUMAKOUCHIKU_BLASTING,
|
SS_FUUMAKOUCHIKU_BLASTING,
|
||||||
|
|
||||||
SS_FOUR_CHARM = 5499,
|
|
||||||
NW_WILD_SHOT,
|
|
||||||
NW_MIDNIGHT_FALLEN,
|
|
||||||
|
|
||||||
DK_DRAGONIC_BREATH = 6001,
|
DK_DRAGONIC_BREATH = 6001,
|
||||||
MT_SPARK_BLASTER,
|
MT_SPARK_BLASTER,
|
||||||
MT_TRIPLE_LASER,
|
MT_TRIPLE_LASER,
|
||||||
@ -2353,21 +2339,6 @@ enum e_skill {
|
|||||||
BO_EXPLOSIVE_POWDER,
|
BO_EXPLOSIVE_POWDER,
|
||||||
BO_MAYHEMIC_THORNS,
|
BO_MAYHEMIC_THORNS,
|
||||||
|
|
||||||
IG_RADIANT_SPEAR = 6503,
|
|
||||||
IG_IMPERIAL_CROSS,
|
|
||||||
|
|
||||||
MT_RUSH_STRIKE = 6506,
|
|
||||||
MT_POWERFUL_SWING,
|
|
||||||
MT_ENERGY_CANNONADE,
|
|
||||||
BO_MYSTERY_POWDER,
|
|
||||||
BO_DUST_EXPLOSION,
|
|
||||||
SHC_CROSS_SLASH,
|
|
||||||
ABC_HIT_AND_SLIDING,
|
|
||||||
ABC_CHASING_BREAK,
|
|
||||||
ABC_CHASING_SHOT,
|
|
||||||
|
|
||||||
TR_RHYTHMICAL_WAVE = 6521,
|
|
||||||
|
|
||||||
HLIF_HEAL = 8001,
|
HLIF_HEAL = 8001,
|
||||||
HLIF_AVOID,
|
HLIF_AVOID,
|
||||||
HLIF_BRAIN,
|
HLIF_BRAIN,
|
||||||
|
@ -5046,8 +5046,10 @@ int status_calc_homunculus_(struct homun_data *hd, uint8 opt)
|
|||||||
status->def += skill_lv * 4;
|
status->def += skill_lv * 4;
|
||||||
|
|
||||||
if((skill_lv = hom_checkskill(hd, HVAN_INSTRUCT)) > 0) {
|
if((skill_lv = hom_checkskill(hd, HVAN_INSTRUCT)) > 0) {
|
||||||
status->int_ += 1 + skill_lv / 2 + skill_lv / 4 + skill_lv / 5;
|
static const uint8 bonus_int[] = { 1, 2, 2, 4, 5 };
|
||||||
status->str += 1 + skill_lv / 3 + skill_lv / 3 + skill_lv / 4;
|
static const uint8 bonus_str[] = { 1, 1, 3, 4, 4 };
|
||||||
|
status->int_ += bonus_int[skill_lv - 1];
|
||||||
|
status->str += bonus_str[skill_lv - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
if((skill_lv = hom_checkskill(hd, HAMI_SKIN)) > 0)
|
if((skill_lv = hom_checkskill(hd, HAMI_SKIN)) > 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user