Compare commits
9 Commits
cleanup/pa
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d6d850ba6e | ||
![]() |
63baa62f70 | ||
![]() |
8bd89b7fc0 | ||
![]() |
8c9e447fd5 | ||
![]() |
fa145ac838 | ||
![]() |
7880596b03 | ||
![]() |
f3f8e63448 | ||
![]() |
29671fa5cd | ||
![]() |
077f714e05 |
@ -83053,7 +83053,7 @@ Body:
|
|||||||
Hunter: true
|
Hunter: true
|
||||||
Rogue: true
|
Rogue: true
|
||||||
Locations:
|
Locations:
|
||||||
Right_Hand: true
|
Both_Hand: true
|
||||||
WeaponLevel: 4
|
WeaponLevel: 4
|
||||||
EquipLevelMin: 70
|
EquipLevelMin: 70
|
||||||
Refineable: true
|
Refineable: true
|
||||||
@ -202634,6 +202634,17 @@ Body:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
- Id: 480470
|
||||||
|
AegisName: C_Summer_Beach
|
||||||
|
Name: Costume Summer Beach # !todo check english name
|
||||||
|
Type: Armor
|
||||||
|
Locations:
|
||||||
|
Costume_Garment: true
|
||||||
|
ArmorLevel: 1
|
||||||
|
Script: |
|
||||||
|
hateffect HAT_EF_VACATION,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect HAT_EF_VACATION,false;
|
||||||
- Id: 490004
|
- Id: 490004
|
||||||
AegisName: Atker_Ring
|
AegisName: Atker_Ring
|
||||||
Name: Attacker Booster Ring
|
Name: Attacker Booster Ring
|
||||||
|
@ -80408,6 +80408,28 @@ Body:
|
|||||||
Name: Footprint Effect
|
Name: Footprint Effect
|
||||||
Type: Card
|
Type: Card
|
||||||
SubType: Enchant
|
SubType: Enchant
|
||||||
|
Script: |
|
||||||
|
hateffect FOOTPRINT_EF_BASE,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect FOOTPRINT_EF_BASE,false;
|
||||||
|
- Id: 313067
|
||||||
|
AegisName: aegis_313067
|
||||||
|
Name: Purple Star Footprint
|
||||||
|
Type: Card
|
||||||
|
SubType: Enchant
|
||||||
|
Script: |
|
||||||
|
hateffect FOOTPRINT_EF_PURPLESTAR,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect FOOTPRINT_EF_PURPLESTAR,false;
|
||||||
|
- Id: 313068
|
||||||
|
AegisName: aegis_313068
|
||||||
|
Name: Yellow Star Footprint
|
||||||
|
Type: Card
|
||||||
|
SubType: Enchant
|
||||||
|
Script: |
|
||||||
|
hateffect FOOTPRINT_EF_YELLOWSTAR,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect FOOTPRINT_EF_YELLOWSTAR,false;
|
||||||
- Id: 313070
|
- Id: 313070
|
||||||
AegisName: Ep21_4_Def
|
AegisName: Ep21_4_Def
|
||||||
Name: Forest Magic Orb (Physical Defense)
|
Name: Forest Magic Orb (Physical Defense)
|
||||||
@ -81896,6 +81918,15 @@ Body:
|
|||||||
Script: |
|
Script: |
|
||||||
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
|
bonus bLongAtkRate,getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||||
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
|
bonus bBaseAtk,4*getskilllv("SH_HOWLING_OF_CHUL_HO");
|
||||||
|
- Id: 313345
|
||||||
|
AegisName: aegis_313345
|
||||||
|
Name: Puppy Footprint
|
||||||
|
Type: Card
|
||||||
|
SubType: Enchant
|
||||||
|
Script: |
|
||||||
|
hateffect FOOTPRINT_EF_DOGFOOT,true;
|
||||||
|
UnEquipScript: |
|
||||||
|
hateffect FOOTPRINT_EF_DOGFOOT,false;
|
||||||
- Id: 1000000
|
- Id: 1000000
|
||||||
AegisName: IDTest_event
|
AegisName: IDTest_event
|
||||||
Name: IDTest event
|
Name: IDTest event
|
||||||
@ -89440,6 +89471,11 @@ Body:
|
|||||||
Name: Footprint Effect (Garment)
|
Name: Footprint Effect (Garment)
|
||||||
Type: Etc
|
Type: Etc
|
||||||
Weight: 100
|
Weight: 100
|
||||||
|
- Id: 1001617
|
||||||
|
AegisName: PurpleStar_Foot_Robe
|
||||||
|
Name: Purple Star Footprint (Garment)
|
||||||
|
Type: Etc
|
||||||
|
Weight: 100
|
||||||
- Id: 1001618
|
- Id: 1001618
|
||||||
AegisName: aegis_1001618
|
AegisName: aegis_1001618
|
||||||
Name: Wigner Premium Exchange Ticket
|
Name: Wigner Premium Exchange Ticket
|
||||||
@ -89709,6 +89745,11 @@ Body:
|
|||||||
Weight: 10
|
Weight: 10
|
||||||
Flags:
|
Flags:
|
||||||
BuyingStore: true
|
BuyingStore: true
|
||||||
|
- Id: 1001650
|
||||||
|
AegisName: YellowStar_Foot_Robe
|
||||||
|
Name: Yellow Star Footprint (Garment)
|
||||||
|
Type: Etc
|
||||||
|
Weight: 100
|
||||||
- Id: 1001653
|
- Id: 1001653
|
||||||
AegisName: Ep21_Armor_E_Stone1
|
AegisName: Ep21_Armor_E_Stone1
|
||||||
Name: Turquoise Magic Stone
|
Name: Turquoise Magic Stone
|
||||||
@ -90322,6 +90363,11 @@ Body:
|
|||||||
NoGuildStorage: true
|
NoGuildStorage: true
|
||||||
NoMail: true
|
NoMail: true
|
||||||
NoAuction: true
|
NoAuction: true
|
||||||
|
- Id: 1001772
|
||||||
|
AegisName: aegis_1001772
|
||||||
|
Name: Puppy Footprint (Garment)
|
||||||
|
Type: Etc
|
||||||
|
Weight: 100
|
||||||
- Id: 1200000
|
- Id: 1200000
|
||||||
AegisName: IDTest_arrow
|
AegisName: IDTest_arrow
|
||||||
Name: IDTest arrow
|
Name: IDTest arrow
|
||||||
|
@ -78855,6 +78855,11 @@ Body:
|
|||||||
NoAuction: true
|
NoAuction: true
|
||||||
Script: |
|
Script: |
|
||||||
getgroupitem(IG_STOVE_CHANNELING_BOX_4);
|
getgroupitem(IG_STOVE_CHANNELING_BOX_4);
|
||||||
|
- Id: 103263
|
||||||
|
AegisName: Summer_Select_Box4
|
||||||
|
Name: Star Footprint Selection Box (Summer Beach)
|
||||||
|
Type: Usable
|
||||||
|
Weight: 10
|
||||||
- Id: 200000
|
- Id: 200000
|
||||||
AegisName: IDTest_Cash
|
AegisName: IDTest_Cash
|
||||||
Name: IDTest Cash
|
Name: IDTest Cash
|
||||||
|
@ -980,3 +980,13 @@ Body:
|
|||||||
- Group: 1
|
- Group: 1
|
||||||
Items:
|
Items:
|
||||||
- Item: C_Chaos_Emerald
|
- Item: C_Chaos_Emerald
|
||||||
|
- Item: Summer_Select_Box4
|
||||||
|
Groups:
|
||||||
|
- Group: 0
|
||||||
|
Items:
|
||||||
|
- Item: PurpleStar_Foot_Robe
|
||||||
|
- Item: C_Summer_Beach
|
||||||
|
- Group: 1
|
||||||
|
Items:
|
||||||
|
- Item: YellowStar_Foot_Robe
|
||||||
|
- Item: C_Summer_Beach
|
||||||
|
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:
|
||||||
|
@ -309,8 +309,10 @@ int chclif_parse_pincode_setnew( int fd, struct char_session_data* sd ){
|
|||||||
if( charserv_config.pincode_config.pincode_enabled==0 || RFIFOL(fd,2) != sd->account_id ) {
|
if( charserv_config.pincode_config.pincode_enabled==0 || RFIFOL(fd,2) != sd->account_id ) {
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else if (strnlen(sd->pincode, PINCODE_LENGTH) > 0) {
|
||||||
else {
|
set_eof(fd);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
char newpin[PINCODE_LENGTH+1];
|
char newpin[PINCODE_LENGTH+1];
|
||||||
memset(newpin,0,PINCODE_LENGTH+1);
|
memset(newpin,0,PINCODE_LENGTH+1);
|
||||||
strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH );
|
strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH );
|
||||||
|
@ -3792,7 +3792,7 @@ ACMD_FUNC(lostskill)
|
|||||||
|
|
||||||
sd->status.skill[sk_idx].lv = 0;
|
sd->status.skill[sk_idx].lv = 0;
|
||||||
sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(sd,skill_id);
|
clif_deleteskill(*sd,skill_id);
|
||||||
clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill.
|
clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill.
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3693,6 +3693,12 @@ static int battle_get_spiritball_damage(struct Damage& wd, struct block_list& sr
|
|||||||
// These skills used as many spheres as they do hits
|
// These skills used as many spheres as they do hits
|
||||||
damage = (wd.div_ + sd->spiritball) * 3;
|
damage = (wd.div_ + sd->spiritball) * 3;
|
||||||
break;
|
break;
|
||||||
|
#ifdef RENEWAL
|
||||||
|
case MO_FINGEROFFENSIVE:
|
||||||
|
// These skills store the spheres used in spiritball_old
|
||||||
|
damage = (sd->spiritball_old + sd->spiritball) * 3;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case MO_EXTREMITYFIST:
|
case MO_EXTREMITYFIST:
|
||||||
// These skills store the number of spheres the player had before cast
|
// These skills store the number of spheres the player had before cast
|
||||||
damage = sd->spiritball_old * 3;
|
damage = sd->spiritball_old * 3;
|
||||||
@ -6803,9 +6809,9 @@ static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,s
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Triple Attack has a special property that it does not split damage on plant mode
|
// Triple Attack and Finger Offensive have a special property, they do not split damage on plant mode
|
||||||
// In pre-renewal, it requires the monster to have exactly 100 def
|
// In pre-renewal, it requires the monster to have exactly 100 def
|
||||||
if (skill_id == MO_TRIPLEATTACK && wd->div_ < 0
|
if ((skill_id == MO_TRIPLEATTACK || skill_id == MO_FINGEROFFENSIVE) && wd->div_ < 0
|
||||||
#ifndef RENEWAL
|
#ifndef RENEWAL
|
||||||
&& tstatus->def == 100
|
&& tstatus->def == 100
|
||||||
#endif
|
#endif
|
||||||
|
@ -1065,7 +1065,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
|
|||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
sd->status.skill[idx].lv = 0;
|
sd->status.skill[idx].lv = 0;
|
||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(sd,WE_CALLBABY);
|
clif_deleteskill(*sd,WE_CALLBABY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) {
|
if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) {
|
||||||
@ -1073,7 +1073,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
|
|||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
sd->status.skill[idx].lv = 0;
|
sd->status.skill[idx].lv = 0;
|
||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(sd,WE_CALLBABY);
|
clif_deleteskill(*sd,WE_CALLBABY);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -5698,28 +5698,26 @@ void clif_addskill(map_session_data *sd, int skill_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Deletes a skill from the skill tree (ZC_SKILLINFO_DELETE).
|
/// Deletes a skill from the skill tree.
|
||||||
/// 0441 <skill id>.W
|
/// 0441 <skill id>.W (ZC_SKILLINFO_DELETE)
|
||||||
void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock)
|
void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock){
|
||||||
{
|
#if PACKETVER >= 20081126
|
||||||
#if PACKETVER >= 20081217
|
|
||||||
nullpo_retv(sd);
|
|
||||||
|
|
||||||
int fd = sd->fd;
|
|
||||||
uint16 idx = skill_get_index(skill_id);
|
uint16 idx = skill_get_index(skill_id);
|
||||||
|
|
||||||
if (!session_isActive(fd) || !idx)
|
if (idx == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
WFIFOHEAD(fd,packet_len(0x441));
|
PACKET_ZC_SKILLINFO_DELETE p{};
|
||||||
WFIFOW(fd,0) = 0x441;
|
|
||||||
WFIFOW(fd,2) = skill_id;
|
p.packetType = HEADER_ZC_SKILLINFO_DELETE;
|
||||||
WFIFOSET(fd,packet_len(0x441));
|
p.skillID = skill_id;
|
||||||
|
|
||||||
|
clif_send(&p,sizeof(p),&sd.bl,SELF);
|
||||||
#endif
|
#endif
|
||||||
#if PACKETVER_MAIN_NUM >= 20190807 || PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190918
|
#if PACKETVER_MAIN_NUM >= 20190807 || PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190918
|
||||||
if (!skip_infoblock)
|
if (!skip_infoblock)
|
||||||
#endif
|
#endif
|
||||||
clif_skillinfoblock(sd);
|
clif_skillinfoblock(&sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Updates a skill in the skill tree (ZC_SKILLINFO_UPDATE).
|
/// Updates a skill in the skill tree (ZC_SKILLINFO_UPDATE).
|
||||||
@ -8873,13 +8871,14 @@ static void clif_guild_positioninfolist(map_session_data& sd){
|
|||||||
|
|
||||||
for(size_t i=0;i<MAX_GUILDPOSITION;i++){
|
for(size_t i=0;i<MAX_GUILDPOSITION;i++){
|
||||||
guild_position& gp = g->guild.position[i];
|
guild_position& gp = g->guild.position[i];
|
||||||
|
PACKET_ZC_POSITION_INFO_sub& position = p->posInfo[i];
|
||||||
|
|
||||||
p->posInfo[i].positionID = i;
|
position.positionID = static_cast<decltype(position.positionID)>( i );
|
||||||
p->posInfo[i].right = gp.mode;
|
position.right = gp.mode;
|
||||||
p->posInfo[i].ranking = i;
|
position.ranking = static_cast<decltype(position.ranking)>( i );
|
||||||
p->posInfo[i].payRate = gp.exp_mode;
|
position.payRate = gp.exp_mode;
|
||||||
|
|
||||||
p->PacketLength += static_cast<decltype(p->PacketLength)>( sizeof( p->posInfo[0] ) );
|
p->PacketLength += static_cast<decltype(p->PacketLength)>( sizeof( position ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
clif_send(p,p->PacketLength,&sd.bl,SELF);
|
clif_send(p,p->PacketLength,&sd.bl,SELF);
|
||||||
|
@ -933,7 +933,7 @@ void clif_skillinfoblock(map_session_data *sd);
|
|||||||
void clif_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable);
|
void clif_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable);
|
||||||
void clif_skillinfo(map_session_data *sd,int skill_id, int inf);
|
void clif_skillinfo(map_session_data *sd,int skill_id, int inf);
|
||||||
void clif_addskill(map_session_data *sd, int skill_id);
|
void clif_addskill(map_session_data *sd, int skill_id);
|
||||||
void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock = false);
|
void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock = false);
|
||||||
|
|
||||||
void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime);
|
void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime);
|
||||||
void clif_skillcastcancel( block_list& bl );
|
void clif_skillcastcancel( block_list& bl );
|
||||||
|
@ -1209,7 +1209,6 @@
|
|||||||
// 2008-11-26aSakexe
|
// 2008-11-26aSakexe
|
||||||
#if PACKETVER >= 20081126
|
#if PACKETVER >= 20081126
|
||||||
packet(0x01a2,37);
|
packet(0x01a2,37);
|
||||||
packet(0x0441,4);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 2008-12-10aSakexe
|
// 2008-12-10aSakexe
|
||||||
|
@ -1528,6 +1528,11 @@ enum e_job_types
|
|||||||
JT_4_EP21_TAN_S,
|
JT_4_EP21_TAN_S,
|
||||||
|
|
||||||
JT_4_M_VACATION_MARAM = 10595,
|
JT_4_M_VACATION_MARAM = 10595,
|
||||||
|
JT_4_CLB_SS_FC,
|
||||||
|
JT_4_CLB_SS_TZ,
|
||||||
|
JT_4_CLB_SS_AJ,
|
||||||
|
JT_4_CLB_SS_LK,
|
||||||
|
JT_4_SMART_ANDRE,
|
||||||
|
|
||||||
JT_ROZ_MQ_XAVIER = 13000,
|
JT_ROZ_MQ_XAVIER = 13000,
|
||||||
JT_ROZ_MQ_MOCLORD,
|
JT_ROZ_MQ_MOCLORD,
|
||||||
@ -1547,7 +1552,7 @@ enum e_job_types
|
|||||||
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
|
#define MAX_NPC_CLASS2_START NPC_RANGE3_START
|
||||||
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
|
#define MAX_NPC_CLASS2_END NPC_RANGE3_END
|
||||||
|
|
||||||
//Checks if a given id is a valid npc id. [Skotlex]
|
//Checks if a given id is a valid npc id.
|
||||||
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
|
//Since new npcs are added all the time, the max valid value is the one before the first mob (Scorpion = 1001)
|
||||||
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )
|
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )
|
||||||
|
|
||||||
|
@ -1118,6 +1118,12 @@ struct PACKET_ZC_SKILL_DISAPPEAR {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120);
|
DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120);
|
||||||
|
|
||||||
|
struct PACKET_ZC_SKILLINFO_DELETE {
|
||||||
|
uint16 packetType;
|
||||||
|
uint16 skillID;
|
||||||
|
} __attribute__((packed));
|
||||||
|
DEFINE_PACKET_HEADER(ZC_SKILLINFO_DELETE, 0x441);
|
||||||
|
|
||||||
struct PACKET_ZC_SKILL_UPDATE {
|
struct PACKET_ZC_SKILL_UPDATE {
|
||||||
int16 packetType;
|
int16 packetType;
|
||||||
uint32 GID;
|
uint32 GID;
|
||||||
|
@ -4998,15 +4998,17 @@ struct PACKET_ZC_POSITION_ID_NAME_INFO {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
|
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
|
||||||
|
|
||||||
struct PACKET_ZC_POSITION_INFO {
|
struct PACKET_ZC_POSITION_INFO_sub {
|
||||||
int16 PacketType;
|
|
||||||
int16 PacketLength;
|
|
||||||
struct {
|
|
||||||
int positionID;
|
int positionID;
|
||||||
int right;
|
int right;
|
||||||
int ranking;
|
int ranking;
|
||||||
int payRate;
|
int payRate;
|
||||||
} posInfo[MAX_GUILDPOSITION];
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct PACKET_ZC_POSITION_INFO {
|
||||||
|
int16 PacketType;
|
||||||
|
int16 PacketLength;
|
||||||
|
struct PACKET_ZC_POSITION_INFO_sub posInfo[];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160);
|
DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160);
|
||||||
|
|
||||||
|
@ -5345,7 +5345,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_
|
|||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
if (level == 0) { //Remove skill.
|
if (level == 0) { //Remove skill.
|
||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
clif_deleteskill(sd,skill_id);
|
clif_deleteskill(*sd,skill_id);
|
||||||
} else
|
} else
|
||||||
clif_addskill(sd,skill_id);
|
clif_addskill(sd,skill_id);
|
||||||
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
||||||
@ -5380,7 +5380,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_
|
|||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERM_GRANTED;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERM_GRANTED;
|
||||||
if (level == 0) { //Remove skill.
|
if (level == 0) { //Remove skill.
|
||||||
sd->status.skill[idx].id = 0;
|
sd->status.skill[idx].id = 0;
|
||||||
clif_deleteskill(sd,skill_id);
|
clif_deleteskill(*sd,skill_id);
|
||||||
} else
|
} else
|
||||||
clif_addskill(sd,skill_id);
|
clif_addskill(sd,skill_id);
|
||||||
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills.
|
||||||
@ -5462,7 +5462,7 @@ bool pc_skill_plagiarism_reset(map_session_data &sd, uint8 type)
|
|||||||
sd.status.skill[idx].id = 0;
|
sd.status.skill[idx].id = 0;
|
||||||
sd.status.skill[idx].lv = 0;
|
sd.status.skill[idx].lv = 0;
|
||||||
sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
clif_deleteskill(&sd, skill_id);
|
clif_deleteskill(sd, skill_id);
|
||||||
|
|
||||||
if (type == 1) {
|
if (type == 1) {
|
||||||
sd.cloneskill_idx = 0;
|
sd.cloneskill_idx = 0;
|
||||||
|
@ -2128,7 +2128,21 @@ enum e_hat_effects : int16{
|
|||||||
HAT_EF_C_BABY_GLOOM,
|
HAT_EF_C_BABY_GLOOM,
|
||||||
HAT_EF_WINTERNIGHTBELLS,
|
HAT_EF_WINTERNIGHTBELLS,
|
||||||
HAT_EF_NIGHTSKYOFRUTIE,
|
HAT_EF_NIGHTSKYOFRUTIE,
|
||||||
|
FOOTPRINT_EF_BASE,
|
||||||
|
FOOTPRINT_EF_STR_BASE,
|
||||||
|
FOOTPRINT_EF_PURPLESTAR,
|
||||||
|
FOOTPRINT_EF_YELLOWSTAR,
|
||||||
|
FOOTPRINT_EF_REDSTAR,
|
||||||
HAT_EF_RAINBOW_POISON_MASTER,
|
HAT_EF_RAINBOW_POISON_MASTER,
|
||||||
|
HAT_EF_C_ANCIENT_RUNE,
|
||||||
|
HAT_EF_C_DRAGON_GREEN_AURA,
|
||||||
|
HAT_EF_C_DRAGON_RED_AURA,
|
||||||
|
HAT_EF_C_DRAGON_YELLOW_AURA,
|
||||||
|
HAT_EF_INTERDIMENSIONAL_RIFT,
|
||||||
|
HAT_EF_C_CLB_SS_LL,
|
||||||
|
HAT_EF_VACATION,
|
||||||
|
HAT_EF_C_FH_LOSTWING,
|
||||||
|
FOOTPRINT_EF_DOGFOOT,
|
||||||
HAT_EF_MAX
|
HAT_EF_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -9186,6 +9186,11 @@
|
|||||||
export_constant_npc(JT_4_EP21_HOWELL_S);
|
export_constant_npc(JT_4_EP21_HOWELL_S);
|
||||||
export_constant_npc(JT_4_EP21_TAN_S);
|
export_constant_npc(JT_4_EP21_TAN_S);
|
||||||
export_constant_npc(JT_4_M_VACATION_MARAM);
|
export_constant_npc(JT_4_M_VACATION_MARAM);
|
||||||
|
export_constant_npc(JT_4_CLB_SS_FC);
|
||||||
|
export_constant_npc(JT_4_CLB_SS_TZ);
|
||||||
|
export_constant_npc(JT_4_CLB_SS_AJ);
|
||||||
|
export_constant_npc(JT_4_CLB_SS_LK);
|
||||||
|
export_constant_npc(JT_4_SMART_ANDRE);
|
||||||
export_constant_npc(JT_ROZ_MQ_XAVIER);
|
export_constant_npc(JT_ROZ_MQ_XAVIER);
|
||||||
export_constant_npc(JT_ROZ_MQ_MOCLORD);
|
export_constant_npc(JT_ROZ_MQ_MOCLORD);
|
||||||
export_constant_npc(JT_ROZ_MQ_SKULD);
|
export_constant_npc(JT_ROZ_MQ_SKULD);
|
||||||
@ -10550,7 +10555,21 @@
|
|||||||
export_constant(HAT_EF_C_BABY_GLOOM);
|
export_constant(HAT_EF_C_BABY_GLOOM);
|
||||||
export_constant(HAT_EF_WINTERNIGHTBELLS);
|
export_constant(HAT_EF_WINTERNIGHTBELLS);
|
||||||
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
|
export_constant(HAT_EF_NIGHTSKYOFRUTIE);
|
||||||
|
export_constant(FOOTPRINT_EF_BASE);
|
||||||
|
export_constant(FOOTPRINT_EF_STR_BASE);
|
||||||
|
export_constant(FOOTPRINT_EF_PURPLESTAR);
|
||||||
|
export_constant(FOOTPRINT_EF_YELLOWSTAR);
|
||||||
|
export_constant(FOOTPRINT_EF_REDSTAR);
|
||||||
export_constant(HAT_EF_RAINBOW_POISON_MASTER);
|
export_constant(HAT_EF_RAINBOW_POISON_MASTER);
|
||||||
|
export_constant(HAT_EF_C_ANCIENT_RUNE);
|
||||||
|
export_constant(HAT_EF_C_DRAGON_GREEN_AURA);
|
||||||
|
export_constant(HAT_EF_C_DRAGON_RED_AURA);
|
||||||
|
export_constant(HAT_EF_C_DRAGON_YELLOW_AURA);
|
||||||
|
export_constant(HAT_EF_INTERDIMENSIONAL_RIFT);
|
||||||
|
export_constant(HAT_EF_C_CLB_SS_LL);
|
||||||
|
export_constant(HAT_EF_VACATION);
|
||||||
|
export_constant(HAT_EF_C_FH_LOSTWING);
|
||||||
|
export_constant(FOOTPRINT_EF_DOGFOOT);
|
||||||
|
|
||||||
/* pet catch */
|
/* pet catch */
|
||||||
export_constant(PET_CATCH_UNIVERSAL);
|
export_constant(PET_CATCH_UNIVERSAL);
|
||||||
|
@ -3395,7 +3395,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s
|
|||||||
case 1: //Copied by Plagiarism
|
case 1: //Copied by Plagiarism
|
||||||
{
|
{
|
||||||
if (tsd->cloneskill_idx > 0 && tsd->status.skill[tsd->cloneskill_idx].flag == SKILL_FLAG_PLAGIARIZED) {
|
if (tsd->cloneskill_idx > 0 && tsd->status.skill[tsd->cloneskill_idx].flag == SKILL_FLAG_PLAGIARIZED) {
|
||||||
clif_deleteskill(tsd,tsd->status.skill[tsd->cloneskill_idx].id, true);
|
clif_deleteskill(*tsd,tsd->status.skill[tsd->cloneskill_idx].id, true);
|
||||||
tsd->status.skill[tsd->cloneskill_idx].id = 0;
|
tsd->status.skill[tsd->cloneskill_idx].id = 0;
|
||||||
tsd->status.skill[tsd->cloneskill_idx].lv = 0;
|
tsd->status.skill[tsd->cloneskill_idx].lv = 0;
|
||||||
tsd->status.skill[tsd->cloneskill_idx].flag = SKILL_FLAG_PERMANENT;
|
tsd->status.skill[tsd->cloneskill_idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
@ -3415,7 +3415,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s
|
|||||||
//Skill level copied depends on Reproduce skill that used
|
//Skill level copied depends on Reproduce skill that used
|
||||||
lv = (tsc) ? tsc->getSCE(SC__REPRODUCE)->val1 : 1;
|
lv = (tsc) ? tsc->getSCE(SC__REPRODUCE)->val1 : 1;
|
||||||
if( tsd->reproduceskill_idx > 0 && tsd->status.skill[tsd->reproduceskill_idx].flag == SKILL_FLAG_PLAGIARIZED ) {
|
if( tsd->reproduceskill_idx > 0 && tsd->status.skill[tsd->reproduceskill_idx].flag == SKILL_FLAG_PLAGIARIZED ) {
|
||||||
clif_deleteskill(tsd,tsd->status.skill[tsd->reproduceskill_idx].id, true);
|
clif_deleteskill(*tsd,tsd->status.skill[tsd->reproduceskill_idx].id, true);
|
||||||
tsd->status.skill[tsd->reproduceskill_idx].id = 0;
|
tsd->status.skill[tsd->reproduceskill_idx].id = 0;
|
||||||
tsd->status.skill[tsd->reproduceskill_idx].lv = 0;
|
tsd->status.skill[tsd->reproduceskill_idx].lv = 0;
|
||||||
tsd->status.skill[tsd->reproduceskill_idx].flag = SKILL_FLAG_PERMANENT;
|
tsd->status.skill[tsd->reproduceskill_idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
@ -10682,7 +10682,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_getenemy(bl, BL_MOB, AREA_SIZE); tbl != nullptr) {
|
if (block_list* tbl = battle_gettargeted(bl); tbl != nullptr && tbl->type == BL_MOB) {
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
@ -1500,7 +1500,17 @@ enum e_skill {
|
|||||||
NPC_CANE_OF_EVIL_EYE,
|
NPC_CANE_OF_EVIL_EYE,
|
||||||
NPC_CURSE_OF_RED_CUBE,
|
NPC_CURSE_OF_RED_CUBE,
|
||||||
NPC_CURSE_OF_BLUE_CUBE,
|
NPC_CURSE_OF_BLUE_CUBE,
|
||||||
NPC_KILLING_AURA, // 783
|
NPC_KILLING_AURA,
|
||||||
|
ALL_EVENT_20TH_ANNIVERSARY,
|
||||||
|
NPC_TARGET_MARKER,
|
||||||
|
NPC_AIMED_SHOWER,
|
||||||
|
NPC_BLAZING_ERUPTION,
|
||||||
|
NPC_BLOCK_SEAL,
|
||||||
|
NPC_BLOCK_EXPLOSION,
|
||||||
|
NPC_FROST_FIELD,
|
||||||
|
NPC_LIGHTNING_JUDGEMENT,
|
||||||
|
NPC_GROGGY_ON,
|
||||||
|
NPC_RESET_EFST, //793
|
||||||
|
|
||||||
KN_CHARGEATK = 1001,
|
KN_CHARGEATK = 1001,
|
||||||
CR_SHRINK,
|
CR_SHRINK,
|
||||||
@ -2332,6 +2342,10 @@ enum e_skill {
|
|||||||
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
|
NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN,
|
||||||
SS_FUUMAKOUCHIKU_BLASTING,
|
SS_FUUMAKOUCHIKU_BLASTING,
|
||||||
|
|
||||||
|
SS_FOUR_CHARM = 5499,
|
||||||
|
NW_WILD_SHOT,
|
||||||
|
NW_MIDNIGHT_FALLEN,
|
||||||
|
|
||||||
DK_DRAGONIC_BREATH = 6001,
|
DK_DRAGONIC_BREATH = 6001,
|
||||||
MT_SPARK_BLASTER,
|
MT_SPARK_BLASTER,
|
||||||
MT_TRIPLE_LASER,
|
MT_TRIPLE_LASER,
|
||||||
@ -2339,6 +2353,21 @@ enum e_skill {
|
|||||||
BO_EXPLOSIVE_POWDER,
|
BO_EXPLOSIVE_POWDER,
|
||||||
BO_MAYHEMIC_THORNS,
|
BO_MAYHEMIC_THORNS,
|
||||||
|
|
||||||
|
IG_RADIANT_SPEAR = 6503,
|
||||||
|
IG_IMPERIAL_CROSS,
|
||||||
|
|
||||||
|
MT_RUSH_STRIKE = 6506,
|
||||||
|
MT_POWERFUL_SWING,
|
||||||
|
MT_ENERGY_CANNONADE,
|
||||||
|
BO_MYSTERY_POWDER,
|
||||||
|
BO_DUST_EXPLOSION,
|
||||||
|
SHC_CROSS_SLASH,
|
||||||
|
ABC_HIT_AND_SLIDING,
|
||||||
|
ABC_CHASING_BREAK,
|
||||||
|
ABC_CHASING_SHOT,
|
||||||
|
|
||||||
|
TR_RHYTHMICAL_WAVE = 6521,
|
||||||
|
|
||||||
HLIF_HEAL = 8001,
|
HLIF_HEAL = 8001,
|
||||||
HLIF_AVOID,
|
HLIF_AVOID,
|
||||||
HLIF_BRAIN,
|
HLIF_BRAIN,
|
||||||
|
@ -4914,7 +4914,7 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt)
|
|||||||
// Client doesn't delete unavailable skills even if we refresh the skill tree, individually delete them.
|
// Client doesn't delete unavailable skills even if we refresh the skill tree, individually delete them.
|
||||||
for (i = 0; i < MAX_SKILL; i++) {
|
for (i = 0; i < MAX_SKILL; i++) {
|
||||||
if (b_skill[i].id != 0 && sd->status.skill[i].id == 0)
|
if (b_skill[i].id != 0 && sd->status.skill[i].id == 0)
|
||||||
clif_deleteskill(sd, b_skill[i].id, true);
|
clif_deleteskill(*sd, b_skill[i].id, true);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
clif_skillinfoblock(sd);
|
clif_skillinfoblock(sd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user