From a1982ff3ba15a1528db68f6fb3e99893aaa4915f Mon Sep 17 00:00:00 2001 From: lucsoft Date: Fri, 28 May 2021 16:58:12 +0200 Subject: [PATCH 01/19] Updated to Gradle 6.9 --- .gitignore | 5 ++++- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 54708 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- gradlew.bat | 2 +- 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 070a3df0..1867a942 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +#system +.DS_Store + # eclipse bin *.launch @@ -28,4 +31,4 @@ forge*changelog.txt /src/generated/ #vscode -.vscode +.vscode \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 6a4a3e4a..8b11b9e3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ minecraft_version=1.16.5 minecraft_version_min=1.16.5 mappings_channel=snapshot mappings_version=20201028-1.16.3 -forge_version=36.1.13 +forge_version=36.1.24 forge_version_min=36.1.0 mod_group=li.cil.oc2 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7a3265ee94c0ab25cf079ac8ccdf87f41d455d42..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 54708 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

_x$+l{{cH8$W#CT diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1c4bcc29..549d8442 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 86c97c2b..4f906e0c 100755 --- a/gradlew +++ b/gradlew @@ -44,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" diff --git a/gradlew.bat b/gradlew.bat index 43f174ce..107acd32 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -33,7 +33,7 @@ set APP_HOME=%DIRNAME% for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome From ae14b64596203bf9088632ab3afed25e96119f1c Mon Sep 17 00:00:00 2001 From: lucsoft Date: Sat, 29 May 2021 15:54:36 +0200 Subject: [PATCH 02/19] Moved Network to Mojang Mapping --- Mojang.MD | 0 .../cil/oc2/common/network/MessageUtils.java | 14 +++++++------- .../message/AbstractTerminalBlockMessage.java | 2 +- .../message/AbstractTerminalEntityMessage.java | 2 +- .../message/BusInterfaceNameMessage.java | 14 +++++++------- .../message/ComputerBootErrorMessage.java | 6 +++--- .../message/ComputerBusStateMessage.java | 6 +++--- .../network/message/ComputerPowerMessage.java | 4 ++-- .../message/ComputerRunStateMessage.java | 6 +++--- .../message/DiskDriveFloppyMessage.java | 8 ++++---- .../network/message/ExportedFileMessage.java | 4 ++-- .../NetworkConnectorConnectionsMessage.java | 2 +- .../message/RequestImportedFileMessage.java | 4 ++-- .../network/message/RobotBootErrorMessage.java | 6 +++--- .../network/message/RobotBusStateMessage.java | 6 +++--- .../message/RobotInitializationMessage.java | 18 +++++++++--------- .../RobotInitializationRequestMessage.java | 2 +- .../network/message/RobotPowerMessage.java | 4 ++-- .../network/message/RobotRunStateMessage.java | 6 +++--- 19 files changed, 57 insertions(+), 57 deletions(-) create mode 100644 Mojang.MD diff --git a/Mojang.MD b/Mojang.MD new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/li/cil/oc2/common/network/MessageUtils.java b/src/main/java/li/cil/oc2/common/network/MessageUtils.java index d7927a37..de70a9c7 100644 --- a/src/main/java/li/cil/oc2/common/network/MessageUtils.java +++ b/src/main/java/li/cil/oc2/common/network/MessageUtils.java @@ -21,7 +21,7 @@ public final class MessageUtils { return; } - final ServerWorld world = player.getServerWorld(); + final ServerWorld world = player.getLevel(); final TileEntity tileEntity = WorldUtils.getTileEntityIfChunkExists(world, pos); if (type.isInstance(tileEntity)) { callback.accept((T) tileEntity); @@ -35,8 +35,8 @@ public final class MessageUtils { return; } - final ServerWorld world = player.getServerWorld(); - final Entity entity = world.getEntityByID(id); + final ServerWorld world = player.getLevel(); + final Entity entity = world.getEntity(id); if (type.isInstance(entity)) { callback.accept((T) entity); } @@ -44,12 +44,12 @@ public final class MessageUtils { @SuppressWarnings("unchecked") public static void withClientTileEntityAt(final BlockPos pos, final Class type, final Consumer callback) { - final ClientWorld world = Minecraft.getInstance().world; + final ClientWorld world = Minecraft.getInstance().level; if (world == null) { return; } - final TileEntity tileEntity = world.getTileEntity(pos); + final TileEntity tileEntity = world.getBlockEntity(pos); if (type.isInstance(tileEntity)) { callback.accept((T) tileEntity); } @@ -57,12 +57,12 @@ public final class MessageUtils { @SuppressWarnings("unchecked") public static void withClientEntity(final int id, final Class type, final Consumer callback) { - final ClientWorld world = Minecraft.getInstance().world; + final ClientWorld world = Minecraft.getInstance().level; if (world == null) { return; } - final Entity entity = world.getEntityByID(id); + final Entity entity = world.getEntity(id); if (type.isInstance(entity)) { callback.accept((T) entity); } diff --git a/src/main/java/li/cil/oc2/common/network/message/AbstractTerminalBlockMessage.java b/src/main/java/li/cil/oc2/common/network/message/AbstractTerminalBlockMessage.java index 16738ef3..b3f7badf 100644 --- a/src/main/java/li/cil/oc2/common/network/message/AbstractTerminalBlockMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/AbstractTerminalBlockMessage.java @@ -13,7 +13,7 @@ public abstract class AbstractTerminalBlockMessage { /////////////////////////////////////////////////////////////////// protected AbstractTerminalBlockMessage(final ComputerTileEntity tileEntity, final ByteBuffer data) { - this.pos = tileEntity.getPos(); + this.pos = tileEntity.getBlockPos(); this.data = data.array(); } diff --git a/src/main/java/li/cil/oc2/common/network/message/AbstractTerminalEntityMessage.java b/src/main/java/li/cil/oc2/common/network/message/AbstractTerminalEntityMessage.java index 3089a61e..3e986266 100644 --- a/src/main/java/li/cil/oc2/common/network/message/AbstractTerminalEntityMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/AbstractTerminalEntityMessage.java @@ -12,7 +12,7 @@ public abstract class AbstractTerminalEntityMessage { /////////////////////////////////////////////////////////////////// protected AbstractTerminalEntityMessage(final Entity entity, final ByteBuffer data) { - this.entityId = entity.getEntityId(); + this.entityId = entity.getId(); this.data = data.array(); } diff --git a/src/main/java/li/cil/oc2/common/network/message/BusInterfaceNameMessage.java b/src/main/java/li/cil/oc2/common/network/message/BusInterfaceNameMessage.java index 2d654740..5679a012 100644 --- a/src/main/java/li/cil/oc2/common/network/message/BusInterfaceNameMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/BusInterfaceNameMessage.java @@ -18,7 +18,7 @@ public abstract class BusInterfaceNameMessage { /////////////////////////////////////////////////////////////////// protected BusInterfaceNameMessage(final BusCableTileEntity tileEntity, final Direction side, final String value) { - this.pos = tileEntity.getPos(); + this.pos = tileEntity.getBlockPos(); this.side = side; this.value = value; } @@ -38,8 +38,8 @@ public abstract class BusInterfaceNameMessage { public static boolean handleMessageServer(final BusInterfaceNameMessage message, final Supplier context) { context.get().enqueueWork(() -> MessageUtils.withServerTileEntityAt(context, message.pos, BusCableTileEntity.class, (tileEntity) -> { - final Vector3d busCableCenter = Vector3d.copyCentered(tileEntity.getPos()); - if (context.get().getSender().getDistanceSq(busCableCenter) <= 8 * 8) { + final Vector3d busCableCenter = Vector3d.atCenterOf(tileEntity.getBlockPos()); + if (context.get().getSender().distanceToSqr(busCableCenter) <= 8 * 8) { tileEntity.setInterfaceName(message.side, message.value); } })); @@ -48,14 +48,14 @@ public abstract class BusInterfaceNameMessage { public void fromBytes(final PacketBuffer buffer) { pos = buffer.readBlockPos(); - side = buffer.readEnumValue(Direction.class); - value = buffer.readString(32); + side = buffer.readEnum(Direction.class); + value = buffer.readUtf(32); } public static void toBytes(final BusInterfaceNameMessage message, final PacketBuffer buffer) { buffer.writeBlockPos(message.pos); - buffer.writeEnumValue(message.side); - buffer.writeString(message.value, 32); + buffer.writeEnum(message.side); + buffer.writeUtf(message.value, 32); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/network/message/ComputerBootErrorMessage.java b/src/main/java/li/cil/oc2/common/network/message/ComputerBootErrorMessage.java index 4fcc7f82..8680d764 100644 --- a/src/main/java/li/cil/oc2/common/network/message/ComputerBootErrorMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/ComputerBootErrorMessage.java @@ -16,7 +16,7 @@ public final class ComputerBootErrorMessage { /////////////////////////////////////////////////////////////////// public ComputerBootErrorMessage(final ComputerTileEntity tileEntity) { - this.pos = tileEntity.getPos(); + this.pos = tileEntity.getBlockPos(); this.value = tileEntity.getVirtualMachine().getBootError(); } @@ -34,11 +34,11 @@ public final class ComputerBootErrorMessage { public void fromBytes(final PacketBuffer buffer) { pos = buffer.readBlockPos(); - value = buffer.readTextComponent(); + value = buffer.readComponent(); } public static void toBytes(final ComputerBootErrorMessage message, final PacketBuffer buffer) { buffer.writeBlockPos(message.pos); - buffer.writeTextComponent(message.value); + buffer.writeComponent(message.value); } } diff --git a/src/main/java/li/cil/oc2/common/network/message/ComputerBusStateMessage.java b/src/main/java/li/cil/oc2/common/network/message/ComputerBusStateMessage.java index ef93b03c..062045b4 100644 --- a/src/main/java/li/cil/oc2/common/network/message/ComputerBusStateMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/ComputerBusStateMessage.java @@ -16,7 +16,7 @@ public final class ComputerBusStateMessage { /////////////////////////////////////////////////////////////////// public ComputerBusStateMessage(final ComputerTileEntity tileEntity) { - this.pos = tileEntity.getPos(); + this.pos = tileEntity.getBlockPos(); this.value = tileEntity.getVirtualMachine().getBusState(); } @@ -34,11 +34,11 @@ public final class ComputerBusStateMessage { public void fromBytes(final PacketBuffer buffer) { pos = buffer.readBlockPos(); - value = buffer.readEnumValue(CommonDeviceBusController.BusState.class); + value = buffer.readEnum(CommonDeviceBusController.BusState.class); } public static void toBytes(final ComputerBusStateMessage message, final PacketBuffer buffer) { buffer.writeBlockPos(message.pos); - buffer.writeEnumValue(message.value); + buffer.writeEnum(message.value); } } diff --git a/src/main/java/li/cil/oc2/common/network/message/ComputerPowerMessage.java b/src/main/java/li/cil/oc2/common/network/message/ComputerPowerMessage.java index 5f7f7c07..bc3f8e6c 100644 --- a/src/main/java/li/cil/oc2/common/network/message/ComputerPowerMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/ComputerPowerMessage.java @@ -16,7 +16,7 @@ public final class ComputerPowerMessage { /////////////////////////////////////////////////////////////////// public ComputerPowerMessage(final ComputerTileEntity computer, final boolean power) { - this.pos = computer.getPos(); + this.pos = computer.getBlockPos(); this.power = power; } @@ -30,7 +30,7 @@ public final class ComputerPowerMessage { context.get().enqueueWork(() -> MessageUtils.withServerTileEntityAt(context, message.pos, ComputerTileEntity.class, (computer) -> { final ServerPlayerEntity player = context.get().getSender(); - if (player != null && computer.getPos().withinDistance(player.getPositionVec(), 8)) { + if (player != null && computer.getBlockPos().closerThan(player.position(), 8)) { if (message.power) { computer.start(); } else { diff --git a/src/main/java/li/cil/oc2/common/network/message/ComputerRunStateMessage.java b/src/main/java/li/cil/oc2/common/network/message/ComputerRunStateMessage.java index edb3a5d6..abb20e02 100644 --- a/src/main/java/li/cil/oc2/common/network/message/ComputerRunStateMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/ComputerRunStateMessage.java @@ -16,7 +16,7 @@ public final class ComputerRunStateMessage { /////////////////////////////////////////////////////////////////// public ComputerRunStateMessage(final ComputerTileEntity tileEntity) { - this.pos = tileEntity.getPos(); + this.pos = tileEntity.getBlockPos(); this.value = tileEntity.getVirtualMachine().getRunState(); } @@ -34,11 +34,11 @@ public final class ComputerRunStateMessage { public void fromBytes(final PacketBuffer buffer) { pos = buffer.readBlockPos(); - value = buffer.readEnumValue(VMRunState.class); + value = buffer.readEnum(VMRunState.class); } public static void toBytes(final ComputerRunStateMessage message, final PacketBuffer buffer) { buffer.writeBlockPos(message.pos); - buffer.writeEnumValue(message.value); + buffer.writeEnum(message.value); } } diff --git a/src/main/java/li/cil/oc2/common/network/message/DiskDriveFloppyMessage.java b/src/main/java/li/cil/oc2/common/network/message/DiskDriveFloppyMessage.java index f5afe7e8..a8caed78 100644 --- a/src/main/java/li/cil/oc2/common/network/message/DiskDriveFloppyMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/DiskDriveFloppyMessage.java @@ -17,7 +17,7 @@ public final class DiskDriveFloppyMessage { /////////////////////////////////////////////////////////////////// public DiskDriveFloppyMessage(final DiskDriveTileEntity diskDrive) { - this.pos = diskDrive.getPos(); + this.pos = diskDrive.getBlockPos(); this.data = diskDrive.getFloppy().serializeNBT(); } @@ -29,17 +29,17 @@ public final class DiskDriveFloppyMessage { public static boolean handleMessage(final DiskDriveFloppyMessage message, final Supplier context) { context.get().enqueueWork(() -> MessageUtils.withClientTileEntityAt(message.pos, DiskDriveTileEntity.class, - (diskDrive) -> diskDrive.setFloppyClient(ItemStack.read(message.data)))); + (diskDrive) -> diskDrive.setFloppyClient(ItemStack.of(message.data)))); return true; } public void fromBytes(final PacketBuffer buffer) { pos = buffer.readBlockPos(); - data = buffer.readCompoundTag(); + data = buffer.readNbt(); } public static void toBytes(final DiskDriveFloppyMessage message, final PacketBuffer buffer) { buffer.writeBlockPos(message.pos); - buffer.writeCompoundTag(message.data); + buffer.writeNbt(message.data); } } diff --git a/src/main/java/li/cil/oc2/common/network/message/ExportedFileMessage.java b/src/main/java/li/cil/oc2/common/network/message/ExportedFileMessage.java index 37f4fe98..7a7cda98 100644 --- a/src/main/java/li/cil/oc2/common/network/message/ExportedFileMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/ExportedFileMessage.java @@ -44,12 +44,12 @@ public final class ExportedFileMessage { } public static void toBytes(final ExportedFileMessage message, final PacketBuffer buffer) { - buffer.writeString(message.name); + buffer.writeUtf(message.name); buffer.writeByteArray(message.data); } public void fromBytes(final PacketBuffer buffer) { - name = buffer.readString(); + name = buffer.readUtf(); data = buffer.readByteArray(); } } diff --git a/src/main/java/li/cil/oc2/common/network/message/NetworkConnectorConnectionsMessage.java b/src/main/java/li/cil/oc2/common/network/message/NetworkConnectorConnectionsMessage.java index c675a2c8..c8fcfbbd 100644 --- a/src/main/java/li/cil/oc2/common/network/message/NetworkConnectorConnectionsMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/NetworkConnectorConnectionsMessage.java @@ -16,7 +16,7 @@ public final class NetworkConnectorConnectionsMessage { /////////////////////////////////////////////////////////////////// public NetworkConnectorConnectionsMessage(final NetworkConnectorTileEntity connector) { - this.pos = connector.getPos(); + this.pos = connector.getBlockPos(); this.connectedPositions = new ArrayList<>(connector.getConnectedPositions()); } diff --git a/src/main/java/li/cil/oc2/common/network/message/RequestImportedFileMessage.java b/src/main/java/li/cil/oc2/common/network/message/RequestImportedFileMessage.java index 83bfd9b2..ae5b5d02 100644 --- a/src/main/java/li/cil/oc2/common/network/message/RequestImportedFileMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/RequestImportedFileMessage.java @@ -44,8 +44,8 @@ public final class RequestImportedFileMessage { final byte[] data = Files.readAllBytes(path); if (data.length > FileImportExportCardItemDevice.MAX_TRANSFERRED_FILE_SIZE) { Network.INSTANCE.sendToServer(new ClientCanceledImportFileMessage(message.id)); - Minecraft.getInstance().player.sendStatusMessage(FILE_TOO_LARGE_TEXT - .modifyStyle(s -> s.setColor(Color.fromInt(0xFFA0A0))), false); + Minecraft.getInstance().player.displayClientMessage(FILE_TOO_LARGE_TEXT + .withStyle(s -> s.withColor(Color.fromRgb(0xFFA0A0))), false); } else { Network.INSTANCE.sendToServer(new ImportedFileMessage(message.id, data)); } diff --git a/src/main/java/li/cil/oc2/common/network/message/RobotBootErrorMessage.java b/src/main/java/li/cil/oc2/common/network/message/RobotBootErrorMessage.java index 56529752..5f607ce0 100644 --- a/src/main/java/li/cil/oc2/common/network/message/RobotBootErrorMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/RobotBootErrorMessage.java @@ -15,7 +15,7 @@ public final class RobotBootErrorMessage { /////////////////////////////////////////////////////////////////// public RobotBootErrorMessage(final RobotEntity robot) { - this.entityId = robot.getEntityId(); + this.entityId = robot.getId(); this.value = robot.getVirtualMachine().getBootError(); } @@ -33,11 +33,11 @@ public final class RobotBootErrorMessage { public void fromBytes(final PacketBuffer buffer) { entityId = buffer.readVarInt(); - value = buffer.readTextComponent(); + value = buffer.readComponent(); } public static void toBytes(final RobotBootErrorMessage message, final PacketBuffer buffer) { buffer.writeVarInt(message.entityId); - buffer.writeTextComponent(message.value); + buffer.writeComponent(message.value); } } diff --git a/src/main/java/li/cil/oc2/common/network/message/RobotBusStateMessage.java b/src/main/java/li/cil/oc2/common/network/message/RobotBusStateMessage.java index aee2ed19..f8632203 100644 --- a/src/main/java/li/cil/oc2/common/network/message/RobotBusStateMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/RobotBusStateMessage.java @@ -15,7 +15,7 @@ public final class RobotBusStateMessage { /////////////////////////////////////////////////////////////////// public RobotBusStateMessage(final RobotEntity robot) { - this.entityId = robot.getEntityId(); + this.entityId = robot.getId(); this.value = robot.getVirtualMachine().getBusState(); } @@ -33,11 +33,11 @@ public final class RobotBusStateMessage { public void fromBytes(final PacketBuffer buffer) { entityId = buffer.readVarInt(); - value = buffer.readEnumValue(CommonDeviceBusController.BusState.class); + value = buffer.readEnum(CommonDeviceBusController.BusState.class); } public static void toBytes(final RobotBusStateMessage message, final PacketBuffer buffer) { buffer.writeVarInt(message.entityId); - buffer.writeEnumValue(message.value); + buffer.writeEnum(message.value); } } diff --git a/src/main/java/li/cil/oc2/common/network/message/RobotInitializationMessage.java b/src/main/java/li/cil/oc2/common/network/message/RobotInitializationMessage.java index 6ba8851b..4ec89cc5 100644 --- a/src/main/java/li/cil/oc2/common/network/message/RobotInitializationMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/RobotInitializationMessage.java @@ -22,7 +22,7 @@ public final class RobotInitializationMessage { /////////////////////////////////////////////////////////////////// public RobotInitializationMessage(final RobotEntity robot) { - this.entityId = robot.getEntityId(); + this.entityId = robot.getId(); this.busState = robot.getVirtualMachine().getBusState(); this.runState = robot.getVirtualMachine().getRunState(); this.bootError = robot.getVirtualMachine().getBootError(); @@ -48,17 +48,17 @@ public final class RobotInitializationMessage { public void fromBytes(final PacketBuffer buffer) { entityId = buffer.readVarInt(); - busState = buffer.readEnumValue(CommonDeviceBusController.BusState.class); - runState = buffer.readEnumValue(VMRunState.class); - bootError = buffer.readTextComponent(); - terminal = buffer.readCompoundTag(); + busState = buffer.readEnum(CommonDeviceBusController.BusState.class); + runState = buffer.readEnum(VMRunState.class); + bootError = buffer.readComponent(); + terminal = buffer.readNbt(); } public static void toBytes(final RobotInitializationMessage message, final PacketBuffer buffer) { buffer.writeVarInt(message.entityId); - buffer.writeEnumValue(message.busState); - buffer.writeEnumValue(message.runState); - buffer.writeTextComponent(message.bootError); - buffer.writeCompoundTag(message.terminal); + buffer.writeEnum(message.busState); + buffer.writeEnum(message.runState); + buffer.writeComponent(message.bootError); + buffer.writeNbt(message.terminal); } } diff --git a/src/main/java/li/cil/oc2/common/network/message/RobotInitializationRequestMessage.java b/src/main/java/li/cil/oc2/common/network/message/RobotInitializationRequestMessage.java index 0ecf1af5..a16ab68e 100644 --- a/src/main/java/li/cil/oc2/common/network/message/RobotInitializationRequestMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/RobotInitializationRequestMessage.java @@ -14,7 +14,7 @@ public final class RobotInitializationRequestMessage { /////////////////////////////////////////////////////////////////// public RobotInitializationRequestMessage(final RobotEntity robot) { - this.entityId = robot.getEntityId(); + this.entityId = robot.getId(); } public RobotInitializationRequestMessage(final PacketBuffer buffer) { diff --git a/src/main/java/li/cil/oc2/common/network/message/RobotPowerMessage.java b/src/main/java/li/cil/oc2/common/network/message/RobotPowerMessage.java index 497ec0dd..7d5ad07c 100644 --- a/src/main/java/li/cil/oc2/common/network/message/RobotPowerMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/RobotPowerMessage.java @@ -15,7 +15,7 @@ public final class RobotPowerMessage { /////////////////////////////////////////////////////////////////// public RobotPowerMessage(final RobotEntity robot, final boolean power) { - this.entityId = robot.getEntityId(); + this.entityId = robot.getId(); this.power = power; } @@ -29,7 +29,7 @@ public final class RobotPowerMessage { context.get().enqueueWork(() -> MessageUtils.withServerEntity(context, message.entityId, RobotEntity.class, (robot) -> { final ServerPlayerEntity player = context.get().getSender(); - if (player != null && robot.isEntityInRange(player, 8)) { + if (player != null && robot.closerThan(player, 8)) { if (message.power) { robot.start(); } else { diff --git a/src/main/java/li/cil/oc2/common/network/message/RobotRunStateMessage.java b/src/main/java/li/cil/oc2/common/network/message/RobotRunStateMessage.java index c2c192f3..7d0973e0 100644 --- a/src/main/java/li/cil/oc2/common/network/message/RobotRunStateMessage.java +++ b/src/main/java/li/cil/oc2/common/network/message/RobotRunStateMessage.java @@ -15,7 +15,7 @@ public final class RobotRunStateMessage { /////////////////////////////////////////////////////////////////// public RobotRunStateMessage(final RobotEntity robot) { - this.entityId = robot.getEntityId(); + this.entityId = robot.getId(); this.value = robot.getVirtualMachine().getRunState(); } @@ -33,11 +33,11 @@ public final class RobotRunStateMessage { public void fromBytes(final PacketBuffer buffer) { entityId = buffer.readVarInt(); - value = buffer.readEnumValue(VMRunState.class); + value = buffer.readEnum(VMRunState.class); } public static void toBytes(final RobotRunStateMessage message, final PacketBuffer buffer) { buffer.writeVarInt(message.entityId); - buffer.writeEnumValue(message.value); + buffer.writeEnum(message.value); } } From 40fcd08f553ada5eafdceaa026ec402d836a33ab Mon Sep 17 00:00:00 2001 From: lucsoft Date: Sat, 29 May 2021 19:15:49 +0200 Subject: [PATCH 03/19] Migrated DataProviders --- .../cil/oc2/data/ModBlockStateProvider.java | 2 +- .../li/cil/oc2/data/ModBlockTagsProvider.java | 8 +- .../li/cil/oc2/data/ModItemTagsProvider.java | 34 +- .../li/cil/oc2/data/ModLootTableProvider.java | 28 +- .../li/cil/oc2/data/ModRecipesProvider.java | 500 +++++++++--------- .../li/cil/oc2/data/WrenchRecipeBuilder.java | 50 +- 6 files changed, 311 insertions(+), 311 deletions(-) diff --git a/src/main/java/li/cil/oc2/data/ModBlockStateProvider.java b/src/main/java/li/cil/oc2/data/ModBlockStateProvider.java index 55a7fe3b..340964a9 100644 --- a/src/main/java/li/cil/oc2/data/ModBlockStateProvider.java +++ b/src/main/java/li/cil/oc2/data/ModBlockStateProvider.java @@ -62,7 +62,7 @@ public class ModBlockStateProvider extends BlockStateProvider { .end(); BusCableBlock.FACING_TO_CONNECTION_MAP.forEach((direction, connectionType) -> { - final int rotationY = (int) direction.getHorizontalAngle(); + final int rotationY = (int) direction.toYRot(); final int rotationX; if (direction == Direction.UP) { rotationX = 90; diff --git a/src/main/java/li/cil/oc2/data/ModBlockTagsProvider.java b/src/main/java/li/cil/oc2/data/ModBlockTagsProvider.java index 1f36ddf7..543a738d 100644 --- a/src/main/java/li/cil/oc2/data/ModBlockTagsProvider.java +++ b/src/main/java/li/cil/oc2/data/ModBlockTagsProvider.java @@ -16,16 +16,16 @@ public final class ModBlockTagsProvider extends BlockTagsProvider { } @Override - protected void registerTags() { - getOrCreateBuilder(DEVICES).add( + protected void addTags() { + tag(DEVICES).add( COMPUTER.get(), REDSTONE_INTERFACE.get(), DISK_DRIVE.get() ); - getOrCreateBuilder(CABLES).add( + tag(CABLES).add( BUS_CABLE.get() ); - getOrCreateBuilder(WRENCH_BREAKABLE).add( + tag(WRENCH_BREAKABLE).add( COMPUTER.get(), BUS_CABLE.get(), NETWORK_CONNECTOR.get(), diff --git a/src/main/java/li/cil/oc2/data/ModItemTagsProvider.java b/src/main/java/li/cil/oc2/data/ModItemTagsProvider.java index 4b1fbebc..bcea64c4 100644 --- a/src/main/java/li/cil/oc2/data/ModItemTagsProvider.java +++ b/src/main/java/li/cil/oc2/data/ModItemTagsProvider.java @@ -21,11 +21,11 @@ public final class ModItemTagsProvider extends ItemTagsProvider { @SuppressWarnings("unchecked") @Override - protected void registerTags() { + protected void addTags() { copy(BlockTags.CABLES, CABLES); copy(BlockTags.DEVICES, DEVICES); - getOrCreateBuilder(DEVICES).addTags( + tag(DEVICES).addTags( DEVICES_MEMORY, DEVICES_HARD_DRIVE, DEVICES_FLASH_MEMORY, @@ -33,35 +33,35 @@ public final class ModItemTagsProvider extends ItemTagsProvider { DEVICES_ROBOT_MODULE, DEVICES_FLOPPY ); - getOrCreateBuilder(DEVICES_MEMORY).add( + tag(DEVICES_MEMORY).add( Items.MEMORY_SMALL.get(), Items.MEMORY_MEDIUM.get(), Items.MEMORY_LARGE.get() ); - getOrCreateBuilder(DEVICES_HARD_DRIVE).add( + tag(DEVICES_HARD_DRIVE).add( Items.HARD_DRIVE_SMALL.get(), Items.HARD_DRIVE_MEDIUM.get(), Items.HARD_DRIVE_LARGE.get(), Items.HARD_DRIVE_CUSTOM.get() ); - getOrCreateBuilder(DEVICES_FLASH_MEMORY).add( + tag(DEVICES_FLASH_MEMORY).add( Items.FLASH_MEMORY.get(), Items.FLASH_MEMORY_CUSTOM.get() ); - getOrCreateBuilder(DEVICES_FLOPPY).add( + tag(DEVICES_FLOPPY).add( Items.FLOPPY.get() ); - getOrCreateBuilder(DEVICES_CARD).add( + tag(DEVICES_CARD).add( Items.REDSTONE_INTERFACE_CARD.get(), Items.NETWORK_INTERFACE_CARD.get(), Items.FILE_IMPORT_EXPORT_CARD.get() ); - getOrCreateBuilder(DEVICES_ROBOT_MODULE).add( + tag(DEVICES_ROBOT_MODULE).add( Items.INVENTORY_OPERATIONS_MODULE.get(), Items.BLOCK_OPERATIONS_MODULE.get() ); - getOrCreateBuilder(TOOL_MATERIALS).addTags( + tag(TOOL_MATERIALS).addTags( TOOL_MATERIAL_WOOD, TOOL_MATERIAL_STONE, TOOL_MATERIAL_IRON, @@ -69,28 +69,28 @@ public final class ModItemTagsProvider extends ItemTagsProvider { TOOL_MATERIAL_DIAMOND, TOOL_MATERIAL_NETHERITE ); - getOrCreateBuilder(TOOL_MATERIAL_WOOD).addTags( + tag(TOOL_MATERIAL_WOOD).addTags( ItemTags.PLANKS ); - getOrCreateBuilder(TOOL_MATERIAL_STONE).addTags( + tag(TOOL_MATERIAL_STONE).addTags( ItemTags.STONE_TOOL_MATERIALS ); - getOrCreateBuilder(TOOL_MATERIAL_IRON).addTags( + tag(TOOL_MATERIAL_IRON).addTags( Tags.Items.INGOTS_IRON ); - getOrCreateBuilder(TOOL_MATERIAL_GOLD).addTags( + tag(TOOL_MATERIAL_GOLD).addTags( Tags.Items.INGOTS_GOLD ); - getOrCreateBuilder(TOOL_MATERIAL_DIAMOND).addTags( + tag(TOOL_MATERIAL_DIAMOND).addTags( Tags.Items.GEMS_DIAMOND ); - getOrCreateBuilder(TOOL_MATERIAL_NETHERITE).addTags( + tag(TOOL_MATERIAL_NETHERITE).addTags( Tags.Items.INGOTS_NETHERITE ); - getOrCreateBuilder(WRENCHES).add(Items.WRENCH.get()); + tag(WRENCHES).add(Items.WRENCH.get()); - getOrCreateBuilder(DEVICE_NEEDS_REBOOT).add( + tag(DEVICE_NEEDS_REBOOT).add( Items.MEMORY_SMALL.get(), Items.MEMORY_MEDIUM.get(), Items.MEMORY_LARGE.get(), diff --git a/src/main/java/li/cil/oc2/data/ModLootTableProvider.java b/src/main/java/li/cil/oc2/data/ModLootTableProvider.java index f653a765..f5f67842 100644 --- a/src/main/java/li/cil/oc2/data/ModLootTableProvider.java +++ b/src/main/java/li/cil/oc2/data/ModLootTableProvider.java @@ -30,7 +30,7 @@ public final class ModLootTableProvider extends LootTableProvider { @Override protected void validate(final Map map, final ValidationTracker validationtracker) { - map.forEach((location, table) -> LootTableManager.validateLootTable(validationtracker, location, table)); + map.forEach((location, table) -> LootTableManager.validate(validationtracker, location, table)); } @Override @@ -41,13 +41,13 @@ public final class ModLootTableProvider extends LootTableProvider { public static final class ModBlockLootTables extends BlockLootTables { @Override protected void addTables() { - registerDropSelfLootTable(Blocks.REDSTONE_INTERFACE.get()); - registerDropSelfLootTable(Blocks.NETWORK_CONNECTOR.get()); - registerDropSelfLootTable(Blocks.NETWORK_HUB.get()); - registerDropSelfLootTable(Blocks.DISK_DRIVE.get()); - registerDropSelfLootTable(Blocks.CHARGER.get()); + dropSelf(Blocks.REDSTONE_INTERFACE.get()); + dropSelf(Blocks.NETWORK_CONNECTOR.get()); + dropSelf(Blocks.NETWORK_HUB.get()); + dropSelf(Blocks.DISK_DRIVE.get()); + dropSelf(Blocks.CHARGER.get()); - registerLootTable(Blocks.COMPUTER.get(), ModBlockLootTables::droppingWithInventory); + add(Blocks.COMPUTER.get(), ModBlockLootTables::droppingWithInventory); } @Override @@ -59,15 +59,15 @@ public final class ModLootTableProvider extends LootTableProvider { } private static LootTable.Builder droppingWithInventory(final Block block) { - return LootTable.builder() - .addLootPool(withSurvivesExplosion(block, LootPool.builder() - .rolls(ConstantRange.of(1)) - .addEntry(ItemLootEntry.builder(block) - .acceptFunction(CopyNbt.builder(CopyNbt.Source.BLOCK_ENTITY) - .addOperation(ITEMS_TAG_NAME, + return LootTable.lootTable() + .withPool(applyExplosionCondition(block, LootPool.lootPool() + .setRolls(ConstantRange.exactly(1)) + .add(ItemLootEntry.lootTableItem(block) + .apply(CopyNbt.copyData(CopyNbt.Source.BLOCK_ENTITY) + .copy(ITEMS_TAG_NAME, concat(BLOCK_ENTITY_TAG_NAME_IN_ITEM, ITEMS_TAG_NAME), CopyNbt.Action.REPLACE) - .addOperation(ENERGY_TAG_NAME, + .copy(ENERGY_TAG_NAME, concat(BLOCK_ENTITY_TAG_NAME_IN_ITEM, ENERGY_TAG_NAME), CopyNbt.Action.REPLACE) ) diff --git a/src/main/java/li/cil/oc2/data/ModRecipesProvider.java b/src/main/java/li/cil/oc2/data/ModRecipesProvider.java index fcdd9aa2..071e5567 100644 --- a/src/main/java/li/cil/oc2/data/ModRecipesProvider.java +++ b/src/main/java/li/cil/oc2/data/ModRecipesProvider.java @@ -15,319 +15,319 @@ public final class ModRecipesProvider extends RecipeProvider { } @Override - protected void registerRecipes(final Consumer consumer) { + protected void buildShapelessRecipes(final Consumer consumer) { ShapedRecipeBuilder - .shapedRecipe(Items.COMPUTER.get()) - .patternLine("ICI") - .patternLine("XTX") - .patternLine("IBI") - .key('I', Tags.Items.INGOTS_IRON) - .key('C', Tags.Items.CHESTS_WOODEN) - .key('X', Items.BUS_INTERFACE.get()) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_transistor", inventoryChange(Items.TRANSISTOR.get())) - .addCriterion("has_circuit_board", inventoryChange(Items.CIRCUIT_BOARD.get())) - .build(consumer); + .shaped(Items.COMPUTER.get()) + .pattern("ICI") + .pattern("XTX") + .pattern("IBI") + .define('I', Tags.Items.INGOTS_IRON) + .define('C', Tags.Items.CHESTS_WOODEN) + .define('X', Items.BUS_INTERFACE.get()) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_transistor", inventoryChange(Items.TRANSISTOR.get())) + .unlockedBy("has_circuit_board", inventoryChange(Items.CIRCUIT_BOARD.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.BUS_CABLE.get(), 16) - .patternLine("III") - .patternLine("GTG") - .patternLine("III") - .key('I', Tags.Items.INGOTS_IRON) - .key('G', Tags.Items.INGOTS_GOLD) - .key('T', Items.TRANSISTOR.get()) - .addCriterion("has_transistor", inventoryChange(Items.TRANSISTOR.get())) - .build(consumer); + .shaped(Items.BUS_CABLE.get(), 16) + .pattern("III") + .pattern("GTG") + .pattern("III") + .define('I', Tags.Items.INGOTS_IRON) + .define('G', Tags.Items.INGOTS_GOLD) + .define('T', Items.TRANSISTOR.get()) + .unlockedBy("has_transistor", inventoryChange(Items.TRANSISTOR.get())) + .save(consumer); ShapelessRecipeBuilder - .shapelessRecipe(Items.BUS_INTERFACE.get()) - .addIngredient(Items.TRANSISTOR.get()) - .addIngredient(Items.BUS_CABLE.get()) - .addCriterion("has_bus_cable", inventoryChange(Items.BUS_CABLE.get())) - .build(consumer); + .shapeless(Items.BUS_INTERFACE.get()) + .requires(Items.TRANSISTOR.get()) + .requires(Items.BUS_CABLE.get()) + .unlockedBy("has_bus_cable", inventoryChange(Items.BUS_CABLE.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.NETWORK_CONNECTOR.get(), 4) - .patternLine("IGI") - .patternLine("ITI") - .key('I', Tags.Items.INGOTS_IRON) - .key('G', Tags.Items.GLASS) - .key('T', Items.TRANSISTOR.get()) - .addCriterion("has_transistor", inventoryChange(Items.TRANSISTOR.get())) - .build(consumer); + .shaped(Items.NETWORK_CONNECTOR.get(), 4) + .pattern("IGI") + .pattern("ITI") + .define('I', Tags.Items.INGOTS_IRON) + .define('G', Tags.Items.GLASS) + .define('T', Items.TRANSISTOR.get()) + .unlockedBy("has_transistor", inventoryChange(Items.TRANSISTOR.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.NETWORK_HUB.get()) - .patternLine("ICI") - .patternLine("XTX") - .patternLine("ICI") - .key('I', Tags.Items.INGOTS_IRON) - .key('C', Items.NETWORK_CONNECTOR.get()) - .key('X', Items.BUS_INTERFACE.get()) - .key('T', Items.TRANSISTOR.get()) - .addCriterion("has_network_connector", inventoryChange(Items.NETWORK_CONNECTOR.get())) - .build(consumer); + .shaped(Items.NETWORK_HUB.get()) + .pattern("ICI") + .pattern("XTX") + .pattern("ICI") + .define('I', Tags.Items.INGOTS_IRON) + .define('C', Items.NETWORK_CONNECTOR.get()) + .define('X', Items.BUS_INTERFACE.get()) + .define('T', Items.TRANSISTOR.get()) + .unlockedBy("has_network_connector", inventoryChange(Items.NETWORK_CONNECTOR.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.REDSTONE_INTERFACE.get()) - .patternLine("IRI") - .patternLine("XTX") - .patternLine("IRI") - .key('I', Tags.Items.INGOTS_IRON) - .key('R', Tags.Items.DUSTS_REDSTONE) - .key('T', Items.TRANSISTOR.get()) - .key('X', Items.BUS_INTERFACE.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .build(consumer); + .shaped(Items.REDSTONE_INTERFACE.get()) + .pattern("IRI") + .pattern("XTX") + .pattern("IRI") + .define('I', Tags.Items.INGOTS_IRON) + .define('R', Tags.Items.DUSTS_REDSTONE) + .define('T', Items.TRANSISTOR.get()) + .define('X', Items.BUS_INTERFACE.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.DISK_DRIVE.get()) - .patternLine("IBI") - .patternLine("XTX") - .patternLine("IDI") - .key('I', Tags.Items.INGOTS_IRON) - .key('B', ItemTags.BUTTONS) - .key('T', Items.TRANSISTOR.get()) - .key('X', Items.BUS_INTERFACE.get()) - .key('D', net.minecraft.item.Items.DISPENSER) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .build(consumer); + .shaped(Items.DISK_DRIVE.get()) + .pattern("IBI") + .pattern("XTX") + .pattern("IDI") + .define('I', Tags.Items.INGOTS_IRON) + .define('B', ItemTags.BUTTONS) + .define('T', Items.TRANSISTOR.get()) + .define('X', Items.BUS_INTERFACE.get()) + .define('D', net.minecraft.item.Items.DISPENSER) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.CHARGER.get()) - .patternLine("IPI") - .patternLine("XTX") - .patternLine("IRI") - .key('I', Tags.Items.INGOTS_IRON) - .key('P', net.minecraft.item.Items.LIGHT_WEIGHTED_PRESSURE_PLATE) - .key('T', Items.TRANSISTOR.get()) - .key('X', Items.BUS_INTERFACE.get()) - .key('R', Tags.Items.STORAGE_BLOCKS_REDSTONE) - .addCriterion("has_transistor", inventoryChange(Items.TRANSISTOR.get())) - .build(consumer); + .shaped(Items.CHARGER.get()) + .pattern("IPI") + .pattern("XTX") + .pattern("IRI") + .define('I', Tags.Items.INGOTS_IRON) + .define('P', net.minecraft.item.Items.LIGHT_WEIGHTED_PRESSURE_PLATE) + .define('T', Items.TRANSISTOR.get()) + .define('X', Items.BUS_INTERFACE.get()) + .define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE) + .unlockedBy("has_transistor", inventoryChange(Items.TRANSISTOR.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.WRENCH.get()) - .patternLine("I I") - .patternLine(" T ") - .patternLine(" I ") - .key('I', Tags.Items.INGOTS_IRON) - .key('T', Items.TRANSISTOR.get()) - .addCriterion("has_transistor", inventoryChange(Items.TRANSISTOR.get())) - .build(consumer); + .shaped(Items.WRENCH.get()) + .pattern("I I") + .pattern(" T ") + .pattern(" I ") + .define('I', Tags.Items.INGOTS_IRON) + .define('T', Items.TRANSISTOR.get()) + .unlockedBy("has_transistor", inventoryChange(Items.TRANSISTOR.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.NETWORK_CABLE.get(), 8) - .patternLine("SSS") - .patternLine("GTG") - .patternLine("SSS") - .key('S', Tags.Items.STRING) - .key('G', Tags.Items.GLASS) - .key('T', Items.TRANSISTOR.get()) - .addCriterion("has_network_connector", inventoryChange(Items.NETWORK_CONNECTOR.get())) - .build(consumer); + .shaped(Items.NETWORK_CABLE.get(), 8) + .pattern("SSS") + .pattern("GTG") + .pattern("SSS") + .define('S', Tags.Items.STRING) + .define('G', Tags.Items.GLASS) + .define('T', Items.TRANSISTOR.get()) + .unlockedBy("has_network_connector", inventoryChange(Items.NETWORK_CONNECTOR.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.ROBOT.get()) - .patternLine("ICI") - .patternLine("PTP") - .patternLine("IBI") - .key('I', Tags.Items.INGOTS_IRON) - .key('C', Tags.Items.CHESTS_WOODEN) - .key('P', net.minecraft.item.Items.PISTON) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_transistor", inventoryChange(Items.TRANSISTOR.get())) - .addCriterion("has_circuit_board", inventoryChange(Items.CIRCUIT_BOARD.get())) - .build(consumer); + .shaped(Items.ROBOT.get()) + .pattern("ICI") + .pattern("PTP") + .pattern("IBI") + .define('I', Tags.Items.INGOTS_IRON) + .define('C', Tags.Items.CHESTS_WOODEN) + .define('P', net.minecraft.item.Items.PISTON) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_transistor", inventoryChange(Items.TRANSISTOR.get())) + .unlockedBy("has_circuit_board", inventoryChange(Items.CIRCUIT_BOARD.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.MEMORY_SMALL.get(), 2) - .patternLine("ITI") - .patternLine(" B ") - .key('I', Tags.Items.INGOTS_IRON) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .shaped(Items.MEMORY_SMALL.get(), 2) + .pattern("ITI") + .pattern(" B ") + .define('I', Tags.Items.INGOTS_IRON) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.MEMORY_MEDIUM.get(), 2) - .patternLine("GTG") - .patternLine(" B ") - .key('G', Tags.Items.INGOTS_GOLD) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .shaped(Items.MEMORY_MEDIUM.get(), 2) + .pattern("GTG") + .pattern(" B ") + .define('G', Tags.Items.INGOTS_GOLD) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.MEMORY_LARGE.get(), 2) - .patternLine("DTD") - .patternLine(" B ") - .key('D', Tags.Items.GEMS_DIAMOND) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .shaped(Items.MEMORY_LARGE.get(), 2) + .pattern("DTD") + .pattern(" B ") + .define('D', Tags.Items.GEMS_DIAMOND) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.HARD_DRIVE_SMALL.get()) - .patternLine("ITI") - .patternLine("EBE") - .key('I', Tags.Items.INGOTS_IRON) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .key('E', Tags.Items.GEMS_EMERALD) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .shaped(Items.HARD_DRIVE_SMALL.get()) + .pattern("ITI") + .pattern("EBE") + .define('I', Tags.Items.INGOTS_IRON) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .define('E', Tags.Items.GEMS_EMERALD) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.HARD_DRIVE_MEDIUM.get()) - .patternLine("GTG") - .patternLine("EBE") - .key('G', Tags.Items.INGOTS_GOLD) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .key('E', Tags.Items.GEMS_EMERALD) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .shaped(Items.HARD_DRIVE_MEDIUM.get()) + .pattern("GTG") + .pattern("EBE") + .define('G', Tags.Items.INGOTS_GOLD) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .define('E', Tags.Items.GEMS_EMERALD) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.HARD_DRIVE_LARGE.get()) - .patternLine("DTD") - .patternLine("EBE") - .key('D', Tags.Items.GEMS_DIAMOND) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .key('E', Tags.Items.GEMS_EMERALD) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .shaped(Items.HARD_DRIVE_LARGE.get()) + .pattern("DTD") + .pattern("EBE") + .define('D', Tags.Items.GEMS_DIAMOND) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .define('E', Tags.Items.GEMS_EMERALD) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); WrenchRecipeBuilder .wrenchRecipe(Items.HARD_DRIVE_CUSTOM.get()) - .addIngredient(Items.HARD_DRIVE_LARGE.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .requires(Items.HARD_DRIVE_LARGE.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.FLASH_MEMORY.get()) - .patternLine("ITI") - .patternLine("RBR") - .key('I', Tags.Items.INGOTS_IRON) - .key('T', Items.TRANSISTOR.get()) - .key('R', Tags.Items.DUSTS_REDSTONE) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .shaped(Items.FLASH_MEMORY.get()) + .pattern("ITI") + .pattern("RBR") + .define('I', Tags.Items.INGOTS_IRON) + .define('T', Items.TRANSISTOR.get()) + .define('R', Tags.Items.DUSTS_REDSTONE) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); WrenchRecipeBuilder .wrenchRecipe(Items.FLASH_MEMORY_CUSTOM.get()) - .addIngredient(Items.FLASH_MEMORY.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .requires(Items.FLASH_MEMORY.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.REDSTONE_INTERFACE_CARD.get()) - .patternLine("IRT") - .patternLine(" B ") - .key('R', net.minecraft.item.Items.REDSTONE_TORCH) - .key('I', Tags.Items.INGOTS_IRON) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .build(consumer); + .shaped(Items.REDSTONE_INTERFACE_CARD.get()) + .pattern("IRT") + .pattern(" B ") + .define('R', net.minecraft.item.Items.REDSTONE_TORCH) + .define('I', Tags.Items.INGOTS_IRON) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.NETWORK_INTERFACE_CARD.get()) - .patternLine("IGT") - .patternLine(" B ") - .key('G', Tags.Items.GLASS) - .key('I', Tags.Items.INGOTS_IRON) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .build(consumer); + .shaped(Items.NETWORK_INTERFACE_CARD.get()) + .pattern("IGT") + .pattern(" B ") + .define('G', Tags.Items.GLASS) + .define('I', Tags.Items.INGOTS_IRON) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.FILE_IMPORT_EXPORT_CARD.get()) - .patternLine("IET") - .patternLine(" B ") - .key('E', net.minecraft.item.Items.PAPER) - .key('I', Tags.Items.INGOTS_IRON) - .key('T', Items.TRANSISTOR.get()) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_computer", inventoryChange(Items.COMPUTER.get())) - .build(consumer); + .shaped(Items.FILE_IMPORT_EXPORT_CARD.get()) + .pattern("IET") + .pattern(" B ") + .define('E', net.minecraft.item.Items.PAPER) + .define('I', Tags.Items.INGOTS_IRON) + .define('T', Items.TRANSISTOR.get()) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_computer", inventoryChange(Items.COMPUTER.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.FLOPPY.get()) - .patternLine("ITI") - .patternLine("QBQ") - .key('I', Tags.Items.INGOTS_IRON) - .key('T', Items.TRANSISTOR.get()) - .key('Q', Tags.Items.GEMS_QUARTZ) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_disk_drive", inventoryChange(Items.DISK_DRIVE.get())) - .build(consumer); + .shaped(Items.FLOPPY.get()) + .pattern("ITI") + .pattern("QBQ") + .define('I', Tags.Items.INGOTS_IRON) + .define('T', Items.TRANSISTOR.get()) + .define('Q', Tags.Items.GEMS_QUARTZ) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_disk_drive", inventoryChange(Items.DISK_DRIVE.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.INVENTORY_OPERATIONS_MODULE.get()) - .patternLine("TCG") - .patternLine(" B ") - .key('T', Items.TRANSISTOR.get()) - .key('C', Tags.Items.CHESTS_WOODEN) - .key('G', Tags.Items.INGOTS_GOLD) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .shaped(Items.INVENTORY_OPERATIONS_MODULE.get()) + .pattern("TCG") + .pattern(" B ") + .define('T', Items.TRANSISTOR.get()) + .define('C', Tags.Items.CHESTS_WOODEN) + .define('G', Tags.Items.INGOTS_GOLD) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.BLOCK_OPERATIONS_MODULE.get()) - .patternLine("TPG") - .patternLine(" B ") - .key('T', Items.TRANSISTOR.get()) - .key('P', net.minecraft.item.Items.DIAMOND_PICKAXE) - .key('G', Tags.Items.INGOTS_GOLD) - .key('B', Items.CIRCUIT_BOARD.get()) - .addCriterion("has_robot", inventoryChange(Items.ROBOT.get())) - .build(consumer); + .shaped(Items.BLOCK_OPERATIONS_MODULE.get()) + .pattern("TPG") + .pattern(" B ") + .define('T', Items.TRANSISTOR.get()) + .define('P', net.minecraft.item.Items.DIAMOND_PICKAXE) + .define('G', Tags.Items.INGOTS_GOLD) + .define('B', Items.CIRCUIT_BOARD.get()) + .unlockedBy("has_robot", inventoryChange(Items.ROBOT.get())) + .save(consumer); ShapedRecipeBuilder - .shapedRecipe(Items.TRANSISTOR.get(), 8) - .patternLine("RCR") - .patternLine("III") - .key('I', Tags.Items.INGOTS_IRON) - .key('R', Tags.Items.DUSTS_REDSTONE) - .key('C', net.minecraft.item.Items.COMPARATOR) - .addCriterion("has_gold", inventoryChange(net.minecraft.item.Items.GOLD_INGOT)) - .build(consumer); + .shaped(Items.TRANSISTOR.get(), 8) + .pattern("RCR") + .pattern("III") + .define('I', Tags.Items.INGOTS_IRON) + .define('R', Tags.Items.DUSTS_REDSTONE) + .define('C', net.minecraft.item.Items.COMPARATOR) + .unlockedBy("has_gold", inventoryChange(net.minecraft.item.Items.GOLD_INGOT)) + .save(consumer); ShapelessRecipeBuilder - .shapelessRecipe(Items.CIRCUIT_BOARD.get(), 4) - .addIngredient(Tags.Items.INGOTS_GOLD) - .addIngredient(net.minecraft.item.Items.CLAY_BALL) - .addIngredient(Items.TRANSISTOR.get()) - .addCriterion("has_transistor", inventoryChange(Items.TRANSISTOR.get())) - .build(consumer); + .shapeless(Items.CIRCUIT_BOARD.get(), 4) + .requires(Tags.Items.INGOTS_GOLD) + .requires(net.minecraft.item.Items.CLAY_BALL) + .requires(Items.TRANSISTOR.get()) + .unlockedBy("has_transistor", inventoryChange(Items.TRANSISTOR.get())) + .save(consumer); } private static InventoryChangeTrigger.Instance inventoryChange(final IItemProvider item) { - return InventoryChangeTrigger.Instance.forItems(item); + return InventoryChangeTrigger.Instance.hasItems(item); } } diff --git a/src/main/java/li/cil/oc2/data/WrenchRecipeBuilder.java b/src/main/java/li/cil/oc2/data/WrenchRecipeBuilder.java index 3f9b7ce0..dd3fc9e5 100644 --- a/src/main/java/li/cil/oc2/data/WrenchRecipeBuilder.java +++ b/src/main/java/li/cil/oc2/data/WrenchRecipeBuilder.java @@ -27,14 +27,14 @@ public final class WrenchRecipeBuilder { private final Item result; private final int count; private final List ingredients = Lists.newArrayList(); - private final Advancement.Builder advancementBuilder = Advancement.Builder.builder(); + private final Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); private String group; public WrenchRecipeBuilder(final IItemProvider result, final int count) { this.result = result.asItem(); this.count = count; - addIngredient(Items.WRENCH.get()); + requires(Items.WRENCH.get()); } public static WrenchRecipeBuilder wrenchRecipe(final IItemProvider resultIn) { @@ -45,23 +45,23 @@ public final class WrenchRecipeBuilder { return new WrenchRecipeBuilder(resultIn, countIn); } - public WrenchRecipeBuilder addIngredient(final ITag tagIn) { - return this.addIngredient(Ingredient.fromTag(tagIn)); + public WrenchRecipeBuilder requires(final ITag tagIn) { + return this.requires(Ingredient.of(tagIn)); } - public WrenchRecipeBuilder addIngredient(final IItemProvider itemIn) { - return this.addIngredient(itemIn, 1); + public WrenchRecipeBuilder requires(final IItemProvider itemIn) { + return this.requires(itemIn, 1); } - public WrenchRecipeBuilder addIngredient(final IItemProvider itemIn, final int quantity) { + public WrenchRecipeBuilder requires(final IItemProvider itemIn, final int quantity) { for (int i = 0; i < quantity; ++i) { - this.addIngredient(Ingredient.fromItems(itemIn)); + this.requires(Ingredient.of(itemIn)); } return this; } - public WrenchRecipeBuilder addIngredient(final Ingredient ingredientIn) { + public WrenchRecipeBuilder requires(final Ingredient ingredientIn) { return this.addIngredient(ingredientIn, 1); } @@ -73,8 +73,8 @@ public final class WrenchRecipeBuilder { return this; } - public WrenchRecipeBuilder addCriterion(final String name, final ICriterionInstance criterionIn) { - this.advancementBuilder.withCriterion(name, criterionIn); + public WrenchRecipeBuilder unlockedBy(final String name, final ICriterionInstance criterionIn) { + this.advancementBuilder.addCriterion(name, criterionIn); return this; } @@ -83,23 +83,23 @@ public final class WrenchRecipeBuilder { return this; } - public void build(final Consumer consumerIn) { - this.build(consumerIn, ForgeRegistries.ITEMS.getKey(this.result)); + public void save(final Consumer consumerIn) { + this.save(consumerIn, ForgeRegistries.ITEMS.getKey(this.result)); } - public void build(final Consumer consumerIn, final String save) { + public void save(final Consumer consumerIn, final String save) { final ResourceLocation resourcelocation = ForgeRegistries.ITEMS.getKey(this.result); if ((new ResourceLocation(save)).equals(resourcelocation)) { throw new IllegalStateException("Shapeless Recipe " + save + " should remove its 'save' argument"); } else { - this.build(consumerIn, new ResourceLocation(save)); + this.save(consumerIn, new ResourceLocation(save)); } } - public void build(final Consumer consumerIn, final ResourceLocation id) { + public void save(final Consumer consumerIn, final ResourceLocation id) { this.validate(id); - this.advancementBuilder.withParentId(new ResourceLocation("recipes/root")).withCriterion("has_the_recipe", RecipeUnlockedTrigger.create(id)).withRewards(AdvancementRewards.Builder.recipe(id)).withRequirementsStrategy(IRequirementsStrategy.OR); - consumerIn.accept(new WrenchRecipeBuilder.Result(id, this.result, this.count, this.group == null ? "" : this.group, this.ingredients, this.advancementBuilder, new ResourceLocation(id.getNamespace(), "recipes/" + this.result.getGroup().getPath() + "/" + id.getPath()))); + this.advancementBuilder.parent(new ResourceLocation("recipes/root")).addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(id)).rewards(AdvancementRewards.Builder.recipe(id)).requirements(IRequirementsStrategy.OR); + consumerIn.accept(new WrenchRecipeBuilder.Result(id, this.result, this.count, this.group == null ? "" : this.group, this.ingredients, this.advancementBuilder, new ResourceLocation(id.getNamespace(), "recipes/" + this.result.getItemCategory().getRecipeFolderName() + "/" + id.getPath()))); } private void validate(final ResourceLocation id) { @@ -127,7 +127,7 @@ public final class WrenchRecipeBuilder { this.advancementId = advancementIdIn; } - public void serialize(final JsonObject json) { + public void serializeRecipeData(final JsonObject json) { if (!this.group.isEmpty()) { json.addProperty("group", this.group); } @@ -135,7 +135,7 @@ public final class WrenchRecipeBuilder { final JsonArray jsonarray = new JsonArray(); for (final Ingredient ingredient : this.ingredients) { - jsonarray.add(ingredient.serialize()); + jsonarray.add(ingredient.toJson()); } json.add("ingredients", jsonarray); @@ -148,21 +148,21 @@ public final class WrenchRecipeBuilder { json.add("result", jsonobject); } - public IRecipeSerializer getSerializer() { + public IRecipeSerializer getType() { return RecipeSerializers.WRENCH.get(); } - public ResourceLocation getID() { + public ResourceLocation getId() { return this.id; } @Nullable - public JsonObject getAdvancementJson() { - return this.advancementBuilder.serialize(); + public JsonObject serializeAdvancement() { + return this.advancementBuilder.serializeToJson(); } @Nullable - public ResourceLocation getAdvancementID() { + public ResourceLocation getAdvancementId() { return this.advancementId; } } From 51a92d81f4f35b299eb4c71bf619421ff7ba329b Mon Sep 17 00:00:00 2001 From: lucsoft Date: Sat, 29 May 2021 19:16:05 +0200 Subject: [PATCH 04/19] Migrated Client --- .../java/li/cil/oc2/client/ClientSetup.java | 10 +-- .../oc2/client/audio/LoopingSoundManager.java | 6 +- .../client/audio/LoopingTileEntitySound.java | 10 +-- .../client/gui/AbstractTerminalWidget.java | 20 ++--- .../oc2/client/gui/BusInterfaceScreen.java | 32 +++---- .../client/gui/ComputerInventoryScreen.java | 14 ++-- .../client/gui/ComputerTerminalScreen.java | 24 +++--- .../cil/oc2/client/gui/FileChooserScreen.java | 52 ++++++------ .../oc2/client/gui/RobotContainerScreen.java | 18 ++-- .../oc2/client/gui/RobotTerminalScreen.java | 30 +++---- .../li/cil/oc2/client/gui/util/GuiUtils.java | 18 ++-- .../oc2/client/gui/widget/ImageButton.java | 4 +- .../li/cil/oc2/client/gui/widget/Sprite.java | 4 +- .../client/gui/widget/ToggleImageButton.java | 4 +- .../item/CustomItemModelProperties.java | 10 +-- .../oc2/client/model/BusCableBakedModel.java | 31 +++---- .../cil/oc2/client/model/BusCableModel.java | 4 +- .../renderer/BusInterfaceNameRenderer.java | 46 +++++----- .../oc2/client/renderer/CustomRenderType.java | 28 +++---- .../client/renderer/NetworkCableRenderer.java | 72 ++++++++-------- .../renderer/entity/RobotEntityRenderer.java | 20 ++--- .../renderer/entity/model/RobotModel.java | 22 ++--- .../tileentity/ChargerTileEntityRenderer.java | 34 ++++---- .../ComputerTileEntityRenderer.java | 84 +++++++++---------- .../DiskDriveTileEntityRenderer.java | 14 ++-- .../NetworkConnectorTileEntityRenderer.java | 10 +-- .../tileentity/RobotItemStackRenderer.java | 10 +-- 27 files changed, 312 insertions(+), 319 deletions(-) diff --git a/src/main/java/li/cil/oc2/client/ClientSetup.java b/src/main/java/li/cil/oc2/client/ClientSetup.java index f77d519f..81df8ec4 100644 --- a/src/main/java/li/cil/oc2/client/ClientSetup.java +++ b/src/main/java/li/cil/oc2/client/ClientSetup.java @@ -38,10 +38,10 @@ public final class ClientSetup { CustomItemModelProperties.initialize(); CustomItemColors.initialize(); - ScreenManager.registerFactory(Containers.COMPUTER_CONTAINER.get(), ComputerInventoryScreen::new); - ScreenManager.registerFactory(Containers.COMPUTER_TERMINAL_CONTAINER.get(), ComputerTerminalScreen::new); - ScreenManager.registerFactory(Containers.ROBOT_CONTAINER.get(), RobotContainerScreen::new); - ScreenManager.registerFactory(Containers.ROBOT_TERMINAL_CONTAINER.get(), RobotTerminalScreen::new); + ScreenManager.register(Containers.COMPUTER_CONTAINER.get(), ComputerInventoryScreen::new); + ScreenManager.register(Containers.COMPUTER_TERMINAL_CONTAINER.get(), ComputerTerminalScreen::new); + ScreenManager.register(Containers.ROBOT_CONTAINER.get(), RobotContainerScreen::new); + ScreenManager.register(Containers.ROBOT_TERMINAL_CONTAINER.get(), RobotTerminalScreen::new); ClientRegistry.bindTileEntityRenderer(TileEntities.COMPUTER_TILE_ENTITY.get(), ComputerTileEntityRenderer::new); ClientRegistry.bindTileEntityRenderer(TileEntities.NETWORK_CONNECTOR_TILE_ENTITY.get(), NetworkConnectorTileEntityRenderer::new); @@ -58,7 +58,7 @@ public final class ClientSetup { @SubscribeEvent public static void handleTextureStitchEvent(final TextureStitchEvent.Pre event) { - if (event.getMap().getTextureLocation() != PlayerContainer.LOCATION_BLOCKS_TEXTURE) { + if (event.getMap().location() != PlayerContainer.BLOCK_ATLAS) { return; } diff --git a/src/main/java/li/cil/oc2/client/audio/LoopingSoundManager.java b/src/main/java/li/cil/oc2/client/audio/LoopingSoundManager.java index fa60809c..20b6e052 100644 --- a/src/main/java/li/cil/oc2/client/audio/LoopingSoundManager.java +++ b/src/main/java/li/cil/oc2/client/audio/LoopingSoundManager.java @@ -17,18 +17,18 @@ public final class LoopingSoundManager { final LoopingTileEntitySound instance = new LoopingTileEntitySound(tileEntity, sound); TILE_ENTITY_SOUNDS.put(tileEntity, instance); - Minecraft.getInstance().getSoundHandler().playDelayed(instance, delay); + Minecraft.getInstance().getSoundManager().playDelayed(instance, delay); } public static void stop(final TileEntity tileEntity) { final ITickableSound instance = TILE_ENTITY_SOUNDS.remove(tileEntity); if (instance != null) { - Minecraft.getInstance().getSoundHandler().stop(instance); + Minecraft.getInstance().getSoundManager().stop(instance); } } public static boolean isPlaying(final TileEntity tileEntity) { final ITickableSound instance = TILE_ENTITY_SOUNDS.get(tileEntity); - return instance != null && !instance.isDonePlaying(); + return instance != null && !instance.isStopped(); } } diff --git a/src/main/java/li/cil/oc2/client/audio/LoopingTileEntitySound.java b/src/main/java/li/cil/oc2/client/audio/LoopingTileEntitySound.java index 0e75c4c0..05e25eee 100644 --- a/src/main/java/li/cil/oc2/client/audio/LoopingTileEntitySound.java +++ b/src/main/java/li/cil/oc2/client/audio/LoopingTileEntitySound.java @@ -23,12 +23,12 @@ public final class LoopingTileEntitySound extends TickableSound { this.tileEntity = tileEntity; this.volume = 0; - final Vector3d position = Vector3d.copyCentered(tileEntity.getPos()); + final Vector3d position = Vector3d.atCenterOf(tileEntity.getBlockPos()); x = position.x; y = position.y; z = position.z; - repeat = true; + looping = true; } /////////////////////////////////////////////////////////////////// @@ -36,9 +36,9 @@ public final class LoopingTileEntitySound extends TickableSound { @Override public void tick() { volume = MathHelper.clamp(volume + FADE_IN_DURATION / Constants.TICK_SECONDS, 0, 1); - final ChunkPos chunkPos = new ChunkPos(tileEntity.getPos()); - if (tileEntity.isRemoved() || !tileEntity.getWorld().chunkExists(chunkPos.x, chunkPos.z)) { - finishPlaying(); + final ChunkPos chunkPos = new ChunkPos(tileEntity.getBlockPos()); + if (tileEntity.isRemoved() || !tileEntity.getLevel().hasChunk(chunkPos.x, chunkPos.z)) { + stop(); } } } diff --git a/src/main/java/li/cil/oc2/client/gui/AbstractTerminalWidget.java b/src/main/java/li/cil/oc2/client/gui/AbstractTerminalWidget.java index 51989436..90ad1afc 100644 --- a/src/main/java/li/cil/oc2/client/gui/AbstractTerminalWidget.java +++ b/src/main/java/li/cil/oc2/client/gui/AbstractTerminalWidget.java @@ -93,7 +93,7 @@ public abstract class AbstractTerminalWidget extends AbstractGui { isMouseOverTerminal = isMouseOverTerminal(mouseX, mouseY); RenderSystem.color4f(1f, 1f, 1f, 1f); - getClient().getTextureManager().bindTexture(BACKGROUND_LOCATION); + getClient().getTextureManager().bind(BACKGROUND_LOCATION); CONTROLS_BACKGROUND.draw(matrixStack, windowLeft - CONTROLS_BACKGROUND.width, windowTop + CONTROLS_TOP); @@ -114,16 +114,16 @@ public abstract class AbstractTerminalWidget extends AbstractGui { public void render(final MatrixStack matrixStack, final int mouseX, final int mouseY, @Nullable final ITextComponent error) { if (isRunning()) { final MatrixStack stack = new MatrixStack(); - stack.translate(windowLeft + TERMINAL_X, windowTop + TERMINAL_Y, getClient().getItemRenderer().zLevel); + stack.translate(windowLeft + TERMINAL_X, windowTop + TERMINAL_Y, getClient().getItemRenderer().blitOffset); stack.scale(TERMINAL_WIDTH / (float) terminal.getWidth(), TERMINAL_HEIGHT / (float) terminal.getHeight(), 1f); terminal.render(stack); } else { - final FontRenderer font = getClient().fontRenderer; + final FontRenderer font = getClient().font; if (error != null) { - final int textWidth = font.getStringPropertyWidth(error); + final int textWidth = font.width(error); final int textOffsetX = (TERMINAL_WIDTH - textWidth) / 2; - final int textOffsetY = (TERMINAL_HEIGHT - font.FONT_HEIGHT) / 2; - font.func_243246_a(matrixStack, + final int textOffsetY = (TERMINAL_HEIGHT - font.lineHeight) / 2; + font.drawShadow(matrixStack, error, windowLeft + TERMINAL_X + textOffsetX, windowTop + TERMINAL_Y + textOffsetY, @@ -139,7 +139,7 @@ public abstract class AbstractTerminalWidget extends AbstractGui { new TranslationTextComponent(Constants.TOOLTIP_ENERGY, withColor(currentEnergy + "/" + maxEnergy, TextFormatting.GREEN)), new TranslationTextComponent(Constants.TOOLTIP_ENERGY_CONSUMPTION, withColor(String.valueOf(energyConsumption), TextFormatting.GREEN)) ); - GuiUtils.drawHoveringText(matrixStack, tooltip, mouseX, mouseY, parent.width, parent.height, 200, getClient().fontRenderer); + GuiUtils.drawHoveringText(matrixStack, tooltip, mouseX, mouseY, parent.width, parent.height, 200, getClient().font); } } } @@ -162,7 +162,7 @@ public abstract class AbstractTerminalWidget extends AbstractGui { } if ((modifiers & GLFW.GLFW_MOD_CONTROL) != 0 && keyCode == GLFW.GLFW_KEY_V) { - final String value = getClient().keyboardListener.getClipboardString(); + final String value = getClient().keyboardHandler.getClipboard(); for (final char ch : value.toCharArray()) { terminal.putInput((byte) ch); } @@ -182,7 +182,7 @@ public abstract class AbstractTerminalWidget extends AbstractGui { this.windowLeft = (parent.width - WIDTH) / 2; this.windowTop = (parent.height - HEIGHT) / 2; - getClient().keyboardListener.enableRepeatEvents(true); + getClient().keyboardHandler.setSendRepeatsToGui(true); addButton(new ToggleImageButton( parent, windowLeft - CONTROLS_BACKGROUND.width + 4, windowTop + CONTROLS_TOP + 4, @@ -228,7 +228,7 @@ public abstract class AbstractTerminalWidget extends AbstractGui { } public void onClose() { - getClient().keyboardListener.enableRepeatEvents(false); + getClient().keyboardHandler.setSendRepeatsToGui(false); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/client/gui/BusInterfaceScreen.java b/src/main/java/li/cil/oc2/client/gui/BusInterfaceScreen.java index b25bc8f0..c949ca50 100644 --- a/src/main/java/li/cil/oc2/client/gui/BusInterfaceScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/BusInterfaceScreen.java @@ -44,7 +44,7 @@ public final class BusInterfaceScreen extends Screen { /////////////////////////////////////////////////////////////////// public BusInterfaceScreen(final BusCableTileEntity tileEntity, final Direction side) { - super(Items.BUS_INTERFACE.get().getName()); + super(Items.BUS_INTERFACE.get().getDescription()); this.tileEntity = tileEntity; this.side = side; } @@ -55,7 +55,7 @@ public final class BusInterfaceScreen extends Screen { protected void init() { super.init(); - getMinecraft().keyboardListener.enableRepeatEvents(true); + getMinecraft().keyboardHandler.setSendRepeatsToGui(true); left = (width - BACKGROUND.width) / 2; top = (height - BACKGROUND.height) / 2; @@ -63,11 +63,11 @@ public final class BusInterfaceScreen extends Screen { nameField = new TextFieldWidget(font, left + TEXT_LEFT, top + TEXT_TOP, 192, 12, new TranslationTextComponent("oc2.gui.bus_interface_name")); nameField.setCanLoseFocus(false); nameField.setTextColor(0xFFFFFFFF); - nameField.setEnableBackgroundDrawing(false); - nameField.setMaxStringLength(32); - nameField.setText(tileEntity.getInterfaceName(side)); - addListener(nameField); - setFocusedDefault(nameField); + nameField.setBordered(false); + nameField.setMaxLength(32); + nameField.setValue(tileEntity.getInterfaceName(side)); + addWidget(nameField); + setFocused(nameField); addButton(new ImageButton( this, @@ -81,8 +81,8 @@ public final class BusInterfaceScreen extends Screen { @Override public void onPress() { super.onPress(); - setInterfaceName(nameField.getText()); - closeScreen(); + setInterfaceName(nameField.getValue()); + onClose(); } }); addButton(new ImageButton( @@ -97,7 +97,7 @@ public final class BusInterfaceScreen extends Screen { @Override public void onPress() { super.onPress(); - closeScreen(); + onClose(); } }); } @@ -106,7 +106,7 @@ public final class BusInterfaceScreen extends Screen { public void onClose() { super.onClose(); - getMinecraft().keyboardListener.enableRepeatEvents(false); + getMinecraft().keyboardHandler.setSendRepeatsToGui(false); } @Override @@ -114,9 +114,9 @@ public final class BusInterfaceScreen extends Screen { super.tick(); nameField.tick(); - final Vector3d busCableCenter = Vector3d.copyCentered(tileEntity.getPos()); - if (getMinecraft().player.getDistanceSq(busCableCenter) > 8 * 8) { - closeScreen(); + final Vector3d busCableCenter = Vector3d.atCenterOf(tileEntity.getBlockPos()); + if (getMinecraft().player.distanceToSqr(busCableCenter) > 8 * 8) { + onClose(); } } @@ -124,8 +124,8 @@ public final class BusInterfaceScreen extends Screen { public boolean keyPressed(final int keyCode, final int scanCode, final int modifiers) { if (keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER) { - setInterfaceName(nameField.getText()); - closeScreen(); + setInterfaceName(nameField.getValue()); + onClose(); return true; } diff --git a/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java b/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java index 25a98fd3..4c0278be 100644 --- a/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java @@ -22,9 +22,9 @@ public final class ComputerInventoryScreen extends ContainerScreen minecraft.displayGuiScreen(previousScreen)); + minecraft.tell(() -> minecraft.setScreen(previousScreen)); } } @@ -133,12 +133,12 @@ public class FileChooserScreen extends Screen { @Override protected void init() { super.init(); - minecraft.keyboardListener.enableRepeatEvents(true); + minecraft.keyboardHandler.setSendRepeatsToGui(true); final int widgetsWidth = width - MARGIN * 2; final int listHeight = height - MARGIN - WIDGET_SPACING - TEXT_FIELD_HEIGHT - WIDGET_SPACING - BUTTON_HEIGHT - MARGIN; fileList = new FileList(MARGIN, listHeight, LIST_ENTRY_HEIGHT); - addListener(fileList); + addWidget(fileList); final int fileNameTop = MARGIN + listHeight + WIDGET_SPACING; fileNameTextField = new TextFieldWidget(font, MARGIN, fileNameTop, widgetsWidth, TEXT_FIELD_HEIGHT, FILE_NAME_TEXT); @@ -146,8 +146,8 @@ public class FileChooserScreen extends Screen { fileList.setSelected(null); updateButtons(); }); - fileNameTextField.setMaxStringLength(1024); - addListener(fileNameTextField); + fileNameTextField.setMaxLength(1024); + addWidget(fileNameTextField); final int buttonTop = fileNameTop + TEXT_FIELD_HEIGHT + WIDGET_SPACING; final int buttonCount = 2; @@ -172,7 +172,7 @@ public class FileChooserScreen extends Screen { return selected.file == null || selected.file.equals(directory.getParent()); } - final String selectedFileEntry = fileNameTextField.getText(); + final String selectedFileEntry = fileNameTextField.getValue(); return "..".equals(selectedFileEntry); } @@ -187,7 +187,7 @@ public class FileChooserScreen extends Screen { return Optional.empty(); } - final String selectedFileEntry = fileNameTextField.getText(); + final String selectedFileEntry = fileNameTextField.getValue(); if (selectedFileEntry == null || "".equals(selectedFileEntry) || ".".equals(selectedFileEntry)) { return Optional.empty(); } @@ -202,24 +202,24 @@ public class FileChooserScreen extends Screen { private void confirm() { if (isParentPath()) { fileList.refreshFiles(getPath().orElse(null)); - fileNameTextField.setText(""); + fileNameTextField.setValue(""); return; } getPath().ifPresent(path -> { if (path == null || Files.isDirectory(path)) { fileList.refreshFiles(path); - fileNameTextField.setText(""); + fileNameTextField.setValue(""); return; } if (Files.isRegularFile(path)) { isComplete = true; callback.onFileSelected(path); - closeScreen(); + onClose(); } else if (!isLoad) { isComplete = true; callback.onFileSelected(path); - closeScreen(); + onClose(); } // else: cannot load non-existing file }); } @@ -227,7 +227,7 @@ public class FileChooserScreen extends Screen { private void cancel() { isComplete = true; callback.onCanceled(); - closeScreen(); + onClose(); } private void updateButtons() { @@ -326,7 +326,7 @@ public class FileChooserScreen extends Screen { private FileList.FileEntry createDirectoryEntry(final Path path, final String displayName) { return new FileList.FileEntry(path, new StringTextComponent(displayName) - .modifyStyle(s -> s.setColor(Color.fromInt(0xA0A0FF)))); + .withStyle(s -> s.withColor(Color.fromRgb(0xA0A0FF)))); } private final class FileEntry extends ExtendedList.AbstractListEntry { @@ -343,7 +343,7 @@ public class FileChooserScreen extends Screen { @Override public void render(final MatrixStack stack, final int index, final int top, final int left, final int width, final int height, final int mouseX, final int mouseY, final boolean isHovered, final float deltaTime) { - font.func_243246_a(stack, displayName, left, top, 0xFFFFFFFF); + font.drawShadow(stack, displayName, left, top, 0xFFFFFFFF); } @Override @@ -351,13 +351,13 @@ public class FileChooserScreen extends Screen { final boolean isLeftClick = button == 0; if (isLeftClick) { if (file == null || (directory != null && file.equals(directory.getParent()))) { - fileNameTextField.setText(".."); + fileNameTextField.setValue(".."); } else { final Path fileName = file.getFileName(); - fileNameTextField.setText(fileName != null ? fileName.toString() : file.toString()); + fileNameTextField.setValue(fileName != null ? fileName.toString() : file.toString()); } - fileNameTextField.setCursorPositionZero(); - fileNameTextField.setSelectionPos(0); + fileNameTextField.moveCursorToStart(); + fileNameTextField.setHighlightPos(0); setSelected(this); final boolean isDoubleClick = System.currentTimeMillis() - lastEntryClickTime < 250; diff --git a/src/main/java/li/cil/oc2/client/gui/RobotContainerScreen.java b/src/main/java/li/cil/oc2/client/gui/RobotContainerScreen.java index 305e15c3..e088b83e 100644 --- a/src/main/java/li/cil/oc2/client/gui/RobotContainerScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/RobotContainerScreen.java @@ -24,7 +24,7 @@ public final class RobotContainerScreen extends ContainerScreen public static void renderSelection(final MatrixStack matrixStack, final int selectedSlot, final int x, final int y, final int columns) { RenderSystem.color4f(1f, 1f, 1f, 1f); - Minecraft.getInstance().getTextureManager().bindTexture(SELECTION); + Minecraft.getInstance().getTextureManager().bind(SELECTION); final int slotX = (selectedSlot % columns) * SLOT_SIZE; final int slotY = (selectedSlot / columns) * SLOT_SIZE; @@ -36,9 +36,9 @@ public final class RobotContainerScreen extends ContainerScreen public RobotContainerScreen(final RobotContainer container, final PlayerInventory playerInventory, final ITextComponent title) { super(container, playerInventory, title); - xSize = 176; - ySize = 197; - playerInventoryTitleY = ySize - 94; + width = 176; + height = 197; + inventoryLabelY = height - 94; } @Override @@ -57,21 +57,21 @@ public final class RobotContainerScreen extends ContainerScreen GuiUtils.renderMissingDeviceInfoTooltip(matrixStack, this, mouseX, mouseY, DeviceTypes.MEMORY, new TranslationTextComponent(Constants.TOOLTIP_MEMORY_MISSING)); GuiUtils.renderMissingDeviceInfoTooltip(matrixStack, this, mouseX, mouseY, DeviceTypes.HARD_DRIVE, new TranslationTextComponent(Constants.TOOLTIP_HARD_DRIVE_MISSING)); - renderHoveredTooltip(matrixStack, mouseX, mouseY); + renderTooltip(matrixStack, mouseX, mouseY); } /////////////////////////////////////////////////////////////////// @Override - protected void drawGuiContainerBackgroundLayer(final MatrixStack matrixStack, final float partialTicks, final int mouseX, final int mouseY) { + protected void renderBg(final MatrixStack matrixStack, final float partialTicks, final int mouseX, final int mouseY) { RenderSystem.color4f(1f, 1f, 1f, 1f); - getMinecraft().getTextureManager().bindTexture(BACKGROUND); - blit(matrixStack, guiLeft, guiTop, 0, 0, xSize, ySize); + getMinecraft().getTextureManager().bind(BACKGROUND); + blit(matrixStack, leftPos, topPos, 0, 0, width, height); } /////////////////////////////////////////////////////////////////// private void renderSelection(final MatrixStack matrixStack) { - renderSelection(matrixStack, container.getRobot().getSelectedSlot(), guiLeft + 115, guiTop + 23, 2); + renderSelection(matrixStack, menu.getRobot().getSelectedSlot(), leftPos + 115, topPos + 23, 2); } } diff --git a/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java b/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java index 8002676e..0e4234b0 100644 --- a/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java @@ -28,29 +28,25 @@ public final class RobotTerminalScreen extends ContainerScreen void renderMissingDeviceInfoIcon(final MatrixStack matrixStack, final ContainerScreen screen, final DeviceType type, final ResourceLocation icon) { - findFirstSlotOfTypeIfAllSlotsOfTypeEmpty(screen.getContainer(), type).ifPresent(slot -> { - screen.getMinecraft().getTextureManager().bindTexture(icon); + findFirstSlotOfTypeIfAllSlotsOfTypeEmpty(screen.getMenu(), type).ifPresent(slot -> { + screen.getMinecraft().getTextureManager().bind(icon); AbstractGui.blit(matrixStack, - screen.getGuiLeft() + slot.xPos - 1 + RELATIVE_ICON_POSITION, - screen.getGuiTop() + slot.yPos - 1 + RELATIVE_ICON_POSITION, + screen.getGuiLeft() + slot.x - 1 + RELATIVE_ICON_POSITION, + screen.getGuiTop() + slot.y - 1 + RELATIVE_ICON_POSITION, 200, 0, 0, @@ -38,17 +38,17 @@ public final class GuiUtils { } public static void renderMissingDeviceInfoTooltip(final MatrixStack matrixStack, final ContainerScreen screen, final int mouseX, final int mouseY, final DeviceType type, final ITextComponent tooltip) { - final boolean isCursorHoldingStack = !screen.getMinecraft().player.inventory.getItemStack().isEmpty(); + final boolean isCursorHoldingStack = !screen.getMinecraft().player.inventory.items.isEmpty(); if (isCursorHoldingStack) { return; } final Slot hoveredSlot = screen.getSlotUnderMouse(); - if (hoveredSlot != null && hoveredSlot.getHasStack()) { + if (hoveredSlot != null && hoveredSlot.hasItem()) { return; } - findFirstSlotOfTypeIfAllSlotsOfTypeEmpty(screen.getContainer(), type).ifPresent(slot -> { + findFirstSlotOfTypeIfAllSlotsOfTypeEmpty(screen.getMenu(), type).ifPresent(slot -> { if (slot == hoveredSlot) { screen.renderTooltip(matrixStack, tooltip, mouseX, mouseY); } @@ -57,12 +57,12 @@ public final class GuiUtils { private static Optional findFirstSlotOfTypeIfAllSlotsOfTypeEmpty(final Container container, final DeviceType type) { TypedSlotItemHandler firstSlot = null; - for (final Slot slot : container.inventorySlots) { + for (final Slot slot : container.slots) { if (slot instanceof TypedSlotItemHandler) { final TypedSlotItemHandler typedSlot = (TypedSlotItemHandler) slot; final DeviceType slotType = typedSlot.getDeviceType(); if (slotType == type) { - if (slot.getHasStack()) { + if (slot.hasItem()) { return Optional.empty(); } else if (firstSlot == null) { firstSlot = typedSlot; diff --git a/src/main/java/li/cil/oc2/client/gui/widget/ImageButton.java b/src/main/java/li/cil/oc2/client/gui/widget/ImageButton.java index ab971957..a6281755 100644 --- a/src/main/java/li/cil/oc2/client/gui/widget/ImageButton.java +++ b/src/main/java/li/cil/oc2/client/gui/widget/ImageButton.java @@ -38,7 +38,7 @@ public abstract class ImageButton extends AbstractButton { if (description == null) { this.tooltip = Collections.singletonList(caption); } else { - this.tooltip = Arrays.asList(caption, new StringTextComponent("").modifyStyle(style -> style.setColor(Color.fromTextFormatting(TextFormatting.GRAY))).append(description)); + this.tooltip = Arrays.asList(caption, new StringTextComponent("").withStyle(style -> style.withColor(Color.fromLegacyFormat(TextFormatting.GRAY))).append(description)); } this.baseImage = baseImage; this.pressedImage = pressedImage; @@ -73,6 +73,6 @@ public abstract class ImageButton extends AbstractButton { @Override public void renderToolTip(final MatrixStack stack, final int mouseX, final int mouseY) { - GuiUtils.drawHoveringText(stack, tooltip, mouseX, mouseY, parent.width, parent.height, 200, Minecraft.getInstance().fontRenderer); + GuiUtils.drawHoveringText(stack, tooltip, mouseX, mouseY, parent.width, parent.height, 200, Minecraft.getInstance().font); } } diff --git a/src/main/java/li/cil/oc2/client/gui/widget/Sprite.java b/src/main/java/li/cil/oc2/client/gui/widget/Sprite.java index 624b6aff..15622add 100644 --- a/src/main/java/li/cil/oc2/client/gui/widget/Sprite.java +++ b/src/main/java/li/cil/oc2/client/gui/widget/Sprite.java @@ -21,12 +21,12 @@ public final class Sprite extends AbstractGui { } public void draw(final MatrixStack stack, final int x, final int y) { - Minecraft.getInstance().getTextureManager().bindTexture(image); + Minecraft.getInstance().getTextureManager().bind(image); blit(stack, x, y, u0, v0, width, height, textureSize, textureSize); } public void drawFillY(final MatrixStack stack, final int x, final int y, final float value) { - Minecraft.getInstance().getTextureManager().bindTexture(image); + Minecraft.getInstance().getTextureManager().bind(image); final int h = (int) (this.height * value); blit(stack, x, y + (height - h), u0, v0 + (height - h), width, h, textureSize, textureSize); } diff --git a/src/main/java/li/cil/oc2/client/gui/widget/ToggleImageButton.java b/src/main/java/li/cil/oc2/client/gui/widget/ToggleImageButton.java index bbda5a71..ab647563 100644 --- a/src/main/java/li/cil/oc2/client/gui/widget/ToggleImageButton.java +++ b/src/main/java/li/cil/oc2/client/gui/widget/ToggleImageButton.java @@ -42,7 +42,7 @@ public abstract class ToggleImageButton extends AbstractButton { if (description == null) { this.tooltip = Collections.singletonList(caption); } else { - this.tooltip = Arrays.asList(caption, new StringTextComponent("").modifyStyle(style -> style.setColor(Color.fromTextFormatting(TextFormatting.GRAY))).append(description)); + this.tooltip = Arrays.asList(caption, new StringTextComponent("").withStyle(style -> style.withColor(Color.fromLegacyFormat(TextFormatting.GRAY))).append(description)); } this.baseImage = baseImage; this.pressedImage = pressedImage; @@ -90,6 +90,6 @@ public abstract class ToggleImageButton extends AbstractButton { @Override public void renderToolTip(final MatrixStack stack, final int mouseX, final int mouseY) { - GuiUtils.drawHoveringText(stack, tooltip, mouseX, mouseY, parent.width, parent.height, 200, Minecraft.getInstance().fontRenderer); + GuiUtils.drawHoveringText(stack, tooltip, mouseX, mouseY, parent.width, parent.height, 200, Minecraft.getInstance().font); } } diff --git a/src/main/java/li/cil/oc2/client/item/CustomItemModelProperties.java b/src/main/java/li/cil/oc2/client/item/CustomItemModelProperties.java index 9e4914fa..8005d3db 100644 --- a/src/main/java/li/cil/oc2/client/item/CustomItemModelProperties.java +++ b/src/main/java/li/cil/oc2/client/item/CustomItemModelProperties.java @@ -11,15 +11,15 @@ public final class CustomItemModelProperties { /////////////////////////////////////////////////////////////////// public static void initialize() { - ItemModelsProperties.registerProperty(Items.HARD_DRIVE_SMALL.get(), CustomItemModelProperties.COLOR_PROPERTY, + ItemModelsProperties.register(Items.HARD_DRIVE_SMALL.get(), CustomItemModelProperties.COLOR_PROPERTY, (stack, world, entity) -> CustomItemColors.getColor(stack)); - ItemModelsProperties.registerProperty(Items.HARD_DRIVE_MEDIUM.get(), CustomItemModelProperties.COLOR_PROPERTY, + ItemModelsProperties.register(Items.HARD_DRIVE_MEDIUM.get(), CustomItemModelProperties.COLOR_PROPERTY, (stack, world, entity) -> CustomItemColors.getColor(stack)); - ItemModelsProperties.registerProperty(Items.HARD_DRIVE_LARGE.get(), CustomItemModelProperties.COLOR_PROPERTY, + ItemModelsProperties.register(Items.HARD_DRIVE_LARGE.get(), CustomItemModelProperties.COLOR_PROPERTY, (stack, world, entity) -> CustomItemColors.getColor(stack)); - ItemModelsProperties.registerProperty(Items.HARD_DRIVE_CUSTOM.get(), CustomItemModelProperties.COLOR_PROPERTY, + ItemModelsProperties.register(Items.HARD_DRIVE_CUSTOM.get(), CustomItemModelProperties.COLOR_PROPERTY, (stack, world, entity) -> CustomItemColors.getColor(stack)); - ItemModelsProperties.registerProperty(Items.FLOPPY.get(), CustomItemModelProperties.COLOR_PROPERTY, + ItemModelsProperties.register(Items.FLOPPY.get(), CustomItemModelProperties.COLOR_PROPERTY, (stack, world, entity) -> CustomItemColors.getColor(stack)); } } diff --git a/src/main/java/li/cil/oc2/client/model/BusCableBakedModel.java b/src/main/java/li/cil/oc2/client/model/BusCableBakedModel.java index 4783e9cf..27eb1615 100644 --- a/src/main/java/li/cil/oc2/client/model/BusCableBakedModel.java +++ b/src/main/java/li/cil/oc2/client/model/BusCableBakedModel.java @@ -35,7 +35,7 @@ public final class BusCableBakedModel implements IDynamicBakedModel { @Override public List getQuads(@Nullable final BlockState state, @Nullable final Direction side, final Random rand, final IModelData extraData) { - if (state == null || !state.get(BusCableBlock.HAS_CABLE)) { + if (state == null || !state.getValue(BusCableBlock.HAS_CABLE)) { return proxy.getQuads(null, side, rand, extraData); } @@ -50,15 +50,15 @@ public final class BusCableBakedModel implements IDynamicBakedModel { final BusCableSupportSide supportSide = extraData.getData(BusCableSupportSide.BUS_CABLE_SUPPORT_PROPERTY); if (supportSide != null) { - quads.addAll(supportModelByFace[supportSide.get().getIndex()].getQuads(state, side, rand, extraData)); + quads.addAll(supportModelByFace[supportSide.get().get3DDataValue()].getQuads(state, side, rand, extraData)); } return quads; } @Override - public boolean isAmbientOcclusion() { - return proxy.isAmbientOcclusion(); + public boolean useAmbientOcclusion() { + return proxy.useAmbientOcclusion(); } @Override @@ -66,19 +66,20 @@ public final class BusCableBakedModel implements IDynamicBakedModel { return proxy.isGui3d(); } + @Override - public boolean isSideLit() { - return proxy.isSideLit(); + public boolean usesBlockLight() { + return proxy.usesBlockLight(); } @Override - public boolean isBuiltInRenderer() { - return proxy.isBuiltInRenderer(); + public boolean isCustomRenderer() { + return proxy.isCustomRenderer(); } @Override - public TextureAtlasSprite getParticleTexture() { - return proxy.getParticleTexture(); + public TextureAtlasSprite getParticleIcon() { + return proxy.getParticleIcon(); } @Override @@ -92,7 +93,7 @@ public final class BusCableBakedModel implements IDynamicBakedModel { for (final Direction direction : Constants.DIRECTIONS) { if (isNeighborInDirectionSolid(world, pos, direction)) { final EnumProperty property = BusCableBlock.FACING_TO_CONNECTION_MAP.get(direction); - if (state.hasProperty(property) && state.get(property) == BusCableBlock.ConnectionType.INTERFACE) { + if (state.hasProperty(property) && state.getValue(property) == BusCableBlock.ConnectionType.INTERFACE) { return tileData; // Plug is already supporting us, bail. } @@ -114,19 +115,19 @@ public final class BusCableBakedModel implements IDynamicBakedModel { /////////////////////////////////////////////////////////////////// private static boolean isNeighborInDirectionSolid(final IBlockDisplayReader world, final BlockPos pos, final Direction direction) { - final BlockPos neighborPos = pos.offset(direction); - return world.getBlockState(neighborPos).isSolidSide(world, neighborPos, direction.getOpposite()); + final BlockPos neighborPos = pos.relative(direction); + return world.getBlockState(neighborPos).isFaceSturdy(world, neighborPos, direction.getOpposite()); } private static boolean isStraightAlongAxis(final BlockState state, final Direction.Axis axis) { for (final Direction direction : Constants.DIRECTIONS) { final EnumProperty property = BusCableBlock.FACING_TO_CONNECTION_MAP.get(direction); if (axis.test(direction)) { - if (state.get(property) != BusCableBlock.ConnectionType.CABLE) { + if (state.getValue(property) != BusCableBlock.ConnectionType.CABLE) { return false; } } else { - if (state.get(property) != BusCableBlock.ConnectionType.NONE) { + if (state.getValue(property) != BusCableBlock.ConnectionType.NONE) { return false; } } diff --git a/src/main/java/li/cil/oc2/client/model/BusCableModel.java b/src/main/java/li/cil/oc2/client/model/BusCableModel.java index a82f5974..99ddc3b1 100644 --- a/src/main/java/li/cil/oc2/client/model/BusCableModel.java +++ b/src/main/java/li/cil/oc2/client/model/BusCableModel.java @@ -50,8 +50,8 @@ public final class BusCableModel implements IModelGeometry { @Override public Collection getTextures(final IModelConfiguration owner, final Function modelGetter, final Set> missingTextureErrors) { final ArrayList textures = new ArrayList<>(proxy.getTextures(owner, modelGetter, missingTextureErrors)); - textures.addAll(modelGetter.apply(BUS_CABLE_STRAIGHT_MODEL).getTextures(modelGetter, missingTextureErrors)); - textures.addAll(modelGetter.apply(BUS_CABLE_SUPPORT_MODEL).getTextures(modelGetter, missingTextureErrors)); + textures.addAll(modelGetter.apply(BUS_CABLE_STRAIGHT_MODEL).getMaterials(modelGetter, missingTextureErrors)); + textures.addAll(modelGetter.apply(BUS_CABLE_SUPPORT_MODEL).getMaterials(modelGetter, missingTextureErrors)); return textures; } } diff --git a/src/main/java/li/cil/oc2/client/renderer/BusInterfaceNameRenderer.java b/src/main/java/li/cil/oc2/client/renderer/BusInterfaceNameRenderer.java index c78d0ce3..c0f7c558 100644 --- a/src/main/java/li/cil/oc2/client/renderer/BusInterfaceNameRenderer.java +++ b/src/main/java/li/cil/oc2/client/renderer/BusInterfaceNameRenderer.java @@ -35,19 +35,19 @@ public enum BusInterfaceNameRenderer { public void handleRenderLastEvent(final RenderWorldLastEvent event) { final Minecraft mc = Minecraft.getInstance(); final PlayerEntity player = mc.player; - final World world = player.getEntityWorld(); + final World world = player.getCommandSenderWorld(); if (!Wrenches.isHoldingWrench(player)) { return; } - if (!(mc.objectMouseOver instanceof BlockRayTraceResult)) { + if (!(mc.hitResult instanceof BlockRayTraceResult)) { return; } - final BlockRayTraceResult hit = (BlockRayTraceResult) mc.objectMouseOver; - final BlockPos blockPos = hit.getPos(); - final TileEntity tileEntity = world.getTileEntity(blockPos); + final BlockRayTraceResult hit = (BlockRayTraceResult) mc.hitResult; + final BlockPos blockPos = hit.getBlockPos(); + final TileEntity tileEntity = world.getBlockEntity(blockPos); if (!(tileEntity instanceof BusCableTileEntity)) { return; } @@ -65,39 +65,39 @@ public enum BusInterfaceNameRenderer { final MatrixStack stack = event.getMatrixStack(); - stack.push(); + stack.pushPose(); stack.translate(0.5, 1, 0.5); - stack.translate(side.getXOffset() * 0.5f, 0, side.getZOffset() * 0.5f); + stack.translate(side.getStepX() * 0.5f, 0, side.getStepZ() * 0.5f); - final ActiveRenderInfo info = mc.gameRenderer.getActiveRenderInfo(); + final ActiveRenderInfo info = mc.gameRenderer.getMainCamera(); stack.translate( - blockPos.getX() - info.getProjectedView().getX(), - blockPos.getY() - info.getProjectedView().getY(), - blockPos.getZ() - info.getProjectedView().getZ()); + blockPos.getX() - info.getPosition().x, + blockPos.getY() - info.getPosition().y, + blockPos.getZ() - info.getPosition().z); - final EntityRendererManager renderManager = mc.getRenderManager(); - stack.rotate(renderManager.getCameraOrientation()); + final EntityRendererManager renderManager = mc.getEntityRenderDispatcher(); + stack.mulPose(renderManager.cameraOrientation()); stack.scale(-0.025f, -0.025f, 0.025f); - final Matrix4f matrix = stack.getLast().getMatrix(); + final Matrix4f matrix = stack.last().pose(); - final FontRenderer fontrenderer = renderManager.getFontRenderer(); - final IRenderTypeBuffer.Impl buffer = IRenderTypeBuffer.getImpl(Tessellator.getInstance().getBuffer()); + final FontRenderer fontrenderer = renderManager.getFont(); + final IRenderTypeBuffer.Impl buffer = IRenderTypeBuffer.immediate(Tessellator.getInstance().getBuilder()); - final float horizontalTextOffset = -fontrenderer.getStringWidth(name) * 0.5f; - final float backgroundOpacity = Minecraft.getInstance().gameSettings.getTextBackgroundOpacity(0.25F); + final float horizontalTextOffset = -fontrenderer.width(name) * 0.5f; + final float backgroundOpacity = Minecraft.getInstance().options.getBackgroundOpacity(0.25F); final int backgroundColor = (int) (backgroundOpacity * 255.0F) << 24; - final int packedLight = LightTexture.packLight(15, 15); + final int packedLight = LightTexture.pack(15, 15); - fontrenderer.renderString(name, horizontalTextOffset, 0, 0xffffffff, + fontrenderer.drawInBatch(name, horizontalTextOffset, 0, 0xffffffff, false, matrix, buffer, true, backgroundColor, packedLight); - fontrenderer.renderString(name, horizontalTextOffset, 0, 0xffffffff, + fontrenderer.drawInBatch(name, horizontalTextOffset, 0, 0xffffffff, false, matrix, buffer, false, 0, packedLight); - buffer.finish(); + buffer.endBatch(); - stack.pop(); + stack.popPose(); } } diff --git a/src/main/java/li/cil/oc2/client/renderer/CustomRenderType.java b/src/main/java/li/cil/oc2/client/renderer/CustomRenderType.java index 07150e1b..f243f8eb 100644 --- a/src/main/java/li/cil/oc2/client/renderer/CustomRenderType.java +++ b/src/main/java/li/cil/oc2/client/renderer/CustomRenderType.java @@ -10,13 +10,13 @@ import org.lwjgl.opengl.GL11; public abstract class CustomRenderType extends RenderType { public static RenderType getUnlitBlock(final ResourceLocation location) { final TextureState texture = new TextureState(location, false, true); - final RenderType.State state = RenderType.State.getBuilder() - .texture(texture) - .alpha(DEFAULT_ALPHA) - .transparency(ADDITIVE_TRANSPARENCY) - .cull(CULL_DISABLED) - .build(false); - return RenderType.makeType( + final RenderType.State state = RenderType.State.builder() + .setTextureState(texture) + .setAlphaState(DEFAULT_ALPHA) + .setTransparencyState(ADDITIVE_TRANSPARENCY) + .setCullState(NO_CULL) + .createCompositeState(false); + return RenderType.create( API.MOD_ID + ":unlit_block", DefaultVertexFormats.POSITION_TEX, GL11.GL_QUADS, @@ -27,13 +27,13 @@ public abstract class CustomRenderType extends RenderType { } public static RenderType getNetworkCable() { - final State state = State.getBuilder() - .texture(NO_TEXTURE) - .transparency(NO_TRANSPARENCY) - .cull(CULL_DISABLED) - .lightmap(LIGHTMAP_ENABLED) - .build(false); - return RenderType.makeType(API.MOD_ID + ":network_cable", + final State state = State.builder() + .setTextureState(NO_TEXTURE) + .setTransparencyState(NO_TRANSPARENCY) + .setCullState(NO_CULL) + .setLightmapState(LIGHTMAP) + .createCompositeState(false); + return RenderType.create(API.MOD_ID + ":network_cable", DefaultVertexFormats.POSITION_COLOR_LIGHTMAP, GL11.GL_QUAD_STRIP, 256, diff --git a/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java b/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java index b7b1d9c0..b257a96e 100644 --- a/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java +++ b/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java @@ -82,12 +82,12 @@ public final class NetworkCableRenderer { /////////////////////////////////////////////////////////////////// private static void handleChunkUnloadEvent(final ChunkEvent.Unload event) { - if (event.getWorld().isRemote()) { + if (event.getWorld().isClientSide()) { final ChunkPos chunkPos = event.getChunk().getPos(); final ArrayList list = new ArrayList<>(NetworkCableRenderer.connectors); for (final NetworkConnectorTileEntity connector : list) { - final ChunkPos connectorChunkPos = new ChunkPos(connector.getPos()); + final ChunkPos connectorChunkPos = new ChunkPos(connector.getBlockPos()); if (Objects.equals(connectorChunkPos, chunkPos)) { connectors.remove(connector); } @@ -98,12 +98,12 @@ public final class NetworkCableRenderer { } private static void handleWorldUnloadEvent(final WorldEvent.Unload event) { - if (event.getWorld().isRemote()) { + if (event.getWorld().isClientSide()) { final IWorld world = event.getWorld(); final ArrayList list = new ArrayList<>(NetworkCableRenderer.connectors); for (final NetworkConnectorTileEntity connector : list) { - if (connector.getWorld() == world) { + if (connector.getLevel() == world) { connectors.remove(connector); } } @@ -116,7 +116,7 @@ public final class NetworkCableRenderer { validateConnectors(); validatePairs(); - if (Minecraft.isFabulousGraphicsEnabled()) { + if (Minecraft.useShaderTransparency()) { return; } @@ -125,42 +125,42 @@ public final class NetworkCableRenderer { } final Minecraft client = Minecraft.getInstance(); - final World world = client.world; + final World world = client.level; if (world == null) { return; } final MatrixStack matrixStack = event.getMatrixStack(); - final ActiveRenderInfo activeRenderInfo = client.gameRenderer.getActiveRenderInfo(); - final Vector3d eye = activeRenderInfo.getProjectedView(); + final ActiveRenderInfo activeRenderInfo = client.gameRenderer.getMainCamera(); + final Vector3d eye = activeRenderInfo.getPosition(); - final ClippingHelper frustum = new ClippingHelper(matrixStack.getLast().getMatrix(), event.getProjectionMatrix()); - frustum.setCameraPosition(eye.getX(), eye.getY(), eye.getZ()); + final ClippingHelper frustum = new ClippingHelper(matrixStack.last().pose(), event.getProjectionMatrix()); + frustum.prepare(eye.x, eye.y, eye.z); - matrixStack.push(); - matrixStack.translate(-eye.getX(), -eye.getY(), -eye.getZ()); + matrixStack.pushPose(); + matrixStack.translate(-eye.x, -eye.y, -eye.z); - renderCables(world, matrixStack, eye, connections, frustum::isBoundingBoxInFrustum); + renderCables(world, matrixStack, eye, connections, frustum::isVisible); - matrixStack.pop(); + matrixStack.popPose(); } private static void renderCables(final IBlockDisplayReader world, final MatrixStack matrixStack, final Vector3d eye, final ArrayList connections, final Predicate filter) { - final Matrix4f viewMatrix = matrixStack.getLast().getMatrix(); + final Matrix4f viewMatrix = matrixStack.last().pose(); final RenderType renderType = CustomRenderType.getNetworkCable(); - final IRenderTypeBuffer.Impl bufferSource = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource(); + final IRenderTypeBuffer.Impl bufferSource = Minecraft.getInstance().renderBuffers().bufferSource(); - final float r = CABLE_COLOR.getX(); - final float g = CABLE_COLOR.getY(); - final float b = CABLE_COLOR.getZ(); + final float r = CABLE_COLOR.x(); + final float g = CABLE_COLOR.y(); + final float b = CABLE_COLOR.z(); for (final Connection connection : connections) { final Vector3d p0 = connection.from; final Vector3d p1 = connection.to; - if (!p0.isWithinDistanceOf(eye, MAX_RENDER_DISTANCE) && !p1.isWithinDistanceOf(eye, MAX_RENDER_DISTANCE)) { + if (!p0.closerThan(eye, MAX_RENDER_DISTANCE) && !p1.closerThan(eye, MAX_RENDER_DISTANCE)) { continue; } @@ -183,24 +183,24 @@ public final class NetworkCableRenderer { final Vector3d n = getExtrusionVector(eye, p, connection.forward); final BlockPos blockPos = new BlockPos(p); - final int blockLight = world.getLightFor(LightType.BLOCK, blockPos); - final int skyLight = world.getLightFor(LightType.SKY, blockPos); - final int packedLight = LightTexture.packLight(blockLight, skyLight); + final int blockLight = world.getBrightness(LightType.BLOCK, blockPos); + final int skyLight = world.getBrightness(LightType.SKY, blockPos); + final int packedLight = LightTexture.pack(blockLight, skyLight); final Vector3f v0 = new Vector3f(p.subtract(n)); final Vector3f v1 = new Vector3f(p.add(n)); - buffer.pos(viewMatrix, v0.getX(), v0.getY(), v0.getZ()) + buffer.vertex(viewMatrix, v0.x(), v0.y(), v0.z()) .color(r, g, b, 1f) - .lightmap(packedLight) + .uv2(packedLight) .endVertex(); - buffer.pos(viewMatrix, v1.getX(), v1.getY(), v1.getZ()) + buffer.vertex(viewMatrix, v1.x(), v1.y(), v1.z()) .color(r, g, b, 1f) - .lightmap(packedLight) + .uv2(packedLight) .endVertex(); } - bufferSource.finish(renderType); + bufferSource.endBatch(renderType); } } @@ -215,7 +215,7 @@ public final class NetworkCableRenderer { } private static Vector3d getExtrusionVector(final Vector3d eye, final Vector3d v, final Vector3d forward) { - return forward.crossProduct(eye.subtract(v)).normalize().scale(CABLE_THICKNESS); + return forward.cross(eye.subtract(v)).normalize().scale(CABLE_THICKNESS); } private static float computeCableHang(final Vector3d a, final Vector3d b) { @@ -237,9 +237,9 @@ public final class NetworkCableRenderer { 0, swingAmount * MathHelper.cos(relRadialTime)); } else { - return c.add(swingAmount * MathHelper.cos(relRadialTime) * right.getX(), + return c.add(swingAmount * MathHelper.cos(relRadialTime) * right.x, 0.5f * swingAmount * MathHelper.sin(relRadialTime * 2 - (float) Math.PI) - swingAmount, - swingAmount * MathHelper.cos(relRadialTime) * right.getZ()); + swingAmount * MathHelper.cos(relRadialTime) * right.z); } } @@ -272,7 +272,7 @@ public final class NetworkCableRenderer { final HashSet seen = new HashSet<>(); for (final NetworkConnectorTileEntity connector : connectors) { - final BlockPos position = connector.getPos(); + final BlockPos position = connector.getBlockPos(); for (final BlockPos connectedPosition : connector.getConnectedPositions()) { final Connection connection = new Connection(position, connectedPosition); if (seen.add(connection)) { @@ -301,12 +301,12 @@ public final class NetworkCableRenderer { this.toPos = toPos; } - from = Vector3d.copyCentered(fromPos); - to = Vector3d.copyCentered(toPos); + from = Vector3d.atCenterOf(fromPos); + to = Vector3d.atCenterOf(toPos); forward = to.subtract(from).normalize(); right = fromPos.getX() == toPos.getX() && fromPos.getZ() == toPos.getZ() - ? null : forward.crossProduct(POS_Y); - bounds = new AxisAlignedBB(from, to).grow(0, CABLE_HANG_MAX, 0); + ? null : forward.cross(POS_Y); + bounds = new AxisAlignedBB(from, to).inflate(0, CABLE_HANG_MAX, 0); } @Override diff --git a/src/main/java/li/cil/oc2/client/renderer/entity/RobotEntityRenderer.java b/src/main/java/li/cil/oc2/client/renderer/entity/RobotEntityRenderer.java index 57cf4311..2a961fb8 100644 --- a/src/main/java/li/cil/oc2/client/renderer/entity/RobotEntityRenderer.java +++ b/src/main/java/li/cil/oc2/client/renderer/entity/RobotEntityRenderer.java @@ -24,30 +24,30 @@ public final class RobotEntityRenderer extends EntityRenderer { /////////////////////////////////////////////////////////////////// @Override - public ResourceLocation getEntityTexture(final RobotEntity entity) { + public ResourceLocation getTextureLocation(final RobotEntity entity) { return RobotModel.ROBOT_ENTITY_TEXTURE; } @Override public void render(final RobotEntity entity, final float entityYaw, final float partialTicks, final MatrixStack matrixStack, final IRenderTypeBuffer buffer, final int packedLight) { final RobotEntity.AnimationState state = entity.getAnimationState(); - state.update(partialTicks, entity.world.rand); + state.update(partialTicks, entity.level.random); - matrixStack.push(); + matrixStack.pushPose(); // NB: we don't entityYaw given to use because that uses a plain lerp which can lead to ugly // jumps in case we get a wrapped rotationYaw synced from the server (leading to ~360 // degree delta to the last known previous rotation). Haven't figured out where to // alternatively prevent this wrapping or patch the prev value instead. - final float partialRotation = MathHelper.degreesDifferenceAbs(entity.prevRotationYaw, entity.rotationYaw) * partialTicks; - final float rotation = MathHelper.approachDegrees(entity.prevRotationYaw, entity.rotationYaw, partialRotation); - matrixStack.rotate(Vector3f.YN.rotationDegrees(rotation)); + final float partialRotation = MathHelper.degreesDifferenceAbs(entity.yRotO, entity.yRot) * partialTicks; + final float rotation = MathHelper.approachDegrees(entity.yRotO, entity.yRot, partialRotation); + matrixStack.mulPose(Vector3f.YN.rotationDegrees(rotation)); - model.setRotationAngles(entity, 0, 0, 0, 0, 0); + model.setupAnim(entity, 0, 0, 0, 0, 0); - final IVertexBuilder builder = buffer.getBuffer(model.getRenderType(getEntityTexture(entity))); - model.render(matrixStack, builder, packedLight, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); + final IVertexBuilder builder = buffer.getBuffer(model.renderType(getTextureLocation(entity))); + model.renderToBuffer(matrixStack, builder, packedLight, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); - matrixStack.pop(); + matrixStack.popPose(); // final RayTraceResult hit = Minecraft.getInstance().objectMouseOver; // if (hit instanceof EntityRayTraceResult && entity == ((EntityRayTraceResult) hit).getEntity()) { diff --git a/src/main/java/li/cil/oc2/client/renderer/entity/model/RobotModel.java b/src/main/java/li/cil/oc2/client/renderer/entity/model/RobotModel.java index 0924d18b..bfb66af4 100644 --- a/src/main/java/li/cil/oc2/client/renderer/entity/model/RobotModel.java +++ b/src/main/java/li/cil/oc2/client/renderer/entity/model/RobotModel.java @@ -25,20 +25,20 @@ public final class RobotModel extends EntityModel { public RobotModel() { topRenderer = new ModelRenderer(this, 1, 1) - .setTextureSize(64, 64) + .setTexSize(64, 64) .addBox(-7, 8, -7, 14, 6, 14); baseRenderer = new ModelRenderer(this, 1, 23) - .setTextureSize(64, 64) + .setTexSize(64, 64) .addBox(-7, 0, -7, 14, 7, 14); coreRenderer = new ModelRenderer(this, 1, 34) - .setTextureSize(64, 64) + .setTexSize(64, 64) .addBox(-6, 7, -6, 12, 1, 12); } /////////////////////////////////////////////////////////////////// @Override - public void setRotationAngles(final RobotEntity entity, final float limbSwing, final float limbSwingAmount, final float ageInTicks, final float netHeadYaw, final float headPitch) { + public void setupAnim(final RobotEntity entity, final float limbSwing, final float limbSwingAmount, final float ageInTicks, final float netHeadYaw, final float headPitch) { final RobotEntity.AnimationState state = entity.getAnimationState(); baseY = state.baseRenderOffsetY; topY = state.topRenderOffsetY; @@ -46,17 +46,17 @@ public final class RobotModel extends EntityModel { } @Override - public void render(final MatrixStack matrixStack, final IVertexBuilder buffer, final int packedLight, final int packedOverlay, final float red, final float green, final float blue, final float alpha) { - matrixStack.push(); + public void renderToBuffer(final MatrixStack matrixStack, final IVertexBuilder buffer, final int packedLight, final int packedOverlay, final float red, final float green, final float blue, final float alpha) { + matrixStack.pushPose(); matrixStack.translate(0, topY, 0); - matrixStack.rotate(TransformationHelper.quatFromXYZ(topRotation, true)); + matrixStack.mulPose(TransformationHelper.quatFromXYZ(topRotation, true)); topRenderer.render(matrixStack, buffer, packedLight, packedOverlay); - matrixStack.pop(); + matrixStack.popPose(); - matrixStack.push(); + matrixStack.pushPose(); matrixStack.translate(0, baseY, 0); baseRenderer.render(matrixStack, buffer, packedLight, packedOverlay); - coreRenderer.render(matrixStack, buffer, LightTexture.packLight(15, 15), packedOverlay); - matrixStack.pop(); + coreRenderer.render(matrixStack, buffer, LightTexture.pack(15, 15), packedOverlay); + matrixStack.popPose(); } } diff --git a/src/main/java/li/cil/oc2/client/renderer/tileentity/ChargerTileEntityRenderer.java b/src/main/java/li/cil/oc2/client/renderer/tileentity/ChargerTileEntityRenderer.java index 236fe35d..47e132e1 100644 --- a/src/main/java/li/cil/oc2/client/renderer/tileentity/ChargerTileEntityRenderer.java +++ b/src/main/java/li/cil/oc2/client/renderer/tileentity/ChargerTileEntityRenderer.java @@ -17,7 +17,7 @@ import net.minecraft.util.math.vector.Matrix4f; public final class ChargerTileEntityRenderer extends TileEntityRenderer { public static final ResourceLocation EFFECT_LOCATION = new ResourceLocation(API.MOD_ID, "block/charger/effect"); - private static final RenderMaterial TEXTURE_EFFECT = new RenderMaterial(PlayerContainer.LOCATION_BLOCKS_TEXTURE, EFFECT_LOCATION); + private static final RenderMaterial TEXTURE_EFFECT = new RenderMaterial(PlayerContainer.BLOCK_ATLAS, EFFECT_LOCATION); private static final int EFFECT_LAYERS = 3; private static final float EFFECT_HEIGHT = 0.5f; @@ -41,30 +41,30 @@ public final class ChargerTileEntityRenderer extends TileEntityRenderer wrappedText = renderDispatcher.getFontRenderer().getCharacterManager().func_238362_b_(text, maxWidth, Style.EMPTY); + final FontRenderer fontRenderer = renderer.font; + final List wrappedText = fontRenderer.getSplitter().splitLines(text, maxWidth, Style.EMPTY); if (wrappedText.size() == 1) { - final int textWidth = fontRenderer.getStringPropertyWidth(text); - fontRenderer.func_243248_b(stack, text, (maxWidth - textWidth) * 0.5f, 0, 0xEE3322); + final int textWidth = fontRenderer.width(text); + fontRenderer.draw(stack, text, (maxWidth - textWidth) * 0.5f, 0, 0xEE3322); } else { for (int i = 0; i < wrappedText.size(); i++) { - fontRenderer.drawString(stack, wrappedText.get(i).getString(), 0, i * fontRenderer.FONT_HEIGHT, 0xEE3322); + fontRenderer.draw(stack, wrappedText.get(i).getString(), 0, i * fontRenderer.lineHeight, 0xEE3322); } } - stack.pop(); + stack.popPose(); } private void renderStatus(final Matrix4f matrix, final IRenderTypeBuffer buffer) { @@ -195,12 +195,12 @@ public final class ComputerTileEntityRenderer extends TileEntityRenderer Date: Sat, 29 May 2021 19:16:17 +0200 Subject: [PATCH 05/19] Mirgrated Common --- .../cil/oc2/common/block/BusCableBlock.java | 148 +++++++++--------- .../li/cil/oc2/common/block/ChargerBlock.java | 18 +-- .../cil/oc2/common/block/ComputerBlock.java | 72 ++++----- .../oc2/common/block/CreativeEnergyBlock.java | 4 +- .../cil/oc2/common/block/DiskDriveBlock.java | 28 ++-- .../common/block/NetworkConnectorBlock.java | 36 ++--- .../cil/oc2/common/block/NetworkHubBlock.java | 16 +- .../common/block/RedstoneInterfaceBlock.java | 26 +-- .../bus/AbstractGroupingDeviceBusElement.java | 6 +- .../bus/TileEntityDeviceBusController.java | 14 +- .../bus/TileEntityDeviceBusElement.java | 38 ++--- .../common/bus/device/data/FileSystems.java | 4 +- .../item/AbstractBlockDeviceVMDevice.java | 12 +- .../item/BlockOperationsModuleDevice.java | 44 +++--- .../item/InventoryOperationsModuleDevice.java | 26 +-- .../common/bus/device/item/MemoryDevice.java | 6 +- .../item/RedstoneInterfaceCardItemDevice.java | 24 +-- .../block/BlockStateDeviceProvider.java | 2 +- .../block/DiskDriveDeviceProvider.java | 2 +- .../AbstractTileEntityDeviceProvider.java | 2 +- .../oc2/common/bus/device/util/Devices.java | 6 +- .../common/container/AbstractContainer.java | 48 +++--- .../container/ComputerInventoryContainer.java | 6 +- .../container/ComputerTerminalContainer.java | 14 +- .../oc2/common/container/RobotContainer.java | 6 +- .../container/RobotTerminalContainer.java | 10 +- .../container/TypedSlotItemHandler.java | 8 +- .../li/cil/oc2/common/entity/Entities.java | 4 +- .../li/cil/oc2/common/entity/RobotEntity.java | 141 ++++++++--------- .../entity/robot/RobotMovementAction.java | 36 ++--- .../entity/robot/RobotMovementActionType.java | 8 +- .../entity/robot/RobotRotationAction.java | 12 +- .../entity/robot/RobotRotationActionType.java | 8 +- .../cil/oc2/common/integration/Wrenches.java | 4 +- .../common/item/AbstractBlockDeviceItem.java | 12 +- .../oc2/common/item/AbstractStorageItem.java | 10 +- .../common/item/BlockOperationsModule.java | 2 +- .../li/cil/oc2/common/item/BusCableItem.java | 22 +-- .../cil/oc2/common/item/BusInterfaceItem.java | 48 +++--- .../li/cil/oc2/common/item/ChargerItem.java | 4 +- .../cil/oc2/common/item/FlashMemoryItem.java | 4 +- .../item/FlashMemoryWithExternalDataItem.java | 14 +- .../li/cil/oc2/common/item/HardDriveItem.java | 4 +- .../item/HardDriveWithExternalDataItem.java | 4 +- .../li/cil/oc2/common/item/ItemGroup.java | 2 +- .../li/cil/oc2/common/item/MemoryItem.java | 3 +- .../li/cil/oc2/common/item/ModBlockItem.java | 6 +- .../java/li/cil/oc2/common/item/ModItem.java | 6 +- .../cil/oc2/common/item/NetworkCableItem.java | 38 ++--- .../li/cil/oc2/common/item/RobotItem.java | 36 ++--- .../li/cil/oc2/common/item/WrenchItem.java | 22 +-- .../common/item/crafting/WrenchRecipe.java | 20 +-- .../cil/oc2/common/network/MessageUtils.java | 2 +- .../oc2/common/serialization/BlobStorage.java | 2 +- .../serialization/NBTSerialization.java | 22 +-- .../serialization/NBTToJsonConverter.java | 20 +-- .../serializers/DirectionJsonSerializer.java | 4 +- .../serializers/TextComponentSerializer.java | 2 +- .../common/tileentity/AbstractTileEntity.java | 16 +- .../common/tileentity/BusCableTileEntity.java | 32 ++-- .../common/tileentity/ChargerTileEntity.java | 12 +- .../common/tileentity/ComputerTileEntity.java | 49 +++--- .../tileentity/CreativeEnergyTileEntity.java | 6 +- .../tileentity/DiskDriveTileEntity.java | 20 ++- .../NetworkConnectorTileEntity.java | 92 +++++------ .../tileentity/NetworkHubTileEntity.java | 12 +- .../RedstoneInterfaceTileEntity.java | 40 ++--- .../oc2/common/tileentity/TileEntities.java | 2 +- .../cil/oc2/common/util/FakePlayerUtils.java | 12 +- .../oc2/common/util/HorizontalBlockUtils.java | 20 +-- .../cil/oc2/common/util/ItemStackUtils.java | 40 ++--- .../java/li/cil/oc2/common/util/Location.java | 5 +- .../common/util/LocationSupplierUtils.java | 2 +- .../java/li/cil/oc2/common/util/NBTUtils.java | 2 +- .../li/cil/oc2/common/util/ResourceUtils.java | 8 +- .../cil/oc2/common/util/ServerScheduler.java | 4 +- .../li/cil/oc2/common/util/TooltipUtils.java | 22 +-- .../cil/oc2/common/util/VoxelShapeUtils.java | 4 +- .../li/cil/oc2/common/util/WorldUtils.java | 10 +- .../java/li/cil/oc2/common/vm/Terminal.java | 80 +++++----- 80 files changed, 813 insertions(+), 825 deletions(-) diff --git a/src/main/java/li/cil/oc2/common/block/BusCableBlock.java b/src/main/java/li/cil/oc2/common/block/BusCableBlock.java index 05a978e7..882af933 100644 --- a/src/main/java/li/cil/oc2/common/block/BusCableBlock.java +++ b/src/main/java/li/cil/oc2/common/block/BusCableBlock.java @@ -52,7 +52,7 @@ public final class BusCableBlock extends Block { INTERFACE; @Override - public String getString() { + public String getSerializedName() { switch (this) { case NONE: return "none"; @@ -87,7 +87,7 @@ public final class BusCableBlock extends Block { public static ConnectionType getConnectionType(final BlockState state, @Nullable final Direction direction) { if (direction != null) { - return state.get(BusCableBlock.FACING_TO_CONNECTION_MAP.get(direction)); + return state.getValue(BusCableBlock.FACING_TO_CONNECTION_MAP.get(direction)); } else { return ConnectionType.NONE; } @@ -96,7 +96,7 @@ public final class BusCableBlock extends Block { public static int getInterfaceCount(final BlockState state) { int partCount = 0; for (final EnumProperty connectionType : FACING_TO_CONNECTION_MAP.values()) { - if (state.get(connectionType) == ConnectionType.INTERFACE) { + if (state.getValue(connectionType) == ConnectionType.INTERFACE) { partCount++; } } @@ -104,8 +104,8 @@ public final class BusCableBlock extends Block { } public static Direction getHitSide(final BlockPos pos, final BlockRayTraceResult hit) { - final Vector3d localHitPos = hit.getHitVec().subtract(Vector3d.copyCentered(pos)); - return Direction.getFacingFromVector(localHitPos.x, localHitPos.y, localHitPos.z); + final Vector3d localHitPos = hit.getLocation().subtract(Vector3d.atCenterOf(pos)); + return Direction.getNearest(localHitPos.x, localHitPos.y, localHitPos.z); } /////////////////////////////////////////////////////////////////// @@ -116,16 +116,16 @@ public final class BusCableBlock extends Block { public BusCableBlock() { super(Properties - .create(Material.IRON) + .of(Material.METAL) .sound(SoundType.METAL) - .hardnessAndResistance(1.5f, 6.0f)); + .strength(1.5f, 6.0f)); - BlockState defaultState = getStateContainer().getBaseState(); + BlockState defaultState = getStateDefinition().any(); for (final EnumProperty property : FACING_TO_CONNECTION_MAP.values()) { - defaultState = defaultState.with(property, ConnectionType.NONE); + defaultState = defaultState.setValue(property, ConnectionType.NONE); } - defaultState = defaultState.with(HAS_CABLE, true); - setDefaultState(defaultState); + defaultState = defaultState.setValue(HAS_CABLE, true); + registerDefaultState(defaultState); shapes = makeShapes(); } @@ -134,11 +134,11 @@ public final class BusCableBlock extends Block { public boolean addInterface(final World world, final BlockPos pos, final BlockState state, final Direction side) { final EnumProperty property = FACING_TO_CONNECTION_MAP.get(side); - if (state.get(property) != ConnectionType.NONE) { + if (state.getValue(property) != ConnectionType.NONE) { return false; } - world.setBlockState(pos, state.with(property, ConnectionType.INTERFACE), BlockFlags.DEFAULT_AND_RERENDER); + world.setBlock(pos, state.setValue(property, ConnectionType.INTERFACE), BlockFlags.DEFAULT_AND_RERENDER); onConnectionTypeChanged(world, pos, side); @@ -146,11 +146,11 @@ public final class BusCableBlock extends Block { } public boolean addCable(final World world, final BlockPos pos, final BlockState state) { - if (state.get(HAS_CABLE)) { + if (state.getValue(HAS_CABLE)) { return false; } - world.setBlockState(pos, state.with(HAS_CABLE, true), BlockFlags.DEFAULT_AND_RERENDER); + world.setBlock(pos, state.setValue(HAS_CABLE, true), BlockFlags.DEFAULT_AND_RERENDER); onConnectionTypeChanged(world, pos, null); @@ -170,7 +170,7 @@ public final class BusCableBlock extends Block { @SuppressWarnings("deprecation") @Override public void neighborChanged(final BlockState state, final World world, final BlockPos pos, final Block changedBlock, final BlockPos changedBlockPos, final boolean isMoving) { - final TileEntity tileEntity = world.getTileEntity(pos); + final TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof BusCableTileEntity) { final BusCableTileEntity busCable = (BusCableTileEntity) tileEntity; busCable.handleNeighborChanged(changedBlockPos); @@ -179,31 +179,31 @@ public final class BusCableBlock extends Block { @SuppressWarnings("deprecation") @Override - public ActionResultType onBlockActivated(final BlockState state, final World world, final BlockPos pos, final PlayerEntity player, final Hand hand, final BlockRayTraceResult hit) { - if (Wrenches.isWrench(player.getHeldItem(hand))) { - if (player.isSneaking()) { + public ActionResultType use(final BlockState state, final World world, final BlockPos pos, final PlayerEntity player, final Hand hand, final BlockRayTraceResult hit) { + if (Wrenches.isWrench(player.getItemInHand(hand))) { + if (player.isShiftKeyDown()) { // NB: leave wrenching logic up to wrench when the to-be-removed interface is the last // part of this bus. This ensures we properly remove the block itself without having // to duplicate the logic needed for that. if (getPartCount(state) > 1) if (tryRemovePlug(state, world, pos, player, hit) || tryRemoveCable(state, world, pos, player)) { - return ActionResultType.func_233537_a_(world.isRemote()); + return ActionResultType.sidedSuccess(world.isClientSide); } } else { - final TileEntity tileEntity = world.getTileEntity(pos); + final TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof BusCableTileEntity) { final BusCableTileEntity busCableTileEntity = (BusCableTileEntity) tileEntity; final Direction side = getHitSide(pos, hit); if (getConnectionType(state, side) == ConnectionType.INTERFACE) { openBusInterfaceScreen(busCableTileEntity, side); - return ActionResultType.func_233537_a_(world.isRemote()); + return ActionResultType.sidedSuccess(world.isClientSide); } } } } - return super.onBlockActivated(state, world, pos, player, hand, hit); + return super.use(state, world, pos, player, hand, hit); } @SuppressWarnings("deprecation") @@ -211,13 +211,13 @@ public final class BusCableBlock extends Block { public List getDrops(final BlockState state, final LootContext.Builder builder) { final List drops = new ArrayList<>(super.getDrops(state, builder)); - if (state.get(HAS_CABLE)) { + if (state.getValue(HAS_CABLE)) { drops.add(new ItemStack(Items.BUS_CABLE.get())); } int interfaceCount = 0; for (final Direction side : Constants.DIRECTIONS) { - final ConnectionType connectionType = state.get(FACING_TO_CONNECTION_MAP.get(side)); + final ConnectionType connectionType = state.getValue(FACING_TO_CONNECTION_MAP.get(side)); if (connectionType == ConnectionType.INTERFACE) { interfaceCount++; } @@ -232,16 +232,16 @@ public final class BusCableBlock extends Block { @Override public BlockState getStateForPlacement(final BlockItemUseContext context) { - BlockState state = getDefaultState(); + BlockState state = defaultBlockState(); - final World world = context.getWorld(); - final BlockPos position = context.getPos(); + final World world = context.getLevel(); + final BlockPos position = context.getClickedPos(); for (final Map.Entry> entry : FACING_TO_CONNECTION_MAP.entrySet()) { final Direction facing = entry.getKey(); - final BlockPos facingPos = position.offset(facing); - if (context.getItem().getItem() == Items.BUS_CABLE.get() && + final BlockPos facingPos = position.relative(facing); + if (context.getItemInHand().getItem() == Items.BUS_CABLE.get() && canHaveCableTo(world.getBlockState(facingPos), facing.getOpposite())) { - state = state.with(entry.getValue(), ConnectionType.CABLE); + state = state.setValue(entry.getValue(), ConnectionType.CABLE); } } @@ -250,15 +250,15 @@ public final class BusCableBlock extends Block { @SuppressWarnings("deprecation") @Override - public BlockState updatePostPlacement(BlockState state, final Direction facing, final BlockState facingState, final IWorld world, final BlockPos currentPos, final BlockPos facingPos) { - if (state.get(FACING_TO_CONNECTION_MAP.get(facing)) == ConnectionType.INTERFACE) { + public BlockState updateShape(BlockState state, final Direction facing, final BlockState facingState, final IWorld world, final BlockPos currentPos, final BlockPos facingPos) { + if (state.getValue(FACING_TO_CONNECTION_MAP.get(facing)) == ConnectionType.INTERFACE) { return state; } - if (state.get(HAS_CABLE) && canHaveCableTo(facingState, facing.getOpposite())) { - state = state.with(FACING_TO_CONNECTION_MAP.get(facing), ConnectionType.CABLE); + if (state.getValue(HAS_CABLE) && canHaveCableTo(facingState, facing.getOpposite())) { + state = state.setValue(FACING_TO_CONNECTION_MAP.get(facing), ConnectionType.CABLE); } else { - state = state.with(FACING_TO_CONNECTION_MAP.get(facing), ConnectionType.NONE); + state = state.setValue(FACING_TO_CONNECTION_MAP.get(facing), ConnectionType.NONE); } onConnectionTypeChanged(world, currentPos, facing); @@ -275,8 +275,8 @@ public final class BusCableBlock extends Block { /////////////////////////////////////////////////////////////////// @Override - protected void fillStateContainer(final StateContainer.Builder builder) { - super.fillStateContainer(builder); + protected void createBlockStateDefinition(final StateContainer.Builder builder) { + super.createBlockStateDefinition(builder); FACING_TO_CONNECTION_MAP.values().forEach(builder::add); builder.add(HAS_CABLE); } @@ -285,13 +285,13 @@ public final class BusCableBlock extends Block { private static boolean canHaveCableTo(final BlockState state, final Direction side) { return state.getBlock() == Blocks.BUS_CABLE.get() && - state.get(HAS_CABLE) && - state.get(FACING_TO_CONNECTION_MAP.get(side)) != ConnectionType.INTERFACE; + state.getValue(HAS_CABLE) && + state.getValue(FACING_TO_CONNECTION_MAP.get(side)) != ConnectionType.INTERFACE; } private static int getPartCount(final BlockState state) { int partCount = getInterfaceCount(state); - if (state.get(HAS_CABLE)) { + if (state.getValue(HAS_CABLE)) { partCount++; } return partCount; @@ -301,15 +301,15 @@ public final class BusCableBlock extends Block { final Direction side = getHitSide(pos, hit); final EnumProperty property = FACING_TO_CONNECTION_MAP.get(side); - if (state.get(property) != ConnectionType.INTERFACE) { + if (state.getValue(property) != ConnectionType.INTERFACE) { return false; } - final BlockPos neighborPos = pos.offset(side); - if (state.get(HAS_CABLE) && canHaveCableTo(world.getBlockState(neighborPos), side.getOpposite())) { - world.setBlockState(pos, state.with(property, ConnectionType.CABLE)); + final BlockPos neighborPos = pos.relative(side); + if (state.getValue(HAS_CABLE) && canHaveCableTo(world.getBlockState(neighborPos), side.getOpposite())) { + world.setBlockAndUpdate(pos, state.setValue(property, ConnectionType.CABLE)); } else { - world.setBlockState(pos, state.with(property, ConnectionType.NONE)); + world.setBlockAndUpdate(pos, state.setValue(property, ConnectionType.NONE)); } handlePartRemoved(state, world, pos, side, player, new ItemStack(Items.BUS_INTERFACE.get())); @@ -318,11 +318,11 @@ public final class BusCableBlock extends Block { } private static boolean tryRemoveCable(final BlockState state, final World world, final BlockPos pos, final PlayerEntity player) { - if (!state.get(HAS_CABLE)) { + if (!state.getValue(HAS_CABLE)) { return false; } - world.setBlockState(pos, state.with(HAS_CABLE, false)); + world.setBlockAndUpdate(pos, state.setValue(HAS_CABLE, false)); handlePartRemoved(state, world, pos, null, player, new ItemStack(Items.BUS_CABLE.get())); @@ -332,10 +332,10 @@ public final class BusCableBlock extends Block { private static void handlePartRemoved(final BlockState state, final World world, final BlockPos pos, @Nullable final Direction side, final PlayerEntity player, final ItemStack drop) { onConnectionTypeChanged(world, pos, side); - if (!player.isCreative() && world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS)) { + if (!player.isCreative() && world.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS)) { ItemStackUtils.spawnAsEntity(world, pos, drop, side).ifPresent(entity -> { - entity.setNoPickupDelay(); - entity.onCollideWithPlayer(player); + entity.setNoPickUpDelay(); + entity.playerTouch(player); }); } @@ -343,7 +343,7 @@ public final class BusCableBlock extends Block { } private static void onConnectionTypeChanged(final IWorld world, final BlockPos pos, @Nullable final Direction face) { - final TileEntity tileEntity = world.getTileEntity(pos); + final TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof BusCableTileEntity) { final BusCableTileEntity busCable = (BusCableTileEntity) tileEntity; busCable.handleConnectivityChanged(face); @@ -353,11 +353,11 @@ public final class BusCableBlock extends Block { @OnlyIn(Dist.CLIENT) private static void openBusInterfaceScreen(final BusCableTileEntity tileEntity, final Direction side) { final BusInterfaceScreen screen = new BusInterfaceScreen(tileEntity, side); - Minecraft.getInstance().displayGuiScreen(screen); + Minecraft.getInstance().setScreen(screen); } private static VoxelShape[] makeShapes() { - final VoxelShape ownCableBounds = Block.makeCuboidShape(5, 5, 5, 11, 11, 11); + final VoxelShape ownCableBounds = Block.box(5, 5, 5, 11, 11, 11); final VoxelShape[] cableShapes = new VoxelShape[Constants.BLOCK_FACE_COUNT]; final VoxelShape[] interfaceShapes = new VoxelShape[Constants.BLOCK_FACE_COUNT]; for (int i = 0; i < Constants.BLOCK_FACE_COUNT; i++) { @@ -404,20 +404,20 @@ public final class BusCableBlock extends Block { final int zSize = 5; final Direction yDirection = zDirection.getAxis() == Direction.Axis.Y ? Direction.NORTH : Direction.UP; - final Direction xDirection = zDirection.getAxis() == Direction.Axis.Y ? Direction.WEST : zDirection.rotateY(); + final Direction xDirection = zDirection.getAxis() == Direction.Axis.Y ? Direction.WEST : zDirection.getClockWise(); final Vector3i min = new Vector3i(8, 8, 8) - .offset(xDirection, -xSize / 2) - .offset(yDirection, -ySize / 2) - .offset(zDirection, 8 - zSize); + .relative(xDirection, -xSize / 2) + .relative(yDirection, -ySize / 2) + .relative(zDirection, 8 - zSize); final Vector3i max = new Vector3i(8, 8, 8) - .offset(xDirection, xSize / 2) - .offset(yDirection, ySize / 2) - .offset(zDirection, 8); + .relative(xDirection, xSize / 2) + .relative(yDirection, ySize / 2) + .relative(zDirection, 8); final AxisAlignedBB bounds = new AxisAlignedBB( - Vector3d.copy(min).scale(1 / 16.0), - Vector3d.copy(max).scale(1 / 16.0) + Vector3d.atLowerCornerOf(min).scale(1 / 16.0), + Vector3d.atLowerCornerOf(max).scale(1 / 16.0) ); return VoxelShapes.create(bounds); @@ -429,20 +429,20 @@ public final class BusCableBlock extends Block { final int zSize = 1; final Direction yDirection = zDirection.getAxis() == Direction.Axis.Y ? Direction.NORTH : Direction.UP; - final Direction xDirection = zDirection.getAxis() == Direction.Axis.Y ? Direction.WEST : zDirection.rotateY(); + final Direction xDirection = zDirection.getAxis() == Direction.Axis.Y ? Direction.WEST : zDirection.getClockWise(); final Vector3i min = new Vector3i(8, 8, 8) - .offset(xDirection, -xSize / 2) - .offset(yDirection, -ySize / 2) - .offset(zDirection, 8 - zSize); + .relative(xDirection, -xSize / 2) + .relative(yDirection, -ySize / 2) + .relative(zDirection, 8 - zSize); final Vector3i max = new Vector3i(8, 8, 8) - .offset(xDirection, xSize / 2) - .offset(yDirection, ySize / 2) - .offset(zDirection, 8); + .relative(xDirection, xSize / 2) + .relative(yDirection, ySize / 2) + .relative(zDirection, 8); final AxisAlignedBB bounds = new AxisAlignedBB( - Vector3d.copy(min).scale(1 / 16.0), - Vector3d.copy(max).scale(1 / 16.0) + Vector3d.atLowerCornerOf(min).scale(1 / 16.0), + Vector3d.atLowerCornerOf(max).scale(1 / 16.0) ); return VoxelShapes.or(getCableShape(zDirection), VoxelShapes.create(bounds)); @@ -454,7 +454,7 @@ public final class BusCableBlock extends Block { for (int sideIndex = 0; sideIndex < Constants.BLOCK_FACE_COUNT; sideIndex++) { final int cableBit = 1 << sideIndex; final int interfaceBit = cableBit << 6; - switch (state.get(FACING_TO_CONNECTION_MAP.get(Constants.DIRECTIONS[sideIndex]))) { + switch (state.getValue(FACING_TO_CONNECTION_MAP.get(Constants.DIRECTIONS[sideIndex]))) { case CABLE: index |= cableBit; break; @@ -466,7 +466,7 @@ public final class BusCableBlock extends Block { index = index << 1; - if (state.get(HAS_CABLE)) { + if (state.getValue(HAS_CABLE)) { index |= 1; } diff --git a/src/main/java/li/cil/oc2/common/block/ChargerBlock.java b/src/main/java/li/cil/oc2/common/block/ChargerBlock.java index 76383a1c..52c55d1f 100644 --- a/src/main/java/li/cil/oc2/common/block/ChargerBlock.java +++ b/src/main/java/li/cil/oc2/common/block/ChargerBlock.java @@ -16,10 +16,10 @@ import javax.annotation.Nullable; public final class ChargerBlock extends BreakableBlock { public ChargerBlock() { super(Properties - .create(Material.IRON) + .of(Material.METAL) .sound(SoundType.METAL) - .hardnessAndResistance(1.5f, 6.0f)); - setDefaultState(getStateContainer().getBaseState().with(HorizontalBlock.HORIZONTAL_FACING, Direction.NORTH)); + .strength(1.5f, 6.0f)); + registerDefaultState(getStateDefinition().any().setValue(HorizontalBlock.FACING, Direction.NORTH)); } /////////////////////////////////////////////////////////////////// @@ -27,13 +27,13 @@ public final class ChargerBlock extends BreakableBlock { @SuppressWarnings("deprecation") @Override public BlockState rotate(final BlockState state, final Rotation rot) { - return state.with(HorizontalBlock.HORIZONTAL_FACING, rot.rotate(state.get(HorizontalBlock.HORIZONTAL_FACING))); + return state.setValue(HorizontalBlock.FACING, rot.rotate(state.getValue(HorizontalBlock.FACING))); } @SuppressWarnings("deprecation") @Override public BlockState mirror(final BlockState state, final Mirror mirrorIn) { - return state.rotate(mirrorIn.toRotation(state.get(HorizontalBlock.HORIZONTAL_FACING))); + return state.rotate(mirrorIn.getRotation(state.getValue(HorizontalBlock.FACING))); } @Override @@ -49,14 +49,14 @@ public final class ChargerBlock extends BreakableBlock { @Override public BlockState getStateForPlacement(final BlockItemUseContext context) { - return super.getDefaultState().with(HorizontalBlock.HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite()); + return super.defaultBlockState().setValue(HorizontalBlock.FACING, context.getHorizontalDirection().getOpposite()); } /////////////////////////////////////////////////////////////////// @Override - protected void fillStateContainer(final StateContainer.Builder builder) { - super.fillStateContainer(builder); - builder.add(HorizontalBlock.HORIZONTAL_FACING); + protected void createBlockStateDefinition(final StateContainer.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(HorizontalBlock.FACING); } } diff --git a/src/main/java/li/cil/oc2/common/block/ComputerBlock.java b/src/main/java/li/cil/oc2/common/block/ComputerBlock.java index 551d0dfb..eafd523a 100644 --- a/src/main/java/li/cil/oc2/common/block/ComputerBlock.java +++ b/src/main/java/li/cil/oc2/common/block/ComputerBlock.java @@ -52,11 +52,11 @@ public final class ComputerBlock extends HorizontalBlock { // We bake the "screen" indent on the front into the collision shape to prevent stuff being // placeable on that side, such as network connectors, torches, etc. private static final VoxelShape NEG_Z_SHAPE = VoxelShapes.or( - Block.makeCuboidShape(0, 0, 1, 16, 16, 16), // main body - Block.makeCuboidShape(0, 15, 0, 16, 16, 1), // across top - Block.makeCuboidShape(0, 0, 0, 16, 6, 1), // across bottom - Block.makeCuboidShape(0, 0, 0, 1, 16, 1), // up left - Block.makeCuboidShape(15, 0, 0, 16, 16, 1) // up right + Block.box(0, 0, 1, 16, 16, 16), // main body + Block.box(0, 15, 0, 16, 16, 1), // across top + Block.box(0, 0, 0, 16, 6, 1), // across bottom + Block.box(0, 0, 0, 1, 16, 1), // up left + Block.box(15, 0, 0, 16, 16, 1) // up right ); private static final VoxelShape NEG_X_SHAPE = VoxelShapeUtils.rotateHorizontalClockwise(NEG_Z_SHAPE); private static final VoxelShape POS_Z_SHAPE = VoxelShapeUtils.rotateHorizontalClockwise(NEG_X_SHAPE); @@ -66,25 +66,25 @@ public final class ComputerBlock extends HorizontalBlock { public ComputerBlock() { super(Properties - .create(Material.IRON) + .of(Material.METAL) .sound(SoundType.METAL) - .hardnessAndResistance(1.5f, 6.0f)); - setDefaultState(getStateContainer().getBaseState().with(HORIZONTAL_FACING, Direction.NORTH)); + .strength(1.5f, 6.0f)); + registerDefaultState(getStateDefinition().any().setValue(FACING, Direction.NORTH)); } /////////////////////////////////////////////////////////////////// @Override - public void fillItemGroup(final ItemGroup group, final NonNullList items) { - super.fillItemGroup(group, items); + public void fillItemCategory(final ItemGroup group, final NonNullList items) { + super.fillItemCategory(group, items); items.add(getPreconfiguredComputer()); } @OnlyIn(Dist.CLIENT) @Override - public void addInformation(final ItemStack stack, @Nullable final IBlockReader world, final List tooltip, final ITooltipFlag advanced) { - super.addInformation(stack, world, tooltip, advanced); + public void appendHoverText(final ItemStack stack, @Nullable final IBlockReader world, final List tooltip, final ITooltipFlag advanced) { + super.appendHoverText(stack, world, tooltip, advanced); TooltipUtils.addEnergyConsumption(Config.computerEnergyPerTick, tooltip); TooltipUtils.addTileEntityInventoryInformation(stack, tooltip); } @@ -101,14 +101,14 @@ public final class ComputerBlock extends HorizontalBlock { @SuppressWarnings("deprecation") @Override - public boolean canProvidePower(final BlockState state) { + public boolean isSignalSource(final BlockState state) { return true; } @SuppressWarnings("deprecation") @Override - public int getWeakPower(final BlockState state, final IBlockReader world, final BlockPos pos, final Direction side) { - final TileEntity tileEntity = world.getTileEntity(pos); + public int getSignal(final BlockState state, final IBlockReader world, final BlockPos pos, final Direction side) { + final TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity != null) { // Redstone requests info for faces with external perspective. Capabilities treat // the Direction from internal perspective, so flip it. @@ -117,13 +117,13 @@ public final class ComputerBlock extends HorizontalBlock { .orElse(0); } - return super.getWeakPower(state, world, pos, side); + return super.getSignal(state, world, pos, side); } @SuppressWarnings("deprecation") @Override - public int getStrongPower(final BlockState state, final IBlockReader world, final BlockPos pos, final Direction side) { - return getWeakPower(state, world, pos, side); + public int getDirectSignal(final BlockState state, final IBlockReader world, final BlockPos pos, final Direction side) { + return getSignal(state, world, pos, side); } @Override @@ -134,7 +134,7 @@ public final class ComputerBlock extends HorizontalBlock { @SuppressWarnings("deprecation") @Override public void neighborChanged(final BlockState state, final World world, final BlockPos pos, final Block changedBlock, final BlockPos changedBlockPos, final boolean isMoving) { - final TileEntity tileEntity = world.getTileEntity(pos); + final TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof ComputerTileEntity) { final ComputerTileEntity computer = (ComputerTileEntity) tileEntity; computer.handleNeighborChanged(); @@ -144,7 +144,7 @@ public final class ComputerBlock extends HorizontalBlock { @SuppressWarnings("deprecation") @Override public VoxelShape getShape(final BlockState state, final IBlockReader world, final BlockPos pos, final ISelectionContext context) { - switch (state.get(HORIZONTAL_FACING)) { + switch (state.getValue(FACING)) { case NORTH: return NEG_Z_SHAPE; case SOUTH: @@ -159,21 +159,21 @@ public final class ComputerBlock extends HorizontalBlock { @SuppressWarnings("deprecation") @Override - public ActionResultType onBlockActivated(final BlockState state, final World world, final BlockPos pos, final PlayerEntity player, final Hand hand, final BlockRayTraceResult hit) { - final TileEntity tileEntity = world.getTileEntity(pos); + public ActionResultType use(final BlockState state, final World world, final BlockPos pos, final PlayerEntity player, final Hand hand, final BlockRayTraceResult hit) { + final TileEntity tileEntity = world.getBlockEntity(pos); if (!(tileEntity instanceof ComputerTileEntity)) { - return super.onBlockActivated(state, world, pos, player, hand, hit); + return super.use(state, world, pos, player, hand, hit); } final ComputerTileEntity computer = (ComputerTileEntity) tileEntity; - final ItemStack heldItem = player.getHeldItem(hand); - if (!world.isRemote()) { + final ItemStack heldItem = player.getItemInHand(hand); + if (!world.isClientSide) { if (Wrenches.isWrench(heldItem)) { if (player instanceof ServerPlayerEntity) { computer.openContainerScreen((ServerPlayerEntity) player); } } else { - if (player.isSneaking()) { + if (player.isShiftKeyDown()) { computer.start(); } else if (player instanceof ServerPlayerEntity) { computer.openTerminalScreen((ServerPlayerEntity) player); @@ -181,13 +181,13 @@ public final class ComputerBlock extends HorizontalBlock { } } - return world.isRemote() ? ActionResultType.SUCCESS : ActionResultType.CONSUME; + return world.isClientSide ? ActionResultType.SUCCESS : ActionResultType.CONSUME; } @Override - public void onBlockHarvested(final World world, final BlockPos pos, final BlockState state, final PlayerEntity player) { - final TileEntity tileEntity = world.getTileEntity(pos); - if (!world.isRemote() && tileEntity instanceof ComputerTileEntity) { + public void playerWillDestroy(final World world, final BlockPos pos, final BlockState state, final PlayerEntity player) { + final TileEntity tileEntity = world.getBlockEntity(pos); + if (!world.isClientSide && tileEntity instanceof ComputerTileEntity) { final ComputerTileEntity computer = (ComputerTileEntity) tileEntity; if (!computer.getItemStackHandlers().isEmpty()) { computer.getItemStackHandlers().exportDeviceDataToItemStacks(); @@ -195,25 +195,25 @@ public final class ComputerBlock extends HorizontalBlock { if (player.isCreative()) { final ItemStack stack = new ItemStack(Items.COMPUTER.get()); computer.exportToItemStack(stack); - spawnAsEntity(world, pos, stack); + popResource(world, pos, stack); } } } - super.onBlockHarvested(world, pos, state, player); + super.playerWillDestroy(world, pos, state, player); } @Override public BlockState getStateForPlacement(final BlockItemUseContext context) { - return super.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite()); + return super.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); } /////////////////////////////////////////////////////////////////// @Override - protected void fillStateContainer(final StateContainer.Builder builder) { - super.fillStateContainer(builder); - builder.add(HORIZONTAL_FACING); + protected void createBlockStateDefinition(final StateContainer.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java b/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java index b6000f40..f87e43d7 100644 --- a/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java +++ b/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java @@ -11,9 +11,9 @@ import net.minecraft.world.IBlockReader; public final class CreativeEnergyBlock extends Block { public CreativeEnergyBlock() { super(Properties - .create(Material.IRON) + .of(Material.METAL) .sound(SoundType.METAL) - .hardnessAndResistance(-1, 3600000) + .strength(-1, 3600000) .noDrops()); } diff --git a/src/main/java/li/cil/oc2/common/block/DiskDriveBlock.java b/src/main/java/li/cil/oc2/common/block/DiskDriveBlock.java index 574f2c6f..97d2df32 100644 --- a/src/main/java/li/cil/oc2/common/block/DiskDriveBlock.java +++ b/src/main/java/li/cil/oc2/common/block/DiskDriveBlock.java @@ -23,17 +23,17 @@ import net.minecraft.world.World; public final class DiskDriveBlock extends HorizontalBlock { public DiskDriveBlock() { super(Properties - .create(Material.IRON) + .of(Material.METAL) .sound(SoundType.METAL) - .hardnessAndResistance(1.5f, 6.0f)); - setDefaultState(getStateContainer().getBaseState().with(HORIZONTAL_FACING, Direction.NORTH)); + .strength(1.5f, 6.0f)); + registerDefaultState(getStateDefinition().any().setValue(FACING, Direction.NORTH)); } /////////////////////////////////////////////////////////////////// @Override public BlockState getStateForPlacement(final BlockItemUseContext context) { - return super.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite()); + return super.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); } @Override @@ -48,23 +48,23 @@ public final class DiskDriveBlock extends HorizontalBlock { @SuppressWarnings("deprecation") @Override - public ActionResultType onBlockActivated(final BlockState state, final World world, final BlockPos pos, final PlayerEntity player, final Hand hand, final BlockRayTraceResult hit) { - final TileEntity tileEntity = world.getTileEntity(pos); + public ActionResultType use(final BlockState state, final World world, final BlockPos pos, final PlayerEntity player, final Hand hand, final BlockRayTraceResult hit) { + final TileEntity tileEntity = world.getBlockEntity(pos); if (!(tileEntity instanceof DiskDriveTileEntity)) { - return super.onBlockActivated(state, world, pos, player, hand, hit); + return super.use(state, world, pos, player, hand, hit); } - if (world.isRemote()) { + if (world.isClientSide) { return ActionResultType.SUCCESS; } final DiskDriveTileEntity diskDrive = (DiskDriveTileEntity) tileEntity; - final ItemStack stack = player.getHeldItem(hand); + final ItemStack stack = player.getItemInHand(hand); - if (player.isSneaking()) { + if (player.isShiftKeyDown()) { diskDrive.eject(); } else { - player.setHeldItem(hand, diskDrive.insert(stack)); + player.setItemInHand(hand, diskDrive.insert(stack)); } return ActionResultType.CONSUME; @@ -73,8 +73,8 @@ public final class DiskDriveBlock extends HorizontalBlock { /////////////////////////////////////////////////////////////////// @Override - protected void fillStateContainer(final StateContainer.Builder builder) { - super.fillStateContainer(builder); - builder.add(HORIZONTAL_FACING); + protected void createBlockStateDefinition(final StateContainer.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING); } } diff --git a/src/main/java/li/cil/oc2/common/block/NetworkConnectorBlock.java b/src/main/java/li/cil/oc2/common/block/NetworkConnectorBlock.java index 4f3913b5..ad22a98d 100644 --- a/src/main/java/li/cil/oc2/common/block/NetworkConnectorBlock.java +++ b/src/main/java/li/cil/oc2/common/block/NetworkConnectorBlock.java @@ -20,29 +20,29 @@ import net.minecraft.world.World; import java.util.Objects; public final class NetworkConnectorBlock extends HorizontalFaceBlock { - private static final VoxelShape NEG_Z_SHAPE = Block.makeCuboidShape(5, 5, 7, 11, 11, 16); - private static final VoxelShape POS_Z_SHAPE = Block.makeCuboidShape(5, 5, 0, 11, 11, 9); - private static final VoxelShape NEG_X_SHAPE = Block.makeCuboidShape(7, 5, 5, 16, 11, 11); - private static final VoxelShape POS_X_SHAPE = Block.makeCuboidShape(0, 5, 5, 9, 11, 11); - private static final VoxelShape NEG_Y_SHAPE = Block.makeCuboidShape(5, 0, 5, 11, 9, 11); - private static final VoxelShape POS_Y_SHAPE = Block.makeCuboidShape(5, 7, 5, 11, 16, 11); + private static final VoxelShape NEG_Z_SHAPE = Block.box(5, 5, 7, 11, 11, 16); + private static final VoxelShape POS_Z_SHAPE = Block.box(5, 5, 0, 11, 11, 9); + private static final VoxelShape NEG_X_SHAPE = Block.box(7, 5, 5, 16, 11, 11); + private static final VoxelShape POS_X_SHAPE = Block.box(0, 5, 5, 9, 11, 11); + private static final VoxelShape NEG_Y_SHAPE = Block.box(5, 0, 5, 11, 9, 11); + private static final VoxelShape POS_Y_SHAPE = Block.box(5, 7, 5, 11, 16, 11); /////////////////////////////////////////////////////////////////// public NetworkConnectorBlock() { super(Properties - .create(Material.IRON) + .of(Material.METAL) .sound(SoundType.METAL) - .hardnessAndResistance(1.5f, 6.0f)); - setDefaultState(getStateContainer().getBaseState() - .with(HORIZONTAL_FACING, Direction.NORTH) - .with(FACE, AttachFace.WALL)); + .strength(1.5f, 6.0f)); + registerDefaultState(getStateDefinition().any() + .setValue(FACING, Direction.NORTH) + .setValue(FACE, AttachFace.WALL)); } /////////////////////////////////////////////////////////////////// public static Direction getFacing(final BlockState state) { - return HorizontalFaceBlock.getFacing(state); + return HorizontalFaceBlock.getConnectedDirection(state); } @Override @@ -58,8 +58,8 @@ public final class NetworkConnectorBlock extends HorizontalFaceBlock { @SuppressWarnings("deprecation") @Override public void neighborChanged(final BlockState state, final World world, final BlockPos pos, final Block changedBlock, final BlockPos changedBlockPos, final boolean isMoving) { - if (Objects.equals(changedBlockPos, pos.offset(getFacing(state).getOpposite()))) { - final TileEntity tileEntity = world.getTileEntity(pos); + if (Objects.equals(changedBlockPos, pos.relative(getFacing(state).getOpposite()))) { + final TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof NetworkConnectorTileEntity) { final NetworkConnectorTileEntity connector = (NetworkConnectorTileEntity) tileEntity; connector.setLocalInterfaceChanged(); @@ -70,9 +70,9 @@ public final class NetworkConnectorBlock extends HorizontalFaceBlock { @SuppressWarnings("deprecation") @Override public VoxelShape getShape(final BlockState state, final IBlockReader world, final BlockPos pos, final ISelectionContext context) { - switch (state.get(FACE)) { + switch (state.getValue(FACE)) { case WALL: - switch (state.get(HORIZONTAL_FACING)) { + switch (state.getValue(FACING)) { case EAST: return POS_X_SHAPE; case WEST: @@ -93,7 +93,7 @@ public final class NetworkConnectorBlock extends HorizontalFaceBlock { /////////////////////////////////////////////////////////////////// - protected void fillStateContainer(final StateContainer.Builder builder) { - builder.add(FACE, HORIZONTAL_FACING); + protected void createBlockStateDefinition(final StateContainer.Builder builder) { + builder.add(FACE, FACING); } } diff --git a/src/main/java/li/cil/oc2/common/block/NetworkHubBlock.java b/src/main/java/li/cil/oc2/common/block/NetworkHubBlock.java index 117effe0..125df074 100644 --- a/src/main/java/li/cil/oc2/common/block/NetworkHubBlock.java +++ b/src/main/java/li/cil/oc2/common/block/NetworkHubBlock.java @@ -18,17 +18,17 @@ import net.minecraft.world.World; public final class NetworkHubBlock extends HorizontalBlock { public NetworkHubBlock() { super(Properties - .create(Material.IRON) + .of(Material.METAL) .sound(SoundType.METAL) - .hardnessAndResistance(1.5f, 6.0f)); - setDefaultState(getStateContainer().getBaseState().with(HORIZONTAL_FACING, Direction.NORTH)); + .strength(1.5f, 6.0f)); + registerDefaultState(getStateDefinition().any().setValue(FACING, Direction.NORTH)); } /////////////////////////////////////////////////////////////////// @Override public BlockState getStateForPlacement(final BlockItemUseContext context) { - return super.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite()); + return super.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); } @Override @@ -44,7 +44,7 @@ public final class NetworkHubBlock extends HorizontalBlock { @SuppressWarnings("deprecation") @Override public void neighborChanged(final BlockState state, final World world, final BlockPos pos, final Block changedBlock, final BlockPos changedBlockPos, final boolean isMoving) { - final TileEntity tileEntity = world.getTileEntity(pos); + final TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof NetworkHubTileEntity) { final NetworkHubTileEntity hub = (NetworkHubTileEntity) tileEntity; hub.handleNeighborChanged(); @@ -54,8 +54,8 @@ public final class NetworkHubBlock extends HorizontalBlock { /////////////////////////////////////////////////////////////////// @Override - protected void fillStateContainer(final StateContainer.Builder builder) { - super.fillStateContainer(builder); - builder.add(HORIZONTAL_FACING); + protected void createBlockStateDefinition(final StateContainer.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING); } } diff --git a/src/main/java/li/cil/oc2/common/block/RedstoneInterfaceBlock.java b/src/main/java/li/cil/oc2/common/block/RedstoneInterfaceBlock.java index 21a3e5d7..cb80c695 100644 --- a/src/main/java/li/cil/oc2/common/block/RedstoneInterfaceBlock.java +++ b/src/main/java/li/cil/oc2/common/block/RedstoneInterfaceBlock.java @@ -18,17 +18,17 @@ import net.minecraft.world.IWorldReader; public final class RedstoneInterfaceBlock extends HorizontalBlock { public RedstoneInterfaceBlock() { super(Properties - .create(Material.IRON) + .of(Material.METAL) .sound(SoundType.METAL) - .hardnessAndResistance(1.5f, 6.0f)); - setDefaultState(getStateContainer().getBaseState().with(HORIZONTAL_FACING, Direction.NORTH)); + .strength(1.5f, 6.0f)); + registerDefaultState(getStateDefinition().any().setValue(FACING, Direction.NORTH)); } /////////////////////////////////////////////////////////////////// @Override public BlockState getStateForPlacement(final BlockItemUseContext context) { - return super.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite()); + return super.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); } @Override @@ -43,14 +43,14 @@ public final class RedstoneInterfaceBlock extends HorizontalBlock { @SuppressWarnings("deprecation") @Override - public boolean canProvidePower(final BlockState state) { + public boolean isSignalSource(final BlockState state) { return true; } @SuppressWarnings("deprecation") @Override - public int getWeakPower(final BlockState state, final IBlockReader world, final BlockPos pos, final Direction side) { - final TileEntity tileEntity = world.getTileEntity(pos); + public int getSignal(final BlockState state, final IBlockReader world, final BlockPos pos, final Direction side) { + final TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof RedstoneInterfaceTileEntity) { final RedstoneInterfaceTileEntity redstoneInterface = (RedstoneInterfaceTileEntity) tileEntity; // Redstone requests info for faces with external perspective. We treat @@ -58,7 +58,7 @@ public final class RedstoneInterfaceBlock extends HorizontalBlock { return redstoneInterface.getOutputForDirection(side.getOpposite()); } - return super.getWeakPower(state, world, pos, side); + return super.getSignal(state, world, pos, side); } @Override @@ -68,15 +68,15 @@ public final class RedstoneInterfaceBlock extends HorizontalBlock { @SuppressWarnings("deprecation") @Override - public int getStrongPower(final BlockState state, final IBlockReader world, final BlockPos pos, final Direction side) { - return getWeakPower(state, world, pos, side); + public int getDirectSignal(final BlockState state, final IBlockReader world, final BlockPos pos, final Direction side) { + return getSignal(state, world, pos, side); } /////////////////////////////////////////////////////////////////// @Override - protected void fillStateContainer(final StateContainer.Builder builder) { - super.fillStateContainer(builder); - builder.add(HORIZONTAL_FACING); + protected void createBlockStateDefinition(final StateContainer.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING); } } diff --git a/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java index 89ba55b9..5f6ee021 100644 --- a/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java +++ b/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java @@ -54,7 +54,7 @@ public abstract class AbstractGroupingDeviceBusElement removedChunks = new HashSet<>(trackedChunks); removedChunks.removeAll(newTrackedChunks); diff --git a/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java index 28c26da5..f228476a 100644 --- a/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java +++ b/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java @@ -40,19 +40,19 @@ public class TileEntityDeviceBusElement extends AbstractGroupingBlockDeviceBusEl /////////////////////////////////////////////////////////////////// @Override - public IWorld getWorld() { - return tileEntity.getWorld(); + public IWorld getLevel() { + return tileEntity.getLevel(); } @Override public BlockPos getPosition() { - return tileEntity.getPos(); + return tileEntity.getBlockPos(); } @Override public Optional>> getNeighbors() { - final World world = tileEntity.getWorld(); - if (world == null || world.isRemote()) { + final World world = tileEntity.getLevel(); + if (world == null || world.isClientSide) { return Optional.empty(); } @@ -62,14 +62,14 @@ public class TileEntityDeviceBusElement extends AbstractGroupingBlockDeviceBusEl continue; } - final BlockPos neighborPos = tileEntity.getPos().offset(neighborDirection); + final BlockPos neighborPos = tileEntity.getBlockPos().relative(neighborDirection); final ChunkPos chunkPos = new ChunkPos(neighborPos); - if (!world.chunkExists(chunkPos.x, chunkPos.z)) { + if (!world.hasChunk(chunkPos.x, chunkPos.z)) { return Optional.empty(); } - final TileEntity tileEntity = world.getTileEntity(neighborPos); + final TileEntity tileEntity = world.getBlockEntity(neighborPos); if (tileEntity == null) { continue; } @@ -84,18 +84,18 @@ public class TileEntityDeviceBusElement extends AbstractGroupingBlockDeviceBusEl } public void handleNeighborChanged(final BlockPos pos) { - final World world = tileEntity.getWorld(); - if (world == null || world.isRemote()) { + final World world = tileEntity.getLevel(); + if (world == null || world.isClientSide) { return; } - final BlockPos toPos = pos.subtract(tileEntity.getPos()); - final Direction direction = Direction.byLong(toPos.getX(), toPos.getY(), toPos.getZ()); + final BlockPos toPos = pos.subtract(tileEntity.getBlockPos()); + final Direction direction = Direction.fromNormal(toPos.getX(), toPos.getY(), toPos.getZ()); if (direction == null) { return; } - final int index = direction.getIndex(); + final int index = direction.get3DDataValue(); final HashSet newDevices = new HashSet<>(); if (canDetectDevicesTowards(direction)) { @@ -112,7 +112,7 @@ public class TileEntityDeviceBusElement extends AbstractGroupingBlockDeviceBusEl } public void initialize() { - final World world = requireNonNull(tileEntity.getWorld()); + final World world = requireNonNull(tileEntity.getLevel()); ServerScheduler.schedule(world, () -> { if (tileEntity.isRemoved()) { return; @@ -144,16 +144,16 @@ public class TileEntityDeviceBusElement extends AbstractGroupingBlockDeviceBusEl private void scanNeighborsForDevices() { for (final Direction direction : Constants.DIRECTIONS) { - handleNeighborChanged(tileEntity.getPos().offset(direction)); + handleNeighborChanged(tileEntity.getBlockPos().relative(direction)); } } private void scheduleBusScanInAdjacentBusElements() { - final World world = requireNonNull(tileEntity.getWorld()); - final BlockPos pos = tileEntity.getPos(); + final World world = requireNonNull(tileEntity.getLevel()); + final BlockPos pos = tileEntity.getBlockPos(); for (final Direction direction : Constants.DIRECTIONS) { - final BlockPos neighborPos = pos.offset(direction); - final TileEntity tileEntity = WorldUtils.getTileEntityIfChunkExists(world, neighborPos); + final BlockPos neighborPos = pos.relative(direction); + final TileEntity tileEntity = WorldUtils.getBlockEntityIfChunkExists(world, neighborPos); if (tileEntity == null) { continue; } diff --git a/src/main/java/li/cil/oc2/common/bus/device/data/FileSystems.java b/src/main/java/li/cil/oc2/common/bus/device/data/FileSystems.java index e9f82de9..b46a27f9 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/data/FileSystems.java +++ b/src/main/java/li/cil/oc2/common/bus/device/data/FileSystems.java @@ -54,7 +54,7 @@ public final class FileSystems { LOGGER.info("Searching for datapack filesystems..."); final Collection fileSystemDescriptorLocations = resourceManager - .getAllResourceLocations("file_systems", s -> s.endsWith(".json")); + .listResources("file_systems", s -> s.endsWith(".json")); final ArrayList fileSystems = new ArrayList<>(); final Object2IntArrayMap fileSystemOrder = new Object2IntArrayMap<>(); @@ -117,7 +117,7 @@ public final class FileSystems { public CompletableFuture reload(final IFutureReloadListener.IStage stage, final IResourceManager resourceManager, final IProfiler preparationsProfiler, final IProfiler reloadProfiler, final Executor backgroundExecutor, final Executor gameExecutor) { return CompletableFuture .runAsync(() -> FileSystems.reload(resourceManager), backgroundExecutor) - .thenCompose(stage::markCompleteAwaitingOthers); + .thenCompose(stage::wait); } } } diff --git a/src/main/java/li/cil/oc2/common/bus/device/item/AbstractBlockDeviceVMDevice.java b/src/main/java/li/cil/oc2/common/bus/device/item/AbstractBlockDeviceVMDevice.java index 2b0d09e5..2130f054 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/item/AbstractBlockDeviceVMDevice.java +++ b/src/main/java/li/cil/oc2/common/bus/device/item/AbstractBlockDeviceVMDevice.java @@ -111,14 +111,14 @@ public abstract class AbstractBlockDeviceVMDevice blobHandle = BlobStorage.validateHandle(blobHandle)); } if (blobHandle != null) { - nbt.putUniqueId(BLOB_HANDLE_TAG_NAME, blobHandle); + nbt.putUUID(BLOB_HANDLE_TAG_NAME, blobHandle); } } @Override public void importFromItemStack(final CompoundNBT nbt) { - if (nbt.hasUniqueId(BLOB_HANDLE_TAG_NAME)) { - blobHandle = nbt.getUniqueId(BLOB_HANDLE_TAG_NAME); + if (nbt.hasUUID(BLOB_HANDLE_TAG_NAME)) { + blobHandle = nbt.getUUID(BLOB_HANDLE_TAG_NAME); } } @@ -141,7 +141,7 @@ public abstract class AbstractBlockDeviceVMDevice @Override public void deserializeNBT(final CompoundNBT tag) { - lastOperation = MathHelper.clamp(tag.getLong(LAST_OPERATION_TAG_NAME), 0, entity.getEntityWorld().getGameTime()); + lastOperation = MathHelper.clamp(tag.getLong(LAST_OPERATION_TAG_NAME), 0, entity.getCommandSenderWorld().getGameTime()); } @Override @@ -97,7 +97,7 @@ public final class BlockOperationsModuleDevice extends IdentityProxy beginCooldown(); - final World world = entity.getEntityWorld(); + final World world = entity.getCommandSenderWorld(); if (!(world instanceof ServerWorld)) { return false; } @@ -107,7 +107,7 @@ public final class BlockOperationsModuleDevice extends IdentityProxy final List oldItems = getItemsInRange(); - if (!tryHarvestBlock(world, entity.getPosition().offset(getAdjustedDirection(direction)))) { + if (!tryHarvestBlock(world, entity.blockPosition().relative(getAdjustedDirection(direction)))) { return false; } @@ -131,7 +131,7 @@ public final class BlockOperationsModuleDevice extends IdentityProxy beginCooldown(); - final World world = entity.getEntityWorld(); + final World world = entity.getCommandSenderWorld(); if (!(world instanceof ServerWorld)) { return false; } @@ -144,10 +144,10 @@ public final class BlockOperationsModuleDevice extends IdentityProxy return false; } - final BlockPos blockPos = entity.getPosition().offset(getAdjustedDirection(direction)); + final BlockPos blockPos = entity.blockPosition().relative(getAdjustedDirection(direction)); final Direction side = getAdjustedDirection(direction).getOpposite(); final BlockRayTraceResult hit = new BlockRayTraceResult( - Vector3d.copyCentered(blockPos).add(Vector3d.copy(side.getDirectionVec()).scale(0.5)), + Vector3d.atCenterOf(blockPos).add(Vector3d.atCenterOf(side.getNormal()).scale(0.5)), side, blockPos, false); @@ -157,8 +157,8 @@ public final class BlockOperationsModuleDevice extends IdentityProxy final ServerPlayerEntity player = FakePlayerUtils.getFakePlayer((ServerWorld) world, entity); final BlockItemUseContext context = new BlockItemUseContext(player, Hand.MAIN_HAND, itemStack, hit); - final ActionResultType result = blockItem.tryPlace(context); - if (!result.isSuccessOrConsume()) { + final ActionResultType result = blockItem.place(context); + if (!result.consumesAction()) { return false; } @@ -171,7 +171,7 @@ public final class BlockOperationsModuleDevice extends IdentityProxy @Callback(synchronize = false) public int durability() { - return identity.getMaxDamage() - identity.getDamage(); + return identity.getMaxDamage() - identity.getDamageValue(); } @Callback @@ -182,7 +182,7 @@ public final class BlockOperationsModuleDevice extends IdentityProxy beginCooldown(); - if (identity.getDamage() == 0) { + if (identity.getDamageValue() == 0) { return false; } @@ -196,7 +196,7 @@ public final class BlockOperationsModuleDevice extends IdentityProxy return false; } - final int repairValue = tier.getMaxUses(); + final int repairValue = tier.getUses(); if (repairValue == 0) { return false; } @@ -206,7 +206,7 @@ public final class BlockOperationsModuleDevice extends IdentityProxy return false; } - identity.setDamage(identity.getDamage() - repairValue); + identity.setDamageValue(identity.getDamageValue() - repairValue); return true; } @@ -214,11 +214,11 @@ public final class BlockOperationsModuleDevice extends IdentityProxy /////////////////////////////////////////////////////////////////// private void beginCooldown() { - lastOperation = entity.getEntityWorld().getGameTime(); + lastOperation = entity.getCommandSenderWorld().getGameTime(); } private boolean isOnCooldown() { - return entity.getEntityWorld().getGameTime() - lastOperation < COOLDOWN; + return entity.getCommandSenderWorld().getGameTime() - lastOperation < COOLDOWN; } private Direction getAdjustedDirection(@Nullable final PlacementDirection placementDirection) { @@ -228,16 +228,16 @@ public final class BlockOperationsModuleDevice extends IdentityProxy return Direction.DOWN; } else { Direction direction = Direction.SOUTH; - final int horizontalIndex = entity.getHorizontalFacing().getHorizontalIndex(); + final int horizontalIndex = entity.getDirection().get2DDataValue(); for (int i = 0; i < horizontalIndex; i++) { - direction = direction.rotateY(); + direction = direction.getClockWise(); } return direction; } } private List getItemsInRange() { - return entity.getEntityWorld().getEntitiesWithinAABB(ItemEntity.class, entity.getBoundingBox().grow(2)); + return entity.getCommandSenderWorld().getEntitiesOfClass(ItemEntity.class, entity.getBoundingBox().inflate(2)); } private boolean tryHarvestBlock(final World world, final BlockPos blockPos) { @@ -253,10 +253,10 @@ public final class BlockOperationsModuleDevice extends IdentityProxy return false; } - final TileEntity tileEntity = world.getTileEntity(blockPos); + final TileEntity tileEntity = world.getBlockEntity(blockPos); final Block block = blockState.getBlock(); final boolean isCommandBlock = block instanceof CommandBlockBlock || block instanceof StructureBlock || block instanceof JigsawBlock; - if (isCommandBlock && !player.canUseCommandBlock()) { + if (isCommandBlock && !player.canUseGameMasterBlocks()) { return false; } @@ -273,7 +273,7 @@ public final class BlockOperationsModuleDevice extends IdentityProxy return false; } - if (identity.attemptDamageItem(1, world.rand, null)) { + if (identity.hurt(1, world.random, null)) { return false; } @@ -281,8 +281,8 @@ public final class BlockOperationsModuleDevice extends IdentityProxy return false; } - block.onPlayerDestroy(world, blockPos, blockState); - block.harvestBlock(world, player, blockPos, blockState, tileEntity, ItemStack.EMPTY); + block.destroy(world, blockPos, blockState); + block.playerDestroy(world, player, blockPos, blockState, tileEntity, ItemStack.EMPTY); return true; } diff --git a/src/main/java/li/cil/oc2/common/bus/device/item/InventoryOperationsModuleDevice.java b/src/main/java/li/cil/oc2/common/bus/device/item/InventoryOperationsModuleDevice.java index ced27f8b..6467399c 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/item/InventoryOperationsModuleDevice.java +++ b/src/main/java/li/cil/oc2/common/bus/device/item/InventoryOperationsModuleDevice.java @@ -78,7 +78,7 @@ public final class InventoryOperationsModuleDevice extends IdentityProxy getItemStackHandlersInDirection(final Direction direction) { - final Vector3i directionVec = direction.getDirectionVec(); - return getItemStackHandlersAt(entity.getPositionVec().add(Vector3d.copy(directionVec)), direction.getOpposite()); + final Vector3i directionVec = direction.getNormal(); + return getItemStackHandlersAt(entity.position().add(Vector3d.atCenterOf(directionVec)), direction.getOpposite()); } private Stream getItemStackHandlersAt(final Vector3d position, final Direction side) { @@ -218,8 +218,8 @@ public final class InventoryOperationsModuleDevice extends IdentityProxy getEntityItemHandlersAt(final Vector3d position, final Direction side) { - final AxisAlignedBB bounds = AxisAlignedBB.fromVector(position.subtract(0.5, 0.5, 0.5)); - return entity.getEntityWorld().getEntitiesWithinAABBExcludingEntity(entity, bounds).stream() + final AxisAlignedBB bounds = AxisAlignedBB.unitCubeFromLowerCorner(position.subtract(0.5, 0.5, 0.5)); + return entity.getCommandSenderWorld().getEntities(entity, bounds).stream() .map(e -> e.getCapability(Capabilities.ITEM_HANDLER, side)) .filter(LazyOptional::isPresent) .map(c -> c.orElseThrow(AssertionError::new)); @@ -227,7 +227,7 @@ public final class InventoryOperationsModuleDevice extends IdentityProxy getBlockItemHandlersAt(final Vector3d position, final Direction side) { final BlockPos pos = new BlockPos(position); - final TileEntity tileEntity = entity.getEntityWorld().getTileEntity(pos); + final TileEntity tileEntity = entity.getCommandSenderWorld().getBlockEntity(pos); if (tileEntity == null) { return Stream.empty(); } @@ -241,7 +241,7 @@ public final class InventoryOperationsModuleDevice extends IdentityProxy getItemsInRange() { - return entity.getEntityWorld().getEntitiesWithinAABB(ItemEntity.class, entity.getBoundingBox().grow(1)); + return entity.getCommandSenderWorld().getEntitiesOfClass(ItemEntity.class, entity.getBoundingBox().inflate(1)); } private int takeFromWorld(final int count) { @@ -298,7 +298,7 @@ public final class InventoryOperationsModuleDevice extends IdentityProxy implements VMDe if (device != null) { blobHandle = BlobStorage.validateHandle(blobHandle); - tag.putUniqueId(BLOB_HANDLE_TAG_NAME, blobHandle); + tag.putUUID(BLOB_HANDLE_TAG_NAME, blobHandle); jobHandle = BlobStorage.submitSave(blobHandle, new PhysicalMemoryInputStream(device)); } @@ -96,8 +96,8 @@ public final class MemoryDevice extends IdentityProxy implements VMDe @Override public void deserializeNBT(final CompoundNBT tag) { - if (tag.hasUniqueId(BLOB_HANDLE_TAG_NAME)) { - blobHandle = tag.getUniqueId(BLOB_HANDLE_TAG_NAME); + if (tag.hasUUID(BLOB_HANDLE_TAG_NAME)) { + blobHandle = tag.getUUID(BLOB_HANDLE_TAG_NAME); } if (tag.contains(ADDRESS_TAG_NAME, NBTTagIds.TAG_LONG)) { address.set(tag.getLong(ADDRESS_TAG_NAME)); diff --git a/src/main/java/li/cil/oc2/common/bus/device/item/RedstoneInterfaceCardItemDevice.java b/src/main/java/li/cil/oc2/common/bus/device/item/RedstoneInterfaceCardItemDevice.java index 6fd98215..9e4202f0 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/item/RedstoneInterfaceCardItemDevice.java +++ b/src/main/java/li/cil/oc2/common/bus/device/item/RedstoneInterfaceCardItemDevice.java @@ -64,7 +64,7 @@ public final class RedstoneInterfaceCardItemDevice extends IdentityProxy LazyOptional getCapability(@Nonnull final Capability capability, @Nullable final Direction side) { if (capability == Capabilities.REDSTONE_EMITTER && side != null) { - return LazyOptional.of(() -> capabilities[side.getIndex()]).cast(); + return LazyOptional.of(() -> capabilities[side.get3DDataValue()]).cast(); } return LazyOptional.empty(); @@ -95,37 +95,37 @@ public final class RedstoneInterfaceCardItemDevice extends IdentityProxy getDevice(final BlockDeviceQuery query) { - final World world = query.getWorld(); + final World world = query.getLevel(); final BlockPos position = query.getQueryPosition(); final BlockState blockState = world.getBlockState(position); diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/block/DiskDriveDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/block/DiskDriveDeviceProvider.java index 3c9f26e0..b0fa07c7 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/provider/block/DiskDriveDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/block/DiskDriveDeviceProvider.java @@ -17,7 +17,7 @@ public final class DiskDriveDeviceProvider extends AbstractTileEntityDeviceProvi protected LazyOptional getBlockDevice(final BlockDeviceQuery query, final DiskDriveTileEntity tileEntity) { // We only allow connecting to exactly one face of the disk drive to ensure only one // bus (and thus, one VM) will access the device at any single time. - if (query.getQuerySide() != tileEntity.getBlockState().get(HorizontalBlock.HORIZONTAL_FACING)) { + if (query.getQuerySide() != tileEntity.getBlockState().getValue(HorizontalBlock.FACING)) { return LazyOptional.empty(); } diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractTileEntityDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractTileEntityDeviceProvider.java index 39d14807..765373ea 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractTileEntityDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractTileEntityDeviceProvider.java @@ -25,7 +25,7 @@ public abstract class AbstractTileEntityDeviceProvider ext @SuppressWarnings("unchecked") @Override public final LazyOptional getDevice(final BlockDeviceQuery query) { - final TileEntity tileEntity = WorldUtils.getTileEntityIfChunkExists(query.getWorld(), query.getQueryPosition()); + final TileEntity tileEntity = WorldUtils.getBlockEntityIfChunkExists(query.getLevel(), query.getQueryPosition()); if (tileEntity == null) { return LazyOptional.empty(); } diff --git a/src/main/java/li/cil/oc2/common/bus/device/util/Devices.java b/src/main/java/li/cil/oc2/common/bus/device/util/Devices.java index f185572d..3b1113ac 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/util/Devices.java +++ b/src/main/java/li/cil/oc2/common/bus/device/util/Devices.java @@ -24,8 +24,8 @@ import static java.util.Objects.requireNonNull; public final class Devices { public static BlockDeviceQuery makeQuery(final TileEntity tileEntity, @Nullable final Direction side) { - final World world = requireNonNull(tileEntity.getWorld()); - final BlockPos pos = tileEntity.getPos(); + final World world = requireNonNull(tileEntity.getLevel()); + final BlockPos pos = tileEntity.getBlockPos(); return new BlockQuery(world, pos, side); } @@ -106,7 +106,7 @@ public final class Devices { } @Override - public World getWorld() { + public World getLevel() { return world; } diff --git a/src/main/java/li/cil/oc2/common/container/AbstractContainer.java b/src/main/java/li/cil/oc2/common/container/AbstractContainer.java index 52adc638..088d507a 100644 --- a/src/main/java/li/cil/oc2/common/container/AbstractContainer.java +++ b/src/main/java/li/cil/oc2/common/container/AbstractContainer.java @@ -21,46 +21,46 @@ public abstract class AbstractContainer extends Container { } @Override - public ItemStack transferStackInSlot(final PlayerEntity player, final int index) { - final Slot from = inventorySlots.get(index); + public ItemStack quickMoveStack(final PlayerEntity player, final int index) { + final Slot from = slots.get(index); if (from == null) { return ItemStack.EMPTY; } - final ItemStack stack = from.getStack().copy(); + final ItemStack stack = from.getItem().copy(); if (stack.isEmpty()) { return ItemStack.EMPTY; } - final boolean intoPlayerInventory = from.inventory != player.inventory; - final ItemStack fromStack = from.getStack(); + final boolean intoPlayerInventory = from.container != player.inventory; + final ItemStack fromStack = from.getItem(); final int step, begin; if (intoPlayerInventory) { step = -1; - begin = inventorySlots.size() - 1; + begin = slots.size() - 1; } else { step = 1; begin = 0; } if (fromStack.getMaxStackSize() > 1) { - for (int i = begin; i >= 0 && i < inventorySlots.size(); i += step) { - final Slot into = inventorySlots.get(i); - if (into.inventory == from.inventory) { + for (int i = begin; i >= 0 && i < slots.size(); i += step) { + final Slot into = slots.get(i); + if (into.container == from.container) { continue; } - final ItemStack intoStack = into.getStack(); + final ItemStack intoStack = into.getItem(); if (intoStack.isEmpty()) { continue; } - final boolean itemsAreEqual = fromStack.isItemEqual(intoStack) && ItemStack.areItemStackTagsEqual(fromStack, intoStack); + final boolean itemsAreEqual = fromStack.sameItem(intoStack) && ItemStack.tagMatches(fromStack, intoStack); if (!itemsAreEqual) { continue; } - final int maxSizeInSlot = Math.min(fromStack.getMaxStackSize(), into.getItemStackLimit(stack)); + final int maxSizeInSlot = Math.min(fromStack.getMaxStackSize(), into.getMaxStackSize(stack)); final int spaceInSlot = maxSizeInSlot - intoStack.getCount(); if (spaceInSlot <= 0) { continue; @@ -71,39 +71,39 @@ public abstract class AbstractContainer extends Container { continue; } - intoStack.grow(from.decrStackSize(itemsMoved).getCount()); - into.onSlotChanged(); + intoStack.grow(from.remove(itemsMoved).getCount()); + into.setChanged(); - if (from.getStack().isEmpty()) { + if (from.getItem().isEmpty()) { break; } } } - for (int i = begin; i >= 0 && i < inventorySlots.size(); i += step) { - if (from.getStack().isEmpty()) { + for (int i = begin; i >= 0 && i < slots.size(); i += step) { + if (from.getItem().isEmpty()) { break; } - final Slot into = inventorySlots.get(i); - if (into.inventory == from.inventory) { + final Slot into = slots.get(i); + if (into.container == from.container) { continue; } - if (into.getHasStack()) { + if (into.hasItem()) { continue; } - if (!into.isItemValid(fromStack)) { + if (!into.mayPlace(fromStack)) { continue; } - final int maxSizeInSlot = Math.min(fromStack.getMaxStackSize(), into.getItemStackLimit(fromStack)); + final int maxSizeInSlot = Math.min(fromStack.getMaxStackSize(), into.getMaxStackSize(fromStack)); final int itemsMoved = Math.min(maxSizeInSlot, fromStack.getCount()); - into.putStack(from.decrStackSize(itemsMoved)); + into.set(from.remove(itemsMoved)); } - return from.getStack().getCount() < stack.getCount() ? from.getStack() : ItemStack.EMPTY; + return from.getItem().getCount() < stack.getCount() ? from.getItem() : ItemStack.EMPTY; } protected int createPlayerInventoryAndHotbarSlots(final PlayerInventory inventory, final int startX, final int startY) { diff --git a/src/main/java/li/cil/oc2/common/container/ComputerInventoryContainer.java b/src/main/java/li/cil/oc2/common/container/ComputerInventoryContainer.java index 0b2e1f02..2bf9e5f1 100644 --- a/src/main/java/li/cil/oc2/common/container/ComputerInventoryContainer.java +++ b/src/main/java/li/cil/oc2/common/container/ComputerInventoryContainer.java @@ -17,7 +17,7 @@ public final class ComputerInventoryContainer extends AbstractContainer { @Nullable public static ComputerInventoryContainer create(final int id, final PlayerInventory playerInventory, final PacketBuffer data) { final BlockPos pos = data.readBlockPos(); - final TileEntity tileEntity = playerInventory.player.getEntityWorld().getTileEntity(pos); + final TileEntity tileEntity = playerInventory.player.getCommandSenderWorld().getBlockEntity(pos); if (!(tileEntity instanceof ComputerTileEntity)) { return null; } @@ -66,7 +66,7 @@ public final class ComputerInventoryContainer extends AbstractContainer { /////////////////////////////////////////////////////////////////// @Override - public boolean canInteractWith(final PlayerEntity player) { - return isWithinUsableDistance(IWorldPosCallable.of(computer.getWorld(), computer.getPos()), player, Blocks.COMPUTER.get()); + public boolean stillValid(final PlayerEntity player) { + return stillValid(IWorldPosCallable.create(computer.getLevel(), computer.getBlockPos()), player, Blocks.COMPUTER.get()); } } diff --git a/src/main/java/li/cil/oc2/common/container/ComputerTerminalContainer.java b/src/main/java/li/cil/oc2/common/container/ComputerTerminalContainer.java index 30e8f551..8ca4958d 100644 --- a/src/main/java/li/cil/oc2/common/container/ComputerTerminalContainer.java +++ b/src/main/java/li/cil/oc2/common/container/ComputerTerminalContainer.java @@ -21,7 +21,7 @@ public final class ComputerTerminalContainer extends AbstractContainer { @Nullable public static ComputerTerminalContainer create(final int id, final PlayerInventory playerInventory, final PacketBuffer data) { final BlockPos pos = data.readBlockPos(); - final TileEntity tileEntity = playerInventory.player.getEntityWorld().getTileEntity(pos); + final TileEntity tileEntity = playerInventory.player.getCommandSenderWorld().getBlockEntity(pos); if (!(tileEntity instanceof ComputerTileEntity)) { return null; } @@ -42,8 +42,8 @@ public final class ComputerTerminalContainer extends AbstractContainer { this.computer.addTerminalUser(player); - assertIntArraySize(energyInfo, ENERGY_INFO_SIZE); - trackIntArray(energyInfo); + checkContainerDataCount(energyInfo, ENERGY_INFO_SIZE); + addDataSlots(energyInfo); } /////////////////////////////////////////////////////////////////// @@ -65,13 +65,13 @@ public final class ComputerTerminalContainer extends AbstractContainer { } @Override - public boolean canInteractWith(final PlayerEntity player) { - return isWithinUsableDistance(IWorldPosCallable.of(computer.getWorld(), computer.getPos()), player, Blocks.COMPUTER.get()); + public boolean stillValid(final PlayerEntity player) { + return stillValid(IWorldPosCallable.create(computer.getLevel(), computer.getBlockPos()), player, Blocks.COMPUTER.get()); } @Override - public void onContainerClosed(final PlayerEntity player) { - super.onContainerClosed(player); + public void removed(final PlayerEntity player) { + super.removed(player); this.computer.removeTerminalUser(player); } diff --git a/src/main/java/li/cil/oc2/common/container/RobotContainer.java b/src/main/java/li/cil/oc2/common/container/RobotContainer.java index ecf5687c..af03f386 100644 --- a/src/main/java/li/cil/oc2/common/container/RobotContainer.java +++ b/src/main/java/li/cil/oc2/common/container/RobotContainer.java @@ -16,7 +16,7 @@ public final class RobotContainer extends AbstractContainer { @Nullable public static RobotContainer create(final int id, final PlayerInventory inventory, final PacketBuffer data) { final int entityId = data.readVarInt(); - final Entity entity = inventory.player.getEntityWorld().getEntityByID(entityId); + final Entity entity = inventory.player.getCommandSenderWorld().getEntity(entityId); if (!(entity instanceof RobotEntity)) { return null; } @@ -76,7 +76,7 @@ public final class RobotContainer extends AbstractContainer { } @Override - public boolean canInteractWith(final PlayerEntity player) { - return robot.isEntityInRange(player, 8); + public boolean stillValid(final PlayerEntity player) { + return robot.closerThan(player, 8); } } diff --git a/src/main/java/li/cil/oc2/common/container/RobotTerminalContainer.java b/src/main/java/li/cil/oc2/common/container/RobotTerminalContainer.java index 99017eed..53346fc4 100644 --- a/src/main/java/li/cil/oc2/common/container/RobotTerminalContainer.java +++ b/src/main/java/li/cil/oc2/common/container/RobotTerminalContainer.java @@ -21,7 +21,7 @@ public final class RobotTerminalContainer extends AbstractContainer { @Nullable public static RobotTerminalContainer create(final int id, final PlayerInventory inventory, final PacketBuffer data) { final int entityId = data.readVarInt(); - final Entity entity = inventory.player.getEntityWorld().getEntityByID(entityId); + final Entity entity = inventory.player.getCommandSenderWorld().getEntity(entityId); if (!(entity instanceof RobotEntity)) { return null; } @@ -40,8 +40,8 @@ public final class RobotTerminalContainer extends AbstractContainer { this.robot = robot; this.energyInfo = energyInfo; - assertIntArraySize(energyInfo, ENERGY_INFO_SIZE); - trackIntArray(energyInfo); + checkContainerDataCount(energyInfo, ENERGY_INFO_SIZE); + addDataSlots(energyInfo); final ItemStackHandler inventory = robot.getInventory(); for (int slot = 0; slot < inventory.getSlots(); slot++) { @@ -69,7 +69,7 @@ public final class RobotTerminalContainer extends AbstractContainer { } @Override - public boolean canInteractWith(final PlayerEntity player) { - return robot.isEntityInRange(player, 8); + public boolean stillValid(final PlayerEntity player) { + return robot.closerThan(player, 8); } } diff --git a/src/main/java/li/cil/oc2/common/container/TypedSlotItemHandler.java b/src/main/java/li/cil/oc2/common/container/TypedSlotItemHandler.java index f9ed4e4f..83332cb4 100644 --- a/src/main/java/li/cil/oc2/common/container/TypedSlotItemHandler.java +++ b/src/main/java/li/cil/oc2/common/container/TypedSlotItemHandler.java @@ -23,11 +23,11 @@ public final class TypedSlotItemHandler extends SlotItemHandler { @Nullable @Override - public Pair getBackground() { - if (getHasStack()) { - return super.getBackground(); + public Pair getNoItemIcon() { + if (hasItem()) { + return super.getNoItemIcon(); } else { - return Pair.of(PlayerContainer.LOCATION_BLOCKS_TEXTURE, deviceType.getBackgroundIcon()); + return Pair.of(PlayerContainer.BLOCK_ATLAS, deviceType.getBackgroundIcon()); } } } diff --git a/src/main/java/li/cil/oc2/common/entity/Entities.java b/src/main/java/li/cil/oc2/common/entity/Entities.java index e5723c8a..ac1e6592 100644 --- a/src/main/java/li/cil/oc2/common/entity/Entities.java +++ b/src/main/java/li/cil/oc2/common/entity/Entities.java @@ -16,7 +16,7 @@ public final class Entities { /////////////////////////////////////////////////////////////////// - public static final RegistryObject> ROBOT = register("robot", RobotEntity::new, EntityClassification.MISC, b -> b.size(14f / 16f, 14f / 16f).immuneToFire().disableSummoning()); + public static final RegistryObject> ROBOT = register("robot", RobotEntity::new, EntityClassification.MISC, b -> b.sized(14f / 16f, 14f / 16f).fireImmune().noSummon()); /////////////////////////////////////////////////////////////////// @@ -27,6 +27,6 @@ public final class Entities { /////////////////////////////////////////////////////////////////// private static RegistryObject> register(final String name, final EntityType.IFactory factory, final EntityClassification classification, final Function, EntityType.Builder> customizer) { - return ENTITIES.register(name, () -> customizer.apply(EntityType.Builder.create(factory, classification)).build(name)); + return ENTITIES.register(name, () -> customizer.apply(EntityType.Builder.of(factory, classification)).build(name)); } } diff --git a/src/main/java/li/cil/oc2/common/entity/RobotEntity.java b/src/main/java/li/cil/oc2/common/entity/RobotEntity.java index dd379fd7..c762422b 100644 --- a/src/main/java/li/cil/oc2/common/entity/RobotEntity.java +++ b/src/main/java/li/cil/oc2/common/entity/RobotEntity.java @@ -81,9 +81,9 @@ import java.util.function.Consumer; import static li.cil.oc2.common.Constants.*; public final class RobotEntity extends Entity implements Robot { - public static final DataParameter TARGET_POSITION = EntityDataManager.createKey(RobotEntity.class, DataSerializers.BLOCK_POS); - public static final DataParameter TARGET_DIRECTION = EntityDataManager.createKey(RobotEntity.class, DataSerializers.DIRECTION); - public static final DataParameter SELECTED_SLOT = EntityDataManager.createKey(RobotEntity.class, DataSerializers.BYTE); + public static final DataParameter TARGET_POSITION = EntityDataManager.defineId(RobotEntity.class, DataSerializers.BLOCK_POS); + public static final DataParameter TARGET_DIRECTION = EntityDataManager.defineId(RobotEntity.class, DataSerializers.DIRECTION); + public static final DataParameter SELECTED_SLOT = EntityDataManager.defineId(RobotEntity.class, DataSerializers.BYTE); private static final String TERMINAL_TAG_NAME = "terminal"; private static final String STATE_TAG_NAME = "state"; @@ -121,7 +121,7 @@ public final class RobotEntity extends Entity implements Robot { public RobotEntity(final EntityType type, final World world) { super(type, world); - this.preventEntitySpawning = true; + this.blocksBuilding = true; setNoGravity(true); final CommonDeviceBusController busController = new CommonDeviceBusController(busElement, Config.robotEnergyPerTick); @@ -157,12 +157,12 @@ public final class RobotEntity extends Entity implements Robot { @Override public int getSelectedSlot() { - return getDataManager().get(SELECTED_SLOT); + return getEntityData().get(SELECTED_SLOT); } @Override public void setSelectedSlot(final int value) { - getDataManager().set(SELECTED_SLOT, (byte) MathHelper.clamp(value, 0, INVENTORY_SIZE - 1)); + getEntityData().set(SELECTED_SLOT, (byte) MathHelper.clamp(value, 0, INVENTORY_SIZE - 1)); } @Override @@ -199,8 +199,8 @@ public final class RobotEntity extends Entity implements Robot { } public void start() { - final World world = getEntityWorld(); - if (world == null || world.isRemote()) { + final World world = getCommandSenderWorld(); + if (world.isClientSide) { return; } @@ -208,8 +208,8 @@ public final class RobotEntity extends Entity implements Robot { } public void stop() { - final World world = getEntityWorld(); - if (world == null || world.isRemote()) { + final World world = getCommandSenderWorld(); + if (world.isClientSide) { return; } @@ -223,18 +223,17 @@ public final class RobotEntity extends Entity implements Robot { final ItemStack stack = new ItemStack(Items.ROBOT.get()); exportToItemStack(stack); - entityDropItem(stack); + exportToItemStack(stack); remove(); - WorldUtils.playSound(world, getPosition(), SoundType.METAL, SoundType::getBreakSound); + WorldUtils.playSound(level, blockPosition(), SoundType.METAL, SoundType::getBreakSound); } @Override public void tick() { - final World world = getEntityWorld(); - final boolean isClient = world.isRemote(); + final boolean isClient = level.isClientSide; - if (firstUpdate) { + if (firstTick) { if (isClient) { requestInitialState(); } else { @@ -254,35 +253,35 @@ public final class RobotEntity extends Entity implements Robot { actionProcessor.tick(); - if (!isClient && world instanceof ServerWorld) { + if (!isClient && level instanceof ServerWorld) { final VoxelShape shape = VoxelShapes.create(getBoundingBox()); final CubeCoordinateIterator iterator = getBlockPosIterator(); - while (iterator.hasNext()) { - final int x = iterator.getX(); - final int y = iterator.getY(); - final int z = iterator.getZ(); - mutablePosition.setPos(x, y, z); - final BlockState blockState = world.getBlockState(mutablePosition); - if (blockState.isAir(world, mutablePosition) || - blockState.isIn(Blocks.MOVING_PISTON) || - blockState.isIn(Blocks.PISTON_HEAD)) { + while (iterator.advance()) { + final int x = iterator.nextX(); + final int y = iterator.nextY(); + final int z = iterator.nextZ(); + mutablePosition.set(x, y, z); + final BlockState blockState = level.getBlockState(mutablePosition); + if (blockState.isAir(level, mutablePosition) || + blockState.is(Blocks.MOVING_PISTON) || + blockState.is(Blocks.PISTON_HEAD)) { continue; } - final VoxelShape blockShape = blockState.getCollisionShape(world, mutablePosition); - if (VoxelShapes.compare(shape, blockShape.withOffset(x, y, z), IBooleanFunction.AND)) { - final TileEntity tileEntity = blockState.hasTileEntity() ? world.getTileEntity(mutablePosition) : null; - final LootContext.Builder builder = new LootContext.Builder((ServerWorld) world) - .withRandom(world.rand) + final VoxelShape blockShape = blockState.getCollisionShape(level, mutablePosition); + if (VoxelShapes.joinIsNotEmpty(shape, blockShape.move(x, y, z), IBooleanFunction.AND)) { + final TileEntity tileEntity = blockState.hasTileEntity() ? level.getBlockEntity(mutablePosition) : null; + final LootContext.Builder builder = new LootContext.Builder((ServerWorld) level) + .withRandom(level.random) .withParameter(LootParameters.THIS_ENTITY, this) - .withParameter(LootParameters.field_237457_g_, getPositionVec()) + .withParameter(LootParameters.ORIGIN, position()) .withParameter(LootParameters.TOOL, ItemStack.EMPTY) .withParameter(LootParameters.BLOCK_STATE, blockState) - .withNullableParameter(LootParameters.BLOCK_ENTITY, tileEntity); + .withOptionalParameter(LootParameters.BLOCK_ENTITY, tileEntity); final List drops = blockState.getDrops(builder); - world.setBlockState(mutablePosition, Blocks.AIR.getDefaultState()); + level.setBlockAndUpdate(mutablePosition, Blocks.AIR.defaultBlockState()); for (final ItemStack drop : drops) { - Block.spawnAsEntity(world, mutablePosition, drop); + Block.popResource(level, mutablePosition, drop); } } } @@ -290,17 +289,17 @@ public final class RobotEntity extends Entity implements Robot { } @Override - public ActionResultType processInitialInteract(final PlayerEntity player, final Hand hand) { - final ItemStack stack = player.getHeldItem(hand); - if (!world.isRemote()) { + public ActionResultType interact(final PlayerEntity player, final Hand hand) { + final ItemStack stack = player.getItemInHand(hand); + if (!level.isClientSide) { if (Wrenches.isWrench(stack)) { - if (player.isSneaking()) { + if (player.isShiftKeyDown()) { dropSelf(); } else if (player instanceof ServerPlayerEntity) { openContainerScreen((ServerPlayerEntity) player); } } else { - if (player.isSneaking()) { + if (player.isShiftKeyDown()) { start(); } else if (player instanceof ServerPlayerEntity) { openTerminalScreen((ServerPlayerEntity) player); @@ -312,7 +311,7 @@ public final class RobotEntity extends Entity implements Robot { } @Override - public IPacket createSpawnPacket() { + public IPacket getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } @@ -332,21 +331,16 @@ public final class RobotEntity extends Entity implements Robot { } @Override - public boolean canCollide(final Entity entity) { + public boolean canCollideWith(final Entity entity) { return entity != this; } @Override - public void applyEntityCollision(final Entity entity) { + public void push(final Entity entity) { } @Override - public boolean func_241845_aY() { - return true; - } - - @Override - public boolean shouldSpawnRunningEffects() { + public boolean canSpawnSprintParticle() { return false; } @@ -370,15 +364,15 @@ public final class RobotEntity extends Entity implements Robot { /////////////////////////////////////////////////////////////////// @Override - protected void registerData() { - final EntityDataManager dataManager = getDataManager(); - dataManager.register(TARGET_POSITION, BlockPos.ZERO); - dataManager.register(TARGET_DIRECTION, Direction.NORTH); - dataManager.register(SELECTED_SLOT, (byte) 0); + protected void defineSynchedData() { + final EntityDataManager dataManager = getEntityData(); + dataManager.set(TARGET_POSITION, BlockPos.ZERO); + dataManager.set(TARGET_DIRECTION, Direction.NORTH); + dataManager.set(SELECTED_SLOT, (byte) 0); } @Override - protected void writeAdditional(final CompoundNBT tag) { + protected void addAdditionalSaveData(final CompoundNBT tag) { tag.put(STATE_TAG_NAME, virtualMachine.serialize()); tag.put(TERMINAL_TAG_NAME, NBTSerialization.serialize(terminal)); tag.put(COMMAND_PROCESSOR_TAG_NAME, actionProcessor.serialize()); @@ -386,11 +380,11 @@ public final class RobotEntity extends Entity implements Robot { tag.put(Constants.ITEMS_TAG_NAME, deviceItems.serialize()); tag.put(ENERGY_TAG_NAME, energy.serializeNBT()); tag.put(INVENTORY_TAG_NAME, inventory.serializeNBT()); - tag.putByte(SELECTED_SLOT_TAG_NAME, dataManager.get(SELECTED_SLOT)); + tag.putByte(SELECTED_SLOT_TAG_NAME, getEntityData().get(SELECTED_SLOT)); } @Override - protected void readAdditional(final CompoundNBT tag) { + protected void readAdditionalSaveData(final CompoundNBT tag) { virtualMachine.deserialize(tag.getCompound(STATE_TAG_NAME)); NBTSerialization.deserialize(tag.getCompound(TERMINAL_TAG_NAME), terminal); actionProcessor.deserialize(tag.getCompound(COMMAND_PROCESSOR_TAG_NAME)); @@ -402,18 +396,19 @@ public final class RobotEntity extends Entity implements Robot { } @Override - protected boolean canTriggerWalking() { + protected boolean isMovementNoisy() { return false; } @Override - protected void doBlockCollisions() { + protected void checkInsideBlocks() { } + @Override - protected Vector3d handlePistonMovement(final Vector3d pos) { - lastPistonMovement = getEntityWorld().getGameTime(); - return super.handlePistonMovement(pos); + protected Vector3d limitPistonMovement(final Vector3d pos) { + lastPistonMovement = getCommandSenderWorld().getGameTime(); + return super.limitPistonMovement(pos); } /////////////////////////////////////////////////////////////////// @@ -434,11 +429,11 @@ public final class RobotEntity extends Entity implements Robot { } private void handleChunkUnload(final ChunkEvent.Unload event) { - if (event.getWorld() != getEntityWorld()) { + if (event.getWorld() != getCommandSenderWorld()) { return; } - final ChunkPos chunkPos = new ChunkPos(getPosition()); + final ChunkPos chunkPos = new ChunkPos(blockPosition()); if (!Objects.equals(chunkPos, event.getChunk().getPos())) { return; } @@ -448,7 +443,7 @@ public final class RobotEntity extends Entity implements Robot { } private void handleWorldUnload(final WorldEvent.Unload event) { - if (event.getWorld() != getEntityWorld()) { + if (event.getWorld() != getCommandSenderWorld()) { return; } @@ -489,12 +484,10 @@ public final class RobotEntity extends Entity implements Robot { } @Override - public int size() { - return 3; - } + public int getCount() { return 3; } }); } - }, b -> b.writeVarInt(getEntityId())); + }, b -> b.writeVarInt(getId())); } private void openContainerScreen(final ServerPlayerEntity player) { @@ -508,7 +501,7 @@ public final class RobotEntity extends Entity implements Robot { public Container createMenu(final int id, final PlayerInventory inventory, final PlayerEntity player) { return new RobotContainer(id, RobotEntity.this, inventory); } - }, b -> b.writeVarInt(getEntityId())); + }, b -> b.writeVarInt(getId())); } private CubeCoordinateIterator getBlockPosIterator() { @@ -639,7 +632,7 @@ public final class RobotEntity extends Entity implements Robot { } public void tick() { - if (getEntityWorld().isRemote()) { + if (getCommandSenderWorld().isClientSide) { RobotActions.performClient(RobotEntity.this); } else { if (action != null) { @@ -722,7 +715,7 @@ public final class RobotEntity extends Entity implements Robot { } private boolean addAction(final AbstractRobotAction action) { - if (getEntityWorld().isRemote()) { + if (getCommandSenderWorld().isClientSide) { return false; } @@ -785,13 +778,13 @@ public final class RobotEntity extends Entity implements Robot { public CompoundNBT serialize() { final CompoundNBT tag = new CompoundNBT(); - tag.putUniqueId(DEVICE_ID_TAG_NAME, deviceId); + tag.putUUID(DEVICE_ID_TAG_NAME, deviceId); return tag; } public void deserialize(final CompoundNBT tag) { - if (tag.hasUniqueId(DEVICE_ID_TAG_NAME)) { - deviceId = tag.getUniqueId(DEVICE_ID_TAG_NAME); + if (tag.hasUUID(DEVICE_ID_TAG_NAME)) { + deviceId = tag.getUUID(DEVICE_ID_TAG_NAME); } } } diff --git a/src/main/java/li/cil/oc2/common/entity/robot/RobotMovementAction.java b/src/main/java/li/cil/oc2/common/entity/robot/RobotMovementAction.java index 852c2cdd..535dd011 100644 --- a/src/main/java/li/cil/oc2/common/entity/robot/RobotMovementAction.java +++ b/src/main/java/li/cil/oc2/common/entity/robot/RobotMovementAction.java @@ -50,12 +50,12 @@ public final class RobotMovementAction extends AbstractRobotAction { /////////////////////////////////////////////////////////////////// public static Vector3d getTargetPositionInBlock(final BlockPos position) { - return Vector3d.copyCenteredHorizontally(position).add(0, 0.5f * (1 - Entities.ROBOT.get().getHeight()), 0); + return Vector3d.atBottomCenterOf(position).add(0, 0.5f * (1 - Entities.ROBOT.get().getHeight()), 0); } public static void moveTowards(final RobotEntity robot, final Vector3d targetPosition) { - Vector3d delta = targetPosition.subtract(robot.getPositionVec()); - if (delta.lengthSquared() > MOVEMENT_SPEED * MOVEMENT_SPEED) { + Vector3d delta = targetPosition.subtract(robot.position()); + if (delta.lengthSqr() > MOVEMENT_SPEED * MOVEMENT_SPEED) { delta = delta.normalize().scale(MOVEMENT_SPEED); } @@ -67,27 +67,27 @@ public final class RobotMovementAction extends AbstractRobotAction { @Override public void initialize(final RobotEntity robot) { if (origin == null || start == null || target == null) { - origin = robot.getPosition(); + origin = robot.blockPosition(); start = origin; target = start; switch (direction) { case UP: - target = target.offset(Direction.UP); + target = target.relative(Direction.UP); break; case DOWN: - target = target.offset(Direction.DOWN); + target = target.relative(Direction.DOWN); break; case FORWARD: - target = target.offset(robot.getHorizontalFacing()); + target = target.relative(robot.getDirection()); break; case BACKWARD: - target = target.offset(robot.getHorizontalFacing().getOpposite()); + target = target.relative(robot.getDirection().getOpposite()); break; } } targetPos = getTargetPositionInBlock(target); - robot.getDataManager().set(RobotEntity.TARGET_POSITION, target); + robot.getEntityData().set(RobotEntity.TARGET_POSITION, target); } @Override @@ -100,7 +100,7 @@ public final class RobotMovementAction extends AbstractRobotAction { moveAndResolveCollisions(robot); - if (robot.getPositionVec().squareDistanceTo(targetPos) < TARGET_EPSILON) { + if (robot.position().distanceToSqr(targetPos) < TARGET_EPSILON) { if (Objects.equals(target, origin)) { return RobotActionResult.FAILURE; // Collided and returned. } else { @@ -149,20 +149,20 @@ public final class RobotMovementAction extends AbstractRobotAction { private void moveAndResolveCollisions(final RobotEntity robot) { moveTowards(robot, targetPos); - final boolean didCollide = robot.collidedHorizontally || robot.collidedVertically; - final long gameTime = robot.getEntityWorld().getGameTime(); - if (didCollide && !robot.getEntityWorld().isRemote() + final boolean didCollide = robot.horizontalCollision || robot.verticalCollision; + final long gameTime = robot.level.getGameTime(); + if (didCollide && !robot.level.isClientSide && robot.getLastPistonMovement() < gameTime - 1) { final BlockPos newStart = target; target = start; start = newStart; targetPos = getTargetPositionInBlock(target); - robot.getDataManager().set(RobotEntity.TARGET_POSITION, target); + robot.getEntityData().set(RobotEntity.TARGET_POSITION, target); } } private void validateTarget(final RobotEntity robot) { - final BlockPos currentPosition = robot.getPosition(); + final BlockPos currentPosition = robot.blockPosition(); if (Objects.equals(currentPosition, start) || Objects.equals(currentPosition, target)) { return; } @@ -176,13 +176,13 @@ public final class RobotMovementAction extends AbstractRobotAction { if (deltaStart < deltaTarget) { start = currentPosition; - target = target.add(fromStart); + target = target.offset(fromStart); } else { - start = start.add(fromTarget); + start = start.offset(fromTarget); target = currentPosition; } targetPos = getTargetPositionInBlock(target); - robot.getDataManager().set(RobotEntity.TARGET_POSITION, target); + robot.getEntityData().set(RobotEntity.TARGET_POSITION, target); } } diff --git a/src/main/java/li/cil/oc2/common/entity/robot/RobotMovementActionType.java b/src/main/java/li/cil/oc2/common/entity/robot/RobotMovementActionType.java index a73cdf4f..9668f14e 100644 --- a/src/main/java/li/cil/oc2/common/entity/robot/RobotMovementActionType.java +++ b/src/main/java/li/cil/oc2/common/entity/robot/RobotMovementActionType.java @@ -13,20 +13,20 @@ public final class RobotMovementActionType extends AbstractRobotActionType { @Override public void initializeData(final RobotEntity robot) { - robot.getDataManager().set(RobotEntity.TARGET_POSITION, robot.getPosition()); + robot.getEntityData().set(RobotEntity.TARGET_POSITION, robot.blockPosition()); } @Override public void performServer(final RobotEntity robot, final AbstractRobotAction currentAction) { if (!(currentAction instanceof RobotMovementAction)) { - robot.getDataManager().set(RobotEntity.TARGET_POSITION, robot.getPosition()); + robot.getEntityData().set(RobotEntity.TARGET_POSITION, robot.blockPosition()); } } @Override public void performClient(final RobotEntity robot) { - final Vector3d target = RobotMovementAction.getTargetPositionInBlock(robot.getDataManager().get(RobotEntity.TARGET_POSITION)); - if (robot.getPositionVec().squareDistanceTo(target) > RobotMovementAction.TARGET_EPSILON) { + final Vector3d target = RobotMovementAction.getTargetPositionInBlock(robot.getEntityData().get(RobotEntity.TARGET_POSITION)); + if (robot.position().distanceToSqr(target) > RobotMovementAction.TARGET_EPSILON) { RobotMovementAction.moveTowards(robot, target); } } diff --git a/src/main/java/li/cil/oc2/common/entity/robot/RobotRotationAction.java b/src/main/java/li/cil/oc2/common/entity/robot/RobotRotationAction.java index 217e330e..0f6681a1 100644 --- a/src/main/java/li/cil/oc2/common/entity/robot/RobotRotationAction.java +++ b/src/main/java/li/cil/oc2/common/entity/robot/RobotRotationAction.java @@ -40,7 +40,7 @@ public final class RobotRotationAction extends AbstractRobotAction { /////////////////////////////////////////////////////////////////// public static void rotateTowards(final RobotEntity robot, final Direction targetRotation) { - robot.rotationYaw = MathHelper.approachDegrees(robot.rotationYaw, targetRotation.getHorizontalAngle(), ROTATION_SPEED); + robot.yRot = MathHelper.approachDegrees(robot.yRot, targetRotation.toYRot(), ROTATION_SPEED); } /////////////////////////////////////////////////////////////////// @@ -48,18 +48,18 @@ public final class RobotRotationAction extends AbstractRobotAction { @Override public void initialize(final RobotEntity robot) { if (target == null) { - target = robot.getHorizontalFacing(); + target = robot.getDirection(); switch (direction) { case LEFT: - target = target.rotateYCCW(); + target = target.getCounterClockWise(); break; case RIGHT: - target = target.rotateY(); + target = target.getClockWise(); break; } } - robot.getDataManager().set(RobotEntity.TARGET_DIRECTION, target); + robot.getEntityData().set(RobotEntity.TARGET_DIRECTION, target); } @Override @@ -70,7 +70,7 @@ public final class RobotRotationAction extends AbstractRobotAction { rotateTowards(robot, target); - if (MathHelper.degreesDifferenceAbs(robot.rotationYaw, target.getHorizontalAngle()) < TARGET_EPSILON) { + if (MathHelper.degreesDifferenceAbs(robot.yRot, target.toYRot()) < TARGET_EPSILON) { return RobotActionResult.SUCCESS; } diff --git a/src/main/java/li/cil/oc2/common/entity/robot/RobotRotationActionType.java b/src/main/java/li/cil/oc2/common/entity/robot/RobotRotationActionType.java index 5fe2fad9..56ab7b4d 100644 --- a/src/main/java/li/cil/oc2/common/entity/robot/RobotRotationActionType.java +++ b/src/main/java/li/cil/oc2/common/entity/robot/RobotRotationActionType.java @@ -14,20 +14,20 @@ public final class RobotRotationActionType extends AbstractRobotActionType { @Override public void initializeData(final RobotEntity robot) { - robot.getDataManager().set(RobotEntity.TARGET_DIRECTION, robot.getHorizontalFacing()); + robot.getEntityData().set(RobotEntity.TARGET_DIRECTION, robot.getDirection()); } @Override public void performServer(final RobotEntity robot, final AbstractRobotAction currentAction) { if (!(currentAction instanceof RobotRotationAction)) { - robot.getDataManager().set(RobotEntity.TARGET_DIRECTION, robot.getHorizontalFacing()); + robot.getEntityData().set(RobotEntity.TARGET_DIRECTION, robot.getDirection()); } } @Override public void performClient(final RobotEntity robot) { - final Direction target = robot.getDataManager().get(RobotEntity.TARGET_DIRECTION); - if (MathHelper.degreesDifferenceAbs(robot.rotationYaw, target.getHorizontalAngle()) > RobotRotationAction.TARGET_EPSILON) { + final Direction target = robot.getEntityData().get(RobotEntity.TARGET_DIRECTION); + if (MathHelper.degreesDifferenceAbs(robot.yRot, target.toYRot()) > RobotRotationAction.TARGET_EPSILON) { RobotRotationAction.rotateTowards(robot, target); } } diff --git a/src/main/java/li/cil/oc2/common/integration/Wrenches.java b/src/main/java/li/cil/oc2/common/integration/Wrenches.java index f1ace486..61e79b66 100644 --- a/src/main/java/li/cil/oc2/common/integration/Wrenches.java +++ b/src/main/java/li/cil/oc2/common/integration/Wrenches.java @@ -13,11 +13,11 @@ public final class Wrenches { } public static boolean isWrench(final Item item) { - return item.isIn(ItemTags.WRENCHES); + return item.is(ItemTags.WRENCHES); } public static boolean isHoldingWrench(final Entity entity) { - for (final ItemStack stack : entity.getHeldEquipment()) { + for (final ItemStack stack : entity.getHandSlots()) { if (isWrench(stack.getItem())) { return true; } diff --git a/src/main/java/li/cil/oc2/common/item/AbstractBlockDeviceItem.java b/src/main/java/li/cil/oc2/common/item/AbstractBlockDeviceItem.java index 300985f2..8c550820 100644 --- a/src/main/java/li/cil/oc2/common/item/AbstractBlockDeviceItem.java +++ b/src/main/java/li/cil/oc2/common/item/AbstractBlockDeviceItem.java @@ -22,7 +22,7 @@ public abstract class AbstractBlockDeviceItem extends ModItem { /////////////////////////////////////////////////////////////////// protected AbstractBlockDeviceItem(final Properties properties, final ResourceLocation defaultData) { - super(properties.maxStackSize(1)); + super(properties.stacksTo(1)); this.defaultData = defaultData; } @@ -71,16 +71,16 @@ public abstract class AbstractBlockDeviceItem extends ModItem { } @Override - public ITextComponent getDisplayName(final ItemStack stack) { + public ITextComponent getName(final ItemStack stack) { final BlockDeviceData data = getData(stack); if (data != null) { return new StringTextComponent("") - .append(super.getDisplayName(stack)) - .appendString(" (") + .append(super.getName(stack)) + .append(" (") .append(data.getDisplayName()) - .appendString(")"); + .append(")"); } else { - return super.getDisplayName(stack); + return super.getName(stack); } } } diff --git a/src/main/java/li/cil/oc2/common/item/AbstractStorageItem.java b/src/main/java/li/cil/oc2/common/item/AbstractStorageItem.java index 7e15da6b..74387bf3 100644 --- a/src/main/java/li/cil/oc2/common/item/AbstractStorageItem.java +++ b/src/main/java/li/cil/oc2/common/item/AbstractStorageItem.java @@ -47,12 +47,12 @@ public abstract class AbstractStorageItem extends ModItem { } @Override - public ITextComponent getDisplayName(final ItemStack stack) { + public ITextComponent getName(final ItemStack stack) { final int capacity = getCapacity(stack); return new StringTextComponent("") - .append(super.getDisplayName(stack)) - .appendString(" (") - .appendString(TextFormatUtils.formatSize(capacity)) - .appendString(")"); + .append(super.getName(stack)) + .append(" (") + .append(TextFormatUtils.formatSize(capacity)) + .append(")"); } } diff --git a/src/main/java/li/cil/oc2/common/item/BlockOperationsModule.java b/src/main/java/li/cil/oc2/common/item/BlockOperationsModule.java index aaa3de4e..60a6eca0 100644 --- a/src/main/java/li/cil/oc2/common/item/BlockOperationsModule.java +++ b/src/main/java/li/cil/oc2/common/item/BlockOperationsModule.java @@ -6,6 +6,6 @@ public final class BlockOperationsModule extends ModItem { /////////////////////////////////////////////////////////////////// public BlockOperationsModule() { - super(createProperties().maxDamage(DURABILITY)); + super(createProperties().durability(DURABILITY)); } } diff --git a/src/main/java/li/cil/oc2/common/item/BusCableItem.java b/src/main/java/li/cil/oc2/common/item/BusCableItem.java index 2150f31f..f7f6bf02 100644 --- a/src/main/java/li/cil/oc2/common/item/BusCableItem.java +++ b/src/main/java/li/cil/oc2/common/item/BusCableItem.java @@ -34,21 +34,21 @@ public final class BusCableItem extends ModBlockItem { @OnlyIn(Dist.CLIENT) @Override - public void addInformation(final ItemStack stack, final @Nullable World world, final List tooltip, final ITooltipFlag flag) { - super.addInformation(stack, world, tooltip, flag); + public void appendHoverText(final ItemStack stack, final @Nullable World world, final List tooltip, final ITooltipFlag flag) { + super.appendHoverText(stack, world, tooltip, flag); TooltipUtils.addEnergyConsumption(Config.busCableEnergyPerTick, tooltip); } @Override - public ActionResultType onItemUse(final ItemUseContext context) { + public ActionResultType useOn(final ItemUseContext context) { final ActionResultType result = tryAddToBlock(context); - return result.isSuccessOrConsume() ? result : super.onItemUse(context); + return result.consumesAction() ? result : super.useOn(context); } @Override - public ActionResultType tryPlace(final BlockItemUseContext context) { + public ActionResultType place(final BlockItemUseContext context) { final ActionResultType result = tryAddToBlock(context); - return result.isSuccessOrConsume() ? result : super.tryPlace(context); + return result.consumesAction() ? result : super.place(context); } /////////////////////////////////////////////////////////////////// @@ -56,13 +56,13 @@ public final class BusCableItem extends ModBlockItem { private ActionResultType tryAddToBlock(final ItemUseContext context) { final BusCableBlock busCableBlock = Blocks.BUS_CABLE.get(); - final World world = context.getWorld(); - final BlockPos pos = context.getPos(); + final World world = context.getLevel(); + final BlockPos pos = context.getClickedPos(); final BlockState state = world.getBlockState(pos); if (state.getBlock() == busCableBlock && busCableBlock.addCable(world, pos, state)) { final PlayerEntity player = context.getPlayer(); - final ItemStack stack = context.getItem(); + final ItemStack stack = context.getItemInHand(); if (player instanceof ServerPlayerEntity) { CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity) player, pos, stack); @@ -70,11 +70,11 @@ public final class BusCableItem extends ModBlockItem { WorldUtils.playSound(world, pos, state.getSoundType(world, pos, player), SoundType::getPlaceSound); - if (player == null || !player.abilities.isCreativeMode) { + if (player == null || !player.abilities.instabuild) { stack.shrink(1); } - return ActionResultType.func_233537_a_(world.isRemote); + return ActionResultType.sidedSuccess(world.isClientSide); } return ActionResultType.PASS; diff --git a/src/main/java/li/cil/oc2/common/item/BusInterfaceItem.java b/src/main/java/li/cil/oc2/common/item/BusInterfaceItem.java index fe21b4a9..1ebc666f 100644 --- a/src/main/java/li/cil/oc2/common/item/BusInterfaceItem.java +++ b/src/main/java/li/cil/oc2/common/item/BusInterfaceItem.java @@ -39,39 +39,39 @@ public final class BusInterfaceItem extends ModBlockItem { @OnlyIn(Dist.CLIENT) @Override - public void addInformation(final ItemStack stack, final @Nullable World world, final List tooltip, final ITooltipFlag flag) { - super.addInformation(stack, world, tooltip, flag); + public void appendHoverText(final ItemStack stack, final @Nullable World world, final List tooltip, final ITooltipFlag flag) { + super.appendHoverText(stack, world, tooltip, flag); TooltipUtils.addEnergyConsumption(Config.busInterfaceEnergyPerTick, tooltip); } @Override - public ActionResultType onItemUse(final ItemUseContext context) { - final Vector3d localHitPos = context.getHitVec().subtract(Vector3d.copyCentered(context.getPos())); - final Direction side = Direction.getFacingFromVector(localHitPos.x, localHitPos.y, localHitPos.z); + public ActionResultType useOn(final ItemUseContext context) { + final Vector3d localHitPos = context.getClickLocation().subtract(Vector3d.atCenterOf(context.getClickedPos())); + final Direction side = Direction.getNearest(localHitPos.x, localHitPos.y, localHitPos.z); final ActionResultType result = tryAddToBlock(context, side); - return result.isSuccessOrConsume() ? result : super.onItemUse(context); + return result.consumesAction() ? result : super.useOn(context); } @Override - public ActionResultType tryPlace(final BlockItemUseContext context) { - final ActionResultType result = tryAddToBlock(context, context.getFace().getOpposite()); - return result.isSuccessOrConsume() ? result : super.tryPlace(context); + public ActionResultType place(final BlockItemUseContext context) { + final ActionResultType result = tryAddToBlock(context, context.getClickedFace().getOpposite()); + return result.consumesAction() ? result : super.place(context); } @Override - public String getTranslationKey() { - return getDefaultTranslationKey(); + public String getDescriptionId() { + return getOrCreateDescriptionId(); } @Override - public void fillItemGroup(final ItemGroup group, final NonNullList items) { - if (isInGroup(group)) { + public void fillItemCategory(final ItemGroup group, final NonNullList items) { + if (allowdedIn(group)) { items.add(new ItemStack(this)); } } @Override - public void addToBlockToItemMap(final Map map, final Item item) { + public void registerBlocks(final Map map, final Item item) { } @Override @@ -82,13 +82,13 @@ public final class BusInterfaceItem extends ModBlockItem { @Nullable @Override - protected BlockState getStateForPlacement(final BlockItemUseContext context) { - final BlockState state = super.getStateForPlacement(context); + protected BlockState getPlacementState(final BlockItemUseContext context) { + final BlockState state = super.getPlacementState(context); final EnumProperty connectionTypeProperty = - BusCableBlock.FACING_TO_CONNECTION_MAP.get(context.getFace().getOpposite()); + BusCableBlock.FACING_TO_CONNECTION_MAP.get(context.getClickedFace().getOpposite()); return state - .with(BusCableBlock.HAS_CABLE, false) - .with(connectionTypeProperty, ConnectionType.INTERFACE); + .setValue(BusCableBlock.HAS_CABLE, false) + .setValue(connectionTypeProperty, ConnectionType.INTERFACE); } /////////////////////////////////////////////////////////////////// @@ -96,13 +96,13 @@ public final class BusInterfaceItem extends ModBlockItem { private ActionResultType tryAddToBlock(final ItemUseContext context, final Direction side) { final BusCableBlock busCableBlock = Blocks.BUS_CABLE.get(); - final World world = context.getWorld(); - final BlockPos pos = context.getPos(); + final World world = context.getLevel(); + final BlockPos pos = context.getClickedPos(); final BlockState state = world.getBlockState(pos); if (state.getBlock() == busCableBlock && busCableBlock.addInterface(world, pos, state, side)) { final PlayerEntity player = context.getPlayer(); - final ItemStack stack = context.getItem(); + final ItemStack stack = context.getItemInHand(); if (player instanceof ServerPlayerEntity) { CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity) player, pos, stack); @@ -110,11 +110,11 @@ public final class BusInterfaceItem extends ModBlockItem { WorldUtils.playSound(world, pos, state.getSoundType(world, pos, player), SoundType::getPlaceSound); - if (player == null || !player.abilities.isCreativeMode) { + if (player == null || !player.abilities.instabuild) { stack.shrink(1); } - return ActionResultType.func_233537_a_(world.isRemote); + return ActionResultType.sidedSuccess(world.isClientSide); } return ActionResultType.PASS; diff --git a/src/main/java/li/cil/oc2/common/item/ChargerItem.java b/src/main/java/li/cil/oc2/common/item/ChargerItem.java index 52947fcf..d81df610 100644 --- a/src/main/java/li/cil/oc2/common/item/ChargerItem.java +++ b/src/main/java/li/cil/oc2/common/item/ChargerItem.java @@ -14,9 +14,9 @@ public final class ChargerItem extends ModBlockItem { /////////////////////////////////////////////////////////////////// @Override - public void fillItemGroup(final ItemGroup group, final NonNullList items) { + public void fillItemCategory(final ItemGroup group, final NonNullList items) { if (Config.chargerUseEnergy()) { - super.fillItemGroup(group, items); + super.fillItemCategory(group, items); } } } diff --git a/src/main/java/li/cil/oc2/common/item/FlashMemoryItem.java b/src/main/java/li/cil/oc2/common/item/FlashMemoryItem.java index 2415f3e3..d1de83e8 100644 --- a/src/main/java/li/cil/oc2/common/item/FlashMemoryItem.java +++ b/src/main/java/li/cil/oc2/common/item/FlashMemoryItem.java @@ -10,7 +10,7 @@ import javax.annotation.Nullable; public final class FlashMemoryItem extends AbstractStorageItem { public FlashMemoryItem(final int defaultCapacity) { - super(createProperties().maxStackSize(1), defaultCapacity); + super(createProperties().stacksTo(1), defaultCapacity); } /////////////////////////////////////////////////////////////////// @@ -28,7 +28,7 @@ public final class FlashMemoryItem extends AbstractStorageItem { /////////////////////////////////////////////////////////////////// @Override - protected String getDefaultTranslationKey() { + protected String getOrCreateDescriptionId() { return "item.oc2.flash_memory"; } } diff --git a/src/main/java/li/cil/oc2/common/item/FlashMemoryWithExternalDataItem.java b/src/main/java/li/cil/oc2/common/item/FlashMemoryWithExternalDataItem.java index 97f26281..389c0825 100644 --- a/src/main/java/li/cil/oc2/common/item/FlashMemoryWithExternalDataItem.java +++ b/src/main/java/li/cil/oc2/common/item/FlashMemoryWithExternalDataItem.java @@ -22,7 +22,7 @@ public final class FlashMemoryWithExternalDataItem extends ModItem { /////////////////////////////////////////////////////////////////// public FlashMemoryWithExternalDataItem(final ResourceLocation defaultData) { - super(createProperties().maxStackSize(1)); + super(createProperties().stacksTo(1)); this.defaultData = defaultData; } @@ -67,23 +67,23 @@ public final class FlashMemoryWithExternalDataItem extends ModItem { } @Override - public ITextComponent getDisplayName(final ItemStack stack) { + public ITextComponent getName(final ItemStack stack) { final Firmware firmware = getFirmware(stack); if (firmware != null) { return new StringTextComponent("") - .append(super.getDisplayName(stack)) - .appendString(" (") + .append(super.getName(stack)) + .append(" (") .append(firmware.getDisplayName()) - .appendString(")"); + .append(")"); } else { - return super.getDisplayName(stack); + return super.getName(stack); } } /////////////////////////////////////////////////////////////////// @Override - protected String getDefaultTranslationKey() { + protected String getOrCreateDescriptionId() { return "item.oc2.flash_memory"; } } diff --git a/src/main/java/li/cil/oc2/common/item/HardDriveItem.java b/src/main/java/li/cil/oc2/common/item/HardDriveItem.java index 08e4beaa..236d4196 100644 --- a/src/main/java/li/cil/oc2/common/item/HardDriveItem.java +++ b/src/main/java/li/cil/oc2/common/item/HardDriveItem.java @@ -18,13 +18,13 @@ public final class HardDriveItem extends AbstractStorageItem implements IDyeable @Override public int getColor(final ItemStack stack) { - return hasColor(stack) ? IDyeableArmorItem.super.getColor(stack) : defaultColor; + return hasCustomColor(stack) ? IDyeableArmorItem.super.getColor(stack) : defaultColor; } /////////////////////////////////////////////////////////////////// @Override - protected String getDefaultTranslationKey() { + protected String getOrCreateDescriptionId() { return "item.oc2.hard_drive"; } } diff --git a/src/main/java/li/cil/oc2/common/item/HardDriveWithExternalDataItem.java b/src/main/java/li/cil/oc2/common/item/HardDriveWithExternalDataItem.java index cadc294e..d04ed0ac 100644 --- a/src/main/java/li/cil/oc2/common/item/HardDriveWithExternalDataItem.java +++ b/src/main/java/li/cil/oc2/common/item/HardDriveWithExternalDataItem.java @@ -19,13 +19,13 @@ public final class HardDriveWithExternalDataItem extends AbstractBlockDeviceItem @Override public int getColor(final ItemStack stack) { - return hasColor(stack) ? IDyeableArmorItem.super.getColor(stack) : defaultColor; + return hasCustomColor(stack) ? IDyeableArmorItem.super.getColor(stack) : defaultColor; } /////////////////////////////////////////////////////////////////// @Override - protected String getDefaultTranslationKey() { + protected String getOrCreateDescriptionId() { return "item.oc2.hard_drive"; } } diff --git a/src/main/java/li/cil/oc2/common/item/ItemGroup.java b/src/main/java/li/cil/oc2/common/item/ItemGroup.java index 69b17989..ed1a486c 100644 --- a/src/main/java/li/cil/oc2/common/item/ItemGroup.java +++ b/src/main/java/li/cil/oc2/common/item/ItemGroup.java @@ -6,7 +6,7 @@ import net.minecraft.item.ItemStack; public final class ItemGroup { public static final net.minecraft.item.ItemGroup COMMON = new net.minecraft.item.ItemGroup(API.MOD_ID + ".common") { @Override - public ItemStack createIcon() { + public ItemStack makeIcon() { return new ItemStack(Items.COMPUTER.get()); } }; diff --git a/src/main/java/li/cil/oc2/common/item/MemoryItem.java b/src/main/java/li/cil/oc2/common/item/MemoryItem.java index 7aadf5b3..35471d48 100644 --- a/src/main/java/li/cil/oc2/common/item/MemoryItem.java +++ b/src/main/java/li/cil/oc2/common/item/MemoryItem.java @@ -8,7 +8,8 @@ public final class MemoryItem extends AbstractStorageItem { /////////////////////////////////////////////////////////////////// @Override - protected String getDefaultTranslationKey() { + protected String getOrCreateDescriptionId() { return "item.oc2.memory"; } + } diff --git a/src/main/java/li/cil/oc2/common/item/ModBlockItem.java b/src/main/java/li/cil/oc2/common/item/ModBlockItem.java index 9dffe063..c4e36ada 100644 --- a/src/main/java/li/cil/oc2/common/item/ModBlockItem.java +++ b/src/main/java/li/cil/oc2/common/item/ModBlockItem.java @@ -15,7 +15,7 @@ import java.util.List; public class ModBlockItem extends BlockItem { public ModBlockItem(final Block block, final Properties properties) { - super(block, properties.group(ItemGroup.COMMON)); + super(block, properties.tab(ItemGroup.COMMON)); } public ModBlockItem(final Block block) { @@ -26,9 +26,9 @@ public class ModBlockItem extends BlockItem { @OnlyIn(Dist.CLIENT) @Override - public void addInformation(final ItemStack stack, @Nullable final World world, final List tooltip, final ITooltipFlag flag) { + public void appendHoverText(final ItemStack stack, @Nullable final World world, final List tooltip, final ITooltipFlag flag) { TooltipUtils.tryAddDescription(stack, tooltip); - super.addInformation(stack, world, tooltip, flag); + super.appendHoverText(stack, world, tooltip, flag); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/item/ModItem.java b/src/main/java/li/cil/oc2/common/item/ModItem.java index b0e2531b..250715fb 100644 --- a/src/main/java/li/cil/oc2/common/item/ModItem.java +++ b/src/main/java/li/cil/oc2/common/item/ModItem.java @@ -14,7 +14,7 @@ import java.util.List; public class ModItem extends Item { public ModItem(final Properties properties) { - super(properties.group(ItemGroup.COMMON)); + super(properties.tab(ItemGroup.COMMON)); } public ModItem() { @@ -25,8 +25,8 @@ public class ModItem extends Item { @OnlyIn(Dist.CLIENT) @Override - public void addInformation(final ItemStack stack, @Nullable final World world, final List tooltip, final ITooltipFlag flag) { - super.addInformation(stack, world, tooltip, flag); + public void appendHoverText(final ItemStack stack, @Nullable final World world, final List tooltip, final ITooltipFlag flag) { + super.appendHoverText(stack, world, tooltip, flag); TooltipUtils.tryAddDescription(stack, tooltip); } diff --git a/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java b/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java index 48c24f66..68bf9926 100644 --- a/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java +++ b/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java @@ -24,51 +24,51 @@ public final class NetworkCableItem extends ModItem { /////////////////////////////////////////////////////////////////// @Override - public ActionResult onItemRightClick(final World world, final PlayerEntity player, final Hand hand) { - if (player.isSneaking()) { + public ActionResult use(final World world, final PlayerEntity player, final Hand hand) { + if (player.isShiftKeyDown()) { if (player instanceof ServerPlayerEntity) { LINK_STARTS.remove(player); } - return ActionResult.resultSuccess(player.getHeldItem(hand)); + return ActionResult.success(player.getItemInHand(hand)); } - return super.onItemRightClick(world, player, hand); + return super.use(world, player, hand); } @Override - public ActionResultType onItemUse(final ItemUseContext context) { + public ActionResultType useOn(final ItemUseContext context) { final PlayerEntity player = context.getPlayer(); if (player == null) { - return super.onItemUse(context); + return super.useOn(context); } - final ItemStack stack = player.getHeldItem(context.getHand()); + final ItemStack stack = player.getItemInHand(context.getHand()); if (stack.isEmpty() || stack.getItem() != this) { - return super.onItemUse(context); + return super.useOn(context); } - final World world = context.getWorld(); - final BlockPos currentPos = context.getPos(); + final World world = context.getLevel(); + final BlockPos currentPos = context.getClickedPos(); - final TileEntity currentTileEntity = world.getTileEntity(currentPos); + final TileEntity currentTileEntity = world.getBlockEntity(currentPos); if (!(currentTileEntity instanceof NetworkConnectorTileEntity)) { - return super.onItemUse(context); + return super.useOn(context); } - if (!world.isRemote() && player instanceof ServerPlayerEntity) { + if (!world.isClientSide && player instanceof ServerPlayerEntity) { final BlockPos startPos = LINK_STARTS.remove(player); if (startPos == null || Objects.equals(startPos, currentPos)) { if (((NetworkConnectorTileEntity) currentTileEntity).canConnectMore()) { LINK_STARTS.put((ServerPlayerEntity) player, currentPos); } else { - player.sendStatusMessage(new TranslationTextComponent(Constants.CONNECTOR_ERROR_FULL), true); + player.displayClientMessage(new TranslationTextComponent(Constants.CONNECTOR_ERROR_FULL), true); } } else { - final TileEntity startTileEntity = world.getTileEntity(startPos); + final TileEntity startTileEntity = world.getBlockEntity(startPos); if (!(startTileEntity instanceof NetworkConnectorTileEntity)) { // Starting connector was removed in the meantime. - return super.onItemUse(context); + return super.useOn(context); } final NetworkConnectorTileEntity connectorA = (NetworkConnectorTileEntity) startTileEntity; @@ -87,15 +87,15 @@ public final class NetworkCableItem extends ModItem { break; case FAILURE_FULL: LINK_STARTS.put((ServerPlayerEntity) player, startPos); - player.sendStatusMessage(new TranslationTextComponent(Constants.CONNECTOR_ERROR_FULL), true); + player.displayClientMessage(new TranslationTextComponent(Constants.CONNECTOR_ERROR_FULL), true); break; case FAILURE_TOO_FAR: LINK_STARTS.put((ServerPlayerEntity) player, startPos); - player.sendStatusMessage(new TranslationTextComponent(Constants.CONNECTOR_ERROR_TOO_FAR), true); + player.displayClientMessage(new TranslationTextComponent(Constants.CONNECTOR_ERROR_TOO_FAR), true); break; case FAILURE_OBSTRUCTED: LINK_STARTS.put((ServerPlayerEntity) player, startPos); - player.sendStatusMessage(new TranslationTextComponent(Constants.CONNECTOR_ERROR_OBSTRUCTED), true); + player.displayClientMessage(new TranslationTextComponent(Constants.CONNECTOR_ERROR_OBSTRUCTED), true); break; } } diff --git a/src/main/java/li/cil/oc2/common/item/RobotItem.java b/src/main/java/li/cil/oc2/common/item/RobotItem.java index 3de03622..981919a1 100644 --- a/src/main/java/li/cil/oc2/common/item/RobotItem.java +++ b/src/main/java/li/cil/oc2/common/item/RobotItem.java @@ -37,8 +37,8 @@ public final class RobotItem extends ModItem { /////////////////////////////////////////////////////////////////// @Override - public void addInformation(final ItemStack stack, @Nullable final World world, final List tooltip, final ITooltipFlag flag) { - super.addInformation(stack, world, tooltip, flag); + public void appendHoverText(final ItemStack stack, @Nullable final World world, final List tooltip, final ITooltipFlag flag) { + super.appendHoverText(stack, world, tooltip, flag); TooltipUtils.addEnergyConsumption(Config.robotEnergyPerTick, tooltip); TooltipUtils.addEntityEnergyInformation(stack, tooltip); TooltipUtils.addEntityInventoryInformation(stack, tooltip); @@ -55,37 +55,37 @@ public final class RobotItem extends ModItem { } @Override - public ActionResultType onItemUse(final ItemUseContext context) { - final World world = context.getWorld(); - final BlockPos pos = context.getPos(); + public ActionResultType useOn(final ItemUseContext context) { + final World world = context.getLevel(); + final BlockPos pos = context.getClickedPos(); final Vector3d position; - if (world.getBlockState(pos).isReplaceable(new BlockItemUseContext(context))) { - position = Vector3d.copyCentered(pos); + if (world.getBlockState(pos).canBeReplaced(new BlockItemUseContext(context))) { + position = Vector3d.atCenterOf(pos); } else { - position = Vector3d.copyCentered(pos.offset(context.getFace())); + position = Vector3d.atCenterOf(pos.relative(context.getClickedFace())); } - final RobotEntity robot = Entities.ROBOT.get().create(context.getWorld()); - robot.setLocationAndAngles(position.getX(), position.getY() - robot.getHeight() * 0.5f, position.getZ(), - Direction.fromAngle(context.getPlacementYaw()).getOpposite().getHorizontalAngle(), 0); - if (!world.hasNoCollisions(robot)) { - return super.onItemUse(context); + final RobotEntity robot = Entities.ROBOT.get().create(context.getLevel()); + robot.moveTo(position.x, position.y - robot.getEyeHeight() * 0.5f, position.z, + Direction.fromYRot(context.getRotation()).getOpposite().toYRot(), 0); + if (!world.noCollision(robot)) { + return super.useOn(context); } - if (!world.isRemote()) { + if (!world.isClientSide) { RobotActions.initializeData(robot); - robot.importFromItemStack(context.getItem()); + robot.importFromItemStack(context.getItemInHand()); - world.addEntity(robot); + world.addFreshEntity(robot); WorldUtils.playSound(world, new BlockPos(position), SoundType.METAL, SoundType::getPlaceSound); if (!context.getPlayer().isCreative()) { - context.getItem().shrink(1); + context.getItemInHand().shrink(1); } } - context.getPlayer().addStat(Stats.ITEM_USED.get(this)); + context.getPlayer().awardStat(Stats.ITEM_USED.get(this)); return ActionResultType.SUCCESS; } diff --git a/src/main/java/li/cil/oc2/common/item/WrenchItem.java b/src/main/java/li/cil/oc2/common/item/WrenchItem.java index 9ca83d36..7cc8f9a2 100644 --- a/src/main/java/li/cil/oc2/common/item/WrenchItem.java +++ b/src/main/java/li/cil/oc2/common/item/WrenchItem.java @@ -14,26 +14,26 @@ import net.minecraft.world.World; public final class WrenchItem extends ModItem { @Override - public ActionResultType onItemUse(final ItemUseContext context) { + public ActionResultType useOn(final ItemUseContext context) { final PlayerEntity player = context.getPlayer(); - if (!player.isSneaking()) { - return super.onItemUse(context); + if (!player.isShiftKeyDown()) { + return super.useOn(context); } - final World world = context.getWorld(); - final BlockPos pos = context.getPos(); + final World world = context.getLevel(); + final BlockPos pos = context.getClickedPos(); final BlockState state = world.getBlockState(pos); - if (!state.isIn(BlockTags.WRENCH_BREAKABLE)) { - return super.onItemUse(context); + if (!state.is(BlockTags.WRENCH_BREAKABLE)) { + return super.useOn(context); } - if (world.isRemote()) { - Minecraft.getInstance().playerController.onPlayerDestroyBlock(pos); + if (world.isClientSide) { + Minecraft.getInstance().gameMode.destroyBlock(pos); } else if (player instanceof ServerPlayerEntity) { - ((ServerPlayerEntity) player).interactionManager.tryHarvestBlock(pos); + ((ServerPlayerEntity) player).gameMode.destroyBlock(pos); } - return ActionResultType.func_233537_a_(world.isRemote); + return ActionResultType.sidedSuccess(world.isClientSide); } @Override diff --git a/src/main/java/li/cil/oc2/common/item/crafting/WrenchRecipe.java b/src/main/java/li/cil/oc2/common/item/crafting/WrenchRecipe.java index fda1ee0d..8a01feee 100644 --- a/src/main/java/li/cil/oc2/common/item/crafting/WrenchRecipe.java +++ b/src/main/java/li/cil/oc2/common/item/crafting/WrenchRecipe.java @@ -14,15 +14,15 @@ import org.jetbrains.annotations.Nullable; public final class WrenchRecipe extends ShapelessRecipe { public WrenchRecipe(final ShapelessRecipe recipe) { - super(recipe.getId(), recipe.getGroup(), recipe.getRecipeOutput(), recipe.getIngredients()); + super(recipe.getId(), recipe.getGroup(), recipe.getResultItem(), recipe.getIngredients()); } @Override public NonNullList getRemainingItems(final CraftingInventory inventory) { - final NonNullList result = NonNullList.withSize(inventory.getSizeInventory(), ItemStack.EMPTY); + final NonNullList result = NonNullList.withSize(inventory.getContainerSize(), ItemStack.EMPTY); - for (int slot = 0; slot < inventory.getSizeInventory(); slot++) { - final ItemStack stack = inventory.getStackInSlot(slot); + for (int slot = 0; slot < inventory.getContainerSize(); slot++) { + final ItemStack stack = inventory.getItem(slot); if (stack.hasContainerItem()) { result.set(slot, stack.getContainerItem()); } else if (Wrenches.isWrench(stack)) { @@ -42,19 +42,19 @@ public final class WrenchRecipe extends ShapelessRecipe { public static final class Serializer extends ForgeRegistryEntry> implements IRecipeSerializer { @Override - public WrenchRecipe read(final ResourceLocation location, final JsonObject json) { - return new WrenchRecipe(CRAFTING_SHAPELESS.read(location, json)); + public WrenchRecipe fromJson(final ResourceLocation location, final JsonObject json) { + return new WrenchRecipe(SHAPELESS_RECIPE.fromJson(location, json)); } @Nullable @Override - public WrenchRecipe read(final ResourceLocation location, final PacketBuffer buffer) { - return new WrenchRecipe(CRAFTING_SHAPELESS.read(location, buffer)); + public WrenchRecipe fromNetwork(final ResourceLocation location, final PacketBuffer buffer) { + return new WrenchRecipe(SHAPELESS_RECIPE.fromNetwork(location, buffer)); } @Override - public void write(final PacketBuffer buffer, final WrenchRecipe recipe) { - CRAFTING_SHAPELESS.write(buffer, recipe); + public void toNetwork(final PacketBuffer buffer, final WrenchRecipe recipe) { + SHAPELESS_RECIPE.toNetwork(buffer, recipe); } } } diff --git a/src/main/java/li/cil/oc2/common/network/MessageUtils.java b/src/main/java/li/cil/oc2/common/network/MessageUtils.java index de70a9c7..31870579 100644 --- a/src/main/java/li/cil/oc2/common/network/MessageUtils.java +++ b/src/main/java/li/cil/oc2/common/network/MessageUtils.java @@ -22,7 +22,7 @@ public final class MessageUtils { } final ServerWorld world = player.getLevel(); - final TileEntity tileEntity = WorldUtils.getTileEntityIfChunkExists(world, pos); + final TileEntity tileEntity = WorldUtils.getBlockEntityIfChunkExists(world, pos); if (type.isInstance(tileEntity)) { callback.accept((T) tileEntity); } diff --git a/src/main/java/li/cil/oc2/common/serialization/BlobStorage.java b/src/main/java/li/cil/oc2/common/serialization/BlobStorage.java index 44b71a72..a3688599 100644 --- a/src/main/java/li/cil/oc2/common/serialization/BlobStorage.java +++ b/src/main/java/li/cil/oc2/common/serialization/BlobStorage.java @@ -118,7 +118,7 @@ public final class BlobStorage { */ public static void setServer(final MinecraftServer server) { synchronize(); - dataDirectory = server.func_240776_a_(BLOBS_FOLDER_NAME); + dataDirectory = server.getWorldPath(BLOBS_FOLDER_NAME); try { Files.createDirectories(dataDirectory); } catch (final IOException e) { diff --git a/src/main/java/li/cil/oc2/common/serialization/NBTSerialization.java b/src/main/java/li/cil/oc2/common/serialization/NBTSerialization.java index 1fadf3f4..a1fe03e2 100644 --- a/src/main/java/li/cil/oc2/common/serialization/NBTSerialization.java +++ b/src/main/java/li/cil/oc2/common/serialization/NBTSerialization.java @@ -132,7 +132,7 @@ public final class NBTSerialization { tag.putString(name, (String) value); } else if (type == UUID.class) { final CompoundNBT uuidTag = new CompoundNBT(); - uuidTag.putUniqueId(name, (UUID) value); + uuidTag.putUUID(name, (UUID) value); tag.put(name, uuidTag); } else { final CompoundNBT valueTag = new CompoundNBT(); @@ -277,7 +277,7 @@ public final class NBTSerialization { } else if (type == String.class) { return tag.getString(name); } else if (type == UUID.class) { - return tag.getCompound(name).getUniqueId(name); + return tag.getCompound(name).getUUID(name); } else { final CompoundNBT valueTag = tag.getCompound(name); return Ceres.getSerializer(type).deserialize(new Deserializer(valueTag), (Class) type, into); @@ -382,7 +382,7 @@ public final class NBTSerialization { public Object deserialize(final INBT tag, final Class type, @Nullable final Object into) { boolean[] data = (boolean[]) into; if (tag instanceof ByteArrayNBT) { - final byte[] convertedData = ((ByteArrayNBT) tag).getByteArray(); + final byte[] convertedData = ((ByteArrayNBT) tag).getAsByteArray(); if (data == null || data.length != convertedData.length) { data = new boolean[convertedData.length]; } @@ -404,7 +404,7 @@ public final class NBTSerialization { public Object deserialize(final INBT tag, final Class type, @Nullable final Object into) { final byte[] data = (byte[]) into; if (tag instanceof ByteArrayNBT) { - final byte[] serializedData = ((ByteArrayNBT) tag).getByteArray(); + final byte[] serializedData = ((ByteArrayNBT) tag).getAsByteArray(); if (data == null || data.length != serializedData.length) { return serializedData; } @@ -429,7 +429,7 @@ public final class NBTSerialization { public Object deserialize(final INBT tag, final Class type, @Nullable final Object into) { char[] data = (char[]) into; if (tag instanceof IntArrayNBT) { - final int[] convertedData = ((IntArrayNBT) tag).getIntArray(); + final int[] convertedData = ((IntArrayNBT) tag).getAsIntArray(); if (data == null || data.length != convertedData.length) { data = new char[convertedData.length]; } @@ -456,7 +456,7 @@ public final class NBTSerialization { public Object deserialize(final INBT tag, final Class type, @Nullable final Object into) { short[] data = (short[]) into; if (tag instanceof IntArrayNBT) { - final int[] convertedData = ((IntArrayNBT) tag).getIntArray(); + final int[] convertedData = ((IntArrayNBT) tag).getAsIntArray(); if (data == null || data.length != convertedData.length) { data = new short[convertedData.length]; } @@ -478,7 +478,7 @@ public final class NBTSerialization { public Object deserialize(final INBT tag, final Class type, @Nullable final Object into) { final int[] data = (int[]) into; if (tag instanceof IntArrayNBT) { - final int[] serializedData = ((IntArrayNBT) tag).getIntArray(); + final int[] serializedData = ((IntArrayNBT) tag).getAsIntArray(); if (data == null || data.length != serializedData.length) { return serializedData; } @@ -523,7 +523,7 @@ public final class NBTSerialization { public Object deserialize(final INBT tag, final Class type, @Nullable final Object into) { float[] data = (float[]) into; if (tag instanceof IntArrayNBT) { - final int[] convertedData = ((IntArrayNBT) tag).getIntArray(); + final int[] convertedData = ((IntArrayNBT) tag).getAsIntArray(); if (data == null || data.length != convertedData.length) { data = new float[convertedData.length]; } @@ -581,7 +581,7 @@ public final class NBTSerialization { Enum[] data = (Enum[]) into; if (tag instanceof IntArrayNBT) { - final int[] serializedData = ((IntArrayNBT) tag).getIntArray(); + final int[] serializedData = ((IntArrayNBT) tag).getAsIntArray(); if (data == null || data.length != serializedData.length) { data = (Enum[]) Array.newInstance(componentType, serializedData.length); } @@ -609,7 +609,7 @@ public final class NBTSerialization { String[] data = (String[]) into; if (tag instanceof ListNBT) { final ListNBT serializedData = (ListNBT) tag; - if (serializedData.isEmpty() || serializedData.getTagType() == NBTTagIds.TAG_STRING) { + if (serializedData.isEmpty() || serializedData.getElementType() == NBTTagIds.TAG_STRING) { if (data == null || data.length != serializedData.size()) { data = new String[serializedData.size()]; } @@ -638,7 +638,7 @@ public final class NBTSerialization { UUID[] data = (UUID[]) into; if (tag instanceof ListNBT) { final ListNBT serializedData = (ListNBT) tag; - if (serializedData.isEmpty() || serializedData.getTagType() == NBTTagIds.TAG_STRING) { + if (serializedData.isEmpty() || serializedData.getElementType() == NBTTagIds.TAG_STRING) { if (data == null || data.length != serializedData.size()) { data = new UUID[serializedData.size()]; } diff --git a/src/main/java/li/cil/oc2/common/serialization/NBTToJsonConverter.java b/src/main/java/li/cil/oc2/common/serialization/NBTToJsonConverter.java index a4fa0b44..a18d9d4e 100644 --- a/src/main/java/li/cil/oc2/common/serialization/NBTToJsonConverter.java +++ b/src/main/java/li/cil/oc2/common/serialization/NBTToJsonConverter.java @@ -14,33 +14,33 @@ public final class NBTToJsonConverter { switch (tag.getId()) { case NBTTagIds.TAG_BYTE: { - return new JsonPrimitive(((ByteNBT) tag).getByte()); + return new JsonPrimitive(((ByteNBT) tag).getAsByte()); } case NBTTagIds.TAG_SHORT: { - return new JsonPrimitive(((ShortNBT) tag).getShort()); + return new JsonPrimitive(((ShortNBT) tag).getAsShort()); } case NBTTagIds.TAG_INT: { - return new JsonPrimitive(((IntNBT) tag).getInt()); + return new JsonPrimitive(((IntNBT) tag).getAsInt()); } case NBTTagIds.TAG_LONG: { - return new JsonPrimitive(((LongNBT) tag).getLong()); + return new JsonPrimitive(((LongNBT) tag).getAsLong()); } case NBTTagIds.TAG_FLOAT: { - return new JsonPrimitive(((FloatNBT) tag).getFloat()); + return new JsonPrimitive(((FloatNBT) tag).getAsFloat()); } case NBTTagIds.TAG_DOUBLE: { - return new JsonPrimitive(((DoubleNBT) tag).getDouble()); + return new JsonPrimitive(((DoubleNBT) tag).getAsDouble()); } case NBTTagIds.TAG_BYTE_ARRAY: { final JsonArray json = new JsonArray(); - final byte[] array = ((ByteArrayNBT) tag).getByteArray(); + final byte[] array = ((ByteArrayNBT) tag).getAsByteArray(); for (int i = 0; i < array.length; i++) { json.add(array[i]); } return json; } case NBTTagIds.TAG_STRING: { - return new JsonPrimitive(tag.getString()); + return new JsonPrimitive(tag.getAsString()); } case NBTTagIds.TAG_LIST: { final JsonArray json = new JsonArray(); @@ -53,14 +53,14 @@ public final class NBTToJsonConverter { case NBTTagIds.TAG_COMPOUND: { final JsonObject json = new JsonObject(); final CompoundNBT compoundTag = (CompoundNBT) tag; - for (final String key : compoundTag.keySet()) { + for (final String key : compoundTag.getAllKeys()) { json.add(key, convert(compoundTag.get(key))); } return json; } case NBTTagIds.TAG_INT_ARRAY: { final JsonArray json = new JsonArray(); - final int[] array = ((IntArrayNBT) tag).getIntArray(); + final int[] array = ((IntArrayNBT) tag).getAsIntArray(); for (int i = 0; i < array.length; i++) { json.add(array[i]); } diff --git a/src/main/java/li/cil/oc2/common/serialization/serializers/DirectionJsonSerializer.java b/src/main/java/li/cil/oc2/common/serialization/serializers/DirectionJsonSerializer.java index 60a6fb01..d4c18e0f 100644 --- a/src/main/java/li/cil/oc2/common/serialization/serializers/DirectionJsonSerializer.java +++ b/src/main/java/li/cil/oc2/common/serialization/serializers/DirectionJsonSerializer.java @@ -24,7 +24,7 @@ public final class DirectionJsonSerializer implements JsonDeserializer } final String json = (String) visitor.getObject("value", String.class, null); - return ITextComponent.Serializer.getComponentFromJson(json); + return ITextComponent.Serializer.fromJson(json); } } diff --git a/src/main/java/li/cil/oc2/common/tileentity/AbstractTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/AbstractTileEntity.java index 1c150606..11e38023 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/AbstractTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/AbstractTileEntity.java @@ -68,18 +68,17 @@ public abstract class AbstractTileEntity extends TileEntity { public void onLoad() { super.onLoad(); - final World world = getWorld(); - if (world == null) { + if (level == null) { return; } - if (world.isRemote()) { + if (level.isClientSide) { loadClient(); } else { loadServer(); if (needsWorldUnloadEvent) { - ServerScheduler.scheduleOnUnload(world, onWorldUnloaded); + ServerScheduler.scheduleOnUnload(level, onWorldUnloaded); } } } @@ -96,8 +95,8 @@ public abstract class AbstractTileEntity extends TileEntity { } @Override - public void remove() { - super.remove(); // -> invalidateCaps() + public void setRemoved() { + super.setRemoved(); onUnload(); } @@ -122,10 +121,9 @@ public abstract class AbstractTileEntity extends TileEntity { } protected void onUnload() { - final World world = getWorld(); - if (world != null && !world.isRemote()) { + if (level != null && !level.isClientSide) { unloadServer(); - ServerScheduler.cancelOnUnload(world, onWorldUnloaded); + ServerScheduler.cancelOnUnload(level, onWorldUnloaded); } } diff --git a/src/main/java/li/cil/oc2/common/tileentity/BusCableTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/BusCableTileEntity.java index be91b6c3..d642e60a 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/BusCableTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/BusCableTileEntity.java @@ -41,21 +41,21 @@ public final class BusCableTileEntity extends AbstractTileEntity { /////////////////////////////////////////////////////////////////// public String getInterfaceName(final Direction side) { - final String interfaceName = interfaceNames[side.getIndex()]; + final String interfaceName = interfaceNames[side.get3DDataValue()]; return interfaceName == null ? "" : interfaceName; } public void setInterfaceName(final Direction side, final String name) { final String validatedName = validateName(name); - if (Objects.equals(validatedName, interfaceNames[side.getIndex()])) { + if (Objects.equals(validatedName, interfaceNames[side.get3DDataValue()])) { return; } - interfaceNames[side.getIndex()] = validatedName; - if (!getWorld().isRemote()) { - final BusInterfaceNameMessage message = new BusInterfaceNameMessage.ToClient(this, side, interfaceNames[side.getIndex()]); - Network.sendToClientsTrackingChunk(message, getWorld().getChunkAt(getPos())); - handleNeighborChanged(getPos().offset(side)); + interfaceNames[side.get3DDataValue()] = validatedName; + if (!level.isClientSide) { + final BusInterfaceNameMessage message = new BusInterfaceNameMessage.ToClient(this, side, interfaceNames[side.get3DDataValue()]); + Network.sendToClientsTrackingChunk(message, level.getChunkAt(getBlockPos())); + handleNeighborChanged(getBlockPos().relative(side)); } } @@ -73,13 +73,13 @@ public final class BusCableTileEntity extends AbstractTileEntity { setInterfaceName(side, ""); invalidateCapability(Capabilities.DEVICE_BUS_ELEMENT, side); - handleNeighborChanged(getPos().offset(side)); + handleNeighborChanged(getBlockPos().relative(side)); } } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); // Bus element will usually be discovered via bus scan, not via capability request, so // automatic invalidation via capability will *not* necessarily schedule a scan on the @@ -102,8 +102,8 @@ public final class BusCableTileEntity extends AbstractTileEntity { } @Override - public CompoundNBT write(CompoundNBT tag) { - tag = super.write(tag); + public CompoundNBT save(CompoundNBT tag) { + tag = super.save(tag); tag.put(BUS_ELEMENT_TAG_NAME, busElement.serializeNBT()); tag.put(INTERFACE_NAMES_TAG_NAME, serializeInterfaceNames()); @@ -111,8 +111,8 @@ public final class BusCableTileEntity extends AbstractTileEntity { } @Override - public void read(final BlockState state, final CompoundNBT tag) { - super.read(state, tag); + public void load(final BlockState state, final CompoundNBT tag) { + super.load(state, tag); busElement.deserializeNBT(tag.getList(BUS_ELEMENT_TAG_NAME, NBTTagIds.TAG_COMPOUND)); deserializeInterfaceNames(tag.getList(INTERFACE_NAMES_TAG_NAME, NBTTagIds.TAG_STRING)); } @@ -138,7 +138,7 @@ public final class BusCableTileEntity extends AbstractTileEntity { private ListNBT serializeInterfaceNames() { final ListNBT tag = new ListNBT(); for (int i = 0; i < Constants.BLOCK_FACE_COUNT; i++) { - tag.add(StringNBT.valueOf(getInterfaceName(Direction.byIndex(i)))); + tag.add(StringNBT.valueOf(getInterfaceName(Direction.from3DDataValue(i)))); } return tag; } @@ -178,7 +178,7 @@ public final class BusCableTileEntity extends AbstractTileEntity { @Override protected void collectSyntheticDevices(final World world, final BlockPos pos, final Direction direction, final HashSet devices) { super.collectSyntheticDevices(world, pos, direction, devices); - final String interfaceName = interfaceNames[direction.getIndex()]; + final String interfaceName = interfaceNames[direction.get3DDataValue()]; if (!StringUtils.isNullOrEmpty(interfaceName)) { devices.add(new BlockDeviceInfo(null, new TypeNameRPCDevice(interfaceName))); } diff --git a/src/main/java/li/cil/oc2/common/tileentity/ChargerTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/ChargerTileEntity.java index 96280bc7..dfd5a881 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/ChargerTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/ChargerTileEntity.java @@ -37,8 +37,8 @@ public final class ChargerTileEntity extends AbstractTileEntity implements ITick } @Override - public CompoundNBT write(CompoundNBT tag) { - tag = super.write(tag); + public CompoundNBT save(CompoundNBT tag) { + tag = super.save(tag); tag.put(Constants.ENERGY_TAG_NAME, energy.serializeNBT()); @@ -46,8 +46,8 @@ public final class ChargerTileEntity extends AbstractTileEntity implements ITick } @Override - public void read(final BlockState state, final CompoundNBT tag) { - super.read(state, tag); + public void load(final BlockState state, final CompoundNBT tag) { + super.load(state, tag); energy.deserializeNBT(tag.getCompound(Constants.ENERGY_TAG_NAME)); } @@ -66,7 +66,7 @@ public final class ChargerTileEntity extends AbstractTileEntity implements ITick return; } - final TileEntity tileEntity = getWorld().getTileEntity(getPos().up()); + final TileEntity tileEntity = getLevel().getBlockEntity(getBlockPos().above()); if (tileEntity != null) { chargeCapabilityProvider(tileEntity); } @@ -77,7 +77,7 @@ public final class ChargerTileEntity extends AbstractTileEntity implements ITick return; } - final List entities = getWorld().getEntitiesInAABBexcluding(null, new AxisAlignedBB(getPos().up()), null); + final List entities = getLevel().getEntities((Entity) null, new AxisAlignedBB(getBlockPos().above()), null); for (final Entity entity : entities) { chargeCapabilityProvider(entity); } diff --git a/src/main/java/li/cil/oc2/common/tileentity/ComputerTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/ComputerTileEntity.java index 1609a597..f519d0b0 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/ComputerTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/ComputerTileEntity.java @@ -103,8 +103,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic } public void start() { - final World world = getWorld(); - if (world == null || world.isRemote()) { + if (level == null || level.isClientSide) { return; } @@ -112,8 +111,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic } public void stop() { - final World world = getWorld(); - if (world == null || world.isRemote()) { + if (level == null || level.isClientSide) { return; } @@ -124,7 +122,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic NetworkHooks.openGui(player, new INamedContainerProvider() { @Override public ITextComponent getDisplayName() { - return new TranslationTextComponent(getBlockState().getBlock().getTranslationKey()); + return new TranslationTextComponent(getBlockState().getBlock().getDescriptionId()); } @Override @@ -149,26 +147,26 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic } @Override - public int size() { + public int getCount() { return 3; } }); } - }, getPos()); + }, getBlockPos()); } public void openContainerScreen(final ServerPlayerEntity player) { NetworkHooks.openGui(player, new INamedContainerProvider() { @Override public ITextComponent getDisplayName() { - return new TranslationTextComponent(getBlockState().getBlock().getTranslationKey()); + return new TranslationTextComponent(getBlockState().getBlock().getDescriptionId()); } @Override public Container createMenu(final int id, final PlayerInventory inventory, final PlayerEntity player) { return new ComputerInventoryContainer(id, ComputerTileEntity.this, inventory); } - }, getPos()); + }, getBlockPos()); } public void addTerminalUser(final PlayerEntity player) { @@ -214,8 +212,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic @Override public void tick() { - final World world = getWorld(); - if (world == null || world.isRemote()) { + if (level == null || level.isClientSide) { return; } @@ -231,15 +228,15 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic if (isNeighborUpdateScheduled) { isNeighborUpdateScheduled = false; - world.notifyNeighborsOfStateChange(getPos(), getBlockState().getBlock()); + level.updateNeighborsAt(getBlockPos(), getBlockState().getBlock()); } virtualMachine.tick(); } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); // super.remove() calls onUnload. This in turn only suspends, but we want to do // a full clean-up when we get destroyed, so stuff inside us can delete out-of-nbt @@ -266,12 +263,12 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic NBTSerialization.deserialize(tag.getCompound(TERMINAL_TAG_NAME), terminal); virtualMachine.setBusStateClient(CommonDeviceBusController.BusState.values()[tag.getInt(AbstractVirtualMachine.BUS_STATE_TAG_NAME)]); virtualMachine.setRunStateClient(VMRunState.values()[tag.getInt(AbstractVirtualMachine.RUN_STATE_TAG_NAME)]); - virtualMachine.setBootErrorClient(ITextComponent.Serializer.getComponentFromJson(tag.getString(AbstractVirtualMachine.BOOT_ERROR_TAG_NAME))); + virtualMachine.setBootErrorClient(ITextComponent.Serializer.fromJson(tag.getString(AbstractVirtualMachine.BOOT_ERROR_TAG_NAME))); } @Override - public CompoundNBT write(CompoundNBT tag) { - tag = super.write(tag); + public CompoundNBT save(final CompoundNBT tag) { + super.save(tag); tag.put(STATE_TAG_NAME, virtualMachine.serialize()); tag.put(TERMINAL_TAG_NAME, NBTSerialization.serialize(terminal)); @@ -282,8 +279,8 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic } @Override - public void read(final BlockState blockState, final CompoundNBT tag) { - super.read(blockState, tag); + public void load(final BlockState blockState, final CompoundNBT tag) { + super.load(blockState, tag); virtualMachine.deserialize(tag.getCompound(STATE_TAG_NAME)); NBTSerialization.deserialize(tag.getCompound(TERMINAL_TAG_NAME), terminal); @@ -324,7 +321,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic super.loadServer(); busElement.initialize(); - virtualMachine.state.builtinDevices.rtcMinecraft.setWorld(getWorld()); + virtualMachine.state.builtinDevices.rtcMinecraft.setWorld(level); } @Override @@ -361,7 +358,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic @Override protected void onContentsChanged(final DeviceItemStackHandler itemStackHandler, final int slot) { super.onContentsChanged(itemStackHandler, slot); - markDirty(); + setChanged(); isNeighborUpdateScheduled = true; } } @@ -382,7 +379,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic @Override public boolean canScanContinueTowards(@Nullable final Direction direction) { - return getBlockState().get(ComputerBlock.HORIZONTAL_FACING) != direction; + return getBlockState().getValue(ComputerBlock.FACING) != direction; } } @@ -411,7 +408,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic if (value == VMRunState.RUNNING) { if (!LoopingSoundManager.isPlaying(ComputerTileEntity.this)) { - LoopingSoundManager.play(ComputerTileEntity.this, SoundEvents.COMPUTER_RUNNING.get(), getWorld().getRandom().nextInt(MAX_RUNNING_SOUND_DELAY)); + LoopingSoundManager.play(ComputerTileEntity.this, SoundEvents.COMPUTER_RUNNING.get(), level.getRandom().nextInt(MAX_RUNNING_SOUND_DELAY)); } } else { LoopingSoundManager.stop(ComputerTileEntity.this); @@ -421,11 +418,11 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic @Override public void tick() { if (chunk == null) { - chunk = world.getChunkAt(getPos()); + chunk = level.getChunkAt(getBlockPos()); } if (isRunning()) { - chunk.markDirty(); + chunk.markUnsaved(); } super.tick(); @@ -465,7 +462,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic if (value == CommonDeviceBusController.BusState.READY) { // Bus just became ready, meaning new devices may be available, meaning new // capabilities may be available, so we need to tell our neighbors. - world.notifyNeighborsOfStateChange(getPos(), getBlockState().getBlock()); + level.updateNeighborsAt(getBlockPos(), getBlockState().getBlock()); } } diff --git a/src/main/java/li/cil/oc2/common/tileentity/CreativeEnergyTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/CreativeEnergyTileEntity.java index 488f239e..9a927e22 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/CreativeEnergyTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/CreativeEnergyTileEntity.java @@ -21,10 +21,10 @@ public final class CreativeEnergyTileEntity extends TileEntity implements ITicka @Override public void tick() { for (final Direction side : SIDES) { - final BlockPos neighborPos = getPos().offset(side); + final BlockPos neighborPos = getBlockPos().relative(side); final ChunkPos neighborChunkPos = new ChunkPos(neighborPos); - if (getWorld().chunkExists(neighborChunkPos.x, neighborChunkPos.z)) { - final TileEntity tileEntity = getWorld().getTileEntity(neighborPos); + if (getLevel().hasChunk(neighborChunkPos.x, neighborChunkPos.z)) { + final TileEntity tileEntity = getLevel().getBlockEntity(neighborPos); if (tileEntity != null) { tileEntity.getCapability(Capabilities.ENERGY_STORAGE, side.getOpposite()).ifPresent(energy -> { energy.receiveEnergy(Integer.MAX_VALUE, false); diff --git a/src/main/java/li/cil/oc2/common/tileentity/DiskDriveTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/DiskDriveTileEntity.java index 8591504f..ecc227e4 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/DiskDriveTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/DiskDriveTileEntity.java @@ -89,8 +89,8 @@ public final class DiskDriveTileEntity extends AbstractTileEntity { public void eject() { final ItemStack stack = itemHandler.extractItem(0, 1, false); if (!stack.isEmpty()) { - final Direction facing = getBlockState().get(DiskDriveBlock.HORIZONTAL_FACING); - ItemStackUtils.spawnAsEntity(getWorld(), getPos().offset(facing), stack, facing); + final Direction facing = getBlockState().getValue(DiskDriveBlock.FACING); + ItemStackUtils.spawnAsEntity(level, getBlockPos().relative(facing), stack, facing); ejectSoundEmitter.play(); } } @@ -123,8 +123,8 @@ public final class DiskDriveTileEntity extends AbstractTileEntity { } @Override - public CompoundNBT write(CompoundNBT tag) { - tag = super.write(tag); + public CompoundNBT save(CompoundNBT tag) { + tag = super.save(tag); tag.put(Constants.ITEMS_TAG_NAME, itemHandler.serializeNBT()); @@ -132,8 +132,8 @@ public final class DiskDriveTileEntity extends AbstractTileEntity { } @Override - public void read(final BlockState state, final CompoundNBT tag) { - super.read(state, tag); + public void load(final BlockState state, final CompoundNBT tag) { + super.load(state, tag); itemHandler.deserializeNBT(tag.getCompound(Constants.ITEMS_TAG_NAME)); } @@ -174,8 +174,7 @@ public final class DiskDriveTileEntity extends AbstractTileEntity { protected void onContentsChanged(final int slot) { super.onContentsChanged(slot); - final World world = getWorld(); - if (world == null || world.isRemote()) { + if (level == null || level.isClientSide) { return; } @@ -187,7 +186,7 @@ public final class DiskDriveTileEntity extends AbstractTileEntity { device.updateBlockDevice(tag); } - Network.sendToClientsTrackingChunk(new DiskDriveFloppyMessage(DiskDriveTileEntity.this), world.getChunkAt(getPos())); + Network.sendToClientsTrackingChunk(new DiskDriveFloppyMessage(DiskDriveTileEntity.this), level.getChunkAt(getBlockPos())); } private void exportDeviceDataToItemStack(final ItemStack stack) { @@ -195,8 +194,7 @@ public final class DiskDriveTileEntity extends AbstractTileEntity { return; } - final World world = getWorld(); - if (world == null || world.isRemote()) { + if (level == null || level.isClientSide) { return; } diff --git a/src/main/java/li/cil/oc2/common/tileentity/NetworkConnectorTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/NetworkConnectorTileEntity.java index c9d2a2ee..e5a86e56 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/NetworkConnectorTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/NetworkConnectorTileEntity.java @@ -81,12 +81,12 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme return ConnectionResult.FAILURE; } - final World world = connectorA.getWorld(); - if (world == null || world.isRemote()) { + final World world = connectorA.level; + if (world == null || world.isClientSide) { return ConnectionResult.FAILURE; } - if (connectorB.getWorld() != world) { + if (connectorB.level != world) { return ConnectionResult.FAILURE; } @@ -94,10 +94,10 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme return ConnectionResult.FAILURE_FULL; } - final BlockPos posA = connectorA.getPos(); - final BlockPos posB = connectorB.getPos(); + final BlockPos posA = connectorA.getBlockPos(); + final BlockPos posB = connectorB.getBlockPos(); - if (!posA.withinDistance(posB, MAX_CONNECTION_DISTANCE)) { + if (!posA.closerThan(posB, MAX_CONNECTION_DISTANCE)) { return ConnectionResult.FAILURE_TOO_FAR; } @@ -125,8 +125,8 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme result = ConnectionResult.SUCCESS; } - connectorA.markDirty(); - connectorB.markDirty(); + connectorA.setChanged(); + connectorB.setChanged(); return result; } @@ -136,10 +136,9 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme connectors.remove(pos); if (ownedCables.remove(pos)) { - final World world = getWorld(); - if (world != null) { - final Vector3d middle = Vector3d.copyCentered(getPos().add(pos)).scale(0.5f); - ItemStackUtils.spawnAsEntity(world, middle, new ItemStack(Items.NETWORK_CABLE.get())); + if (level != null) { + final Vector3d middle = Vector3d.atCenterOf(getBlockPos().offset(pos)).scale(0.5f); + ItemStackUtils.spawnAsEntity(level, middle, new ItemStack(Items.NETWORK_CABLE.get())); } } @@ -148,7 +147,7 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme onConnectedPositionsChanged(); } - markDirty(); + setChanged(); } } @@ -224,8 +223,8 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme } @Override - public CompoundNBT write(CompoundNBT tag) { - tag = super.write(tag); + public CompoundNBT save(CompoundNBT tag) { + tag = super.save(tag); final ListNBT connections = new ListNBT(); for (final BlockPos position : connectorPositions) { @@ -241,8 +240,8 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme } @Override - public void read(final BlockState state, final CompoundNBT tag) { - super.read(state, tag); + public void load(final BlockState state, final CompoundNBT tag) { + super.load(state, tag); final ListNBT connections = tag.getList(CONNECTIONS_TAG_NAME, NBTTagIds.TAG_COMPOUND); for (int i = 0; i < Math.min(connections.size(), MAX_CONNECTION_COUNT); i++) { @@ -264,16 +263,16 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme } @Override - public void remove() { - super.remove(); + public void setRemoved() { + super.setRemoved(); // When we're being removed we want to break the actual link to any connected // connectors. This will also cause cables to be dropped. final ArrayList list = new ArrayList<>(connectors.values()); connectors.clear(); for (final NetworkConnectorTileEntity connector : list) { - disconnectFrom(connector.getPos()); - connector.disconnectFrom(getPos()); + disconnectFrom(connector.getBlockPos()); + connector.disconnectFrom(getBlockPos()); } } @@ -283,7 +282,7 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme // When unloading, we just want to remove the reference to this tile entity // from connected connectors; we don't want to actually break the link. - final BlockPos pos = getPos(); + final BlockPos pos = getBlockPos(); for (final NetworkConnectorTileEntity connector : connectors.values()) { connector.connectors.remove(pos); if (connector.connectorPositions.contains(pos)) { @@ -294,8 +293,11 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme @Override public AxisAlignedBB getRenderBoundingBox() { - if (Minecraft.isFabulousGraphicsEnabled()) { - return new AxisAlignedBB(pos.add(-MAX_CONNECTION_DISTANCE, -MAX_CONNECTION_DISTANCE, -MAX_CONNECTION_DISTANCE), pos.add(1 + MAX_CONNECTION_DISTANCE, 1 + MAX_CONNECTION_DISTANCE, 1 + MAX_CONNECTION_DISTANCE)); + if (Minecraft.useShaderTransparency()) { + return new AxisAlignedBB( + getBlockPos().offset(-MAX_CONNECTION_DISTANCE, -MAX_CONNECTION_DISTANCE, -MAX_CONNECTION_DISTANCE), + getBlockPos().offset(1 + MAX_CONNECTION_DISTANCE, 1 + MAX_CONNECTION_DISTANCE, 1 + MAX_CONNECTION_DISTANCE) + ); } else { return super.getRenderBoundingBox(); } @@ -319,21 +321,20 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme return; } - final World world = getWorld(); - if (world == null || world.isRemote()) { + if (level == null || level.isClientSide) { return; } final Direction facing = NetworkConnectorBlock.getFacing(getBlockState()); - final BlockPos sourcePos = getPos().offset(facing.getOpposite()); + final BlockPos sourcePos = getBlockPos().relative(facing.getOpposite()); final ChunkPos sourceChunk = new ChunkPos(sourcePos); - if (!world.chunkExists(sourceChunk.x, sourceChunk.z)) { - ServerScheduler.schedule(world, this::setLocalInterfaceChanged, RETRY_UNLOADED_CHUNK_INTERVAL); + if (!level.hasChunk(sourceChunk.x, sourceChunk.z)) { + ServerScheduler.schedule(level, this::setLocalInterfaceChanged, RETRY_UNLOADED_CHUNK_INTERVAL); return; } - final TileEntity tileEntity = world.getTileEntity(sourcePos); + final TileEntity tileEntity = level.getBlockEntity(sourcePos); if (tileEntity == null) { return; } @@ -351,18 +352,17 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme return; } - final World world = getWorld(); - if (world == null || world.isRemote()) { + if (level == null || level.isClientSide) { return; } final ChunkPos destinationChunk = new ChunkPos(connectedPosition); - if (!world.chunkExists(destinationChunk.x, destinationChunk.z)) { - ServerScheduler.schedule(world, () -> dirtyConnectors.add(connectedPosition), RETRY_UNLOADED_CHUNK_INTERVAL); + if (!level.hasChunk(destinationChunk.x, destinationChunk.z)) { + ServerScheduler.schedule(level, () -> dirtyConnectors.add(connectedPosition), RETRY_UNLOADED_CHUNK_INTERVAL); return; } - final TileEntity tileEntity = world.getTileEntity(connectedPosition); + final TileEntity tileEntity = level.getBlockEntity(connectedPosition); if (!(tileEntity instanceof NetworkConnectorTileEntity)) { disconnectFrom(connectedPosition); return; @@ -370,15 +370,15 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme final NetworkConnectorTileEntity connector = (NetworkConnectorTileEntity) tileEntity; - if (!connectedPosition.withinDistance(getPos(), MAX_CONNECTION_DISTANCE)) { + if (!connectedPosition.closerThan(getBlockPos(), MAX_CONNECTION_DISTANCE)) { disconnectFrom(connectedPosition); - connector.disconnectFrom(getPos()); + connector.disconnectFrom(getBlockPos()); return; } - if (isObstructed(world, getPos(), connectedPosition)) { + if (isObstructed(level, getBlockPos(), connectedPosition)) { disconnectFrom(connectedPosition); - connector.disconnectFrom(getPos()); + connector.disconnectFrom(getBlockPos()); return; } @@ -386,21 +386,21 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme } private static boolean isObstructed(final World world, final BlockPos a, final BlockPos b) { - final Vector3d va = Vector3d.copyCentered(a); - final Vector3d vb = Vector3d.copyCentered(b); + final Vector3d va = Vector3d.atCenterOf(a); + final Vector3d vb = Vector3d.atCenterOf(b); final Vector3d ab = vb.subtract(va).normalize().scale(0.5); // Because of floating point inaccuracies the raytrace is not necessarily // symmetric. In particular when grazing corners perfectly, e.g. two connectors // attached to the same block at a 90 degree angle. So we check both ways. - final BlockRayTraceResult hitAB = world.rayTraceBlocks(new RayTraceContext( + final BlockRayTraceResult hitAB = world.clip(new RayTraceContext( va.add(ab), vb.subtract(ab), RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, null )); - final BlockRayTraceResult hitBA = world.rayTraceBlocks(new RayTraceContext( + final BlockRayTraceResult hitBA = world.clip(new RayTraceContext( vb.subtract(ab), va.add(ab), RayTraceContext.BlockMode.COLLIDER, @@ -413,10 +413,10 @@ public final class NetworkConnectorTileEntity extends AbstractTileEntity impleme } private void onConnectedPositionsChanged() { - final World world = getWorld(); - if (world != null && !world.isRemote()) { + + if (level != null && !level.isClientSide) { final NetworkConnectorConnectionsMessage message = new NetworkConnectorConnectionsMessage(this); - final Chunk chunk = world.getChunkAt(getPos()); + final Chunk chunk = level.getChunkAt(getBlockPos()); Network.sendToClientsTrackingChunk(message, chunk); } } diff --git a/src/main/java/li/cil/oc2/common/tileentity/NetworkHubTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/NetworkHubTileEntity.java index 61fc584e..58d71ca8 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/NetworkHubTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/NetworkHubTileEntity.java @@ -63,20 +63,20 @@ public final class NetworkHubTileEntity extends AbstractTileEntity implements Ne areAdjacentInterfacesDirty = false; - final World world = getWorld(); - if (world == null || world.isRemote()) { + final World world = getLevel(); + if (world == null || world.isClientSide) { return; } - final BlockPos pos = getPos(); + final BlockPos pos = getBlockPos(); for (final Direction side : Constants.DIRECTIONS) { - adjacentInterfaces[side.getIndex()] = null; + adjacentInterfaces[side.get3DDataValue()] = null; - final TileEntity neighborTileEntity = world.getTileEntity(pos.offset(side)); + final TileEntity neighborTileEntity = world.getBlockEntity(pos.relative(side)); if (neighborTileEntity != null) { final LazyOptional capability = neighborTileEntity.getCapability(Capabilities.NETWORK_INTERFACE, side.getOpposite()); capability.ifPresent(adjacentInterface -> { - adjacentInterfaces[side.getIndex()] = adjacentInterface; + adjacentInterfaces[side.get3DDataValue()] = adjacentInterface; capability.addListener(unused -> handleNeighborChanged()); }); } diff --git a/src/main/java/li/cil/oc2/common/tileentity/RedstoneInterfaceTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/RedstoneInterfaceTileEntity.java index 3c0e30c4..f758e5c6 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/RedstoneInterfaceTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/RedstoneInterfaceTileEntity.java @@ -41,15 +41,15 @@ public final class RedstoneInterfaceTileEntity extends TileEntity implements Nam /////////////////////////////////////////////////////////////////// @Override - public CompoundNBT write(CompoundNBT compound) { - compound = super.write(compound); + public CompoundNBT save(CompoundNBT compound) { + compound = super.save(compound); compound.putByteArray(OUTPUT_TAG_NAME, output); return compound; } @Override - public void read(final BlockState state, final CompoundNBT compound) { - super.read(state, compound); + public void load(final BlockState state, final CompoundNBT compound) { + super.load(state, compound); final byte[] serializedOutput = compound.getByteArray(OUTPUT_TAG_NAME); System.arraycopy(serializedOutput, 0, output, 0, Math.min(serializedOutput.length, output.length)); } @@ -58,49 +58,49 @@ public final class RedstoneInterfaceTileEntity extends TileEntity implements Nam final Direction localDirection = HorizontalBlockUtils.toLocal(getBlockState(), direction); assert localDirection != null; - return output[localDirection.getIndex()]; + return output[localDirection.get3DDataValue()]; } @Callback(name = GET_REDSTONE_INPUT) - public int getRedstoneInput(@Parameter(SIDE) final Direction side) { - final World world = getWorld(); + public int setSignal(@Parameter(SIDE) final Direction side) { + final World world = getLevel(); if (world == null) { return 0; } - final BlockPos pos = getPos(); + final BlockPos pos = getBlockPos(); final Direction direction = HorizontalBlockUtils.toGlobal(getBlockState(), side); assert direction != null; - final BlockPos neighborPos = pos.offset(direction); + final BlockPos neighborPos = pos.relative(direction); final ChunkPos chunkPos = new ChunkPos(neighborPos.getX(), neighborPos.getZ()); - if (!world.chunkExists(chunkPos.x, chunkPos.z)) { + if (!world.hasChunk(chunkPos.x, chunkPos.z)) { return 0; } - return world.getRedstonePower(neighborPos, direction); + return world.getSignal(neighborPos, direction); } @Callback(name = GET_REDSTONE_OUTPUT, synchronize = false) - public int getRedstoneOutput(@Parameter(SIDE) final Direction side) { - return output[side.getIndex()]; + public int getSignal(@Parameter(SIDE) final Direction side) { + return output[side.get3DDataValue()]; } @Callback(name = SET_REDSTONE_OUTPUT) - public void setRedstoneOutput(@Parameter(SIDE) final Direction side, @Parameter(VALUE) final int value) { + public void getSignal(@Parameter(SIDE) final Direction side, @Parameter(VALUE) final int value) { final byte clampedValue = (byte) MathHelper.clamp(value, 0, 15); - if (clampedValue == output[side.getIndex()]) { + if (clampedValue == output[side.get3DDataValue()]) { return; } - output[side.getIndex()] = clampedValue; + output[side.get3DDataValue()] = clampedValue; final Direction direction = HorizontalBlockUtils.toGlobal(getBlockState(), side); if (direction != null) { notifyNeighbor(direction); } - markDirty(); + setChanged(); } @Override @@ -137,12 +137,12 @@ public final class RedstoneInterfaceTileEntity extends TileEntity implements Nam /////////////////////////////////////////////////////////////////// private void notifyNeighbor(final Direction direction) { - final World world = getWorld(); + final World world = getLevel(); if (world == null) { return; } - world.notifyNeighborsOfStateChange(getPos(), getBlockState().getBlock()); - world.notifyNeighborsOfStateChange(getPos().offset(direction), getBlockState().getBlock()); + world.updateNeighborsAt(getBlockPos(), getBlockState().getBlock()); + world.updateNeighborsAt(getBlockPos().relative(direction), getBlockState().getBlock()); } } diff --git a/src/main/java/li/cil/oc2/common/tileentity/TileEntities.java b/src/main/java/li/cil/oc2/common/tileentity/TileEntities.java index cc7a33ae..990e4cb2 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/TileEntities.java +++ b/src/main/java/li/cil/oc2/common/tileentity/TileEntities.java @@ -36,6 +36,6 @@ public final class TileEntities { @SuppressWarnings("ConstantConditions") // .build(null) is fine private static RegistryObject> register(final RegistryObject block, final Supplier factory) { - return TILES.register(block.getId().getPath(), () -> TileEntityType.Builder.create(factory, block.get()).build(null)); + return TILES.register(block.getId().getPath(), () -> TileEntityType.Builder.of(factory, block.get()).build(null)); } } diff --git a/src/main/java/li/cil/oc2/common/util/FakePlayerUtils.java b/src/main/java/li/cil/oc2/common/util/FakePlayerUtils.java index f4023e6b..70fc362e 100644 --- a/src/main/java/li/cil/oc2/common/util/FakePlayerUtils.java +++ b/src/main/java/li/cil/oc2/common/util/FakePlayerUtils.java @@ -24,11 +24,11 @@ public final class FakePlayerUtils { public static ServerPlayerEntity getFakePlayer(final ServerWorld world, final Entity entity) { final ServerPlayerEntity player = getFakePlayer(world); - player.copyLocationAndAnglesFrom(entity); - player.prevRotationPitch = player.rotationPitch; - player.prevRotationYaw = player.rotationYaw; - player.rotationYawHead = player.rotationYaw; - player.prevRotationYawHead = player.rotationYawHead; + player.copyPosition(entity); + player.xRotO = player.xRot; + player.yRotO = player.yRot; + player.yHeadRot = player.yRot; + player.yHeadRotO = player.yHeadRot; return player; } @@ -52,7 +52,7 @@ public final class FakePlayerUtils { } @Override - public void sendPacket(final IPacket packetIn, @Nullable final GenericFutureListener> futureListeners) { + public void send(final IPacket packetIn, @Nullable final GenericFutureListener> futureListeners) { } } } diff --git a/src/main/java/li/cil/oc2/common/util/HorizontalBlockUtils.java b/src/main/java/li/cil/oc2/common/util/HorizontalBlockUtils.java index 8935addb..59e35a1c 100644 --- a/src/main/java/li/cil/oc2/common/util/HorizontalBlockUtils.java +++ b/src/main/java/li/cil/oc2/common/util/HorizontalBlockUtils.java @@ -17,19 +17,19 @@ public final class HorizontalBlockUtils { return null; } - final int index = direction.getHorizontalIndex(); + final int index = direction.get2DDataValue(); if (index < 0) { return direction; } - if (!blockState.hasProperty(HorizontalBlock.HORIZONTAL_FACING)) { + if (!blockState.hasProperty(HorizontalBlock.FACING)) { return direction; } - final Direction facing = blockState.get(HorizontalBlock.HORIZONTAL_FACING); - final int toLocal = HORIZONTAL_DIRECTION_COUNT - facing.getHorizontalIndex(); + final Direction facing = blockState.getValue(HorizontalBlock.FACING); + final int toLocal = HORIZONTAL_DIRECTION_COUNT - facing.get2DDataValue(); final int rotatedIndex = (index + toLocal) % HORIZONTAL_DIRECTION_COUNT; - return Direction.byHorizontalIndex(rotatedIndex); + return Direction.from2DDataValue(rotatedIndex); } @Nullable @@ -38,18 +38,18 @@ public final class HorizontalBlockUtils { return null; } - final int index = direction.getHorizontalIndex(); + final int index = direction.get2DDataValue(); if (index < 0) { return direction; } - if (!blockState.hasProperty(HorizontalBlock.HORIZONTAL_FACING)) { + if (!blockState.hasProperty(HorizontalBlock.FACING)) { return direction; } - final Direction facing = blockState.get(HorizontalBlock.HORIZONTAL_FACING); - final int toGlobal = facing.getHorizontalIndex(); + final Direction facing = blockState.getValue(HorizontalBlock.FACING); + final int toGlobal = facing.get2DDataValue(); final int rotatedIndex = (index + toGlobal) % HORIZONTAL_DIRECTION_COUNT; - return Direction.byHorizontalIndex(rotatedIndex); + return Direction.from2DDataValue(rotatedIndex); } } diff --git a/src/main/java/li/cil/oc2/common/util/ItemStackUtils.java b/src/main/java/li/cil/oc2/common/util/ItemStackUtils.java index 03cde38a..223ffae8 100644 --- a/src/main/java/li/cil/oc2/common/util/ItemStackUtils.java +++ b/src/main/java/li/cil/oc2/common/util/ItemStackUtils.java @@ -24,32 +24,32 @@ public final class ItemStackUtils { } public static Optional spawnAsEntity(final World world, final BlockPos pos, final ItemStack stack) { - return spawnAsEntity(world, Vector3d.copyCentered(pos), stack); + return spawnAsEntity(world, Vector3d.atCenterOf(pos), stack); } public static Optional spawnAsEntity(final World world, final Vector3d pos, final ItemStack stack) { - if (world.isRemote() || stack.isEmpty()) { + if (world.isClientSide() || stack.isEmpty()) { return Optional.empty(); } - final Random rng = world.rand; + final Random rng = world.random; final float tx = 0.5f * (rng.nextFloat() - 1.0f); final float ty = 0.5f * (rng.nextFloat() - 1.0f); final float tz = 0.5f * (rng.nextFloat() - 1.0f); - final double px = pos.getX() + tx; - final double py = pos.getY() + ty; - final double pz = pos.getZ() + tz; + final double px = pos.x + tx; + final double py = pos.y + ty; + final double pz = pos.z + tz; final ItemEntity entity = new ItemEntity(world, px, py, pz, stack); - entity.setDefaultPickupDelay(); - world.addEntity(entity); + entity.setDefaultPickUpDelay(); + world.addFreshEntity(entity); return Optional.of(entity); } public static Optional spawnAsEntity(final World world, final BlockPos pos, final ItemStack stack, @Nullable final Direction direction) { - return spawnAsEntity(world, Vector3d.copyCentered(pos), stack, direction); + return spawnAsEntity(world, Vector3d.atCenterOf(pos), stack, direction); } public static Optional spawnAsEntity(final World world, final Vector3d pos, final ItemStack stack, @Nullable final Direction direction) { @@ -57,32 +57,32 @@ public final class ItemStackUtils { return spawnAsEntity(world, pos, stack); } - if (world.isRemote() || stack.isEmpty()) { + if (world.isClientSide || stack.isEmpty()) { return Optional.empty(); } - final Random rng = world.rand; + final Random rng = world.random; - final float ox = direction.getXOffset(); - final float oy = direction.getYOffset(); - final float oz = direction.getZOffset(); + final float ox = direction.getStepX(); + final float oy = direction.getStepY(); + final float oz = direction.getStepZ(); final float tx = 0.1f * (rng.nextFloat() - 0.5f) + ox * 0.65f; final float ty = 0.1f * (rng.nextFloat() - 0.5f) + oy * 0.75f + (ox + oz) * 0.25f; final float tz = 0.1f * (rng.nextFloat() - 0.5f) + oz * 0.65f; - final double px = pos.getX() + tx; - final double py = pos.getY() + ty; - final double pz = pos.getZ() + tz; + final double px = pos.x + tx; + final double py = pos.y + ty; + final double pz = pos.z + tz; final ItemEntity entity = new ItemEntity(world, px, py, pz, stack); - entity.setMotion( + entity.moveTo( 0.0125 * (rng.nextDouble() - 0.5) + ox * 0.03, 0.0125 * (rng.nextDouble() - 0.5) + oy * 0.08 + (ox + oz) * 0.03, 0.0125 * (rng.nextDouble() - 0.5) + oz * 0.03 ); - entity.setDefaultPickupDelay(); - world.addEntity(entity); + entity.setDefaultPickUpDelay(); + world.addFreshEntity(entity); return Optional.of(entity); } diff --git a/src/main/java/li/cil/oc2/common/util/Location.java b/src/main/java/li/cil/oc2/common/util/Location.java index 6d7cf42d..33f41d1b 100644 --- a/src/main/java/li/cil/oc2/common/util/Location.java +++ b/src/main/java/li/cil/oc2/common/util/Location.java @@ -5,6 +5,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; +import java.util.Objects; import java.util.Optional; public final class Location { @@ -18,7 +19,7 @@ public final class Location { public static Optional of(final Entity entity) { if (entity.isAlive()) { - return Optional.of(new Location(entity.getEntityWorld(), entity.getPosition())); + return Optional.of(new Location(entity.level, entity.blockPosition())); } else { return Optional.empty(); } @@ -26,7 +27,7 @@ public final class Location { public static Optional of(final TileEntity tileEntity) { if (!tileEntity.isRemoved()) { - return Optional.of(new Location(tileEntity.getWorld(), tileEntity.getPos())); + return Optional.of(new Location(Objects.requireNonNull(tileEntity.getLevel()), tileEntity.getBlockPos())); } else { return Optional.empty(); } diff --git a/src/main/java/li/cil/oc2/common/util/LocationSupplierUtils.java b/src/main/java/li/cil/oc2/common/util/LocationSupplierUtils.java index e73d9bbe..320189e4 100644 --- a/src/main/java/li/cil/oc2/common/util/LocationSupplierUtils.java +++ b/src/main/java/li/cil/oc2/common/util/LocationSupplierUtils.java @@ -18,7 +18,7 @@ public final class LocationSupplierUtils { } public static Supplier> of(final BlockDeviceQuery query) { - final Optional location = Optional.of(new Location(query.getWorld(), query.getQueryPosition())); + final Optional location = Optional.of(new Location(query.getLevel(), query.getQueryPosition())); return () -> location; } diff --git a/src/main/java/li/cil/oc2/common/util/NBTUtils.java b/src/main/java/li/cil/oc2/common/util/NBTUtils.java index 5e773087..175e8f22 100644 --- a/src/main/java/li/cil/oc2/common/util/NBTUtils.java +++ b/src/main/java/li/cil/oc2/common/util/NBTUtils.java @@ -56,6 +56,6 @@ public final class NBTUtils { } public static CompoundNBT makeInventoryTag(final ItemStack... items) { - return new ItemStackHandler(NonNullList.from(ItemStack.EMPTY, items)).serializeNBT(); + return new ItemStackHandler(NonNullList.of(ItemStack.EMPTY, items)).serializeNBT(); } } diff --git a/src/main/java/li/cil/oc2/common/util/ResourceUtils.java b/src/main/java/li/cil/oc2/common/util/ResourceUtils.java index c306b7bc..09e6f734 100644 --- a/src/main/java/li/cil/oc2/common/util/ResourceUtils.java +++ b/src/main/java/li/cil/oc2/common/util/ResourceUtils.java @@ -24,18 +24,18 @@ public final class ResourceUtils { try (final IResource metadataResource = manager.getResource(metadataLocation)) { final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(metadataResource.getInputStream(), StandardCharsets.UTF_8)); - final JsonObject metadataJson = JSONUtils.fromJson(bufferedReader); + final JsonObject metadataJson = JSONUtils.parse(bufferedReader); if (metadataJson == null) { return null; } - final String sectionName = serializer.getSectionName(); + final String sectionName = serializer.getMetadataSectionName(); if (!metadataJson.has(sectionName)) { return null; } - final JsonObject section = JSONUtils.getJsonObject(metadataJson, sectionName); - return serializer.deserialize(section); + final JsonObject section = JSONUtils.convertToJsonObject(metadataJson, sectionName); + return serializer.fromJson(section); } } } diff --git a/src/main/java/li/cil/oc2/common/util/ServerScheduler.java b/src/main/java/li/cil/oc2/common/util/ServerScheduler.java index f4d27c6d..f5d2e357 100644 --- a/src/main/java/li/cil/oc2/common/util/ServerScheduler.java +++ b/src/main/java/li/cil/oc2/common/util/ServerScheduler.java @@ -131,7 +131,7 @@ public final class ServerScheduler { @SubscribeEvent public static void handleChunkLoad(final ChunkEvent.Load event) { - final HashMap chunkMap = chunkLoadSchedulers.get(event.getWorld()); + final HashMap chunkMap = chunkLoadSchedulers.get(event.getChunk()); if (chunkMap == null) { return; } @@ -144,7 +144,7 @@ public final class ServerScheduler { @SubscribeEvent public static void handleChunkUnload(final ChunkEvent.Unload event) { - final HashMap chunkMap = chunkUnloadSchedulers.get(event.getWorld()); + final HashMap chunkMap = chunkUnloadSchedulers.get(event.getChunk()); if (chunkMap == null) { return; } diff --git a/src/main/java/li/cil/oc2/common/util/TooltipUtils.java b/src/main/java/li/cil/oc2/common/util/TooltipUtils.java index a32093bf..e08b00e8 100644 --- a/src/main/java/li/cil/oc2/common/util/TooltipUtils.java +++ b/src/main/java/li/cil/oc2/common/util/TooltipUtils.java @@ -26,7 +26,7 @@ import static li.cil.oc2.common.Constants.*; public final class TooltipUtils { private static final IFormattableTextComponent DEVICE_NEEDS_REBOOT = new TranslationTextComponent(Constants.TOOLTIP_DEVICE_NEEDS_REBOOT) - .modifyStyle(s -> s.setColor(Color.fromTextFormatting(TextFormatting.YELLOW))); + .withStyle(s -> s.withColor(Color.fromLegacyFormat(TextFormatting.YELLOW))); private static final ThreadLocal> ITEM_STACKS = ThreadLocal.withInitial(ArrayList::new); private static final ThreadLocal ITEM_STACKS_SIZES = ThreadLocal.withInitial(IntArrayList::new); @@ -38,9 +38,9 @@ public final class TooltipUtils { return; } - final String translationKey = stack.getTranslationKey() + Constants.TOOLTIP_DESCRIPTION_SUFFIX; + final String translationKey = stack.getDescriptionId() + Constants.TOOLTIP_DESCRIPTION_SUFFIX; final LanguageMap languagemap = LanguageMap.getInstance(); - if (languagemap.func_230506_b_(translationKey)) { + if (languagemap.has(translationKey)) { final TranslationTextComponent description = new TranslationTextComponent(translationKey); tooltip.add(withColor(description, TextFormatting.GRAY)); } @@ -48,7 +48,7 @@ public final class TooltipUtils { // Tooltips get queried very early in Minecraft initialization, meaning tags may not // have been initialized. Trying to directly use our tag would lead to an exception // in that case, so we do the detour through the collection instead. - final ITag tag = net.minecraft.tags.ItemTags.getCollection().get(ItemTags.DEVICE_NEEDS_REBOOT.getName()); + final ITag tag = net.minecraft.tags.ItemTags.getAllTags().getTag(ItemTags.DEVICE_NEEDS_REBOOT.getName()); if (tag != null && tag.contains(stack.getItem())) { tooltip.add(DEVICE_NEEDS_REBOOT); } @@ -91,10 +91,10 @@ public final class TooltipUtils { final ItemStack itemStack = itemStacks.get(i); tooltip.add(new StringTextComponent("- ") .append(itemStack.getDisplayName()) - .modifyStyle(style -> style.setColor(Color.fromTextFormatting(TextFormatting.GRAY))) + .withStyle(style -> style.withColor(Color.fromLegacyFormat(TextFormatting.GRAY))) .append(new StringTextComponent(" x") - .appendString(String.valueOf(itemStackSizes.getInt(i))) - .modifyStyle(style -> style.setColor(Color.fromTextFormatting(TextFormatting.DARK_GRAY)))) + .append(String.valueOf(itemStackSizes.getInt(i))) + .withStyle(style -> style.withColor(Color.fromLegacyFormat(TextFormatting.DARK_GRAY)))) ); } } @@ -121,7 +121,7 @@ public final class TooltipUtils { } public static IFormattableTextComponent withColor(final IFormattableTextComponent text, final TextFormatting formatting) { - return text.modifyStyle(s -> s.setColor(Color.fromTextFormatting(formatting))); + return text.withStyle(s -> s.withColor(Color.fromLegacyFormat(formatting))); } /////////////////////////////////////////////////////////////////// @@ -140,13 +140,13 @@ public final class TooltipUtils { final ListNBT itemsTag = tag.getList("Items", NBTTagIds.TAG_COMPOUND); for (int i = 0; i < itemsTag.size(); i++) { final CompoundNBT itemTag = itemsTag.getCompound(i); - final ItemStack itemStack = ItemStack.read(itemTag); + final ItemStack itemStack = ItemStack.of(itemTag); boolean didMerge = false; for (int j = 0; j < stacks.size(); j++) { final ItemStack existingStack = stacks.get(j); - if (ItemStack.areItemsEqual(existingStack, itemStack) && - ItemStack.areItemStackTagsEqual(existingStack, itemStack)) { + if (ItemStack.matches(existingStack, itemStack) && + ItemStack.matches(existingStack, itemStack)) { final int existingCount = stackSizes.getInt(j); stackSizes.set(j, existingCount + itemStack.getCount()); didMerge = true; diff --git a/src/main/java/li/cil/oc2/common/util/VoxelShapeUtils.java b/src/main/java/li/cil/oc2/common/util/VoxelShapeUtils.java index 843648c1..6be2aa9a 100644 --- a/src/main/java/li/cil/oc2/common/util/VoxelShapeUtils.java +++ b/src/main/java/li/cil/oc2/common/util/VoxelShapeUtils.java @@ -8,9 +8,9 @@ public final class VoxelShapeUtils { public static VoxelShape rotateHorizontalClockwise(final VoxelShape shape) { TEMP_SHAPE.set(VoxelShapes.empty()); - shape.forEachBox((minX, minY, minZ, maxX, maxY, maxZ) -> { + shape.forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> { TEMP_SHAPE.set(VoxelShapes.or(TEMP_SHAPE.get(), - VoxelShapes.create(minZ, minY, 1.0 - minX, maxZ, maxY, 1.0 - maxX) + VoxelShapes.box(minZ, minY, 1.0 - minX, maxZ, maxY, 1.0 - maxX) )); }); return TEMP_SHAPE.get(); diff --git a/src/main/java/li/cil/oc2/common/util/WorldUtils.java b/src/main/java/li/cil/oc2/common/util/WorldUtils.java index 3cb4f125..7c54f83c 100644 --- a/src/main/java/li/cil/oc2/common/util/WorldUtils.java +++ b/src/main/java/li/cil/oc2/common/util/WorldUtils.java @@ -15,23 +15,23 @@ import java.util.function.Function; public final class WorldUtils { @Nullable - public static TileEntity getTileEntityIfChunkExists(final IWorld world, final BlockPos pos) { + public static TileEntity getBlockEntityIfChunkExists(final IWorld world, final BlockPos pos) { final ChunkPos chunkPos = new ChunkPos(pos); - if (!world.chunkExists(chunkPos.x, chunkPos.z)) { + if (!world.hasChunk(chunkPos.x, chunkPos.z)) { return null; } - return world.getTileEntity(pos); + return world.getBlockEntity(pos); } @Nullable public static String getBlockName(final IWorld world, final BlockPos pos) { final ChunkPos chunkPos = new ChunkPos(pos); - if (!world.chunkExists(chunkPos.x, chunkPos.z)) { + if (!world.hasChunk(chunkPos.x, chunkPos.z)) { return null; } - final TileEntity tileEntity = world.getTileEntity(pos); + final TileEntity tileEntity = world.getBlockEntity(pos); if (tileEntity != null) { final ResourceLocation registryName = tileEntity.getType().getRegistryName(); if (registryName != null) { diff --git a/src/main/java/li/cil/oc2/common/vm/Terminal.java b/src/main/java/li/cil/oc2/common/vm/Terminal.java index d3fb2f43..1f52ff78 100644 --- a/src/main/java/li/cil/oc2/common/vm/Terminal.java +++ b/src/main/java/li/cil/oc2/common/vm/Terminal.java @@ -115,7 +115,7 @@ public final class Terminal { if (hasPendingBell) { hasPendingBell = false; final Minecraft client = Minecraft.getInstance(); - client.execute(() -> client.getSoundHandler().play(SimpleSound.master(NoteBlockInstrument.PLING.getSound(), 1))); + client.execute(() -> client.getSoundManager().play(SimpleSound.forUI(NoteBlockInstrument.PLING.getSoundEvent(), 1))); } if (renderer == null) { @@ -552,23 +552,23 @@ public final class Terminal { /////////////////////////////////////////////////////////////// private void renderBuffer() { - GlStateManager.depthMask(false); - Minecraft.getInstance().getTextureManager().bindTexture(LOCATION_FONT_TEXTURE); + GlStateManager._depthMask(false); + Minecraft.getInstance().getTextureManager().bind(LOCATION_FONT_TEXTURE); - final BufferBuilder buffer = Tessellator.getInstance().getBuffer(); + final BufferBuilder buffer = Tessellator.getInstance().getBuilder(); for (final Object line : lines) { buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEX); - buffer.setVertexState((BufferBuilder.State) line); - buffer.finishDrawing(); - WorldVertexBufferUploader.draw(buffer); + buffer.restoreState((BufferBuilder.State) line); + buffer.end(); + WorldVertexBufferUploader.end(buffer); } - GlStateManager.depthMask(true); + GlStateManager._depthMask(true); } private void validateLineCache(final AtomicInteger dirty, final MatrixStack stack) { - if (!Objects.equals(lastMatrix, stack.getLast().getMatrix())) { - lastMatrix = stack.getLast().getMatrix(); + if (!Objects.equals(lastMatrix, stack.last().pose())) { + lastMatrix = stack.last().pose(); dirty.set(-1); } @@ -576,7 +576,7 @@ public final class Terminal { return; } - final BufferBuilder buffer = Tessellator.getInstance().getBuffer(); + final BufferBuilder buffer = Tessellator.getInstance().getBuilder(); final int mask = dirty.getAndSet(0); for (int row = 0; row < lines.length; row++) { @@ -584,20 +584,20 @@ public final class Terminal { continue; } - stack.push(); + stack.pushPose(); stack.translate(0, row * CHAR_HEIGHT, 0); - final Matrix4f matrix = stack.getLast().getMatrix(); + final Matrix4f matrix = stack.last().pose(); buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEX); renderBackground(matrix, buffer, row); renderForeground(matrix, buffer, row); - lines[row] = buffer.getVertexState(); - buffer.finishDrawing(); + lines[row] = buffer.getState(); + buffer.end(); buffer.discard(); - stack.pop(); + stack.popPose(); } } @@ -651,10 +651,10 @@ public final class Terminal { final float ulu = (TEXTURE_RESOLUTION - 1) / (float) TEXTURE_RESOLUTION; final float ulv = 1 / (float) TEXTURE_RESOLUTION; - buffer.pos(matrix, x0, CHAR_HEIGHT, 0).color(r, g, b, 1).tex(ulu, ulv).endVertex(); - buffer.pos(matrix, x1, CHAR_HEIGHT, 0).color(r, g, b, 1).tex(ulu, ulv).endVertex(); - buffer.pos(matrix, x1, 0, 0).color(r, g, b, 1).tex(ulu, ulv).endVertex(); - buffer.pos(matrix, x0, 0, 0).color(r, g, b, 1).tex(ulu, ulv).endVertex(); + buffer.vertex(matrix, x0, CHAR_HEIGHT, 0).color(r, g, b, 1).uv(ulu, ulv).endVertex(); + buffer.vertex(matrix, x1, CHAR_HEIGHT, 0).color(r, g, b, 1).uv(ulu, ulv).endVertex(); + buffer.vertex(matrix, x1, 0, 0).color(r, g, b, 1).uv(ulu, ulv).endVertex(); + buffer.vertex(matrix, x0, 0, 0).color(r, g, b, 1).uv(ulu, ulv).endVertex(); } private void renderForeground(final Matrix4f matrix, final BufferBuilder buffer, final int row) { @@ -692,20 +692,20 @@ public final class Terminal { final float v0 = y * (CHAR_HEIGHT * ONE_OVER_TEXTURE_RESOLUTION); final float v1 = (y + 1) * (CHAR_HEIGHT * ONE_OVER_TEXTURE_RESOLUTION); - buffer.pos(matrix, offset, CHAR_HEIGHT, 0).color(r, g, b, 1).tex(u0, v1).endVertex(); - buffer.pos(matrix, offset + CHAR_WIDTH, CHAR_HEIGHT, 0).color(r, g, b, 1).tex(u1, v1).endVertex(); - buffer.pos(matrix, offset + CHAR_WIDTH, 0, 0).color(r, g, b, 1).tex(u1, v0).endVertex(); - buffer.pos(matrix, offset, 0, 0).color(r, g, b, 1).tex(u0, v0).endVertex(); + buffer.vertex(matrix, offset, CHAR_HEIGHT, 0).color(r, g, b, 1).uv(u0, v1).endVertex(); + buffer.vertex(matrix, offset + CHAR_WIDTH, CHAR_HEIGHT, 0).color(r, g, b, 1).uv(u1, v1).endVertex(); + buffer.vertex(matrix, offset + CHAR_WIDTH, 0, 0).color(r, g, b, 1).uv(u1, v0).endVertex(); + buffer.vertex(matrix, offset, 0, 0).color(r, g, b, 1).uv(u0, v0).endVertex(); } if ((style & STYLE_UNDERLINE_MASK) != 0) { final float ulu = (TEXTURE_RESOLUTION - 1) / (float) TEXTURE_RESOLUTION; final float ulv = 1 / (float) TEXTURE_RESOLUTION; - buffer.pos(matrix, offset, CHAR_HEIGHT - 3, 0).color(r, g, b, 1).tex(ulu, ulv).endVertex(); - buffer.pos(matrix, offset + CHAR_WIDTH, CHAR_HEIGHT - 3, 0).color(r, g, b, 1).tex(ulu, ulv).endVertex(); - buffer.pos(matrix, offset + CHAR_WIDTH, CHAR_HEIGHT - 2, 0).color(r, g, b, 1).tex(ulu, ulv).endVertex(); - buffer.pos(matrix, offset, CHAR_HEIGHT - 2, 0).color(r, g, b, 1).tex(ulu, ulv).endVertex(); + buffer.vertex(matrix, offset, CHAR_HEIGHT - 3, 0).color(r, g, b, 1).uv(ulu, ulv).endVertex(); + buffer.vertex(matrix, offset + CHAR_WIDTH, CHAR_HEIGHT - 3, 0).color(r, g, b, 1).uv(ulu, ulv).endVertex(); + buffer.vertex(matrix, offset + CHAR_WIDTH, CHAR_HEIGHT - 2, 0).color(r, g, b, 1).uv(ulu, ulv).endVertex(); + buffer.vertex(matrix, offset, CHAR_HEIGHT - 2, 0).color(r, g, b, 1).uv(ulu, ulv).endVertex(); } } @@ -714,14 +714,14 @@ public final class Terminal { return; } - GlStateManager.depthMask(false); + GlStateManager._depthMask(false); RenderSystem.disableTexture(); - stack.push(); + stack.pushPose(); stack.translate(terminal.x * CHAR_WIDTH, terminal.y * CHAR_HEIGHT, 0); - final Matrix4f matrix = stack.getLast().getMatrix(); - final BufferBuilder buffer = Tessellator.getInstance().getBuffer(); + final Matrix4f matrix = stack.last().pose(); + final BufferBuilder buffer = Tessellator.getInstance().getBuilder(); buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR); final int foreground = COLORS[COLOR_WHITE]; @@ -729,18 +729,18 @@ public final class Terminal { final float g = ((foreground >> 8) & 0xFF) / 255f; final float b = ((foreground) & 0xFF) / 255f; - buffer.pos(matrix, 0, CHAR_HEIGHT, 0).color(r, g, b, 1).endVertex(); - buffer.pos(matrix, CHAR_WIDTH, CHAR_HEIGHT, 0).color(r, g, b, 1).endVertex(); - buffer.pos(matrix, CHAR_WIDTH, 0, 0).color(r, g, b, 1).endVertex(); - buffer.pos(matrix, 0, 0, 0).color(r, g, b, 1).endVertex(); + buffer.vertex(matrix, 0, CHAR_HEIGHT, 0).color(r, g, b, 1).endVertex(); + buffer.vertex(matrix, CHAR_WIDTH, CHAR_HEIGHT, 0).color(r, g, b, 1).endVertex(); + buffer.vertex(matrix, CHAR_WIDTH, 0, 0).color(r, g, b, 1).endVertex(); + buffer.vertex(matrix, 0, 0, 0).color(r, g, b, 1).endVertex(); - buffer.finishDrawing(); - WorldVertexBufferUploader.draw(buffer); + buffer.end(); + WorldVertexBufferUploader.end(buffer); - stack.pop(); + stack.popPose(); RenderSystem.enableTexture(); - GlStateManager.depthMask(true); + GlStateManager._depthMask(true); } private static boolean isPrintableCharacter(final char ch) { From 6910dab13971f5a747fcd7c5cd06643d44a6d67d Mon Sep 17 00:00:00 2001 From: lucsoft Date: Sat, 29 May 2021 19:16:31 +0200 Subject: [PATCH 06/19] Migrated Tests and API/Bus --- Mojang.MD | 21 +++++++++++++++++++ gradle.properties | 4 ++-- .../oc2/api/bus/BlockDeviceBusElement.java | 2 +- .../bus/device/provider/BlockDeviceQuery.java | 2 +- .../li/cil/oc2/common/bus/DeviceBusTests.java | 2 +- .../serialization/SerializationTests.java | 6 +++--- 6 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Mojang.MD b/Mojang.MD index e69de29b..2ec3a0f6 100644 --- a/Mojang.MD +++ b/Mojang.MD @@ -0,0 +1,21 @@ +**Last Modified**: 02/17/2021 + +At the time of this writing, the current license applied to the Official Mojang mapping files is: + +> (c) 2020 Microsoft Corporation. These mappings are provided "as-is" +> and you bear the risk of using them. You may copy and use the mappings +> for development purposes, but you may not redistribute the mappings +> complete and unmodified. Microsoft makes no warranties, express or +> implied, with respect to the mappings provided here. Use and +> modification of this document or the source code (in any form) of +> Minecraft: Java Edition is governed by the Minecraft End User License + +Obtained From: [1.16.5's client.txt](https://launcher.mojang.com/v1/objects/374c6b789574afbdc901371207155661e0509e17/client.txt) + +The first concern, which affects all developers most directly but is a lesser risk, is that the license terms for the official mappings don’t have any explicit provision for distributing mod code referencing Minecraft code under the official names. Since those references would have been derived from those mappings, directly or indirectly, they could still be considered derivative works used outside development, which means they may not be explicitly allowed, and so they must be covered by the fallback, the EULA, which states that mods can only distribute Mojang code/assets if they are not “substantial portions”. + +The bigger concern, which affects projects like MCPConfig, is that in order to do our job, the data we create is derived in part from the official mappings, in order to patch the vanilla code, and make it usable as a platform for mods to run on. This usage of the data may not be considered development use, and so it’s the most at risk to be excluded by the license terms. Whether or not the EULA allows this use, is not clear. + +We understand that the people at Mojang want this to be allowed, but the license does not clearly back their words, and puts us in this difficult position. However, we have almost a decade worth of working experience with the people at Mojang. To the best of our knowledge we are in good standing and they explicitly wish to allow us to use this data for our purposes. As such, we have decided to move forward with the license in it's current form. + +We advise that everyone using this project, it's data, or anything that has something to do with the Official Mojang mappings be aware of the license they are under. You can make your own decision on how you want to proceed. \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 8b11b9e3..c81248e9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,8 +5,8 @@ org.gradle.daemon=false minecraft_version=1.16.5 minecraft_version_min=1.16.5 -mappings_channel=snapshot -mappings_version=20201028-1.16.3 +mappings_channel=official +mappings_version=1.16.5 forge_version=36.1.24 forge_version_min=36.1.0 diff --git a/src/main/java/li/cil/oc2/api/bus/BlockDeviceBusElement.java b/src/main/java/li/cil/oc2/api/bus/BlockDeviceBusElement.java index d529d44d..3fc7e586 100644 --- a/src/main/java/li/cil/oc2/api/bus/BlockDeviceBusElement.java +++ b/src/main/java/li/cil/oc2/api/bus/BlockDeviceBusElement.java @@ -16,7 +16,7 @@ public interface BlockDeviceBusElement extends DeviceBusElement { * * @return the world the bus lives in. */ - IWorld getWorld(); + IWorld getLevel(); /** * The position of this bus element. diff --git a/src/main/java/li/cil/oc2/api/bus/device/provider/BlockDeviceQuery.java b/src/main/java/li/cil/oc2/api/bus/device/provider/BlockDeviceQuery.java index 827f4acf..6fe74438 100644 --- a/src/main/java/li/cil/oc2/api/bus/device/provider/BlockDeviceQuery.java +++ b/src/main/java/li/cil/oc2/api/bus/device/provider/BlockDeviceQuery.java @@ -17,7 +17,7 @@ public interface BlockDeviceQuery { * * @return the world containing the block. */ - World getWorld(); + World getLevel(); /** * The position of the block this query is performed for. diff --git a/src/test/java/li/cil/oc2/common/bus/DeviceBusTests.java b/src/test/java/li/cil/oc2/common/bus/DeviceBusTests.java index 7a3f7cf9..71f27c48 100644 --- a/src/test/java/li/cil/oc2/common/bus/DeviceBusTests.java +++ b/src/test/java/li/cil/oc2/common/bus/DeviceBusTests.java @@ -31,7 +31,7 @@ public class DeviceBusTests { public static void setup() { // Gotta go through regular MC bootstrapping first because otherwise class // load order may lead to errors because static fields reference each other. - Bootstrap.register(); + Bootstrap.bootStrap(); } @BeforeEach diff --git a/src/test/java/li/cil/oc2/common/serialization/SerializationTests.java b/src/test/java/li/cil/oc2/common/serialization/SerializationTests.java index 0623169c..6c898964 100644 --- a/src/test/java/li/cil/oc2/common/serialization/SerializationTests.java +++ b/src/test/java/li/cil/oc2/common/serialization/SerializationTests.java @@ -38,7 +38,7 @@ public final class SerializationTests { assertArrayEquals(new int[]{4, 5, 6}, nbt.getIntArray("intArrayValue")); assertArrayEquals(new long[]{7, 8, 9}, nbt.getLongArray("longArrayValue")); assertEquals("test string", nbt.getString("stringValue")); - assertEquals(uuid, nbt.getCompound("uuidValue").getUniqueId("uuidValue")); + assertEquals(uuid, nbt.getCompound("uuidValue").getUUID("uuidValue")); } @Test @@ -56,7 +56,7 @@ public final class SerializationTests { nbt.putString("stringValue", "another test"); final UUID uuid = UUID.randomUUID(); final CompoundNBT uuidNBT = new CompoundNBT(); - uuidNBT.putUniqueId("uuidValue", uuid); + uuidNBT.putUUID("uuidValue", uuid); nbt.put("uuidValue", uuidNBT); final Flat value = assertDoesNotThrow(() -> NBTSerialization.deserialize(nbt, Flat.class, new Flat())); @@ -90,7 +90,7 @@ public final class SerializationTests { nbt.putString("stringValue", "another test"); final UUID uuid = UUID.randomUUID(); final CompoundNBT uuidNBT = new CompoundNBT(); - uuidNBT.putUniqueId("uuidValue", uuid); + uuidNBT.putUUID("uuidValue", uuid); nbt.put("uuidValue", uuidNBT); final Flat value = assertDoesNotThrow(() -> NBTSerialization.deserialize(nbt, Flat.class, null)); From c03b7da00444c598f9926f14c9e6829d304af411 Mon Sep 17 00:00:00 2001 From: lucsoft Date: Sat, 29 May 2021 19:31:40 +0200 Subject: [PATCH 07/19] Fixed small rendering issues --- .../java/li/cil/oc2/client/gui/ComputerInventoryScreen.java | 2 +- .../java/li/cil/oc2/client/gui/ComputerTerminalScreen.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java b/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java index 4c0278be..cb49f9e0 100644 --- a/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java @@ -24,7 +24,7 @@ public final class ComputerInventoryScreen extends ContainerScreen Date: Sat, 29 May 2021 19:41:16 +0200 Subject: [PATCH 08/19] Changed to Correct mapping from exportToItemStack to spawnAtLocation --- src/main/java/li/cil/oc2/common/entity/RobotEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/li/cil/oc2/common/entity/RobotEntity.java b/src/main/java/li/cil/oc2/common/entity/RobotEntity.java index c762422b..d203410a 100644 --- a/src/main/java/li/cil/oc2/common/entity/RobotEntity.java +++ b/src/main/java/li/cil/oc2/common/entity/RobotEntity.java @@ -223,7 +223,7 @@ public final class RobotEntity extends Entity implements Robot { final ItemStack stack = new ItemStack(Items.ROBOT.get()); exportToItemStack(stack); - exportToItemStack(stack); + spawnAtLocation(stack); remove(); WorldUtils.playSound(level, blockPosition(), SoundType.METAL, SoundType::getBreakSound); From 6f3f83837b96fcc55752d71d5eb2375d0b38e098 Mon Sep 17 00:00:00 2001 From: lucsoft Date: Sat, 29 May 2021 20:31:16 +0200 Subject: [PATCH 09/19] WIP Fix Robot --- .../java/li/cil/oc2/client/gui/RobotTerminalScreen.java | 5 +++++ src/main/java/li/cil/oc2/common/entity/RobotEntity.java | 6 +++--- src/main/java/li/cil/oc2/common/item/RobotItem.java | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java b/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java index 0e4234b0..7c35fa4a 100644 --- a/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java @@ -38,6 +38,11 @@ public final class RobotTerminalScreen extends ContainerScreen Date: Sat, 29 May 2021 20:52:32 +0200 Subject: [PATCH 10/19] Changed Width/Height to ImageWidth and ImageHeight --- .../li/cil/oc2/client/gui/ComputerInventoryScreen.java | 8 ++++---- .../li/cil/oc2/client/gui/ComputerTerminalScreen.java | 4 ++-- .../java/li/cil/oc2/client/gui/RobotContainerScreen.java | 8 ++++---- .../java/li/cil/oc2/client/gui/RobotTerminalScreen.java | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java b/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java index cb49f9e0..024a7061 100644 --- a/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/ComputerInventoryScreen.java @@ -22,9 +22,9 @@ public final class ComputerInventoryScreen extends ContainerScreen public RobotContainerScreen(final RobotContainer container, final PlayerInventory playerInventory, final ITextComponent title) { super(container, playerInventory, title); - width = 176; - height = 197; - inventoryLabelY = height - 94; + imageWidth = 176; + imageHeight = 197; + inventoryLabelY = imageHeight - 94; } @Override @@ -66,7 +66,7 @@ public final class RobotContainerScreen extends ContainerScreen protected void renderBg(final MatrixStack matrixStack, final float partialTicks, final int mouseX, final int mouseY) { RenderSystem.color4f(1f, 1f, 1f, 1f); getMinecraft().getTextureManager().bind(BACKGROUND); - blit(matrixStack, leftPos, topPos, 0, 0, width, height); + blit(matrixStack, leftPos, topPos, 0, 0, imageWidth, imageHeight); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java b/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java index 7c35fa4a..b6862ac1 100644 --- a/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java @@ -28,8 +28,8 @@ public final class RobotTerminalScreen extends ContainerScreen Date: Thu, 3 Jun 2021 17:47:26 +0200 Subject: [PATCH 11/19] Reverted JVM Default Options --- gradlew | 2 +- gradlew.bat | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew b/gradlew index 4f906e0c..86c97c2b 100755 --- a/gradlew +++ b/gradlew @@ -44,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" diff --git a/gradlew.bat b/gradlew.bat index 107acd32..c19878d9 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -33,7 +33,7 @@ set APP_HOME=%DIRNAME% for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" +set DEFAULT_JVM_OPTS="" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome From 3ca5c9e55f0b3aab33789003eba59721c99a7c0f Mon Sep 17 00:00:00 2001 From: lucsoft Date: Thu, 3 Jun 2021 17:47:52 +0200 Subject: [PATCH 12/19] Fixed Typo --- src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java b/src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java index d8d6bf3d..14346e40 100644 --- a/src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java @@ -35,7 +35,7 @@ public final class ComputerTerminalScreen extends ContainerScreen Date: Thu, 3 Jun 2021 17:48:52 +0200 Subject: [PATCH 13/19] Fixed paramter naming in renderLabels --- src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java | 2 +- src/main/java/li/cil/oc2/client/gui/RobotTerminalScreen.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java b/src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java index 14346e40..b3d47e6d 100644 --- a/src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/ComputerTerminalScreen.java @@ -34,7 +34,7 @@ public final class ComputerTerminalScreen extends ContainerScreen Date: Thu, 3 Jun 2021 17:49:22 +0200 Subject: [PATCH 14/19] Fixed Formatting --- src/main/java/li/cil/oc2/common/entity/RobotEntity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/li/cil/oc2/common/entity/RobotEntity.java b/src/main/java/li/cil/oc2/common/entity/RobotEntity.java index 5969c522..eeb9a471 100644 --- a/src/main/java/li/cil/oc2/common/entity/RobotEntity.java +++ b/src/main/java/li/cil/oc2/common/entity/RobotEntity.java @@ -484,7 +484,9 @@ public final class RobotEntity extends Entity implements Robot { } @Override - public int getCount() { return 3; } + public int getCount() { + return 3; + } }); } }, b -> b.writeVarInt(getId())); From 5b67293188d05dcdedefc068d2d0eca3e13ab347 Mon Sep 17 00:00:00 2001 From: lucsoft Date: Thu, 3 Jun 2021 17:50:14 +0200 Subject: [PATCH 15/19] Added Comment bach in ATileEntity --- .../java/li/cil/oc2/common/tileentity/AbstractTileEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/li/cil/oc2/common/tileentity/AbstractTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/AbstractTileEntity.java index 11e38023..d24da42d 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/AbstractTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/AbstractTileEntity.java @@ -96,7 +96,7 @@ public abstract class AbstractTileEntity extends TileEntity { @Override public void setRemoved() { - super.setRemoved(); + super.setRemoved(); // -> invalidateCaps() onUnload(); } From 0833069a34f185ec032d031f9b938a945e7bb49d Mon Sep 17 00:00:00 2001 From: lucsoft Date: Thu, 3 Jun 2021 17:54:34 +0200 Subject: [PATCH 16/19] Removed Forge Notice of Mojang mappings --- Mojang.MD | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 Mojang.MD diff --git a/Mojang.MD b/Mojang.MD deleted file mode 100644 index 2ec3a0f6..00000000 --- a/Mojang.MD +++ /dev/null @@ -1,21 +0,0 @@ -**Last Modified**: 02/17/2021 - -At the time of this writing, the current license applied to the Official Mojang mapping files is: - -> (c) 2020 Microsoft Corporation. These mappings are provided "as-is" -> and you bear the risk of using them. You may copy and use the mappings -> for development purposes, but you may not redistribute the mappings -> complete and unmodified. Microsoft makes no warranties, express or -> implied, with respect to the mappings provided here. Use and -> modification of this document or the source code (in any form) of -> Minecraft: Java Edition is governed by the Minecraft End User License - -Obtained From: [1.16.5's client.txt](https://launcher.mojang.com/v1/objects/374c6b789574afbdc901371207155661e0509e17/client.txt) - -The first concern, which affects all developers most directly but is a lesser risk, is that the license terms for the official mappings don’t have any explicit provision for distributing mod code referencing Minecraft code under the official names. Since those references would have been derived from those mappings, directly or indirectly, they could still be considered derivative works used outside development, which means they may not be explicitly allowed, and so they must be covered by the fallback, the EULA, which states that mods can only distribute Mojang code/assets if they are not “substantial portions”. - -The bigger concern, which affects projects like MCPConfig, is that in order to do our job, the data we create is derived in part from the official mappings, in order to patch the vanilla code, and make it usable as a platform for mods to run on. This usage of the data may not be considered development use, and so it’s the most at risk to be excluded by the license terms. Whether or not the EULA allows this use, is not clear. - -We understand that the people at Mojang want this to be allowed, but the license does not clearly back their words, and puts us in this difficult position. However, we have almost a decade worth of working experience with the people at Mojang. To the best of our knowledge we are in good standing and they explicitly wish to allow us to use this data for our purposes. As such, we have decided to move forward with the license in it's current form. - -We advise that everyone using this project, it's data, or anything that has something to do with the Official Mojang mappings be aware of the license they are under. You can make your own decision on how you want to proceed. \ No newline at end of file From 9cebb1d9d30ec00cd643f8f953d8c96772e9413f Mon Sep 17 00:00:00 2001 From: lucsoft Date: Thu, 3 Jun 2021 17:59:31 +0200 Subject: [PATCH 17/19] obviously gradlew.bat requires an empty string not an empty string --- gradlew.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradlew.bat b/gradlew.bat index c19878d9..43f174ce 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -33,7 +33,7 @@ set APP_HOME=%DIRNAME% for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="" +set DEFAULT_JVM_OPTS= @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome From 7aa803370e02b97f6f47843c4559022c98b499c7 Mon Sep 17 00:00:00 2001 From: lucsoft Date: Thu, 3 Jun 2021 18:02:32 +0200 Subject: [PATCH 18/19] Revered Renaming of API Functions --- .../oc2/common/tileentity/RedstoneInterfaceTileEntity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/li/cil/oc2/common/tileentity/RedstoneInterfaceTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/RedstoneInterfaceTileEntity.java index f758e5c6..bfa3820b 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/RedstoneInterfaceTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/RedstoneInterfaceTileEntity.java @@ -62,7 +62,7 @@ public final class RedstoneInterfaceTileEntity extends TileEntity implements Nam } @Callback(name = GET_REDSTONE_INPUT) - public int setSignal(@Parameter(SIDE) final Direction side) { + public int setRedstoneSignal(@Parameter(SIDE) final Direction side) { final World world = getLevel(); if (world == null) { return 0; @@ -82,12 +82,12 @@ public final class RedstoneInterfaceTileEntity extends TileEntity implements Nam } @Callback(name = GET_REDSTONE_OUTPUT, synchronize = false) - public int getSignal(@Parameter(SIDE) final Direction side) { + public int getRedstoneSignal(@Parameter(SIDE) final Direction side) { return output[side.get3DDataValue()]; } @Callback(name = SET_REDSTONE_OUTPUT) - public void getSignal(@Parameter(SIDE) final Direction side, @Parameter(VALUE) final int value) { + public void getRedstoneSignal(@Parameter(SIDE) final Direction side, @Parameter(VALUE) final int value) { final byte clampedValue = (byte) MathHelper.clamp(value, 0, 15); if (clampedValue == output[side.get3DDataValue()]) { return; From 3e2d3e8fe8e7ed44aa5b27012fd05c7143f3aa39 Mon Sep 17 00:00:00 2001 From: lucsoft Date: Thu, 3 Jun 2021 18:12:39 +0200 Subject: [PATCH 19/19] Fixed Mixups in mappings (this could fix the bug introducded) --- src/main/java/li/cil/oc2/common/entity/RobotEntity.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/li/cil/oc2/common/entity/RobotEntity.java b/src/main/java/li/cil/oc2/common/entity/RobotEntity.java index eeb9a471..7e773f2f 100644 --- a/src/main/java/li/cil/oc2/common/entity/RobotEntity.java +++ b/src/main/java/li/cil/oc2/common/entity/RobotEntity.java @@ -326,7 +326,7 @@ public final class RobotEntity extends Entity implements Robot { } @Override - public boolean canBeCollidedWith() { + public boolean isPickable() { return true; } @@ -339,6 +339,11 @@ public final class RobotEntity extends Entity implements Robot { public void push(final Entity entity) { } + @Override + public boolean canBeCollidedWith() { + return true; + } + @Override public boolean canSpawnSprintParticle() { return false;