diff --git a/src/game/char.cpp b/src/game/char.cpp index 7006774..18e0547 100644 --- a/src/game/char.cpp +++ b/src/game/char.cpp @@ -4056,6 +4056,26 @@ void CHARACTER::ChatPacket(BYTE type, const char * format, ...) sys_log(0, "SEND_COMMAND %s %s", GetName(), chatbuf); } +void CHARACTER::ItemGetPacket(DWORD dwItemVnum, BYTE bCount, const char* szName, bool bIsDelivery) +{ + LPDESC d = GetDesc(); + + if (!d) + return; + + TPacketGCItemGet pack; + pack.header = HEADER_GC_ITEM_GET; + pack.dwItemVnum = dwItemVnum; + pack.bCount = bCount; + // bArg: 0 = normal, 1 = from party member, 2 = delivered to party member + pack.bArg = szName ? (bIsDelivery ? 2 : 1) : 0; + memset(pack.szFromName, 0, sizeof(pack.szFromName)); + if (szName) + strlcpy(pack.szFromName, szName, sizeof(pack.szFromName)); + + d->Packet(&pack, sizeof(pack)); +} + // MINING void CHARACTER::mining_take() { diff --git a/src/game/char.h b/src/game/char.h index 2f7088b..98e15f7 100644 --- a/src/game/char.h +++ b/src/game/char.h @@ -739,6 +739,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider void Motion(BYTE motion, LPCHARACTER victim = NULL); void ChatPacket(BYTE type, const char *format, ...); + void ItemGetPacket(DWORD dwItemVnum, BYTE bCount, const char* szName = NULL, bool bIsDelivery = false); void MonsterChat(BYTE bMonsterChatType); void SendGreetMessage(); diff --git a/src/game/char_item.cpp b/src/game/char_item.cpp index 09a0c2d..42199dc 100644 --- a/src/game/char_item.cpp +++ b/src/game/char_item.cpp @@ -5894,7 +5894,7 @@ bool CHARACTER::PickupItem(DWORD dwVID) if (bCount == 0) { - ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템 획득: %s"), item2->GetName()); + ItemGetPacket(item2->GetVnum(), item2->GetCount()); M2_DESTROY_ITEM(item); if (item2->GetType() == ITEM_QUEST) quest::CQuestManager::instance().PickupItem (GetPlayerID(), item2); @@ -5936,7 +5936,7 @@ bool CHARACTER::PickupItem(DWORD dwVID) char szHint[32+1]; snprintf(szHint, sizeof(szHint), "%s %u %u", item->GetName(), item->GetCount(), item->GetOriginalVnum()); LogManager::instance().ItemLog(this, item, "GET", szHint); - ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템 획득: %s"), item->GetName()); + ItemGetPacket(item->GetVnum(), item->GetCount()); if (item->GetType() == ITEM_QUEST) quest::CQuestManager::instance().PickupItem (GetPlayerID(), item); @@ -5995,11 +5995,11 @@ bool CHARACTER::PickupItem(DWORD dwVID) LogManager::instance().ItemLog(owner, item, "GET", szHint); if (owner == this) - ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템 획득: %s"), item->GetName()); + ItemGetPacket(item->GetVnum(), item->GetCount()); else { - owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템 획득: %s 님으로부터 %s"), GetName(), item->GetName()); - ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템 전달: %s 님에게 %s"), owner->GetName(), item->GetName()); + owner->ItemGetPacket(item->GetVnum(), item->GetCount(), GetName()); + ItemGetPacket(item->GetVnum(), item->GetCount(), owner->GetName(), true); } if (item->GetType() == ITEM_QUEST) @@ -6621,7 +6621,7 @@ LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, BYTE bCount, int iRarePct, bool if (bCount == 0) { if (bMsg) - ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템 획득: %s"), item->GetName()); + ItemGetPacket(item->GetVnum(), item->GetCount()); return item; } @@ -6673,7 +6673,7 @@ LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, BYTE bCount, int iRarePct, bool if (iEmptyCell != -1) { if (bMsg) - ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템 획득: %s"), item->GetName()); + ItemGetPacket(item->GetVnum(), item->GetCount()); if (item->IsDragonSoul()) item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell)); diff --git a/src/game/packet.h b/src/game/packet.h index 6b8b766..989d5c3 100644 --- a/src/game/packet.h +++ b/src/game/packet.h @@ -279,6 +279,7 @@ enum HEADER_GC_DRAGON_SOUL_REFINE = 209, HEADER_GC_RESPOND_CHANNELSTATUS = 210, + HEADER_GC_ITEM_GET = 211, ///////////////////////////////////////////////////////////////////////////// @@ -1114,6 +1115,15 @@ typedef struct packet_item_set TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM]; } TPacketGCItemSet; +typedef struct packet_item_get +{ + uint8_t header; + uint32_t dwItemVnum; + uint8_t bCount; + uint8_t bArg; // 0: normal, 1: from party member (need extra handling) + char szFromName[CHARACTER_NAME_MAX_LEN + 1]; // party member name when bArg == 1 +} TPacketGCItemGet; + struct packet_item_use { uint8_t header; @@ -1954,6 +1964,7 @@ typedef struct SPacketGCRefineInformaion struct TNPCPosition { uint8_t bType; + uint32_t dwVnum; char name[CHARACTER_NAME_MAX_LEN+1]; int32_t x; int32_t y; diff --git a/src/game/regen.cpp b/src/game/regen.cpp index 4106907..f3a05a6 100644 --- a/src/game/regen.cpp +++ b/src/game/regen.cpp @@ -676,6 +676,7 @@ bool regen_load(const char* filename, long lMapIndex, int base_x, int base_y) { SECTREE_MANAGER::instance().InsertNPCPosition(lMapIndex, p->m_table.bType, + p->m_table.dwVnum, p->m_table.szLocaleName, (regen->sx+regen->ex) / 2 - base_x, (regen->sy+regen->ey) / 2 - base_y); diff --git a/src/game/sectree_manager.cpp b/src/game/sectree_manager.cpp index 7cbe3f1..861b83b 100644 --- a/src/game/sectree_manager.cpp +++ b/src/game/sectree_manager.cpp @@ -1145,6 +1145,7 @@ void SECTREE_MANAGER::SendNPCPosition(LPCHARACTER ch) for (auto it = m_mapNPCPosition[lMapIndex].begin(); it != m_mapNPCPosition[lMapIndex].end(); ++it) { np.bType = it->bType; + np.dwVnum = it->dwVnum; strlcpy(np.name, it->name, sizeof(np.name)); np.x = it->x; np.y = it->y; @@ -1162,9 +1163,9 @@ void SECTREE_MANAGER::SendNPCPosition(LPCHARACTER ch) d->Packet(&p, sizeof(TPacketGCNPCPosition)); } -void SECTREE_MANAGER::InsertNPCPosition(long lMapIndex, BYTE bType, const char* szName, long x, long y) +void SECTREE_MANAGER::InsertNPCPosition(long lMapIndex, BYTE bType, DWORD dwVnum, const char* szName, long x, long y) { - m_mapNPCPosition[lMapIndex].push_back(npc_info(bType, szName, x, y)); + m_mapNPCPosition[lMapIndex].push_back(npc_info(bType, dwVnum, szName, x, y)); } BYTE SECTREE_MANAGER::GetEmpireFromMapIndex(long lMapIndex) diff --git a/src/game/sectree_manager.h b/src/game/sectree_manager.h index 119cd24..b604b44 100644 --- a/src/game/sectree_manager.h +++ b/src/game/sectree_manager.h @@ -27,10 +27,11 @@ struct TAreaInfo struct npc_info { BYTE bType; + DWORD dwVnum; const char* name; long x, y; - npc_info(BYTE bType, const char* name, long x, long y) - : bType(bType), name(name), x(x), y(y) + npc_info(BYTE bType, DWORD dwVnum, const char* name, long x, long y) + : bType(bType), dwVnum(dwVnum), name(name), x(x), y(y) {} }; @@ -155,7 +156,7 @@ class SECTREE_MANAGER : public singleton TAreaMap& GetDungeonArea(long lMapIndex); void SendNPCPosition(LPCHARACTER ch); - void InsertNPCPosition(long lMapIndex, BYTE bType, const char* szName, long x, long y); + void InsertNPCPosition(long lMapIndex, BYTE bType, DWORD dwVnum, const char* szName, long x, long y); BYTE GetEmpireFromMapIndex(long lMapIndex);