public static void main( String[] args ) {
		final long clientEthernetAddress = 0x1234566;
		
		final GameClient client = new GameClient();
		client.clientEthernetAddress = clientEthernetAddress;
		
		//// Server stuff ////
		
		final QueuelessRealTimeEventSource<DGTimer<?>> evtReg = new QueuelessRealTimeEventSource<DGTimer<?>>();
		final Simulator sim = DungeonGame.initSim(evtReg.getCurrentTime());
		
		final VisibilityCache playerVc = new VisibilityCache(32, 32, 8, sim.getInternalUpdater());
		sim.commandee.setVisibilityCache(playerVc); 
		
		client.avatarEthernetAddress = sim.commandee.avatarEthernetAddress;
		sim.commandee.clientEthernetAddress = client.clientEthernetAddress;
		try {
			Connectors.connect( sim.playerRemoteTranceiverPort, new AbstractConnector<ObjectEthernetFrame<?>>(ConnectorTypes.rj45.male, ObjectEthernetFrame.GENERIC_CLASS) {
				@Override public boolean isLocked() { return false; }
				@Override public void messageReceived(ObjectEthernetFrame<?> message) {
					if( message.destAddress == client.clientEthernetAddress ) {
						if( message.payload instanceof Projection ) {
							client.projectionQueue.add((Projection)message.payload);
						}
					}
				}
			});
		} catch( ConnectionError e ) {
			e.printStackTrace();
			System.exit(1);
		}
		
		new CoreThread("Simulation runner") {
			public void _run() throws Exception {
				EventLoop.run(evtReg, sim);
			};
		}.start();
		
		new CoreThread("Command reader") {
			public void _run() throws InterruptedException {
				while(true) {
					evtReg.post(new DGTimer<ObjectEthernetFrame<?>>(AutoEventUpdatable.TIME_IMMEDIATE, sim.playerRemoteTranceiverPort, client.commandQueue.take()));
				}
			}
		}.start();
		
		client.openUi();
	}