diff --git a/src/map/chat.cpp b/src/map/chat.cpp index 9dcbf966cd..6f4e9075c7 100644 --- a/src/map/chat.cpp +++ b/src/map/chat.cpp @@ -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; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index c118718f4a..bdbf1063fa 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -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_buffer ); - clif_send(buf,WBUFW(buf,2),cd->owner,CHAT); + p->packetType = HEADER_ZC_CHANGE_CHATROOM; + p->packetSize = static_castpacketSize)>(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); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 951c884612..565c79a1c7 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -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 diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 4999e1f509..b2e982276c 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -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); diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 3435092d13..7bf442f123 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -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;