Merge pull request #67 from rtw1x1/main

ML: Item / Mob / NPC client sided
This commit is contained in:
rtw1x1
2026-01-21 01:53:52 +00:00
committed by GitHub
7 changed files with 47 additions and 12 deletions

View File

@@ -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()
{

View File

@@ -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();

View File

@@ -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));

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)

View File

@@ -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<SECTREE_MANAGER>
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);