int32_t LuaInterface::luaDoCreateItem(lua_State* L)
{
//doCreateItem(itemid[, type/count = 1], pos)
//Returns uid of the created item, only works on tiles.
PositionEx pos;
popPosition(L, pos);
uint32_t count = 1;
if(lua_gettop(L) > 1)
count = popNumber(L);
uint32_t itemId = popNumber(L);
ScriptEnviroment* env = getEnv();
const ItemType& it = Item::items[itemId];
Tile* tile = g_game.getTile(pos);
if(!tile)
{
if(it.group == ITEM_GROUP_GROUND)
{
Item* item = Item::CreateItem(itemId);
tile = IOMap::createTile(item, NULL, pos.x, pos.y, pos.z);
g_game.setTile(tile);
tile->onUpdateTile();
lua_pushnumber(L, env->addThing(item));
return 1;
}
else
{
errorEx(getError(LUA_ERROR_TILE_NOT_FOUND));
lua_pushboolean(L, false);
return 1;
}
}
int32_t itemCount = 1, subType = 1;
if(it.hasSubType())
{
if(it.stackable)
itemCount = (int32_t)std::ceil((float)count / 100);
subType = count;
}
else
itemCount = std::max((uint32_t)1, count);
while(itemCount > 0)
{
int32_t stackCount = std::min(100, subType);
Item* newItem = Item::CreateItem(itemId, stackCount);
if(!newItem)
{
errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND));
lua_pushboolean(L, false);
return 1;
}
if(it.stackable)
subType -= stackCount;
ReturnValue ret = g_game.internalAddItem(NULL, tile, newItem, INDEX_WHEREEVER, FLAG_NOLIMIT);
if(ret != RET_NOERROR)
{
delete newItem;
lua_pushboolean(L, false);
return 1;
}
--itemCount;
if(itemCount)
continue;
if(newItem->getParent())
lua_pushnumber(L, env->addThing(newItem));
else //stackable item stacked with existing object, newItem will be released
lua_pushnil(L);
return 1;
}
lua_pushnil(L);
return 1;
}