From 7f2c842f6d3177b4f82fe85d50a10df5cc6be547 Mon Sep 17 00:00:00 2001 From: rtw1x1 Date: Wed, 21 Jan 2026 08:34:42 +0000 Subject: [PATCH] QoL: Server-Side mark broadcast --- src/game/input_login.cpp | 27 ++++++++++++++++++++++++++- src/game/packet.h | 8 ++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/game/input_login.cpp b/src/game/input_login.cpp index fc2b3d3..ea9c46f 100644 --- a/src/game/input_login.cpp +++ b/src/game/input_login.cpp @@ -924,10 +924,35 @@ void CInputLogin::GuildMarkUpload(LPDESC d, const char* c_pData) if (*((DWORD *) p->image + iPixel) != 0x00000000) isEmpty = false; + DWORD markID = CGuildMarkManager::INVALID_MARK_ID; + if (isEmpty) rkMarkMgr.DeleteMark(p->gid); else - rkMarkMgr.SaveMark(p->gid, p->image); + markID = rkMarkMgr.SaveMark(p->gid, p->image); + + // Broadcast mark update to all connected game clients + if (markID != CGuildMarkManager::INVALID_MARK_ID) + { + WORD imgIdx = static_cast(markID / CGuildMarkImage::MARK_TOTAL_COUNT); + + TPacketGCMarkUpdate packet; + packet.header = HEADER_GC_MARK_UPDATE; + packet.guildID = p->gid; + packet.imgIdx = imgIdx; + + const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet(); + for (DESC_MANAGER::DESC_SET::const_iterator it = c_set_desc.begin(); it != c_set_desc.end(); ++it) + { + LPDESC pkDesc = *it; + if (pkDesc && pkDesc->GetCharacter()) + { + pkDesc->Packet(&packet, sizeof(packet)); + } + } + + sys_log(0, "MARK_SERVER: GuildMarkUpload: Broadcast mark update for guild %u, imgIdx %u", p->gid, imgIdx); + } } void CInputLogin::GuildMarkIDXList(LPDESC d, const char* c_pData) diff --git a/src/game/packet.h b/src/game/packet.h index 989d5c3..78b3ef3 100644 --- a/src/game/packet.h +++ b/src/game/packet.h @@ -212,6 +212,7 @@ enum HEADER_GC_MARK_BLOCK = 100, HEADER_GC_MARK_IDXLIST = 102, + HEADER_GC_MARK_UPDATE = 103, HEADER_GC_TIME = 106, HEADER_GC_CHANGE_NAME = 107, @@ -1814,6 +1815,13 @@ typedef struct packet_mark_block // 뒤에 64 x 48 x 픽셀크기(4바이트) = 12288만큼 데이터 붙음 } TPacketGCMarkBlock; +typedef struct packet_mark_update +{ + uint8_t header; + uint32_t guildID; + uint16_t imgIdx; +} TPacketGCMarkUpdate; + typedef struct command_symbol_upload { uint8_t header;