From eb5176c589896ecd5aa951e4f59754d91f211bb6 Mon Sep 17 00:00:00 2001 From: Nicolas BARBOTIN Date: Thu, 1 Feb 2018 16:39:42 +0100 Subject: [PATCH] + Added GPS upgrade + Added JS functions like GetUpgrades and IsOwner * Made upgrade checking easier --- README.md | 1 - .../net/montoyo/wd/block/BlockScreen.java | 4 +- .../net/montoyo/wd/client/ClientProxy.java | 2 +- .../montoyo/wd/client/JSQueryDispatcher.java | 46 +++++++++++++++--- .../net/montoyo/wd/core/DefaultUpgrade.java | 10 +++- .../java/net/montoyo/wd/core/IUpgrade.java | 1 + .../montoyo/wd/entity/TileEntityScreen.java | 10 ++-- .../java/net/montoyo/wd/item/ItemUpgrade.java | 11 +++++ .../resources/assets/webdisplays/html/io.html | 31 ++++++++---- .../assets/webdisplays/html/wdlib.js | 25 ++++++++++ .../assets/webdisplays/lang/en_us.lang | 1 + .../webdisplays/models/item/upgrade_gps.json | 7 +++ .../assets/webdisplays/textures/items/gps.png | Bin 0 -> 246 bytes 13 files changed, 123 insertions(+), 26 deletions(-) create mode 100644 src/main/resources/assets/webdisplays/models/item/upgrade_gps.json create mode 100644 src/main/resources/assets/webdisplays/textures/items/gps.png diff --git a/README.md b/README.md index 75de557..173de61 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ This is the unfinished port of the WebDisplays mod for Minecraft 1.12.2. The tex * Read config (see "Config elements" below) ### TODO -* GPS Upgrade * Achievements (minePad 2 and all that stuff) * Top/bottom screen orientation * GuiSetURL2 missing buttons diff --git a/src/main/java/net/montoyo/wd/block/BlockScreen.java b/src/main/java/net/montoyo/wd/block/BlockScreen.java index 51b11f9..fdc47ac 100644 --- a/src/main/java/net/montoyo/wd/block/BlockScreen.java +++ b/src/main/java/net/montoyo/wd/block/BlockScreen.java @@ -200,13 +200,13 @@ public class BlockScreen extends WDBlockContainer { @Override public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block, BlockPos source) { - if(block != this && !world.isRemote) { + if(block != this && !world.isRemote && !state.getValue(emitting)) { for(BlockSide side: BlockSide.values()) { Vector3i vec = new Vector3i(pos); Multiblock.findOrigin(world, vec, side, null); TileEntityScreen tes = (TileEntityScreen) world.getTileEntity(vec.toBlock()); - if(tes != null && tes.hasUpgrade(side, WebDisplays.INSTANCE.itemUpgrade, DefaultUpgrade.REDSTONE_INPUT.ordinal())) { + if(tes != null && tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_INPUT)) { EnumFacing facing = EnumFacing.VALUES[side.reverse().ordinal()]; //Opposite face vec.sub(pos.getX(), pos.getY(), pos.getZ()).neg(); tes.updateJSRedstone(side, new Vector2i(vec.dot(side.right), vec.dot(side.up)), world.getRedstonePower(pos, facing)); diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index bfa6360..52b3456 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -411,7 +411,7 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi Multiblock.findOrigin(mc.world, pos, side, null); TileEntityScreen te = (TileEntityScreen) mc.world.getTileEntity(pos.toBlock()); - if(te != null && te.hasUpgrade(side, WebDisplays.INSTANCE.itemUpgrade, DefaultUpgrade.LASER_MOUSE.ordinal())) { //hasUpgrade returns false is there's no screen on side 'side' + if(te != null && te.hasUpgrade(side, DefaultUpgrade.LASER_MOUSE)) { //hasUpgrade returns false is there's no screen on side 'side' //Since rights aren't synchronized, let the server check them for us... TileEntityScreen.Screen scr = te.getScreen(side); diff --git a/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java b/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java index cc4b9ee..a9e3346 100644 --- a/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java +++ b/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java @@ -5,6 +5,7 @@ package net.montoyo.wd.client; import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.relauncher.Side; @@ -14,6 +15,7 @@ import net.montoyo.mcef.api.IJSQueryCallback; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.core.IScreenQueryHandler; +import net.montoyo.wd.core.IUpgrade; import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.net.SMessageScreenCtrl; @@ -89,6 +91,7 @@ public final class JSQueryDispatcher { private final ClientProxy.ScreenSidePair lookupResult = new ClientProxy.ScreenSidePair(); private final HashMap handlers = new HashMap<>(); private final ArrayList serverQueries = new ArrayList<>(); + private final Minecraft mc = Minecraft.getMinecraft(); public JSQueryDispatcher(ClientProxy proxy) { this.proxy = proxy; @@ -226,7 +229,7 @@ public final class JSQueryDispatcher { }); register("GetRedstoneAt", (cb, tes, side, args) -> { - if(!tes.hasUpgrade(side, WebDisplays.INSTANCE.itemUpgrade, DefaultUpgrade.REDSTONE_INPUT.ordinal())) { + if(!tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_INPUT)) { cb.failure(403, "Missing upgrade"); return; } @@ -247,7 +250,7 @@ public final class JSQueryDispatcher { }); register("GetRedstoneArray", (cb, tes, side, args) -> { - if(tes.hasUpgrade(side, WebDisplays.INSTANCE.itemUpgrade, DefaultUpgrade.REDSTONE_INPUT.ordinal())) { + if(tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_INPUT)) { final Vector2i size = tes.getScreen(side).size; final EnumFacing facing = EnumFacing.VALUES[side.reverse().ordinal()]; final BlockPos.MutableBlockPos mbp = new BlockPos.MutableBlockPos(); @@ -276,8 +279,8 @@ public final class JSQueryDispatcher { }); register("ClearRedstone", (cb, tes, side, args) -> { - if(tes.hasUpgrade(side, WebDisplays.INSTANCE.itemUpgrade, DefaultUpgrade.REDSTONE_OUTPUT.ordinal())) { - if(tes.getScreen(side).owner.uuid.equals(Minecraft.getMinecraft().player.getGameProfile().getId())) + if(tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_OUTPUT)) { + if(tes.getScreen(side).owner.uuid.equals(mc.player.getGameProfile().getId())) makeServerQuery(tes, side, cb, JSServerRequest.CLEAR_REDSTONE); else cb.success("{\"status\":\"notOwner\"}"); @@ -291,12 +294,12 @@ public final class JSQueryDispatcher { return; } - if(!tes.hasUpgrade(side, WebDisplays.INSTANCE.itemUpgrade, DefaultUpgrade.REDSTONE_OUTPUT.ordinal())) { + if(!tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_OUTPUT)) { cb.failure(403, "Missing upgrade"); return; } - if(!tes.getScreen(side).owner.uuid.equals(Minecraft.getMinecraft().player.getGameProfile().getId())) { + if(!tes.getScreen(side).owner.uuid.equals(mc.player.getGameProfile().getId())) { cb.success("{\"status\":\"notOwner\"}"); return; } @@ -313,6 +316,37 @@ public final class JSQueryDispatcher { makeServerQuery(tes, side, cb, JSServerRequest.SET_REDSTONE_AT, x, y, state); }); + + register("GetLocation", (cb, tes, side, args) -> { + if(!tes.hasUpgrade(side, DefaultUpgrade.GPS)) { + cb.failure(403, "Missing upgrade"); + return; + } + + BlockPos bp = tes.getPos(); + cb.success("{\"x\":" + bp.getX() + ",\"y\":" + bp.getY() + ",\"z\":" + bp.getZ() + ",\"side\":\"" + side + "\"}"); + }); + + register("GetUpgrades", (cb, tes, side, args) -> { + final StringBuilder sb = new StringBuilder("{\"upgrades\":["); + final ArrayList upgrades = tes.getScreen(side).upgrades; + + for(int i = 0; i < upgrades.size(); i++) { + if(i > 0) + sb.append(','); + + sb.append('\"'); + sb.append(((IUpgrade) upgrades.get(i).getItem()).getJSName(upgrades.get(i))); + sb.append('\"'); + } + + cb.success(sb.append("]}").toString()); + }); + + register("IsOwner", (cb, tes, side, args) -> { + boolean res = (tes.getScreen(side).owner != null && tes.getScreen(side).owner.uuid.equals(mc.player.getGameProfile().getId())); + cb.success("{\"isOwner\":" + (res ? "true}" : "false}")); + }); } } diff --git a/src/main/java/net/montoyo/wd/core/DefaultUpgrade.java b/src/main/java/net/montoyo/wd/core/DefaultUpgrade.java index 92d0a8a..62f0f9a 100644 --- a/src/main/java/net/montoyo/wd/core/DefaultUpgrade.java +++ b/src/main/java/net/montoyo/wd/core/DefaultUpgrade.java @@ -4,11 +4,15 @@ package net.montoyo.wd.core; +import net.minecraft.item.ItemStack; +import net.montoyo.wd.WebDisplays; + public enum DefaultUpgrade { LASER_MOUSE("lasermouse"), REDSTONE_INPUT("redinput"), - REDSTONE_OUTPUT("redoutput"); + REDSTONE_OUTPUT("redoutput"), + GPS("gps"); private final String name; @@ -20,4 +24,8 @@ public enum DefaultUpgrade { return name; } + public boolean matches(ItemStack is) { + return is.getItem() == WebDisplays.INSTANCE.itemUpgrade && is.getMetadata() == ordinal(); + } + } diff --git a/src/main/java/net/montoyo/wd/core/IUpgrade.java b/src/main/java/net/montoyo/wd/core/IUpgrade.java index d0d0731..858c6ce 100644 --- a/src/main/java/net/montoyo/wd/core/IUpgrade.java +++ b/src/main/java/net/montoyo/wd/core/IUpgrade.java @@ -17,5 +17,6 @@ public interface IUpgrade { void onInstall(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable EntityPlayer player, @Nonnull ItemStack is); boolean onRemove(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable EntityPlayer player, @Nonnull ItemStack is); //Return true to prevent dropping boolean isSameUpgrade(@Nonnull ItemStack myStack, @Nonnull ItemStack otherStack); //myStack.getItem() is an instance of this class + String getJSName(@Nonnull ItemStack is); //modname:upgradename } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index a4cb0a3..f6468bb 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -8,7 +8,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -500,7 +499,7 @@ public class TileEntityScreen extends TileEntity { return; } - if(scr.upgrades.stream().noneMatch((is) -> is.getItem() == WebDisplays.INSTANCE.itemUpgrade && is.getMetadata() == DefaultUpgrade.REDSTONE_OUTPUT.ordinal())) { + if(scr.upgrades.stream().noneMatch(DefaultUpgrade.REDSTONE_OUTPUT::matches)) { WebDisplays.NET_HANDLER.sendTo(new CMessageJSResponse(reqId, req, 403, "Missing upgrade"), src); return; } @@ -817,13 +816,12 @@ public class TileEntityScreen extends TileEntity { return scr.upgrades.stream().anyMatch((otherStack) -> itemAsUpgrade.isSameUpgrade(is, otherStack)); } - //Special version of hasUpgrade(BlockSide, ItemStack) that matches only the item and the meta - public boolean hasUpgrade(BlockSide side, Item item, int meta) { + public boolean hasUpgrade(BlockSide side, DefaultUpgrade du) { Screen scr = getScreen(side); if(scr == null) return false; - return scr.upgrades.stream().anyMatch((otherStack) -> otherStack.getItem() == item && otherStack.getMetadata() == meta); + return scr.upgrades.stream().anyMatch(du::matches); } public void removeUpgrade(BlockSide side, ItemStack is, @Nullable EntityPlayer player) { @@ -891,7 +889,7 @@ public class TileEntityScreen extends TileEntity { if((scr.rightsFor(ply) & ScreenRights.CLICK) == 0) return null; //Don't output an error, it can 'legally' happen - if(scr.upgrades.stream().noneMatch((is) -> is.getItem() == WebDisplays.INSTANCE.itemUpgrade && is.getMetadata() == DefaultUpgrade.LASER_MOUSE.ordinal())) { + if(scr.upgrades.stream().noneMatch(DefaultUpgrade.LASER_MOUSE::matches)) { Log.error("Called laser operation on side %s, but it's missing the laser sensor upgrade", side.toString()); return null; } diff --git a/src/main/java/net/montoyo/wd/item/ItemUpgrade.java b/src/main/java/net/montoyo/wd/item/ItemUpgrade.java index 7863df8..01b162a 100644 --- a/src/main/java/net/montoyo/wd/item/ItemUpgrade.java +++ b/src/main/java/net/montoyo/wd/item/ItemUpgrade.java @@ -76,4 +76,15 @@ public class ItemUpgrade extends Item implements IUpgrade { } } + @Override + public String getJSName(@Nonnull ItemStack is) { + int meta = is.getMetadata(); + DefaultUpgrade[] upgrades = DefaultUpgrade.values(); + + if(meta < 0 || meta >= upgrades.length) + return "webdisplays:wtf"; + else + return "webdisplays:" + upgrades[meta].getName(); + } + } diff --git a/src/main/resources/assets/webdisplays/html/io.html b/src/main/resources/assets/webdisplays/html/io.html index 2ad9666..3c45c4b 100644 --- a/src/main/resources/assets/webdisplays/html/io.html +++ b/src/main/resources/assets/webdisplays/html/io.html @@ -52,6 +52,7 @@ var screenData = [ 0 ]; var gotSize = false; var gotData = false; + var hasRedOutput = false; function generateTable() { var ppp = $(window).width() / (screenW - 0.25); @@ -126,18 +127,30 @@ else gotData = true; }); + + wdGetUpgrades(function(upgrades) { + for(i = 0; i < upgrades.length; i++) { + if(upgrades[i] == "webdisplays:redoutput") { + hasRedOutput = true; + wdClearRedstone(); + break; + } + } + }); }); function wdToggle(x, y) { - var elem = $("#cell_" + x + "_" + y); - y = screenH - y - 1; - - if(elem.hasClass("redstone_override")) { - elem.removeClass("redstone_override"); - wdSetRedstoneAt(x, y, false); - } else { - elem.addClass("redstone_override"); - wdSetRedstoneAt(x, y, true); + if(hasRedOutput) { + var elem = $("#cell_" + x + "_" + y); + y = screenH - y - 1; + + if(elem.hasClass("redstone_override")) { + elem.removeClass("redstone_override"); + wdSetRedstoneAt(x, y, false); + } else { + elem.addClass("redstone_override"); + wdSetRedstoneAt(x, y, true); + } } } diff --git a/src/main/resources/assets/webdisplays/html/wdlib.js b/src/main/resources/assets/webdisplays/html/wdlib.js index 997463a..90f7c06 100644 --- a/src/main/resources/assets/webdisplays/html/wdlib.js +++ b/src/main/resources/assets/webdisplays/html/wdlib.js @@ -25,23 +25,48 @@ function wdGetSize(callback) { }); } +function wdGetUpgrades(callback) { + wdExecRequest("GetUpgrades", function(resp) { + callback(resp.upgrades); + }); +} + +function wdIsOwner(callback) { + wdExecRequest("IsOwner", function(resp) { + callback(resp.isOwner); + }); +} + +//Requires upgrade: webdisplays:redinput function wdGetRedstoneAt(x, y, callback) { wdExecRequest("GetRedstoneAt(" + x + "," + y + ")", function(resp) { callback(resp.level); }); } +//Requires upgrade: webdisplays:redinput function wdGetRedstoneArray(callback) { wdExecRequest("GetRedstoneArray", function(resp) { callback(resp.levels); }); } +//Requires upgrade: webdisplays:redoutput +//If the client is not the owner, does nothing (resp.status = "notOwner") function wdClearRedstone() { wdExecRequest("ClearRedstone", function(resp) { /* console.log(resp.status); */ }); } +//Requires upgrade: webdisplays:redoutput +//If the client is not the owner, does nothing (resp.status = "notOwner") function wdSetRedstoneAt(x, y, state) { var istate = state ? 1 : 0; wdExecRequest("SetRedstoneAt(" + x + "," + y + "," + istate + ")", function(resp) { /* console.log(resp.status); */ }); } + +//Requires upgrade: webdisplays:gps +function wdGetLocation(callback) { + wdExecRequest("GetLocation", function(resp) { + callback(resp.x, resp.y, resp.z, resp.side); + }); +} diff --git a/src/main/resources/assets/webdisplays/lang/en_us.lang b/src/main/resources/assets/webdisplays/lang/en_us.lang index bf35ef6..0ec11ea 100644 --- a/src/main/resources/assets/webdisplays/lang/en_us.lang +++ b/src/main/resources/assets/webdisplays/lang/en_us.lang @@ -15,6 +15,7 @@ item.webdisplays.upgrade.name=Screen Upgrade item.webdisplays.upgrade.lasermouse.name=Laser Sensor item.webdisplays.upgrade.redinput.name=Redstone Input Port item.webdisplays.upgrade.redoutput.name=Redstone Output Port +item.webdisplays.upgrade.gps.name=GPS Module item.webdisplays.laserpointer.name=Laser Pointer webdisplays.message.tooSmall=Too small! Minimum size is 2x2. webdisplays.message.invalid=Structure is invalid; look at %s. diff --git a/src/main/resources/assets/webdisplays/models/item/upgrade_gps.json b/src/main/resources/assets/webdisplays/models/item/upgrade_gps.json new file mode 100644 index 0000000..26c9b55 --- /dev/null +++ b/src/main/resources/assets/webdisplays/models/item/upgrade_gps.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "webdisplays:items/upgrade", + "layer1": "webdisplays:items/gps" + } +} diff --git a/src/main/resources/assets/webdisplays/textures/items/gps.png b/src/main/resources/assets/webdisplays/textures/items/gps.png new file mode 100644 index 0000000000000000000000000000000000000000..ddbb3682b2a50ae37d1d99e9d2dee85e6d55c1e7 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPd6CQAsGbEzKIX^cyHLnE7WngeFN=+5)LDqY^`njxgN@xNAlBi4L literal 0 HcmV?d00001