package network; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.nio.ByteOrder; import org.apache.mina.core.buffer.IoBuffer; import protocol.ProtocolHandler; public class NetworkDispatch { private ProtocolHandler handler; private boolean isZone; private ExecutorService threadPool = Executors.newCachedThreadPool(); private List<Service> services = new ArrayList<Service>(); private ExecutorService eventThreadPool; private Map<Integer, PacketHandler> packetHandlers = new HashMap<Integer, PacketHandler>(); private Map<Integer, PacketHandler> objControllerHandlers = new HashMap<Integer, PacketHandler>(); private UDPServer server; public NetworkDispatch(ProtocolHandler handler, boolean isZone, UDPServer server) { this.handler = handler; this.isZone = isZone; this.server = server; } public ProtocolHandler getHandler() { return handler; } public void setHandler(ProtocolHandler handler) { this.handler = handler; } public void addService(Service service) { service.handlePackets(packetHandlers); service.handleObjControllerPackets(objControllerHandlers); services.add(service); } public void onRecieve(Client client, IoBuffer packet) { if(packet == null) return; threadPool.execute(() -> { packet.position(0); if(!packet.hasRemaining()) return; packet.order(ByteOrder.LITTLE_ENDIAN); int opcode = packet.getInt(2); PacketHandler handler = null; if(opcode == 0x80CE5E46) { handler = objControllerHandlers.get(opcode); if(handler == null) { //System.out.println("Unhandled Obj Controller Opcode: " + opcode); } } else { handler = packetHandlers.get(opcode); if(handler == null) { //System.out.println("Unhandled Opcode: " + opcode); } } packet.position(0); if(handler != null) { try { handler.handlePacket(client, packet); } catch (Exception e) { e.printStackTrace(); } } packet.free(); }); } public boolean isZone() { return isZone; } public void setZone(boolean isZone) { this.isZone = isZone; } public List<Service> getServices() { return services; } public void setServices(List<Service> services) { this.services = services; } public ExecutorService getEventThreadPool() { return eventThreadPool; } public void setEventThreadPool(ExecutorService eventThreadPool) { this.eventThreadPool = eventThreadPool; } public Map<Integer, PacketHandler> getPacketHandlers() { return packetHandlers; } public void setPacketHandlers(Map<Integer, PacketHandler> packetHandlers) { this.packetHandlers = packetHandlers; } public Map<Integer, PacketHandler> getObjControllerHandlers() { return objControllerHandlers; } public void setObjControllerHandlers(Map<Integer, PacketHandler> objControllerHandlers) { this.objControllerHandlers = objControllerHandlers; } public UDPServer getServer() { return server; } public void setServer(UDPServer server) { this.server = server; } }