From ba4ce4e30d5778d0ad00c163823dc5abb8b78b76 Mon Sep 17 00:00:00 2001 From: syeyoung <42869671+cyoung06@users.noreply.github.com> Date: Sat, 14 Jan 2023 03:16:22 +0900 Subject: Dg4.0 eventpropagation (#270) * - Event Handler Interface -> Annotations (for features) Signed-off-by: syeyoung * - Event Handler Interface -> Annotations (for features) Signed-off-by: syeyoung * - profiling - build.gradle update Signed-off-by: syeyoung Signed-off-by: syeyoung --- .../syeyoung/dungeonsguide/mod/DungeonsGuide.java | 10 +- .../dungeonsguide/mod/commands/CommandDgDebug.java | 10 +- .../mod/events/annotations/DGEventHandler.java | 32 ++ .../events/annotations/EventHandlerRegistry.java | 150 ++++++ .../mod/events/impl/AuthChangedEvent.java | 24 - .../dungeonsguide/mod/events/impl/DGTickEvent.java | 24 + .../mod/events/listener/DungeonListener.java | 2 +- .../mod/events/listener/FeatureListener.java | 513 --------------------- .../mod/features/AbstractFeature.java | 2 +- .../mod/features/FeatureRegistry.java | 3 + .../dungeonsguide/mod/features/GuiFeature.java | 12 +- .../dungeonsguide/mod/features/IFeature.java | 28 ++ .../features/impl/advanced/FeatureTestPepole.java | 13 +- .../mod/features/impl/boss/FeatureAutoReparty.java | 9 +- .../features/impl/boss/FeatureBoxRealLivid.java | 10 +- .../mod/features/impl/boss/FeatureChestPrice.java | 6 +- .../mod/features/impl/boss/FeatureHideAnimals.java | 11 +- .../impl/boss/FeatureThornSpiritBowTimer.java | 14 +- .../impl/boss/terminal/FeatureSimonSaysSolver.java | 19 +- .../impl/boss/terminal/FeatureTerminalSolvers.java | 17 +- .../discord/inviteViewer/PartyInviteViewer.java | 22 +- .../impl/discord/onlinealarm/PlayingDGAlarm.java | 20 +- .../mod/features/impl/dungeon/FeatureBoxBats.java | 10 +- .../impl/dungeon/FeatureBoxSkelemaster.java | 10 +- .../features/impl/dungeon/FeatureBoxStarMobs.java | 10 +- .../dungeon/FeatureDungeonCurrentRoomSecrets.java | 6 +- .../impl/dungeon/FeatureDungeonDeaths.java | 6 +- .../features/impl/dungeon/FeatureDungeonMap.java | 21 +- .../impl/dungeon/FeatureDungeonMilestone.java | 6 +- .../impl/dungeon/FeatureDungeonRealTime.java | 17 +- .../features/impl/dungeon/FeatureHideNameTags.java | 11 +- .../features/impl/dungeon/FeaturePlayerESP.java | 10 +- .../dungeon/FeaturePressAnyKeyToCloseChest.java | 9 +- .../impl/dungeon/FeatureWatcherWarning.java | 12 +- .../impl/etc/FeatureAutoAcceptReparty.java | 7 +- .../features/impl/etc/FeatureCooldownCounter.java | 12 +- .../mod/features/impl/etc/FeatureCopyMessages.java | 6 +- .../impl/etc/FeatureDecreaseExplosionSound.java | 6 +- .../features/impl/etc/FeatureDisableMessage.java | 6 +- .../features/impl/etc/FeatureEpicCountdown.java | 14 +- .../mod/features/impl/etc/FeaturePenguins.java | 12 +- .../impl/etc/FeatureTooltipDungeonStat.java | 6 +- .../mod/features/impl/etc/FeatureTooltipPrice.java | 6 +- .../mod/features/impl/etc/FeatureUpdateAlarm.java | 13 +- .../impl/etc/ability/FeatureAbilityCooldown.java | 13 +- .../mod/features/impl/party/APIKey.java | 6 +- .../features/impl/party/FeatureGoodParties.java | 6 +- .../mod/features/impl/party/FeaturePartyReady.java | 12 +- .../party/customgui/FeatureCustomPartyFinder.java | 9 +- .../FeatureViewPlayerStatsOnJoin.java | 9 +- .../mod/features/impl/secret/FeatureBloodRush.java | 6 +- .../impl/secret/FeatureFreezePathfind.java | 6 +- .../impl/secret/FeatureSoulRoomWarning.java | 9 +- .../impl/secret/FeatureTogglePathfind.java | 6 +- .../mechanicbrowser/FeatureMechanicBrowse.java | 21 +- .../features/listener/BossroomEnterListener.java | 23 - .../mod/features/listener/ChatListener.java | 25 - .../mod/features/listener/ChatListenerGlobal.java | 25 - .../listener/DiscordUserJoinRequestListener.java | 27 -- .../listener/DiscordUserUpdateListener.java | 25 - .../DungeonContextInitializationListener.java | 23 - .../mod/features/listener/DungeonEndListener.java | 23 - .../mod/features/listener/DungeonQuitListener.java | 23 - .../features/listener/DungeonStartListener.java | 23 - .../listener/EntityLivingRenderListener.java | 26 -- .../listener/GuiBackgroundRenderListener.java | 25 - .../mod/features/listener/GuiClickListener.java | 25 - .../mod/features/listener/GuiOpenListener.java | 25 - .../features/listener/GuiPostRenderListener.java | 25 - .../features/listener/GuiPreRenderListener.java | 25 - .../mod/features/listener/GuiUpdateListener.java | 25 - .../mod/features/listener/InteractListener.java | 25 - .../mod/features/listener/KeyInputListener.java | 25 - .../features/listener/KeybindPressedListener.java | 25 - .../features/listener/PlayerRenderListener.java | 26 -- .../features/listener/ScreenRenderListener.java | 23 - .../features/listener/SkyblockJoinListener.java | 23 - .../features/listener/SkyblockLeaveListener.java | 23 - .../mod/features/listener/SoundListener.java | 25 - .../features/listener/StompConnectedListener.java | 25 - .../features/listener/TextureStichListener.java | 25 - .../mod/features/listener/TickListener.java | 23 - .../mod/features/listener/TitleListener.java | 25 - .../mod/features/listener/TooltipListener.java | 25 - .../mod/features/listener/WorldRenderListener.java | 23 - .../mod/features/text/StyledTextRenderer.java | 21 + .../syeyoung/dungeonsguide/mod/utils/AhUtils.java | 2 +- 87 files changed, 509 insertions(+), 1518 deletions(-) create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/annotations/DGEventHandler.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/annotations/EventHandlerRegistry.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/AuthChangedEvent.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DGTickEvent.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/FeatureListener.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/IFeature.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/BossroomEnterListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/ChatListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/ChatListenerGlobal.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DiscordUserJoinRequestListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DiscordUserUpdateListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DungeonContextInitializationListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DungeonEndListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DungeonQuitListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DungeonStartListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/EntityLivingRenderListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiBackgroundRenderListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiClickListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiOpenListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiPostRenderListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiPreRenderListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiUpdateListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/InteractListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/KeyInputListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/KeybindPressedListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/PlayerRenderListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/ScreenRenderListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/SkyblockJoinListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/SkyblockLeaveListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/SoundListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/StompConnectedListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/TextureStichListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/TickListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/TitleListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/TooltipListener.java delete mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/WorldRenderListener.java (limited to 'mod/src/main/java/kr') diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/DungeonsGuide.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/DungeonsGuide.java index 9dd515c7..d54613b8 100755 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/DungeonsGuide.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/DungeonsGuide.java @@ -32,8 +32,8 @@ import kr.syeyoung.dungeonsguide.mod.cosmetics.CustomNetworkPlayerInfo; import kr.syeyoung.dungeonsguide.mod.discord.gamesdk.GameSDK; import kr.syeyoung.dungeonsguide.mod.discord.rpc.RichPresenceManager; import kr.syeyoung.dungeonsguide.mod.dungeon.DungeonFacade; +import kr.syeyoung.dungeonsguide.mod.events.annotations.EventHandlerRegistry; import kr.syeyoung.dungeonsguide.mod.events.listener.DungeonListener; -import kr.syeyoung.dungeonsguide.mod.events.listener.FeatureListener; import kr.syeyoung.dungeonsguide.mod.events.listener.PacketListener; import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; import kr.syeyoung.dungeonsguide.mod.party.PartyManager; @@ -54,7 +54,6 @@ import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.client.renderer.ThreadDownloadImageData; -import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.ITextureObject; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.resources.IResourceManager; @@ -62,8 +61,6 @@ import net.minecraft.client.resources.IResourcePack; import net.minecraft.command.CommandHandler; import net.minecraft.command.ICommand; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.launchwrapper.LaunchClassLoader; import net.minecraft.network.play.server.S38PacketPlayerListItem; import net.minecraft.util.ResourceLocation; @@ -227,7 +224,7 @@ public class DungeonsGuide implements DGInterface { registerEventsForge(commandReparty = new CommandReparty()); - registerEventsForge(new FeatureListener()); +// registerEventsForge(new FeatureListener()); registerEventsForge(packetListener = new PacketListener()); registerEventsForge(new Keybinds()); @@ -298,6 +295,9 @@ public class DungeonsGuide implements DGInterface { for (Object registeredListener : registeredListeners) { MinecraftForge.EVENT_BUS.unregister(registeredListener); } + + EventHandlerRegistry.unregisterListeners(); + List all = ReflectionHelper.getPrivateValue(ListenerList.class, null, "allLists"); int busId = ReflectionHelper.getPrivateValue(EventBus.class, MinecraftForge.EVENT_BUS, "busID"); for (ListenerList listenerList : all) { diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java index 5b553bdc..c3c8f581 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java @@ -459,10 +459,12 @@ public class CommandDgDebug extends CommandBase { } else if ("testgui".equals(arg)) { GuiScreenAdapter adapter = new GuiScreenAdapter(new TestView()); new Thread(DungeonsGuide.THREAD_GROUP, () -> { - Minecraft.getMinecraft().addScheduledTask(() -> { - Minecraft.getMinecraft().displayGuiScreen(adapter); - }); - }).start(); + Minecraft.getMinecraft().addScheduledTask(() -> { + Minecraft.getMinecraft().displayGuiScreen(adapter); + }); + }).start(); + } else if ("clearprofile".equals(arg)) { + Minecraft.getMinecraft().mcProfiler.clearProfiling(); } else { sender.addChatMessage(new ChatComponentText("ain't gonna find much anything here")); sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg loadrooms §7-§f Reloads dungeon roomdata.")); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/annotations/DGEventHandler.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/annotations/DGEventHandler.java new file mode 100644 index 00000000..9bc3384e --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/annotations/DGEventHandler.java @@ -0,0 +1,32 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.mod.events.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface DGEventHandler { + boolean triggerOutOfSkyblock() default false; + + boolean ignoreDisabled() default false; +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/annotations/EventHandlerRegistry.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/annotations/EventHandlerRegistry.java new file mode 100644 index 00000000..914652b7 --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/annotations/EventHandlerRegistry.java @@ -0,0 +1,150 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.mod.events.annotations; + +import kr.syeyoung.dungeonsguide.mod.SkyblockStatus; +import kr.syeyoung.dungeonsguide.mod.features.AbstractFeature; +import kr.syeyoung.dungeonsguide.mod.features.IFeature; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.minecraft.client.Minecraft; +import net.minecraft.profiler.Profiler; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.fml.common.eventhandler.EventBus; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.IEventListener; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; +import java.util.function.Supplier; + +public class EventHandlerRegistry { + public static Logger logger = LogManager.getLogger("DG-EventPropagator"); + + public static final Map> targets = new HashMap<>(); + + @AllArgsConstructor + @Getter + private static class InvocationTarget { + private final Class targetEvent; + private final IFeature feature; + private final String targetName; + private final Supplier condition; + private final MethodHandle invokeSite; + } + + private static final int busID; + static { + try { + Field f = EventBus.class.getDeclaredField("busID"); + f.setAccessible(true); + busID = (int) f.get(MinecraftForge.EVENT_BUS); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public static void registerEvents(IFeature feature) { + Class clazz = feature.getClass(); + while (clazz != null) { + for (Method declaredMethod : clazz.getDeclaredMethods()) { + declaredMethod.setAccessible(true); + DGEventHandler dgEventHandler = declaredMethod.getAnnotation(DGEventHandler.class); + if (dgEventHandler == null) continue; + if (declaredMethod.getParameterTypes().length != 1) + throw new RuntimeException("Too much or too less parameers: "+declaredMethod.getName()+" on "+clazz.getName()); + Class eventType = declaredMethod.getParameterTypes()[0]; + if (!targets.containsKey(eventType)) targets.put(eventType, new LinkedList<>()); + + boolean force = dgEventHandler.ignoreDisabled(); + boolean sb = dgEventHandler.triggerOutOfSkyblock(); + + Supplier booleanSupplier = + force && sb ? null : + force ? SkyblockStatus::isOnSkyblock : + sb ? feature::isEnabled : () -> SkyblockStatus.isOnSkyblock() && feature.isEnabled(); + + try { + InvocationTarget target = new InvocationTarget( + eventType, + feature, + (feature.getClass().getSimpleName() + ":" + declaredMethod.getName()).replace(".", "/"), + booleanSupplier, + MethodHandles.publicLookup().unreflect(declaredMethod).bindTo(feature) + ); + targets.get(eventType).add(target); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); // this shouldn't happen. + } + + } + clazz = clazz.getSuperclass(); + } + registerActualListeners(); + } + + private static Map registeredHandlers = new HashMap<>(); + + public static void registerActualListeners() { + for (Class aClass : targets.keySet()) { + if (registeredHandlers.containsKey(aClass)) continue; + try { + Event ev = aClass.getConstructor().newInstance(); + List targetList = targets.get(aClass); + Profiler profiler = Minecraft.getMinecraft().mcProfiler; + IEventListener registered; + ev.getListenerList().register(busID, EventPriority.NORMAL, registered = (event) -> { + profiler.startSection("Dungeons Guide Event Handling"); + for (InvocationTarget target : targetList) { + profiler.startSection(target.getTargetName()); + try { + if (target.condition == null || (target.condition.get() == Boolean.TRUE)) // it is safe to use this here. + target.invokeSite.invoke(event); + } catch (Throwable e) { + logger.error("An error occured while handling event: \nFeature = " + target.getFeature().getClass().getName(), e); + } + profiler.endSection(); + } + profiler.endSection(); + }); + registeredHandlers.put(ev, registered); + } catch (Exception e) { + throw new RuntimeException("An error occured while registering listener for "+aClass.getName(), e); + } + } + } + + public static void unregisterListeners() { + for (Map.Entry eventIEventListenerEntry : registeredHandlers.entrySet()) { + eventIEventListenerEntry.getKey().getListenerList().unregister(busID, eventIEventListenerEntry.getValue()); + } + registeredHandlers.clear(); + } +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/AuthChangedEvent.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/AuthChangedEvent.java deleted file mode 100644 index 4e066d85..00000000 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/AuthChangedEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2022 cyoung06 (syeyoung) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package kr.syeyoung.dungeonsguide.mod.events.impl; - - -import net.minecraftforge.fml.common.eventhandler.Event; - -public class AuthChangedEvent extends Event { } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DGTickEvent.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DGTickEvent.java new file mode 100644 index 00000000..737c797f --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DGTickEvent.java @@ -0,0 +1,24 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.mod.events.impl; + +import net.minecraftforge.fml.common.eventhandler.Event; + +public class DGTickEvent extends Event { +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java index 247a9284..4bafe9f0 100755 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java @@ -147,7 +147,7 @@ public class DungeonListener { @SubscribeEvent public void onTick(TickEvent.ClientTickEvent ev) { if (ev.side == Side.SERVER || ev.phase != TickEvent.Phase.START) return; - + MinecraftForge.EVENT_BUS.post(new DGTickEvent()); if (SkyblockStatus.isOnSkyblock()) { DungeonContext context = DungeonsGuide.getDungeonsGuide().getDungeonFacade().getContext(); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/FeatureListener.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/FeatureListener.java deleted file mode 100644 index b6872c00..00000000 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/FeatureListener.java +++ /dev/null @@ -1,513 +0,0 @@ -/* - * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2021 cyoung06 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package kr.syeyoung.dungeonsguide.mod.events.listener; - - -import kr.syeyoung.dungeonsguide.mod.SkyblockStatus; -import kr.syeyoung.dungeonsguide.mod.config.guiconfig.location.GuiGuiLocationConfig; -import kr.syeyoung.dungeonsguide.mod.events.impl.*; -import kr.syeyoung.dungeonsguide.mod.features.AbstractFeature; -import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; -import kr.syeyoung.dungeonsguide.mod.features.GuiFeature; -import kr.syeyoung.dungeonsguide.mod.features.listener.*; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraftforge.client.event.*; -import net.minecraftforge.client.event.sound.PlaySoundEvent; -import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; - -public class FeatureListener { - @SubscribeEvent - public void onRender(RenderGameOverlayEvent.Post postRender) { - try { - boolean isLocConfig = Minecraft.getMinecraft().currentScreen instanceof GuiGuiLocationConfig; - - if (!(postRender.type == RenderGameOverlayEvent.ElementType.EXPERIENCE || postRender.type == RenderGameOverlayEvent.ElementType.JUMPBAR)) return; - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof ScreenRenderListener && (!isLocConfig || !(abstractFeature instanceof GuiFeature))) { - ((ScreenRenderListener) abstractFeature).drawScreen(postRender.partialTicks); - } - } - GlStateManager.enableBlend(); - } catch (Throwable t) { - t.printStackTrace(); - } - } - - @SubscribeEvent - public void onKeybindPress(KeyBindPressedEvent keyBindPressedEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof KeybindPressedListener) { - ((KeybindPressedListener) abstractFeature).onKeybindPress(keyBindPressedEvent); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - @SubscribeEvent - public void onStomp(StompConnectedEvent stompConnectedEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof StompConnectedListener) { - ((StompConnectedListener) abstractFeature).onStompConnected(stompConnectedEvent); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onStomp(TextureStitchEvent.Pre textureStitchEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof TextureStichListener) { - ((TextureStichListener) abstractFeature).onTextureStitch(textureStitchEvent); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onStomp(TextureStitchEvent.Post textureStitchEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof TextureStichListener) { - ((TextureStichListener) abstractFeature).onTextureStitch(textureStitchEvent); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onDiscordUserUpdate(DiscordUserUpdateEvent discordUserUpdateEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof DiscordUserUpdateListener) { - ((DiscordUserUpdateListener) abstractFeature).onDiscordUserUpdate(discordUserUpdateEvent); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onDiscordUserUpdate(DiscordUserJoinRequestEvent discordUserUpdateEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof DiscordUserJoinRequestListener) { - ((DiscordUserJoinRequestListener) abstractFeature).onDiscordUserJoinRequest(discordUserUpdateEvent); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onWindowUpdate(WindowUpdateEvent windowUpdateEvent) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof GuiUpdateListener) { - ((GuiUpdateListener) abstractFeature).onGuiUpdate(windowUpdateEvent); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onRender(RenderLivingEvent.Pre preRender) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof EntityLivingRenderListener) { - ((EntityLivingRenderListener) abstractFeature).onEntityRenderPre(preRender); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - @SubscribeEvent - public void onSound(PlaySoundEvent soundEvent) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof SoundListener) { - ((SoundListener) abstractFeature).onSound(soundEvent); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - @SubscribeEvent - public void onRender(RenderLivingEvent.Post preRender) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof EntityLivingRenderListener) { - ((EntityLivingRenderListener) abstractFeature).onEntityRenderPost(preRender); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onRender(TitleEvent titleEvent) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof TitleListener) { - ((TitleListener) abstractFeature).onTitle(titleEvent.getPacketTitle()); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onRender(RenderPlayerEvent.Pre preRender) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof PlayerRenderListener) { - ((PlayerRenderListener) abstractFeature).onEntityRenderPre(preRender); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onRender(RenderPlayerEvent.Post preRender) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof PlayerRenderListener) { - ((PlayerRenderListener) abstractFeature).onEntityRenderPost(preRender); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - - @SubscribeEvent - public void onRenderWorld(RenderWorldLastEvent postRender) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof WorldRenderListener) { - ((WorldRenderListener) abstractFeature).drawWorld(postRender.partialTicks); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onInteract(PlayerInteractEvent postRender) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof InteractListener) { - ((InteractListener) abstractFeature).onInteract(postRender); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - - @SubscribeEvent - public void onRenderWorld(ClientChatReceivedEvent postRender) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof ChatListener) { - ((ChatListener) abstractFeature).onChat(postRender); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - @SubscribeEvent - public void onChatGlobal(ClientChatReceivedEvent postRender) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof ChatListenerGlobal) { - ((ChatListenerGlobal) abstractFeature).onChat(postRender); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - @SubscribeEvent - public void dungeonTooltip(ItemTooltipEvent event) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof TooltipListener) { - ((TooltipListener) abstractFeature).onTooltip(event); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - @SubscribeEvent - public void onTick(TickEvent.ClientTickEvent tick) { - if (tick.phase == TickEvent.Phase.END && tick.type == TickEvent.Type.CLIENT ) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof TickListener) { - ((TickListener) abstractFeature).onTick(); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - } - @SubscribeEvent - public void onGuiOpen(GuiOpenEvent tick) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof GuiOpenListener) { - ((GuiOpenListener) abstractFeature).onGuiOpen(tick); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onGuiRender(GuiScreenEvent.DrawScreenEvent.Post render) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof GuiPostRenderListener) { - ((GuiPostRenderListener) abstractFeature).onGuiPostRender(render); - } - } - GlStateManager.enableBlend(); - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onGuiRender(GuiScreenEvent.DrawScreenEvent.Pre render) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof GuiPreRenderListener) { - ((GuiPreRenderListener) abstractFeature).onGuiPreRender(render); - } - } - GlStateManager.enableBlend(); - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onGuiRender(GuiScreenEvent.BackgroundDrawnEvent render) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof GuiBackgroundRenderListener) { - ((GuiBackgroundRenderListener) abstractFeature).onGuiBGRender(render); - } - } - GlStateManager.enableBlend(); - } catch (Throwable t) { - t.printStackTrace(); - } - } - - @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGH) - public void onGuiEvent(GuiScreenEvent.MouseInputEvent.Pre input) { - try { - - if (!SkyblockStatus.isOnSkyblock()) return; - - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof GuiClickListener) { - ((GuiClickListener) abstractFeature).onMouseInput(input); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onSkyblockJoin(SkyblockJoinedEvent joinedEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof SkyblockJoinListener) { - ((SkyblockJoinListener) abstractFeature).onSkyblockJoin(); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onSkyblockQuit(SkyblockLeftEvent leftEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof SkyblockLeaveListener) { - ((SkyblockLeaveListener) abstractFeature).onSkyblockQuit(); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onKey(GuiScreenEvent.KeyboardInputEvent event) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof KeyInputListener) { - ((KeyInputListener) abstractFeature).onKeyInput(event); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onDungeonStart(DungeonStartedEvent leftEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof DungeonStartListener) { - ((DungeonStartListener) abstractFeature).onDungeonStart(); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onDungeonLeft(DungeonLeftEvent leftEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof DungeonQuitListener) { - ((DungeonQuitListener) abstractFeature).onDungeonQuit(); - } - if (abstractFeature instanceof DungeonEndListener) { - ((DungeonEndListener) abstractFeature).onDungeonEnd(); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onDungeonInitialize(DungeonContextInitializationEvent leftEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof DungeonContextInitializationListener) { - ((DungeonContextInitializationListener) abstractFeature).onDungeonInitialize(); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onDungeonInitialize(BossroomEnterEvent enterEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof BossroomEnterListener) { - ((BossroomEnterListener) abstractFeature).onBossroomEnter(); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - @SubscribeEvent - public void onDungeonInitialize(DungeonEndedEvent endedEvent) { - try { - for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) { - if (abstractFeature instanceof DungeonEndListener) { - ((DungeonEndListener) abstractFeature).onDungeonEnd(); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } -} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractFeature.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractFeature.java index 7526f959..59029dde 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractFeature.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractFeature.java @@ -36,7 +36,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public abstract class AbstractFeature { +public abstract class AbstractFeature implements IFeature { @Getter private final String category; @Getter diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/FeatureRegistry.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/FeatureRegistry.java index b8ff6bbc..1908f9a8 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/FeatureRegistry.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/FeatureRegistry.java @@ -18,6 +18,7 @@ package kr.syeyoung.dungeonsguide.mod.features; +import kr.syeyoung.dungeonsguide.mod.events.annotations.EventHandlerRegistry; import kr.syeyoung.dungeonsguide.mod.features.impl.advanced.*; import kr.syeyoung.dungeonsguide.mod.features.impl.boss.*; import kr.syeyoung.dungeonsguide.mod.features.impl.boss.terminal.FeatureSimonSaysSolver; @@ -68,6 +69,8 @@ public class FeatureRegistry { features.add(abstractFeature); featuresByCategory.put(abstractFeature.getCategory(), features); + EventHandlerRegistry.registerEvents(abstractFeature); + return abstractFeature; } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java index 315b97f6..9b901907 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java @@ -23,7 +23,7 @@ import kr.syeyoung.dungeonsguide.mod.config.guiconfig.GuiConfigV2; import kr.syeyoung.dungeonsguide.mod.config.guiconfig.location.GuiGuiLocationConfig; import kr.syeyoung.dungeonsguide.mod.config.types.GUIRectangle; import kr.syeyoung.dungeonsguide.mod.config.types.TypeConverterRegistry; -import kr.syeyoung.dungeonsguide.mod.features.listener.ScreenRenderListener; +import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; import kr.syeyoung.dungeonsguide.mod.gui.MPanel; import kr.syeyoung.dungeonsguide.mod.gui.elements.MButton; import kr.syeyoung.dungeonsguide.mod.gui.elements.MLabel; @@ -37,6 +37,7 @@ import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; +import net.minecraftforge.client.event.RenderGameOverlayEvent; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; @@ -45,7 +46,7 @@ import java.util.ArrayList; import java.util.List; @Getter -public abstract class GuiFeature extends AbstractFeature implements ScreenRenderListener { +public abstract class GuiFeature extends AbstractFeature { @Setter private GUIRectangle featureRect; @Setter(value = AccessLevel.PROTECTED) @@ -65,9 +66,10 @@ public abstract class GuiFeature extends AbstractFeature implements ScreenRender this.featureRect = new GUIRectangle(0, 0, width, height); } - @Override - public void drawScreen(float partialTicks) { + @DGEventHandler + public void drawScreen(RenderGameOverlayEvent.Post postRender) { if (!isEnabled()) return; + if (!(postRender.type == RenderGameOverlayEvent.ElementType.EXPERIENCE || postRender.type == RenderGameOverlayEvent.ElementType.JUMPBAR)) return; GlStateManager.pushMatrix(); Rectangle featureRect = this.featureRect.getRectangleNoScale(); @@ -77,7 +79,7 @@ public abstract class GuiFeature extends AbstractFeature implements ScreenRender GL11.glEnable(GL11.GL_SCISSOR_TEST); GlStateManager.translate(featureRect.x, featureRect.y, 0); - drawHUD(partialTicks); + drawHUD(postRender.partialTicks); GL11.glDisable(GL11.GL_SCISSOR_TEST); GlStateManager.popMatrix(); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/IFeature.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/IFeature.java new file mode 100644 index 00000000..b06f921b --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/IFeature.java @@ -0,0 +1,28 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.mod.features; + +import com.google.gson.JsonObject; + +public interface IFeature { + boolean isEnabled(); + + void loadConfig(JsonObject jsonObject); + JsonObject saveConfig(); +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureTestPepole.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureTestPepole.java index ca73b3af..9f5f651d 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureTestPepole.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureTestPepole.java @@ -21,10 +21,10 @@ package kr.syeyoung.dungeonsguide.mod.features.impl.advanced; import com.mojang.authlib.GameProfile; import com.mojang.authlib.minecraft.MinecraftProfileTexture; import kr.syeyoung.dungeonsguide.mod.DungeonsGuide; +import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; +import kr.syeyoung.dungeonsguide.mod.events.impl.DungeonStartedEvent; import kr.syeyoung.dungeonsguide.mod.features.FeatureParameter; import kr.syeyoung.dungeonsguide.mod.features.GuiFeature; -import kr.syeyoung.dungeonsguide.mod.features.listener.ChatListener; -import kr.syeyoung.dungeonsguide.mod.features.listener.DungeonStartListener; import kr.syeyoung.dungeonsguide.mod.party.PartyManager; import kr.syeyoung.dungeonsguide.mod.stomp.StompManager; import kr.syeyoung.dungeonsguide.mod.stomp.StompPayload; @@ -47,7 +47,6 @@ import net.minecraft.scoreboard.ScorePlayerTeam; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.ClientChatReceivedEvent; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.relauncher.ReflectionHelper; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -62,7 +61,7 @@ import java.util.regex.Pattern; import static kr.syeyoung.dungeonsguide.mod.utils.TabListUtil.getString; -public class FeatureTestPepole extends GuiFeature implements ChatListener, DungeonStartListener { +public class FeatureTestPepole extends GuiFeature { Logger logger = LogManager.getLogger("FeatureTestPepole"); private Float scale; @@ -232,7 +231,7 @@ public class FeatureTestPepole extends GuiFeature implements ChatListener, Dunge readynessIndicator.put("go", true); } - @Override + @DGEventHandler() public void onChat(ClientChatReceivedEvent clientChatReceivedEvent) { String txt = clientChatReceivedEvent.message.getFormattedText(); if (!txt.startsWith("§r§9Party §8>")) return; @@ -265,8 +264,8 @@ public class FeatureTestPepole extends GuiFeature implements ChatListener, Dunge } - @Override - public void onDungeonStart() { + @DGEventHandler + public void onDungeonStart(DungeonStartedEvent event) { ready.clear(); } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureAutoReparty.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureAutoReparty.java index 6b2f98b2..d99bf658 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureAutoReparty.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureAutoReparty.java @@ -20,17 +20,18 @@ package kr.syeyoung.dungeonsguide.mod.features.impl.boss; import kr.syeyoung.dungeonsguide.mod.DungeonsGuide; +import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; +import kr.syeyoung.dungeonsguide.mod.events.impl.DungeonLeftEvent; import kr.syeyoung.dungeonsguide.mod.features.SimpleFeature; -import kr.syeyoung.dungeonsguide.mod.features.listener.DungeonQuitListener; -public class FeatureAutoReparty extends SimpleFeature implements DungeonQuitListener { +public class FeatureAutoReparty extends SimpleFeature { public FeatureAutoReparty() { super("Party.Reparty", "Auto reparty when dungeon finishes","Auto reparty on dungeon finish\n\nThis automates player chatting action, (disbanding, repartying) Thus it might be against hypixel's rules.\nBut mods like auto-gg exist so I'm leaving this feature.\nThis option is use-at-your-risk and you'll be responsible for ban if you somehow get banned because of this feature\n(Although it is not likely to happen)\nDefaults to off", "party.autoreparty", false); } - @Override - public void onDungeonQuit() { + @DGEventHandler + public void onDungeonQuit(DungeonLeftEvent event) { if (isEnabled()) DungeonsGuide.getDungeonsGuide().getCommandReparty().requestReparty(true); } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureBoxRealLivid.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureBoxRealLivid.java index feb3dfa1..cdc99aaf 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureBoxRealLivid.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureBoxRealLivid.java @@ -23,15 +23,16 @@ import kr.syeyoung.dungeonsguide.mod.DungeonsGuide; import kr.syeyoung.dungeonsguide.mod.SkyblockStatus; import kr.syeyoung.dungeonsguide.mod.config.types.AColor; import kr.syeyoung.dungeonsguide.mod.dungeon.roomprocessor.bossfight.BossfightProcessorLivid; +import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; import kr.syeyoung.dungeonsguide.mod.features.FeatureParameter; import kr.syeyoung.dungeonsguide.mod.features.SimpleFeature; -import kr.syeyoung.dungeonsguide.mod.features.listener.WorldRenderListener; import kr.syeyoung.dungeonsguide.mod.utils.RenderUtils; import net.minecraft.client.entity.EntityOtherPlayerMP; import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.client.event.RenderWorldLastEvent; -public class FeatureBoxRealLivid extends SimpleFeature implements WorldRenderListener { +public class FeatureBoxRealLivid extends SimpleFeature { public FeatureBoxRealLivid() { super("Dungeon.Bossfight.Floor 5", "Box Real Livid", "Box Real Livid in bossfight", "Dungeon.Bossfight.realLividBox", true); addParameter("color", new FeatureParameter("color", "Highlight Color", "Highlight Color of Livid", new AColor(0,255,0,150), "acolor", nval -> color = nval)); @@ -40,8 +41,9 @@ public class FeatureBoxRealLivid extends SimpleFeature implements WorldRenderLis AColor color = null; private final SkyblockStatus skyblockStatus = DungeonsGuide.getDungeonsGuide().getSkyblockStatus(); - @Override - public void drawWorld(float partialTicks) { + @DGEventHandler + public void drawWorld(RenderWorldLastEvent event) { + float partialTicks = event.partialTicks; if (!isEnabled()) return; if (!skyblockStatus.isOnDungeon()) return; if (DungeonsGuide.getDungeonsGuide().getDungeonFacade().getContext() == null) return; diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureChestPrice.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureChestPrice.java index b28f14c9..953126f6 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureChestPrice.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureChestPrice.java @@ -20,8 +20,8 @@ package kr.syeyoung.dungeonsguide.mod.features.impl.boss; import kr.syeyoung.dungeonsguide.mod.DungeonsGuide; +import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; import kr.syeyoung.dungeonsguide.mod.features.SimpleFeature; -import kr.syeyoung.dungeonsguide.mod.features.listener.GuiBackgroundRenderListener; import kr.syeyoung.dungeonsguide.mod.utils.AhUtils; import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import net.minecraft.client.Minecraft; @@ -42,12 +42,12 @@ import java.util.Comparator; import java.util.Set; import java.util.TreeSet; -public class FeatureChestPrice extends SimpleFeature implements GuiBackgroundRenderListener { +public class FeatureChestPrice extends SimpleFeature { public FeatureChestPrice() { super("Dungeon", "Show Profit of Dungeon Reward Chests","Show Profit of Dungeon Chests", "bossfight.profitchest", false); } - @Override + @DGEventHandler public void onGuiBGRender(GuiScreenEvent.BackgroundDrawnEvent rendered) { if (!isEnabled()) return; if (!(rendered.gui instanceof GuiChest)) return; diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureHideAnimals.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureHideAnimals.java index 5d74977a..55138fde 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureHideAnimals.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureHideAnimals.java @@ -22,14 +22,14 @@ package kr.syeyoung.dungeonsguide.mod.features.impl.boss; import kr.syeyoung.dungeonsguide.mod.DungeonsGuide; import kr.syeyoung.dungeonsguide.mod.SkyblockStatus; import kr.syeyoung.dungeonsguide.mod.dungeon.roomprocessor.bossfight.BossfightProcessorThorn; +import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; import kr.syeyoung.dungeonsguide.mod.features.FeatureParameter; import kr.syeyoung.dungeonsguide.mod.features.SimpleFeature; -import kr.syeyoung.dungeonsguide.mod.features.listener.EntityLivingRenderListener; import net.minecraft.entity.passive.*; import net.minecraftforge.client.event.RenderLivingEvent; -public class FeatureHideAnimals extends SimpleFeature implements EntityLivingRenderListener { +public class FeatureHideAnimals extends SimpleFeature { public FeatureHideAnimals() { super("Dungeon.Bossfight.Floor 4", "Hide animals on f4", "Hide Spirit Animals on F4. \nClick on Edit for precise setting", "bossfight.hideanimals", false); addParameter("sheep", new FeatureParameter("sheep", "Hide Sheeps", "Hide Sheeps", true, "boolean", nval -> sheep = nval)); @@ -49,7 +49,7 @@ public class FeatureHideAnimals extends SimpleFeature implements EntityLivingRen private final SkyblockStatus skyblockStatus = DungeonsGuide.getDungeonsGuide().getSkyblockStatus(); - @Override + @DGEventHandler() public void onEntityRenderPre(RenderLivingEvent.Pre renderPlayerEvent) { if (!isEnabled()) return; if (!skyblockStatus.isOnDungeon()) return; @@ -69,9 +69,4 @@ public class FeatureHideAnimals extends SimpleFeature implements EntityLivingRen renderPlayerEvent.setCanceled(true); } } - - @Override - public void onEntityRenderPost(RenderLivingEvent.Post renderPlayerEvent) { - - } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureThornSpiritBowTimer.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureThornSpiritBowTimer.java index 5f6883e7..f8368cd4 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureThornSpiritBowTimer.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureThornSpiritBowTimer.java @@ -23,8 +23,8 @@ import kr.syeyoung.dungeonsguide.mod.DungeonsGuide; import kr.syeyoung.dungeonsguide.mod.SkyblockStatus; import kr.syeyoung.dungeonsguide.mod.config.types.AColor; import kr.syeyoung.dungeonsguide.mod.dungeon.roomprocessor.bossfight.BossfightProcessorThorn; -import kr.syeyoung.dungeonsguide.mod.features.listener.ChatListener; -import kr.syeyoung.dungeonsguide.mod.features.listener.TitleListener; +import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; +import kr.syeyoung.dungeonsguide.mod.events.impl.TitleEvent; import kr.syeyoung.dungeonsguide.mod.features.text.StyledText; import kr.syeyoung.dungeonsguide.mod.features.text.TextHUDFeature; import kr.syeyoung.dungeonsguide.mod.features.text.TextStyle; @@ -36,7 +36,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class FeatureThornSpiritBowTimer extends TextHUDFeature implements ChatListener, TitleListener { +public class FeatureThornSpiritBowTimer extends TextHUDFeature { public FeatureThornSpiritBowTimer() { super("Dungeon.Bossfight.Floor 4", "Display Spirit bow timer", "Displays how long until spirit bow gets destroyed", "bossfight.spiritbowdisplay", false, getFontRenderer().getStringWidth("Spirit Bow Destruction: 2m 00s"), getFontRenderer().FONT_HEIGHT); getStyles().add(new TextStyle("title", new AColor(0x00, 0xAA,0xAA,255), new AColor(0, 0,0,0), false)); @@ -77,7 +77,7 @@ public class FeatureThornSpiritBowTimer extends TextHUDFeature implements ChatLi } private long time = 0; - @Override + @DGEventHandler() public void onChat(ClientChatReceivedEvent clientChatReceivedEvent) { if (!(skyblockStatus.isOnDungeon() && DungeonsGuide.getDungeonsGuide().getDungeonFacade().getContext() != null && DungeonsGuide.getDungeonsGuide().getDungeonFacade().getContext().getBossfightProcessor() instanceof BossfightProcessorThorn)) return; String text = clientChatReceivedEvent.message.getFormattedText(); @@ -101,10 +101,10 @@ public class FeatureThornSpiritBowTimer extends TextHUDFeature implements ChatLi } } - @Override - public void