diff --git a/pom.xml b/pom.xml index bbf5b0d2..6f20e3c3 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ com.skadistats clarity - 3.1.3 + 4.0.0 @@ -77,18 +77,13 @@ opendota.Main - + + META-INF/clarity/providers.txt + - - - org.atteo.classindex - classindex-transformer - 3.4 - - maven-compiler-plugin diff --git a/src/main/java/opendota/Parse.java b/src/main/java/opendota/Parse.java index 940f350f..72356533 100644 --- a/src/main/java/opendota/Parse.java +++ b/src/main/java/opendota/Parse.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.google.protobuf.GeneratedMessage; import skadistats.clarity.io.Util; +import skadistats.clarity.model.DTClass; import skadistats.clarity.model.Entity; import skadistats.clarity.model.FieldPath; import skadistats.clarity.model.StringTable; @@ -25,7 +26,7 @@ import skadistats.clarity.wire.dota.common.proto.DOTAUserMessages.CDOTAUserMsg_ChatWheel; import skadistats.clarity.wire.dota.common.proto.DOTAUserMessages.CDOTAUserMsg_LocationPing; import skadistats.clarity.wire.dota.common.proto.DOTAUserMessages.CDOTAUserMsg_SpectatorPlayerUnitOrders; -import skadistats.clarity.wire.dota.common.proto.DOTAUserMessages.DOTA_COMBATLOG_TYPES; +import skadistats.clarity.wire.dota.common.proto.DOTACombatLog.DOTA_COMBATLOG_TYPES; import skadistats.clarity.wire.dota.s2.proto.DOTAS2GcMessagesCommon.CMsgDOTAMatch; import skadistats.clarity.wire.shared.s1.proto.S1UserMessages.CUserMsg_SayText2; import skadistats.clarity.wire.shared.s2.proto.S2UserMessages.CUserMessageSayText2; @@ -941,6 +942,9 @@ private Integer getAbilityEntityStringTableIndex(Entity e) { return idx; } + private final Object fpAbsent = new Object(); + private final IdentityHashMap> fpCache = new IdentityHashMap<>(); + public T getEntityProperty(Entity e, String property, Integer idx) { try { if (e == null) { @@ -949,11 +953,22 @@ public T getEntityProperty(Entity e, String property, Integer idx) { if (idx != null) { property = property.replace("%i", Util.arrayIdxToString(idx)); } - FieldPath fp = e.getDtClass().getFieldPathForName(property); - if (fp == null) { + DTClass dt = e.getDtClass(); + HashMap perClass = fpCache.get(dt); + if (perClass == null) { + perClass = new HashMap<>(); + fpCache.put(dt, perClass); + } + Object cached = perClass.get(property); + if (cached == null) { + FieldPath resolved = dt.getFieldPathForName(property); + cached = resolved == null ? fpAbsent : resolved; + perClass.put(property, cached); + } + if (cached == fpAbsent) { return null; } - return e.getPropertyForFieldPath(fp); + return e.getPropertyForFieldPath((FieldPath) cached); } catch (Exception ex) { return null; } diff --git a/src/main/java/opendota/combatlogvisitors/GreevilsGreedVisitor.java b/src/main/java/opendota/combatlogvisitors/GreevilsGreedVisitor.java index 5d362673..ec403553 100644 --- a/src/main/java/opendota/combatlogvisitors/GreevilsGreedVisitor.java +++ b/src/main/java/opendota/combatlogvisitors/GreevilsGreedVisitor.java @@ -6,7 +6,7 @@ import java.util.Set; import skadistats.clarity.model.CombatLogEntry; -import skadistats.clarity.wire.dota.common.proto.DOTAUserMessages.DOTA_COMBATLOG_TYPES; +import skadistats.clarity.wire.dota.common.proto.DOTACombatLog.DOTA_COMBATLOG_TYPES; public class GreevilsGreedVisitor implements Visitor { diff --git a/src/main/java/opendota/combatlogvisitors/TrackVisitor.java b/src/main/java/opendota/combatlogvisitors/TrackVisitor.java index 3137b6d8..3b0ff316 100644 --- a/src/main/java/opendota/combatlogvisitors/TrackVisitor.java +++ b/src/main/java/opendota/combatlogvisitors/TrackVisitor.java @@ -3,7 +3,7 @@ import java.util.HashMap; import skadistats.clarity.model.CombatLogEntry; -import skadistats.clarity.wire.dota.common.proto.DOTAUserMessages.DOTA_COMBATLOG_TYPES; +import skadistats.clarity.wire.dota.common.proto.DOTACombatLog.DOTA_COMBATLOG_TYPES; public class TrackVisitor implements Visitor { diff --git a/src/main/java/opendota/processors/warding/OnWardExpired.java b/src/main/java/opendota/processors/warding/OnWardExpired.java index 296f626b..fa662e26 100644 --- a/src/main/java/opendota/processors/warding/OnWardExpired.java +++ b/src/main/java/opendota/processors/warding/OnWardExpired.java @@ -1,5 +1,7 @@ package opendota.processors.warding; +import skadistats.clarity.event.EventBase; +import skadistats.clarity.event.GenerateEvent; import skadistats.clarity.event.UsagePointMarker; import skadistats.clarity.event.UsagePointType; import skadistats.clarity.model.Entity; @@ -11,7 +13,14 @@ @Retention(RetentionPolicy.RUNTIME) @Target(value = ElementType.METHOD) -@UsagePointMarker(value = UsagePointType.EVENT_LISTENER, parameterClasses = { Entity.class }) -public @interface OnWardExpired { -} +@UsagePointMarker(value = UsagePointType.EVENT_LISTENER) +@GenerateEvent +public @interface OnWardExpired { + interface Listener { + void invoke(Entity e); + } + interface Event extends EventBase { + void raise(Entity e); + } +} diff --git a/src/main/java/opendota/processors/warding/OnWardKilled.java b/src/main/java/opendota/processors/warding/OnWardKilled.java index 414660eb..add0b457 100644 --- a/src/main/java/opendota/processors/warding/OnWardKilled.java +++ b/src/main/java/opendota/processors/warding/OnWardKilled.java @@ -1,5 +1,7 @@ package opendota.processors.warding; +import skadistats.clarity.event.EventBase; +import skadistats.clarity.event.GenerateEvent; import skadistats.clarity.event.UsagePointMarker; import skadistats.clarity.event.UsagePointType; import skadistats.clarity.model.Entity; @@ -11,7 +13,14 @@ @Retention(RetentionPolicy.RUNTIME) @Target(value = ElementType.METHOD) -@UsagePointMarker(value = UsagePointType.EVENT_LISTENER, parameterClasses = { Entity.class, String.class }) -public @interface OnWardKilled { -} +@UsagePointMarker(value = UsagePointType.EVENT_LISTENER) +@GenerateEvent +public @interface OnWardKilled { + interface Listener { + void invoke(Entity e, String killerHeroName); + } + interface Event extends EventBase { + void raise(Entity e, String killerHeroName); + } +} diff --git a/src/main/java/opendota/processors/warding/OnWardPlaced.java b/src/main/java/opendota/processors/warding/OnWardPlaced.java index b2737003..66cf2499 100644 --- a/src/main/java/opendota/processors/warding/OnWardPlaced.java +++ b/src/main/java/opendota/processors/warding/OnWardPlaced.java @@ -1,5 +1,7 @@ package opendota.processors.warding; +import skadistats.clarity.event.EventBase; +import skadistats.clarity.event.GenerateEvent; import skadistats.clarity.event.UsagePointMarker; import skadistats.clarity.event.UsagePointType; import skadistats.clarity.model.Entity; @@ -11,7 +13,14 @@ @Retention(RetentionPolicy.RUNTIME) @Target(value = ElementType.METHOD) -@UsagePointMarker(value = UsagePointType.EVENT_LISTENER, parameterClasses = { Entity.class }) -public @interface OnWardPlaced { -} +@UsagePointMarker(value = UsagePointType.EVENT_LISTENER) +@GenerateEvent +public @interface OnWardPlaced { + interface Listener { + void invoke(Entity e); + } + interface Event extends EventBase { + void raise(Entity e); + } +} diff --git a/src/main/java/opendota/processors/warding/Wards.java b/src/main/java/opendota/processors/warding/Wards.java index 8ac22a10..c9e6573c 100644 --- a/src/main/java/opendota/processors/warding/Wards.java +++ b/src/main/java/opendota/processors/warding/Wards.java @@ -22,7 +22,7 @@ import skadistats.clarity.processor.gameevents.OnCombatLogEntry; import skadistats.clarity.processor.reader.OnTickEnd; import skadistats.clarity.processor.runner.Context; -import skadistats.clarity.wire.dota.common.proto.DOTAUserMessages; +import skadistats.clarity.wire.dota.common.proto.DOTACombatLog; /** * @author micaelbergeron @@ -56,9 +56,9 @@ public class Wards { private final Map> wardKillersByWardClass = new HashMap<>(); private Queue toProcess = new ArrayDeque<>(); - private Event evKilled; - private Event evExpired; - private Event evPlaced; + private OnWardKilled.Event evKilled; + private OnWardExpired.Event evExpired; + private OnWardPlaced.Event evPlaced; private class ProcessEntityCommand { @@ -73,17 +73,17 @@ public ProcessEntityCommand(Entity e, FieldPath p) { @Initializer(OnWardKilled.class) public void initOnWardKilled(final Context ctx, final EventListener listener) { - evKilled = ctx.createEvent(OnWardKilled.class, Entity.class, String.class); + evKilled = (OnWardKilled.Event) ctx.createEvent(OnWardKilled.class); } - + @Initializer(OnWardExpired.class) public void initOnWardExpired(final Context ctx, final EventListener listener) { - evExpired = ctx.createEvent(OnWardExpired.class, Entity.class); + evExpired = (OnWardExpired.Event) ctx.createEvent(OnWardExpired.class); } - + @Initializer(OnWardPlaced.class) public void initOnWardPlaced(final Context ctx, final EventListener listener) { - evPlaced = ctx.createEvent(OnWardPlaced.class, Entity.class); + evPlaced = (OnWardPlaced.Event) ctx.createEvent(OnWardPlaced.class); } public Wards() { @@ -163,7 +163,7 @@ private boolean isWard(Entity e) { } private boolean isWardDeath(CombatLogEntry e) { - return e.getType().equals(DOTAUserMessages.DOTA_COMBATLOG_TYPES.DOTA_COMBATLOG_DEATH) + return e.getType().equals(DOTACombatLog.DOTA_COMBATLOG_TYPES.DOTA_COMBATLOG_DEATH) && WARDS_TARGET_NAMES.contains(e.getTargetName()); }