Compare commits

...

5 Commits

Author SHA1 Message Date
AoShinHo
fa145ac838 New NPC, Hateffects & Skill Constants (#8656) 2024-09-18 17:28:21 +02:00
Lemongrass3110
7880596b03 Fixed clif_guild_positioninfolist
Fixes #8648

Thanks to @thanna, @laziem, @skstrife and @AoShinRO
2024-09-17 17:10:27 +02:00
Jittapan Pluemsumran
f3f8e63448 Don't allow setting "first pincode" if pincode is already set (#8654) 2024-09-17 16:29:36 +02:00
Kanin Temsrisuk
29671fa5cd Fixed Realgar_Shooter_EXE location (#8647) 2024-09-15 09:41:05 +02:00
AoShinHo
077f714e05 Converted ZC_SKILLINFO_DELETE to struct (#8595)
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2024-09-15 02:49:31 +02:00
16 changed files with 119 additions and 44 deletions

View File

@@ -83053,7 +83053,7 @@ Body:
Hunter: true
Rogue: true
Locations:
Right_Hand: true
Both_Hand: true
WeaponLevel: 4
EquipLevelMin: 70
Refineable: true

View File

@@ -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 ) {
set_eof(fd);
return 1;
}
else {
} else if (strnlen(sd->pincode, PINCODE_LENGTH) > 0) {
set_eof(fd);
return 1;
} else {
char newpin[PINCODE_LENGTH+1];
memset(newpin,0,PINCODE_LENGTH+1);
strncpy( newpin, RFIFOCP(fd,6), PINCODE_LENGTH );
@@ -561,7 +563,7 @@ int chclif_parse_char_delete2_req(int fd, struct char_session_data* sd) {
chclif_char_delete2_ack(fd, char_id, 5, 0);
return 1;
}
// success
delete_date = time(nullptr)+(charserv_config.char_config.char_del_delay);
@@ -985,7 +987,7 @@ void chclif_accessible_maps( int fd ){
}else{
p->maps[count].status = 0;
}
mapindex_getmapname_ext( accessible_map.map, p->maps[count].map );
p->packetLength += sizeof( p->maps[0] );
@@ -1527,7 +1529,7 @@ void chclif_reject(int fd, uint8 errCode){
int chclif_parse_reqcaptcha(int fd){
//FIFOSD_CHECK(8)
RFIFOSKIP(fd,8);
chclif_ack_captcha(fd);
chclif_ack_captcha(fd);
return 1;
}

View File

@@ -3792,7 +3792,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;

View File

@@ -1065,7 +1065,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
sd->status.skill[idx].id = 0;
sd->status.skill[idx].lv = 0;
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
clif_deleteskill(sd,WE_CALLBABY);
clif_deleteskill(*sd,WE_CALLBABY);
}
if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) {
@@ -1073,7 +1073,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
sd->status.skill[idx].id = 0;
sd->status.skill[idx].lv = 0;
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
clif_deleteskill(sd,WE_CALLBABY);
clif_deleteskill(*sd,WE_CALLBABY);
}
return 0;

View File

@@ -5698,28 +5698,26 @@ void clif_addskill(map_session_data *sd, int skill_id)
}
/// Deletes a skill from the skill tree (ZC_SKILLINFO_DELETE).
/// 0441 <skill id>.W
void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock)
{
#if PACKETVER >= 20081217
nullpo_retv(sd);
int fd = sd->fd;
/// Deletes a skill from the skill tree.
/// 0441 <skill id>.W (ZC_SKILLINFO_DELETE)
void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock){
#if PACKETVER >= 20081126
uint16 idx = skill_get_index(skill_id);
if (!session_isActive(fd) || !idx)
if (idx == 0)
return;
WFIFOHEAD(fd,packet_len(0x441));
WFIFOW(fd,0) = 0x441;
WFIFOW(fd,2) = skill_id;
WFIFOSET(fd,packet_len(0x441));
PACKET_ZC_SKILLINFO_DELETE p{};
p.packetType = HEADER_ZC_SKILLINFO_DELETE;
p.skillID = skill_id;
clif_send(&p,sizeof(p),&sd.bl,SELF);
#endif
#if PACKETVER_MAIN_NUM >= 20190807 || PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190918
if (!skip_infoblock)
#endif
clif_skillinfoblock(sd);
clif_skillinfoblock(&sd);
}
/// 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++){
guild_position& gp = g->guild.position[i];
PACKET_ZC_POSITION_INFO_sub& position = p->posInfo[i];
p->posInfo[i].positionID = i;
p->posInfo[i].right = gp.mode;
p->posInfo[i].ranking = i;
p->posInfo[i].payRate = gp.exp_mode;
position.positionID = static_cast<decltype(position.positionID)>( i );
position.right = gp.mode;
position.ranking = static_cast<decltype(position.ranking)>( i );
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);

View File

@@ -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_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, 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_skillcastcancel( block_list& bl );

View File

@@ -1209,7 +1209,6 @@
// 2008-11-26aSakexe
#if PACKETVER >= 20081126
packet(0x01a2,37);
packet(0x0441,4);
#endif
// 2008-12-10aSakexe

View File

@@ -1528,6 +1528,11 @@ 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,
@@ -1547,7 +1552,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. [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)
#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )

View File

@@ -1118,6 +1118,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;

View File

@@ -4998,15 +4998,17 @@ struct PACKET_ZC_POSITION_ID_NAME_INFO {
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_POSITION_ID_NAME_INFO, 0x0166);
struct PACKET_ZC_POSITION_INFO_sub {
int positionID;
int right;
int ranking;
int payRate;
} __attribute__((packed));
struct PACKET_ZC_POSITION_INFO {
int16 PacketType;
int16 PacketLength;
struct {
int positionID;
int right;
int ranking;
int payRate;
} posInfo[MAX_GUILDPOSITION];
struct PACKET_ZC_POSITION_INFO_sub posInfo[];
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_POSITION_INFO, 0x0160);

View File

@@ -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;
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 +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;
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 +5462,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;

View File

@@ -2128,7 +2128,21 @@ enum e_hat_effects : int16{
HAT_EF_C_BABY_GLOOM,
HAT_EF_WINTERNIGHTBELLS,
HAT_EF_NIGHTSKYOFRUTIE,
FOOTPRINT_EF_BASE,
FOOTPRINT_EF_STR_BASE,
FOOTPRINT_EF_PURPLESTAR,
FOOTPRINT_EF_YELLOWSTAR,
FOOTPRINT_EF_REDSTAR,
HAT_EF_RAINBOW_POISON_MASTER,
HAT_EF_C_ANCIENT_RUNE,
HAT_EF_C_DRAGON_GREEN_AURA,
HAT_EF_C_DRAGON_RED_AURA,
HAT_EF_C_DRAGON_YELLOW_AURA,
HAT_EF_INTERDIMENSIONAL_RIFT,
HAT_EF_C_CLB_SS_LL,
HAT_EF_VACATION,
HAT_EF_C_FH_LOSTWING,
FOOTPRINT_EF_DOGFOOT,
HAT_EF_MAX
};

View File

@@ -9186,6 +9186,11 @@
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);
@@ -10550,7 +10555,21 @@
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);

View File

@@ -3395,7 +3395,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s
case 1: //Copied by Plagiarism
{
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].lv = 0;
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
lv = (tsc) ? tsc->getSCE(SC__REPRODUCE)->val1 : 1;
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].lv = 0;
tsd->status.skill[tsd->reproduceskill_idx].flag = SKILL_FLAG_PERMANENT;

View File

@@ -1500,7 +1500,17 @@ enum e_skill {
NPC_CANE_OF_EVIL_EYE,
NPC_CURSE_OF_RED_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,
CR_SHRINK,
@@ -2332,6 +2342,10 @@ 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,
@@ -2339,6 +2353,21 @@ enum e_skill {
BO_EXPLOSIVE_POWDER,
BO_MAYHEMIC_THORNS,
IG_RADIANT_SPEAR = 6503,
IG_IMPERIAL_CROSS,
MT_RUSH_STRIKE = 6506,
MT_POWERFUL_SWING,
MT_ENERGY_CANNONADE,
BO_MYSTERY_POWDER,
BO_DUST_EXPLOSION,
SHC_CROSS_SLASH,
ABC_HIT_AND_SLIDING,
ABC_CHASING_BREAK,
ABC_CHASING_SHOT,
TR_RHYTHMICAL_WAVE = 6521,
HLIF_HEAL = 8001,
HLIF_AVOID,
HLIF_BRAIN,

View File

@@ -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.
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);