+ Added GPS upgrade

+ Added JS functions like GetUpgrades and IsOwner
* Made upgrade checking easier
This commit is contained in:
Nicolas BARBOTIN 2018-02-01 16:39:42 +01:00
parent 3d9b7be33d
commit eb5176c589
13 changed files with 123 additions and 26 deletions

View File

@ -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

View File

@ -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));

View File

@ -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);

View File

@ -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<String, IScreenQueryHandler> handlers = new HashMap<>();
private final ArrayList<ServerQuery> 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<ItemStack> 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}"));
});
}
}

View File

@ -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();
}
}

View File

@ -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
}

View File

@ -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;
}

View File

@ -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();
}
}

View File

@ -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);
}
}
}
</script>

View File

@ -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);
});
}

View File

@ -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.

View File

@ -0,0 +1,7 @@
{
"parent": "item/generated",
"textures": {
"layer0": "webdisplays:items/upgrade",
"layer1": "webdisplays:items/gps"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B