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 1fe5579..2723ad7 100644
--- a/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java
+++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java
@@ -3,9 +3,13 @@ package net.simon987.npcplugin;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import net.simon987.server.GameServer;
+import net.simon987.server.event.ObjectDeathEvent;
import net.simon987.server.game.Direction;
+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;
@@ -44,6 +48,12 @@ public class HarvesterNPC extends NonPlayerCharacter {
}
}
+ @Override
+ public void onDeadCallback() {
+ GameServer.INSTANCE.getEventDispatcher().dispatch(
+ new ObjectDeathEvent((Object)this, ID));
+ }
+
@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..a1dfd12
--- /dev/null
+++ b/Plugin Plant/src/main/java/net/simon987/biomassplugin/event/ObjectDeathListener.java
@@ -0,0 +1,62 @@
+package net.simon987.biomassplugin.event;
+
+import net.simon987.server.GameServer;
+import net.simon987.server.event.GameEvent;
+import net.simon987.server.event.GameEventListener;
+import net.simon987.server.event.ObjectDeathEvent;
+import net.simon987.biomassplugin.BiomassBlob;
+import net.simon987.server.game.GameObject;
+import net.simon987.server.game.World;
+import net.simon987.server.logging.LogManager;
+
+import java.lang.Random;
+
+/**
+ * Handles ObjectDeathEvent events
+ */
+public class ObjectDeathListener implements GameEventListener {
+ @Override
+ public Class getListenedEventType() {
+ return ObjectDeathEvent.getClass();
+ }
+
+ @Override
+ public void handle(GameEvent event) {
+ // a HarvesterNPC ObjectDeathEvent is received
+ // TODO: setup enum with all GameObject type IDs
+ if (((ObjectDeathEvent)event).getSourceObjectId().equals(10)) {
+ GameObject dyingHarvesterNPC = (GameObject)event.getSource();
+
+ // create a new biomass
+ BiomassBlob newBiomassBlob = createBiomassBlobAt(
+ dyingHarvesterNPC.getX(), dyingHarvesterNPC.getY(), dyingHarvesterNPC.getWorld());
+ // add it to the world game objects
+ dyingHarvesterNPC.getWorld().getGameObjects.add(newBiomassBlob);
+ LogManager.LOGGER.fine("Spawned biomass at (%d, %d)".format(
+ newBiomassBlob.getX(),newBiomassBlob.getY()));
+ }
+ }
+
+ /**
+ * Create and return a biomass at the given x, y coordinates and in the world
+ * @param x x coord of biomass location
+ * @param y y coord of biomass location
+ * @param world world in which the biomass will be created in
+ * @return the new BiomassBlob created
+ */
+ private BiomassBlob createBiomassBlobAt(int x, int y, World world) {
+ 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(x);
+ biomassBlob.setY(y);
+ biomassBlob.setWorld(world);
+
+ return biomassBlob;
+ }
+}
diff --git a/Server/Server.iml b/Server/Server.iml
index 9c5747d..52af955 100644
--- a/Server/Server.iml
+++ b/Server/Server.iml
@@ -19,4 +19,4 @@
-
\ 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 f712e78..d7d958e 100755
--- a/Server/src/main/java/net/simon987/server/game/GameObject.java
+++ b/Server/src/main/java/net/simon987/server/game/GameObject.java
@@ -254,4 +254,9 @@ public abstract class GameObject implements JSONSerialisable, MongoSerialisable
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 33d60d0..2bcca90 100644
--- a/Server/src/main/java/net/simon987/server/game/World.java
+++ b/Server/src/main/java/net/simon987/server/game/World.java
@@ -104,6 +104,7 @@ public class World implements MongoSerialisable {
for (GameObject object : gameObjects_) {
//Clean up dead objects
if (object.isDead()) {
+ object.onDeadCallback();
gameObjects.remove(object);
//LogManager.LOGGER.fine("Removed object " + object + " id: " + object.getObjectId());
} else if (object instanceof Updatable) {