public Event<OnMessage> evOnMessage(Class<? extends GeneratedMessage> messageClass) { Event<OnMessage> ev = evOnMessages.get(messageClass); if (ev == null) { ev = ctx.createEvent(OnMessage.class, messageClass); evOnMessages.put(messageClass, ev); } return ev; }
private int getTick() { return context.getTick(); }
@OnMessage(NetMessages.CSVCMsg_ServerInfo.class) public void processServerInfo(NetMessages.CSVCMsg_ServerInfo serverInfo) { if (engineType.getId() != EngineId.SOURCE2) { return; } Matcher matcher = Pattern.compile("dota_v(\\d+)").matcher(serverInfo.getGameDir()); if (matcher.find()) { int num = Integer.valueOf(matcher.group(1)); ctx.setBuildNumber(num); if (num < 928) { log.warn("This replay is from an early beta version of Dota 2 Reborn (build number %d).", num); log.warn("Entities in this replay probably cannot be read."); log.warn("However, I have not had the opportunity to analyze a replay with that build number."); log.warn("If you wanna help, send it to github@martin.schrodt.org, or contact me on github."); } } else { log.warn("received CSVCMsg_ServerInfo, but could not read build number from it. (game dir '%s')", serverInfo.getGameDir()); } }
public void run() { try { MainWindow window = new MainWindow(); window.getClassTree().setModel(new DefaultTreeModel(new TreeConstructor(ctx.getProcessor(DTClasses.class)).construct())); window.getFrame().setVisible(true); } catch (Exception e) { e.printStackTrace(); } } });
File dir = new File(String.format("baselines%s%s", File.separator, ctx.getBuildNumber() == -1 ? "latest" : ctx.getBuildNumber())); if (!dir.exists()) { dir.mkdirs(); FieldReader fieldReader = ctx.getEngineType().getNewFieldReader(); StringTables stringTables = ctx.getProcessor(StringTables.class); DTClasses dtClasses = ctx.getProcessor(DTClasses.class); StringTable baselines = stringTables.forName("instancebaseline");
private void dump(Context ctx, S2NetMessages.CSVCMsg_FlattenedSerializer fs) throws FileNotFoundException { String fileName = "flattables_" + ctx.getBuildNumber() + ".txt"; log.info("writing {}", fileName); PrintStream out = new PrintStream(new FileOutputStream(fileName)); for (S2NetMessages.ProtoFlattenedSerializer_t s : fs.getSerializersList()) { out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"); out.format("%s(%s)\n", fs.getSymbols(s.getSerializerNameSym()), s.getSerializerVersion()); out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"); for (int fi : s.getFieldsIndexList()) { S2NetMessages.ProtoFlattenedSerializerField_t f = fs.getFields(fi); String line = String.format( "type: %-50s name: %-30s node: %-41s serializer: %-35s flags: %8s bitcount: %3s low: %9s high: %9s", String.format("%s%s", fs.getSymbols(f.getVarTypeSym()), f.hasVarEncoderSym() ? String.format(" {%s}", fs.getSymbols(f.getVarEncoderSym())) : ""), fs.getSymbols(f.getVarNameSym()), fs.getSymbols(f.getSendNodeSym()), f.hasFieldSerializerNameSym() ? String.format("%s(%s)", fs.getSymbols(f.getFieldSerializerNameSym()), f.getFieldSerializerVersion()) : "-", f.hasEncodeFlags() ? Integer.toHexString(f.getEncodeFlags()) : "-", f.hasBitCount() ? f.getBitCount() : "-", f.hasLowValue() ? f.getLowValue() : "-", f.hasHighValue() ? f.getHighValue() : "-" ); out.println(line); } out.println(); out.println(); } }
protected void initWithProcessors(Object... processors) { ExecutionModel em = createExecutionModel(processors); context = new Context(em); em.initialize(context); if (evInitRun != null) { evInitRun.raise(); } }
private Entity getEntity(String entityName) { return runner.getContext().getProcessor(Entities.class).getByDtName(getEngineDependentEntityName(entityName)); }
SerializerField protoField = new SerializerField(protoMessage.getSymbols(protoSerializer.getSerializerNameSym()), protoMessage, protoMessage.getFields(fi)); for (Map.Entry<BuildNumberRange, PatchFunc> patchEntry : PATCHES.entrySet()) { if (patchEntry.getKey().appliesTo(ctx.getBuildNumber())) { patchEntry.getValue().execute(protoField);
protected void initWithProcessors(Object... processors) { ExecutionModel em = createExecutionModel(processors); context = new Context(em); em.initialize(context); if (evInitRun != null) { evInitRun.raise(); } }
private Event<OnPostEmbeddedMessage> evOnPostEmbeddedMessage(Class<? extends GeneratedMessage> messageClass) { Event<OnPostEmbeddedMessage> ev = evOnPostEmbeddedMessages.get(messageClass); if (ev == null) { ev = ctx.createEvent(OnPostEmbeddedMessage.class, messageClass, BitStream.class); evOnPostEmbeddedMessages.put(messageClass, ev); } return ev; }
@Override public void bind(Context ctx) throws IllegalAccessException { log.debug("bind %s to context", method); MethodHandle boundHandle = MethodHandles.publicLookup().unreflect(method).bindTo(ctx.getProcessor(processorClass)); if (hasContextParameter()) { boundHandle = boundHandle.bindTo(ctx); } this.methodHandle = boundHandle.asSpreader(Object[].class, arity); }
SerializerField protoField = new SerializerField(protoMessage.getSymbols(protoSerializer.getSerializerNameSym()), protoMessage, protoMessage.getFields(fi)); for (Map.Entry<BuildNumberRange, PatchFunc> patchEntry : PATCHES.entrySet()) { if (patchEntry.getKey().appliesTo(ctx.getBuildNumber())) { patchEntry.getValue().execute(protoField);
@OnTickStart public void onTickStart(Context ctx, boolean synthetic) { tick = ctx.getTick(); count = 0; }
@OnMessage(NetMessages.CSVCMsg_ServerInfo.class) public void processServerInfo(NetMessages.CSVCMsg_ServerInfo serverInfo) { if (engineType.getId() != EngineId.SOURCE2) { return; } Matcher matcher = Pattern.compile("dota_v(\\d+)").matcher(serverInfo.getGameDir()); if (matcher.find()) { int num = Integer.valueOf(matcher.group(1)); ctx.setBuildNumber(num); if (num < 928) { log.warn("This replay is from an early beta version of Dota 2 Reborn (build number %d).", num); log.warn("Entities in this replay probably cannot be read."); log.warn("However, I have not had the opportunity to analyze a replay with that build number."); log.warn("If you wanna help, send it to github@martin.schrodt.org, or contact me on github."); } } else { log.warn("received CSVCMsg_ServerInfo, but could not read build number from it. (game dir '%s')", serverInfo.getGameDir()); } }
public Event<OnMessage> evOnMessage(Class<? extends GeneratedMessage> messageClass) { Event<OnMessage> ev = evOnMessages.get(messageClass); if (ev == null) { ev = ctx.createEvent(OnMessage.class, messageClass); evOnMessages.put(messageClass, ev); } return ev; }
@Override public void bind(Context ctx) throws IllegalAccessException { log.debug("bind %s to context", method); MethodHandle boundHandle = MethodHandles.publicLookup().unreflect(method).bindTo(ctx.getProcessor(processorClass)); if (hasContextParameter()) { boundHandle = boundHandle.bindTo(ctx); } this.methodHandle = boundHandle.asSpreader(Object[].class, arity); }
@OnMessage(S2NetMessages.CSVCMsg_CreateStringTable.class) public void onCreateStringTable(S2NetMessages.CSVCMsg_CreateStringTable message) throws IOException { if (isProcessed(message.getName())) { StringTable table = new StringTable( message.getName(), 100, message.getUserDataFixedSize(), message.getUserDataSize(), message.getUserDataSizeBits(), message.getFlags() ); ByteString data = message.getStringData(); if (message.getDataCompressed()) { byte[] dst; if (context.getBuildNumber() != -1 && context.getBuildNumber() <= 962) { dst = LZSS.unpack(data); } else { dst = Snappy.uncompress(ZeroCopy.extract(data)); } data = ZeroCopy.wrap(dst); } decodeEntries(table, 3, data, message.getNumEntries()); evCreated.raise(numTables, table); } numTables++; }
@OnMessage(GeneratedMessage.class) public void onMessage(Context ctx, GeneratedMessage message) { if (message instanceof S1NetMessages.CSVCMsg_VoiceData || message instanceof S2NetMessages.CSVCMsg_VoiceData) { return; } log.info("{}: {}", ctx.getTick(), message.getClass().getSimpleName()); }
private Event<OnPostEmbeddedMessage> evOnPostEmbeddedMessage(Class<? extends GeneratedMessage> messageClass) { Event<OnPostEmbeddedMessage> ev = evOnPostEmbeddedMessages.get(messageClass); if (ev == null) { ev = ctx.createEvent(OnPostEmbeddedMessage.class, messageClass, BitStream.class); evOnPostEmbeddedMessages.put(messageClass, ev); } return ev; }