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 9385def..b6cdc32 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java @@ -10,9 +10,11 @@ import net.simon987.server.logging.LogManager; import net.simon987.server.user.User; import org.json.simple.JSONObject; +import java.awt.*; import java.util.ArrayList; +import java.util.Random; -public class Cubot extends GameObject implements Updatable, ControllableUnit, Programmable, Attackable { +public class Cubot extends GameObject implements Updatable, ControllableUnit, Programmable, Attackable, Rechargeable { private static final char MAP_INFO = 0x0080; public static final int ID = 1; @@ -233,20 +235,19 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Pr this.energy = energy; } - public boolean spendEnergy(int spent) { + public boolean spendEnergy(int amount) { - if (energy - spent < 0) { + if (energy - amount < 0) { return false; } else { - energy -= spent; + energy -= amount; return true; } } - public void storeEnergy(int qty) { - - energy = Math.min(energy + qty, maxEnergy); + public void storeEnergy(int amount) { + energy = Math.min(energy + amount, maxEnergy); } public void setMaxEnergy(int maxEnergy) { @@ -420,9 +421,46 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Pr } } + public void reset() { + setDead(false); + setHp(maxHp); + setShield(0); + setHeldItem(0); + setEnergy(maxEnergy); + clearKeyboardBuffer(); + consoleMessagesBuffer.clear(); + lastConsoleMessagesBuffer.clear(); + hologramColor = 0; + currentStatus = 0; + lastStatus = 0; + addStatus(CubotStatus.FACTORY_NEW); + } + @Override public boolean onDeadCallback() { - LogManager.LOGGER.severe("Cubot death"); - return true; //always cancelled + LogManager.LOGGER.info(getParent().getUsername() + "'s Cubot died"); + + reset(); + + //Teleport to spawn point + this.getWorld().removeObject(this); + this.getWorld().decUpdatable(); + + ServerConfiguration config = GameServer.INSTANCE.getConfig(); + Random random = new Random(); + + int spawnX = config.getInt("new_user_worldX") + random.nextInt(5); + int spawnY = config.getInt("new_user_worldY") + random.nextInt(5); + String dimension = config.getString("new_user_dimension"); + this.setWorld(GameServer.INSTANCE.getGameUniverse().getWorld(spawnX, spawnY, true, dimension)); + + Point point = this.getWorld().getRandomPassableTile(); + this.setX(point.x); + this.setY(point.y); + + this.getWorld().addObject(this); + this.getWorld().incUpdatable(); + + return true; } } diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotStatus.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotStatus.java index bb16666..1fd0318 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotStatus.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotStatus.java @@ -7,7 +7,8 @@ public enum CubotStatus { DEFAULT(0), RADIATED(1), - DAMAGED(2); + DAMAGED(2), + FACTORY_NEW(3); public char val; 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 6e64be2..a91d32d 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 @@ -1,6 +1,7 @@ package net.simon987.cubotplugin.event; import net.simon987.cubotplugin.Cubot; +import net.simon987.cubotplugin.CubotStatus; import net.simon987.server.GameServer; import net.simon987.server.ServerConfiguration; import net.simon987.server.event.GameEvent; @@ -25,6 +26,7 @@ public class UserCreationListener implements GameEventListener { User user = (User) event.getSource(); Cubot cubot = new Cubot(); + cubot.addStatus(CubotStatus.FACTORY_NEW); cubot.setObjectId(GameServer.INSTANCE.getGameUniverse().getNextObjectId()); ServerConfiguration config = GameServer.INSTANCE.getConfig(); 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 167efce..f50af38 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/ElectricBox.java @@ -3,22 +3,28 @@ package net.simon987.npcplugin; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import net.simon987.server.GameServer; +import net.simon987.server.assembly.Util; import net.simon987.server.game.Attackable; import net.simon987.server.game.GameObject; +import net.simon987.server.game.Rechargeable; import net.simon987.server.game.Updatable; import net.simon987.server.logging.LogManager; import org.json.simple.JSONObject; +import java.util.ArrayList; + public class ElectricBox extends GameObject implements Updatable, Attackable { 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 damageDealt = GameServer.INSTANCE.getConfig().getInt("electric_box_damage"); private static final int energyGiven = GameServer.INSTANCE.getConfig().getInt("electric_box_energy_given"); private int hp; + private ArrayList nearObjects = new ArrayList<>(); + public ElectricBox() { this.hp = maxHp; @@ -71,9 +77,31 @@ public class ElectricBox extends GameObject implements Updatable, Attackable { return Obstacle.MAP_INFO; } + private void updateNearObjects() { + + nearObjects.clear(); + + for (GameObject object : getWorld().getGameObjects()) { + if (object != this && object instanceof Attackable && Util.manhattanDist(object.getX(), object.getY(), + getX(), getY()) <= 1) { + nearObjects.add((Attackable) object); + } + } + } + @Override public void update() { + updateNearObjects(); + + for (Attackable obj : nearObjects) { + obj.damage(damageDealt); + + if (obj instanceof Rechargeable) { + ((Rechargeable) obj).storeEnergy(energyGiven); + } + } + } @Override diff --git a/Server/src/main/java/net/simon987/server/GameServer.java b/Server/src/main/java/net/simon987/server/GameServer.java index 1ad30c6..98d85fd 100644 --- a/Server/src/main/java/net/simon987/server/GameServer.java +++ b/Server/src/main/java/net/simon987/server/GameServer.java @@ -92,6 +92,7 @@ public class GameServer implements Runnable { eventDispatcher.getListeners().add(new UserInfoCommandListener()); eventDispatcher.getListeners().add(new HealObjCommandListener()); eventDispatcher.getListeners().add(new DamageObjCommandListener()); + eventDispatcher.getListeners().add(new SetEnergyCommandListener()); } diff --git a/Server/src/main/java/net/simon987/server/game/Rechargeable.java b/Server/src/main/java/net/simon987/server/game/Rechargeable.java new file mode 100644 index 0000000..8787804 --- /dev/null +++ b/Server/src/main/java/net/simon987/server/game/Rechargeable.java @@ -0,0 +1,16 @@ +package net.simon987.server.game; + +public interface Rechargeable { + + int getEnergy(); + + void setEnergy(int energy); + + boolean spendEnergy(int spent); + + void storeEnergy(int amount); + + void setMaxEnergy(int maxEnergy); + + int getMaxEnergy(); +} 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 893e688..18d4472 100644 --- a/Server/src/main/java/net/simon987/server/game/World.java +++ b/Server/src/main/java/net/simon987/server/game/World.java @@ -160,6 +160,8 @@ public class World implements MongoSerialisable { if (!object.onDeadCallback()) { removeObject(object); //LogManager.LOGGER.fine("Removed object " + object + " id: " + object.getObjectId()); + } else if (object instanceof Updatable) { + ((Updatable) object).update(); } } else if (object instanceof Updatable) { diff --git a/Server/src/main/java/net/simon987/server/game/debug/SetEnergyCommandListener.java b/Server/src/main/java/net/simon987/server/game/debug/SetEnergyCommandListener.java new file mode 100644 index 0000000..63495b5 --- /dev/null +++ b/Server/src/main/java/net/simon987/server/game/debug/SetEnergyCommandListener.java @@ -0,0 +1,44 @@ +package net.simon987.server.game.debug; + +import net.simon987.server.GameServer; +import net.simon987.server.event.DebugCommandEvent; +import net.simon987.server.event.GameEvent; +import net.simon987.server.event.GameEventListener; +import net.simon987.server.game.GameObject; +import net.simon987.server.game.Rechargeable; + +public class SetEnergyCommandListener implements GameEventListener { + + @Override + public Class getListenedEventType() { + return DebugCommandEvent.class; + } + + @Override + public void handle(GameEvent event) { + + DebugCommandEvent e = (DebugCommandEvent) event; + + if (e.getName().equals("setEnergy")) { + + GameObject object = GameServer.INSTANCE.getGameUniverse().getObject(e.getLong("objectId")); + + if (object != null) { + + if (object instanceof Rechargeable) { + + int oldEnergy = ((Rechargeable) object).getEnergy(); + ((Rechargeable) object).setEnergy(e.getInt("amount")); + + e.reply("Success: " + oldEnergy + " -> " + e.getInt("amount")); + } else { + e.reply("Object is not Rechargeable"); + } + + } else { + e.reply("Object not found: " + e.getLong("objectId")); + } + } + } + +}