PDA

Просмотр полной версии : SMSG_COMBAT_LOG_MULTIPLE


Fmut
12.09.2010, 01:36
Кто-нибудь разбирал следующий опкод?
SMSG_COMBAT_LOG_MULTIPLE = 1300; // $514

В 3.3.5 он заменил собой опкод SMSG_SPELLNONMELEEDAMAGELOG, собственно в него и входит полностью содержимое этого опкода, но не все параметры понятны, вот я привел дамп этого опкода:

01 00 00 00 - count
F3 35 1C F8 - timestamp

for i := 0 to count -1 do
F3 35 1C F8 - timestamp
50 02 00 00 - OpCode (SMSG_SPELLNONMELEEDAMAGELOG)
----------------- далее блок аналогичный SMSG_SPELLNONMELEEDAMAGELOG
XX XX E7 F6 02 07
XX XX 06 F6 02 07
85 00 00 00
13 00 00 00
00 00 00 00
04
00 00 00 00
00 00 00 00
00
00
00 00 00 00
05 00 00 00
00
-------------------
end;

TOM_RUS
12.09.2010, 01:58
01 00 00 00 - count ?

F3 35 1C F8 - timestamp
F3 35 1C F8 - timestamp
50 02 00 00 - opcode (SMSG_SPELLNONMELEEDAMAGELOG)

----------------- далее блок аналогичный SMSG_SPELLNONMELEEDAMAGELOG
XX XX E7 F6 02 07
XX XX 06 F6 02 07
85 00 00 00
13 00 00 00
00 00 00 00
04
00 00 00 00
00 00 00 00
00
00
00 00 00 00
05 00 00 00
00
-------------------


signed int __cdecl Packet_SMSG_COMBAT_LOG_MULTIPLE(int a1, int a2, int a3, int a4)
{
int v4; // edi@1
int v5; // edi@4
unsigned __int8 v6; // sf@17
unsigned __int8 v7; // of@17
int opcode; // [sp+8h] [bp-14h]@4
int count; // [sp+Ch] [bp-10h]@1
int v11; // [sp+10h] [bp-Ch]@1
int time2; // [sp+14h] [bp-8h]@4
int time1; // [sp+18h] [bp-4h]@1

CDataStore__GetInt32(a4, (int)&count);
v4 = 0;
time1 = 0;
CDataStore__GetInt32(a4, (int)&time1);
v11 = 0;
if ( count > 0 )
{
while ( 1 )
{
time2 = v4;
CDataStore__GetInt32(a4, (int)&time2);
v5 = time1 - time2;
CDataStore__GetInt32(a4, (int)&opcode);
if ( opcode > SMSG_SPELLLOGMISS )
{
switch ( opcode )
{
case SMSG_PERIODICAURALOG:
CombatLog__HandlePeriodicAuraLog(a4, v5);
break;
case SMSG_SPELLNONMELEEDAMAGELOG:
CombatLog__HandleSpellNonMeleeDamageLog(a4, v5);
break;
case SMSG_SPELLLOGEXECUTE:
CombatLog__HandleSpellLogExecute(a4, v5);
break;
case SMSG_SPELLDISPELLOG:
case SMSG_SPELLSTEALLOG:
goto LABEL_16;
default:
break;
}
}
else
{
switch ( opcode )
{
case SMSG_SPELLLOGMISS:
CombatLog__HandleSpellLogMiss(a4, v5);
break;
case SMSG_SPELLBREAKLOG:
LABEL_16:
CombatLog__HandleSpellRemoveLog(opcode, a4, v5);
break;
case SMSG_SPELLHEALLOG:
CombatLog__HandleSpellHealLog(a4, v5);
break;
case SMSG_SPELLENERGIZELOG:
CombatLog__HandleSpellLogEnergizeLog(a4, v5);
break;
}
}
v7 = __SETO__(v11 + 1, count);
v6 = v11++ + 1 - count < 0;
if ( !(v6 ^ v7) )
break;
v4 = 0;
}
}
return 1;
}

Fmut
12.09.2010, 02:08
хм, действительно это опкод, спасибо :)

Есть мысли почему сервер иногда шлет по старинке опкоды, а иногда (часто с одним опкодом) SMSG_COMBAT_LOG_MULTIPLE ?

№ 1072 : SMSG_COMBAT_LOG_MULTIPLE
opcode num. 1300 (in hex: $0514) size: 60
Версия клиента: 3.3.5 [12340], Дата изменения: 12.09.10

Count (uint) = 1
Timestamp (uint) = 4162596251
---------------------------------------------------------
[0] Timestamp (uint) = 4162596251
[0] OpCode (uint) = SMSG_SPELLNONMELEEDAMAGELOG (592)
[0] TargetGUID (pint64) = $0700000002F6E7EB
[0] CasterGUID (pint64) = $0700000002F6XXXX
[0] SpellId (uint) = 133 / Fireball (Rank 1) - SPELLCLASS_MAGE
[0] Damage (uint) = 18
[0] OverDamage (uint) = 0
[0] SchoolMask (byte) = 4
[0] Absorbed (uint) = 0
[0] Resisted (uint) = 0
[0] SplitDamage (bool) = 0
[0] unk_1 (byte) = 0
[0] Blocked (uint) = 0
[0] LogFlags (uint) = 5 ($00000001,$00000004)
[0] unk_2 (byte) = 0
---------------------------------------------------------