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 15fca99..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;