summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/map/clif.c110
-rw-r--r--src/map/clif.h2
-rw-r--r--src/map/packets_struct.h32
3 files changed, 85 insertions, 59 deletions
diff --git a/src/map/clif.c b/src/map/clif.c
index 37e2fea64..42cfe38d7 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -5254,58 +5254,79 @@ static int clif_insight(struct block_list *bl, va_list ap)
return 0;
}
+static void clif_playerSkillToPacket(struct map_session_data *sd, struct SKILLDATA *skillData, int skillId, int idx, bool newSkill)
+{
+ nullpo_retv(sd);
+ nullpo_retv(skillData);
+ Assert_retv(idx >= 0 && idx < MAX_SKILL_DB);
+
+ int skill_lv = sd->status.skill[idx].lv;
+ skillData->id = skillId;
+ skillData->inf = skill->get_inf(skillId);
+ skillData->level = skill_lv;
+ if (skill_lv > 0) {
+ skillData->sp = skill->get_sp(skillId, skill_lv);
+ skillData->range2 = skill->get_range2(&sd->bl, skillId, skill_lv);
+ } else {
+ skillData->sp = 0;
+ skillData->range2 = 0;
+ }
+#if PACKETVER_RE_NUM >= 20190807
+ if (newSkill)
+ skillData->level2 = 0;
+ else
+ skillData->level2 = skill_lv;
+#else
+ safestrncpy(skillData->name, skill->get_name(skillId), NAME_LENGTH);
+#endif
+ if (sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT)
+ skillData->upFlag = (skill_lv < skill->tree_get_max(skillId, sd->status.class)) ? 1 : 0;
+ else
+ skillData->upFlag = 0;
+}
+
/// Updates whole skill tree (ZC_SKILLINFO_LIST).
/// 010f <packet len>.W { <skill id>.W <type>.L <level>.W <sp cost>.W <attack range>.W <skill name>.24B <upgradable>.B }*
static void clif_skillinfoblock(struct map_session_data *sd)
{
- int fd;
- int i,len,id;
-
nullpo_retv(sd);
- fd=sd->fd;
- if (!fd) return;
+ int fd = sd->fd;
+ if (!fd)
+ return;
- WFIFOHEAD(fd, MAX_SKILL_DB * 37 + 4);
- WFIFOW(fd,0) = 0x10f;
- for ( i = 0, len = 4; i < MAX_SKILL_DB; i++) {
- if( (id = sd->status.skill[i].id) != 0 ) {
- int level;
+ WFIFOHEAD(fd, sizeof(struct PACKET_ZC_SKILLINFO_LIST) + MAX_SKILL_DB * sizeof(struct SKILLDATA));
+ struct PACKET_ZC_SKILLINFO_LIST *p = WFIFOP(fd, 0);
+
+ p->packetType = HEADER_ZC_SKILLINFO_LIST;
+ int skillIndex = 0;
+ int len = sizeof(struct PACKET_ZC_SKILLINFO_LIST);
+ int i;
+ for (i = 0; i < MAX_SKILL_DB; i++) {
+ int id = sd->status.skill[i].id;
+ if (id != 0) {
// workaround for bugreport:5348
- if (len + 37 > 8192)
+ if (len + sizeof(struct SKILLDATA) > 8192)
break;
- WFIFOW(fd, len) = id;
- WFIFOL(fd, len + 2) = skill->get_inf(id);
- level = sd->status.skill[i].lv;
- WFIFOW(fd, len + 6) = level;
- if (level) {
- WFIFOW(fd, len + 8) = skill->get_sp(id, level);
- WFIFOW(fd, len + 10)= skill->get_range2(&sd->bl, id, level);
- }
- else {
- WFIFOW(fd, len + 8) = 0;
- WFIFOW(fd, len + 10)= 0;
- }
- safestrncpy(WFIFOP(fd,len+12), skill->get_name(id), NAME_LENGTH);
- if(sd->status.skill[i].flag == SKILL_FLAG_PERMANENT)
- WFIFOB(fd,len+36) = (sd->status.skill[i].lv < skill->tree_get_max(id, sd->status.class))? 1:0;
- else
- WFIFOB(fd,len+36) = 0;
- len += 37;
+ clif->playerSkillToPacket(sd, &p->skills[skillIndex], id, i, false);
+ len += sizeof(struct SKILLDATA);
+ skillIndex++;
}
}
- WFIFOW(fd,2)=len;
- WFIFOSET(fd,len);
+ p->packetLength = len;
+ WFIFOSET(fd, len);
// workaround for bugreport:5348; send the remaining skills one by one to bypass packet size limit
- for ( ; i < MAX_SKILL_DB; i++) {
- if( (id = sd->status.skill[i].id) != 0 ) {
+ for (; i < MAX_SKILL_DB; i++) {
+ int id = sd->status.skill[i].id;
+ if (id != 0) {
clif->addskill(sd, id);
clif->skillinfo(sd, id, 0);
}
}
}
+
/**
* Server tells client 'sd' to add skill of id 'id' to it's skill tree (e.g. with Ice Falcion item)
**/
@@ -5324,30 +5345,10 @@ static void clif_addskill(struct map_session_data *sd, int id)
if (sd->status.skill[idx].id <= 0)
return;
- int skill_lv = sd->status.skill[idx].lv;
-
WFIFOHEAD(fd, sizeof(struct PACKET_ZC_ADD_SKILL));
struct PACKET_ZC_ADD_SKILL *p = WFIFOP(fd, 0);
p->packetType = HEADER_ZC_ADD_SKILL;
- p->id = id;
- p->inf = skill->get_inf(id);
- p->level = skill_lv;
- if (skill_lv > 0) {
- p->sp = skill->get_sp(id, skill_lv);
- p->range2 = skill->get_range2(&sd->bl, id, skill_lv);
- } else {
- p->sp = 0;
- p->range2 = 0;
- }
-#if PACKETVER_RE_NUM >= 20190807
- p->level2 = 0;
-#else
- safestrncpy(p->name, skill->get_name(id), NAME_LENGTH);
-#endif
- if (sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT)
- p->upFlag = (skill_lv < skill->tree_get_max(id, sd->status.class)) ? 1 : 0;
- else
- p->upFlag = 0;
+ clif->playerSkillToPacket(sd, &p->skill, id, idx, true);
WFIFOSET(fd, sizeof(struct PACKET_ZC_ADD_SKILL));
}
@@ -23383,6 +23384,7 @@ void clif_defaults(void)
clif->skillinfo = clif_skillinfo;
clif->addskill = clif_addskill;
clif->deleteskill = clif_deleteskill;
+ clif->playerSkillToPacket = clif_playerSkillToPacket;
/* party-specific */
clif->party_created = clif_party_created;
clif->party_member_info = clif_party_member_info;
diff --git a/src/map/clif.h b/src/map/clif.h
index ca7ae35b0..103ca214f 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -57,6 +57,7 @@ struct view_data;
struct achievement_data; // map/achievement.h
struct s_refine_requirement;
struct PACKET_ZC_ACK_RANKING_sub;
+struct SKILLDATA;
enum clif_messages;
enum rodex_add_item;
@@ -1068,6 +1069,7 @@ struct clif_interface {
void (*skillinfo) (struct map_session_data *sd,int skill_id, int inf);
void (*addskill) (struct map_session_data *sd, int id);
void (*deleteskill) (struct map_session_data *sd, int id);
+ void (*playerSkillToPacket) (struct map_session_data *sd, struct SKILLDATA *skillData, int skillId, int idx, bool newSkill);
/* party-specific */
void (*party_created) (struct map_session_data *sd,int result);
void (*party_member_info) (struct party_data *p, struct map_session_data *sd);
diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h
index 8170f13f2..233c6d9c2 100644
--- a/src/map/packets_struct.h
+++ b/src/map/packets_struct.h
@@ -3533,9 +3533,9 @@ struct PACKET_ZC_HAT_EFFECT {
DEFINE_PACKET_HEADER(ZC_HAT_EFFECT, 0x0a3b);
#endif
+// [4144] this struct updated not in all packets in client
#if PACKETVER_RE_NUM >= 20190807
-struct PACKET_ZC_ADD_SKILL {
- int16 packetType;
+struct SKILLDATA {
uint16 id;
int inf;
uint16 level;
@@ -3544,10 +3544,8 @@ struct PACKET_ZC_ADD_SKILL {
uint8 upFlag;
uint16 level2;
} __attribute__((packed));
-DEFINE_PACKET_HEADER(ZC_ADD_SKILL, 0x0b31);
#else
-struct PACKET_ZC_ADD_SKILL {
- int16 packetType;
+struct SKILLDATA {
uint16 id;
int inf;
uint16 level;
@@ -3556,9 +3554,33 @@ struct PACKET_ZC_ADD_SKILL {
char name[NAME_LENGTH];
uint8 upFlag;
} __attribute__((packed));
+#endif
+
+#if PACKETVER_RE_NUM >= 20190807
+struct PACKET_ZC_ADD_SKILL {
+ int16 packetType;
+ struct SKILLDATA skill;
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_ADD_SKILL, 0x0b31);
+#else
+struct PACKET_ZC_ADD_SKILL {
+ int16 packetType;
+ struct SKILLDATA skill;
+} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_ADD_SKILL, 0x0111);
#endif
+struct PACKET_ZC_SKILLINFO_LIST {
+ int16 packetType;
+ int16 packetLength;
+ struct SKILLDATA skills[];
+} __attribute__((packed));
+#if PACKETVER_RE_NUM >= 20190807
+DEFINE_PACKET_HEADER(ZC_SKILLINFO_LIST, 0x0b32);
+#else
+DEFINE_PACKET_HEADER(ZC_SKILLINFO_LIST, 0x010f);
+#endif
+
#if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
#pragma pack(pop)
#endif // not NetBSD < 6 / Solaris