Archived
0

Merge remote-tracking branch 'origin/event' into proto_1.12.2

# Conflicts:
#	core/src/main/java/mc/core/GameLoop.java
#	proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java
This commit is contained in:
2018-08-26 15:44:21 +03:00
16 changed files with 116 additions and 98 deletions

View File

@@ -0,0 +1,81 @@
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;
import mc.core.utils.CompactedCoords;
import mc.core.world.chunk.Chunk;
import javax.annotation.PostConstruct;
import java.util.Iterator;
@Slf4j
public class CoreEventListener {
@PostConstruct
public void registerEventHandlers() {
EventBusGetter.getInstance().register(this);
}
@Subscribe
public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) {
log.trace("(GameLoop) playerMoveEventHandler()");
Chunk chunk;
chunk = event.getOldLocation().getChunk(); // Old chunk
int ccX = chunk.getX();
int ccZ = chunk.getZ();
chunk = event.getNewLocation().getChunk(); // Next chunk
int ncX = chunk.getX();
int ncZ = chunk.getZ();
if (event.isRecalcChunk() || (ncX != ccX || ncZ != ccZ)) {
final int viewDistance = event.getPlayer().getSettings().getViewDistance() + 1;
int cMinX = chunk.getX() - viewDistance;
int cMaxX = chunk.getX() + viewDistance;
int cMinZ = chunk.getZ() - viewDistance;
int cMaxZ = chunk.getZ() + viewDistance;
SC_ChunkUnloadEvent eventChunkUnload = new SC_ChunkUnloadEvent(event.getPlayer());
Iterator<Integer> itr = event.getPlayer().getLoadedChunks().iterator();
while(itr.hasNext()) {
int compressXZ = itr.next();
int[] xz = CompactedCoords.uncompressXZ(compressXZ);
if (xz[0] > cMaxX || xz[0] < cMinX || xz[1] > cMaxZ || xz[1] < cMinZ) {
eventChunkUnload.getNeedUnloadChunks().add(compressXZ);
itr.remove();
}
}
if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) {
EventBusGetter.getInstance().post(eventChunkUnload);
}
SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer());
for (int cZ = cMinZ; cZ <= cMaxZ; cZ++) {
for (int cX = cMinX; cX <= cMaxX; cX++) {
int compressXZ = CompactedCoords.compressXZ(cX, cZ);
if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) {
if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) {
eventChunkLoad.getNeedLoadChunks().add(compressXZ);
event.getPlayer().getLoadedChunks().add(compressXZ);
}
}
}
}
if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) {
EventBusGetter.getInstance().post(eventChunkLoad);
}
}
event.getPlayer().getLocation().setXYZ(event.getNewLocation());
// TODO отсылать клиенту только(!) для корректировки позиции
// SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer());
// nextEvent.setNewLocation(event.getNewLocation());
// EventBusGetter.INSTANCE.post(nextEvent);
}
}

View File

@@ -4,22 +4,12 @@
*/ */
package mc.core; package mc.core;
import com.google.common.eventbus.Subscribe;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.events.CS_PlayerMoveEvent;
import mc.core.events.EventBusGetter;
import mc.core.events.SC_ChunkLoadEvent;
import mc.core.events.SC_ChunkUnloadEvent;
import mc.core.player.PlayerManager; import mc.core.player.PlayerManager;
import mc.core.time.TimeProcessor; import mc.core.time.TimeProcessor;
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.beans.factory.annotation.Autowired;
import java.util.Iterator;
@Slf4j @Slf4j
public class GameLoop extends Thread { public class GameLoop extends Thread {
private final TpsWatcher TPS_WATCHER = TpsWatcher.getInstance(); private final TpsWatcher TPS_WATCHER = TpsWatcher.getInstance();
@@ -48,77 +38,16 @@ public class GameLoop extends Thread {
TPS_WATCHER.setTraceTPS(value); TPS_WATCHER.setTraceTPS(value);
} }
@Subscribe
public void playerMoveEventHandler(CS_PlayerMoveEvent event) {
log.trace("(GameLoop) playerMoveEventHandler()");
Chunk chunk;
chunk = event.getOldLocation().getChunk(); // Old chunk
int ccX = chunk.getX();
int ccZ = chunk.getZ();
chunk = event.getNewLocation().getChunk(); // Next chunk
int ncX = chunk.getX();
int ncZ = chunk.getZ();
if (event.isRecalcChunk() || (ncX != ccX || ncZ != ccZ)) {
final int viewDistance = event.getPlayer().getSettings().getViewDistance() + 1;
int cMinX = chunk.getX() - viewDistance;
int cMaxX = chunk.getX() + viewDistance;
int cMinZ = chunk.getZ() - viewDistance;
int cMaxZ = chunk.getZ() + viewDistance;
SC_ChunkUnloadEvent eventChunkUnload = new SC_ChunkUnloadEvent(event.getPlayer());
Iterator<Integer> itr = event.getPlayer().getLoadedChunks().iterator();
while(itr.hasNext()) {
int compressXZ = itr.next();
int[] xz = CompactedCoords.uncompressXZ(compressXZ);
if (xz[0] > cMaxX || xz[0] < cMinX || xz[1] > cMaxZ || xz[1] < cMinZ) {
eventChunkUnload.getNeedUnloadChunks().add(compressXZ);
itr.remove();
}
}
if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) {
EventBusGetter.INSTANCE.post(eventChunkUnload);
}
SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer());
for (int cZ = cMinZ; cZ <= cMaxZ; cZ++) {
for (int cX = cMinX; cX <= cMaxX; cX++) {
int compressXZ = CompactedCoords.compressXZ(cX, cZ);
if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) {
if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) {
eventChunkLoad.getNeedLoadChunks().add(compressXZ);
event.getPlayer().getLoadedChunks().add(compressXZ);
}
}
}
}
if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) {
EventBusGetter.INSTANCE.post(eventChunkLoad);
}
}
event.getPlayer().getLocation().setXYZ(event.getNewLocation());
// TODO отсылать клиенту только(!) для корректировки позиции
// SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer());
// nextEvent.setNewLocation(event.getNewLocation());
// EventBusGetter.INSTANCE.post(nextEvent);
}
@Override @Override
public void run() { public void run() {
TPS_WATCHER.startWatch(); TPS_WATCHER.startWatch();
EventBusGetter.INSTANCE.register(this);
while (!isInterrupted()) { while (!isInterrupted()) {
TPS_WATCHER.check(); TPS_WATCHER.check();
/* --- --- --- */ /* --- --- --- */
/* TODO нужно перенести этот функционал на Network */
playerManager.getBroadcastChannel().sendTimeUpdate( playerManager.getBroadcastChannel().sendTimeUpdate(
gameTimer.getGameTime(), gameTimer.getGameTime(),
gameTimer.getWorldAge() gameTimer.getWorldAge()

View File

@@ -2,7 +2,7 @@
* DmitriyMX <dimon550@gmail.com> * DmitriyMX <dimon550@gmail.com>
* 2018-05-02 * 2018-05-02
*/ */
package mc.core.events; package mc.core.eventbus;
public interface Event { public interface Event {
void setCanceled(boolean value); void setCanceled(boolean value);

View File

@@ -2,7 +2,7 @@
* DmitriyMX <dimon550@gmail.com> * DmitriyMX <dimon550@gmail.com>
* 2018-05-02 * 2018-05-02
*/ */
package mc.core.events; package mc.core.eventbus;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;

View File

@@ -2,12 +2,14 @@
* DmitriyMX <dimon550@gmail.com> * DmitriyMX <dimon550@gmail.com>
* 2018-05-02 * 2018-05-02
*/ */
package mc.core.events; package mc.core.eventbus;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
import lombok.Getter;
public final class EventBusGetter { public final class EventBusGetter {
public static final EventBus INSTANCE = new EventBus(); @Getter
private static final EventBus instance = new EventBus();
private EventBusGetter() { private EventBusGetter() {
} }

View File

@@ -2,12 +2,13 @@
* DmitriyMX <dimon550@gmail.com> * DmitriyMX <dimon550@gmail.com>
* 2018-05-02 * 2018-05-02
*/ */
package mc.core.events; package mc.core.eventbus.events;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import mc.core.EntityLocation; import mc.core.EntityLocation;
import mc.core.eventbus.EventBase;
import mc.core.player.Player; import mc.core.player.Player;
@RequiredArgsConstructor @RequiredArgsConstructor

View File

@@ -1,7 +1,8 @@
package mc.core.events; package mc.core.eventbus.events;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import mc.core.eventbus.EventBase;
import mc.core.player.Player; import mc.core.player.Player;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -1,7 +1,8 @@
package mc.core.events; package mc.core.eventbus.events;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import mc.core.eventbus.EventBase;
import mc.core.player.Player; import mc.core.player.Player;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -2,18 +2,19 @@
* DmitriyMX <dimon550@gmail.com> * DmitriyMX <dimon550@gmail.com>
* 2018-05-02 * 2018-05-02
*/ */
package mc.core.events; package mc.core.eventbus.events;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import mc.core.eventbus.EventBase;
import java.net.SocketAddress; import java.net.SocketAddress;
@RequiredArgsConstructor @RequiredArgsConstructor
@Getter @Getter
@Setter @Setter
public class LoginEvent extends EventBase { public class SC_LoginEvent extends EventBase {
private String playerName; private String playerName;
private final SocketAddress remoteAddress; private final SocketAddress remoteAddress;
private boolean deny; private boolean deny;

View File

@@ -2,18 +2,19 @@
* DmitriyMX <dimon550@gmail.com> * DmitriyMX <dimon550@gmail.com>
* 2018-05-02 * 2018-05-02
*/ */
package mc.core.events; package mc.core.eventbus.events;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import mc.core.EntityLocation; import mc.core.EntityLocation;
import mc.core.eventbus.EventBase;
import mc.core.player.Player; import mc.core.player.Player;
@RequiredArgsConstructor @RequiredArgsConstructor
@Getter @Getter
@Setter @Setter
public class PlayerLookEvent extends EventBase { public class SC_PlayerLookEvent extends EventBase {
private final Player player; private final Player player;
private EntityLocation newLook; private EntityLocation newLook;
} }

View File

@@ -1,9 +1,10 @@
package mc.core.events; package mc.core.eventbus.events;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import mc.core.EntityLocation; import mc.core.EntityLocation;
import mc.core.eventbus.EventBase;
import mc.core.player.Player; import mc.core.player.Player;
@RequiredArgsConstructor @RequiredArgsConstructor

View File

@@ -2,18 +2,19 @@
* DmitriyMX <dimon550@gmail.com> * DmitriyMX <dimon550@gmail.com>
* 2018-05-02 * 2018-05-02
*/ */
package mc.core.events; package mc.core.eventbus.events;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import mc.core.eventbus.EventBase;
import java.net.SocketAddress; import java.net.SocketAddress;
@RequiredArgsConstructor @RequiredArgsConstructor
@Getter @Getter
@Setter @Setter
public class ServerPingEvent extends EventBase { public class SC_ServerPingEvent extends EventBase {
private final SocketAddress remoteAddress; private final SocketAddress remoteAddress;
private String description; private String description;
private int online; private int online;

View File

@@ -14,7 +14,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.events.EventBusGetter; import mc.core.eventbus.EventBusGetter;
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 +64,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.INSTANCE.register(new PlayerEventListener()); EventBusGetter.getInstance().register(new PlayerEventListener());
bossGroup = new NioEventLoopGroup(1); bossGroup = new NioEventLoopGroup(1);
workerGroup = new NioEventLoopGroup(workerGroupCount); workerGroup = new NioEventLoopGroup(workerGroupCount);

View File

@@ -2,16 +2,15 @@ package mc.core.network.proto_1_12_2.netty;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.events.SC_ChunkLoadEvent; import mc.core.eventbus.events.SC_ChunkLoadEvent;
import mc.core.events.SC_ChunkUnloadEvent; import mc.core.eventbus.events.SC_ChunkUnloadEvent;
import mc.core.events.SC_PlayerMoveEvent; import mc.core.eventbus.events.SC_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.ChunkDataPacket; import mc.core.network.proto_1_12_2.packets.ChunkDataPacket;
import mc.core.network.proto_1_12_2.packets.PlayerPositionAndLookPacket; import mc.core.network.proto_1_12_2.packets.PlayerPositionAndLookPacket;
import mc.core.network.proto_1_12_2.packets.UnloadChunkPacket; import mc.core.network.proto_1_12_2.packets.UnloadChunkPacket;
import mc.core.utils.CompactedCoords; import mc.core.utils.CompactedCoords;
import mc.core.world.chunk.Chunk; import mc.core.world.chunk.Chunk;
import mc.core.world.chunk.ChunkSection;
@Slf4j @Slf4j
class PlayerEventListener { class PlayerEventListener {

View File

@@ -6,8 +6,8 @@ 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.events.CS_PlayerMoveEvent; import mc.core.eventbus.events.CS_PlayerMoveEvent;
import mc.core.events.EventBusGetter; import mc.core.eventbus.EventBusGetter;
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;
import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetChannel; import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetChannel;
@@ -140,7 +140,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.INSTANCE.post(event); EventBusGetter.getInstance().post(event);
} }
} }
} }

View File

@@ -8,8 +8,8 @@ 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.events.CS_PlayerMoveEvent; import mc.core.eventbus.events.CS_PlayerMoveEvent;
import mc.core.events.EventBusGetter; import mc.core.eventbus.EventBusGetter;
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.*;
import mc.core.player.Player; import mc.core.player.Player;
@@ -85,7 +85,7 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle
player.getLocation().getPitch(), player.getLocation().getPitch(),
player.getLocation().getWorld() player.getLocation().getWorld()
)); ));
EventBusGetter.INSTANCE.post(event); EventBusGetter.getInstance().post(event);
} }
@Handler @Handler