Ir para conteúdo

[C++] getItemAttributes(itemUID)


Posts Recomendados

[C++] getItemAttributes(itemUID)

testado: TFS - 0.3.6 (possível instalação em qualquer versão, basta fazer as modificações conforme a estrutura de cada versão)

autor: Tony Araújo (OrochiElf)

 

Iae galera, de boas ? Então, hoje na correria do dia parei pra postar aí pra vocês, uma função na qual acredito que pode ajudar bastante, principalmente se vocês trabalham com muitos atributos em um item. 

Bom, a função é basicamente a seguinte, ela retorna uma tabela com todos os atributos que um item possuir, sendo a estrutura: {["attribute"] = value}

 

Sem mais, vamos a instalação:

 

Vá em itemattributes.h, e procure por:

		typedef std::map<std::string, ItemAttribute> AttributeMap;
		AttributeMap* attributes;

Note que ela está dentro do protected, então agora faça o seguinte. 

1. Copie a linha e a apague do protected:

typedef std::map<std::string, ItemAttribute> AttributeMap;

2. Cole acima da classe ItemAttributes, ficando algo como:

typedef std::map<std::string, ItemAttribute> AttributeMap;
class ItemAttributes

Feito isso, procure a função:

boost::any getAttribute(const std::string& key) const;

E abaixo adicione:

AttributeMap* getAttributes() const {return attributes;}

Agora, vá em luascript.h e procure por:

static int32_t luaGetItemAttribute(lua_State* L);

E abaixo adicione: 

static int32_t luaGetItemAttributes(lua_State* L);

Feito, vá em luascript.cpp e procure por:

lua_register(m_luaState, "getItemAttribute", LuaScriptInterface::luaGetItemAttribute);

E abaixo adicione:

	//getItemAttributes(uid) -- Tony Araújo (OrochiElf)
	lua_register(m_luaState, "getItemAttributes", LuaScriptInterface::luaGetItemAttributes);

Agora pra finalizar com a cereja do bolo, procure pela função:

int32_t LuaScriptInterface::luaGetItemAttribute(lua_State* L)

Então, abaixo dessa função, adicione esta função:



int32_t LuaScriptInterface::luaGetItemAttributes(lua_State* L)
{
    //getItemAttributes(uid) -- Tony Araújo (OrochiElf)
    ScriptEnviroment* env = getEnv();
    Item* item = env->getItemByUID(popNumber(L));
    if(!item)
    {
        errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND));
        lua_pushnil(L);
        return 1;
    }
    if(item->getAttributes())
    {
        lua_newtable(L);
        for(AttributeMap::iterator it = item->getAttributes()->begin(); it != item->getAttributes()->end(); ++it)
        {
            lua_pushstring(L, it->first.c_str());

            boost::any value = it->second.get();
            if(value.type() == typeid(std::string))
                lua_pushstring(L, boost::any_cast<std::string>(value).c_str());
            else if(value.type() == typeid(int32_t) || value.type() == typeid(bool))
                lua_pushnumber(L, boost::any_cast<int32_t>(value));
            else if(value.type() == typeid(float))
                lua_pushnumber(L, boost::any_cast<float>(value));

            pushTable(L);
        }
    }
    else
        lua_pushboolean(L, false);
        
    return 1;
}

 

E "isso é tudo pessoal", até a próxima! xD

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...