You can check my function I did for DA.
Code: Select all
void DASpawnItem(D2Game* ptGame, Unit* ptUnit, DWORD itemCode, DWORD ilvl, DWORD quality, DWORD page, BYTE CubeClientMsg, BYTE unidItem, BOOL nBeltInv/* = FALSE*/, BOOL notSellable /* = FALSE*/, BOOL nPlayerName /* = FALSE*/)
{
int dwDummy = 0;
DWORD unitLevel = 0;
Unit* ptItem = NULL;
DWORD maxDurability = 0;
BOOL nInvItem = 0;
int Offsets[2];
DRLGRoom* ptRoom = NULL;
if (ptGame == NULL){ // Check if ptGame == NULL
log_message("DASpawnItem Func: ptGame == %d", ptGame);
return;
}
if (ptUnit == NULL){ // Check if ptUnit == NULL
log_message("DASpawnItem Func: ptUnit == %d", ptUnit);
return;
}
//ItemMod ModData;
D2ItemsTXT* ptItemsTXT = D2GetItemTXTFromCode(itemCode, &dwDummy);
if (ptItemsTXT != NULL)
{
unitLevel = D2GetUnitLevel(ptUnit, 0);
if (ilvl == 0) ilvl = unitLevel;
ptItem = D2CreateItem_Wrapper(ptUnit, D2GetItemIDfromCode(itemCode), ptGame, 4, quality, 0, 1, ilvl, 0, 0, 0);
if (ptItem == NULL){ // Check if ptItem == NULL
log_message("DASpawnItem Func: ptItem == %d", ptItem);
return;
}
quality = D2GetQuality(ptItem);
if ((quality == ITEMQUALITY_SET || quality == ITEMQUALITY_UNIQUE) && unidItem == 1) D2SetFlags(ptItem, ITEMFLAG_UNIDENTIFIED, 0);
if (CubeClientMsg == 1)
{
switch(quality)
{
case ITEMQUALITY_CRACKED: D2ClientMsgTop(D2GetStringFromIndex(53694), D2_Orange);
break;
case ITEMQUALITY_NORMAL: D2ClientMsgTop(D2GetStringFromIndex(53695), D2_Orange);
break;
case ITEMQUALITY_MONSTER: D2ClientMsgTop(D2GetStringFromIndex(53696), D2_Orange);
break;
case ITEMQUALITY_MAGIC: D2ClientMsgTop(D2GetStringFromIndex(53697), D2_Orange);
break;
case ITEMQUALITY_SET: D2ClientMsgTop(D2GetStringFromIndex(53693), D2_Orange);
break;
case ITEMQUALITY_RARE: D2ClientMsgTop(D2GetStringFromIndex(53698), D2_Orange);
break;
case ITEMQUALITY_UNIQUE: D2ClientMsgTop(D2GetStringFromIndex(53692), D2_Orange);
break;
}
}
maxDurability = D2GetMaxDurability(ptItem);
if (maxDurability > 0) D2SetUnitStat(ptItem, STATS_DURABILITY, maxDurability, 0);
if (notSellable == TRUE){
D2SetFlags(ptItem,ITEMFLAG_NONSELLABLE,1); // 4096 set non sellable flag
D2SetFlags(ptItem,ITEMFLAG_FROMPLAYER,1); // 16777216
}
int i = 0;
// add player name
if (nPlayerName == TRUE)
{
D2SetPlayerIDonItem(ptItem,ptUnit->nUnitUnid);
D2PlayerData* playerdata = D2GetPlayerData(ptUnit);
if (playerdata)
{
for (i=0; i<=15; i++)
ptItem->pItemData->IName[i] = playerdata->CharName[i];
}
}
BOOL beltable = D2Beltable(ptItem);
BOOL check = FALSE;
WORD OffsetY = 0;
WORD OffsetX = 0;
if (nBeltInv == TRUE && beltable != FALSE)
{
check = D2GameAddItemtoBelt(ptUnit->ptGame, ptUnit, ptItem->nUnitUnid, ptUnit->hPath->targetx, 1, &dwDummy);
if (check == FALSE){
D2SetPage(ptItem, PAGE_INVENTORY);
OffsetY = D2GetOffsetYFromUnit(ptItem);
OffsetX = D2GetOffsetXFromUnit(ptItem);
nInvItem = D2PlaceItem(__FILE__, __LINE__, ptUnit->ptGame, ptUnit, ptItem->nUnitUnid, OffsetX, OffsetY, 1, 1, 0);
if (nInvItem == 0)
{
D2GetMapOffsetsFromUnit(ptUnit, Offsets);
ptRoom = D2GetRoomFromUnit(ptUnit);
D2ServerDropUnitOnGround(ptGame, 0, ptItem, ptRoom, Offsets[0], Offsets[1]);
}
}
}else{
D2SetPage(ptItem, page);
nInvItem = D2PlaceItem(__FILE__, __LINE__, ptGame, ptUnit, ptItem->nUnitUnid, 0, 0, 1, 1, 0);
if (nInvItem == 0)
{
D2GetMapOffsetsFromUnit(ptUnit, Offsets);
ptRoom = D2GetRoomFromUnit(ptUnit);
D2ServerDropUnitOnGround(ptGame, 0, ptItem, ptRoom, Offsets[0], Offsets[1]);
}
}
}
}
the most important part of code is here:
Code: Select all
nInvItem = D2PlaceItem(__FILE__, __LINE__, ptGame, ptUnit, ptItem->nUnitUnid, 0, 0, 1, 1, 0);
if (nInvItem == 0)
{
D2GetMapOffsetsFromUnit(ptUnit, Offsets);
ptRoom = D2GetRoomFromUnit(ptUnit);
D2ServerDropUnitOnGround(ptGame, 0, ptItem, ptRoom, Offsets[0], Offsets[1]);
}
If it fails to place the item it will drop it on ground instead.