diff --git a/core-api/src/main/java/dev/compactmods/machines/api/event/IEventListenerList.java b/core-api/src/main/java/dev/compactmods/machines/api/event/IEventListenerList.java new file mode 100644 index 00000000..9ae7b520 --- /dev/null +++ b/core-api/src/main/java/dev/compactmods/machines/api/event/IEventListenerList.java @@ -0,0 +1,19 @@ +package dev.compactmods.machines.api.event; + +import java.util.stream.Stream; + +/** + * Used to gather a list of listeners. + * + * @param Base Class used for the event listeners + */ +public interface IEventListenerList { + void addListener(B listener); + + default void addListener(Class eClass, E listener) { + addListener(listener); + } + + Stream getListeners(); + +} diff --git a/core-api/src/main/java/dev/compactmods/machines/api/room/upgrade/RoomUpgrade.java b/core-api/src/main/java/dev/compactmods/machines/api/room/upgrade/RoomUpgrade.java index 338a35d6..4df4607d 100644 --- a/core-api/src/main/java/dev/compactmods/machines/api/room/upgrade/RoomUpgrade.java +++ b/core-api/src/main/java/dev/compactmods/machines/api/room/upgrade/RoomUpgrade.java @@ -1,5 +1,6 @@ package dev.compactmods.machines.api.room.upgrade; +import dev.compactmods.machines.api.event.IEventListenerList; import dev.compactmods.machines.api.room.upgrade.events.RoomUpgradeEvent; import net.minecraft.world.flag.FeatureElement; import net.minecraft.world.item.ItemStack; @@ -11,7 +12,5 @@ public interface RoomUpgrade extends TooltipProvider { RoomUpgradeType getType(); - default Stream gatherEvents() { - return Stream.empty(); - } + default void gatherEvents(IEventListenerList listenerList) {} } diff --git a/neoforge-main/src/main/java/dev/compactmods/machines/event/EventListenerList.java b/neoforge-main/src/main/java/dev/compactmods/machines/event/EventListenerList.java new file mode 100644 index 00000000..211fb470 --- /dev/null +++ b/neoforge-main/src/main/java/dev/compactmods/machines/event/EventListenerList.java @@ -0,0 +1,31 @@ +package dev.compactmods.machines.event; + +import dev.compactmods.machines.api.event.IEventListenerList; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +/** + * Used to gather a list of listeners. + * An implementation of {@link IEventListenerList} + * + * @param Base Class used for the event listeners + */ +public final class EventListenerList implements IEventListenerList { + public static EventListenerList createList() { + return new EventListenerList<>(); + } + + private final List listeners = new ArrayList<>(); + + private EventListenerList() {} + + public void addListener(B listener) { + this.listeners.add(listener); + } + + public Stream getListeners() { + return listeners.stream(); + } +} diff --git a/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgradeEventHandlers.java b/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgradeEventHandlers.java index 9cac500c..95020f6b 100644 --- a/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgradeEventHandlers.java +++ b/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/RoomUpgradeEventHandlers.java @@ -3,7 +3,10 @@ import dev.compactmods.machines.CompactMachinesCommon; import dev.compactmods.machines.api.CompactMachines; import dev.compactmods.machines.api.dimension.CompactDimension; +import dev.compactmods.machines.api.event.IEventListenerList; +import dev.compactmods.machines.api.room.upgrade.events.RoomUpgradeEvent; import dev.compactmods.machines.api.room.upgrade.events.lifecycle.UpgradeTickedEventListener; +import dev.compactmods.machines.event.EventListenerList; import dev.compactmods.machines.feature.CMFeatureFlags; import dev.compactmods.machines.room.Rooms; import net.minecraft.network.chat.Component; @@ -38,13 +41,15 @@ public static void onLevelTick(LevelTickEvent.Post postTick) { for (final var upgradeStack : upgradeStacks) { final var upgrades = upgradeStack.get(RoomUpgrades.UPGRADE_LIST_COMPONENT); + final IEventListenerList listenerList = EventListenerList.createList(); upgrades.upgrades() - .stream() - .flatMap(ru -> ru.gatherEvents().filter(UpgradeTickedEventListener.class::isInstance)) - .map(UpgradeTickedEventListener.class::cast) - .forEach(ticker -> { - ticker.handle(serverLevel, room, upgradeStack); - }); + .forEach(upgrade -> upgrade.gatherEvents(listenerList)); + listenerList.getListeners() + .filter(UpgradeTickedEventListener.class::isInstance) + .map(UpgradeTickedEventListener.class::cast) + .forEach(ticker -> { + ticker.handle(serverLevel, room, upgradeStack); + }); } }); } diff --git a/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/example/TreeCutterUpgrade.java b/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/example/TreeCutterUpgrade.java index 4c1abda4..809c1953 100644 --- a/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/example/TreeCutterUpgrade.java +++ b/neoforge-main/src/main/java/dev/compactmods/machines/room/upgrade/example/TreeCutterUpgrade.java @@ -1,6 +1,7 @@ package dev.compactmods.machines.room.upgrade.example; import com.mojang.serialization.MapCodec; +import dev.compactmods.machines.api.event.IEventListenerList; import dev.compactmods.machines.api.room.RoomInstance; import dev.compactmods.machines.api.room.upgrade.RoomUpgrade; import dev.compactmods.machines.api.room.upgrade.RoomUpgradeType; @@ -48,9 +49,8 @@ public void addToTooltip(@NotNull Item.TooltipContext ctx, Consumer t } @Override - public Stream gatherEvents() { - final UpgradeTickedEventListener ticker = TreeCutterUpgrade::onTick; - return Stream.of(ticker); + public void gatherEvents(IEventListenerList listenerList) { + listenerList.addListener(UpgradeTickedEventListener.class, TreeCutterUpgrade::onTick); } @Override