+ Added GPS upgrade
+ Added JS functions like GetUpgrades and IsOwner * Made upgrade checking easier
This commit is contained in:
parent
3d9b7be33d
commit
eb5176c589
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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}"));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"parent": "item/generated",
|
||||
"textures": {
|
||||
"layer0": "webdisplays:items/upgrade",
|
||||
"layer1": "webdisplays:items/gps"
|
||||
}
|
||||
}
|
||||
BIN
src/main/resources/assets/webdisplays/textures/items/gps.png
Normal file
BIN
src/main/resources/assets/webdisplays/textures/items/gps.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 246 B |
Loading…
Reference in New Issue
Block a user