Irei ensiná-los, como adicionar um sistemas de resets no seu servidor. O sistema funciona da seguinte forma: É adicionada uma nova coluna no seu banco de dados, na tabela player, denominada resets. Nessa tabela irão conter os resets do jogador. No jogo, ao dar
look em um jogador, os resets são mostrados.
Também, irei disponibilizar novas funções LUA que possibilitarão o uso dos
resets por scripts.
- Alterando seu banco de dados
Primeiramente, usarei o SQLite para demonstrar como alterar a tabela de players, onde o mesmo código, também pode ser usado no phpMyAdmin para os usuários de MySQL.
Abra seu SQLite e após selecionar seu banco de dados, abra o editor de SQL Query. Para quem não sabe abrir, basta seguir a imagem:
Digite o seguinte código no seu SQL Query editor:
Código PHP:
ALTER TABLE players ADD resets INTEGER not null default 0
Execute este código,
apertando F9.
Pode ser que ao executar o código, demore um pouco, aguarde.
Pra quem tem as sources e deseja alterar, aqui vai o tutorial. Bom, em primeiro lugar, o tutorial foi feito com a versão 0.3.6 do The Forgotten Server, que seu download pode ser encontrado aqui no fórum, junto das sources.
Na suas sources, vá ao arquivo player.h e procure (ctrl+f) por:
Código PHP:
uint32_t level;
Após o texto encontrado, adicione o seguinte:
Código PHP:
uint32_t resets;
Vá até o arquivo iologindata.cpp e procure por:
Código PHP:
query << "SELECT `id`, `account_id`, `group_id`, `world_id`, `sex`, `vocation`, `experience`, `level`, `maglevel`, ";
query << "`health`, `healthmax`, `blessings`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, ";
query << "`lookhead`, `looklegs`, `looktype`, `lookaddons`, `posx`, `posy`, `posz`, `cap`, `lastlogin`, ";
query << "`lastlogout`, `lastip`, `conditions`, `skull`, `skulltime`, `guildnick`, `rank_id`, `town_id`, ";
query << "`balance`, `stamina`, `direction`, `loss_experience`, `loss_mana`, `loss_skills`, `loss_containers`, ";
query << "`loss_items`, `marriage`, `promotion`, `description` FROM `players` WHERE `name` ";
query << db->getStringComparison() << db->escapeString(name) << " AND `world_id` = ";
query << g_config.getNumber(ConfigManager::WORLD_ID) << " AND `deleted` = 0 LIMIT 1";
Altere todo este código para:
Código PHP:
query << "SELECT `id`, `account_id`, `group_id`, `world_id`, `sex`, `vocation`, `experience`, `level`, `resets`, `maglevel`, ";
query << "`health`, `healthmax`, `blessings`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, ";
query << "`lookhead`, `looklegs`, `looktype`, `lookaddons`, `posx`, `posy`, `posz`, `cap`, `lastlogin`, ";
query << "`lastlogout`, `lastip`, `conditions`, `skull`, `skulltime`, `guildnick`, `rank_id`, `town_id`, ";
query << "`balance`, `stamina`, `direction`, `loss_experience`, `loss_mana`, `loss_skills`, `loss_containers`, ";
query << "`loss_items`, `marriage`, `promotion`, `description` FROM `players` WHERE `name` ";
query << db->getStringComparison() << db->escapeString(name) << " AND `world_id` = ";
query << g_config.getNumber(ConfigManager::WORLD_ID) << " AND `deleted` = 0 LIMIT 1";
Ainda em iologindata.cpp, procure por:
Código PHP:
player->level = std::max((uint32_t)1, (uint32_t)result->getDataInt("level"));
Após o código encontrado, adicione o seguinte código:
Código PHP:
player->resets = (uint32_t)result->getDataInt("resets");
Ainda em iologindata.cpp, procure por:
Código PHP:
query << "`maglevel` = " << player->magLevel << ", ";
Após o código acima, adicione:
Código PHP:
query << "`resets` = " << player->resets << ", ";
Vá até o arquivo player.cpp e procure pelo seguinte código:
Código PHP:
s << " (Level " << level << ")";
Altere para:
Código PHP:
s << " (Level " << level << " [Resets: " << resets << "])";
Vamos adicionar os comandos LUA que poderão trabalhar com nosso sistema de resets:
- getResets(cid)
Vá até player.h e procure por:
Código PHP:
void setPromotionLevel(uint32_t pLevel);
Após isso, adicione:
Código PHP:
uint32_t getResets() { return resets }
Agora vá em luascript.cpp e procure por:
Código PHP:
int32_t LuaScriptInterface::luaDoPlayerSetIdleTime(lua_State* L)
{
//doPlayerSetIdleTime(cid, amount)
int64_t amount = popNumber(L);
ScriptEnviroment* env = getEnv();
if(Player* player = env->getPlayerByUID(popNumber(L)))
{
player->setIdleTime(amount);
lua_pushboolean(L, true);
}
else
{
errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
lua_pushboolean(L, false);
}
return 1;
}
Após o código, adicione:
Código PHP:
int32_t LuaScriptInterface::luaGetResets(lua_State* L)
{
//getResets(cid)
ScriptEnviroment* env = getEnv();
if(Player* player = env->getPlayerByUID(popNumber(L)))
lua_pushnumber(L, player->getResets());
else
{
errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
lua_pushboolean(L, false);
}
return 1;
}
Ainda em luascript.cpp procure por:
Código PHP:
//doPlayerSetIdleTime(cid, amount)
lua_register(m_luaState, "doPlayerSetIdleTime", LuaScriptInterface::luaDoPlayerSetIdleTime);
Após o código, adicione:
Código PHP:
//getResets(cid)
lua_register(m_luaState, "getResets", LuaScriptInterface::luaGetResets);
Agora em luascript.h procure por:
Código PHP:
static int32_t luaDoPlayerSetIdleTime(lua_State* L);
Após isso, adicione:
Código PHP:
static int32_t luaGetResets(lua_State* L);
- setResets(cid, amount)
Vá em luascript.h e procure por:
Código PHP:
static int32_t luaGetResets(lua_State* L);
Após isso, adicione:
Código PHP:
static int32_t luaSetResets(lua_State* L);
Agora vá até luascript.cpp e procure por:
Código PHP:
int32_t LuaScriptInterface::luaGetResets(lua_State* L)
{
//getResets(cid)
ScriptEnviroment* env = getEnv();
if(Player* player = env->getPlayerByUID(popNumber(L)))
lua_pushnumber(L, player->getResets());
else
{
errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
lua_pushboolean(L, false);
}
return 1;
}
Após isso, adicione:
Código PHP:
int32_t LuaScriptInterface::luaSetResets(lua_State* L)
{
//setResets(cid, amount)
int32_t amount = popNumber(L);
ScriptEnviroment* env = getEnv();
if(Player* player = env->getPlayerByUID(popNumber(L)))
{
player->setResets(amount);
lua_pushboolean(L, true);
}
else
{
errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
lua_pushboolean(L, false);
}
return 1;
}
Ainda em luascript.cpp, procure por:
Código PHP:
//getResets(cid)
lua_register(m_luaState, "getResets", LuaScriptInterface::luaGetResets);
Após isso, adicione:
Código PHP:
//setResets(cid, amount)
lua_register(m_luaState, "setResets", LuaScriptInterface::luaSetResets);
Agora vá até player.h e procure por:
Código PHP:
uint32_t getResets() { return resets; }
Após isso, adicione:
Código PHP:
void setResets(int32_t amount) { resets += amount; if (resets < 0) {resets = 0;} }
Pronto, agora é só usar os comandos no seu script:
getResets(cid) - Retorna o número de resets
setResets(cid, amount) - Aumenta ou diminui os resets conforme a quantidade.
Para quem quiser, segue em anexo o servidor já compilado, versão 0.3.6 do The Forgotten Server.
Segue em anexo o servidor já compilado: