Este foi um dos fix mais difíceis que achei até agora, então, para ajudar a galera que está iniciando vou deixar aqui como eu consegui solucionar.
O BUG acontece quando um player coloca seus itens na Chaos Machine e em seguida ele é desconectado do servidor por circunstâncias diversas ou fecha o jogo com os itens na Chaos Machine, e ai ele acaba perdendo os itens, pois eles somem do jogo.
Esta função irá dar um "Rollback" no inventário do player quando isto acontecer, trazendo de volta os itens ao inventário antes de ser desconectado, fixando o problema.
Defines
Código:
#define OBJMAX_RANGE(aIndex) (((aIndex) < 0 )?FALSE:( (aIndex) > OBJECT_MAX-1 )?FALSE:TRUE)
#define INVENTORY_SIZE 108
Funções.cpp
Código:
int gObjInventoryRollback(int aIndex)
{
if (!OBJMAX_RANGE(aIndex))
{
return false;
}
for (int n = 0; n < INVENTORY_SIZE; n++)
{
gObj[aIndex].Inventory2[n].Clear();
}
gObjSetInventory1Pointer(&gObj[aIndex]);
LogAddFuncColor(COLOR_BLACK, "Rollback no Inventário (%s)", gObj[aIndex].Name);
return true;
}
Funções.h
Código:
int gObjInventoryRollback(int aIndex);
A parte abaixo deve ser inserida na função gObjDel
Código:
// - Fix Chaos Machine
if (lpObj->CloseType == -1 && lpObj->m_IfState.use == 1 && lpObj->m_IfState.type == 7)
{
LogAddFuncColor(COLOR_BLUE, "[Chaos-Machine][%s][%s] Fechou de Forma Inesperada", lpObj->AccountID, lpObj->Name);
gObjInventoryRollback(aIndex);
}
Créditos: Romário Leite