+ Added IsEmitting(x, y) and GetEmissionArray()
This commit is contained in:
parent
3456a0e1cb
commit
4daf889c9d
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
64
src/main/java/net/montoyo/wd/utilities/ScreenIterator.java
Normal file
64
src/main/java/net/montoyo/wd/utilities/ScreenIterator.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user