From 9f9988903f2c77c73174534cdce629dd7cbe0445 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 18 Nov 2018 23:48:44 +0300 Subject: [PATCH 1/7] =?UTF-8?q?=D0=B8=D0=B7=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=D1=81=D1=8F=20=D0=BE=D1=82=20=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=83=D0=B6=D0=BD=D0=BE=D0=B3=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/eventbus/Event.java | 7 ------- core/src/main/java/mc/core/eventbus/EventBase.java | 5 ----- 2 files changed, 12 deletions(-) diff --git a/core/src/main/java/mc/core/eventbus/Event.java b/core/src/main/java/mc/core/eventbus/Event.java index 08aa0ec..98daada 100644 --- a/core/src/main/java/mc/core/eventbus/Event.java +++ b/core/src/main/java/mc/core/eventbus/Event.java @@ -1,13 +1,6 @@ -/* - * DmitriyMX - * 2018-05-02 - */ package mc.core.eventbus; public interface Event { void setCanceled(boolean value); boolean isCanceled(); - - void setLastProcess(boolean value); - boolean isLastProcess(); } diff --git a/core/src/main/java/mc/core/eventbus/EventBase.java b/core/src/main/java/mc/core/eventbus/EventBase.java index 7756cce..66d458e 100644 --- a/core/src/main/java/mc/core/eventbus/EventBase.java +++ b/core/src/main/java/mc/core/eventbus/EventBase.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-05-02 - */ package mc.core.eventbus; import lombok.Getter; @@ -11,5 +7,4 @@ import lombok.Setter; @Setter public abstract class EventBase implements Event { private boolean canceled; - private boolean lastProcess; } From 169af20f746f82a22e531e7dd9bfd8dc0db327dc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 12 Jan 2019 18:57:41 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=D0=98=D0=B7=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=D1=81=D1=8F=20=D0=BE=D1=82=20Google=20Guava=20Even?= =?UTF-8?q?tBus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/CoreEventListener.java | 9 +++----- .../src/main/java/mc/core/eventbus/Event.java | 2 -- .../main/java/mc/core/eventbus/EventBase.java | 10 --------- .../java/mc/core/eventbus/EventBusGetter.java | 16 -------------- .../eventbus/events/CS_PlayerMoveEvent.java | 8 ++----- .../eventbus/events/SC_ChunkLoadEvent.java | 4 ++-- .../eventbus/events/SC_ChunkUnloadEvent.java | 4 ++-- .../core/eventbus/events/SC_LoginEvent.java | 22 ------------------- .../eventbus/events/SC_PlayerLookEvent.java | 20 ----------------- .../eventbus/events/SC_PlayerMoveEvent.java | 4 ++-- .../eventbus/events/SC_ServerPingEvent.java | 22 ------------------- .../proto_1_12_2/netty/NettyServer.java | 3 +-- .../netty/PlayerEventListener.java | 4 ---- .../netty/handlers/LoginHandler.java | 5 +---- .../netty/handlers/PlayHandler.java | 3 +-- 15 files changed, 14 insertions(+), 122 deletions(-) delete mode 100644 core/src/main/java/mc/core/eventbus/EventBase.java delete mode 100644 core/src/main/java/mc/core/eventbus/EventBusGetter.java delete mode 100644 core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java delete mode 100644 core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java delete mode 100644 core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java diff --git a/core/src/main/java/mc/core/CoreEventListener.java b/core/src/main/java/mc/core/CoreEventListener.java index 134e071..40c5d23 100644 --- a/core/src/main/java/mc/core/CoreEventListener.java +++ b/core/src/main/java/mc/core/CoreEventListener.java @@ -1,8 +1,6 @@ package mc.core; -import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; -import mc.core.eventbus.EventBusGetter; import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.events.SC_ChunkLoadEvent; import mc.core.eventbus.events.SC_ChunkUnloadEvent; @@ -16,10 +14,9 @@ import java.util.Iterator; public class CoreEventListener { @PostConstruct public void registerEventHandlers() { - EventBusGetter.getInstance().register(this); +// EventBusGetter.getInstance().register(this); } - @Subscribe public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) { log.trace("(GameLoop) playerMoveEventHandler()"); @@ -50,7 +47,7 @@ public class CoreEventListener { } if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) { - EventBusGetter.getInstance().post(eventChunkUnload); +// EventBusGetter.getInstance().post(eventChunkUnload); } SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer()); @@ -67,7 +64,7 @@ public class CoreEventListener { } if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { - EventBusGetter.getInstance().post(eventChunkLoad); +// EventBusGetter.getInstance().post(eventChunkLoad); } } diff --git a/core/src/main/java/mc/core/eventbus/Event.java b/core/src/main/java/mc/core/eventbus/Event.java index 98daada..c31a008 100644 --- a/core/src/main/java/mc/core/eventbus/Event.java +++ b/core/src/main/java/mc/core/eventbus/Event.java @@ -1,6 +1,4 @@ package mc.core.eventbus; public interface Event { - void setCanceled(boolean value); - boolean isCanceled(); } diff --git a/core/src/main/java/mc/core/eventbus/EventBase.java b/core/src/main/java/mc/core/eventbus/EventBase.java deleted file mode 100644 index 66d458e..0000000 --- a/core/src/main/java/mc/core/eventbus/EventBase.java +++ /dev/null @@ -1,10 +0,0 @@ -package mc.core.eventbus; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public abstract class EventBase implements Event { - private boolean canceled; -} diff --git a/core/src/main/java/mc/core/eventbus/EventBusGetter.java b/core/src/main/java/mc/core/eventbus/EventBusGetter.java deleted file mode 100644 index 37e952b..0000000 --- a/core/src/main/java/mc/core/eventbus/EventBusGetter.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * DmitriyMX - * 2018-05-02 - */ -package mc.core.eventbus; - -import com.google.common.eventbus.EventBus; -import lombok.Getter; - -public final class EventBusGetter { - @Getter - private static final EventBus instance = new EventBus(); - - private EventBusGetter() { - } -} diff --git a/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java b/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java index 4d759ab..1d9b6ae 100644 --- a/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java @@ -1,18 +1,14 @@ -/* - * DmitriyMX - * 2018-05-02 - */ package mc.core.eventbus.events; import lombok.Getter; import lombok.Setter; import mc.core.EntityLocation; import mc.core.ImmutableEntityLocation; -import mc.core.eventbus.EventBase; +import mc.core.eventbus.Event; import mc.core.player.Player; @Getter -public class CS_PlayerMoveEvent extends EventBase { +public class CS_PlayerMoveEvent implements Event { private final Player player; private final ImmutableEntityLocation oldLocation; @Setter diff --git a/core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java index ea55a7a..15148ad 100644 --- a/core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java @@ -2,14 +2,14 @@ package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; -import mc.core.eventbus.EventBase; +import mc.core.eventbus.Event; import mc.core.player.Player; import java.util.ArrayList; import java.util.List; @RequiredArgsConstructor -public class SC_ChunkLoadEvent extends EventBase { +public class SC_ChunkLoadEvent implements Event { @Getter private final Player player; @Getter diff --git a/core/src/main/java/mc/core/eventbus/events/SC_ChunkUnloadEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_ChunkUnloadEvent.java index b2cce0d..d1a9517 100644 --- a/core/src/main/java/mc/core/eventbus/events/SC_ChunkUnloadEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_ChunkUnloadEvent.java @@ -2,14 +2,14 @@ package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; -import mc.core.eventbus.EventBase; +import mc.core.eventbus.Event; import mc.core.player.Player; import java.util.ArrayList; import java.util.List; @RequiredArgsConstructor -public class SC_ChunkUnloadEvent extends EventBase { +public class SC_ChunkUnloadEvent implements Event { @Getter private final Player player; @Getter diff --git a/core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java deleted file mode 100644 index 95765f3..0000000 --- a/core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * DmitriyMX - * 2018-05-02 - */ -package mc.core.eventbus.events; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import mc.core.eventbus.EventBase; - -import java.net.SocketAddress; - -@RequiredArgsConstructor -@Getter -@Setter -public class SC_LoginEvent extends EventBase { - private String playerName; - private final SocketAddress remoteAddress; - private boolean deny; - private String denyReason; -} diff --git a/core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java deleted file mode 100644 index 90e5379..0000000 --- a/core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * DmitriyMX - * 2018-05-02 - */ -package mc.core.eventbus.events; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import mc.core.EntityLocation; -import mc.core.eventbus.EventBase; -import mc.core.player.Player; - -@RequiredArgsConstructor -@Getter -@Setter -public class SC_PlayerLookEvent extends EventBase { - private final Player player; - private EntityLocation newLook; -} diff --git a/core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java index d0634a7..7f479ee 100644 --- a/core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java @@ -4,12 +4,12 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import mc.core.EntityLocation; -import mc.core.eventbus.EventBase; +import mc.core.eventbus.Event; import mc.core.player.Player; @RequiredArgsConstructor @Getter -public class SC_PlayerMoveEvent extends EventBase { +public class SC_PlayerMoveEvent implements Event { private final Player player; @Setter private EntityLocation newLocation; diff --git a/core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java deleted file mode 100644 index 877df70..0000000 --- a/core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * DmitriyMX - * 2018-05-02 - */ -package mc.core.eventbus.events; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import mc.core.eventbus.EventBase; - -import java.net.SocketAddress; - -@RequiredArgsConstructor -@Getter -@Setter -public class SC_ServerPingEvent extends EventBase { - private final SocketAddress remoteAddress; - private String description; - private int online; - private int maxOnline; -} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java index 7df1c3f..f664e87 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java @@ -11,7 +11,6 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.util.AttributeKey; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import mc.core.eventbus.EventBusGetter; import mc.core.network.Server; import mc.core.network.StartServerException; import mc.core.network.proto_1_12_2.State; @@ -65,7 +64,7 @@ public class NettyServer implements Server { public void start() throws StartServerException { log.info("Use protocol {}", StatusResponsePacket.NAME); - EventBusGetter.getInstance().register(new PlayerEventListener()); +// EventBusGetter.getInstance().register(new PlayerEventListener()); bossGroup = new NioEventLoopGroup(1); workerGroup = new NioEventLoopGroup(workerGroupCount); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java index 4c7e533..eb59118 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -1,6 +1,5 @@ package mc.core.network.proto_1_12_2.netty; -import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; import mc.core.eventbus.events.SC_ChunkLoadEvent; import mc.core.eventbus.events.SC_ChunkUnloadEvent; @@ -14,7 +13,6 @@ import mc.core.world.chunk.Chunk; @Slf4j class PlayerEventListener { - @Subscribe public void playerMoveEventHandler(SC_PlayerMoveEvent event) { log.debug("(SC) playerMoveEventHandler()"); PlayerPositionAndLookPacket packet = new PlayerPositionAndLookPacket(); @@ -25,7 +23,6 @@ class PlayerEventListener { event.getPlayer().getChannel().writeAndFlush(packet); } - @Subscribe public void playerChunkLoadHandler(SC_ChunkLoadEvent event) { for(Integer compressXZ : event.getNeedLoadChunks()) { int[] xz = CompactedCoords.uncompressXZ(compressXZ); @@ -41,7 +38,6 @@ class PlayerEventListener { } } - @Subscribe public void playerChunkUnloadHandler(SC_ChunkUnloadEvent event) { for(Integer compressXZ : event.getNeedUnloadChunks()) { int[] xz = CompactedCoords.uncompressXZ(compressXZ); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 19afb32..2f67167 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -2,7 +2,6 @@ package mc.core.network.proto_1_12_2.netty.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; -import mc.core.eventbus.EventBusGetter; import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.TeleportManager; @@ -15,9 +14,7 @@ import mc.core.player.PlayerMode; import mc.core.text.Text; import mc.core.text.TextColor; import mc.core.text.TextStyle; -import mc.core.utils.CompactedCoords; import mc.core.world.World; -import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -123,7 +120,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation()); event.setNewLocation(player.getLocation()); event.setRecalcChunk(true); - EventBusGetter.getInstance().post(event); +// EventBusGetter.getInstance().post(event); } } } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java index 83b1a7e..acf38b7 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java @@ -8,7 +8,6 @@ import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.chat.ChatProcessor; -import mc.core.eventbus.EventBusGetter; import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.*; @@ -83,7 +82,7 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle player.getLocation().getYaw(), player.getLocation().getPitch() )); - EventBusGetter.getInstance().post(event); +// EventBusGetter.getInstance().post(event); } @Handler From 36590958515d373340aaa3923fe117a2c261417e Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 12 Jan 2019 18:58:05 +0300 Subject: [PATCH 3/7] =?UTF-8?q?=D0=A1=D0=B2=D0=BE=D1=8F=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20EventBus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/eventbus/EventBus.java | 39 ++++++++++++ .../java/mc/core/eventbus/Subscriber.java | 11 ++++ core/src/test/java/mc/core/TestEventBus.java | 62 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 core/src/main/java/mc/core/eventbus/EventBus.java create mode 100644 core/src/main/java/mc/core/eventbus/Subscriber.java create mode 100644 core/src/test/java/mc/core/TestEventBus.java diff --git a/core/src/main/java/mc/core/eventbus/EventBus.java b/core/src/main/java/mc/core/eventbus/EventBus.java new file mode 100644 index 0000000..c28a328 --- /dev/null +++ b/core/src/main/java/mc/core/eventbus/EventBus.java @@ -0,0 +1,39 @@ +package mc.core.eventbus; + +import javafx.util.Pair; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.lang.reflect.Method; +import java.util.*; +import java.util.stream.Stream; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class EventBus { + @Getter + private static final EventBus insnance = new EventBus(); + + private Queue eventQueue; + private Map, List>> subscribes = new HashMap<>(); + + @SuppressWarnings("unchecked") + public void registerSubscribes(Object subscriberObject) { + Stream.of(subscriberObject.getClass().getDeclaredMethods()) + .filter(method -> method.isAnnotationPresent(Subscriber.class)) + .filter(method -> method.getReturnType().equals(Void.TYPE)) + .filter(method -> method.getParameterCount() == 1) + .filter(method -> Event.class.isAssignableFrom(method.getParameterTypes()[0])) + .forEach(method -> { + Class type = (Class) method.getParameterTypes()[0]; + List> pairs; + if (subscribes.containsKey(type)) { + pairs = subscribes.get(type); + } else { + pairs = new ArrayList<>(); + subscribes.put(type, pairs); + } + pairs.add(new Pair<>(subscriberObject, method)); + }); + } +} diff --git a/core/src/main/java/mc/core/eventbus/Subscriber.java b/core/src/main/java/mc/core/eventbus/Subscriber.java new file mode 100644 index 0000000..9a8aaee --- /dev/null +++ b/core/src/main/java/mc/core/eventbus/Subscriber.java @@ -0,0 +1,11 @@ +package mc.core.eventbus; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(value= ElementType.METHOD) +@Retention(value= RetentionPolicy.RUNTIME) +public @interface Subscriber { +} diff --git a/core/src/test/java/mc/core/TestEventBus.java b/core/src/test/java/mc/core/TestEventBus.java new file mode 100644 index 0000000..88a882a --- /dev/null +++ b/core/src/test/java/mc/core/TestEventBus.java @@ -0,0 +1,62 @@ +package mc.core; + +import javafx.util.Pair; +import mc.core.eventbus.Event; +import mc.core.eventbus.EventBus; +import mc.core.eventbus.Subscriber; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.internal.util.reflection.Whitebox; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class TestEventBus { + + @SuppressWarnings("unchecked") + @Test + void testRegisterSubscribes() { + DumbEventHandler handler = new DumbEventHandler(); + EventBus.getInsnance().registerSubscribes(handler); + + Map>> subscribes = + (Map>>) + Whitebox.getInternalState(EventBus.getInsnance(), "subscribes"); + assertEquals(1, subscribes.size()); + + List> pairs = subscribes.values().iterator().next(); + assertEquals(1, pairs.size()); + + Pair pair = pairs.get(0); + assertSame(handler, pair.getKey()); + assertEquals("corectSubscribe", pair.getValue().getName()); + } + + private class DumbEvent implements Event { + } + + private class DumbEventHandler { + @Subscriber + public void corectSubscribe(DumbEvent event) { + } + + @Subscriber + public Object incorectSubscribeReturnType(DumbEvent event) { + return null; + } + + @Subscriber + public void incorrectSubscriberTypeParameter(Object object) { + } + + @Subscriber + public void incorrectSubscriberManyParameters(DumbEvent event, Object object) { + } + + public void someMethod() { + } + } +} From 71c16992062023d42cd0ace9e958d2a38d4c71f9 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 12 Jan 2019 19:41:22 +0300 Subject: [PATCH 4/7] EventBus unregister --- .../main/java/mc/core/eventbus/EventBus.java | 32 +++++++++++++++---- core/src/test/java/mc/core/TestEventBus.java | 27 +++++++++++++--- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/mc/core/eventbus/EventBus.java b/core/src/main/java/mc/core/eventbus/EventBus.java index c28a328..460f725 100644 --- a/core/src/main/java/mc/core/eventbus/EventBus.java +++ b/core/src/main/java/mc/core/eventbus/EventBus.java @@ -17,16 +17,20 @@ public class EventBus { private Queue eventQueue; private Map, List>> subscribes = new HashMap<>(); - @SuppressWarnings("unchecked") - public void registerSubscribes(Object subscriberObject) { - Stream.of(subscriberObject.getClass().getDeclaredMethods()) + private Stream getMethods(Object subscriberObject) { + return Stream.of(subscriberObject.getClass().getDeclaredMethods()) .filter(method -> method.isAnnotationPresent(Subscriber.class)) .filter(method -> method.getReturnType().equals(Void.TYPE)) .filter(method -> method.getParameterCount() == 1) - .filter(method -> Event.class.isAssignableFrom(method.getParameterTypes()[0])) + .filter(method -> Event.class.isAssignableFrom(method.getParameterTypes()[0])); + } + + @SuppressWarnings("unchecked") + public void registerSubscribes(Object subscriberObject) { + getMethods(subscriberObject) .forEach(method -> { - Class type = (Class) method.getParameterTypes()[0]; - List> pairs; + final Class type = (Class) method.getParameterTypes()[0]; + final List> pairs; if (subscribes.containsKey(type)) { pairs = subscribes.get(type); } else { @@ -36,4 +40,20 @@ public class EventBus { pairs.add(new Pair<>(subscriberObject, method)); }); } + + @SuppressWarnings("unchecked") + public void unregisterSubscribes(Object subscriberObject) { + getMethods(subscriberObject) + .forEach(method -> { + final Class type = (Class) method.getParameterTypes()[0]; + if (subscribes.containsKey(type)) { + final List> pairs = subscribes.get(type); + pairs.removeIf(pair -> pair.getKey() == subscriberObject); + + if (pairs.isEmpty()) { + subscribes.remove(type); + } + } + }); + } } diff --git a/core/src/test/java/mc/core/TestEventBus.java b/core/src/test/java/mc/core/TestEventBus.java index 88a882a..d8ab843 100644 --- a/core/src/test/java/mc/core/TestEventBus.java +++ b/core/src/test/java/mc/core/TestEventBus.java @@ -4,7 +4,7 @@ import javafx.util.Pair; import mc.core.eventbus.Event; import mc.core.eventbus.EventBus; import mc.core.eventbus.Subscriber; -import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.internal.util.reflection.Whitebox; @@ -17,14 +17,22 @@ import static org.junit.jupiter.api.Assertions.*; class TestEventBus { @SuppressWarnings("unchecked") + private Map, List>> getEventBusFieldSubscribes() { + return (Map, List>>) Whitebox.getInternalState(EventBus.getInsnance(), "subscribes"); + } + + @BeforeEach + void before() { + getEventBusFieldSubscribes().clear(); + } + + @Test void testRegisterSubscribes() { DumbEventHandler handler = new DumbEventHandler(); EventBus.getInsnance().registerSubscribes(handler); - Map>> subscribes = - (Map>>) - Whitebox.getInternalState(EventBus.getInsnance(), "subscribes"); + Map, List>> subscribes = getEventBusFieldSubscribes(); assertEquals(1, subscribes.size()); List> pairs = subscribes.values().iterator().next(); @@ -35,6 +43,17 @@ class TestEventBus { assertEquals("corectSubscribe", pair.getValue().getName()); } + @Test + void testUnregisterSubscribes() { + DumbEventHandler handler = new DumbEventHandler(); + EventBus.getInsnance().registerSubscribes(handler); + + EventBus.getInsnance().unregisterSubscribes(handler); + + Map, List>> subscribes = getEventBusFieldSubscribes(); + assertEquals(0, subscribes.size()); + } + private class DumbEvent implements Event { } From d042169952b7c40c7657dbf639a0283a7555103a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 12 Jan 2019 21:02:30 +0300 Subject: [PATCH 5/7] =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=B8=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/eventbus/EventBus.java | 32 +++++++++++- core/src/test/java/mc/core/TestEventBus.java | 52 +++++++++++++++++-- 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/mc/core/eventbus/EventBus.java b/core/src/main/java/mc/core/eventbus/EventBus.java index 460f725..08fac05 100644 --- a/core/src/main/java/mc/core/eventbus/EventBus.java +++ b/core/src/main/java/mc/core/eventbus/EventBus.java @@ -4,17 +4,22 @@ import javafx.util.Pair; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.helpers.MessageFormatter; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.stream.Stream; +@Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public class EventBus { @Getter private static final EventBus insnance = new EventBus(); - private Queue eventQueue; + private Queue eventQueue = new ConcurrentLinkedQueue<>(); private Map, List>> subscribes = new HashMap<>(); private Stream getMethods(Object subscriberObject) { @@ -56,4 +61,29 @@ public class EventBus { } }); } + + public void post(Event event) { + eventQueue.add(event); + } + + public void process() { + Event event; + while ((event = eventQueue.poll()) != null) { + final Class type = event.getClass(); + if (subscribes.containsKey(type)) { + final List> pairs = subscribes.get(type); + for (Pair pair : pairs) { + try { + pair.getValue().invoke(pair.getKey(), event); + } catch (IllegalAccessException | InvocationTargetException e) { + log.error(MessageFormatter.format("Invoke method '{}#{}'", + pair.getKey().getClass().getSimpleName(), + pair.getValue().getName()).getMessage(), + e + ); + } + } + } + } + } } diff --git a/core/src/test/java/mc/core/TestEventBus.java b/core/src/test/java/mc/core/TestEventBus.java index d8ab843..511f9e4 100644 --- a/core/src/test/java/mc/core/TestEventBus.java +++ b/core/src/test/java/mc/core/TestEventBus.java @@ -1,6 +1,8 @@ package mc.core; import javafx.util.Pair; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; import mc.core.eventbus.Event; import mc.core.eventbus.EventBus; import mc.core.eventbus.Subscriber; @@ -9,21 +11,29 @@ import org.junit.jupiter.api.Test; import org.mockito.internal.util.reflection.Whitebox; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Queue; +import java.util.stream.Stream; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; class TestEventBus { + private List resultList = new ArrayList<>(); @SuppressWarnings("unchecked") private Map, List>> getEventBusFieldSubscribes() { - return (Map, List>>) Whitebox.getInternalState(EventBus.getInsnance(), "subscribes"); + return (Map, List>>) + Whitebox.getInternalState(EventBus.getInsnance(), "subscribes"); } @BeforeEach + @SuppressWarnings("unchecked") void before() { getEventBusFieldSubscribes().clear(); + ((Queue) Whitebox.getInternalState(EventBus.getInsnance(), "eventQueue")).clear(); } @@ -54,12 +64,46 @@ class TestEventBus { assertEquals(0, subscribes.size()); } - private class DumbEvent implements Event { + @Test + @SuppressWarnings("unchecked") + void testPost() { + EventBus.getInsnance().post(new DumbEvent()); + + Queue eventQueue = (Queue) Whitebox.getInternalState(EventBus.getInsnance(), "eventQueue"); + assertEquals(1, eventQueue.size()); } - private class DumbEventHandler { + @Test + void testProcess() { + Stream.of(new DumbEventHandler("D1 "), new DumbEventHandler("D2 ")) + .forEach(handler -> EventBus.getInsnance().registerSubscribes(handler)); + + Stream.of(new DumbEvent("message 1"), new DumbEvent("message 2")) + .forEach(event -> EventBus.getInsnance().post(event)); + + EventBus.getInsnance().process(); + + assertEquals(4, resultList.size()); + assertEquals("D1 message 1", resultList.get(0)); + assertEquals("D2 message 1", resultList.get(1)); + assertEquals("D1 message 2", resultList.get(2)); + assertEquals("D2 message 2", resultList.get(3)); + } + + @AllArgsConstructor + @NoArgsConstructor + private class DumbEvent implements Event { + String message; + } + + @AllArgsConstructor + @NoArgsConstructor + public class DumbEventHandler { + private String prefix = ""; + @Subscriber public void corectSubscribe(DumbEvent event) { + resultList.add(prefix + event.message); } @Subscriber From 04d25aaf6564d88c133319629f22bc778084356c Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 12 Jan 2019 21:44:55 +0300 Subject: [PATCH 6/7] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D1=81=D0=B2=D0=BE=D0=B9=20EventBus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/CoreEventListener.java | 11 +++++----- core/src/main/java/mc/core/GameLoop.java | 3 +++ .../main/java/mc/core/eventbus/EventBus.java | 2 +- core/src/test/java/mc/core/TestEventBus.java | 20 +++++++++---------- .../proto_1_12_2/netty/NettyServer.java | 3 ++- .../netty/PlayerEventListener.java | 6 +++++- .../netty/handlers/LoginHandler.java | 3 ++- .../netty/handlers/PlayHandler.java | 7 ++----- 8 files changed, 31 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/mc/core/CoreEventListener.java b/core/src/main/java/mc/core/CoreEventListener.java index 40c5d23..25318ba 100644 --- a/core/src/main/java/mc/core/CoreEventListener.java +++ b/core/src/main/java/mc/core/CoreEventListener.java @@ -1,6 +1,8 @@ package mc.core; import lombok.extern.slf4j.Slf4j; +import mc.core.eventbus.EventBus; +import mc.core.eventbus.Subscriber; import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.events.SC_ChunkLoadEvent; import mc.core.eventbus.events.SC_ChunkUnloadEvent; @@ -14,12 +16,11 @@ import java.util.Iterator; public class CoreEventListener { @PostConstruct public void registerEventHandlers() { -// EventBusGetter.getInstance().register(this); + EventBus.getInstance().registerSubscribes(this); } + @Subscriber public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) { - log.trace("(GameLoop) playerMoveEventHandler()"); - Chunk chunk; chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation().toBlockLocation()); // Old chunk int ccX = chunk.getX(); @@ -47,7 +48,7 @@ public class CoreEventListener { } if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) { -// EventBusGetter.getInstance().post(eventChunkUnload); + EventBus.getInstance().post(eventChunkUnload); } SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer()); @@ -64,7 +65,7 @@ public class CoreEventListener { } if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { -// EventBusGetter.getInstance().post(eventChunkLoad); + EventBus.getInstance().post(eventChunkLoad); } } diff --git a/core/src/main/java/mc/core/GameLoop.java b/core/src/main/java/mc/core/GameLoop.java index 4b5affc..7838fee 100644 --- a/core/src/main/java/mc/core/GameLoop.java +++ b/core/src/main/java/mc/core/GameLoop.java @@ -6,6 +6,7 @@ package mc.core; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import mc.core.eventbus.EventBus; import mc.core.player.PlayerManager; import mc.core.time.TimeProcessor; import org.springframework.beans.factory.annotation.Autowired; @@ -47,6 +48,8 @@ public class GameLoop extends Thread { /* --- --- --- */ + EventBus.getInstance().process(); + /* TODO нужно перенести этот функционал на Network */ playerManager.getBroadcastChannel().sendTimeUpdate( gameTimer.getGameTime(), diff --git a/core/src/main/java/mc/core/eventbus/EventBus.java b/core/src/main/java/mc/core/eventbus/EventBus.java index 08fac05..1a14331 100644 --- a/core/src/main/java/mc/core/eventbus/EventBus.java +++ b/core/src/main/java/mc/core/eventbus/EventBus.java @@ -17,7 +17,7 @@ import java.util.stream.Stream; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class EventBus { @Getter - private static final EventBus insnance = new EventBus(); + private static final EventBus instance = new EventBus(); private Queue eventQueue = new ConcurrentLinkedQueue<>(); private Map, List>> subscribes = new HashMap<>(); diff --git a/core/src/test/java/mc/core/TestEventBus.java b/core/src/test/java/mc/core/TestEventBus.java index 511f9e4..beb19c8 100644 --- a/core/src/test/java/mc/core/TestEventBus.java +++ b/core/src/test/java/mc/core/TestEventBus.java @@ -26,21 +26,21 @@ class TestEventBus { @SuppressWarnings("unchecked") private Map, List>> getEventBusFieldSubscribes() { return (Map, List>>) - Whitebox.getInternalState(EventBus.getInsnance(), "subscribes"); + Whitebox.getInternalState(EventBus.getInstance(), "subscribes"); } @BeforeEach @SuppressWarnings("unchecked") void before() { getEventBusFieldSubscribes().clear(); - ((Queue) Whitebox.getInternalState(EventBus.getInsnance(), "eventQueue")).clear(); + ((Queue) Whitebox.getInternalState(EventBus.getInstance(), "eventQueue")).clear(); } @Test void testRegisterSubscribes() { DumbEventHandler handler = new DumbEventHandler(); - EventBus.getInsnance().registerSubscribes(handler); + EventBus.getInstance().registerSubscribes(handler); Map, List>> subscribes = getEventBusFieldSubscribes(); assertEquals(1, subscribes.size()); @@ -56,9 +56,9 @@ class TestEventBus { @Test void testUnregisterSubscribes() { DumbEventHandler handler = new DumbEventHandler(); - EventBus.getInsnance().registerSubscribes(handler); + EventBus.getInstance().registerSubscribes(handler); - EventBus.getInsnance().unregisterSubscribes(handler); + EventBus.getInstance().unregisterSubscribes(handler); Map, List>> subscribes = getEventBusFieldSubscribes(); assertEquals(0, subscribes.size()); @@ -67,21 +67,21 @@ class TestEventBus { @Test @SuppressWarnings("unchecked") void testPost() { - EventBus.getInsnance().post(new DumbEvent()); + EventBus.getInstance().post(new DumbEvent()); - Queue eventQueue = (Queue) Whitebox.getInternalState(EventBus.getInsnance(), "eventQueue"); + Queue eventQueue = (Queue) Whitebox.getInternalState(EventBus.getInstance(), "eventQueue"); assertEquals(1, eventQueue.size()); } @Test void testProcess() { Stream.of(new DumbEventHandler("D1 "), new DumbEventHandler("D2 ")) - .forEach(handler -> EventBus.getInsnance().registerSubscribes(handler)); + .forEach(handler -> EventBus.getInstance().registerSubscribes(handler)); Stream.of(new DumbEvent("message 1"), new DumbEvent("message 2")) - .forEach(event -> EventBus.getInsnance().post(event)); + .forEach(event -> EventBus.getInstance().post(event)); - EventBus.getInsnance().process(); + EventBus.getInstance().process(); assertEquals(4, resultList.size()); assertEquals("D1 message 1", resultList.get(0)); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java index f664e87..d17cba5 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java @@ -11,6 +11,7 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.util.AttributeKey; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import mc.core.eventbus.EventBus; import mc.core.network.Server; import mc.core.network.StartServerException; import mc.core.network.proto_1_12_2.State; @@ -64,7 +65,7 @@ public class NettyServer implements Server { public void start() throws StartServerException { log.info("Use protocol {}", StatusResponsePacket.NAME); -// EventBusGetter.getInstance().register(new PlayerEventListener()); + EventBus.getInstance().registerSubscribes(new PlayerEventListener()); bossGroup = new NioEventLoopGroup(1); workerGroup = new NioEventLoopGroup(workerGroupCount); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java index eb59118..079ebf2 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -1,6 +1,7 @@ package mc.core.network.proto_1_12_2.netty; import lombok.extern.slf4j.Slf4j; +import mc.core.eventbus.Subscriber; import mc.core.eventbus.events.SC_ChunkLoadEvent; import mc.core.eventbus.events.SC_ChunkUnloadEvent; import mc.core.eventbus.events.SC_PlayerMoveEvent; @@ -12,7 +13,8 @@ import mc.core.utils.CompactedCoords; import mc.core.world.chunk.Chunk; @Slf4j -class PlayerEventListener { +public class PlayerEventListener { + @Subscriber public void playerMoveEventHandler(SC_PlayerMoveEvent event) { log.debug("(SC) playerMoveEventHandler()"); PlayerPositionAndLookPacket packet = new PlayerPositionAndLookPacket(); @@ -23,6 +25,7 @@ class PlayerEventListener { event.getPlayer().getChannel().writeAndFlush(packet); } + @Subscriber public void playerChunkLoadHandler(SC_ChunkLoadEvent event) { for(Integer compressXZ : event.getNeedLoadChunks()) { int[] xz = CompactedCoords.uncompressXZ(compressXZ); @@ -38,6 +41,7 @@ class PlayerEventListener { } } + @Subscriber public void playerChunkUnloadHandler(SC_ChunkUnloadEvent event) { for(Integer compressXZ : event.getNeedUnloadChunks()) { int[] xz = CompactedCoords.uncompressXZ(compressXZ); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 2f67167..8a677cd 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -2,6 +2,7 @@ package mc.core.network.proto_1_12_2.netty.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; +import mc.core.eventbus.EventBus; import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.TeleportManager; @@ -120,7 +121,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation()); event.setNewLocation(player.getLocation()); event.setRecalcChunk(true); -// EventBusGetter.getInstance().post(event); + EventBus.getInstance().post(event); } } } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java index acf38b7..c1675ba 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java @@ -1,13 +1,10 @@ -/* - * DmitriyMX - * 2018-06-23 - */ package mc.core.network.proto_1_12_2.netty.handlers; import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.chat.ChatProcessor; +import mc.core.eventbus.EventBus; import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.*; @@ -82,7 +79,7 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle player.getLocation().getYaw(), player.getLocation().getPitch() )); -// EventBusGetter.getInstance().post(event); + EventBus.getInstance().post(event); } @Handler From aa9bb7bbf475e80536b8ebf70e25e16eb41af26c Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 12 Jan 2019 21:46:09 +0300 Subject: [PATCH 7/7] update gradle config (cherry picked from commit f1628555efad07dff36d16f15a9813daabc00057) --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index ccd332c..efd39ba 100644 --- a/build.gradle +++ b/build.gradle @@ -107,6 +107,8 @@ task runServer(type: JavaExec) { if (System.getProperty("logImplDir") != null) { classpath += files(fileTree(dir: new File(System.getProperty("logImplDir")))) + } else { + classpath += files(fileTree(dir: new File(workingDir, "log-impl"))) } System.getProperties().stringPropertyNames().stream()