Browse Source

Converted ZC_CHANGE_CHATROOM to struct (#8589)

---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
AoShinHo 8 tháng trước cách đây
mục cha
commit
c4b77f1942
5 tập tin đã thay đổi với 48 bổ sung20 xóa
  1. 1 1
      src/map/chat.cpp
  2. 34 17
      src/map/clif.cpp
  3. 1 1
      src/map/clif.hpp
  4. 0 1
      src/map/clif_packetdb.hpp
  5. 12 0
      src/map/packets.hpp

+ 1 - 1
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;

+ 34 - 17
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_ZC_CHANGE_CHATROOM*>( packet_buffer );
+
+	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(buf,WBUFW(buf,2),cd->owner,CHAT);
+	clif_send(p,p->packetSize,cd.owner,CHAT);
 }
 
 

+ 1 - 1
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
 

+ 0 - 1
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);

+ 12 - 0
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;