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:
Lemongrass3110 2024-04-02 16:06:56 +02:00 committed by GitHub
parent 3c1187e150
commit 9440869743
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 61 additions and 61 deletions

View File

@ -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;
}

View File

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

View File

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

View File

@ -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 };