From eea9420192127437eb36ea97c128ce8ba03515b3 Mon Sep 17 00:00:00 2001 From: James T Date: Fri, 29 Dec 2017 22:35:02 -0800 Subject: [PATCH 1/4] 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(); From 81767ed5cf6703b2a239b805421352ba295d8e3f Mon Sep 17 00:00:00 2001 From: James T Date: Sat, 30 Dec 2017 09:01:58 -0800 Subject: [PATCH 2/4] Updates for #66: reorganize and relocate some methods and calls --- .../net/simon987/npcplugin/HarvesterNPC.java | 25 ----------- .../event/ObjectDeathListener.java | 41 ++++++++++++++++++- .../java/net/simon987/server/game/World.java | 2 +- 3 files changed, 41 insertions(+), 27 deletions(-) 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 7ae17fb..eb911ab 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/HarvesterNPC.java @@ -3,7 +3,6 @@ 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; @@ -41,36 +40,12 @@ 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 index 7b789a3..de20d32 100644 --- a/Plugin Plant/src/main/java/net/simon987/biomassplugin/event/ObjectDeathListener.java +++ b/Plugin Plant/src/main/java/net/simon987/biomassplugin/event/ObjectDeathListener.java @@ -1,10 +1,19 @@ 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.npcplugin.HarvesterNPC; +import net.simon987.biomassplugin.BiomassBlob; +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() { @@ -16,7 +25,37 @@ public class ObjectDeathListener implements GameEventListener { // a HarvesterNPC ObjectDeathEvent is received if (((ObjectDeathEvent)event).getSourceObjectId().equals(HarvesterNPC.ID)) { HarvesterNPC dyingHarvesterNPC = (HarvesterNPC)event.getSource(); - dyingHarvesterNPC.getWorld().getGameObjects.add(dyingHarvesterNPC.createBiomassBlobInPlace()); + + // 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/src/main/java/net/simon987/server/game/World.java b/Server/src/main/java/net/simon987/server/game/World.java index 2765f2e..9f3cb5b 100644 --- a/Server/src/main/java/net/simon987/server/game/World.java +++ b/Server/src/main/java/net/simon987/server/game/World.java @@ -102,8 +102,8 @@ public class World implements JSONSerialisable { for (GameObject object : gameObjects_) { //Clean up dead objects if (object.isDead()) { - gameObjects.remove(object); object.onDeadCallback(); + gameObjects.remove(object); //LogManager.LOGGER.fine("Removed object " + object + " id: " + object.getObjectId()); } else if (object instanceof Updatable) { ((Updatable) object).update(); From 2398219fab31e860aab5b7214824abac84ddc438 Mon Sep 17 00:00:00 2001 From: James T Date: Sat, 30 Dec 2017 11:08:43 -0800 Subject: [PATCH 3/4] Update #66: rm npc plugin dependency from plant.event plugin --- .../simon987/biomassplugin/event/ObjectDeathListener.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 index de20d32..a1dfd12 100644 --- a/Plugin Plant/src/main/java/net/simon987/biomassplugin/event/ObjectDeathListener.java +++ b/Plugin Plant/src/main/java/net/simon987/biomassplugin/event/ObjectDeathListener.java @@ -4,8 +4,8 @@ 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.npcplugin.HarvesterNPC; import net.simon987.biomassplugin.BiomassBlob; +import net.simon987.server.game.GameObject; import net.simon987.server.game.World; import net.simon987.server.logging.LogManager; @@ -23,8 +23,9 @@ public class ObjectDeathListener implements GameEventListener { @Override public void handle(GameEvent event) { // a HarvesterNPC ObjectDeathEvent is received - if (((ObjectDeathEvent)event).getSourceObjectId().equals(HarvesterNPC.ID)) { - HarvesterNPC dyingHarvesterNPC = (HarvesterNPC)event.getSource(); + // 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( From 3ded64cb16e6b2f6684002b09561a8614765d4ea Mon Sep 17 00:00:00 2001 From: James T Date: Tue, 2 Jan 2018 15:29:14 -0800 Subject: [PATCH 4/4] Update #66: add newest Server/Server.iml file --- Server/Server.iml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Server/Server.iml diff --git a/Server/Server.iml b/Server/Server.iml new file mode 100644 index 0000000..52af955 --- /dev/null +++ b/Server/Server.iml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + +