Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Опкоды (http://mangos.ytdb.ru/forumdisplay.php?f=36)
-   -   SMSG_SPELL_GO (http://mangos.ytdb.ru/showthread.php?t=2072)

Konctantin 09.08.2010 09:47

SMSG_SPELL_GO
 
Сабж, помогите разобраться со структурой этого пакета.

Вот есть такая структура:
PHP код:

//WowGuid - 8 bytes
WowGuid Caster
WowGuid Target
uint8 CastId
uint32 SpellId
uint32 CastFlags
uint32 Ticks

uint8 hitCount

for (uint8 i 0hitCount; ++i)
{
    
WowGuid GOHitTarget
}

uint8 missCount

for (uint8 i 0missCount; ++i)
{
    
WowGuid GOMissTarget
    uint8 SpellMissInfo
    
if (missReason == SPELL_MISS_REFLECT)//11
    
{
        
uint8 GOReflectReason
    
}
}

uint32 TargetFlags

if (TargetFlags & (TARGET_FLAG_UNIT TARGET_FLAG_PVP_CORPSE TARGET_FLAG_OBJECT TARGET_FLAG_CORPSE TARGET_FLAG_UNK2))
{
    
WowGuid ObjectTarget
}

if (
TargetFlags & (TARGET_FLAG_ITEM TARGET_FLAG_TRADE_ITEM))
{
    
WowGuid ItemTarget
}

if (
TargetFlags TARGET_FLAG_SOURCE_LOCATION)
{
    
Vector3 SourceTarget //12 bytes
}

if (
TargetFlags TARGET_FLAG_DEST_LOCATION)
{
    
WowGuid DestanationTargetGuid
    Vector3 DestanationTarget
//12 bytes
}

if (
TargetFlags TARGET_FLAG_STRING)
{
    
string StringTarget
}

if (
CastFlags CAST_FLAG_12)
{
    
uint32 PredictedPower;
}

if (
CastFlags CAST_FLAG_22)
{
    
uint8 cdmask1
    uint8 cdmask2

    
for (var 06; ++i)
    {
        
uint32 mask = (<< i);

        if (
mask cdmask1)
        {
            if (!(
mask cdmask2))
            {
                
uint8 colldown
            
}
        }
    }
}

if (
CastFlags CAST_FLAG_18)
{
    
float unk1
    uint32 unk2
}

if (
CastFlags CAST_FLAG_AMMO)
{
    
uint32 DisplayId
    uint32 InventoryType
}

if (
CastFlags CAST_FLAG_20)
{
    
uint32 unk3
    uint32 unk4
}

if (
CastFlags TARGET_FLAG_DEST_LOCATION)
{
    
uint8 targetFlags


большинство пакетов читаются правильно, но вот некоторые уже идут с ошибками.

Вот сам дамп, если отфильтровать по опкоду SMSG_SPELL_GO, то ошибки уже будут в пакте под индексом 7 и 2 последующих тоже, еще дальше то же самое:
Чтение после конца потока - пакет с длинной 61, и не прочитан 1 байт в пакете по индексу 7.
http://filebeam.com/760a11936d576db1b12b968ac437700c

Konctantin 09.08.2010 10:01

Если к примеру взять пакет, под индексом 7:
Код:

Packet S->C, SMSG_SPELL_GO (306), len 47, Flags: None
|---------------------------------------------------------------------------|
| OFFSET |  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F |0123456789ABCDEF|
|----------------------------------------------------------|----------------|
|00000000| DB AA 03 F2 6F 30 F1 DB AA 03 F2 6F 30 F1 00 22 |....o0.....o0.."|
|00000010| CD 00 00 05 43 00 00 32 8A 8C 21 00 00 22 00 00 |....C..2..!.."..|
|00000020| 00 00 00 4F CC 12 45 3C F2 B3 C5 DB 0E 1A 43 -- |...O..E<......C.|
|----------------------------------------------------------|----------------|

Вот расшифровка:
Код:

Caster: (High: HIGHGUID_UNIT (0xF130), Entry: 28658, Counter: 938)
Target: (High: HIGHGUID_UNIT (0xF130), Entry: 28658, Counter: 938)
Cast Id: 0
Spell Id: 52514
Cast Flags: CAST_FLAG_01, CAST_FLAG_03, CAST_FLAG_09, CAST_FLAG_10, CAST_FLAG_15
Tick: 562858546
Target Flags: TARGET_FLAG_UNIT, TARGET_FLAG_SOURCE_LOCATION
Object Target: (No Guid)
Source Target: 1,289368E-27 -1,127997E-07 2,954244E-23
-- Прочитано 46 байт, надо 47

Если перед Object Target: (No Guid) передвинутся на 1 позицию вперед, тогда все нормально, но вот как высчитать этот момент, я не знаю.

TOM_RUS 09.08.2010 13:40

А в сорцы мангоса не судьба глянуть?
Код:

    if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
    {
        if(m_unitTarget)
            data << m_unitTarget->GetPackGUID();
        else
            data << uint8(0);

        data << m_srcX << m_srcY << m_srcZ;
    }


Konctantin 09.08.2010 14:54

Смотрел, но не понял сначала что за m_unitTarget.
А оказывается это HighGuid таргета, надо быть внимательным


Текущее время: 09:05. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS