diff --git a/common/implementation/src/main/java/com/dfsek/terra/event/EventContextImpl.java b/common/implementation/src/main/java/com/dfsek/terra/event/EventContextImpl.java index b087a98c0..bfb929f29 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/event/EventContextImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/event/EventContextImpl.java @@ -3,15 +3,16 @@ package com.dfsek.terra.event; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.event.events.Event; import com.dfsek.terra.api.event.events.FailThroughEvent; -import com.dfsek.terra.api.event.events.PackEvent; import com.dfsek.terra.api.event.functional.EventContext; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; import org.jetbrains.annotations.NotNull; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; -public class EventContextImpl implements EventContext, Comparable> { +public class EventContextImpl implements EventContext, Comparable> { private final List> actions = new ArrayList<>(); private int priority; private boolean failThrough = false; @@ -19,11 +20,14 @@ public class EventContextImpl implements EventContext, Compa private final TerraAddon addon; - private final Class eventClass; + private final Type eventType; - public EventContextImpl(TerraAddon addon, Class eventClass) { + private final FunctionalEventHandlerImpl parent; + + public EventContextImpl(TerraAddon addon, Type eventType, FunctionalEventHandlerImpl parent) { this.addon = addon; - this.eventClass = eventClass; + this.eventType = eventType; + this.parent = parent; } public void handle(T event) { @@ -39,13 +43,14 @@ public class EventContextImpl implements EventContext, Compa @Override public EventContext priority(int priority) { this.priority = priority; + parent.recomputePriorities(eventType); return this; } @Override public EventContext failThrough() { - if(!FailThroughEvent.class.isAssignableFrom(eventClass)) { - throw new IllegalStateException("Cannot fail-through on event which does not implement FailThroughEvent: " + eventClass.getCanonicalName()); + if(!FailThroughEvent.class.isAssignableFrom(ReflectionUtil.getRawType(eventType))) { + throw new IllegalStateException("Cannot fail-through on event which does not implement FailThroughEvent: " + ReflectionUtil.typeToString(eventType)); } this.failThrough = true; return this; @@ -58,7 +63,7 @@ public class EventContextImpl implements EventContext, Compa } @Override - public int compareTo(@NotNull EventContextImpl o) { + public int compareTo(@NotNull EventContextImpl o) { return this.priority - o.priority; } diff --git a/common/implementation/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java b/common/implementation/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java index 941c7b673..0e3ada116 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java @@ -14,6 +14,7 @@ import java.io.StringWriter; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -52,16 +53,19 @@ public class FunctionalEventHandlerImpl implements FunctionalEventHandler { @Override public EventContext register(TerraAddon addon, Class clazz) { - EventContextImpl eventContext = new EventContextImpl<>(addon, clazz); + EventContextImpl eventContext = new EventContextImpl<>(addon, clazz, this); contextMap.computeIfAbsent(clazz, c -> new ArrayList<>()).add(eventContext); return eventContext; } - @SuppressWarnings("unchecked") @Override public EventContext register(TerraAddon addon, TypeKey clazz) { - EventContextImpl eventContext = new EventContextImpl<>(addon, (Class) clazz.getRawType()); + EventContextImpl eventContext = new EventContextImpl<>(addon, clazz.getType(), this); contextMap.computeIfAbsent(clazz.getType(), c -> new ArrayList<>()).add(eventContext); return eventContext; } + + public void recomputePriorities(Type target) { + contextMap.get(target).sort(Comparator.naturalOrder()); + } }