Added support for the "view player equip" feature (see topic:174461)
git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12245 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
8e690db7c9
commit
a9bafe200d
@ -3,6 +3,8 @@ Date Added
|
|||||||
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
|
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
|
||||||
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
||||||
|
|
||||||
|
2008/02/27
|
||||||
|
* Added support for the "view player equip" feature (see topic:174461)
|
||||||
2008/02/26
|
2008/02/26
|
||||||
* Added new settings for Autotrade. [Zephyrus]
|
* Added new settings for Autotrade. [Zephyrus]
|
||||||
2008/02/23
|
2008/02/23
|
||||||
|
@ -1032,9 +1032,9 @@ packet_ver: 22
|
|||||||
0x02d3,4
|
0x02d3,4
|
||||||
0x02d4,29
|
0x02d4,29
|
||||||
0x02d5,2
|
0x02d5,2
|
||||||
0x02d6,6
|
0x02d6,6,viewplayerequip,2
|
||||||
0x02d7,-1
|
0x02d7,-1
|
||||||
0x02d8,10
|
0x02d8,10,equiptickbox,6
|
||||||
0x02d9,10
|
0x02d9,10
|
||||||
0x02da,3
|
0x02da,3
|
||||||
0x02db,-1
|
0x02db,-1
|
||||||
|
@ -237,6 +237,7 @@ struct mmo_charstatus {
|
|||||||
#ifdef HOTKEY_SAVING
|
#ifdef HOTKEY_SAVING
|
||||||
struct hotkey hotkeys[MAX_HOTKEYS];
|
struct hotkey hotkeys[MAX_HOTKEYS];
|
||||||
#endif
|
#endif
|
||||||
|
bool show_equip;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum mail_status {
|
enum mail_status {
|
||||||
|
135
src/map/clif.c
135
src/map/clif.c
@ -7429,6 +7429,103 @@ void clif_feel_hate_reset(struct map_session_data *sd)
|
|||||||
WFIFOSET(fd, packet_len(0x20e));
|
WFIFOSET(fd, packet_len(0x20e));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*==========================================
|
||||||
|
* Equip window (un)tick ack
|
||||||
|
* R 02d9 <zero>.L <flag>.L
|
||||||
|
*------------------------------------------*/
|
||||||
|
void clif_equiptickack(struct map_session_data* sd, int flag)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
nullpo_retv(sd);
|
||||||
|
fd = sd->fd;
|
||||||
|
|
||||||
|
WFIFOHEAD(fd, packet_len(0x2d9));
|
||||||
|
WFIFOW(fd, 0) = 0x2d9;
|
||||||
|
WFIFOL(fd, 2) = 0;
|
||||||
|
WFIFOL(fd, 6) = flag;
|
||||||
|
WFIFOSET(fd, packet_len(0x2d9));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==========================================
|
||||||
|
* The player's 'view equip' state, sent during login
|
||||||
|
* R 02da <flag>.B
|
||||||
|
*------------------------------------------*/
|
||||||
|
void clif_equipcheckbox(struct map_session_data* sd)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
nullpo_retv(sd);
|
||||||
|
fd = sd->fd;
|
||||||
|
|
||||||
|
WFIFOHEAD(fd, packet_len(0x2da));
|
||||||
|
WFIFOW(fd, 0) = 0x2da;
|
||||||
|
WFIFOW(fd, 2) = (sd->status.show_equip ? 1 : 0);
|
||||||
|
WFIFOSET(fd, packet_len(0x2da));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==========================================
|
||||||
|
* Sends info about a player's equipped items
|
||||||
|
* R 002d7 <length>.W <name>.24B <class>.w <hairstyle>.w <up-viewid>.w <mid-viewid>.w <low-viewid>.w <haircolor>.w <cloth-dye>.w <gender>.1B {equip item}.26B*
|
||||||
|
*------------------------------------------*/
|
||||||
|
void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* tsd)
|
||||||
|
{
|
||||||
|
int i, n, fd;
|
||||||
|
nullpo_retv(sd);
|
||||||
|
nullpo_retv(tsd);
|
||||||
|
fd = sd->fd;
|
||||||
|
|
||||||
|
WFIFOHEAD(fd, MAX_INVENTORY * 26 + 43);
|
||||||
|
|
||||||
|
WFIFOW(fd, 0) = 0x2d7;
|
||||||
|
safestrncpy((char*)WFIFOP(fd, 4), tsd->status.name, NAME_LENGTH);
|
||||||
|
WFIFOW(fd,28) = tsd->status.class_;
|
||||||
|
WFIFOW(fd,30) = tsd->vd.hair_style;
|
||||||
|
WFIFOW(fd,32) = tsd->vd.head_top;
|
||||||
|
WFIFOW(fd,34) = tsd->vd.head_mid;
|
||||||
|
WFIFOW(fd,36) = tsd->vd.head_bottom;
|
||||||
|
WFIFOW(fd,38) = tsd->vd.hair_color;
|
||||||
|
WFIFOW(fd,40) = tsd->vd.cloth_color;
|
||||||
|
WFIFOB(fd,42) = tsd->vd.sex;
|
||||||
|
|
||||||
|
for(i=0,n=0; i < MAX_INVENTORY; i++)
|
||||||
|
{
|
||||||
|
if (tsd->status.inventory[i].nameid <= 0 || tsd->inventory_data[i] == NULL) // Item doesn't exist
|
||||||
|
continue;
|
||||||
|
if (itemdb_isstackable2(tsd->inventory_data[i])) // Is not equippable
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Inventory position
|
||||||
|
WFIFOW(fd, n*26+43) = i + 2;
|
||||||
|
// Add refine, identify flag, element, etc.
|
||||||
|
clif_item_sub(WFIFOP(fd,0), n*26+45, &tsd->status.inventory[i], tsd->inventory_data[i], pc_equippoint(tsd, i));
|
||||||
|
// Add cards
|
||||||
|
clif_addcards(WFIFOP(fd, n*26+55), &tsd->status.inventory[i]);
|
||||||
|
// Expiration date stuff, if all of those are set to 0 then the client doesn't show anything related (6 bytes)
|
||||||
|
memset(WFIFOP(fd, n*26+63), 0, 6);
|
||||||
|
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
|
||||||
|
WFIFOW(fd, 2) = 43 + n*26; // Set length
|
||||||
|
WFIFOSET(fd, WFIFOW(fd, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==========================================
|
||||||
|
* View player equip request denied
|
||||||
|
* R 0291 <message>.W
|
||||||
|
* TODO: this looks like a general-purpose packet to print msgstringtable entries.
|
||||||
|
*------------------------------------------*/
|
||||||
|
void clif_viewequip_fail(struct map_session_data* sd)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
nullpo_retv(sd);
|
||||||
|
fd = sd->fd;
|
||||||
|
|
||||||
|
WFIFOHEAD(fd, packet_len(0x291));
|
||||||
|
WFIFOW(fd, 0) = 0x291;
|
||||||
|
WFIFOW(fd, 2) = 0x54d; // This controls which message is displayed. 0x54d is the correct one. Maybe it's used for something else too?
|
||||||
|
WFIFOSET(fd, packet_len(0x291));
|
||||||
|
}
|
||||||
|
|
||||||
/// Validates one global/guild/party/whisper message packet and tries to recognize its components.
|
/// Validates one global/guild/party/whisper message packet and tries to recognize its components.
|
||||||
/// Returns true if the packet was parsed successfully.
|
/// Returns true if the packet was parsed successfully.
|
||||||
/// Formats: 0 - <packet id>.w <packet len>.w (<name> : <message>).?B 00
|
/// Formats: 0 - <packet id>.w <packet len>.w (<name> : <message>).?B 00
|
||||||
@ -7869,6 +7966,10 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
|
|||||||
clif_status_load(&sd->bl, SI_NIGHT, 1);
|
clif_status_load(&sd->bl, SI_NIGHT, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if PACKETVER >= 9
|
||||||
|
clif_equipcheckbox(sd);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Notify everyone that this char logged in [Skotlex].
|
// Notify everyone that this char logged in [Skotlex].
|
||||||
clif_foreachclient(clif_friendslist_toggle_sub, sd->status.account_id, sd->status.char_id, 1);
|
clif_foreachclient(clif_friendslist_toggle_sub, sd->status.account_id, sd->status.char_id, 1);
|
||||||
|
|
||||||
@ -11600,6 +11701,34 @@ void clif_parse_Mail_send(int fd, struct map_session_data *sd)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*==========================================
|
||||||
|
* Requesting equip of a player
|
||||||
|
*------------------------------------------*/
|
||||||
|
void clif_parse_ViewPlayerEquip(int fd, struct map_session_data* sd)
|
||||||
|
{
|
||||||
|
int charid = RFIFOL(fd, 2);
|
||||||
|
struct map_session_data* tsd = map_id2sd(charid);
|
||||||
|
|
||||||
|
if (!tsd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( tsd->status.show_equip )
|
||||||
|
clif_viewequip_ack(sd, tsd);
|
||||||
|
else
|
||||||
|
clif_viewequip_fail(sd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==========================================
|
||||||
|
* Equip window (un)tick
|
||||||
|
* S 02d8 <zero?>.L <flag>.L
|
||||||
|
*------------------------------------------*/
|
||||||
|
void clif_parse_EquipTick(int fd, struct map_session_data* sd)
|
||||||
|
{
|
||||||
|
bool flag = (bool)RFIFOL(fd,6); // 0=off, 1=on
|
||||||
|
sd->status.show_equip = flag;
|
||||||
|
clif_equiptickack(sd, flag);
|
||||||
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* ƒpƒPƒbƒgƒfƒoƒbƒO
|
* ƒpƒPƒbƒgƒfƒoƒbƒO
|
||||||
*------------------------------------------*/
|
*------------------------------------------*/
|
||||||
@ -11864,12 +11993,12 @@ static int packetdb_readdb(void)
|
|||||||
0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
//#0x0280
|
//#0x0280
|
||||||
0, 0, 0, 6, 0, 0, 0, 0, 0, 8, 18, 0, 0, 0, 0, 0,
|
0, 0, 0, 6, 0, 0, 0, 0, 0, 8, 18, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 0, 0, 0, 0,
|
||||||
//#0x02C0
|
//#0x02C0
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 6, -1, 10, 10, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
};
|
};
|
||||||
@ -12032,6 +12161,8 @@ static int packetdb_readdb(void)
|
|||||||
{clif_parse_Mail_winopen,"mailwinopen"},
|
{clif_parse_Mail_winopen,"mailwinopen"},
|
||||||
{clif_parse_Mail_send,"mailsend"},
|
{clif_parse_Mail_send,"mailsend"},
|
||||||
#endif
|
#endif
|
||||||
|
{clif_parse_ViewPlayerEquip,"viewplayerequip"},
|
||||||
|
{clif_parse_EquipTick,"equiptickbox"},
|
||||||
{NULL,NULL}
|
{NULL,NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -389,6 +389,11 @@ int clif_hom_food(struct map_session_data *sd,int foodid,int fail); //[orn]
|
|||||||
void clif_send_homdata(struct map_session_data *sd, int type, int param); //[orn]
|
void clif_send_homdata(struct map_session_data *sd, int type, int param); //[orn]
|
||||||
int clif_hwalkok(struct homun_data *hd); //[orn]
|
int clif_hwalkok(struct homun_data *hd); //[orn]
|
||||||
|
|
||||||
|
void clif_equiptickack(struct map_session_data* sd, int flag);
|
||||||
|
void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* tsd);
|
||||||
|
void clif_viewequip_fail(struct map_session_data* sd);
|
||||||
|
void clif_equipcheckbox(struct map_session_data* sd);
|
||||||
|
|
||||||
int clif_foreachclient(int (*)(struct map_session_data*,va_list),...);
|
int clif_foreachclient(int (*)(struct map_session_data*,va_list),...);
|
||||||
int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target type);
|
int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target type);
|
||||||
int do_final_clif(void);
|
int do_final_clif(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user