Archived
0

core: выделение обработчиков событий в отдельный класс

This commit is contained in:
2018-08-17 11:44:22 +03:00
parent a3b40b750a
commit ab08a72317
2 changed files with 61 additions and 49 deletions

View File

@@ -0,0 +1,60 @@
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.utils.CompactedCoords;
import mc.core.world.chunk.Chunk;
import javax.annotation.PostConstruct;
@Slf4j
public class CoreEventListener {
@PostConstruct
public void registerEventHandlers() {
EventBusGetter.getInstance().register(this);
}
@Subscribe
public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) {
event.getPlayer().getLocation().setXYZ(event.getNewLocation());
Chunk chunk = event.getNewLocation().getChunk(); // Next chunk
int ncX = chunk.getX();
int ncZ = chunk.getZ();
chunk = event.getPlayer().getLocation().getChunk(); // Current chunk
int ccX = chunk.getX();
int ccZ = chunk.getZ();
if (event.isRecalcChunk() || (ncX != ccX && ncZ != ccZ)) {
final int viewDistance = event.getPlayer().getSettings().getViewDistance();
int cMinX = chunk.getX() - viewDistance;
int cMaxX = chunk.getX() + viewDistance;
int cMinZ = chunk.getZ() - viewDistance;
int cMaxZ = chunk.getZ() + viewDistance;
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);
}
}
}
}
if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) {
EventBusGetter.getInstance().post(eventChunkLoad);
}
}
// TODO отсылать клиенту только(!) для корректировки позиции
// SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer());
// nextEvent.setNewLocation(event.getNewLocation());
// EventBusGetter.INSTANCE.post(nextEvent);
}
}

View File

@@ -4,16 +4,11 @@
*/ */
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.eventbus.events.CS_PlayerMoveEvent;
import mc.core.eventbus.EventBusGetter; import mc.core.eventbus.EventBusGetter;
import mc.core.eventbus.events.SC_ChunkLoadEvent;
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.chunk.Chunk;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@Slf4j @Slf4j
@@ -44,59 +39,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()");
event.getPlayer().getLocation().setXYZ(event.getNewLocation());
Chunk chunk = event.getNewLocation().getChunk(); // Next chunk
int ncX = chunk.getX();
int ncZ = chunk.getZ();
chunk = event.getPlayer().getLocation().getChunk(); // Current chunk
int ccX = chunk.getX();
int ccZ = chunk.getZ();
if (event.isRecalcChunk() || (ncX != ccX && ncZ != ccZ)) {
final int viewDistance = event.getPlayer().getSettings().getViewDistance();
int cMinX = chunk.getX() - viewDistance;
int cMaxX = chunk.getX() + viewDistance;
int cMinZ = chunk.getZ() - viewDistance;
int cMaxZ = chunk.getZ() + viewDistance;
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);
}
}
}
}
if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) {
EventBusGetter.getInstance().post(eventChunkLoad);
}
}
// 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.getInstance().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()