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());
}