[C++] getContainerItems(containerUID)

Tony Araujo

OrochiElf
avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 27/02/13Posts: 446Gênero: Masculino

[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

 

 

 

Tony Araújo :happy:

layontopers

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 17/03/20Posts: 7
6 minutos atrás, Tony Araujo disse:

[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:

 

  Ocultar conteúdo

 

 


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.

 

  Mostrar conteúdo oculto

 

 


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

 

 

 

god

 

Riakisuk1

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 15/01/20Posts: 1
11 minutos atrás, Tony Araujo disse:

[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:

 

  Mostrar conteúdo oculto

 

 


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.

 

  Mostrar conteúdo oculto

 

 


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

 

 

 

Já deixei o rep :)

andrefelphes

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 21/06/15Posts: 74

Brabo, ajudou demais !

Ayron5

avatar
Barão
Barão

INFOS

Grupo: BarãoRegistrado: 26/08/15Posts: 239
53 minutos atrás, Tony Araujo disse:

[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:

 

  Mostrar conteúdo oculto

 

 


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.

 

  Ocultar conteúdo

 

 


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

 

 

 

Nice! rep.

                                                                  

                                                                    Meus tópicos         

                                                                   Se ajudei você deixe seu Rep! para fortalecer a amizade ^^

                                                                                        Vamos ajudar o fórum a crescer mais.

                                                                

                                                                                             ----- NPC que vende informação -----

                                                                                          -----Baú Que dá Outfit se tiver Level -----

                                                                    

Tony Araujo

OrochiElf
avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 27/02/13Posts: 446Gênero: Masculino

Valeu galera xD

Caso tenham alguma outra função que sintam necessidade e tenham dificuldades, pode mandar as sugestões aí, estarei sempre olhando e trazendo novas funções

Tamujunto!

Tony Araújo :happy: