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) {