Postado Dezembro 22, 2015 9 anos Este é um post popular. Fala meus lindos! Há alguns dias diversos servidores grandes como: Shadowcores, Fortera, Dolera, Inflame, Forsaken entre demais proprietários de servidores que conversaram comigo, me disseram o ocorrido e fui investigar o que realmente estava ocorrendo. Um engraçadinho descobriu a FALHA no TFS e estava realizando em todos os servidores pedindo dinheiro para revelar o bug, mas não sabia a solução. Então com permissão, tomei posse a servidor de um cliente INFLAME-GLOBAL para junto com ele ADM Henrique achar o temível bug que causava um crash no servidor, investigamos e ACHAMOS! Então resolvi conversar com meu amigo @Bruno Minervino para reporta-lo (pois muitos usam sua base VANAHEIM GLOBAL) e chegarmos logo ao fix problem. Então, não contente com a situação resolvemos fixar o mais rápido possível e vim trazer as INFORMAÇÕES do BUG e a SOLUÇÃO para quem ainda não arrumou.Entenda como o BUG é causado: https://www.youtube.com/watch?v=ube4b-q4Ncg&spfreload=10 O player retorna para a from pos, quando ele realiza a ação... BUMP, ele fica dando um stack infinito, causando um LOOP infinito e por fim, o servidor é crashado (derrubado) Erro: [Error - MoveEvent::executeStep] Call stack overflor Ou seja, ele causa um STACK OVERFLOW, para quem não sabe este é um dos erros mais estúpidos, ele significa um ESTOURO DE PILHA... isso ocorre quando uma variável está tentando gravar mais informações do que é permitido na memória, quando o bug ocorre o loop infinito causa isto. Este erro está presente apenas nas atualização do novo TFS, Versão 1.1 e 1.2, portanto junto com Bruno estudamos e trazemos o FIX para quem usa 1.1 e 1.2. Vamos arrumar? É simples, siga comigo: Em suas sources, abra o arquivo creature.cpp procure por: void Creature::onCreatureAppear(Creature* creature, bool) Vamos adicionar um isLogin, ou seja substitua a linha a cima por: void Creature::onCreatureAppear(Creature* creature, bool isLogin) Ainda no creature.cpp procure por: if (creature == this) { if (useCacheMap()) { isMapLoaded = true; updateMapCache(); } Logo abaixo pule uma linha e adicione: if (isLogin) { setLastPosition(getPosition()); } Agora abra o seu creature.h Na linha 156 procure por: virtual void addList() = 0; Pule uma linha e adicione: const Position& getLastPosition() const { return lastPosition; } void setLastPosition(const Position& newLastPos) { lastPosition = newLastPos; } Ainda no creature.h procure por virtual void onCreatureAppear(Creature* creature, bool); Substitua a linha a cima por: virtual void onCreatureAppear(Creature* creature, bool isLogin); Procure por: Outfit_t defaultOutfit; Pule uma linha e adicione: Position lastPosition; Agora abra o seu game.cpp e procure por: ReturnValue Game::internalMoveCreature(Creature* creature, Direction direction, uint32_t flags /*= 0*/) { Logo abaixo adicione: creature->setLastPosition(creature->getPosition()); Agora por fim, abra seu movement.cpp procure por: LuaScriptInterface::pushPosition(L, fromPos); Substitua a linha a cima por: LuaScriptInterface::pushPosition(L, creature->getLastPosition()); Pronto pessoal, você está livre desse bug que pode ter lhe prejudicado muito. Ao engraçadinho que descobriu e saiu espalhando, que pena em jovem. Espero ter ajudado, não esqueçam de fixar em seu servidor! Até a próxima! Entenda tudo sobre VPS, DEDICADOS & HOSPEDAGENS. => Clique aqui Global Full Download 10.9x - TFS 1.2/FERUMBRAS/KRAILOS. => Clique aqui Muitos querem aquilo que você tem, mas vão desistir quando souberem o preço que você pagou. lu.lukinha [email protected]
Postado Dezembro 22, 2015 9 anos Parabéns, seu tópico de conteúdo foi aprovado! Muito obrigado pela sua contribuição, nós do Tibia King agradecemos. Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP. Ou apenas simplesmente modifique em LUA walkable.lua local function isQuestChest(item) local itemid = item:getId() if itemid == 1738 or itemid == 1740 or (itemid >= 1746 and itemid <= 1749) then return true end end local function isWalkable(item) if item.uid > 0 and item.uid <= 65535 then return false end return true end local function isPositionSafe(position) local tile = Tile(position) for _, item in ipairs(tile:getItems()) do if isQuestChest(item) and not isWalkable(item) then return false end end return true end function onStepIn(creature, item, position, fromPosition) if not isWalkable(item) then if creature:isPlayer() then local safePosition = creature:getTown():getTemplePosition() if position.x == fromPosition.x and position.y == fromPosition.y and position.z == fromPosition.z then creature:teleportTo(safePosition, false) return true elseif not isPositionSafe(fromPosition) then creature:teleportTo(safePosition, false) return true end end creature:teleportTo(fromPosition, false) end return true end Editado Dezembro 22, 2015 9 anos por vankk (veja o histórico de edições) Discord: vankk #7765 Precisando de ajuda? Entre em contato comigo via Discord. Muitos vêm seus muitos dias de glória, mas poucos vêm seus muitos dias de luta.
Postado Dezembro 22, 2015 9 anos Parabéns @Absolute! @Tópico, uma vez que você corrige via lua, terá que aplicar isso em todos os scripts... Atenciosamente, Bruno Minervino
Postado Dezembro 22, 2015 9 anos Não Bruno, o walkable.lua vai para todos os scripts também. Eu testei e funcionou aqui do jeito que eu mandei Discord: vankk #7765 Precisando de ajuda? Entre em contato comigo via Discord. Muitos vêm seus muitos dias de glória, mas poucos vêm seus muitos dias de luta.
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.