Histórico de Curtidas
-
Serpente recebeu reputação de Nerivalhs em [8.10] Evolutions 0.7.8 XML com sourcesVenho por meio deste post compartilhar um projeto que estou trabalhando a algum tempo.
Sendo amante da versão 8.10, sabemos que essa versão tem uma carência enorme pelas sources, especialmente os servidores mais antigos que usam banco em XML (Acc manager 111111/tibia).
Fiz uma tentativa no passado de criar uma versão 8.10 a partir da distribuição 8.00 do OTX2
Apesar do projeto ser bem sucedido, essa distribuição ainda contém diversos elementos das versões 8.50 e 8.60 (comportamento dos monstros, limitação de velocidade, não suporta XML) que não foi possivel converter para ficar semelhante aos servidores antigos.
Portanto dessa vez a estratégia foi converter uma distribuição evolutions 0.7.8 para a versão 8.10. Essa é a distribuição que os servidores antigos usavam originalmente, a ideia é fornecer o máximo de compatibilidade possivel com esses servidores.
[Features]
Adicionados diversos métodos LUA para aumentar o escopo de scripts compativeis Adicionados elementos do 8.10 (distribuições 8.10 antigas não possuiam) items.otb atualizado para a versão 8.10 (distribuições 8.10 antigas utilizam o items.otb do 8.00) XML com account manager 111111/tibia, suporte a SQLite e MySQL Arena PVP Compilavel utilizando Stian's Dev C++ Sistema VIP Proteção para evitar que players buguem ao atingir o level máximo suportado (820k) Raid system funcional Acompanha Mapa Yurots 1.2
DATAPACK (incluindo DLLS)
Binário, Restater e RemoteControl
SOURCE
COMO COMPILAR?
OBSERVAÇÕES
-
Serpente recebeu reputação de Vodkart em [8.6] Task System 4.0! (Task system + Daily Task System)Mesmo pedido, será que seria possivel além de dar rewards, algumas tasks derem storage quando completadas, para que seja possivel fazer um sistema de teleport de boss?
-
Serpente deu reputação a Tricoder em Player nao perde nada quando morre.creaturescripts/droploot.lua
function onDeath(player, corpse, killer, mostDamage, unjustified, mostDamage_unjustified) if getPlayerFlagValue(player, PlayerFlag_NotGenerateLoot) or player:getVocation():getId() == VOCATION_NONE then return true end local amulet = player:getSlotItem(CONST_SLOT_NECKLACE) if amulet and amulet.itemid == ITEM_AMULETOFLOSS and not isInArray({SKULL_RED, SKULL_BLACK}, player:getSkull()) then local isPlayer = false if killer:isPlayer() then isPlayer = true else local master = killer:getMaster() if master and master:isPlayer() then isPlayer = true end end if not isPlayer or not player:hasBlessing(6) then player:removeItem(ITEM_AMULETOFLOSS, 1, -1, false) end else for i = CONST_SLOT_HEAD, CONST_SLOT_AMMO do local item = player:getSlotItem(i) if item then if isInArray({SKULL_RED, SKULL_BLACK}, player:getSkull()) or math.random(item:isContainer() and 100 or 1000) <= player:getLossPercent() then if not item:moveTo(corpse) then item:remove() end end end end end if not player:getSlotItem(CONST_SLOT_BACKPACK) then player:addItem(ITEM_BAG, 1, false, CONST_SLOT_BACKPACK) end return true endcreaturescripts.xml <event type="death" name="DropLoot" script="droploot.lua"/>loginplayer:registerEvent("DropLoot") -
Serpente deu reputação a Pedriinz em Auto Loot Sytem for TFS 1.3 + revscriptsDepois de milhões de anos sem programar porcaria nenhuma... Eu desenvolvi este sistema como um método de estudo. (C++)
Este sistema foi inspirado no Auto Loot System por @psychonaut. (OTland)
Criei o mesmo na versão mais recente do tfs.
Auto Loot System for TFS 1.3
Como funciona?
Simples, quando você mata um monstro e abre o corpo (você precisa clicar no corpo), os itens vão para o seu personagem.
Instalando
em actions.cpp, encontre:
if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) { return RETURNVALUE_YOUARENOTTHEOWNER; } e mude isso para:
if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) { return RETURNVALUE_YOUARENOTTHEOWNER; } else { if (player->canOpenCorpse(corpseOwner) && player->autoLootList.size() != 0) { if (player->getCapacity() > 100 * 100) { //Minimum of Capacity for autoloot works. (100 CAP) for (Item* item : container->getItemList()) { if (player->getItemFromAutoLoot(item->getID())) { std::ostringstream msgAutoLoot; msgAutoLoot << "You looted a " << item->getItemCount() << "x " << item->getName() << "."; g_game.internalMoveItem(container, player, CONST_SLOT_WHEREEVER, item, item->getItemCount(), nullptr); player->sendTextMessage(MESSAGE_INFO_DESCR, msgAutoLoot.str()); } } } else { player->sendTextMessage(MESSAGE_INFO_DESCR, "Sorry, you don't have enough capacity to use auto loot, so it has been disabled. (100+ capacity is required)"); } } } em player.h, abaixo de:
std::unordered_set<uint32_t> VIPList; adicione isso:
std::set<uint32_t> autoLootList; ainda em player.h encontre:
bool hasLearnedInstantSpell(const std::string& spellName) const; adicione em baixo:
void addItemToAutoLoot(uint16_t itemId); void removeItemFromAutoLoot(uint16_t itemId); bool getItemFromAutoLoot(uint16_t itemId); em player.cpp no final do arquivo, adicione:
void Player::addItemToAutoLoot(uint16_t itemId) { autoLootList.insert(itemId); } void Player::removeItemFromAutoLoot(uint16_t itemId) { autoLootList.erase(itemId); } bool Player::getItemFromAutoLoot(const uint16_t itemId) { return autoLootList.find(itemId) != autoLootList.end(); } em luascript.cpp encontre:
registerMethod("Player", "getFightMode", LuaScriptInterface::luaPlayerGetFightMode); e adicione em baixo:
registerMethod("Player", "addItemToAutoLoot", LuaScriptInterface::luaPlayerAddItemToAutoLoot); registerMethod("Player", "removeItemFromAutoLoot", LuaScriptInterface::luaPlayerRemoveItemFromAutoLoot); registerMethod("Player", "getItemFromAutoLoot", LuaScriptInterface::luaPlayerGetItemFromAutoLoot); registerMethod("Player", "getAutoLootList", LuaScriptInterface::luaPlayerGetAutoLootList); ainda em luascript.cpp encontre essa função:
int LuaScriptInterface::luaPlayerGetFightMode(lua_State* L) { // player:getFightMode() Player* player = getUserdata<Player>(L, 1); if (player) { lua_pushnumber(L, player->fightMode); } else { lua_pushnil(L); } return 1; }
abaixo dela, adicione:
int LuaScriptInterface::luaPlayerAddItemToAutoLoot(lua_State* L) { // player:addItemToAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } player->addItemToAutoLoot(itemId); pushBoolean(L, true); return 1; } int LuaScriptInterface::luaPlayerRemoveItemFromAutoLoot(lua_State* L) { // player:removeItemFromAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } player->removeItemFromAutoLoot(itemId); pushBoolean(L, true); return 1; } int LuaScriptInterface::luaPlayerGetItemFromAutoLoot(lua_State* L) { // player:getItemFromAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } if (player->getItemFromAutoLoot(itemId)) { pushBoolean(L, true); } else { pushBoolean(L, false); } return 1; } int LuaScriptInterface::luaPlayerGetAutoLootList(lua_State* L) { // player:getAutoLootList() Player* player = getUserdata<Player>(L, 1); if (player) { std::set<uint32_t> value = player->autoLootList; if (value.size() == 0) { lua_pushnil(L); return 1; } int index = 0; lua_createtable(L, value.size(), 0); for(auto i : value) { lua_pushnumber(L, i); lua_rawseti(L, -2, ++index); } } else { lua_pushnil(L); } return 1; }
em luascript.h encontre:
static int luaPlayerGetFightMode(lua_State* L);
adicione a baixo:
static int luaPlayerAddItemToAutoLoot(lua_State* L); static int luaPlayerRemoveItemFromAutoLoot(lua_State* L); static int luaPlayerGetItemFromAutoLoot(lua_State* L); static int luaPlayerGetAutoLootList(lua_State* L);
em iologindata.cpp encontre:
//load storage map query.str(std::string()); query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { do { player->addStorageValue(result->getNumber<uint32_t>("key"), result->getNumber<int32_t>("value"), true); } while (result->next()); }
e adicione em baixo:
query.str(std::string()); query << "SELECT `autoloot_list` FROM `player_autoloot` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { unsigned long lootlistSize; const char* autolootlist = result->getStream("autoloot_list", lootlistSize); PropStream propStreamList; propStreamList.init(autolootlist, lootlistSize); int16_t value; int16_t item = propStreamList.read<int16_t>(value); while (item) { player->addItemToAutoLoot(value); item = propStreamList.read<int16_t>(value); } }
acima de:
//save inbox items adicione:
query.str(std::string()); query << "DELETE FROM `player_autoloot` WHERE `player_id` = " << player->getGUID(); if (!db.executeQuery(query.str())) { return false; } PropWriteStream propWriteStreamAutoLoot; for (auto i : player->autoLootList) { propWriteStreamAutoLoot.write<uint16_t>(i); } size_t lootlistSize; const char* autolootlist = propWriteStreamAutoLoot.getStream(lootlistSize); query.str(std::string()); DBInsert autolootQuery("INSERT INTO `player_autoloot` (`player_id`, `autoloot_list`) VALUES "); query << player->getGUID() << ',' << db.escapeBlob(autolootlist, lootlistSize); if (!autolootQuery.addRow(query)) { return false; } if (!autolootQuery.execute()) { return false; }
em sua database, execute esta query
CREATE TABLE player_autoloot ( id int NOT NULL AUTO_INCREMENT, player_id int NOT NULL, autoloot_list blob, PRIMARY KEY (id) );
agora vá em data/scripts/talkactions e crie esse arquivo LUA
autoloot.lua
local talk = TalkAction("!autoloot") function talk.onSay(player, words, param) local i = player:getAutoLootList() local cache = "Check your loot list: " local split = param:split(",") local action = split[1] if param == "list" then if i then for _, item in ipairs(i) do cache = cache .. (ItemType(item)):getName() .. ", " end else player:sendTextMessage(MESSAGE_INFO_DESCR, "Your list is empty! Add some item and try again.") return false end player:sendTextMessage(MESSAGE_INFO_DESCR, cache:sub(1, -3)) return false end if action == "add" then local item = split[2]:gsub("%s+", "", 1) local itemType = ItemType(item) if itemType:getId() == 0 then itemType = ItemType(tonumber(item)) if itemType:getName() == '' then player:sendCancelMessage("There is no item with that id or name.") return false end end if player:getItemFromAutoLoot(itemType:getId()) then player:sendCancelMessage("You're already autolooting this item.") return false end player:addItemToAutoLoot(itemType:getId()) player:sendTextMessage(MESSAGE_INFO_DESCR, "You're now auto looting " .. itemType:getName()) return false elseif action == "remove" then local item = split[2]:gsub("%s+", "", 1) local itemType = ItemType(item) if itemType:getId() == 0 then itemType = ItemType(tonumber(item)) if itemType:getName() == '' then player:sendCancelMessage("There is no item with that id or name.") return false end end if player:getItemFromAutoLoot(itemType:getId()) then player:removeItemFromAutoLoot(itemType:getId()) player:sendTextMessage(MESSAGE_INFO_DESCR, "You removed the " .. itemType:getName() .. " from your loot list.") else player:sendCancelMessage("This item does not exist in your loot list.") end return false end player:sendTextMessage(MESSAGE_EVENT_ORANGE, "Auto Loot commands (items are automatically moved to your bp if you open monster corpse):"..'\n'.."!addloot add, nameItem - add item to auto loot by name"..'\n'.."!autoloot remove, itemName - remove item from auto loot by name"..'\n'.."!autoloot list - list your current auto loot items") return false end talk:separator(" ") talk:register()
É isso, espero que gostem do sisteminha
Se você encontrar algum bug, deixe-me saber.
Falta fazer:
Optimizar a mensagem de loot.
Adicionar ModalWindow.
Cheers~
-
Serpente deu reputação a WooX em Remover o limite de velocidadeNem esquenta, foi só um mal entendido mesmo. Caramba, estou realmente impressionado que também funcione desta maneira no cliente da Cip, consegue repetir o teste com ambos com 1.5k de speed?
-
Serpente recebeu reputação de jakons em Problemas de invasão no Gesior 2012Pode ser que ele tenha acesso a várias databases de outros servidores. Verifique se você não usou o mesmo login e senha do seu god em outros servidores.
O Próprio site avisa quando a conta existe, então ele verifica account por account até achar uma que existe usando as databases que ele tem, e tenta as senhas. Ultimamente ta bem comum fazer isso. Pra economizar tempo o pessoal usa as mesmas contas em todos os servidores e dá nisso ai
-
Serpente recebeu reputação de WooX em [8.10] OTX 2.9[8.10] Yurots OTX
Minha versão favorita do tibia sempre foi a 8.10, e infelizmente não existem servidores decentes que não usem a antiga evolutions e XML para essa versão.
Então eu mesmo decidi criar um a partir da base OTX 2.9 convertida da versão 8.0 para 8.10
[Features]
Suporte total a SQLite e MySQL
Account Manager igual ao 8.60
Sistema de Encantamento de Armas
Hit Critico [Pode ser desativado]
Sistema de Bank
Potions Totalmente Funcionais.
Spells com danos idênticos ao 8.10
Runas Idênticas ao 8.10
Rook System
Black Skull
Todos os itens do 8.10
Bless [Pode ser desativado]
[Mapa]
Yurots 8.10 do Bon apenas melhorado para manter o mais fiel ao original.
Anihilator, Poi e todas as quests funcionando.
[Fotos]
[Bugs Encontrados]
Black Skull não pode ser desativado ou todos ficarão automaticamente como black skull (A solução temporária é aumentar o frag para black skull para um valor alto)
[IMPORTANTE] As 8 rochas [ID: 3651, 3656, 3653, 3648, 3650, 3652, 3649, 3654] causam debug ao passar em cima, não coloquem elas no mapa.
A causa disso é que não existe nenhum items.otb 8.10 compatível, fui obrigado a improvisar com um 8.11 e esse foi o único problema encontrado. Infelizmente isso não pode ser resolvido
[Downloads]
-
Serpente recebeu reputação de celohere em [8.10] OTX 2.9[8.10] Yurots OTX
Minha versão favorita do tibia sempre foi a 8.10, e infelizmente não existem servidores decentes que não usem a antiga evolutions e XML para essa versão.
Então eu mesmo decidi criar um a partir da base OTX 2.9 convertida da versão 8.0 para 8.10
[Features]
Suporte total a SQLite e MySQL
Account Manager igual ao 8.60
Sistema de Encantamento de Armas
Hit Critico [Pode ser desativado]
Sistema de Bank
Potions Totalmente Funcionais.
Spells com danos idênticos ao 8.10
Runas Idênticas ao 8.10
Rook System
Black Skull
Todos os itens do 8.10
Bless [Pode ser desativado]
[Mapa]
Yurots 8.10 do Bon apenas melhorado para manter o mais fiel ao original.
Anihilator, Poi e todas as quests funcionando.
[Fotos]
[Bugs Encontrados]
Black Skull não pode ser desativado ou todos ficarão automaticamente como black skull (A solução temporária é aumentar o frag para black skull para um valor alto)
[IMPORTANTE] As 8 rochas [ID: 3651, 3656, 3653, 3648, 3650, 3652, 3649, 3654] causam debug ao passar em cima, não coloquem elas no mapa.
A causa disso é que não existe nenhum items.otb 8.10 compatível, fui obrigado a improvisar com um 8.11 e esse foi o único problema encontrado. Infelizmente isso não pode ser resolvido
[Downloads]
-
Serpente recebeu reputação de DdJs em [8.10] OTX 2.9[8.10] Yurots OTX
Minha versão favorita do tibia sempre foi a 8.10, e infelizmente não existem servidores decentes que não usem a antiga evolutions e XML para essa versão.
Então eu mesmo decidi criar um a partir da base OTX 2.9 convertida da versão 8.0 para 8.10
[Features]
Suporte total a SQLite e MySQL
Account Manager igual ao 8.60
Sistema de Encantamento de Armas
Hit Critico [Pode ser desativado]
Sistema de Bank
Potions Totalmente Funcionais.
Spells com danos idênticos ao 8.10
Runas Idênticas ao 8.10
Rook System
Black Skull
Todos os itens do 8.10
Bless [Pode ser desativado]
[Mapa]
Yurots 8.10 do Bon apenas melhorado para manter o mais fiel ao original.
Anihilator, Poi e todas as quests funcionando.
[Fotos]
[Bugs Encontrados]
Black Skull não pode ser desativado ou todos ficarão automaticamente como black skull (A solução temporária é aumentar o frag para black skull para um valor alto)
[IMPORTANTE] As 8 rochas [ID: 3651, 3656, 3653, 3648, 3650, 3652, 3649, 3654] causam debug ao passar em cima, não coloquem elas no mapa.
A causa disso é que não existe nenhum items.otb 8.10 compatível, fui obrigado a improvisar com um 8.11 e esse foi o único problema encontrado. Infelizmente isso não pode ser resolvido
[Downloads]
-
Serpente deu reputação a Mathias Kenfi em (Resolvido)Diminuir o Exhaust das runas-- Item usage timeBetweenActions = 100 timeBetweenExActions = 1000 -- Pra diminui exhausted só modificar aqui mesmo timeBetweenCustomActions = 500
-
Serpente deu reputação a Mathias Kenfi em (Resolvido)Editar o dano das magiassetCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, mglvl, min, lvl, max)
Para facilitar, se você colocar assim:
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, mglvl, min, lvl, max)
Ele irá causar 100% do seu Level + uns quebrados do seu Magic Level. As outras fórmulas eu não sei como funciona, mas são valores muito quebrados e nunca são exatos, tanto que mesmo nessa formula, para checar o Level Atual de forma correta, teria que ser um numero tipo 4.2222123, então eu recomendo você usar o onGetFormulaValues(cid, level, maglevel)
function onGetFormulaValues(cid, level, maglevel)
return -(level + maglevel), -(level + maglevel)
end
setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
Neste caso ele irá retornar seu Level+MagicLevel.
Você também pode com SKILL V
function onGetFormulaValues(cid, level, skill)
return -(level + skill), -(level + skill)
end
setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
-
Serpente deu reputação a Dwarfer em [Pedido] NPC que vende premium account e promotionlocal keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local npcTopic = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function onPlayerEndTrade(cid) npcHandler:onPlayerEndTrade(cid) end function onPlayerCloseChannel(cid) npcHandler:onPlayerCloseChannel(cid) end local premium = {days = 30, cost = 10000} -- days = dias de premium comprados, cost = valor em gold coins function creatureSayCallback(cid, type, msg) local talkUser, msg = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid, string.lower(msg) if not npcHandler:isFocused(cid) then return false end if msgcontains(msg, "premium") then if not isPremium(cid) then npcHandler:say("Do you want to buy ".. premium.days .." premium days for ".. premium.cost .. " gold coins?", cid) npcTopic[talkUser] = 1 else npcHandler:say("You are already a premium player.", cid) npcTopic[talkUser] = 0 end elseif msgcontains(msg, "yes") and npcTopic[talkUser] == 1 then if doPlayerRemoveMoney(cid, premium.cost) then npcHandler:say("Here you go, as I promised.", cid) doPlayerAddPremiumDays(cid, premium.days) doSendMagicEffect(getPlayerPosition(cid), CONST_ME_MAGIC_GREEN) else npcHandler:say("You do not have ".. premium.cost .." gold coins.", cid) end npcTopic[talkUser] = 0 elseif msgcontains(msg, "no") and npcTopic[talkUser] == 1 then npcHandler:say("No problem. Maybe on next time.", cid) npcTopic[talkUser] = 0 end return true end local node1 = keywordHandler:addKeyword({'promot'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'I can promote you for 20000 gold coins. Do you want me to promote you?'}) node1:addChildKeyword({'yes'}, StdModule.promotePlayer, {npcHandler = npcHandler, cost = 20000, level = 20, promotion = 1, text = 'Congratulations! You are now promoted.'}) node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Alright then, come back when you are ready.', reset = true}) npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:setMessage(MESSAGE_GREET, "Welcome, |PLAYERNAME|. Become a premium or a promoted player here!") npcHandler:setMessage(MESSAGE_FAREWELL, "Who is next?") npcHandler:setMessage(MESSAGE_WALKAWAY, "Who is next?") npcHandler:addModule(FocusModule:new())
-
Serpente deu reputação a DdJs em Pedido de NPC que vende runas com chargesAcredito que você teria que deixar elas stackaveis lá pelas sources, já que nessa versão não havia isso.
-
Serpente deu reputação a Leohige em The Ruby Server - Base Pokémon TFS 1.2 - 9.80The Ruby Server - Base Pokémon
Ao olhar as diversas bases que podem ser encontradas aqui no fórum e em outros locais da internet, pude ver que todas elas carecem de qualidade. Todas estas bases são feitas utilizando gambiarras para diversos sistemas funcionarem, e com isso vários problemas surgem, como de sistemas que não funcionam direito, e o mais importante, com um desempenho extremamente baixo, gerando apenas servidores instáveis. Com isso eu decidi que iria começar a desenvolver uma base para servidores relacionados a Pokémon, com dois objetivos. Um dos objetivos é ganhar mais conhecimento em cima da linguagem de programação C++, o outro objetivo é disponibilizar uma base completamente estável, funcional e de fácil configuração e desenvolvimento para servidores de Pokémon, para que mais ótimos trabalhos possam surgir. Este projeto também irá incluir um cliente próprio e estável, junto com um website.
Também planejo criar uma espécie de Wiki para o servidor, cliente e website, com o objetivo de auxiliar quem for desenvolver em cima deste servidor, e também aqueles que pouco entendem do assunto relacionando a criação de escripts, Pokémon, spells e etc.
Alguns poucos sistemas foram implementados no servidor por ora. Sistemas como o de catch e de goback serão implementados mais para frente, quando outros sistemas forem completamente implementados, como o sistema de configuração de Pokeballs, criação de Pokémons e sistema de shinys. Estou visando a qualidade do servidor como um todo, por isso algumas coisas irão demorar para aparecer.
O sistema de Pokeballs e de criação de Pokémon já está bem encaminhado, e um sistema de gêneros também já está pronto com fácil configuração, onde o spawn destes Pokémon com sexo será por % igual aos jogos da franquia. Um sistema de surgimento de Ditto aleatório já está praticamente implementado, onde um Pokémon aleatório pode ser um Ditto disfarçado.
[+] Informações do Servidor
Baseado em: TFS 1.3
Protocolo: 10.98
[+] Informações do Client
Baseado em: otclient 0.6.6
[+] Informações do Website
Baseado em: nenhum
Desenvolvido em: PHP (por ser o mais comum na comunidade)
Como contribuir?
Eu gostaria muito que a comunidade ajudasse no desenvolvimento deste projeto, pois o mesmo será disponibilizado para todos, e para contribuir não necessariamente é preciso entender de programação. Você pode também ajudar testando e reportando os bugs encontrados no repositório do projeto no GitHub, assim como com sugestões e ideias de mudança/implementação no servidor através do próprio repositório ou através do Discord, ou ajudar na criação de guias para o website do projeto.
Links
[+] RubyServer - GitHub
https://github.com/rubyserver/rubyserver
[+] RubyClient - GitHub
https://github.com/rubyserver/rubyclient
[+] RubyServer - Website
https://rubyserver.github.io/rubyserver/
[+] RubyServer - Discord
https://discord.gg/XTrZGpy
Algumas Imagens
-
Serpente recebeu reputação de nicolas schroeder ve em [Criar servidor] Ajuda com base.Existem vários distros atualmente, cada um tem seu ponto forte e seu ponto fraco, vou listar alguns que considero os melhores:
TFS 1.3: https://github.com/otland/forgottenserver (Mais estável e mais popular dentre todos, versão 10.98)
TFS 0.3.6 (Crying Damson): https://github.com/peonso/forgottenserver036pl1 (Versão mais antiga do TFS, contém algumas features que foram removidas posteriormente como account manager,etc, versão 8.54)
OTX3 (Baseado no TFS 1.3): https://github.com/mattyx14/otxserver/tree/otxserv3 (Distro com uma comunidade bastante ativa, possui mais recursos que o tfs 1.3, versão: 10.11/7.7/8.5 e 8.6)
OTX2 (Baseado em TFS 0.3.7): https://github.com/mattyx14/otxserver/tree/otxserv2 (versões: 10.0/7.4/8.1/8.5/8.6 e 8.7)
É possível fazer um downgrade de distro para alguma versão anterior, não é uma tarefa muito dificil, só dispensiosa, mais vale a pena.
No seu caso eu recomendaria o distro tfs 1.2 por ser muito estável e um dos mais atuais:
TFS 1.2 para versão 8.60: https://github.com/ninjalulz/forgottenserver/tree/8.6
boa sorte amigo!
-
Serpente recebeu reputação de Leolinduxo em [Criar servidor] Ajuda com base.Existem vários distros atualmente, cada um tem seu ponto forte e seu ponto fraco, vou listar alguns que considero os melhores:
TFS 1.3: https://github.com/otland/forgottenserver (Mais estável e mais popular dentre todos, versão 10.98)
TFS 0.3.6 (Crying Damson): https://github.com/peonso/forgottenserver036pl1 (Versão mais antiga do TFS, contém algumas features que foram removidas posteriormente como account manager,etc, versão 8.54)
OTX3 (Baseado no TFS 1.3): https://github.com/mattyx14/otxserver/tree/otxserv3 (Distro com uma comunidade bastante ativa, possui mais recursos que o tfs 1.3, versão: 10.11/7.7/8.5 e 8.6)
OTX2 (Baseado em TFS 0.3.7): https://github.com/mattyx14/otxserver/tree/otxserv2 (versões: 10.0/7.4/8.1/8.5/8.6 e 8.7)
É possível fazer um downgrade de distro para alguma versão anterior, não é uma tarefa muito dificil, só dispensiosa, mais vale a pena.
No seu caso eu recomendaria o distro tfs 1.2 por ser muito estável e um dos mais atuais:
TFS 1.2 para versão 8.60: https://github.com/ninjalulz/forgottenserver/tree/8.6
boa sorte amigo!
-
Serpente deu reputação a Cjaker em Loot das criaturas com errosmonsters.cpp
Procure esse trecho.
bool Monsters::loadLootItem(const pugi::xml_node& node, LootBlock& lootBlock) { pugi::xml_attribute attr; if ((attr = node.attribute("id"))) { lootBlock.id = pugi::cast<int32_t>(attr.value()); } Substitua por.
bool Monsters::loadLootItem(const pugi::xml_node& node, LootBlock& lootBlock) { pugi::xml_attribute attr; if ((attr = node.attribute("id"))) { lootBlock.id = pugi::cast<int32_t>(attr.value()); } else if ((attr = node.attribute("name"))) { lootBlock.id = Item::items.getItemIdByName(attr.as_string()); }
-
Serpente recebeu reputação de dimiot em Yurots 1.2 [8.60]Boa noite galera, por sorte eu passei nesse tópico.
Tenho um grande acervo de servidores antigos inclusive o yurots xml 8.10 do bon, e muitos outros
Segue o link do yurots xml para quem quiser:
Link: https://mega.nz/#!m0IU3bpa!tQ4f5WfisW2K6xy1HQoie0ylPOEAYdYI5Yr_RfMK4o4
Backup: https://www.4shared.com/zip/fm7RDqwdca/Yurots_12__Verso_81_.html
Fotos:
-
Serpente recebeu reputação de mattos123 em Yurots 1.2 [8.60]Boa noite galera, por sorte eu passei nesse tópico.
Tenho um grande acervo de servidores antigos inclusive o yurots xml 8.10 do bon, e muitos outros
Segue o link do yurots xml para quem quiser:
Link: https://mega.nz/#!m0IU3bpa!tQ4f5WfisW2K6xy1HQoie0ylPOEAYdYI5Yr_RfMK4o4
Backup: https://www.4shared.com/zip/fm7RDqwdca/Yurots_12__Verso_81_.html
Fotos: