package com.jenjinstudios.world.server; import com.jenjinstudios.core.MessageIO; import com.jenjinstudios.core.io.Message; import com.jenjinstudios.server.net.ClientHandler; import com.jenjinstudios.world.Actor; import com.jenjinstudios.world.WorldObject; import com.jenjinstudios.world.actor.Vision; import com.jenjinstudios.world.server.message.WorldServerMessageFactory; import com.jenjinstudios.world.state.MoveState; import java.util.List; import java.util.Set; /** * Handles clients for a world server. * * @author Caleb Brinkman */ public class WorldClientHandler extends ClientHandler { private final WorldServerMessageFactory messageFactory; private Actor player; private boolean hasSentActorStepMessage; public WorldClientHandler(WorldServer s, MessageIO messageIO) { super(s, messageIO); this.messageFactory = new WorldServerMessageFactory(); setPlayer(new Actor("PLAYER")); getPlayer().addPreUpdateEvent(Vision.EVENT_NAME, new Vision(getPlayer())); } @Override public void update() { super.update(); if (!hasSentActorStepMessage) { getMessageIO().queueOutgoingMessage(getMessageFactory().generateActorMoveSpeedMessage(player.getMoveSpeed ())); hasSentActorStepMessage = true; } queueForcesStateMessage(); queueNewlyVisibleMessages(); queueNewlyInvisibleMessages(); queueStateChangeMessages(); } public WorldServerMessageFactory getMessageFactory() { return messageFactory; } public Actor getPlayer() { return player; } protected void setPlayer(Actor player) { this.player = player; } private void queueNewlyVisibleMessages() { Object o = player.getPreUpdateEvent(Vision.EVENT_NAME); if (o != null && o instanceof Vision) { Vision vision = (Vision) o; for (WorldObject object : vision.getNewlyVisibleObjects()) { Message newlyVisibleMessage; newlyVisibleMessage = getMessageFactory().generateNewlyVisibleMessage(object); getMessageIO().queueOutgoingMessage(newlyVisibleMessage); } } } private void queueNewlyInvisibleMessages() { Object o = player.getPreUpdateEvent(Vision.EVENT_NAME); if (o != null && o instanceof Vision) { Vision vision = (Vision) o; for (WorldObject object : vision.getNewlyInvisibleObjects()) { Message newlyInvisibleMessage = getMessageFactory().generateNewlyInvisibleMessage(object); getMessageIO().queueOutgoingMessage(newlyInvisibleMessage); } } } private void queueStateChangeMessages() { Object o = player.getPreUpdateEvent(Vision.EVENT_NAME); if (o != null && o instanceof Vision) { Vision vision = (Vision) o; Set<WorldObject> visibles = vision.getVisibleObjects(); visibles.stream().filter(object -> object instanceof Actor).forEach(object -> queueActorStateChangeMessages((Actor) object)); } } private void queueActorStateChangeMessages(Actor object) { List<Message> newState = getMessageFactory().generateChangeStateMessages(object); newState.forEach(getMessageIO()::queueOutgoingMessage); } private void queueForcesStateMessage() { MoveState forcedState = player.getForcedState(); if (forcedState != null) getMessageIO().queueOutgoingMessage(getMessageFactory().generateForcedStateMessage(forcedState)); } }