Don't connect fences to stairs

This commit is contained in:
creeper123123321 2019-03-22 15:18:24 -03:00
parent 7ad73cd476
commit 3fd3777e8c
No known key found for this signature in database
GPG Key ID: 0AC57D54786721D1
5 changed files with 31 additions and 18 deletions

View File

@ -4,6 +4,8 @@ import lombok.Getter;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.minecraft.BlockFace;
import us.myles.ViaVersion.api.minecraft.Position;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import java.util.HashMap;
import java.util.HashSet;
@ -47,10 +49,11 @@ public abstract class AbstractFenceConnectionHandler extends ConnectionHandler {
protected byte getStates(UserConnection user, Position position, int blockState) {
byte states = 0;
if (connects(BlockFace.EAST, getBlockData(user, position.getRelative(BlockFace.EAST)))) states |= 1;
if (connects(BlockFace.NORTH, getBlockData(user, position.getRelative(BlockFace.NORTH)))) states |= 2;
if (connects(BlockFace.SOUTH, getBlockData(user, position.getRelative(BlockFace.SOUTH)))) states |= 4;
if (connects(BlockFace.WEST, getBlockData(user, position.getRelative(BlockFace.WEST)))) states |= 8;
boolean pre1_12 = user.get(ProtocolInfo.class).getServerProtocolVersion() < ProtocolVersion.v1_12.getId();
if (connects(BlockFace.EAST, getBlockData(user, position.getRelative(BlockFace.EAST)), pre1_12)) states |= 1;
if (connects(BlockFace.NORTH, getBlockData(user, position.getRelative(BlockFace.NORTH)), pre1_12)) states |= 2;
if (connects(BlockFace.SOUTH, getBlockData(user, position.getRelative(BlockFace.SOUTH)), pre1_12)) states |= 4;
if (connects(BlockFace.WEST, getBlockData(user, position.getRelative(BlockFace.WEST)), pre1_12)) states |= 8;
return states;
}
@ -65,7 +68,9 @@ public abstract class AbstractFenceConnectionHandler extends ConnectionHandler {
return newBlockState == null ? blockState : newBlockState;
}
protected boolean connects(BlockFace side, int blockState) {
return blockStates.contains(blockState) || blockConnections != null && ConnectionData.blockConnectionData.containsKey(blockState) && ConnectionData.blockConnectionData.get(blockState).connectsTo(blockConnections, side.opposite());
protected boolean connects(BlockFace side, int blockState, boolean pre1_12) {
return blockStates.contains(blockState) || blockConnections != null
&& ConnectionData.blockConnectionData.containsKey(blockState)
&& ConnectionData.blockConnectionData.get(blockState).connectsTo(blockConnections, side.opposite(), pre1_12);
}
}

View File

@ -6,14 +6,20 @@ import java.util.HashMap;
import java.util.Map;
public class BlockData {
private Map<String, Boolean[]> connectData = new HashMap<>();
private Map<String, boolean[]> connectData = new HashMap<>();
public void put(String key, Boolean[] booleans) {
public void put(String key, boolean[] booleans) {
connectData.put(key, booleans);
}
public boolean connectsTo(String blockConnection, BlockFace face) {
final Boolean[] booleans = connectData.get(blockConnection);
public boolean connectsTo(String blockConnection, BlockFace face, boolean pre1_12AbstractFence) {
boolean[] booleans = null;
if (pre1_12AbstractFence) {
booleans = connectData.get("allFalseIfStairPre1_12"); // https://minecraft.gamepedia.com/Java_Edition_1.12
}
if (booleans == null) {
booleans = connectData.get(blockConnection);
}
return booleans != null && booleans[face.ordinal()];
}
}

View File

@ -3,10 +3,11 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections;
import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.minecraft.BlockFace;
import us.myles.ViaVersion.api.minecraft.Position;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ChorusPlantConnectionHandler extends AbstractFenceConnectionHandler {
private int endstone;
@ -46,13 +47,13 @@ public class ChorusPlantConnectionHandler extends AbstractFenceConnectionHandler
@Override
protected byte getStates(UserConnection user, Position position, int blockState) {
byte states = super.getStates(user, position, blockState);
if (connects(BlockFace.TOP, getBlockData(user, position.getRelative(BlockFace.TOP)))) states |= 16;
if (connects(BlockFace.BOTTOM, getBlockData(user, position.getRelative(BlockFace.BOTTOM)))) states |= 32;
if (connects(BlockFace.TOP, getBlockData(user, position.getRelative(BlockFace.TOP)), false)) states |= 16;
if (connects(BlockFace.BOTTOM, getBlockData(user, position.getRelative(BlockFace.BOTTOM)), false)) states |= 32;
return states;
}
@Override
protected boolean connects(BlockFace side, int blockState) {
protected boolean connects(BlockFace side, int blockState, boolean pre1_12) {
return getBlockStates().contains(blockState) || (side == BlockFace.BOTTOM && blockState == endstone);
}
}

View File

@ -212,17 +212,18 @@ public class ConnectionData {
for (Entry<String, JsonElement> type : entry.getValue().getAsJsonObject().entrySet()) {
String name = type.getKey();
JsonObject object = type.getValue().getAsJsonObject();
Boolean[] data = new Boolean[6];
boolean[] data = new boolean[6];
for (BlockFace value : BlockFace.values()) {
String face = value.toString().toLowerCase();
if (object.has(face)) {
data[value.ordinal()] = object.getAsJsonPrimitive(face).getAsBoolean();
} else {
data[value.ordinal()] = false;
}
}
blockData.put(name, data);
}
if (entry.getKey().contains("stairs")) {
blockData.put("allFalseIfStairPre1_12", new boolean[6]);
}
blockConnectionData.put(id, blockData);
}
}

View File

@ -83,6 +83,6 @@ public class RedstoneConnectionHandler extends ConnectionHandler {
private boolean connects(BlockFace side, int blockState) {
final BlockData blockData = ConnectionData.blockConnectionData.get(blockState);
return blockData != null && blockData.connectsTo("redstoneConnections", side.opposite());
return blockData != null && blockData.connectsTo("redstoneConnections", side.opposite(), false);
}
}