Cleaned up ZC_AUTOSPELLLIST (#8216)
Cleaned up code. Fixed invalid allocations from the old code. Changed to struct. Use correct packet id. Fixed invalid RENEWAL check instead of PACKETVER. Thanks to @aleos89
This commit is contained in:
parent
3c1187e150
commit
9440869743
117
src/map/clif.cpp
117
src/map/clif.cpp
@ -8518,75 +8518,76 @@ void clif_pet_autofeed_status(map_session_data* sd, bool force) {
|
||||
#endif
|
||||
}
|
||||
|
||||
/// Presents a list of skills that can be auto-spelled (ZC_AUTOSPELLLIST).
|
||||
/// 01cd { <skill id>.L }*7
|
||||
void clif_autospell(map_session_data *sd,uint16 skill_lv)
|
||||
{
|
||||
nullpo_retv(sd);
|
||||
|
||||
int fd = sd->fd;
|
||||
|
||||
#ifdef RENEWAL
|
||||
uint16 autospell_skill[][2] = {
|
||||
{ MG_FIREBOLT, 0 }, { MG_COLDBOLT, 0 }, { MG_LIGHTNINGBOLT, 0 },
|
||||
{ MG_SOULSTRIKE, 3 }, { MG_FIREBALL, 3 },
|
||||
{ WZ_EARTHSPIKE, 6 }, { MG_FROSTDIVER, 6 },
|
||||
{ MG_THUNDERSTORM, 9 }, { WZ_HEAVENDRIVE, 9 }
|
||||
/// Presents a list of skills that can be auto-spelled.
|
||||
/// 01cd { <skill id>.L }*7 (ZC_AUTOSPELLLIST)
|
||||
void clif_autospell( map_session_data& sd, uint16 skill_lv ){
|
||||
struct s_autospell_requirement{
|
||||
uint16 skill_id;
|
||||
uint16 required_autospell_skill_lv;
|
||||
};
|
||||
int count = 0;
|
||||
|
||||
WFIFOHEAD(fd, 2 * 6 + 4);
|
||||
WFIFOW(fd, 0) = 0x442;
|
||||
#ifndef RENEWAL
|
||||
const std::vector<s_autospell_requirement> autospell_skills = {
|
||||
{ MG_FIREBOLT, 0 },
|
||||
{ MG_COLDBOLT, 0 },
|
||||
{ MG_LIGHTNINGBOLT, 0 },
|
||||
{ MG_SOULSTRIKE, 3 },
|
||||
{ MG_FIREBALL, 3 },
|
||||
{ WZ_EARTHSPIKE, 6 },
|
||||
{ MG_FROSTDIVER, 6 },
|
||||
{ MG_THUNDERSTORM, 9 },
|
||||
{ WZ_HEAVENDRIVE, 9 }
|
||||
};
|
||||
#else
|
||||
const std::vector<s_autospell_requirement> autospell_skills = {
|
||||
{ MG_NAPALMBEAT, 0 },
|
||||
{ MG_COLDBOLT, 1 },
|
||||
{ MG_FIREBOLT, 1 },
|
||||
{ MG_LIGHTNINGBOLT, 1 },
|
||||
{ MG_SOULSTRIKE, 4 },
|
||||
{ MG_FIREBALL, 7 },
|
||||
{ MG_FROSTDIVER, 9 },
|
||||
};
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < ARRAYLENGTH(autospell_skill); i++) {
|
||||
if (skill_lv > autospell_skill[i][1] && pc_checkskill(sd, autospell_skill[i][0])) {
|
||||
WFIFOW(fd, 8 + count * 2) = autospell_skill[i][0];
|
||||
count++;
|
||||
#if PACKETVER_MAIN_NUM >= 20181128 || PACKETVER_RE_NUM >= 20181031
|
||||
PACKET_ZC_AUTOSPELLLIST* p = (PACKET_ZC_AUTOSPELLLIST*)packet_buffer;
|
||||
|
||||
p->packetType = HEADER_ZC_AUTOSPELLLIST;
|
||||
p->packetLength = sizeof( *p );
|
||||
|
||||
size_t count = 0;
|
||||
for( const s_autospell_requirement& requirement : autospell_skills ){
|
||||
if( skill_lv > requirement.required_autospell_skill_lv && pc_checkskill( &sd, requirement.skill_id ) ){
|
||||
p->skills[count++] = requirement.skill_id;
|
||||
p->packetLength += sizeof( p->skills[0] );
|
||||
}
|
||||
}
|
||||
|
||||
WFIFOW(fd, 2) = 8 + count * 2;
|
||||
WFIFOL(fd, 4) = count;
|
||||
clif_send( p, p->packetLength, &sd.bl, SELF );
|
||||
#elif PACKETVER_MAIN_NUM >= 20090406 || defined(PACKETVER_RE) || defined(PACKETVER_ZERO) || PACKETVER_SAK_NUM >= 20080618
|
||||
PACKET_ZC_AUTOSPELLLIST p = {};
|
||||
|
||||
WFIFOSET(fd, WFIFOW(fd, 2));
|
||||
#else
|
||||
WFIFOHEAD(fd,packet_len(0x1cd));
|
||||
WFIFOW(fd, 0)=0x1cd;
|
||||
p.packetType = HEADER_ZC_AUTOSPELLLIST;
|
||||
|
||||
if(skill_lv>0 && pc_checkskill(sd,MG_NAPALMBEAT)>0)
|
||||
WFIFOL(fd,2)= MG_NAPALMBEAT;
|
||||
else
|
||||
WFIFOL(fd,2)= 0x00000000;
|
||||
if(skill_lv>1 && pc_checkskill(sd,MG_COLDBOLT)>0)
|
||||
WFIFOL(fd,6)= MG_COLDBOLT;
|
||||
else
|
||||
WFIFOL(fd,6)= 0x00000000;
|
||||
if(skill_lv>1 && pc_checkskill(sd,MG_FIREBOLT)>0)
|
||||
WFIFOL(fd,10)= MG_FIREBOLT;
|
||||
else
|
||||
WFIFOL(fd,10)= 0x00000000;
|
||||
if(skill_lv>1 && pc_checkskill(sd,MG_LIGHTNINGBOLT)>0)
|
||||
WFIFOL(fd,14)= MG_LIGHTNINGBOLT;
|
||||
else
|
||||
WFIFOL(fd,14)= 0x00000000;
|
||||
if(skill_lv>4 && pc_checkskill(sd,MG_SOULSTRIKE)>0)
|
||||
WFIFOL(fd,18)= MG_SOULSTRIKE;
|
||||
else
|
||||
WFIFOL(fd,18)= 0x00000000;
|
||||
if(skill_lv>7 && pc_checkskill(sd,MG_FIREBALL)>0)
|
||||
WFIFOL(fd,22)= MG_FIREBALL;
|
||||
else
|
||||
WFIFOL(fd,22)= 0x00000000;
|
||||
if(skill_lv>9 && pc_checkskill(sd,MG_FROSTDIVER)>0)
|
||||
WFIFOL(fd,26)= MG_FROSTDIVER;
|
||||
else
|
||||
WFIFOL(fd,26)= 0x00000000;
|
||||
size_t count = 0;
|
||||
for( const s_autospell_requirement& requirement : autospell_skills ){
|
||||
if( count == ARRAYLENGTH( p.skills ) ){
|
||||
break;
|
||||
}
|
||||
|
||||
WFIFOSET(fd,packet_len(0x1cd));
|
||||
if( skill_lv > requirement.required_autospell_skill_lv && pc_checkskill( &sd, requirement.skill_id ) ){
|
||||
p.skills[count++] = requirement.skill_id;
|
||||
}else{
|
||||
p.skills[count++] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
clif_send( &p, sizeof( p ), &sd.bl, SELF );
|
||||
#endif
|
||||
|
||||
sd->menuskill_id = SA_AUTOSPELL;
|
||||
sd->menuskill_val = skill_lv;
|
||||
sd.menuskill_id = SA_AUTOSPELL;
|
||||
sd.menuskill_val = skill_lv;
|
||||
}
|
||||
|
||||
|
||||
|
@ -760,7 +760,7 @@ void clif_skillunit_update(struct block_list* bl);
|
||||
|
||||
void clif_skill_unit_test(struct block_list *bl, short x, short y, int unit_id, short range, short skill_lv);
|
||||
|
||||
void clif_autospell(map_session_data *sd,uint16 skill_lv);
|
||||
void clif_autospell( map_session_data& sd, uint16 skill_lv );
|
||||
void clif_devotion(struct block_list *src, map_session_data *tsd);
|
||||
void clif_spiritball( struct block_list *bl, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
||||
void clif_soulball( map_session_data *sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
||||
|
@ -349,7 +349,6 @@
|
||||
//packet(0x01ca,-1);
|
||||
packet(0x01cb,9);
|
||||
packet(0x01cc,9);
|
||||
packet(0x01cd,30);
|
||||
parseable_packet(0x01ce,6,clif_parse_AutoSpell,2);
|
||||
packet(0x01cf,28);
|
||||
packet(0x01d0,8);
|
||||
|
@ -9807,7 +9807,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
if (sd) {
|
||||
sd->state.workinprogress = WIP_DISABLE_ALL;
|
||||
clif_autospell(sd,skill_lv);
|
||||
clif_autospell( *sd, skill_lv );
|
||||
} else {
|
||||
int maxlv=1,spellid=0;
|
||||
static const int spellarray[3] = { MG_COLDBOLT,MG_FIREBOLT,MG_LIGHTNINGBOLT };
|
||||
|
Loading…
x
Reference in New Issue
Block a user