package org.menacheri.zombie.game; import java.util.List; import org.menacheri.jetserver.app.GameCommandInterpreter; import org.menacheri.jetserver.app.Session; import org.menacheri.jetserver.app.impl.InvalidCommandException; import org.menacheri.jetserver.communication.DeliveryGuaranty.DeliveryGuarantyOptions; import org.menacheri.jetserver.communication.MessageBuffer; import org.menacheri.jetserver.communication.NettyMessageBuffer; import org.menacheri.jetserver.event.Event; import org.menacheri.jetserver.event.Events; import org.menacheri.jetserver.event.NetworkEvent; import org.menacheri.jetserver.event.impl.DefaultSessionEventHandler; import org.menacheri.zombie.domain.Defender; import org.menacheri.zombie.domain.IAM; import org.menacheri.zombie.domain.Zombie; import org.menacheri.zombie.domain.ZombieCommands; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings("rawtypes") public class SessionHandler extends DefaultSessionEventHandler implements GameCommandInterpreter { private static final Logger LOG = LoggerFactory.getLogger(SessionHandler.class); volatile int cmdCount; private Defender defender; private Zombie zombie; private IAM iam; public SessionHandler(Session session,Defender defender, Zombie zombie, IAM iam) { super(session); this.defender = defender; this.zombie = zombie; this.iam = iam; } public void onDataIn(Event event) { try { interpretCommand(event.getSource()); } catch (InvalidCommandException e) { e.printStackTrace(); LOG.error("{}",e); } } @Override public void interpretCommand(Object command) throws InvalidCommandException { cmdCount++; int type; int operation; boolean isDefaultProtocol = true; if(command instanceof MessageBuffer) { MessageBuffer buf = (MessageBuffer) command; type = buf.readInt(); operation = buf.readInt(); }else{ // websocket isDefaultProtocol = false; List<Double> data = (List)command; type = data.get(0).intValue(); operation = data.get(1).intValue(); } IAM iam = IAM.getWho(type); ZombieCommands cmd = ZombieCommands.CommandsEnum.fromInt(operation); switch (iam) { case ZOMBIE: switch (cmd) { case EAT_BRAINS: //LOG.trace("Interpreted command EAT_BRAINS"); zombie.eatBrains(); break; case SELECT_TEAM: LOG.trace("Interpreted command ZOMBIE SELECT_TEAM"); selectTeam(iam); break; } break; case DEFENDER: switch (cmd) { case SHOT_GUN: //LOG.trace("Interpreted command SHOT_GUN"); defender.shotgun(); break; case SELECT_TEAM: LOG.trace("Interpreted command DEFENDER SELECT_TEAM"); selectTeam(iam); break; } break; default: LOG.error("Received invalid command {}",cmd); throw new InvalidCommandException("Received invalid command" + cmd); } if((cmdCount % 10000) == 0) { NettyMessageBuffer buffer = new NettyMessageBuffer(); System.out.println("Command No: " + cmdCount); buffer.writeInt(cmdCount); // Event tcpEvent = Events.dataOutTcpEvent(buffer); // getSession().onEvent(tcpEvent); NetworkEvent udpEvent = null; if(isDefaultProtocol){ udpEvent = Events.networkEvent(buffer, DeliveryGuarantyOptions.FAST); }else{ udpEvent = Events.networkEvent(cmdCount);// for websocket protocol. } getSession().onEvent(udpEvent); } } public void selectTeam(IAM iam) { this.iam = iam; } public Defender getDefender() { return defender; } public void setDefender(Defender defender) { this.defender = defender; } public Zombie getZombie() { return zombie; } public void setZombie(Zombie zombie) { this.zombie = zombie; } public IAM getIam() { return iam; } public void setIam(IAM iam) { this.iam = iam; } }