Merge remote-tracking branch 'event' into world-loader-anvil
# Conflicts: # core/src/main/java/mc/core/CoreEventListener.java
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
package mc.core;
|
||||
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import mc.core.eventbus.EventBusGetter;
|
||||
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;
|
||||
@@ -16,13 +16,11 @@ import java.util.Iterator;
|
||||
public class CoreEventListener {
|
||||
@PostConstruct
|
||||
public void registerEventHandlers() {
|
||||
EventBusGetter.getInstance().register(this);
|
||||
EventBus.getInstance().registerSubscribes(this);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
@Subscriber
|
||||
public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) {
|
||||
log.trace("(GameLoop) playerMoveEventHandler()");
|
||||
|
||||
Chunk chunk;
|
||||
chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation().toBlockLocation()); // Old chunk
|
||||
if (chunk == null) return;
|
||||
@@ -54,7 +52,7 @@ public class CoreEventListener {
|
||||
}
|
||||
|
||||
if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) {
|
||||
EventBusGetter.getInstance().post(eventChunkLoad);
|
||||
EventBus.getInstance().post(eventChunkLoad);
|
||||
}
|
||||
|
||||
SC_ChunkUnloadEvent eventChunkUnload = new SC_ChunkUnloadEvent(event.getPlayer());
|
||||
@@ -69,7 +67,7 @@ public class CoreEventListener {
|
||||
}
|
||||
|
||||
if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) {
|
||||
EventBusGetter.getInstance().post(eventChunkUnload);
|
||||
EventBus.getInstance().post(eventChunkUnload);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -1,13 +1,4 @@
|
||||
/*
|
||||
* DmitriyMX <dimon550@gmail.com>
|
||||
* 2018-05-02
|
||||
*/
|
||||
package mc.core.eventbus;
|
||||
|
||||
public interface Event {
|
||||
void setCanceled(boolean value);
|
||||
boolean isCanceled();
|
||||
|
||||
void setLastProcess(boolean value);
|
||||
boolean isLastProcess();
|
||||
}
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/*
|
||||
* DmitriyMX <dimon550@gmail.com>
|
||||
* 2018-05-02
|
||||
*/
|
||||
package mc.core.eventbus;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public abstract class EventBase implements Event {
|
||||
private boolean canceled;
|
||||
private boolean lastProcess;
|
||||
}
|
||||
89
core/src/main/java/mc/core/eventbus/EventBus.java
Normal file
89
core/src/main/java/mc/core/eventbus/EventBus.java
Normal file
@@ -0,0 +1,89 @@
|
||||
package mc.core.eventbus;
|
||||
|
||||
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 instance = new EventBus();
|
||||
|
||||
private Queue<Event> eventQueue = new ConcurrentLinkedQueue<>();
|
||||
private Map<Class<? extends Event>, List<Pair<Object, Method>>> subscribes = new HashMap<>();
|
||||
|
||||
private Stream<Method> 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]));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void registerSubscribes(Object subscriberObject) {
|
||||
getMethods(subscriberObject)
|
||||
.forEach(method -> {
|
||||
final Class<? extends Event> type = (Class<? extends Event>) method.getParameterTypes()[0];
|
||||
final List<Pair<Object, Method>> pairs;
|
||||
if (subscribes.containsKey(type)) {
|
||||
pairs = subscribes.get(type);
|
||||
} else {
|
||||
pairs = new ArrayList<>();
|
||||
subscribes.put(type, pairs);
|
||||
}
|
||||
pairs.add(new Pair<>(subscriberObject, method));
|
||||
});
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void unregisterSubscribes(Object subscriberObject) {
|
||||
getMethods(subscriberObject)
|
||||
.forEach(method -> {
|
||||
final Class<? extends Event> type = (Class<? extends Event>) method.getParameterTypes()[0];
|
||||
if (subscribes.containsKey(type)) {
|
||||
final List<Pair<Object, Method>> pairs = subscribes.get(type);
|
||||
pairs.removeIf(pair -> pair.getKey() == subscriberObject);
|
||||
|
||||
if (pairs.isEmpty()) {
|
||||
subscribes.remove(type);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void post(Event event) {
|
||||
eventQueue.add(event);
|
||||
}
|
||||
|
||||
public void process() {
|
||||
Event event;
|
||||
while ((event = eventQueue.poll()) != null) {
|
||||
final Class<? extends Event> type = event.getClass();
|
||||
if (subscribes.containsKey(type)) {
|
||||
final List<Pair<Object, Method>> pairs = subscribes.get(type);
|
||||
for (Pair<Object, Method> 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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
/*
|
||||
* DmitriyMX <dimon550@gmail.com>
|
||||
* 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() {
|
||||
}
|
||||
}
|
||||
11
core/src/main/java/mc/core/eventbus/Subscriber.java
Normal file
11
core/src/main/java/mc/core/eventbus/Subscriber.java
Normal file
@@ -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 {
|
||||
}
|
||||
@@ -1,18 +1,14 @@
|
||||
/*
|
||||
* DmitriyMX <dimon550@gmail.com>
|
||||
* 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
/*
|
||||
* DmitriyMX <dimon550@gmail.com>
|
||||
* 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;
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
/*
|
||||
* DmitriyMX <dimon550@gmail.com>
|
||||
* 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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
/*
|
||||
* DmitriyMX <dimon550@gmail.com>
|
||||
* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user