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!