mirror of
https://github.com/simon987/Much-Assembly-Required.git
synced 2025-04-18 02:06:43 +00:00
Added secure WebSocket, Bug fixes, code cleanup
This commit is contained in:
parent
98b0c480b9
commit
c56f672b9d
@ -15,7 +15,9 @@ public class CubotDrill extends CpuHardware {
|
|||||||
|
|
||||||
public static final int DEFAULT_ADDRESS = 5;
|
public static final int DEFAULT_ADDRESS = 5;
|
||||||
|
|
||||||
private static final int GATHER = 1;
|
private static final int POLL = 1;
|
||||||
|
private static final int GATHER_SLOW = 2;
|
||||||
|
private static final int GATHER_FAST = 3;
|
||||||
|
|
||||||
private Cubot cubot;
|
private Cubot cubot;
|
||||||
|
|
||||||
@ -32,7 +34,11 @@ public class CubotDrill extends CpuHardware {
|
|||||||
public void handleInterrupt(Status status) {
|
public void handleInterrupt(Status status) {
|
||||||
int a = getCpu().getRegisterSet().getRegister("A").getValue();
|
int a = getCpu().getRegisterSet().getRegister("A").getValue();
|
||||||
|
|
||||||
if (a == GATHER) {
|
if (a == POLL) {
|
||||||
|
|
||||||
|
getCpu().getRegisterSet().getRegister("B").setValue(0);
|
||||||
|
|
||||||
|
} else if (a == GATHER_SLOW || a == GATHER_FAST) {
|
||||||
|
|
||||||
if (cubot.getAction() != CubotAction.IDLE) {
|
if (cubot.getAction() != CubotAction.IDLE) {
|
||||||
int tile = cubot.getWorld().getTileMap().getTileAt(cubot.getX(), cubot.getY());
|
int tile = cubot.getWorld().getTileMap().getTileAt(cubot.getX(), cubot.getY());
|
||||||
@ -46,19 +52,18 @@ public class CubotDrill extends CpuHardware {
|
|||||||
cubot.setCurrentAction(CubotAction.DIGGING);
|
cubot.setCurrentAction(CubotAction.DIGGING);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
System.out.println("FAILED: dig");
|
//System.out.println("FAILED: dig");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSONObject serialise() {
|
public JSONObject serialise() {
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("hwid", HWID);
|
json.put("hwid", (int) HWID);
|
||||||
json.put("cubot", cubot.getObjectId());
|
json.put("cubot", cubot.getObjectId());
|
||||||
|
|
||||||
return json;
|
return json;
|
||||||
|
@ -10,7 +10,7 @@ public class CubotInventory extends CpuHardware {
|
|||||||
/**
|
/**
|
||||||
* Hardware ID (Should be unique)
|
* Hardware ID (Should be unique)
|
||||||
*/
|
*/
|
||||||
static final int HWID = 0x0006;
|
static final char HWID = 0x0006;
|
||||||
|
|
||||||
public static final int DEFAULT_ADDRESS = 6;
|
public static final int DEFAULT_ADDRESS = 6;
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ public class CubotInventory extends CpuHardware {
|
|||||||
public JSONObject serialise() {
|
public JSONObject serialise() {
|
||||||
|
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("hwid", HWID);
|
json.put("hwid", (int) HWID);
|
||||||
json.put("cubot", cubot.getObjectId());
|
json.put("cubot", cubot.getObjectId());
|
||||||
|
|
||||||
return json;
|
return json;
|
||||||
|
@ -15,7 +15,7 @@ public class CubotLaser extends CpuHardware {
|
|||||||
/**
|
/**
|
||||||
* Hardware ID (Should be unique)
|
* Hardware ID (Should be unique)
|
||||||
*/
|
*/
|
||||||
static final int HWID = 0x0002;
|
static final char HWID = 0x0002;
|
||||||
|
|
||||||
public static final int DEFAULT_ADDRESS = 2;
|
public static final int DEFAULT_ADDRESS = 2;
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ public class CubotLaser extends CpuHardware {
|
|||||||
|
|
||||||
if(a == WITHDRAW) {
|
if(a == WITHDRAW) {
|
||||||
|
|
||||||
System.out.println("withdraw");
|
//System.out.println("withdraw");
|
||||||
|
|
||||||
Point frontTile = cubot.getFrontTile();
|
Point frontTile = cubot.getFrontTile();
|
||||||
ArrayList<GameObject> objects = cubot.getWorld().getGameObjectsAt(frontTile.x, frontTile.y);
|
ArrayList<GameObject> objects = cubot.getWorld().getGameObjectsAt(frontTile.x, frontTile.y);
|
||||||
@ -55,19 +55,19 @@ public class CubotLaser extends CpuHardware {
|
|||||||
if (((InventoryHolder) objects.get(0)).takeItem(b)) {
|
if (((InventoryHolder) objects.get(0)).takeItem(b)) {
|
||||||
|
|
||||||
cubot.setHeldItem(b);
|
cubot.setHeldItem(b);
|
||||||
System.out.println("took " + b);
|
//System.out.println("took " + b);
|
||||||
cubot.setCurrentAction(CubotAction.WITHDRAWING);
|
cubot.setCurrentAction(CubotAction.WITHDRAWING);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//The inventory holder can't provide this item
|
//The inventory holder can't provide this item
|
||||||
//todo Add emote here
|
//todo Add emote here
|
||||||
System.out.println("DEBUG: FAILED: take (The inventory holder can't provide this item)");
|
// System.out.println("DEBUG: FAILED: take (The inventory holder can't provide this item)");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//Nothing in front
|
//Nothing in front
|
||||||
System.out.println("DEBUG: FAILED: take (Nothing in front or Cubot is busy)");
|
// System.out.println("DEBUG: FAILED: take (Nothing in front or Cubot is busy)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ public class CubotLaser extends CpuHardware {
|
|||||||
public JSONObject serialise() {
|
public JSONObject serialise() {
|
||||||
|
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("hwid", HWID);
|
json.put("hwid", (int) HWID);
|
||||||
json.put("cubot", cubot.getObjectId());
|
json.put("cubot", cubot.getObjectId());
|
||||||
|
|
||||||
return json;
|
return json;
|
||||||
|
@ -19,7 +19,7 @@ public class CubotLeg extends CpuHardware implements JSONSerialisable {
|
|||||||
/**
|
/**
|
||||||
* Hardware ID (Should be unique)
|
* Hardware ID (Should be unique)
|
||||||
*/
|
*/
|
||||||
static final int HWID = 0x0001;
|
static final char HWID = 0x0001;
|
||||||
|
|
||||||
private Cubot cubot;
|
private Cubot cubot;
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ public class CubotLeg extends CpuHardware implements JSONSerialisable {
|
|||||||
public JSONObject serialise() {
|
public JSONObject serialise() {
|
||||||
|
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("hwid", HWID);
|
json.put("hwid", (int) HWID);
|
||||||
json.put("cubot", cubot.getObjectId());
|
json.put("cubot", cubot.getObjectId());
|
||||||
|
|
||||||
return json;
|
return json;
|
||||||
|
@ -7,11 +7,12 @@ import net.simon987.server.game.World;
|
|||||||
import net.simon987.server.game.pathfinding.Node;
|
import net.simon987.server.game.pathfinding.Node;
|
||||||
import net.simon987.server.game.pathfinding.Pathfinder;
|
import net.simon987.server.game.pathfinding.Pathfinder;
|
||||||
import net.simon987.server.io.JSONSerialisable;
|
import net.simon987.server.io.JSONSerialisable;
|
||||||
|
import net.simon987.server.logging.LogManager;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class CubotRadar extends CpuHardware implements JSONSerialisable {
|
public class CubotLidar extends CpuHardware implements JSONSerialisable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hardware ID (Should be unique)
|
* Hardware ID (Should be unique)
|
||||||
@ -26,7 +27,10 @@ public class CubotRadar extends CpuHardware implements JSONSerialisable {
|
|||||||
private static final int GET_PATH = 2;
|
private static final int GET_PATH = 2;
|
||||||
private static final int GET_MAP = 3;
|
private static final int GET_MAP = 3;
|
||||||
|
|
||||||
public CubotRadar(Cubot cubot) {
|
private static final int MEMORY_MAP_START = 0x0100;
|
||||||
|
private static final int MEMORY_PATH_START = 0x0000;
|
||||||
|
|
||||||
|
public CubotLidar(Cubot cubot) {
|
||||||
this.cubot = cubot;
|
this.cubot = cubot;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,13 +108,13 @@ public class CubotRadar extends CpuHardware implements JSONSerialisable {
|
|||||||
mem[counter] = -1;
|
mem[counter] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("DEBUG: path to" + destX + "," + destY);
|
LogManager.LOGGER.fine("DEBUG: path to" + destX + "," + destY);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GET_MAP:
|
case GET_MAP:
|
||||||
char[][] mapInfo = cubot.getWorld().getMapInfo();
|
char[][] mapInfo = cubot.getWorld().getMapInfo();
|
||||||
|
|
||||||
int i = 0;
|
int i = MEMORY_MAP_START;
|
||||||
for (int y = 0; y < World.WORLD_SIZE; y++) {
|
for (int y = 0; y < World.WORLD_SIZE; y++) {
|
||||||
for (int x = 0; x < World.WORLD_SIZE; x++) {
|
for (int x = 0; x < World.WORLD_SIZE; x++) {
|
||||||
getCpu().getMemory().set(i++, mapInfo[x][y]);
|
getCpu().getMemory().set(i++, mapInfo[x][y]);
|
||||||
@ -125,13 +129,13 @@ public class CubotRadar extends CpuHardware implements JSONSerialisable {
|
|||||||
public JSONObject serialise() {
|
public JSONObject serialise() {
|
||||||
|
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("hwid", HWID);
|
json.put("hwid", (int) HWID);
|
||||||
json.put("cubot", cubot.getObjectId());
|
json.put("cubot", cubot.getObjectId());
|
||||||
|
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CubotRadar deserialize(JSONObject hwJSON){
|
public static CubotLidar deserialize(JSONObject hwJSON) {
|
||||||
return new CubotRadar((Cubot) GameServer.INSTANCE.getGameUniverse().getObject((int)(long)hwJSON.get("cubot")));
|
return new CubotLidar((Cubot) GameServer.INSTANCE.getGameUniverse().getObject((int) (long) hwJSON.get("cubot")));
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -43,12 +43,14 @@ public class CubotPlugin extends ServerPlugin implements GameObjectDeserializer,
|
|||||||
return CubotLeg.deserialize(hwJson);
|
return CubotLeg.deserialize(hwJson);
|
||||||
case CubotLaser.HWID:
|
case CubotLaser.HWID:
|
||||||
return CubotLaser.deserialize(hwJson);
|
return CubotLaser.deserialize(hwJson);
|
||||||
case CubotRadar.HWID:
|
case CubotLidar.HWID:
|
||||||
return CubotRadar.deserialize(hwJson);
|
return CubotLidar.deserialize(hwJson);
|
||||||
case CubotDrill.HWID:
|
case CubotDrill.HWID:
|
||||||
return CubotDrill.deserialize(hwJson);
|
return CubotDrill.deserialize(hwJson);
|
||||||
case CubotInventory.HWID:
|
case CubotInventory.HWID:
|
||||||
return CubotInventory.deserialize(hwJson);
|
return CubotInventory.deserialize(hwJson);
|
||||||
|
case Keyboard.HWID:
|
||||||
|
return Keyboard.deserialize(hwJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
@ -58,7 +58,7 @@ public class Keyboard extends CpuHardware {
|
|||||||
public JSONObject serialise() {
|
public JSONObject serialise() {
|
||||||
|
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("hwid", HWID);
|
json.put("hwid", (int) HWID);
|
||||||
json.put("cubot", cubot.getObjectId());
|
json.put("cubot", cubot.getObjectId());
|
||||||
|
|
||||||
return json;
|
return json;
|
||||||
|
@ -25,7 +25,7 @@ public class CpuInitialisationListener implements GameEventListener {
|
|||||||
legHw.setCpu(cpu);
|
legHw.setCpu(cpu);
|
||||||
CubotLaser laserHw = new CubotLaser((Cubot) user.getControlledUnit());
|
CubotLaser laserHw = new CubotLaser((Cubot) user.getControlledUnit());
|
||||||
laserHw.setCpu(cpu);
|
laserHw.setCpu(cpu);
|
||||||
CubotRadar radarHw = new CubotRadar((Cubot) user.getControlledUnit());
|
CubotLidar radarHw = new CubotLidar((Cubot) user.getControlledUnit());
|
||||||
radarHw.setCpu(cpu);
|
radarHw.setCpu(cpu);
|
||||||
Keyboard keyboard = new Keyboard((Cubot) user.getControlledUnit());
|
Keyboard keyboard = new Keyboard((Cubot) user.getControlledUnit());
|
||||||
keyboard.setCpu(cpu);
|
keyboard.setCpu(cpu);
|
||||||
@ -36,7 +36,7 @@ public class CpuInitialisationListener implements GameEventListener {
|
|||||||
|
|
||||||
cpu.attachHardware(legHw, CubotLeg.DEFAULT_ADDRESS);
|
cpu.attachHardware(legHw, CubotLeg.DEFAULT_ADDRESS);
|
||||||
cpu.attachHardware(laserHw, CubotLaser.DEFAULT_ADDRESS);
|
cpu.attachHardware(laserHw, CubotLaser.DEFAULT_ADDRESS);
|
||||||
cpu.attachHardware(radarHw, CubotRadar.DEFAULT_ADDRESS);
|
cpu.attachHardware(radarHw, CubotLidar.DEFAULT_ADDRESS);
|
||||||
cpu.attachHardware(keyboard, Keyboard.DEFAULT_ADDRESS);
|
cpu.attachHardware(keyboard, Keyboard.DEFAULT_ADDRESS);
|
||||||
cpu.attachHardware(drillHw, CubotDrill.DEFAULT_ADDRESS);
|
cpu.attachHardware(drillHw, CubotDrill.DEFAULT_ADDRESS);
|
||||||
cpu.attachHardware(invHw, CubotInventory.DEFAULT_ADDRESS);
|
cpu.attachHardware(invHw, CubotInventory.DEFAULT_ADDRESS);
|
||||||
|
@ -25,7 +25,9 @@ public class UserCreationListener implements GameEventListener {
|
|||||||
|
|
||||||
Cubot cubot = new Cubot();
|
Cubot cubot = new Cubot();
|
||||||
|
|
||||||
cubot.setWorld(GameServer.INSTANCE.getGameUniverse().getWorld(0,0));
|
cubot.setWorld(GameServer.INSTANCE.getGameUniverse().getWorld(
|
||||||
|
GameServer.INSTANCE.getConfig().getInt("new_user_worldX"),
|
||||||
|
GameServer.INSTANCE.getConfig().getInt("new_user_worldY")));
|
||||||
cubot.getWorld().getGameObjects().add(cubot);
|
cubot.getWorld().getGameObjects().add(cubot);
|
||||||
|
|
||||||
cubot.setObjectId(GameServer.INSTANCE.getGameUniverse().getNextObjectId());
|
cubot.setObjectId(GameServer.INSTANCE.getGameUniverse().getNextObjectId());
|
||||||
|
@ -116,6 +116,11 @@ public class GameServer implements Runnable {
|
|||||||
world.update();
|
world.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Save
|
||||||
|
if (gameUniverse.getTime() % config.getInt("save_interval") == 0) {
|
||||||
|
save(new File("save.json"));
|
||||||
|
}
|
||||||
|
|
||||||
socketServer.tick();
|
socketServer.tick();
|
||||||
|
|
||||||
LogManager.LOGGER.info("Processed " + gameUniverse.getWorlds().size() + " worlds");
|
LogManager.LOGGER.info("Processed " + gameUniverse.getWorlds().size() + " worlds");
|
||||||
|
@ -11,24 +11,24 @@ public class Main {
|
|||||||
public static void main(String[] args){
|
public static void main(String[] args){
|
||||||
|
|
||||||
|
|
||||||
//TODO: Object information Window (Hover, click ?)
|
|
||||||
//TODO: Docs
|
//TODO: Docs
|
||||||
/*
|
/*
|
||||||
* - Intel 8086 p.14 design
|
* - Intel 8086 p.14 design
|
||||||
* - Memory: Storage organisation: From a storage pov, 8086 memory spaces are
|
* - Memory: Storage organisation: From a storage pov, 8086 memory spaces are
|
||||||
* organised as identical arrays of 16-bit words
|
* organised as identical arrays of 16-bit words
|
||||||
|
* - Microprocessor
|
||||||
|
* - Instruction set
|
||||||
|
* -
|
||||||
*/
|
*/
|
||||||
//TODO: Website front page
|
|
||||||
//TODO: Account page
|
|
||||||
//TODO: Chat (Slack?)
|
|
||||||
//TODO: Change code documentation (Check for "Database" etc..)
|
|
||||||
//TODO: Load and save: handle no save / invalid save
|
|
||||||
// - Make sure the Hardware is saved and can be loaded
|
|
||||||
//TODO: Add more logs
|
|
||||||
//TODO: Clean sprites
|
|
||||||
|
|
||||||
//---------------------------------
|
//---------------------------------
|
||||||
|
|
||||||
|
//TODO: Random number generator
|
||||||
|
//TODO: favicon
|
||||||
|
//TODO: Email verification
|
||||||
|
//TODO: Real account page
|
||||||
|
// Change/reset password
|
||||||
|
//TODO: Object information Window (Hover, click ?)
|
||||||
//TODO: Inventory indicator (Multiple items)
|
//TODO: Inventory indicator (Multiple items)
|
||||||
//TODO: Software Interrupts (PIC): Interupt flag?
|
//TODO: Software Interrupts (PIC): Interupt flag?
|
||||||
/*
|
/*
|
||||||
@ -54,7 +54,9 @@ public class Main {
|
|||||||
//TODO: Withdraw animation / action
|
//TODO: Withdraw animation / action
|
||||||
//TODO: Prevent World creation out of bounds, warp around universe
|
//TODO: Prevent World creation out of bounds, warp around universe
|
||||||
//TODO: Multiple Biomass style (and yield, rarity)
|
//TODO: Multiple Biomass style (and yield, rarity)
|
||||||
|
//TODO: Clean sprites
|
||||||
|
//TODO: Auto-resize
|
||||||
|
//TODO: Battery Hardware
|
||||||
|
|
||||||
|
|
||||||
LogManager.initialize();
|
LogManager.initialize();
|
||||||
|
@ -98,7 +98,7 @@ public class Assembler {
|
|||||||
line = line.substring(0, line.indexOf(':'));
|
line = line.substring(0, line.indexOf(':'));
|
||||||
String label = line.trim();
|
String label = line.trim();
|
||||||
|
|
||||||
System.out.println("DEBUG: Label " + label + " @ " + (result.origin + currentOffset));
|
LogManager.LOGGER.fine("DEBUG: Label " + label + " @ " + (result.origin + currentOffset));
|
||||||
result.labels.put(label, (char) (result.origin + currentOffset));
|
result.labels.put(label, (char) (result.origin + currentOffset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,7 +127,7 @@ public class Assembler {
|
|||||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
DataOutputStream out = new DataOutputStream(bos);
|
DataOutputStream out = new DataOutputStream(bos);
|
||||||
|
|
||||||
System.out.println(line);
|
//System.out.println(line);
|
||||||
|
|
||||||
if (line.substring(0, 2).toUpperCase().equals("DW")) {
|
if (line.substring(0, 2).toUpperCase().equals("DW")) {
|
||||||
|
|
||||||
@ -337,7 +337,7 @@ public class Assembler {
|
|||||||
|
|
||||||
} catch (AssemblyException e) {
|
} catch (AssemblyException e) {
|
||||||
//Ignore error on pass 2
|
//Ignore error on pass 2
|
||||||
System.out.println(e);
|
//System.out.println(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ public class CPU implements JSONSerialisable{
|
|||||||
|
|
||||||
if(counter % 1000 == 0){
|
if(counter % 1000 == 0){
|
||||||
if (System.currentTimeMillis() >= (startTime + timeout)) {
|
if (System.currentTimeMillis() >= (startTime + timeout)) {
|
||||||
System.out.println("CPU Timeout " + this + " after " + counter + "instructions (" + timeout + "ms): " + (double)counter/((double)timeout/1000)/1000000 + "MHz");
|
LogManager.LOGGER.fine("CPU Timeout " + this + " after " + counter + "instructions (" + timeout + "ms): " + (double) counter / ((double) timeout / 1000) / 1000000 + "MHz");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -147,7 +147,7 @@ public class CPU implements JSONSerialisable{
|
|||||||
// LogManager.LOGGER.info(instruction.getMnemonic());
|
// LogManager.LOGGER.info(instruction.getMnemonic());
|
||||||
}
|
}
|
||||||
double elapsed = (System.currentTimeMillis() - startTime);
|
double elapsed = (System.currentTimeMillis() - startTime);
|
||||||
System.out.println("----------\n" + counter + " instruction in " + elapsed + "ms : " + (double)counter/(elapsed/1000)/1000000 + "MHz");
|
LogManager.LOGGER.fine("----------\n" + counter + " instruction in " + elapsed + "ms : " + (double) counter / (elapsed / 1000) / 1000000 + "MHz");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void executeInstruction(Instruction instruction, int source, int destination) {
|
public void executeInstruction(Instruction instruction, int source, int destination) {
|
||||||
@ -343,12 +343,9 @@ public class CPU implements JSONSerialisable{
|
|||||||
|
|
||||||
CpuHardware hardware = attachedHardware.get(address);
|
CpuHardware hardware = attachedHardware.get(address);
|
||||||
|
|
||||||
if(hardware instanceof JSONSerialisable){
|
JSONObject serialisedHw = hardware.serialise();
|
||||||
|
serialisedHw.put("address", address);
|
||||||
JSONObject serialisedHw = ((JSONSerialisable) hardware).serialise();
|
hardwareList.add(serialisedHw);
|
||||||
serialisedHw.put("address", address);
|
|
||||||
hardwareList.add(serialisedHw);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
json.put("hardware", hardwareList);
|
json.put("hardware", hardwareList);
|
||||||
|
@ -203,7 +203,7 @@ public abstract class Instruction {
|
|||||||
|
|
||||||
//Destination bits are left blank
|
//Destination bits are left blank
|
||||||
|
|
||||||
System.out.println("o1: " + o1.getType());
|
//System.out.println("o1: " + o1.getType());
|
||||||
|
|
||||||
for (byte b : code.bytes()) {
|
for (byte b : code.bytes()) {
|
||||||
out.write(b);
|
out.write(b);
|
||||||
|
@ -149,7 +149,7 @@ public class RegisterSet implements Target, JSONSerialisable {
|
|||||||
|
|
||||||
register.put("index", index);
|
register.put("index", index);
|
||||||
register.put("name", getRegister(index).getName());
|
register.put("name", getRegister(index).getName());
|
||||||
register.put("value", getRegister(index).getValue());
|
register.put("value", (int) getRegister(index).getValue());
|
||||||
|
|
||||||
registers.add(register);
|
registers.add(register);
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,7 @@ import org.json.simple.JSONObject;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a game effect in a World (e.g. Particles made when digging, Error animation, Attack effects etc..)
|
* Represents a game effect in a World (e.g. Particles made when digging, Error animation, Attack effects etc..)
|
||||||
* <p>
|
* <br>
|
||||||
* The game effect is generated by the server when certain circumstances are met, and inserted into the database.
|
|
||||||
* The client requests the list of game effects for this World each tick and handles it. This list (called queuedGameEffects)
|
|
||||||
* is cleared at the beginning of each tick.
|
|
||||||
* <p>
|
|
||||||
* These effects are purely visual and could be changed or ignored by the client
|
* These effects are purely visual and could be changed or ignored by the client
|
||||||
*/
|
*/
|
||||||
public class GameEffect implements JSONSerialisable{
|
public class GameEffect implements JSONSerialisable{
|
||||||
|
@ -122,7 +122,7 @@ public abstract class GameObject implements JSONSerialisable {
|
|||||||
} else {
|
} else {
|
||||||
//Display error when object is trying to walk in a wall
|
//Display error when object is trying to walk in a wall
|
||||||
//TODO Add emote here
|
//TODO Add emote here
|
||||||
System.out.println("DEBUG: FAILED walk");
|
//System.out.println("DEBUG: FAILED walk");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +167,10 @@ public class GameUniverse implements JSONSerialisable{
|
|||||||
|
|
||||||
JSONArray users = new JSONArray();
|
JSONArray users = new JSONArray();
|
||||||
for(User user : this.users){
|
for(User user : this.users){
|
||||||
users.add(user.serialise());
|
if (!user.isGuest()) {
|
||||||
|
users.add(user.serialise());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -187,29 +190,35 @@ public class GameUniverse implements JSONSerialisable{
|
|||||||
|
|
||||||
JSONParser parser = new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
|
|
||||||
try {
|
if (file.isFile()) {
|
||||||
FileReader reader = new FileReader(file);
|
try {
|
||||||
JSONObject universeJson = (JSONObject)parser.parse(reader);
|
|
||||||
|
|
||||||
time = (long)universeJson.get("time");
|
FileReader reader = new FileReader(file);
|
||||||
nextObjectId = (int)(long)universeJson.get("nextObjectId");
|
JSONObject universeJson = (JSONObject) parser.parse(reader);
|
||||||
|
|
||||||
for(JSONObject worldJson : (ArrayList<JSONObject>)universeJson.get("worlds")){
|
time = (long) universeJson.get("time");
|
||||||
worlds.add(World.deserialize(worldJson));
|
nextObjectId = (int) (long) universeJson.get("nextObjectId");
|
||||||
|
|
||||||
|
for (JSONObject worldJson : (ArrayList<JSONObject>) universeJson.get("worlds")) {
|
||||||
|
worlds.add(World.deserialize(worldJson));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (JSONObject userJson : (ArrayList<JSONObject>) universeJson.get("users")) {
|
||||||
|
users.add(User.deserialize(userJson));
|
||||||
|
}
|
||||||
|
|
||||||
|
LogManager.LOGGER.info("Loaded " + worlds.size() + " worlds from file");
|
||||||
|
|
||||||
|
reader.close();
|
||||||
|
|
||||||
|
} catch (IOException | ParseException | CancelledException e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
for(JSONObject userJson : (ArrayList<JSONObject>)universeJson.get("users")){
|
LogManager.LOGGER.severe("Couldn't load save file save.json, creating empty game universe.");
|
||||||
users.add(User.deserialize(userJson));
|
|
||||||
}
|
|
||||||
|
|
||||||
System.out.println("Loaded " + worlds.size());
|
|
||||||
|
|
||||||
reader.close();
|
|
||||||
|
|
||||||
} catch (IOException | ParseException | CancelledException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNextObjectId() {
|
public int getNextObjectId() {
|
||||||
|
@ -2,6 +2,7 @@ package net.simon987.server.game;
|
|||||||
|
|
||||||
import net.simon987.server.game.pathfinding.Pathfinder;
|
import net.simon987.server.game.pathfinding.Pathfinder;
|
||||||
import net.simon987.server.io.JSONSerialisable;
|
import net.simon987.server.io.JSONSerialisable;
|
||||||
|
import net.simon987.server.logging.LogManager;
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
@ -68,8 +69,8 @@ public class World implements JSONSerialisable{
|
|||||||
|
|
||||||
for(GameObject object : gameObjects_){
|
for(GameObject object : gameObjects_){
|
||||||
if(object.isDead()){
|
if(object.isDead()){
|
||||||
System.out.println("Removed" + object.getObjectId());
|
|
||||||
gameObjects.remove(object);
|
gameObjects.remove(object);
|
||||||
|
LogManager.LOGGER.fine("Removed object " + object + " id: " + object.getObjectId());
|
||||||
}
|
}
|
||||||
if (object instanceof Updatable) {
|
if (object instanceof Updatable) {
|
||||||
((Updatable) object).update();
|
((Updatable) object).update();
|
||||||
@ -198,7 +199,7 @@ public class World implements JSONSerialisable{
|
|||||||
|
|
||||||
if(!isTileBlocked(rx, ry)){
|
if(!isTileBlocked(rx, ry)){
|
||||||
|
|
||||||
Object path = Pathfinder.findPath(this, rx, ry, 1,1,0);
|
Object path = Pathfinder.findPath(this, rx, ry, 0, 6, 0);
|
||||||
|
|
||||||
if(path != null) {
|
if(path != null) {
|
||||||
return new Point(rx, ry);
|
return new Point(rx, ry);
|
||||||
|
@ -22,6 +22,8 @@ public class User implements JSONSerialisable{
|
|||||||
|
|
||||||
private ControllableUnit controlledUnit;
|
private ControllableUnit controlledUnit;
|
||||||
|
|
||||||
|
private boolean guest;
|
||||||
|
|
||||||
public User() throws CancelledException {
|
public User() throws CancelledException {
|
||||||
GameEvent event = new UserCreationEvent(this);
|
GameEvent event = new UserCreationEvent(this);
|
||||||
GameServer.INSTANCE.getEventDispatcher().dispatch(event);
|
GameServer.INSTANCE.getEventDispatcher().dispatch(event);
|
||||||
@ -47,6 +49,8 @@ public class User implements JSONSerialisable{
|
|||||||
json.put("cpu", cpu.serialise());
|
json.put("cpu", cpu.serialise());
|
||||||
|
|
||||||
return json;
|
return json;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static User deserialize(JSONObject userJson) throws CancelledException {
|
public static User deserialize(JSONObject userJson) throws CancelledException {
|
||||||
@ -96,5 +100,11 @@ public class User implements JSONSerialisable{
|
|||||||
this.username = username;
|
this.username = username;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isGuest() {
|
||||||
|
return guest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGuest(boolean guest) {
|
||||||
|
this.guest = guest;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,7 @@ public class OnlineUser {
|
|||||||
|
|
||||||
public void setGuest(boolean guest) {
|
public void setGuest(boolean guest) {
|
||||||
this.guest = guest;
|
this.guest = guest;
|
||||||
|
user.setGuest(guest);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isGuest() {
|
public boolean isGuest() {
|
||||||
|
@ -6,14 +6,34 @@ import net.simon987.server.logging.LogManager;
|
|||||||
import net.simon987.server.user.User;
|
import net.simon987.server.user.User;
|
||||||
import org.java_websocket.WebSocket;
|
import org.java_websocket.WebSocket;
|
||||||
import org.java_websocket.handshake.ClientHandshake;
|
import org.java_websocket.handshake.ClientHandshake;
|
||||||
|
import org.java_websocket.server.DefaultSSLWebSocketServerFactory;
|
||||||
import org.java_websocket.server.WebSocketServer;
|
import org.java_websocket.server.WebSocketServer;
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import javax.net.ssl.KeyManager;
|
||||||
|
import javax.net.ssl.KeyManagerFactory;
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import javax.xml.bind.DatatypeConverter;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.security.KeyFactory;
|
||||||
|
import java.security.KeyStore;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.cert.Certificate;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
import java.security.cert.CertificateFactory;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
|
import java.security.interfaces.RSAPrivateKey;
|
||||||
|
import java.security.spec.InvalidKeySpecException;
|
||||||
|
import java.security.spec.PKCS8EncodedKeySpec;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
|
||||||
public class SocketServer extends WebSocketServer {
|
public class SocketServer extends WebSocketServer {
|
||||||
|
|
||||||
private OnlineUserManager userManager = new OnlineUserManager();
|
private OnlineUserManager userManager = new OnlineUserManager();
|
||||||
@ -25,6 +45,21 @@ public class SocketServer extends WebSocketServer {
|
|||||||
public SocketServer(InetSocketAddress address, ServerConfiguration config) {
|
public SocketServer(InetSocketAddress address, ServerConfiguration config) {
|
||||||
super(address);
|
super(address);
|
||||||
|
|
||||||
|
if (config.getInt("use_secure_webSocket") != 0) {
|
||||||
|
|
||||||
|
SSLContext context = getContext(config.getString("cert_path"));
|
||||||
|
if (context != null) {
|
||||||
|
setWebSocketFactory(new DefaultSSLWebSocketServerFactory(context));
|
||||||
|
|
||||||
|
LogManager.LOGGER.info("(WS) Enabled secure webSocket");
|
||||||
|
} else {
|
||||||
|
LogManager.LOGGER.severe("(WS) Failed to create SSL context");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setConnectionLostTimeout(30);
|
||||||
|
|
||||||
|
|
||||||
database = new SocketServerDatabase(config);
|
database = new SocketServerDatabase(config);
|
||||||
|
|
||||||
messageEventDispatcher.addHandler(new UserInfoRequestHandler());
|
messageEventDispatcher.addHandler(new UserInfoRequestHandler());
|
||||||
@ -94,7 +129,7 @@ public class SocketServer extends WebSocketServer {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
LogManager.LOGGER.info("(WS) FIXME: SocketServer:onMessage");
|
LogManager.LOGGER.severe("(WS) FIXME: SocketServer:onMessage");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,12 +138,13 @@ public class SocketServer extends WebSocketServer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMessage(WebSocket conn, ByteBuffer message) {
|
public void onMessage(WebSocket conn, ByteBuffer message) {
|
||||||
System.out.println("received ByteBuffer from " + conn.getRemoteSocketAddress());
|
//System.out.println("received ByteBuffer from " + conn.getRemoteSocketAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(WebSocket conn, Exception ex) {
|
public void onError(WebSocket conn, Exception ex) {
|
||||||
System.err.println("an error occured on connection " + conn.getRemoteSocketAddress() + ':' + ex);
|
|
||||||
|
LogManager.LOGGER.severe("an error occured on connection " + conn.getRemoteSocketAddress() + ':' + ex);
|
||||||
userManager.remove(userManager.getUser(conn));
|
userManager.remove(userManager.getUser(conn));
|
||||||
conn.close();
|
conn.close();
|
||||||
|
|
||||||
@ -162,4 +198,89 @@ public class SocketServer extends WebSocketServer {
|
|||||||
public OnlineUserManager getUserManager() {
|
public OnlineUserManager getUserManager() {
|
||||||
return userManager;
|
return userManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See https://github.com/TooTallNate/Java-WebSocket/blob/master/src/main/example/SSLServerLetsEncryptExample.java
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* * Copyright (c) 2010-2017 Nathan Rajlich
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use,
|
||||||
|
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following
|
||||||
|
* conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*/
|
||||||
|
private static SSLContext getContext(String pathTo) {
|
||||||
|
SSLContext context;
|
||||||
|
String password = "MAR";
|
||||||
|
try {
|
||||||
|
context = SSLContext.getInstance("TLS");
|
||||||
|
|
||||||
|
byte[] certBytes = parseDERFromPEM(getBytes(new File(pathTo + File.separator + "cert.pem")),
|
||||||
|
"-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----");
|
||||||
|
byte[] keyBytes = parseDERFromPEM(getBytes(new File(pathTo + File.separator + "privkey.pem")),
|
||||||
|
"-----BEGIN PRIVATE KEY-----", "-----END PRIVATE KEY-----");
|
||||||
|
|
||||||
|
X509Certificate cert = generateCertificateFromDER(certBytes);
|
||||||
|
RSAPrivateKey key = generatePrivateKeyFromDER(keyBytes);
|
||||||
|
|
||||||
|
KeyStore keystore = KeyStore.getInstance("JKS");
|
||||||
|
keystore.load(null);
|
||||||
|
keystore.setCertificateEntry("cert-alias", cert);
|
||||||
|
keystore.setKeyEntry("key-alias", key, password.toCharArray(), new Certificate[]{cert});
|
||||||
|
|
||||||
|
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
|
||||||
|
kmf.init(keystore, password.toCharArray());
|
||||||
|
|
||||||
|
KeyManager[] km = kmf.getKeyManagers();
|
||||||
|
|
||||||
|
context.init(km, null, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
context = null;
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) {
|
||||||
|
String data = new String(pem);
|
||||||
|
String[] tokens = data.split(beginDelimiter);
|
||||||
|
tokens = tokens[1].split(endDelimiter);
|
||||||
|
return DatatypeConverter.parseBase64Binary(tokens[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RSAPrivateKey generatePrivateKeyFromDER(byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException {
|
||||||
|
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
|
||||||
|
|
||||||
|
KeyFactory factory = KeyFactory.getInstance("RSA");
|
||||||
|
|
||||||
|
return (RSAPrivateKey) factory.generatePrivate(spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException {
|
||||||
|
CertificateFactory factory = CertificateFactory.getInstance("X.509");
|
||||||
|
|
||||||
|
return (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certBytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] getBytes(File file) {
|
||||||
|
byte[] bytesArray = new byte[(int) file.length()];
|
||||||
|
|
||||||
|
FileInputStream fis;
|
||||||
|
try {
|
||||||
|
fis = new FileInputStream(file);
|
||||||
|
fis.read(bytesArray); //read file into bytes[]
|
||||||
|
fis.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return bytesArray;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user