brunomaidana 11 #1 Posted February 11, 2021 Olá, venho compartilhar um sistema de GUILD LEVEL, para dar aquele upgrade no seu servidor. Lembrando que o sistema não é de minha autoria, porem editei e converti pra atual versão RevScript. Baseado e compatível com o OTSERVER OTBR. Para começar vamos executar um comando MySQL na sua database. Spoiler ALTER TABLE `guilds` ADD COLUMN `level` int(11) DEFAULT 1, ADD COLUMN `points` int(11) DEFAULT 0; Agora, vá até a pasta data/lib e jogue esse o script dentro. guildLevel.lua Após fazer isso, abra o arquivo lib.lua e adicione na ultima linha. Spoiler dofile('data/lib/guildLevel.lua') Pronto, agora vamos até a pasta data/scripts/custom. Essa pasta vamos usar para adicionar o restante dos arquivos, e caso você tenha que restaurar seu repositório, ficara mais fácil transferir os arquivo. Adicione esse arquivo dentro. guild_Level.lua Agora vá até a pasta data/scripts/creaturescripts/others e abra o arquivo login.lua, procure pela linha function playerLogin.onLogin(player) e logo abaixo adicione. Spoiler local guild = player:getGuild() if guild then if player:getLevel() >= CONFIG_GUILD_LEVEL.minLevelToGetPoints then player:registerEvent('GuildLevelK') end player:registerEvent('guildLevel_e') end Vá até a pasta data/events/scripts e abra o arquivo player.lua, procure pela linha function Player:onGainExperience(source, exp, rawExp), vá até o final dessa function e ANTES do return exp adicione: Spoiler --Guild Level System if self:getGuild() then local rewards = {} local number = false rewards = getReward(self:getId()) or {} for i = 1, #rewards do if rewards[i].type == GUILD_LEVEL_BONUS_EXP then number = rewards[i].quantity end end if number then exp = exp +(exp*number) end end Vá até a pasta data/events/scripts e abra o arquivo monster.lua, dentro da function Monster:onDropLoot(corpse). Procure por local item = corpse:createLootItem(monsterLoot, boolCharm) e ANTES adicione: Spoiler guildPercentLoot = 0 local guild = player:getGuild() if guild then local rewards = {} local number = false rewards = getReward(player:getId()) for i = 1, #rewards do if rewards[i].type == GUILD_LEVEL_BONUS_LOOT then number = rewards[i].quantity end end if number then guildPercentLoot = guildPercentLoot + number end end monsterLoot[i].chance = monsterLoot[i].chance + (monsterLoot[i].chance * guildPercentLoot) Pronto, agora vamos as source, um pouco mais complicado. Abra o arquivo luascript.cpp Procure por Spoiler registerMethod("Guild", "setBankBalance", LuaScriptInterface::luaGuildSetBankBalance); e NA LINHA ABAIXO adicione: Spoiler registerMethod("Guild", "getPoints", LuaScriptInterface::luaGuildGetPoints); registerMethod("Guild", "setPoints", LuaScriptInterface::luaGuildSetPoints); registerMethod("Guild", "getLevel", LuaScriptInterface::luaGuildGetLevel); registerMethod("Guild", "setLevel", LuaScriptInterface::luaGuildSetLevel); Procure por Spoiler int LuaScriptInterface::luaGuildGetBankBalance(lua_State* L) { // guild:getBankBalance() Guild* guild = getUserdata<Guild>(L, 1); if (guild) { lua_pushnumber(L, guild->getBankBalance()); } else { lua_pushnil(L); } return 1; } e NA LINHA ABAIXO adicione: Spoiler int LuaScriptInterface::luaGuildGetLevel(lua_State* L) { // guild:getLevel() Guild* guild = getUserdata<Guild>(L, 1); if (guild) { lua_pushnumber(L, guild->getLevel()); } else { lua_pushnil(L); } return 1; } int LuaScriptInterface::luaGuildGetPoints(lua_State* L) { // guild:getPoints() Guild* guild = getUserdata<Guild>(L, 1); if (guild) { lua_pushnumber(L, guild->getPoints()); } else { lua_pushnil(L); } return 1; } int LuaScriptInterface::luaGuildSetLevel(lua_State* L) { // guild:setLevel(newlevel) Guild* guild = getUserdata<Guild>(L, 1); uint32_t newlevel = getNumber<uint32_t>(L, 2); if (guild) { guild->setLevel(newlevel); pushBoolean(L, true); } else { lua_pushnil(L); } return 1; } int LuaScriptInterface::luaGuildSetPoints(lua_State* L) { // guild:setPoints(newpoints) Guild* guild = getUserdata<Guild>(L, 1); uint32_t newpoints = getNumber<uint32_t>(L, 2); if (guild) { guild->setPoints(newpoints); pushBoolean(L, true); } else { lua_pushnil(L); } return 1; } Abra o arquivo luascript.h Procure por Spoiler static int luaGuildGetMembersOnline(lua_State* L); e NA LINHA ABAIXO adicione: Spoiler static int luaGuildGetLevel(lua_State* L); static int luaGuildGetPoints(lua_State* L); static int luaGuildSetLevel(lua_State* L); static int luaGuildSetPoints(lua_State* L); Abra o arquivo guild.cpp Procure por Spoiler void Guild::addRank(uint32_t rankId, const std::string& rankName, uint8_t level) { ranks.emplace_back(std::make_shared<GuildRank>(rankId,rankName,level)); } e NA LINHA ABAIXO adicione: Spoiler void Guild::setPoints(uint32_t _points) { points = _points; IOGuild::setPoints(id, points); } void Guild::setLevel(uint32_t _level) { level = _level; IOGuild::setLevel(id, level); } Abra o arquivo guild.h Procure por Spoiler uint32_t getMemberCount() const { return memberCount; } e NA LINHA ABAIXO adicione: Spoiler uint32_t getLevel() const { return level; } uint32_t getPoints() const { return points; } void setPoints(uint32_t _points); void setLevel(uint32_t _level); Procure por Spoiler std::list<Player*> membersOnline; std::vector<GuildRank_ptr> ranks; std::string name; e NA LINHA ABAIXO adicione: Spoiler uint32_t points = 0; uint32_t level = 1; Abra o arquivo ioguild.cpp Procure por Spoiler Guild* IOGuild::loadGuild(uint32_t guildId) { Database& db = Database::getInstance(); std::ostringstream query; query << "SELECT `name`, `balance` FROM `guilds` WHERE `id` = " << guildId; if (DBResult_ptr result = db.storeQuery(query.str())) { Guild* guild = new Guild(guildId, result->getString("name")); guild->setBankBalance(result->getNumber<uint64_t>("balance")); query.str(std::string()); query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `guild_id` = " << guildId; if ((result = db.storeQuery(query.str()))) { do { guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level")); } while (result->next()); } return guild; } return nullptr; } Substitua tudo por Spoiler Guild* IOGuild::loadGuild(uint32_t guildId) { Database& db = Database::getInstance(); std::ostringstream query; query << "SELECT `name`, `balance`, `level`, `points` FROM `guilds` WHERE `id` = " << guildId; if (DBResult_ptr result = db.storeQuery(query.str())) { Guild* guild = new Guild(guildId, result->getString("name")); guild->setBankBalance(result->getNumber<uint64_t>("balance")); guild->setLevel(result->getNumber<uint32_t>("level")); guild->setPoints(result->getNumber<uint32_t>("points")); query.str(std::string()); query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `guild_id` = " << guildId; if ((result = db.storeQuery(query.str()))) { do { guild->addRank(result->getNumber<uint32_t>("id"), result->getString("name"), result->getNumber<uint16_t>("level")); } while (result->next()); } return guild; } return nullptr; } No final do arquivo adicione: Spoiler void IOGuild::setLevel(uint32_t guildId, uint32_t newlevel) { Database& db = Database::getInstance(); std::ostringstream query; query << "UPDATE `guilds` SET `level` = " << newlevel << " WHERE `id` = " << guildId; db.executeQuery(query.str()); } void IOGuild::setPoints(uint32_t guildId, uint32_t newPoints) { Database& db = Database::getInstance(); std::ostringstream query; query << "UPDATE `guilds` SET `points` = " << newPoints << " WHERE `id` = " << guildId; db.executeQuery(query.str()); } Abra o arquivo ioguild.h Procure por Spoiler static void getWarList(uint32_t guildId, GuildWarVector& guildWarVector); e NA LINHA ABAIXO adicione: Spoiler static void setPoints(uint32_t guildId, uint32_t newPoints); static void setLevel(uint32_t guildId, uint32_t newlevel); Após terminar de adicionar os codigos, compile as source e desfrute do sistema. Explicação: Sistema de guild vai até level 10 (você pode adicionar mais). Cada level conta com uma % de bônus diferente, lembrando que é acumulativo o bônus e você pode editar da maneira que preferir. Você pode editar a quantia de exp que a guild ira ganhar para cada criatura morta, quanto de exp necessita para upar o level da guild, e o level necessário que o player precisa para contabilizar o kill. Adicionei um comando (!guild) onde é possível ver o level da guild, exp adquirida e exp necessária pro próximo level. A guild ao passar de level, uma mensagem é mandada pra todos os players. Algumas prints do sistema Spoiler Creditos: brunomaidana (conversão), eduardo dantas (base) 2 Majesty and VictorWEBMaster reacted to this Share this post Link to post
Majesty 1,755 #2 Posted February 11, 2021 Muito obrigado pela sua contribuição, seu conteúdo foi aprovado!Nós do OTServ Brasil agradecemos, seu conteúdo com certeza ajudará a muitos outros. Você recebeu +1 REP! Share this post Link to post