WhatsApp Discord
Fix Trade 5.2 - Source Mu - Mu Server Files
 

Noticias:

SMF - Just Installed!

Menú principal

Fix Trade 5.2

Publicado por Dakosmu, Abr 08, 2026, 04:42 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Dakosmu

Fix Trade 5.2

Fala Gurizada do bem blz segue um fix mais veja o vídeo antes para verificar se esta com esse problema ou se já foi fixado de outra forma fiz dessa forma em meu projeto e esta funcionando corretamente, se você tem um metodo melhor não deixe de compartilhar aqui em baixo tmj


if (IsVisible() && Hero && Hero->Dead > 0)
    {
        SendRequestTradeExit();
        g_pNewUISystem->Hide(SEASON3B::INTERFACE_TRADE);
        return true;
    }


creditos
Sr. Punchman
Bon Dia

Dakosmu

Client-side fix only hides the window.
GameServer fix actually closes the trade.
Since trade state, rollback, and synchronization are all server-side, death handling should be fixed in GS, not only in the client.



Trade.cpp

void CTrade::CloseTradeByDeath(int aIndex) // 2026-4-9 死亡时强制关闭交易,兼容请求阶段与正式交易阶段
{
if (OBJECT_RANGE(aIndex) == 0)
{
return;
}

LPOBJ lpObj = &gObj[aIndex];

if (lpObj->Type != OBJECT_USER)
{
return;
}

if (lpObj->Interface.use == 0 || lpObj->Interface.type != INTERFACE_TRADE)
{
return;
}

int bIndex = lpObj->TargetNumber;

// 对方无效:至少先把自己清干净,避免交易状态残留
if (gObjIsConnectedGP(bIndex) == 0)
{
if (lpObj->Interface.state != 0)
{
this->ResetTrade(aIndex);
this->GCTradeResultSend(aIndex, 0);
}
else
{
lpObj->Interface.use = 0;
lpObj->Interface.type = INTERFACE_NONE;
lpObj->Interface.state = 0;
lpObj->TargetNumber = -1;
lpObj->TradeOk = 0;
lpObj->TradeOkTime = 0;
lpObj->TradeMoney = 0;
#ifdef TRADE_SYSTEM_COIN
lpObj->TradeCoin1 = 0;
lpObj->TradeCoin2 = 0;
lpObj->TradeCoin3 = 0;
#endif // TRADE_SYSTEM_COIN
this->ClearTrade(lpObj);
}
return;
}

LPOBJ lpTarget = &gObj[bIndex];

// 只有双方互相指向,才按成对交易处理
if (lpTarget->Interface.use == 0
|| lpTarget->Interface.type != INTERFACE_TRADE
|| lpTarget->TargetNumber != aIndex)
{
if (lpObj->Interface.state != 0)
{
this->ResetTrade(aIndex);
this->GCTradeResultSend(aIndex, 0);
}
else
{
lpObj->Interface.use = 0;
lpObj->Interface.type = INTERFACE_NONE;
lpObj->Interface.state = 0;
lpObj->TargetNumber = -1;
lpObj->TradeOk = 0;
lpObj->TradeOkTime = 0;
lpObj->TradeMoney = 0;
#ifdef TRADE_SYSTEM_COIN
lpObj->TradeCoin1 = 0;
lpObj->TradeCoin2 = 0;
lpObj->TradeCoin3 = 0;
#endif // TRADE_SYSTEM_COIN
this->ClearTrade(lpObj);
}
return;
}

// 请求阶段:还没开启事务,不能走 ResetTrade,直接双边清状态并发失败响应
if (lpObj->Interface.state == 0 || lpTarget->Interface.state == 0)
{
lpObj->Interface.use = 0;
lpObj->Interface.type = INTERFACE_NONE;
lpObj->Interface.state = 0;
lpObj->TargetNumber = -1;
lpObj->TradeOk = 0;
lpObj->TradeOkTime = 0;
lpObj->TradeMoney = 0;
#ifdef TRADE_SYSTEM_COIN
lpObj->TradeCoin1 = 0;
lpObj->TradeCoin2 = 0;
lpObj->TradeCoin3 = 0;
#endif // TRADE_SYSTEM_COIN
this->ClearTrade(lpObj);

lpTarget->Interface.use = 0;
lpTarget->Interface.type = INTERFACE_NONE;
lpTarget->Interface.state = 0;
lpTarget->TargetNumber = -1;
lpTarget->TradeOk = 0;
lpTarget->TradeOkTime = 0;
lpTarget->TradeMoney = 0;
#ifdef TRADE_SYSTEM_COIN
lpTarget->TradeCoin1 = 0;
lpTarget->TradeCoin2 = 0;
lpTarget->TradeCoin3 = 0;
#endif // TRADE_SYSTEM_COIN
this->ClearTrade(lpTarget);

this->GCTradeResponseSend(aIndex, 0, lpTarget->Name, 0, 0);
this->GCTradeResponseSend(bIndex, 0, lpObj->Name, 0, 0);
return;
}

// 正式交易阶段:走正常回滚
this->ResetTrade(aIndex);
this->GCTradeResultSend(aIndex, 0);

this->ResetTrade(bIndex);
this->GCTradeResultSend(bIndex, 0);
}


In void gObjUserDie(LPOBJ lpObj, LPOBJ lpTarget) call   
void gObjUserDie(LPOBJ lpObj, LPOBJ lpTarget) // OK
{
   if (lpObj->Type != OBJECT_USER)
   {
      return;
   }

   gTrade.CloseTradeByDeath(lpObj->Index); // 2026-4-9 死亡时强制关闭交易,防止交易状态残留
Bon Dia

🡱 🡳
Real Time Web Analytics