[C++] getContainerItems(containerUID)
testado: TFS - 0.3.6 (porém acredito que funcione em outros)
autor: Tony Araújo (OrochiElf)
Fala galera, de boas ? Quanto tempo né? xD
Hoje, vim por estas bandas para compartilhar um code que talvez ajude bastante gente, criei ela pois senti necessidade de trabalhar com items que estariam dentro de um certo "container", no caso backpacks, caixas, e qualquer outro tipo de container.
Ela consiste em retornar uma tabela com todos os items que existir dentro daquele container, seja dentro de outros containers e afim.
Sua aplicação é bem básica, no final deixarei um exemplo.
Sem mais, vamos a instalação:
Vá em luascript.h, e procure pela linha:
static int32_t luaGetContainerItem(lua_State* L);
E abaixo você adiciona a linha:
static int32_t luaGetContainerItems(lua_State* L);
Agora vá em luascript.cpp, procure pela linha:
lua_register(m_luaState, "getContainerItem", LuaScriptInterface::luaGetContainerItem);
Logo abaixo, adicione:
//getContainerItems(uid) lua_register(m_luaState, "getContainerItems", LuaScriptInterface::luaGetContainerItems);
Continuando no luascript.cpp, você procura pela função:
int32_t LuaScriptInterface::luaGetContainerItem(lua_State* L)
E abaixo desta função, você adiciona esta:
int32_t LuaScriptInterface::luaGetContainerItems(lua_State* L)
{
//getContainerItems(uid)
Item* item = NULL;
ScriptEnviroment* env = getEnv();
if(Container* container = env->getContainerByUID(popNumber(L)))
{
uint32_t i = 1;
lua_newtable(L);
Item* tmpItem = NULL;
for(ContainerIterator it = container->begin(); it != container->end(); ++it)
{
if(tmpItem = (*it)->getItem())
{
lua_pushnumber(L, i);
pushThing(L, tmpItem, env->addThing(tmpItem));
pushTable(L);
i++;
}
}
}
else
{
errorEx(getError(LUA_ERROR_CONTAINER_NOT_FOUND));
pushThing(L, NULL, 0);
}
return 1;
}
Bom, feito isso, apenas compilar novamente suas sources. Façam bom proveito xD
Aconselho que usem o build all, para evitar qualquer tipo de problema de anexamento do código
Abaixo, um sistema de autoloot, como exemplo de uso da função.
function onUse(cid, item, fromPosition, itemEx, toPosition)
if getItemAttribute(item.uid, "corpseowner") ~= cid then
return doPlayerSendCancel(cid, "You're not the owner.")
end
if #getContainerItems(item.uid) > 0 then
for _, it in ipairs(getContainerItems(item.uid)) do
local playerItem = getPlayerItemById(cid, true, it.itemid)
if playerItem.uid > 0 then
if (playerItem.type + it.type) > 100 then
doPlayerAddItem(cid, it.itemid, (playerItem.type + it.type) - 100)
doTransformItem(playerItem.uid, it.itemid, 100)
else
doTransformItem(playerItem.uid, it.itemid, playerItem.type + it.type)
end
else
doPlayerAddItem(cid, it.itemid, it.type)
end
doRemoveItem(it.uid)
end
return true
end
return false
end