+ Added IsEmitting(x, y) and GetEmissionArray()

This commit is contained in:
Nicolas BARBOTIN 2018-02-14 15:43:44 +01:00
parent 3456a0e1cb
commit 4daf889c9d
6 changed files with 171 additions and 74 deletions

View File

@ -2,6 +2,8 @@
This is the unfinished port of the WebDisplays mod for Minecraft 1.12.2. The text below is my "TODO" list. This is the unfinished port of the WebDisplays mod for Minecraft 1.12.2. The text below is my "TODO" list.
### Things before release ### Things before release
* Add IsEmitting and GetEmissionArray
* Do some nice screenshots
* "Anti-9minecraft" * "Anti-9minecraft"
* Update website * Update website
* Publish * Publish

View File

@ -22,10 +22,7 @@ import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.net.server.SMessageScreenCtrl; import net.montoyo.wd.net.server.SMessageScreenCtrl;
import net.montoyo.wd.utilities.*; import net.montoyo.wd.utilities.*;
import java.util.ArrayDeque; import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public final class JSQueryDispatcher { public final class JSQueryDispatcher {
@ -250,34 +247,17 @@ public final class JSQueryDispatcher {
register("GetRedstoneArray", (cb, tes, side, args) -> { register("GetRedstoneArray", (cb, tes, side, args) -> {
if(tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_INPUT)) { if(tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_INPUT)) {
final Vector2i size = tes.getScreen(side).size;
final EnumFacing facing = EnumFacing.VALUES[side.reverse().ordinal()]; final EnumFacing facing = EnumFacing.VALUES[side.reverse().ordinal()];
final BlockPos.MutableBlockPos mbp = new BlockPos.MutableBlockPos(); final StringJoiner resp = new StringJoiner(",", "{\"levels\":[", "]}");
final Vector3i vec1 = new Vector3i(tes.getPos());
final Vector3i vec2 = new Vector3i();
final StringBuilder resp = new StringBuilder("{\"levels\":[");
for(int y = 0; y < size.y; y++) { tes.forEachScreenBlocks(side, bp -> {
vec2.set(vec1); if(tes.getWorld().getBlockState(bp).getValue(BlockScreen.emitting))
resp.add("0");
else
resp.add("" + tes.getWorld().getRedstonePower(bp, facing));
});
for(int x = 0; x < size.x; x++) { cb.success(resp.toString());
if(x > 0 || y > 0)
resp.append(',');
vec2.toBlock(mbp);
if(tes.getWorld().getBlockState(mbp).getValue(BlockScreen.emitting))
resp.append(0);
else
resp.append(tes.getWorld().getRedstonePower(mbp, facing));
vec2.add(side.right.x, side.right.y, side.right.z);
}
vec1.add(side.up.x, side.up.y, side.up.z);
}
cb.success(resp.append("]}").toString());
} else } else
cb.failure(403, "Missing upgrade"); cb.failure(403, "Missing upgrade");
}); });
@ -321,6 +301,37 @@ public final class JSQueryDispatcher {
makeServerQuery(tes, side, cb, JSServerRequest.SET_REDSTONE_AT, x, y, state); makeServerQuery(tes, side, cb, JSServerRequest.SET_REDSTONE_AT, x, y, state);
}); });
register("IsEmitting", (cb, tes, side, args) -> {
if(!tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_OUTPUT)) {
cb.failure(403, "Missing upgrade");
return;
}
if(args.length == 2 && args[0] instanceof Double && args[1] instanceof Double) {
TileEntityScreen.Screen scr = tes.getScreen(side);
int x = ((Double) args[0]).intValue();
int y = ((Double) args[1]).intValue();
if(x < 0 || x >= scr.size.x || y < 0 || y >= scr.size.y)
cb.failure(403, "Out of range");
else {
BlockPos bpos = (new Vector3i(tes.getPos())).addMul(side.right, x).addMul(side.up, y).toBlock();
boolean e = tes.getWorld().getBlockState(bpos).getValue(BlockScreen.emitting);
cb.success("{\"emitting\":" + (e ? "true" : "false") + "}");
}
} else
cb.failure(400, "Wrong arguments");
});
register("GetEmissionArray", (cb, tes, side, args) -> {
if(tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_OUTPUT)) {
final StringJoiner resp = new StringJoiner(",", "{\"emission\":[", "]}");
tes.forEachScreenBlocks(side, bp -> resp.add(tes.getWorld().getBlockState(bp).getValue(BlockScreen.emitting) ? "1" : "0"));
cb.success(resp.toString());
} else
cb.failure(403, "Missing upgrade");
});
register("GetLocation", (cb, tes, side, args) -> { register("GetLocation", (cb, tes, side, args) -> {
if(!tes.hasUpgrade(side, DefaultUpgrade.GPS)) { if(!tes.hasUpgrade(side, DefaultUpgrade.GPS)) {
cb.failure(403, "Missing upgrade"); cb.failure(403, "Missing upgrade");

View File

@ -37,6 +37,7 @@ import net.montoyo.wd.utilities.Rotation;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.*;
import java.util.function.Consumer;
public class TileEntityScreen extends TileEntity { public class TileEntityScreen extends TileEntity {
@ -167,27 +168,12 @@ public class TileEntityScreen extends TileEntity {
} }
redstoneStatus = new NibbleArray(size.x * size.y); redstoneStatus = new NibbleArray(size.x * size.y);
final BlockPos.MutableBlockPos mbp = new BlockPos.MutableBlockPos();
final Vector3i vec1 = new Vector3i(start);
final Vector3i vec2 = new Vector3i();
final EnumFacing facing = EnumFacing.VALUES[side.reverse().ordinal()]; final EnumFacing facing = EnumFacing.VALUES[side.reverse().ordinal()];
final ScreenIterator it = new ScreenIterator(start, side, size);
for(int y = 0; y < size.y; y++) { while(it.hasNext()) {
final int base = y * size.x; int idx = it.getIndex();
vec2.set(vec1); redstoneStatus.set(idx, world.getRedstonePower(it.next(), facing));
for(int x = 0; x < size.x; x++) {
vec2.toBlock(mbp);
if(world.getBlockState(mbp).getValue(BlockScreen.emitting))
redstoneStatus.set(base + x, 0);
else
redstoneStatus.set(base + x, world.getRedstonePower(mbp, facing));
vec2.add(side.right.x, side.right.y, side.right.z);
}
vec1.add(side.up.x, side.up.y, side.up.z);
} }
} }
@ -207,6 +193,17 @@ public class TileEntityScreen extends TileEntity {
} }
public void forEachScreenBlocks(BlockSide side, Consumer<BlockPos> func) {
Screen scr = getScreen(side);
if(scr != null) {
ScreenIterator it = new ScreenIterator(pos, side, scr.size);
while(it.hasNext())
func.accept(it.next());
}
}
private final ArrayList<Screen> screens = new ArrayList<>(); private final ArrayList<Screen> screens = new ArrayList<>();
private AxisAlignedBB renderBB = new AxisAlignedBB(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); private AxisAlignedBB renderBB = new AxisAlignedBB(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
private boolean loaded = true; private boolean loaded = true;

View File

@ -0,0 +1,64 @@
/*
* Copyright (C) 2018 BARBOTIN Nicolas
*/
package net.montoyo.wd.utilities;
import net.minecraft.util.math.BlockPos;
import java.util.Iterator;
public final class ScreenIterator implements Iterator<BlockPos> {
private final Vector3i vec1;
private final Vector3i vec2;
private final BlockSide side;
private final Vector2i size;
private final BlockPos.MutableBlockPos blockPos;
private int x = 0;
private int y = 0;
private boolean hasNext = true;
public ScreenIterator(BlockPos pos, BlockSide side, Vector2i size) {
vec1 = new Vector3i(pos);
vec2 = vec1.clone();
this.side = side;
this.size = size;
blockPos = new BlockPos.MutableBlockPos();
}
@Override
public final boolean hasNext() {
return hasNext;
}
@Override
public final BlockPos next() {
vec2.toBlock(blockPos);
if(++x >= size.x) {
if(++y >= size.y)
hasNext = false;
else {
x = 0;
vec2.set(vec1.add(side.up));
}
} else
vec2.add(side.right);
return blockPos;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getIndex() {
return y * size.x + x;
}
}

View File

@ -50,8 +50,6 @@
var screenW = 1; var screenW = 1;
var screenH = 1; var screenH = 1;
var screenData = [ 0 ]; var screenData = [ 0 ];
var gotSize = false;
var gotData = false;
var hasRedOutput = false; var hasRedOutput = false;
function generateTable() { function generateTable() {
@ -112,30 +110,21 @@
wdGetSize(function(w, h) { wdGetSize(function(w, h) {
screenW = w; screenW = w;
screenH = h; screenH = h;
if(gotData) wdGetRedstoneArray(function(array) {
generateTable(); screenData = array;
else generateTable();
gotSize = true;
}); wdGetUpgrades(function(upgrades) {
for(i = 0; i < upgrades.length; i++) {
wdGetRedstoneArray(function(array) { if(upgrades[i] == "webdisplays:redoutput") {
screenData = array; hasRedOutput = true;
fetchEmissionData();
if(gotSize) break;
generateTable(); }
else }
gotData = true; });
}); });
wdGetUpgrades(function(upgrades) {
for(i = 0; i < upgrades.length; i++) {
if(upgrades[i] == "webdisplays:redoutput") {
hasRedOutput = true;
wdClearRedstone();
break;
}
}
}); });
}); });
@ -153,6 +142,22 @@
} }
} }
} }
function fetchEmissionData() {
wdGetEmissionArray(function(emission) {
for(y = 0; y < screenH; y++) {
for(x = 0; x < screenW; x++) {
var elem = $("#cell_" + x + "_" + y);
if(emission[y * screenW + x]) {
if(!elem.hasClass("redstone_override"))
elem.addClass("redstone_override");
} else if(elem.hasClass("redstone_override"))
elem.removeClass("redstone_override");
}
}
});
}
</script> </script>
</head> </head>
<body> <body>

View File

@ -82,6 +82,24 @@ function wdSetRedstoneAt(x, y, state) {
wdExecRequest("SetRedstoneAt(" + x + "," + y + "," + istate + ")", function(resp) { /* console.log(resp.status); */ }); wdExecRequest("SetRedstoneAt(" + x + "," + y + "," + istate + ")", function(resp) { /* console.log(resp.status); */ });
} }
//Requires upgrade: webdisplays:redoutput
function wdIsEmitting(x, y, callback) {
wdExecRequest("IsEmitting(" + x + "," + y + ")", function(resp) {
callback(resp.emitting);
});
}
//Requires upgrade: webdisplays:redoutput
function wdGetEmissionArray(callback) {
wdExecRequest("GetEmissionArray", function(resp) {
var emission = [];
for(i = 0; i < resp.emission.length; i++)
emission.push(resp.emission[i] != 0);
callback(emission);
});
}
//Requires upgrade: webdisplays:gps //Requires upgrade: webdisplays:gps
function wdGetLocation(callback) { function wdGetLocation(callback) {
wdExecRequest("GetLocation", function(resp) { wdExecRequest("GetLocation", function(resp) {