Converted ZC_CHANGE_CHATROOM to struct (#8589)

---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
This commit is contained in:
AoShinHo 2024-09-12 15:51:13 -03:00 committed by GitHub
parent ae0bb4929c
commit c4b77f1942
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 48 additions and 20 deletions

View File

@ -326,7 +326,7 @@ int chat_changechatstatus(map_session_data* sd, const char* title, const char* p
cd->limit = min(limit, ARRAYLENGTH(cd->usersd));
cd->pub = pub;
clif_changechatstatus(cd);
clif_changechatstatus(*cd);
clif_dispchat(cd,0);
return 0;

View File

@ -4472,28 +4472,45 @@ void clif_dispchat(struct chat_data* cd, int fd)
/// 1 = public
/// 2 = arena (npc waiting room)
/// 3 = PK zone (non-clickable)
void clif_changechatstatus(struct chat_data* cd)
{
unsigned char buf[128];
uint8 type;
void clif_changechatstatus(chat_data& cd) {
if( cd == nullptr || cd->usersd[0] == nullptr )
if(cd.usersd[0] == nullptr )
return;
type = (cd->owner->type == BL_PC ) ? (cd->pub) ? 1 : 0
: (cd->owner->type == BL_NPC) ? (cd->limit) ? 2 : 3
: 1;
enum e_chat_flags:uint8 {
CHAT_PRIVATE = 0,
CHAT_PUBLIC,
CHAT_ARENA,
CHAT_PK
};
WBUFW(buf, 0) = 0xdf;
WBUFW(buf, 2) = (uint16)(17 + strlen(cd->title));
WBUFL(buf, 4) = cd->owner->id;
WBUFL(buf, 8) = cd->bl.id;
WBUFW(buf,12) = cd->limit;
WBUFW(buf,14) = (cd->owner->type == BL_NPC) ? cd->users+1 : cd->users;
WBUFB(buf,16) = type;
memcpy(WBUFCP(buf,17), cd->title, strlen(cd->title)); // not zero-terminated
PACKET_ZC_CHANGE_CHATROOM* p = reinterpret_cast<PACKET_ZC_CHANGE_CHATROOM*>( packet_buffer );
clif_send(buf,WBUFW(buf,2),cd->owner,CHAT);
p->packetType = HEADER_ZC_CHANGE_CHATROOM;
p->packetSize = static_cast<decltype(p->packetSize)>(sizeof(*p) + strlen(cd.title));
p->ownerId = cd.owner->id;
p->chatId = cd.bl.id;
p->limit = cd.limit;
p->users = cd.users;
// not zero-terminated
strncpy(p->title, cd.title, strlen(cd.title));
if(cd.owner->type == BL_NPC){
// NPC itself counts as additional chat user
p->users++;
if(cd.limit)
p->flag = CHAT_ARENA;
else
p->flag = CHAT_PK;
}else if(cd.owner->type == BL_PC && cd.pub == false){
p->flag = CHAT_PRIVATE;
}else{
p->flag = CHAT_PUBLIC;
}
clif_send(p,p->packetSize,cd.owner,CHAT);
}

View File

@ -890,7 +890,7 @@ void clif_addchat(struct chat_data* cd,map_session_data *sd); // chat
void clif_changechatowner(struct chat_data* cd, map_session_data* sd); // chat
void clif_clearchat(struct chat_data *cd,int fd); // area or fd
void clif_leavechat(struct chat_data* cd, map_session_data* sd, bool flag); // chat
void clif_changechatstatus(struct chat_data* cd); // chat
void clif_changechatstatus(chat_data& cd);
void clif_refresh_storagewindow(map_session_data *sd);
void clif_refresh(map_session_data *sd); // self

View File

@ -91,7 +91,6 @@
packet(0x00dc,28);
packet(0x00dd,29);
parseable_packet(0x00de,-1,clif_parse_ChatRoomStatusChange,2,4,6,7,15);
packet(0x00df,-1);
parseable_packet(0x00e0,30,clif_parse_ChangeChatOwner,2,6);
packet(0x00e1,30);
parseable_packet(0x00e2,26,clif_parse_KickFromChat,2);

View File

@ -878,6 +878,18 @@ struct PACKET_ZC_PAR_CHANGE_USER {
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_PAR_CHANGE_USER, 0x1ab)
struct PACKET_ZC_CHANGE_CHATROOM{
uint16 packetType;
uint16 packetSize;
uint32 ownerId;
uint32 chatId;
uint16 limit;
uint16 users;
uint8 flag;
char title[];
} __attribute__((packed));
DEFINE_PACKET_HEADER(ZC_CHANGE_CHATROOM, 0xdf);
struct PACKET_ZC_EQUIP_ARROW {
int16 packetType;
uint16 index;