// TMSRV 7.56 / 7.57 @ 0x0042B1D0 — GetDropItem
void GetDropItem(int target, int conn, int posX, int posY, STRUCT_ITEM* item)
{
if (!ItemMasterState)
{
// --------------------------------------------------------------------
// Rota 1: Drop de Moeda de Ouro (Index 454)
// --------------------------------------------------------------------
if (item->Index == 454) // Moeda_de_Ouro_1
{
int gold = 0;
if (item->EF1 == EF_HWORDCOIN)
gold = item->EFV1 * 256;
if (item->EF2 == EF_LWORDCOIN)
gold += item->EFV2;
gold *= 100;
pMob[conn].MOB.Coin += gold;
if (pMob[conn].MOB.Coin > 2000000000)
pMob[conn].MOB.Coin = 2000000000;
SendUpdateCoin(conn);
}
// --------------------------------------------------------------------
// Rota 2: Drop de Item Comum / Fadas de Auto-Loot
// --------------------------------------------------------------------
else
{
int isStackable = FALSE;
int petId = pMob[conn].MOB.Equip[PET].Index;
// Fada Prateada (3914) ou Fada Dourada (3915)
if (petId == 3914 || petId == 3915)
isStackable = SendItemCarry(conn, petId, item);
// Se não agrupou na fada, tenta colocar no inventário normal
if (!isStackable)
isStackable = SendPutItemCarry(conn, FALSE, item);
// Se o item foi recolhido e exige log de segurança
if (isStackable)
{
if (BASE_NeedLog(item, 0))
{
char itemLog[32];
memset(itemLog, 0, sizeof(itemLog));
BASE_GetItemCode(item, itemLog);
char temp[128];
sprintf_s(temp, sizeof(temp), "get %s", itemLog);
Log(temp, pUser[conn].AccountName, pUser[conn].IP);
}
}
}
}
// ------------------------------------------------------------------------
// Rota 3: Drop com Invocador / ItemMasterState Ativo
// ------------------------------------------------------------------------
else if (pMob[target].ItemSummoner > 0 &&
pMob[target].ItemUser > MOB_EMPTY &&
pMob[target].ItemUser < MAX_USER)
{
if (item->Index == 454) // Moeda de Ouro
{
int gold = 0;
if (item->EF1 == EF_HWORDCOIN)
gold = item->EFV1 * 256;
if (item->EF2 == EF_LWORDCOIN)
gold += item->EFV2;
gold *= 100;
pMob[conn].MOB.Coin += gold;
if (pMob[conn].MOB.Coin > 2000000000)
pMob[conn].MOB.Coin = 2000000000;
SendUpdateCoin(conn);
}
else
{
int isStackable = FALSE;
int petId = pMob[conn].MOB.Equip[PET].Index;
if (petId == 3914 || petId == 3915)
isStackable = SendItemCarry(conn, petId, item);
if (!isStackable)
isStackable = SendPutItemCarry(conn, FALSE, item);
if (isStackable)
{
if (BASE_NeedLog(item, 0))
{
char itemLog[128];
memset(itemLog, 0, sizeof(itemLog));
BASE_GetItemCode(item, itemLog);
char temp[128];
sprintf_s(temp, sizeof(temp), "get %s", itemLog);
Log(temp, pUser[conn].AccountName, pUser[conn].IP);
}
}
else
{
// Se não couber no inventário do invocador, cancela vinculação
pMob[target].ItemSummoner = 0;
pMob[target].ItemUser = 0;
}
}
}
}