Eliminando el rollback del Chaos Mix se ahorran todos los problemas de dupeos a través del Chaos Mix.
El Chaos Mix tiene un rollback exclusivamente por si a alguien se le cierra el juego mientras estaba usando la máquina, entonces antes de cerrar el juego verifica si su transacción con el chaos mix está finalizada y en caso de que no, simplemente le restaura los items hacia el inventario. El problema de esto es que guarda el estado al momento de abrir el chaos mix y todo lo que pase en el medio, si no está bien controlado, se presta a este tipo de cosas. Es por eso que yo opté por directamente eliminar el rollback del chaos mix y ahorrarme mil dolores de cabeza, ya que es muy poco común que a un usuario se le desconecte estando en la máquina chaos.
Si quieren eliminar el rollback del chaos mix hagan esto:
bool CObjectManager::CharacterGameClose(int aIndex) // OK
{
if (OBJECT_RANGE(aIndex) == 0)
{
return 0;
}
LPOBJ lpObj = &gObj[aIndex];
if (lpObj->Connected != OBJECT_ONLINE)
{
return 0;
}
if (lpObj->Type != OBJECT_USER || lpObj->MapServerMoveQuit != 0)
{
return 0;
}
if (OBJECT_RANGE(lpObj->SummonIndex) != 0)
{
gObjSummonKill(lpObj->Index);
}
if (lpObj->Interface.use != 0 && (lpObj->Interface.type == INTERFACE_CHAOS_BOX || lpObj->Interface.type == INTERFACE_TRAINER))
{
if (lpObj->IsChaosMixCompleted != 0 || lpObj->IsCastleNPCUpgradeCompleted != 0)
{
gChaosBox.ChaosBoxItemSave(lpObj);
}
//Comment this to fix chaos dupe
//else
//{
// gObjInventoryRollback(aIndex);
//}
}
if (OBJECT_RANGE(lpObj->TargetNumber) != 0)
{
gTrade.ResetTrade(lpObj->TargetNumber);
gTrade.GCTradeResultSend(lpObj->TargetNumber, 0);
gTrade.ResetTrade(aIndex);
}
Y por último paso a explicarles el bug.
-Al tirar party, el gameserver coloca Interface State en 1 y empieza el contador de tiempo del party.
-Al apretar Tab 2 veces, el main envía al gameserver "gNpcTalk.CGNpcTalkCloseRecv" haciendo que cancele el Interface State en 1 y lo ponga en 0
-Al estar el Interface State en 0, nos permite abrir el Chaos Mix, lo cual nuevamente vuelve a poner el Interface State en 1
-Como tiramos party y no recibimos una respuesta, luego de unos segundos automáticamente el party se cancela, por lo que vuelve a colocar el Interface State en 0 y eso genera el bug de tener la máquina de chaos abierta pero que en el gameserver no la tenga en cuenta y nos permita mover, usar baul, etc.
-Una vez que colocamos los items en el baul, si volvemos a la máquina de chaos y cerramos el juego, se ejecutará el rollback debido a que nuestra transacción con la máquina de chaos nunca se completo ya que no realizamos ningún mix, entonces nos restaura los items hasta el punto en donde abrimos la máquina por primera vez pero esos items también quedarán guardados en el baul, lo que genera el dupe.
Esta es mi interpretación del dupeo.