From eea9420192127437eb36ea97c128ce8ba03515b3 Mon Sep 17 00:00:00 2001 From: James T Date: Fri, 29 Dec 2017 22:35:02 -0800 Subject: [PATCH] HarvesterNPC should spawn a biomass in-place after they die (#33) --- .../net/simon987/npcplugin/HarvesterNPC.java | 35 +++++++++++++++++++ .../event/ObjectDeathListener.java | 22 ++++++++++++ Server/Server.iml | 19 ---------- .../server/event/ObjectDeathEvent.java | 18 ++++++++++ .../net/simon987/server/game/GameObject.java | 5 +++ .../java/net/simon987/server/game/World.java | 1 + 6 files changed, 81 insertions(+), 19 deletions(-) create mode 100644 Plugin Plant/src/main/java/net/simon987/biomassplugin/event/ObjectDeathListener.java delete mode 100644 Server/Server.iml create mode 100644 Server/src/main/java/net/simon987/server/event/ObjectDeathEvent.java 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 cccef1f..7ae17fb 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java @@ -1,9 +1,14 @@ package net.simon987.npcplugin; import net.simon987.server.GameServer; +import net.simon987.server.event.ObjectDeathEvent; import net.simon987.server.game.Direction; +import net.simon987.biomassplugin.BiomassBlob; +import net.simon987.server.logging.LogManager; import org.json.simple.JSONObject; +import java.lang.util.Random; + public class HarvesterNPC extends NonPlayerCharacter { public static final int ID = 10; @@ -36,6 +41,36 @@ public class HarvesterNPC extends NonPlayerCharacter { } } + @Override + public void setDead(boolean dead) { + super.setDead(dead); +// GameServer.INSTANCE.getEventDispatcher().dispatch( +// new ObjectDeathEvent((Object)this, ID)); + } + + @Override + public void onDeadCallback() { + GameServer.INSTANCE.getEventDispatcher().dispatch( + new ObjectDeathEvent((Object)this, ID)); + } + + public BiomassBlob createBiomassBlobInPlace() { + Random random = new Random(); + // random integer in range [2, 4] + int yield = random.nextInt(2) + 2; + + 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.setBiomassCount(yield); + biomassBlob.setX(getX()); + biomassBlob.setY(getY()); + biomassBlob.setWorld(getWorld()); + LogManager.LOGGER.info("HarvesterNPC spawned biomass in its place"); + + return biomassBlob; + } + @Override public JSONObject serialise() { JSONObject json = super.serialise(); diff --git a/Plugin Plant/src/main/java/net/simon987/biomassplugin/event/ObjectDeathListener.java b/Plugin Plant/src/main/java/net/simon987/biomassplugin/event/ObjectDeathListener.java new file mode 100644 index 0000000..7b789a3 --- /dev/null +++ b/Plugin Plant/src/main/java/net/simon987/biomassplugin/event/ObjectDeathListener.java @@ -0,0 +1,22 @@ +package net.simon987.biomassplugin.event; + +import net.simon987.server.event.GameEvent; +import net.simon987.server.event.GameEventListener; +import net.simon987.server.event.ObjectDeathEvent; +import net.simon987.npcplugin.HarvesterNPC; + +public class ObjectDeathListener implements GameEventListener { + @Override + public Class getListenedEventType() { + return ObjectDeathEvent.getClass(); + } + + @Override + public void handle(GameEvent event) { + // a HarvesterNPC ObjectDeathEvent is received + if (((ObjectDeathEvent)event).getSourceObjectId().equals(HarvesterNPC.ID)) { + HarvesterNPC dyingHarvesterNPC = (HarvesterNPC)event.getSource(); + dyingHarvesterNPC.getWorld().getGameObjects.add(dyingHarvesterNPC.createBiomassBlobInPlace()); + } + } +} diff --git a/Server/Server.iml b/Server/Server.iml deleted file mode 100644 index 6da8947..0000000 --- a/Server/Server.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Server/src/main/java/net/simon987/server/event/ObjectDeathEvent.java b/Server/src/main/java/net/simon987/server/event/ObjectDeathEvent.java new file mode 100644 index 0000000..8fddae3 --- /dev/null +++ b/Server/src/main/java/net/simon987/server/event/ObjectDeathEvent.java @@ -0,0 +1,18 @@ +package net.simon987.server.event; + +/** + * Event dispatched by a GameObject who has needed callbacks on death + */ +public class ObjectDeathEvent extends GameEvent { + /** + * The GameObject type ID of object that init this event + */ + private int sourceObjectId; + + public ObjectDeathEvent(Object source, int sourceObjectId) { + setSource(source); + this.sourceObjectId = sourceObjectId; + } + + public int getSourceObjectId() { return sourceObjectId; } +} 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 20679dc..9f7fa86 100755 --- a/Server/src/main/java/net/simon987/server/game/GameObject.java +++ b/Server/src/main/java/net/simon987/server/game/GameObject.java @@ -251,4 +251,9 @@ public abstract class GameObject implements JSONSerialisable { public void setDead(boolean dead) { this.dead = dead; } + + /** + * Called before this GameObject is removed from the world - defaults to doing nothing + */ + public void onDeadCallback() { } } \ No newline at end of file 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 60b939a..2765f2e 100644 --- a/Server/src/main/java/net/simon987/server/game/World.java +++ b/Server/src/main/java/net/simon987/server/game/World.java @@ -103,6 +103,7 @@ public class World implements JSONSerialisable { //Clean up dead objects if (object.isDead()) { gameObjects.remove(object); + object.onDeadCallback(); //LogManager.LOGGER.fine("Removed object " + object + " id: " + object.getObjectId()); } else if (object instanceof Updatable) { ((Updatable) object).update();