[SOURCE 5.2 BASE] Fix Visual Bug: Glow de Ítems en otros Personajes - Source Mu - Mu Server Files
 

[SOURCE 5.2 BASE] Fix Visual Bug: Glow de Ítems en otros Personajes

Publicado por Dakosmu, Mar 15, 2026, 04:44 PM

Tema anterior - Siguiente tema

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

Dakosmu

[SOURCE 5.2 BASE] Fix Visual Bug: Glow de Ítems en otros Personajes


¿Alguna vez has visto que un personaje en tu servidor se equipa un ítem y el brillo (glow) no aparece correctamente para los demás jugadores? Este fix para la Source 5.2 BASE corrige el protocolo de movimiento de ítems para forzar la actualización del Viewport.



Descripción del Problema
En las versiones base de Mu Online, el servidor a veces procesa el movimiento de un ítem en el inventario/equipo pero no notifica correctamente a los jugadores cercanos (Viewport). Esto causa que veas a otros personajes con partes del set invisibles o sin el brillo correspondiente hasta que cambias de mapa.

Lo que resuelve este Fix:
  • Sincronización de Viewport: Fuerza la recreación de la lista de visualización del objeto cuando hay cambios en los slots de equipo.
  • Actualización de Durabilidad: Corrige el envío de paquetes de durabilidad al fallar un movimiento.
  • Items Periódicos: Asegura que el tiempo de los ítems temporales se sincronice al moverlos al inventario.

Este fix se aplica específicamente en la función CGItemMoveRecv dentro de la clase CItemManager.



Implementación del Fix (CItemManager.cpp)

Reemplaza tu función actual por este código mejorado para asegurar que todos los cambios de equipo se reflejen en tiempo real para todos los usuarios conectados.

void CItemManager::CGItemMoveRecv(PMSG_ITEM_MOVE_RECV* lpMsg, int aIndex) // Fix Viewport & Glow
{
LPOBJ lpObj = &gObj[aIndex];

if (gObjIsConnectedGP(aIndex) == 0)
{
    return;
}

PMSG_ITEM_MOVE_SEND pMsg;
pMsg.header.setE(0x24, sizeof(pMsg));
pMsg.SubCode = 0xFF;
pMsg.Index = lpMsg->TargetSlot;
memset(pMsg.ItemInfo, 0xFF, sizeof(pMsg.ItemInfo));

if (lpObj->DieRegen != 0)
{
    DataSend(aIndex, (BYTE*)&pMsg, pMsg.header.size);
    return;
}

// ... [Aquí va la lógica de validación de interfaces: Trade, Warehouse, Chaos Box, etc.] ...
// [El código completo de la lógica de movimiento se mantiene según tu fuente]

// FINAL DE LA FUNCIÓN: EL FIX CRÍTICO
DataSend(aIndex, (BYTE*)&pMsg, pMsg.header.size);

if (pMsg.SubCode == 0xFF && lpMsg->SourceFlag == REQUEST_EQUIPMENT_INVENTORY && lpMsg->TargetFlag == REQUEST_EQUIPMENT_INVENTORY)
{
    if (lpObj->Inventory[lpMsg->SourceSlot].IsItem() != 0)
    {
        this->GCItemDurSend(lpObj->Index, lpMsg->SourceSlot, (BYTE)lpObj->Inventory[lpMsg->SourceSlot].m_Durability, 0);
    }
}

if (pMsg.SubCode != 0xFF && lpMsg->TargetFlag == REQUEST_EQUIPMENT_INVENTORY)
{
    if (lpObj->Inventory[lpMsg->TargetSlot].m_IsPeriodicItem != 0)
    {
        gCashShop.GCCashShopPeriodicItemSend(aIndex, lpObj->Inventory[lpMsg->TargetSlot].m_Index, lpMsg->TargetSlot, lpObj->Inventory[lpMsg->TargetSlot].m_PeriodicItemTime);
    }
}

// UPDATE VIEWPORT: Aquí es donde se soluciona el Visual Bug del Glow
if (pMsg.SubCode != 0xFF && lpMsg->SourceFlag == REQUEST_EQUIPMENT_INVENTORY && lpMsg->TargetFlag == REQUEST_EQUIPMENT_INVENTORY)
{
    if (lpMsg->SourceSlot < MAX_EQUIPMENT_INDEX || lpMsg->TargetSlot < MAX_EQUIPMENT_INDEX)
    {
        // Recreamos el objeto para los demás jugadores
        gObjViewportListProtocolCreate(lpObj);
    }
}
}

Es vital verificar que la constante MAX_EQUIPMENT_INDEX esté correctamente definida en tu proyecto (generalmente hasta el slot 11 o 15 dependiendo de tu Season).

¡Fix aplicado! Ahora, cada vez que un usuario cambie un arma, escudo o parte del set, el cambio visual y su brillo serán instantáneos para todos los que estén viendo a ese personaje.



¿Te ha funcionado en tu Source 5.2?
Si utilizas un sistema de Custom Glow, asegúrate de que este no interfiera con la función gObjViewportListProtocolCreate. ¡Cualquier duda, comenta abajo!

Regístrate para ver el enlace
Bon Dia

🡱 🡳
Real Time Web Analytics