diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java index e153c9e..f70433c 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java @@ -77,8 +77,8 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { @Override public JSONObject serialise() { JSONObject json = new JSONObject(); - json.put("id", getObjectId()); - json.put("type", ID); + json.put("i", getObjectId()); + json.put("t", ID); json.put("x", getX()); json.put("y", getY()); json.put("direction", getDirection().ordinal()); @@ -98,7 +98,7 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { public static Cubot deserialize(JSONObject json) { Cubot cubot = new Cubot(); - cubot.setObjectId((int) (long) json.get("id")); + cubot.setObjectId((int) (long) json.get("i")); cubot.setX((int) (long) json.get("x")); cubot.setY((int) (long) json.get("y")); cubot.hp = (int) (long) json.get("hp"); diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotPlugin.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotPlugin.java index 716974d..8060d11 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotPlugin.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotPlugin.java @@ -25,7 +25,7 @@ public class CubotPlugin extends ServerPlugin implements GameObjectDeserializer, @Override public GameObject deserializeObject(JSONObject object) { - int objType = (int) (long) object.get("type"); + int objType = (int) (long) object.get("t"); if (objType == Cubot.ID) { diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/UserCreationListener.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/UserCreationListener.java index 64f2030..bcfc13d 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/UserCreationListener.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/UserCreationListener.java @@ -29,6 +29,7 @@ public class UserCreationListener implements GameEventListener { GameServer.INSTANCE.getConfig().getInt("new_user_worldX"), GameServer.INSTANCE.getConfig().getInt("new_user_worldY"))); cubot.getWorld().getGameObjects().add(cubot); + cubot.getWorld().incUpdatable(); cubot.setObjectId(GameServer.INSTANCE.getGameUniverse().getNextObjectId()); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvestTask.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvestTask.java index 72703e5..a5f5ef8 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvestTask.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvestTask.java @@ -1,6 +1,7 @@ package net.simon987.npcplugin; +import net.simon987.server.GameServer; import net.simon987.server.assembly.Util; import net.simon987.server.game.Direction; import net.simon987.server.game.GameObject; @@ -83,7 +84,18 @@ public class HarvestTask extends NPCTask { } else { if (nextWorldDirection == null) { - nextWorldDirection = Direction.getDirection(random.nextInt(3)); + + //Stay near the center of the map 50% of the time + if (random.nextBoolean()) { + + nextWorldDirection = Direction.getDirectionTo(npc.getX(), npc.getY(), + GameServer.INSTANCE.getConfig().getInt("new_user_worldX"), + GameServer.INSTANCE.getConfig().getInt("new_user_worldY")); + + } else { + nextWorldDirection = Direction.getDirection(random.nextInt(3)); + } + pause += 6; } npc.gotoWorld(nextWorldDirection); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java index a360485..9d6e7cb 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java @@ -37,14 +37,14 @@ public class HarvesterNPC extends NonPlayerCharacter { public JSONObject serialise() { JSONObject json = super.serialise(); - json.put("id", getObjectId()); + json.put("i", getObjectId()); json.put("x", getX()); json.put("y", getY()); json.put("direction", getDirection().ordinal()); json.put("hp", hp); json.put("energy", energy); json.put("action", getAction().ordinal()); - json.put("type", 10); + json.put("t", 10); return json; } @@ -52,7 +52,7 @@ public class HarvesterNPC extends NonPlayerCharacter { public static HarvesterNPC deserialize(JSONObject json) { HarvesterNPC npc = new HarvesterNPC(); - npc.setObjectId((int) (long) json.get("id")); + npc.setObjectId((int) (long) json.get("i")); npc.setX((int) (long) json.get("x")); npc.setY((int) (long) json.get("y")); npc.hp = (int) (long) json.get("hp"); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/NonPlayerCharacter.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/NonPlayerCharacter.java index 5ca540c..1cd5f64 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/NonPlayerCharacter.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/NonPlayerCharacter.java @@ -57,8 +57,6 @@ public abstract class NonPlayerCharacter extends GameObject implements Updatable public boolean gotoWorld(Direction direction) { - System.out.println("going " + direction); - if (direction == Direction.NORTH) { if (!moveTo(8, 0, 0)) { setDirection(Direction.NORTH); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java index 331c64a..ceb8311 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java @@ -22,7 +22,7 @@ public class NpcPlugin extends ServerPlugin implements GameObjectDeserializer { @Override public GameObject deserializeObject(JSONObject object) { - int objType = (int) (long) object.get("type"); + int objType = (int) (long) object.get("t"); if (objType == HarvesterNPC.ID) { return HarvesterNPC.deserialize(object); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/event/WorldUpdateListener.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/event/WorldUpdateListener.java index e507d28..2a4b43c 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/event/WorldUpdateListener.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/event/WorldUpdateListener.java @@ -43,9 +43,8 @@ public class WorldUpdateListener implements GameEventListener { npc.setX(p.x); npc.setY(p.y); world.getGameObjects().add(npc); + world.incUpdatable(); } - - } diff --git a/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassBlob.java b/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassBlob.java index 69d1727..80fa1b4 100644 --- a/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassBlob.java +++ b/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassBlob.java @@ -16,7 +16,7 @@ public class BiomassBlob extends GameObject implements InventoryHolder { /** * Style of the blob (Only visual) */ - private int style; + // private int style; private static final int ITM_BIOMASS = 1; @@ -30,12 +30,12 @@ public class BiomassBlob extends GameObject implements InventoryHolder { JSONObject json = new JSONObject(); - json.put("type", ID); - json.put("id", getObjectId()); + json.put("t", ID); + json.put("i", getObjectId()); json.put("x", getX()); json.put("y", getY()); - json.put("biomassCount", biomassCount); - json.put("style", style); + json.put("b", biomassCount); + // json.put("style", style); return json; } @@ -49,23 +49,23 @@ public class BiomassBlob extends GameObject implements InventoryHolder { this.biomassCount = biomassCount; } - public int getStyle() { - return style; - } - - public void setStyle(int style) { - this.style = style; - } +// public int getStyle() { +// return style; +// } +// +// public void setStyle(int style) { +// this.style = style; +// } public static BiomassBlob deserialize(JSONObject json) { BiomassBlob biomassBlob = new BiomassBlob(); - biomassBlob.setObjectId((int) (long) json.get("id")); + biomassBlob.setObjectId((int) (long) json.get("i")); biomassBlob.setX((int) (long) json.get("x")); biomassBlob.setY((int) (long) json.get("y")); - biomassBlob.style = (int) (long) json.get("style"); - biomassBlob.biomassCount = (int) (long) json.get("biomassCount"); + // biomassBlob.style = (int) (long) json.get("style"); + biomassBlob.biomassCount = (int) (long) json.get("b"); return biomassBlob; } diff --git a/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassPlugin.java b/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassPlugin.java index 08295fa..a19fbd0 100644 --- a/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassPlugin.java +++ b/Plugin Plant/src/main/java/net/simon987/biomassplugin/BiomassPlugin.java @@ -23,7 +23,7 @@ public class BiomassPlugin extends ServerPlugin implements GameObjectDeserialize @Override public GameObject deserializeObject(JSONObject object) { - int objType = (int) (long) object.get("type"); + int objType = (int) (long) object.get("t"); if (objType == BiomassBlob.ID) { diff --git a/Plugin Plant/src/main/java/net/simon987/biomassplugin/WorldUtils.java b/Plugin Plant/src/main/java/net/simon987/biomassplugin/WorldUtils.java index 1901ba1..f0217f9 100644 --- a/Plugin Plant/src/main/java/net/simon987/biomassplugin/WorldUtils.java +++ b/Plugin Plant/src/main/java/net/simon987/biomassplugin/WorldUtils.java @@ -65,7 +65,7 @@ public class WorldUtils { BiomassBlob biomassBlob = new BiomassBlob(); biomassBlob.setObjectId(GameServer.INSTANCE.getGameUniverse().getNextObjectId()); - biomassBlob.setStyle(0); //TODO: set style depending on difficulty level? or random? from config? + // biomassBlob.setStyle(0); //TODO: set style depending on difficulty level? or random? from config? biomassBlob.setBiomassCount(yield); biomassBlob.setX(p.x); biomassBlob.setY(p.y); diff --git a/Server/src/main/java/net/simon987/server/GameServer.java b/Server/src/main/java/net/simon987/server/GameServer.java index 714c906..b0237bf 100644 --- a/Server/src/main/java/net/simon987/server/GameServer.java +++ b/Server/src/main/java/net/simon987/server/GameServer.java @@ -147,8 +147,12 @@ public class GameServer implements Runnable { //Process each worlds //Avoid concurrent modification ArrayList worlds = new ArrayList<>(gameUniverse.getWorlds()); + int updatedWorlds = 0; for (World world : worlds) { - world.update(); + if (world.shouldUpdate()) { + world.update(); + updatedWorlds++; + } } //Save @@ -163,7 +167,8 @@ public class GameServer implements Runnable { socketServer.tick(); - LogManager.LOGGER.info("Processed " + gameUniverse.getWorlds().size() + " worlds"); + LogManager.LOGGER.info("Processed " + gameUniverse.getWorlds().size() + " worlds (" + updatedWorlds + + ") updated"); } /** diff --git a/Server/src/main/java/net/simon987/server/Main.java b/Server/src/main/java/net/simon987/server/Main.java index 5875215..02542be 100644 --- a/Server/src/main/java/net/simon987/server/Main.java +++ b/Server/src/main/java/net/simon987/server/Main.java @@ -17,6 +17,7 @@ public class Main { //Load GameServer.INSTANCE.getGameUniverse().load(new File("save.json")); + SocketServer socketServer = new SocketServer(new InetSocketAddress(config.getString("webSocket_host"), config.getInt("webSocket_port")), config); diff --git a/Server/src/main/java/net/simon987/server/game/Direction.java b/Server/src/main/java/net/simon987/server/game/Direction.java index 1c0da0f..0d0349a 100755 --- a/Server/src/main/java/net/simon987/server/game/Direction.java +++ b/Server/src/main/java/net/simon987/server/game/Direction.java @@ -58,4 +58,26 @@ public enum Direction { } } + + /** + * Get direction to move from (x1, y1) to (x2, y2) + */ + public static Direction getDirectionTo(int x1, int y1, int x2, int y2) { + + int dx = x2 - x1; + int dy = y2 - y1; + + if (dx > 0 && dx >= dy) { + return Direction.EAST; + } else if (dx < 0 && dx <= dy) { + return Direction.WEST; + } else if (dy > 0 && dy >= dx) { + return Direction.NORTH; + } else if (dy < 0 && dy <= dx) { + return Direction.SOUTH; + } else { + return null; + } + + } } diff --git a/Server/src/main/java/net/simon987/server/game/GameObject.java b/Server/src/main/java/net/simon987/server/game/GameObject.java index 09fc8b1..c64bcd1 100755 --- a/Server/src/main/java/net/simon987/server/game/GameObject.java +++ b/Server/src/main/java/net/simon987/server/game/GameObject.java @@ -82,7 +82,9 @@ public abstract class GameObject implements JSONSerialisable { if (leftWorld != null) { world.getGameObjects().remove(this); + world.decUpdatable(); leftWorld.getGameObjects().add(this); + leftWorld.incUpdatable(); setWorld(leftWorld); x = World.WORLD_SIZE - 1; @@ -99,7 +101,9 @@ public abstract class GameObject implements JSONSerialisable { if (rightWorld != null) { world.getGameObjects().remove(this); + world.decUpdatable(); rightWorld.getGameObjects().add(this); + rightWorld.incUpdatable(); setWorld(rightWorld); x = 0; @@ -117,7 +121,9 @@ public abstract class GameObject implements JSONSerialisable { if (upWorld != null) { world.getGameObjects().remove(this); + world.decUpdatable(); upWorld.getGameObjects().add(this); + upWorld.incUpdatable(); setWorld(upWorld); y = World.WORLD_SIZE - 1; @@ -135,7 +141,9 @@ public abstract class GameObject implements JSONSerialisable { if (downWorld != null) { world.getGameObjects().remove(this); + world.decUpdatable(); downWorld.getGameObjects().add(this); + downWorld.incUpdatable(); setWorld(downWorld); y = 0; diff --git a/Server/src/main/java/net/simon987/server/game/World.java b/Server/src/main/java/net/simon987/server/game/World.java index dfea379..60b939a 100644 --- a/Server/src/main/java/net/simon987/server/game/World.java +++ b/Server/src/main/java/net/simon987/server/game/World.java @@ -30,6 +30,11 @@ public class World implements JSONSerialisable { private ArrayList gameObjects = new ArrayList<>(16); + /** + * If this number is greater than 0, the World will be updated. + */ + private int updatable = 0; + public World(int x, int y, TileMap tileMap) { this.x = x; this.y = y; @@ -114,13 +119,15 @@ public class World implements JSONSerialisable { for (GameObject obj : gameObjects_) { objects.add(obj.serialise()); } - json.put("objects", objects); + json.put("o", objects); - json.put("terrain", tileMap.serialise()); + json.put("t", tileMap.serialise()); json.put("x", x); json.put("y", y); + json.put("u", updatable); + return json; } @@ -145,10 +152,11 @@ public class World implements JSONSerialisable { World world = new World(); world.x = (int) (long) json.get("x"); world.y = (int) (long) json.get("y"); + world.updatable = (int) (long) json.get("u"); - world.tileMap = TileMap.deserialize((JSONObject) json.get("terrain")); + world.tileMap = TileMap.deserialize((JSONObject) json.get("t")); - for (JSONObject objJson : (ArrayList) json.get("objects")) { + for (JSONObject objJson : (ArrayList) json.get("o")) { GameObject object = GameObject.deserialize(objJson); @@ -258,4 +266,15 @@ public class World implements JSONSerialisable { return gameObjects; } + public void incUpdatable() { + updatable++; + } + + public void decUpdatable() { + updatable--; + } + + public boolean shouldUpdate() { + return updatable > 0; + } } diff --git a/config.properties b/config.properties index 56d4be3..dca7da3 100644 --- a/config.properties +++ b/config.properties @@ -17,7 +17,7 @@ cert_path=certificates # ---------------------------------------------- # Length of a tick in ms -tick_length=250 +tick_length=125 # Default offset of the origin (starting point of code execution) in words org_offset=512 # Address of the stack bottom diff --git a/plugins/Cubot.jar b/plugins/Cubot.jar index 3c676ff..a030401 100644 Binary files a/plugins/Cubot.jar and b/plugins/Cubot.jar differ diff --git a/plugins/Plant.jar b/plugins/Plant.jar index 35a0817..238f938 100644 Binary files a/plugins/Plant.jar and b/plugins/Plant.jar differ diff --git a/plugins/Plugin NPC.jar b/plugins/Plugin NPC.jar index eee586f..67072c8 100644 Binary files a/plugins/Plugin NPC.jar and b/plugins/Plugin NPC.jar differ