Ir para conteúdo

Featured Replies

Postado
  • 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!

YDmXTU2.png

 

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.

 

skype-favicon.png lu.lukinha

message-16.png [email protected]

  • Respostas 31
  • Visualizações 8.5k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • "Um engraçadinho descobriu a FALHA no TFS e estava realizando em todos os servidores pedindo dinheiro para revelar o bug" Nossa, eu li isso várias vezes só pra ter a certeza que realmente foi você que

  • Pois é, ajudei. Quando descubro é pra usar com pessoas que as vezes te desafiam e precisam passar pelo que você passou pra um dia chegar onde chegou hehe. Portanto, pensei e resolvi reportar, h

  • Achei desnecessário essa discussão, mas enfim @vankk o walkable é o script dos baús, como te falei por skype, o que ocorre é que o esse loop infinito causa o alocamento da pilha, ou seja ele pode esta

Postado

51mutNo.png 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 :p

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 por vankk (veja o histórico de edições)

discord.pngDiscord: 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

Não Bruno, o walkable.lua vai para todos os scripts também. Eu testei e funcionou aqui do jeito que eu mandei :p

discord.pngDiscord: 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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo