private static bool DumpOpcode(uint opcode, Dictionary <JamGroup, uint> jamGroupCount) { foreach (var dispatcherPair in Program.Dispatchers) { if (dispatcherPair.Key == JamGroup.None) { continue; } var dispatcher = dispatcherPair.Value; if (dispatcher.CalculateCheckerFn() == 0) { continue; } int offset = dispatcher.StructureOffset; if (offset <= 0) { continue; } int checkerFn = dispatcher.CalculateCheckerFn(); int connectionFn = dispatcher.CalculateConnectionFn(); int dispatcherFn = dispatcher.CalculateDispatcherFn(); Program.Environment.Reset(); Program.Environment.Push(opcode); Program.Environment.Execute(checkerFn, Program.Disasm, false); if (Program.Environment.Eax.Value == 0) { continue; } var connIndex = 0u; if (connectionFn != 0) { Program.Environment.Reset(); Program.Environment.Push(); Program.Environment.Push(); Program.Environment.Push(); Program.Environment.Push(opcode); Program.Environment.Push(); Program.Environment.Execute(connectionFn, Program.Disasm, false); if (Program.Environment.Eax.Al == 0) { var requiresInstanceConnectionFn = Program.Environment.GetCalledOffsets()[0] - 0x400C00; Program.Environment.Reset(); Program.Environment.Push(opcode); Program.Environment.Execute(requiresInstanceConnectionFn, Program.Disasm, false); connIndex = Program.Environment.Eax.Value; } } Program.Environment.Reset(); Program.Environment.Execute(dispatcherFn, Program.Disasm, false); var calleeOffset = Program.Environment.GetCalledOffsets()[0] - 0x400C00; Program.Environment.Reset(); Program.Environment.Push(); Program.Environment.Push((ushort)0); Program.Environment.Push((ushort)opcode); Program.Environment.Push(); Program.Environment.Push(); Program.Environment.Execute(calleeOffset, Program.Disasm, false); var jamData = Program.Environment.GetCalledOffsets(); if (jamData.Length < 2) { continue; } var handler = jamData[0]; var parser = jamData[1]; switch (dispatcher.GetGroup()) { case JamGroup.Client: case JamGroup.ClientChat: case JamGroup.ClientGuild: case JamGroup.ClientQuest: handler = jamData[1]; parser = jamData[2]; break; } if (!jamGroupCount.ContainsKey(dispatcher.GetGroup())) { jamGroupCount.Add(dispatcher.GetGroup(), 0); } jamGroupCount[dispatcher.GetGroup()] += 1; Logger.WriteLine("| {1} (0x{0:X4}) | 0x{2:X8} | 0x{3:X8} | {4} | {5} | {6:F4} | {7}", opcode, opcode.ToString().PadLeft(4), handler, parser, dispatcher.GetGroup().ToString().PadLeft(18), connIndex.ToString().PadLeft(7), Program.FuncDiff != null ? Program.FuncDiff.getCertianty(parser) : 0, Opcodes.GetOpcodeNameForServer(opcode, parser)); smsgInfo.Add(new SMSGInfo(Opcodes.GetOpcodeNameForServer(opcode, parser), opcode, handler, parser, dispatcher.GetGroup().ToString(), (Program.FuncDiff != null ? Program.FuncDiff.getCertianty(parser) : 0.0f))); return(true); } return(false); }