From 3548928218181d281b273df9741d90035e1989ee Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 16 Dec 2017 15:40:03 -0500 Subject: [PATCH] Improved World update performance. Decreased save file size. Added Harvester NPC #19. --- .../java/net/simon987/cubotplugin/Cubot.java | 6 ++-- .../net/simon987/cubotplugin/CubotPlugin.java | 2 +- .../event/UserCreationListener.java | 1 + .../net/simon987/npcplugin/HarvestTask.java | 14 +++++++- .../net/simon987/npcplugin/HarvesterNPC.java | 6 ++-- .../npcplugin/NonPlayerCharacter.java | 2 -- .../net/simon987/npcplugin/NpcPlugin.java | 2 +- .../npcplugin/event/WorldUpdateListener.java | 3 +- .../simon987/biomassplugin/BiomassBlob.java | 30 +++++++++--------- .../simon987/biomassplugin/BiomassPlugin.java | 2 +- .../simon987/biomassplugin/WorldUtils.java | 2 +- .../java/net/simon987/server/GameServer.java | 9 ++++-- .../main/java/net/simon987/server/Main.java | 1 + .../net/simon987/server/game/Direction.java | 22 +++++++++++++ .../net/simon987/server/game/GameObject.java | 8 +++++ .../java/net/simon987/server/game/World.java | 27 +++++++++++++--- config.properties | 2 +- plugins/Cubot.jar | Bin 23808 -> 23827 bytes plugins/Plant.jar | Bin 7528 -> 7442 bytes plugins/Plugin NPC.jar | Bin 8231 -> 8262 bytes 20 files changed, 102 insertions(+), 37 deletions(-) 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 3c676ff340f3ae93b94dbc4a232a309a1882a4d2..a03040185dfd7e384d9535bb70b22d67f1986639 100644 GIT binary patch delta 3976 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 IPQRi52X#Xsj{pDw diff --git a/plugins/Plant.jar b/plugins/Plant.jar index 35a0817ae78875114c90a0529afb7038e44511f9..238f938447db92938c9ebf2e7e9ec02bee1aa727 100644 GIT binary patch delta 4026 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 delta 4071 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 z