From 8c5dcd0fba0a5ddfb8a061b68e7f669493b1a23c Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 11 Nov 2017 19:43:06 -0500 Subject: [PATCH] Added Hologram Projector Hardware. Added GET_WORLD_POS in LiDAR. Fixed Drill. --- .../src/net/simon987/cubotplugin/Cubot.java | 27 +++++++--- .../net/simon987/cubotplugin/CubotDrill.java | 2 +- .../simon987/cubotplugin/CubotHologram.java | 49 ++++++++++++++++++ .../net/simon987/cubotplugin/CubotLidar.java | 7 +++ .../net/simon987/cubotplugin/CubotPlugin.java | 2 + .../event/CpuInitialisationListener.java | 4 ++ Server/src/net/simon987/server/Main.java | 49 ------------------ plugins/Cubot.jar | Bin 17581 -> 19013 bytes 8 files changed, 83 insertions(+), 57 deletions(-) create mode 100644 Plugin Cubot/src/net/simon987/cubotplugin/CubotHologram.java diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/Cubot.java b/Plugin Cubot/src/net/simon987/cubotplugin/Cubot.java index 9865d44..116f6fa 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/Cubot.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/Cubot.java @@ -1,6 +1,9 @@ package net.simon987.cubotplugin; -import net.simon987.server.game.*; +import net.simon987.server.game.ControllableUnit; +import net.simon987.server.game.Direction; +import net.simon987.server.game.GameObject; +import net.simon987.server.game.Updatable; import net.simon987.server.user.User; import org.json.simple.JSONObject; @@ -11,7 +14,8 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { private static final char MAP_INFO = 0x0080; public static final int ID = 1; - private EffectType currentEmote = null; + private char hologram = 0; + private char lastHologram = 0; /** * Hit points @@ -45,11 +49,6 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { } } - if (currentEmote != null) { - // getWorld().getQueuedGameEffects().add(new GameEffect(currentEmote, getX(), getY())); - currentEmote = null; - } - /* * CurrentAction is set during the code execution and this function is called right after * If no action as been set, the action sent to the client is the action in currentAction that @@ -57,6 +56,10 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { */ lastAction = currentAction; currentAction = CubotAction.IDLE; + + //Same principle for hologram + lastHologram = hologram; + hologram = 0; } @Override @@ -70,6 +73,8 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { json.put("heldItem", heldItem); json.put("hp", hp); json.put("action", lastAction.ordinal()); + json.put("holo", (int) lastHologram); + if (parent != null) { json.put("parent", parent.getUsername()); //Only used client-side for now } @@ -128,4 +133,12 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit { public CubotAction getAction() { return lastAction; } + + public void setHologram(char hologram) { + this.hologram = hologram; + } + + public char getHologram() { + return lastHologram; + } } diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotDrill.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotDrill.java index 1e0e3a3..beaa338 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotDrill.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotDrill.java @@ -40,7 +40,7 @@ public class CubotDrill extends CpuHardware { } else if (a == GATHER_SLOW || a == GATHER_FAST) { - if (cubot.getAction() != CubotAction.IDLE) { + if (cubot.getAction() == CubotAction.IDLE) { int tile = cubot.getWorld().getTileMap().getTileAt(cubot.getX(), cubot.getY()); if (tile == TileMap.IRON_TILE) { diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotHologram.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotHologram.java new file mode 100644 index 0000000..d5172c4 --- /dev/null +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotHologram.java @@ -0,0 +1,49 @@ +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 CubotHologram extends CpuHardware { + + + /** + * Hardware ID (Should be unique) + */ + static final char HWID = 0x0009; + + public static final int DEFAULT_ADDRESS = 9; + + private Cubot cubot; + + public CubotHologram(Cubot cubot) { + this.cubot = cubot; + } + + @Override + public void handleInterrupt(Status status) { + + char a = getCpu().getRegisterSet().getRegister("A").getValue(); + cubot.setHologram(a); + + } + + @Override + public char getId() { + return HWID; + } + + public static CubotHologram deserialize(JSONObject hwJSON) { + return new CubotHologram((Cubot) GameServer.INSTANCE.getGameUniverse().getObject((int) (long) hwJSON.get("cubot"))); + } + + @Override + public JSONObject serialise() { + JSONObject json = new JSONObject(); + json.put("hwid", (int) HWID); + json.put("cubot", cubot.getObjectId()); + + return json; + } +} diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotLidar.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotLidar.java index 340c970..c9512b5 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotLidar.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotLidar.java @@ -26,6 +26,7 @@ public class CubotLidar extends CpuHardware implements JSONSerialisable { private static final int GET_POS = 1; private static final int GET_PATH = 2; private static final int GET_MAP = 3; + private static final int GET_WORLD_POS = 4; private static final int MEMORY_MAP_START = 0x0100; private static final int MEMORY_PATH_START = 0x0000; @@ -120,6 +121,12 @@ public class CubotLidar extends CpuHardware implements JSONSerialisable { getCpu().getMemory().set(i++, mapInfo[x][y]); } } + break; + case GET_WORLD_POS: + getCpu().getRegisterSet().getRegister("X").setValue(cubot.getWorld().getX()); + getCpu().getRegisterSet().getRegister("Y").setValue(cubot.getWorld().getY()); + break; + } diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotPlugin.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotPlugin.java index 60677f5..31cc603 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotPlugin.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotPlugin.java @@ -51,6 +51,8 @@ public class CubotPlugin extends ServerPlugin implements GameObjectDeserializer, return CubotInventory.deserialize(hwJson); case Keyboard.HWID: return Keyboard.deserialize(hwJson); + case CubotHologram.HWID: + return CubotHologram.deserialize(hwJson); } return null; diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/event/CpuInitialisationListener.java b/Plugin Cubot/src/net/simon987/cubotplugin/event/CpuInitialisationListener.java index bbd78c2..7c962f8 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/event/CpuInitialisationListener.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/event/CpuInitialisationListener.java @@ -33,6 +33,8 @@ public class CpuInitialisationListener implements GameEventListener { drillHw.setCpu(cpu); CubotInventory invHw = new CubotInventory((Cubot) user.getControlledUnit()); invHw.setCpu(cpu); + CubotHologram emoteHw = new CubotHologram((Cubot) user.getControlledUnit()); + emoteHw.setCpu(cpu); cpu.attachHardware(legHw, CubotLeg.DEFAULT_ADDRESS); cpu.attachHardware(laserHw, CubotLaser.DEFAULT_ADDRESS); @@ -40,5 +42,7 @@ public class CpuInitialisationListener implements GameEventListener { cpu.attachHardware(keyboard, Keyboard.DEFAULT_ADDRESS); cpu.attachHardware(drillHw, CubotDrill.DEFAULT_ADDRESS); cpu.attachHardware(invHw, CubotInventory.DEFAULT_ADDRESS); + cpu.attachHardware(invHw, CubotInventory.DEFAULT_ADDRESS); + cpu.attachHardware(emoteHw, CubotHologram.DEFAULT_ADDRESS); } } diff --git a/Server/src/net/simon987/server/Main.java b/Server/src/net/simon987/server/Main.java index d877a68..794b51f 100644 --- a/Server/src/net/simon987/server/Main.java +++ b/Server/src/net/simon987/server/Main.java @@ -11,55 +11,6 @@ public class Main { public static void main(String[] args){ - //TODO: Docs - /* - * - Intel 8086 p.14 design - * - Memory: Storage organisation: From a storage pov, 8086 memory spaces are - * organised as identical arrays of 16-bit words - * - Microprocessor - * - Instruction set - * - - */ - //TODO: Random number generator - //TODO: Clock hardware - //TODO: Floppy drive hardware (and item?) - //TODO: LEA instruction - //TODO: NOT instruction - //TODO: Battery Hardware - - //--------------------------------- - - //TODO: favicon - //TODO: Email verification - //TODO: Real account page - // Change/reset password - //TODO: Object information Window (Hover, click ?) - //TODO: Inventory indicator (Multiple items) - //TODO: Software Interrupts (PIC): Interupt flag? - /* - * - INT/INTO instruction - * - IRET instruction - */ - //TODO: XCHG instruction - //TODO: SAL/SAR instruction - //TODO: ROL/ROR/RCL/RCR instruction - //TODO: LOOP/LOOPE/LOOPX/LOOPNE/LOOPNZ ? - //TODO: World goto (form) - //TODO: Save backup (keep X saves, Zip em) - //TODO: Log backup (keep X backups, Zip em) - //TODO: More tests - //TODO: Handle client disconnects - //TODO: Cache objects requests? - //TODO: Ability to toggle debug stuff - //TODO: Data segment, DB, DW, DD, DQ - //TODO: Set client animation speed relative to TICK_LENGTH - //TODO: Withdraw animation / action - //TODO: Prevent World creation out of bounds, warp around universe - //TODO: Multiple Biomass style (and yield, rarity) - //TODO: Clean sprites - //TODO: Auto-resize - - LogManager.initialize(); ServerConfiguration config = new ServerConfiguration(new File("config.properties")); diff --git a/plugins/Cubot.jar b/plugins/Cubot.jar index b9c2743a728dc1591b78a36f0d94a2ef76c1e3e5..b6ea07674e2a2120018c46b262e50f982f9e9368 100644 GIT binary patch delta 9615 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 VT$v0L8wMMO?r%rQOY)yP{{vWOXp{f|