From a3fa3c4c09a774eb6faebf3bbaeae18e95219b4c Mon Sep 17 00:00:00 2001 From: simon Date: Sun, 12 Nov 2017 10:27:07 -0500 Subject: [PATCH] Added Battery Hardware. #2 --- .../src/net/simon987/cubotplugin/Cubot.java | 44 +++++++- .../simon987/cubotplugin/CubotBattery.java | 59 +++++++++++ .../net/simon987/cubotplugin/CubotDrill.java | 20 ++-- .../simon987/cubotplugin/CubotInventory.java | 4 +- .../net/simon987/cubotplugin/CubotLaser.java | 29 +++-- .../net/simon987/cubotplugin/CubotLeg.java | 7 +- .../net/simon987/cubotplugin/CubotLidar.java | 100 +++++++++--------- .../net/simon987/cubotplugin/CubotPlugin.java | 2 + .../net/simon987/cubotplugin/Keyboard.java | 3 - .../event/CpuInitialisationListener.java | 3 + .../event/UserCreationListener.java | 3 + .../event/CpuInitialisationListener.java | 9 +- .../src/net/simon987/plantplugin/Plant.java | 14 ++- .../src/net/simon987/server/GameServer.java | 5 +- .../src/net/simon987/server/assembly/CPU.java | 6 ++ .../net/simon987/server/game/GameObject.java | 3 - .../simon987/server/game/InventoryHolder.java | 10 +- config.properties | 2 + plugins/Cubot.jar | Bin 19018 -> 21075 bytes plugins/Plant.jar | Bin 5677 -> 5710 bytes plugins/Plugin Misc HW.jar | Bin 4551 -> 4634 bytes 21 files changed, 224 insertions(+), 99 deletions(-) create mode 100644 Plugin Cubot/src/net/simon987/cubotplugin/CubotBattery.java diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/Cubot.java b/Plugin Cubot/src/net/simon987/cubotplugin/Cubot.java index 116f6fa..bc75d55 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/Cubot.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/Cubot.java @@ -1,5 +1,6 @@ package net.simon987.cubotplugin; +import net.simon987.server.GameServer; import net.simon987.server.game.ControllableUnit; import net.simon987.server.game.Direction; import net.simon987.server.game.GameObject; @@ -30,6 +31,9 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { private User parent; + private int energy; + private int maxEnergy; + public Cubot() { } @@ -43,8 +47,12 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { public void update() { if (currentAction == CubotAction.WALKING) { - if (!incrementLocation()) { - //Couldn't walk + if (spendEnergy(100)) { + if (!incrementLocation()) { + //Couldn't walk + currentAction = CubotAction.IDLE; + } + } else { currentAction = CubotAction.IDLE; } } @@ -74,6 +82,7 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { json.put("hp", hp); json.put("action", lastAction.ordinal()); json.put("holo", (int) lastHologram); + json.put("energy", (int) lastHologram); if (parent != null) { json.put("parent", parent.getUsername()); //Only used client-side for now @@ -91,6 +100,8 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { cubot.hp = (int)(long)json.get("hp"); cubot.setDirection(Direction.getDirection((int)(long)json.get("direction"))); cubot.heldItem = (int)(long)json.get("heldItem"); + cubot.energy = (int) (long) json.get("energy"); + cubot.maxEnergy = GameServer.INSTANCE.getConfig().getInt("battery_max_energy"); return cubot; @@ -141,4 +152,33 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { public char getHologram() { return lastHologram; } + + + public int getEnergy() { + return energy; + } + + public void setEnergy(int energy) { + this.energy = energy; + } + + public boolean spendEnergy(int spent) { + + if (energy - spent < 0) { + return false; + } else { + energy -= spent; + return true; + } + + + } + + public void setMaxEnergy(int maxEnergy) { + this.maxEnergy = maxEnergy; + } + + public int getMaxEnergy() { + return maxEnergy; + } } diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotBattery.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotBattery.java new file mode 100644 index 0000000..93f57d2 --- /dev/null +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotBattery.java @@ -0,0 +1,59 @@ +package net.simon987.cubotplugin; + +import net.simon987.server.GameServer; +import net.simon987.server.assembly.CpuHardware; +import net.simon987.server.assembly.Status; +import org.json.simple.JSONObject; + +public class CubotBattery extends CpuHardware { + + public static final int DEFAULT_ADDRESS = 0x000A; + + /** + * Hardware ID (Should be unique) + */ + public static final char HWID = 0x000A; + + private Cubot cubot; + private static final int POLL = 1; + private static final int GET_MAX_CAPACITY = 2; + + public CubotBattery(Cubot cubot) { + this.cubot = cubot; + } + + @Override + public void handleInterrupt(Status status) { + + int a = getCpu().getRegisterSet().getRegister("A").getValue(); + + if (a == POLL) { + getCpu().getRegisterSet().getRegister("B").setValue(cubot.getEnergy()); + + } else if (a == GET_MAX_CAPACITY) { + getCpu().getRegisterSet().getRegister("B").setValue(cubot.getMaxEnergy()); + } else if (a == 0xFFFF) { + cubot.setEnergy(cubot.getMaxEnergy()); + } + + } + + @Override + public char getId() { + return HWID; + } + + @Override + public JSONObject serialise() { + JSONObject json = new JSONObject(); + json.put("hwid", (int) HWID); + json.put("cubot", cubot.getObjectId()); + + return json; + } + + public static CubotBattery deserialize(JSONObject hwJSON) { + return new CubotBattery((Cubot) GameServer.INSTANCE.getGameUniverse().getObject((int) (long) hwJSON.get("cubot"))); + } + +} diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotDrill.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotDrill.java index beaa338..9f8060e 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotDrill.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotDrill.java @@ -40,19 +40,19 @@ public class CubotDrill extends CpuHardware { } else if (a == GATHER_SLOW || a == GATHER_FAST) { - if (cubot.getAction() == CubotAction.IDLE) { - int tile = cubot.getWorld().getTileMap().getTileAt(cubot.getX(), cubot.getY()); + if (cubot.spendEnergy(1400)) { + if (cubot.getAction() == CubotAction.IDLE) { + int tile = cubot.getWorld().getTileMap().getTileAt(cubot.getX(), cubot.getY()); - if (tile == TileMap.IRON_TILE) { - cubot.setHeldItem(TileMap.ITEM_IRON); - cubot.setCurrentAction(CubotAction.DIGGING); + if (tile == TileMap.IRON_TILE) { + cubot.setHeldItem(TileMap.ITEM_IRON); + cubot.setCurrentAction(CubotAction.DIGGING); - } else if (tile == TileMap.COPPER_TILE) { - cubot.setHeldItem(TileMap.ITEM_COPPER); - cubot.setCurrentAction(CubotAction.DIGGING); + } else if (tile == TileMap.COPPER_TILE) { + cubot.setHeldItem(TileMap.ITEM_COPPER); + cubot.setCurrentAction(CubotAction.DIGGING); - } else { - //System.out.println("FAILED: dig"); + } } } diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotInventory.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotInventory.java index 7557366..3b3cc98 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotInventory.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotInventory.java @@ -38,7 +38,9 @@ public class CubotInventory extends CpuHardware { getCpu().getRegisterSet().getRegister("B").setValue(cubot.getHeldItem()); } else if (a == CLEAR) { - cubot.setHeldItem(0); + if (cubot.spendEnergy(100)) { + cubot.setHeldItem(0); + } } } diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotLaser.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotLaser.java index af33087..2a36834 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotLaser.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotLaser.java @@ -22,6 +22,7 @@ public class CubotLaser extends CpuHardware { private Cubot cubot; private static final int WITHDRAW = 1; + private static final int DEPOSIT = 2; public CubotLaser(Cubot cubot) { @@ -42,33 +43,29 @@ public class CubotLaser extends CpuHardware { if(a == WITHDRAW) { - //System.out.println("withdraw"); Point frontTile = cubot.getFrontTile(); ArrayList objects = cubot.getWorld().getGameObjectsAt(frontTile.x, frontTile.y); if (cubot.getAction() != CubotAction.IDLE && objects.size() > 0) { - + //FIXME: Problem here if more than 1 object if (objects.get(0) instanceof InventoryHolder) { - //Take the item - if (((InventoryHolder) objects.get(0)).takeItem(b)) { + if (((InventoryHolder) objects.get(0)).canTakeItem(b)) { + if (cubot.spendEnergy(30)) { + //Take the item + ((InventoryHolder) objects.get(0)).takeItem(b); - cubot.setHeldItem(b); - //System.out.println("took " + b); - cubot.setCurrentAction(CubotAction.WITHDRAWING); - - } else { - //The inventory holder can't provide this item - //todo Add emote here - // System.out.println("DEBUG: FAILED: take (The inventory holder can't provide this item)"); + cubot.setHeldItem(b); + cubot.setCurrentAction(CubotAction.WITHDRAWING); + } } - } - } else { - //Nothing in front - // System.out.println("DEBUG: FAILED: take (Nothing in front or Cubot is busy)"); } + + + } else if (a == DEPOSIT) { + } } diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotLeg.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotLeg.java index 2fb905b..17dff77 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotLeg.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotLeg.java @@ -39,11 +39,14 @@ public class CubotLeg extends CpuHardware implements JSONSerialisable { if(a == SET_DIR){ + Direction dir = Direction.getDirection(b); if(dir != null){ - cubot.setDirection(Direction.getDirection(b)); - status.setErrorFlag(false); + if (cubot.spendEnergy(20)) { + cubot.setDirection(Direction.getDirection(b)); + status.setErrorFlag(false); + } } else { status.setErrorFlag(true); } diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotLidar.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotLidar.java index c9512b5..e3b5f06 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotLidar.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotLidar.java @@ -52,75 +52,79 @@ public class CubotLidar extends CpuHardware implements JSONSerialisable { getCpu().getRegisterSet().getRegister("Y").setValue(cubot.getY()); break; case GET_PATH: - int b = getCpu().getRegisterSet().getRegister("B").getValue(); - int destX = getCpu().getRegisterSet().getRegister("X").getValue(); - int destY = getCpu().getRegisterSet().getRegister("Y").getValue(); + if (cubot.spendEnergy(50)) { + int b = getCpu().getRegisterSet().getRegister("B").getValue(); + int destX = getCpu().getRegisterSet().getRegister("X").getValue(); + int destY = getCpu().getRegisterSet().getRegister("Y").getValue(); - //Get path - ArrayList nodes = Pathfinder.findPath(cubot.getWorld(), cubot.getX(), cubot.getY(), - destX, destY, b); + //Get path + ArrayList nodes = Pathfinder.findPath(cubot.getWorld(), cubot.getX(), cubot.getY(), + destX, destY, b); -// System.out.println(nodes.size() + " nodes"); + //Write to memory + byte[] mem = getCpu().getMemory().getBytes(); - //Write to memory - byte[] mem = getCpu().getMemory().getBytes(); + int counter = MEMORY_PATH_START; - int counter = MEMORY_PATH_START; + if (nodes != null) { - if (nodes != null) { + Node lastNode = null; - Node lastNode = null; + for (Node n : nodes) { + //Store the path as a sequence of directions - for (Node n : nodes) { - //Store the path as a sequence of directions + if (lastNode == null) { + lastNode = n; + continue; + } + + if (n.x < lastNode.x) { + //West + mem[counter++] = 0; + mem[counter++] = 3; + } else if (n.x > lastNode.x) { + //East + mem[counter++] = 0; + mem[counter++] = 1; + } else if (n.y < lastNode.y) { + //North + mem[counter++] = 0; + mem[counter++] = 0; + } else if (n.y > lastNode.y) { + //South + mem[counter++] = 0; + mem[counter++] = 2; + } - if (lastNode == null) { lastNode = n; - continue; } - if (n.x < lastNode.x) { - //West - mem[counter++] = 0; - mem[counter++] = 3; - } else if (n.x > lastNode.x) { - //East - mem[counter++] = 0; - mem[counter++] = 1; - } else if (n.y < lastNode.y) { - //North - mem[counter++] = 0; - mem[counter++] = 0; - } else if (n.y > lastNode.y) { - //South - mem[counter++] = 0; - mem[counter++] = 2; - } - - lastNode = n; + //Indicate end of path with 0xAAAA + mem[counter++] = -86; + mem[counter] = -86; + } else { + //Indicate invalid path 0xFFFF + mem[counter++] = -1; + mem[counter] = -1; } - //Indicate end of path with 0xAAAA - mem[counter++] = -86; - mem[counter] = -86; - } else { - //Indicate invalid path 0xFFFF - mem[counter++] = -1; - mem[counter] = -1; + LogManager.LOGGER.fine("DEBUG: path to" + destX + "," + destY); } - LogManager.LOGGER.fine("DEBUG: path to" + destX + "," + destY); break; case GET_MAP: - char[][] mapInfo = cubot.getWorld().getMapInfo(); + if (cubot.spendEnergy(10)) { + char[][] mapInfo = cubot.getWorld().getMapInfo(); - int i = MEMORY_MAP_START; - for (int y = 0; y < World.WORLD_SIZE; y++) { - for (int x = 0; x < World.WORLD_SIZE; x++) { - getCpu().getMemory().set(i++, mapInfo[x][y]); + int i = MEMORY_MAP_START; + for (int y = 0; y < World.WORLD_SIZE; y++) { + for (int x = 0; x < World.WORLD_SIZE; x++) { + getCpu().getMemory().set(i++, mapInfo[x][y]); + } } } + break; case GET_WORLD_POS: getCpu().getRegisterSet().getRegister("X").setValue(cubot.getWorld().getX()); diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotPlugin.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotPlugin.java index 31cc603..b96ad16 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotPlugin.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotPlugin.java @@ -53,6 +53,8 @@ public class CubotPlugin extends ServerPlugin implements GameObjectDeserializer, return Keyboard.deserialize(hwJson); case CubotHologram.HWID: return CubotHologram.deserialize(hwJson); + case CubotBattery.HWID: + return CubotBattery.deserialize(hwJson); } return null; diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/Keyboard.java b/Plugin Cubot/src/net/simon987/cubotplugin/Keyboard.java index 46830d4..e3bab5e 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/Keyboard.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/Keyboard.java @@ -9,9 +9,6 @@ public class Keyboard extends CpuHardware { public static final int DEFAULT_ADDRESS = 4; - public static final String NAME = "Wireless Keyboard"; - - private static final int CLEAR_BUFFER = 0; private static final int FETCH_KEY = 1; diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/event/CpuInitialisationListener.java b/Plugin Cubot/src/net/simon987/cubotplugin/event/CpuInitialisationListener.java index 7c962f8..00df370 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/event/CpuInitialisationListener.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/event/CpuInitialisationListener.java @@ -35,6 +35,8 @@ public class CpuInitialisationListener implements GameEventListener { invHw.setCpu(cpu); CubotHologram emoteHw = new CubotHologram((Cubot) user.getControlledUnit()); emoteHw.setCpu(cpu); + CubotBattery batteryHw = new CubotBattery((Cubot) user.getControlledUnit()); + batteryHw.setCpu(cpu); cpu.attachHardware(legHw, CubotLeg.DEFAULT_ADDRESS); cpu.attachHardware(laserHw, CubotLaser.DEFAULT_ADDRESS); @@ -44,5 +46,6 @@ public class CpuInitialisationListener implements GameEventListener { cpu.attachHardware(invHw, CubotInventory.DEFAULT_ADDRESS); cpu.attachHardware(invHw, CubotInventory.DEFAULT_ADDRESS); cpu.attachHardware(emoteHw, CubotHologram.DEFAULT_ADDRESS); + cpu.attachHardware(batteryHw, CubotBattery.DEFAULT_ADDRESS); } } diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/event/UserCreationListener.java b/Plugin Cubot/src/net/simon987/cubotplugin/event/UserCreationListener.java index 72ed7cd..918d7a5 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/event/UserCreationListener.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/event/UserCreationListener.java @@ -34,6 +34,9 @@ public class UserCreationListener implements GameEventListener { cubot.setHeldItem(GameServer.INSTANCE.getConfig().getInt("new_user_item")); + cubot.setEnergy(GameServer.INSTANCE.getConfig().getInt("battery_max_energy")); + cubot.setMaxEnergy(GameServer.INSTANCE.getConfig().getInt("battery_max_energy")); + cubot.setParent(user); Point point = cubot.getWorld().getRandomPassableTile(); diff --git a/Plugin Misc HW/src/net/simon987/mischwplugin/event/CpuInitialisationListener.java b/Plugin Misc HW/src/net/simon987/mischwplugin/event/CpuInitialisationListener.java index 8d6973c..2587d49 100644 --- a/Plugin Misc HW/src/net/simon987/mischwplugin/event/CpuInitialisationListener.java +++ b/Plugin Misc HW/src/net/simon987/mischwplugin/event/CpuInitialisationListener.java @@ -19,7 +19,12 @@ public class CpuInitialisationListener implements GameEventListener { CPU cpu = (CPU) event.getSource(); - cpu.attachHardware(new RandomNumberGenerator(), RandomNumberGenerator.DEFAULT_ADDRESS); - cpu.attachHardware(new Clock(), Clock.DEFAULT_ADDRESS); + RandomNumberGenerator rngHW = new RandomNumberGenerator(); + rngHW.setCpu(cpu); + Clock clock = new Clock(); + clock.setCpu(cpu); + + cpu.attachHardware(rngHW, RandomNumberGenerator.DEFAULT_ADDRESS); + cpu.attachHardware(clock, Clock.DEFAULT_ADDRESS); } } \ No newline at end of file diff --git a/Plugin Plant/src/net/simon987/plantplugin/Plant.java b/Plugin Plant/src/net/simon987/plantplugin/Plant.java index 0a9275f..b1729f7 100644 --- a/Plugin Plant/src/net/simon987/plantplugin/Plant.java +++ b/Plugin Plant/src/net/simon987/plantplugin/Plant.java @@ -132,30 +132,28 @@ public class Plant extends GameObject implements Updatable, InventoryHolder{ return false; } + @Override + public boolean canTakeItem(int item) { + return item == ITM_BIOMASS && grown && biomassCount >= 1; + } + /** * Called when an object attempts to take an item from this Plant. * If the object requests biomass, it will be subtracted from biomassCount, and * if it reaches 0, the plant is deleted * * @param item item id (see MarConstants.ITEM_*) - * @return true if the requested item is ITEM_BIOMASS and if the plant is grown */ @Override - public boolean takeItem(int item) { + public void takeItem(int item) { if (item == ITM_BIOMASS) { if (grown && biomassCount > 1) { biomassCount--; - return true; } else if (grown) { //Delete plant setDead(true); - return true; - } else { - return false; } - } else { - return false; } } diff --git a/Server/src/net/simon987/server/GameServer.java b/Server/src/net/simon987/server/GameServer.java index 385eae7..1f26406 100644 --- a/Server/src/net/simon987/server/GameServer.java +++ b/Server/src/net/simon987/server/GameServer.java @@ -15,6 +15,7 @@ import org.json.simple.JSONObject; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.ArrayList; public class GameServer implements Runnable { @@ -112,7 +113,9 @@ public class GameServer implements Runnable { } //Process each worlds - for (World world : gameUniverse.getWorlds()) { + //Avoid concurrent modification + ArrayList worlds = new ArrayList<>(gameUniverse.getWorlds()); + for (World world : worlds) { world.update(); } diff --git a/Server/src/net/simon987/server/assembly/CPU.java b/Server/src/net/simon987/server/assembly/CPU.java index da5778a..d9d7543 100755 --- a/Server/src/net/simon987/server/assembly/CPU.java +++ b/Server/src/net/simon987/server/assembly/CPU.java @@ -444,5 +444,11 @@ public class CPU implements JSONSerialisable{ return str; } + public CpuHardware getHardware(int address) { + + return attachedHardware.get(address); + + } + } diff --git a/Server/src/net/simon987/server/game/GameObject.java b/Server/src/net/simon987/server/game/GameObject.java index 3ac815a..a5e45ca 100755 --- a/Server/src/net/simon987/server/game/GameObject.java +++ b/Server/src/net/simon987/server/game/GameObject.java @@ -120,9 +120,6 @@ public abstract class GameObject implements JSONSerialisable { x = newX; y = newY; } else { - //Display error when object is trying to walk in a wall - //TODO Add emote here - //System.out.println("DEBUG: FAILED walk"); return false; } diff --git a/Server/src/net/simon987/server/game/InventoryHolder.java b/Server/src/net/simon987/server/game/InventoryHolder.java index 7df1111..f60b2cd 100644 --- a/Server/src/net/simon987/server/game/InventoryHolder.java +++ b/Server/src/net/simon987/server/game/InventoryHolder.java @@ -13,8 +13,12 @@ public interface InventoryHolder { /** * Take an item from the inventory * @param item Desired item id (see MarConstants.ITEM_*) - * @return true is the take item action executed properly, true also means that the desired item - * was removed from the inventory */ - boolean takeItem(int item); + void takeItem(int item); + + /** + * @param item item to take + * @return true if the InventoryHolder can provide this item + */ + boolean canTakeItem(int item); } diff --git a/config.properties b/config.properties index fe03606..a1eac5a 100644 --- a/config.properties +++ b/config.properties @@ -41,6 +41,8 @@ plant_grow_time=32 minTreeCount=3 # Maximum tree count for the WorldGenerator maxTreeCount=10 +# Maximum energy of the battery hardware in kJ +battery_max_energy=60000 # ---------------------------------------------- # Minimum center point count for the WorldGenerator wg_centerPointCountMin=5 diff --git a/plugins/Cubot.jar b/plugins/Cubot.jar index 2810bdf3b8643c9990c07541629cd6b903ad2896..fb49b222d8dd0f4d76ff1b92093639a3f9c00164 100644 GIT binary patch delta 17599 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 delta 15509 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 LBx#fUXU+csfaC{u diff --git a/plugins/Plant.jar b/plugins/Plant.jar index 197eb9ea90debc92b1a29056d69b95566df8c9d7..9e8de1f11520a2849836512f15e4979bb42cfd6d 100644 GIT binary patch delta 1946 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