core: выделение обработчиков событий в отдельный класс
This commit is contained in:
60
core/src/main/java/mc/core/CoreEventListener.java
Normal file
60
core/src/main/java/mc/core/CoreEventListener.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user