From 0ada6c29d4fcb956a56e2dabe19a6d8ea6db1e7d Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 1 Mar 2018 10:42:24 -0500 Subject: [PATCH] More work on vaults --- .../net/simon987/cubotplugin/CubotLaser.java | 20 ++-- .../net/simon987/npcplugin/ElectricBox.java | 101 +++++++++++++++++- .../net/simon987/npcplugin/NpcPlugin.java | 2 + .../java/net/simon987/npcplugin/Obstacle.java | 5 +- .../simon987/npcplugin/VaultDimension.java | 28 ++++- .../net/simon987/npcplugin/VaultDoor.java | 9 +- .../event/VaultWorldUpdateListener.java | 5 +- .../java/net/simon987/server/game/Action.java | 4 +- .../server/webserver/DebugHandler.java | 8 +- 9 files changed, 154 insertions(+), 28 deletions(-) diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLaser.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLaser.java index 92157f5..5c27e43 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLaser.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotLaser.java @@ -72,18 +72,22 @@ public class CubotLaser extends CpuHardware { // TODO } else if (a == LASER_ATTACK) { - if (cubot.spendEnergy(70)) { - - //Get object directly in front of the Cubot - Point frontTile = cubot.getFrontTile(); - ArrayList objects = cubot.getWorld().getGameObjectsAt(frontTile.x, frontTile.y); + if (cubot.getCurrentAction() == Action.IDLE) { + if (cubot.spendEnergy(70)) { + + //Get object directly in front of the Cubot + Point frontTile = cubot.getFrontTile(); + ArrayList objects = cubot.getWorld().getGameObjectsAt(frontTile.x, frontTile.y); + + //todo: Add option in config to allow PvP + if (objects.size() > 0 && objects.get(0) instanceof Attackable && !(objects.get(0) instanceof Cubot)) { + ((Attackable) objects.get(0)).damage(LASER_DAMAGE); + } - if (objects.size() > 0 && objects.get(0) instanceof Attackable) { - ((Attackable) objects.get(0)).damage(LASER_DAMAGE); } + cubot.setCurrentAction(Action.ATTACKING); } - } } diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java index 1115dca..167efce 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java @@ -1,20 +1,74 @@ package net.simon987.npcplugin; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; import net.simon987.server.GameServer; +import net.simon987.server.game.Attackable; +import net.simon987.server.game.GameObject; import net.simon987.server.game.Updatable; +import net.simon987.server.logging.LogManager; +import org.json.simple.JSONObject; -public class ElectricBox extends Obstacle implements Updatable { +public class ElectricBox extends GameObject implements Updatable, Attackable { - public static final int STYLE = 1; + public static final int ID = 7; private static final int maxHp = GameServer.INSTANCE.getConfig().getInt("electric_box_hp"); private static final int damage = GameServer.INSTANCE.getConfig().getInt("electric_box_damage"); private static final int energyGiven = GameServer.INSTANCE.getConfig().getInt("electric_box_energy_given"); - public ElectricBox() { - super(maxHp); + private int hp; - setStyle(STYLE); + public ElectricBox() { + + this.hp = maxHp; + + } + + @Override + public void setHealRate(int hp) { + //no op + } + + @Override + public int getHp() { + return hp; + } + + @Override + public void setHp(int hp) { + this.hp = hp; + } + + @Override + public int getMaxHp() { + return hp; + } + + @Override + public void setMaxHp(int hp) { + //No op + } + + @Override + public void heal(int amount) { + //No op + } + + @Override + public void damage(int amount) { + hp -= amount; + + //YOU ARE DEAD + if (hp <= 0) { + setDead(true); + LogManager.LOGGER.severe("BOX DEAD"); + } + } + + @Override + public char getMapInfo() { + return Obstacle.MAP_INFO; } @Override @@ -22,6 +76,43 @@ public class ElectricBox extends Obstacle implements Updatable { } + @Override + public JSONObject serialise() { + JSONObject json = new JSONObject(); + + json.put("i", getObjectId()); + json.put("x", getX()); + json.put("y", getY()); + json.put("t", ID); + json.put("hp", hp); + + return json; + } + + @Override + public BasicDBObject mongoSerialise() { + BasicDBObject dbObject = new BasicDBObject(); + + dbObject.put("i", getObjectId()); + dbObject.put("x", getX()); + dbObject.put("y", getY()); + dbObject.put("t", ID); + dbObject.put("hp", getHp()); + + return dbObject; + } + + public static ElectricBox deserialize(DBObject obj) { + + ElectricBox electricBox = new ElectricBox(); + electricBox.setHp((int) obj.get("hp")); + electricBox.setObjectId((long) obj.get("i")); + electricBox.setX((int) obj.get("x")); + electricBox.setY((int) obj.get("y")); + + return electricBox; + } + @Override public boolean onDeadCallback() { getWorld().decUpdatable(); 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 964c921..e4d32d0 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java @@ -48,6 +48,8 @@ public class NpcPlugin extends ServerPlugin implements GameObjectDeserializer, C return VaultDoor.deserialize(obj); } else if (objType == Obstacle.ID) { return Obstacle.deserialize(obj); + } else if (objType == ElectricBox.ID) { + return ElectricBox.deserialize(obj); } return null; diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/Obstacle.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/Obstacle.java index 2df67a2..3dbdc6b 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/Obstacle.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/Obstacle.java @@ -13,6 +13,7 @@ import org.json.simple.JSONObject; public class Obstacle extends GameObject implements Attackable { public static final int ID = 6; + public static final int MAP_INFO = 0x0400; /** * Style of the obstacle. Will tell the client which sprite to display @@ -77,7 +78,7 @@ public class Obstacle extends GameObject implements Attackable { @Override public char getMapInfo() { - return 0x0400; + return MAP_INFO; } public int getStyle() { @@ -96,6 +97,7 @@ public class Obstacle extends GameObject implements Attackable { dbObject.put("x", getX()); dbObject.put("y", getY()); dbObject.put("t", ID); + dbObject.put("hp", hp); dbObject.put("style", style); return dbObject; @@ -117,7 +119,6 @@ public class Obstacle extends GameObject implements Attackable { public static Obstacle deserialize(DBObject obj) { - //Doesn't matter if we don't store maxHP, since obstacles can't be healed Obstacle obstacle = new Obstacle((int) obj.get("hp")); obstacle.setObjectId((long) obj.get("i")); obstacle.setX((int) obj.get("x")); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDimension.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDimension.java index 1ca6338..504f4e5 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDimension.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDimension.java @@ -17,6 +17,8 @@ public class VaultDimension { */ private String name; + private World homeWorld; + public VaultDimension(long vaultDoorId) { name = "v" + vaultDoorId + "-"; @@ -42,6 +44,8 @@ public class VaultDimension { int maxLayerCount = 6; int minAttachedWorld = 0; int maxAttachedWorld = 4; //todo cap at 4 to avoid infinite loop + int minElectricBoxCount = 2; + int maxElectricBoxCount = 4; HashMap> worldLayers = new HashMap<>(); VaultWorldGenerator generator = new VaultWorldGenerator(); @@ -50,11 +54,11 @@ public class VaultDimension { int layerCount = random.nextInt(maxLayerCount - minLayerCount) + minLayerCount; //1. Create home world - WorldBluePrint homeWorld = new WorldBluePrint(); - homeWorld.coords.x = 0x7FFF; - homeWorld.coords.y = 0x7FFF; + WorldBluePrint homeWorldBluePrint = new WorldBluePrint(); + homeWorldBluePrint.coords.x = 0x7FFF; + homeWorldBluePrint.coords.y = 0x7FFF; worldLayers.put(0, new ArrayList<>()); - worldLayers.get(0).add(homeWorld); + worldLayers.get(0).add(homeWorldBluePrint); //2. For each world in the current layer, attach a random number of new worlds for (int i = 1; i <= layerCount; i++) { @@ -100,9 +104,21 @@ public class VaultDimension { World vWorld = generator.generateVaultWorld(bp.coords.x, bp.coords.y, bp.openings, name); GameServer.INSTANCE.getGameUniverse().addWorld(vWorld); + ArrayList newBoxes = VaultWorldUtils.generateElectricBoxes(vWorld, minElectricBoxCount, + maxElectricBoxCount); + for (ElectricBox blob : newBoxes) { + vWorld.addObject(blob); + vWorld.incUpdatable(); + } + if (key == layerCount - 1) { lastLayerWorlds.add(vWorld); } + + if (key == 0) { + this.homeWorld = vWorld; + //TODO: generate exit door here and save the coords + } } } @@ -117,6 +133,10 @@ public class VaultDimension { return worldLayers.values().stream().flatMap(Collection::stream).anyMatch(bp -> bp.coords.equals(coords)); } + World getHomeWorld() { + return homeWorld; + } + /** * Helper class to plan the layout of a vault dimension */ diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java index 2cc2796..b1f71f9 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java @@ -55,6 +55,7 @@ public class VaultDoor extends GameObject implements Programmable, Enterable, Up } else { VaultDimension vaultDimension = new VaultDimension(getObjectId()); + homeWorld = vaultDimension.getHomeWorld(); } } @@ -111,7 +112,13 @@ public class VaultDoor extends GameObject implements Programmable, Enterable, Up LogManager.LOGGER.fine("VAULT enter " + open); if (open) { - //TODO: Enter in the vault + + object.getWorld().decUpdatable(); + object.getWorld().removeObject(object); + + homeWorld.incUpdatable(); + homeWorld.addObject(object); + object.setWorld(homeWorld); return true; diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/event/VaultWorldUpdateListener.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/event/VaultWorldUpdateListener.java index 31db1e3..1ef06f7 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/event/VaultWorldUpdateListener.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/event/VaultWorldUpdateListener.java @@ -53,10 +53,11 @@ public class VaultWorldUpdateListener implements GameEventListener { if (GameServer.INSTANCE.getGameUniverse().getTime() >= waitUntil) { //If the timer was set less than respawn_time ticks ago, respawn the blobs - ArrayList newBlobs = VaultWorldUtils.generateElectricBoxes(world, minElectricBoxCount, + ArrayList newBoxes = VaultWorldUtils.generateElectricBoxes(world, minElectricBoxCount, maxElectricBoxCount); - for (ElectricBox blob : newBlobs) { + for (ElectricBox blob : newBoxes) { world.addObject(blob); + world.incUpdatable(); } //Set the 'waitUntil' time to 0 to indicate that we are not waiting diff --git a/Server/src/main/java/net/simon987/server/game/Action.java b/Server/src/main/java/net/simon987/server/game/Action.java index f9f037f..5a1cbfd 100644 --- a/Server/src/main/java/net/simon987/server/game/Action.java +++ b/Server/src/main/java/net/simon987/server/game/Action.java @@ -6,6 +6,8 @@ public enum Action { WALKING, WITHDRAWING, DEPOSITING, - LISTENING + LISTENING, + _PLACEHOLDER_, + ATTACKING, } diff --git a/Server/src/main/java/net/simon987/server/webserver/DebugHandler.java b/Server/src/main/java/net/simon987/server/webserver/DebugHandler.java index 6d4107d..7d59d00 100644 --- a/Server/src/main/java/net/simon987/server/webserver/DebugHandler.java +++ b/Server/src/main/java/net/simon987/server/webserver/DebugHandler.java @@ -240,15 +240,13 @@ public class DebugHandler implements MessageHandler { if (object instanceof Updatable) { object.getWorld().decUpdatable(); + world.incUpdatable(); + } object.getWorld().removeObject(object); - object.setWorld(world); world.addObject(object); - - if (object instanceof Updatable) { - world.incUpdatable(); - } + object.setWorld(world); object.setX(x); object.setY(y);