Jump to content
×
×
  • Create New...

[C++] getItemAttributes(itemUID)


Recommended Posts

[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 to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now