Archived
0

Переход на свой EventBus

This commit is contained in:
2019-01-12 21:44:55 +03:00
parent d042169952
commit 04d25aaf65
8 changed files with 31 additions and 24 deletions

View File

@@ -1,6 +1,8 @@
package mc.core; package mc.core;
import lombok.extern.slf4j.Slf4j; 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.CS_PlayerMoveEvent;
import mc.core.eventbus.events.SC_ChunkLoadEvent; import mc.core.eventbus.events.SC_ChunkLoadEvent;
import mc.core.eventbus.events.SC_ChunkUnloadEvent; import mc.core.eventbus.events.SC_ChunkUnloadEvent;
@@ -14,12 +16,11 @@ import java.util.Iterator;
public class CoreEventListener { public class CoreEventListener {
@PostConstruct @PostConstruct
public void registerEventHandlers() { public void registerEventHandlers() {
// EventBusGetter.getInstance().register(this); EventBus.getInstance().registerSubscribes(this);
} }
@Subscriber
public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) { public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) {
log.trace("(GameLoop) playerMoveEventHandler()");
Chunk chunk; Chunk chunk;
chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation().toBlockLocation()); // Old chunk chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation().toBlockLocation()); // Old chunk
int ccX = chunk.getX(); int ccX = chunk.getX();
@@ -47,7 +48,7 @@ public class CoreEventListener {
} }
if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) { if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) {
// EventBusGetter.getInstance().post(eventChunkUnload); EventBus.getInstance().post(eventChunkUnload);
} }
SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer()); SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer());
@@ -64,7 +65,7 @@ public class CoreEventListener {
} }
if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) {
// EventBusGetter.getInstance().post(eventChunkLoad); EventBus.getInstance().post(eventChunkLoad);
} }
} }

View File

@@ -6,6 +6,7 @@ package mc.core;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.eventbus.EventBus;
import mc.core.player.PlayerManager; import mc.core.player.PlayerManager;
import mc.core.time.TimeProcessor; import mc.core.time.TimeProcessor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -47,6 +48,8 @@ public class GameLoop extends Thread {
/* --- --- --- */ /* --- --- --- */
EventBus.getInstance().process();
/* TODO нужно перенести этот функционал на Network */ /* TODO нужно перенести этот функционал на Network */
playerManager.getBroadcastChannel().sendTimeUpdate( playerManager.getBroadcastChannel().sendTimeUpdate(
gameTimer.getGameTime(), gameTimer.getGameTime(),

View File

@@ -17,7 +17,7 @@ import java.util.stream.Stream;
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public class EventBus { public class EventBus {
@Getter @Getter
private static final EventBus insnance = new EventBus(); private static final EventBus instance = new EventBus();
private Queue<Event> eventQueue = new ConcurrentLinkedQueue<>(); private Queue<Event> eventQueue = new ConcurrentLinkedQueue<>();
private Map<Class<? extends Event>, List<Pair<Object, Method>>> subscribes = new HashMap<>(); private Map<Class<? extends Event>, List<Pair<Object, Method>>> subscribes = new HashMap<>();

View File

@@ -26,21 +26,21 @@ class TestEventBus {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Map<Class<? extends Event>, List<Pair<Object, Method>>> getEventBusFieldSubscribes() { private Map<Class<? extends Event>, List<Pair<Object, Method>>> getEventBusFieldSubscribes() {
return (Map<Class<? extends Event>, List<Pair<Object, Method>>>) return (Map<Class<? extends Event>, List<Pair<Object, Method>>>)
Whitebox.getInternalState(EventBus.getInsnance(), "subscribes"); Whitebox.getInternalState(EventBus.getInstance(), "subscribes");
} }
@BeforeEach @BeforeEach
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
void before() { void before() {
getEventBusFieldSubscribes().clear(); getEventBusFieldSubscribes().clear();
((Queue<Event>) Whitebox.getInternalState(EventBus.getInsnance(), "eventQueue")).clear(); ((Queue<Event>) Whitebox.getInternalState(EventBus.getInstance(), "eventQueue")).clear();
} }
@Test @Test
void testRegisterSubscribes() { void testRegisterSubscribes() {
DumbEventHandler handler = new DumbEventHandler(); DumbEventHandler handler = new DumbEventHandler();
EventBus.getInsnance().registerSubscribes(handler); EventBus.getInstance().registerSubscribes(handler);
Map<Class<? extends Event>, List<Pair<Object, Method>>> subscribes = getEventBusFieldSubscribes(); Map<Class<? extends Event>, List<Pair<Object, Method>>> subscribes = getEventBusFieldSubscribes();
assertEquals(1, subscribes.size()); assertEquals(1, subscribes.size());
@@ -56,9 +56,9 @@ class TestEventBus {
@Test @Test
void testUnregisterSubscribes() { void testUnregisterSubscribes() {
DumbEventHandler handler = new DumbEventHandler(); DumbEventHandler handler = new DumbEventHandler();
EventBus.getInsnance().registerSubscribes(handler); EventBus.getInstance().registerSubscribes(handler);
EventBus.getInsnance().unregisterSubscribes(handler); EventBus.getInstance().unregisterSubscribes(handler);
Map<Class<? extends Event>, List<Pair<Object, Method>>> subscribes = getEventBusFieldSubscribes(); Map<Class<? extends Event>, List<Pair<Object, Method>>> subscribes = getEventBusFieldSubscribes();
assertEquals(0, subscribes.size()); assertEquals(0, subscribes.size());
@@ -67,21 +67,21 @@ class TestEventBus {
@Test @Test
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
void testPost() { void testPost() {
EventBus.getInsnance().post(new DumbEvent()); EventBus.getInstance().post(new DumbEvent());
Queue<Event> eventQueue = (Queue<Event>) Whitebox.getInternalState(EventBus.getInsnance(), "eventQueue"); Queue<Event> eventQueue = (Queue<Event>) Whitebox.getInternalState(EventBus.getInstance(), "eventQueue");
assertEquals(1, eventQueue.size()); assertEquals(1, eventQueue.size());
} }
@Test @Test
void testProcess() { void testProcess() {
Stream.of(new DumbEventHandler("D1 "), new DumbEventHandler("D2 ")) 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")) 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(4, resultList.size());
assertEquals("D1 message 1", resultList.get(0)); assertEquals("D1 message 1", resultList.get(0));

View File

@@ -11,6 +11,7 @@ import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.util.AttributeKey; import io.netty.util.AttributeKey;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.eventbus.EventBus;
import mc.core.network.Server; import mc.core.network.Server;
import mc.core.network.StartServerException; import mc.core.network.StartServerException;
import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.State;
@@ -64,7 +65,7 @@ public class NettyServer implements Server {
public void start() throws StartServerException { public void start() throws StartServerException {
log.info("Use protocol {}", StatusResponsePacket.NAME); log.info("Use protocol {}", StatusResponsePacket.NAME);
// EventBusGetter.getInstance().register(new PlayerEventListener()); EventBus.getInstance().registerSubscribes(new PlayerEventListener());
bossGroup = new NioEventLoopGroup(1); bossGroup = new NioEventLoopGroup(1);
workerGroup = new NioEventLoopGroup(workerGroupCount); workerGroup = new NioEventLoopGroup(workerGroupCount);

View File

@@ -1,6 +1,7 @@
package mc.core.network.proto_1_12_2.netty; package mc.core.network.proto_1_12_2.netty;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.eventbus.Subscriber;
import mc.core.eventbus.events.SC_ChunkLoadEvent; import mc.core.eventbus.events.SC_ChunkLoadEvent;
import mc.core.eventbus.events.SC_ChunkUnloadEvent; import mc.core.eventbus.events.SC_ChunkUnloadEvent;
import mc.core.eventbus.events.SC_PlayerMoveEvent; import mc.core.eventbus.events.SC_PlayerMoveEvent;
@@ -12,7 +13,8 @@ import mc.core.utils.CompactedCoords;
import mc.core.world.chunk.Chunk; import mc.core.world.chunk.Chunk;
@Slf4j @Slf4j
class PlayerEventListener { public class PlayerEventListener {
@Subscriber
public void playerMoveEventHandler(SC_PlayerMoveEvent event) { public void playerMoveEventHandler(SC_PlayerMoveEvent event) {
log.debug("(SC) playerMoveEventHandler()"); log.debug("(SC) playerMoveEventHandler()");
PlayerPositionAndLookPacket packet = new PlayerPositionAndLookPacket(); PlayerPositionAndLookPacket packet = new PlayerPositionAndLookPacket();
@@ -23,6 +25,7 @@ class PlayerEventListener {
event.getPlayer().getChannel().writeAndFlush(packet); event.getPlayer().getChannel().writeAndFlush(packet);
} }
@Subscriber
public void playerChunkLoadHandler(SC_ChunkLoadEvent event) { public void playerChunkLoadHandler(SC_ChunkLoadEvent event) {
for(Integer compressXZ : event.getNeedLoadChunks()) { for(Integer compressXZ : event.getNeedLoadChunks()) {
int[] xz = CompactedCoords.uncompressXZ(compressXZ); int[] xz = CompactedCoords.uncompressXZ(compressXZ);
@@ -38,6 +41,7 @@ class PlayerEventListener {
} }
} }
@Subscriber
public void playerChunkUnloadHandler(SC_ChunkUnloadEvent event) { public void playerChunkUnloadHandler(SC_ChunkUnloadEvent event) {
for(Integer compressXZ : event.getNeedUnloadChunks()) { for(Integer compressXZ : event.getNeedUnloadChunks()) {
int[] xz = CompactedCoords.uncompressXZ(compressXZ); int[] xz = CompactedCoords.uncompressXZ(compressXZ);

View File

@@ -2,6 +2,7 @@ package mc.core.network.proto_1_12_2.netty.handlers;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelFutureListener;
import mc.core.eventbus.EventBus;
import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.events.CS_PlayerMoveEvent;
import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.State;
import mc.core.network.proto_1_12_2.TeleportManager; 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()); CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation());
event.setNewLocation(player.getLocation()); event.setNewLocation(player.getLocation());
event.setRecalcChunk(true); event.setRecalcChunk(true);
// EventBusGetter.getInstance().post(event); EventBus.getInstance().post(event);
} }
} }
} }

View File

@@ -1,13 +1,10 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-06-23
*/
package mc.core.network.proto_1_12_2.netty.handlers; package mc.core.network.proto_1_12_2.netty.handlers;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.EntityLocation; import mc.core.EntityLocation;
import mc.core.chat.ChatProcessor; import mc.core.chat.ChatProcessor;
import mc.core.eventbus.EventBus;
import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.events.CS_PlayerMoveEvent;
import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.TeleportManager;
import mc.core.network.proto_1_12_2.packets.*; 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().getYaw(),
player.getLocation().getPitch() player.getLocation().getPitch()
)); ));
// EventBusGetter.getInstance().post(event); EventBus.getInstance().post(event);
} }
@Handler @Handler