From 458854b73b09e6f8c6059f629473480d1bb36e18 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 26 Apr 2024 10:06:35 -0600 Subject: [PATCH 001/188] add saddle turtle --- .../turtle_upgrades/saddle_turtle.json | 4 + .../advancedperipherals/APCreativeTab.java | 1 + .../client/ClientRegistry.java | 1 + .../peripheral/ChunkyPeripheral.java | 2 +- .../peripheral/SaddlePeripheral.java | 157 ++++++++++++++++++ .../turtles/TurtleSaddleUpgrade.java | 45 +++++ .../configuration/PeripheralsConfig.java | 9 + .../common/data/EnUsLanguageProvider.java | 5 +- .../common/data/TurtleUpgradesProvider.java | 1 + .../common/setup/CCRegistration.java | 2 + 10 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleSaddleUpgrade.java diff --git a/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json new file mode 100644 index 000000000..0670d5c0b --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:saddle_turtle", + "item": "minecraft:saddle" +} \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java b/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java index 52eba5e66..8489c5f95 100644 --- a/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java +++ b/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java @@ -32,6 +32,7 @@ public void fillItemList(NonNullList items) { items.addAll(turtleUpgrade(CCRegistration.ID.CHATTY_TURTLE)); items.addAll(turtleUpgrade(CCRegistration.ID.CHUNKY_TURTLE)); items.addAll(turtleUpgrade(CCRegistration.ID.COMPASS_TURTLE)); + items.addAll(turtleUpgrade(CCRegistration.ID.SADDLE_TURTLE)); items.addAll(turtleUpgrade(CCRegistration.ID.PLAYER_TURTLE)); items.addAll(turtleUpgrade(CCRegistration.ID.ENVIRONMENT_TURTLE)); items.addAll(turtleUpgrade(CCRegistration.ID.GEOSCANNER_TURTLE)); diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index d5e52ae28..aa19e7877 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -39,6 +39,7 @@ public static void onClientSetup(FMLClientSetupEvent event) { ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.CHUNKY_TURTLE.get(), TurtleUpgradeModeller.flatItem()); ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.COMPASS_TURTLE.get(), TurtleUpgradeModeller.flatItem()); + ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.SADDLE_TURTLE.get(), TurtleUpgradeModeller.flatItem()); ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.CHAT_BOX_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_chat_box_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_chat_box_upgrade_right"), "inventory"))); ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.ENVIRONMENT_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_environment_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_environment_upgrade_right"), "inventory"))); ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.GEO_SCANNER_TURTLE.get(), TurtleUpgradeModeller.sided(new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_geoscanner_upgrade_left"), "inventory"), new ModelResourceLocation(AdvancedPeripherals.getRL("turtle_geoscanner_upgrade_right"), "inventory"))); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java index 94829b12f..f56d18151 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java @@ -72,7 +72,7 @@ protected void setLoadedChunk(@Nullable ChunkPos newChunk, ChunkManager manager, } @Override - public void attach(IComputerAccess computer) { + public void attach(@NotNull IComputerAccess computer) { super.attach(computer); ServerLevel level = (ServerLevel) owner.getLevel(); ChunkManager manager = ChunkManager.get(Objects.requireNonNull(level)); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java new file mode 100644 index 000000000..180f744d4 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -0,0 +1,157 @@ +package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; + +import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.MethodResult; +import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.api.turtle.ITurtleAccess; +import dan200.computercraft.api.turtle.TurtleSide; +import dan200.computercraft.shared.turtle.blocks.TileTurtle; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleSaddleUpgrade; +import de.srendi.advancedperipherals.common.configuration.APConfig; +import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Predicate; + +public class SaddlePeripheral extends BasePeripheral { + + public static final String PERIPHERAL_TYPE = "saddle"; + private TurtleSeatEntity seat = null; + + public SaddlePeripheral(ITurtleAccess turtle, TurtleSide side) { + super(PERIPHERAL_TYPE, new TurtlePeripheralOwner(turtle, side)); + } + + @Override + public boolean isEnabled() { + return APConfig.PERIPHERALS_CONFIG.enableSaddleTurtle.get(); + } + + @Nullable + public Entity getRidingEntity() { + return this.seat; + } + + public boolean isEntityRiding() { + return this.seat != null && this.seat.isAlive() && this.seat.isVehicle(); + } + + @Override + public void attach(@NotNull IComputerAccess computer) { + super.attach(computer); + } + + @Override + public void detach(@NotNull IComputerAccess computer) { + super.detach(computer); + if (this.seat != null) { + this.seat.discard(); + this.seat = null; + } + } + + public void update() { + if (this.seat != null) { + if (!this.seat.isAlive()) { + this.seat = null; + return; + } + this.seat.keepAlive(); + BlockPos pos = owner.getPos(); + Vec3 newPos = new Vec3(pos.getX() + 0.5, pos.getY() + 0.4, pos.getZ() + 0.5); + if (!this.seat.position().equals(newPos)) { + // TODO: for some reason the client position will not sync here + this.seat.moveTo(newPos); + } + } + } + + private boolean sitDown(@NotNull Entity entity) { + Level world = owner.getLevel(); + BlockPos pos = owner.getPos(); + this.seat = new TurtleSeatEntity(owner.getTurtle()); + this.seat.setPos(pos.getX() + 0.5, pos.getY() + 0.4, pos.getZ() + 0.5); + if (!world.addFreshEntity(this.seat)) { + return false; + } + if (!entity.startRiding(this.seat, true)) { + return false; + } + if (entity instanceof TamableAnimal tamable) { + tamable.setInSittingPose(true); + } + this.seat.keepAlive(); + return true; + } + + @LuaFunction(mainThread = true) + public MethodResult capture() { + if (isEntityRiding()) { + return MethodResult.of(null, "Another entity is riding"); + } + Predicate suitableEntity = (entity) -> entity.isAlive(); + if (!APConfig.PERIPHERALS_CONFIG.allowSaddleTurtleCapturePlayer.get()) { + Predicate oldSuitableEntity = suitableEntity; + suitableEntity = (entity) -> oldSuitableEntity.test(entity) && !(entity instanceof Player); + } + final Predicate finalSuitableEntity = suitableEntity; + HitResult entityHit = owner.withPlayer(player -> player.findHit(false, true, finalSuitableEntity)); + if (entityHit.getType() == HitResult.Type.MISS) { + return MethodResult.of(null, "Nothing found"); + } + LivingEntity entity = (LivingEntity) ((EntityHitResult) entityHit).getEntity(); + if (!sitDown(entity)) { + return MethodResult.of(null, "Entity cannot sit"); + } + return MethodResult.of(true); + } + + private static class TurtleSeatEntity extends SeatEntity { + private ITurtleAccess turtle; + private int life; + + public TurtleSeatEntity(ITurtleAccess turtle) { + super(turtle.getLevel(), turtle.getPosition()); + this.turtle = turtle; + this.life = 1; + } + + public ITurtleAccess getOwner() { + return turtle; + } + + public void keepAlive() { + this.life = 3; + } + + @Override + public void tick() { + if (this.level.isClientSide) { + return; + } + BlockEntity block = this.level.getBlockEntity(this.blockPosition()); + if (this.isVehicle()) { + this.life--; + if (this.life > 0) { + return; + } + } + this.discard(); + } + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleSaddleUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleSaddleUpgrade.java new file mode 100644 index 000000000..d1098f63d --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleSaddleUpgrade.java @@ -0,0 +1,45 @@ +package de.srendi.advancedperipherals.common.addons.computercraft.turtles; + +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.api.turtle.ITurtleAccess; +import dan200.computercraft.api.turtle.TurtleSide; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.SaddlePeripheral; +import de.srendi.advancedperipherals.common.configuration.APConfig; +import de.srendi.advancedperipherals.lib.turtle.PeripheralTurtleUpgrade; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class TurtleSaddleUpgrade extends PeripheralTurtleUpgrade { + + public TurtleSaddleUpgrade(ResourceLocation id, ItemStack stack) { + super(id, stack); + } + + @Override + public ModelResourceLocation getLeftModel() { + return null; + } + + @Override + public ModelResourceLocation getRightModel() { + return null; + } + + @Override + protected SaddlePeripheral buildPeripheral(@NotNull ITurtleAccess turtle, @NotNull TurtleSide side) { + return new SaddlePeripheral(turtle, side); + } + + @Override + public void update(@NotNull ITurtleAccess turtle, @NotNull TurtleSide side) { + super.update(turtle, side); + if (APConfig.PERIPHERALS_CONFIG.enableSaddleTurtle.get()) { + IPeripheral peripheral = turtle.getPeripheral(side); + if (peripheral instanceof SaddlePeripheral saddlePeripheral) { + saddlePeripheral.update(); + } + } + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java index 9589d4f43..67bb59e8d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java @@ -87,6 +87,10 @@ public class PeripheralsConfig implements IAPConfig { public final ForgeConfigSpec.IntValue poweredPeripheralMaxEnergyStorage; private final ForgeConfigSpec configSpec; + // Saddle turtle (it's tamed) + public final ForgeConfigSpec.BooleanValue enableSaddleTurtle; + public final ForgeConfigSpec.BooleanValue allowSaddleTurtleCapturePlayer; + public PeripheralsConfig() { ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); @@ -193,6 +197,11 @@ public PeripheralsConfig() { disablePocketFuelConsumption = builder.comment("If true, pockets will have infinite fuel").define("disablePocketFuelConsumption", true); + pop("Saddle_Turtle", builder); + + enableSaddleTurtle = builder.comment("Enable saddle turtle").define("enableSaddleTurtle", true); + allowSaddleTurtleCapturePlayer = builder.comment("Allow saddle turtle to capture player").define("allowSaddleTurtleCapturePlayer", true); + pop("Operations", builder); register(SingleOperation.values(), builder); diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index 2c96363be..d9fc1b681 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -71,12 +71,13 @@ private void addBlocks() { } private void addTurtles() { - addTurtle(CCRegistration.ID.CHUNKY_TURTLE, "Chunky"); addTurtle(CCRegistration.ID.CHATTY_TURTLE, "Chatty"); + addTurtle(CCRegistration.ID.CHUNKY_TURTLE, "Chunky"); + addTurtle(CCRegistration.ID.COMPASS_TURTLE, "Compass"); + addTurtle(CCRegistration.ID.SADDLE_TURTLE, "Saddle"); addTurtle(CCRegistration.ID.ENVIRONMENT_TURTLE, "Environment"); addTurtle(CCRegistration.ID.PLAYER_TURTLE, "Player Detector"); addTurtle(CCRegistration.ID.GEOSCANNER_TURTLE, "Geo"); - addTurtle(CCRegistration.ID.COMPASS_TURTLE, "Compass"); addTurtle(CCRegistration.ID.WEAK_AUTOMATA, "Weak automata"); addTurtle(CCRegistration.ID.HUSBANDRY_AUTOMATA, "Husbandry automata"); addTurtle(CCRegistration.ID.END_AUTOMATA, "End automata"); diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java index 70ec6c177..86d8e8bbe 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java @@ -24,6 +24,7 @@ protected void addUpgrades(@NotNull Consumer> simpleWithCustomItem(CCRegistration.ID.CHUNKY_TURTLE, CCRegistration.CHUNKY_TURTLE.get(), APItems.CHUNK_CONTROLLER.get()).add(addUpgrade); simpleWithCustomItem(CCRegistration.ID.GEOSCANNER_TURTLE, CCRegistration.GEO_SCANNER_TURTLE.get(), APBlocks.GEO_SCANNER.get().asItem()).add(addUpgrade); simpleWithCustomItem(CCRegistration.ID.COMPASS_TURTLE, CCRegistration.COMPASS_TURTLE.get(), net.minecraft.world.item.Items.COMPASS).add(addUpgrade); + simpleWithCustomItem(CCRegistration.ID.SADDLE_TURTLE, CCRegistration.SADDLE_TURTLE.get(), net.minecraft.world.item.Items.SADDLE).add(addUpgrade); simpleWithCustomItem(CCRegistration.ID.WEAK_AUTOMATA, CCRegistration.WEAK_TURTLE.get(), APItems.WEAK_AUTOMATA_CORE.get()).add(addUpgrade); simpleWithCustomItem(CCRegistration.ID.END_AUTOMATA, CCRegistration.END_TURTLE.get(), APItems.END_AUTOMATA_CORE.get()).add(addUpgrade); simpleWithCustomItem(CCRegistration.ID.HUSBANDRY_AUTOMATA, CCRegistration.HUSBANDRY_TURTLE.get(), APItems.HUSBANDRY_AUTOMATA_CORE.get()).add(addUpgrade); diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java index 11962445a..d19ba1b01 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java @@ -21,6 +21,7 @@ public class CCRegistration { public static final RegistryObject> CHUNKY_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.CHUNKY_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleChunkyUpgrade::new)); public static final RegistryObject> GEO_SCANNER_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.GEOSCANNER_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleGeoScannerUpgrade::new)); public static final RegistryObject> COMPASS_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.COMPASS_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleCompassUpgrade::new)); + public static final RegistryObject> SADDLE_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.SADDLE_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleSaddleUpgrade::new)); public static final RegistryObject> WEAK_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.WEAK_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(WeakAutomata::new)); public static final RegistryObject> END_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.END_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(EndAutomata::new)); public static final RegistryObject> HUSBANDRY_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.HUSBANDRY_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(HusbandryAutomata::new)); @@ -50,6 +51,7 @@ public static class ID { public static final ResourceLocation CHUNKY_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "chunky_turtle"); public static final ResourceLocation GEOSCANNER_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "geoscanner_turtle"); public static final ResourceLocation COMPASS_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "compass_turtle"); + public static final ResourceLocation SADDLE_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "saddle_turtle"); public static final ResourceLocation WEAK_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "weak_automata"); public static final ResourceLocation END_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "end_automata"); public static final ResourceLocation HUSBANDRY_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "husbandry_automata"); From e104c3266f45ca2e5fbdff8ba1adaf25101a5523 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 26 Apr 2024 21:47:28 -0600 Subject: [PATCH 002/188] finished saddle turtle --- .../peripheral/SaddlePeripheral.java | 72 +++++------- .../common/entity/TurtleSeatEntity.java | 103 ++++++++++++++++++ .../common/setup/APEntities.java | 33 ++++++ .../common/setup/APRegistration.java | 9 ++ 4 files changed, 175 insertions(+), 42 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 180f744d4..5dbd2bcf8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -6,32 +6,38 @@ import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; -import dan200.computercraft.shared.turtle.blocks.TileTurtle; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; -import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleSaddleUpgrade; +// import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleSaddleUpgrade; import de.srendi.advancedperipherals.common.configuration.APConfig; +import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.server.level.ServerEntity; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - -import java.util.List; +// import java.util.List; import java.util.function.Predicate; public class SaddlePeripheral extends BasePeripheral { + private static final int ANIM_DURATION = 8; // Should be same as TurtleBrain.ANIM_DURATION + public static final String PERIPHERAL_TYPE = "saddle"; private TurtleSeatEntity seat = null; + private int moveProg = 0; + private BlockPos moveDir = null; public SaddlePeripheral(ITurtleAccess turtle, TurtleSide side) { super(PERIPHERAL_TYPE, new TurtlePeripheralOwner(turtle, side)); @@ -74,9 +80,25 @@ public void update() { this.seat.keepAlive(); BlockPos pos = owner.getPos(); Vec3 newPos = new Vec3(pos.getX() + 0.5, pos.getY() + 0.4, pos.getZ() + 0.5); + BlockPos dir = pos.subtract(this.seat.blockPosition()); + int dist = Math.abs(dir.getX()) + Math.abs(dir.getY()) + Math.abs(dir.getZ()); + if (dist > 1) { + this.moveDir = null; + } else if (dist == 1) { + this.moveDir = dir; + } + if (this.moveDir != null) { + this.moveProg++; + if (this.moveProg > ANIM_DURATION) { + this.moveProg = 0; + this.moveDir = null; + } else { + float step = ((float) this.moveProg) / ANIM_DURATION; + newPos = newPos.add(Vec3.atLowerCornerOf(moveDir).scale(step - 1)); + } + } if (!this.seat.position().equals(newPos)) { - // TODO: for some reason the client position will not sync here - this.seat.moveTo(newPos); + this.seat.moveTo(newPos.x(), newPos.y(), newPos.z()); } } } @@ -120,38 +142,4 @@ public MethodResult capture() { } return MethodResult.of(true); } - - private static class TurtleSeatEntity extends SeatEntity { - private ITurtleAccess turtle; - private int life; - - public TurtleSeatEntity(ITurtleAccess turtle) { - super(turtle.getLevel(), turtle.getPosition()); - this.turtle = turtle; - this.life = 1; - } - - public ITurtleAccess getOwner() { - return turtle; - } - - public void keepAlive() { - this.life = 3; - } - - @Override - public void tick() { - if (this.level.isClientSide) { - return; - } - BlockEntity block = this.level.getBlockEntity(this.blockPosition()); - if (this.isVehicle()) { - this.life--; - if (this.life > 0) { - return; - } - } - this.discard(); - } - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java new file mode 100644 index 000000000..d2a72cfa6 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -0,0 +1,103 @@ +package de.srendi.advancedperipherals.common.entity; + +import dan200.computercraft.api.turtle.ITurtleAccess; +import de.srendi.advancedperipherals.common.setup.APEntities; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.resources.ResourceLocation; + +public class TurtleSeatEntity extends Entity { + + private ITurtleAccess turtle; + private int life; + + public TurtleSeatEntity(EntityType type, Level world) { + super(type, world); + this.noPhysics = true; + } + + public TurtleSeatEntity(ITurtleAccess turtle) { + this(APEntities.TURTLE_SEAT.get(), turtle.getLevel()); + this.turtle = turtle; + this.life = 1; + } + + public ITurtleAccess getOwner() { + return turtle; + } + + public void keepAlive() { + this.life = 3; + } + + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this); + } + + public void readAdditionalSaveData(CompoundTag storage) {} + + public void addAdditionalSaveData(CompoundTag storage) {} + + protected void defineSynchedData() {} + + @Override + public void setPos(double x, double y, double z) { + super.setPos(x, y, z); + AABB bb = this.getBoundingBox(); + this.setBoundingBox(bb.move(new Vec3(x, y, z).subtract(bb.getCenter()))); + } + + @Override + protected void removePassenger(Entity entity) { + super.removePassenger(entity); + if (entity instanceof TamableAnimal tamed) { + tamed.setInSittingPose(false); + } + } + + @Override + public Vec3 getDismountLocationForPassenger(LivingEntity entity) { + return super.getDismountLocationForPassenger(entity).add(0, 0.5, 0); + } + + @Override + public void tick() { + if (this.level.isClientSide) { + return; + } + if (this.isVehicle()) { + this.life--; + if (this.life > 0) { + return; + } + } + this.discard(); + } + + public static class Renderer extends EntityRenderer { + public Renderer(EntityRendererProvider.Context ctx) { + super(ctx); + } + + @Override + public boolean shouldRender(TurtleSeatEntity $$0, Frustum $$1, double $$2, double $$3, double $$4) { + return false; + } + + @Override + public ResourceLocation getTextureLocation(TurtleSeatEntity $$0) { + return null; + } + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java new file mode 100644 index 000000000..4d96eb7c0 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java @@ -0,0 +1,33 @@ +package de.srendi.advancedperipherals.common.setup; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraftforge.registries.RegistryObject; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) +public class APEntities { + + public static final RegistryObject> TURTLE_SEAT = Registration.ENTITIES.register("turtle_seat", + () -> EntityType.Builder.of(TurtleSeatEntity::new, MobCategory.MISC) + .sized(0.1F, 0.1F) + .clientTrackingRange(5) + .updateInterval(5) + .fireImmune() + .build("turtle_seat")); + + public static void register() { + } + + @SubscribeEvent + public static void livingRender(EntityRenderersEvent.RegisterRenderers event){ + event.registerEntityRenderer(TURTLE_SEAT.get(), TurtleSeatEntity.Renderer::new); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java index f8d25961a..2986463b5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java @@ -3,6 +3,7 @@ import dan200.computercraft.api.pocket.PocketUpgradeSerialiser; import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser; import de.srendi.advancedperipherals.AdvancedPeripherals; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.ai.village.poi.PoiType; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.inventory.MenuType; @@ -18,6 +19,7 @@ public class APRegistration { public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, AdvancedPeripherals.MOD_ID); public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, AdvancedPeripherals.MOD_ID); + public static final DeferredRegister> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, AdvancedPeripherals.MOD_ID); public static final DeferredRegister> TILE_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, AdvancedPeripherals.MOD_ID); public static final DeferredRegister> CONTAINER_TYPES = DeferredRegister.create(ForgeRegistries.MENU_TYPES, AdvancedPeripherals.MOD_ID); public static final DeferredRegister POI_TYPES = DeferredRegister.create(ForgeRegistries.POI_TYPES, AdvancedPeripherals.MOD_ID); @@ -29,6 +31,7 @@ public static void register() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); BLOCKS.register(modEventBus); ITEMS.register(modEventBus); + ENTITIES.register(modEventBus); TILE_ENTITIES.register(modEventBus); CONTAINER_TYPES.register(modEventBus); POI_TYPES.register(modEventBus); @@ -39,8 +42,14 @@ public static void register() { APBlocks.register(); APBlockEntityTypes.register(); APItems.register(); + APEntities.register(); APContainerTypes.register(); APVillagers.register(); + Blocks.register(); + BlockEntityTypes.register(); + Items.register(); + ContainerTypes.register(); + Villagers.register(); CCRegistration.register(); } } From bd5afb363f2bfe154215d43d40c4ee25f8bf75dc Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 26 Apr 2024 22:32:53 -0600 Subject: [PATCH 003/188] allows to open the turtle's GUI by press the inventory key --- .../peripheral/SaddlePeripheral.java | 2 +- .../common/entity/TurtleSeatEntity.java | 43 ++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 5dbd2bcf8..7700a0f67 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -32,7 +32,7 @@ public class SaddlePeripheral extends BasePeripheral { - private static final int ANIM_DURATION = 8; // Should be same as TurtleBrain.ANIM_DURATION + private static final int ANIM_DURATION = 8 - 1; // Should be same as TurtleBrain.ANIM_DURATION public static final String PERIPHERAL_TYPE = "saddle"; private TurtleSeatEntity seat = null; diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index d2a72cfa6..f1f17a65e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -1,14 +1,24 @@ package de.srendi.advancedperipherals.common.entity; import dan200.computercraft.api.turtle.ITurtleAccess; +import dan200.computercraft.shared.computer.core.ServerComputer; +import dan200.computercraft.shared.turtle.blocks.BlockTurtle; +import dan200.computercraft.shared.turtle.blocks.TileTurtle; +import dan200.computercraft.shared.turtle.core.TurtleBrain; +import dan200.computercraft.shared.turtle.items.TurtleItemFactory; +import dan200.computercraft.shared.network.container.ComputerContainerData; import de.srendi.advancedperipherals.common.setup.APEntities; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.HasCustomInventoryScreen; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.PlayerRideableJumping; import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -17,7 +27,7 @@ import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.resources.ResourceLocation; -public class TurtleSeatEntity extends Entity { +public class TurtleSeatEntity extends Entity implements HasCustomInventoryScreen, PlayerRideableJumping { private ITurtleAccess turtle; private int life; @@ -85,6 +95,37 @@ public void tick() { this.discard(); } + @Override + public void openCustomInventoryScreen(Player player) { + if (!this.level.isClientSide && this.hasPassenger(player)) { + if (this.turtle instanceof TurtleBrain turtle) { + TileTurtle tile = turtle.getOwner(); + if (!tile.isUsable(player)) { + return; + } + ServerComputer computer = tile.createServerComputer(); + ItemStack stack = TurtleItemFactory.create(tile); + new ComputerContainerData(computer, stack).open(player, tile); + } + } + } + + public void onPlayerJump(int power) { + // + } + + public boolean canJump() { + return true; + } + + public void handleStartJump(int power) { + // + } + + public void handleStopJump() { + // + } + public static class Renderer extends EntityRenderer { public Renderer(EntityRendererProvider.Context ctx) { super(ctx); From a9c1800b7714170b03ac17b55916de3530f229c6 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 26 Apr 2024 22:36:03 -0600 Subject: [PATCH 004/188] remove unused codes --- .../addons/computercraft/peripheral/SaddlePeripheral.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 7700a0f67..da91f0bc3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -7,7 +7,6 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; -// import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleSaddleUpgrade; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; @@ -27,12 +26,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -// import java.util.List; import java.util.function.Predicate; public class SaddlePeripheral extends BasePeripheral { - private static final int ANIM_DURATION = 8 - 1; // Should be same as TurtleBrain.ANIM_DURATION + private static final int ANIM_DURATION = 8; // Should be same as TurtleBrain.ANIM_DURATION public static final String PERIPHERAL_TYPE = "saddle"; private TurtleSeatEntity seat = null; From fe59567ed4741356de3b8ac2417b6f8690650305 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 26 Apr 2024 22:46:16 -0600 Subject: [PATCH 005/188] remove more unused code --- .../addons/computercraft/peripheral/SaddlePeripheral.java | 5 ----- .../advancedperipherals/common/entity/TurtleSeatEntity.java | 5 ++--- .../srendi/advancedperipherals/common/setup/APEntities.java | 3 +-- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index da91f0bc3..c2b81a564 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -1,6 +1,5 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; -import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IComputerAccess; @@ -11,15 +10,11 @@ import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.server.level.ServerEntity; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index f1f17a65e..68a947cf0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -2,7 +2,6 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.shared.computer.core.ServerComputer; -import dan200.computercraft.shared.turtle.blocks.BlockTurtle; import dan200.computercraft.shared.turtle.blocks.TileTurtle; import dan200.computercraft.shared.turtle.core.TurtleBrain; import dan200.computercraft.shared.turtle.items.TurtleItemFactory; @@ -132,12 +131,12 @@ public Renderer(EntityRendererProvider.Context ctx) { } @Override - public boolean shouldRender(TurtleSeatEntity $$0, Frustum $$1, double $$2, double $$3, double $$4) { + public boolean shouldRender(TurtleSeatEntity a0, Frustum a1, double a2, double a3, double a4) { return false; } @Override - public ResourceLocation getTextureLocation(TurtleSeatEntity $$0) { + public ResourceLocation getTextureLocation(TurtleSeatEntity a0) { return null; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java index 4d96eb7c0..2e18a0551 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java @@ -3,7 +3,6 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraftforge.registries.RegistryObject; @@ -27,7 +26,7 @@ public static void register() { } @SubscribeEvent - public static void livingRender(EntityRenderersEvent.RegisterRenderers event){ + public static void livingRender(EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(TURTLE_SEAT.get(), TurtleSeatEntity.Renderer::new); } } From dea2e60cb86787670af01c1222ec8bb83e07136c Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 27 Apr 2024 09:18:01 -0600 Subject: [PATCH 006/188] add saddle.getRider --- .../peripheral/SaddlePeripheral.java | 41 ++++++++++++++++--- .../common/util/LuaConverter.java | 15 ++++++- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index c2b81a564..88644b0fa 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -28,7 +28,7 @@ public class SaddlePeripheral extends BasePeripheral { private static final int ANIM_DURATION = 8; // Should be same as TurtleBrain.ANIM_DURATION public static final String PERIPHERAL_TYPE = "saddle"; - private TurtleSeatEntity seat = null; + private volatile TurtleSeatEntity seat = null; private int moveProg = 0; private BlockPos moveDir = null; @@ -43,7 +43,7 @@ public boolean isEnabled() { @Nullable public Entity getRidingEntity() { - return this.seat; + return this.seat != null ? this.seat.getFirstPassenger() : null; } public boolean isEntityRiding() { @@ -57,11 +57,8 @@ public void attach(@NotNull IComputerAccess computer) { @Override public void detach(@NotNull IComputerAccess computer) { + standUp(); super.detach(computer); - if (this.seat != null) { - this.seat.discard(); - this.seat = null; - } } public void update() { @@ -114,6 +111,16 @@ private boolean sitDown(@NotNull Entity entity) { return true; } + private boolean standUp() { + if (this.seat == null) { + return false; + } + boolean isVehicle = this.seat.isVehicle(); + this.seat.discard(); + this.seat = null; + return isVehicle; + } + @LuaFunction(mainThread = true) public MethodResult capture() { if (isEntityRiding()) { @@ -135,4 +142,26 @@ public MethodResult capture() { } return MethodResult.of(true); } + + @LuaFunction(mainThread = true) + public MethodResult release() { + if (!standUp()) { + return MethodResult.of(null, "No entity is riding"); + } + return MethodResult.of(true); + } + + @LuaFunction(mainThread = true) + public boolean hasRider() { + return this.isEntityRiding(); + } + + @LuaFunction(mainThread = true) + public MethodResult getRider() { + Entity entity = getRidingEntity(); + if (entity == null) { + return MethodResult.of(null); + } + return MethodResult.of(LuaConverter.completeEntityToLua(entity)); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index b8195959c..9a490cdde 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -9,9 +9,11 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.tags.TagKey; import net.minecraft.util.StringRepresentable; +import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.properties.Property; @@ -39,11 +41,15 @@ public static Map entityToLua(Entity entity) { data.put("canFreeze", entity.canFreeze()); data.put("isGlowing", entity.isCurrentlyGlowing()); data.put("isInWall", entity.isInWall()); + if (entity instanceof InventoryCarrier carrier) { + SimpleContainer inv = carrier.getInventory(); + } return data; } public static Map livingEntityToLua(LivingEntity entity) { Map data = entityToLua(entity); + data.put("baby", entity.isBaby()); data.put("health", entity.getHealth()); data.put("maxHealth", entity.getMaxHealth()); data.put("lastDamageSource", entity.getLastDamageSource() == null ? null : entity.getLastDamageSource().toString()); @@ -52,7 +58,6 @@ public static Map livingEntityToLua(LivingEntity entity) { public static Map animalToLua(Animal animal, ItemStack itemInHand) { Map data = livingEntityToLua(animal); - data.put("baby", animal.isBaby()); data.put("inLove", animal.isInLove()); data.put("aggressive", animal.isAggressive()); if (animal instanceof IForgeShearable shareable && !itemInHand.isEmpty()) { @@ -61,7 +66,15 @@ public static Map animalToLua(Animal animal, ItemStack itemInHan return data; } + public static Map playerToLua(Player player) { + Map data = livingEntityToLua(animal); + data.put("score", player.getScore()); + data.put("luck", player.getLuck()); + return data; + } + public static Map completeEntityToLua(Entity entity, ItemStack itemInHand) { + if (entity instanceof Player player) return playerToLua(player); if (entity instanceof Animal animal) return animalToLua(animal, itemInHand); if (entity instanceof LivingEntity livingEntity) return livingEntityToLua(livingEntity); return entityToLua(entity); From 6d1c2d3eb481ffdeb1d087818ba5361271fd3601 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 27 Apr 2024 14:32:32 -0600 Subject: [PATCH 007/188] make completeEntityToLua returns effect of the entity --- .../owner/TurtlePeripheralOwner.java | 3 +- .../peripheral/SaddlePeripheral.java | 3 +- .../common/setup/APEntities.java | 2 +- .../common/setup/APRegistration.java | 5 --- .../common/util/LuaConverter.java | 45 ++++++++++++++++++- .../fakeplayer/FakePlayerProviderTurtle.java | 20 +++++---- 6 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java index 02ad29cea..6ccb666d1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java @@ -16,6 +16,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraftforge.items.wrapper.InvWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -95,7 +96,7 @@ public ItemStack getToolInMainHand() { @Override public ItemStack storeItem(ItemStack stored) { - return InventoryUtil.storeItems(stored, turtle.getItemHandler(), turtle.getSelectedSlot()); + return InventoryUtil.storeItems(stored, new InvWrapper(turtle.getInventory()), turtle.getSelectedSlot()); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 88644b0fa..c1e6add15 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -8,6 +8,7 @@ import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; +import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; @@ -160,7 +161,7 @@ public boolean hasRider() { public MethodResult getRider() { Entity entity = getRidingEntity(); if (entity == null) { - return MethodResult.of(null); + return MethodResult.of(null, "No entity is riding"); } return MethodResult.of(LuaConverter.completeEntityToLua(entity)); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java index 2e18a0551..4706ed42e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java @@ -14,7 +14,7 @@ @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) public class APEntities { - public static final RegistryObject> TURTLE_SEAT = Registration.ENTITIES.register("turtle_seat", + public static final RegistryObject> TURTLE_SEAT = APRegistration.ENTITIES.register("turtle_seat", () -> EntityType.Builder.of(TurtleSeatEntity::new, MobCategory.MISC) .sized(0.1F, 0.1F) .clientTrackingRange(5) diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java index 2986463b5..6048d3643 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java @@ -45,11 +45,6 @@ public static void register() { APEntities.register(); APContainerTypes.register(); APVillagers.register(); - Blocks.register(); - BlockEntityTypes.register(); - Items.register(); - ContainerTypes.register(); - Villagers.register(); CCRegistration.register(); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index 9a490cdde..aadf7fc1f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -10,9 +10,12 @@ import net.minecraft.tags.TagKey; import net.minecraft.util.StringRepresentable; import net.minecraft.world.SimpleContainer; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.npc.InventoryCarrier; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -21,8 +24,8 @@ import net.minecraftforge.common.IForgeShearable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -42,7 +45,15 @@ public static Map entityToLua(Entity entity) { data.put("isGlowing", entity.isCurrentlyGlowing()); data.put("isInWall", entity.isInWall()); if (entity instanceof InventoryCarrier carrier) { + Map invMap = new HashMap<>(); SimpleContainer inv = carrier.getInventory(); + for (int slot = 0; slot < inv.getContainerSize(); slot++) { + ItemStack item = inv.getItem(slot); + if (!item.isEmpty()) { + invMap.put(slot, itemStackToObject(item)); + } + } + data.put("inventory", invMap); } return data; } @@ -53,6 +64,11 @@ public static Map livingEntityToLua(LivingEntity entity) { data.put("health", entity.getHealth()); data.put("maxHealth", entity.getMaxHealth()); data.put("lastDamageSource", entity.getLastDamageSource() == null ? null : entity.getLastDamageSource().toString()); + Map effMap = new HashMap<>(); + entity.getActiveEffectsMap().forEach((key, value) -> { + effMap.put(key.getDescriptionId(), effectToObject(value)); + }); + data.put("effects", effMap); return data; } @@ -67,12 +83,25 @@ public static Map animalToLua(Animal animal, ItemStack itemInHan } public static Map playerToLua(Player player) { - Map data = livingEntityToLua(animal); + Map data = livingEntityToLua(player); data.put("score", player.getScore()); data.put("luck", player.getLuck()); + Map invMap = new HashMap<>(); + Inventory inv = player.getInventory(); + for (int slot = 0; slot < inv.getContainerSize(); slot++) { + ItemStack item = inv.getItem(slot); + if (!item.isEmpty()) { + invMap.put(slot, itemStackToObject(item)); + } + } + data.put("inventory", invMap); return data; } + public static Map completeEntityToLua(Entity entity) { + return completeEntityToLua(entity, ItemStack.EMPTY); + } + public static Map completeEntityToLua(Entity entity, ItemStack itemInHand) { if (entity instanceof Player player) return playerToLua(player); if (entity instanceof Animal animal) return animalToLua(animal, itemInHand); @@ -80,6 +109,10 @@ public static Map completeEntityToLua(Entity entity, ItemStack i return entityToLua(entity); } + public static Map completeEntityWithPositionToLua(Entity entity, BlockPos pos) { + return completeEntityWithPositionToLua(entity, ItemStack.EMPTY, pos); + } + public static Map completeEntityWithPositionToLua(Entity entity, ItemStack itemInHand, BlockPos pos) { Map data = completeEntityToLua(entity, itemInHand); data.put("x", entity.getX() - pos.getX()); @@ -202,4 +235,12 @@ public static BlockPos convertToBlockPos(BlockPos center, Map table) throw BlockPos relative = convertToBlockPos(table); return new BlockPos(center.getX() + relative.getX(), center.getY() + relative.getY(), center.getZ() + relative.getZ()); } + + public static Object effectToObject(MobEffectInstance effect) { + Map map = new HashMap<>(); + map.put("name", effect.getDescriptionId()); + map.put("duration", effect.getDuration()); + map.put("amplifier", effect.getAmplifier()); + return map; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java index b926ab5a7..9f1762e51 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java @@ -7,6 +7,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.Container; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; @@ -14,6 +15,7 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.wrapper.InvWrapper; import java.util.WeakHashMap; import java.util.function.Function; @@ -51,12 +53,12 @@ public static void load(APFakePlayer player, ITurtleAccess turtle) { playerInventory.selected = 0; // Copy primary items into player inventory and empty the rest - IItemHandler turtleInventory = turtle.getItemHandler(); - int size = turtleInventory.getSlots(); + Container turtleInventory = turtle.getInventory(); + int size = turtleInventory.getContainerSize(); int largerSize = playerInventory.getContainerSize(); playerInventory.selected = turtle.getSelectedSlot(); for (int i = 0; i < size; i++) { - playerInventory.setItem(i, turtleInventory.getStackInSlot(i)); + playerInventory.setItem(i, turtleInventory.getItem(i)); } for (int i = size; i < largerSize; i++) { playerInventory.setItem(i, ItemStack.EMPTY); @@ -64,9 +66,9 @@ public static void load(APFakePlayer player, ITurtleAccess turtle) { // Add properties ItemStack activeStack = player.getItemInHand(InteractionHand.MAIN_HAND); - if (!activeStack.isEmpty()) + if (!activeStack.isEmpty()) { player.getAttributes().addTransientAttributeModifiers(activeStack.getAttributeModifiers(EquipmentSlot.MAINHAND)); - + } } public static void unload(APFakePlayer player, ITurtleAccess turtle) { @@ -80,19 +82,19 @@ public static void unload(APFakePlayer player, ITurtleAccess turtle) { } // Copy primary items into turtle inventory and then insert/drop the rest - IItemHandlerModifiable turtleInventory = turtle.getItemHandler(); - int size = turtleInventory.getSlots(); + Container turtleInventory = turtle.getInventory(); + int size = turtleInventory.getContainerSize(); int largerSize = playerInventory.getContainerSize(); playerInventory.selected = turtle.getSelectedSlot(); for (int i = 0; i < size; i++) { - turtleInventory.setStackInSlot(i, playerInventory.getItem(i)); + turtleInventory.setItem(i, playerInventory.getItem(i)); playerInventory.setItem(i, ItemStack.EMPTY); } for (int i = size; i < largerSize; i++) { ItemStack remaining = playerInventory.getItem(i); if (!remaining.isEmpty()) { - remaining = ItemHandlerHelper.insertItem(turtleInventory, remaining, false); + remaining = ItemHandlerHelper.insertItem(new InvWrapper(turtleInventory), remaining, false); if (!remaining.isEmpty()) { BlockPos position = turtle.getPosition(); WorldUtil.dropItemStack(remaining, turtle.getLevel(), position, turtle.getDirection().getOpposite()); From 7c930ab2fee09dcfa295c9c2c5c2d3c6316e469f Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 27 Apr 2024 15:33:17 -0600 Subject: [PATCH 008/188] remove unused imports --- .../de/srendi/advancedperipherals/common/setup/APEntities.java | 1 - .../common/util/fakeplayer/FakePlayerProviderTurtle.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java index 4706ed42e..087ba80b5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java @@ -2,7 +2,6 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; -import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraftforge.registries.RegistryObject; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java index 9f1762e51..fc7cc86c2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java @@ -12,8 +12,6 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.InvWrapper; From cd6288c36ea4cff2ebbfb425044ca5646a1e035c Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 27 Apr 2024 17:23:04 -0600 Subject: [PATCH 009/188] add detailes flag when marshalling entity --- .../EnvironmentDetectorPeripheral.java | 3 +- .../peripheral/SaddlePeripheral.java | 18 +++-- .../plugins/AutomataEntityHandPlugin.java | 8 ++- .../plugins/AutomataEntityTransferPlugin.java | 9 ++- .../plugins/AutomataLookPlugin.java | 2 +- .../common/util/LuaConverter.java | 71 ++++++++++++------- 6 files changed, 72 insertions(+), 39 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index 0054a4d45..4fa64fd39 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -199,6 +199,7 @@ public final boolean isSunny() { @LuaFunction(mainThread = true) public final MethodResult scanEntities(@NotNull IComputerAccess access, @NotNull IArguments arguments) throws LuaException { int radius = arguments.getInt(0); + boolean detailed = arguments.count() > 1 ? arguments.getBoolean(1) : false; return withOperation(SCAN_ENTITIES, new SphereOperationContext(radius), context -> { if (radius > SCAN_ENTITIES.getMaxCostRadius()) return MethodResult.of(null, "Radius exceeds max value"); @@ -207,7 +208,7 @@ public final MethodResult scanEntities(@NotNull IComputerAccess access, @NotNull BlockPos pos = owner.getPos(); AABB box = new AABB(pos); List> entities = new ArrayList<>(); - getLevel().getEntities((Entity) null, box.inflate(radius), LivingEntity.class::isInstance).forEach(entity -> entities.add(LuaConverter.completeEntityWithPositionToLua(entity, ItemStack.EMPTY, pos))); + getLevel().getEntities((Entity) null, box.inflate(radius), LivingEntity.class::isInstance).forEach(entity -> entities.add(LuaConverter.completeEntityWithPositionToLua(entity, pos, detailed))); return MethodResult.of(entities); }, null); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index c1e6add15..82be589f7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -1,5 +1,7 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IComputerAccess; @@ -22,6 +24,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Predicate; public class SaddlePeripheral extends BasePeripheral { @@ -29,7 +32,8 @@ public class SaddlePeripheral extends BasePeripheral { private static final int ANIM_DURATION = 8; // Should be same as TurtleBrain.ANIM_DURATION public static final String PERIPHERAL_TYPE = "saddle"; - private volatile TurtleSeatEntity seat = null; + private TurtleSeatEntity seat = null; + private AtomicBoolean hasRiderFlag = new AtomicBoolean(); private int moveProg = 0; private BlockPos moveDir = null; @@ -66,6 +70,7 @@ public void update() { if (this.seat != null) { if (!this.seat.isAlive()) { this.seat = null; + this.hasRiderFlag.set(false); return; } this.seat.keepAlive(); @@ -109,6 +114,7 @@ private boolean sitDown(@NotNull Entity entity) { tamable.setInSittingPose(true); } this.seat.keepAlive(); + this.hasRiderFlag.set(true); return true; } @@ -119,6 +125,7 @@ private boolean standUp() { boolean isVehicle = this.seat.isVehicle(); this.seat.discard(); this.seat = null; + this.hasRiderFlag.set(false); return isVehicle; } @@ -152,17 +159,18 @@ public MethodResult release() { return MethodResult.of(true); } - @LuaFunction(mainThread = true) + @LuaFunction public boolean hasRider() { - return this.isEntityRiding(); + return this.hasRiderFlag.get(); } @LuaFunction(mainThread = true) - public MethodResult getRider() { + public MethodResult getRider(IArguments args) throws LuaException { + boolean detailed = args.count() > 0 ? args.getBoolean(0) : false; Entity entity = getRidingEntity(); if (entity == null) { return MethodResult.of(null, "No entity is riding"); } - return MethodResult.of(LuaConverter.completeEntityToLua(entity)); + return MethodResult.of(LuaConverter.completeEntityToLua(entity, getPeripheralOwner().getToolInMainHand(), detailed)); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java index 1bc139df1..ac30dcd05 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; +import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; @@ -64,18 +65,19 @@ public final MethodResult inspectAnimal() { if (!(entity instanceof Animal animal)) return MethodResult.of(null, "Well, entity is not animal entity, but how?"); - return MethodResult.of(LuaConverter.animalToLua(animal, owner.getToolInMainHand())); + return MethodResult.of(LuaConverter.animalToLua(animal, owner.getToolInMainHand(), true)); } @LuaFunction(mainThread = true) - public final MethodResult searchAnimals() { + public final MethodResult searchAnimals(IArguments args) throws LuaException { + boolean detailed = args.count() > 0 ? args.getBoolean(0) : false; automataCore.addRotationCycle(); TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); BlockPos currentPos = owner.getPos(); AABB box = new AABB(currentPos); List> entities = new ArrayList<>(); ItemStack itemInHand = owner.getToolInMainHand(); - owner.getLevel().getEntities((Entity) null, box.inflate(automataCore.getInteractionRadius()), suitableEntity).forEach(entity -> entities.add(LuaConverter.completeEntityWithPositionToLua(entity, itemInHand, currentPos))); + owner.getLevel().getEntities((Entity) null, box.inflate(automataCore.getInteractionRadius()), suitableEntity).forEach(entity -> entities.add(LuaConverter.completeEntityWithPositionToLua(entity, itemInHand, currentPos, detailed))); return MethodResult.of(entities); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java index 589f7cc16..a3fdd0013 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; +import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; @@ -110,8 +111,12 @@ public final MethodResult releaseAnimal() { } @LuaFunction(mainThread = true) - public final MethodResult getCapturedAnimal() { + public final MethodResult getCapturedAnimal(IArguments args) throws LuaException { + boolean detailed = args.count() > 0 ? args.getBoolean(0) : false; Entity extractedEntity = extractEntity(); - return MethodResult.of(LuaConverter.completeEntityToLua(extractedEntity, automataCore.getPeripheralOwner().getToolInMainHand())); + if (extractedEntity == null) { + return MethodResult.of(null, "No entity is stored"); + } + return MethodResult.of(LuaConverter.completeEntityToLua(extractedEntity, automataCore.getPeripheralOwner().getToolInMainHand(), detailed)); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java index c79019c53..084875dd1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java @@ -47,7 +47,7 @@ public final MethodResult lookAtEntity() { return MethodResult.of(null, "No entity find"); EntityHitResult entityHit = (EntityHitResult) result; - return MethodResult.of(LuaConverter.entityToLua(entityHit.getEntity())); + return MethodResult.of(LuaConverter.entityToLua(entityHit.getEntity(), true)); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index aadf7fc1f..3f1bcdd85 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -35,7 +35,7 @@ public class LuaConverter { - public static Map entityToLua(Entity entity) { + public static Map entityToLua(Entity entity, boolean detailed) { Map data = new HashMap<>(); data.put("id", entity.getId()); data.put("uuid", entity.getStringUUID()); @@ -44,7 +44,7 @@ public static Map entityToLua(Entity entity) { data.put("canFreeze", entity.canFreeze()); data.put("isGlowing", entity.isCurrentlyGlowing()); data.put("isInWall", entity.isInWall()); - if (entity instanceof InventoryCarrier carrier) { + if (detailed && entity instanceof InventoryCarrier carrier) { Map invMap = new HashMap<>(); SimpleContainer inv = carrier.getInventory(); for (int slot = 0; slot < inv.getContainerSize(); slot++) { @@ -58,22 +58,24 @@ public static Map entityToLua(Entity entity) { return data; } - public static Map livingEntityToLua(LivingEntity entity) { - Map data = entityToLua(entity); + public static Map livingEntityToLua(LivingEntity entity, boolean detailed) { + Map data = entityToLua(entity, detailed); data.put("baby", entity.isBaby()); data.put("health", entity.getHealth()); data.put("maxHealth", entity.getMaxHealth()); data.put("lastDamageSource", entity.getLastDamageSource() == null ? null : entity.getLastDamageSource().toString()); - Map effMap = new HashMap<>(); - entity.getActiveEffectsMap().forEach((key, value) -> { - effMap.put(key.getDescriptionId(), effectToObject(value)); - }); - data.put("effects", effMap); + if (detailed) { + Map effMap = new HashMap<>(); + entity.getActiveEffectsMap().forEach((key, value) -> { + effMap.put(key.getDescriptionId(), effectToObject(value)); + }); + data.put("effects", effMap); + } return data; } - public static Map animalToLua(Animal animal, ItemStack itemInHand) { - Map data = livingEntityToLua(animal); + public static Map animalToLua(Animal animal, ItemStack itemInHand, boolean detailed) { + Map data = livingEntityToLua(animal, detailed); data.put("inLove", animal.isInLove()); data.put("aggressive", animal.isAggressive()); if (animal instanceof IForgeShearable shareable && !itemInHand.isEmpty()) { @@ -82,39 +84,54 @@ public static Map animalToLua(Animal animal, ItemStack itemInHan return data; } - public static Map playerToLua(Player player) { - Map data = livingEntityToLua(player); + public static Map playerToLua(Player player, boolean detailed) { + Map data = livingEntityToLua(player, detailed); data.put("score", player.getScore()); data.put("luck", player.getLuck()); - Map invMap = new HashMap<>(); Inventory inv = player.getInventory(); - for (int slot = 0; slot < inv.getContainerSize(); slot++) { - ItemStack item = inv.getItem(slot); - if (!item.isEmpty()) { - invMap.put(slot, itemStackToObject(item)); + data.put("handSlot", inv.selected); + if (detailed) { + Map invMap = new HashMap<>(); + for (int slot = 0; slot < inv.getContainerSize(); slot++) { + ItemStack item = inv.getItem(slot); + if (!item.isEmpty()) { + invMap.put(slot, itemStackToObject(item)); + } } + data.put("inventory", invMap); } - data.put("inventory", invMap); return data; } public static Map completeEntityToLua(Entity entity) { - return completeEntityToLua(entity, ItemStack.EMPTY); + return completeEntityToLua(entity, false); + } + + public static Map completeEntityToLua(Entity entity, boolean detailed) { + return completeEntityToLua(entity, ItemStack.EMPTY, detailed); } public static Map completeEntityToLua(Entity entity, ItemStack itemInHand) { - if (entity instanceof Player player) return playerToLua(player); - if (entity instanceof Animal animal) return animalToLua(animal, itemInHand); - if (entity instanceof LivingEntity livingEntity) return livingEntityToLua(livingEntity); - return entityToLua(entity); + return completeEntityToLua(entity, itemInHand, false); + } + + public static Map completeEntityToLua(Entity entity, ItemStack itemInHand, boolean detailed) { + if (entity instanceof Player player) return playerToLua(player, detailed); + if (entity instanceof Animal animal) return animalToLua(animal, itemInHand, detailed); + if (entity instanceof LivingEntity livingEntity) return livingEntityToLua(livingEntity, detailed); + return entityToLua(entity, detailed); } public static Map completeEntityWithPositionToLua(Entity entity, BlockPos pos) { - return completeEntityWithPositionToLua(entity, ItemStack.EMPTY, pos); + return completeEntityWithPositionToLua(entity, pos, false); + } + + public static Map completeEntityWithPositionToLua(Entity entity, BlockPos pos, boolean detailed) { + return completeEntityWithPositionToLua(entity, ItemStack.EMPTY, pos, detailed); } - public static Map completeEntityWithPositionToLua(Entity entity, ItemStack itemInHand, BlockPos pos) { - Map data = completeEntityToLua(entity, itemInHand); + public static Map completeEntityWithPositionToLua(Entity entity, ItemStack itemInHand, BlockPos pos, boolean detailed) { + Map data = completeEntityToLua(entity, itemInHand, detailed); data.put("x", entity.getX() - pos.getX()); data.put("y", entity.getY() - pos.getY()); data.put("z", entity.getZ() - pos.getZ()); From 41e84d7d6599cf8f1ac6405dff4af75feba09b5f Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 27 Apr 2024 20:41:27 -0600 Subject: [PATCH 010/188] remove rideableJumping interface on turtleSeat --- .../peripheral/SaddlePeripheral.java | 9 +++++++-- .../common/entity/TurtleSeatEntity.java | 19 +------------------ 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 82be589f7..ccd1ec2a8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -69,8 +69,7 @@ public void detach(@NotNull IComputerAccess computer) { public void update() { if (this.seat != null) { if (!this.seat.isAlive()) { - this.seat = null; - this.hasRiderFlag.set(false); + this.standUp(); return; } this.seat.keepAlive(); @@ -126,6 +125,9 @@ private boolean standUp() { this.seat.discard(); this.seat = null; this.hasRiderFlag.set(false); + if (owner.getTurtle() instanceof TurtleBrain brain) { + brain.getOwner().createServerComputer().queueEvent("saddle_release"); + } return isVehicle; } @@ -148,6 +150,9 @@ public MethodResult capture() { if (!sitDown(entity)) { return MethodResult.of(null, "Entity cannot sit"); } + if (owner.getTurtle() instanceof TurtleBrain brain) { + brain.getOwner().createServerComputer().queueEvent("saddle_capture"); + } return MethodResult.of(true); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index 68a947cf0..66aa8a9b5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -14,7 +14,6 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.HasCustomInventoryScreen; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.PlayerRideableJumping; import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -26,7 +25,7 @@ import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.resources.ResourceLocation; -public class TurtleSeatEntity extends Entity implements HasCustomInventoryScreen, PlayerRideableJumping { +public class TurtleSeatEntity extends Entity implements HasCustomInventoryScreen { private ITurtleAccess turtle; private int life; @@ -109,22 +108,6 @@ public void openCustomInventoryScreen(Player player) { } } - public void onPlayerJump(int power) { - // - } - - public boolean canJump() { - return true; - } - - public void handleStartJump(int power) { - // - } - - public void handleStopJump() { - // - } - public static class Renderer extends EntityRenderer { public Renderer(EntityRendererProvider.Context ctx) { super(ctx); From d36726cee9ee052fb6b0ba1586c170708c0e71a6 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 06:47:58 -0600 Subject: [PATCH 011/188] add turtle fuel HUD --- .../client/ClientEventSubscriber.java | 19 +++++ .../client/ClientRegistry.java | 9 ++ .../client/hud/SaddleTurtleHud.java | 82 +++++++++++++++++++ .../peripheral/SaddlePeripheral.java | 71 ++++++++++------ .../common/entity/TurtleSeatEntity.java | 15 ++-- .../common/network/PacketHandler.java | 2 + .../toclient/RidingTurtleInfoPacket.java | 45 ++++++++++ .../common/setup/APEntities.java | 6 +- 8 files changed, 213 insertions(+), 36 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java create mode 100644 src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java new file mode 100644 index 000000000..f4d7153ec --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java @@ -0,0 +1,19 @@ +package de.srendi.advancedperipherals.client; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderGuiOverlayEvent; +import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, value = Dist.CLIENT) +public class ClientEventSubscriber { + @SubscribeEvent + public static void renderingHuds(RenderGuiOverlayEvent.Pre event) { + if (ClientRegistry.SADDLE_TURTLE_HUD.shouldRender() && event.getOverlay().id().equals(VanillaGuiOverlay.EXPERIENCE_BAR.id())) { + event.setCanceled(true); + return; + } + } +} \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index aa19e7877..f26a4ffba 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -3,6 +3,7 @@ import dan200.computercraft.api.client.ComputerCraftAPIClient; import dan200.computercraft.api.client.turtle.TurtleUpgradeModeller; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.hud.SaddleTurtleHud; import de.srendi.advancedperipherals.client.renderer.DistanceDetectorRenderer; import de.srendi.advancedperipherals.client.screens.InventoryManagerScreen; import de.srendi.advancedperipherals.client.screens.SmartGlassesScreen; @@ -15,6 +16,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.ModelEvent; +import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -25,6 +27,8 @@ public class ClientRegistry { private static final String[] TURTLE_MODELS = new String[]{"turtle_chat_box_upgrade_left", "turtle_chat_box_upgrade_right", "turtle_environment_upgrade_left", "turtle_environment_upgrade_right", "turtle_player_upgrade_left", "turtle_player_upgrade_right", "turtle_geoscanner_upgrade_left", "turtle_geoscanner_upgrade_right"}; + public static final SaddleTurtleHud SADDLE_TURTLE_HUD = new SaddleTurtleHud(); + @SubscribeEvent public static void registerModels(ModelEvent.RegisterAdditional event) { for (String model : TURTLE_MODELS) { @@ -63,4 +67,9 @@ public static void registeringKeymappings(RegisterKeyMappingsEvent event) { public static void registeringRenderers(EntityRenderersEvent.RegisterRenderers event) { event.registerBlockEntityRenderer(APBlockEntityTypes.DISTANCE_DETECTOR.get(), DistanceDetectorRenderer::new); } + + @SubscribeEvent + public static void registeringHuds(RegisterGuiOverlaysEvent event) { + event.registerAboveAll(SaddleTurtleHud.ID, SADDLE_TURTLE_HUD); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java new file mode 100644 index 000000000..7a7723dfb --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java @@ -0,0 +1,82 @@ +package de.srendi.advancedperipherals.client.hud; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiComponent; +import net.minecraftforge.client.gui.overlay.ForgeGui; +import net.minecraftforge.client.gui.overlay.IGuiOverlay; + +public class SaddleTurtleHud extends GuiComponent implements IGuiOverlay { + public static final String ID = "saddle_turtle_hud"; + + private ForgeGui gui; + private int screenWidth = 0; + private int screenHeight = 0; + + private int fuelLevel = 0; + private int fuelLimit = 0; + private int barColor = 0; + + public SaddleTurtleHud() {} + + public Font getFont() { + return this.gui.getMinecraft().font; + } + + public boolean shouldRender() { + return this.fuelLimit > 0; + } + + public void hide() { + this.setFuelLimit(0); + } + + public void setFuelLevel(int level) { + if (level < 0) { + level = 0; + } + this.fuelLevel = level; + } + + public void setFuelLimit(int limit) { + this.fuelLimit = limit; + } + + public void setBarColor(int color) { + this.barColor = color; + } + + private void renderFuelBar(PoseStack stack, int left) { + if (!shouldRender()) { + return; + } + + RenderSystem.setShaderTexture(0, GuiComponent.GUI_ICONS_LOCATION); + int width = 182; + int top = this.screenHeight - 32 + 3; + this.blit(stack, left, top, 0, 64, width, 5); + if (fuelLevel > 0) { + int progWidth = fuelLevel * width / fuelLimit; + this.blit(stack, left, top, 0, 69, progWidth, 5); + } + + String text = String.format("%d / %d", fuelLevel, fuelLimit); + int x = (this.screenWidth - getFont().width(text)) / 2; + int y = this.screenHeight - 31; + getFont().draw(stack, text, (float)(x + 1), (float) y, 0); + getFont().draw(stack, text, (float)(x - 1), (float) y, 0); + getFont().draw(stack, text, (float) x, (float)(y + 1), 0); + getFont().draw(stack, text, (float) x, (float)(y - 1), 0); + getFont().draw(stack, text, (float) x, (float) y, 8453920); + } + + public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + this.gui = gui; + this.screenWidth = screenWidth; + this.screenHeight = screenHeight; + + this.renderFuelBar(poseStack, this.screenWidth / 2 - 91); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index ccd1ec2a8..517e03531 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -7,12 +7,16 @@ import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; +import dan200.computercraft.shared.turtle.core.TurtleBrain; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; +import de.srendi.advancedperipherals.common.network.PacketHandler; +import de.srendi.advancedperipherals.common.network.toclient.RidingTurtleInfoPacket; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.TamableAnimal; @@ -33,9 +37,12 @@ public class SaddlePeripheral extends BasePeripheral { public static final String PERIPHERAL_TYPE = "saddle"; private TurtleSeatEntity seat = null; - private AtomicBoolean hasRiderFlag = new AtomicBoolean(); + private volatile Entity rider = null; + private BlockPos lastPos = null; private int moveProg = 0; - private BlockPos moveDir = null; + private int tickCount = 0; + + private int barColor = 0; public SaddlePeripheral(ITurtleAccess turtle, TurtleSide side) { super(PERIPHERAL_TYPE, new TurtlePeripheralOwner(turtle, side)); @@ -48,53 +55,65 @@ public boolean isEnabled() { @Nullable public Entity getRidingEntity() { - return this.seat != null ? this.seat.getFirstPassenger() : null; + return this.isEntityRiding() ? this.rider : null; } public boolean isEntityRiding() { - return this.seat != null && this.seat.isAlive() && this.seat.isVehicle(); + return this.seat != null && this.rider != null && this.seat.isAlive() && this.seat.hasPassenger(this.rider); } @Override public void attach(@NotNull IComputerAccess computer) { super.attach(computer); + this.lastPos = owner.getPos(); } @Override public void detach(@NotNull IComputerAccess computer) { - standUp(); + this.standUp(); super.detach(computer); } public void update() { if (this.seat != null) { - if (!this.seat.isAlive()) { + if (!isEntityRiding()) { this.standUp(); return; } this.seat.keepAlive(); BlockPos pos = owner.getPos(); - Vec3 newPos = new Vec3(pos.getX() + 0.5, pos.getY() + 0.4, pos.getZ() + 0.5); - BlockPos dir = pos.subtract(this.seat.blockPosition()); + BlockPos dir = pos.subtract(this.lastPos); int dist = Math.abs(dir.getX()) + Math.abs(dir.getY()) + Math.abs(dir.getZ()); - if (dist > 1) { - this.moveDir = null; - } else if (dist == 1) { - this.moveDir = dir; - } - if (this.moveDir != null) { - this.moveProg++; - if (this.moveProg > ANIM_DURATION) { - this.moveProg = 0; - this.moveDir = null; - } else { + if (dist != 0) { + Vec3 newPos = new Vec3(pos.getX() + 0.5, pos.getY() + 0.4, pos.getZ() + 0.5); + if (dist == 1 && ++this.moveProg < ANIM_DURATION) { float step = ((float) this.moveProg) / ANIM_DURATION; - newPos = newPos.add(Vec3.atLowerCornerOf(moveDir).scale(step - 1)); + newPos = newPos.add(Vec3.atLowerCornerOf(dir).scale(step - 1)); + } else { + this.moveProg = 0; + this.lastPos = pos; } - } - if (!this.seat.position().equals(newPos)) { this.seat.moveTo(newPos.x(), newPos.y(), newPos.z()); } + this.tickCount++; + if (this.tickCount > 40) { + this.tickCount = 0; + this.sendHUD(); + } + } + } + + private void sendHUD() { + if (this.rider instanceof ServerPlayer player) { + ITurtleAccess turtle = owner.getTurtle(); + RidingTurtleInfoPacket packet = new RidingTurtleInfoPacket(turtle.getFuelLevel(), turtle.getFuelLimit(), barColor); + PacketHandler.sendTo(packet, player); + } + } + + private void clearHUD() { + if (this.rider instanceof ServerPlayer player) { + PacketHandler.sendTo(new RidingTurtleInfoPacket(-1, -1, 0), player); } } @@ -113,7 +132,8 @@ private boolean sitDown(@NotNull Entity entity) { tamable.setInSittingPose(true); } this.seat.keepAlive(); - this.hasRiderFlag.set(true); + this.rider = entity; + this.sendHUD(); return true; } @@ -121,10 +141,11 @@ private boolean standUp() { if (this.seat == null) { return false; } + this.clearHUD(); boolean isVehicle = this.seat.isVehicle(); this.seat.discard(); this.seat = null; - this.hasRiderFlag.set(false); + this.rider = null; if (owner.getTurtle() instanceof TurtleBrain brain) { brain.getOwner().createServerComputer().queueEvent("saddle_release"); } @@ -166,7 +187,7 @@ public MethodResult release() { @LuaFunction public boolean hasRider() { - return this.hasRiderFlag.get(); + return this.rider != null; } @LuaFunction(mainThread = true) diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index 66aa8a9b5..1b09af26d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -38,7 +38,7 @@ public TurtleSeatEntity(EntityType type, Level world) { public TurtleSeatEntity(ITurtleAccess turtle) { this(APEntities.TURTLE_SEAT.get(), turtle.getLevel()); this.turtle = turtle; - this.life = 1; + this.life = 0; } public ITurtleAccess getOwner() { @@ -46,7 +46,7 @@ public ITurtleAccess getOwner() { } public void keepAlive() { - this.life = 3; + this.life = 2; } public Packet getAddEntityPacket() { @@ -84,13 +84,12 @@ public void tick() { if (this.level.isClientSide) { return; } - if (this.isVehicle()) { - this.life--; - if (this.life > 0) { - return; - } + this.life--; + if (this.life < 0) { + this.discard(); + return; } - this.discard(); + // TODO: better rendering } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java b/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java index 77bbd1fb9..22a336412 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java @@ -3,6 +3,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.network.base.IPacket; import de.srendi.advancedperipherals.common.network.toclient.DistanceDetectorSyncPacket; +import de.srendi.advancedperipherals.common.network.toclient.RidingTurtleInfoPacket; import de.srendi.advancedperipherals.common.network.toclient.ToastToClientPacket; import de.srendi.advancedperipherals.common.network.toserver.GlassesHotkeyPacket; import net.minecraft.core.BlockPos; @@ -34,6 +35,7 @@ public class PacketHandler { public static void init() { registerServerToClient(DistanceDetectorSyncPacket.class, DistanceDetectorSyncPacket::decode); + registerServerToClient(RidingTurtleInfoPacket.class, RidingTurtleInfoPacket::decode); registerServerToClient(ToastToClientPacket.class, ToastToClientPacket::decode); registerClientToServer(GlassesHotkeyPacket.class, GlassesHotkeyPacket::decode); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java new file mode 100644 index 000000000..71134ff6a --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java @@ -0,0 +1,45 @@ +package de.srendi.advancedperipherals.common.network.toclient; + +import de.srendi.advancedperipherals.common.network.base.IPacket; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.network.NetworkEvent; + +import static de.srendi.advancedperipherals.client.ClientRegistry.SADDLE_TURTLE_HUD; + +public class RidingTurtleInfoPacket implements IPacket { + + private final int fuelLevel; + private final int fuelLimit; + private final int barColor; + + public RidingTurtleInfoPacket(int fuelLevel, int fuelLimit, int barColor) { + this.fuelLevel = fuelLevel; + this.fuelLimit = fuelLimit; + this.barColor = barColor; + } + + @Override + public void handle(NetworkEvent.Context context) { + if (!FMLEnvironment.dist.isClient()) { + return; + } + SADDLE_TURTLE_HUD.setFuelLevel(this.fuelLevel); + SADDLE_TURTLE_HUD.setFuelLimit(this.fuelLimit); + SADDLE_TURTLE_HUD.setBarColor(this.barColor); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(this.fuelLevel); + buffer.writeInt(this.fuelLimit); + buffer.writeInt(this.barColor); + } + + public static RidingTurtleInfoPacket decode(FriendlyByteBuf buffer) { + int fuelLevel = buffer.readInt(); + int fuelLimit = buffer.readInt(); + int barColor = buffer.readInt(); + return new RidingTurtleInfoPacket(fuelLevel, fuelLimit, barColor); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java index 087ba80b5..ba262145e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java @@ -15,9 +15,9 @@ public class APEntities { public static final RegistryObject> TURTLE_SEAT = APRegistration.ENTITIES.register("turtle_seat", () -> EntityType.Builder.of(TurtleSeatEntity::new, MobCategory.MISC) - .sized(0.1F, 0.1F) - .clientTrackingRange(5) - .updateInterval(5) + .sized(0.8F, 0.2F) + .clientTrackingRange(4) + .updateInterval(4) .fireImmune() .build("turtle_seat")); From 3c6dd6a7c930bc5fbd8cb4f511d636f7e3e8f486 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 06:54:04 -0600 Subject: [PATCH 012/188] style fix --- .../client/ClientEventSubscriber.java | 10 +++++----- .../client/hud/SaddleTurtleHud.java | 1 - .../computercraft/peripheral/SaddlePeripheral.java | 1 - 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java index f4d7153ec..f8c7da127 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java @@ -11,9 +11,9 @@ public class ClientEventSubscriber { @SubscribeEvent public static void renderingHuds(RenderGuiOverlayEvent.Pre event) { - if (ClientRegistry.SADDLE_TURTLE_HUD.shouldRender() && event.getOverlay().id().equals(VanillaGuiOverlay.EXPERIENCE_BAR.id())) { - event.setCanceled(true); - return; - } + if (ClientRegistry.SADDLE_TURTLE_HUD.shouldRender() && event.getOverlay().id().equals(VanillaGuiOverlay.EXPERIENCE_BAR.id())) { + event.setCanceled(true); + return; + } } -} \ No newline at end of file +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java index 7a7723dfb..7fb71a692 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java +++ b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java @@ -2,7 +2,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiComponent; import net.minecraftforge.client.gui.overlay.ForgeGui; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 517e03531..4edb591e8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -28,7 +28,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Predicate; public class SaddlePeripheral extends BasePeripheral { From 040373cfc40d339ad47b6da5d1a66421d1db6799 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 07:00:32 -0600 Subject: [PATCH 013/188] remove unused import --- .../computercraft/peripheral/EnvironmentDetectorPeripheral.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index 4fa64fd39..27d70eca2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -24,7 +24,6 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.LightLayer; From 38b29abc2dfb85b5c2e5d6ee55b512d3c745d1ab Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 08:28:08 -0600 Subject: [PATCH 014/188] use Predicate.and instead of combine manually --- .../addons/computercraft/peripheral/SaddlePeripheral.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 4edb591e8..c97960252 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -158,8 +158,7 @@ public MethodResult capture() { } Predicate suitableEntity = (entity) -> entity.isAlive(); if (!APConfig.PERIPHERALS_CONFIG.allowSaddleTurtleCapturePlayer.get()) { - Predicate oldSuitableEntity = suitableEntity; - suitableEntity = (entity) -> oldSuitableEntity.test(entity) && !(entity instanceof Player); + suitableEntity = suitableEntity.and((entity) -> !(entity instanceof Player)); } final Predicate finalSuitableEntity = suitableEntity; HitResult entityHit = owner.withPlayer(player -> player.findHit(false, true, finalSuitableEntity)); From 5c226c7d4100a1fd40c397e18754a6dc4c99033b Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 08:29:32 -0600 Subject: [PATCH 015/188] add @Override description --- .../advancedperipherals/common/entity/TurtleSeatEntity.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index 1b09af26d..2e6dc9e5f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -49,14 +49,18 @@ public void keepAlive() { this.life = 2; } + @Override public Packet getAddEntityPacket() { return new ClientboundAddEntityPacket(this); } + @Override public void readAdditionalSaveData(CompoundTag storage) {} + @Override public void addAdditionalSaveData(CompoundTag storage) {} + @Override protected void defineSynchedData() {} @Override From 8100337e57c79146d1d464b36a225e448d662dde Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 10:45:05 -0600 Subject: [PATCH 016/188] add saddle_turtle to lang --- src/main/resources/assets/advancedperipherals/lang/en_US.json | 1 + src/main/resources/assets/advancedperipherals/lang/zh_cn.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/advancedperipherals/lang/en_US.json b/src/main/resources/assets/advancedperipherals/lang/en_US.json index 3f6944ddb..bd4a52463 100644 --- a/src/main/resources/assets/advancedperipherals/lang/en_US.json +++ b/src/main/resources/assets/advancedperipherals/lang/en_US.json @@ -87,5 +87,6 @@ "turtle.advancedperipherals.overpowered_husbandry_automata": "Overpowered husbandry automata", "turtle.advancedperipherals.overpowered_weak_automata": "Overpowered weak automata", "turtle.advancedperipherals.player_turtle": "Player Detector", + "turtle.advancedperipherals.saddle_turtle": "Tamed", "turtle.advancedperipherals.weak_automata": "Weak automata" } \ No newline at end of file diff --git a/src/main/resources/assets/advancedperipherals/lang/zh_cn.json b/src/main/resources/assets/advancedperipherals/lang/zh_cn.json index dce6830eb..c7c56d521 100644 --- a/src/main/resources/assets/advancedperipherals/lang/zh_cn.json +++ b/src/main/resources/assets/advancedperipherals/lang/zh_cn.json @@ -72,7 +72,7 @@ "pocket.advancedperipherals.colony_pocket": "殖民地", "pocket.advancedperipherals.environment_pocket": "环境监测", "pocket.advancedperipherals.geoscanner_pocket": "地理", - "pocket.advancedperipherals.player_pocket": "玩家侦测器", + "pocket.advancedperipherals.player_pocket": "玩家侦测", "text.advancedperipherals.added_player": "已将您添加到记忆卡中", "text.advancedperipherals.automata_core_feed_by_player": "你正试图把一个生物喂给魂器,但你的身体拒绝这么做。也许可以试试更机械化的东西?", "text.advancedperipherals.removed_player": "记忆卡已重置", @@ -87,5 +87,6 @@ "turtle.advancedperipherals.overpowered_husbandry_automata": "过载的自动畜牧", "turtle.advancedperipherals.overpowered_weak_automata": "过载的弱自动化", "turtle.advancedperipherals.player_turtle": "玩家侦测", + "turtle.advancedperipherals.saddle_turtle": "驯服的", "turtle.advancedperipherals.weak_automata": "弱自动化" } \ No newline at end of file From ff1d1cebb9cdc3539200421aa0d140c4f3294572 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 12:03:07 -0600 Subject: [PATCH 017/188] execute runData --- .../5a761efb7472ef97566e41e81451930a004134bf | 3 +- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +-- .../f95c7003282837dabaa33e3ffceec4e6865b5218 | 6 ++-- .../advancedperipherals/lang/en_us.json | 1 + .../armor/smart_glasses_netherite.json | 34 +++++++++++++++++++ .../armor/smart_glasses_netherite.json | 12 +++++++ .../forge/tags/blocks/needs_wood_tool.json | 3 +- .../tags/blocks/needs_iron_tool.json | 1 + 8 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json diff --git a/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf b/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf index 863bee0d1..b5643ffe5 100644 --- a/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf +++ b/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf @@ -1,4 +1,4 @@ -// 1.19.2 2023-09-25T15:21:21.7927076 Turtle Upgrades +// 1.19.2 2024-04-28T12:02:07.756326 Turtle Upgrades b8f19ae0fb5bb898facc08e3787e0f96c8211881 data/advancedperipherals/computercraft/turtle_upgrades/chatty_turtle.json fe98c60e7d61139aacf2d0872873e610aac8a37b data/advancedperipherals/computercraft/turtle_upgrades/chunky_turtle.json ae619da638ad89d7302d832d6c09e2c87401c539 data/advancedperipherals/computercraft/turtle_upgrades/compass_turtle.json @@ -10,4 +10,5 @@ c9b2df2d4fed11f60a8e6f8da77b2fa53dd13572 data/advancedperipherals/computercraft/ 42fc2b9a2601ef44d617cb18302c2c4fff31d282 data/advancedperipherals/computercraft/turtle_upgrades/overpowered_husbandry_automata.json fa7743922ef6b4dd3e633f2857e4047d533f13b5 data/advancedperipherals/computercraft/turtle_upgrades/overpowered_weak_automata.json 4054c59ceb099f17c4555fd5f36b2f8b4109f624 data/advancedperipherals/computercraft/turtle_upgrades/player_turtle.json +fa6624d0dab03bd26c2cccecad51848d5071ecd3 data/advancedperipherals/computercraft/turtle_upgrades/saddle_turtle.json c8059a2717cfac5b02898658c4d2d52fbd5710d4 data/advancedperipherals/computercraft/turtle_upgrades/weak_automata.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index 0350a3d7c..5f5e1c263 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2023-09-25T15:21:21.7533003 Languages: en_us -e7e0fec72e3f82423dea2c37d1fef381865df701 assets/advancedperipherals/lang/en_us.json +// 1.19.2 2024-04-28T12:02:07.756962 Languages: en_us +6965ce6973a1576fbad8b834c1795673a33bf6de assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 index 9609f52b0..2c5082ff8 100644 --- a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 +++ b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 @@ -1,4 +1,4 @@ -// 1.19.2 2023-09-25T15:21:21.7713005 Block tags -c4d65b1ce5b5b3ed603cbcc87cc47338be4406fe data/forge/tags/blocks/needs_wood_tool.json +// 1.19.2 2024-04-28T12:02:07.755312 Block tags +e1f71dcb4f9e7e36e29b0ad09d6520dc3adfa4a6 data/forge/tags/blocks/needs_wood_tool.json ef4684e10e5054e8cfd515dffa4a98169d281078 data/minecraft/tags/blocks/mineable/pickaxe.json -26803b7d98247a3df6ee256ceb9509a2ad1ec2e5 data/minecraft/tags/blocks/needs_iron_tool.json +8de9358ffeaa8d5f015774f70244a93b915427b8 data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index acbdd3c4c..ea355f815 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -91,5 +91,6 @@ "turtle.advancedperipherals.overpowered_husbandry_automata": "Overpowered husbandry automata", "turtle.advancedperipherals.overpowered_weak_automata": "Overpowered weak automata", "turtle.advancedperipherals.player_turtle": "Player Detector", + "turtle.advancedperipherals.saddle_turtle": "Saddle", "turtle.advancedperipherals.weak_automata": "Weak automata" } \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json new file mode 100644 index 000000000..bb6e067ec --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:armor/smart_glasses_netherite" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:armor/smart_glasses_netherite" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json b/src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json new file mode 100644 index 000000000..e46b01d51 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "addition": { + "item": "minecraft:netherite_ingot" + }, + "base": { + "item": "advancedperipherals:smart_glasses" + }, + "result": { + "item": "advancedperipherals:smart_glasses_netherite" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json index 0578bfe7e..ffd23c4b9 100644 --- a/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json +++ b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json @@ -1,6 +1,5 @@ { "values": [ - "advancedperipherals:peripheral_casing", - "advancedperipherals:colony_integrator" + "advancedperipherals:peripheral_casing" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json index 76fb2b79d..dcf31c50c 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json @@ -12,6 +12,7 @@ "advancedperipherals:redstone_integrator", "advancedperipherals:block_reader", "advancedperipherals:geo_scanner", + "advancedperipherals:colony_integrator", "advancedperipherals:nbt_storage", "advancedperipherals:distance_detector" ] From 4a607242b47a11c460f8a4116d6b01d349d75dd7 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 12:21:09 -0600 Subject: [PATCH 018/188] fix EnumColor alternative code --- .../common/util/EnumColor.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/EnumColor.java b/src/main/java/de/srendi/advancedperipherals/common/util/EnumColor.java index 9273fc561..2e3a97e00 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/EnumColor.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/EnumColor.java @@ -4,22 +4,22 @@ public enum EnumColor { - BLACK("\u00a70", "Black", "black", "§0", 0, new float[]{0f, 0f, 0f, 1f}), - DARK_BLUE("\u00a71", "Blue", "blue", "§1", 0xFF0000c9, new float[]{0f, 0f, 0.804f, 1f}), - DARK_GREEN("\u00a72", "Green", "green", "§2", 0xFF0c9400, new float[]{0.048f, 0.592f, 0f, 1f}), - DARK_AQUA("\u00a73", "Cyan", "cyan", "§3", 0xFF009494, new float[]{0f, 0.592f, 0.592f, 1f}), - DARK_RED("\u00a74", "Dark Red", "dark_red", "§4", 0xFF940000, new float[]{0.592f, 0f, 0f, 1f}), - DARK_PURPLE("\u00a75", "Purple", "purple", "§5", 0xFF510094, new float[]{0.324f, 0f, 0.592f, 1f}), - GOLD("\u00a76", "Orange", "orange", "§6", 0xFFb59700, new float[]{1f, 0.407f, 0f, 1f}), - GRAY("\u00a77", "Light Gray", "light_gray", "§7", 0xFF616161, new float[]{0.388f, 0.388f, 0.388f, 1f}), - DARK_GRAY("\u00a78", "Gray", "gray", "§8", 0xFF4a4a4a, new float[]{0.296f, 0.296f, 0.296f, 1f}), - BLUE("\u00a79", "Light Blue", "light_blue", "§9", 0xFF1919ff, new float[]{0.098f, 0.098f, 1f, 1f}), - GREEN("\u00a7a", "Lime", "lime", "§a", 0xFF00e02d, new float[]{0f, 0.878f, 0.176f, 1f}), - AQUA("\u00a7b", "Aqua", "aqua", "§b", 0xFF17ffe4, new float[]{0.090f, 1f, 0.894f, 1f}), - RED("\u00a7c", "Red", "red", "§c", 0xFFff1c1c, new float[]{1f, 0.109f, 0.109f, 1f}), - LIGHT_PURPLE("\u00a7d", "Magenta", "magenta", "§d", 0xFF7424ff, new float[]{0.454f, 0.141f, 1f, 1f}), - YELLOW("\u00a7e", "Yellow", "yellow", "§e", 0xFFc8ff00, new float[]{0.784f, 1f, 0f, 1f}), - WHITE("\u00a7f", "White", "white", "§f", 0xFFffffff, new float[]{1f, 1f, 1f, 1f}); + BLACK("\u00a70", "Black", "black", "&0", 0, new float[]{0f, 0f, 0f, 1f}), + DARK_BLUE("\u00a71", "Blue", "blue", "&1", 0xFF0000c9, new float[]{0f, 0f, 0.804f, 1f}), + DARK_GREEN("\u00a72", "Green", "green", "&2", 0xFF0c9400, new float[]{0.048f, 0.592f, 0f, 1f}), + DARK_AQUA("\u00a73", "Cyan", "cyan", "&3", 0xFF009494, new float[]{0f, 0.592f, 0.592f, 1f}), + DARK_RED("\u00a74", "Dark Red", "dark_red", "&4", 0xFF940000, new float[]{0.592f, 0f, 0f, 1f}), + DARK_PURPLE("\u00a75", "Purple", "purple", "&5", 0xFF510094, new float[]{0.324f, 0f, 0.592f, 1f}), + GOLD("\u00a76", "Orange", "orange", "&6", 0xFFb59700, new float[]{1f, 0.407f, 0f, 1f}), + GRAY("\u00a77", "Light Gray", "light_gray", "&7", 0xFF616161, new float[]{0.388f, 0.388f, 0.388f, 1f}), + DARK_GRAY("\u00a78", "Gray", "gray", "&8", 0xFF4a4a4a, new float[]{0.296f, 0.296f, 0.296f, 1f}), + BLUE("\u00a79", "Light Blue", "light_blue", "&9", 0xFF1919ff, new float[]{0.098f, 0.098f, 1f, 1f}), + GREEN("\u00a7a", "Lime", "lime", "&a", 0xFF00e02d, new float[]{0f, 0.878f, 0.176f, 1f}), + AQUA("\u00a7b", "Aqua", "aqua", "&b", 0xFF17ffe4, new float[]{0.090f, 1f, 0.894f, 1f}), + RED("\u00a7c", "Red", "red", "&c", 0xFFff1c1c, new float[]{1f, 0.109f, 0.109f, 1f}), + LIGHT_PURPLE("\u00a7d", "Magenta", "magenta", "&d", 0xFF7424ff, new float[]{0.454f, 0.141f, 1f, 1f}), + YELLOW("\u00a7e", "Yellow", "yellow", "&e", 0xFFc8ff00, new float[]{0.784f, 1f, 0f, 1f}), + WHITE("\u00a7f", "White", "white", "&f", 0xFFffffff, new float[]{1f, 1f, 1f, 1f}); private final String code; private final String name; From c39a049d5baa564a4ca1ad6e714fec59388ae860 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 12:56:24 -0600 Subject: [PATCH 019/188] add saddle capture cooldown also make the minimum action cooldown to 100ms --- .../operations/SimpleFreeOperation.java | 5 ++- .../operations/SingleOperation.java | 2 +- .../operations/SphereOperation.java | 2 +- .../peripheral/SaddlePeripheral.java | 41 +++++++++++-------- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SimpleFreeOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SimpleFreeOperation.java index b86b1aa39..5ed3604c4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SimpleFreeOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SimpleFreeOperation.java @@ -7,7 +7,8 @@ import java.util.Map; public enum SimpleFreeOperation implements IPeripheralOperation { - CHAT_MESSAGE(100); + CHAT_MESSAGE(1000), + SADDLE_CAPTURE(5000); private final int defaultCooldown; private ForgeConfigSpec.IntValue cooldown; @@ -18,7 +19,7 @@ public enum SimpleFreeOperation implements IPeripheralOperation { @Override public void addToConfig(ForgeConfigSpec.Builder builder) { - cooldown = builder.defineInRange(settingsName() + "Cooldown", defaultCooldown, 1_000, Integer.MAX_VALUE); + cooldown = builder.defineInRange(settingsName() + "Cooldown", defaultCooldown, 100, Integer.MAX_VALUE); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java index df8cd27e9..f59a0acc8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java @@ -68,7 +68,7 @@ public Map computerDescription() { @Override public void addToConfig(ForgeConfigSpec.Builder builder) { - cooldown = builder.defineInRange(settingsName() + "Cooldown", defaultCooldown, 1_000, Integer.MAX_VALUE); + cooldown = builder.defineInRange(settingsName() + "Cooldown", defaultCooldown, 100, Integer.MAX_VALUE); cost = builder.defineInRange(settingsName() + "Cost", defaultCost, 0, Integer.MAX_VALUE); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java index 147b06400..9e8e0ac0f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java @@ -29,7 +29,7 @@ public enum SphereOperation implements IPeripheralOperation { private static final int ANIM_DURATION = 8; // Should be same as TurtleBrain.ANIM_DURATION @@ -45,6 +47,7 @@ public class SaddlePeripheral extends BasePeripheral { public SaddlePeripheral(ITurtleAccess turtle, TurtleSide side) { super(PERIPHERAL_TYPE, new TurtlePeripheralOwner(turtle, side)); + owner.attachOperation(SADDLE_CAPTURE); } @Override @@ -152,27 +155,29 @@ private boolean standUp() { } @LuaFunction(mainThread = true) - public MethodResult capture() { + public MethodResult capture() throws LuaException { if (isEntityRiding()) { return MethodResult.of(null, "Another entity is riding"); } - Predicate suitableEntity = (entity) -> entity.isAlive(); - if (!APConfig.PERIPHERALS_CONFIG.allowSaddleTurtleCapturePlayer.get()) { - suitableEntity = suitableEntity.and((entity) -> !(entity instanceof Player)); - } - final Predicate finalSuitableEntity = suitableEntity; - HitResult entityHit = owner.withPlayer(player -> player.findHit(false, true, finalSuitableEntity)); - if (entityHit.getType() == HitResult.Type.MISS) { - return MethodResult.of(null, "Nothing found"); - } - LivingEntity entity = (LivingEntity) ((EntityHitResult) entityHit).getEntity(); - if (!sitDown(entity)) { - return MethodResult.of(null, "Entity cannot sit"); - } - if (owner.getTurtle() instanceof TurtleBrain brain) { - brain.getOwner().createServerComputer().queueEvent("saddle_capture"); - } - return MethodResult.of(true); + return withOperation(SADDLE_CAPTURE, null, null, context -> { + Predicate suitableEntity = (entity) -> entity.isAlive(); + if (!APConfig.PERIPHERALS_CONFIG.allowSaddleTurtleCapturePlayer.get()) { + suitableEntity = suitableEntity.and((entity) -> !(entity instanceof Player)); + } + final Predicate finalSuitableEntity = suitableEntity; + HitResult entityHit = owner.withPlayer(player -> player.findHit(false, true, finalSuitableEntity)); + if (entityHit.getType() == HitResult.Type.MISS) { + return MethodResult.of(null, "Nothing found"); + } + LivingEntity entity = (LivingEntity) ((EntityHitResult) entityHit).getEntity(); + if (!sitDown(entity)) { + return MethodResult.of(null, "Entity cannot sit"); + } + if (owner.getTurtle() instanceof TurtleBrain brain) { + brain.getOwner().createServerComputer().queueEvent("saddle_capture"); + } + return MethodResult.of(true); + }, null); } @LuaFunction(mainThread = true) From 5ec1d2627a5392aa638af4e00dd36b367f07539b Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 13:38:21 -0600 Subject: [PATCH 020/188] fix the turtle fuel bar will not clear when riding turtle broke --- .../client/hud/SaddleTurtleHud.java | 26 +++++++++++++++++-- .../peripheral/SaddlePeripheral.java | 7 ----- .../toclient/RidingTurtleInfoPacket.java | 1 + 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java index 7fb71a692..45eac7871 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java +++ b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java @@ -2,14 +2,19 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.player.LocalPlayer; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; public class SaddleTurtleHud extends GuiComponent implements IGuiOverlay { public static final String ID = "saddle_turtle_hud"; + private static final long ACTIVE_TIMEOUT = 5000; + private ForgeGui gui; private int screenWidth = 0; private int screenHeight = 0; @@ -17,6 +22,7 @@ public class SaddleTurtleHud extends GuiComponent implements IGuiOverlay { private int fuelLevel = 0; private int fuelLimit = 0; private int barColor = 0; + private long lastActived = 0; public SaddleTurtleHud() {} @@ -25,11 +31,25 @@ public Font getFont() { } public boolean shouldRender() { - return this.fuelLimit > 0; + LocalPlayer player = Minecraft.getInstance().player; + if (player == null || !(player.getVehicle() instanceof TurtleSeatEntity)) { + return false; + } + if (this.fuelLimit <= 0) { + return false; + } + return this.lastActived + ACTIVE_TIMEOUT > System.currentTimeMillis(); } public void hide() { - this.setFuelLimit(0); + this.fuelLevel = 0; + this.fuelLimit = 0; + this.barColor = 0; + this.lastActived = 0; + } + + public void keepAlive() { + this.lastActived = System.currentTimeMillis(); } public void setFuelLevel(int level) { @@ -52,7 +72,9 @@ private void renderFuelBar(PoseStack stack, int left) { return; } + // TODO: use a better looking bar here, and/or find someway to change the bar's color RenderSystem.setShaderTexture(0, GuiComponent.GUI_ICONS_LOCATION); + int width = 182; int top = this.screenHeight - 32 + 3; this.blit(stack, left, top, 0, 64, width, 5); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 2c541104f..1af23d058 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -113,12 +113,6 @@ private void sendHUD() { } } - private void clearHUD() { - if (this.rider instanceof ServerPlayer player) { - PacketHandler.sendTo(new RidingTurtleInfoPacket(-1, -1, 0), player); - } - } - private boolean sitDown(@NotNull Entity entity) { Level world = owner.getLevel(); BlockPos pos = owner.getPos(); @@ -143,7 +137,6 @@ private boolean standUp() { if (this.seat == null) { return false; } - this.clearHUD(); boolean isVehicle = this.seat.isVehicle(); this.seat.discard(); this.seat = null; diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java index 71134ff6a..c8f942712 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java @@ -27,6 +27,7 @@ public void handle(NetworkEvent.Context context) { SADDLE_TURTLE_HUD.setFuelLevel(this.fuelLevel); SADDLE_TURTLE_HUD.setFuelLimit(this.fuelLimit); SADDLE_TURTLE_HUD.setBarColor(this.barColor); + SADDLE_TURTLE_HUD.keepAlive(); } @Override From cb64bee172ddac5107dc544527c23e26250dbb55 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 13:44:09 -0600 Subject: [PATCH 021/188] fix fuel bar hidden condition --- .../client/hud/SaddleTurtleHud.java | 19 ++++++++++++++++--- .../toclient/RidingTurtleInfoPacket.java | 1 - 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java index 45eac7871..96722c93c 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java +++ b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java @@ -31,8 +31,12 @@ public Font getFont() { } public boolean shouldRender() { + if (this.lastActived == 0) { + return false; + } LocalPlayer player = Minecraft.getInstance().player; if (player == null || !(player.getVehicle() instanceof TurtleSeatEntity)) { + this.hide(); return false; } if (this.fuelLimit <= 0) { @@ -56,15 +60,24 @@ public void setFuelLevel(int level) { if (level < 0) { level = 0; } - this.fuelLevel = level; + if (this.fuelLevel != level) { + this.fuelLevel = level; + this.keepAlive(); + } } public void setFuelLimit(int limit) { - this.fuelLimit = limit; + if (this.fuelLimit != limit) { + this.fuelLimit = limit; + this.keepAlive(); + } } public void setBarColor(int color) { - this.barColor = color; + if (this.barColor != color) { + this.barColor = color; + this.keepAlive(); + } } private void renderFuelBar(PoseStack stack, int left) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java index c8f942712..71134ff6a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java @@ -27,7 +27,6 @@ public void handle(NetworkEvent.Context context) { SADDLE_TURTLE_HUD.setFuelLevel(this.fuelLevel); SADDLE_TURTLE_HUD.setFuelLimit(this.fuelLimit); SADDLE_TURTLE_HUD.setBarColor(this.barColor); - SADDLE_TURTLE_HUD.keepAlive(); } @Override From 34bac5940d51188d85bf63d8c6bb43f0df450458 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 28 Apr 2024 17:52:44 -0600 Subject: [PATCH 022/188] add more details to entityToLua --- .../client/hud/SaddleTurtleHud.java | 7 ++---- .../EnvironmentDetectorPeripheral.java | 3 +-- .../peripheral/SaddlePeripheral.java | 7 +++++- .../common/entity/TurtleSeatEntity.java | 25 +++++++++++++++++++ .../common/util/LuaConverter.java | 25 ++++++++++++++++--- 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java index 96722c93c..c0ea11b76 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java +++ b/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java @@ -39,9 +39,6 @@ public boolean shouldRender() { this.hide(); return false; } - if (this.fuelLimit <= 0) { - return false; - } return this.lastActived + ACTIVE_TIMEOUT > System.currentTimeMillis(); } @@ -91,12 +88,12 @@ private void renderFuelBar(PoseStack stack, int left) { int width = 182; int top = this.screenHeight - 32 + 3; this.blit(stack, left, top, 0, 64, width, 5); - if (fuelLevel > 0) { + if (fuelLevel > 0 && fuelLimit > 0) { int progWidth = fuelLevel * width / fuelLimit; this.blit(stack, left, top, 0, 69, progWidth, 5); } - String text = String.format("%d / %d", fuelLevel, fuelLimit); + String text = fuelLimit > 0 ? String.format("%d / %d", fuelLevel, fuelLimit) : "Infinity"; int x = (this.screenWidth - getFont().width(text)) / 2; int y = this.screenHeight - 31; getFont().draw(stack, text, (float)(x + 1), (float) y, 0); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index 27d70eca2..0d8d07078 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -206,8 +206,7 @@ public final MethodResult scanEntities(@NotNull IComputerAccess access, @NotNull }, context -> { BlockPos pos = owner.getPos(); AABB box = new AABB(pos); - List> entities = new ArrayList<>(); - getLevel().getEntities((Entity) null, box.inflate(radius), LivingEntity.class::isInstance).forEach(entity -> entities.add(LuaConverter.completeEntityWithPositionToLua(entity, pos, detailed))); + List> entities = getLevel().getEntities((Entity) null, box.inflate(radius), entity -> entity instanceof LivingEntity && entity.isAlive()).stream().map(entity -> LuaConverter.completeEntityWithPositionToLua(entity, pos, detailed)).toList(); return MethodResult.of(entities); }, null); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 1af23d058..0eb9ced2d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Map; import java.util.function.Predicate; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SimpleFreeOperation.SADDLE_CAPTURE; @@ -193,6 +194,10 @@ public MethodResult getRider(IArguments args) throws LuaException { if (entity == null) { return MethodResult.of(null, "No entity is riding"); } - return MethodResult.of(LuaConverter.completeEntityToLua(entity, getPeripheralOwner().getToolInMainHand(), detailed)); + Map data = LuaConverter.completeEntityToLua(entity, getPeripheralOwner().getToolInMainHand(), detailed); + if (data.get("pitch") instanceof Float pitch) { + data.put("pitch", (pitch.floatValue() - owner.getTurtle().getDirection().toYRot() + 360 + 180) % 360 - 180); + } + return MethodResult.of(data); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index 2e6dc9e5f..102a54bda 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -10,6 +10,7 @@ import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.HasCustomInventoryScreen; @@ -18,6 +19,8 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraft.nbt.CompoundTag; @@ -126,4 +129,26 @@ public ResourceLocation getTextureLocation(TurtleSeatEntity a0) { return null; } } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public boolean shouldBlockExplode(net.minecraft.world.level.Explosion a0, net.minecraft.world.level.BlockGetter a1, BlockPos a2, BlockState a3, float a4) { + return false; + } + + @Override + public boolean isIgnoringBlockTriggers() { + return true; + } + + @Override + public PushReaction getPistonPushReaction() { + return PushReaction.IGNORE; + } + + public void setDeltaMovement(Vec3 a0) {} } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index 3f1bcdd85..a2c9b205f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -12,6 +12,7 @@ import net.minecraft.world.SimpleContainer; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.npc.InventoryCarrier; @@ -21,6 +22,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.scores.Team; import net.minecraftforge.common.IForgeShearable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; @@ -39,12 +41,29 @@ public static Map entityToLua(Entity entity, boolean detailed) { Map data = new HashMap<>(); data.put("id", entity.getId()); data.put("uuid", entity.getStringUUID()); - data.put("name", entity.getName().getString()); - data.put("tags", entity.getTags()); + EntityType type = entity.getType(); + data.put("type", type.getDescriptionId()); + data.put("category", type.getCategory()); + data.put("canBurn", entity.fireImmune()); data.put("canFreeze", entity.canFreeze()); data.put("isGlowing", entity.isCurrentlyGlowing()); + data.put("isUnderWater", entity.isUnderWater()); + data.put("isInLava", entity.isInLava()); data.put("isInWall", entity.isInWall()); - if (detailed && entity instanceof InventoryCarrier carrier) { + data.put("pitch", entity.getYRot()); + data.put("yaw", entity.getXRot()); + if (!detailed) { + return data; + } + Team team = entity.getTeam(); + data.put("team", team != null ? team.getName() : null); + data.put("name", entity.getName().getString()); + data.put("air", entity.getAirSupply()); + data.put("maxAir", entity.getMaxAirSupply()); + data.put("frozen", entity.getTicksFrozen()); + data.put("freezeTicks", entity.getTicksRequiredToFreeze()); + data.put("tags", entity.getTags()); + if (entity instanceof InventoryCarrier carrier) { Map invMap = new HashMap<>(); SimpleContainer inv = carrier.getInventory(); for (int slot = 0; slot < inv.getContainerSize(); slot++) { From c90407c823738ed8281c15b147ea1be06006e4f3 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 29 Apr 2024 12:03:45 -0600 Subject: [PATCH 023/188] record control key when riding turtle --- .../client/ClientEventSubscriber.java | 68 +++++++++++++- .../client/ClientRegistry.java | 8 +- .../SaddleTurtleScreen.java} | 64 ++++++++++--- .../peripheral/SaddlePeripheral.java | 4 +- .../common/entity/TurtleSeatEntity.java | 91 ++++++++++++++++++- .../common/network/PacketHandler.java | 6 +- ...acket.java => SaddleTurtleInfoPacket.java} | 16 ++-- .../toserver/SaddleTurtleControlPacket.java | 78 ++++++++++++++++ .../advancedperipherals/lang/en_US.json | 1 + 9 files changed, 303 insertions(+), 33 deletions(-) rename src/main/java/de/srendi/advancedperipherals/client/{hud/SaddleTurtleHud.java => screens/SaddleTurtleScreen.java} (62%) rename src/main/java/de/srendi/advancedperipherals/common/network/toclient/{RidingTurtleInfoPacket.java => SaddleTurtleInfoPacket.java} (70%) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java index f8c7da127..21d18a3f4 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java @@ -1,9 +1,18 @@ package de.srendi.advancedperipherals.client; +import com.mojang.blaze3d.platform.InputConstants; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; +import de.srendi.advancedperipherals.common.network.PacketHandler; +import de.srendi.advancedperipherals.common.network.toserver.SaddleTurtleControlPacket; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.Input; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.client.event.MovementInputUpdateEvent; import net.minecraftforge.client.event.RenderGuiOverlayEvent; import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; +import net.minecraftforge.event.entity.EntityMountEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -11,9 +20,66 @@ public class ClientEventSubscriber { @SubscribeEvent public static void renderingHuds(RenderGuiOverlayEvent.Pre event) { - if (ClientRegistry.SADDLE_TURTLE_HUD.shouldRender() && event.getOverlay().id().equals(VanillaGuiOverlay.EXPERIENCE_BAR.id())) { + if (ClientRegistry.SADDLE_TURTLE_OVERLAY.shouldRenderFuelBar() && event.getOverlay().id().equals(VanillaGuiOverlay.EXPERIENCE_BAR.id())) { event.setCanceled(true); return; } } + + private static boolean sneaking = false; + + @SubscribeEvent + public static void playerTryDismount(InputEvent.Key event) { + Minecraft minecraft = Minecraft.getInstance(); + System.out.println("key press: " + event.getKey() + " action:" + event.getAction()); + if (!minecraft.options.keyShift.matches(event.getKey(), event.getScanCode())) { + return; + } + switch (event.getAction()) { + case InputConstants.PRESS: + sneaking = true; + if (ClientRegistry.SADDLE_TURTLE_OVERLAY.isPlayerMountedOnTurtle()) { + minecraft.options.keyShift.setDown(false); + } + break; + case InputConstants.RELEASE: + sneaking = false; + break; + } + } + + private static Input lastInput = new Input(); + private static boolean lastSneak = false; + + @SubscribeEvent + public static void playerMounting(EntityMountEvent event) { + if (event.isMounting() && event.getEntityMounting() == Minecraft.getInstance().player && event.getEntityBeingMounted() instanceof TurtleSeatEntity) { + // clear last key records + lastInput.up = false; + lastInput.down = false; + lastInput.left = false; + lastInput.right = false; + lastInput.jumping = false; + lastSneak = false; + } + } + + @SubscribeEvent + public static void playerMove(MovementInputUpdateEvent event) { + if (ClientRegistry.SADDLE_TURTLE_OVERLAY.isPlayerMountedOnTurtle()) { + Input input = event.getInput(); + if (sneaking == lastSneak && lastInput != null) { + if (lastInput.up == input.up && lastInput.down == input.down && lastInput.left == input.left && lastInput.right == input.right && lastInput.jumping == input.jumping) { + return; + } + } + lastInput.up = input.up; + lastInput.down = input.down; + lastInput.left = input.left; + lastInput.right = input.right; + lastInput.jumping = input.jumping; + lastSneak = sneaking; + PacketHandler.sendToServer(new SaddleTurtleControlPacket(input.up, input.down, input.left, input.right, input.jumping, sneaking)); + } + } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index f26a4ffba..9eaf6025f 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -3,9 +3,9 @@ import dan200.computercraft.api.client.ComputerCraftAPIClient; import dan200.computercraft.api.client.turtle.TurtleUpgradeModeller; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.client.hud.SaddleTurtleHud; import de.srendi.advancedperipherals.client.renderer.DistanceDetectorRenderer; import de.srendi.advancedperipherals.client.screens.InventoryManagerScreen; +import de.srendi.advancedperipherals.client.screens.SaddleTurtleScreen; import de.srendi.advancedperipherals.client.screens.SmartGlassesScreen; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.setup.APContainerTypes; @@ -27,7 +27,7 @@ public class ClientRegistry { private static final String[] TURTLE_MODELS = new String[]{"turtle_chat_box_upgrade_left", "turtle_chat_box_upgrade_right", "turtle_environment_upgrade_left", "turtle_environment_upgrade_right", "turtle_player_upgrade_left", "turtle_player_upgrade_right", "turtle_geoscanner_upgrade_left", "turtle_geoscanner_upgrade_right"}; - public static final SaddleTurtleHud SADDLE_TURTLE_HUD = new SaddleTurtleHud(); + public static final SaddleTurtleScreen SADDLE_TURTLE_OVERLAY = new SaddleTurtleScreen(); @SubscribeEvent public static void registerModels(ModelEvent.RegisterAdditional event) { @@ -69,7 +69,7 @@ public static void registeringRenderers(EntityRenderersEvent.RegisterRenderers e } @SubscribeEvent - public static void registeringHuds(RegisterGuiOverlaysEvent event) { - event.registerAboveAll(SaddleTurtleHud.ID, SADDLE_TURTLE_HUD); + public static void registeringOverlays(RegisterGuiOverlaysEvent event) { + event.registerAboveAll(SaddleTurtleScreen.ID, SADDLE_TURTLE_OVERLAY); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java similarity index 62% rename from src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java rename to src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java index c0ea11b76..be8c28177 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/hud/SaddleTurtleHud.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.client.hud; +package de.srendi.advancedperipherals.client.screens; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; @@ -6,12 +6,16 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.FormattedText; +import net.minecraft.util.FormattedCharSequence; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; -public class SaddleTurtleHud extends GuiComponent implements IGuiOverlay { - public static final String ID = "saddle_turtle_hud"; +public class SaddleTurtleScreen extends GuiComponent implements IGuiOverlay { + public static final String ID = "saddle_turtle_overlay"; private static final long ACTIVE_TIMEOUT = 5000; @@ -24,18 +28,34 @@ public class SaddleTurtleHud extends GuiComponent implements IGuiOverlay { private int barColor = 0; private long lastActived = 0; - public SaddleTurtleHud() {} + public SaddleTurtleScreen() {} - public Font getFont() { + protected Font getFont() { return this.gui.getMinecraft().font; } - public boolean shouldRender() { + protected int textWidth(String text) { + return getFont().width(text); + } + + protected int textWidth(FormattedText text) { + return getFont().width(text); + } + + protected int textWidth(FormattedCharSequence text) { + return getFont().width(text); + } + + public static boolean isPlayerMountedOnTurtle() { + LocalPlayer player = Minecraft.getInstance().player; + return player != null && player.getRootVehicle() instanceof TurtleSeatEntity; + } + + public boolean shouldRenderFuelBar() { if (this.lastActived == 0) { return false; } - LocalPlayer player = Minecraft.getInstance().player; - if (player == null || !(player.getVehicle() instanceof TurtleSeatEntity)) { + if (!isPlayerMountedOnTurtle()) { this.hide(); return false; } @@ -77,15 +97,13 @@ public void setBarColor(int color) { } } - private void renderFuelBar(PoseStack stack, int left) { - if (!shouldRender()) { - return; - } - + private void renderFuelBar(PoseStack stack) { // TODO: use a better looking bar here, and/or find someway to change the bar's color RenderSystem.setShaderTexture(0, GuiComponent.GUI_ICONS_LOCATION); + int fontColor = 0x80ff20; int width = 182; + int left = this.screenWidth / 2 - 91; int top = this.screenHeight - 32 + 3; this.blit(stack, left, top, 0, 64, width, 5); if (fuelLevel > 0 && fuelLimit > 0) { @@ -100,14 +118,30 @@ private void renderFuelBar(PoseStack stack, int left) { getFont().draw(stack, text, (float)(x - 1), (float) y, 0); getFont().draw(stack, text, (float) x, (float)(y + 1), 0); getFont().draw(stack, text, (float) x, (float)(y - 1), 0); - getFont().draw(stack, text, (float) x, (float) y, 8453920); + getFont().draw(stack, text, (float) x, (float) y, fontColor); + } + + private void renderDismountHint(PoseStack stack) { + Minecraft minecraft = Minecraft.getInstance(); + Component text = Component.translatable("gui.advancedperipherals.hint.saddle_turtle_dismount", + minecraft.options.keyShift.getTranslatedKeyMessage(), minecraft.options.keyInventory.getTranslatedKeyMessage()); + float top = 10; + float x = (float)(this.screenWidth / 2 - textWidth(text) / 2); + getFont().drawShadow(stack, text, x, top, 0xffffff); } public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + if (!isPlayerMountedOnTurtle()) { + return; + } + this.gui = gui; this.screenWidth = screenWidth; this.screenHeight = screenHeight; - this.renderFuelBar(poseStack, this.screenWidth / 2 - 91); + if (this.shouldRenderFuelBar()) { + this.renderFuelBar(poseStack); + } + this.renderDismountHint(poseStack); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 0eb9ced2d..f9071fa6c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -12,7 +12,7 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; import de.srendi.advancedperipherals.common.network.PacketHandler; -import de.srendi.advancedperipherals.common.network.toclient.RidingTurtleInfoPacket; +import de.srendi.advancedperipherals.common.network.toclient.SaddleTurtleInfoPacket; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.BlockPos; @@ -109,7 +109,7 @@ public void update() { private void sendHUD() { if (this.rider instanceof ServerPlayer player) { ITurtleAccess turtle = owner.getTurtle(); - RidingTurtleInfoPacket packet = new RidingTurtleInfoPacket(turtle.getFuelLevel(), turtle.getFuelLimit(), barColor); + SaddleTurtleInfoPacket packet = new SaddleTurtleInfoPacket(turtle.getFuelLevel(), turtle.getFuelLimit(), barColor); PacketHandler.sendTo(packet, player); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index 102a54bda..00e48ddcf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -6,6 +6,7 @@ import dan200.computercraft.shared.turtle.core.TurtleBrain; import dan200.computercraft.shared.turtle.items.TurtleItemFactory; import dan200.computercraft.shared.network.container.ComputerContainerData; +import de.srendi.advancedperipherals.common.network.toserver.SaddleTurtleControlPacket; import de.srendi.advancedperipherals.common.setup.APEntities; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRenderer; @@ -15,6 +16,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.HasCustomInventoryScreen; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -28,11 +30,28 @@ import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + public class TurtleSeatEntity extends Entity implements HasCustomInventoryScreen { + // TODO: better rendering + private ITurtleAccess turtle; private int life; + private boolean forwardKey = false; + private boolean backKey = false; + private boolean leftKey = false; + private boolean rightKey = false; + private boolean upKey = false; + private boolean downKey = false; + private boolean forwardKeyOld = false; + private boolean backKeyOld = false; + private boolean leftKeyOld = false; + private boolean rightKeyOld = false; + private boolean upKeyOld = false; + private boolean downKeyOld = false; + public TurtleSeatEntity(EntityType type, Level world) { super(type, world); this.noPhysics = true; @@ -48,6 +67,18 @@ public ITurtleAccess getOwner() { return turtle; } + @Nullable + private ServerComputer getServerComputer() { + Player player = this.getSelfAndPassengers().filter(e -> e instanceof Player).map(e -> (Player) e).findFirst().orElse(null); + if (player != null && this.turtle instanceof TurtleBrain turtle) { + TileTurtle tile = turtle.getOwner(); + if (tile.isUsable(player)) { + return tile.createServerComputer(); + } + } + return null; + } + public void keepAlive() { this.life = 2; } @@ -76,6 +107,18 @@ public void setPos(double x, double y, double z) { @Override protected void removePassenger(Entity entity) { super.removePassenger(entity); + this.forwardKey = false; + this.backKey = false; + this.leftKey = false; + this.rightKey = false; + this.upKey = false; + this.downKey = false; + this.forwardKeyOld = false; + this.backKeyOld = false; + this.leftKeyOld = false; + this.rightKeyOld = false; + this.upKeyOld = false; + this.downKeyOld = false; if (entity instanceof TamableAnimal tamed) { tamed.setInSittingPose(false); } @@ -86,6 +129,11 @@ public Vec3 getDismountLocationForPassenger(LivingEntity entity) { return super.getDismountLocationForPassenger(entity).add(0, 0.5, 0); } + @Override + public Entity getControllingPassenger() { + return null; // this.getFirstPassenger(); + } + @Override public void tick() { if (this.level.isClientSide) { @@ -96,12 +144,52 @@ public void tick() { this.discard(); return; } - // TODO: better rendering + ServerComputer computer = this.getServerComputer(); + if (computer != null) { + if (this.forwardKey != this.forwardKeyOld) { + this.forwardKeyOld = this.forwardKey; + computer.queueEvent("saddle_control", new Object[]{"forward", this.forwardKey}); + } + if (this.backKey != this.backKeyOld) { + this.backKeyOld = this.backKey; + computer.queueEvent("saddle_control", new Object[]{"back", this.backKey}); + } + if (this.leftKey != this.leftKeyOld) { + this.leftKeyOld = this.leftKey; + computer.queueEvent("saddle_control", new Object[]{"left", this.leftKey}); + } + if (this.rightKey != this.rightKeyOld) { + this.rightKeyOld = this.rightKey; + computer.queueEvent("saddle_control", new Object[]{"right", this.rightKey}); + } + if (this.upKey != this.upKeyOld) { + this.upKeyOld = this.upKey; + computer.queueEvent("saddle_control", new Object[]{"up", this.upKey}); + } + if (this.downKey != this.downKeyOld) { + this.downKeyOld = this.downKey; + computer.queueEvent("saddle_control", new Object[]{"down", this.downKey}); + } + } + } + + public void handleSaddleTurtleControlPacket(SaddleTurtleControlPacket packet) { + this.forwardKey = packet.forward; + this.backKey = packet.back; + this.leftKey = packet.left; + this.rightKey = packet.right; + this.upKey = packet.up; + this.downKey = packet.down; } @Override public void openCustomInventoryScreen(Player player) { if (!this.level.isClientSide && this.hasPassenger(player)) { + if (this.downKey) { + player.stopRiding(); + this.discard(); + return; + } if (this.turtle instanceof TurtleBrain turtle) { TileTurtle tile = turtle.getOwner(); if (!tile.isUsable(player)) { @@ -150,5 +238,6 @@ public PushReaction getPistonPushReaction() { return PushReaction.IGNORE; } + @Override public void setDeltaMovement(Vec3 a0) {} } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java b/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java index 22a336412..8658d0d0d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java @@ -3,9 +3,10 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.network.base.IPacket; import de.srendi.advancedperipherals.common.network.toclient.DistanceDetectorSyncPacket; -import de.srendi.advancedperipherals.common.network.toclient.RidingTurtleInfoPacket; +import de.srendi.advancedperipherals.common.network.toclient.SaddleTurtleInfoPacket; import de.srendi.advancedperipherals.common.network.toclient.ToastToClientPacket; import de.srendi.advancedperipherals.common.network.toserver.GlassesHotkeyPacket; +import de.srendi.advancedperipherals.common.network.toserver.SaddleTurtleControlPacket; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; @@ -35,9 +36,10 @@ public class PacketHandler { public static void init() { registerServerToClient(DistanceDetectorSyncPacket.class, DistanceDetectorSyncPacket::decode); - registerServerToClient(RidingTurtleInfoPacket.class, RidingTurtleInfoPacket::decode); + registerServerToClient(SaddleTurtleInfoPacket.class, SaddleTurtleInfoPacket::decode); registerServerToClient(ToastToClientPacket.class, ToastToClientPacket::decode); registerClientToServer(GlassesHotkeyPacket.class, GlassesHotkeyPacket::decode); + registerClientToServer(SaddleTurtleControlPacket.class, SaddleTurtleControlPacket::decode); } public static void registerServerToClient(Class packet, Function decode) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/SaddleTurtleInfoPacket.java similarity index 70% rename from src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java rename to src/main/java/de/srendi/advancedperipherals/common/network/toclient/SaddleTurtleInfoPacket.java index 71134ff6a..7cb9e3cf9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RidingTurtleInfoPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/SaddleTurtleInfoPacket.java @@ -5,15 +5,15 @@ import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.network.NetworkEvent; -import static de.srendi.advancedperipherals.client.ClientRegistry.SADDLE_TURTLE_HUD; +import static de.srendi.advancedperipherals.client.ClientRegistry.SADDLE_TURTLE_OVERLAY; -public class RidingTurtleInfoPacket implements IPacket { +public class SaddleTurtleInfoPacket implements IPacket { private final int fuelLevel; private final int fuelLimit; private final int barColor; - public RidingTurtleInfoPacket(int fuelLevel, int fuelLimit, int barColor) { + public SaddleTurtleInfoPacket(int fuelLevel, int fuelLimit, int barColor) { this.fuelLevel = fuelLevel; this.fuelLimit = fuelLimit; this.barColor = barColor; @@ -24,9 +24,9 @@ public void handle(NetworkEvent.Context context) { if (!FMLEnvironment.dist.isClient()) { return; } - SADDLE_TURTLE_HUD.setFuelLevel(this.fuelLevel); - SADDLE_TURTLE_HUD.setFuelLimit(this.fuelLimit); - SADDLE_TURTLE_HUD.setBarColor(this.barColor); + SADDLE_TURTLE_OVERLAY.setFuelLevel(this.fuelLevel); + SADDLE_TURTLE_OVERLAY.setFuelLimit(this.fuelLimit); + SADDLE_TURTLE_OVERLAY.setBarColor(this.barColor); } @Override @@ -36,10 +36,10 @@ public void encode(FriendlyByteBuf buffer) { buffer.writeInt(this.barColor); } - public static RidingTurtleInfoPacket decode(FriendlyByteBuf buffer) { + public static SaddleTurtleInfoPacket decode(FriendlyByteBuf buffer) { int fuelLevel = buffer.readInt(); int fuelLimit = buffer.readInt(); int barColor = buffer.readInt(); - return new RidingTurtleInfoPacket(fuelLevel, fuelLimit, barColor); + return new SaddleTurtleInfoPacket(fuelLevel, fuelLimit, barColor); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java new file mode 100644 index 000000000..a22836568 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java @@ -0,0 +1,78 @@ +package de.srendi.advancedperipherals.common.network.toserver; + +import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.network.NetworkEvent; + +public class SaddleTurtleControlPacket implements IPacket { + + public final boolean forward; + public final boolean back; + public final boolean left; + public final boolean right; + public final boolean up; + public final boolean down; + + private static final byte FORWARD_BIT = 1 << 0; + private static final byte BACK_BIT = 1 << 1; + private static final byte LEFT_BIT = 1 << 2; + private static final byte RIGHT_BIT = 1 << 3; + private static final byte UP_BIT = 1 << 4; + private static final byte DOWN_BIT = 1 << 5; + + public SaddleTurtleControlPacket(boolean forward, boolean back, boolean left, boolean right, boolean up, boolean down) { + this.forward = forward; + this.back = back; + this.left = left; + this.right = right; + this.up = up; + this.down = down; + } + + private SaddleTurtleControlPacket(byte bits) { + this((bits&FORWARD_BIT) != 0, (bits&BACK_BIT) != 0, (bits&LEFT_BIT) != 0, (bits&RIGHT_BIT) != 0, (bits&UP_BIT) != 0, (bits&DOWN_BIT) != 0); + } + + @Override + public void handle(NetworkEvent.Context context) { + ServerPlayer player = context.getSender(); + if (player != null && player.getRootVehicle() instanceof TurtleSeatEntity seat) { + seat.handleSaddleTurtleControlPacket(this); + } + } + + private byte encodeToBits() { + byte b = 0; + if (this.forward) { + b |= FORWARD_BIT; + } + if (this.back) { + b |= BACK_BIT; + } + if (this.left) { + b |= LEFT_BIT; + } + if (this.right) { + b |= RIGHT_BIT; + } + if (this.up) { + b |= UP_BIT; + } + if (this.down) { + b |= DOWN_BIT; + } + return b; + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeByte(this.encodeToBits()); + } + + public static SaddleTurtleControlPacket decode(FriendlyByteBuf buffer) { + return new SaddleTurtleControlPacket(buffer.readByte()); + } +} diff --git a/src/main/resources/assets/advancedperipherals/lang/en_US.json b/src/main/resources/assets/advancedperipherals/lang/en_US.json index bd4a52463..24c4c40cb 100644 --- a/src/main/resources/assets/advancedperipherals/lang/en_US.json +++ b/src/main/resources/assets/advancedperipherals/lang/en_US.json @@ -31,6 +31,7 @@ "block.advancedperipherals.redstone_integrator": "Redstone Integrator", "block.advancedperipherals.rs_bridge": "RS Bridge", "entity.minecraft.villager.advancedperipherals.computer_scientist": "Computer Scientist", + "gui.advancedperipherals.hint.saddle_turtle_dismount": "Controlling saddle turtle. Press %1$s and %2$s to dismount.", "item.advancedperipherals.chunk_controller": "Chunk Controller", "item.advancedperipherals.computer_tool": "Computer Tool", "item.advancedperipherals.end_automata_core": "End Automata Core", From c129b1dfeca725d634f73e11e55773e70465502b Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 29 Apr 2024 12:12:37 -0600 Subject: [PATCH 024/188] fix type uncommented -> commented --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 65efa6a1c..d9ab04165 100644 --- a/build.gradle +++ b/build.gradle @@ -316,7 +316,7 @@ dependencies { compileOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}") compileOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") compileOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") - // IMPORTANT. This should be removed/uncommented when running `runData` + // IMPORTANT. This should be removed/commented when running `runData` runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}") runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}") From 36dd9747dd5253020931204fb155e603c0246706 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 29 Apr 2024 12:42:44 -0600 Subject: [PATCH 025/188] run gradlew runData --- .../2db41954e490230d51b10affff25ee2ee27b8d5b | 2 +- .../5a761efb7472ef97566e41e81451930a004134bf | 2 +- .../67cce32b1c3cbbcb1f646605f4914e3f196986c2 | 2 +- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 4 ++-- .../ae219fa7c7d3297c14e454863eac3998a4eab78c | 2 +- .../b8526e444ae7356037f3a813274f6835d1f3dd16 | 2 +- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 ++-- .../f95c7003282837dabaa33e3ffceec4e6865b5218 | 2 +- .../advancedperipherals/lang/en_us.json | 1 + .../client/screens/SaddleTurtleScreen.java | 6 ++++-- .../common/data/EnUsLanguageProvider.java | 19 ++++++++++++------- 11 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b b/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b index 834374d4a..498e0b41f 100644 --- a/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b +++ b/src/generated/resources/.cache/2db41954e490230d51b10affff25ee2ee27b8d5b @@ -1,2 +1,2 @@ -// 1.19.2 2023-09-25T15:21:21.7663044 AP POI Type Tags +// 1.19.2 2024-04-29T12:16:26.853596 AP POI Type Tags d3d6b837660a4e213f287ad9d11e12368b90cd8e data/minecraft/tags/point_of_interest_type/acquirable_job_site.json diff --git a/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf b/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf index b5643ffe5..d54c78576 100644 --- a/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf +++ b/src/generated/resources/.cache/5a761efb7472ef97566e41e81451930a004134bf @@ -1,4 +1,4 @@ -// 1.19.2 2024-04-28T12:02:07.756326 Turtle Upgrades +// 1.19.2 2024-04-29T12:16:26.855663 Turtle Upgrades b8f19ae0fb5bb898facc08e3787e0f96c8211881 data/advancedperipherals/computercraft/turtle_upgrades/chatty_turtle.json fe98c60e7d61139aacf2d0872873e610aac8a37b data/advancedperipherals/computercraft/turtle_upgrades/chunky_turtle.json ae619da638ad89d7302d832d6c09e2c87401c539 data/advancedperipherals/computercraft/turtle_upgrades/compass_turtle.json diff --git a/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 b/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 index 5362386e5..0630ec1ce 100644 --- a/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 +++ b/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 @@ -1,4 +1,4 @@ -// 1.19.2 2023-09-25T15:21:21.7873091 LootTables +// 1.19.2 2024-04-29T12:16:26.855341 LootTables d865e8ac35302c486faf5c7122569c554186186d data/advancedperipherals/loot_tables/blocks/block_reader.json a6f896cc3dbd8da12737825ec71e32970f54025c data/advancedperipherals/loot_tables/blocks/chat_box.json f50f506ae1987537f76be4c05a81689b25798f91 data/advancedperipherals/loot_tables/blocks/colony_integrator.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 57b11e7d4..14f55c424 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.19.2 2023-09-27T10:45:57.2509102 Recipes +// 1.19.2 2024-04-29T12:16:26.856839 Recipes 045608027e4a5ea2d7dee7f402346b8e69f21675 data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json db2dada2fdf42ca1bbf47f1eb075d1f9de89dfa8 data/advancedperipherals/advancements/recipes/advancedperipheralstab/block_reader.json 77c55e8500be4a344ca563a8bf7642257cdc7b8b data/advancedperipherals/advancements/recipes/advancedperipheralstab/chat_box.json @@ -27,8 +27,8 @@ f1f468c732f8c802c27776d3fd7aac432bcac8e3 data/advancedperipherals/recipes/comput 55c257e4e8548d1453a7ab96c547d64c22b3e1d6 data/advancedperipherals/recipes/environment_detector.json 2ddf64c122165bcd3a277db8a1c7e96b4d510c67 data/advancedperipherals/recipes/geo_scanner.json ebe70aa9fe80c5b962c13aa1fbadc32269ba81b9 data/advancedperipherals/recipes/inventory_manager.json -809bc6929cf5eab72648e8f1fb565b58749fec12 data/advancedperipherals/recipes/memory_card.json 82895838af6c6aea0c60e3a3fbf71073ab684167 data/advancedperipherals/recipes/me_bridge.json +809bc6929cf5eab72648e8f1fb565b58749fec12 data/advancedperipherals/recipes/memory_card.json 8a73c4eb66e7a1cdc8e51d33466cf5a30da9270e data/advancedperipherals/recipes/nbt_storage.json 360432f30d61291066aa8c54692629f7a92e178d data/advancedperipherals/recipes/overpowered_end_automata_core.json 4ea6e90d13a61d90ad245539d20020ff9cb843e1 data/advancedperipherals/recipes/overpowered_husbandry_automata_core.json diff --git a/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c b/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c index 920ac4b21..9bcf3deac 100644 --- a/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c +++ b/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c @@ -1,4 +1,4 @@ -// 1.19.2 2023-09-25T15:21:21.7823145 Pocket Computer Upgrades +// 1.19.2 2024-04-29T12:16:26.856447 Pocket Computer Upgrades b672635324c0df354e587efc81d0b19a581eae2f data/advancedperipherals/computercraft/pocket_upgrades/chatty_pocket.json 30b8f663613c7ce77048fd69631afcc11a682276 data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json d4647159c2f2693a9c5e8d12bf740635751d29a8 data/advancedperipherals/computercraft/pocket_upgrades/environment_pocket.json diff --git a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 index a31e71cd0..3181070d4 100644 --- a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 +++ b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 @@ -1,4 +1,4 @@ -// 1.19.2 2023-09-25T15:21:21.7763015 Block States: advancedperipherals +// 1.19.2 2024-04-29T12:16:26.85592 Block States: advancedperipherals 5e28ce1be9a6996d982641e5df1fa7162090b8cc assets/advancedperipherals/blockstates/block_reader.json f42bdde60f84fdb312f7cf3b2be461d9c11ebdc8 assets/advancedperipherals/blockstates/chat_box.json 1227aa092fcf1327547ace6ccc9db230e45891b0 assets/advancedperipherals/blockstates/colony_integrator.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index 5f5e1c263..325d920ea 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2024-04-28T12:02:07.756962 Languages: en_us -6965ce6973a1576fbad8b834c1795673a33bf6de assets/advancedperipherals/lang/en_us.json +// 1.19.2 2024-04-29T12:36:37.514803 Languages: en_us +f7645d1ea152d6cff1f7658425328b90ab892e78 assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 index 2c5082ff8..2b9237add 100644 --- a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 +++ b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 @@ -1,4 +1,4 @@ -// 1.19.2 2024-04-28T12:02:07.755312 Block tags +// 1.19.2 2024-04-29T12:16:26.856659 Block tags e1f71dcb4f9e7e36e29b0ad09d6520dc3adfa4a6 data/forge/tags/blocks/needs_wood_tool.json ef4684e10e5054e8cfd515dffa4a98169d281078 data/minecraft/tags/blocks/mineable/pickaxe.json 8de9358ffeaa8d5f015774f70244a93b915427b8 data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index ea355f815..f6e2c9eb0 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -78,6 +78,7 @@ "text.advancedperipherals.added_player": "Added you to the memory card", "text.advancedperipherals.automata_core_feed_by_player": "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?", "text.advancedperipherals.removed_player": "Cleared the memory card", + "text.advancedperipherals.saddle_turtle_dismount_hint": "Controlling %1$s. Press %2$s and %3$s to dismount.", "text.advancedperipherals.smart_glasses.modules": "Modules", "text.advancedperipherals.smart_glasses.peripherals": "Peripherals", "turtle.advancedperipherals.chatty_turtle": "Chatty", diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java index be8c28177..7b1c74a0e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java @@ -123,8 +123,10 @@ private void renderFuelBar(PoseStack stack) { private void renderDismountHint(PoseStack stack) { Minecraft minecraft = Minecraft.getInstance(); - Component text = Component.translatable("gui.advancedperipherals.hint.saddle_turtle_dismount", - minecraft.options.keyShift.getTranslatedKeyMessage(), minecraft.options.keyInventory.getTranslatedKeyMessage()); + Component name = Component.translatable("block.computercraft.turtle_normal.upgraded", Component.translatable("turtle.advancedperipherals.saddle_turtle")); + // TODO: get and render turtle's label if exists + Component text = Component.translatable("text.advancedperipherals.saddle_turtle_dismount_hint", + name, minecraft.options.keyShift.getTranslatedKeyMessage(), minecraft.options.keyInventory.getTranslatedKeyMessage()); float top = 10; float x = (float)(this.screenWidth / 2 - textWidth(text) / 2); getFont().drawShadow(stack, text, x, top, 0xffffff); diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index d9fc1b681..490f5eba0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -33,7 +33,7 @@ protected void addTranslations() { addAdvancements(); addTooltips(); addKeybinds(); - addText(); + addTexts(); add(APVillagers.COMPUTER_SCIENTIST, "Computer Scientist"); add("advancedperipherals.name", "Advanced Peripherals"); add("curios.identifier.glasses", "Glasses"); @@ -133,12 +133,13 @@ private void addTooltips() { addTooltip(APItems.OVERPOWERED_END_AUTOMATA_CORE.get(), "&7Improved version of the end automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile."); } - private void addText() { - add("text." + AdvancedPeripherals.MOD_ID + ".removed_player", "Cleared the memory card"); - add("text." + AdvancedPeripherals.MOD_ID + ".added_player", "Added you to the memory card"); - add("text." + AdvancedPeripherals.MOD_ID + ".automata_core_feed_by_player", "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?"); - add("text." + AdvancedPeripherals.MOD_ID + ".smart_glasses.peripherals", "Peripherals"); - add("text." + AdvancedPeripherals.MOD_ID + ".smart_glasses.modules", "Modules"); + private void addTexts() { + addText("removed_player", "Cleared the memory card"); + addText("added_player", "Added you to the memory card"); + addText("automata_core_feed_by_player", "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?"); + addText("smart_glasses.peripherals", "Peripherals"); + addText("smart_glasses.modules", "Modules"); + addText("saddle_turtle_dismount_hint", "Controlling %1$s. Press %2$s and %3$s to dismount."); } private void addKeybinds() { @@ -155,6 +156,10 @@ private void add(@NotNull Supplier key, @NotNull String name add("entity.minecraft.villager." + AdvancedPeripherals.MOD_ID + "." + key.get().name(), name); } + private void addText(String key, String value) { + add("text." + AdvancedPeripherals.MOD_ID + "." + key, value); + } + private void addTurtle(@NotNull ResourceLocation key, @NotNull String name) { add("turtle." + key.getNamespace() + "." + key.getPath(), name); } From 0473e27b1eb562f0c53fb5f771a14095a26f8614 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 29 Apr 2024 12:42:58 -0600 Subject: [PATCH 026/188] reset en_US & zh_cn --- src/main/resources/assets/advancedperipherals/lang/en_US.json | 2 -- src/main/resources/assets/advancedperipherals/lang/zh_cn.json | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/resources/assets/advancedperipherals/lang/en_US.json b/src/main/resources/assets/advancedperipherals/lang/en_US.json index 24c4c40cb..3f6944ddb 100644 --- a/src/main/resources/assets/advancedperipherals/lang/en_US.json +++ b/src/main/resources/assets/advancedperipherals/lang/en_US.json @@ -31,7 +31,6 @@ "block.advancedperipherals.redstone_integrator": "Redstone Integrator", "block.advancedperipherals.rs_bridge": "RS Bridge", "entity.minecraft.villager.advancedperipherals.computer_scientist": "Computer Scientist", - "gui.advancedperipherals.hint.saddle_turtle_dismount": "Controlling saddle turtle. Press %1$s and %2$s to dismount.", "item.advancedperipherals.chunk_controller": "Chunk Controller", "item.advancedperipherals.computer_tool": "Computer Tool", "item.advancedperipherals.end_automata_core": "End Automata Core", @@ -88,6 +87,5 @@ "turtle.advancedperipherals.overpowered_husbandry_automata": "Overpowered husbandry automata", "turtle.advancedperipherals.overpowered_weak_automata": "Overpowered weak automata", "turtle.advancedperipherals.player_turtle": "Player Detector", - "turtle.advancedperipherals.saddle_turtle": "Tamed", "turtle.advancedperipherals.weak_automata": "Weak automata" } \ No newline at end of file diff --git a/src/main/resources/assets/advancedperipherals/lang/zh_cn.json b/src/main/resources/assets/advancedperipherals/lang/zh_cn.json index c7c56d521..dce6830eb 100644 --- a/src/main/resources/assets/advancedperipherals/lang/zh_cn.json +++ b/src/main/resources/assets/advancedperipherals/lang/zh_cn.json @@ -72,7 +72,7 @@ "pocket.advancedperipherals.colony_pocket": "殖民地", "pocket.advancedperipherals.environment_pocket": "环境监测", "pocket.advancedperipherals.geoscanner_pocket": "地理", - "pocket.advancedperipherals.player_pocket": "玩家侦测", + "pocket.advancedperipherals.player_pocket": "玩家侦测器", "text.advancedperipherals.added_player": "已将您添加到记忆卡中", "text.advancedperipherals.automata_core_feed_by_player": "你正试图把一个生物喂给魂器,但你的身体拒绝这么做。也许可以试试更机械化的东西?", "text.advancedperipherals.removed_player": "记忆卡已重置", @@ -87,6 +87,5 @@ "turtle.advancedperipherals.overpowered_husbandry_automata": "过载的自动畜牧", "turtle.advancedperipherals.overpowered_weak_automata": "过载的弱自动化", "turtle.advancedperipherals.player_turtle": "玩家侦测", - "turtle.advancedperipherals.saddle_turtle": "驯服的", "turtle.advancedperipherals.weak_automata": "弱自动化" } \ No newline at end of file From 4fc072cccd84119d823802364aa9224e34dd8104 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 29 Apr 2024 13:10:20 -0600 Subject: [PATCH 027/188] fix styles --- .../client/ClientEventSubscriber.java | 18 +++++++++--------- .../client/screens/SaddleTurtleScreen.java | 1 - .../common/entity/TurtleSeatEntity.java | 1 - .../toserver/SaddleTurtleControlPacket.java | 3 +-- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java index 21d18a3f4..cebeab85d 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java @@ -36,15 +36,15 @@ public static void playerTryDismount(InputEvent.Key event) { return; } switch (event.getAction()) { - case InputConstants.PRESS: - sneaking = true; - if (ClientRegistry.SADDLE_TURTLE_OVERLAY.isPlayerMountedOnTurtle()) { - minecraft.options.keyShift.setDown(false); - } - break; - case InputConstants.RELEASE: - sneaking = false; - break; + case InputConstants.PRESS: + sneaking = true; + if (ClientRegistry.SADDLE_TURTLE_OVERLAY.isPlayerMountedOnTurtle()) { + minecraft.options.keyShift.setDown(false); + } + break; + case InputConstants.RELEASE: + sneaking = false; + break; } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java index 7b1c74a0e..e206172a0 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java @@ -6,7 +6,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiComponent; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index 00e48ddcf..e2ef07f0b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -16,7 +16,6 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.HasCustomInventoryScreen; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java index a22836568..e9fca5ba5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/SaddleTurtleControlPacket.java @@ -4,7 +4,6 @@ import de.srendi.advancedperipherals.common.network.base.IPacket; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.network.NetworkEvent; public class SaddleTurtleControlPacket implements IPacket { @@ -33,7 +32,7 @@ public SaddleTurtleControlPacket(boolean forward, boolean back, boolean left, bo } private SaddleTurtleControlPacket(byte bits) { - this((bits&FORWARD_BIT) != 0, (bits&BACK_BIT) != 0, (bits&LEFT_BIT) != 0, (bits&RIGHT_BIT) != 0, (bits&UP_BIT) != 0, (bits&DOWN_BIT) != 0); + this((bits & FORWARD_BIT) != 0, (bits & BACK_BIT) != 0, (bits & LEFT_BIT) != 0, (bits & RIGHT_BIT) != 0, (bits & UP_BIT) != 0, (bits & DOWN_BIT) != 0); } @Override From f3b1e6c42a0326a5b76c3ea39abac81b9a137af7 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 29 Apr 2024 13:46:58 -0600 Subject: [PATCH 028/188] remove debug print --- .../srendi/advancedperipherals/client/ClientEventSubscriber.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java index cebeab85d..0904a99a2 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java @@ -31,7 +31,6 @@ public static void renderingHuds(RenderGuiOverlayEvent.Pre event) { @SubscribeEvent public static void playerTryDismount(InputEvent.Key event) { Minecraft minecraft = Minecraft.getInstance(); - System.out.println("key press: " + event.getKey() + " action:" + event.getAction()); if (!minecraft.options.keyShift.matches(event.getKey(), event.getScanCode())) { return; } From e374a38f2d87d9203eecde183a5831388ff35646 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 30 Apr 2024 17:26:27 -0600 Subject: [PATCH 029/188] return null instead of empty map for fluid stack --- .../peripheral/SaddlePeripheral.java | 2 +- .../common/util/LuaConverter.java | 20 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index f9071fa6c..04af84c82 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -195,7 +195,7 @@ public MethodResult getRider(IArguments args) throws LuaException { return MethodResult.of(null, "No entity is riding"); } Map data = LuaConverter.completeEntityToLua(entity, getPeripheralOwner().getToolInMainHand(), detailed); - if (data.get("pitch") instanceof Float pitch) { + if (data.get("pitch") instanceof Number pitch) { data.put("pitch", (pitch.floatValue() - owner.getTurtle().getDirection().toYRot() + 360 + 180) % 360 - 180); } return MethodResult.of(data); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index f50d0da54..db6bcefc8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -177,8 +177,11 @@ public static Object stateToObject(Comparable blockStateValue) { } } + @Nullable public static Object posToObject(BlockPos pos) { - if (pos == null) return null; + if (pos == null) { + return null; + } Map map = new HashMap<>(3); map.put("x", pos.getX()); @@ -202,8 +205,11 @@ public static Map itemStackToObject(@NotNull ItemStack stack) { return map; } + @Nullable public static Map fluidStackToObject(@NotNull FluidStack stack) { - if (stack.isEmpty()) return new HashMap<>(); + if (stack.isEmpty()) { + return null; + } Map map = fluidToObject(stack.getFluid()); CompoundTag nbt = stack.copy().getOrCreateTag(); map.put("count", stack.getAmount()); @@ -267,10 +273,12 @@ public static String tagToString(@NotNull TagKey tag) { // BlockPos tricks public static BlockPos convertToBlockPos(Map table) throws LuaException { - if (!table.containsKey("x") || !table.containsKey("y") || !table.containsKey("z")) - throw new LuaException("Table should be block position table"); - if (!(table.get("x") instanceof Number x) || !(table.get("y") instanceof Number y) || !(table.get("z") instanceof Number z)) - throw new LuaException("Table should be block position table"); + if (!table.containsKey("x") || !table.containsKey("y") || !table.containsKey("z")) { + throw new LuaException("Table should contains key 'x', 'y' and 'z'"); + } + if (!(table.get("x") instanceof Number x) || !(table.get("y") instanceof Number y) || !(table.get("z") instanceof Number z)) { + throw new LuaException("Position should be numbers"); + } return new BlockPos(x.intValue(), y.intValue(), z.intValue()); } From 67ca9f1eafe221770baadaa993d7afb95dc09f17 Mon Sep 17 00:00:00 2001 From: Srendi Date: Wed, 1 May 2024 21:57:27 +0200 Subject: [PATCH 030/188] Added the new textures and adjusted our models --- build.gradle | 12 +++---- .../b8526e444ae7356037f3a813274f6835d1f3dd16 | 24 ++++++------- .../f95c7003282837dabaa33e3ffceec4e6865b5218 | 6 ++-- .../models/block/chat_box.json | 3 +- .../models/block/colony_integrator.json | 6 ++-- .../models/block/energy_detector.json | 4 ++- .../models/block/environment_detector.json | 3 +- .../models/block/geo_scanner.json | 3 +- .../models/block/inventory_manager.json | 3 +- .../models/block/me_bridge.json | 3 +- .../models/block/nbt_storage.json | 3 +- .../models/block/player_detector.json | 2 +- .../models/block/redstone_integrator.json | 9 +++-- .../models/block/rs_bridge.json | 3 +- .../forge/tags/blocks/needs_wood_tool.json | 3 +- .../tags/blocks/needs_iron_tool.json | 1 + .../data/BlockStatesAndModelsProvider.java | 33 +++++++++--------- .../textures/block/ar_controller.png | Bin 784 -> 0 bytes .../textures/block/ar_controller_front.png | Bin 804 -> 0 bytes .../textures/block/block_reader_down.png | Bin 499 -> 438 bytes .../textures/block/block_reader_east.png | Bin 526 -> 512 bytes .../textures/block/block_reader_north.png | Bin 513 -> 604 bytes .../block/block_reader_north.png.mcmeta | 6 ++++ .../textures/block/block_reader_south.png | Bin 498 -> 424 bytes .../textures/block/block_reader_up.png | Bin 490 -> 446 bytes .../textures/block/block_reader_west.png | Bin 524 -> 523 bytes .../textures/block/chat_box.png | Bin 5996 -> 421 bytes .../textures/block/chat_box_front.png | Bin 811 -> 1130 bytes .../textures/block/chat_box_front.png.mcmeta | 6 ++++ .../textures/block/chat_box_top.png | Bin 0 -> 393 bytes .../textures/block/colony_integrator.png | Bin 655 -> 422 bytes .../block/colony_integrator_front.png | Bin 0 -> 1315 bytes .../block/colony_integrator_front.png.mcmeta | 6 ++++ .../textures/block/colony_integrator_top.png | Bin 0 -> 414 bytes .../textures/block/energy_detector.png | Bin 2694 -> 427 bytes .../textures/block/energy_detector_back.png | Bin 2702 -> 498 bytes .../textures/block/energy_detector_east.png | Bin 0 -> 1166 bytes .../block/energy_detector_east.png.mcmeta | 6 ++++ .../textures/block/energy_detector_front.png | Bin 2702 -> 495 bytes .../textures/block/energy_detector_top.png | Bin 0 -> 424 bytes .../textures/block/environment_detector.png | Bin 2694 -> 423 bytes .../block/environment_detector_front.png | Bin 804 -> 1601 bytes .../environment_detector_front.png.mcmeta | 6 ++++ .../block/environment_detector_top.png | Bin 0 -> 419 bytes .../textures/block/fluid_detector_back.png | Bin 0 -> 427 bytes .../textures/block/fluid_detector_front.png | Bin 0 -> 947 bytes .../block/fluid_detector_front.png.mcmeta | 6 ++++ .../textures/block/fluid_detector_input.png | Bin 0 -> 499 bytes .../textures/block/fluid_detector_output.png | Bin 0 -> 510 bytes .../textures/block/fluid_detector_top.png | Bin 0 -> 423 bytes .../textures/block/gas_detector_back.png | Bin 0 -> 429 bytes .../textures/block/gas_detector_front.png | Bin 0 -> 1021 bytes .../block/gas_detector_front.png.mcmeta | 6 ++++ .../textures/block/gas_detector_input.png | Bin 0 -> 495 bytes .../textures/block/gas_detector_output.png | Bin 0 -> 508 bytes .../textures/block/gas_detector_top.png | Bin 0 -> 422 bytes .../textures/block/geo_scanner.png | Bin 294 -> 432 bytes .../textures/block/geo_scanner_front.png | Bin 430 -> 1105 bytes .../block/geo_scanner_front.png.mcmeta | 6 ++++ .../textures/block/geo_scanner_top.png | Bin 0 -> 412 bytes .../textures/block/inventory_manager.png | Bin 432 -> 424 bytes .../block/inventory_manager_front.png | Bin 450 -> 475 bytes .../textures/block/inventory_manager_top.png | Bin 0 -> 411 bytes .../textures/block/me_bridge.png | Bin 306 -> 426 bytes .../textures/block/me_bridge_front.png | Bin 256 -> 1661 bytes .../textures/block/me_bridge_front.png.mcmeta | 6 ++++ .../textures/block/me_bridge_top.png | Bin 0 -> 411 bytes .../textures/block/nbt_storage.png | Bin 419 -> 427 bytes .../textures/block/nbt_storage_front.png | Bin 451 -> 1572 bytes .../block/nbt_storage_front.png.mcmeta | 6 ++++ .../textures/block/nbt_storage_top.png | Bin 0 -> 417 bytes .../textures/block/peripheral_casing.png | Bin 306 -> 339 bytes .../textures/block/player_detector.png | Bin 2694 -> 0 bytes .../textures/block/player_detector_front.png | Bin 2776 -> 568 bytes .../textures/block/player_detector_side.png | Bin 2776 -> 425 bytes .../textures/block/player_detector_top.png | Bin 0 -> 416 bytes .../textures/block/redstone_integrator.png | Bin 439 -> 0 bytes .../block/redstone_integrator_bottom.png | Bin 0 -> 420 bytes .../block/redstone_integrator_front.png | Bin 452 -> 1484 bytes .../redstone_integrator_front.png.mcmeta | 6 ++++ .../block/redstone_integrator_side.png | Bin 0 -> 480 bytes .../block/redstone_integrator_top.png | Bin 0 -> 410 bytes .../textures/block/rs_bridge.png | Bin 314 -> 423 bytes .../textures/block/rs_bridge_front.png | Bin 445 -> 1595 bytes .../textures/block/rs_bridge_front.png.mcmeta | 6 ++++ .../textures/block/rs_bridge_top.png | Bin 0 -> 403 bytes .../profession/computer_scientist.png | Bin 1836 -> 0 bytes .../profession/computer_scientist.png | Bin 1639 -> 0 bytes .../textures/gui/corners_glasses.png | Bin 999 -> 0 bytes .../textures/gui/inventory_manager_gui.png | Bin 716 -> 0 bytes .../textures/gui/smart_glasses_gui.png | Bin 1974 -> 0 bytes .../textures/item/book.png | Bin 430 -> 0 bytes .../textures/item/chunk_controller.png | Bin 334 -> 0 bytes .../textures/item/computer_tool.png | Bin 369 -> 0 bytes .../textures/item/memory_card.png | Bin 702 -> 0 bytes .../textures/item/memory_card_bounded.png | Bin 699 -> 0 bytes .../textures/item/metaphysics/base_gear.png | Bin 1516 -> 0 bytes .../textures/item/metaphysics/big_fire.png | Bin 1159 -> 0 bytes .../item/metaphysics/big_fire_green.png | Bin 1211 -> 0 bytes .../item/metaphysics/big_fire_purple.png | Bin 1206 -> 0 bytes .../textures/item/metaphysics/fire.png | Bin 921 -> 0 bytes .../textures/item/metaphysics/fire_green.png | Bin 919 -> 0 bytes .../textures/item/metaphysics/fire_purple.png | Bin 943 -> 0 bytes .../textures/item/smart_glasses.png | Bin 960 -> 0 bytes .../models/armor/smart_glasses_layer_1.png | Bin 191 -> 460 bytes .../textures/slot/empty_glasses_slot.png | Bin 163 -> 141 bytes .../gametest/TestGameTests.java | 17 +++++++++ 107 files changed, 157 insertions(+), 53 deletions(-) delete mode 100644 src/main/resources/assets/advancedperipherals/textures/block/ar_controller.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/block/ar_controller_front.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/block_reader_north.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/chat_box_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/chat_box_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/colony_integrator_front.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/colony_integrator_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/colony_integrator_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/energy_detector_east.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/energy_detector_east.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/energy_detector_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/environment_detector_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/environment_detector_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_back.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_front.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_input.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_output.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector_back.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector_input.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector_output.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/geo_scanner_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/geo_scanner_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/inventory_manager_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/me_bridge_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/me_bridge_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/nbt_storage_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/nbt_storage_top.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/block/player_detector.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/player_detector_top.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/block/redstone_integrator.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/redstone_integrator_bottom.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/redstone_integrator_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/redstone_integrator_side.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/redstone_integrator_top.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/rs_bridge_front.png.mcmeta create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/rs_bridge_top.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/entity/villager/profession/computer_scientist.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/entity/zombie_villager/profession/computer_scientist.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/gui/corners_glasses.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/gui/inventory_manager_gui.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/gui/smart_glasses_gui.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/book.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/chunk_controller.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/computer_tool.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/memory_card.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/memory_card_bounded.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/base_gear.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_green.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_purple.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire_green.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire_purple.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/item/smart_glasses.png create mode 100644 src/testMod/java/de/srendi/advancedperipherals/gametest/TestGameTests.java diff --git a/build.gradle b/build.gradle index 65efa6a1c..da03d3e40 100644 --- a/build.gradle +++ b/build.gradle @@ -317,13 +317,13 @@ dependencies { compileOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") compileOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") // IMPORTANT. This should be removed/uncommented when running `runData` - runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") - runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}") - runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}") - runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") - runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") + //runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") + //runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}") + //runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}") + //runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") + //runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") - //Patchouli + // Patchouli runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}") // Create diff --git a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 index a31e71cd0..084bc72ff 100644 --- a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 +++ b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 @@ -1,4 +1,4 @@ -// 1.19.2 2023-09-25T15:21:21.7763015 Block States: advancedperipherals +// 1.19.2 2024-05-01T21:37:27.0678801 Block States: advancedperipherals 5e28ce1be9a6996d982641e5df1fa7162090b8cc assets/advancedperipherals/blockstates/block_reader.json f42bdde60f84fdb312f7cf3b2be461d9c11ebdc8 assets/advancedperipherals/blockstates/chat_box.json 1227aa092fcf1327547ace6ccc9db230e45891b0 assets/advancedperipherals/blockstates/colony_integrator.json @@ -13,15 +13,15 @@ ff12c7217911184266589813a2c8f9b0d46cfd65 assets/advancedperipherals/blockstates/ 726cf2599b0c765bcfacda88a1943be74f985877 assets/advancedperipherals/blockstates/redstone_integrator.json 6b176e8fdb048f7b6678bfbc1c4baf2bcfa67a1f assets/advancedperipherals/blockstates/rs_bridge.json 544ff1ecb58622350b58940036b4b1908e1146da assets/advancedperipherals/models/block/block_reader.json -b28693973b6bbbb61e0c1ffc59e8ca98d8bb7e97 assets/advancedperipherals/models/block/chat_box.json -8361da86b709e26f17374dfd46637940894a2212 assets/advancedperipherals/models/block/colony_integrator.json -96ef564804fdc2b5184462747935f52baa35c651 assets/advancedperipherals/models/block/energy_detector.json -41556ddf5c5e67def6efd8e2e0645718d950af25 assets/advancedperipherals/models/block/environment_detector.json -ba233597a497c1032d884fc3058e27b9d965725e assets/advancedperipherals/models/block/geo_scanner.json -fb58e0b712f1f6ce1b2ea4dcfa0747905cf6ed95 assets/advancedperipherals/models/block/inventory_manager.json -75b59d2b73a96a27e3d4a1ed3b9a928b7dff102e assets/advancedperipherals/models/block/me_bridge.json -a647b86b8a7862af738136c9375a5d27d3b08860 assets/advancedperipherals/models/block/nbt_storage.json +dab55424ec184c5495c7ca11e5bbe77210e04c26 assets/advancedperipherals/models/block/chat_box.json +7e207db9b2b170f52565c8ed23bcc92762be6c4d assets/advancedperipherals/models/block/colony_integrator.json +1e9a2e3931bfe77f2d42a95c539b365c4517095d assets/advancedperipherals/models/block/energy_detector.json +434c2505b18d1313c0377c6bf8d5e4dba93765cc assets/advancedperipherals/models/block/environment_detector.json +51ab0a2a78453e711e6aa3c3020b9658bf379628 assets/advancedperipherals/models/block/geo_scanner.json +32f7941037838f9d77c5c3a4eb3b56c8786e500e assets/advancedperipherals/models/block/inventory_manager.json +674d6ee74ef7fd0360c0e1ea0b2e21734f67c096 assets/advancedperipherals/models/block/me_bridge.json +65cdb0ff57aa8439c5d80eea5c741866da9af81e assets/advancedperipherals/models/block/nbt_storage.json 36b6ac01be085492aa6298eeb89e6ecaa3cb6f82 assets/advancedperipherals/models/block/peripheral_casing.json -40369caaaf2f593d786a9c64284647fed8ae3a47 assets/advancedperipherals/models/block/player_detector.json -bed2ba2ba497ccde06c99712483fe220c277b4be assets/advancedperipherals/models/block/redstone_integrator.json -019c10d5062b5e7ae3e641527b9badab7a50878d assets/advancedperipherals/models/block/rs_bridge.json +120df29f21059aa9d4dff53bbb80953dee8d5214 assets/advancedperipherals/models/block/player_detector.json +d08b8946e1eb01cc9c8af4fa297b582614d1034b assets/advancedperipherals/models/block/redstone_integrator.json +15685a3c58f78db663609d56ee6fdb29652eef5f assets/advancedperipherals/models/block/rs_bridge.json diff --git a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 index 9609f52b0..012a6293c 100644 --- a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 +++ b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 @@ -1,4 +1,4 @@ -// 1.19.2 2023-09-25T15:21:21.7713005 Block tags -c4d65b1ce5b5b3ed603cbcc87cc47338be4406fe data/forge/tags/blocks/needs_wood_tool.json +// 1.19.2 2024-05-01T21:24:42.041223 Block tags +e1f71dcb4f9e7e36e29b0ad09d6520dc3adfa4a6 data/forge/tags/blocks/needs_wood_tool.json ef4684e10e5054e8cfd515dffa4a98169d281078 data/minecraft/tags/blocks/mineable/pickaxe.json -26803b7d98247a3df6ee256ceb9509a2ad1ec2e5 data/minecraft/tags/blocks/needs_iron_tool.json +8de9358ffeaa8d5f015774f70244a93b915427b8 data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json b/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json index 487d0eb4e..b2dc05216 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json @@ -3,6 +3,7 @@ "textures": { "all": "advancedperipherals:block/chat_box", "north": "advancedperipherals:block/chat_box_front", - "particle": "advancedperipherals:block/chat_box_front" + "particle": "advancedperipherals:block/chat_box_front", + "up": "advancedperipherals:block/chat_box_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json b/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json index 884006124..71048304d 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json @@ -2,8 +2,8 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/colony_integrator", - "down": "minecraft:block/oak_log_top", - "particle": "advancedperipherals:block/colony_integrator", - "up": "minecraft:block/oak_log_top" + "north": "advancedperipherals:block/colony_integrator_front", + "particle": "advancedperipherals:block/colony_integrator_front", + "up": "advancedperipherals:block/colony_integrator_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json index d1b21431d..4b3b4c8d2 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json @@ -2,8 +2,10 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/energy_detector", + "east": "advancedperipherals:block/energy_detector_east", "north": "advancedperipherals:block/energy_detector_front", "particle": "advancedperipherals:block/energy_detector_front", - "south": "advancedperipherals:block/energy_detector_back" + "south": "advancedperipherals:block/energy_detector_back", + "up": "advancedperipherals:block/energy_detector_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json index e049a94d1..90630831d 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json @@ -3,6 +3,7 @@ "textures": { "all": "advancedperipherals:block/environment_detector", "north": "advancedperipherals:block/environment_detector_front", - "particle": "advancedperipherals:block/environment_detector_front" + "particle": "advancedperipherals:block/environment_detector_front", + "up": "advancedperipherals:block/environment_detector_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json b/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json index d81084e52..6752a0106 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json @@ -3,6 +3,7 @@ "textures": { "all": "advancedperipherals:block/geo_scanner", "north": "advancedperipherals:block/geo_scanner_front", - "particle": "advancedperipherals:block/geo_scanner_front" + "particle": "advancedperipherals:block/geo_scanner_front", + "up": "advancedperipherals:block/geo_scanner_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json b/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json index 16ac6a767..818e46153 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json @@ -3,6 +3,7 @@ "textures": { "all": "advancedperipherals:block/inventory_manager", "north": "advancedperipherals:block/inventory_manager_front", - "particle": "advancedperipherals:block/inventory_manager_front" + "particle": "advancedperipherals:block/inventory_manager_front", + "up": "advancedperipherals:block/inventory_manager_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json b/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json index 0d5355f55..42e6388e4 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json @@ -3,6 +3,7 @@ "textures": { "all": "advancedperipherals:block/me_bridge", "north": "advancedperipherals:block/me_bridge_front", - "particle": "advancedperipherals:block/me_bridge_front" + "particle": "advancedperipherals:block/me_bridge_front", + "up": "advancedperipherals:block/me_bridge_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json b/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json index 4472f8466..dce7d353e 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json @@ -3,6 +3,7 @@ "textures": { "all": "advancedperipherals:block/nbt_storage", "north": "advancedperipherals:block/nbt_storage_front", - "particle": "advancedperipherals:block/nbt_storage_front" + "particle": "advancedperipherals:block/nbt_storage_front", + "up": "advancedperipherals:block/nbt_storage_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json index f3d2db295..a979dadf1 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json @@ -1,12 +1,12 @@ { "parent": "minecraft:block/cube_all", "textures": { - "all": "advancedperipherals:block/player_detector", "east": "advancedperipherals:block/player_detector_side", "north": "advancedperipherals:block/player_detector_front", "particle": "advancedperipherals:block/player_detector_front", "side": "advancedperipherals:block/player_detector_side", "south": "advancedperipherals:block/player_detector_side", + "up": "advancedperipherals:block/player_detector_top", "west": "advancedperipherals:block/player_detector_side" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/redstone_integrator.json b/src/generated/resources/assets/advancedperipherals/models/block/redstone_integrator.json index 2fa89aaa5..038dd8561 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/redstone_integrator.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/redstone_integrator.json @@ -1,8 +1,13 @@ { "parent": "minecraft:block/cube_all", "textures": { - "all": "advancedperipherals:block/redstone_integrator", + "down": "advancedperipherals:block/redstone_integrator_bottom", + "east": "advancedperipherals:block/redstone_integrator_side", "north": "advancedperipherals:block/redstone_integrator_front", - "particle": "advancedperipherals:block/redstone_integrator_front" + "particle": "advancedperipherals:block/redstone_integrator_front", + "side": "advancedperipherals:block/redstone_integrator_side", + "south": "advancedperipherals:block/redstone_integrator_side", + "up": "advancedperipherals:block/redstone_integrator_top", + "west": "advancedperipherals:block/redstone_integrator_side" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json b/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json index 10e0f003a..585be6406 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json @@ -3,6 +3,7 @@ "textures": { "all": "advancedperipherals:block/rs_bridge", "north": "advancedperipherals:block/rs_bridge_front", - "particle": "advancedperipherals:block/rs_bridge_front" + "particle": "advancedperipherals:block/rs_bridge_front", + "up": "advancedperipherals:block/rs_bridge_top" } } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json index 0578bfe7e..ffd23c4b9 100644 --- a/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json +++ b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json @@ -1,6 +1,5 @@ { "values": [ - "advancedperipherals:peripheral_casing", - "advancedperipherals:colony_integrator" + "advancedperipherals:peripheral_casing" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json index 76fb2b79d..dcf31c50c 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json @@ -12,6 +12,7 @@ "advancedperipherals:redstone_integrator", "advancedperipherals:block_reader", "advancedperipherals:geo_scanner", + "advancedperipherals:colony_integrator", "advancedperipherals:nbt_storage", "advancedperipherals:distance_detector" ] diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java index ac90a7390..3f12b5212 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java @@ -20,22 +20,19 @@ public BlockStatesAndModelsProvider(DataGenerator packOutput, ExistingFileHelper @Override protected void registerStatesAndModels() { - peripheralBlock(APBlocks.ENVIRONMENT_DETECTOR.get(), "front"); - peripheralBlock(APBlocks.CHAT_BOX.get(), "front"); - peripheralBlock(APBlocks.PLAYER_DETECTOR.get(), "side", "front"); - peripheralBlock(APBlocks.ME_BRIDGE.get(), "front"); - peripheralBlock(APBlocks.RS_BRIDGE.get(), "front"); - peripheralBlock(APBlocks.ENERGY_DETECTOR.get(), "front", "back"); + peripheralBlock(APBlocks.ENVIRONMENT_DETECTOR.get(), "front", "top"); + peripheralBlock(APBlocks.CHAT_BOX.get(), "front", "top"); + peripheralBlock(APBlocks.PLAYER_DETECTOR.get(), generateModel(APBlocks.PLAYER_DETECTOR.get(), false, "side", "front", "top")); + peripheralBlock(APBlocks.ME_BRIDGE.get(), "front", "top"); + peripheralBlock(APBlocks.RS_BRIDGE.get(), "front", "top"); + peripheralBlock(APBlocks.ENERGY_DETECTOR.get(), "front", "back", "top", "east"); peripheralBlock(APBlocks.PERIPHERAL_CASING.get()); - peripheralBlock(APBlocks.INVENTORY_MANAGER.get(), "front"); - peripheralBlock(APBlocks.REDSTONE_INTEGRATOR.get(), "front"); + peripheralBlock(APBlocks.INVENTORY_MANAGER.get(), "front", "top"); + peripheralBlock(APBlocks.REDSTONE_INTEGRATOR.get(), generateModel(APBlocks.REDSTONE_INTEGRATOR.get(), false,"side", "front", "top", "bottom")); peripheralBlock(APBlocks.BLOCK_READER.get(), generateModel(APBlocks.BLOCK_READER.get(), false, "north", "south", "east", "west", "up", "down")); - peripheralBlock(APBlocks.GEO_SCANNER.get(), "front"); - peripheralBlock(APBlocks.COLONY_INTEGRATOR.get(), generateModel(APBlocks.COLONY_INTEGRATOR.get()) - .texture("particle", blockTexture(APBlocks.COLONY_INTEGRATOR.get())) - .texture("up", blockTexture(net.minecraft.world.level.block.Blocks.OAK_LOG, "top")) - .texture("down", blockTexture(net.minecraft.world.level.block.Blocks.OAK_LOG, "top"))); - peripheralBlock(APBlocks.NBT_STORAGE.get(), "front"); + peripheralBlock(APBlocks.GEO_SCANNER.get(), "front", "top"); + peripheralBlock(APBlocks.COLONY_INTEGRATOR.get(), "front", "top"); + peripheralBlock(APBlocks.NBT_STORAGE.get(), "front", "top"); } private void peripheralBlock(Block block, ModelFile file) { @@ -81,10 +78,14 @@ private BlockModelBuilder generateModel(Block block, boolean hasNormalSide, Stri side = "north"; particleTexture = blockTexture(block, "front"); } - if (side.equals("back")) side = "south"; + if (side.equals("top")) + side = "up"; + if (side.equals("bottom")) + side = "down"; + if (side.equals("back")) + side = "south"; builder.texture(side, blockTexture(block, sideTexture)); - } builder.texture("particle", particleTexture); return builder; diff --git a/src/main/resources/assets/advancedperipherals/textures/block/ar_controller.png b/src/main/resources/assets/advancedperipherals/textures/block/ar_controller.png deleted file mode 100644 index 2fe546d8248230702850e2b54dbc0cdcbeee543c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 784 zcmV+r1MmEaP)4Tx04R}tkv&MmKp2MKrbAE$6^me@v=v%)FuC*(nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~xH8#OK80CKX8h$aTfzH_kKlt5St1va`C52-^_lx6vi~^xupjmgE?_i;A5=XED6~yy|*YeY0FHMa0ZR1VBW% zyP3IrDJ4UeL`2POu~;zRm$mjWW*};K1ivRh1Zf44>W;R`IL_}4GVHm?R zbNqN?=Y&~zS5*-ihJgpRGDAcF?yl|*z|7cs+HC=d2=M^4>qjD9A5AIpeYbbdweL#P z*1kJ`y(B~8P5=;+(<7qx-P3*Zu>LMh%aZB^S41We5fPMyq)XG*T1zQOY%GH&8L9!G z_TBquTl;RD=TqHXiImqOqV8YM5%dQD#UO=?4pSfZ1#|-nl>C@jx-v%=Y^|H#rwB@i-?30{8)X^!%GFMAz8> O00004Tx04R}tkv&MmKp2MKrbAE$6^me@v=v%)FuC*(nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~xH8#OK80CKX8h$aTfzH_kKlt5St1va`C52-^_lx6vi~^xupjmgE?_sjx3JnPA7wIU)_B_d{y2zOUi zcTXvm5LZMbs=8b*5nz?O|Hx*u5d^#44y?#P!BPtQVzE$F!BbT|y}TtN5y?4^>4EH? z?vXhK>h2;!L^)?1kO~Bh%T-0@0~%%q*ou2Vr9y zq=J=cn#myCsp{sTA5`?f>#m|=m9Rdo&RRZ zIb(M_Ryh8{-mioG<1ZWk1B{Yl(fjiQrl2UqxrEGYW@2W{+_vp_=D>om;4o8Eb-i9= ilFPsqKGZ1%nfVV-M*@*Y0W#VE0000 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/block_reader_down.png b/src/main/resources/assets/advancedperipherals/textures/block/block_reader_down.png index c42740fa501b867ec3dbfa9bd8661adcf32a59a6..4e039835c06577edb87caaa603dfb938111fd186 100644 GIT binary patch delta 412 zcmV;N0b~C21GWQ@B!3BTNLh0L01FcU01FcV0GgZ_0004KNklb;@5Jg{* z?Ioh10ZVbP!W9xJi8w|oB&sy2X>t+j^l2zKL@F8%5D5jz#E}e*3xwA$lETcgHsn|1 z@$UcgXLc@bAMSrSpvbj^xSl%6*?EBj(CPXn(QIClWqT6?WPjPdk{4_@Nl73dHbmL= zR3#ROsAFGxf4T!;7nfwMz&{(m%-2T5DRON}1sKg1RuxN2wY>E9*sE095RW!`;SB)O z;lNZSCAR_}TeJaXvx;1^ixY}mR|q9%pK(1!mhEvpRT2nVfsgAcwwvT+d|%5?0MbZT zDsXHzQJW42Mt?nxG?RYm`!(Je!YtcUQgzfaCIG4md8eY!R-GIR2S*L^*y)h02P12&DZrrB!2;OQb$4nuFf3k00054NkllW8bAA zCbQY>p>12TEW;SX|3nCZvMdo1^bl4`0pOftDPaT^t-*T_5Pu7mWr^Nb@8Q$yiu&J0 z9RkZ73g@CoA2O`I5AV)SXy3f1Hipydilqdcb10=S#*k$h(!IMQd2+Hi}&Rei=osZr?_Dom-05 zP*vTwB!ocIGtnxw9b#QNc7+ORax&YX2x4hW9xaB^chtK&hrjO&J6_K|? P00000NkvXXu0mjfG!EwS diff --git a/src/main/resources/assets/advancedperipherals/textures/block/block_reader_east.png b/src/main/resources/assets/advancedperipherals/textures/block/block_reader_east.png index a6d3a2147a2947a21818f39dd85b3b77583a2bef..b2fac00a738f19ba13046d85e17b60fe8c409abf 100644 GIT binary patch delta 486 zcmV|1b_sPB!3BTNLh0L01FcU01FcV0GgZ_00059NklljA9L0Z0 zkJv|t+7U@nL?u=_WZ`pkp%PBZ_bc>MFwh|kY^cb=tsJYiTZQvEC&6&J zvmJQL{r!A?|M!3A8@xGv`-d%*Qm#Zw`489S9Rxre#kh481b;MI1275#02-}(yhBkI zRsdk}ebIYqjIkYr=+zGMSM%0^!{v!3*J%d8{%rc+`rX$%Kb}xZad`OLi=17xPRy5O z+jaZV=hy9CfT5eQizprw#bbmJ-c=Njy%S@M&u8euGRCk@GmJ5m#XV(l@43s9Ir%E{ z&q4?qt&vjpGk@5hO%dYGcXe2&85gq&=Qm5LME4vBDJ6~82qC}uhKE@l$|K4b-(#tLpJ0FjqD zd71ZSzWtSW%jY-C9_MiV?b-?$V>mwEhF0G4>E#O!j$Z<*M00S|&g^mkyt{mrA)NJx z$BK`8PpNA~nC?+;2JoXH4DIEqHv=yahLXBgt%HZh%5K_{Zr!bSxlN<(DJ+wpo^a?M cS(o3%Utitql)Uth_5c6?07*qoM6N<$g7EO>VE_OC delta 500 zcmVNn2>qB7VeL%nVRkZ|T{I9vAphV0y}b95 z)oOJNApnqN8Cq-px2me5EK2}H1QkLc%Q678)}(2QwU!V9B7ZVCz4rryvMf=ju4$TL zjEVFR0vmPRz81)>#W^>CsLmC@S_{BhswkT6Jhj%Ss$xCqAzj3(BUx*saJKW&q1Kwi zVhY8U+0L_`z}y(T_nk*Cp6xu3-H}@BxWn?C=k_Cq#gtlWW;@SDUH7SWA$Or37Sp)H z@|^neGce-CgMY7gAV8l&=k_#thlr3$iW=R6HzOpyPlDp*!|z-!bLwwbF-1A8aTDsH zm|mQSCXq9mP!IYdMxd$+iY=cOuiKIy6iui(e)z(xx2^d7uSblEtM;umJs=O7_2lOF zi|ru1!?PzO@|%mFXHooPVwl%s_WWr9&N*^xSx>lAMs12M7fcxy+bGV1#(6hPp@RSs z6k#Xgc|DHeo7Ah=n$9_lG32!O5CWSHW_#zRX@GXHR5w}Bwx;(UV+ qRka;kmL*C=xDDCw_xx+!9_PRB_UvtEoQr_~0000B7$aY0vb|^e}#v%(4j-<(jikjWav*Y#6t>&4&6Lt z?ckr#$pm|F37uM6Bvc`r*h)~Io_vH3CuHHJ$=crV`0m8J?|-{{`by89zW@M0DJ8%( z&0?BYBnUwDepSv@!$`FTuxc0pQmylf#B??#L8EV@yvob~h$shAcOE+#gG9IG0Eqn% zz`9jm0*8Y@bdpkPbF(3L4tg06_r0v~AOP_3Nh9xD7OiHi%ud+wKh$2F~ho5Ckop2s@1d)dLw53)Z98hyEsm! zk*jltvT2&B)UJwh&8{Jzq1f*Ikr52JRR};|*U(+Bx-QSD-@Nf|D4bM|uTy9w@ zB@6)6b=Ye}Li{z@`0;YV7jm;jP_NiI|> zW|F9k;qod1Ai11HP)z5kCIFuMOOmBM=9Oa5w!JOrzxTuG{$97`+`$ii-xc+L_d~bk z_F eejfhIe)t0&%<$*Y)R=bw0000~41^@s6AM^iV00001b5ch_0Itp)=>Px$yGcYrR5*=|lhJA# zK@^6+p54v3D3TgUh-u0qN!}qBxh;7G-?Vt!3*R9T5koD3MuTLS-HdzM3*B*zP&#)z zGv7Bq=j{137!3ZXD$Qn-G)?)R<($J>i--`{;V6nol7u8l5PuO=6%heIRq@{Ay$=sr zYl%O?#uxym;*cal%MyT$G@JoJ5`TnMm04UMlQ{sg1*ZKTnI1|62(f_xHyVcS={eog za~chUOyO=HT%u!2art z-`{_*9FF!RGJlyf6^E+s1l0!+US1AI#K*^&lM|N15qfh$tKHc^Q53o(03w1!QIM3n z1|W(e%54{_Js@;uFG02Wwpx&kpZWalmg41w_3JC$`#X~HGjFTKPO?oMR|zsrnf80+ zlR2=UHHPl}9i^_3ho8Ky7UX#W*Oz4eC{!;7D2f7O3~gW6hFM+mu(?;k+V5@PEfWOZ z`_P)YB+q~CB5!}B3a*&gIkz`N#uze9nO$G*6)V$pZyw6B#5qT7tpzxcd?{i?j&=nT q4q$67v4~KYlx0bt=lpBc$N4XfZ}|7$VjP+P0000R#B!3BTNLh0L01FcU01FcV0GgZ_00046Nkl`m46C?As?SlL{}n zUlak6L!NIyM1N<0qt=@9!Tsavu(v()P%7-L!B8p)A>f>Y5Q1;>wR0|3aC^66plNHQ z(%~(3U;+~JLBYYQIB>skv^&1cPv+IcKrmeZ&?S765oO5W}8nf9o4}@`wbsb?e s>OI+8(?8*J{my`op*%Vr;-~QkJErVX`4!H}00000Ne4wvM6N<$g5Hd{IRF3v delta 472 zcmV;}0Vn>b1M&lqB!2;OQb$4nuFf3k00053Nklc6@^4Tr;b zRi)W%5(EMN6G@WboI^w~gs)$IDl%KcTZBfWMhkyB)tg0;i6wR_CSv(KT zG9nGI)?Pr&$I1({M`kO|wNDUW-VN!b{sqJUG#U*6=8_;UD_Vm-0G=2!O$&{mo>}(V zbPjc_wZw6J1c(TW+8Z)k@$L67)}!%N^KKvS*-WNICwXTqYHu+6Lu=4yJsR^_6%&51 z=z27!HRvNRD}NSde+HBd1Mo#Sq=$;;&&rK00Qn)0*B@W`@^@2FfJ{@$MK3zY=`~Zs z7pZ9ZPI)?XQXlPxY$j7~AMZ(5udJb>HxGAgCR4N<66xt5a*;%j~B0mc0)RQ0|L9rwg+@ zkLXYbITp;aj3h}g&N+Y!NTk7Wd9<`lsaBGma~Kh!42k3TYWw9Vuk$}j8uGV*^aeNp O00000B!3BTNLh0L01FcU01FcV0GgZ_0004SNklvnICwm&{IfX8!qS zXYcar`kMx-Y9=DGm0O;(v2dC$K{sR#`+kw!w-< z?VyKo?OYafAfoTG9X31`2cbx$stkvtkmPQ%0GbQa;%ab$}oJ=*^+x2iz+F O00000Wbc(1L^~iB!2;OQb$4nuFf3k0004`Nkl z-eR%nM1(xgNz;`73FjPDRiTtZ$8eG)0AyLlN~c{0W)K;)(-S4u5OGOz;b>{b9PLdrkp(1ER`e6GLj@AO;hqbN5$|`xd1n3$IK6w zTpn$Z^V49m($5%Uf{E(e9>W(0zv#r#$%c!=KW}yd>-OM;lBok2b+1 zW)y&kgkkO9J%4ah&-s4!E|^?@E4lvtp8dNAv~$Ev=wRATSQi=EIn?bvdj1h;5dXy9 zrw;*M7a7xb@^1%yq7N@EZL0000in)6oo%0 zizVSAb|z6651FAQg$pQniWI<1%Jft;DR=}*s3_=C@B(=X3R0MYj)9R;GO`C-$tbIp z?hF*`T}g)1?7e4q@6Wlry%#S}{;-DD+L=UA^bgnO9TdQ5IDf*e{UD$+27rDL08kmz z;T@K%r40Zu{Wk4viipjiRL6FhJf1WaIGi6_vPd%k2IKg@_Ny<~zCES2=HTFg4|00Z zR3e{eP1g0L4^Nx309&rdHin~J06sl`;(f;r#xWw|^-*BO5)q0tLqu3De{+63@&00- zc`b_6+LbXxQGe9cU@(qR>e^o(jAK4NvwL}Bc>QBWo|tY0Q4~=bgHp<8bSTn{JZajy z*AKj18Dm9kw~!|`(CNjLx3PU2Z?YvKf>MgQvccNp+|pY63IOz7!Em(8Svt3q5MggW z_98mYK`mAb7OO>P3Rk}p0M61mb!EKY#^u*b8$d)jI%={Hh}9MEA3bE}Fd$D1JBLlr zZ7ufpV*ocDTl&py&b#gVl%*z2w<+r$e6I*Y`+3T`=L3XcL|N*lf}7ji9$J%b-LyBk nx-xbOv*f2I9NHsm^PBh!AxZMqA^v)$00000NkvXXu0mjfa-cwZ-03w14A&}=e09tFZEW;Rsh!8?RM1KGXA>f?5CQwxs>QFVy zGOV=};=3OLljax^K}0ad+#*p?6~GunA)fKZ(P)kGp7UXEe~QLhOIeo5v5JpTIfCoi z2$pNc8WvWEFF;LG|E3KspJ%UOxlV1#;fym; z3B02rv{%=_Ap|l}hmhWZ@}6d~;@#{aFYkUOv{!t1dk1y;thWygmMfI^U`_8}(j0R! zG$`*GEZ4mM`535Cr%#c^iotT7N_o%4&@c_UCveW)B5V0rK1UXvTCDH(D1qY`Qwz>H zrq)sn>1KbRmKJHR8o~S4eOk@3EE7q$T_&wE^m%C87U+VdVzQuH&9W?++z3;=BiQ>c oD^*pYM1-3p+wGQrotts~11Sv>{dPOzSO5S307*qoM6N<$g07qC1ONa4 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/chat_box.png b/src/main/resources/assets/advancedperipherals/textures/block/chat_box.png index 1fc9a3ce92e59044c784069e5026c53ca39bd734..134492be41934610c5528ff041d10120e68a6cc0 100644 GIT binary patch delta 407 zcmV;I0cig0E~NvI7=H)`0000V^Z#K0000SaNLh0L01FcU01FcV0GgZ_00043Nkla%2_d9O4vt+*F1b!Wt6|@~u@FJvSjD9;~Yp*>Z)tDj}7EHHKAOA|)aStu;5K zQqi)PJ>+eqL@ITzAYM4;Ar^W=M6m}&k+Zwu;D3Z#>)|U{V^9=1-d%UOn)l8$YpS-tB&m3Y>Fjy9SHJ zH4lVwiuJw5WHNZNw`O?4*Y<+}A7goRI>b-o5A5mgEf6TX%h&(_002ovPDHLkV1j{9 Bv55cx literal 5996 zcmeHLdpMM78y`6)rxlV;V?D#{c>$<-EFV{7^&;9)F-+e#7=f0n3UYj_+ zOhbJueFOqw$ny5^hyR+WK3baa@80&iut6J<5E!iR2b4&uOu`pNK}bcs6hcCALOuc! z*IK+x*x2c;H&PmK=?jAhTE_K*C(q3MChxFqS?<%8rR~w&`IftNjWd^y^xxk9`b;t_ zu^@fWF*vbfZ<5hW{FC!9>jr(3UHb>Gl-W%?*=lTwI%D5idOYBp3lC2O?@8GaPrNs{ zIDY0>1^W&tCZT}TAlt|Vcs!mQ2gEVe$RFm)UrYFNpDST zN;v)obNivpnI{J0Qp?_Wv+6vg(;lYI)sUMeRsGoIFlk`E@A(-HF#_nygYRB>rQWa( zG6_u*zIeIBw_Eik8sM`%E_>2gO?MAg1&Xuo;>HikW5O z$ewzmH1j7&Vp90GTb(SZFAVR;?r?F$XtC`q_vYyzy#2cVSu-b+*0sr~2GkC{B)FMq zR&aZ_HodUeg&2r#EY4bR4MAUDZTNHM zT8*afEqgrc9;KKtjlV`2#9LgRY?g@+UAwt5MVpd0d@H!~K@(KVNXu)!$UN-KN!mOq z$SU1%sI!7;Hs^C z5gB$jI@TFm*QKy+7BUZKa8mHmoA+&DIi9>1;ElIgbF{&(?a|R7%Dvzd-tN2XkDa)? z*uKo)(_v{CyRv!dN=CY2(e-@~`Prh9A&ZckhqJ6ITuW{X(k&ua6PnH2`G$*gSJ)LE zpL&g=2_BxDR@Hzo&0Zu(o>#m)riUtEt_s`$l@SaT1S2`;KhcM^CWYE7mQR~NG{y6JA5OpFggE~m1f%cX@W+}-*0L)RalGuoZk4R z_Q#;;hIL_kY*|mQer;bRbI{mws<+bXTPH?KcG0jX>b|LV4$$Z0mNszNv5Vi7)2dyw zego@KQ0b5(oe^gHI`Nmh%}1TTWK_*?i2uUeB8u86Jj!gqZ0q4-Mg7gj!1Ag#&ntR` zL~B8nQ>~p7<5-EnI*buYZd|=HksjbiKS8X!uVvn$^~`k}Wl0~us79ZySkQ(6S}lLQ zc-|-^j4N`RH-mfS{@e|FH-^pICM`Oi6LMo(W<{CEjoC3X065vbA(cG2wLa7F0vVUP z!mISz+R`=8Z8o81*|_-+G@rRXrTZY+>Q?SD?50?BgVWafP|m@r-KiBuEqbxn=01tI z{*wml;#bXkb5C$`8}C@=1o}}T|1{Bh;dNrghRt2ASn2bs4Q|=mmqu1Kv<7(>-1yCl zdyQF{GflWOJnpyJc~cH#xX9N&%k=zVH|OFZzMWn9U_ke!$CduNx7xo7TvK+g^g)9{ zuL4y#l$V?#%Z*K#y?|@nDe|v z2M!Qw3itFr+iT;xw5g>p{^6qUJQjBuIV@}mFKBnINbNW2p_SjZdKt4C>r!5bIMud< z#0so&{rTAXnpvX744P3@a?hbd9klM)Bg|@U{#n2KPxkiS@?Tv~AIV4$GHk52NZ-Y8 z?lkBA@!)B%E$Y~Cc7@R|)!BW^p7(4#UcR<&c#hfQyOXbYTged!jrBqXgTrDl-kyc< z37E4ci{@SX<;-&{0}4>)+KWpJUnL>qTXHjR0vvZLcX zxB1Mu)JBFps6HnWhrIO)yrl`m#1`w_dt`3HZ;YZPWfbHOF}En()G zrH?_&HI_^ccmHfZ^!_`PpZe}}{t>ob5Wj0!{?wkbMZ+~KF5}@w&(rQM<-&(KFE%j_ z+t07NUkB=hWxmY%?PbCGl}bK9+eHT{rR>ZZB9OxmlY3^#Yoj!;{iY+?Q+ z^Ua;QZ<21eXAc#zoaS3se;@?HB{LPB2Z zJ!sd#l&r`;tsB~h(DXaS^Uk<;VE(65%j3lgAPy~-+o&i;IXoaa zC=*H*LWvlu;sm&o7zGW5g6ENA}}@<8}20@fdrOJZao3Mi!;U z@IWjS1&QE9)znELQ+x5K>XWp42_!NZE=CHTM0f{U2Fc`bnX6dwI1FKQh6hr;U`_xo zH=zg+Kv=0*pmtGh3>97uEG?kw4wzYOhgU;o$RI!=kp)U5Q8bh)TcnCo-Bd`Iv38;Q zNITkZfAja{^2uM|2I07DxgL!d*cnTFyrjl`} z(cMP6U{xpV+ts?L&LB3MI#CZ7)fq))sR}V5MkHAr(&vJc|0-pr_TwR~#`XmKD3H-Ub{%>;WzkB6|#PIh%CHz8d z7O)=&zl=L@d;&ceELecU;fO?{pP!$Pj}Mhfb#rrLIomC!+SBRuWz6}0?zV-6h57mU zmC6So>@`{Hy&V3pi_uxtN5kCyUu$8bu7bt()a}xo{e>|BoB6s6Hf6Cq+ynJmz*Q!J zJf5kEDbFM}8n1!U)%oGb)gw(!fef9jr>O%2ss2oztdxQ0sRIN}o$jZ{b_j_fvn)N% zE($93#gcg(BW#;IGGPXXozT`A@DR!{SUCNMs#w8RD_o(+R`yQE>dTq#&Zn!ZXK{TK z6PfWlrd~}w(sZPPlmBf4ropZOlVLC^b<#ThGy^(fpv2+#yZ5Ny!^t67p1vL>^i}Kr E4g3xE+W-In diff --git a/src/main/resources/assets/advancedperipherals/textures/block/chat_box_front.png b/src/main/resources/assets/advancedperipherals/textures/block/chat_box_front.png index 0eca0ed3c6c5fca11b5b7133a37213d0aaf5e27d..39868fc900197342dfa6439da7e16cdce76419d9 100644 GIT binary patch delta 1123 zcmV-p1f2V;2I>fq7JmUi2m$~A06J)EbpQYW32;bRa{vGf6951U69E94oEQKA1RP03 zK~!jg?VC?%+g2RMzm}d9zr@-Sxvkub*Rqg9*daUgS_Zvzl$ElQ9m+~!%Lr_2gHRYH z+j%fbV6bZsIqlFwU@ffO$eElFhHT-XgE&BZ!{=02L=j- zJfmPex4x%sYMygWXUEC36oe4e@Xz;`b={!aFbn{6h97_WNx57SLNLxb^+B`jglPb{ zxq3QQo6IiVTz@@1nO#a*sdBl*IcGu$ztP~FCu&}^hA<2+TX(`R__Fo}0O=Mk4K7Gm z?sz-Y$(Di;qB&@3ron)k9{_yT{tW=roQ5B0K&+tA#Bt6euk_~JigXL-zIhmVrRr9$ zUfGmxA@WL*SE5N1LNF@P7=FBVO0(>HS0^;f29Pif&3_Lx(}?_ly3|?+0FIOS=)HGS zR*FLUIAx{c>*9maB5=+hKmNUQ1>!ZKb%-n3W_c3;$^alYB>={ll#($<^;DKp{;e=J zHV$B;m`^5oy)Kf;md;Do%K$3gHih-N*eq_e#!&ILKNq;3M0u+ecQ>DVLJgC`k)y`| z=+5!u1AoaRfS(dlN?EUqv9a+m3bWahVHBP?@oE#zZ1!ZaSQs1{+AfzEfIrv%01)`C zUAa-rA3K`aa}NAQ?#UW}gyP|O@W48GI5+R!zLKWSQ~_N#XfW}lb>|_z;t=p~>a!!i zeqDVA9#-#H6b~;B56T~uKPVo0`omlEE`Zxt(tii_hkI8i;vw}r56U0ff`^O;I^wTS zcq$J7G{ev=yRUgr{?Hcu4|vda@i1&BhVAB{#nR3~b@Eo_LSopyRk^^@4(*!mJm|V1 zz2LHS2Y_@%FCIR)`|!s3@%O)5iN|x}{CF=O=Fg5wZ!7l*0KT7oMb{1KZN)ct;X#^) zW`EgtXC?rIy4f`Qo(JU*ZNWpv1Ares9DN2J07RzQ?>s1fXbUPH6c5TD6c6#uiU;Kn z&+&PBs@raj{D7H8_vh*Tc5Bq$U3+L zaS$FTR6HmiURWNKKPVm)4+rpvx#}4JGee69^@rKi1I;iL4~mCAD@+5ljK(lzw`h|E1OhfD2{F36KEvR@t1F!I77=0K= zP-3PYPc5e5Ilk`UFF{6;-2rA>*>bd5g1JuCnGm`3r+N zZ6(EZnnQ?T34d`UAVNkJC6r+yLaRoKi6reuJ^X`?KS3^;TqQ7aET94vlH&*egWuhn z`Kd`aDHsJhUu^qh1PJT`jhbzLAKP~01n@rtS6a(osROg0q}N(n_z39T1}?5!n!E>G z?f?T%x@1U>j20++-Q(R|?Y;eb zrrF;Qm|k+Wpfy|Q0004ENklvD@v4$_Ns6D&C95!ps6w&FnaT01%PZ8uA`ILqu9`pK`)T zq2Jv_1VC$z4<^$?L{)Y7;O?qwW-T`ni5FLD5kU09CIbY-6;)MLMz_|gmt4m6&E4htb`}HKM1O?10HoGhYo#nKdKN=UX&8oH*hB&V z2)!8UqZV@+U!LxB8L0{VY}MTZk$PJ7V&~WH#Vl4YYLU9JglP`!fgkDZnUK>!elZ;8 zFunHj_w#2C+>y{F`m$4Zx0&?{88n&hs+v*?DJ4~%&*#5)jwm#{pJE0x+iW)6 gOB*SXrxU8`5Ai_$#1G%}0ssI207*qoM6N<$g56MT*Z=?k diff --git a/src/main/resources/assets/advancedperipherals/textures/block/chat_box_front.png.mcmeta b/src/main/resources/assets/advancedperipherals/textures/block/chat_box_front.png.mcmeta new file mode 100644 index 000000000..9559c00e4 --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/textures/block/chat_box_front.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/advancedperipherals/textures/block/chat_box_top.png b/src/main/resources/assets/advancedperipherals/textures/block/chat_box_top.png new file mode 100644 index 0000000000000000000000000000000000000000..093f9a4931ff5a624ba99e2be587274e40a4a096 GIT binary patch literal 393 zcmV;40e1e0P)0J6|HR2$NL)q-g^L?b9>Lz=UEo1VvLN(E|c8dKNMB; zd!D^acRlF$c5!*dX1&V2AD^7ket*#}Tby%P(MrvVG2*=^#>i&9%4A#eRj$Z;kBHEv zgorS(%Fel5va0vp45A@z&Xr+Eaf4gd_RMIr$b#QDf(L?0L2D%sT&hC!KlMJ3;UXKVuYaNy# zq6^$(03ZNhF<&s?bEy<#))=hUx3I=U?U{#C;b0AhQb7m-=NyC(OzdmtT&&>ke#1c1)<~x_ zG;PgTI-POPN7rfm=08aM4WHY09`I+^X|9{L=DMo(Ck4(qG;NLf{Dud@ILEq9V>IeL qIat#_;cNTBfRCX(IUVBX@ds)S>mHHPJ#_#8002ovP6b4+LSTZ8udqe{ delta 630 zcmV-+0*U>m1CIreB!2;OQb$4nuFf3k0006>Nkl2rR99UGb=4>ED!T4d^c4ajh^|7D2n4&3!avz=e^7Uf-C^D7)ts5N zRi=w^MhEJ-Iq!jUo^#Igo|Aa;sOXnX!QJcUF|9oS=9j8Gyni7 z&j65B74l~lYCpHB+b)(JRM#~H0LymJHHC9MrvNbY3=QD~9rSA5j122o$q7cUj-u}D zV9w5RYjB&vTz@vI=6Z*CZ5M!QwMkZ00)m2}l2bL#42-g}yh7z`h0~b~p4i|=*gBBz zlu38WM|4d9IzCn`0KB$Ka($YOh372HO>;Y62Oy_vQKHv&@!BpmVaG)T__Pv;IFL)T zS(kb9{tEz0-y1P40Qxi;NCX5~RiSJOo<1(&dWXE4d4I>`HI19a;y=GID!96F+(E%m zalJzTHtQY$mv?_7oK}>eDk+51itLM-HA-Xs$0LO5uGa$_CWiu^BsmEQplk}{RDwQD zX6iway6y5|aXkvsHHAJ+rfvu1mhI51bq53&`+F#x0=MOJWoQ6^{LwfyVaN6$U28Cy z%kp||m2aLuJ^;!4rAyB`@F|;uW^)%QonWu!AtilU?E`-8xum2N?E@bv>GO8}8vsfw z*hp!Ae?O{V=ovn*SZMtsV5pQ$0T8>~=o&+WK|nNTh=QTU{DyG&3#Uu=t&za= QeEE|HP)mS;I7%EHXB=82!y7lkdQSgN>n_U zgBEGfq6KM%N{DDgY!p!bY zvK}V$&g_qvouy5a%{-TxecqYbXWn<-&-;C!_jSGd-uqcBrYMT_Cz2!;_zfR`2cR}o zD;&nT*XI+ybSgzS+(0^&5~B4^b2ak0ePV+*mA@6Cyz8;vf^JZqoku zhoUSn)3n?OPMl}~AhEoN-!Gx63ZM4& z0r2C`KLMbsiYPN|WjSHi!K1ZRI=^|2dso-Fd*=@H_7RWIGI4thzu%9ls^XZ*WN7W^ z&?C?^jYn&%JR7Xx-qlqAPQUsZ@%StNFSfN6w1Q!obP8Ad>CUXxVOX`-M=^iCc^Z#3 z<~S;l2jf2+Ms5EU|HK(le(6SC={!)nM{$ShNS*nU&2$F0x0=95Ev557igxJ{jF=I~ zH)K(wjg7XJ<)pFeK4f^o7P4?a8J;_$%X z0r0eWP$Bvt-)!rHs;X)>Hq7p9TOUlEx=CcptOKh)aJ}{RJJ}=8AHnPM@xrm=qQ57W z7V!FfghF*id5~CIV18kKFY}=Oa0BOh&H_3UZ1W%(405jLEb;g(|4hd0^8gS`Xl!mS zXeDrXAR^cw`XJxz>jSTjw6gU}y3+LlAeeCN`mlW-sH$pV!lZp30RKC0 zaCop4K`Htm-|XuH%jjHw{$Sz>p7&}=$4+h3g0uB!h+gtkJiRKU7#du(tp${T+{kVL!Vsy54 z_mcAm+Uh#vO+#$TY0)ya@&}!ZW+vkxCh68*te{=jo6EJo)*FyQ15*t0w+rVoJ9c~DFrI6T+| zec;aLfx!f;K8Vcq;|kRgnd`@MC|o!?my$m)M&}JVZI1^={=hmq@BaRSe2sJv^#LH5 zaP9iAxVdC~;P?A2OqjH<51{zG!QsJH1p7}PK$+_chCTpiePNI151f3WZhMahdq02h z^!Fc>w7$?b)puam7i_OL=Fb;wuQ%q;7o7FRiqZ$p{=|K&56aq~Xyrj!`xC7^*tPwM Z{{c?Ayn~Tju2}#8002ovPDHLkV1mx}hQi6aZil%7~r`weq6IHA__~8buZCuJvR+ zdFx9q8bw6dcO4?aBvj6`g)iBukGtQN7FG2pWJ0#0sZbp(g^AN7IgnfbPgP?JZD|p? z^6Vj80>sBTQB_}o^BGp)o{%)Wo#s?gTV~6YwzSNa!^XC>N68{G zG!fuyllH0`1=7gtxk9{!b-s>ep6bN~PV07*qo IM6N<$f>-6asQ>@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/energy_detector.png b/src/main/resources/assets/advancedperipherals/textures/block/energy_detector.png index 3d23b2e88f387fedeeeb13b81222c35e50bd12d3..5b994935ba192517fc7de2a0953d8f73e1fb303a 100644 GIT binary patch delta 413 zcmV;O0b>4!6{`b~7=H)`0000V^Z#K0000SaNLh0L01FcU01FcV0GgZ_00049Nkly80e}F2*>uK$&!tj~S!1wV-oqLbk$;zm5{WOQQjkhvHec|v zU-0#19{`e2+HjPjEOHD-DXcNkAm3W#(Q^~6H4m0Wj@f*HvdAHof;EO!+#=OlLl6-+ zq*Bqcm)+%cq(mxptsq`F=OGq)qqUAb$g(}V8xHe0q{wMuuvV zu(94%(GPRmi+`9@c*)`7dRKwcIkIdIBD(q;wbq>Xo}O2yqwSdcQsHO~`cgp%0p}cq z5KQcA=UlAd;c>-4-Bd`&6Vy$`SUR3?&qv!5e)4Z5{)Vs32M_qOZHeo;sklBIe$NV= zbEumN)9D=#gmHNrBja|Al5Al`U^2abw@isPV6QBh&kx0}O&sLjkK`~Lm@??3kY z-^(4rruy;4Q;QJ<8SiiKhTw0Bd7U!`ejokpD`*&Xi{$YH{T>e*)Rd?c2M99bopt^0 zhFx=~y|O6$2sU|weFY;9G)?jPrd`(O8w?&Oev;kL_WRht)VoVBtbgg*g9l&b_rLVY zH7$iLwI!#JC7Ka3`X~OmzI5TO#g|Mwap=0w-~4R$+=2BQ-fB#{VTrRAh~vz@3!B&=JoCeT1B64 z`kX5+dH%>vyYFmkS-R{{+p*Sz8y{NNw0F|V-Ju6p@2`sbuDas>%h$ATtNpERPi*z^ zDY2n8@U}i&ew)5$e&6?w`jTA}ziODfysu*Zj9s;B7u-@>?mw`8_OG|QZ(QD1@xuJY zhg;{4WlP_=;E#fx+n+rizGqpewP4$#wi7~W(b3VXH+{eC((Ur0bBgASX_@!tqQ}QP z{lLQ?EnIlG=*SlZwk_9g+E&>11LA3Zl%IKj>BBP*AAj-WMegvFvK?c4K05XJrjyK4 z1vG81c=THH#!kyWQU0 z+}zmM$g*rrO-*+xvUD<1S6BDeg!6Zlj2jpj*t~hO`)KSW^g35ZsU zfCWJSL6andlQd4d%o@_gCDcG5=PB!%9>Q)CDNZFQ8%ZP*Ikay0y8e!HRHeV|D7lG+DXE#V7&Ov?6Bl_5MIGhc~+xlMX~=9}%=oZ*tXB~_%}9Q)8#5DR zMMaQA*1Dyg4kyo%4m=7N2kzhnfOAf!5@$Fk=>P&x0%tVKaT_Gl&I1)1hKbGK#d(G=_=-I}cKEP(o6IivdEFV;E|7o`uQ77ILP< zA)!?g>(KybC|X2O;%>~$4K4nCS*saIMeAtRn)&O2V2qUY-`sM%A-KoshSu#LartNQs7@=o z0Wv9C_nEnc!IC^vrVVikwRQ!T6VfkF=emH1WsE{QC&vKXa^VD~VbWPt&bfG+7kMX6 zIw=u%I2an|fM~~EWF-|P0aO-e&-&|1)JSp~sEt9rKv}?nvt)tJ$mnxs7MW}Zruayj z#3{Jvkr9evNrt7Xusk)uDhP8+&9AN6+=$>{pV@|LbF*UorgFobsv4Jome&tUYLF(6 zyqfqAk36=F&__;orbC*`qp00*4`?@}SMv@otGKik zo{DeIT szIm^0@8x@KYsQW48@;@E)wnujcuU16r*0aEn}0I=z9#RMy2Z=?0!?gon*aa+ diff --git a/src/main/resources/assets/advancedperipherals/textures/block/energy_detector_back.png b/src/main/resources/assets/advancedperipherals/textures/block/energy_detector_back.png index 231a2e1e56cb7cfeac4e1cc798698bf01d82ddb0..044eef38b3091811ebcb3732b79643d7939f4f6a 100644 GIT binary patch delta 484 zcmVAnB(aZ3wQ%J!BdNq;)L#D)1{4qZU+?Yqf#JbvS)(H@?M2mfvK z`-$ThfA0uvWq;lLa7Jz8em`-a#d^JTYf;xV)uv=P%sSDYQed4z(@p`8v)!(R9hO~w a7ykecYT>lsMl{?20000ZzAf2-LSU4CI$ zbZ0AgU;Am)Big>HOV8NrEPIN3>nAToMZToq>~+i6o>_3)4(Y_8f=L6Lr@S}w#erKl zJbPrujFSbYzsa+1zIW~R{MH{4chmFXaqCN-9e47=?n@(F!C}MS7(DmL<*(OXV&)^C z96J0{k)jklR$4Z1=boMOj?KGtVbsf2`>XO_Qy;kQ?(rggE2O_6qC&*!7O~w_7Mv%&?q{8vDfsTejRFquUxgEPOR1{oT zbGeW7DQ?gv*3VTzaBgFWpF5j(3Ru;oqQc4~3mM`-=g?$4CTVQag_*=Gyf@4QhMEw4 zwhL?V`BAs50@QA`TS?rL6gy}PlAvg%Dn!^o?UXbLT)D6|T~}CwNF);0gv~0eQG#+h zodih}G>t<9u60T}m&7G)Oo}8;Qwua+6%}2SCDfqh!g9Or!eAa|g769NNkT)K-&mXM znl2DtxUj>5Ab_ArlEFzDr=3O(sp8^_&zJR-v~&+)H;E*t5R{c9;_)n6(>)!3$GIk2 z3w0`h2mnoPS9##+0Fpi?6HJM5D05K4U!8OQ8WwE*#`TIRwk-zceir_FrmiG!|rY}Z(*gUpY=G%=( z-dY!CB*+RfFAA)AOFQh2Fh|<)2w?2EJyN!#PMh;KL+vL^3>HNz*xr2L=yh zwu+D>0_;wPFSp@gDpHQyc}Ey$Xde38IGW=e6fIPQGyYAg2xZR2a`Q2G1jrMnxd<%Xk8yfLR^xDLL`jenTG}2G z;~=PWMw6%tlCd*(imYH5igGy8i0MGppkfU&inP)+h6+481yXTPLSmeY0z#3Z7;1E$ zg~`Jfa)!hqp;;2^RspBWYDku2F3iXcHJCD!0cRsEe6~U6O;6JS2i>i`0lHu7zp6a{e0g%g;9iPum$ z=M2+fA?(0O2PNQkJ453f5Nx=UET6h>xU6oPv8E8KM}LWLUZa%TWWYf-tt!+}bLQjR+3*)orLWHY?U^C^y)yC@~SJ zIsGuD25EB0D~bQ`$YDzhz5iraJEXYWveF6nfHu7;A@wu0e{o6iHHbWrG`W98UIk8d zHRs?mi%VJIsR&oF%bA1LSY;1uAVImP@F-q(+sUKw7+>YBtqu+Ul%Hh@2|}@@Sg>@= zp$1_2d0ksR+H&Yn$ep+H=cNa}FMV#s5NznF3DK_Z5hVG-wzG|2eEh?1wD`^6`#wJy zaOa)cFJAnkuQe~U>h-?M>kf)5hTJt`>$xxAA74JpzohJo*W&Zm-M&akUOLca(T+`Q zezMy+U{k@gqG>k_9(lU2H`d$NyC2`3W3O8x)B};)LnWk^D;GWi zNPL2*fR%ud>f!?*pb{vueZ-Z&1y@dp16Pg}BBjvUNoqN@mDxYDI~-nTyfI69NDp8< z2W#Ka_?>_L?fX2=efZJGIB!A-{meN}_fQCc0jO+ND4+-1aVQLfpkDXFAfV88oY82= zD0ue#*-~yw&pD^hdfl7PAcUaAKmGW#{!Sc6rfH?a{VzVBOvXY8gL6)6h~tPpTg+`c z9)-HUSSr%wh7ckQ0?s+5Y&%|8jt_!S+wt^h0JG_g7RhJ^A%rTF9&u++CP7pL(6dyZ zRqw?~5=M`>^SD%;OvapZMhC|^e-PUH;>DQ^Ddick&+Pl=7GO7L!!Lm_2!s%fjt@Xr zjzcH_rfJcpeWeb95r7bimNdTy0QI`JyZ0&WOs}|DD(Z2%F}eiK`QhPj=^M~@LieCM z*~#Pt044w+Pb2`wn3R$+M*Z|GrCiLgvvUi;(ebeMrgwBa%;)(VrSi+^sqc$?o&)gx z`GhCONAo?roSuFy@a^=p@ck12Wvc;j@pjbVy+&IOLzd#cD#dN z)Rp5Fb6>%OVOs;!Xo^7EmBhAsN)5`5T@la>89X3FGaUL#0Z0I4TFpd0uc`!5&eYcw1 z++uFM?^Zi@7;RRf%}Q@W4QdUew54ZQ@X$OS-nZ+(0twT!&f=(<%MlXGJVXZT%5fY= zvB{9yG$E0}Lv!!5|2z+OzpDPyo!5sMu+0@NmWVYExH=Ccob($%g9j2w05XMB1`i!O z?7LOw)>WZ2s5N>UD%z|hZmna7gIXhl2Y))=7Yl);-}@41&T<)gNed);NN?I#S$b&| zcu4D|H4m?i2VD&`4@gys3?6hfpxmZuwU~Plj0lMg9)d!Vs(~t$jM7%$t@bul;?`uT z(y_w~9+K%eNC~9oY#14g7UrKH+Aq+LO#e@Ld|Tv{N7*pCDAQ)x%>5d)BVg*1a z37 zShCT$+)qg80_pEaWcX=XG-0IeHC2ff g<$>zMzkr9o077!}i~^YMrT_o{07*qoM6N<$f;#jh1^@s6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/energy_detector_east.png.mcmeta b/src/main/resources/assets/advancedperipherals/textures/block/energy_detector_east.png.mcmeta new file mode 100644 index 000000000..9559c00e4 --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/textures/block/energy_detector_east.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/advancedperipherals/textures/block/energy_detector_front.png b/src/main/resources/assets/advancedperipherals/textures/block/energy_detector_front.png index eed36711fd8ec6c41bde6391ae3b1e71f0765d7d..b08e24afc30663e4bd4674bbfe757d7a02bc93b7 100644 GIT binary patch delta 481 zcmV<70UrL274HL(7=H)`0000V^Z#K0000SaNLh0L01FcU01FcV0GgZ_0004@Nklay~f^Q@6qe+rcctVdax945VkID z=t3Gh0adcWyHKS_@qRFte@W;3=Re0g?>~I3a3F+mKZ)bG#(x_QAOP6!?pwmF!zi+x zl9GP^IZ8?|`2F%;2LMRM2>@kT5(Gi*ZT1XK-<)a%LI|66Fc^9n@>ND>caMCPdHkR2 zU$(3uj$==5ntu1P85ITxPoH^SG=vbf+OEF+;7i!#=Xm0+4GJX*qX;1c4Wq!#a&a=S z>vpF{GR-(U=zm+T8Aet?VA|svH5yN7cY0i$3`nLKpHuqBd(yU^gFKBmqq*-Ol zFu1wB(F$hsnRglB<*P%^!-&@$Q7Fk*;E6Am*?b1T&RW}dqiQ%j_R4UF=i$NsH(IUO z^7FrUG>rSduP64Bd%4w$?PIW9E;c5XWl6ru=yrRxZ2wbWf`V>m0Gru%y)eVF&2Qr$ XsblRS zwfiQHIM5n=0ULCSbs-~kHw<=rM%=a7vn_C}a0|P-<@f%+VJk{+o4j}X$&+t~kM2Ei zUsHZlb@3HsmZ~@E%S-<3DxLO7;Tmw`cloo=+X;= zqq|zb2ii}=AJY!jE&kp%xp-emPwm9{i^tZL?W=zJ-UX$@y~n!7|Ms}^q4_Oi->jQ) zx_M%Mw)F7Lf8_1nx&1_mDT>clsW7d~$8gu%>p36g>!NEh`>OcGQD<{@oX67QF z969<^k)jklF{o_Lu6?`a9Gi3b!tkwChpO^lS0B7#>R1uJ6*5pC@{AidjwDH|)#~^A z>+9=TmaVF)>MTX(4njW3M`~(n-oNFhw~7aLcXw~xxbcg8CeYC^h>DUE`*G)P3>5_@ z)>Q5zeToaTiM6v;5S-l*;%Cp~9RgN0p{TGj$wG!W&^a_2k4YMvbYdnk3-1jxfuSZu zpXtP!eF4-Zs{plGY!(vtB*hLIgCrTdvV?V=q6oRslL_D5FYr3c7?>N^* zYoSgB5RE{S+f^QTI)J2)$^=tl?OJZEb`2ONGuN09Az+$j#0-A2*B8j*jjlz-xMHFW zWCkVhS&Y)I#?0pePk@xb7L z%oY)nM1ak~@a0xKOhw9Z8*dNe49!D-D@SvjouY+`aK_)SicscUEH@v6M}RzGnv3v4 zc?C{ZIIK8~OydrkVQ|hy0TMXqNQ7cA)aW-`9q>9a+Crw6ff%PpWHk<_MwA3Op{4C1 zF%E({XEcebAQ>BDqsR(|p(wjOjkp)68dR)7Mv)ep#!!K0CqXI>N=S@zQ9vkC6hn>9 zvoLwsLe7vlBs5E6T`J&oSq;f@%!wJfp$1cCGT>~ah0oT@yyupBkODhOjs&8@A{*ofd@U)zRCW3ytthH``LiV_on zn$r(cYLF&}yps42j~uqN(0fmItwV~-B`ck94`|c<38|N<{fkSAuU_PVq{+Q2@)~fe zt2qakSzO8rPer(bUCtb|#wvSQ0}0ASg-7v{k*B|a$M{OGyE-)FQ+`HqNDxYjON8Q% zSyUe^KX28xkG35-5_07&|9SBm>$tkxhq|$M$48&;8cLFz-`G+&{p0WUpe0{!kNSUy zpl=R|(blb3@6koBn#NbKRW_l;oUm6AK;Zs{ZWi za`f3!Fr{e9fd0eIob8GAob5S;ZY)E)_Z&j|AwLhW{QBmC6^|N!GrXP#_bW9s=KlrX CPkJf< diff --git a/src/main/resources/assets/advancedperipherals/textures/block/energy_detector_top.png b/src/main/resources/assets/advancedperipherals/textures/block/energy_detector_top.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c133c96477c51e0fd5194075e3066d4ab5f0e9 GIT binary patch literal 424 zcmV;Z0ayNsP)Zl*lW%rnPu-1|7K_BZs*_spPk12!(+)Fs%jx3a*zx2h6td2 z-p1Be98)+4Kr4;`D4eV04cRK&6|hYRV-}H0Y%tO&JoNJY3BYWT12F6+%-#><@y)d- ziBy#|z3@ez(;lQf07k0FJ{|+4J)Wj-haS|mUG)cSH*2r`9XLKyN{91aZ`ctmMOEBEMelSQH%=3~# z(x{kMhlmiFi2#$^J|ex@(3{QyqfQ8>9s1DM9<9lq>0sa8=I@Un4 S+9e7A0000GPM2x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/environment_detector.png b/src/main/resources/assets/advancedperipherals/textures/block/environment_detector.png index 3fc5af4526338d615a9a5b17678b13404f1d46cb..3f9a235c7d978f4658a346a0fe3a8f6e93c892a8 100644 GIT binary patch delta 409 zcmV;K0cQS&6{iD`7=H)`0000V^Z#K0000SaNLh0L01FcU01FcV0GgZ_00045Nklyknt|P9Sw&r@b`#mYJ)}m=^ zB*`rg_;HSP9bqyVJUR4cc*57_g8>&~d2-sv&*Klsa}w!->-Nof00000NkvXXu0mjf DZwtHY literal 2694 zcma)83vd%<9$!G(UIndCuu_zrWt39f>?3KjSsF^4q;0TiGfA`+>%cy~q-&GiWp~@8 z?a6uQ++lfWl@1RbH#cI{)0-=FPBV!35d@j;Z}NuVZ;5$bH3fcudh8@LOuAq4c!GY92MuaU zREh%xsd!^((A~6W>D+xQ!hghOU1wj*h{G+jy}r3O5BNrcM~a_ew{(0vH8AIq((4;v zdGW-FfAWW4*>`7KVOw3vMP!v`gp9!%-)}Bm{y_0fbI+f;`}k|e7B3y%yj4yHkkR+s z4{W&=Jpb3wnOWT0GNdH9C9yxePBP}MIA3)3OWVI+IJ^5lfBqoeuzPUrM_VM<-txWn z$2K15eX?Ej`Q|TKaMRz<+_(3kj<$POpXxZ!-m7vQQvI~p15UW z=V;wG_4{KR&drXEb%59P@$%p4`%PRKNZMx(B(sKWi&5OVO zz56$7Ix7FMY~|_prBm6`H?IAzVE4`!&xIdd9cnKaUD0t~C@uPQ@`i1nte&@1K6O>m zk|}KsudVpYloy_S`t9Y*PZyneufVqBu5F`*9iJhd)<5wJpD2BL;puZPU%0^?o?W(U zYTw%zk8iuc+>8A8(Bbjvs#>&uRz?5Vp0WNT{TI%aKU@2++QOH#Ur)ZhQi5-#GT0pP zEn2jQBuTs7-rCyQ+}zBvY;A4rOnyNrsHm^6_dnI_8EP0F9^Srv`*V?9qtNSDYSW!M zf?Pe*ye1*r9xp?X!ndSIyU`wKW(6f-<3xoAwp2oeXauRLO{tvF1q_r2F-dk~pYPm_ zp_1sv+NuI%K=pu5si{u`;l7rL(AOonM67nn^x~Qn3mFo?;LubeF6(T{jakGjyf@7R zhFTD#%Z;@Mf~ZH)0P3(gY$WbWNj)?MNl>QgX%+mIoFD>v3@7%EE;$z;-&wA&Od zMo=!7iy&!&rg4bC^(#W(r`!5rS~T1-l) z7TQE+QKFE;sNGuJdM*kCh=T+Su0uvDhc%?=kMH4<{LLqq1cxDVyq6%eeKF(1=CNKy z=r$wyy>84*kQEg{5?Sk(b~>CqM>_B*U>vxE7XZ#VnJS#&oTLK?JPDl9ERSE-4New- z$pe{f5+sQNhl>%a>^M(Ft8j>3JlhrOe4kOdJi)I*{b5MW;E;<^e7z{Q0&DI6|Zj82(nPo7}8Bs+`z^RdBQAz3< zdqhfru)qN+*8!8jC7PR0GbXJYm!lg3M6<66>W-InFxGNGe)atJccj0|aBDtUu+J;|;+*PB*k( z|AfoGf=5kS(M^y^(Rwe>EeuxWnKEsNOQ^Lgu$+*7c{IKRI4xA+mv?8O= zg;`{>6PV&7X%eU4o<~L~h9w!6uEz4z0IML(Ej7Qk8gnCpgME1$YRt`w^_$8KcdKe# z0$N@_EU7`7Jn|aiXFT%QGD4p?+2sytE{~%2!abnVXidr!OzkIJ(tOR50AyX6Sdo{3 z(_PIwxUAyRR(LAH73^~Mpfy*y!y3p?E*d2EU%a$cvM;}}%=_x%wr5+2 zDlvEsaa8Z>D-Q>3-pk#FhmZ|vPV z^UZ;gLnD6+ZvX8;+re87+BQy`JTQ4p@%m}?$oP)RcQ4*I95?@D_ptngAWy@rfrCZ#*n`FU`v}e z+S-`34+UwY7XcG5FK8q-s3{VurmY%ENi7laQe%y2c2Ud43x9&UFzlYg(uZ$3th=jw zYd&bdjF zb1xSIXwRq>?07%|4T#22@KUZM$&B@=cY8@f$RE^{#(y~%D90FEUA=C}=S!}=IBc`q zXbibmH;kHWi+kP|>@sx;fa#T$t7p1rTCCRDsdM~3Kh?f@AwR2{Q#ieQ2~gesH&V4n9v-YW%b_@crzr1jGnA`1kEnQbwNO=HCFko7c zx0pUvg5gzZwpgRyL_T7AYPwc<(s+39ldb7)cYkKua~cm*F0P?UgEA`r zJOm2b0EB{yIL#G@heLJs06zNQZH)(O>vC#7G`5@)@IVp-y9|u;AaKq}EjxDY{Px(X zBt9fbGGk1=+iPvgQ*U&!*5x5zAN24LC}`7Cjfb#WU9OZxa-RQ|-zM9rxbdwwqj(tq zz<=Ojg7J{RKE(1s_MttaRZugVN8K*=Y7*FsEV4#WjOD4SMZ^IL*aZv=R@A z_e)bwuc7V@<}^SL4}pTVP*4#pX2U)hJQzF}JQzGs!`cRE^OjAz_De}gW^#tZ>a)ux ziy7oU#N}c0mQ4U6{prymP!oFn2hvF>r~vW&X|2=q=Px22qB~bj=Rb;vN(YPLK}#_KdHAj=9i3JCXZ75yJfMpQbXH+* zDZ=xkBfeCAuo8gZw+mzT;rH8K07FZU>5VV(m1h8qnrxBrrE&k^c!}rLZ>o-$cq092 zYg1mx*B9TP22gangD=}2=}+?&t$*S)*Hal^>gv3%@la7+lh{5SJAE2sJZNcHLR|Zx z*@Vf*L)`e15Y5BbBiQ9^XIi#1jh2(X}j#qw|=Yd1O5@%?E4 zMYlVOmTmv?kIR?<{`6z>u)nbpkHy2r;^K+SgP;jrdvx!S!zo9;sGprW2Y*0IbL+Wk z=ecU<$sd}(Kk=g^$bzKzl}Q93Gy%@>?Jn999%* zj0Y{EOIP}$d8jKLME;C73hrq<@ResmK}E1S1k+QBp7S_L zHx?ITQt*)AK3^;k3GVa7@<9FrNzlbZwlfVt$NakZ=hLw~Xc1jaX*Un}4|S!3hnpNz w&E^Sszt!O3|F#dte(A~M;W5sq|MUIQUz-5s>F@2(%m4rY07*qoM6N<$f@d-$f&c&j delta 795 zcmV+$1LXX{45S8-7JmQ`2m$~A0FaSrHUIztglR)VP)S2WAW(8|W@&6?001bFeUUv# z!$25@-=<1MDk5eOamY}eEQpFYN)?M>p|llRbuhW~51KS2DK3tJYr(;v#j1mgv#t)V zf*|+<;^gS0=prS4mlRsWcyQdqd-uNg-FJY{s4&gyngBH2Hh)v`n3T<}N}*STAz}bP zKxUSaNH1pKJHGA_;OkwKXZfG|bM&csi_tX_@fd#N#Fv zNc_lk#p5^5MVAGhDVmwoJh4bD6+2kzU{*3U;%VZDs_B$3WIa|nZ*kTtHP)(=zc8HF zSJGUkIf6KrkbgiD5){->Mg=yawCbc-NYQ@G$3N`)ljKs!RR$x+0;AFrtR8>R(xVxFDs+pyfs>_gw z1XW!wmw$Bl)!2Vzv)KeX+wGRD%wWM)GbcpN ztU)6pgAX*AN`#C6%q*B0099q`>GT2`MZ~R$2sGY*+>miUG^NDb1cb4sZ;HkKjOW~c@< zmcHD!cjc>yNczJ$s+k2c)n{&H`gZ144m7$IXrvfyVYdg)z`(=jEh+0lYK8qCXjS>g zD;w{DLWL?(_j1H5s2$R#YhnO$&LQUvU^bhLZ;mW`qb`#O@* z{!lM=WYXGh+4{@Z-FXlCwLLyPv)!z%_Vo6S>i37LuE_J0da*On*f&d6DT^Z$jo5D1 zM%I$AE#Ui77zvwljKCMcBZP` z613Tq$-S|M@Bz@h&Vj002ENWP1HVGj@O8$QoU3wWO8uwYhn3(_z9=%jL7P1?wlP7Q z{aLVx{5KIG`xaB3Ae~xOqw5&}%(HoCctZ3CEIf~)J4n~Y_tK~X`~gy`(C*y(lK%hz N002ovPDHLkV1lJwy+Qy0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_back.png b/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_back.png new file mode 100644 index 0000000000000000000000000000000000000000..11e2eff13cb000d6c1fe4bfe1b5e577b9e25db46 GIT binary patch literal 427 zcmV;c0aX5pP)iw$%y-kseYk0fXR zT4Ru=Tih()_;e)KjP%t+eq*!R2S3bpFG5n`B>Rh-)gF=vX}SdwUHpw&YtDO5&x_-s z?U?&g;m{iNrGgLw)>;T5nAp|U+EBs6u3*Ep!@&;002ovPDHLkV1mpEy59f* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_front.png b/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_front.png new file mode 100644 index 0000000000000000000000000000000000000000..61d6701eb855a037ecd72cefb03037cec891e8e8 GIT binary patch literal 947 zcmV;k15EshP)@B~85bp!L>2K$N23 zf1zId6Z{7}3;qEfMG8Ghu?oEiITb>xmByw`L(DIBHk(cL@OHP8>};SSlD7K}%eFGI@M_#K<|U z9**=)-E+?AnNDY%5rh!b@u#iNu~?jH2ZKHU*?sond9&FNLNLxb&0+oRHiAw6w$W@h zIOkCzgw^YD&Z{MZ+Nvdk%JeL57}b)|?R069&Im$?S{Z;*E5qJvu-mg#u9XdYuTjIS zp4VvvMhnL|rv`hk0YEO3i#)7ePY4mE&q`TqWQc?Y~bp?&ZwS-n{YfF=OgbsGR<%(iXD7}ZnRw(YYKa=AMIY9~i?H!`)8 zBTeJiQrFv^mT3x2;{Z(48L)m*bKardY3)`lO>3EJ>)Oud&i0mRngBFSGfi`4^?qmT zYkai;AhL4r?#+c;)D86~o7cCqr#}xEfXcxS0Da3@+<3w{tzOO0DlIN7dd`*PVGI&M zJRk@OH4gxSkf22yD*1)=02r6Ui}j0N<(?rHKIGl_f$81sg}N_|=ONUGiH#rp zNhtY*E8>TWn~+kTa6Itwph!YVu|#k@?dd}pKR6ch@b~#8IVPF!4t^>XCY=ZQ~7|<=#1vxbI!~Zjz4`~ zp+N|tf8sb!j+Y#O1yHNj6d}hY+g4m0MeOYC5=W6yd@`M+1pqp|4gg7#U|Ck~E$1W- zJ{+V9gb=E0z1}c7g!38h<}-#DI41BHjQSb(|35&sjgY3kj3cA-LpWCQ|9(Bq z6(~Y_AeM0!s)Y!5sjF{Z?}&7r%X1XYk86g3=2E?7e(V@Moyz z3;V6+s?qpp*w7Epu%4J9K_y0x|W%{?nfm)<5E|(qkNKB{WEW{*92;;f>hA{vD002ovPDHLkV1jb!+Wi0k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_output.png b/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_output.png new file mode 100644 index 0000000000000000000000000000000000000000..35fa025c61d15b74e83f38cd211d8b54b28d57a5 GIT binary patch literal 510 zcmV|a9vcMh0o$qXaLFn{-_ul({-<=94 zA3iQIAcQbK@jP#XR~&!?uv6X9gj$zeS97V9?Cm`zmC`Cco{aMX0GHn`0m!lp$8k2^ zDyDGw<}gSp&$Hx4QQzvOR4D8|eqznS5khQu zd;R$gfL^Ns!13t?09Ri=0kB9VCD%m=K~X6%yO_xpKcLrY5Jz(zdr)$s_Bce?k0bpyP#uqxv!o-&!`z%X5Ek{~P79r}=+>Zz-zD{u z$+C=OHlyJr!`SoQ%-fxtxA)N>HIz~&L`2SVZr&gO=-hWO&oGK8 zwFV%JA^=LQy}Uub%_{=)$AwWA5id3{qJdi!kH!EjX9WOh7GI2$>9-XLlv4D1kCvqP z8I#oUW}--H)nW<>uzUSD_uzE4r{|30VQ*)@ZQqe^*5uoqG>h3x8qvU*rIcbfD+rb1 zc-ULAihOTd-pvXU5lXEQ5n8Ttn#I;AqkiiCYF-hU6AHv(Th<+z0=F=XBJUJRtt%7V z5ms|}5wYwpOaX2GI9sY#bZ?&9f%&O?UB4`b zIW&ZjCOJ5EEtNy$t=*Qrcz1SpJf39m@c6Vx5L)Z71QDI!9s>XY0NE^Kz~@pa#;h?| zF0WvXiO8#Mg~S(9DM+P|%@@4v7kqu(2Y@7$HlC!Y$^zp_3TsR>$hVe7^xTAqc(5u9 zWb*~8vVc?y))-cCj+BTXwAS2^N=3_FcAqzq5~f>Y5Q2$)?VO7h+}y4hXxbX-^a4#=GnP&-xaXtmG=7S2B>sla z^*ayvv+Fe1OpG3msP|-NP5*?i^#=n!hVtNah#$uv X3oYyA`Jn=k00000NkvXXu0mjf=Zn1m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png new file mode 100644 index 0000000000000000000000000000000000000000..106e4b8295b7d18ef2c697db21fa3d57de66ae5d GIT binary patch literal 1021 zcmV)Ne1)?^IHaIyfA5V8j(Cd>!C0ixm) zO?(&XLm&Cv_-bGwF(ewE7$QP2(Xruz5i>20kfl1L>~DSWThBs!MG{FA`^$23c;)45IHJ>Og~JNZ-+%bPFlwf0N{lfYLrI?vC6ZQ5qg2w8 zR!p;ET1lUkv}9b1Q|FRtn$1RohB3bs-rAnAj9TchPQU!J3ZPrB9n=qKki8!0Z4@>c zfQ8k;l0Hi*4QX*b&3lmPQpQ-hvH>vrwhf+6WO@xX8x7MmCCc$MejR|l>aM=4%QOj$v7Mcd&KclyLi4~Y<$Yrx01ND%`OSy5tr zeX+j2!^0oFPvd+2Tkg@N4~0GT1q1N>*`lH-s;XA?{Wq(xTCEmtzf@!ZpDUjLw3@w_t3-NVE3a{eJeC>bg@2xhP$F5uFL6 z4<77Gy^(;M2PXz@BrYfq$y?IayHZ+BBjDkW^U!U!wzg*`$5&40VSXu0$^an0tP&E$ zgK)hB7ZT;_9Hrj+U@wh4kN~DU^uY&-fQNtwJI=s^6j6%B+~oMmDLhz4jr#}KNci!< z-GUPd(g&e`@I~S`{DU(e@DT7|$8Y%ur=KoY=eU3H_S2TpTN<5E2_X+o1MOA`p??q| z;jIr8o=99!9s>VhcX*yWNZK!Z?Z-ptu+IGhY}WM}qJW>VpUgKYj2-0{%R}g~SErAy_Zj9iBfA0LWeo_m_wV zI(Z=f0Kjj5$$jzwps>mO_LoFR`0X!I{0IIa&gm-u-c_Yd$qe-ItU rkxF>;06!#7+h00Sb3u9dYxLnK;g+b{wt-|!00000NkvXXu0mjfi_z6O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png.mcmeta b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png.mcmeta new file mode 100644 index 000000000..9559c00e4 --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_input.png b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_input.png new file mode 100644 index 0000000000000000000000000000000000000000..fb82941be19f7c120086609968b7e051ff09fdc8 GIT binary patch literal 495 zcmV7+5DplQ@|pkt50H-$vaT-^B+qt)v7S~zrPQZb@y+=YZGJ#SF6H2+NRS<-o!LbiRUvKjb@?ROAK^U lEzg5|w{5*z<4b+8?HLxT=SPStJv{&b002ovPDHLkV1my8;G6&e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_output.png b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_output.png new file mode 100644 index 0000000000000000000000000000000000000000..e1b8d33042a8c871833793ea5560699599ba4a6d GIT binary patch literal 508 zcmVAE4)cf*w74$wB-KIY?V^K|;ILfJ**sgmESd@vzJ|ljMPAXWw_;_j#UoW=lt( zK2NbAgs?ve!*DLHV*nn&a&6fJ^x6*s6H`*My1Isv(rG>z4vGc<7nc_RA-{l0000eyR$d*@Bh!v-sRQxFKei(EfJB8SR6Mb z0FC1Y_N}KWx%U9n(-eT*`%>KC=B_AUn;6C{BBiy#NRv3}`E?(F$#e)n*6wdzKRt8; zNusJWn>ysjW|Mw?dB$qF2-*)0k8s~#xVa;1_fd6$v}R_h zDwF9DRb{nYgkrh(VQ>G42)Xx&NKwF$wfn&+W3ReD8W*NohiY*(yMZO--j`Y$cOmz_ zFfo=e8Ve#4s>iSdD7Uj_jPc8>-oWG-;@6pM3(h`ffvNhGs|XSd7q_4Ex`mux_dj_w zmW^Z)Au$sH1}`Uw2!l22TcmZ@O@f5hX{$6mF{%R=pC?crq+R2?ZPWq&0HWp8u$aKi QMgRZ+07*qoM6N<$f_M>v{FCRU-V&!15(w}18JIuB!`WIC3=Xw*g*H<-Pzsoc#_`J^UDEV z5RqR(Ykh`03;+ZGB$I>zmrJD>YmLEteuLJSfV|ihh+H9+f`3#B$#llcZo$>3eE^7j zX~R*BBF``!#b}KQ2Km-J3!WQkt$DD>GbGa)iadi<3av4$;u5LW8iI(pA(aZ2o$M~J z0wq$Za|PkTG50aw8?ANdL7HyaU4QUDLL%zELTe1tbc^Qgl}|@<$w*&K6GKvkEB$5*K8lCgMv#XT2IL-@(Q5xE;aH}5>)&ZZ%*tGeWRxBERRu-2lgOH3x$ zJmAME)-;5{pz~zkn(hf-n-2zD^ySfMA3u#hV7u*`2@kdeo&W#<07*qoM6N<$f+O#` A>Hq)$ delta 267 zcmV+m0rdW`1EvCyB!BHmL_t(Ijg?cojRheL+)8L*5=+jUAQ4+~9orQl_0Z5?Ns!~J-2H?P+w}|i(5k>^veUUe8#{uwCRk}OPj5%kT*^r#` z!1gmDell?Pp*%~!6Z@SG+|20itAjb>Z2X&(i1;o603+g1D1W7}l(M|{3;>)N^g9jZ zJ^FKBdZ4O|2%6bq(C@_78f&e?>HL56V2{}E#9Av`YYTQb0I*EqlM-Heus3Z#=P4{q z{A7&(;=x};dU~L$?^K>6?T#PpAky0cMZ|*b|D%L?W#_ehR(D?c`L3$`0&A|&bhNP} RKL7v#07*qoL84P5=M^32;bRa{vGf6951U69E94oEQKA1OrJ# zK~#90?V3+$8%GqzKZ%vK(@4$QDPH5$F%cxGH(=v`b&L;*pqJuHNuUJcTuLu4qaadlTj+1a};bFj4^0`c@cyFXz5KE zjh05hpC8W4Tayv^zvW`l3Fy6o6VUz$!s3mLv5HWI-W})-XfZRKb8i;J^oX!SHS}K5 zftHTQTaeEI0O)!brl$-U9suNX-i5JvOzMNCh-ZK?hJTkY|E`#S|8pUp1OGW?+uZi9 zFufOd+x1Q;3S8HPqA2pbICfn(7{U4T1^^)YdJC$`U|Afh%J5(eFOO%AL1x{zyZ;JcQqW`xTK$1V61m#m$~ipsFe?%Yx%L=pPvY0E7lV z9W8y_(|;>Rt7ZO?g}vHX_agXbeGLHM6w28aX)9-=-+$1Qvpr`64&njvfOtSW5Jo&` zMjj}B9t=LdfhXBj0D#e%sHt(U1`nQOSCLuz(;IpiHT9+3ner?Mq3d1v>cCiRIq-uD;=z02f%WrP zjo-t5EN52%#9(wLaN)Kqd7$`tP4zxtZGaf!Ws$ zEq@J!3l5_5v_u^j+xpdymHhKCwXi2hG6)st;P42PYnWalHKlYj6&l)gR!-Tx{_D1L8r$@__1tM&rT%U_X&~&@?<~?EZuQ0Of7vr=fwN QV*mgE07*qoM6N<$f)LyefdBvi delta 418 zcmV;T0bTyl2(AN=7JmQ`2nGNE03Y-JVE_OC0drDELIAGL9O(c60cc4?K~y-6b(5is zn?Vr8f0y|td@=+g0)=q);u>+LaH{`H&DqL>o~*4q)&HX^P!m(Ai3)`1!e?rh49iud zZ`u9Qj@jkyn|W_%XK&W)^(%n817K$4oQVkBors|C`vwySpnr3BR;yJ36gBC8`0;q8 z6EF-zQB=rP?MCZjvB2HwR83^90AKEo06gw*ug;V=5l}1F$>Y5WnHdp57ZI3QQ+1s6wsiwJHuo6YNT zxh!*_CYn#lac)*M5nwi(aXOtYbD$n5hTZn+>1r3vD**o-*|F_9>VMOX)itgFAAY|1 zo6w#sIi*CGQo_ub&*xVkNX3QK=X$x$-8mc%<;#v;NE=Dk72d(epN0=?BMF0Q* M07*qoM6N<$f>)KuQvd(} diff --git a/src/main/resources/assets/advancedperipherals/textures/block/geo_scanner_front.png.mcmeta b/src/main/resources/assets/advancedperipherals/textures/block/geo_scanner_front.png.mcmeta new file mode 100644 index 000000000..d6331b7cf --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/textures/block/geo_scanner_front.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 4 + } +} diff --git a/src/main/resources/assets/advancedperipherals/textures/block/geo_scanner_top.png b/src/main/resources/assets/advancedperipherals/textures/block/geo_scanner_top.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e38cc3becfc5e56171a1ba5d1f2be3328cde06 GIT binary patch literal 412 zcmV;N0b~A&P)ZAqwEdU6b7KGYZ+q|Z>iU;|sH$BNkqujHH>3dV zqc(PCd5(7ufGp1e@XpojhH_D^1K1;mF^fp;ZZOg`cKUgF0$@Cu0x%r(8Ev^2&u@Vw zRaH8j;}B&3{*fZeqKH@vVDxaisX?>0)3b9{%PQ1*6vg<#&f@V0+M1n(RovJPMv4*EeTV{fYOXBDa%I+VoGECX}!&ed8PcfmWi7BMct z&niSDM2}$(P;X~qjPc|(Gq7?D@pPu!jPuWVU}}zX6QKmd$K4HCuZ5pgWW82Rye341 z)IR#B!3BTNLh0L01FcU01FcV0GgZ_00046Nkl%WHcNk52~#p|uW6 z5YZX#F#r$%Fq_U8@VQiqF>4H#%WGI;BJy%qBJqV(3Q{S|=6?%b_6xo~?E^p(N*j(+ zltqr=D1|j98suAxJbG?IL_Am)IcD<($|8qU3f34_afy_OAhg!pkV-|%UUrw)krJuY zxq^7%n1@*C4H3m2WZ9P84F~@t)LM66!5V`s+v4rznNLr0$;ePm5;o-PI{INQdl8cg zFF9KLBg(QZw13uTeh@jw`-Slen0 s2AwB+Yq}?VZq^L==*y$iA$}Uac1-LEWUZXe00000Ne4wvM6N<$g6|futpET3 delta 406 zcmV;H0crlI1F!>-B!2;OQb$4nuFf3k0004MNkl?UCTd_S);2-5FnPHk%&+U}gXS z5kXZUB4B2S2&$@@#q16ML}tc%y)FS8{?dQ(uImsja5x+aqJIrz<=NQWwk?<$(OzR_ z99PQ`B|x>mfF5wt9@ihAg+;JK5dqP#Rqe~#5-o0ELD)Y%O z_oW0=Bif;t@3>kzHj^hjgP9K|sV43Hxa0#&_-EPa5H55-X=UkY0Rz!qfryTxZWDouoGynhq07*qoM6N<$f`5Up A)&Kwi diff --git a/src/main/resources/assets/advancedperipherals/textures/block/inventory_manager_front.png b/src/main/resources/assets/advancedperipherals/textures/block/inventory_manager_front.png index 9d26f1f0e8b6fa1eff0a272ab46fc584225be71e..932fbf477dd15f33125b98b31933b6ad4f9ea260 100644 GIT binary patch delta 449 zcmV;y0Y3i11KR_TB!3BTNLh0L01FcU01FcV0GgZ_0004vNklKH3xk^jLXxd2LJ>BvYS~+2s^Fol7Cxx9!%51!t)}@N8?eD zKsZSd%Brd=L^$WtX*QqHY22cCc!_ekg2RI{7-O(3D{^)|dop>7QW`1u=ygllNx_z7 zMXE}1&av>ka7Z^9nLR0(F(zlkIfquQ)t9De!ExBio>flRg+dXI!-5%zN2e#pQmOIO zM6r-htm5weL4Q`QotvH$2Yytp%yD!y}dRP08 zf0@J`yTOZbaQLntTo3}^_dy7e_rmvmUnV91P%7;K00u(_!w4(LtZ!gCn_xZ<)C_}4 z8vxwl04d>2XA{`hSCK)zG#&u}-BufhLGkhS4#S}6wmRDKjkaGYFL(00QY{WuF%J8u r7qsx*`vL&`F2cWUEgfz|<>UAR2chd5GSsh600000NkvXXu0mjfGFHjI delta 424 zcmV;Z0ayOp1HuE4B!2;OQb$4nuFf3k0004eNkl`$SN6 z`0gz_j+K!}M}L3cI!Pl;+irb964LD*OGuej(XFX=#>HDwCF#i0~Iclm1}Z S*5nER0000Pe50&NxO@iYbr3buEM`VhY{1ND z_Papl$#=nWQfxp(aMpr|Fwn{_p9RaJ-tB%<)t;!mA*0#Efh6d}Bu%4RaMt=J>Jpl& z_Czgvw<{> zn+O2&m$##%d(25FVR|u*mPezzVEVrS;zc^PzJ03>0Dq6n&kdzEc7Xr@002ovPDHLk FV1gtFu!H~r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/me_bridge.png b/src/main/resources/assets/advancedperipherals/textures/block/me_bridge.png index aad32c54be8ebc67b2cd256f572f5302d386187a..0f33f12f00e39b5288f90bd3a6a609bd8d0542a3 100644 GIT binary patch delta 412 zcmV;N0b~BM0;&U$7=H)`0000V^Z#K0000SaNLh0L01FcU01FcV0GgZ_00048Nkl-4)7D6*H)z_Lv2=RFJs-vpeu^Cuf5Z3slL!213~}AGHP`$7?@57k z4ozEQHoN74FwQY!2%}N&$)U6T6E^EF27C|V3j}<@n`|bMQXhLZK0000wOTdE0b9(30 n&gu2>Fv)Z=HF5RuI5B)$r*-pB!-^cB^B6o`{an^LB{Ts5PYi43 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/me_bridge_front.png b/src/main/resources/assets/advancedperipherals/textures/block/me_bridge_front.png index d9ee044177bf8be9e2126921ee2447c5203e5071..72745ec1bc7fb0c334ab4dda00109641b6cd5c09 100644 GIT binary patch delta 1657 zcmV-<28Q{70{sk-7k|JA1^@s64b9_D00009a7bBm000XU000XU0RWnu7ytkUFG)l} zRA_20U+xQ@nU5|ZtIZ4;XqMU7S4?smb|)EK~YtDY)&o}?($+~ zgPNu>@Z=_|TNSAbd$n4nrfK+cNwVIM925ex-VlnaQgdr^Wm#_s1(j;Gie0QgJh9*1 zL;v<3@1M9rA{1tJs7r2bb*q9em*m0Ok)0I)^t*dl*nhrBYFmTs@G%z7jmWKuU!bOG z`U)BcEUVL5DXS~)w>czS~V7F7R*Rk8}a$L0Q^|};n2RL)) zO8{10Eq`Q6- zd%a$lH~jY5FR)=$RO964_TM#4-@=Q(p2-ezeWIv_iR~`?=`T(jIxHUSELm9R;JvkX z<3Tu?Ksm7w9`weaGCDIw%pb(r+f8=(nB1y49)BeD?Kpe88J(Gev-{-1>`;YTpTz^y zJQ%h8ZkYJiJQ&;h&f>vA@Sr#TbbmbXrIt}tmC9n7L@50BJQ$ss0$@BdjWVZF^S%WS z218*gi)AL~QbauwI=m&x1amw{?r6KiTVir91#`$%nC5{mwXEwTWAVW94?Z>z#x7so zAAb)9@2yeOG%Abb{qdl(SVmD*Hghgw{-6ZQo;>iSmdPg3EfAQ<$5DzZwTwv~0L1)3 zHghg+6>l@}lP(otZLdI}ljsR`IsZgNz1!CV4P+`6`vgGElO3faM>2 zJRXc)z6!v|h2j12KyY9)=c1-*4BlGmems*xLDyqtS#!b`{kplPRfo?$P7P$Sy z2Ms(Jytk&GA$H?I)DvOp;YseFxWd4bn*fptLSJopFgcgfwe1Epoj?!Hj<8VN=0OIO zvnF^ja$%UwoC`b!vU!a}C@eh`uy_ELfAC>=FmhoSfa^!ENj{k3fv|hQfpof4{(s$r z2_6W$Pp3N#@kAjo5em2FK_V0;oJ{BjM2mQ0UXu@a)YpOsjf%U}5Kk05=&?CD?=Ju) z5}`1oGgC$$EJjYj37teDTG7Y@fNWlaJo*Wy9S=n0;`-5R%xBy(o+u(2vqN2g#RIVX zgM;NkA{0hZRjwbs2JFNSgrBe{4}XN+&u83*c%rbOam_OJuo+$i;L@3;v2YtGt>X=dO`XckWt$aNb{_!&_oJGYwcgu>6B<0q~x9 zAXu~40{{R3C@l|D00001b5ch_0Itp)=>Px#Do{*RMJp>SFfcGP zGc!+5PfScqIyyQ(KR*Bu?*I_@LPA12aQ8N6;;5*oprD{M)q({|Npy#<}#RYpp;-lMAcMOhD=Ew#L}>cMOJ23=G7jn^~$#I^UqG6zi2I zE1mOu`$t45okK*n1cu45>y5JNP4}~^Kvn$-MIl={-Js{{6T-w!9M?{vbZ%>6C?Tr~ zM8va)umq?dXIoW$2c|RZz@Csayq(dZ;OuwiD>bij6JCPhZt=mO)g!A42CZJrye33s zXClDQ#p}_ld#n>LVSF{N4Nr*XfQ8>9s1MSy@jW!^0DrHp(jeYSVFmyI002ovPDHLk FV1gV*wr&6b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/nbt_storage.png b/src/main/resources/assets/advancedperipherals/textures/block/nbt_storage.png index fb9f580b991a40de34455f175054e7109ebc2aab..339272ef82d8c6e74b1b57bad41ae89e1889c84b 100644 GIT binary patch delta 401 zcmV;C0dD@I1FHj&B!3BTNLh0L01FcU01FcV0GgZ_00049NklGYlHT3@!yZ9s zt-}&Tbb@;f00aQcrZWb7E|p@;8iVEX64scAyxf*Zd?A&BRDTMy`GS}Ig0GMJ0FZ>z zhNBc^kz+VYVU39f`PL$jo|_O650*ua*?fVr$RU-2HHKB3BPAjTtu;5KQqi)P-Q{(p zL@ITvAYM4+Ar^W=M6m~1wqbX}!T$)g*4v2;A)o{zTG_{qPK_!~afZ#>}7w$)tMO~v(g`+HE}oI~AIm`*QvAdF+I vZ8Zji&Xb)r-4j07?+p0p%Y)M)ejI;Cq3y|eiP7Ky015yANkvXXu0mjf(*VNC delta 393 zcmV;40e1eY1ET|wB!2;OQb$4nuFf3k00049Nkl++&k!TW28w-k)tqlj;WHW2;jK|)yuIs)5Kve+%B;oETr9f3t zNWkbR@52||#~d7zX>zE|If(iq;JUp? zwt6ON1*B=H03>;i`QV4M#C0000e8h{ z|9~!)Sh96t&p=+2E}4O?#70+ zr861I<@x9V08gGi*|KI)yJcDOSSe1Wjb#^^1g+Xb|Iq0N@FbJ9!0aU9%@4J^w-Td#5J$OQh%8mW|t zU-L+%Ov3f1HvzC(Ta`^Sga?k}5O&!FhKbReBXB)*KueqQZ3k}jker>PTCFra5bgxE z3R=pPwTT*2n{1+I9LI@zL3EF97tqosy4!xUu<2=&z<>2*6NF~~6pQ_Q_2n1x1<}&h zoSkd?Qfo0F`VCl?#e)a`#`<5B*55(vHDjr|6x~sc4*rrKT`&xM-^VZvd0m|QzTfV_ z;NTDd3ybq)vljKbLpIy=SHW z=AV`Tn16p-lC=sC_U-QjAXPkY;D<~$3&5l4XZXI)l?Qoz-=|)87#tj;5i~e-=v_iW z4jz1m#ldepY>SP?Rvw74ziS@oX;Y4U#RJ6y#eV~(50pMoJWxD{*DPvR`atnOG*R(D z@j&SV#RJhq#RJ8ISEmm~@12)7&mO(Z$enY{9=!}C)CaeYOf>bu${M$hOc1WRo$)|3 zz;``#I}@Gf6%Rxc_Ye=hci_h?yXV0lCW;5VjyxE-b57cJ#e*A%FGU`#x@|nrH}l}w z+pLLAMJ8MlMn)nI1wdhi(_*3Pqd*wTe_IqIArIz%bG6Oxw+h2TC6(9=rk` z#Pq?jxuyrA#?eybMc{hq_6ziZ@IbbC)r~Pi^vt$A2!rMWbQ{SC#RH`e_7D%cZ=aPH z*M=wQzI~SZ$TZp6(?E{3;mMtO;GMY+K!50Z7`;W@u^F^{WEZv_d0<{U)z*~y$Q0Sx z)2t0oO52Y5z&mrDp}qm!v6;5oMKoixKF~MwpiwGwci}$iUr*xAm&yEol18bFzg#A$ zRS0So*)!X&7u>NKc`m$A`atP}t$L*GCB9xfc&YjT;IH?7X7t{9IXfqcADCA^!GHVc zHyRBO%?aCP=S1;?p}ql_y8uM`AOIO-gaq+}y9@WJfA~w(=2f@z_<=h%L#XAR+thji zls?#lJZRMi(5expfCT#st+TUt=DM^c-d|{}*W~OB&={GLnqh5tGTDCPP~QMIk4I5V zp$~+I(9VOHJ_xIoE%kx>=&{lVRez-q-XtERQYP8i)6_?%cAtMR)HeX7aiFOW#OFl$ z2X`0l$Miv?;SsF5F&@O$3tGOwP~QN@<}MIwIYvw41V)b0f4<&wy|AM`2t?$<3Au6j z62Yq5)-x~E2f7U*pywkF7`=)IN+0Yw9*83J0YH6ZIynz+9={xE@nIT;V!v6(h?BGgJ^9tedJwS5YAxx@8BYf<_@>4QDY zgQWT(wq6jUakMm!(Ocxi{I_WNC{HQTdZASxY~EkkN*`>yUJ&sEKxRPbTEh5&*v)9Z z#jvyZL9i+RK+miAfzk(imVXBj-(T2DA8gA5cWfrUzt9N}wws+3@j&cmKorT-@`cXw zkv3}qm5-$K!JEv3mli(&I?GQC*Wt$DOL7FJQf6oQiTd;WWZ(5bQ~8OC2Z{$TEq(w| z+(48>JP@<9mNuhfK8orm=7GEHwedjI4C?<(TNT9v#e>&0|3Lk}Q5x~!4ducALSXe$ TUN)Kc00000NkvXXu0mjf$+`fJ delta 439 zcmV;o0Z9I&48sGE7JmQ`2nGNE03Y-JVE_OC0drDELIAGL9O(c60ewkCK~y-6b(6uW z6fqD*k5j28Gm6MO2i(Yfz~Jhw`~VUB0l(ERaP<%u?nY;+pbqGR?$DK>i=oQ2PqXRH ztyJ!;*-ql>JRsI}fx)KpYBm%Wo zn$1jO;nj=RJb%A_$$FDRQA!CX1z5G#Xsw0gUhjI7DW#BeUX=2;xv7`#E{hIK-wSVV z-Y|{j5?ud@yKiPja)$n*W;5fHYi?~u9u72{5go#0R~vKS9{7R#U)~2>KNG!z#T-OS zy52A9{Kp)4CsN;m)5mWyu6qN_tfy!fzlc{u~bD3;O^7002ovPDHLkV1nQk&sG2c diff --git a/src/main/resources/assets/advancedperipherals/textures/block/nbt_storage_front.png.mcmeta b/src/main/resources/assets/advancedperipherals/textures/block/nbt_storage_front.png.mcmeta new file mode 100644 index 000000000..9559c00e4 --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/textures/block/nbt_storage_front.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/advancedperipherals/textures/block/nbt_storage_top.png b/src/main/resources/assets/advancedperipherals/textures/block/nbt_storage_top.png new file mode 100644 index 0000000000000000000000000000000000000000..78f6c6d3a6c8fd2013aa63d0b24f7b52ff059f13 GIT binary patch literal 417 zcmV;S0bc%zP)_k&Swy0>!9GkaffXR3YKt3EauJ4}S zy-1>}^m+%LOt6Ya~!Ek?lLMO|pih@p-MdsBZ zB7Y_VJiLrHs-w+@kH)gMDgfvo_M_nmQ6I4Ie**C!{Wrc%qYm&3p%c)iV|#v?00000 LNkvXXu0mjfR3EsI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/peripheral_casing.png b/src/main/resources/assets/advancedperipherals/textures/block/peripheral_casing.png index 20aa776eaa3b48670fd131bce13dda089b81d1aa..258a10387edabe0d804a443e00696934fe7e717c 100644 GIT binary patch delta 324 zcmV-K0lWUP0@DJJ7=H)`0000V^Z#K0000SaNLh0L01FcU01FcV0GgZ_00036Nkl;F|+El7maNrrsdH??v4!{Al6gFvUv>aBkoHUtJJ#p;u)Ok3cUT!c* zDcKOryyG(m00aQfPmfBBMA$_18vr(ug3tK){JIwafa!3!SAV1dqfn8U3ynmWyhqv+ zzJGoJ0L~^74G3|?bbS!5(gt+23&$x!5(zEQzdmY7k;ZjP)Z1%GCB=hxH zj+r$$&U5o}ZJ<>~_V-*v*d_J~79P}zR$>cQfomnVcA>>FGl-d+o$DpC=R||XE_+}v zv^=n8hPbK+)IIB3qaLB~Aa}?c*z%+|f}U(5xGYOoL9uKxmIYql-T{4nJ@ErhQ#;j|doIt^eo-U3d5|@(`1VZXlQiKGAQUuBh4H=c#*`{u|u;I#;5NEcD zU%Ebh>I!mao7nN`Th}KeX0~Tvw$02mj*^vdIb ly*?f$nJ%U#t{xsIhEMCXZvJUlkppxdgQu&X%Q~loCIG5IWUv4L diff --git a/src/main/resources/assets/advancedperipherals/textures/block/player_detector.png b/src/main/resources/assets/advancedperipherals/textures/block/player_detector.png deleted file mode 100644 index 0ee0bb55bc3485ff003df8bfafccf1a38a0939a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2694 zcma);32+l-6o7+AQLtD+Di)d9*=jA~X3yr>NeF3D+R%oEHUf4$*zEpEmnOT*?zTy* zj;QD;auoql(Lt+#Hf}tDO6J@0Mp4?V9O(wtWARlI8c`@%`GTkKOjko23(L!3#IKY`2Y` z*z#KOYcnPHIy% zuYU2j$BHn9nD(gj#S!-%S3p@yjvQ*77@F(!1Wq7t>Qm-W2T%?0R6)&UczNELu9&cGaZX*XKA^cE|Tz zUN(ANL(hi3y_?s1ehuT7VSSAYo_jA2R*_|E{X6H~e_i)i$5$OJ?!B(;^hea6(E-n7 ztM8WDwMQmIuO8k1YuBG&B)3X$Y}~%$%Egrj9~pe}RqrpwcP2Ux4?aD3*CcOm=`DR# zXMP%Sa>v7O-FyH&9ojJ__Gs1qz6X9TZ0^{7eA#!kziUASt>lqm#3 z&@^3NUtd>O$Fi))T`p2EH5XloFGSlHI-1Hw#DM|q!f;C0Xh-^F;Q}(-*4Z6BBJ0% z=TroVpyC6~Voiq%8arl&`HmLeDWIOIg`-?477`Lb=a5t)E@^DajhbK<-Wy^ZMNAdF z#f{Dlh7g~u0)(+LRsyR^iER`LAqe79g(%zLpPqrhl^bo=b%n+8WHM<@(pFiG;iS{) z#0d(gC=6;~TDzokDNNEz(~u0t4>VpC6I!db=H=heU4&opIookRt=5%#2`uBS{D}Lk2S7iQB{IuUoYSMSnt)RyN`jo!GV-vP0F63l z6p6GEPQu|N8Je*(6?Pbq37QR54R)*nBMB=-p@_h<(;M81E3h1&et8<#1_U%CFcR*0_Au#SNs6UtG_M&7wX8=mk9Kd&e(2xE)J3Po)T$Pwts zg4J6-+;ZSR*jLbba%gDr;@Q;&oevHTEgQ03Sa57f_hTYGW70zO$rt8q+*(4FSFbv; zt)i=NQ(0Hy#PcVq>Vh>V-@kP`-BdUsjPBhKd}3B~H*(G4Ssxu9LtWo9Y4?2Xf~G6h xl&mQp#e8_E_t36Gy`A1^v!;da>GWP=x%S5?^6ze+@t?#JsG8~DTsiOFzW`8nizNU6 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/player_detector_front.png b/src/main/resources/assets/advancedperipherals/textures/block/player_detector_front.png index a2ee80d4311935eca2952ec49f234b197b2004ca..cb29846f2272811539e2bc425785aa14ac33a0a2 100644 GIT binary patch delta 554 zcmV+_0@eN46}SYD8Gi-<001BJ|6u?C010qNS#tmY3ljhU3ljkVnw%H_00HVrL_t(I zjct=nYt&E_h9Be2#|?~F7+Yr}=t?WJi>~?~Dg}!oU3Alx8-Icf-4wU}1i>P>lW{W( zw*{wDO06GI5d45b4Rku=)I}zDlBw?|CvWaK=RN1my?=Cn?cra>P)ZdcQpyWl znJ*v!X0FaqJU!nh)fxcL_W?+?uJ8rUdS`h7fWyy+m5;`lyn_&xxWK}lg^7X!-(P

NX@>7zCiL`lxA#iuG)fnn9+RI!X2LxLXc{WloF@hxz>mf zLa@ELiXLV*8KC)Sg;A=By8*@+tH6;`l4^|*!YWvK`huO^MVq{{yU5zJm$;s9o26Rk zODvBNcLRhFw6-=_U(R^<{u2P}%h1}|V3caWt=Q=(rGKmf02L3>!;H?}F*V1f=D2kB zj;)&99W!wu>P1AosNzDieFT8(`QxtecFYyn|FEAIFvc)HpZ`@I4mf)35-ugg-GFc@ zwh3`JuyOs`ECA83Q$!)XKRD-J`zA@E2-=b)QSb(WAiq3GGPzViAnm&_#?T*}R}PgA sm*Z(}lq2fgg`YpZS)xGMvNAu7f1wZcV0xoda{vGU07*qoM6N<$f(m{Ex&QzG literal 2776 zcma);3vd(18GuFGlmIaVhz)^;Do0=h&gmXH>v1Dl*piWjWm~mGATHx@x?9O-OFD6P zvSb4jAcn!vV4yq`C!Ih8Z7DQ0uNd37!z&4Cnx+Nf&fqwK3@#~6nx>u5dJ=c<^oSs& zv1U$pyZ8U!|JeWEy*6)^D{uUa@fwXL&t2}Uf%gZM>;CV;e;qo>r_qdghIcr;Zihqb z6@?%l2Jpq(JGWKnoIm=(g{KW0seQjMU3&HWEBji{RXKjHd+R4N+SjlAWY0@C>i*n2 zdu9bV^tjbnH(_SuiGmZ0=CyC%`Evemw;dVj+8?ah-$B3d)SzYXUCZFw_e-uEyLwUo z%B`NMGoNjEpVRr_%^jBu&d-@U z{0{kLaL_(a?^sr`=i2n(!xIKR-~Z+NiIdS&2fMdEw5jy+PltMsm;Ae6Rix#;p_hhM zKT>jj_Okx6k$;Z)SKsE-PhLWXy?qlyyUX6{-|$&peaq`Nw|rcYPd;;#>Ur^XQ>Ej2 z(WO5Wv<&}c==Q`Zf4Y1-|JKJPD;IVSUF_*TaO|Z0?b}~W{^I*Hrivd?p}#%>S4Hr8 z{AGoOg*c8I42J6JYLCZ5)3n`gFCQpgbj@BkE6?!Q=3DjY_jqkTk{#Bv#~O zGA~563YG~7aoL7IKU4?d8@4P7C(?XntkNZ!!`yH{!GNFuM&h^`#YvR3C^4jhi^M7` zvzk#UokN&SEXl+$LXTsSNLE^s%bLEjb5Ci>-y8#24UmMm$bzya5S3?VjK#unDc4q9 z0?L%?YnTgS&`s51M&9MF^k(IitcCbUOqEt7Gg2Izm5Ig0u=<{3F%Sk3Xk3CsA}cHN z!LQcg4*!)mcNm8zvfMi)GkH<$!{pIUfsHGc+)f*!I7o8>%X75)Xu??|ffGR#03(G` z<{}(5Q*aSXCW5sv1PB6_$#C3JNoJxfP&kmR=OKhL5r8xi3>x4F4yC9dhcafspau&8 zZ)TGL7>pVHYLSO!&V+OQQ8*mr1gIcsEMko)OIiq&Vi`!ZKn`O7Ml%iq1Zx0@R>?PA z;&s~)Qje#H-Y_Ev1u+7IwF^s`kQU2MTCs0a`x@6*FC?N_K)NZvje4h2mRTao z2|;YE7OMjdfR#r}{U)_6w+8NUk}Nj6M;-n>G_0wLE{7yRY`)t!A6Styl}$4;QHEey*d+!d8ZdDt)WR6pK+tG3 zGfW_(F9|_8!HA$F1nUKs1#CFAEVR0Gea_2BChCDwd^m}t1l;pXe!@%>BuyHSoN9nk zV9J)78=F72ybGIdjk|qwHY~qOe>< zcobiA)xr-z&5LeliC^cN)801a41T}!(Q&R`q4Cg_zm4?0vwr)B#M!OjQRK#%a}Vhr zxU`}Cdu@xR=1*Sy*v?H`4%{%0*#*ysxXV;TOaBd&4X6&EGk{<2C8II>ED6x9Zi^r#JrW`3>#!r|+G%?`XTcZOM=K t9zJWHwe^B{biDJzv|D-NS{I^!`rxNye@Jv~TdsU@xXY@XM@pBk`yV(6vVQ;o diff --git a/src/main/resources/assets/advancedperipherals/textures/block/player_detector_side.png b/src/main/resources/assets/advancedperipherals/textures/block/player_detector_side.png index 19dc3a6e872c1b716e6b355a8f0cc79a4df75c2b..adb368100670958810f1e59ec0d5b624c995455a 100644 GIT binary patch delta 410 zcmV;L0cHN!6{!P|8Gi-<001BJ|6u?C010qNS#tmY3ljhU3ljkVnw%H_00CP`L_t(I zjdfB%PQx$|oJOwQRol=|s`3lqP#yvj593E1cn5+a(GWtK^jYL)7D&Xx4#Dk&N(z~ zjoIvy2f{eUx=v#>>OI+6(?8*J{my`op*%Pp;>Ym^rV|qFH{3I%r~m)}07*qoM6N<$ Ef*dil(*OVf literal 2776 zcma);4RF)e9l*`Djsgu7Xaa?mxuS4}RMv+Tf9UL(#14*$lX$WDXvR@w>Df_YOGc7o zC%_eG;0UY)7@u9%U15c74AzCOh9qRi*IK%+>jpHtgQkTZ869iabvwA_+U!ZOT|?;_ z-^tQ@`u~6bkN5w-r&fQJCvWVuu{xbD&s*-Uf%iw%>)~(1e*-!ppwo?do_D$YUYASn zm&7n11@Oh&JGWIB+&}og+Saf9WY5btm;I$@ z=JX11=xMuo*|_NqCkjq1nA5g>=PUWY-F9TCbAPyIe>?rtXZvma@7ns;zF%_X*wu^1 zS8sPup8i7p8@C=m{NKHgq7*)Fw{WVn^=|pPjvF_2t*I61g#|;?6Tf`u-Ig`8?R7WX zyZ_l8@2@XDnDSVo#*gNF5cpuc$7opf8)g6RuuZ1o(F?VD~UOQq{Z z(WO5YG!OoD;O_WIf4+P-|MtfvE9Z9%TTaO|Y>?Yo~({QSGqCQBbtk-sg1t0MY+ z!Lq`_LLA3UCR25Fwa@3HY1-*@mR~DgaNSurBhU2I#L~HwoOAP^o-zJJYqV#JbYa(; zp3PFv7UkECwZ~dwzgitWye8HzE$wQR+Iip5&`^z|_4vxj(UqZ->!kX5`00(&ef6GQ z&(2Gh7PT!aUbITM15J;Kmp>!xbmJzg*C^eK?NfES(O3B35@kuHk7mV~k>SJ;Fs5R0 zD6P}kovAp(HULE*0uf$tAfI&gB6^;4Ad8DC@yfUh)bZub5(qR`1=;2X*2W>u;=Hl; z6b%V6pfLJWEGo!!%7JKL8a}Jj7^2rilm-W~q|&cVzs*s>IyNb}XPMwb;1^TGiI1A+n=iQ`rjCsER-#xNXQEM8fe z)fD7(4q-O26cfh?BaX#lS!r1*Yy8sA1Eu9)QygG5Ko%1c3(6XSpv=q|i$@c3uC0U& z)G5u^C>O?{o0`RpyvJMV&&sP=i}10yCap?lq&PM!6HiD{?LEh0APQp8xD1IzR#xG| zU#`PF{;O~9F%C^+x%WtB@}k;@$)nvOn@}xz-3~-`kmf{|=V6oXyE3!Ipg)AK<-1_BDBCW$cPHr#3>C=+F&iY(9}4YUYIGOSn? zM&L%0MD!d>&xa@mmJlCfA^?jE5k#+Mo`%lD6f$awL!cHC?UDeah*D4#qYgwx>Qz#v zGhlC|3!nChtfr|c08Z;az4p_(u#}1DvFxNB`zE!oa07K>Qpf_*P5DjKdzG@x5=lvl zQbV;=9jXVcGE(Z-sb#q}aF3G}smVLy@E@RIAFk+fND`%{`+W<56**JsG(>s5wkyyK zJG^)@(+D^uJ;~NFLIl7q7k1#V82^AO51AOV8Biq35G)J3#AHT87S4j&7!w-`o6S~+ z31#$UF{~sR36w-&y}+`74X2fb-jJ@(IT^`h9Z-u8CvlX3d!8joSZRW!NfVM&4KNB! z-BNR7v#T2sZ0!5fU{^OQ+N)M>AQ6v8c_8KFLn}3i$${Ik|D%yZOBedcVfQNxvs_}l z3GM-PN_A2gp=)2GGR*VwED&UIWI^61Je<{>gG&o;cov?Da0IiQIcU{U_OJ#5EEfqL z#n(Nx@B>iylGj}lGz4a~wN5&NKkR;TjHgFzICSOjL%r{;-~J(Sb}M)ixq0T?V}?gA zZ7Bav>w?Mo6Bj}Wm4xLI|3w73ZjiEZ&qu2g1!SmUl3=6MT z4ZL~0x3i)C7lZhFgDddO-#WkJ_wtL&MBiG&s@GPZ-uSbhY-pQ1b?=mYN86Nbi+{NH t@LB7Otrw)DW8D{~+|HBMdJyAt2R|MCeWG*Qa`lVDTUO;hQo4NI{{V32vAF;M diff --git a/src/main/resources/assets/advancedperipherals/textures/block/player_detector_top.png b/src/main/resources/assets/advancedperipherals/textures/block/player_detector_top.png new file mode 100644 index 0000000000000000000000000000000000000000..e2cb43a5d5b7417002354e2335d2d0295f7155a9 GIT binary patch literal 416 zcmV;R0bl-!P)&b z_f4oYb{3YDz5-W>Il{kXuhHU|W%qzDx!l}b=KJQG-8r~_c>H4xYpsTe$W|`QD-1yU zq>aAoNkZWq0QDpRpl~kAEAmNR66i+=RThybR;Z{6i@shz0hnbS09xsIXMFQ==|zmS zmTvddlUzMrM_p7szdwI(&!Fn;|0j#>hzbx2G&}CLMCL>4zwUFtS3n{kHWcfh@pk$ zuz`qp_7GYC@p0BvF}!(U2l|Ah;q5fLlA~Px$aY;l$R5*=wQ?W_|K@ff3+rfi0A&|x%^<8LOO)eW%kYL&Io1Rtx+V%w8L}ZYd=ML&z^uRXn}lLRH;3Bwb`<>prmlEMd9WI9l$BoWZ~c zK9X$qgFesrz$Ov$32b*Ow`<;({r|;!4PuN4F-DNYWHLE h(~L1XlbjVv`~q54?tbV@W}pB7002ovPDHLkV1m?L!g>Gz diff --git a/src/main/resources/assets/advancedperipherals/textures/block/redstone_integrator_bottom.png b/src/main/resources/assets/advancedperipherals/textures/block/redstone_integrator_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..9401704adf19da9df89144b2459672a9607a2a0b GIT binary patch literal 420 zcmV;V0bBlwP)gE4{GqAprZm18a0T z+c=k54d7fB^*z3l&uRd`@6UI1sHzo%NK||5?CvcUcsxBk0&w4L05DF=we_SwGJCQp za+3-$yt<53gscF!uhZ2G>fS;nIoA|mGX;%orG?B$t6D$j`!DcEYZ+BlclhpK8a0g60FRq1Jb2b{~Q5JL-z zV1pJ#&UE%@7s)Gt_;<>p$V~x2Hcv?eu0P)BY4u?pUY&(l$IZzpP)V*|p|U@0e934JYy6D> O000084P5=M^32;bRa{vGf6951U69E94oEQKA1%63H zK~#90?VHbQ+jbPdKUQTsa-$?lM-(?sXhUhpPTOGYxYG_B?6N^mV`bZEl&yyy3S~HH z8H0f-jIlppe?y^%!C+(TFm~u+2UC_MX_6*UoZ5FZ6gJ5EeJA_L z`s(R@3YuHw2bs-|gVvRO=XnwvM58P!Jtus1gVQ1nSsnQ(z_$4AYi8P!Lz z?JAn4g%)%?kD6WM$`9X(t9LvPP18uV9D1$r%D00m02QYp9IFoA*N@ki7}ZDFTlq`; zpqJB8GHINRGBf5p0M`aAP+Zp)4t(|dTWs}BkDS(Zs(%!%GWncAy*2L`$9*>?(b>H3(e;wW$!F~`PP*s8;Kvh+7Jo+94 zfw+hYaDVyo%b{77T}DPU+HIGSkt0jS^l<>{&VkUi+b;W+y`x9D?i}!?3#Acw{l-iD z`E8Tkoksv{Z9W{jvfuH@&&&d#1VJEH{z?m1{^Of{+HIF02(Y%oMK=Ck#qW4*KRnuI zzvG1#Y;8Uiib&F#EPlr$lgZ$BJaklO2-$vK^};0?06n~Pn>L;(_H=J z!)NkfXaUIs$%8?~>EMC0yTaFTc~Gn!u^^u__$Uq!?7GElVIj1@_i3e+AtF7O2lB03l1V4$!L^S+c%gXU|6XR~&DWCiApORoTTUj$%zF_yWcYEsrKztq)^eGN%74o^zKe2hx%4Si4R{tLvn+H9+DtXX9 zE_v``^Wb(+>^DZ4 zOJW|hkUWS)<_j+t4^I3((qO-_s7}&_jC4_my-7z^EpFUl!yl{pwu(CDtQ1% z9!MS}P6G4kwtrSd1p^ZB zAj(>nYb(k6jm=D&k{9~Mu~xY$=NAAOA4ndYV4evQ@W8HH7;}rLeG4Ea5Ar#KqE)77 zmFYUw`0+t&>>PL0DN((cG3STk1IYu)1K~u;gMXO^(R^dXgM%j~D2_GHRJ6(jk1dvK zEAi`zgBi<=IZrF4$oa;;$U%HT^58@~SPrVm=ABg#Z%xOZZ|vE_Gtbe^9GeGrKQ3sc i6cpsVb0q&G9{dB{F1|*@fJf~B0000MN0e2AVLwAzHF)0Mc5E4GMnoVY zU#RPrwX7O^o`1h$)qBFQpShwCS___mszOygaq~OuXNWPPD2k4i<8VVN-BPAOj*`>^su5JxGq5ULRu9gW_C%_n(+6IX zr1l-3fAoP>BBT{~`?&UYO>No#0c$geF(SkmK|~mhMlmN3$SyZ5UAM{wX2yEG_9tsB ismvIoD@j!m5q<%V`R{Uuobu2B0000EjUq zhid}>CT;gmdw+W;k0;)HHZ~sSA}?OOELilr0=)Y=y{*COY<(t^w#)YZ_70P_Lshdr z0!b`Y<#26~=QSqgzdxJh91$UgfOD?YVA6JoNS^iC)8_!pzI>(@SjIpt6b$Y-=ZGQX zi>jJw+IXtUSmExl%FSX3NyPpLwU7%fV_-TvVi}V@#sJE7iuXP<0PufWYJs=kPZ?{v zxC&zjAkDm?nKwnk!J{WYqHJAPaeR853aBcZo9VCOY+7_4-!v+i+#f#xps9Z&M*Z^Y zf)BfUEEb;8$gxHCx$78<5%okPV^6H{U>L>T@)z~tIw1rCnzq0@70Pq(a WFXcj{QuIIo0000KoCWrk--|#gv#I&B%gyKMT!(rP`E`dl9pQ} zLZV2KA_eE*0Hh>Bu|{hOr!cdujrkJtF!ucU^LHnDUMwrlP*n>Nk*i#oH^cy=yAk#r zBnhQ+01T1@fYP}}-f;Lm)CBe?gmo5?Mr^RAaagoozXPxxMgYu*g4p{f*r zM^9FhAHC%5FhWEqokK)w1%`Q1dCBH{+x^{%rh<^o6j(u6I7pJlDU{CDCWa&IPW4e4 zdk8Cl=5h9{V|epI1@;R`!`m5mCHFsj->H3-+wdb8p1wcH`?Xnl|MKDPbX_bW7ZU+C z_m7AOn~qs;De)s@ldQ2kA=(QTzK@}~NVnFvYt;e%0UANRW3TD22><{907*qoM6N<$ Ef^|HtqW}N^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/rs_bridge.png b/src/main/resources/assets/advancedperipherals/textures/block/rs_bridge.png index e1b45deb4acdfc80c6f70f805ccba24f1d619a54..1018593f5797320a0ef7a946bfdca69d51152c56 100644 GIT binary patch delta 409 zcmV;K0cQTX0;dCz7=H)`0000V^Z#K0000SaNLh0L01FcU01FcV0GgZ_00045Nkl47v&Lz2VB#u7b5UTmOy@$T&I zcs$AA`Q`P9Ac!a|p|!riJq7>*0J3?;fX}5;j9Fu_THV4L6MvCc`wEFKq*9PdAzLhY z*)RC|ybl0LC~Z7RQI!S8lN8pNXpnC$i|DzD)|v;avOu<2qACkWrC^O=71v0$)(}L* z4XISL>}B_P6Dg5OT`GtdPI-uh-e|335AuA+?uLW^5fV}V6|6DH^BwNqHhg-LYet4@ zlBiL%(GPRoi+`9@c*)_SC(833i0I;P)LL^sczjwP54L9>N`-?p7)k{p1e|jaLNKwf zopZ5*`-e3HOykot|P9Sw&r@j|2-*i&Y@{* z%;z^e5XL#yb%fEV_vBzr|AepY2LnEa^5k@gpT{4zHxlg`6h$j600000NkvXXu0mjf DJ&U#M delta 299 zcmV+`0o4Ad1G)l`7=Hu<0002(-QrRJ0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000mP)t-sD=RB7FfcPSGfz)XOiWBVIyyf;KLC680Du1gckcjv`9eZM85tQI92}^q zsGy*r#pOdM00009a7bBm000id000id0mpBsWB>pFlSxEDRDT%LV_*C@6I-$n#{8EZ_>*g8CbHq@7&2OHDFK)FWa_l$23C*;fRjuonUjqXLMF{mN@~f x2ulr13k4eJ>?GoB;_TwcAfPB9sKCe|1OU0pEtdXpUU~ok002ovPDHLkV1g+*a-0AF diff --git a/src/main/resources/assets/advancedperipherals/textures/block/rs_bridge_front.png b/src/main/resources/assets/advancedperipherals/textures/block/rs_bridge_front.png index 45b15f39831116d279320d89088de2bcf661981d..e94fa1d59c8f777145d8a4396055e07507865ce7 100644 GIT binary patch delta 1591 zcmV-72FUrn1G@~67k|JA1^@s64b9_D00009a7bBm000XU000XU0RWnu7ytkT?MXyI zRA_##9rAZr*HvH3aY!aVrsX)QFRbfS zt4|3jNmC1GQwv0|-y^K+Xy5$;fRmnA=V4t(n_A%L>P;mmBvlJ14BX-pEz1_8S~e}m z;oOx=v>b<5TYviixWy&TT#PBRv`8dESl4kM-SMa#O&El9ot9;DboC}@F2+Rv^?O24 zdoHwQvq{Tw(54okxFj?ICD1J{q3gP`zh&9D#U;YJ?$tnRkN9e9AFkfS0rc`3>4M4b zhRtEyv~a?JsRh`)+tC2v)z&_G`yn+N@cV-bq0PI5+JC0G?SG)++g*P&*KJ)WpF(aK!~p!*yLWO;gw9x$C-0um&(WnE~LL^^~(`Bb+xr;-&pU z-E`jg2!FuS_xg2{1M6AmReou|;H$@vJvY97-Bjl}zS=K;JzsjCT3E?jDQD0eDJ|}Fut~OIv$Ko8?+pUy2a_@ zgMYdu)U+$8FLZg}<0n4JiPfCmu72k(am$wk3~ z=-i6pgD)OPzn2`4d4u%Qp*)a&-?D7+3b*TtQee7Z_UA#mU{apVDhKMVC)R#*)PDet zhqsRNpnKwuy6TCN2ZxqTEF*xBE|~1h=e;~A-QPw>kZ7c4-C2fgbH-8_(OblIf3*u#TZ0;(Ke zU+CsR%W~40ssI2kdbIM00001b5ch_0Itp)=>Px$cS%G+R49>UQax&0 zK@k3;Z{{&c^$@7m0dxUj2hyg^0YWN+Atz830_s(z%?S){4Xy&oEd;uOc%6qgyLO6M zuL60+@@8jtzMq*lo6QD*ssbQcYmEq1jR-UAVWt3xs;<}T41e(aN zsj8?m#6CTJqYe<%rx^e-+?B5oi-?Qpv;r^BC{7*z{QS{{Za?4P?bxNO>VhQ6W`|gf zndISc*zflwsec1}N=gl()>>;-)lRq8>h3v&8Z*>-3V?Jgq3^(f7)b7Ry9;db)X+qm zS##;-8O3YN+b_2@X6le9WQ0#SnKp;kObo!ie1}g^gBZ#L8Pn_T(jrMWXrBPUMijry zq&SNAWs}bJ!|#u|1&!hBf@Bx~Np}}_C%IfM|J}Llk||-oPcubTkH=%0*cT43{Sv1G alKcxajr*B4OjfA?0000~YX diff --git a/src/main/resources/assets/advancedperipherals/textures/block/rs_bridge_front.png.mcmeta b/src/main/resources/assets/advancedperipherals/textures/block/rs_bridge_front.png.mcmeta new file mode 100644 index 000000000..9559c00e4 --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/textures/block/rs_bridge_front.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/advancedperipherals/textures/block/rs_bridge_top.png b/src/main/resources/assets/advancedperipherals/textures/block/rs_bridge_top.png new file mode 100644 index 0000000000000000000000000000000000000000..38c98a90f9abdd7674f7944aa8a8094ad939f670 GIT binary patch literal 403 zcmV;E0c`$>P)-&Zff4zDU!^~JLu06@m z$8*rdaOQ0Ne(J$+w%faV9Gc3{ei>h(EOM0l5>b{wiyASDnbGDom>Gwr@?<@E&hS~y;KZ0QS@P_F;MprbL&f~zmA&BVTL;%=*Z$_`~ xSSNmj)p8XqkH&Dp^nU|{i!`>r=T;p6{s3yP(H);AqSF8X002ovPDHLkV1k8nu*LuY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/entity/villager/profession/computer_scientist.png b/src/main/resources/assets/advancedperipherals/textures/entity/villager/profession/computer_scientist.png deleted file mode 100644 index c42e1afbebb3134ddb4f908b46845dc70d01a778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1836 zcmV+{2h;e8P)Px*=1D|BRCt{2T3cuwRT%!}%uaXGWSVAGP|ycyp&-7MA_Z?n9|V2LOA*?lVzp`t z7O{dURBEvZUdTgQ2#PQIAVrcl@kN5-1q%951QC&n6fLybw!2Mtb|$mOhuQz^f6koQ z?50V&E%U*$=lak2@Bf}1pg@5F1qu`>P@q780tE&avi-^HuNcm15LqK|1|4I}?DMhP z0;aZkyW8Ati#2nBfx(XbA9Xsvv_EZZ-#UivTgR5AvE}JESN~w^g&q5+Ivqm*QcB>| z@&YJOpg@6sktrS?eqf8%|F3#g>;HA(Qcr|mcw#5^KDATz!z+sb0Dto^zWC;6{C@s| zb)S@ywShB#{@wLCQ4~qf^ALt1T-OBvBuN6__Yuc2Hf-3?wLlU*akEPBHxDa8^n@O2 zJ7V7VeE=Qi!!U&BdCTrE^?sU_p)ZC3IF6&NpqJX##(W&dN(jqgO$A^w->)!w0Wr)q zPv7Jc-QbYVH{&Igy%O%dQ!hBqU%IU30BG~gcnR0TNLydMwy4$#$H8mkyAWPkRObKL z{22hiwMNr=ppl_6Tp^Sd2;o2iXeAO75?}rJtBm6qKx+P+d2`%0Z^i^cjI0DCl*MLK zeJUfvsEiE5b6vPX;MCl_#=KW@;g#IXKKi&qKnMq}n|=drS8!7Ih~pSx7$Qj$<>x&3 zd7g)Qy^bVF)OWX-pj?2M=@*MlyC&)IKq`cml<=5IF265j7)UdND;%_1sa23>Nvk{% za?Sg`ueEJ4;fAw-X+70zi^>g5hMs-nNbbI7yrhj$yVa72mJ&FQ1IKYR^9E9_1IRE> zAkF8+gr3x1_DU)am30}#??n9F}J$1s$qzTfr2_YQCoT*{Y^OP`5A@RVN zp=ou1s0TAdT2K0-4hmYd))CmBoAin(gJqY3C zGG_{eKa;l|N)4-oQtPh!0RZCSxvmRo-5n2Z)5b6VG_Ts63De9)JB{(IU;}q2?p|fD zlp7px1WL4d4F2=mA6*G7Hk;OfITmaL02Td#jvt$AImUvGS_v|us8lYTGDa|a5c*RF+c)?`imJ@(k^aMeWsSW4{5v>7I!6lXg>y{IMnb&!lOTq#4 zqNiT3=UTwPgZw#)qKuEv&dw_Tr+IUItya_G1dj=gMnmRWz@P*{@@MkxFbvh5007L* z&1o)RuJ?UEQwfrr_`VNNwB(YdvAjd^^-&Z_P9u*Nt?gF;w&)&3k$MhU0rm6N(^^_j zG)iF@A_xKiP!dd%1VIoWiXv%VAyF#ffrx0Bv`F$n5TIVK_shFRhtnesa;@^LU|Ubm zA0HprXuy;f*WALwf|fhEG|je+2B$?>krdVvnG?3ni8D7bF(J>MJ)2>O%-R%$NsG5{ zHoqnWPbUPPLTG$uX2zO+Xnh!lSdJFC$3TH=$xIofS+W3fiEf}hJZ!tsbtcSdC|b{<2bE>)II<~(UC`09@WW&4;(n4MNf*X+%5PY6E<3d z2*G`nrwvLY)oK+$Ck6l=MoFvuO3Fry`hy5T2PLLRvt-JZN(Dg20swoEB&!I+P~}{n ze+Lz!TCHXZ3(_nfBMUJ7-*f@r_cfE}zCVa=ASkc_$fP+E4v<z1f!b(00If(W{mGYd0$&QfASpwz#}hlCM5WaG)v7G zKYW`0AMyCaajpO8tH(0W2hjO#Pd{#Wn@ZoUPrit4&%6RDrB)8}+gDx&+i20e{S-G3 zPNUI~bkkyL?Xj2Nb^zeta~DzaUEF=&J#d7;*B`zmDG-|P=K#nANp4L;LqoUKd;JA& ab^H(YwJed4*XVHo0000Px*AxT6*RCt{2Sxs--Mi6~VEh&knQi=uy+hN*52vVIAAUX8X9(w6d=&`r{rQZ5$ zdMnTX@yY#w+onqFI55Rl6eWIXd!S~u`mm&=uCq@00Nd1xmS$&X-kTW$6)IGyP@zJF z3Kc3;sGuo6d2m;ByB$HVA3nM#Hr@XwVAu6Q*NtwsBTR0h-ZXIh>`w-ijsSq4etsce z*P8~C@l>w87od$UUvGL(jga>q-EK!LJLdhukF%c{p4@Na$^G^_Gw0^9ZwuLpV+Yw03gxa^oJ2>ofa5 zzz)abx=n=P7`AQ7&07{n7>-f5_}2g5e#bk+F5wx+8Cp&Qah%D`+qQ|i#W9Q~TmN5c z2ke5n#gU}BJneLLouoOe9U?$W4*2S`CuQ*iz%UpDfN3EhAn@BH5JfJKq&d>rCW9c7 zr%#)=Z4>H!Q8aBbp;j|s7^SUj_KUId^)Q;CZgE%^N1EpF{r1A< z(=UZ7XzTOy&F}dlQ!N33%xqvmxZ*oGB3j{%g8fS8i z*uUQ&NXG<0wDKL=Iv~k%0KjxAkmiMSh8p@5>NU>b%!shY8PYVD?Xl-Mk|R9NS@|9< z9Wb4)?{p2LJmDysNV1FL3}HBy?BDMXB>DAvN1{GUle6=1tt@KkfUGE1*2pPIn&a@m zg*7XBD93HvL>y=EJV!=|ZJS8a9Io4h=Q*hHRnFH^2F+RxSy5m*6(tcCrBmugX)fuz z@3&&n8Pb{LspNQhIl{eru6+OW^kQMpT1LPoQ0-sJ zUVgGubi(J6A&D&K9Uj?=H2TEBa`2!$}ACf|#ES`#7+@4Z+6V%!tfb9E& zAd=OfS`PqNi3k;1bHKKF-{s{9jERLc;sF419$?!h!f*@#k~e5w>j>Co-X{c;X<^$Y zqG*C57l`9bc7b6yhU+%bQlf^|d8cznkOx(dZJMY)e*BT35AF8{(lBa5)MkWolfrP@ zlvc&IdEfs29xg9O^SU2gHa%&SqvbSYGei-i+TyxRaMi11JW%G^qlX^~)o5xjHyK79 zmzr&w%iAc*7~fL>D{ph{v8MBv+uSEWNW=qkgIVqsQClC_S2wqe)0 z|Mly?R@Rnle|o)qFW+Rm<22y=ZS3!NM5i;wt5*|wn(82uLQOqkRj*ZI(hZ!92Nrv2 zGQP+KvTTHY-+&PL%KOU_v&_O&fT-W26F3=9IZY8zq*jkD7@k!*Gl&8zBg$QeM(DM~yRho`WJ6I6DvJ$y0$sQ80|= zX+tuk6AYT7Mzb-KI!z&?g)rdzbvbd}q|YsxlXN(Ng_14AVR*45{_fvZzgI>8!ea_$}k5n3$<-*1A?9y|cpsL$6WgEs-LGXL@k z0_Eg&JT}qqkKydi!}uy0B=Wp1GH9r|I*cZ8-R1(D7kN3B@;pNl+P3F$r>7U}s`^|v zZ~(FlCL*MViBuV8@d#102iG;^z3XI9EtzkN406ij@?;we;ZKzzVO5yOV;Zh2~|mm zBh=nt1L?%k%8!K zXW?0!s`IK7$$3PkwrxrR)eQ?WNPlTFozK5!0Fe8y!7#O03DNFy%!^aBOcwJ|R4&9y`y{oOeBsP2(%Z)X&FR?N_y`rzL zzcibHYa?^R0Tu=pH3kI(MutXC1`ZzvhlH;NJRrH1TbP_<@)#8i(t&vG0f8CO5NRd` zCSeAF84O^Z%S0uZHUkZr!wU2ULqq&JpvC#_P4-rj7Cg?ce*gQs@b)Br{{OWTzK5Mp z-@0VVxmS$)*3bJ{etA+c3t#);6ve~8o_%5T`Te)LrOLyMmKYOoTLeRiF}cqePafpulv6E58si+}KZR}_PZ@8V#AI*aXaUqJmY%HMGLWymfT zj@P&Uv&kIaXeGmUId8kSzrX+W6`T<#*T^2Q=)3y(@#96UGX3ttb&08)r5k}^JZ;Xy z^pDIy?;j`)iLO`fZ*Mn<-}}}0ckK14dW>eP%hKc@Y2D-EnWBsm$|%8z8UaA5)$NHI zvCIJ-vJ5O~DiWZu{Zn+mu3=j7ynAk)^(KK85^X>qdTB1*mTUhv$4m2T?fZptYcjsw zZrq>r`n^oU{dZZ67fjB!hu1E!>2-j`7KSy5h=d0LL-NUmb0QC$7o7w7{rvg!-D1fK z9BZ<_C7rhP|Ni}Zw`kJG!@u;R3cU9PA9%#xAi6icRDb8J-BpLp_MT;#qbK>`X6ap{ zs|>4md20Ip{=2V4)`79~+|M`SYCoN1(t91m?2iQP5f;#J2c|TXFbL~^JR>eXKG^Hr tGiMWX&84p%K3oXW%*PDMFoOofe`Y_F^FYB_FMSutO`fiPF6*2UngGweOez2X diff --git a/src/main/resources/assets/advancedperipherals/textures/gui/inventory_manager_gui.png b/src/main/resources/assets/advancedperipherals/textures/gui/inventory_manager_gui.png deleted file mode 100644 index dffcdff01074bfb124eb02456deca96d91c9530c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 716 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;K#qEVPlzj! zK6dQb4IkJ4K(LLWySqCyH1z*}`Tq+Up7t`Bo0}ID6adx8E>B$#q1Cy1fi(^Q|oVT|(`aO1Fa1B(RBI5n;fA#bYtU}8e&%T*E@w~1^OvHJ1r9&Mu z{mJv?gsu9n*UnPhaQXB8eLeyeOncs3`fC^W;KqxeAV*^d-i&{K-pYM)x13=|ZRU%+ zj5*97zP&lbAkY8b|G^@L`SFZBd#u4aZ!kT0^`6;o-_P(m^@^X{5B-zarFY=%pZ9B- zZ!;w1VK*F8^n-W9=i_(7b{k1Q`0~GYbu5O%de|)L@8oXP_G{V0f}uT`G0ggZp;F1N zN2(Zd5sC) zI`DDNdoy2#3Yo9Ye;0f_|DW%}Kj#g;kLUk4d^|6jb%9&}`w+tAl@0s3HGT)m^Kr+3 OJnrf0=d#Wzp$PyVDCVI6 diff --git a/src/main/resources/assets/advancedperipherals/textures/gui/smart_glasses_gui.png b/src/main/resources/assets/advancedperipherals/textures/gui/smart_glasses_gui.png deleted file mode 100644 index 7606b08a65e7bfeb87fa72ceebe827b2749a6be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1974 zcmdT_X;2eJ7~KR2AcJwph*Q8|@qo4pIDkY>wV+}+)DjT^NlQhJCNW?*gNaxVDu*4M zAsodB5-@>;QXm{cKw79I6_8>e0TT^}0^tZE5R%Y9#~+=x{&)ZE?!5VC-rM)yY{p6d zW5%1zHUR*PeU5vb1^}WxLVy8GyM@M8M6TcBPaiu1*iS9q0HA-#$LnxlQjvTFjYkAq zcD|%w1Y!A+gRg3!wqgTwEPMz&xwXAoe^+M`+_!Y^jvsVQuG#E_n&hDtjnma*P{TVl zM3qO+19Opuklxe7&ULxT&~U!M{^-P0X5k|uB07ao!L!@j?3n)E^nJOOR+Uv%n4gpk zPn5butyTwz!R^0vb#<+4YC6~PvYKTn(G|(;>{mWTr_Q6P-n+q;X@OZAQ7jh!(zKa= z5sq|gm~)zd(U~zQi+6GR+omfy9ASCDJzMg~b;$BdfsSt5uu^_gSqV90520eApj{WF z8vP;b%!{9#ey+04Bj?Mzt$?0qZTe(^_CF-2CSieIZhwWu^<_E(YVI`3pJ-s zfLqlyHP86P>E2?S-C*vfX>{q`zsCg`hdT3DiL~N)onGPN4c&1@?`60q8q<4t{?X?< z8{;SZ(=@7NJi80EEk_n8eM9`bdYz$BM!(GT-?f^6v{|05%{mPQ6l~vt6ODTR*}t!@ zW;ra$?A`q^By)3f45p<>3Kf*k8-{D^KN&UCtVjKJqqR`gBvmrr<=L!tTQoG3Ke83F z_UpV8b$oC(k;P)IjiytFP#!A*Dn5L~mjk2KA>vz;wQPehPG(um=mMo;3_a4Cma5p< z-WL^!6QAjK9H_@_M#$DKR?9qF5n&(G?q;3JKkc z!%%YTqYGTz+%6k|Ag>TiZuzQhtg8R}`2Zd2%JXbb_3GJ1PZX+x$>fCd&Zq3fDn;|< zlzZXg)f6_Mu@l^awSrc1?DS}L392U&;Ssv`p#~R`_6a7N*vb?n9T&m{m%MAkTgeX@ z(UW2>ArJW-nL!0@1HGGJ*OVG{svQ@|2nakx8WUB>c-W5ZMT42)Mu&sDE9_()-i$Xv z){Ms`=7HPY+n2OjQxu~<&K|?1TGA*K%|b6hCC%v<)mMdZ@qU`&B-c4dYmSdmp7T%x zkIM~0qtO@f`bSGoh4HSm94+n3Hz@Mh`ufrF(C6dhkpnr`To_I(0rzN|ZsV()n?o!; z$TTv}Qo_se{4Kx|>Y_PtN%ecRO#cRwQZm=|K+ez47+Sbb_e_Ip|Jr{pTE-e=;bL$5 SvF^*6>xhrHzZd%mHvKO?S3ZjX diff --git a/src/main/resources/assets/advancedperipherals/textures/item/book.png b/src/main/resources/assets/advancedperipherals/textures/item/book.png deleted file mode 100644 index 6d5971d6dcb8bc8b89d8920d04435e81d4137050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcmV;f0a5;mP)Px$Xh}ptR5*>Tl0QfSVHCiBpLeN|v`88my0kRh5D^rFo3shy)Eu@&OH&L?ee^a<4QfXq2Ba{_xpYCeeb~^L;O|{PGoI2udAn? z`hfx$v|?>WXQnWptMKHNcm%y5z{cDmg>nu6vsCSph+*JjO$XpU673RoN<=3p1%3FZ zC$TFnmZEj;^e{q^J)+KWL^zSPd*Qax#4-&ee+XYFh*0G3juuwVDU@>j304DdO=s0Gg(;y?=>0 zE1WI#lUU=@P_TJZ>Rw~7MANjP;OEDi@ElS<$=2BwfCuy(Qm@1vVGuY_;7Z(l5cqHL Y1%OY_gM~92k^lez07*qoM6N<$f~Qiu-T(jq diff --git a/src/main/resources/assets/advancedperipherals/textures/item/chunk_controller.png b/src/main/resources/assets/advancedperipherals/textures/item/chunk_controller.png deleted file mode 100644 index 11577536f020596a9f5f20e956669e67006eae05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}Z0G|+7ARQ7C;_2x*&(w5xR7R|Nq}uv~BL)PeH5Wd_Fk|VJZx8)s@Mfvuie-*>UdwXMUxC zl*na1*$dxI=v*l#!*f{RlF3%4H@4@Mec9M@Z@((m4Gz}zz5GJTb)v5z3!}lY1?#f^ zzLPOxd>+GHbN~8tYr&~+4qoA&q!Ktor7!t!j0memA9LkA{%7o*0wVAEvTuZVSKQWL z@F(i#)jB6N2f4*ww&!C5nw)q3ZRs!XpQ9?Q5VS2y$0c0Vc)PP3Z$L|uV#M|S`fKq# zRU6;=XmlPCZH diff --git a/src/main/resources/assets/advancedperipherals/textures/item/memory_card.png b/src/main/resources/assets/advancedperipherals/textures/item/memory_card.png deleted file mode 100644 index 27df1d9f4374d215f0ffe85a37dc7db8927be606..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 702 zcmV;v0zv(WP)4Tx04R}lkvmHRK@^3*JVen*3PnULQmCYeAPQnB5lj;;k_bj^k~NzMyX&%> zAi-9!u?Sd*Hogk~fwqFJf*>e@h>d^1S0l3CF+xOimf8DpX3k~i4EU3VX1c*4Fs-ta zO2i|x*||vbBS8Xm5hj|`Tze`#nc?5@c8yQft3lQ4|9yXsw#9<0fv-h)RI{D3@VIbt zrEDwS5bo4UxkceU;g}-_6h2pazRnMdi*||0C;8#5(#UGsi!CJ{Ng`>iKrcu$p z&!cVONPJ}!amM|zYDAkh8{`L)h`KDPGk0yVcDvmgcl*AhowIW>$ zQgzV_@)=ZB?!WVN^^xIv_fQ;~?mh3hADTDeqvm<<`=0l40D(I=wHp3q$!Y9W^jbsf z+lBBN9G^9`{1%+7L-(znb8=r&K&D^U;pqt4v(Rw~t@HJ)zSlXtfy}Br(FJVpz<}%z zFMI;rg=hLEWA+aK009C?L_t(IjqQ=KN&`U@MNjrQ5+MUw2!Wv37{ziGi*5EVw)DH~ zg_QdX{(z>_BBrnnEP*XnR+-@?7P3QD)Gx?w24=YDzBd>4>ixXP^L%TJ`PbyVrznbE z2e50j)}pG22qMD6%PX>8AtI^L6Pl*M kdrzl@-`e;~yEX0wU;mPCEoEeMJ^%m!07*qoM6N<$f<22vH~;_u diff --git a/src/main/resources/assets/advancedperipherals/textures/item/memory_card_bounded.png b/src/main/resources/assets/advancedperipherals/textures/item/memory_card_bounded.png deleted file mode 100644 index 95afeea3820818680af79a414bbb7db07a5ce11a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 699 zcmV;s0!00ZP)4Tx04R}lkvmHRK@^3*JVen*3PnULQmCYeAPQnB5lj;;k_bj^k~NzMyX&%> zAi-9!u?Sd*Hogk~fwqFJf*>e@h>d^1S0l3CF+xOimf8DpX3k~i4EU3VX1c*4Fs-ta zO2i|x*||vbBS8Xm5hj|`Tze`#nc?5@c8yQft3lQ4|9yXsw#9<0fv-h)RI{D3@VIbt zrEDwS5bo4UxkceU;g}-_6h2pazRnMdi*||0C;8#5(#UGsi!CJ{Ng`>iKrcu$p z&!cVONPJ}!amM|zYDAkh8{`L)h`KDPGk0yVcDvmgcl*AhowIW>$ zQgzV_@)=ZB?!WVN^^xIv_fQ;~?mh3hADTDeqvm<<`=0l40D(I=wHp3q$!Y9W^jbsf z+lBBN9G^9`{1%+7L-(znb8=r&K&D^U;pqt4v(Rw~t@HJ)zSlXtfy}Br(FJVpz<}%z zFMI;rg=hLEWA+aK0093Eyum%`+e_y2ZtK`ZWKka4a4wHk#ml+ zEC)TnPoXgeRYgP)5pJJfko5`?K~+i9)I)*}a5{V7Jb%O(eumr;wm6H`{MO!cNY3y8|qfIjYKWT>)UDxcAksFr;Z3pTou59qfbqBw$om*vXW( hZE?>1&o>?lz5!bDZ#f#Oo=N}!002ovPDHLkV1le|LYe>o diff --git a/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/base_gear.png b/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/base_gear.png deleted file mode 100644 index 062ce0b12389d52498e28ecba2cdc864825cac4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1516 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|T2doC(|mmy zw18|523AHk24;{F1|}dO#lQ+?Gcb5DO2gSfj2Z|v?U@WLP&H9N8pPBA5pbG$0V7m3 zP;3DcT(!UgW&|6gZ)3N}G9blS;1OBOz@VoL!i*J5?aLS#nD{e8B1$5BeXNr6bM+Ea z@{>~aDsl@zx)^LKtboki)RIJnirk#MVyg;UC9n!BAR8pCucQE0Qj%?}6yY17;GAES zs$iyPpl6_D$EBd4U{jQmW)z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLkxkLMfuL^+7WFhI$72aI=A0Z9t+{kwK}&`8lN^^X-fc3~az^QA80oL3Bi5)qyOE zt|K5Lza$?Raz&ZRo_QsyMFmB`Pz2j(1ho&h3Usp&mWSqLme|1zKof@Qve5?x8B!2J z;s-1Wj37HM8+~|W+i^{KvF0`~X*~0EaSX8#ES;R~F*#7;c>Vg~)z6I1x;&q@RCuaP zXR1`J%fjxcNbTJLj-Fpuws8Csiru2owMbe}#3Mi?Ok|d;_$i~9Uy7S$-0q$7UNQAn z(yL2b=iXaepZD9GFFrT%hyRtB2xY6c&I&B=4%&suuAKCb_3Q8I%})|` zN&J*Av5ef8D)>_J;uoI&qWt&X!3J?_lmfzLs0p2Q44Hra6Qj)Ey$?1l?)GFm`S$YG zd1r-;lhgyM66PsAn!ImY`Z^C!Bf-g5{rSH7E3^L{>3JdGG&%gx^{}11E7sO{hrDrV z>fzk8TIcw+g!IE7vpiR>{Sq+CW2W)kg3nAx4k)bK_dP?+)$xnaiz>E-o*#~S-EXgo z3n@#|T=St&lrg{ed;ij|H>#fwm+o&q|CaTNHQAF>ZO?Sg_Db5u$|iH+ckgah{~r&-j7{Dg zv@h8-?d$6FhvL(jZLbO>F5IXk|N6FA*_`a}ma%sp3O!z8^eFtv>0BE{b$$NwYF=~s zJ%{rvPP7KkGm}4^=+*V+l0#CFP}a{s?uQH?xILW~E%AoUS?9*=K;Pcu@oU|z_FU80 z!kA^E#Tz*@&8JxWl%DUF8?Sc$+rXI5x%1`ZPUG`#TwP06J~Qo=|F!XZnF6cd_owbX zJGNX_*_MBHO6(J_sCa`nB_F?jF6RkMOo(dx>}%+H^!!QvS3zwnq!Q=fStCB}C?|^_ z=VSNTy#EuFS9RQEQOlpK=*)BFzVqtq!q3z@u2^!*-TcM9H|D;t&8~Y2LOoVIA0@Y3 zzgDz!$DHqBt817|1IpQE%`bfF#(H=Cs~OXFOjz-Of$zDLTlojjQOZ#TO?J%4ZYw)&)c#uozeA{=j56@rR9Pgg&ebxsLQ0KE@6q5uE@ diff --git a/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire.png b/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire.png deleted file mode 100644 index f93c7193cc23fdb1f80afe537e0a62d14447a232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|T2doC(|mmy zw18|523AHk24;{F1|}dO#lQ+?Gcb5DO2gSfj2Z|v?U@WLP&H9N8pPBA5pbG$0V7m3 zP;3DcT(!UgW&|6gZ)3N}G9blS;1OBOz@VoL!i*J5?aLS#nD{e8B1$5BeXNr6bM+Ea z@{>~aDsl@zx)^LKtboki)RIJnirk#MVyg;UC9n!BAR8pCucQE0Qj%?}6yY17;GAES zs$iyPpl6_D$EBd4U{jQmW)z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLkxkLMfuL^+7WFhI$72aI=A0Z9t+{kwK}&`8lN^^X-fc3~az^QA80oL3Bi5)qyOE zt|K5Lza$?Raz&ZRo_QsyMFmB`Pz2j(1ho&h3Usp&mWSqLme|1zKof@Qve5?x8B!2J z;s-1Wj37HM8+~|W+i^{KvF0`~l{I?0IEGjVE)BNzW_A>)-L19gM6Ak+4lXCD&Q_v#!hMA@?wz|6>6#q+;r}Zkzx7K!UqQo zt>xdJoxR&u;TT`Bf#K61m-Zj<`CG~~xn+s@s%8h>Q(s*_cRotuv$ip{vh5U-d19#c z;M1}Be>5zlvORw=GEI!EVwiGp&XG%p>$1fs+_<*;shqy`Pxqf6o(nTnTXOGA-F?59 zRqgdOeP5%Ny>pf>`&kejq><8adC{RaQU+7QWM|rZ{K~aDsl@zx)^LKtboki)RIJnirk#MVyg;UC9n!BAR8pCucQE0Qj%?}6yY17;GAES zs$iyPpl6_D$EBd4U{jQmW)z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLkxkLMfuL^+7WFhI$72aI=A0Z9t+{kwK}&`8lN^^X-fc3~az^QA80oL3Bi5)qyOE zt|K5Lza$?Raz&ZRo_QsyMFmB`Pz2j(1ho&h3Usp&mWSqLme|1zKof@Qve5?x8B!2J z;s-1Wj37HM8+~|W+i^{KvF0`~m2LHOaSX8#TpGOJn<-JEZqMg)=Zr*6Oc!yqXLZCp zQj(I2c4}(N%F57Lbnw}rckEcO^`fE@r&iRG1CFZ{HBWg@p7Q$jz4yQP_BuA* zduVs>dF{RDmHXw{OE_xR_m^sv>-}9lb4mCOwcp(x*KOOcUfE!9wD-T}{9E0*6IS2e zds$^tz_s%BWS%z)Gb4|AzY96A;Mt$Do5~E^XQ(io{r^qXW9n)11I?Thx%t+nC={*o zW;&6(cfa;SxqHehg+9&vq^r92-4yZfn{#JOZ}@S^q-4(KgIg=@{*^zTy~A$;=Y*&4 z%x08sJ9>UWQCahY6p5vWm0i-FFW~(#*D&+WEoaWgkdE({er~z8*Fx?2cXdrQ~r!c9VsG=d=r^677YxjB45e&59x1-#L2vojgkxXNCmm ziv{fe&GI`bV6okilG1j26{(XZK7JYd%ycI+{n(ZkbZ4qm^x-u#GbFw(-FkQZt=G+F zkDkZqS{@6(7_;|R!>oYZHyzopr0Cj+;;Q#;t diff --git a/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_purple.png b/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_purple.png deleted file mode 100644 index 824e63d55f8607cce6033f78dfb73221d93c6707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|T2doC(|mmy zw18|523AHk24;{F1|}dO#lQ+?Gcb5DO2gSfj2Z|v?U@WLP&H9N8pPBA5pbG$0V7m3 zP;3DcT(!UgW&|6gZ)3N}G9blS;1OBOz@VoL!i*J5?aLS#nD{e8B1$5BeXNr6bM+Ea z@{>~aDsl@zx)^LKtboki)RIJnirk#MVyg;UC9n!BAR8pCucQE0Qj%?}6yY17;GAES zs$iyPpl6_D$EBd4U{jQmW)z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLkxkLMfuL^+7WFhI$72aI=A0Z9t+{kwK}&`8lN^^X-fc3~az^QA80oL3Bi5)qyOE zt|K5Lza$?Raz&ZRo_QsyMFmB`Pz2j(1ho&h3Usp&mWSqLme|1zKof@Qve5?x8B!2J z;s-1Wj37HM8+~|W+i^{KvF0`~m2L2JaSX8#TpDbx@0=)6=T|LI`cmu?D*AP4e_Ll%57$J_&a5kjp^y8unIezXxNTfsl{#sg)b{j6 zEWx36v3&Wv`X_zrJ$&qjig4G4V@u8)sAYKMojGme8^xGca_v1k=V_H6+HnQ-TQ}X{@M1)D_zAmzh(Zwc5TB8 zIYvRrvpVxn<`^vuyS!0&Pvfd10ZA7ND$0A$by?jg?*8~g?BL16!siaBchtEBrd@n^ z=Jl-S{GBSTj}!AaT%9@pRIZ70SI%F0Fr@l#g{#W9Gn)H2K6!MSE*IdP)y?g@P07u& zM&MTa-K6I+AD)VR5}M2sGEpUJ+p(?;;mCcn&U^fvJw1A3jp@PZ{wM8O?o74l@X)9* g|0i6u`i=4*w)47Y9+~x9sDm=Er>mdKI;Vst0CY8<2LJ#7 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire.png b/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire.png deleted file mode 100644 index 65690e8d417f799448398c018b2661b117fa710b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|T2doC(|mmy zw18|523AHk24;{F1|}dO#lQ+?Gcb5DO2gSfj2Z|v?U@WLP&H9N8pPBA5pbG$0V7m3 zP;3DcT(!UgW&|6gZ)3N}G9blS;1OBOz@VoL!i*J5?aLS#nD{e8B1$5BeXNr6bM+Ea z@{>~aDsl@zx)^LKtboki)RIJnirk#MVyg;UC9n!BAR8pCucQE0Qj%?}6yY17;GAES zs$iyPpl6_D$EBd4U{jQmW)z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLkxkLMfuL^+7WFhI$72aI=A0Z9t+{kwK}&`8lN^^X-fc3~az^QA80oL3Bi5)qyOE zt|K5Lza$?Raz&ZRo_QsyMFmB`Pz2j(1ho&h3Usp&mWSqLme|1zKof@Qve5?x8B!2J z;s-1Wj37HM8+~|W+i^{KvF0`~{wI67IEGjVCMPUVoso6sL;WPfW~0cm29y8y@_)#? zOipF+5O$rFxJ}5Yg>#vJeD8Syw;HL$A_e9M35gs33=IC9vOC?dh#NuXl=FXWnDXQI6PxBhQ?s=dM;zMzM4VyRCOJ(kO~PQs pql-<@Wt~$(697CH20s7* diff --git a/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire_green.png b/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire_green.png deleted file mode 100644 index ee4af9c9be24cbe8b66334429791235e0c880649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 919 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|T2doC(|mmy zw18|523AHk24;{F1|}dO#lQ+?Gcb5DO2gSfj2Z|v?U@WLP&H9N8pPBA5pbG$0V7m3 zP;3DcT(!UgW&|6gZ)3N}G9blS;1OBOz@VoL!i*J5?aLS#nD{e8B1$5BeXNr6bM+Ea z@{>~aDsl@zx)^LKtboki)RIJnirk#MVyg;UC9n!BAR8pCucQE0Qj%?}6yY17;GAES zs$iyPpl6_D$EBd4U{jQmW)z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLkxkLMfuL^+7WFhI$72aI=A0Z9t+{kwK}&`8lN^^X-fc3~az^QA80oL3Bi5)qyOE zt|K5Lza$?Raz&ZRo_QsyMFmB`Pz2j(1ho&h3Usp&mWSqLme|1zKof@Qve5?x8B!2J z;s-1Wj37HM8+~|W+i^{KvF0`~{wI36IEGjVCMPUVeXuX-+x-8VrW!?-HJDic|NleY zWpXNmhp_9c#BD-GEu6~)~aDsl@zx)^LKtboki)RIJnirk#MVyg;UC9n!BAR8pCucQE0Qj%?}6yY17;GAES zs$iyPpl6_D$EBd4U{jQmW)z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLkxkLMfuL^+7WFhI$72aI=A0Z9t+{kwK}&`8lN^^X-fc3~az^QA80oL3Bi5)qyOE zt|K5Lza$?Raz&ZRo_QsyMFmB`Pz2j(1ho&h3Usp&mWSqLme|1zKof@Qve5?x8B!2J z;s-1Wj37HM8+~|W+i^{KvF0`~{#SasIEGjVCMPUVU9o-L|M=w4#XaZw)M6$noaMDV z$#bUXOnJddMGZcqmIX>qTpW^3m$^@{JvMF;j8xP!JHfD0J}BqB#k{{+Hn%z!v9IQy zkjt|1?2=N+4Vi3_Cz{TNP0%%Pb}%f=_$`@p>Ohi&UPC6!$tDwHn?Gj~o~JimW>_Pn z;QX&V=5M`0-rfKIPs{&h|CoJdcIZZ}W2zjNwwUJdMi}dvE`Brtm3T-G@yGywqrj}o8& diff --git a/src/main/resources/assets/advancedperipherals/textures/item/smart_glasses.png b/src/main/resources/assets/advancedperipherals/textures/item/smart_glasses.png deleted file mode 100644 index 2fc985a1289472c79e3552d61bffa389fd90e974..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 960 zcmaJ=&yUhT7;Sk{Y{K$Ln`{w)JoV8o`c6au7IF8$G9>ES9 zQ}K5t$^Hkw7A70^Xro7u@qmUVL0r|weFU1WIYb>~+S5m$QJLcsywmN`o^fBZuq&7` zMu=RWu{o|>iG0%jPtdX81Sk*&dM1J(+)VnHg(1*opM5L*)$ zd34RSFSw)A$dVD`#{Sjl^%iqa zJl)uqEjGqS9&7L~-!CudJ<(nBthNT(LBzjDd)^VEwW o{67EmYVU3N$Edb{Ey-QF!Sz30z5edEayhm57F(S= z{`+>p9F@~`6ICRyek{22{qrQ1tz~cfH?IA>=6ck(?z0;oWxxLa`T?)r(k&{f#|u_( zJ)QGuj?wIzdSl33{w_$Ft){q*zGl(OpiMzeY5OBa`|yB~GibeXZm4rZB4-#^Fm z+h0!HvF6#9ug?CHK3Q3Q-C{L4xvW9u=5}tC)pHeY-nvzPPQK2~Z2JA}&kV0Gzg*G$ j@Q*k{Izs^)Er|H9MX~-FzKPAi=wa}5^>bP0l+XkK;mEC{ delta 163 zcmX@Zyq|G`NGZx^prw85kHUJzX3_D(1Ys;?31yz{7gr6=Tu=+sEdv_|e(4 z!h%_K_I0y>S=WH-VBp7wbrVkB-hCtd<;3n^N$YM$Ebf?b_2|B=yw5dqlPWD3jFgI^ yZvVQn;@P=7XT5#oO~m*A_TqzS2GcTN@?SQ?QBRpU4!;6CL3~eFKbLh*2~7Z!IzIRS diff --git a/src/main/resources/assets/advancedperipherals/textures/slot/empty_glasses_slot.png b/src/main/resources/assets/advancedperipherals/textures/slot/empty_glasses_slot.png index 2f5d24e179425294024cee2d1912f0711860806a..df17188534d36d0995587772892507be16b41d30 100644 GIT binary patch delta 112 zcmZ3?*vmLUC6lwjBeIx*f$s5jgR3=A9lx&I`x0{NT;9+AZi419+{nDKc2 ziWH!rg{O;Sh=qT$1nU%LHw|8<{|ikvGDPZ2Oh{sg(G{L@jMah5vq*ANQqqkGMh`|a i*BwXP4>B;bu`&G1;`#Bx@JbcX3 Date: Wed, 1 May 2024 22:31:08 +0200 Subject: [PATCH 031/188] Commit missing textures and models Satisfy checkstyle --- .../armor/smart_glasses_netherite.json | 34 ++++++++++++++++++ .../armor/smart_glasses_netherite.json | 12 +++++++ .../data/BlockStatesAndModelsProvider.java | 2 +- .../profession/computer_scientist.png | Bin 0 -> 1072 bytes .../profession/computer_scientist.png | Bin 0 -> 1212 bytes .../textures/gui/corners_glasses.png | Bin 0 -> 999 bytes .../textures/gui/inventory_manager_gui.png | Bin 0 -> 1300 bytes .../textures/gui/smart_glasses_gui.png | Bin 0 -> 1974 bytes .../textures/item/book.png | Bin 0 -> 528 bytes .../textures/item/chunk_controller.png | Bin 0 -> 461 bytes .../textures/item/computer_tool.png | Bin 0 -> 426 bytes .../textures/item/memory_card.png | Bin 0 -> 352 bytes .../textures/item/memory_card_bounded.png | Bin 0 -> 350 bytes .../textures/item/metaphysics/base_gear.png | Bin 0 -> 297 bytes .../textures/item/metaphysics/big_fire.png | Bin 0 -> 219 bytes .../item/metaphysics/big_fire_green.png | Bin 0 -> 208 bytes .../item/metaphysics/big_fire_purple.png | Bin 0 -> 211 bytes .../textures/item/metaphysics/fire.png | Bin 0 -> 131 bytes .../textures/item/metaphysics/fire_green.png | Bin 0 -> 130 bytes .../textures/item/metaphysics/fire_purple.png | Bin 0 -> 130 bytes .../textures/item/smart_glasses.png | Bin 0 -> 273 bytes 21 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json create mode 100644 src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json create mode 100644 src/main/resources/assets/advancedperipherals/textures/entity/villager/profession/computer_scientist.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/entity/zombie_villager/profession/computer_scientist.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/gui/corners_glasses.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/gui/inventory_manager_gui.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/gui/smart_glasses_gui.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/book.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/chunk_controller.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/computer_tool.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/memory_card.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/memory_card_bounded.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/base_gear.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_green.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_purple.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire_green.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire_purple.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/smart_glasses.png diff --git a/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json new file mode 100644 index 000000000..bb6e067ec --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/advancements/recipes/advancedperipheralstab/armor/smart_glasses_netherite.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "advancedperipherals:armor/smart_glasses_netherite" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "advancedperipherals:armor/smart_glasses_netherite" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json b/src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json new file mode 100644 index 000000000..e46b01d51 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/recipes/armor/smart_glasses_netherite.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "addition": { + "item": "minecraft:netherite_ingot" + }, + "base": { + "item": "advancedperipherals:smart_glasses" + }, + "result": { + "item": "advancedperipherals:smart_glasses_netherite" + } +} \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java index 3f12b5212..e23715b88 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java @@ -28,7 +28,7 @@ protected void registerStatesAndModels() { peripheralBlock(APBlocks.ENERGY_DETECTOR.get(), "front", "back", "top", "east"); peripheralBlock(APBlocks.PERIPHERAL_CASING.get()); peripheralBlock(APBlocks.INVENTORY_MANAGER.get(), "front", "top"); - peripheralBlock(APBlocks.REDSTONE_INTEGRATOR.get(), generateModel(APBlocks.REDSTONE_INTEGRATOR.get(), false,"side", "front", "top", "bottom")); + peripheralBlock(APBlocks.REDSTONE_INTEGRATOR.get(), generateModel(APBlocks.REDSTONE_INTEGRATOR.get(), false, "side", "front", "top", "bottom")); peripheralBlock(APBlocks.BLOCK_READER.get(), generateModel(APBlocks.BLOCK_READER.get(), false, "north", "south", "east", "west", "up", "down")); peripheralBlock(APBlocks.GEO_SCANNER.get(), "front", "top"); peripheralBlock(APBlocks.COLONY_INTEGRATOR.get(), "front", "top"); diff --git a/src/main/resources/assets/advancedperipherals/textures/entity/villager/profession/computer_scientist.png b/src/main/resources/assets/advancedperipherals/textures/entity/villager/profession/computer_scientist.png new file mode 100644 index 0000000000000000000000000000000000000000..732775fc57e993d960ad2461ac65a269accfe972 GIT binary patch literal 1072 zcmV-01kd}4P)k7RCt{2T1{@#KotI*q_#(G0*TaCY9&Bo)2=uGS3u$-uwu^* z*sxk-uvFqym_uCrNmuE z$F=~r(Gp-=0NZE@uq}XXv;^1|z&2U}Yztr;EdjO#u#G!UK+m=SCNQ=og}6c(ZW`y~ zm?H=n;+O*ff`9=4IKT9k{VnGR@H|gSDLr+}FFwHg_6hf&zJ?H25Fg(FUx4uWE9l=< z$F+X13D;rI^CW;wS$%w~y_-P5DsktNU`v2)0c@isz_tLk;anZCETU*E1sBg9 zARGI>UrI#CLPXQZm=qgFfC;)sm|!|8fi)qZDjAl=KB18W=+-6$8SB?xLue!cI;z~i z%KAXt5n2xqxD8qYYztr;jk^n6UtecQ>*DKY0Kne>g!Cvg7TIHpRF zl%@V4;U;HDHD@$31m>kLD?D2kz4Nov(o*o@qsPXMYSo%WDBH6xD9ii4kI8tFk+4kM ztLP0!!_uDG`Pr$|1wKDJl`8Wp=ssSyU!BIqBFwV<>@Ugjuhs_uZ#w-Yfw|DCkb(>QuFgvg8_0!#ZcW{NPmYg_o)WUK z(z^fS_*)gS3}+HDNs?T(Wy%3%a5?d*D3rqVUL7cUM41QZ>r8Mp85S->sw<~y49@w| zo6;Whz1)m{K=A;wc9kXd5?H^Lsi4y$O=D-R57f8~s!DUtbIK5DCIyou$+f3kJOY6Q z1n5FD#&XZfJV5m#m#q&d1dz~Vxw23&Jy*|v8te0}BIg0Ra+C2-?CkDkx3`_$JujL@ z1%gbTK;hwP0YvbUB#}VAolGdZy3)U?5KLvR>QUR$I*Wn&8SHA9DUH@JbjU_cH qRJd+^U_~!Sg}9Wu@}`#(F5oY`MQo5t$1HLH00008_5UjUnsPv-a^kkl|rDDG>6iXYw4vFdPs8!ZP=&x)|z<`J3?P}MV4+wU4c9!|RdGF1S z6(EsFBoc{4B9TZWuOO*KcOVR1H%E;1pzCI6y>0iQX$EY&4*<|K0|3BSFP3^{Wi+kK z{{F##FY4J#%PS*PB9TZW7fIq54o64NM~wA(d3E*rOq!H)@6iItWHNKNO}qhIcK}sQ z&)q)p22j;Bydf|v^P6r#934F$0nsD>qSF?Z$=#Q2ey!^Uu3Wh$=TJJz}2g(LMA7HnY0$!Cdxw+X#fCN&aH4G_zmJ^(&$Sh5=r9D1H5bf zPNxL`$mR09p4mM#kis>fqS!(e)jZ9+^d5ncSjDXVMx^D%43z zCJ#Cq{`&2oKqIQpyf$u2VreA&`*V749Cv0y5@f6|WYW*B*?4d>T#UC(6k(ncHx%Gx zM5i4t-YAp;V*I0f-0cTWZsQF1fYY3;?lo$Gv$afGgTq9T+nZa$J%<9FCTZ~83sZK_*YVX_uXsMpz8+mmc{S2noT^se~$~y zTNc*VOE^5(M|R1;_U0Cs`Q-3mAMd^Yf#5lDA+Q(l z#wxRW7`j7VcAcT{ED0iaCny)_nu)w+;nwXt=iBRZgd1SmPKr1@*yq>e0bv4ZwrDk* z$SxT|D8z|?2kh?D#0NY%K+Pz)b^A`hmHjRc{P*476HakOFn~X{{qwe>DuVcGr3@fA z#WB0br$E0!;|4bXjaH*x7s`Iu9@8vMz&fhV>!2yBJa5V&bz6*-+YVgl7U9Oj#jgYyk!ZWv*LmRj61x&xy47n zQLm#~DM$Y0Y~#^S{Ml-yj6$&pVC)?vayhq>+TPsyA0(WO)Qe7g^yeSHqfxKpi?8p_ zH9|jr|J|riEMjfFguG>;)ofySr^by$b->uz=hywSb0MAi^_QPVB%UY~i}>*7N3jwQ a0RI9agXLz8T{`Ok0000O03DNFy%!^aBOcwJ|R4&9y`y{oOeBsP2(%Z)X&FR?N_y`rzL zzcibHYa?^R0Tu=pH3kI(MutXC1`ZzvhlH;NJRrH1TbP_<@)#8i(t&vG0f8CO5NRd` zCSeAF84O^Z%S0uZHUkZr!wU2ULqq&JpvC#_P4-rj7Cg?ce*gQs@b)Br{{OWTzK5Mp z-@0VVxmS$)*3bJ{etA+c3t#);6ve~8o_%5T`Te)LrOLyMmKYOoTLeRiF}cqePafpulv6E58si+}KZR}_PZ@8V#AI*aXaUqJmY%HMGLWymfT zj@P&Uv&kIaXeGmUId8kSzrX+W6`T<#*T^2Q=)3y(@#96UGX3ttb&08)r5k}^JZ;Xy z^pDIy?;j`)iLO`fZ*Mn<-}}}0ckK14dW>eP%hKc@Y2D-EnWBsm$|%8z8UaA5)$NHI zvCIJ-vJ5O~DiWZu{Zn+mu3=j7ynAk)^(KK85^X>qdTB1*mTUhv$4m2T?fZptYcjsw zZrq>r`n^oU{dZZ67fjB!hu1E!>2-j`7KSy5h=d0LL-NUmb0QC$7o7w7{rvg!-D1fK z9BZ<_C7rhP|Ni}Zw`kJG!@u;R3cU9PA9%#xAi6icRDb8J-BpLp_MT;#qbK>`X6ap{ zs|>4md20Ip{=2V4)`79~+|M`SYCoN1(t91m?2iQP5f;#J2c|TXFbL~^JR>eXKG^Hr tGiMWX&84p%K3oXW%*PDMFoOofe`Y_F^FYB_FMSutO`fiPF6*2UngGweOez2X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/gui/inventory_manager_gui.png b/src/main/resources/assets/advancedperipherals/textures/gui/inventory_manager_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..89175818d7edd2736f2e4adda6354812f06d15a0 GIT binary patch literal 1300 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%U;1OBOz`!jG!i)^F=14Fw zupIMraSW-L^Y-pT-`iOt4G+(E=-yZodAM64m7k5X_<+iphrbt#b8hvmKIr%O&iBf? zg$(T4x%Y0kS@}HPoq8a5#y$H8vH!W(cgZK~%=5@QYT|qPhXCWXou3~)pSEYuo}Pz2 zrN)sc5MQHb8H zuVvW&>f^`4uRWFXjz288@gU)~-@bjjT>Q&=x!-4=Kg=)W+_3TdJl+GQoCl8W*<9?+l8}6kVTUTy z2E%lQJ3@>%Zmd7Ya8JIt?7%&a1IOx0**^T6v6=bXvGt7MRTULK-tPXl^L?YOKm%`u zWAW-3CWjde4l}$P^k+Se_N|+B@I6Tm+_3pK z!?Q{`pebMZ4UWrv%Z{3sDw+IeOT|Gqh2n1p&yV*y`1|`O_Za#uzZ@|wHR`YPqZ}5a z^y|erEW32RGbs2Fjm`iKEVFGty-D!IoY?al1z&8U&>*Ybf*jvYxGl(qdw9cUbH-d& zvvmIAx;tEFw&ehs*NgAW*{1_fNRZ@&pG?!wV+}+)DjT^NlQhJCNW?*gNaxVDu*4M zAsodB5-@>;QXm{cKw79I6_8>e0TT^}0^tZE5R%Y9#~+=x{&)ZE?!5VC-rM)yY{p6d zW5%1zHUR*PeU5vb1^}WxLVy8GyM@M8M6TcBPaiu1*iS9q0HA-#$LnxlQjvTFjYkAq zcD|%w1Y!A+gRg3!wqgTwEPMz&xwXAoe^+M`+_!Y^jvsVQuG#E_n&hDtjnma*P{TVl zM3qO+19Opuklxe7&ULxT&~U!M{^-P0X5k|uB07ao!L!@j?3n)E^nJOOR+Uv%n4gpk zPn5butyTwz!R^0vb#<+4YC6~PvYKTn(G|(;>{mWTr_Q6P-n+q;X@OZAQ7jh!(zKa= z5sq|gm~)zd(U~zQi+6GR+omfy9ASCDJzMg~b;$BdfsSt5uu^_gSqV90520eApj{WF z8vP;b%!{9#ey+04Bj?Mzt$?0qZTe(^_CF-2CSieIZhwWu^<_E(YVI`3pJ-s zfLqlyHP86P>E2?S-C*vfX>{q`zsCg`hdT3DiL~N)onGPN4c&1@?`60q8q<4t{?X?< z8{;SZ(=@7NJi80EEk_n8eM9`bdYz$BM!(GT-?f^6v{|05%{mPQ6l~vt6ODTR*}t!@ zW;ra$?A`q^By)3f45p<>3Kf*k8-{D^KN&UCtVjKJqqR`gBvmrr<=L!tTQoG3Ke83F z_UpV8b$oC(k;P)IjiytFP#!A*Dn5L~mjk2KA>vz;wQPehPG(um=mMo;3_a4Cma5p< z-WL^!6QAjK9H_@_M#$DKR?9qF5n&(G?q;3JKkc z!%%YTqYGTz+%6k|Ag>TiZuzQhtg8R}`2Zd2%JXbb_3GJ1PZX+x$>fCd&Zq3fDn;|< zlzZXg)f6_Mu@l^awSrc1?DS}L392U&;Ssv`p#~R`_6a7N*vb?n9T&m{m%MAkTgeX@ z(UW2>ArJW-nL!0@1HGGJ*OVG{svQ@|2nakx8WUB>c-W5ZMT42)Mu&sDE9_()-i$Xv z){Ms`=7HPY+n2OjQxu~<&K|?1TGA*K%|b6hCC%v<)mMdZ@qU`&B-c4dYmSdmp7T%x zkIM~0qtO@f`bSGoh4HSm94+n3Hz@Mh`ufrF(C6dhkpnr`To_I(0rzN|ZsV()n?o!; z$TTv}Qo_se{4Kx|>Y_PtN%ecRO#cRwQZm=|K+ez47+Sbb_e_Ip|Jr{pTE-e=;bL$5 SvF^*6>xhrHzZd%mHvKO?S3ZjX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/book.png b/src/main/resources/assets/advancedperipherals/textures/item/book.png new file mode 100644 index 0000000000000000000000000000000000000000..bf4aae4be8afc0de9f1e8c8039e13b8d5f230a3b GIT binary patch literal 528 zcmV+r0`L8aP)Ncf& zFTlF!Y7o2!gV1eDFTe}vq##tWMFdF*3L+xTM$Alpbdd}wlAg_hkMq3e zyqxn%PnK2~6P}-?Q3bJauu{-a3R)oKMHNK~EZe)@*7OO@N|RgXo^e9)sLp4rAK9-o znaId=Yc97yx8{;~od!Tu?aU9iwt8mqJM= zIsSGEAW8lf!p`HO*gl}u5o}K8Fb$pepD(2N|KMQsV*7wM&sDTfQ@p#>QPnKM`sKxh z%o(Ja|)6jA61S?-H>VRqVJ)Z;Rn>LUMPg|0oErNetQ*U(u%IkR?=Nk7; zAkQR1&&&2MJNGXh{fj^#h<}8DN1lhbGX{J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/chunk_controller.png b/src/main/resources/assets/advancedperipherals/textures/item/chunk_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..618db58d562bdf240e09f025c9ab61b2c43613f0 GIT binary patch literal 461 zcmV;;0W$uHP)rlOb;uQ51#0OL>SLQNs_YYN)7K1p>sZKy_v9`ms}k zX%j}(R5x{G6JUbHLq(hPWyOx0VMCZ70HPH%O`G%}X5X-#EvkYi&%NipbMCp%B=L~* z=s|4YaTnMz3zF<$LEXP_Q>Whbc`SmG=j;5!#SSx?2Zik@4xX64hQ?fQ99vu00000NkvXXu0mjf D>%PzC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/computer_tool.png b/src/main/resources/assets/advancedperipherals/textures/item/computer_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..ecfe966c92c3a95a32197f473341bf2b7fddff17 GIT binary patch literal 426 zcmV;b0agBqP)Ll0QpAQ5eR5$3M*u=L-~9KY~khglmLLb_f)|fSW^! z#+}Vi5Mva(kV%t6#1Tz|qh5!m6u?<|ST}Y);0Z^$_3Se^wwc3SbG8sJ23!O(gC=^Zr z&{|7ApT~7wwAKp1_x;TrXsxAOF5|i`j^n6oHjC$ZG@Dn83sET;W2DpRh%rX2wODI0 z#)Q&X3nrbSB%NX;ylkLWKTw|NsV@gR>5}a2A2FSb0eI`TaB@{O9NZBMuh+ssFk8g93V*yl$jM_-$yo3BEn9(#C&80K<^%^WuxEV&<_5pPcO{d U7Q{&fJOBUy07*qoM6N<$g7iJHJOBUy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/memory_card.png b/src/main/resources/assets/advancedperipherals/textures/item/memory_card.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd876fe596c0cd4f8006f29e25c7c7a56e07fe6 GIT binary patch literal 352 zcmV-m0iXVfP)zle*qdl@2*!ot9Dn{sJxh1<(T0KU7=Os-wfnwcM|%(H}#_g4uBvrKGk-sAgi&d#r} z>b5>yvuyG#8EIw!WNAVAew*XNPaaN8JyRxwP`m-?v>@oPvp2!Q_7_(D_tZQ~wPvWn z(SCQRffAM1z6J_G&|&vrRyQak^m^o3O6c|a=0ZwI&9>$0@;cY24Whdn0H(KMro5I; y97OyUktc~z1^{Ed1E=ANm#4>~K^6S{U-$usE_G=Nvf(-a0000$&Qa5C?y#PCa5u2yS-I`}fFqLs z|NlRK;MmEZ@$Q#rJbV&V*Yhg`ur>xd;e$sJOFMM6fF!#t^PMPb@KN;7jANg5g(D&Mur8I(#wQ^s?RB^^B@-;qT s{tC}89~8;t+B0wB(Un!rC>oa*TGtiq1p00i_>zopr06gk-Jpcdz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire.png b/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire.png new file mode 100644 index 0000000000000000000000000000000000000000..38b4ee20a92c0edfe7f3cdcc7ac803ed046344d7 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP_Wn2 z#WBR9H~G*1|MtwP4V_ANn-4LFl{9wR&tJfDYGU~NfG6RnUl}gq04k7Y_5bnlhy5-I zo_3pE9g6Og#B+|c7#uO+aVYzAWWN8ucDsFFi;e{GiWVPQPW!zJ85GchxCE{Usn#C2*J&|wUo Lu6{1-oD!M<(t}X- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_green.png b/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_green.png new file mode 100644 index 0000000000000000000000000000000000000000..5e20e64b763a6bbdfd1034a47d3c679614c02471 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP_W6< z#WBR9H~G*1|MtwP4V_ANn-4LFl`!6qo~Y4S^ih(%>yL8#&z=h21R%JvW}D1H4_-yR zas@%-a_J^P580bT0I61*Bay!Ztxr~ zVC;SpyT?qZgprw9X-lHnCXahZUy2^PxaR-^!_+|S;BOa?Cj(u>;OXk;vd$@?2>|Fc BN^1ZB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_purple.png b/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/big_fire_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..3fdccd14de738e50da4b814d71fb69e51d3eb1b9 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP_Wh0 z#WBR9H~G*1|MtwP4V_ANn-4LFl{AVzvkzc;dTsx7jZdY^pGtm|IsgO$g_D>)C)&)p zn(|9P`H1JICaK95Z4zyaC;Z|P|2?+fwD!e4#TQM{|Kp5e{{Ljzzxm()|NTwMCH;Tg z#Sg2uKV<#Vm0NhVYJvx!XE6p9eaK!PC{xWt~$( F695~NQs4jp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire.png b/src/main/resources/assets/advancedperipherals/textures/item/metaphysics/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..8986741f142c5f810d8461199e935ed1d7274cdd GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP|(!V z#WBR9H~G*1|MtwP4V_AN7qeYB*wAS|{||p{4QIa1W77vGR+sbi%kMw*n(5fZ784mB a28L}51aBwFN9Y0#VDNPHb6Mw<&;$TZe>wNzYyBZ2j6nWX1 Z8BU}N{Jx~P-w>#u!PC{xWt~$(697qy8N4Bg}x(J}qe z%nbX?BG>f1=VZvfop3;N-ib|3GOsIiCnE literal 0 HcmV?d00001 From 2f19a8ce3182bb7692bcf0a63680a6e13f8747f3 Mon Sep 17 00:00:00 2001 From: Srendi Date: Wed, 1 May 2024 23:29:52 +0200 Subject: [PATCH 032/188] add fluid and gas detector texture --- .../b8526e444ae7356037f3a813274f6835d1f3dd16 | 6 +- .../blockstates/fluid_detector.json | 57 ++++++++++++++++++ .../blockstates/gas_detector.json | 57 ++++++++++++++++++ .../models/block/fluid_detector.json | 11 ++++ .../models/block/gas_detector.json | 11 ++++ .../data/BlockStatesAndModelsProvider.java | 2 + .../textures/block/fluid_detector.png | Bin 0 -> 427 bytes .../textures/block/fluid_detector_back.png | Bin 427 -> 510 bytes .../textures/block/fluid_detector_east.png | Bin 0 -> 947 bytes ....mcmeta => fluid_detector_east.png.mcmeta} | 0 .../textures/block/fluid_detector_front.png | Bin 947 -> 499 bytes .../textures/block/fluid_detector_input.png | Bin 499 -> 0 bytes .../textures/block/fluid_detector_output.png | Bin 510 -> 0 bytes .../textures/block/gas_detector.png | Bin 0 -> 429 bytes .../textures/block/gas_detector_back.png | Bin 429 -> 508 bytes .../textures/block/gas_detector_east.png | Bin 0 -> 1021 bytes ...ng.mcmeta => gas_detector_east.png.mcmeta} | 0 .../textures/block/gas_detector_front.png | Bin 1021 -> 495 bytes .../textures/block/gas_detector_input.png | Bin 495 -> 0 bytes .../textures/block/gas_detector_output.png | Bin 508 -> 0 bytes 20 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/fluid_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/gas_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_east.png rename src/main/resources/assets/advancedperipherals/textures/block/{fluid_detector_front.png.mcmeta => fluid_detector_east.png.mcmeta} (100%) delete mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_input.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_output.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector.png create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector_east.png rename src/main/resources/assets/advancedperipherals/textures/block/{gas_detector_front.png.mcmeta => gas_detector_east.png.mcmeta} (100%) delete mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector_input.png delete mode 100644 src/main/resources/assets/advancedperipherals/textures/block/gas_detector_output.png diff --git a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 index 084bc72ff..7b63c44da 100644 --- a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 +++ b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 @@ -1,9 +1,11 @@ -// 1.19.2 2024-05-01T21:37:27.0678801 Block States: advancedperipherals +// 1.19.2 2024-05-01T23:13:23.0739928 Block States: advancedperipherals 5e28ce1be9a6996d982641e5df1fa7162090b8cc assets/advancedperipherals/blockstates/block_reader.json f42bdde60f84fdb312f7cf3b2be461d9c11ebdc8 assets/advancedperipherals/blockstates/chat_box.json 1227aa092fcf1327547ace6ccc9db230e45891b0 assets/advancedperipherals/blockstates/colony_integrator.json 67420f28031606ca03db9a044141bb22b0fa78b7 assets/advancedperipherals/blockstates/energy_detector.json 340b5baa62e5e6a2c35a05b4411be5937ac2bbb8 assets/advancedperipherals/blockstates/environment_detector.json +f40e0ac205d0473908fd957d035dd747dc64e26a assets/advancedperipherals/blockstates/fluid_detector.json +bbefa012be11f3735da4d9deb1f0d2402c761cd8 assets/advancedperipherals/blockstates/gas_detector.json 57c00996bcf1d783116a9210842f246612089555 assets/advancedperipherals/blockstates/geo_scanner.json d1fe6188b0b0ce8779cb9795a746177858cbaa41 assets/advancedperipherals/blockstates/inventory_manager.json 7f82e776900e3d120cb1a06ec975731905dcaff7 assets/advancedperipherals/blockstates/me_bridge.json @@ -17,6 +19,8 @@ dab55424ec184c5495c7ca11e5bbe77210e04c26 assets/advancedperipherals/models/block 7e207db9b2b170f52565c8ed23bcc92762be6c4d assets/advancedperipherals/models/block/colony_integrator.json 1e9a2e3931bfe77f2d42a95c539b365c4517095d assets/advancedperipherals/models/block/energy_detector.json 434c2505b18d1313c0377c6bf8d5e4dba93765cc assets/advancedperipherals/models/block/environment_detector.json +583a56d88a31a4b0b6251c02fac76d32ed94fcff assets/advancedperipherals/models/block/fluid_detector.json +b97e72c395e4f3a78ab30cd6acf02adbfe29653c assets/advancedperipherals/models/block/gas_detector.json 51ab0a2a78453e711e6aa3c3020b9658bf379628 assets/advancedperipherals/models/block/geo_scanner.json 32f7941037838f9d77c5c3a4eb3b56c8786e500e assets/advancedperipherals/models/block/inventory_manager.json 674d6ee74ef7fd0360c0e1ea0b2e21734f67c096 assets/advancedperipherals/models/block/me_bridge.json diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/fluid_detector.json b/src/generated/resources/assets/advancedperipherals/blockstates/fluid_detector.json new file mode 100644 index 000000000..6641af423 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/fluid_detector.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/fluid_detector", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/fluid_detector", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/fluid_detector", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/fluid_detector", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/fluid_detector", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/fluid_detector" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/fluid_detector", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/fluid_detector", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/fluid_detector", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/fluid_detector", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/fluid_detector", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/fluid_detector", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/gas_detector.json b/src/generated/resources/assets/advancedperipherals/blockstates/gas_detector.json new file mode 100644 index 000000000..aee9fc55d --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/blockstates/gas_detector.json @@ -0,0 +1,57 @@ +{ + "variants": { + "orientation=down_east": { + "model": "advancedperipherals:block/gas_detector", + "x": 90, + "y": 90 + }, + "orientation=down_north": { + "model": "advancedperipherals:block/gas_detector", + "x": 90 + }, + "orientation=down_south": { + "model": "advancedperipherals:block/gas_detector", + "x": 90, + "y": 180 + }, + "orientation=down_west": { + "model": "advancedperipherals:block/gas_detector", + "x": 90, + "y": 270 + }, + "orientation=east_up": { + "model": "advancedperipherals:block/gas_detector", + "y": 90 + }, + "orientation=north_up": { + "model": "advancedperipherals:block/gas_detector" + }, + "orientation=south_up": { + "model": "advancedperipherals:block/gas_detector", + "y": 180 + }, + "orientation=up_east": { + "model": "advancedperipherals:block/gas_detector", + "x": 270, + "y": 90 + }, + "orientation=up_north": { + "model": "advancedperipherals:block/gas_detector", + "x": 270 + }, + "orientation=up_south": { + "model": "advancedperipherals:block/gas_detector", + "x": 270, + "y": 180 + }, + "orientation=up_west": { + "model": "advancedperipherals:block/gas_detector", + "x": 270, + "y": 270 + }, + "orientation=west_up": { + "model": "advancedperipherals:block/gas_detector", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json new file mode 100644 index 000000000..af828747e --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/fluid_detector", + "east": "advancedperipherals:block/fluid_detector_east", + "north": "advancedperipherals:block/fluid_detector_front", + "particle": "advancedperipherals:block/fluid_detector_front", + "south": "advancedperipherals:block/fluid_detector_back", + "up": "advancedperipherals:block/fluid_detector_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json new file mode 100644 index 000000000..4a2437d28 --- /dev/null +++ b/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "advancedperipherals:block/gas_detector", + "east": "advancedperipherals:block/gas_detector_east", + "north": "advancedperipherals:block/gas_detector_front", + "particle": "advancedperipherals:block/gas_detector_front", + "south": "advancedperipherals:block/gas_detector_back", + "up": "advancedperipherals:block/gas_detector_top" + } +} \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java index e23715b88..18ca28cbe 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java @@ -26,6 +26,8 @@ protected void registerStatesAndModels() { peripheralBlock(APBlocks.ME_BRIDGE.get(), "front", "top"); peripheralBlock(APBlocks.RS_BRIDGE.get(), "front", "top"); peripheralBlock(APBlocks.ENERGY_DETECTOR.get(), "front", "back", "top", "east"); + peripheralBlock(APBlocks.FLUID_DETECTOR.get(), "front", "back", "top", "east"); + peripheralBlock(APBlocks.GAS_DETECTOR.get(), "front", "back", "top", "east"); peripheralBlock(APBlocks.PERIPHERAL_CASING.get()); peripheralBlock(APBlocks.INVENTORY_MANAGER.get(), "front", "top"); peripheralBlock(APBlocks.REDSTONE_INTEGRATOR.get(), generateModel(APBlocks.REDSTONE_INTEGRATOR.get(), false, "side", "front", "top", "bottom")); diff --git a/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector.png b/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector.png new file mode 100644 index 0000000000000000000000000000000000000000..11e2eff13cb000d6c1fe4bfe1b5e577b9e25db46 GIT binary patch literal 427 zcmV;c0aX5pP)iw$%y-kseYk0fXR zT4Ru=Tih()_;e)KjP%t+eq*!R2S3bpFG5n`B>Rh-)gF=vX}SdwUHpw&YtDO5&x_-s z?U?&g;m{iNrGgLw)>;T5nAp|U+EBs6u3*Ep!@&;002ovPDHLkV1mpEy59f* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_back.png b/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_back.png index 11e2eff13cb000d6c1fe4bfe1b5e577b9e25db46..35fa025c61d15b74e83f38cd211d8b54b28d57a5 100644 GIT binary patch delta 463 zcmV;=0Wkin1O5Y$Ie)N8L_t(Ijct>^Yui8+$3HfzWr3?YB5hhqA*JAgpoIjS(Nl+R zffPD;>Egj#|B~(=lGS6uTju-;fw&+V($=j7Y4Hy^_;Rwq9mJjQY=1%M^nLf<`+nb@ z3MU^vE-@g4FhB7;Z-ZAHfCI2o-O+?vmt0qKsg&&PJtdXWDt|tnjPn8jm)|Y{$g&K_ zaW>v6rf~S?FjpXi&|Pb_(CU!PruYvZk<6wR|9kLL+j2b5v*bom-|D7RDC|CdV$H%4 zLTq?@{rL=lUaJAX@#zHsS6@B>ut+5(*F^|HQ7JIHn8_7Cpx0^;M{^x}P;#|`qBs_Bce?k0bpyP#uqxv!o-&!`z%X5Ek{~P79r%3sKe{U(O$^IJL=p-|_T=w*% zFqw?>+R3tvWHzN*4K})MQ=p0}dk(Dbw&_=S+%^Xj{{aC9;9S}4y>|cr002ovPDHLk FV1l=n;~oG2 delta 379 zcmV->0fhek1FHj&Ie%SAL_t(IjdfB%Zo)7S93o@m0x2m%^cQUp^dYUpd-_f;RZAsE z(=;TJ*f?0ChscW!bT8hW-5rl7>Ak!zkMM$s{1RI03*2DK9gGHVp zna)t;8KhEZjbRnnNVV1wM8plLRIu!1cX<^kkxE@E2p3MdkNMtctwRsebj$AggZ~i{ zQTG*EW00m>+$`VtbR^e|^wmUuW3$=^Kg@M6LQ>%*`-_{^9+C)Yx&;wk{Eb>`&U;VK zi{qi~nEO)U&~zH~rGgLw)>;T5nAp|U+EBs6u3*Ep!@&;002ovPDHLkV1gcNwle?# diff --git a/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_east.png b/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_east.png new file mode 100644 index 0000000000000000000000000000000000000000..61d6701eb855a037ecd72cefb03037cec891e8e8 GIT binary patch literal 947 zcmV;k15EshP)@B~85bp!L>2K$N23 zf1zId6Z{7}3;qEfMG8Ghu?oEiITb>xmByw`L(DIBHk(cL@OHP8>};SSlD7K}%eFGI@M_#K<|U z9**=)-E+?AnNDY%5rh!b@u#iNu~?jH2ZKHU*?sond9&FNLNLxb&0+oRHiAw6w$W@h zIOkCzgw^YD&Z{MZ+Nvdk%JeL57}b)|?R069&Im$?S{Z;*E5qJvu-mg#u9XdYuTjIS zp4VvvMhnL|rv`hk0YEO3i#)7ePY4mE&q`TqWQc?Y~bp?&ZwS-n{YfF=OgbsGR<%(iXD7}ZnRw(YYKa=AMIY9~i?H!`)8 zBTeJiQrFv^mT3x2;{Z(48L)m*bKardY3)`lO>3EJ>)Oud&i0mRngBFSGfi`4^?qmT zYkai;AhL4r?#+c;)D86~o7cCqr#}xEfXcxS0Da3@+<3w{tzOO0DlIN7dd`*PVGI&M zJRk@OH4gxSkf22yD*1)=02r6Ui}j0N<(?rHKIGl_f$81sg}N_|=ONUGiH#rp zNhtY*E8>TWn~+kTa6Itwph!YVu|#k@?dd}pKR6ch@b~#8=H+jQG7Cg zoumZ-I=v16Ns?e$R_-n5Bo00tqzZ%(s%yR8Fgk?u8SdsY!uibLe-CezEz5BnL$2?4 zjc!tf#EY$MBa5OCBIoVL_n*8!|3bevFvb$gIHF|R2q7p+1$vjGtF{_fT#vwC(7O1h zxQ&vn6j*Y5^q{WK4ym{vM^|kEe?j+u@&tfaZ=Nd!aTKKrAl)Wi0l-5zCh!-G`Wg5C zKR~vPkfy$jBct;}I9Briem%_R&ym6 zzkOF{@XI%X(hCFZy?jmZXQ<{2`>p1x(fDZC&=1e!qj@*VWk>P%|3(yL`nSVAfm)<5 zE|(qkNKB{WEW{*92;;f>hA{vD002ov JPDHLkV1hO;+1&sD delta 919 zcmV;I18Ds71G5K^7Yd*V0ssI2id%a_ks%j<17%4>K~z|U?U~PO6G0Tmzey&^PT6Q% zut|wUiX~0F^`Q0EKR}eC;D4cB{1f~KJPZB-9z_a0NwEsO2ssr(s+Gp3O+(Btb~c+$ z_3(DLlk9AuB9gZI4$HimFf%(dpZ(5zi9CMt6s`#&yfWupt|1oy128i^Lk<-Z$t1ad zRnIjkOz^iAD!&gq#>XPgm)5Y+Lftv7JjC4<_kC4pdyX#_@p3&%O9279joKrWMuJgi<%2oa^_J8N)FE(4$` zIr{)0oz5&Tf6-IA+^nZ`?{}Ut+62z|{{DA)2fRI@eefz-y;%owr$23 z)l=EF?XwYbxjO)ACr5KPGPRQ3EJ z>)Oud&i0mRngBFSGfi`4^?qmTYkai;AhL4r?#+c;)D86~o7cCqr#}xEfXcxS0Da3@ z+<3w{tzOO0DlIN7dd`*PVGI&MJRk@OH4gxSkf22y<~{`?Z!V^6p;-wI!v)vF2fOCb*c{w)t@`T(F>GUjtr z#SLR_2>|AEQ*iO1%lZ%xt+BTmMZUFCM$orj%|j3gWLJ`hP#-4tzJ!3k?gI0zlr9R= tlmb)Tmk@kwI#0fJ*e05XiHRTn0CA4^xNyIVPF!4t^>XCY=ZQ~7|<=#1vxbI!~Zjz4`~ zp+N|tf8sb!j+Y#O1yHNj6d}hY+g4m0MeOYC5=W6yd@`M+1pqp|4gg7#U|Ck~E$1W- zJ{+V9gb=E0z1}c7g!38h<}-#DI41BHjQSb(|35&sjgY3kj3cA-LpWCQ|9(Bq z6(~Y_AeM0!s)Y!5sjF{Z?}&7r%X1XYk86g3=2E?7e(V@Moyz z3;V6+s?qpp*w7Epu%4J9K_y0x|W%{?nfm)<5E|(qkNKB{WEW{*92;;f>hA{vD002ovPDHLkV1jb!+Wi0k diff --git a/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_output.png b/src/main/resources/assets/advancedperipherals/textures/block/fluid_detector_output.png deleted file mode 100644 index 35fa025c61d15b74e83f38cd211d8b54b28d57a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 510 zcmV|a9vcMh0o$qXaLFn{-_ul({-<=94 zA3iQIAcQbK@jP#XR~&!?uv6X9gj$zeS97V9?Cm`zmC`Cco{aMX0GHn`0m!lp$8k2^ zDyDGw<}gSp&$Hx4QQzvOR4D8|eqznS5khQu zd;R$gfL^Ns!13t?09Ri=0kB9VCD%m=K~X6%yO_xpKcLrY5Jz(zdr)$s_Bce?k0bpyP#uqxv!o-&!`z%X5Ek{~P79r}=+>Zz-zD{u z$+C=OHl4`b zIW&ZjCOJ5EEtNy$t=*Qrcz1SpJf39m@c6Vx5L)Z71QDI!9s>XY0NE^Kz~@pa#;h?| zF0WvXiO8#Mg~S(9DM+P|%@@4v7kqu(2Y@7$HlC!Y$^zp_3TsR>$hVe7^xTAqc(5u9 zWb*~8vVc?y))-cCj+BTXwAS2^N=3_FcAqzq5~f>Y5Q2$)?VO7h+}y4hXxbX-^a4#=GnP&-xaXtmG=7S2B>sla z^*ayvv+Fe1OpG3msP|-NP5*?i^#=n!hVtNah#$uv X3oYyA`Jn=k00000NkvXXu0mjf=Zn1m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_back.png b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_back.png index f7ae0047a46c3f201c6cbeda548651366f8d7d69..e1b8d33042a8c871833793ea5560699599ba4a6d 100644 GIT binary patch delta 461 zcmV;;0W$ur1N;M!Ie)H6L_t(Ijct=pOB+EL#(xRh-7KVQTx>Oz9z;wa(1L<~0P&8*K*#z|34+0ZYQnI?bhLX~0K7SYviUt4|mlpu!d5-6K zb8nr~*#59xC=fyz)<&b{Fl6Hq(d#9$@yLn)PyZTQUKoas+$8zquxS+ zuy590p66ua5w%)8$F@j;ZmR8h@N&0pzuM!XIoNmx!=c}Btm(jn00000NkvXXu0mjf D$2Z?_ delta 381 zcmV-@0fPSg1FZv)Ie%YCL_t(IjdfB%PQx$|oJOwQRol=|RprVHfJ1o*NW6>>@F5<+ z1wlD9gpejVICd?SL*%X9mc4j)c6U6UWbp9#v_}wH>#zh7o!}k=0098mEMvguQYpr) zF<36IV2z2$t8InE7g8xmrI5`RyzCczecT6tB$PIuq^QaQ<9|sCYfLoAx0Xfp+=PgD zuqq2=^98E1fK&?B7*=tPl!zd-*4&UvMay1xpEr>bsnn^0c;S$TSm+HA#UAAOhTRPZ z|0C2|_g}#pgFN5h`DMhXCpl+is3r*;Z|m3ShdJ*>Oe(zOaIq)4MxJk=wLbY9iHP&T z-Ti96vpw@rDt7Fw!B8p)A>f>Y5Q2$)?VO7h+}y4hXxbX-^a4#=GnP&-xaXtmG=7S2 zB>sla^*ayvv+Fe1OpG3msP|-NP5*?i^#=n!hVtNa bh#$uv3oYyA`Jn=k00000NkvXXu0mjfHkP)Ne1)?^IHaIyfA5V8j(Cd>!C0ixm) zO?(&XLm&Cv_-bGwF(ewE7$QP2(Xruz5i>20kfl1L>~DSWThBs!MG{FA`^$23c;)45IHJ>Og~JNZ-+%bPFlwf0N{lfYLrI?vC6ZQ5qg2w8 zR!p;ET1lUkv}9b1Q|FRtn$1RohB3bs-rAnAj9TchPQU!J3ZPrB9n=qKki8!0Z4@>c zfQ8k;l0Hi*4QX*b&3lmPQpQ-hvH>vrwhf+6WO@xX8x7MmCCc$MejR|l>aM=4%QOj$v7Mcd&KclyLi4~Y<$Yrx01ND%`OSy5tr zeX+j2!^0oFPvd+2Tkg@N4~0GT1q1N>*`lH-s;XA?{Wq(xTCEmtzf@!ZpDUjLw3@w_t3-NVE3a{eJeC>bg@2xhP$F5uFL6 z4<77Gy^(;M2PXz@BrYfq$y?IayHZ+BBjDkW^U!U!wzg*`$5&40VSXu0$^an0tP&E$ zgK)hB7ZT;_9Hrj+U@wh4kN~DU^uY&-fQNtwJI=s^6j6%B+~oMmDLhz4jr#}KNci!< z-GUPd(g&e`@I~S`{DU(e@DT7|$8Y%ur=KoY=eU3H_S2TpTN<5E2_X+o1MOA`p??q| z;jIr8o=99!9s>VhcX*yWNZK!Z?Z-ptu+IGhY}WM}qJW>VpUgKYj2-0{%R}g~SErAy_Zj9iBfA0LWeo_m_wV zI(Z=f0Kjj5$$jzwps>mO_LoFR`0X!I{0IIa&gm-u-c_Yd$qe-ItU rkxF>;06!#7+h00Sb3u9dYxLnK;g+b{wt-|!00000NkvXXu0mjfi_z6O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png.mcmeta b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_east.png.mcmeta similarity index 100% rename from src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png.mcmeta rename to src/main/resources/assets/advancedperipherals/textures/block/gas_detector_east.png.mcmeta diff --git a/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_front.png index 106e4b8295b7d18ef2c697db21fa3d57de66ae5d..fb82941be19f7c120086609968b7e051ff09fdc8 100644 GIT binary patch delta 463 zcmV;=0Wkjk2k!%r7YYyv1^@s6AM^iVks%j<0ij7mK~y-6ZIj(<+dvS7KO5EZg5x@- z`7uoip~a?#6cR|DAXmOjppbXy+ZFr}x$s45r?pB6jhZN=#j$0>W@UkMA$GM}Wk6_j zRx@+X%xvlO?DGoCq?Gn2LWlycF#r!>y|Hcp?N@x?V2M&}ZEce%H3PfKIO-X{R&Nr71HN8t8|+oZ zcNu7^ntG?zr&ez=j(P;)fb)|CfSuicHNzlLDq{fIm}~|Bi+Dm14j7K|ng9O}kdG0v zt}heiR9?jQhW?jxRY*{VY$29Oe%NXC8IA;tctWk-WH=H=hPJ!t4uI0Z@zF{L@4atx z{VQ-9WhVw`y?sY?8=CXd!ST_m+x_Iou$SlQ$-NuZsxbJ!zYmmk_iw^$6J!TESF6H2 z+NRS<-o!LbiRUvKjb@?ROAK^UEzg5|w{5*z<4b+8?HLxT=SPStJv{&b002ovPDHLk FV1geY-@X6< delta 993 zcmV<710MYE1N{e(7Yd*V0ssI2id%a_ks%j<1FuO$K~z|U?U`>+(?A@@zw6qqH`Zhf z$#Aj&kr1*6Bqq!UyaA%(6HR;<>O&v--1ur>Au%Kxo){uRFwwE$f)O(Q|Wx`mTPWZEBt|MrkTF)a$`CO=@`MmQxdywf;##p(s0WkZv4W3S9dJQ!j z4bwCw%JF9{S2l1wsD_3FAavvA?eyhzBpOX5dQZmxj%#s#9e};+uD+|wGzpBcot=-) z8Q^n5^S~?RePbU03;<~Fw*knq+-|pJS*Ci*x7%%MB77y2nV8593=DRD%`OSy5treX+j2!^0oFPvd+2Tkg@N4~0GT1q1N>*`lH-s;XA? z{Wq(xTCEmtzf@!ZpDUjLw3@w_t3-NVE3a{e zJeC>bg@2xhP$F5J= z93ep}!FjNZT7Fse)(1Bdi|c7p2@f9ZOTCeRn+GQbZX_-!56N57*1J-FT1_M1;g9ps zZML?yXC}v2PUm5MDNM=$Ait~<62yaWy#yB$p?~m2;y3(*Gav8}@Lulc%D2++An+U$3y6_&iw;y zdo9!l5fXm-AVxy$r{RS}z(c@;9cNoFaX-DaJ(JC@3D--+1E~Z@g76UPg9r&feegsA z{ye~i#0BLcSTETfo<9!&$X*Ngmxu>Cc_9A)z;A!aeewXHu*v*P_LoFR`0X!I{0IIa z&gm-u-c_Yd$qe-ItUkxF>;06!#7+h00Sb3u9dYxLnK;g+b{wt-|! P00000NkvXXu0mjf40G0M diff --git a/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_input.png b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_input.png deleted file mode 100644 index fb82941be19f7c120086609968b7e051ff09fdc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495 zcmV7+5DplQ@|pkt50H-$vaT-^B+qt)v7S~zrPQZb@y+=YZGJ#SF6H2+NRS<-o!LbiRUvKjb@?ROAK^U lEzg5|w{5*z<4b+8?HLxT=SPStJv{&b002ovPDHLkV1my8;G6&e diff --git a/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_output.png b/src/main/resources/assets/advancedperipherals/textures/block/gas_detector_output.png deleted file mode 100644 index e1b8d33042a8c871833793ea5560699599ba4a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmVAE4)cf*w74$wB-KIY?V^K|;ILfJ**sgmESd@vzJ|ljMPAXWw_;_j#UoW=lt( zK2NbAgs?ve!*DLHV*nn&a&6fJ^x6*s6H`*My1Isv(rG>z4vGc<7nc_RA-{l0000 Date: Thu, 2 May 2024 00:21:11 +0200 Subject: [PATCH 033/188] Added bottom texture If there is no bottom texture defined, the data generator will select the default texture --- .../b8526e444ae7356037f3a813274f6835d1f3dd16 | 28 +++++++++--------- .../models/block/chat_box.json | 1 + .../models/block/colony_integrator.json | 1 + .../models/block/energy_detector.json | 1 + .../models/block/environment_detector.json | 1 + .../models/block/fluid_detector.json | 1 + .../models/block/gas_detector.json | 1 + .../models/block/geo_scanner.json | 1 + .../models/block/inventory_manager.json | 1 + .../models/block/me_bridge.json | 1 + .../models/block/nbt_storage.json | 1 + .../models/block/peripheral_casing.json | 1 + .../models/block/player_detector.json | 1 + .../models/block/rs_bridge.json | 1 + .../data/BlockStatesAndModelsProvider.java | 9 ++++++ .../textures/block/bottom.png | Bin 0 -> 350 bytes 16 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/bottom.png diff --git a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 index 7b63c44da..1d2c65434 100644 --- a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 +++ b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 @@ -1,4 +1,4 @@ -// 1.19.2 2024-05-01T23:13:23.0739928 Block States: advancedperipherals +// 1.19.2 2024-05-02T00:18:31.0476401 Block States: advancedperipherals 5e28ce1be9a6996d982641e5df1fa7162090b8cc assets/advancedperipherals/blockstates/block_reader.json f42bdde60f84fdb312f7cf3b2be461d9c11ebdc8 assets/advancedperipherals/blockstates/chat_box.json 1227aa092fcf1327547ace6ccc9db230e45891b0 assets/advancedperipherals/blockstates/colony_integrator.json @@ -15,17 +15,17 @@ ff12c7217911184266589813a2c8f9b0d46cfd65 assets/advancedperipherals/blockstates/ 726cf2599b0c765bcfacda88a1943be74f985877 assets/advancedperipherals/blockstates/redstone_integrator.json 6b176e8fdb048f7b6678bfbc1c4baf2bcfa67a1f assets/advancedperipherals/blockstates/rs_bridge.json 544ff1ecb58622350b58940036b4b1908e1146da assets/advancedperipherals/models/block/block_reader.json -dab55424ec184c5495c7ca11e5bbe77210e04c26 assets/advancedperipherals/models/block/chat_box.json -7e207db9b2b170f52565c8ed23bcc92762be6c4d assets/advancedperipherals/models/block/colony_integrator.json -1e9a2e3931bfe77f2d42a95c539b365c4517095d assets/advancedperipherals/models/block/energy_detector.json -434c2505b18d1313c0377c6bf8d5e4dba93765cc assets/advancedperipherals/models/block/environment_detector.json -583a56d88a31a4b0b6251c02fac76d32ed94fcff assets/advancedperipherals/models/block/fluid_detector.json -b97e72c395e4f3a78ab30cd6acf02adbfe29653c assets/advancedperipherals/models/block/gas_detector.json -51ab0a2a78453e711e6aa3c3020b9658bf379628 assets/advancedperipherals/models/block/geo_scanner.json -32f7941037838f9d77c5c3a4eb3b56c8786e500e assets/advancedperipherals/models/block/inventory_manager.json -674d6ee74ef7fd0360c0e1ea0b2e21734f67c096 assets/advancedperipherals/models/block/me_bridge.json -65cdb0ff57aa8439c5d80eea5c741866da9af81e assets/advancedperipherals/models/block/nbt_storage.json -36b6ac01be085492aa6298eeb89e6ecaa3cb6f82 assets/advancedperipherals/models/block/peripheral_casing.json -120df29f21059aa9d4dff53bbb80953dee8d5214 assets/advancedperipherals/models/block/player_detector.json +fbaa69d6c98549d3f2d4a1c7bebd9b6b80d56621 assets/advancedperipherals/models/block/chat_box.json +68f9d37bd85649937150ba0bb8f4496bb2ef218d assets/advancedperipherals/models/block/colony_integrator.json +b4c6645fda79d960e9201e2a60eb1c8063a07d18 assets/advancedperipherals/models/block/energy_detector.json +eca505b2bd8db5f1d13f1e28093db329b70af978 assets/advancedperipherals/models/block/environment_detector.json +f6ab51bcfc829c7db490f691e8eb491e5e7028f3 assets/advancedperipherals/models/block/fluid_detector.json +35bbc0e2edf74f6e27029cc23465e203d459f234 assets/advancedperipherals/models/block/gas_detector.json +46ebb4c9a31e224bac13ad20334469c0b55d285c assets/advancedperipherals/models/block/geo_scanner.json +2142aaccd0a0bc56aaa2091128466d2c9a733aab assets/advancedperipherals/models/block/inventory_manager.json +f089dda9e6ac12d638707fd24d099ccd56a54ccc assets/advancedperipherals/models/block/me_bridge.json +65afcae128339b244508dc66620c6c00729fce8e assets/advancedperipherals/models/block/nbt_storage.json +f6cb0dda1ce8217563903d2dfaf5ef0297939750 assets/advancedperipherals/models/block/peripheral_casing.json +5a1679b4dcc8da2d8c67674216d242456bb51366 assets/advancedperipherals/models/block/player_detector.json d08b8946e1eb01cc9c8af4fa297b582614d1034b assets/advancedperipherals/models/block/redstone_integrator.json -15685a3c58f78db663609d56ee6fdb29652eef5f assets/advancedperipherals/models/block/rs_bridge.json +41cf7d22016a995aeda9df9d9cbf1d4069b99f9e assets/advancedperipherals/models/block/rs_bridge.json diff --git a/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json b/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json index b2dc05216..ba89671f2 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/chat_box.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/chat_box", + "down": "advancedperipherals:block/bottom", "north": "advancedperipherals:block/chat_box_front", "particle": "advancedperipherals:block/chat_box_front", "up": "advancedperipherals:block/chat_box_top" diff --git a/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json b/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json index 71048304d..7f52aebb0 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/colony_integrator.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/colony_integrator", + "down": "advancedperipherals:block/bottom", "north": "advancedperipherals:block/colony_integrator_front", "particle": "advancedperipherals:block/colony_integrator_front", "up": "advancedperipherals:block/colony_integrator_top" diff --git a/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json index 4b3b4c8d2..ebb28dd2e 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/energy_detector.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/energy_detector", + "down": "advancedperipherals:block/bottom", "east": "advancedperipherals:block/energy_detector_east", "north": "advancedperipherals:block/energy_detector_front", "particle": "advancedperipherals:block/energy_detector_front", diff --git a/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json index 90630831d..ce251a7af 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/environment_detector.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/environment_detector", + "down": "advancedperipherals:block/bottom", "north": "advancedperipherals:block/environment_detector_front", "particle": "advancedperipherals:block/environment_detector_front", "up": "advancedperipherals:block/environment_detector_top" diff --git a/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json index af828747e..6460c20e7 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/fluid_detector.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/fluid_detector", + "down": "advancedperipherals:block/bottom", "east": "advancedperipherals:block/fluid_detector_east", "north": "advancedperipherals:block/fluid_detector_front", "particle": "advancedperipherals:block/fluid_detector_front", diff --git a/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json index 4a2437d28..c03bc40ae 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/gas_detector.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/gas_detector", + "down": "advancedperipherals:block/bottom", "east": "advancedperipherals:block/gas_detector_east", "north": "advancedperipherals:block/gas_detector_front", "particle": "advancedperipherals:block/gas_detector_front", diff --git a/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json b/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json index 6752a0106..4870d8a6b 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/geo_scanner.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/geo_scanner", + "down": "advancedperipherals:block/bottom", "north": "advancedperipherals:block/geo_scanner_front", "particle": "advancedperipherals:block/geo_scanner_front", "up": "advancedperipherals:block/geo_scanner_top" diff --git a/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json b/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json index 818e46153..8431aaece 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/inventory_manager.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/inventory_manager", + "down": "advancedperipherals:block/bottom", "north": "advancedperipherals:block/inventory_manager_front", "particle": "advancedperipherals:block/inventory_manager_front", "up": "advancedperipherals:block/inventory_manager_top" diff --git a/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json b/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json index 42e6388e4..ab8392272 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/me_bridge.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/me_bridge", + "down": "advancedperipherals:block/bottom", "north": "advancedperipherals:block/me_bridge_front", "particle": "advancedperipherals:block/me_bridge_front", "up": "advancedperipherals:block/me_bridge_top" diff --git a/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json b/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json index dce7d353e..8545dbe6a 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/nbt_storage.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/nbt_storage", + "down": "advancedperipherals:block/bottom", "north": "advancedperipherals:block/nbt_storage_front", "particle": "advancedperipherals:block/nbt_storage_front", "up": "advancedperipherals:block/nbt_storage_top" diff --git a/src/generated/resources/assets/advancedperipherals/models/block/peripheral_casing.json b/src/generated/resources/assets/advancedperipherals/models/block/peripheral_casing.json index d6dd9f3cc..598971334 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/peripheral_casing.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/peripheral_casing.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/peripheral_casing", + "down": "advancedperipherals:block/bottom", "particle": "advancedperipherals:block/peripheral_casing" } } \ No newline at end of file diff --git a/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json index a979dadf1..c658c96c7 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/player_detector.json @@ -1,6 +1,7 @@ { "parent": "minecraft:block/cube_all", "textures": { + "down": "advancedperipherals:block/bottom", "east": "advancedperipherals:block/player_detector_side", "north": "advancedperipherals:block/player_detector_front", "particle": "advancedperipherals:block/player_detector_front", diff --git a/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json b/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json index 585be6406..b7e3d476b 100644 --- a/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json +++ b/src/generated/resources/assets/advancedperipherals/models/block/rs_bridge.json @@ -2,6 +2,7 @@ "parent": "minecraft:block/cube_all", "textures": { "all": "advancedperipherals:block/rs_bridge", + "down": "advancedperipherals:block/bottom", "north": "advancedperipherals:block/rs_bridge_front", "particle": "advancedperipherals:block/rs_bridge_front", "up": "advancedperipherals:block/rs_bridge_top" diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java index 18ca28cbe..00d468cc0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java @@ -12,6 +12,9 @@ import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.registries.ForgeRegistries; +import java.lang.reflect.Array; +import java.util.Arrays; + public class BlockStatesAndModelsProvider extends BlockStateProvider { public BlockStatesAndModelsProvider(DataGenerator packOutput, ExistingFileHelper exFileHelper) { @@ -89,6 +92,12 @@ private BlockModelBuilder generateModel(Block block, boolean hasNormalSide, Stri builder.texture(side, blockTexture(block, sideTexture)); } + + // Add our default bottom texture if there is no other defined + if (!Arrays.asList(sides).contains("down") && !Arrays.asList(sides).contains("bottom")) { + builder.texture("down", AdvancedPeripherals.getRL(ModelProvider.BLOCK_FOLDER + "/" + "bottom")); + } + builder.texture("particle", particleTexture); return builder; } diff --git a/src/main/resources/assets/advancedperipherals/textures/block/bottom.png b/src/main/resources/assets/advancedperipherals/textures/block/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..604ecb2678322be3a810fda08be63320dc51130c GIT binary patch literal 350 zcmV-k0iphhP)?D_TOmji~rQch;(Z)PUK{1)1oK9;?+8yZzQ?zq-6;z4^2; zeNll)tfB7^5r)2Fx8E9>C)b!NL{e(0Ld-RQqflD?REJpyo=qP$!6(*rlj)ICJ9Si! zP=%O@I!idjn21`j?4Vp6PwKZ*yiWU*rKY)7emkcoY$!{rO&8 w-K9>9{{G={@wb%+=HCVKLs~lDQ>PB_2m36nJ)6Ia1ONa407*qoM6N<$f~v@ti2wiq literal 0 HcmV?d00001 From 63337fef8a29ea04d790c130acde616ead839cc5 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 1 May 2024 17:50:26 -0600 Subject: [PATCH 034/188] add redstone_integrator event --- .../RedstoneIntegratorPeripheral.java | 22 +++--- .../blocks/RedstoneIntegratorBlock.java | 26 ++++++- .../RedstoneIntegratorEntity.java | 74 +++++++++++++----- .../common/util/CoordUtil.java | 35 +++++++++ .../common/util/SwarmEventDispatcher.java | 75 +++++++++++++++++++ 5 files changed, 201 insertions(+), 31 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java index b3d181a4c..e795532e8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java @@ -2,6 +2,7 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.core.computer.ComputerSide; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.RedstoneIntegratorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; @@ -21,27 +22,28 @@ public boolean isEnabled() { return APConfig.PERIPHERALS_CONFIG.enableRedstoneIntegrator.get(); } - @LuaFunction(mainThread = true) + @LuaFunction public final boolean getInput(String direction) throws LuaException { - Direction dir = validateSide(direction); - return owner.tileEntity.getRedstoneInput(dir) > 0; + ComputerSide dir = ComputerSide.valueOfInsensitive(direction); + return owner.tileEntity.getInput(dir) > 0; } - @LuaFunction(mainThread = true) + @LuaFunction public final boolean getOutput(String direction) throws LuaException { - return owner.tileEntity.power[validateSide(direction).get3DDataValue()] > 0; + Direction dir = validateSide(direction); + return owner.tileEntity.getOutput(dir) > 0; } - @LuaFunction(value = {"getAnalogueInput", "getAnalogInput"}, mainThread = true) + @LuaFunction(value = {"getAnalogueInput", "getAnalogInput"}) public final int getAnalogInput(String direction) throws LuaException { - Direction dir = validateSide(direction); - return owner.tileEntity.getRedstoneInput(dir); + ComputerSide dir = ComputerSide.valueOfInsensitive(direction); + return owner.tileEntity.getInput(dir); } - @LuaFunction(value = {"getAnalogueOutput", "getAnalogOutput"}, mainThread = true) + @LuaFunction(value = {"getAnalogueOutput", "getAnalogOutput"}) public final int getAnalogOutput(String direction) throws LuaException { Direction dir = validateSide(direction); - return owner.tileEntity.power[dir.get3DDataValue()]; + return owner.tileEntity.getOutput(dir); } @LuaFunction diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java index 209d4e106..905ff9c65 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java @@ -1,12 +1,18 @@ package de.srendi.advancedperipherals.common.blocks; +import dan200.computercraft.core.computer.ComputerSide; +import dan200.computercraft.shared.util.RedstoneUtil; import de.srendi.advancedperipherals.common.blocks.base.BaseBlockEntityBlock; import de.srendi.advancedperipherals.common.blocks.blockentities.RedstoneIntegratorEntity; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.setup.APBlocks; +import de.srendi.advancedperipherals.common.util.CoordUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.FrontAndTop; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; @@ -33,8 +39,9 @@ public boolean isSignalSource(@NotNull BlockState blockState) { @Override public int getDirectSignal(@NotNull BlockState blockState, BlockGetter blockGetter, @NotNull BlockPos pos, @NotNull Direction side) { BlockEntity te = blockGetter.getBlockEntity(pos); - if (te instanceof RedstoneIntegratorEntity redstoneIntegratorTile) - return redstoneIntegratorTile.power[side.getOpposite().get3DDataValue()]; + if (te instanceof RedstoneIntegratorEntity redstoneIntegratorTile) { + return redstoneIntegratorTile.getOutput(side.getOpposite()); + } return 0; } @@ -42,4 +49,19 @@ public int getDirectSignal(@NotNull BlockState blockState, BlockGetter blockGett public int getSignal(@NotNull BlockState blockState, @NotNull BlockGetter blockGetter, @NotNull BlockPos pos, @NotNull Direction side) { return getDirectSignal(blockState, blockGetter, pos, side); } + + @Override + public void neighborChanged(BlockState state, Level world, BlockPos pos, Block neighbor, BlockPos neighborPos, boolean moving) { + BlockEntity te = world.getBlockEntity(pos); + if (te instanceof RedstoneIntegratorEntity redstoneIntegratorTile) { + for (Direction direction : Direction.values()) { + if (pos.relative(direction).equals(neighborPos)) { + FrontAndTop orientation = redstoneIntegratorTile.getBlockState().getValue(ORIENTATION); + ComputerSide side = CoordUtil.getComputerSide(orientation, direction); + redstoneIntegratorTile.setInput(side, RedstoneUtil.getRedstoneInput(world, neighborPos, direction)); + return; + } + } + } + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java index ecf6ffff3..494d23dc5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java @@ -1,10 +1,12 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; +import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.shared.util.RedstoneUtil; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RedstoneIntegratorPeripheral; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.util.ServerWorker; +import de.srendi.advancedperipherals.common.util.SwarmEventDispatcher; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -13,14 +15,23 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; +import java.util.EnumMap; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; public class RedstoneIntegratorEntity extends PeripheralBlockEntity { + private static final String REDSTONE_EVENT_ID = "redstone_integrator"; - public int[] power = new int[Direction.values().length]; + private final int[] outputs = new int[Direction.values().length]; + private final AtomicInteger outputStatus = new AtomicInteger(0); + private final int[] outputing = new int[Direction.values().length]; + private final EnumMap inputs = new EnumMap<>(ComputerSide.class); public RedstoneIntegratorEntity(BlockPos pos, BlockState state) { super(APBlockEntityTypes.REDSTONE_INTEGRATOR.get(), pos, state); + for (int i = 0; i < outputing.length; i++) { + this.outputing[i] = -1; + } } @NotNull @@ -29,24 +40,37 @@ protected RedstoneIntegratorPeripheral createPeripheral() { return new RedstoneIntegratorPeripheral(this); } - public int getRedstoneInput(Direction direction) { - Objects.requireNonNull(level); - BlockPos neighbourPos = getBlockPos().relative(direction); - int power = level.getSignal(neighbourPos, direction); - if (power >= 15) return power; - - BlockState neighbourState = level.getBlockState(neighbourPos); - return neighbourState.getBlock() == Blocks.REDSTONE_WIRE ? Math.max(power, neighbourState.getValue(RedStoneWireBlock.POWER)) : power; + /** + * This method is safely to be called from multiple threads at any time. + */ + public int getInput(ComputerSide direction) { + // no need to lock because JVM promise the int will never be half-updated + return this.inputs.getOrDefault(direction, 0); } - private void setRedstoneOutput(Direction direction, int power) { - int old = this.power[direction.get3DDataValue()]; - this.power[direction.get3DDataValue()] = power; - if (old != power) { - if (level != null) - RedstoneUtil.propagateRedstoneOutput(level, getBlockPos(), direction); + /** + * This method should only be called from main thread + */ + public void setInput(ComputerSide side, int input) { + Integer old = this.inputs.getOrDefault(side, Integer.ZERO); + if (old.intValue() == input) { + return; + } + this.inputs.put(side, input); + SwarmEventDispatcher.dispatch(REDSTONE_EVENT_ID, this.getPeripheral(), side.getName()); + } - this.setChanged(); + private void updateRedstoneOutputs() { + if (this.level != null) { + return; + } + for (Direction direction : Direction.values()) { + int next = this.outputs[direction.get3DDataValue()]; + if (next != this.outputing[direction.get3DDataValue()]) { + RedstoneUtil.propagateRedstoneOutput(this.level, this.getBlockPos(), direction); + this.outputing[direction.get3DDataValue()] = next; + this.setChanged(); + } } } @@ -58,14 +82,26 @@ private void setRedstoneOutput(Direction direction, int power) { * @param power The redstone power from 0 to 15 */ public void setOutput(Direction direction, int power) { - ServerWorker.add(() -> setRedstoneOutput(direction, power)); + this.outputs[direction.get3DDataValue()] = power; + if (this.outputStatus.compareAndSet(0, 1)) { + ServerWorker.add(() -> { + this.outputStatus.set(0); + this.updateRedstoneOutputs(); + }); + } + } + + public int getOutput(Direction direction) { + // no need to lock because JVM promise the int will never be half-updated + return this.outputs[direction.get3DDataValue()]; } @Override public void load(@NotNull CompoundTag compound) { for (Direction direction : Direction.values()) { - setRedstoneOutput(direction, compound.getInt(direction.name() + "Power")); + this.outputs[direction.get3DDataValue()] = compound.getInt(direction.getName() + "Power"); } + this.updateRedstoneOutputs(); super.load(compound); } @@ -74,7 +110,7 @@ public void saveAdditional(@NotNull CompoundTag compound) { super.saveAdditional(compound); int i = 0; for (Direction direction : Direction.values()) { - compound.putInt(direction.name() + "Power", power[i]); + compound.putInt(direction.getName() + "Power", this.outputs[i]); i++; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java index 3c8039fd0..abb793a53 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java @@ -120,4 +120,39 @@ public static Direction getDirection(FrontAndTop orientation, String computerSid } + public static ComputerSide getComputerSide(FrontAndTop orientation, Direction direction) { + Direction top = orientation.top(); + Direction front = orientation.front(); + + if (direction == front) { + return ComputerSide.FRONT; + } + if (direction == front.getOpposite()) { + return ComputerSide.BACK; + } + if (front.getAxis() == Direction.Axis.Y) { + if (direction == top) { + return ComputerSide.TOP; + } + if (direction == top.getOpposite()) { + return ComputerSide.BOTTOM; + } + if (direction == top.getClockWise()) { + return ComputerSide.RIGHT; + } + if (direction == top.getCounterClockWise()) { + return ComputerSide.LEFT; + } + } + if (direction == front.getClockWise()) { + return ComputerSide.RIGHT; + } + if (direction == front.getCounterClockWise()) { + return ComputerSide.LEFT; + } + if (direction == Direction.UP) { + return ComputerSide.TOP; + } + return ComputerSide.BOTTOM; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java new file mode 100644 index 000000000..45a47384c --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java @@ -0,0 +1,75 @@ +package de.srendi.advancedperipherals.common.util; + +import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.shared.computer.core.ServerContext; +import dan200.computercraft.shared.computer.core.ServerComputer; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; +import net.minecraft.server.MinecraftServer; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +@Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID) +public final class SwarmEventDispatcher { + private static final ConcurrentMap>>> events = new ConcurrentHashMap<>(); + private static final AtomicBoolean updated = new AtomicBoolean(); + + private SwarmEventDispatcher(){} + + public static void dispatch(String event, BasePeripheral peripheral, Object data) { + boolean set = false; + ConcurrentMap>> computers = events.computeIfAbsent(event, (k) -> new ConcurrentHashMap<>()); + Iterable computerIter = peripheral.getConnectedComputers(); + for (IComputerAccess computer : computerIter) { + computers.computeIfAbsent(computer.getID(), (k) -> new ConcurrentHashMap<>()).compute(computer.getAttachmentName(), (name, datas) -> { + if (datas == null) { + datas = new HashSet<>(); + } + datas.add(data); + return datas; + }); + set = true; + } + if (set) { + updated.set(true); + } + } + + private static Map getComputers(MinecraftServer server) { + Map computers = new HashMap<>(); + ServerContext.get(server).registry().getComputers().forEach(computer -> computers.put(computer.getID(), computer)); + return computers; + } + + @SubscribeEvent + public static void serverTick(TickEvent.ServerTickEvent tickEvent) { + if (tickEvent.phase != TickEvent.Phase.END) { + return; + } + if (!updated.compareAndSet(true, false)) { + return; + } + Map computerMap = getComputers(tickEvent.getServer()); + events.forEach((event, computers) -> { + for (int id : computers.keySet()) { + ConcurrentMap> peripherals = computers.remove(id); + if (peripherals == null || peripherals.isEmpty()) { + continue; + } + ServerComputer computer = computerMap.get(id); + if (computer != null) { + computer.queueEvent(event, new Object[]{peripherals}); + } + } + }); + } +} From f7b60236508787bab01a4324bb8ddba7490ade82 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 1 May 2024 17:53:12 -0600 Subject: [PATCH 035/188] fix zero issue --- .../common/blocks/blockentities/RedstoneIntegratorEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java index 494d23dc5..683d07b39 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java @@ -52,7 +52,7 @@ public int getInput(ComputerSide direction) { * This method should only be called from main thread */ public void setInput(ComputerSide side, int input) { - Integer old = this.inputs.getOrDefault(side, Integer.ZERO); + Integer old = this.inputs.getOrDefault(side, 0); if (old.intValue() == input) { return; } From 24785b8e2947cdefbbda4324639e66a6e7f3761d Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 1 May 2024 18:12:34 -0600 Subject: [PATCH 036/188] fix redstone output will not update immediately --- .../blocks/blockentities/RedstoneIntegratorEntity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java index 683d07b39..82f0262a6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java @@ -43,9 +43,9 @@ protected RedstoneIntegratorPeripheral createPeripheral() { /** * This method is safely to be called from multiple threads at any time. */ - public int getInput(ComputerSide direction) { + public int getInput(ComputerSide side) { // no need to lock because JVM promise the int will never be half-updated - return this.inputs.getOrDefault(direction, 0); + return this.inputs.getOrDefault(side, 0); } /** @@ -61,7 +61,7 @@ public void setInput(ComputerSide side, int input) { } private void updateRedstoneOutputs() { - if (this.level != null) { + if (this.level == null) { return; } for (Direction direction : Direction.values()) { From 179bb80f2929fe7f70916a74b6c4b0b54dd64519 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 1 May 2024 19:51:13 -0600 Subject: [PATCH 037/188] fix redstone will not update when peripheral placed --- .../RedstoneIntegratorPeripheral.java | 4 +- .../common/blocks/PlayerDetectorBlock.java | 3 +- .../blocks/RedstoneIntegratorBlock.java | 8 +--- .../blocks/base/BaseBlockEntityBlock.java | 4 ++ .../blocks/base/PeripheralBlockEntity.java | 10 ++++- .../RedstoneIntegratorEntity.java | 43 +++++++++++++------ .../common/util/ServerWorker.java | 25 ++++++++--- .../common/util/SwarmEventDispatcher.java | 3 +- 8 files changed, 68 insertions(+), 32 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java index e795532e8..733d3f63c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java @@ -24,7 +24,7 @@ public boolean isEnabled() { @LuaFunction public final boolean getInput(String direction) throws LuaException { - ComputerSide dir = ComputerSide.valueOfInsensitive(direction); + Direction dir = validateSide(direction); return owner.tileEntity.getInput(dir) > 0; } @@ -36,7 +36,7 @@ public final boolean getOutput(String direction) throws LuaException { @LuaFunction(value = {"getAnalogueInput", "getAnalogInput"}) public final int getAnalogInput(String direction) throws LuaException { - ComputerSide dir = ComputerSide.valueOfInsensitive(direction); + Direction dir = validateSide(direction); return owner.tileEntity.getInput(dir); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/PlayerDetectorBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/PlayerDetectorBlock.java index fec9f22c5..2f1e6c9d6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/PlayerDetectorBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/PlayerDetectorBlock.java @@ -14,7 +14,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class PlayerDetectorBlock extends APBlockEntityBlock { @@ -22,7 +21,7 @@ public PlayerDetectorBlock() { super(APBlockEntityTypes.PLAYER_DETECTOR, true); } - @Nullable + @NotNull @Override public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { return APBlockEntityTypes.PLAYER_DETECTOR.get().create(pos, state); diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java index 905ff9c65..586bb0d19 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java @@ -9,7 +9,6 @@ import de.srendi.advancedperipherals.common.util.CoordUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.FrontAndTop; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -17,7 +16,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class RedstoneIntegratorBlock extends BaseBlockEntityBlock { @@ -25,7 +23,7 @@ public RedstoneIntegratorBlock() { super(false, Properties.of(Material.METAL).isRedstoneConductor(APBlocks::never)); } - @Nullable + @NotNull @Override public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { return APBlockEntityTypes.REDSTONE_INTEGRATOR.get().create(pos, state); @@ -56,9 +54,7 @@ public void neighborChanged(BlockState state, Level world, BlockPos pos, Block n if (te instanceof RedstoneIntegratorEntity redstoneIntegratorTile) { for (Direction direction : Direction.values()) { if (pos.relative(direction).equals(neighborPos)) { - FrontAndTop orientation = redstoneIntegratorTile.getBlockState().getValue(ORIENTATION); - ComputerSide side = CoordUtil.getComputerSide(orientation, direction); - redstoneIntegratorTile.setInput(side, RedstoneUtil.getRedstoneInput(world, neighborPos, direction)); + redstoneIntegratorTile.setInput(direction, RedstoneUtil.getRedstoneInput(world, neighborPos, direction)); return; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java index aaf4a1e7e..076201a8b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java @@ -35,6 +35,10 @@ public BaseBlockEntityBlock(boolean belongToTickingEntity, Properties properties this.belongToTickingEntity = belongToTickingEntity; } + @NotNull + @Override + public abstract BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state); + @NotNull @Override public InteractionResult use(@NotNull BlockState state, Level levelIn, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand handIn, @NotNull BlockHitResult hit) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java index 6fe4d3354..8bd572249 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java @@ -2,12 +2,16 @@ import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.shared.Capabilities; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; +import de.srendi.advancedperipherals.common.util.CoordUtil; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralTileEntity; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.FrontAndTop; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -229,5 +233,9 @@ public CompoundTag getPeripheralSettings() { public void markSettingsChanged() { setChanged(); } -} + public ComputerSide getComputerSide(Direction direction) { + FrontAndTop orientation = getBlockState().getValue(BaseBlock.ORIENTATION); + return CoordUtil.getComputerSide(orientation, direction); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java index 82f0262a6..3c26936bf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java @@ -10,14 +10,14 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RedStoneWireBlock; import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.NotNull; -import java.util.EnumMap; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; +import org.jetbrains.annotations.NotNull; public class RedstoneIntegratorEntity extends PeripheralBlockEntity { private static final String REDSTONE_EVENT_ID = "redstone_integrator"; @@ -25,7 +25,7 @@ public class RedstoneIntegratorEntity extends PeripheralBlockEntity inputs = new EnumMap<>(ComputerSide.class); + private final int[] inputs = new int[Direction.values().length]; public RedstoneIntegratorEntity(BlockPos pos, BlockState state) { super(APBlockEntityTypes.REDSTONE_INTEGRATOR.get(), pos, state); @@ -43,21 +43,24 @@ protected RedstoneIntegratorPeripheral createPeripheral() { /** * This method is safely to be called from multiple threads at any time. */ - public int getInput(ComputerSide side) { + public int getInput(Direction direction) { // no need to lock because JVM promise the int will never be half-updated - return this.inputs.getOrDefault(side, 0); + return this.inputs[direction.get3DDataValue()]; } /** * This method should only be called from main thread */ - public void setInput(ComputerSide side, int input) { - Integer old = this.inputs.getOrDefault(side, 0); - if (old.intValue() == input) { + public void setInput(Direction direction, int input) { + if (this.inputs[direction.get3DDataValue()] == input) { return; } - this.inputs.put(side, input); - SwarmEventDispatcher.dispatch(REDSTONE_EVENT_ID, this.getPeripheral(), side.getName()); + this.inputs[direction.get3DDataValue()] = input; + ComputerSide side = this.getComputerSide(direction); + RedstoneIntegratorPeripheral peripheral = this.getPeripheral(); + if (peripheral != null) { + SwarmEventDispatcher.dispatch(REDSTONE_EVENT_ID, peripheral, side.getName()); + } } private void updateRedstoneOutputs() { @@ -96,22 +99,34 @@ public int getOutput(Direction direction) { return this.outputs[direction.get3DDataValue()]; } + public void initSignals() { + for (Direction direction : Direction.values()) { + this.setInput(direction, RedstoneUtil.getRedstoneInput(this.level, this.getBlockPos().relative(direction), direction)); + RedstoneUtil.propagateRedstoneOutput(this.level, this.getBlockPos(), direction); + this.outputing[direction.get3DDataValue()] = this.outputs[direction.get3DDataValue()]; + } + this.setChanged(); + } + + @Override + public void setLevel(Level level) { + super.setLevel(level); + ServerWorker.addToNextTick(this::initSignals); + } + @Override public void load(@NotNull CompoundTag compound) { for (Direction direction : Direction.values()) { this.outputs[direction.get3DDataValue()] = compound.getInt(direction.getName() + "Power"); } - this.updateRedstoneOutputs(); super.load(compound); } @Override public void saveAdditional(@NotNull CompoundTag compound) { super.saveAdditional(compound); - int i = 0; for (Direction direction : Direction.values()) { - compound.putInt(direction.getName() + "Power", this.outputs[i]); - i++; + compound.putInt(direction.getName() + "Power", this.outputs[direction.get3DDataValue()]); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java b/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java index d4c5762ae..916d9bfe7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/ServerWorker.java @@ -14,18 +14,31 @@ public class ServerWorker { private static final Queue callQueue = new ConcurrentLinkedQueue<>(); private static int tasksRan = 0; - public static void add(final Runnable call) { - callQueue.add(call); + /** + * This method will queue a task to current tick's end. + * If a task added during the end of a tick, the task will be delayed to the next tick; + */ + public static void add(final Runnable task) { + callQueue.add(task); + } + + /** + * Add to next tick will execute the task in next tick. + * It's an alias of ServerWorker.add(() -> ServerWorker.add(task)); + */ + public static void addToNextTick(final Runnable task) { + add(() -> add(task)); } @SubscribeEvent public static void serverTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.END) { - while (!callQueue.isEmpty()) { - final Runnable runnable = callQueue.poll(); + int size = callQueue.size(); + for (int i = 0; i < size; i++) { + final Runnable task = callQueue.poll(); tasksRan++; - AdvancedPeripherals.debug("Running task #" + tasksRan + ". Running " + runnable.getClass()); - runnable.run(); + AdvancedPeripherals.debug("Running task #" + tasksRan + ". Running " + task.getClass()); + task.run(); } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java index 45a47384c..aa4f08687 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java @@ -17,6 +17,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; +import org.jetbrains.annotations.NotNull; @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID) public final class SwarmEventDispatcher { @@ -25,7 +26,7 @@ public final class SwarmEventDispatcher { private SwarmEventDispatcher(){} - public static void dispatch(String event, BasePeripheral peripheral, Object data) { + public static void dispatch(@NotNull String event, @NotNull BasePeripheral peripheral, Object data) { boolean set = false; ConcurrentMap>> computers = events.computeIfAbsent(event, (k) -> new ConcurrentHashMap<>()); Iterable computerIter = peripheral.getConnectedComputers(); From ae6c9df4b82bd03aae7ee3b8d76c09e05226ce5f Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 1 May 2024 19:58:51 -0600 Subject: [PATCH 038/188] style fix --- .../blocks/RedstoneIntegratorBlock.java | 2 - .../blocks/base/PeripheralBlockEntity.java | 1 - .../RedstoneIntegratorEntity.java | 4 - .../common/util/SwarmEventDispatcher.java | 96 +++++++++---------- 4 files changed, 48 insertions(+), 55 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java index 586bb0d19..5d9475439 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java @@ -1,12 +1,10 @@ package de.srendi.advancedperipherals.common.blocks; -import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.shared.util.RedstoneUtil; import de.srendi.advancedperipherals.common.blocks.base.BaseBlockEntityBlock; import de.srendi.advancedperipherals.common.blocks.blockentities.RedstoneIntegratorEntity; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.setup.APBlocks; -import de.srendi.advancedperipherals.common.util.CoordUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockGetter; diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java index 8bd572249..654fefeb3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java @@ -5,7 +5,6 @@ import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.shared.Capabilities; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; import de.srendi.advancedperipherals.common.util.CoordUtil; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralTileEntity; diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java index 3c26936bf..2328bcfe3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java @@ -1,6 +1,5 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; -import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.shared.util.RedstoneUtil; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RedstoneIntegratorPeripheral; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; @@ -11,11 +10,8 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.RedStoneWireBlock; import net.minecraft.world.level.block.state.BlockState; -import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java index aa4f08687..2172edc99 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java @@ -21,56 +21,56 @@ @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID) public final class SwarmEventDispatcher { - private static final ConcurrentMap>>> events = new ConcurrentHashMap<>(); - private static final AtomicBoolean updated = new AtomicBoolean(); + private static final ConcurrentMap>>> events = new ConcurrentHashMap<>(); + private static final AtomicBoolean updated = new AtomicBoolean(); - private SwarmEventDispatcher(){} + private SwarmEventDispatcher() {} - public static void dispatch(@NotNull String event, @NotNull BasePeripheral peripheral, Object data) { - boolean set = false; - ConcurrentMap>> computers = events.computeIfAbsent(event, (k) -> new ConcurrentHashMap<>()); - Iterable computerIter = peripheral.getConnectedComputers(); - for (IComputerAccess computer : computerIter) { - computers.computeIfAbsent(computer.getID(), (k) -> new ConcurrentHashMap<>()).compute(computer.getAttachmentName(), (name, datas) -> { - if (datas == null) { - datas = new HashSet<>(); - } - datas.add(data); - return datas; - }); - set = true; - } - if (set) { - updated.set(true); - } - } + public static void dispatch(@NotNull String event, @NotNull BasePeripheral peripheral, Object data) { + boolean set = false; + ConcurrentMap>> computers = events.computeIfAbsent(event, (k) -> new ConcurrentHashMap<>()); + Iterable computerIter = peripheral.getConnectedComputers(); + for (IComputerAccess computer : computerIter) { + computers.computeIfAbsent(computer.getID(), (k) -> new ConcurrentHashMap<>()).compute(computer.getAttachmentName(), (name, datas) -> { + if (datas == null) { + datas = new HashSet<>(); + } + datas.add(data); + return datas; + }); + set = true; + } + if (set) { + updated.set(true); + } + } - private static Map getComputers(MinecraftServer server) { - Map computers = new HashMap<>(); - ServerContext.get(server).registry().getComputers().forEach(computer -> computers.put(computer.getID(), computer)); - return computers; - } + private static Map getComputers(MinecraftServer server) { + Map computers = new HashMap<>(); + ServerContext.get(server).registry().getComputers().forEach(computer -> computers.put(computer.getID(), computer)); + return computers; + } - @SubscribeEvent - public static void serverTick(TickEvent.ServerTickEvent tickEvent) { - if (tickEvent.phase != TickEvent.Phase.END) { - return; - } - if (!updated.compareAndSet(true, false)) { - return; - } - Map computerMap = getComputers(tickEvent.getServer()); - events.forEach((event, computers) -> { - for (int id : computers.keySet()) { - ConcurrentMap> peripherals = computers.remove(id); - if (peripherals == null || peripherals.isEmpty()) { - continue; - } - ServerComputer computer = computerMap.get(id); - if (computer != null) { - computer.queueEvent(event, new Object[]{peripherals}); - } - } - }); - } + @SubscribeEvent + public static void serverTick(TickEvent.ServerTickEvent tickEvent) { + if (tickEvent.phase != TickEvent.Phase.END) { + return; + } + if (!updated.compareAndSet(true, false)) { + return; + } + Map computerMap = getComputers(tickEvent.getServer()); + events.forEach((event, computers) -> { + for (int id : computers.keySet()) { + ConcurrentMap> peripherals = computers.remove(id); + if (peripherals == null || peripherals.isEmpty()) { + continue; + } + ServerComputer computer = computerMap.get(id); + if (computer != null) { + computer.queueEvent(event, new Object[]{peripherals}); + } + } + }); + } } From e19b32ca7d2cd5d2306bd278f9c9a8be834be06c Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 2 May 2024 11:06:22 -0600 Subject: [PATCH 039/188] do not expose initSignals method, and add a missing import --- .../common/blocks/blockentities/RedstoneIntegratorEntity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java index 2328bcfe3..2b3371f3d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; +import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.shared.util.RedstoneUtil; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RedstoneIntegratorPeripheral; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; @@ -95,7 +96,7 @@ public int getOutput(Direction direction) { return this.outputs[direction.get3DDataValue()]; } - public void initSignals() { + private void initSignals() { for (Direction direction : Direction.values()) { this.setInput(direction, RedstoneUtil.getRedstoneInput(this.level, this.getBlockPos().relative(direction), direction)); RedstoneUtil.propagateRedstoneOutput(this.level, this.getBlockPos(), direction); From 828d49068bc3be6d093712be2f49f1cff23e900b Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 3 May 2024 10:06:43 -0600 Subject: [PATCH 040/188] add checkPortal method to end automata core --- .../plugins/AutomataWarpingPlugin.java | 58 ++++++++++++++++--- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java index 712ce2c29..692115c4e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java @@ -44,11 +44,13 @@ protected Pair getPointData() { settings.putString(WORLD_DATA_MARK, owner.getLevel().dimension().location().toString()); } else { String worldName = settings.getString(WORLD_DATA_MARK); - if (!owner.getLevel().dimension().location().toString().equals(worldName)) + if (!owner.getLevel().dimension().location().toString().equals(worldName)) { return Pair.onlyLeft(MethodResult.of(null, "Incorrect world for this upgrade")); + } } - if (!settings.contains(POINT_DATA_MARK)) + if (!settings.contains(POINT_DATA_MARK)) { settings.put(POINT_DATA_MARK, new CompoundTag()); + } return Pair.onlyRight(settings.getCompound(POINT_DATA_MARK)); } @@ -63,12 +65,14 @@ private int getWarpCost(SingleOperationContext context) { public final MethodResult savePoint(String name) { automataCore.addRotationCycle(); Pair pairData = getPointData(); - if (pairData.leftPresent()) + if (pairData.leftPresent()) { return pairData.getLeft(); + } CompoundTag data = pairData.getRight(); - if (data.getAllKeys().size() >= APConfig.METAPHYSICS_CONFIG.endAutomataCoreWarpPointLimit.get()) + if (data.getAllKeys().size() >= APConfig.METAPHYSICS_CONFIG.endAutomataCoreWarpPointLimit.get()) { return MethodResult.of(null, "Cannot add new point, limit reached"); + } data.put(name, NBTUtil.toNBT(automataCore.getPeripheralOwner().getPos())); return MethodResult.of(true); @@ -82,8 +86,9 @@ public final MethodResult deletePoint(String name) { return pairData.getLeft(); CompoundTag data = pairData.getRight(); - if (!data.contains(name)) + if (!data.contains(name)) { return MethodResult.of(null, "Cannot find point to delete"); + } data.remove(name); return MethodResult.of(true); @@ -92,8 +97,9 @@ public final MethodResult deletePoint(String name) { @LuaFunction(mainThread = true) public final MethodResult points() { Pair pairData = getPointData(); - if (pairData.leftPresent()) + if (pairData.leftPresent()) { return pairData.getLeft(); + } CompoundTag data = pairData.getRight(); return MethodResult.of(data.getAllKeys()); @@ -102,21 +108,27 @@ public final MethodResult points() { @LuaFunction(mainThread = true) public final MethodResult warpToPoint(String name) throws LuaException { Pair pairData = getPointData(); - if (pairData.leftPresent()) + if (pairData.leftPresent()) { return pairData.getLeft(); + } TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); Level level = owner.getLevel(); CompoundTag data = pairData.getRight(); + if (!data.contains(name)) { + return MethodResult.of(null, "Warp point not exists"); + } BlockPos newPosition = NBTUtil.blockPosFromNBT(data.getCompound(name)); return automataCore.withOperation(WARP, automataCore.toDistance(newPosition), context -> { boolean result = owner.move(level, newPosition); - if (!result) + if (!result) { return MethodResult.of(null, "Cannot teleport to location"); + } return MethodResult.of(true); }, context -> { - if (!owner.isMovementPossible(level, newPosition)) + if (!owner.isMovementPossible(level, newPosition)) { return MethodResult.of(null, "Move forbidden"); + } return null; }); } @@ -143,4 +155,32 @@ public final MethodResult distanceToPoint(String name) { return MethodResult.of(newPosition.distManhattan(automataCore.getPeripheralOwner().getPos())); } + /** + * This method will check if the turtle is able to cross the portal + * @return table | nil, string + * the result will looks like: + *

+     * 
+     * {
+     *   name = "minecraft:nether", -- the target dimension's name
+     *   pos = { -- the position turtle will teleport to
+     *     x = 0,
+     *     y = 0,
+     *     z = 0,
+     *   },
+     *   canSpawn = true, -- if the target position is not blocked and turtle are able to spawn there
+     *   costs = 10000, -- the costs to cross the portal
+     * }
+     * 
+     * 
+ */ + @LuaFunction(mainThread = true) + public final MethodResult checkPortal() throws LuaException { + return MethodResult.of(null, "not implements yet"); + } + + @LuaFunction(mainThread = true) + public final MethodResult usePortal() throws LuaException { + return MethodResult.of(null, "not implements yet"); + } } From 03f352b57ae5eaab176f1dc29c5ffbf017430f0b Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 6 May 2024 08:08:39 -0600 Subject: [PATCH 041/188] finished turtle cross vertical portal --- .../operations/SingleOperation.java | 7 +- .../plugins/AutomataWarpingPlugin.java | 155 ++++++++++++++- .../common/entity/TurtleEnderPearl.java | 176 ++++++++++++++++++ .../common/setup/APEntities.java | 31 +++ .../common/setup/APRegistration.java | 4 + 5 files changed, 361 insertions(+), 12 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java index df8cd27e9..565e54c7c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java @@ -13,7 +13,9 @@ public enum SingleOperation implements IPeripheralOperation 1), MULTIPLY(c -> c); private final UnaryOperator factorFunction; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java index 692115c4e..deb259dc3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java @@ -1,15 +1,21 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; +import dan200.computercraft.api.lua.ILuaCallback; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; +import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.api.turtle.ITurtleAccess; import de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperationContext; import de.srendi.advancedperipherals.common.addons.computercraft.owner.FuelAbility; import de.srendi.advancedperipherals.common.addons.computercraft.owner.PeripheralOwnerAbility; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.configuration.APConfig; +import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.common.util.NBTUtil; import de.srendi.advancedperipherals.common.util.Pair; +import de.srendi.advancedperipherals.common.util.ServerWorker; +import de.srendi.advancedperipherals.common.entity.TurtleEnderPearl; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; @@ -18,22 +24,28 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.WARP; +import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.PREPARE_PORTAL; +import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.ACTIVE_PORTAL; public class AutomataWarpingPlugin extends AutomataCorePlugin { private static final String POINT_DATA_MARK = "warp_points"; private static final String WORLD_DATA_MARK = "warp_world"; + private final Map shipPearls = new HashMap<>(); + public AutomataWarpingPlugin(AutomataCorePeripheral automataCore) { super(automataCore); } @Override public @Nullable IPeripheralOperation[] getOperations() { - return new IPeripheralOperation[]{WARP}; + return new IPeripheralOperation[]{WARP, PREPARE_PORTAL, ACTIVE_PORTAL}; } @NotNull @@ -136,8 +148,9 @@ public final MethodResult warpToPoint(String name) throws LuaException { @LuaFunction(mainThread = true) public final MethodResult estimateWarpCost(String name) { Pair pairData = getPointData(); - if (pairData.leftPresent()) + if (pairData.leftPresent()) { return pairData.getLeft(); + } CompoundTag data = pairData.getRight(); BlockPos newPosition = NBTUtil.blockPosFromNBT(data.getCompound(name)); @@ -147,8 +160,9 @@ public final MethodResult estimateWarpCost(String name) { @LuaFunction(mainThread = true) public final MethodResult distanceToPoint(String name) { Pair pairData = getPointData(); - if (pairData.leftPresent()) + if (pairData.leftPresent()) { return pairData.getLeft(); + } CompoundTag data = pairData.getRight(); BlockPos newPosition = NBTUtil.blockPosFromNBT(data.getCompound(name)); @@ -156,7 +170,9 @@ public final MethodResult distanceToPoint(String name) { } /** - * This method will check if the turtle is able to cross the portal + * This method will prepare to teleport to the other side of the portal. + * Prepare will always costs constant fuel. + * * @return table | nil, string * the result will looks like: *
@@ -168,19 +184,138 @@ public final MethodResult distanceToPoint(String name) {
      *     y = 0,
      *     z = 0,
      *   },
-     *   canSpawn = true, -- if the target position is not blocked and turtle are able to spawn there
+     *   facing = "north", -- where will the turtle face after teleport
      *   costs = 10000, -- the costs to cross the portal
+     *   canSpawn = true, -- if the target position is not blocked and turtle are able to spawn there
+     *   shipId = "xxx", -- the random id used for ship the portal. You have to call portalShipActive(shipId) if needed.
      * }
      * 
      * 
*/ - @LuaFunction(mainThread = true) - public final MethodResult checkPortal() throws LuaException { - return MethodResult.of(null, "not implements yet"); + @LuaFunction + public final MethodResult portalShipPrepare() throws LuaException { + TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); + ITurtleAccess turtle = owner.getTurtle(); + TurtleEnderPearl shipPearl = new TurtleEnderPearl(turtle); + String shipId = shipPearl.getStringUUID(); + ServerWorker.add(() -> { + MethodResult res; + try { + res = automataCore.withOperation(PREPARE_PORTAL, new SingleOperationContext(1, 1), context -> { + shipPearl.setCallback(pearl -> { + Level level = pearl.getLevel(); + if (level == turtle.getLevel()) { + for (IComputerAccess computer : automataCore.getConnectedComputers()) { + computer.queueEvent(PortalPrepareCallback.FAILED_EVENT_ID, shipId, "NO_PORTAL_FOUND"); + } + pearl.discard(); + return; + } + BlockPos pos = pearl.blockPosition(); + Map data = new HashMap<>(); + data.put("level", level); + data.put("pos", LuaConverter.posToObject(pos)); + data.put("facing", pearl.getDirection().getName()); + data.put("costs", getCostsToLevel(level)); + data.put("canSpawn", owner.isMovementPossible(level, pos)); + data.put("shipId", shipId); + shipPearls.put(shipId, pearl); + for (IComputerAccess computer : automataCore.getConnectedComputers()) { + computer.queueEvent(PortalPrepareCallback.EVENT_ID, data); + } + }); + turtle.getLevel().addFreshEntity(shipPearl); + return null; + }, null); + } catch (LuaException e) { + res = MethodResult.of(null, "Unexpected java error: " + e.toString()); + } + if (res != null) { + Object err = res.getResult()[1]; + for (IComputerAccess computer : automataCore.getConnectedComputers()) { + computer.queueEvent(PortalPrepareCallback.FAILED_EVENT_ID, shipId, err); + } + } + }); + return new PortalPrepareCallback(shipId).pull; } + /** + * @param id the random shipId, one of the result from portalShipPrepare() + * @return true | nil, string + */ @LuaFunction(mainThread = true) - public final MethodResult usePortal() throws LuaException { - return MethodResult.of(null, "not implements yet"); + public final MethodResult portalShipActive(String id) throws LuaException { + TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); + TurtleEnderPearl shipPearl = shipPearls.get(id); + if (shipPearl == null) { + return MethodResult.of(null, "ID_NOT_EXISTS"); + } + if (shipPearl.isRemoved()) { + shipPearls.remove(id); + return MethodResult.of(null, "ID_NOT_EXISTS"); + } + Level level = shipPearl.getLevel(); + BlockPos newPosition = shipPearl.blockPosition(); + return automataCore.withOperation(ACTIVE_PORTAL, new SingleOperationContext(getCostsToLevel(level), 1), context -> { + shipPearl.discard(); + boolean result = owner.move(level, newPosition); + if (!result) { + return MethodResult.of(null, "Cannot teleport to location"); + } + shipPearls.remove(id); + return MethodResult.of(true); + }, context -> { + if (!owner.isMovementPossible(level, newPosition)) { + return MethodResult.of(null, "Move forbidden"); + } + return null; + }); + } + + private static int getCostsToLevel(Level level) { + String dimension = level.dimension().toString(); + // TODO: load fuel costs from config + switch (dimension) { + case "minecraft:overworld": + return 10000; + case "minecraft:the_nether": + return 20000; + case "minecraft:the_end": + return 50000; + } + return 10000; + } + + private static final class PortalPrepareCallback implements ILuaCallback { + static final String EVENT_ID = "portal_prepare"; + static final String FAILED_EVENT_ID = "portal_prepare_failed"; + final MethodResult pull = MethodResult.pullEvent(null, this); + private final String id; + + PortalPrepareCallback(String id) { + this.id = id; + } + + @NotNull + @Override + public MethodResult resume(Object[] datas) { + if (datas.length <= 0) { + return pull; + } + if (FAILED_EVENT_ID.equals(datas[0])) { + if (datas.length != 3 || !id.equals(datas[1])) { + return pull; + } + return MethodResult.of(null, datas[2]); + } + if (!EVENT_ID.equals(datas[0]) || datas.length != 2) { + return pull; + } + if (!(datas[1] instanceof Map data) || !id.equals(data.get("shipId"))) { + return pull; + } + return MethodResult.of(data); + } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java new file mode 100644 index 000000000..76213b8a5 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java @@ -0,0 +1,176 @@ +package de.srendi.advancedperipherals.common.entity; + +import dan200.computercraft.api.turtle.ITurtleAccess; +import dan200.computercraft.shared.computer.core.ServerComputer; +import dan200.computercraft.shared.turtle.core.TurtleBrain; +import de.srendi.advancedperipherals.common.setup.APEntities; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; + +import java.util.function.Consumer; +import org.jetbrains.annotations.Nullable; + +public class TurtleEnderPearl extends ThrowableProjectile { + + private ITurtleAccess turtle = null; + private BlockPos spawnPos = null; + private Consumer callback = null; + private int life = 20; + private boolean changedDim = false; + + public TurtleEnderPearl(EntityType type, Level world) { + super(type, world); + this.noPhysics = true; + this.setNoGravity(true); + } + + public TurtleEnderPearl(ITurtleAccess turtle) { + this(APEntities.TURTLE_ENDER_PEARL.get(), turtle.getLevel()); + this.turtle = turtle; + this.spawnPos = turtle.getPosition(); + this.setPos(Vec3.atCenterOf(this.spawnPos)); + this.setDeltaMovement(Vec3.atLowerCornerOf(turtle.getDirection().getNormal()).scale(1 / 20.0)); + } + + @Nullable + public ITurtleAccess getTurtle() { + return turtle; + } + + public void setCallback(Consumer callback) { + this.callback = callback; + } + + @Nullable + private ServerComputer getServerComputer() { + if (this.turtle instanceof TurtleBrain turtle) { + return turtle.getOwner().createServerComputer(); + } + return null; + } + + @Override + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this); + } + + @Override + public void readAdditionalSaveData(CompoundTag storage) {} + + @Override + public void addAdditionalSaveData(CompoundTag storage) {} + + @Override + protected void defineSynchedData() {} + + @Override + public void tick() { + if (this.level.isClientSide) { + super.tick(); + return; + } + if (this.turtle == null) { + this.discard(); + return; + } + System.out.println("this.life: " + this.life + " pos = " + this.position()); + if (this.life < 0) { + this.life--; + // clean after 5s + if (this.life < -100) { + this.discard(); + return; + } + return; + } + if (this.life == 0) { + this.life = -1; + this.setDeltaMovement(Vec3.ZERO); + this.moveTo(Vec3.atCenterOf(this.blockPosition())); + if (this.callback != null) { + this.callback.accept(this); + } + return; + } + this.life--; + super.tick(); + } + + // TODO: the turtle ender pearl should have a fancy and 999w flash render + public static class Renderer extends EntityRenderer { + public Renderer(EntityRendererProvider.Context ctx) { + super(ctx); + } + + @Override + public boolean shouldRender(TurtleEnderPearl entity, Frustum view, double x, double y, double z) { + return super.shouldRender(entity, view, x, y, z); + } + + @Override + public ResourceLocation getTextureLocation(TurtleEnderPearl entity) { + return null; + } + } + + @Override + public void restoreFrom(Entity entity) { + super.restoreFrom(entity); + if (!(entity instanceof TurtleEnderPearl oldPearl)) { + return; + } + this.turtle = oldPearl.turtle; + this.callback = oldPearl.callback; + this.life = oldPearl.life + 20; + this.changedDim = true; + } + + @Override + public boolean canChangeDimensions() { + return !this.changedDim && super.canChangeDimensions(); + } + + @Override + public Entity changeDimension(ServerLevel newWorld) { + if (this.changedDim) { + return null; + } + Entity newEntity = super.changeDimension(newWorld); + this.changedDim = newEntity != null; + if (newEntity instanceof TurtleEnderPearl newPearl) { + newPearl.spawnPos = newPearl.blockPosition(); + } + return newEntity; + } + + @Override + protected void onHit(HitResult hit) { + if (hit.getType() == HitResult.Type.BLOCK) { + BlockHitResult blockHit = (BlockHitResult) hit; + if (this.spawnPos == null || !this.spawnPos.equals(blockHit.getBlockPos())) { + if (this.life > 0) { + this.life = 0; + } + } + } + } + + @Override + protected boolean canHitEntity(Entity entity) { + return false; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java new file mode 100644 index 000000000..9a9d4c3b6 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java @@ -0,0 +1,31 @@ +package de.srendi.advancedperipherals.common.setup; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.entity.TurtleEnderPearl; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraftforge.registries.RegistryObject; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) +public class APEntities { + + public static final RegistryObject> TURTLE_ENDER_PEARL = APRegistration.ENTITIES.register("turtle_ender_pearl", + () -> EntityType.Builder.of(TurtleEnderPearl::new, MobCategory.MISC) + .sized(0.5F, 0.5F) + .clientTrackingRange(4) + .updateInterval(5) + .fireImmune() + .build("turtle_ender_pearl")); + + public static void register() { + } + + @SubscribeEvent + public static void livingRender(EntityRenderersEvent.RegisterRenderers event) { + event.registerEntityRenderer(TURTLE_ENDER_PEARL.get(), TurtleEnderPearl.Renderer::new); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java index f8d25961a..6048d3643 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java @@ -3,6 +3,7 @@ import dan200.computercraft.api.pocket.PocketUpgradeSerialiser; import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser; import de.srendi.advancedperipherals.AdvancedPeripherals; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.ai.village.poi.PoiType; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.inventory.MenuType; @@ -18,6 +19,7 @@ public class APRegistration { public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, AdvancedPeripherals.MOD_ID); public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, AdvancedPeripherals.MOD_ID); + public static final DeferredRegister> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, AdvancedPeripherals.MOD_ID); public static final DeferredRegister> TILE_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, AdvancedPeripherals.MOD_ID); public static final DeferredRegister> CONTAINER_TYPES = DeferredRegister.create(ForgeRegistries.MENU_TYPES, AdvancedPeripherals.MOD_ID); public static final DeferredRegister POI_TYPES = DeferredRegister.create(ForgeRegistries.POI_TYPES, AdvancedPeripherals.MOD_ID); @@ -29,6 +31,7 @@ public static void register() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); BLOCKS.register(modEventBus); ITEMS.register(modEventBus); + ENTITIES.register(modEventBus); TILE_ENTITIES.register(modEventBus); CONTAINER_TYPES.register(modEventBus); POI_TYPES.register(modEventBus); @@ -39,6 +42,7 @@ public static void register() { APBlocks.register(); APBlockEntityTypes.register(); APItems.register(); + APEntities.register(); APContainerTypes.register(); APVillagers.register(); CCRegistration.register(); From 71ee459274d08454838500589dabe0fcbd54d845 Mon Sep 17 00:00:00 2001 From: Srendi Date: Tue, 7 May 2024 17:45:36 +0200 Subject: [PATCH 042/188] Cleanup BlockStatesAndModelsProvider --- .../data/BlockStatesAndModelsProvider.java | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java index 00d468cc0..39fa9b8c6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java @@ -8,11 +8,14 @@ import net.minecraft.data.DataGenerator; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; -import net.minecraftforge.client.model.generators.*; +import net.minecraftforge.client.model.generators.BlockModelBuilder; +import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.ModelProvider; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.registries.ForgeRegistries; -import java.lang.reflect.Array; import java.util.Arrays; public class BlockStatesAndModelsProvider extends BlockStateProvider { @@ -23,23 +26,34 @@ public BlockStatesAndModelsProvider(DataGenerator packOutput, ExistingFileHelper @Override protected void registerStatesAndModels() { + // Define blocks with specific sides and orientations peripheralBlock(APBlocks.ENVIRONMENT_DETECTOR.get(), "front", "top"); peripheralBlock(APBlocks.CHAT_BOX.get(), "front", "top"); - peripheralBlock(APBlocks.PLAYER_DETECTOR.get(), generateModel(APBlocks.PLAYER_DETECTOR.get(), false, "side", "front", "top")); peripheralBlock(APBlocks.ME_BRIDGE.get(), "front", "top"); peripheralBlock(APBlocks.RS_BRIDGE.get(), "front", "top"); peripheralBlock(APBlocks.ENERGY_DETECTOR.get(), "front", "back", "top", "east"); peripheralBlock(APBlocks.FLUID_DETECTOR.get(), "front", "back", "top", "east"); peripheralBlock(APBlocks.GAS_DETECTOR.get(), "front", "back", "top", "east"); - peripheralBlock(APBlocks.PERIPHERAL_CASING.get()); peripheralBlock(APBlocks.INVENTORY_MANAGER.get(), "front", "top"); - peripheralBlock(APBlocks.REDSTONE_INTEGRATOR.get(), generateModel(APBlocks.REDSTONE_INTEGRATOR.get(), false, "side", "front", "top", "bottom")); - peripheralBlock(APBlocks.BLOCK_READER.get(), generateModel(APBlocks.BLOCK_READER.get(), false, "north", "south", "east", "west", "up", "down")); peripheralBlock(APBlocks.GEO_SCANNER.get(), "front", "top"); peripheralBlock(APBlocks.COLONY_INTEGRATOR.get(), "front", "top"); peripheralBlock(APBlocks.NBT_STORAGE.get(), "front", "top"); + + // Define blocks with custom model generation + peripheralBlock(APBlocks.PLAYER_DETECTOR.get(), generateModel(APBlocks.PLAYER_DETECTOR.get(), false, "side", "front", "top")); + peripheralBlock(APBlocks.REDSTONE_INTEGRATOR.get(), generateModel(APBlocks.REDSTONE_INTEGRATOR.get(), false, "side", "front", "top", "bottom")); + peripheralBlock(APBlocks.BLOCK_READER.get(), generateModel(APBlocks.BLOCK_READER.get(), false, "north", "south", "east", "west", "up", "down")); + + // Define a simple block with all sides having the same texture + peripheralBlock(APBlocks.PERIPHERAL_CASING.get()); + } + + // Helper method to register block states and models with specific sides + private void peripheralBlock(Block block, String... sides) { + peripheralBlock(block, generateModel(block, true, sides)); } + // Helper method to register block states and models with a pre-generated model private void peripheralBlock(Block block, ModelFile file) { getVariantBuilder(block).forAllStates(state -> { ConfiguredModel.Builder builder = ConfiguredModel.builder().modelFile(file); @@ -58,10 +72,7 @@ private void peripheralBlock(Block block, ModelFile file) { }); } - private void peripheralBlock(Block block, String... sides) { - peripheralBlock(block, generateModel(block, true, sides)); - } - + // Helper method to generate a block model with specified sides and textures private BlockModelBuilder generateModel(Block block, boolean hasNormalSide, String... sides) { ResourceLocation particleTexture = blockTexture(block); BlockModelBuilder builder; @@ -70,15 +81,16 @@ private BlockModelBuilder generateModel(Block block, boolean hasNormalSide, Stri } else { builder = models().withExistingParent(name(block), mcLoc("block/cube_all")); } + for (String sideTexture : sides) { String side = sideTexture; if (side.equals("side")) { for (Direction direction : Direction.Plane.HORIZONTAL) builder.texture(direction.toString(), blockTexture(block, sideTexture)); } + // Handle special side names and particle texture if (side.equals("north")) particleTexture = blockTexture(block, "north"); - if (side.equals("front")) { side = "north"; particleTexture = blockTexture(block, "front"); @@ -89,23 +101,24 @@ private BlockModelBuilder generateModel(Block block, boolean hasNormalSide, Stri side = "down"; if (side.equals("back")) side = "south"; - builder.texture(side, blockTexture(block, sideTexture)); + builder.texture(side, blockTexture(block, sideTexture)); } - // Add our default bottom texture if there is no other defined + // Add default bottom texture if not specified if (!Arrays.asList(sides).contains("down") && !Arrays.asList(sides).contains("bottom")) { builder.texture("down", AdvancedPeripherals.getRL(ModelProvider.BLOCK_FOLDER + "/" + "bottom")); } - builder.texture("particle", particleTexture); return builder; } + // Helper method to generate a simple block model private BlockModelBuilder generateModel(Block block) { return models().cubeAll(name(block), blockTexture(block)); } + // Helper methods for generating resource locations and block names private ResourceLocation blockTexture(Block block, String offset) { ResourceLocation name = key(block); return new ResourceLocation(name.getNamespace(), ModelProvider.BLOCK_FOLDER + "/" + name.getPath() + "_" + offset); @@ -118,5 +131,4 @@ private ResourceLocation key(Block block) { private String name(Block block) { return key(block).getPath(); } - -} +} \ No newline at end of file From 1938f4cd740adc0b8468886f2e23fc7d687cac3a Mon Sep 17 00:00:00 2001 From: Srendi Date: Tue, 7 May 2024 18:53:26 +0200 Subject: [PATCH 043/188] satisfy checkstyle --- .../common/data/BlockStatesAndModelsProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java index 39fa9b8c6..1c78176b6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java @@ -131,4 +131,4 @@ private ResourceLocation key(Block block) { private String name(Block block) { return key(block).getPath(); } -} \ No newline at end of file +} From 2b64b906036e3eee825792554cef09bb9f6dd4dd Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 7 May 2024 12:45:32 -0600 Subject: [PATCH 044/188] remove map item when pearl gone --- .../plugins/AutomataWarpingPlugin.java | 7 +++++++ .../common/entity/TurtleEnderPearl.java | 16 +++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java index deb259dc3..5d12e1074 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java @@ -203,6 +203,13 @@ public final MethodResult portalShipPrepare() throws LuaException { try { res = automataCore.withOperation(PREPARE_PORTAL, new SingleOperationContext(1, 1), context -> { shipPearl.setCallback(pearl -> { + if (pearl == null || pearl.isRemoved()) { + for (IComputerAccess computer : automataCore.getConnectedComputers()) { + computer.queueEvent(PortalPrepareCallback.FAILED_EVENT_ID, shipId, "PEARL_GONE"); + } + shipPearls.remove(shipId); + return; + } Level level = pearl.getLevel(); if (level == turtle.getLevel()) { for (IComputerAccess computer : automataCore.getConnectedComputers()) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java index 76213b8a5..a6d3a0689 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java @@ -87,7 +87,6 @@ public void tick() { this.discard(); return; } - System.out.println("this.life: " + this.life + " pos = " + this.position()); if (this.life < 0) { this.life--; // clean after 5s @@ -118,7 +117,7 @@ public Renderer(EntityRendererProvider.Context ctx) { @Override public boolean shouldRender(TurtleEnderPearl entity, Frustum view, double x, double y, double z) { - return super.shouldRender(entity, view, x, y, z); + return entity.turtle != null && super.shouldRender(entity, view, x, y, z); } @Override @@ -127,6 +126,15 @@ public ResourceLocation getTextureLocation(TurtleEnderPearl entity) { } } + @Override + public void remove(Entity.RemovalReason reason) { + if (reason.shouldDestroy()) { + if (this.callback != null) { + this.callback.accept(null); + } + } + } + @Override public void restoreFrom(Entity entity) { super.restoreFrom(entity); @@ -162,9 +170,7 @@ protected void onHit(HitResult hit) { if (hit.getType() == HitResult.Type.BLOCK) { BlockHitResult blockHit = (BlockHitResult) hit; if (this.spawnPos == null || !this.spawnPos.equals(blockHit.getBlockPos())) { - if (this.life > 0) { - this.life = 0; - } + this.discard(); } } } From f5c9d80c97ab6ba30187505ea06b434ab4f59c84 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 8 May 2024 11:13:56 -0600 Subject: [PATCH 045/188] add up and down direction --- .../plugins/AutomataWarpingPlugin.java | 24 +++++++++++++++++-- .../common/entity/TurtleEnderPearl.java | 8 +++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java index 5d12e1074..575a47b9e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; +import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.ILuaCallback; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; @@ -19,6 +20,7 @@ import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; @@ -193,10 +195,28 @@ public final MethodResult distanceToPoint(String name) { * */ @LuaFunction - public final MethodResult portalShipPrepare() throws LuaException { + public final MethodResult portalShipPrepare(IArguments arguments) throws LuaException { + Direction direction; + switch (arguments.optString(0).orElse("").toLowerCase()) { + case "up": + case "top": + direction = Direction.UP; + break; + case "down": + case "bottom": + direction = Direction.DOWN; + break; + case "front": + case "": + direction = null; + break; + default: + return MethodResult.of(null, "Direction can only be 'up', 'top', 'down', 'bottom', or 'front'"); + } + TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); ITurtleAccess turtle = owner.getTurtle(); - TurtleEnderPearl shipPearl = new TurtleEnderPearl(turtle); + TurtleEnderPearl shipPearl = new TurtleEnderPearl(turtle, direction); String shipId = shipPearl.getStringUUID(); ServerWorker.add(() -> { MethodResult res; diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java index a6d3a0689..d65d4ea4a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java @@ -8,6 +8,7 @@ import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.projectile.ThrowableProjectile; @@ -38,12 +39,15 @@ public TurtleEnderPearl(EntityType type, Level world) { this.setNoGravity(true); } - public TurtleEnderPearl(ITurtleAccess turtle) { + public TurtleEnderPearl(ITurtleAccess turtle, @Nullable Direction direction) { this(APEntities.TURTLE_ENDER_PEARL.get(), turtle.getLevel()); this.turtle = turtle; this.spawnPos = turtle.getPosition(); this.setPos(Vec3.atCenterOf(this.spawnPos)); - this.setDeltaMovement(Vec3.atLowerCornerOf(turtle.getDirection().getNormal()).scale(1 / 20.0)); + if (direction == null) { + direction = turtle.getDirection(); + } + this.setDeltaMovement(Vec3.atLowerCornerOf(direction.getNormal()).scale(1 / 20.0)); } @Nullable From 3d5832e018d74779e84283a7b78a4c78fd65d883 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 8 May 2024 12:06:45 -0600 Subject: [PATCH 046/188] turtle can teleport to the end now --- .../plugins/AutomataWarpingPlugin.java | 20 ++++++------------- .../common/entity/TurtleEnderPearl.java | 6 ++++++ .../lib/peripherals/IBasePeripheral.java | 6 ++++++ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java index 575a47b9e..3bbe45ed2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java @@ -224,32 +224,26 @@ public final MethodResult portalShipPrepare(IArguments arguments) throws LuaExce res = automataCore.withOperation(PREPARE_PORTAL, new SingleOperationContext(1, 1), context -> { shipPearl.setCallback(pearl -> { if (pearl == null || pearl.isRemoved()) { - for (IComputerAccess computer : automataCore.getConnectedComputers()) { - computer.queueEvent(PortalPrepareCallback.FAILED_EVENT_ID, shipId, "PEARL_GONE"); - } + automataCore.queueEvent(PortalPrepareCallback.FAILED_EVENT_ID, shipId, "PEARL_GONE"); shipPearls.remove(shipId); return; } Level level = pearl.getLevel(); if (level == turtle.getLevel()) { - for (IComputerAccess computer : automataCore.getConnectedComputers()) { - computer.queueEvent(PortalPrepareCallback.FAILED_EVENT_ID, shipId, "NO_PORTAL_FOUND"); - } + automataCore.queueEvent(PortalPrepareCallback.FAILED_EVENT_ID, shipId, "NO_PORTAL_FOUND"); pearl.discard(); return; } BlockPos pos = pearl.blockPosition(); Map data = new HashMap<>(); - data.put("level", level); + data.put("name", level.dimension().location().toString()); data.put("pos", LuaConverter.posToObject(pos)); data.put("facing", pearl.getDirection().getName()); data.put("costs", getCostsToLevel(level)); data.put("canSpawn", owner.isMovementPossible(level, pos)); data.put("shipId", shipId); shipPearls.put(shipId, pearl); - for (IComputerAccess computer : automataCore.getConnectedComputers()) { - computer.queueEvent(PortalPrepareCallback.EVENT_ID, data); - } + automataCore.queueEvent(PortalPrepareCallback.EVENT_ID, data); }); turtle.getLevel().addFreshEntity(shipPearl); return null; @@ -259,9 +253,7 @@ public final MethodResult portalShipPrepare(IArguments arguments) throws LuaExce } if (res != null) { Object err = res.getResult()[1]; - for (IComputerAccess computer : automataCore.getConnectedComputers()) { - computer.queueEvent(PortalPrepareCallback.FAILED_EVENT_ID, shipId, err); - } + automataCore.queueEvent(PortalPrepareCallback.FAILED_EVENT_ID, shipId, err); } }); return new PortalPrepareCallback(shipId).pull; @@ -301,7 +293,7 @@ public final MethodResult portalShipActive(String id) throws LuaException { } private static int getCostsToLevel(Level level) { - String dimension = level.dimension().toString(); + String dimension = level.dimension().location().toString(); // TODO: load fuel costs from config switch (dimension) { case "minecraft:overworld": diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java index d65d4ea4a..09b52380a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java @@ -3,7 +3,9 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.turtle.core.TurtleBrain; +import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.setup.APEntities; +import de.srendi.advancedperipherals.common.util.ChunkManager; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -104,6 +106,7 @@ public void tick() { this.life = -1; this.setDeltaMovement(Vec3.ZERO); this.moveTo(Vec3.atCenterOf(this.blockPosition())); + AdvancedPeripherals.debug("Turtle Ender Pearl stabled: " + this.toString()); if (this.callback != null) { this.callback.accept(this); } @@ -132,6 +135,7 @@ public ResourceLocation getTextureLocation(TurtleEnderPearl entity) { @Override public void remove(Entity.RemovalReason reason) { + super.remove(reason); if (reason.shouldDestroy()) { if (this.callback != null) { this.callback.accept(null); @@ -164,7 +168,9 @@ public Entity changeDimension(ServerLevel newWorld) { Entity newEntity = super.changeDimension(newWorld); this.changedDim = newEntity != null; if (newEntity instanceof TurtleEnderPearl newPearl) { + AdvancedPeripherals.debug("Turtle Ender Pearl crossed to dimension " + newWorld.dimension().toString()); newPearl.spawnPos = newPearl.blockPosition(); + ChunkManager.get(newWorld).addForceChunk(newWorld, newPearl.getUUID(), newPearl.chunkPosition()); } return newEntity; } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IBasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IBasePeripheral.java index 8836997dc..d1736f7e6 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IBasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IBasePeripheral.java @@ -9,5 +9,11 @@ public interface IBasePeripheral extends IPeripheral Iterable getConnectedComputers(); + default void queueEvent(String event, Object... args) { + for (IComputerAccess computer : getConnectedComputers()) { + computer.queueEvent(event, args); + } + } + T getPeripheralOwner(); } From e2dcc6a74d49413f1e02710642630ac2b2e43a17 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 8 May 2024 13:43:51 -0600 Subject: [PATCH 047/188] stack turtle above the obsidian platform when crossing portal --- .../common/entity/TurtleEnderPearl.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java index 09b52380a..1c4a46bdc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java @@ -15,6 +15,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.projectile.ThrowableProjectile; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; @@ -24,6 +25,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import java.util.List; import java.util.function.Consumer; import org.jetbrains.annotations.Nullable; @@ -137,6 +139,7 @@ public ResourceLocation getTextureLocation(TurtleEnderPearl entity) { public void remove(Entity.RemovalReason reason) { super.remove(reason); if (reason.shouldDestroy()) { + ChunkManager.get(newWorld).removeForceChunk(newWorld, this.getUUID()); if (this.callback != null) { this.callback.accept(null); } @@ -171,6 +174,27 @@ public Entity changeDimension(ServerLevel newWorld) { AdvancedPeripherals.debug("Turtle Ender Pearl crossed to dimension " + newWorld.dimension().toString()); newPearl.spawnPos = newPearl.blockPosition(); ChunkManager.get(newWorld).addForceChunk(newWorld, newPearl.getUUID(), newPearl.chunkPosition()); + if (newWorld.dimension() == Level.END) { + newPearl.life = 0; + // do not spawn turtle on the obsidian platform + final int maxHeight = newWorld.getMaxBuildHeight(); + int lowestY = maxHeight; + for (; lowestY > newPearl.spawnPos.getY() + 2; lowestY--) { + if (!newWorld.getBlockState(newPearl.spawnPos.atY(lowestY - 1)).isAir()) { + break; + } + } + AdvancedPeripherals.debug("Turtle Ender Pearl lowest Y: " + lowestY); + for (int y = lowestY; y <= maxHeight; y++) { + BlockPos pos = newPearl.spawnPos.atY(y); + List pearlList = newWorld.getEntities(APEntities.TURTLE_ENDER_PEARL.get(), new AABB(pos), entity -> true); + if (pearlList.isEmpty()) { + AdvancedPeripherals.debug("Turtle Ender Pearl moved to " + pos); + newPearl.moveTo(Vec3.atCenterOf(pos)); + break; + } + } + } } return newEntity; } From b78b20ff23126fa14d6a4419231b06f4fcb75376 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 9 May 2024 10:02:36 -0600 Subject: [PATCH 048/188] cross dimension teleport --- .../plugins/AutomataWarpingPlugin.java | 68 +++++++++++-------- .../common/entity/TurtleEnderPearl.java | 1 - .../common/util/NBTUtil.java | 18 +++++ .../advancedperipherals/common/util/Pair.java | 2 +- 4 files changed, 58 insertions(+), 31 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java index 3bbe45ed2..462dd58a3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java @@ -37,7 +37,6 @@ public class AutomataWarpingPlugin extends AutomataCorePlugin { private static final String POINT_DATA_MARK = "warp_points"; - private static final String WORLD_DATA_MARK = "warp_world"; private final Map shipPearls = new HashMap<>(); @@ -54,14 +53,6 @@ public AutomataWarpingPlugin(AutomataCorePeripheral automataCore) { protected Pair getPointData() { TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); CompoundTag settings = owner.getDataStorage(); - if (!settings.contains(WORLD_DATA_MARK)) { - settings.putString(WORLD_DATA_MARK, owner.getLevel().dimension().location().toString()); - } else { - String worldName = settings.getString(WORLD_DATA_MARK); - if (!owner.getLevel().dimension().location().toString().equals(worldName)) { - return Pair.onlyLeft(MethodResult.of(null, "Incorrect world for this upgrade")); - } - } if (!settings.contains(POINT_DATA_MARK)) { settings.put(POINT_DATA_MARK, new CompoundTag()); } @@ -69,6 +60,22 @@ protected Pair getPointData() { return Pair.onlyRight(settings.getCompound(POINT_DATA_MARK)); } + protected Pair getPoint(String name) { + Pair res = getPointData(); + if (res.leftPresent()) { + return Pair.onlyLeft(res.getLeft()); + } + CompoundTag points = res.getRight(); + if (!points.contains(name)) { + return Pair.onlyLeft(MethodResult.of(null, "Warp point not exists")); + } + return Pair.onlyRight(points.getCompound(name)); + } + + private SingleOperationContext getWarpContext(Level level, BlockPos pos) { + return level == automataCore.getPeripheralOwner().getLevel() ? automataCore.toDistance(pos) : new SingleOperationContext(getCostsToLevel(level), 1); + } + private int getWarpCost(SingleOperationContext context) { FuelAbility fuelAbility = automataCore.getPeripheralOwner().getAbility(PeripheralOwnerAbility.FUEL); Objects.requireNonNull(fuelAbility); @@ -88,7 +95,9 @@ public final MethodResult savePoint(String name) { return MethodResult.of(null, "Cannot add new point, limit reached"); } - data.put(name, NBTUtil.toNBT(automataCore.getPeripheralOwner().getPos())); + TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); + Level level = owner.getLevel(); + data.put(name, NBTUtil.toNBT(level, owner.getPos())); return MethodResult.of(true); } @@ -96,8 +105,9 @@ public final MethodResult savePoint(String name) { public final MethodResult deletePoint(String name) { automataCore.addRotationCycle(); Pair pairData = getPointData(); - if (pairData.leftPresent()) + if (pairData.leftPresent()) { return pairData.getLeft(); + } CompoundTag data = pairData.getRight(); if (!data.contains(name)) { @@ -121,26 +131,24 @@ public final MethodResult points() { @LuaFunction(mainThread = true) public final MethodResult warpToPoint(String name) throws LuaException { - Pair pairData = getPointData(); + Pair pairData = getPoint(name); if (pairData.leftPresent()) { return pairData.getLeft(); } TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); - Level level = owner.getLevel(); - CompoundTag data = pairData.getRight(); - if (!data.contains(name)) { - return MethodResult.of(null, "Warp point not exists"); - } - BlockPos newPosition = NBTUtil.blockPosFromNBT(data.getCompound(name)); - return automataCore.withOperation(WARP, automataCore.toDistance(newPosition), context -> { - boolean result = owner.move(level, newPosition); + Pair newLevelAndPosition = NBTUtil.levelAndBlockPosFromNBT(pairData.getRight()); + Level newLevel = newLevelAndPosition.getLeft(); + BlockPos newPosition = newLevelAndPosition.getRight(); + + return automataCore.withOperation(WARP, getWarpContext(newLevel, newPosition), context -> { + boolean result = owner.move(newLevel, newPosition); if (!result) { return MethodResult.of(null, "Cannot teleport to location"); } return MethodResult.of(true); }, context -> { - if (!owner.isMovementPossible(level, newPosition)) { + if (!owner.isMovementPossible(newLevel, newPosition)) { return MethodResult.of(null, "Move forbidden"); } return null; @@ -149,26 +157,28 @@ public final MethodResult warpToPoint(String name) throws LuaException { @LuaFunction(mainThread = true) public final MethodResult estimateWarpCost(String name) { - Pair pairData = getPointData(); + Pair pairData = getPoint(name); if (pairData.leftPresent()) { return pairData.getLeft(); } - CompoundTag data = pairData.getRight(); - BlockPos newPosition = NBTUtil.blockPosFromNBT(data.getCompound(name)); - return MethodResult.of(getWarpCost(automataCore.toDistance(newPosition))); + Pair newLevelAndPosition = NBTUtil.levelAndBlockPosFromNBT(pairData.getRight()); + return MethodResult.of(getWarpCost(getWarpContext(newLevelAndPosition.getLeft(), newLevelAndPosition.getRight()))); } @LuaFunction(mainThread = true) public final MethodResult distanceToPoint(String name) { - Pair pairData = getPointData(); + Pair pairData = getPoint(name); if (pairData.leftPresent()) { return pairData.getLeft(); } - CompoundTag data = pairData.getRight(); - BlockPos newPosition = NBTUtil.blockPosFromNBT(data.getCompound(name)); - return MethodResult.of(newPosition.distManhattan(automataCore.getPeripheralOwner().getPos())); + TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); + Pair newLevelAndPosition = NBTUtil.levelAndBlockPosFromNBT(pairData.getRight()); + if (newLevelAndPosition.getLeft() != owner.getLevel()) { + return MethodResult.of(-1); + } + return MethodResult.of(newLevelAndPosition.getRight().distManhattan(owner.getPos())); } /** diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java index 1c4a46bdc..66876331f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java @@ -139,7 +139,6 @@ public ResourceLocation getTextureLocation(TurtleEnderPearl entity) { public void remove(Entity.RemovalReason reason) { super.remove(reason); if (reason.shouldDestroy()) { - ChunkManager.get(newWorld).removeForceChunk(newWorld, this.getUUID()); if (this.callback != null) { this.callback.accept(null); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java index b8bef9e45..d308da9c3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java @@ -4,8 +4,14 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.configuration.APConfig; import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.nbt.*; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ChunkPos; +import net.minecraftforge.server.ServerLifecycleHooks; import org.apache.logging.log4j.Level; import java.util.Map; @@ -65,6 +71,18 @@ public static BlockPos blockPosFromNBT(CompoundTag nbt) { return new BlockPos(nbt.getInt("x"), nbt.getInt("y"), nbt.getInt("z")); } + public static Pair levelAndBlockPosFromNBT(CompoundTag nbt) { + MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + ServerLevel level = server.getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(nbt.getString("dim")))); + return new Pair(level, blockPosFromNBT(nbt)); + } + + public static CompoundTag toNBT(net.minecraft.world.level.Level level, BlockPos pos) { + CompoundTag data = toNBT(pos); + data.putString("dim", level.dimension().location().toString()); + return data; + } + public static CompoundTag toNBT(ChunkPos pos) { CompoundTag data = new CompoundTag(); data.putInt("x", pos.x); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/Pair.java b/src/main/java/de/srendi/advancedperipherals/common/util/Pair.java index fe2b993dd..376a2cacb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/Pair.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/Pair.java @@ -4,7 +4,7 @@ import java.util.function.Consumer; import java.util.function.Function; -public class Pair { +public final class Pair { private final T left; private final V right; From d725e711cff596beedf02a6dd9c9f30a126f16e3 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 9 May 2024 23:02:07 -0600 Subject: [PATCH 049/188] add doc for SwarmEventDispatcher --- .../common/util/SwarmEventDispatcher.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java index 2172edc99..2100f484b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java @@ -19,6 +19,11 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.jetbrains.annotations.NotNull; +/** + * SwarmEventDispatcher will combine multiple same events which fired from different peripherals into one event as a table. + * Then we can save ComputerCraft's event queue space. + * + */ @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID) public final class SwarmEventDispatcher { private static final ConcurrentMap>>> events = new ConcurrentHashMap<>(); @@ -26,6 +31,20 @@ public final class SwarmEventDispatcher { private SwarmEventDispatcher() {} + /** + * dispatch will put periperal and event data into queue. + * The events will be fired together at the end of the tick. + * + * For example, + * if you invoke {@code dispatch("a_event", peripheral1, "random data1")} and {@code dispatch("a_event", peripheral2, "random data2")} + * the event will be pushed at the end of the tick with form of + * {@code + * "a_event", { + * ["peripheral1_name"] = {"random data1"}, + * ["peripheral2_name"] = {"random data2"}, + * } + * } + */ public static void dispatch(@NotNull String event, @NotNull BasePeripheral peripheral, Object data) { boolean set = false; ConcurrentMap>> computers = events.computeIfAbsent(event, (k) -> new ConcurrentHashMap<>()); From fbc2402ffc40f3eafbcc70be777a95f9b3b51f3d Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 10 May 2024 09:17:13 -0600 Subject: [PATCH 050/188] update swam event javadoc --- .../common/util/SwarmEventDispatcher.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java index 2100f484b..8799bbb03 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java @@ -32,18 +32,31 @@ public final class SwarmEventDispatcher { private SwarmEventDispatcher() {} /** - * dispatch will put periperal and event data into queue. + * {@code dispatch} will put periperal and event data into queue. * The events will be fired together at the end of the tick. * - * For example, - * if you invoke {@code dispatch("a_event", peripheral1, "random data1")} and {@code dispatch("a_event", peripheral2, "random data2")} - * the event will be pushed at the end of the tick with form of - * {@code + * For example, if you invoke + *
+     * 
+     * dispatch("a_event", peripheral1, "random data1")
+     * dispatch("a_event", peripheral1, "data2")
+     * dispatch("a_event", peripheral2, "random data3")
+     * dispatch("another_event", peripheral1, "random data4")
+     * 
+     * 
+     * the events will be pushed at the end of the tick with form of
+     * 
+     * 
      * "a_event", {
-     *   ["peripheral1_name"] = {"random data1"},
-     *   ["peripheral2_name"] = {"random data2"},
+     *   ["peripheral1_name"] = {"random data1", "data2"},
+     *   ["peripheral2_name"] = {"random data3"},
      * }
+     * 
+     * "another_event", {
+     *   ["peripheral1_name"] = {"random data4"},
      * }
+     * 
+     * 
*/ public static void dispatch(@NotNull String event, @NotNull BasePeripheral peripheral, Object data) { boolean set = false; From a7d764cc09fe65370fd486dd812123184c196d1a Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 13 May 2024 11:27:02 -0600 Subject: [PATCH 051/188] ensure the redstone output value is between [0,15] fix #611 --- .../peripheral/RedstoneIntegratorPeripheral.java | 3 +++ .../blocks/blockentities/RedstoneIntegratorEntity.java | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java index 733d3f63c..480490ee2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java @@ -55,6 +55,9 @@ public final void setOutput(String direction, boolean power) throws LuaException @LuaFunction(value = {"setAnalogueOutput", "setAnalogOutput"}) public final void setAnalogOutput(String direction, int power) throws LuaException { Direction dir = validateSide(direction); + if (power > 15 || power < 0) { + throw new LuaException("redstone power exceeds the range [0,15]"); + } owner.tileEntity.setOutput(dir, power); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java index 2b3371f3d..684243ca6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java @@ -82,6 +82,11 @@ private void updateRedstoneOutputs() { * @param power The redstone power from 0 to 15 */ public void setOutput(Direction direction, int power) { + if (power > 15) { + power = 15; + } else if (power < 0) { + power = 0; + } this.outputs[direction.get3DDataValue()] = power; if (this.outputStatus.compareAndSet(0, 1)) { ServerWorker.add(() -> { From e79c09cbc4992fa1476c5e8597d47b5799a0db93 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 13 May 2024 11:36:14 -0600 Subject: [PATCH 052/188] fix style --- .../peripheral/RedstoneIntegratorPeripheral.java | 1 - .../common/util/SwarmEventDispatcher.java | 7 +++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java index 480490ee2..5e6625c4b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java @@ -2,7 +2,6 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; -import dan200.computercraft.core.computer.ComputerSide; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.RedstoneIntegratorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java index 8799bbb03..a434dcc99 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java @@ -22,7 +22,6 @@ /** * SwarmEventDispatcher will combine multiple same events which fired from different peripherals into one event as a table. * Then we can save ComputerCraft's event queue space. - * */ @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID) public final class SwarmEventDispatcher { @@ -34,7 +33,7 @@ private SwarmEventDispatcher() {} /** * {@code dispatch} will put periperal and event data into queue. * The events will be fired together at the end of the tick. - * + * * For example, if you invoke *
      * 
@@ -43,7 +42,7 @@ private SwarmEventDispatcher() {}
      * dispatch("a_event", peripheral2, "random data3")
      * dispatch("another_event", peripheral1, "random data4")
      * 
-     * 
+     * 
* the events will be pushed at the end of the tick with form of *
      * 
@@ -51,7 +50,7 @@ private SwarmEventDispatcher() {}
      *   ["peripheral1_name"] = {"random data1", "data2"},
      *   ["peripheral2_name"] = {"random data3"},
      * }
-     * 
+     *
      * "another_event", {
      *   ["peripheral1_name"] = {"random data4"},
      * }

From ed8c7552114e7d4568d56df756599137d312822b Mon Sep 17 00:00:00 2001
From: Kevin Z 
Date: Sat, 18 May 2024 09:10:27 -0600
Subject: [PATCH 053/188] Update
 src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java

Co-authored-by: Srendi 
Signed-off-by: Kevin Z 
---
 .../blocks/blockentities/RedstoneIntegratorEntity.java      | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java
index 684243ca6..6edd77381 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java
@@ -82,11 +82,7 @@ private void updateRedstoneOutputs() {
      * @param power     The redstone power from 0 to 15
      */
     public void setOutput(Direction direction, int power) {
-        if (power > 15) {
-            power = 15;
-        } else if (power < 0) {
-            power = 0;
-        }
+        power = Math.min(Math.max(power, 0), 15);
         this.outputs[direction.get3DDataValue()] = power;
         if (this.outputStatus.compareAndSet(0, 1)) {
             ServerWorker.add(() -> {

From 4562e1f10f6ba2a3fccfbe1d749ed421ead8e441 Mon Sep 17 00:00:00 2001
From: Srendi 
Date: Tue, 21 May 2024 19:53:31 +0200
Subject: [PATCH 054/188] Add the remaining textures and fix some language
 entries

---
 .../b8526e444ae7356037f3a813274f6835d1f3dd16  |   4 +-
 .../c622617f6fabf890a00b9275cd5f643584a8a2c8  |   4 +-
 .../blockstates/distance_detector.json        |  57 ++++++++++++++++++
 .../advancedperipherals/lang/en_us.json       |   7 +++
 .../models/block/distance_detector.json       |  12 ++++
 .../data/BlockStatesAndModelsProvider.java    |   1 +
 .../common/data/EnUsLanguageProvider.java     |  11 +++-
 .../common/setup/APItems.java                 |   6 +-
 .../models/item/distance_detector.json        |   3 +
 .../models/item/fluid_detector.json           |   3 +
 .../models/item/gas_detector.json             |   3 +
 .../models/item/glasses_interface.json        |   6 ++
 .../models/item/hotkey_module.json            |   6 ++
 .../models/item/nightvision_module.json       |   6 ++
 .../models/item/overlay_module.json           |   6 ++
 .../models/item/smart_glasses_interface.json  |   6 ++
 .../models/item/smart_glasses_netherite.json  |   6 ++
 .../textures/block/distance_detector_down.png | Bin 0 -> 443 bytes
 .../textures/block/distance_detector_east.png | Bin 0 -> 509 bytes
 .../block/distance_detector_north.png         | Bin 0 -> 523 bytes
 .../block/distance_detector_south.png         | Bin 0 -> 424 bytes
 .../textures/block/distance_detector_up.png   | Bin 0 -> 438 bytes
 .../textures/block/distance_detector_west.png | Bin 0 -> 520 bytes
 .../textures/item/hotkey_module.png           | Bin 0 -> 415 bytes
 .../textures/item/nightvision_module.png      | Bin 0 -> 436 bytes
 .../textures/item/overlay_module.png          | Bin 0 -> 405 bytes
 .../textures/item/smart_glasses.png           | Bin 273 -> 311 bytes
 .../textures/item/smart_glasses_interface.png | Bin 0 -> 449 bytes
 .../textures/item/smart_glasses_netherite.png | Bin 0 -> 299 bytes
 .../armor/netherite_glasses_layer_1.png       | Bin 0 -> 474 bytes
 30 files changed, 139 insertions(+), 8 deletions(-)
 create mode 100644 src/generated/resources/assets/advancedperipherals/blockstates/distance_detector.json
 create mode 100644 src/generated/resources/assets/advancedperipherals/models/block/distance_detector.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/distance_detector.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/fluid_detector.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/gas_detector.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/glasses_interface.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/hotkey_module.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/nightvision_module.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/overlay_module.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/smart_glasses_interface.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/smart_glasses_netherite.json
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/distance_detector_down.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/distance_detector_east.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/distance_detector_north.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/distance_detector_south.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/distance_detector_up.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/block/distance_detector_west.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/hotkey_module.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/nightvision_module.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/overlay_module.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/smart_glasses_interface.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/item/smart_glasses_netherite.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/models/armor/netherite_glasses_layer_1.png

diff --git a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16 b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16
index 1d2c65434..8dae79ce3 100644
--- a/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16
+++ b/src/generated/resources/.cache/b8526e444ae7356037f3a813274f6835d1f3dd16
@@ -1,7 +1,8 @@
-// 1.19.2	2024-05-02T00:18:31.0476401	Block States: advancedperipherals
+// 1.19.2	2024-05-21T19:34:45.6005706	Block States: advancedperipherals
 5e28ce1be9a6996d982641e5df1fa7162090b8cc assets/advancedperipherals/blockstates/block_reader.json
 f42bdde60f84fdb312f7cf3b2be461d9c11ebdc8 assets/advancedperipherals/blockstates/chat_box.json
 1227aa092fcf1327547ace6ccc9db230e45891b0 assets/advancedperipherals/blockstates/colony_integrator.json
+83144ea6122b3abe70777458ac913b6f217c27cc assets/advancedperipherals/blockstates/distance_detector.json
 67420f28031606ca03db9a044141bb22b0fa78b7 assets/advancedperipherals/blockstates/energy_detector.json
 340b5baa62e5e6a2c35a05b4411be5937ac2bbb8 assets/advancedperipherals/blockstates/environment_detector.json
 f40e0ac205d0473908fd957d035dd747dc64e26a assets/advancedperipherals/blockstates/fluid_detector.json
@@ -17,6 +18,7 @@ ff12c7217911184266589813a2c8f9b0d46cfd65 assets/advancedperipherals/blockstates/
 544ff1ecb58622350b58940036b4b1908e1146da assets/advancedperipherals/models/block/block_reader.json
 fbaa69d6c98549d3f2d4a1c7bebd9b6b80d56621 assets/advancedperipherals/models/block/chat_box.json
 68f9d37bd85649937150ba0bb8f4496bb2ef218d assets/advancedperipherals/models/block/colony_integrator.json
+80b30400b6ebac490a1abaad965f33c1b62c19e9 assets/advancedperipherals/models/block/distance_detector.json
 b4c6645fda79d960e9201e2a60eb1c8063a07d18 assets/advancedperipherals/models/block/energy_detector.json
 eca505b2bd8db5f1d13f1e28093db329b70af978 assets/advancedperipherals/models/block/environment_detector.json
 f6ab51bcfc829c7db490f691e8eb491e5e7028f3 assets/advancedperipherals/models/block/fluid_detector.json
diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8
index 0350a3d7c..3ca333ee4 100644
--- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8
+++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8
@@ -1,2 +1,2 @@
-// 1.19.2	2023-09-25T15:21:21.7533003	Languages: en_us
-e7e0fec72e3f82423dea2c37d1fef381865df701 assets/advancedperipherals/lang/en_us.json
+// 1.19.2	2024-05-21T19:49:29.0042891	Languages: en_us
+2503b9953090303ef91a3d7ae64f7a6a6b75bb3b assets/advancedperipherals/lang/en_us.json
diff --git a/src/generated/resources/assets/advancedperipherals/blockstates/distance_detector.json b/src/generated/resources/assets/advancedperipherals/blockstates/distance_detector.json
new file mode 100644
index 000000000..4201dd6d7
--- /dev/null
+++ b/src/generated/resources/assets/advancedperipherals/blockstates/distance_detector.json
@@ -0,0 +1,57 @@
+{
+  "variants": {
+    "orientation=down_east": {
+      "model": "advancedperipherals:block/distance_detector",
+      "x": 90,
+      "y": 90
+    },
+    "orientation=down_north": {
+      "model": "advancedperipherals:block/distance_detector",
+      "x": 90
+    },
+    "orientation=down_south": {
+      "model": "advancedperipherals:block/distance_detector",
+      "x": 90,
+      "y": 180
+    },
+    "orientation=down_west": {
+      "model": "advancedperipherals:block/distance_detector",
+      "x": 90,
+      "y": 270
+    },
+    "orientation=east_up": {
+      "model": "advancedperipherals:block/distance_detector",
+      "y": 90
+    },
+    "orientation=north_up": {
+      "model": "advancedperipherals:block/distance_detector"
+    },
+    "orientation=south_up": {
+      "model": "advancedperipherals:block/distance_detector",
+      "y": 180
+    },
+    "orientation=up_east": {
+      "model": "advancedperipherals:block/distance_detector",
+      "x": 270,
+      "y": 90
+    },
+    "orientation=up_north": {
+      "model": "advancedperipherals:block/distance_detector",
+      "x": 270
+    },
+    "orientation=up_south": {
+      "model": "advancedperipherals:block/distance_detector",
+      "x": 270,
+      "y": 180
+    },
+    "orientation=up_west": {
+      "model": "advancedperipherals:block/distance_detector",
+      "x": 270,
+      "y": 270
+    },
+    "orientation=west_up": {
+      "model": "advancedperipherals:block/distance_detector",
+      "y": 270
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json
index acbdd3c4c..ee30d74a9 100644
--- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json
+++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json
@@ -19,8 +19,11 @@
   "block.advancedperipherals.block_reader": "Block Reader",
   "block.advancedperipherals.chat_box": "Chat Box",
   "block.advancedperipherals.colony_integrator": "Colony Integrator",
+  "block.advancedperipherals.distance_detector": "Distance Detector",
   "block.advancedperipherals.energy_detector": "Energy Detector",
   "block.advancedperipherals.environment_detector": "Environment Detector",
+  "block.advancedperipherals.fluid_detector": "Fluid Detector",
+  "block.advancedperipherals.gas_detector": "Gas Detector",
   "block.advancedperipherals.geo_scanner": "Geo Scanner",
   "block.advancedperipherals.inventory_manager": "Inventory Manager",
   "block.advancedperipherals.me_bridge": "ME Bridge",
@@ -34,8 +37,11 @@
   "item.advancedperipherals.chunk_controller": "Chunk Controller",
   "item.advancedperipherals.computer_tool": "Computer Tool",
   "item.advancedperipherals.end_automata_core": "End Automata Core",
+  "item.advancedperipherals.hotkey_module": "Hotkey Module",
   "item.advancedperipherals.husbandry_automata_core": "Husbandry Automata Core",
   "item.advancedperipherals.memory_card": "Memory Card",
+  "item.advancedperipherals.nightvision_module": "Night Vision Module",
+  "item.advancedperipherals.overlay_module": "Overlay Module",
   "item.advancedperipherals.overpowered_end_automata_core": "Overpowered End Automata Core",
   "item.advancedperipherals.overpowered_husbandry_automata_core": "Overpowered Husbandry Automata Core",
   "item.advancedperipherals.overpowered_weak_automata_core": "Overpowered Weak Automata Core",
@@ -68,6 +74,7 @@
   "item.advancedperipherals.tooltip.show_desc": "&b[&7%s&b] &7For Description",
   "item.advancedperipherals.tooltip.weak_automata_core": "&7Upgrade for turtles, which makes turtles more useful.",
   "item.advancedperipherals.weak_automata_core": "Weak Automata Core",
+  "itemGroup.advancedperipheralstab": "Advanced Peripherals",
   "keybind.advancedperipherals.category": "Advanced Peripherals",
   "keybind.advancedperipherals.description": "Show Description",
   "pocket.advancedperipherals.chatty_pocket": "Chatty",
diff --git a/src/generated/resources/assets/advancedperipherals/models/block/distance_detector.json b/src/generated/resources/assets/advancedperipherals/models/block/distance_detector.json
new file mode 100644
index 000000000..0cee7c371
--- /dev/null
+++ b/src/generated/resources/assets/advancedperipherals/models/block/distance_detector.json
@@ -0,0 +1,12 @@
+{
+  "parent": "minecraft:block/cube_all",
+  "textures": {
+    "down": "advancedperipherals:block/distance_detector_down",
+    "east": "advancedperipherals:block/distance_detector_east",
+    "north": "advancedperipherals:block/distance_detector_north",
+    "particle": "advancedperipherals:block/distance_detector_north",
+    "south": "advancedperipherals:block/distance_detector_south",
+    "up": "advancedperipherals:block/distance_detector_up",
+    "west": "advancedperipherals:block/distance_detector_west"
+  }
+}
\ No newline at end of file
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java
index 1c78176b6..85b2e682c 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java
@@ -43,6 +43,7 @@ protected void registerStatesAndModels() {
         peripheralBlock(APBlocks.PLAYER_DETECTOR.get(), generateModel(APBlocks.PLAYER_DETECTOR.get(), false, "side", "front", "top"));
         peripheralBlock(APBlocks.REDSTONE_INTEGRATOR.get(), generateModel(APBlocks.REDSTONE_INTEGRATOR.get(), false, "side", "front", "top", "bottom"));
         peripheralBlock(APBlocks.BLOCK_READER.get(), generateModel(APBlocks.BLOCK_READER.get(), false, "north", "south", "east", "west", "up", "down"));
+        peripheralBlock(APBlocks.DISTANCE_DETECTOR.get(), generateModel(APBlocks.DISTANCE_DETECTOR.get(), false, "north", "south", "east", "west", "up", "down"));
 
         // Define a simple block with all sides having the same texture
         peripheralBlock(APBlocks.PERIPHERAL_CASING.get());
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java
index 2c96363be..1f321fa62 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java
@@ -35,8 +35,9 @@ protected void addTranslations() {
         addKeybinds();
         addText();
         add(APVillagers.COMPUTER_SCIENTIST, "Computer Scientist");
-        add("advancedperipherals.name", "Advanced Peripherals");
+        add("advancedperipherals.name", AdvancedPeripherals.NAME);
         add("curios.identifier.glasses", "Glasses");
+        add("itemGroup.advancedperipheralstab", AdvancedPeripherals.NAME);
     }
 
     private void addItems() {
@@ -52,6 +53,9 @@ private void addItems() {
         addItem(APItems.SMART_GLASSES, "Smart Glasses");
         addItem(APItems.SMART_GLASSES_NETHERITE, "Netherite reinforced Smart Glasses");
         addItem(APItems.SMART_GLASSES_INTERFACE, "Smart Glasses Interface");
+        addItem(APItems.OVERLAY_MODULE, "Overlay Module");
+        addItem(APItems.NIGHT_VISION_MODULE, "Night Vision Module");
+        addItem(APItems.HOTKEY_MODULE, "Hotkey Module");
     }
 
     private void addBlocks() {
@@ -59,6 +63,8 @@ private void addBlocks() {
         addBlock(APBlocks.CHAT_BOX, "Chat Box");
         addBlock(APBlocks.COLONY_INTEGRATOR, "Colony Integrator");
         addBlock(APBlocks.ENERGY_DETECTOR, "Energy Detector");
+        addBlock(APBlocks.FLUID_DETECTOR, "Fluid Detector");
+        addBlock(APBlocks.GAS_DETECTOR, "Gas Detector");
         addBlock(APBlocks.ENVIRONMENT_DETECTOR, "Environment Detector");
         addBlock(APBlocks.GEO_SCANNER, "Geo Scanner");
         addBlock(APBlocks.INVENTORY_MANAGER, "Inventory Manager");
@@ -68,6 +74,7 @@ private void addBlocks() {
         addBlock(APBlocks.PERIPHERAL_CASING, "Peripheral Casing");
         addBlock(APBlocks.PLAYER_DETECTOR, "Player Detector");
         addBlock(APBlocks.REDSTONE_INTEGRATOR, "Redstone Integrator");
+        addBlock(APBlocks.DISTANCE_DETECTOR, "Distance Detector");
     }
 
     private void addTurtles() {
@@ -141,7 +148,7 @@ private void addText() {
     }
 
     private void addKeybinds() {
-        add("keybind.advancedperipherals.category", "Advanced Peripherals");
+        add("keybind.advancedperipherals.category", AdvancedPeripherals.NAME);
         addKeybind(KeyBindings.DESCRIPTION_KEYBINDING, "Show Description");
     }
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java
index 985a406f8..23ba2dc15 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java
@@ -15,9 +15,9 @@ public class APItems {
     public static final RegistryObject SMART_GLASSES = APRegistration.ITEMS.register("smart_glasses", () -> new SmartGlassesItem(SmartGlassesMaterials.CHAIN));
     public static final RegistryObject SMART_GLASSES_NETHERITE = APRegistration.ITEMS.register("smart_glasses_netherite", () -> new SmartGlassesItem(SmartGlassesMaterials.NETHERITE));
     public static final RegistryObject SMART_GLASSES_INTERFACE = APRegistration.ITEMS.register("smart_glasses_interface", SmartGlassesInterfaceItem::new);
-    public static final RegistryObject OVERLAY_GLASSES = APRegistration.ITEMS.register("overlayglasses", OverlayGlassesItem::new);
-    public static final RegistryObject HOTKEY_MODULE = APRegistration.ITEMS.register("hotkeymodule", HotkeyModuleItem::new);
-    public static final RegistryObject NIGHT_VISION_MODULE = APRegistration.ITEMS.register("nightvisionmodule", NightVisionModuleItem::new);
+    public static final RegistryObject OVERLAY_MODULE = APRegistration.ITEMS.register("overlay_module", OverlayGlassesItem::new);
+    public static final RegistryObject HOTKEY_MODULE = APRegistration.ITEMS.register("hotkey_module", HotkeyModuleItem::new);
+    public static final RegistryObject NIGHT_VISION_MODULE = APRegistration.ITEMS.register("nightvision_module", NightVisionModuleItem::new);
     public static final RegistryObject COMPUTER_TOOL = APRegistration.ITEMS.register("computer_tool", () -> new APItem(new Item.Properties().stacksTo(1), () -> true));
     public static final RegistryObject MEMORY_CARD = APRegistration.ITEMS.register("memory_card", MemoryCardItem::new);
     public static final RegistryObject END_AUTOMATA_CORE = APRegistration.ITEMS.register("end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore));
diff --git a/src/main/resources/assets/advancedperipherals/models/item/distance_detector.json b/src/main/resources/assets/advancedperipherals/models/item/distance_detector.json
new file mode 100644
index 000000000..a082e96e2
--- /dev/null
+++ b/src/main/resources/assets/advancedperipherals/models/item/distance_detector.json
@@ -0,0 +1,3 @@
+{
+  "parent": "advancedperipherals:block/distance_detector"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/advancedperipherals/models/item/fluid_detector.json b/src/main/resources/assets/advancedperipherals/models/item/fluid_detector.json
new file mode 100644
index 000000000..1b807b14c
--- /dev/null
+++ b/src/main/resources/assets/advancedperipherals/models/item/fluid_detector.json
@@ -0,0 +1,3 @@
+{
+  "parent": "advancedperipherals:block/fluid_detector"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/advancedperipherals/models/item/gas_detector.json b/src/main/resources/assets/advancedperipherals/models/item/gas_detector.json
new file mode 100644
index 000000000..ccfae0e7e
--- /dev/null
+++ b/src/main/resources/assets/advancedperipherals/models/item/gas_detector.json
@@ -0,0 +1,3 @@
+{
+  "parent": "advancedperipherals:block/gas_detector"
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/advancedperipherals/models/item/glasses_interface.json b/src/main/resources/assets/advancedperipherals/models/item/glasses_interface.json
new file mode 100644
index 000000000..9360dcabb
--- /dev/null
+++ b/src/main/resources/assets/advancedperipherals/models/item/glasses_interface.json
@@ -0,0 +1,6 @@
+{
+  "parent": "item/generated",
+  "textures": {
+    "layer0": "advancedperipherals:item/glasses_interface"
+  }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/advancedperipherals/models/item/hotkey_module.json b/src/main/resources/assets/advancedperipherals/models/item/hotkey_module.json
new file mode 100644
index 000000000..32d09adea
--- /dev/null
+++ b/src/main/resources/assets/advancedperipherals/models/item/hotkey_module.json
@@ -0,0 +1,6 @@
+{
+  "parent": "item/generated",
+  "textures": {
+    "layer0": "advancedperipherals:item/hotkey_module"
+  }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/advancedperipherals/models/item/nightvision_module.json b/src/main/resources/assets/advancedperipherals/models/item/nightvision_module.json
new file mode 100644
index 000000000..5a3622d06
--- /dev/null
+++ b/src/main/resources/assets/advancedperipherals/models/item/nightvision_module.json
@@ -0,0 +1,6 @@
+{
+  "parent": "item/generated",
+  "textures": {
+    "layer0": "advancedperipherals:item/nightvision_module"
+  }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/advancedperipherals/models/item/overlay_module.json b/src/main/resources/assets/advancedperipherals/models/item/overlay_module.json
new file mode 100644
index 000000000..1cd0fb85d
--- /dev/null
+++ b/src/main/resources/assets/advancedperipherals/models/item/overlay_module.json
@@ -0,0 +1,6 @@
+{
+  "parent": "item/generated",
+  "textures": {
+    "layer0": "advancedperipherals:item/overlay_module"
+  }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_interface.json b/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_interface.json
new file mode 100644
index 000000000..5a3622d06
--- /dev/null
+++ b/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_interface.json
@@ -0,0 +1,6 @@
+{
+  "parent": "item/generated",
+  "textures": {
+    "layer0": "advancedperipherals:item/nightvision_module"
+  }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_netherite.json b/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_netherite.json
new file mode 100644
index 000000000..cf1262ab3
--- /dev/null
+++ b/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_netherite.json
@@ -0,0 +1,6 @@
+{
+  "parent": "item/generated",
+  "textures": {
+    "layer0": "advancedperipherals:item/smart_glasses_netherite"
+  }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/advancedperipherals/textures/block/distance_detector_down.png b/src/main/resources/assets/advancedperipherals/textures/block/distance_detector_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..cae832bbbf43f4d780b858839dfdebb14962ae23
GIT binary patch
literal 443
zcmV;s0Yv_ZP)4
ze`eo1tfE04mb4&fx0;m7M}&c|$`|qSupM_RBEV=e-F)5YCSWUCekwaH9D5C8d359#
lOux6lT%`Zjci*Z5`~eO|*8(tmJEQ;r002ovPDHLkV1iWh#1{Yn

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/advancedperipherals/textures/block/distance_detector_east.png b/src/main/resources/assets/advancedperipherals/textures/block/distance_detector_east.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6d901d72dd52b97dab6b8bab13374ed2511181a
GIT binary patch
literal 509
zcmVmUp}o
zYpwUE1&vwOT8hCCYc1t;LOGpyZg;0oadqi)5ur8)rBv)ecXcJ|>QD@ZY;LS^cyvNJ
z9z_a7DMf7zBH|TdMu(yBU3vF(!0r26=Pwwl+tI*h%
z*4iro(08|Fd57-PXa3Ur&p*70ZaWTAlm$guL^J;$oO{WKM<)^IaQyYSDPXN-eZA)<
z4m1MG@MOH)8_G1)%;PVsq(p4
zYq^K0uT8UsU*~6@a0pix@(=MBcPZ^21}P*Z00000NkvXXu0mjfwUp!>

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/advancedperipherals/textures/block/distance_detector_north.png b/src/main/resources/assets/advancedperipherals/textures/block/distance_detector_north.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c3c26a824414f2f3ab574d344023b10e926994a
GIT binary patch
literal 523
zcmV+m0`&cfP)kpXZg;!-`MQiO90O;Sp062gCgw@U4^!kGZCC(=RNz#NQO)3em4_*OqbQJim^Em!`
zToka@vbEK5lkwo*9U3d^q@y8?mD&ABM?=q>tG571etbuq^sDhDy)k5&COp?*0A|w}13s5ZF=maya(NAF
zOhjJpN+iCJN*8X~R*9vdA$UrLe|CgM4d|N6$@&hzH9e$85ep
zS>%vP!5YIVE|C%ugw~oHQmJU!%kJ_zQX-W)R}e28^AHQYA)?rWEZeZV;oyISTI=pB
zSYwc78$3Ne@aah|85ycc!p8RNJNjWRdl8cgFF9QFL|L|h*81#kBqGjxclWEq-geA=
zsj#;OeW@UXfO8H)2qyNmb1qhJbGu@oZYreX3F@X|EFDj{=c8>kw)qbdf5XT6jR*YM
zwwmj@skq+levb;AbEumN)9DotgmH?st;S%`d9t^rd&1}XodF+xd2~9&PvZ~$tn4d|
Sh%OQU0000$|(}zI%6aeRKEA4ytM`V9dLCYGwQn$1yFK0n?W
z4F{fbzuV?4~|+10O@)`uM>K^#GshX7?=+IUBJsUMMO$d
z*gA)*W(=%_biF`Ch~wtL1FDDhqvNcos%K!MF;Ua?!Uq^-yJHB-&g|0sCll{&>HOvC
z^owKgQ!w;8Az`CQx?T`A^7mnEiV%@pM8J!s(`;n2%-_epCI>Afr%7pfir8PU;{O23
gi}c_69$R&QKi&_^w9$Dp!2kdN07*qoM6N<$f(5+482|tP

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/advancedperipherals/textures/block/distance_detector_west.png b/src/main/resources/assets/advancedperipherals/textures/block/distance_detector_west.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd82f778ad5d3da42ab7b61fd7480116b8328797
GIT binary patch
literal 520
zcmV+j0{8uiP)P$>fEtnW9a}JVyY@ANOWMSN{#?dFYO5&=Pbcs>~jjwlJ|MyydTdSUwQaw{F}ef
zTKf8SJ4TI(tZ(TP1q*GG#E
zJhr#S0H|UDKt3G&H-7Q@O&CvTtyy2+2uXH!_c~p~RRJE~z1`tUe#RJCe;I)1&z=VE
zwR||hS{wWk;LNhtqKXODTI%T;+gszn)sOGN3sp=ILeLt6l(OqVJ{%x~2p{Le0Z;DV
z0ido*UcP-#U6tJqq?EMAAcP1NJybEFuFAl#_L2~{#yAt>5$dW$2*J+o9`|lu1K`!W
z&%w-j>%5AMUD8^I4gmD8pJe@I_79H3Ci2y_V4~MNgsK&)R-G+;ElvU0KR9OIn!sZm
zemHaqthH=zj{IaixOIbUWrMmZ$yOHsN9;wuy5>A`+i|U5%+C2ZgQn4>-!x65;pB`o
zb(g1U7MChbW#GbE%f;-xb0|I>$CtHvYupyToSp>1BVJjoU&bGkJoAdnpy^`(0000<
KMNUMnLSTaUh3)SE

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/advancedperipherals/textures/item/hotkey_module.png b/src/main/resources/assets/advancedperipherals/textures/item/hotkey_module.png
new file mode 100644
index 0000000000000000000000000000000000000000..e186c67f725ddb4b4562b693d0152393502f7d2e
GIT binary patch
literal 415
zcmV;Q0bu@#P)LlQB!fKp2LfNWsCOqR@azXC)EEr9-z4{sTd9aCIvk
zL~wCv2cdLu?Vv-4VxZ(N6dbB_EVek;w2(rJBI3{?4)M;^Tr23e+})RZpL^dUrv*X4
ze<~4OWU{%1w05hheeI*&Y674M2bpXxaO$;~=-C^PHVps{kB%io=|BkP^_+T5xYUG$
z8NmHR8`CuK6cACB@+GHd=K-K89RQSEBi5VteQqk?c>`WwCbGYz0#x&%KnO#zF25&N
z*A@c+ZYsKjM8&|2gM_LHq19sHdv2QXSTlg1;^;k0`#!~j8X_Y^bCp~}W*0Fou9Rn~
zBUJMMx^xqD_G<)@SBy@>aI|Ob*KOcb0Eq)7k}4KBl|tG{eq_jhz(3&WOE}b{z26`UKnZo#~=soN537002ov
JPDHLkV1kFiv|<1N

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/advancedperipherals/textures/item/nightvision_module.png b/src/main/resources/assets/advancedperipherals/textures/item/nightvision_module.png
new file mode 100644
index 0000000000000000000000000000000000000000..a550b780bebb25bcce7625556b83916ebf9576ec
GIT binary patch
literal 436
zcmV;l0ZaagP)LlQByIVHn4MCq_eqQJ~PBt;HEdi-Vg(UqFJOp~0n1
z99(VCArOaFha4OvLGCLE4Hh>_O0(SwCn!ZkgTggj_wt%&Lp^YC@AE$Y-}8UC=M>j<
z`A>x9Lo${Am1cH3%6A=Rw*!FUJ4mL|ZmZc?61`Y9aZLr_?EFGN0v-5*Rk>EP;k#6P
z2O+ue;n5WDmSrzIKB!u`1`wkzIq=10Llx)Q(4myK(KHpyvUz)*t{wrPY^c<7h|Zd(
zk}WvYtKNNNb4%2Qf&j&gEkIW{UXN0KF79Oqp`c{h@T?XyHl_R=%d!RNX9Q+zImi~m
ztnJ2_4IKdL)!6RS&zO;c&L4L+mqL}D9WBjLlRZlVK@f(Y3lR&8h(ZG1#a6i!#U@3%6#fGtU}2li
zN(37l3n8QsI}0sR1P?;~Lck)*mB9q-xCvY!K@qWta29%-HMeJ>Z#6sYJoCG?8N9VB!~o#s|E+PrpzNzX@!kC|K&h(aVloeSXPJob3>0Cj}x%CwVurMl~lv=O2&
z--2bCxb+6_=~q&jg|9~b8|(H)Jix6ta2%UXr;Fp*Ja!+r*_p@hj>y={_~Q}d-Libn
z@-M8}TL9Y6bbFO$&>pg~nP$))vR(3`fWPV!E%<()o!PJS00000NkvXXu0mjf{{5{?

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/advancedperipherals/textures/item/smart_glasses.png b/src/main/resources/assets/advancedperipherals/textures/item/smart_glasses.png
index 28e3fc831d1c55dd5eca354abacc87fa2a231989..3f7d7687032344f938cc366edba9b9da3a07a120 100644
GIT binary patch
delta 262
zcmV+h0r~!s0=EK?Ie+O%L_t(Ijm?swZUaFKM4zJoZ%JS-q*_)fpHkQl2@F0Qm=6ie
zPn1V0J5`l>DTzXwV=n0W;tQ$N1MR}GXY3iTm>FZ4n(
z`R%(H1GU8xc|Hs>>8~)aDqo+ZO7vTVEaINav2BNE{LTCOuRL1d3y1o2i13|R`v3p{
M07*qoM6N<$f@SD;LjV8(

delta 224
zcmV<603ZLi0+9lcIe)`RL_t(IjqQ^$3c^4TMgL?|S%j=$Fjq+L3A~e7ZYhF?@c^E{
zJ|_^A6bWo07KU%(?h;wGNhc00d}jWi$uH)&-SHsZ<)}wJzxNdw?@Y
zmQ4jffGCv`fOK6WS{LlPCI)!ZfEQ^uS)BJ-@bAE{_bse#gIVtTy8yt;MK6c7VOc@W
zH2`3~+!$+HT#s7=0KPU^tc>po0BhS|z$u={vVt7zcrB73i9DYnNfd|Yw%>is`#$;q
a1v~(;>sQb74Qp`#0000FR}g~dCTL%@L_=H9&{9HCN)XXd
z&C&-IkqD6yHHLF*5m7EdNLzw6DqgeakdRy=2rbvrUH4`5hvVUW?*IJn_uk7ZsH%#l
z@rlXb#orQ&&rbljjKgQA8A4*vq&n}hZQEW<1YhM3+-^VZ<&4ePY&LYyr_yjH=pO0=
zpqvbII~CLi%gHeLxe?vx@%lRxG@A`V=^_BW<6V3}X#d1SVDl1
zVKW$yQ9I)4%bat7HqfbO46y}xynd>3jq}$On`3E69YOkl*vu@wy*&W5T5axf_s#*@
zKZpm`0g%^L5rK-exFOByO&+U|~_O
rMhV(=jtq_h{OdZW4iAN;#5@4s0c(?@zMeyh00000NkvXXu0mjf$KJvx

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/advancedperipherals/textures/item/smart_glasses_netherite.png b/src/main/resources/assets/advancedperipherals/textures/item/smart_glasses_netherite.png
new file mode 100644
index 0000000000000000000000000000000000000000..631d797d9c7bf2c7fb0a8a765108c801075171f1
GIT binary patch
literal 299
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkQ1Gs&
zi(`mI@7YO;`G*YzTJ7CaJDHgdMOjSsnPn0*VSao-#L6XF*~fX-tlaof^vZLqiET{R
zl()@)U%PF7j!TPbsBY1I)&$lKvH4!U&W4-sb=LjcxtAeza<}67-@6PM^xEc>#G5nC
zSoiwFJ^y(MdThUT8D{Bte=Tuf3o99exFj9d+zx2>lx9f
zE94n>%;~#!^uPvbw}$syw%fmX%Q9h|>a7R$wp`aXt$kXxd)h_`24$t3>$5>N+_ZSZ
tR%|I-Xy~z0`#|-77M+#<|DWn+}44$rjF6*2UngGRzdTjsz

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/advancedperipherals/textures/models/armor/netherite_glasses_layer_1.png b/src/main/resources/assets/advancedperipherals/textures/models/armor/netherite_glasses_layer_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2aa67e3f8854bbc88c2b12e2bacf6d260362dcc
GIT binary patch
literal 474
zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!Q+`=Ht$S`Y;1Oo$O
zkEe@cNX4ADw+yonIWV+6e1F98gl=I$*7H8TwfpxuNB`2^71sXf!Nn>@_Lrp`o?A5{
zwfOG;_Gz^CJGpnKf`pf5)B1~B_cN^PW;i3*V98|Q&hU)mfDGddWrkvwgg%0TcPcWR
zI2=o3r$>rz&D)d~dL>Wh>(`$b!kbq%WF+<
zKCjbRD)Qs@uTOTGkI-nelo_g~T1d+trIrEM5@g&)|t
zJmi-xr;4oX{pHVOA--T(jq

literal 0
HcmV?d00001


From 51a33bfc0c36bf3472a10f48a69f91ea5a22ef81 Mon Sep 17 00:00:00 2001
From: Srendi 
Date: Tue, 21 May 2024 20:06:19 +0200
Subject: [PATCH 055/188] Uncomment minecolonies runtimeOnly

---
 build.gradle | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/build.gradle b/build.gradle
index da03d3e40..3eaaaa61f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -317,11 +317,11 @@ dependencies {
     compileOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal")
     compileOnly fg.deobf("com.ldtteam:blockui:${blockui_version}")
     // IMPORTANT. This should be removed/uncommented when running `runData`
-    //runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}")
-    //runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}")
-    //runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}")
-    //runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal")
-    //runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}")
+    runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}")
+    runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}")
+    runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}")
+    runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal")
+    runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}")
 
     // Patchouli
     runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}")

From b63224c18f8dc11c5f50c3700ff0ad777d70c42c Mon Sep 17 00:00:00 2001
From: Srendi 
Date: Tue, 21 May 2024 21:08:54 +0200
Subject: [PATCH 056/188] Switch to a switch case in your block model generator

---
 .../data/BlockStatesAndModelsProvider.java    | 41 +++++++++++--------
 1 file changed, 25 insertions(+), 16 deletions(-)

diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java
index 85b2e682c..ae80747a0 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java
@@ -85,23 +85,32 @@ private BlockModelBuilder generateModel(Block block, boolean hasNormalSide, Stri
 
         for (String sideTexture : sides) {
             String side = sideTexture;
-            if (side.equals("side")) {
-                for (Direction direction : Direction.Plane.HORIZONTAL)
-                    builder.texture(direction.toString(), blockTexture(block, sideTexture));
-            }
-            // Handle special side names and particle texture
-            if (side.equals("north"))
-                particleTexture = blockTexture(block, "north");
-            if (side.equals("front")) {
-                side = "north";
-                particleTexture = blockTexture(block, "front");
+
+            switch (side) {
+                case "side":
+                    for (Direction direction : Direction.Plane.HORIZONTAL) {
+                        builder.texture(direction.toString(), blockTexture(block, sideTexture));
+                    }
+                    break;
+                case "north":
+                    particleTexture = blockTexture(block, side);
+                    break;
+                case "front":
+                    particleTexture = blockTexture(block, side);
+                    side = "north";
+                    break;
+                case "top":
+                    side = "up";
+                    break;
+                case "bottom":
+                    side = "down";
+                    break;
+                case "back":
+                    side = "south";
+                    break;
+                default:
+                    break;
             }
-            if (side.equals("top"))
-                side = "up";
-            if (side.equals("bottom"))
-                side = "down";
-            if (side.equals("back"))
-                side = "south";
 
             builder.texture(side, blockTexture(block, sideTexture));
         }

From db7de3093eadd99f70017b3534e503eebae835a0 Mon Sep 17 00:00:00 2001
From: srendi 
Date: Wed, 22 May 2024 10:53:24 +0200
Subject: [PATCH 057/188] Create an item tag for our smart glasses and add
 support for the netherite glasses to the smart glasses interface

---
 .../03e4de26f1265135874f8cdcaebc09d9c08eb42b  |  2 ++
 .../tags/items/smart_glasses.json             |  6 +++++
 .../AdvancedPeripherals.java                  |  2 +-
 .../common/data/DataGenerators.java           |  2 +-
 .../common/data/ItemTagsProvider.java         | 23 ++++++++++++++++++
 .../items/SmartGlassesInterfaceItem.java      | 18 +++++++-------
 .../common/setup/APRegistration.java          |  1 +
 .../common/setup/APTags.java                  | 24 +++++++++++++++++++
 .../models/item/smart_glasses_interface.json  |  2 +-
 9 files changed, 68 insertions(+), 12 deletions(-)
 create mode 100644 src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b
 create mode 100644 src/generated/resources/data/advancedperipherals/tags/items/smart_glasses.json
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/APTags.java

diff --git a/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b b/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b
new file mode 100644
index 000000000..67f24359b
--- /dev/null
+++ b/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b
@@ -0,0 +1,2 @@
+// 1.19.2	2024-05-22T09:06:54.177869995	Tags for minecraft:item
+72eba3b11f69e16c87488f7c4ba7cfdad42c378e data/advancedperipherals/tags/items/smart_glasses.json
diff --git a/src/generated/resources/data/advancedperipherals/tags/items/smart_glasses.json b/src/generated/resources/data/advancedperipherals/tags/items/smart_glasses.json
new file mode 100644
index 000000000..1f793687e
--- /dev/null
+++ b/src/generated/resources/data/advancedperipherals/tags/items/smart_glasses.json
@@ -0,0 +1,6 @@
+{
+  "values": [
+    "advancedperipherals:smart_glasses",
+    "advancedperipherals:smart_glasses_netherite"
+  ]
+}
\ No newline at end of file
diff --git a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java
index a52cf0fa7..17f2ffdde 100644
--- a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java
+++ b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java
@@ -26,7 +26,6 @@ public class AdvancedPeripherals {
     public static final Logger LOGGER = LogManager.getLogger(NAME);
     public static final Random RANDOM = new Random();
     public static final APCreativeTab TAB = new APCreativeTab();
-    public static final APAddons ADDONS = new APAddons();
 
     public AdvancedPeripherals() {
         LOGGER.info("AdvancedPeripherals says hello!");
@@ -37,6 +36,7 @@ public AdvancedPeripherals() {
         modBus.addListener(this::commonSetup);
         APRegistration.register();
         MinecraftForge.EVENT_BUS.register(this);
+        new APAddons();
     }
 
     public static void debug(String message) {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java b/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java
index b5b92dd20..c7c8c015b 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java
@@ -26,7 +26,7 @@ public static void genData(GatherDataEvent event) {
         generator.addProvider(event.includeServer(), new PocketUpgradesProvider(generator));
         generator.addProvider(event.includeServer(), new PoiTypeProvider(generator, existingFileHelper));
         generator.addProvider(event.includeServer(), new BlockStatesAndModelsProvider(generator, existingFileHelper));
-
+        generator.addProvider(event.includeServer(), new ItemTagsProvider(generator, existingFileHelper));
         generator.addProvider(event.includeClient(), new EnUsLanguageProvider(generator));
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java
new file mode 100644
index 000000000..8cd142217
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java
@@ -0,0 +1,23 @@
+package de.srendi.advancedperipherals.common.data;
+
+import de.srendi.advancedperipherals.AdvancedPeripherals;
+import de.srendi.advancedperipherals.common.setup.APItems;
+import de.srendi.advancedperipherals.common.setup.APTags;
+import net.minecraft.core.Registry;
+import net.minecraft.data.DataGenerator;
+import net.minecraft.data.tags.TagsProvider;
+import net.minecraft.world.item.Item;
+import net.minecraftforge.common.data.ExistingFileHelper;
+import org.jetbrains.annotations.Nullable;
+
+public class ItemTagsProvider extends TagsProvider {
+
+    protected ItemTagsProvider(DataGenerator generator, @Nullable ExistingFileHelper existingFileHelper) {
+        super(generator, Registry.ITEM, AdvancedPeripherals.MOD_ID, existingFileHelper);
+    }
+
+    @Override
+    protected void addTags() {
+        tag(APTags.Items.SMART_GLASSES).add(APItems.SMART_GLASSES.get()).add(APItems.SMART_GLASSES_NETHERITE.get());
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesInterfaceItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesInterfaceItem.java
index a030b25e3..abd6d27d3 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesInterfaceItem.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesInterfaceItem.java
@@ -4,7 +4,7 @@
 import de.srendi.advancedperipherals.AdvancedPeripherals;
 import de.srendi.advancedperipherals.common.addons.APAddons;
 import de.srendi.advancedperipherals.common.items.base.BaseItem;
-import de.srendi.advancedperipherals.common.setup.APItems;
+import de.srendi.advancedperipherals.common.setup.APTags;
 import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer;
 import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesMenuProvider;
 import net.minecraft.network.chat.Component;
@@ -34,16 +34,16 @@ public InteractionResultHolder use(@NotNull Level world, @NotNull Pla
         if (world.isClientSide)
             return new InteractionResultHolder<>(InteractionResult.PASS, player.getItemInHand(hand));
 
-        ItemStack findGlasses = player.getItemBySlot(EquipmentSlot.HEAD);
-
         // In case this method gets executed by the smart glasses interface, we need to check if the glasses may be in the
         // curio slot or on the head
-        if (!findGlasses.is(APItems.SMART_GLASSES.get())) {
-            if (APAddons.curiosLoaded) findGlasses = APAddons.getCurioGlasses(player);
-            if (!findGlasses.is(APItems.SMART_GLASSES.get())) {
-                player.displayClientMessage(Component.translatable("item.advancedperipherals.smartglasses.dontwear"), false);
-                return super.use(world, player, hand);
-            }
+        ItemStack findGlasses = player.getItemBySlot(EquipmentSlot.HEAD);
+        if (!findGlasses.is(APTags.Items.SMART_GLASSES))
+            if (APAddons.curiosLoaded)
+                findGlasses = APAddons.getCurioGlasses(player);
+
+        if (!findGlasses.is(APTags.Items.SMART_GLASSES)) {
+            player.displayClientMessage(Component.translatable("item.advancedperipherals.smartglasses.dontwear"), false);
+            return super.use(world, player, hand);
         }
 
         // The constructor of the ComputerContainerData in the lambda wants a final version of this var
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java
index f8d25961a..b408989ee 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java
@@ -42,5 +42,6 @@ public static void register() {
         APContainerTypes.register();
         APVillagers.register();
         CCRegistration.register();
+        APTags.Items.init();
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APTags.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APTags.java
new file mode 100644
index 000000000..5b80a0f4b
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APTags.java
@@ -0,0 +1,24 @@
+package de.srendi.advancedperipherals.common.setup;
+
+import de.srendi.advancedperipherals.AdvancedPeripherals;
+import net.minecraft.core.Registry;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.tags.TagKey;
+import net.minecraft.world.item.Item;
+import org.jetbrains.annotations.NotNull;
+
+public class APTags {
+
+    public static class Items {
+
+        public static final TagKey SMART_GLASSES = tag("smart_glasses");
+
+        public static void init() {
+
+        }
+
+        private static TagKey tag(@NotNull String name) {
+            return TagKey.create(Registry.ITEM_REGISTRY, new ResourceLocation(AdvancedPeripherals.MOD_ID, name));
+        }
+    }
+}
diff --git a/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_interface.json b/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_interface.json
index 5a3622d06..f833bbd1a 100644
--- a/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_interface.json
+++ b/src/main/resources/assets/advancedperipherals/models/item/smart_glasses_interface.json
@@ -1,6 +1,6 @@
 {
   "parent": "item/generated",
   "textures": {
-    "layer0": "advancedperipherals:item/nightvision_module"
+    "layer0": "advancedperipherals:item/smart_glasses_interface"
   }
 }
\ No newline at end of file

From fb269be7766e13f9aa8abcbe902e6b00e275b424 Mon Sep 17 00:00:00 2001
From: srendi 
Date: Mon, 27 May 2024 09:17:51 +0200
Subject: [PATCH 058/188] bump forge

---
 gradle.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gradle.properties b/gradle.properties
index bb8f4e723..0f2e5c285 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -5,7 +5,7 @@ org.gradle.logging.level=info
 # Minecraft related
 mod_id=advancedperipherals
 minecraft_version=1.19.2
-forge_version=43.3.8
+forge_version=43.3.13
 loader_version=43
 mod_version=0.8r
 release_type=release

From df4a445cb083ebfc44b1de43b96e7b83fac58486 Mon Sep 17 00:00:00 2001
From: zyxkad 
Date: Tue, 28 May 2024 14:54:40 -0600
Subject: [PATCH 059/188] uncomment runtimeOnly

---
 build.gradle | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/build.gradle b/build.gradle
index 8bd22f001..6a1d2010b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -317,11 +317,11 @@ dependencies {
     compileOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal")
     compileOnly fg.deobf("com.ldtteam:blockui:${blockui_version}")
     // IMPORTANT. This should be removed/commented when running `runData`
-    // runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}")
-    // runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}")
-    // runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}")
-    // runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal")
-    // runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}")
+    runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}")
+    runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}")
+    runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}")
+    runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal")
+    runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}")
 
     // Patchouli
     runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}")

From 58ff91332f9548edf776c069c079e7f86c4d3551 Mon Sep 17 00:00:00 2001
From: zyxkad 
Date: Tue, 28 May 2024 14:57:05 -0600
Subject: [PATCH 060/188] remove unuse import

---
 .../computercraft/peripheral/plugins/AutomataWarpingPlugin.java  | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java
index 462dd58a3..9c7ad8369 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java
@@ -5,7 +5,6 @@
 import dan200.computercraft.api.lua.LuaException;
 import dan200.computercraft.api.lua.LuaFunction;
 import dan200.computercraft.api.lua.MethodResult;
-import dan200.computercraft.api.peripheral.IComputerAccess;
 import dan200.computercraft.api.turtle.ITurtleAccess;
 import de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperationContext;
 import de.srendi.advancedperipherals.common.addons.computercraft.owner.FuelAbility;

From 8252ab6e0f8132bf2beb00c779ee811bd6ca39f2 Mon Sep 17 00:00:00 2001
From: zyxkad 
Date: Fri, 7 Jun 2024 12:54:19 -0600
Subject: [PATCH 061/188] fix #620 Modules only apply after closing and
 re-opening the glasses inventory

---
 .../common/items/SmartGlassesItem.java        | 69 +++++++------
 .../smartglasses/SmartGlassesComputer.java    | 72 +++++++++-----
 .../smartglasses/SmartGlassesItemHandler.java | 97 +++++++++----------
 .../common/smartglasses/SmartGlassesSlot.java |  3 +-
 .../modules/ModulePeripheral.java             |  3 +-
 5 files changed, 134 insertions(+), 110 deletions(-)

diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java
index 35ac3cbf7..fad7af47f 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java
@@ -67,8 +67,16 @@ public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundT
             @NotNull
             @Override
             public  LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) {
-                if (cap == ForgeCapabilities.ITEM_HANDLER)
-                    return LazyOptional.of(() -> new SmartGlassesItemHandler(stack, getServerComputer(ServerLifecycleHooks.getCurrentServer(), stack))).cast();
+                if (cap == ForgeCapabilities.ITEM_HANDLER) {
+                    return LazyOptional.of(() -> {
+                        SmartGlassesComputer computer = getServerComputer(ServerLifecycleHooks.getCurrentServer(), stack);
+                        SmartGlassesItemHandler handler = new SmartGlassesItemHandler(stack, computer);
+                        if (computer != null) {
+                            computer.setItemHandler(handler);
+                        }
+                        return handler;
+                    }).cast();
+                }
                 return LazyOptional.empty();
             }
         };
@@ -117,33 +125,33 @@ private boolean tick(ItemStack stack, Level world, Entity entity, SmartGlassesCo
     @Override
     public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNull Entity entity, int slotNum, boolean selected) {
         LazyOptional itemHandler = stack.getCapability(ForgeCapabilities.ITEM_HANDLER);
-        if(itemHandler.isPresent()) {
-            itemHandler.resolve().ifPresent(iItemHandler -> {
-                for(int slot = 0; slot < iItemHandler.getSlots(); slot++) {
-                    ItemStack itemStack = iItemHandler.getStackInSlot(slot);
-                    if(itemStack.getItem() instanceof IModuleItem iModuleItem) {
-                        SmartGlassesAccess glassesAccess = null;
-                        IModule module = null;
-                        if (!world.isClientSide) {
-                            SmartGlassesComputer computer = getOrCreateComputer((ServerLevel) world, entity, entity instanceof Player player ? player.getInventory() : null, stack);
-                            module = computer.getModules().get(slot);
-                            glassesAccess = computer.getSmartGlassesAccess();
-                        }
-                        iModuleItem.inventoryTick(itemStack, world, entity, slot, selected, glassesAccess, module);
+        itemHandler.ifPresent(iItemHandler -> {
+            for(int slot = 0; slot < iItemHandler.getSlots(); slot++) {
+                ItemStack itemStack = iItemHandler.getStackInSlot(slot);
+                if(itemStack.getItem() instanceof IModuleItem iModuleItem) {
+                    SmartGlassesAccess glassesAccess = null;
+                    IModule module = null;
+                    if (!world.isClientSide) {
+                        SmartGlassesComputer computer = getOrCreateComputer((ServerLevel) world, entity, entity instanceof Player player ? player.getInventory() : null, stack);
+                        module = computer.getModules().get(slot);
+                        glassesAccess = computer.getSmartGlassesAccess();
                     }
+                    iModuleItem.inventoryTick(itemStack, world, entity, slot, selected, glassesAccess, module);
                 }
-            });
-        }
+            }
+        });
 
-        if (world.isClientSide)
+        if (world.isClientSide) {
             return;
+        }
         Container inventory = entity instanceof Player player ? player.getInventory() : null;
         SmartGlassesComputer computer = getOrCreateComputer((ServerLevel) world, entity, inventory, stack);
         computer.keepAlive();
 
-        var changed = tick(stack, world, entity, computer);
-        if (changed && inventory != null)
+        boolean changed = tick(stack, world, entity, computer);
+        if (changed && inventory != null) {
             inventory.setChanged();
+        }
     }
 
     @Override
@@ -151,8 +159,9 @@ public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) {
         if (entity.level.isClientSide || entity.level.getServer() == null) return false;
 
         SmartGlassesComputer computer = getServerComputer(entity.level.getServer(), stack);
-        if (computer != null && tick(stack, entity.level, entity, computer))
+        if (computer != null && tick(stack, entity.level, entity, computer)) {
             entity.setItem(stack.copy());
+        }
         return false;
     }
 
@@ -229,13 +238,13 @@ public SmartGlassesComputer getOrCreateComputer(ServerLevel level, Entity entity
             computer.addAPI(new SmartGlassesAPI());
 
             // Only turn on when initially creating the computer, rather than each tick.
-            if (isMarkedOn(stack) && entity instanceof Player)
+            if (isMarkedOn(stack) && entity instanceof Player) {
                 computer.turnOn();
-
-            if (inventory != null)
+            }
+            if (inventory != null) {
                 inventory.setChanged();
+            }
         }
-        computer.setPeripheral(ComputerSide.BACK, new ModulePeripheral(computer));
         computer.setLevel(level);
         return computer;
     }
@@ -248,7 +257,7 @@ public static SmartGlassesComputer getServerComputer(MinecraftServer server, Ite
     }
 
     // IComputerItem implementation
-    protected static void setComputerID(ItemStack stack, int computerID) {
+    private static void setComputerID(ItemStack stack, int computerID) {
         stack.getOrCreateTag().putInt(NBT_ID, computerID);
     }
 
@@ -283,20 +292,20 @@ public static int getInstanceID(ItemStack stack) {
         return nbt != null && nbt.contains(NBT_INSTANCE) ? nbt.getInt(NBT_INSTANCE) : -1;
     }
 
-    protected static void setInstanceID(ItemStack stack, int instanceID) {
+    private static void setInstanceID(ItemStack stack, int instanceID) {
         stack.getOrCreateTag().putInt(NBT_INSTANCE, instanceID);
     }
 
-    protected static int getSessionID(ItemStack stack) {
+    private static int getSessionID(ItemStack stack) {
         CompoundTag nbt = stack.getTag();
         return nbt != null && nbt.contains(NBT_SESSION) ? nbt.getInt(NBT_SESSION) : -1;
     }
 
-    protected static void setSessionID(ItemStack stack, int sessionID) {
+    private static void setSessionID(ItemStack stack, int sessionID) {
         stack.getOrCreateTag().putInt(NBT_SESSION, sessionID);
     }
 
-    protected static boolean isMarkedOn(ItemStack stack) {
+    private static boolean isMarkedOn(ItemStack stack) {
         CompoundTag nbt = stack.getTag();
         return nbt != null && nbt.getBoolean(NBT_ON);
     }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java
index 21301b954..d6a8b532b 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java
@@ -16,6 +16,7 @@
 import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.entity.Entity;
 import net.minecraft.world.entity.item.ItemEntity;
+import net.minecraft.world.entity.player.Inventory;
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.item.ItemStack;
 import net.minecraftforge.items.IItemHandler;
@@ -34,7 +35,7 @@ public class SmartGlassesComputer extends ServerComputer implements IPocketAcces
     private ItemStack stack = ItemStack.EMPTY;
     private final SmartGlassesAccess smartGlassesAccess = new SmartGlassesAccess(this);
     @Nullable
-    private SmartGlassesItemHandler itemHandler;
+    private SmartGlassesItemHandler itemHandler = null;
 
     private int lightColour = -1;
     private boolean lightChanged = false;
@@ -45,22 +46,28 @@ public class SmartGlassesComputer extends ServerComputer implements IPocketAcces
 
     public SmartGlassesComputer(ServerLevel world, int computerID, @Nullable String label, ComputerFamily family) {
         super(world, computerID, label, family, 39, 13);
+        this.addAPI(new SmartGlassesAPI());
+        this.setPeripheral(ComputerSide.BACK, new ModulePeripheral(this));
     }
 
     @Nullable
     @Override
     public Entity getEntity() {
-        if (entity == null || stack.isEmpty() || !entity.isAlive())
+        if (stack.isEmpty() || entity == null || !entity.isAlive()) {
             return null;
+        }
 
         if (entity instanceof Player player) {
-            var inventory = player.getInventory();
-            return inventory.items.contains(stack) || inventory.armor.contains(stack) || inventory.offhand.contains(stack) ? entity : null;
-        } else if (entity instanceof ItemEntity itemEntity) {
-            return itemEntity.getItem() == stack ? entity : null;
-        } else {
+            Inventory inventory = player.getInventory();
+            if (inventory.items.contains(stack) || inventory.armor.contains(stack) || inventory.offhand.contains(stack)) {
+                return player;
+            }
             return null;
         }
+        if (entity instanceof ItemEntity itemEntity) {
+            return itemEntity.getItem() == stack ? entity : null;
+        }
+        return null;
     }
 
     @Override
@@ -88,10 +95,13 @@ public int getLight() {
 
     @Override
     public void setLight(int colour) {
-        if (colour < 0 || colour > 0xFFFFFF) colour = -1;
+        if (colour < 0 || colour > 0xFFFFFF) {
+            colour = -1;
+        }
 
-        if (lightColour == colour)
+        if (lightColour == colour) {
             return;
+        }
         lightColour = colour;
         lightChanged = true;
     }
@@ -100,6 +110,10 @@ public void setItemHandler(@Nullable SmartGlassesItemHandler itemHandler) {
         this.itemHandler = itemHandler;
     }
 
+    public SmartGlassesItemHandler getItemHandler() {
+        return this.itemHandler;
+    }
+
     public void markDirty() {
         isDirty = true;
     }
@@ -116,8 +130,9 @@ public CompoundTag getUpgradeNBTData() {
 
     @Override
     public void updateUpgradeNBTData() {
-        if (entity instanceof Player player)
+        if (entity instanceof Player player) {
             player.getInventory().setChanged();
+        }
     }
 
     @Override
@@ -130,8 +145,12 @@ public Map getUpgrades() {
         return Collections.emptyMap();
     }
 
+    public void setPeripheral(ComputerSide side, IPeripheral peripheral) {
+        super.setPeripheral(side, peripheral);
+    }
+
     public void updatePeripheralsAndModules(IItemHandler itemHandler) {
-        for (int slot = 0; slot < 4; slot++) {
+        for (int slot = 0; slot < 5; slot++) {
             ItemStack peripheralItem = itemHandler.getStackInSlot(slot);
             if (!peripheralItem.isEmpty()) {
                 IPocketUpgrade upgrade = PocketUpgrades.instance().get(peripheralItem);
@@ -145,21 +164,20 @@ public void updatePeripheralsAndModules(IItemHandler itemHandler) {
             }
             setPeripheral(SmartGlassesSlot.indexToSide(slot), null);
         }
-        for (int slot = 4; slot < 11; slot++) {
+        for (int slot = 5; slot < 11; slot++) {
             ItemStack peripheralItem = itemHandler.getStackInSlot(slot);
+            IModule oldModule = modules.get(slot);
             if (!peripheralItem.isEmpty() && peripheralItem.getItem() instanceof IModuleItem module) {
-                if (modules.get(slot) != null && modules.get(slot).getName().equals(module.createModule(smartGlassesAccess).getName()))
+                IModule newModule = module.createModule(smartGlassesAccess);
+                if (oldModule != null && oldModule.getName().equals(newModule.getName())) {
                     continue;
-
-                modules.put(slot, module.createModule(smartGlassesAccess));
-            } else {
-                if (modules.get(slot) != null) {
-                    modules.get(slot).onUnequipped(smartGlassesAccess);
-                    modules.remove(slot);
                 }
+                modules.put(slot, newModule);
+            } else if (oldModule != null) {
+                oldModule.onUnequipped(smartGlassesAccess);
+                modules.remove(slot);
             }
         }
-        setPeripheral(ComputerSide.BACK, new ModulePeripheral(this));
     }
 
     @Override
@@ -170,18 +188,20 @@ public void tickServer() {
         tracking.removeIf(player -> !player.isAlive() || player.level != getLevel());
 
         // And now find any new players, add them to the tracking list, and broadcast state where appropriate.
-        var sendState = hasOutputChanged() || lightChanged;
+        boolean sendState = hasOutputChanged() || lightChanged;
         lightChanged = false;
         if (sendState) {
             tracking.addAll(getLevel().players());
         }
 
-        modules.values().forEach(module -> module.tick(smartGlassesAccess));
-
-        if (isDirty())
-            updatePeripheralsAndModules(itemHandler);
+        if (isDirty()) {
+            updatePeripheralsAndModules(this.itemHandler);
+            isDirty = false;
+        }
 
-        isDirty = false;
+        modules.values().forEach(module -> {
+            module.tick(smartGlassesAccess);
+        });
     }
 
     public void setEntity(@Nullable Entity entity) {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java
index 0cfa780a1..65da05b91 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java
@@ -5,7 +5,6 @@
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.world.ContainerHelper;
 import net.minecraft.world.item.ItemStack;
-import net.minecraftforge.common.util.INBTSerializable;
 import net.minecraftforge.items.IItemHandlerModifiable;
 import net.minecraftforge.items.ItemHandlerHelper;
 import org.jetbrains.annotations.NotNull;
@@ -13,57 +12,46 @@
 
 import javax.annotation.Nonnull;
 
-public class SmartGlassesItemHandler implements IItemHandlerModifiable, INBTSerializable {
+public class SmartGlassesItemHandler implements IItemHandlerModifiable {
 
     private static final int SLOTS = 12;
 
-    private final NonNullList items = NonNullList.withSize(SLOTS, ItemStack.EMPTY);
-    private final ItemStack stack;
+    private final ItemStack glasses;
     @Nullable
     private final SmartGlassesComputer computer;
 
-    public SmartGlassesItemHandler(ItemStack stack, @Nullable SmartGlassesComputer computer) {
-        this.stack = stack;
+    public SmartGlassesItemHandler(ItemStack glasses, @Nullable SmartGlassesComputer computer) {
+        this.glasses = glasses;
         this.computer = computer;
-        deserializeNBT(stack.getOrCreateTagElement("Items"));
-
-        if(computer != null)
-            computer.setItemHandler(this);
     }
 
     @Override
     public int getSlots() {
-        return items.size();
-    }
-
-    @NotNull
-    @Override
-    public ItemStack getStackInSlot(int slot) {
-        return items.get(slot);
+        return SLOTS;
     }
 
     @Override
     @Nonnull
     public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
-        if (stack.isEmpty())
+        if (stack.isEmpty()) {
             return ItemStack.EMPTY;
-
-        if (!isItemValid(slot, stack))
+        }
+        if (!isItemValid(slot, stack)) {
             return stack;
-
+        }
         ItemStack existing = getStackInSlot(slot);
-
         int limit = getSlotLimit(slot);
 
         if (!existing.isEmpty()) {
-            if (!ItemHandlerHelper.canItemStacksStack(stack, existing))
+            if (!ItemHandlerHelper.canItemStacksStack(stack, existing)) {
                 return stack;
-
+            }
             limit -= existing.getCount();
         }
 
-        if (limit <= 0)
+        if (limit <= 0) {
             return stack;
+        }
 
         boolean reachedLimit = stack.getCount() > limit;
 
@@ -73,7 +61,6 @@ public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate
             } else {
                 existing.grow(reachedLimit ? limit : stack.getCount());
             }
-
             setChanged();
         }
 
@@ -83,37 +70,34 @@ public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate
     @Override
     @Nonnull
     public ItemStack extractItem(int slot, int amount, boolean simulate) {
-        if (amount == 0)
+        if (amount == 0) {
             return ItemStack.EMPTY;
+        }
 
         ItemStack existing = getStackInSlot(slot);
-
-        if (existing.isEmpty())
+        if (existing.isEmpty()) {
             return ItemStack.EMPTY;
+        }
 
         int toExtract = Math.min(amount, existing.getMaxStackSize());
 
         if (existing.getCount() <= toExtract) {
-            if (!simulate) {
-                setStackInSlot(slot, ItemStack.EMPTY);
-                return existing;
-            } else {
+            if (simulate) {
                 return existing.copy();
             }
-        } else {
-            if (!simulate) {
-                setStackInSlot(slot, ItemHandlerHelper.copyStackWithSize(existing, existing.getCount() - toExtract));
-                setChanged();
-            }
-
-            return ItemHandlerHelper.copyStackWithSize(existing, toExtract);
+            setStackInSlot(slot, ItemStack.EMPTY);
+            return existing;
         }
 
+        if (!simulate) {
+            setStackInSlot(slot, ItemHandlerHelper.copyStackWithSize(existing, existing.getCount() - toExtract));
+        }
+        return ItemHandlerHelper.copyStackWithSize(existing, toExtract);
     }
 
     @Override
     public int getSlotLimit(int slot) {
-        return 64;
+        return 1;
     }
 
     @Override
@@ -121,27 +105,36 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) {
         return !stack.is(APItems.SMART_GLASSES.get());
     }
 
+    @NotNull
+    @Override
+    public ItemStack getStackInSlot(int slot) {
+        return loadItems().get(slot);
+    }
+
     @Override
     public void setStackInSlot(int slot, @NotNull ItemStack stack) {
+        NonNullList items = loadItems();
+        if (stack.equals(items.get(slot))) {
+            return;
+        }
         items.set(slot, stack);
+        saveItems(items);
         setChanged();
     }
 
     public void setChanged() {
-        stack.getOrCreateTag().put("Items", serializeNBT());
-        if (computer != null)
-            computer.markDirty();
+        if (this.computer != null) {
+            this.computer.markDirty();
+        }
     }
 
-    @Override
-    public CompoundTag serializeNBT() {
-        CompoundTag itemNBT = new CompoundTag();
-        ContainerHelper.saveAllItems(itemNBT, items);
-        return itemNBT;
+    public void saveItems(NonNullList items) {
+        ContainerHelper.saveAllItems(this.glasses.getOrCreateTag(), items);
     }
 
-    @Override
-    public void deserializeNBT(CompoundTag nbt) {
-        ContainerHelper.loadAllItems(nbt, items);
+    public NonNullList loadItems() {
+        NonNullList items = NonNullList.withSize(SLOTS, ItemStack.EMPTY);
+        ContainerHelper.loadAllItems(this.glasses.getOrCreateTag(), items);
+        return items;
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesSlot.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesSlot.java
index ed8a0752d..13f4d39ed 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesSlot.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesSlot.java
@@ -35,7 +35,8 @@ public static ComputerSide indexToSide(int slot) {
             case 1 -> ComputerSide.LEFT;
             case 2 -> ComputerSide.FRONT;
             case 3 -> ComputerSide.RIGHT;
-            default -> ComputerSide.BOTTOM;
+            case 4 -> ComputerSide.BOTTOM;
+            default -> throw new IllegalArgumentException("slot must in range [0,4]");
         };
     }
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java
index af3c3e237..a57c6f5aa 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java
@@ -12,8 +12,9 @@ public ModulePeripheral(SmartGlassesComputer computer) {
         super(PERIPHERAL_TYPE, new ModulePeripheralOwner(computer));
         getPeripheralOwner().getComputer().getModules().values().forEach(module -> {
             IModuleFunctions functions = module.getFunctions(computer.getSmartGlassesAccess());
-            if (functions != null)
+            if (functions != null) {
                 addPlugin(functions);
+            }
         });
     }
 

From 2e3639f3c012425ab192fc09e06a181b35f3eedd Mon Sep 17 00:00:00 2001
From: zyxkad 
Date: Fri, 7 Jun 2024 14:57:45 -0600
Subject: [PATCH 062/188] skip compileKotlin

---
 build.gradle | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/build.gradle b/build.gradle
index 6a1d2010b..31b55527b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -442,6 +442,8 @@ jar {
 
 jar.finalizedBy('reobfJar')
 
+compileKotlin.enabled = false
+
 tasks.withType(Checkstyle) {
     reports {
         xml.required = false

From 637e1749a5e89c3287a7d6dd0eb2c38fa1178224 Mon Sep 17 00:00:00 2001
From: zyxkad 
Date: Fri, 7 Jun 2024 16:09:26 -0600
Subject: [PATCH 063/188] truely resolved #620

---
 build.gradle                                  |  2 +-
 .../common/items/SmartGlassesItem.java        | 40 +++++++++----------
 .../smartglasses/SmartGlassesComputer.java    |  2 +-
 .../smartglasses/SmartGlassesItemHandler.java | 25 +++++++-----
 .../nightvision/NightVisionFunctions.java     |  4 +-
 .../nightvision/NightVisionModule.java        |  6 +++
 .../nightvision/NightVisionModuleItem.java    |  5 ++-
 7 files changed, 48 insertions(+), 36 deletions(-)

diff --git a/build.gradle b/build.gradle
index 31b55527b..d98ce13ec 100644
--- a/build.gradle
+++ b/build.gradle
@@ -332,8 +332,8 @@ dependencies {
 
     //DimStorage
     compileOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}")
-    runtimeOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}")
     compileOnly fg.deobf("curse.maven:edivadlib-638508:${edivadlib_version}")
+    runtimeOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}")
     runtimeOnly fg.deobf("curse.maven:edivadlib-638508:${edivadlib_version}")
 
     //Removed until fully ported
diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java
index fad7af47f..54f032130 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java
@@ -71,9 +71,6 @@ public  LazyOptional getCapability(@NotNull Capability cap, @Nullable D
                     return LazyOptional.of(() -> {
                         SmartGlassesComputer computer = getServerComputer(ServerLifecycleHooks.getCurrentServer(), stack);
                         SmartGlassesItemHandler handler = new SmartGlassesItemHandler(stack, computer);
-                        if (computer != null) {
-                            computer.setItemHandler(handler);
-                        }
                         return handler;
                     }).cast();
                 }
@@ -124,22 +121,21 @@ private boolean tick(ItemStack stack, Level world, Entity entity, SmartGlassesCo
 
     @Override
     public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNull Entity entity, int slotNum, boolean selected) {
-        LazyOptional itemHandler = stack.getCapability(ForgeCapabilities.ITEM_HANDLER);
-        itemHandler.ifPresent(iItemHandler -> {
-            for(int slot = 0; slot < iItemHandler.getSlots(); slot++) {
-                ItemStack itemStack = iItemHandler.getStackInSlot(slot);
-                if(itemStack.getItem() instanceof IModuleItem iModuleItem) {
-                    SmartGlassesAccess glassesAccess = null;
-                    IModule module = null;
-                    if (!world.isClientSide) {
-                        SmartGlassesComputer computer = getOrCreateComputer((ServerLevel) world, entity, entity instanceof Player player ? player.getInventory() : null, stack);
-                        module = computer.getModules().get(slot);
-                        glassesAccess = computer.getSmartGlassesAccess();
-                    }
-                    iModuleItem.inventoryTick(itemStack, world, entity, slot, selected, glassesAccess, module);
+        LazyOptional optItemHandler = stack.getCapability(ForgeCapabilities.ITEM_HANDLER);
+        SmartGlassesItemHandler itemHandler = (SmartGlassesItemHandler) optItemHandler.orElse(null);
+        for(int slot = 0; slot < itemHandler.getSlots(); slot++) {
+            ItemStack itemStack = itemHandler.getStackInSlot(slot);
+            if(itemStack.getItem() instanceof IModuleItem iModuleItem) {
+                SmartGlassesAccess glassesAccess = null;
+                IModule module = null;
+                if (!world.isClientSide) {
+                    SmartGlassesComputer computer = getOrCreateComputer((ServerLevel) world, entity, entity instanceof Player player ? player.getInventory() : null, stack);
+                    module = computer.getModules().get(slot);
+                    glassesAccess = computer.getSmartGlassesAccess();
                 }
+                iModuleItem.inventoryTick(itemStack, world, entity, slot, selected, glassesAccess, module);
             }
-        });
+        }
 
         if (world.isClientSide) {
             return;
@@ -147,6 +143,7 @@ public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNu
         Container inventory = entity instanceof Player player ? player.getInventory() : null;
         SmartGlassesComputer computer = getOrCreateComputer((ServerLevel) world, entity, inventory, stack);
         computer.keepAlive();
+        computer.setItemHandler(itemHandler);
 
         boolean changed = tick(stack, world, entity, computer);
         if (changed && inventory != null) {
@@ -186,10 +183,12 @@ public InteractionResultHolder use(Level world, Player player, @NotNu
 
     public ItemStack create(int id, @Nullable String label) {
         ItemStack result = new ItemStack(this);
-        if (id >= 0)
+        if (id >= 0) {
             result.getOrCreateTag().putInt(NBT_ID, id);
-        if (label != null)
+        }
+        if (label != null) {
             result.setHoverName(Component.literal(label));
+        }
         return result;
     }
 
@@ -251,8 +250,9 @@ public SmartGlassesComputer getOrCreateComputer(ServerLevel level, Entity entity
 
     @Nullable
     public static SmartGlassesComputer getServerComputer(MinecraftServer server, ItemStack stack) {
-        if (server == null)
+        if (server == null) {
             return null;
+        }
         return (SmartGlassesComputer) ServerContext.get(server).registry().get(getSessionID(stack), getInstanceID(stack));
     }
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java
index d6a8b532b..19e3750d1 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java
@@ -149,7 +149,7 @@ public void setPeripheral(ComputerSide side, IPeripheral peripheral) {
         super.setPeripheral(side, peripheral);
     }
 
-    public void updatePeripheralsAndModules(IItemHandler itemHandler) {
+    public void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) {
         for (int slot = 0; slot < 5; slot++) {
             ItemStack peripheralItem = itemHandler.getStackInSlot(slot);
             if (!peripheralItem.isEmpty()) {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java
index 65da05b91..3f48b58e7 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java
@@ -1,5 +1,6 @@
 package de.srendi.advancedperipherals.common.smartglasses;
 
+import de.srendi.advancedperipherals.common.items.SmartGlassesItem;
 import de.srendi.advancedperipherals.common.setup.APItems;
 import net.minecraft.core.NonNullList;
 import net.minecraft.nbt.CompoundTag;
@@ -25,11 +26,25 @@ public SmartGlassesItemHandler(ItemStack glasses, @Nullable SmartGlassesComputer
         this.computer = computer;
     }
 
+    public ItemStack getGlasses() {
+        return glasses;
+    }
+
     @Override
     public int getSlots() {
         return SLOTS;
     }
 
+    @Override
+    public int getSlotLimit(int slot) {
+        return 1;
+    }
+
+    @Override
+    public boolean isItemValid(int slot, @NotNull ItemStack stack) {
+        return !(stack.getItem() instanceof SmartGlassesItem);
+    }
+
     @Override
     @Nonnull
     public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
@@ -95,16 +110,6 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) {
         return ItemHandlerHelper.copyStackWithSize(existing, toExtract);
     }
 
-    @Override
-    public int getSlotLimit(int slot) {
-        return 1;
-    }
-
-    @Override
-    public boolean isItemValid(int slot, @NotNull ItemStack stack) {
-        return !stack.is(APItems.SMART_GLASSES.get());
-    }
-
     @NotNull
     @Override
     public ItemStack getStackInSlot(int slot) {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionFunctions.java
index 658ef1ba2..ef9458a9c 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionFunctions.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionFunctions.java
@@ -11,12 +11,12 @@ public NightVisionFunctions(NightVisionModule nightVisionModule) {
         this.nightVisionModule = nightVisionModule;
     }
 
-    @LuaFunction(mainThread = true)
+    @LuaFunction
     public final boolean isNightVisionEnabled() {
         return nightVisionModule.isNightVisionEnabled();
     }
 
-    @LuaFunction(mainThread = true)
+    @LuaFunction
     public final void enableNightVision(boolean enable) {
         nightVisionModule.enableNightVision(enable);
     }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModule.java
index b4818a0c9..f1333b273 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModule.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModule.java
@@ -38,10 +38,16 @@ public void onUnequipped(SmartGlassesAccess smartGlassesAccess) {
 
     }
 
+    /**
+     * isNightVisionEnabled is safety to be called concurrently
+     */
     public boolean isNightVisionEnabled() {
         return nightVisionEnabled;
     }
 
+    /**
+     * enableNightVision is safety to be called concurrently
+     */
     public void enableNightVision(boolean enable) {
         nightVisionEnabled = enable;
     }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java
index 0e9c0257a..44da3ee90 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/nightvision/NightVisionModuleItem.java
@@ -26,12 +26,13 @@ public IModule createModule(SmartGlassesAccess access) {
 
     @Override
     public void inventoryTick(ItemStack itemStack, Level level, Entity entity, int inventorySlot, boolean isCurrentItem, @Nullable SmartGlassesAccess access, @Nullable IModule module) {
-        if (level.isClientSide() || !(entity instanceof Player player))
+        if (level.isClientSide() || !(entity instanceof Player player)) {
             return;
+        }
 
         if (module instanceof NightVisionModule nightVisionModule) {
             if (nightVisionModule.nightVisionEnabled) {
-                player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, Integer.MAX_VALUE));
+                player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, 20 * 13 - 1 /* minus 1 tick then the client timing won't flash */));
             } else {
                 player.removeEffect(MobEffects.NIGHT_VISION);
             }

From fe532eb3fa1873b29332a788fe3df065cf6802b6 Mon Sep 17 00:00:00 2001
From: zyxkad 
Date: Fri, 7 Jun 2024 16:26:37 -0600
Subject: [PATCH 064/188] fix quick move

---
 .../container/SmartGlassesContainer.java      | 31 ++++++++++---------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
index 8a8bd7684..9ba890984 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
@@ -26,6 +26,22 @@ public class SmartGlassesContainer extends ContainerComputerBase {
     public SmartGlassesContainer(int id, Predicate canUse, ServerComputer computer, Inventory playerInventory, IItemHandler inventory, ComputerContainerData data) {
         super(APContainerTypes.SMART_GLASSES_CONTAINER.get(), id, canUse, ComputerFamily.ADVANCED, computer, data);
 
+        /**
+         * Do player inventory before peripheral slots then quick move won't mixup
+         */
+
+        // Player hotbar
+        for (var x = 0; x < 9; x++) {
+            addSlot(new Slot(playerInventory, x, PLAYER_START_X + x * 18, PLAYER_START_Y + 3 * 18 + 5));
+        }
+
+        // Player inventory
+        for (var y = 0; y < 3; y++) {
+            for (var x = 0; x < 9; x++) {
+                addSlot(new Slot(playerInventory, x + y * 9 + 9, PLAYER_START_X + x * 18, PLAYER_START_Y + 1 + y * 18));
+            }
+        }
+
         // Glasses Peripherals
         addSlot(new SmartGlassesSlot(inventory, 0, 222, 148, SlotType.PERIPHERALS));
         addSlot(new SmartGlassesSlot(inventory, 1, 204, 166, SlotType.PERIPHERALS));
@@ -40,19 +56,6 @@ public SmartGlassesContainer(int id, Predicate canUse, ServerComputer co
         addSlot(new SmartGlassesSlot(inventory, 8, 240, 166, SlotType.MODULES));
         addSlot(new SmartGlassesSlot(inventory, 9, 222, 184, SlotType.MODULES));
         addSlot(new SmartGlassesSlot(inventory, 10, 240, 184, SlotType.MODULES));
-
-        // Player inventory
-        for (var y = 0; y < 3; y++) {
-            for (var x = 0; x < 9; x++) {
-                addSlot(new Slot(playerInventory, x + y * 9 + 9, PLAYER_START_X + x * 18, PLAYER_START_Y + 1 + y * 18));
-            }
-        }
-
-        // Player hotbar
-        for (var x = 0; x < 9; x++) {
-            addSlot(new Slot(playerInventory, x, PLAYER_START_X + x * 18, PLAYER_START_Y + 3 * 18 + 5));
-        }
-
     }
 
     public SmartGlassesContainer(int id, Predicate predicate, ServerComputer computer, ComputerContainerData data, Inventory player, ItemStack glasses) {
@@ -72,7 +75,7 @@ public ItemStack quickMoveStack(@NotNull Player player, int index) {
                     return ItemStack.EMPTY;
                 }
             } else {
-                if (!this.moveItemStackTo(itemstack1, 36, 37, true)) {
+                if (!this.moveItemStackTo(itemstack1, 36, 36 + 11, true)) {
                     return ItemStack.EMPTY;
                 }
             }

From e11b93c1bdc0ff0c2186559855713fe05b95e99d Mon Sep 17 00:00:00 2001
From: zyxkad 
Date: Sat, 8 Jun 2024 15:32:30 -0600
Subject: [PATCH 065/188] fix quickMoveStack range

---
 .../common/container/SmartGlassesContainer.java                 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
index 9ba890984..c1cda2c3a 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
@@ -59,7 +59,7 @@ public SmartGlassesContainer(int id, Predicate canUse, ServerComputer co
     }
 
     public SmartGlassesContainer(int id, Predicate predicate, ServerComputer computer, ComputerContainerData data, Inventory player, ItemStack glasses) {
-        this(id, predicate, computer, player, glasses.getCapability(ForgeCapabilities.ITEM_HANDLER).resolve().orElseThrow(), data);
+        this(id, predicate, computer, player, glasses.getCapability(ForgeCapabilities.ITEM_HANDLER).orElseThrow(), data);
     }
 
     @NotNull

From d07dc6f6accf7bcc899dca45617c3e89e7ce81d7 Mon Sep 17 00:00:00 2001
From: Srendi 
Date: Tue, 11 Jun 2024 10:23:09 +0200
Subject: [PATCH 066/188] Revert dev/0.8 to an older state to fix some merging
 issues

---
 CHANGELOG.md                                  | 25 +++++++++++++++++++
 .../container/SmartGlassesContainer.java      |  2 +-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ca4076697..bcca9a6e0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,31 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 ## [Unreleased]
+## [1.19.2-0.7.36r] - 2024-06-11
+
+### Added
+- [Features/#43] Up/down versions of automata block functions using pitch and yaw - Thanks to @zyxkad
+- [Features/#9] Added shift sneaking version of `useOnBlock` - Thanks to @zyxkad
+
+### Fixed
+- [#582] Reworked the chunky turtle logic to fix several issues with them - Thanks to @zyxkad
+- Fixed a crash with the ME Bridge while trying to iterate through storage busses without a connected storage block
+- Fixed `isOnEnchantedSoil()` for the mana flower integration
+- [#419] Fixed that the automata `digBlock` function does not use breaking directions the right way. Fixes several issues with hammers or other AOE tools. - Thanks to @zyxkad
+- [#629] Fixed that placed blocks do not retain their custom block name when destroyed - Thanks to @WiggleWizzard
+- [#621] Fixed that the `listCells` function for the ME Bridge does not search in third party drives - Thanks to @michele-grifa
+- [#632] Fixed that the chat box allows sending chat messages with negative range - Thanks to @zyxkad
+- [#619] Fixed that the chat box can spoof people to click message to run danger commands - Thanks to @zyxkad
+- [#617] Fixed that sending invalid nbt data for some mod items through the chat box can cause a client crash - Thanks to @zyxkad
+- [#603] Fixed that the note block integration does not trigger allays - Thanks to @zyxkad
+- [#599] Fixed that turtle upgrades can't be equipped with custom NBT values - Thanks to @zyxkad
+- [#595] Fixed that `scanEntities` does not include living entity fields - Thanks to @zyxkad
+- [#581] Fixed concurrency issues with our server worker, fixes a crash when CC is set to use multiple threads - Thanks to @zyxkad
+
+### Changed
+- [#588] Changed the misspelled `maxHealth` parameter in the player detector, the misspelled attribute is still included in the table for backwards compatibility - Thanks to @zyxkad
+- [#613] Clamp analog output of the `setAnalogOutput` function between 0-15 - Thanks to @zyxkad
+
 ## [1.19.2-0.7.35r] - 2024-04-12
 
 ### Fixed
diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
index c1cda2c3a..522bfa0eb 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
@@ -59,7 +59,7 @@ public SmartGlassesContainer(int id, Predicate canUse, ServerComputer co
     }
 
     public SmartGlassesContainer(int id, Predicate predicate, ServerComputer computer, ComputerContainerData data, Inventory player, ItemStack glasses) {
-        this(id, predicate, computer, player, glasses.getCapability(ForgeCapabilities.ITEM_HANDLER).orElseThrow(), data);
+        this(id, predicate, computer, player, glasses.getCapability(ForgeCapabilities.ITEM_HANDLER).orElseThrow(NullPointerException::new), data);
     }
 
     @NotNull

From 901ad0bf95020425d9f175c5758c214213f54d0c Mon Sep 17 00:00:00 2001
From: Srendi 
Date: Fri, 21 Jun 2024 17:09:58 +0200
Subject: [PATCH 067/188] Reapply "Merge branch 'dev/0.8' into dev/1.19.2"

This reverts commit ed906c48697ebfdc86d268743a8e7aa280ae5d36.
---
 .github/FUNDING.yml                           |   3 +-
 README.md                                     |   2 +-
 build.gradle                                  |   5 +-
 config/checkstyle/checkstyle.xml              |   1 -
 gradle.properties                             |  17 +-
 qodana.yaml                                   |   3 +-
 .../loot_tables/blocks/distance_detector.json |  20 +
 .../loot_tables/blocks/fluid_detector.json    |  20 +
 .../loot_tables/blocks/gas_detector.json      |  20 +
 .../forge/tags/blocks/needs_wood_tool.json    |   3 +-
 .../tags/blocks/mineable/pickaxe.json         |   5 +-
 .../advancedperipherals/APCreativeTab.java    |   8 +-
 .../AdvancedPeripherals.java                  |  16 +-
 .../client/ClientRegistry.java                |   1 +
 .../client/ItemPropertiesRegistry.java        |  17 +
 .../client/KeyBindings.java                   |   2 +
 .../renderer/DistanceDetectorRenderer.java    |  97 +++
 .../screens}/InventoryManagerScreen.java      |   5 +-
 .../client/screens/SmartGlassesScreen.java    |  78 +++
 .../screens}/base/BaseItemScreen.java         |  10 +-
 .../screens}/base/BaseScreen.java             |   5 +-
 .../widgets/SmartGlassesSettingsSwitch.java   |  85 +++
 .../common/addons/APAddons.java               |  38 +-
 .../addons/appliedenergistics/AppEngApi.java  | 514 ++++++++++++--
 .../addons/appliedenergistics/CraftJob.java   |   1 -
 .../MeBridgeEntityListener.java               |   5 +-
 .../appliedenergistics/MeFluidHandler.java    |   5 +-
 .../addons/botania/ManaFlowerIntegration.java |   2 +-
 .../addons/botania/ManaPoolIntegration.java   |   2 +-
 .../addons/botania/SpreaderIntegration.java   |   2 +-
 .../integrations/BeaconIntegration.java       |   5 +-
 .../IntegrationPeripheralProvider.java        |   2 +-
 .../operations/SingleOperation.java           |  10 +-
 .../owner/BasePeripheralOwner.java            |   2 +-
 .../owner/BlockEntityPeripheralOwner.java     |   8 +-
 .../computercraft/owner/FuelAbility.java      |   2 +-
 .../owner/PeripheralOwnerAbility.java         |   2 +-
 .../owner/PocketPeripheralOwner.java          |   8 +-
 .../peripheral/BlockReaderPeripheral.java     |   2 +-
 .../peripheral/ChatBoxPeripheral.java         |   2 +-
 .../peripheral/ColonyPeripheral.java          |   4 +-
 .../DistanceDetectorPeripheral.java           | 103 +++
 .../peripheral/EnergyDetectorPeripheral.java  |   2 +-
 .../EnvironmentDetectorPeripheral.java        |  14 +-
 .../peripheral/FluidDetectorPeripheral.java   |  43 ++
 .../peripheral/GasDetectorPeripheral.java     |  42 ++
 .../peripheral/GeoScannerPeripheral.java      |   2 +-
 .../InventoryManagerPeripheral.java           |  13 +-
 .../peripheral/MeBridgePeripheral.java        | 653 ++++++++++++------
 .../peripheral/NBTStoragePeripheral.java      |   2 +-
 .../peripheral/PlayerDetectorPeripheral.java  |   2 +-
 .../RedstoneIntegratorPeripheral.java         |   2 +-
 .../peripheral/RsBridgePeripheral.java        | 286 ++++++--
 .../EndAutomataCorePeripheral.java            |   2 +-
 .../HusbandryAutomataCorePeripheral.java      |   2 +-
 .../OverpoweredEndAutomataCorePeripheral.java |   2 +-
 ...oweredHusbandryAutomataCorePeripheral.java |   3 +-
 ...OverpoweredWeakAutomataCorePeripheral.java |   3 +-
 .../WeakAutomataCorePeripheral.java           |   8 +-
 .../plugins/AutomataBlockHandPlugin.java      |   4 +-
 .../plugins/AutomataItemSuckPlugin.java       |   2 +-
 .../addons/create/BasinIntegration.java       |  14 +-
 .../addons/create/BlazeBurnerIntegration.java |   2 +-
 .../addons/create/FluidTankIntegration.java   |   2 +-
 .../create/MechanicalMixerIntegration.java    |   2 +-
 .../ScrollValueBehaviourIntegration.java      |   2 +-
 .../dimstorage/DimChestIntegration.java       |  55 ++
 .../common/addons/dimstorage/Integration.java |  12 +
 .../addons/mekanism/MekanismCapabilities.java |  15 +
 .../addons/minecolonies/MineColonies.java     |   4 +-
 .../addons/powah/EnderCellIntegration.java    |   2 +-
 .../addons/powah/EnergyCellIntegration.java   |   2 +-
 .../addons/powah/ReactorIntegration.java      |   2 +-
 .../addons/powah/SolarPanelIntegration.java   |   2 +-
 .../addons/refinedstorage/RefinedStorage.java |  68 +-
 .../addons/refinedstorage/RsFluidHandler.java |   4 +-
 .../addons/refinedstorage/RsItemHandler.java  |   4 +-
 .../common/blocks/PlayerDetectorBlock.java    |   6 +-
 .../blocks/RedstoneIntegratorBlock.java       |   8 +-
 .../blocks/base/BaseBlockEntityBlock.java     |   3 +-
 .../common/blocks/base/IInventoryBlock.java   |   2 -
 .../blocks/base/PeripheralBlockEntity.java    |   9 +-
 .../base/PoweredPeripheralBlockEntity.java    |   2 +-
 .../blockentities/BlockReaderEntity.java      |   4 +-
 .../blocks/blockentities/ChatBoxEntity.java   |   5 +-
 .../blockentities/ColonyIntegratorEntity.java |   4 +-
 .../blockentities/DistanceDetectorEntity.java | 164 +++++
 .../blockentities/EnergyDetectorEntity.java   |  33 +-
 .../EnvironmentDetectorEntity.java            |   4 +-
 .../blockentities/FluidDetectorEntity.java    | 106 +++
 .../blockentities/GasDetectorEntity.java      | 106 +++
 .../blockentities/GeoScannerEntity.java       |   4 +-
 .../blockentities/InventoryManagerEntity.java |   4 +-
 .../blocks/blockentities/MeBridgeEntity.java  |   8 +-
 .../blockentities/NBTStorageEntity.java       |   4 +-
 .../blockentities/PlayerDetectorEntity.java   |   4 +-
 .../blocks/blockentities/RsBridgeEntity.java  |   4 +-
 .../common/commands/APCommands.java           |   4 +-
 .../common/configuration/GeneralConfig.java   |   1 -
 .../configuration/PeripheralsConfig.java      |   7 +-
 .../container/InventoryManagerContainer.java  |  11 +-
 .../container/SmartGlassesContainer.java      |  15 +-
 .../common/container/base/SlotCondition.java  |  10 +-
 .../common/data/BlockLootTables.java          |   6 +-
 .../data/BlockStatesAndModelsProvider.java    |   3 +-
 .../common/data/DataGenerators.java           |   5 +-
 .../common/data/EnUsLanguageProvider.java     |   1 +
 .../common/data/PocketUpgradesProvider.java   |  12 +-
 .../common/data/PoiTypeProvider.java          |   6 +-
 .../common/data/RecipesProvider.java          | 101 ++-
 .../common/data/TurtleUpgradesProvider.java   |  13 +-
 .../common/items/APBlockItem.java             |  25 +-
 .../common/items/APItem.java                  |  26 +-
 .../common/items/WeakAutomataCore.java        |  19 +-
 .../items/base/SmartGlassesMaterials.java     |  73 ++
 .../{ => common}/network/base/IPacket.java    |   2 +-
 .../toclient/DistanceDetectorSyncPacket.java  |  59 ++
 .../toclient/SaddleTurtleInfoPacket.java      |   0
 .../network/toclient/ToastToClientPacket.java |   4 +-
 .../network/toserver/GlassesHotkeyPacket.java |  55 ++
 .../common/setup/APBlockEntityTypes.java      |  30 +
 .../common/setup/APBlocks.java                |  58 ++
 .../common/setup/APContainerTypes.java        |  28 +
 ...{Registration.java => APRegistration.java} |   0
 .../common/setup/APVillagers.java             |  20 +
 .../common/setup/BlockEntityTypes.java        |  27 -
 .../common/setup/Blocks.java                  |  53 --
 .../common/setup/CCRegistration.java          |  20 +-
 .../common/setup/ContainerTypes.java          |  20 -
 .../common/setup/Items.java                   |  25 -
 .../common/setup/Villagers.java               |  19 -
 .../common/smartglasses/SlotType.java         |  22 +
 .../common/smartglasses/SmartGlassesAPI.java  |  11 +
 .../smartglasses/SmartGlassesAccess.java      |  67 ++
 .../smartglasses/SmartGlassesItemHandler.java |   4 +-
 .../SmartGlassesMenuProvider.java             |  43 ++
 .../common/smartglasses/modules/IModule.java  |  38 +
 .../modules/IModuleFunctions.java             |  13 +
 .../smartglasses/modules/IModuleItem.java     |  24 +
 .../modules/ModulePeripheralOwner.java        | 114 +++
 .../modules/hotkey/HotkeyModule.java          |  21 +
 .../modules/hotkey/HotkeyModuleItem.java      |  58 ++
 .../modules/overlay/ObjectProperty.java       |  22 +
 .../overlay/OverlayGlassesFunctions.java      |  42 ++
 .../modules/overlay/OverlayGlassesItem.java   |  19 +
 .../modules/overlay/OverlayModule.java        |  69 ++
 .../modules/overlay/OverlayObject.java        | 194 ++++++
 .../smartglasses/modules/overlay/Panel.java   |  61 ++
 .../modules/overlay/RenderableObject.java     |  47 ++
 .../propertyTypes/BooleanProperty.java        |  15 +
 .../overlay/propertyTypes/BooleanType.java    |  20 +
 .../FixedPointNumberProperty.java             |  18 +
 .../propertyTypes/FixedPointNumberType.java   |  34 +
 .../propertyTypes/FloatingNumberProperty.java |  18 +
 .../propertyTypes/FloatingNumberType.java     |  29 +
 .../overlay/propertyTypes/PropertyType.java   |  31 +
 .../common/util/CoordUtil.java                |  10 +-
 .../common/util/FluidStorageProxy.java        |  92 +++
 .../common/util/GasStorageProxy.java          |  99 +++
 .../common/util/HitResultUtil.java            | 157 +++++
 .../common/util/LuaConverter.java             |  25 +-
 .../advancedperipherals/common/util/Pair.java |   4 +-
 .../common/util/StringUtil.java               |   7 +
 .../common/util/ZeroGasTank.java              |  47 ++
 .../fakeplayer/FakePlayerProviderTurtle.java  |   5 +-
 .../common/util/inventory/FluidFilter.java    |  12 +-
 .../common/util/inventory/GenericFilter.java  |  69 ++
 .../inventory/IStorageSystemFluidHandler.java |   2 +-
 .../inventory/IStorageSystemItemHandler.java  |   1 +
 .../inventory/IStorageSystemPeripheral.java   | 100 +++
 .../common/util/inventory/ItemFilter.java     |  16 +-
 .../common/util/inventory/ItemUtil.java       |  15 -
 .../common/village/VillagerTrade.java         |  38 +-
 .../common/village/VillagerTrades.java        |  32 +-
 .../metaphysics/IFeedableAutomataCore.java    |   3 +-
 .../network/APNetworking.java                 |  75 --
 .../resources/META-INF/accesstransformer.cfg  |   2 +
 .../models/item/ar_goggles.json               |   6 -
 .../models/item/memory_card.json              |  12 +-
 .../models/item/memory_card_bounded.json      |   6 +
 .../models/item/smart_glasses.json            |   6 +
 .../textures/gui/corners_glasses.png          | Bin 0 -> 999 bytes
 .../textures/gui/smart_glasses_gui.png        | Bin 0 -> 1974 bytes
 .../{ar_goggles.png => smart_glasses.png}     | Bin
 .../textures/models/ar_goggles.png            | Bin 1133 -> 0 bytes
 .../{item => slot}/empty_glasses_slot.png     | Bin
 .../loot_tables/chest/scientist_common.json   | 133 ++++
 .../structures/villages/scientist_taiga.nbt   | Bin 4478 -> 6265 bytes
 .../computercraft/lua/rom/programs/flat.lua   |   1 +
 src/main/resources/pack.mcmeta                |   3 +-
 190 files changed, 4641 insertions(+), 1034 deletions(-)
 create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json
 create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json
 create mode 100644 src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json
 create mode 100644 src/main/java/de/srendi/advancedperipherals/client/ItemPropertiesRegistry.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java
 rename src/main/java/de/srendi/advancedperipherals/{common/container => client/screens}/InventoryManagerScreen.java (78%)
 create mode 100644 src/main/java/de/srendi/advancedperipherals/client/screens/SmartGlassesScreen.java
 rename src/main/java/de/srendi/advancedperipherals/{common/container => client/screens}/base/BaseItemScreen.java (73%)
 rename src/main/java/de/srendi/advancedperipherals/{common/container => client/screens}/base/BaseScreen.java (86%)
 create mode 100644 src/main/java/de/srendi/advancedperipherals/client/widgets/SmartGlassesSettingsSwitch.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/FluidDetectorPeripheral.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GasDetectorPeripheral.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/dimstorage/DimChestIntegration.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/dimstorage/Integration.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/MekanismCapabilities.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/items/base/SmartGlassesMaterials.java
 rename src/main/java/de/srendi/advancedperipherals/{ => common}/network/base/IPacket.java (89%)
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toclient/DistanceDetectorSyncPacket.java
 rename src/main/java/de/srendi/advancedperipherals/{ => common}/network/toclient/SaddleTurtleInfoPacket.java (100%)
 rename src/main/java/de/srendi/advancedperipherals/{ => common}/network/toclient/ToastToClientPacket.java (90%)
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java
 rename src/main/java/de/srendi/advancedperipherals/common/setup/{Registration.java => APRegistration.java} (100%)
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/APVillagers.java
 delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/BlockEntityTypes.java
 delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/Blocks.java
 delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/ContainerTypes.java
 delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/Items.java
 delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/setup/Villagers.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/SlotType.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAPI.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesMenuProvider.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModule.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleFunctions.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleItem.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModule.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectProperty.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesItem.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanProperty.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanType.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberProperty.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberType.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/PropertyType.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/FluidStorageProxy.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/GasStorageProxy.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/ZeroGasTank.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java
 create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java
 delete mode 100644 src/main/java/de/srendi/advancedperipherals/network/APNetworking.java
 delete mode 100644 src/main/resources/assets/advancedperipherals/models/item/ar_goggles.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/memory_card_bounded.json
 create mode 100644 src/main/resources/assets/advancedperipherals/models/item/smart_glasses.json
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/gui/corners_glasses.png
 create mode 100644 src/main/resources/assets/advancedperipherals/textures/gui/smart_glasses_gui.png
 rename src/main/resources/assets/advancedperipherals/textures/item/{ar_goggles.png => smart_glasses.png} (100%)
 delete mode 100644 src/main/resources/assets/advancedperipherals/textures/models/ar_goggles.png
 rename src/main/resources/assets/advancedperipherals/textures/{item => slot}/empty_glasses_slot.png (100%)
 create mode 100644 src/main/resources/data/advancedperipherals/loot_tables/chest/scientist_common.json
 create mode 100644 src/main/resources/data/computercraft/lua/rom/programs/flat.lua

diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 4cd1fe88c..66d7109fd 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1 +1,2 @@
-patreon: srendi
+ko_fi: srendi
+github: SirEndii
\ No newline at end of file
diff --git a/README.md b/README.md
index 74d5d8a3e..78c94213d 100644
--- a/README.md
+++ b/README.md
@@ -66,7 +66,7 @@ will close pull requests related to translations.
 [CurseForge]: https://www.curseforge.com/minecraft/mc-mods/advanced-peripherals
 [Actions]: https://github.com/Seniorendi/AdvancedPeripherals/actions
 [Crowdin]: https://crowdin.com/project/advanced-peripherals
-[Discord]: https://discord.com/invite/QuF3hWDtWC
+[Discord]: https://discord.intelligence-modding.de
 [Banner]: https://www.bisecthosting.com/images/CF/Advanced_Peripherals/BH_AP_Header.png 'Advanced Peripherals'
 
 [PeripheralsPlusOne]: https://github.com/rolandoislas/PeripheralsPlusOne
diff --git a/build.gradle b/build.gradle
index ac70ba52d..b176a7695 100644
--- a/build.gradle
+++ b/build.gradle
@@ -328,15 +328,12 @@ dependencies {
     compileOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all")
     runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all")
 
-    //DimStorage
+    // DimStorage
     compileOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}")
     compileOnly fg.deobf("curse.maven:edivadlib-638508:${edivadlib_version}")
     runtimeOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}")
     runtimeOnly fg.deobf("curse.maven:edivadlib-638508:${edivadlib_version}")
 
-    //Removed until fully ported
-    //testImplementation fg.deobf("site.siredvin.ttoolkit:ttoolkit-${minecraft_version}:${ttoolkit_version}")
-
     //Powah
     compileOnly fg.deobf("curse.maven:powah-633483:${powah_version}")
     runtimeOnly fg.deobf("curse.maven:powah-633483:${powah_version}")
diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml
index 7ca06cbc2..a379e1d45 100644
--- a/config/checkstyle/checkstyle.xml
+++ b/config/checkstyle/checkstyle.xml
@@ -37,7 +37,6 @@
         
 
         
-        
         
         
 
diff --git a/gradle.properties b/gradle.properties
index 0fced5431..0f2e5c285 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -7,26 +7,26 @@ mod_id=advancedperipherals
 minecraft_version=1.19.2
 forge_version=43.3.13
 loader_version=43
-mod_version=0.7.37r
+mod_version=0.8r
 release_type=release
 mappings_channel=parchment
-mappings_version=2022.11.27-1.19.2
+mappings_version=2022.11.20-1.19.2
 jb_annotations=21.0.1
 
 # Test dependencies
 junit_version=5.7.2
 hamcrest_version=2.2
 kotlin_version=1.8.0
-kotlinx_coroutines_version=1.6.0-RC3
+kotlinx_coroutines_version=1.7.3
 ttoolkit_version=0.1.3
 
 # Mod dependencies
 cc_version=1.101.3
 curios_version=1.19.2-5.1.4.1
 minecolonies_version=1.19.2-1.1.473-BETA
-appliedenergistics_version=12.9.5
+appliedenergistics_version=12.9.9
 patchouli_version=1.19.2-77
-refinedstorage_version=1.11.6
+refinedstorage_version=1.11.7
 botania_version=1.19.2-440-FORGE
 create_version=0.5.1.f-46
 createca_version=5099757
@@ -36,6 +36,7 @@ powah_version=4183078
 ae2additions_version=4646599
 kotlinforforge_version=3.12.0
 appliedmekanistics_version=4734608
+dimstorage_version=3927875
 
 # Mod dependencies which are needed for other mods
 # For minecolonies
@@ -44,5 +45,9 @@ multipiston_version=1.19.2-1.2.21-ALPHA
 blockui_version=1.19.2-0.0.102-ALPHA
 domumornamentum_version=1.19-1.0.141-BETA
 
+# For DimStorage
+edivadlib_version=3927847
+
 # Mod dependencies for testing stuff(Only used in the dev environment)
-jei_version=1.19.2-forge:11.6.0.1016
\ No newline at end of file
+jei_version=1.19.2-forge:11.6.0.1016
+jade_version=4914105
\ No newline at end of file
diff --git a/qodana.yaml b/qodana.yaml
index dfc5cbb26..f2df31528 100644
--- a/qodana.yaml
+++ b/qodana.yaml
@@ -16,7 +16,8 @@ exclude:
       - src/test/resources/*
       - src/testMod/resources/*
       - src/server-files/resources/*
-include:
   - name: CheckDependencyLicenses
+
+include:
   - name: TrivialIf
   - name: NullableProblems
\ No newline at end of file
diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json
new file mode 100644
index 000000000..21855bf71
--- /dev/null
+++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json
@@ -0,0 +1,20 @@
+{
+  "type": "minecraft:block",
+  "pools": [
+    {
+      "bonus_rolls": 0.0,
+      "conditions": [
+        {
+          "condition": "minecraft:survives_explosion"
+        }
+      ],
+      "entries": [
+        {
+          "type": "minecraft:item",
+          "name": "advancedperipherals:distance_detector"
+        }
+      ],
+      "rolls": 1.0
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json
new file mode 100644
index 000000000..731bc1f02
--- /dev/null
+++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json
@@ -0,0 +1,20 @@
+{
+  "type": "minecraft:block",
+  "pools": [
+    {
+      "bonus_rolls": 0.0,
+      "conditions": [
+        {
+          "condition": "minecraft:survives_explosion"
+        }
+      ],
+      "entries": [
+        {
+          "type": "minecraft:item",
+          "name": "advancedperipherals:fluid_detector"
+        }
+      ],
+      "rolls": 1.0
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json
new file mode 100644
index 000000000..dadeb8bc5
--- /dev/null
+++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json
@@ -0,0 +1,20 @@
+{
+  "type": "minecraft:block",
+  "pools": [
+    {
+      "bonus_rolls": 0.0,
+      "conditions": [
+        {
+          "condition": "minecraft:survives_explosion"
+        }
+      ],
+      "entries": [
+        {
+          "type": "minecraft:item",
+          "name": "advancedperipherals:gas_detector"
+        }
+      ],
+      "rolls": 1.0
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json
index ffd23c4b9..0578bfe7e 100644
--- a/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json
+++ b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json
@@ -1,5 +1,6 @@
 {
   "values": [
-    "advancedperipherals:peripheral_casing"
+    "advancedperipherals:peripheral_casing",
+    "advancedperipherals:colony_integrator"
   ]
 }
\ No newline at end of file
diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json
index ada8618ef..8f9cf40b9 100644
--- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json
+++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json
@@ -6,12 +6,15 @@
     "advancedperipherals:me_bridge",
     "advancedperipherals:rs_bridge",
     "advancedperipherals:energy_detector",
+    "advancedperipherals:fluid_detector",
+    "advancedperipherals:gas_detector",
     "advancedperipherals:peripheral_casing",
     "advancedperipherals:inventory_manager",
     "advancedperipherals:redstone_integrator",
     "advancedperipherals:block_reader",
     "advancedperipherals:geo_scanner",
     "advancedperipherals:colony_integrator",
-    "advancedperipherals:nbt_storage"
+    "advancedperipherals:nbt_storage",
+    "advancedperipherals:distance_detector"
   ]
 }
\ No newline at end of file
diff --git a/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java b/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java
index b752cdeb9..8489c5f95 100644
--- a/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java
+++ b/src/main/java/de/srendi/advancedperipherals/APCreativeTab.java
@@ -1,8 +1,8 @@
 package de.srendi.advancedperipherals;
 
-import de.srendi.advancedperipherals.common.setup.Blocks;
+import de.srendi.advancedperipherals.common.setup.APBlocks;
+import de.srendi.advancedperipherals.common.setup.APRegistration;
 import de.srendi.advancedperipherals.common.setup.CCRegistration;
-import de.srendi.advancedperipherals.common.setup.Registration;
 import de.srendi.advancedperipherals.common.util.inventory.ItemUtil;
 import net.minecraft.core.NonNullList;
 import net.minecraft.resources.ResourceLocation;
@@ -22,7 +22,7 @@ public APCreativeTab() {
 
     @Override
     public void fillItemList(NonNullList items) {
-        Registration.ITEMS.getEntries().stream().map(RegistryObject::get).forEach(item -> items.add(new ItemStack(item)));
+        APRegistration.ITEMS.getEntries().stream().map(RegistryObject::get).forEach(item -> items.add(new ItemStack(item)));
         items.addAll(pocketUpgrade(CCRegistration.ID.COLONY_POCKET));
         items.addAll(pocketUpgrade(CCRegistration.ID.CHATTY_POCKET));
         items.addAll(pocketUpgrade(CCRegistration.ID.PLAYER_POCKET));
@@ -58,6 +58,6 @@ private static Collection turtleUpgrade(ResourceLocation pocketId) {
     @Override
     @NotNull
     public ItemStack makeIcon() {
-        return new ItemStack(Blocks.CHAT_BOX.get());
+        return new ItemStack(APBlocks.CHAT_BOX.get());
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java
index e87c6dc1a..14ce64ae3 100644
--- a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java
+++ b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java
@@ -2,9 +2,9 @@
 
 import de.srendi.advancedperipherals.common.addons.APAddons;
 import de.srendi.advancedperipherals.common.configuration.APConfig;
-import de.srendi.advancedperipherals.common.setup.Registration;
+import de.srendi.advancedperipherals.common.network.PacketHandler;
+import de.srendi.advancedperipherals.common.setup.APRegistration;
 import de.srendi.advancedperipherals.common.village.VillageStructures;
-import de.srendi.advancedperipherals.network.APNetworking;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.eventbus.api.IEventBus;
@@ -26,6 +26,7 @@ public class AdvancedPeripherals {
     public static final Logger LOGGER = LogManager.getLogger(NAME);
     public static final Random RANDOM = new Random();
     public static final APCreativeTab TAB = new APCreativeTab();
+    public static final APAddons ADDONS = new APAddons();
 
     public AdvancedPeripherals() {
         LOGGER.info("AdvancedPeripherals says hello!");
@@ -34,7 +35,7 @@ public AdvancedPeripherals() {
         APConfig.register(ModLoadingContext.get());
 
         modBus.addListener(this::commonSetup);
-        Registration.register();
+        APRegistration.register();
         MinecraftForge.EVENT_BUS.register(this);
         new APAddons();
     }
@@ -49,14 +50,19 @@ public static void debug(String message, Level level) {
             LOGGER.log(level, "[DEBUG] {}", message);
     }
 
+    public static void exception(String message, Exception exception) {
+        if (APConfig.GENERAL_CONFIG.enableDebugMode.get()) {
+            LOGGER.error("[DEBUG]", exception);
+        }
+    }
+
     public static ResourceLocation getRL(String resource) {
         return new ResourceLocation(MOD_ID, resource);
     }
 
     public void commonSetup(FMLCommonSetupEvent event) {
-        APAddons.commonSetup();
         event.enqueueWork(() -> {
-            APNetworking.init();
+            PacketHandler.init();
             VillageStructures.init();
         });
     }
diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java
index 5f6f024b6..9eaf6025f 100644
--- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java
+++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java
@@ -14,6 +14,7 @@
 import net.minecraft.client.resources.model.ModelResourceLocation;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.client.event.EntityRenderersEvent;
 import net.minecraftforge.client.event.ModelEvent;
 import net.minecraftforge.client.event.RegisterGuiOverlaysEvent;
 import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
diff --git a/src/main/java/de/srendi/advancedperipherals/client/ItemPropertiesRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ItemPropertiesRegistry.java
new file mode 100644
index 000000000..00ef43539
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/client/ItemPropertiesRegistry.java
@@ -0,0 +1,17 @@
+package de.srendi.advancedperipherals.client;
+
+import de.srendi.advancedperipherals.AdvancedPeripherals;
+import de.srendi.advancedperipherals.common.setup.APItems;
+import net.minecraft.client.renderer.item.ItemProperties;
+import net.minecraft.resources.ResourceLocation;
+
+public class ItemPropertiesRegistry {
+
+    public static void register() {
+        ItemProperties.register(APItems.MEMORY_CARD.get(), new ResourceLocation(AdvancedPeripherals.MOD_ID, "bounded"), (stack, level, entity, seed) -> {
+            boolean bounded = stack.getOrCreateTag().contains("owner");
+            return bounded ? 1 : 0;
+        });
+    }
+
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/client/KeyBindings.java b/src/main/java/de/srendi/advancedperipherals/client/KeyBindings.java
index 2cbd46438..37cea5f0d 100644
--- a/src/main/java/de/srendi/advancedperipherals/client/KeyBindings.java
+++ b/src/main/java/de/srendi/advancedperipherals/client/KeyBindings.java
@@ -7,9 +7,11 @@
 public class KeyBindings {
 
     public static final KeyMapping DESCRIPTION_KEYBINDING = new KeyMapping("keybind.advancedperipherals.description", GLFW.GLFW_KEY_LEFT_CONTROL, "keybind.advancedperipherals.category");
+    public static final KeyMapping GLASSES_HOTKEY_KEYBINDING = new KeyMapping("keybind.advancedperipherals.glasses_hotkey", GLFW.GLFW_KEY_G, "keybind.advancedperipherals.category");
 
     public static void register(RegisterKeyMappingsEvent event) {
         event.register(DESCRIPTION_KEYBINDING);
+        event.register(GLASSES_HOTKEY_KEYBINDING);
     }
 
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java
new file mode 100644
index 000000000..6731f755e
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java
@@ -0,0 +1,97 @@
+package de.srendi.advancedperipherals.client.renderer;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.blaze3d.vertex.VertexConsumer;
+import com.mojang.math.Matrix3f;
+import com.mojang.math.Matrix4f;
+import com.mojang.math.Vector3f;
+import de.srendi.advancedperipherals.common.blocks.base.BaseBlock;
+import de.srendi.advancedperipherals.common.blocks.blockentities.DistanceDetectorEntity;
+import de.srendi.advancedperipherals.common.util.EnumColor;
+import net.minecraft.client.renderer.MultiBufferSource;
+import net.minecraft.client.renderer.RenderType;
+import net.minecraft.client.renderer.blockentity.BeaconRenderer;
+import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
+import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
+import net.minecraft.client.renderer.texture.OverlayTexture;
+import net.minecraft.core.Direction;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.util.Mth;
+import net.minecraft.world.phys.Vec3;
+import org.jetbrains.annotations.NotNull;
+
+public class DistanceDetectorRenderer implements BlockEntityRenderer {
+
+    public DistanceDetectorRenderer(BlockEntityRendererProvider.Context pContext) {
+        super();
+    }
+
+    @Override
+    public void render(@NotNull DistanceDetectorEntity pBlockEntity, float pPartialTick, @NotNull PoseStack pPoseStack, MultiBufferSource pBufferSource, int pPackedLight, int pPackedOverlay) {
+        if (pBlockEntity.getLaserVisibility())
+            renderBeaconBeam(pBlockEntity, pPoseStack, pBufferSource, BeaconRenderer.BEAM_LOCATION, pPartialTick, 1, 0, pBlockEntity.getCurrentDistance() - 0.5f, EnumColor.RED.getRgb(), 0.05f, 0.09f);
+    }
+
+    @Override
+    public boolean shouldRenderOffScreen(@NotNull DistanceDetectorEntity pBlockEntity) {
+        return true;
+    }
+
+    @Override
+    public int getViewDistance() {
+        return 256;
+    }
+
+    @Override
+    public boolean shouldRender(@NotNull DistanceDetectorEntity pBlockEntity, @NotNull Vec3 pCameraPos) {
+        return true;
+    }
+
+    public static void renderBeaconBeam(DistanceDetectorEntity detectorEntity, PoseStack pPoseStack, MultiBufferSource pBufferSource, ResourceLocation pBeamLocation, float pPartialTick, float pTextureScale, int pYOffset, float pHeight, float[] pColors, float pBeamRadius, float pGlowRadius) {
+        long pGameTime = detectorEntity.getLevel().getGameTime();
+        float maxX = pYOffset + pHeight;
+        Direction direction = detectorEntity.getBlockState().getValue(BaseBlock.ORIENTATION).front();
+        pPoseStack.pushPose();
+        pPoseStack.translate(0.5D, 0.5D, 0.5D);
+        float degrees = Math.floorMod(pGameTime, 360) + pPartialTick;
+        float reversedDegrees = pHeight < 0 ? degrees : -degrees;
+        float time = Mth.frac(reversedDegrees * 0.2F - Mth.floor(reversedDegrees * 0.1F));
+        float r = pColors[0];
+        float g = pColors[1];
+        float b = pColors[2];
+        pPoseStack.pushPose();
+        pPoseStack.mulPose(direction.getRotation());
+        pPoseStack.mulPose(Vector3f.YP.rotationDegrees(degrees * 2.25F - 45.0F));
+        float f15 = -1.0F + time;
+        float f16 = pHeight * pTextureScale * (0.5F / pBeamRadius) + f15;
+        renderPart(pPoseStack, pBufferSource.getBuffer(RenderType.beaconBeam(pBeamLocation, false)), r, g, b, 1.0F, pYOffset, maxX, 0.0F, pBeamRadius, pBeamRadius, 0.0F, -pBeamRadius, 0.0F, 0.0F, -pBeamRadius, 0.0F, 1.0F, f16, f15);
+        pPoseStack.popPose();
+        pPoseStack.mulPose(direction.getRotation());
+        f15 = -1.0F + time;
+        f16 = pHeight * pTextureScale + f15;
+        renderPart(pPoseStack, pBufferSource.getBuffer(RenderType.beaconBeam(pBeamLocation, true)), r, g, b, 0.225F, pYOffset, maxX, -pGlowRadius, -pGlowRadius, pGlowRadius, -pGlowRadius, -pBeamRadius, pGlowRadius, pGlowRadius, pGlowRadius, 0.0F, 1.0F, f16, f15);
+        pPoseStack.popPose();
+    }
+
+    private static void renderPart(PoseStack pPoseStack, VertexConsumer pConsumer, float pRed, float pGreen, float pBlue, float pAlpha, int pMinY, float pMaxY, float pX0, float pZ0, float pX1, float pZ1, float pX2, float pZ2, float pX3, float pZ3, float pMinU, float pMaxU, float pMinV, float pMaxV) {
+        PoseStack.Pose posestackPose = pPoseStack.last();
+        Matrix4f matrix4f = posestackPose.pose();
+        Matrix3f matrix3f = posestackPose.normal();
+        renderQuad(matrix4f, matrix3f, pConsumer, pRed, pGreen, pBlue, pAlpha, pMinY, pMaxY, pX0, pZ0, pX1, pZ1, pMinU, pMaxU, pMinV, pMaxV);
+        renderQuad(matrix4f, matrix3f, pConsumer, pRed, pGreen, pBlue, pAlpha, pMinY, pMaxY, pX3, pZ3, pX2, pZ2, pMinU, pMaxU, pMinV, pMaxV);
+        renderQuad(matrix4f, matrix3f, pConsumer, pRed, pGreen, pBlue, pAlpha, pMinY, pMaxY, pX1, pZ1, pX3, pZ3, pMinU, pMaxU, pMinV, pMaxV);
+        renderQuad(matrix4f, matrix3f, pConsumer, pRed, pGreen, pBlue, pAlpha, pMinY, pMaxY, pX2, pZ2, pX0, pZ0, pMinU, pMaxU, pMinV, pMaxV);
+    }
+
+    private static void renderQuad(Matrix4f pPose, Matrix3f pNormal, VertexConsumer pConsumer, float pRed, float pGreen, float pBlue, float pAlpha, int pMinY, float pMaxY, float pMinX, float pMinZ, float pMaxX, float pMaxZ, float pMinU, float pMaxU, float pMinV, float pMaxV) {
+        addVertex(pPose, pNormal, pConsumer, pRed, pGreen, pBlue, pAlpha, pMaxY, pMinX, pMinZ, pMaxU, pMinV);
+        addVertex(pPose, pNormal, pConsumer, pRed, pGreen, pBlue, pAlpha, pMinY, pMinX, pMinZ, pMaxU, pMaxV);
+        addVertex(pPose, pNormal, pConsumer, pRed, pGreen, pBlue, pAlpha, pMinY, pMaxX, pMaxZ, pMinU, pMaxV);
+        addVertex(pPose, pNormal, pConsumer, pRed, pGreen, pBlue, pAlpha, pMaxY, pMaxX, pMaxZ, pMinU, pMinV);
+    }
+
+    private static void addVertex(Matrix4f pPose, Matrix3f pNormal, VertexConsumer pConsumer, float pRed, float pGreen, float pBlue, float pAlpha, float pY, float pX, float pZ, float pU, float pV) {
+        pConsumer.vertex(pPose, pX, pY, pZ).color(pRed, pGreen, pBlue, pAlpha).uv(pU, pV).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(15728880).normal(pNormal, 0.0F, 1.0F, 0.0F).endVertex();
+    }
+
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/InventoryManagerScreen.java
similarity index 78%
rename from src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerScreen.java
rename to src/main/java/de/srendi/advancedperipherals/client/screens/InventoryManagerScreen.java
index e4d88e29c..d1730b50b 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerScreen.java
+++ b/src/main/java/de/srendi/advancedperipherals/client/screens/InventoryManagerScreen.java
@@ -1,7 +1,8 @@
-package de.srendi.advancedperipherals.common.container;
+package de.srendi.advancedperipherals.client.screens;
 
 import de.srendi.advancedperipherals.AdvancedPeripherals;
-import de.srendi.advancedperipherals.common.container.base.BaseScreen;
+import de.srendi.advancedperipherals.client.screens.base.BaseScreen;
+import de.srendi.advancedperipherals.common.container.InventoryManagerContainer;
 import net.minecraft.network.chat.Component;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.entity.player.Inventory;
diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/SmartGlassesScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SmartGlassesScreen.java
new file mode 100644
index 000000000..9b4aa2346
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/client/screens/SmartGlassesScreen.java
@@ -0,0 +1,78 @@
+package de.srendi.advancedperipherals.client.screens;
+
+import com.mojang.blaze3d.systems.RenderSystem;
+import com.mojang.blaze3d.vertex.PoseStack;
+import dan200.computercraft.client.gui.ComputerScreenBase;
+import dan200.computercraft.client.gui.widgets.ComputerSidebar;
+import dan200.computercraft.client.gui.widgets.WidgetTerminal;
+import dan200.computercraft.shared.turtle.inventory.ContainerTurtle;
+import de.srendi.advancedperipherals.AdvancedPeripherals;
+import de.srendi.advancedperipherals.client.widgets.SmartGlassesSettingsSwitch;
+import de.srendi.advancedperipherals.common.container.SmartGlassesContainer;
+import de.srendi.advancedperipherals.common.smartglasses.SlotType;
+import net.minecraft.network.chat.Component;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.util.FormattedCharSequence;
+import net.minecraft.world.entity.player.Inventory;
+import org.jetbrains.annotations.NotNull;
+
+public class SmartGlassesScreen extends ComputerScreenBase {
+
+    private static final ResourceLocation BACKGROUND = new ResourceLocation(AdvancedPeripherals.MOD_ID, "textures/gui/smart_glasses_gui.png");
+    public static final ResourceLocation SIDEBAR = new ResourceLocation(AdvancedPeripherals.MOD_ID, "textures/gui/corners_glasses.png");
+
+    private static final int TEX_WIDTH = 254;
+    private static final int TEX_HEIGHT = 217;
+    private SlotType currentType = SlotType.defaultType();
+
+    public SmartGlassesScreen(SmartGlassesContainer container, Inventory player, Component title) {
+        super(container, player, title, ContainerTurtle.BORDER);
+
+        imageWidth = TEX_WIDTH + ComputerSidebar.WIDTH;
+        imageHeight = TEX_HEIGHT;
+    }
+
+    @Override
+    protected void init() {
+        super.init();
+        addRenderableWidget(new SmartGlassesSettingsSwitch(254, 147, SlotType.PERIPHERALS, this));
+        addRenderableWidget(new SmartGlassesSettingsSwitch(254, 170, SlotType.MODULES, this));
+    }
+
+    @Override
+    protected WidgetTerminal createTerminal() {
+        return new WidgetTerminal(terminalData, input, leftPos + ContainerTurtle.BORDER + ComputerSidebar.WIDTH, topPos + ContainerTurtle.BORDER);
+    }
+
+    @Override
+    protected void renderBg(@NotNull PoseStack transform, float partialTicks, int mouseX, int mouseY) {
+        RenderSystem.setShaderTexture(0, BACKGROUND);
+        blit(transform, leftPos + ComputerSidebar.WIDTH, topPos, 0, 0, TEX_WIDTH, TEX_HEIGHT);
+
+        if (currentType == SlotType.PERIPHERALS)
+            blit(transform, leftPos + ComputerSidebar.WIDTH + 222, topPos + 183, 186, 183, 18, 18);
+
+        RenderSystem.setShaderTexture(0, SIDEBAR);
+        ComputerSidebar.renderBackground(transform, leftPos, topPos + sidebarYOffset);
+    }
+
+    @Override
+    protected void renderTooltip(@NotNull PoseStack poseStack, int x, int y) {
+        super.renderTooltip(poseStack, x, y);
+        renderables.forEach(renderable -> {
+            if (renderable instanceof SmartGlassesSettingsSwitch smartGlassesSettingsSwitch) {
+                smartGlassesSettingsSwitch.renderTooltip(poseStack, x, y);
+            }
+        });
+    }
+
+    @Override
+    protected void renderLabels(PoseStack poseStack, int x, int y) {
+        FormattedCharSequence formattedcharsequence = currentType.getName().getVisualOrderText();
+        this.font.draw(poseStack, formattedcharsequence, (212 + ComputerSidebar.WIDTH - (float) this.font.width(formattedcharsequence) / 2), 133, 4210752);
+    }
+
+    public void setCurrentType(SlotType currentType) {
+        this.currentType = currentType;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/base/BaseItemScreen.java
similarity index 73%
rename from src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemScreen.java
rename to src/main/java/de/srendi/advancedperipherals/client/screens/base/BaseItemScreen.java
index 527878f10..a7e7e9476 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseItemScreen.java
+++ b/src/main/java/de/srendi/advancedperipherals/client/screens/base/BaseItemScreen.java
@@ -1,16 +1,18 @@
-package de.srendi.advancedperipherals.common.container.base;
+package de.srendi.advancedperipherals.client.screens.base;
 
 import com.mojang.blaze3d.systems.RenderSystem;
 import com.mojang.blaze3d.vertex.PoseStack;
+import de.srendi.advancedperipherals.common.container.base.BaseItemContainer;
 import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
 import net.minecraft.client.renderer.GameRenderer;
 import net.minecraft.network.chat.Component;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.entity.player.Inventory;
+import org.jetbrains.annotations.NotNull;
 
 public abstract class BaseItemScreen extends AbstractContainerScreen {
 
-    public BaseItemScreen(T screenContainer, Inventory inv, Component titleIn) {
+    protected BaseItemScreen(T screenContainer, Inventory inv, Component titleIn) {
         super(screenContainer, inv, titleIn);
 
         imageWidth = getSizeX();
@@ -18,14 +20,14 @@ public BaseItemScreen(T screenContainer, Inventory inv, Component titleIn) {
     }
 
     @Override
-    public void render(PoseStack matrixStack, int x, int y, float partialTicks) {
+    public void render(@NotNull PoseStack matrixStack, int x, int y, float partialTicks) {
         renderBackground(matrixStack);
         super.render(matrixStack, x, y, partialTicks);
         renderTooltip(matrixStack, x, y);
     }
 
     @Override
-    protected void renderBg(PoseStack matrixStack, float partialTicks, int x, int y) {
+    protected void renderBg(@NotNull PoseStack matrixStack, float partialTicks, int x, int y) {
         RenderSystem.setShader(GameRenderer::getPositionTexShader);
         RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
         RenderSystem.setShaderTexture(0, getTexture());
diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/base/BaseScreen.java
similarity index 86%
rename from src/main/java/de/srendi/advancedperipherals/common/container/base/BaseScreen.java
rename to src/main/java/de/srendi/advancedperipherals/client/screens/base/BaseScreen.java
index f9311435e..9390fa902 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/container/base/BaseScreen.java
+++ b/src/main/java/de/srendi/advancedperipherals/client/screens/base/BaseScreen.java
@@ -1,7 +1,8 @@
-package de.srendi.advancedperipherals.common.container.base;
+package de.srendi.advancedperipherals.client.screens.base;
 
 import com.mojang.blaze3d.systems.RenderSystem;
 import com.mojang.blaze3d.vertex.PoseStack;
+import de.srendi.advancedperipherals.common.container.base.BaseContainer;
 import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
 import net.minecraft.client.renderer.GameRenderer;
 import net.minecraft.network.chat.Component;
@@ -11,7 +12,7 @@
 
 public abstract class BaseScreen extends AbstractContainerScreen {
 
-    public BaseScreen(T screenContainer, Inventory inv, Component titleIn) {
+    protected BaseScreen(T screenContainer, Inventory inv, Component titleIn) {
         super(screenContainer, inv, titleIn);
         imageWidth = getSizeX();
         imageHeight = getSizeY();
diff --git a/src/main/java/de/srendi/advancedperipherals/client/widgets/SmartGlassesSettingsSwitch.java b/src/main/java/de/srendi/advancedperipherals/client/widgets/SmartGlassesSettingsSwitch.java
new file mode 100644
index 000000000..3ee6e1fb1
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/client/widgets/SmartGlassesSettingsSwitch.java
@@ -0,0 +1,85 @@
+package de.srendi.advancedperipherals.client.widgets;
+
+import com.mojang.blaze3d.systems.RenderSystem;
+import com.mojang.blaze3d.vertex.PoseStack;
+import dan200.computercraft.client.gui.widgets.ComputerSidebar;
+import de.srendi.advancedperipherals.AdvancedPeripherals;
+import de.srendi.advancedperipherals.client.screens.SmartGlassesScreen;
+import de.srendi.advancedperipherals.common.smartglasses.SlotType;
+import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesSlot;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.components.AbstractWidget;
+import net.minecraft.client.gui.narration.NarrationElementOutput;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.inventory.Slot;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+
+public class SmartGlassesSettingsSwitch extends AbstractWidget {
+
+    private static final ResourceLocation BACKGROUND = new ResourceLocation(AdvancedPeripherals.MOD_ID, "textures/gui/smart_glasses_gui.png");
+
+    private final SmartGlassesScreen screen;
+    private final SlotType type;
+    private boolean isEnabled;
+
+    public SmartGlassesSettingsSwitch(int x, int y, SlotType type, SmartGlassesScreen screen) {
+        super(screen.getGuiLeft() + x + ComputerSidebar.WIDTH, screen.getGuiTop() + y, 21, 22, type.getName());
+        this.screen = screen;
+        this.type = type;
+        this.isEnabled = type == SlotType.defaultType();
+    }
+
+    @Override
+    public void render(@NotNull PoseStack pPoseStack, int pMouseX, int pMouseY, float pPartialTick) {
+        renderBg(pPoseStack, Minecraft.getInstance(), pMouseX, pMouseY);
+    }
+
+    @Override
+    public void renderButton(@NotNull PoseStack pPoseStack, int pMouseX, int pMouseY, float pPartialTick) {
+        // Disable rendering of default buttons
+    }
+
+    @Override
+    protected void renderBg(@NotNull PoseStack pPoseStack, @NotNull Minecraft pMinecraft, int pMouseX, int pMouseY) {
+        RenderSystem.setShaderTexture(0, BACKGROUND);
+        if (isEnabled) {
+            blit(pPoseStack, this.x - 3, this.y, 45, 217, 24, 22);
+        } else {
+            blit(pPoseStack, this.x, this.y, 23, 217, 21, 22);
+        }
+    }
+
+    @Override
+    public void onClick(double pMouseX, double pMouseY) {
+        if (this.isEnabled)
+            return;
+        for (Slot slot : screen.getMenu().slots) {
+            if (slot instanceof SmartGlassesSlot smartGlassesSlot) {
+                if (smartGlassesSlot.slotType == this.type) {
+                    smartGlassesSlot.setEnabled(true);
+                    continue;
+                }
+                smartGlassesSlot.setEnabled(false);
+            }
+        }
+        screen.renderables.forEach(renderable -> {
+            if (renderable instanceof SmartGlassesSettingsSwitch smartGlassesSettingsSwitch) {
+                smartGlassesSettingsSwitch.isEnabled = false;
+            }
+        });
+        screen.setCurrentType(this.type);
+        this.isEnabled = true;
+    }
+
+    public void renderTooltip(PoseStack poseStack, int x, int y) {
+        if (screen != null && isMouseOver(x, y))
+            screen.renderComponentTooltip(poseStack, Collections.singletonList(type.getName()), x, y);
+    }
+
+    @Override
+    public void updateNarration(NarrationElementOutput pNarrationElementOutput) {
+
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java
index c26e2652a..5bdce0093 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java
@@ -2,10 +2,19 @@
 
 import de.srendi.advancedperipherals.AdvancedPeripherals;
 import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorage;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.item.ItemStack;
 import net.minecraftforge.eventbus.api.SubscribeEvent;
+import net.minecraftforge.fml.InterModComms;
 import net.minecraftforge.fml.ModList;
 import net.minecraftforge.fml.common.Mod;
 import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
+import top.theillusivec4.curios.api.CuriosApi;
+import top.theillusivec4.curios.api.SlotResult;
+import top.theillusivec4.curios.api.SlotTypeMessage;
+
+import java.util.List;
 
 @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
 public class APAddons {
@@ -13,29 +22,32 @@ public class APAddons {
     public static final String CURIOS_MODID = "curios";
     public static final String REFINEDSTORAGE_MODID = "refinedstorage";
     public static final String AE_THINGS_MODID = "ae2things";
+    public static final String APPLIEDENERGISTICS_MODID = "ae2";
+    public static final String MEKANISM_MODID = "mekanism";
     public static final String AE_ADDITIONS_MODID = "ae2additions";
     public static final String APP_MEKANISTICS_MODID = "appmek";
 
     public static boolean curiosLoaded;
     public static boolean refinedStorageLoaded;
     public static boolean aeThingsLoaded;
+    public static boolean appliedEnergisticsLoaded;
+    public static boolean mekanismLoaded;
     public static boolean aeAdditionsLoaded;
     public static boolean appMekLoaded;
 
-    private APAddons() {
-    }
-
-    public static void commonSetup() {
+    // Use static so these checks run as early as possible, so we can use them for our registries
+    static {
         ModList modList = ModList.get();
         curiosLoaded = modList.isLoaded(CURIOS_MODID);
         refinedStorageLoaded = modList.isLoaded(REFINEDSTORAGE_MODID);
+        appliedEnergisticsLoaded = modList.isLoaded(APPLIEDENERGISTICS_MODID);
+        mekanismLoaded = modList.isLoaded(MEKANISM_MODID);
         aeThingsLoaded = modList.isLoaded(AE_THINGS_MODID);
         aeAdditionsLoaded = modList.isLoaded(AE_ADDITIONS_MODID);
         appMekLoaded = modList.isLoaded(APP_MEKANISTICS_MODID);
 
         if (refinedStorageLoaded)
             RefinedStorage.instance = new RefinedStorage();
-
     }
 
     @SubscribeEvent
@@ -43,6 +55,20 @@ public static void interModComms(InterModEnqueueEvent event) {
         if (!curiosLoaded)
             return;
 
-        // InterModComms.sendTo("curios", SlotTypeMessage.REGISTER_TYPE, () -> new SlotTypeMessage.Builder("glasses").size(1).build());
+        InterModComms.sendTo(CURIOS_MODID, SlotTypeMessage.REGISTER_TYPE,
+                () -> new SlotTypeMessage.Builder("glasses")
+                        .size(1)
+                        .icon(new ResourceLocation(AdvancedPeripherals.MOD_ID, "slot/empty_glasses_slot"))
+                        .build());
+    }
+
+    public static ItemStack getCurioGlasses(Player player) {
+        if (!curiosLoaded)
+            return ItemStack.EMPTY;
+        List curioSlots = CuriosApi.getCuriosHelper().findCurios(player, "glasses");
+        if (curioSlots.isEmpty())
+            return ItemStack.EMPTY;
+
+        return curioSlots.get(0).stack();
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java
index df44e2c86..6418060b1 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java
@@ -1,6 +1,8 @@
 package de.srendi.advancedperipherals.common.addons.appliedenergistics;
 
+import appeng.api.crafting.IPatternDetails;
 import appeng.api.inventories.InternalInventory;
+import appeng.api.networking.IGrid;
 import appeng.api.networking.IGridNode;
 import appeng.api.networking.crafting.CraftingJobStatus;
 import appeng.api.networking.crafting.ICraftingCPU;
@@ -12,6 +14,11 @@
 import appeng.api.storage.MEStorage;
 import appeng.api.storage.cells.IBasicCellItem;
 import appeng.blockentity.storage.DriveBlockEntity;
+import appeng.crafting.pattern.EncodedPatternItem;
+import appeng.helpers.iface.PatternContainer;
+import appeng.items.storage.BasicStorageCell;
+import appeng.me.cells.BasicCellHandler;
+import appeng.me.cells.BasicCellInventory;
 import appeng.parts.storagebus.StorageBusPart;
 import com.the9grounds.aeadditions.item.storage.StorageCell;
 import com.the9grounds.aeadditions.item.storage.SuperStorageCell;
@@ -21,14 +28,20 @@
 import de.srendi.advancedperipherals.common.util.LuaConverter;
 import de.srendi.advancedperipherals.common.util.Pair;
 import de.srendi.advancedperipherals.common.util.inventory.FluidFilter;
+import de.srendi.advancedperipherals.common.util.inventory.GenericFilter;
 import de.srendi.advancedperipherals.common.util.inventory.ItemFilter;
 import de.srendi.advancedperipherals.common.util.inventory.ItemUtil;
 import io.github.projectet.ae2things.item.DISKDrive;
 import it.unimi.dsi.fastutil.objects.Object2LongMap;
 import me.ramidzkh.mekae2.ae2.MekanismKey;
+import me.ramidzkh.mekae2.ae2.MekanismKeyType;
+import me.ramidzkh.mekae2.item.ChemicalStorageCell;
+import mekanism.api.chemical.merged.MergedChemicalTank;
+import mekanism.common.tile.TileEntityChemicalTank;
 import net.minecraft.core.BlockPos;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.Level;
 import net.minecraft.world.level.block.entity.BlockEntity;
 import net.minecraftforge.common.capabilities.ForgeCapabilities;
 import net.minecraftforge.common.util.LazyOptional;
@@ -36,10 +49,10 @@
 import net.minecraftforge.fluids.capability.IFluidHandler;
 import net.minecraftforge.items.IItemHandler;
 import net.minecraftforge.registries.ForgeRegistries;
-import org.apache.logging.log4j.Level;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 public class AppEngApi {
 
@@ -85,6 +98,60 @@ public static Pair findAEFluidFromFilter(MEStorage monitor, @N
         return null;
     }
 
+    /**
+     * Finds a pattern from filters.
+     *
+     * @param grid         The grid to search patterns from.
+     * @param level        The level of the grid.
+     * @param inputFilter  The input filter to apply, can be null to ignore input filter.
+     * @param outputFilter The output filter to apply, can be null to ignore output filter.
+     * @return A Pair object containing the matched pattern and an error message if no pattern is found.
+     * The pattern can be null if no pattern is found.
+     * The error message is "NO_PATTERN_FOUND" if no pattern is found.
+     */
+    public static Pair findPatternFromFilters(IGrid grid, Level level, @Nullable GenericFilter inputFilter, @Nullable GenericFilter outputFilter) {
+        for (IPatternDetails pattern : getPatterns(grid, level)) {
+            if (pattern.getInputs().length == 0)
+                continue;
+            if (pattern.getOutputs().length == 0)
+                continue;
+
+            boolean inputMatch = false;
+            boolean outputMatch = false;
+
+            if (inputFilter != null) {
+                outerLoop:
+                for (IPatternDetails.IInput input : pattern.getInputs()) {
+                    for (GenericStack possibleInput : input.getPossibleInputs()) {
+                        if (inputFilter.test(possibleInput)) {
+                            inputMatch = true;
+                            break outerLoop;
+                        }
+                    }
+                }
+            } else {
+                inputMatch = true;
+            }
+
+            if (outputFilter != null) {
+                for (GenericStack output : pattern.getOutputs()) {
+                    if (outputFilter.test(output)) {
+                        outputMatch = true;
+                        break;
+                    }
+                }
+            } else {
+                outputMatch = true;
+            }
+
+            if (inputMatch && outputMatch)
+                return Pair.of(pattern, null);
+        }
+
+        return Pair.of(null, "NO_PATTERN_FOUND");
+    }
+
+
     public static List listStacks(MEStorage monitor, ICraftingService service) {
         List items = new ArrayList<>();
         KeyCounter keyCounter = monitor.getAvailableStacks();
@@ -118,7 +185,7 @@ public static List listFluids(MEStorage monitor, ICraftingService servic
         return items;
     }
 
-    public static List listGases(MEStorage monitor, ICraftingService service, int flag) {
+    public static List listGases(MEStorage monitor, ICraftingService service) {
         List items = new ArrayList<>();
         for (Object2LongMap.Entry aeKey : monitor.getAvailableStacks()) {
             if (APAddons.appMekLoaded && aeKey.getKey() instanceof MekanismKey itemKey) {
@@ -140,6 +207,55 @@ public static List listCraftableFluids(MEStorage monitor, ICraftingServi
         return items;
     }
 
+    public static List getPatterns(IGrid grid, Level level) {
+        List patterns = new ArrayList<>();
+        for (var machineClass : grid.getMachineClasses()) {
+            var containerClass = tryCastMachineToContainer(machineClass);
+            if (containerClass == null)
+                continue;
+
+            for (var container : grid.getActiveMachines(containerClass)) {
+                for (ItemStack patternItem : container.getTerminalPatternInventory()) {
+                    if (patternItem.getItem() instanceof EncodedPatternItem item) {
+                        IPatternDetails patternDetails = item.decode(patternItem, level, false);
+                        if (patternDetails == null)
+                            continue;
+
+                        patterns.add(patternDetails);
+                    }
+                }
+            }
+        }
+        return patterns;
+    }
+
+    public static List listPatterns(IGrid grid, Level level) {
+        return getPatterns(grid, level).stream().map(AppEngApi::getObjectFromPattern).collect(Collectors.toList());
+    }
+
+    public static List listDrives(IGrid grid) {
+        List drives = new ArrayList<>();
+
+        for (IGridNode node : grid.getMachineNodes(DriveBlockEntity.class)) {
+            DriveBlockEntity drive = (DriveBlockEntity) node.getService(IStorageProvider.class);
+
+            // A normal drive has a cellCount of 10
+            if (drive == null || drive.getCellCount() != 10)
+                continue;
+
+            drives.add(getObjectFromDrive(drive));
+        }
+
+        return drives;
+    }
+
+    private static Class tryCastMachineToContainer(Class machineClass) {
+        if (PatternContainer.class.isAssignableFrom(machineClass))
+            return machineClass.asSubclass(PatternContainer.class);
+
+        return null;
+    }
+
     public static  Map getObjectFromStack(Pair stack, @Nullable ICraftingService service) {
         if (stack.getRight() == null)
             return Collections.emptyMap();
@@ -150,10 +266,58 @@ public static  Map getObjectFromStack(Pair getObjectFromDrive(DriveBlockEntity drive) {
+        Map map = new HashMap<>();
+
+        map.put("powered", drive.isPowered());
+
+        long totalBytes = 0;
+        long usedBytes = 0;
+
+        if (drive.getCellCount() != 10)
+            return map;
+
+        List driveCells = new ArrayList<>();
+        for (ItemStack item : drive.getInternalInventory()) {
+            if (item.getItem() instanceof BasicStorageCell cell) {
+                BasicCellInventory cellInventory = BasicCellHandler.INSTANCE.getCellInventory(item, null);
+                totalBytes += cellInventory.getTotalBytes();
+                usedBytes += cellInventory.getUsedBytes();
+
+                driveCells.add(getObjectFromCell(cell, item));
+            }
+        }
+
+        map.put("usedBytes", usedBytes);
+        map.put("totalBytes", totalBytes);
+        map.put("cells", driveCells);
+        map.put("priority", drive.getPriority());
+        map.put("menuIcon", LuaConverter.itemToObject(drive.getMainMenuIcon().getItem()));
+        map.put("position", LuaConverter.posToObject(drive.getBlockPos()));
+        map.put("name", drive.getCustomInventoryName().getString());
+
+        return map;
+    }
+
+    public static Map getObjectFromCell(BasicStorageCell cell, ItemStack cellItem) {
+        Map map = new HashMap<>();
+        BasicCellInventory cellInventory = BasicCellHandler.INSTANCE.getCellInventory(cellItem, null);
+
+        map.put("item", LuaConverter.itemToObject(cellItem.getItem()));
+        map.put("type", cell.getKeyType().toString());
+        map.put("bytes", cell.getBytes(cellItem));
+        map.put("bytesPerType", cell.getBytesPerType(cellItem));
+        map.put("usedBytes", cellInventory.getUsedBytes());
+        map.put("totalTypes", cell.getTotalTypes(cellItem));
+        map.put("fuzzyMode", cell.getFuzzyMode(cellItem).toString());
+
+        return map;
+    }
+
     private static Map getObjectFromItemStack(Pair stack, @Nullable ICraftingService craftingService) {
         Map map = new HashMap<>();
         String displayName = stack.getRight().getDisplayName().getString();
@@ -193,7 +357,27 @@ private static Map getObjectFromGasStack(Pair
         return map;
     }
 
-    public static Map getObjectFromCPU(ICraftingCPU cpu) {
+    public static Map getObjectFromPattern(IPatternDetails pattern) {
+        Map map = new HashMap<>();
+
+        map.put("inputs", Arrays.stream(pattern.getInputs()).map(AppEngApi::getObjectFromPatternInput).collect(Collectors.toList()));
+        map.put("outputs", Arrays.stream(pattern.getOutputs()).map(AppEngApi::getObjectFromGenericStack).collect(Collectors.toList()));
+        map.put("primaryOutput", getObjectFromGenericStack(pattern.getPrimaryOutput()));
+        return map;
+    }
+
+    public static Map getObjectFromPatternInput(IPatternDetails.IInput patternInput) {
+        Map map = new HashMap<>();
+        map.put("primaryInput", getObjectFromGenericStack(patternInput.getPossibleInputs()[0]));
+        map.put("possibleInputs",
+                Arrays.stream(Arrays.copyOfRange(patternInput.getPossibleInputs(), 1, patternInput.getPossibleInputs().length))
+                        .map(AppEngApi::getObjectFromGenericStack));
+        map.put("multiplier", patternInput.getMultiplier());
+        map.put("remaining", patternInput.getRemainingKey(patternInput.getPossibleInputs()[0].what()));
+        return map;
+    }
+
+    public static Map getObjectFromCPU(ICraftingCPU cpu, boolean recursive) {
         Map map = new HashMap<>();
         long storage = cpu.getAvailableStorage();
         int coProcessors = cpu.getCoProcessors();
@@ -201,20 +385,24 @@ public static Map getObjectFromCPU(ICraftingCPU cpu) {
         map.put("storage", storage);
         map.put("coProcessors", coProcessors);
         map.put("isBusy", isBusy);
-        map.put("craftingJob", cpu.getJobStatus() != null ? getObjectFromJob(cpu.getJobStatus()) : null);
+        if (!recursive)
+            map.put("craftingJob", cpu.getJobStatus() != null ? getObjectFromJob(cpu.getJobStatus(), null) : null);
         map.put("name", cpu.getName() != null ? cpu.getName().getString() : "Unnamed");
         map.put("selectionMode", cpu.getSelectionMode().toString());
 
         return map;
     }
 
-    public static Map getObjectFromJob(CraftingJobStatus job) {
+    public static Map getObjectFromJob(CraftingJobStatus job, @Nullable ICraftingCPU cpu) {
         Map map = new HashMap<>();
         map.put("storage", getObjectFromGenericStack(job.crafting()));
         map.put("elapsedTimeNanos", job.elapsedTimeNanos());
         map.put("totalItem", job.totalItems());
         map.put("progress", job.progress());
 
+        if (cpu != null)
+            map.put("cpu", getObjectFromCPU(cpu, true));
+
         return map;
     }
 
@@ -308,6 +496,137 @@ public static boolean isFluidCrafting(MEStorage monitor, ICraftingService grid,
         return false;
     }
 
+    /// External Storage
+    /// Total
+
+    public static long getTotalExternalItemStorage(IGridNode node) {
+        long total = 0;
+
+        for (IGridNode iGridNode : node.getGrid().getMachineNodes(StorageBusPart.class)) {
+            StorageBusPart bus = (StorageBusPart) iGridNode.getService(IStorageProvider.class);
+            Level level = bus.getLevel();
+            BlockPos connectedInventoryPos = bus.getHost().getBlockEntity().getBlockPos().relative(bus.getSide());
+            BlockEntity connectedInventoryEntity = level.getBlockEntity(connectedInventoryPos);
+
+            if (connectedInventoryEntity == null)
+                continue;
+
+            LazyOptional itemHandler = connectedInventoryEntity.getCapability(ForgeCapabilities.ITEM_HANDLER);
+            if (itemHandler.isPresent()) {
+                IItemHandler handler = itemHandler.orElse(null);
+                for (int i = 0; i < handler.getSlots(); i++) {
+                    total += handler.getSlotLimit(i);
+                }
+            }
+        }
+
+        return total;
+    }
+
+    public static long getTotalExternalFluidStorage(IGridNode node) {
+        long total = 0;
+
+        for (IGridNode iGridNode : node.getGrid().getMachineNodes(StorageBusPart.class)) {
+            StorageBusPart bus = (StorageBusPart) iGridNode.getService(IStorageProvider.class);
+            Level level = bus.getLevel();
+            BlockPos connectedInventoryPos = bus.getHost().getBlockEntity().getBlockPos().relative(bus.getSide());
+            BlockEntity connectedInventoryEntity = level.getBlockEntity(connectedInventoryPos);
+
+            if (connectedInventoryEntity == null)
+                continue;
+
+            LazyOptional fluidHandler = connectedInventoryEntity.getCapability(ForgeCapabilities.FLUID_HANDLER);
+            if (fluidHandler.isPresent()) {
+                IFluidHandler handler = fluidHandler.orElse(null);
+                for (int i = 0; i < handler.getTanks(); i++) {
+                    total += handler.getTankCapacity(i);
+                }
+            }
+        }
+
+        return total;
+    }
+
+    public static long getTotalExternalChemicalStorage(IGridNode node) {
+        long total = 0;
+
+        if (!APAddons.appMekLoaded)
+            return 0;
+
+        for (IGridNode iGridNode : node.getGrid().getMachineNodes(StorageBusPart.class)) {
+            StorageBusPart bus = (StorageBusPart) iGridNode.getService(IStorageProvider.class);
+            Level level = bus.getLevel();
+            BlockPos connectedInventoryPos = bus.getHost().getBlockEntity().getBlockPos().relative(bus.getSide());
+            BlockEntity connectedInventoryEntity = level.getBlockEntity(connectedInventoryPos);
+
+            if (connectedInventoryEntity == null)
+                continue;
+
+            if (connectedInventoryEntity instanceof TileEntityChemicalTank tank) {
+                MergedChemicalTank.Current current = tank.getChemicalTank().getCurrent() == MergedChemicalTank.Current.EMPTY ? MergedChemicalTank.Current.GAS : tank.getChemicalTank().getCurrent();
+                total += tank.getChemicalTank().getTankFromCurrent(current).getCapacity();
+            }
+        }
+
+        return total;
+    }
+
+    /// Used
+
+    public static long getUsedExternalItemStorage(IGridNode node) {
+        long used = 0;
+
+        for (IGridNode iGridNode : node.getGrid().getMachineNodes(StorageBusPart.class)) {
+            StorageBusPart bus = (StorageBusPart) iGridNode.getService(IStorageProvider.class);
+            KeyCounter keyCounter = bus.getInternalHandler().getAvailableStacks();
+
+            for (Object2LongMap.Entry aeKey : keyCounter) {
+                if (aeKey.getKey() instanceof AEItemKey)
+                    used += aeKey.getLongValue();
+            }
+        }
+
+        return used;
+    }
+
+    public static long getUsedExternalFluidStorage(IGridNode node) {
+        long used = 0;
+
+        for (IGridNode iGridNode : node.getGrid().getMachineNodes(StorageBusPart.class)) {
+            StorageBusPart bus = (StorageBusPart) iGridNode.getService(IStorageProvider.class);
+            KeyCounter keyCounter = bus.getInternalHandler().getAvailableStacks();
+
+            for (Object2LongMap.Entry aeKey : keyCounter) {
+                if (aeKey.getKey() instanceof AEFluidKey)
+                    used += aeKey.getLongValue();
+            }
+        }
+
+        return used;
+    }
+
+    public static long getUsedExternalChemicalStorage(IGridNode node) {
+        long used = 0;
+
+        if (!APAddons.appMekLoaded)
+            return 0;
+
+        for (IGridNode iGridNode : node.getGrid().getMachineNodes(StorageBusPart.class)) {
+            StorageBusPart bus = (StorageBusPart) iGridNode.getService(IStorageProvider.class);
+            KeyCounter keyCounter = bus.getInternalHandler().getAvailableStacks();
+
+            for (Object2LongMap.Entry aeKey : keyCounter) {
+                if (aeKey.getKey() instanceof MekanismKey)
+                    used += aeKey.getLongValue();
+            }
+        }
+
+        return used;
+    }
+
+    /// Internal Storage
+    /// Total
+
     public static long getTotalItemStorage(IGridNode node) {
         long total = 0;
 
@@ -335,7 +654,7 @@ public static long getTotalItemStorage(IGridNode node) {
                         total += disk.getBytes(null);
                     }
                 } else if (APAddons.aeAdditionsLoaded && (stack.getItem() instanceof SuperStorageCell superStorageCell)) {
-                    total += superStorageCell.getKiloBytes() * 1024;
+                    total += superStorageCell.getKiloBytes() * 1024L;
                 } else if (APAddons.aeAdditionsLoaded && (stack.getItem() instanceof StorageCell storageCell)) {
                     if (storageCell.getKeyType() != AEKeyType.items())
                         continue;
@@ -343,26 +662,6 @@ public static long getTotalItemStorage(IGridNode node) {
                 }
             }
         }
-
-        iterator = node.getGrid().getMachineNodes(StorageBusPart.class).iterator();
-
-        while (iterator.hasNext()) {
-            StorageBusPart bus = (StorageBusPart) iterator.next().getService(IStorageProvider.class);
-            net.minecraft.world.level.Level level = bus.getLevel();
-            BlockPos connectedInventoryPos = bus.getHost().getBlockEntity().getBlockPos().relative(bus.getSide());
-            BlockEntity connectedInventoryEntity = level.getBlockEntity(connectedInventoryPos);
-            if (connectedInventoryEntity == null)
-                continue;
-
-            LazyOptional itemHandler = connectedInventoryEntity.getCapability(ForgeCapabilities.ITEM_HANDLER);
-            if (itemHandler.isPresent()) {
-                IItemHandler handler = itemHandler.orElse(null);
-                for (int i = 0; i < handler.getSlots(); i++) {
-                    total += handler.getSlotLimit(i);
-                }
-            }
-        }
-
         return total;
     }
 
@@ -388,7 +687,7 @@ public static long getTotalFluidStorage(IGridNode node) {
                         total += cell.getBytes(null);
                     }
                 } else if (APAddons.aeAdditionsLoaded && stack.getItem() instanceof SuperStorageCell superStorageCell) {
-                    total += superStorageCell.getKiloBytes() * 1024;
+                    total += superStorageCell.getKiloBytes() * 1024L;
                 } else if (APAddons.aeAdditionsLoaded && (stack.getItem() instanceof StorageCell storageCell)) {
                     if (storageCell.getKeyType() != AEKeyType.fluids())
                         continue;
@@ -397,21 +696,34 @@ public static long getTotalFluidStorage(IGridNode node) {
             }
         }
 
-        iterator = node.getGrid().getMachineNodes(StorageBusPart.class).iterator();
+        return total;
+    }
 
-        while (iterator.hasNext()) {
-            StorageBusPart bus = (StorageBusPart) iterator.next().getService(IStorageProvider.class);
-            net.minecraft.world.level.Level level = bus.getLevel();
-            BlockPos connectedInventoryPos = bus.getHost().getBlockEntity().getBlockPos().relative(bus.getSide());
-            BlockEntity connectedInventoryEntity = level.getBlockEntity(connectedInventoryPos);
+    public static long getTotalChemicalStorage(IGridNode node) {
+        long total = 0;
+
+        if (!APAddons.appMekLoaded)
+            return 0;
             if (connectedInventoryEntity == null)
                 continue;
 
-            LazyOptional fluidHandler = connectedInventoryEntity.getCapability(ForgeCapabilities.FLUID_HANDLER);
-            if (fluidHandler.isPresent()) {
-                IFluidHandler handler = fluidHandler.orElse(null);
-                for (int i = 0; i < handler.getTanks(); i++) {
-                    total += handler.getTankCapacity(i);
+        for (IGridNode iGridNode : node.getGrid().getMachineNodes(DriveBlockEntity.class)) {
+            DriveBlockEntity entity = (DriveBlockEntity) iGridNode.getService(IStorageProvider.class);
+            if (entity == null)
+                continue;
+
+            InternalInventory inventory = entity.getInternalInventory();
+
+            for (int i = 0; i < inventory.size(); i++) {
+                ItemStack stack = inventory.getStackInSlot(i);
+
+                if (stack.isEmpty())
+                    continue;
+
+                if (stack.getItem() instanceof ChemicalStorageCell cell) {
+                    if (cell.getKeyType() instanceof MekanismKeyType) {
+                        total += cell.getBytes(null);
+                    }
                 }
             }
         }
@@ -419,6 +731,8 @@ public static long getTotalFluidStorage(IGridNode node) {
         return total;
     }
 
+    /// Used
+
     public static long getUsedItemStorage(IGridNode node) {
         long used = 0;
 
@@ -437,15 +751,10 @@ public static long getUsedItemStorage(IGridNode node) {
                     continue;
 
                 if (stack.getItem() instanceof IBasicCellItem cell) {
-                    int bytesPerType = cell.getBytesPerType(null);
-
                     if (cell.getKeyType().getClass().isAssignableFrom(AEKeyType.items().getClass())) {
-                        if (stack.getTag() == null)
-                            continue;
-                        int numOfType = stack.getTag().getLongArray("amts").length;
-                        long numItemsInCell = stack.getTag().getLong("ic");
+                        BasicCellInventory cellInventory = BasicCellHandler.INSTANCE.getCellInventory(stack, null);
 
-                        used += ((int) Math.ceil(((double) numItemsInCell) / 8)) + ((long) bytesPerType * numOfType);
+                        used += cellInventory.getUsedBytes();
                     }
                 } else if (APAddons.aeThingsLoaded && stack.getItem() instanceof DISKDrive disk) {
                     if (disk.getKeyType().toString().equals("ae2:i")) {
@@ -472,19 +781,6 @@ public static long getUsedItemStorage(IGridNode node) {
             }
         }
 
-        iterator = node.getGrid().getMachineNodes(StorageBusPart.class).iterator();
-
-        while (iterator.hasNext()) {
-            StorageBusPart bus = (StorageBusPart) iterator.next().getService(IStorageProvider.class);
-            KeyCounter keyCounter = bus.getInternalHandler().getAvailableStacks();
-
-            for (Object2LongMap.Entry aeKey : keyCounter) {
-                if (aeKey.getKey() instanceof AEItemKey) {
-                    used += aeKey.getLongValue();
-                }
-            }
-        }
-
         return used;
     }
 
@@ -503,15 +799,10 @@ public static long getUsedFluidStorage(IGridNode node) {
                 ItemStack stack = inventory.getStackInSlot(i);
 
                 if (stack.getItem() instanceof IBasicCellItem cell) {
-                    int bytesPerType = cell.getBytesPerType(null);
-
                     if (cell.getKeyType().getClass().isAssignableFrom(AEKeyType.fluids().getClass())) {
-                        if (stack.getTag() == null)
-                            continue;
-                        int numOfType = stack.getTag().getLongArray("amts").length;
-                        long numBucketsInCell = stack.getTag().getLong("ic") / 1000;
+                        BasicCellInventory cellInventory = BasicCellHandler.INSTANCE.getCellInventory(stack, null);
 
-                        used += ((int) Math.ceil(((double) numBucketsInCell) / 8)) + ((long) bytesPerType * numOfType);
+                        used += cellInventory.getUsedBytes();
                     }
                 } else if (APAddons.aeAdditionsLoaded && stack.getItem() instanceof SuperStorageCell) {
                     if (stack.getTag() == null)
@@ -531,15 +822,29 @@ public static long getUsedFluidStorage(IGridNode node) {
             }
         }
 
-        iterator = node.getGrid().getMachineNodes(StorageBusPart.class).iterator();
+        return used;
+    }
 
-        while (iterator.hasNext()) {
-            StorageBusPart bus = (StorageBusPart) iterator.next().getService(IStorageProvider.class);
-            KeyCounter keyCounter = bus.getInternalHandler().getAvailableStacks();
+    public static long getUsedChemicalStorage(IGridNode node) {
+        long used = 0;
 
-            for (Object2LongMap.Entry aeKey : keyCounter) {
-                if (aeKey.getKey() instanceof AEFluidKey fluidKey) {
-                    used += aeKey.getLongValue();
+        if (!APAddons.appMekLoaded)
+            return 0;
+
+        for (IGridNode iGridNode : node.getGrid().getMachineNodes(DriveBlockEntity.class)) {
+            DriveBlockEntity entity = (DriveBlockEntity) iGridNode.getService(IStorageProvider.class);
+            if (entity == null)
+                continue;
+
+            InternalInventory inventory = entity.getInternalInventory();
+
+            for (int i = 0; i < inventory.size(); i++) {
+                ItemStack stack = inventory.getStackInSlot(i);
+
+                if (stack.getItem() instanceof ChemicalStorageCell) {
+                    BasicCellInventory cellInventory = BasicCellHandler.INSTANCE.getCellInventory(stack, null);
+
+                    used = cellInventory.getUsedBytes() / MekanismKeyType.TYPE.getAmountPerByte();
                 }
             }
         }
@@ -547,14 +852,77 @@ public static long getUsedFluidStorage(IGridNode node) {
         return used;
     }
 
+    /// Available Storage
+
+    /**
+     * Calculates the available item storage on a given grid node.
+     * It subtracts the used item storage from the total item storage.
+     *
+     * @param node The grid node to calculate the available item storage for.
+     * @return The available item storage in bytes.
+     */
     public static long getAvailableItemStorage(IGridNode node) {
         return getTotalItemStorage(node) - getUsedItemStorage(node);
     }
 
+    /**
+     * Calculates the available fluid storage in a given grid node.
+     *
+     * @param node The grid node to calculate the available fluid storage for.
+     * @return The available fluid storage in bytes.
+     */
     public static long getAvailableFluidStorage(IGridNode node) {
         return getTotalFluidStorage(node) - getUsedFluidStorage(node);
     }
 
+    public static long getAvailableChemicalStorage(IGridNode node) {
+        return getTotalChemicalStorage(node) - getUsedChemicalStorage(node);
+    }
+
+    /**
+     * Calculates the available external item storage of a given grid node.
+     *
+     * @param node The grid node for which to calculate the available external item storage.
+     * @return The available external item storage.
+     */
+    public static long getAvailableExternalItemStorage(IGridNode node) {
+        return getTotalExternalItemStorage(node) - getUsedExternalItemStorage(node);
+    }
+
+    /**
+     * Calculates the available external fluid storage on a given grid node by subtracting the used external fluid storage
+     * from the total external fluid storage.
+     *
+     * @param node The grid node on which to calculate the available external fluid storage.
+     * @return The available external fluid storage on the grid node.
+     */
+    public static long getAvailableExternalFluidStorage(IGridNode node) {
+        return getTotalExternalFluidStorage(node) - getUsedExternalFluidStorage(node);
+    }
+
+    public static long getAvailableExternalChemicalStorage(IGridNode node) {
+        return getTotalExternalChemicalStorage(node) - getUsedExternalChemicalStorage(node);
+    }
+
+    public static ICraftingCPU getCraftingCPU(IGridNode node, String cpuName) {
+        if (cpuName.isEmpty()) return null;
+        ICraftingService grid = node.getGrid().getService(ICraftingService.class);
+        if (grid == null) return null;
+
+        Iterator iterator = grid.getCpus().iterator();
+        if (!iterator.hasNext()) return null;
+
+        while (iterator.hasNext()) {
+            ICraftingCPU cpu = iterator.next();
+
+            if (cpu.getName() != null && cpu.getName().getString().equals(cpuName)) {
+                return cpu;
+            }
+        }
+
+        return null;
+    }
+
     public static List listCells(IGridNode node) {
         List items = new ArrayList<>();
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java
index 1b2d5d9a9..05db7c7c6 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java
@@ -52,7 +52,6 @@ protected void fireEvent(boolean success, @Nullable String exception) {
         this.result = MethodResult.of(success, exception);
         this.exception = new LuaException(exception);
         this.computer.queueEvent(EVENT, success, exception);
-
     }
 
     protected void fireNotConnected() {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeBridgeEntityListener.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeBridgeEntityListener.java
index 1aee16c85..10cc242fb 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeBridgeEntityListener.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeBridgeEntityListener.java
@@ -4,18 +4,17 @@
 import appeng.api.networking.IGridNodeListener;
 import de.srendi.advancedperipherals.common.blocks.blockentities.MeBridgeEntity;
 
-//TODO: Maybe do something special with these methods?
 public class MeBridgeEntityListener implements IGridNodeListener {
 
     public static final MeBridgeEntityListener INSTANCE = new MeBridgeEntityListener();
 
     @Override
     public void onSecurityBreak(MeBridgeEntity nodeOwner, IGridNode node) {
-
+        // Maybe do something special with these methods?
     }
 
     @Override
     public void onSaveChanges(MeBridgeEntity nodeOwner, IGridNode node) {
-
+        // Maybe do something special with these methods?
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java
index 8072a777d..6f10b6be9 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java
@@ -12,6 +12,7 @@
 
 /**
  * Used to transfer item between an inventory and the ME system.
+ *
  * @see de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MeBridgePeripheral
  */
 public class MeFluidHandler implements IStorageSystemFluidHandler {
@@ -28,7 +29,7 @@ public MeFluidHandler(@NotNull MEStorage storageMonitor, @NotNull IActionSource
 
     @Override
     public int fill(FluidStack resource, FluidAction action) {
-        if(resource.isEmpty())
+        if (resource.isEmpty())
             return 0;
         AEFluidKey itemKey = AEFluidKey.of(resource.getFluid());
         long inserted = storageMonitor.insert(itemKey, resource.getAmount(), action == FluidAction.SIMULATE ? Actionable.SIMULATE : Actionable.MODULATE, actionSource);
@@ -40,7 +41,7 @@ public int fill(FluidStack resource, FluidAction action) {
     @Override
     public FluidStack drain(FluidFilter filter, FluidAction simulate) {
         Pair itemKey = AppEngApi.findAEFluidFromFilter(storageMonitor, null, filter);
-        if(itemKey == null)
+        if (itemKey == null)
             return FluidStack.EMPTY;
         long extracted = storageMonitor.extract(itemKey.getRight(), filter.getCount(), simulate == FluidAction.SIMULATE ? Actionable.SIMULATE : Actionable.MODULATE, actionSource);
         return new FluidStack(itemKey.getRight().getFluid(), (int) Math.min(extracted, Integer.MAX_VALUE));
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaFlowerIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaFlowerIntegration.java
index a4eb92215..fd45750e4 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaFlowerIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaFlowerIntegration.java
@@ -16,7 +16,7 @@ public ManaFlowerIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "manaFlower";
+        return "mana_flower";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaPoolIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaPoolIntegration.java
index cea44bbe9..2d2fb83c9 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaPoolIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/ManaPoolIntegration.java
@@ -15,7 +15,7 @@ public ManaPoolIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "manaPool";
+        return "mana_pool";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/SpreaderIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/SpreaderIntegration.java
index e0ea451f9..d615db44f 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/botania/SpreaderIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/botania/SpreaderIntegration.java
@@ -16,7 +16,7 @@ public SpreaderIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "manaSpreader";
+        return "mana_spreader";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/BeaconIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/BeaconIntegration.java
index 09e655726..0a35755df 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/BeaconIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/BeaconIntegration.java
@@ -2,7 +2,6 @@
 
 import dan200.computercraft.api.lua.LuaFunction;
 import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral;
-import net.minecraft.nbt.CompoundTag;
 import net.minecraft.world.level.block.entity.BeaconBlockEntity;
 import net.minecraft.world.level.block.entity.BlockEntity;
 import org.jetbrains.annotations.NotNull;
@@ -20,9 +19,7 @@ public BeaconIntegration(BlockEntity entity) {
 
     @LuaFunction(mainThread = true)
     public final int getLevel() {
-        // because levels are now protected field .... why?
-        CompoundTag savedData = blockEntity.saveWithoutMetadata();
-        return savedData.getInt("Levels");
+        return blockEntity.levels;
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java
index f5c2fef95..2d9ccb553 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java
@@ -23,7 +23,7 @@
 
 public class IntegrationPeripheralProvider implements IPeripheralProvider {
 
-    private static final String[] SUPPORTED_MODS = new String[]{"botania", "create", "mekanism", "powah"};
+    private static final String[] SUPPORTED_MODS = new String[]{"botania", "create", "mekanism", "powah", "dimstorage"};
 
     private static final PriorityQueue integrations = new PriorityQueue<>(Comparator.comparingInt(IPeripheralIntegration::getPriority));
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java
index eea8c4c71..333eb905f 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java
@@ -5,7 +5,7 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 public enum SingleOperation implements IPeripheralOperation {
     DIG(1000, 1),
@@ -80,9 +80,9 @@ public enum DistancePolicy {
         LINEAR(d -> d),
         SQRT(d -> (int) Math.sqrt(d));
 
-        private final Function factorFunction;
+        private final UnaryOperator factorFunction;
 
-        DistancePolicy(Function factorFunction) {
+        DistancePolicy(UnaryOperator factorFunction) {
             this.factorFunction = factorFunction;
         }
 
@@ -95,9 +95,9 @@ public enum CountPolicy {
         IGNORED(c -> 1),
         MULTIPLY(c -> c);
 
-        private final Function factorFunction;
+        private final UnaryOperator factorFunction;
 
-        CountPolicy(Function factorFunction) {
+        CountPolicy(UnaryOperator factorFunction) {
             this.factorFunction = factorFunction;
         }
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BasePeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BasePeripheralOwner.java
index c23b0d025..5503c3bdf 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BasePeripheralOwner.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BasePeripheralOwner.java
@@ -9,7 +9,7 @@
 public abstract class BasePeripheralOwner implements IPeripheralOwner {
     private final Map, IOwnerAbility> abilities;
 
-    public BasePeripheralOwner() {
+    protected BasePeripheralOwner() {
         abilities = new HashMap<>();
     }
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java
index 2ea0bd6a3..a909d1eda 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java
@@ -14,8 +14,8 @@
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.Level;
-import net.minecraft.world.level.block.JigsawBlock;
 import net.minecraft.world.level.block.entity.BlockEntity;
+import org.apache.commons.lang3.NotImplementedException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -61,7 +61,7 @@ public BlockPos getPos() {
     @NotNull
     @Override
     public Direction getFacing() {
-        return tileEntity.getBlockState().getValue(JigsawBlock.ORIENTATION).front();
+        return getOrientation().front();
     }
 
     @NotNull
@@ -91,7 +91,7 @@ public void markDataStorageDirty() {
 
     @Override
     public  T1 withPlayer(Function function) {
-        throw new RuntimeException("Not implemented yet");
+        throw new NotImplementedException();
     }
 
     @Override
@@ -102,7 +102,7 @@ public ItemStack getToolInMainHand() {
     @Override
     public ItemStack storeItem(ItemStack stored) {
         // TODO: tricks with capability needed
-        throw new RuntimeException("Not implemented yet");
+        throw new NotImplementedException();
     }
 
     @Override
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/FuelAbility.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/FuelAbility.java
index 07245d648..80ecdefb0 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/FuelAbility.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/FuelAbility.java
@@ -14,7 +14,7 @@ public abstract class FuelAbility implements IOwnerA
 
     protected @NotNull T owner;
 
-    public FuelAbility(@NotNull T owner) {
+    protected FuelAbility(@NotNull T owner) {
         this.owner = owner;
     }
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PeripheralOwnerAbility.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PeripheralOwnerAbility.java
index 4f5627f5e..fefa8a5be 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PeripheralOwnerAbility.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PeripheralOwnerAbility.java
@@ -5,6 +5,6 @@ public class PeripheralOwnerAbility {
     public static final PeripheralOwnerAbility> FUEL = new PeripheralOwnerAbility<>();
     public static final PeripheralOwnerAbility OPERATION = new PeripheralOwnerAbility<>();
 
-    public PeripheralOwnerAbility() {
+    private PeripheralOwnerAbility() {
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java
index 5cd8e588c..ee9153f06 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java
@@ -12,6 +12,7 @@
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.Level;
+import org.apache.commons.lang3.NotImplementedException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -88,7 +89,7 @@ public void markDataStorageDirty() {
 
     @Override
     public  T withPlayer(Function function) {
-        throw new RuntimeException("Not implemented yet");
+        throw new NotImplementedException();
     }
 
     @Override
@@ -98,13 +99,12 @@ public ItemStack getToolInMainHand() {
 
     @Override
     public ItemStack storeItem(ItemStack stored) {
-        // Tricks with inventory needed
-        throw new RuntimeException("Not implemented yet");
+        throw new NotImplementedException();
     }
 
     @Override
     public void destroyUpgrade() {
-        throw new RuntimeException("Not implemented yet");
+        throw new NotImplementedException();
     }
 
     @Override
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BlockReaderPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BlockReaderPeripheral.java
index 086fa4fe9..ce78b5077 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BlockReaderPeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BlockReaderPeripheral.java
@@ -18,7 +18,7 @@
 
 public class BlockReaderPeripheral extends BasePeripheral> {
 
-    public static final String PERIPHERAL_TYPE = "blockReader";
+    public static final String PERIPHERAL_TYPE = "block_reader";
 
     public BlockReaderPeripheral(BlockReaderEntity tileEntity) {
         super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity));
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java
index 66d50e78f..629a65901 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java
@@ -49,7 +49,7 @@
 
 public class ChatBoxPeripheral extends BasePeripheral {
 
-    public static final String PERIPHERAL_TYPE = "chatBox";
+    public static final String PERIPHERAL_TYPE = "chat_box";
 
     private long lastConsumedMessage;
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java
index 5a689c538..ae97a5c6b 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java
@@ -37,7 +37,7 @@
 
 public class ColonyPeripheral extends BasePeripheral {
 
-    public static final String PERIPHERAL_TYPE = "colonyIntegrator";
+    public static final String PERIPHERAL_TYPE = "colony_integrator";
 
     protected boolean hasPermission = true;
 
@@ -272,7 +272,7 @@ public final Object getRequests() throws LuaException {
             map.put("state", request.getState().toString());
             map.put("count", deliverableRequest.getCount());
             map.put("minCount", deliverableRequest.getMinimumCount());
-            map.put("items", request.getDisplayStacks().stream().map(LuaConverter::stackToObject).collect(Collectors.toList()));
+            map.put("items", request.getDisplayStacks().stream().map(LuaConverter::itemStackToObject).collect(Collectors.toList()));
             map.put("target", request.getRequester().getRequesterDisplayName(requestManager, request).getString());
             result.add(map);
         });
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java
new file mode 100644
index 000000000..af1045e4c
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java
@@ -0,0 +1,103 @@
+package de.srendi.advancedperipherals.common.addons.computercraft.peripheral;
+
+import dan200.computercraft.api.lua.LuaFunction;
+import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner;
+import de.srendi.advancedperipherals.common.blocks.blockentities.DistanceDetectorEntity;
+import de.srendi.advancedperipherals.common.configuration.APConfig;
+import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral;
+
+public class DistanceDetectorPeripheral extends BasePeripheral> {
+
+    public static final String PERIPHERAL_TYPE = "distance_detector";
+
+    public DistanceDetectorPeripheral(DistanceDetectorEntity tileEntity) {
+        super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity));
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return APConfig.PERIPHERALS_CONFIG.enableDistanceDetector.get();
+    }
+
+    @LuaFunction
+    public final void setLaserVisibility(boolean laser) {
+        getPeripheralOwner().tileEntity.setShowLaser(laser);
+    }
+
+    @LuaFunction
+    public final boolean getLaserVisibility() {
+        return getPeripheralOwner().tileEntity.getLaserVisibility();
+    }
+
+    @LuaFunction
+    public final void setIgnoreTransparency(boolean enable) {
+        getPeripheralOwner().tileEntity.setIgnoreTransparent(enable);
+    }
+
+    @LuaFunction
+    public final boolean ignoresTransparency() {
+        return getPeripheralOwner().tileEntity.ignoreTransparent();
+    }
+
+    @LuaFunction
+    public final void setDetectionMode(int mode) {
+        if (mode > 2) mode = 2;
+        if (mode < 0) mode = 0;
+        getPeripheralOwner().tileEntity.setDetectionType(DetectionType.values()[mode]);
+    }
+
+    @LuaFunction
+    public final boolean detectsEntities() {
+        DetectionType detectionType = getPeripheralOwner().tileEntity.getDetectionType();
+        return detectionType == DetectionType.ENTITIES || detectionType == DetectionType.BOTH;
+    }
+
+    @LuaFunction
+    public final boolean detectsBlocks() {
+        DetectionType detectionType = getPeripheralOwner().tileEntity.getDetectionType();
+        return detectionType == DetectionType.BLOCK || detectionType == DetectionType.BOTH;
+    }
+
+    @LuaFunction
+    public final String getDetectionMode() {
+        DetectionType detectionType = getPeripheralOwner().tileEntity.getDetectionType();
+        return detectionType.toString();
+    }
+
+    @LuaFunction
+    public final double getDistance() {
+        return getPeripheralOwner().tileEntity.getCurrentDistance() - 1;
+    }
+
+    @LuaFunction
+    public final double calculateDistance() {
+        return getPeripheralOwner().tileEntity.calculateDistance() - 1;
+    }
+
+    @LuaFunction
+    public final boolean shouldCalculatePeriodically() {
+        return getPeripheralOwner().tileEntity.shouldCalculatePeriodically();
+    }
+
+    @LuaFunction
+    public final void setCalculatePeriodically(boolean shouldRenderPeriodically) {
+        getPeripheralOwner().tileEntity.setShouldCalculatePeriodically(shouldRenderPeriodically);
+    }
+
+    @LuaFunction
+    public final void setMaxRange(double maxDistance) {
+        getPeripheralOwner().tileEntity.setMaxRange(Math.max(0, Math.min(APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get(), maxDistance)));
+    }
+
+    @LuaFunction
+    public final double getMaxRange() {
+        return getPeripheralOwner().tileEntity.getMaxDistance();
+    }
+
+    public enum DetectionType {
+        BLOCK,
+        ENTITIES,
+        BOTH
+    }
+
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnergyDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnergyDetectorPeripheral.java
index 8b0e016f2..0898fb611 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnergyDetectorPeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnergyDetectorPeripheral.java
@@ -8,7 +8,7 @@
 
 public class EnergyDetectorPeripheral extends BasePeripheral> {
 
-    public static final String PERIPHERAL_TYPE = "energyDetector";
+    public static final String PERIPHERAL_TYPE = "energy_detector";
 
     public EnergyDetectorPeripheral(EnergyDetectorEntity tileEntity) {
         super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity));
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java
index a3235a419..0d8d07078 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java
@@ -35,7 +35,6 @@
 import net.minecraftforge.event.entity.player.SleepingTimeCheckEvent;
 import net.minecraftforge.eventbus.api.Event;
 import net.minecraftforge.server.ServerLifecycleHooks;
-
 import org.jetbrains.annotations.NotNull;
 
 import java.util.*;
@@ -45,7 +44,7 @@
 
 public class EnvironmentDetectorPeripheral extends BasePeripheral {
 
-    public static final String PERIPHERAL_TYPE = "environmentDetector";
+    public static final String PERIPHERAL_TYPE = "environment_detector";
     private static final List> PERIPHERAL_PLUGINS = new LinkedList<>();
 
     protected EnvironmentDetectorPeripheral(IPeripheralOwner owner) {
@@ -172,13 +171,10 @@ private Map getCurrentMoonPhase() {
                 case 5 -> moon.put(5, "Waxing crescent");
                 case 6 -> moon.put(6, "First quarter");
                 case 7 -> moon.put(7, "Waxing gibbous");
-                default ->
-                    //should never happen
-                    moon.put(0, "What is a moon");
+                default -> moon.put(0, "What is a moon");
             }
         } else {
-            //Yay, easter egg
-            //Returns when the function is not used in the overworld
+            // aren't we in the overworld?
             moon.put(0, "Moon.exe not found...");
         }
         return moon;
@@ -231,10 +227,10 @@ public final MethodResult canSleepHere() {
     @LuaFunction(mainThread = true)
     public final MethodResult canSleepPlayer(String playername) {
         Player player = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayerByName(playername);
-        if(player == null)
+        if (player == null)
             return MethodResult.of(false, "player_not_online");
 
-        if(!player.level.dimensionType().bedWorks())
+        if (!player.level.dimensionType().bedWorks())
             return MethodResult.of(false, "not_allowed_in_dimension");
 
         SleepingTimeCheckEvent evt = new SleepingTimeCheckEvent(player, Optional.empty());
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/FluidDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/FluidDetectorPeripheral.java
new file mode 100644
index 000000000..c54dde612
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/FluidDetectorPeripheral.java
@@ -0,0 +1,43 @@
+package de.srendi.advancedperipherals.common.addons.computercraft.peripheral;
+
+import dan200.computercraft.api.lua.LuaFunction;
+import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner;
+import de.srendi.advancedperipherals.common.blocks.blockentities.FluidDetectorEntity;
+import de.srendi.advancedperipherals.common.configuration.APConfig;
+import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral;
+import net.minecraftforge.registries.ForgeRegistries;
+
+public class FluidDetectorPeripheral extends BasePeripheral> {
+
+    public static final String TYPE = "fluid_detector";
+
+    public FluidDetectorPeripheral(FluidDetectorEntity tileEntity) {
+        super(TYPE, new BlockEntityPeripheralOwner<>(tileEntity));
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return APConfig.PERIPHERALS_CONFIG.enableFluidDetector.get();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final int getTransferRateLimit() {
+        return owner.tileEntity.storageProxy.getMaxTransferRate();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final String getTransferedFluid() {
+        return ForgeRegistries.FLUIDS.getKey(owner.tileEntity.lastFlowedLiquid.getFluid()).toString();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final void setTransferRateLimit(long transferRate) {
+        transferRate = Math.min(APConfig.PERIPHERALS_CONFIG.fluidDetectorMaxFlow.get(), transferRate);
+        owner.tileEntity.storageProxy.setMaxTransferRate((int) transferRate);
+    }
+
+    @LuaFunction(mainThread = true)
+    public final int getTransferRate() {
+        return owner.tileEntity.transferRate;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GasDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GasDetectorPeripheral.java
new file mode 100644
index 000000000..fd94811e3
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GasDetectorPeripheral.java
@@ -0,0 +1,42 @@
+package de.srendi.advancedperipherals.common.addons.computercraft.peripheral;
+
+import dan200.computercraft.api.lua.LuaFunction;
+import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner;
+import de.srendi.advancedperipherals.common.blocks.blockentities.GasDetectorEntity;
+import de.srendi.advancedperipherals.common.configuration.APConfig;
+import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral;
+
+public class GasDetectorPeripheral extends BasePeripheral> {
+
+    public static final String TYPE = "gas_detector";
+
+    public GasDetectorPeripheral(GasDetectorEntity tileEntity) {
+        super(TYPE, new BlockEntityPeripheralOwner<>(tileEntity));
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return APConfig.PERIPHERALS_CONFIG.enableGasDetector.get();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final int getTransferRateLimit() {
+        return owner.tileEntity.storageProxy.getMaxTransferRate();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final String getTransferedGas() {
+        return owner.tileEntity.lastFlowedGas.getRaw().getRegistryName().toString();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final void setTransferRateLimit(long transferRate) {
+        transferRate = Math.min(APConfig.PERIPHERALS_CONFIG.gasDetectorMaxFlow.get(), transferRate);
+        owner.tileEntity.storageProxy.setMaxTransferRate((int) transferRate);
+    }
+
+    @LuaFunction(mainThread = true)
+    public final int getTransferRate() {
+        return owner.tileEntity.transferRate;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java
index 438815585..c94496149 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java
@@ -41,7 +41,7 @@ public class GeoScannerPeripheral extends BasePeripheral {
     Highly inspired by https://github.com/SquidDev-CC/plethora/ BlockScanner
     */
 
-    public static final String PERIPHERAL_TYPE = "geoScanner";
+    public static final String PERIPHERAL_TYPE = "geo_scanner";
 
     protected GeoScannerPeripheral(IPeripheralOwner owner) {
         super(PERIPHERAL_TYPE, owner);
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java
index 66abb49fb..6f93e56cf 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java
@@ -23,15 +23,15 @@
 import net.minecraftforge.items.wrapper.PlayerArmorInvWrapper;
 import net.minecraftforge.items.wrapper.PlayerInvWrapper;
 import net.minecraftforge.items.wrapper.PlayerOffhandInvWrapper;
-import org.jetbrains.annotations.NotNull;
 
+import org.jetbrains.annotations.NotNull;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
 public class InventoryManagerPeripheral extends BasePeripheral> {
 
-    public static final String PERIPHERAL_TYPE = "inventoryManager";
+    public static final String PERIPHERAL_TYPE = "inventory_manager";
 
     public InventoryManagerPeripheral(InventoryManagerEntity tileEntity) {
         super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity));
@@ -187,14 +187,19 @@ public final int getFreeSlot() throws LuaException {
         return getOwnerPlayer().getInventory().getFreeSlot();
     }
 
+    @LuaFunction(mainThread = true)
+    public final int getHandSlot() throws LuaException {
+        return getOwnerPlayer().getInventory().selected;
+    }
+
     @LuaFunction(mainThread = true)
     public final Map getItemInHand() throws LuaException {
-        return LuaConverter.stackToObject(getOwnerPlayer().getMainHandItem());
+        return LuaConverter.itemStackToObject(getOwnerPlayer().getMainHandItem(), getOwnerPlayer().getInventory().selected);
     }
 
     @LuaFunction(mainThread = true)
     public final Map getItemInOffHand() throws LuaException {
-        return LuaConverter.stackToObject(getOwnerPlayer().getOffhandItem());
+        return LuaConverter.itemStackToObject(getOwnerPlayer().getOffhandItem());
     }
 
     private Player getOwnerPlayer() throws LuaException {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java
index 731e451f4..7eb22d097 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java
@@ -1,5 +1,6 @@
 package de.srendi.advancedperipherals.common.addons.computercraft.peripheral;
 
+import appeng.api.crafting.IPatternDetails;
 import appeng.api.networking.IGridNode;
 import appeng.api.networking.IManagedGridNode;
 import appeng.api.networking.crafting.ICraftingCPU;
@@ -7,11 +8,14 @@
 import appeng.api.stacks.AEFluidKey;
 import appeng.api.stacks.AEItemKey;
 import appeng.api.storage.MEStorage;
+import appeng.me.cluster.implementations.CraftingCPUCluster;
 import dan200.computercraft.api.lua.IArguments;
 import dan200.computercraft.api.lua.LuaException;
 import dan200.computercraft.api.lua.LuaFunction;
 import dan200.computercraft.api.lua.MethodResult;
 import dan200.computercraft.api.peripheral.IComputerAccess;
+import dan200.computercraft.core.apis.TableHelper;
+import dan200.computercraft.core.computer.ComputerSide;
 import de.srendi.advancedperipherals.common.addons.appliedenergistics.AppEngApi;
 import de.srendi.advancedperipherals.common.addons.appliedenergistics.CraftJob;
 import de.srendi.advancedperipherals.common.addons.appliedenergistics.MeFluidHandler;
@@ -21,21 +25,17 @@
 import de.srendi.advancedperipherals.common.configuration.APConfig;
 import de.srendi.advancedperipherals.common.util.Pair;
 import de.srendi.advancedperipherals.common.util.ServerWorker;
-import de.srendi.advancedperipherals.common.util.inventory.FluidFilter;
-import de.srendi.advancedperipherals.common.util.inventory.FluidUtil;
-import de.srendi.advancedperipherals.common.util.inventory.InventoryUtil;
-import de.srendi.advancedperipherals.common.util.inventory.ItemFilter;
+import de.srendi.advancedperipherals.common.util.inventory.*;
 import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral;
+import net.minecraft.core.Direction;
 import net.minecraftforge.fluids.capability.IFluidHandler;
 import net.minecraftforge.items.IItemHandler;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
-public class MeBridgePeripheral extends BasePeripheral> {
+public class MeBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral {
 
     public static final String PERIPHERAL_TYPE = "meBridge";
     private final MeBridgeEntity tile;
@@ -148,408 +148,637 @@ private MethodResult notConnected() {
         return MethodResult.of(null, "NOT_CONNECTED");
     }
 
+    private boolean isAvailable() {
+        return node.getGrid() != null && node.hasGridBooted();
+    }
+
+    @Override
     @LuaFunction(mainThread = true)
-    public final boolean isConnected() {
-        return node.getGrid() != null && node.hasGridBooted() && node.isActive();
+    public final MethodResult isConnected() {
+        return MethodResult.of(isAvailable());
     }
 
-    @LuaFunction
-    public final MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException {
-        if (!isConnected())
+    @Override
+    @LuaFunction(mainThread = true)
+    public MethodResult isOnline() {
+        return MethodResult.of(node.isOnline());
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getItem(IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
+        MEStorage monitor = AppEngApi.getMonitor(node);
         Pair filter = ItemFilter.parse(arguments.getTable(0));
         if (filter.rightPresent())
-            return MethodResult.of(false, filter.getRight());
+            return MethodResult.of(null, filter.getRight());
 
         ItemFilter parsedFilter = filter.getLeft();
         if (parsedFilter.isEmpty())
-            return MethodResult.of(false, "EMPTY_FILTER");
-
-        String cpuName = arguments.optString(1, "");
-        ICraftingCPU target = getCraftingCPU(cpuName);
-        if (!cpuName.isEmpty() && target == null)
-            return MethodResult.of(false, "CPU " + cpuName + " does not exists");
-
-        ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class);
-        Pair stack = AppEngApi.findAEStackFromFilter(AppEngApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft());
-        if (stack.getRight() == null && stack.getLeft() == 0)
-            return MethodResult.of(null, "NOT_CRAFTABLE");
+            return MethodResult.of(null, "EMPTY_FILTER");
 
-        CraftJob job = new CraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), tile, tile, target);
-        tile.addJob(job);
-        ServerWorker.add(job::startCrafting);
-        return MethodResult.of(true);
+        return MethodResult.of(AppEngApi.getObjectFromStack(AppEngApi.findAEStackFromFilter(monitor, getCraftingService(), parsedFilter), getCraftingService()));
     }
 
-    @LuaFunction
-    public final MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException {
-        if (!isConnected())
+    @Override
+    @LuaFunction(mainThread = true)
+    public MethodResult getFluid(IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
         Pair filter = FluidFilter.parse(arguments.getTable(0));
         if (filter.rightPresent())
-            return MethodResult.of(false, filter.getRight());
+            return MethodResult.of(null, filter.getRight());
 
         FluidFilter parsedFilter = filter.getLeft();
         if (parsedFilter.isEmpty())
-            return MethodResult.of(false, "EMPTY_FILTER");
+            return MethodResult.of(null, "EMPTY_FILTER");
 
-        String cpuName = arguments.optString(1, "");
-        ICraftingCPU target = getCraftingCPU(cpuName);
-        if (!cpuName.isEmpty() && target == null)
-            return MethodResult.of(false, "CPU " + cpuName + " does not exists");
+        return MethodResult.of(AppEngApi.findAEFluidFromFilter(AppEngApi.getMonitor(node), getCraftingService(), parsedFilter));
+    }
 
-        ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class);
-        Pair stack = AppEngApi.findAEFluidFromFilter(AppEngApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft());
-        if (stack.getRight() == null && stack.getLeft() == 0)
-            return MethodResult.of(null, "NOT_CRAFTABLE");
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult listItems() {
+        if (!isAvailable())
+            return notConnected();
 
-        CraftJob job = new CraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), tile, tile, target);
-        tile.addJob(job);
-        ServerWorker.add(job::startCrafting);
-        return MethodResult.of(true);
+        return MethodResult.of(AppEngApi.listStacks(AppEngApi.getMonitor(node), getCraftingService()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getEnergyUsage() {
-        if (!isConnected())
+    public final MethodResult listFluids() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(node.getGrid().getEnergyService().getAvgPowerUsage());
+        return MethodResult.of(AppEngApi.listFluids(AppEngApi.getMonitor(node), getCraftingService()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getEnergyStorage() {
-        if (!isConnected())
+    public final MethodResult listCraftableItems() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(node.getGrid().getEnergyService().getStoredPower());
+        return MethodResult.of(AppEngApi.listCraftableStacks(AppEngApi.getMonitor(node), getCraftingService()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getAvgPowerUsage() {
-        if (!isConnected())
+    public final MethodResult listCraftableFluids() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(node.getGrid().getEnergyService().getAvgPowerUsage());
+        return MethodResult.of(AppEngApi.listCraftableStacks(AppEngApi.getMonitor(node), getCraftingService()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getAvgPowerInjection() {
-        if (!isConnected())
+    public final MethodResult listCells() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(node.getGrid().getEnergyService().getAvgPowerInjection());
+        return MethodResult.of(AppEngApi.listCells(node));
     }
 
-
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getMaxEnergyStorage() {
-        if (!isConnected())
+    public MethodResult listDrives() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(node.getGrid().getEnergyService().getMaxStoredPower());
+        return MethodResult.of(AppEngApi.listDrives(node.getGrid()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult isItemCrafting(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult importItem(IComputerAccess computer, IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        MEStorage monitor = AppEngApi.getMonitor(node);
-        ICraftingService grid = node.getGrid().getService(ICraftingService.class);
-
-        Pair filter = ItemFilter.parse(arguments.getTable(0));
-        if (filter.rightPresent())
-            return MethodResult.of(false, filter.getRight());
+        String side = arguments.getString(1);
+        IItemHandler inventory;
 
-        ItemFilter parsedFilter = filter.getLeft();
-        if (parsedFilter.isEmpty())
-            return MethodResult.of(false, "EMPTY_FILTER");
-        String cpuName = arguments.optString(1, "");
-        ICraftingCPU craftingCPU = getCraftingCPU(cpuName);
+        if (Direction.byName(side.toUpperCase(Locale.ROOT)) == null && ComputerSide.valueOfInsensitive(side.toUpperCase(Locale.ROOT)) == null) {
+            inventory = InventoryUtil.getHandlerFromDirection(arguments.getString(1), owner);
+        } else {
+            inventory = InventoryUtil.getHandlerFromName(computer, arguments.getString(1));
+        }
 
-        return MethodResult.of(AppEngApi.isItemCrafting(monitor, grid, parsedFilter, craftingCPU));
+        return importToME(arguments, inventory);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult isItemCraftable(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult exportItem(IComputerAccess computer, @NotNull IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        Pair filter = ItemFilter.parse(arguments.getTable(0));
-        if (filter.rightPresent())
-            return MethodResult.of(false, filter.getRight());
+        String side = arguments.getString(1);
+        IItemHandler inventory;
 
-        ItemFilter parsedFilter = filter.getLeft();
-        if (parsedFilter.isEmpty())
-            return MethodResult.of(false, "EMPTY_FILTER");
-
-        AEItemKey item = AEItemKey.of(parsedFilter.toItemStack());
+        if (Direction.byName(side.toUpperCase(Locale.ROOT)) == null && ComputerSide.valueOfInsensitive(side.toUpperCase(Locale.ROOT)) == null) {
+            inventory = InventoryUtil.getHandlerFromDirection(arguments.getString(1), owner);
+        } else {
+            inventory = InventoryUtil.getHandlerFromName(computer, arguments.getString(1));
+        }
 
-        return MethodResult.of(getCraftingService().isCraftable(item));
+        return exportToChest(arguments, inventory);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult isFluidCrafting(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public MethodResult getFilteredPatterns(IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        MEStorage monitor = AppEngApi.getMonitor(node);
-        ICraftingService grid = node.getGrid().getService(ICraftingService.class);
+        // Expected input is a table with either an input table, an output table or both to filter for both
+        Map filterTable;
+        try {
+            Optional> optionalTable = arguments.optTable(0);
+            if (optionalTable.isEmpty())
+                return MethodResult.of(null, "EMPTY_INPUT");
+            filterTable = optionalTable.get();
+        } catch (LuaException e) {
+            return MethodResult.of(null, "NO_TABLE");
+        }
 
-        Pair filter = FluidFilter.parse(arguments.getTable(0));
-        if (filter.rightPresent())
-            return MethodResult.of(false, filter.getRight());
+        boolean hasInputFilter = filterTable.containsKey("input");
+        boolean hasOutputFilter = filterTable.containsKey("output");
+        boolean hasAnyFilter = hasInputFilter || hasOutputFilter;
 
-        FluidFilter parsedFilter = filter.getLeft();
-        if (parsedFilter.isEmpty())
-            return MethodResult.of(false, "EMPTY_FILTER");
-        String cpuName = arguments.optString(1, "");
-        ICraftingCPU craftingCPU = getCraftingCPU(cpuName);
+        // If the player tries to filter for nothing, return nothing.
+        if (!hasAnyFilter)
+            return MethodResult.of(null, "NO_FILTER");
 
-        return MethodResult.of(AppEngApi.isFluidCrafting(monitor, grid, parsedFilter, craftingCPU));
+        GenericFilter inputFilter = null;
+        GenericFilter outputFilter = null;
+
+        if (hasInputFilter) {
+            Map inputFilterTable = TableHelper.getTableField(filterTable, "input");
+
+            inputFilter = GenericFilter.parseGeneric(inputFilterTable).getLeft();
+        }
+        if (hasOutputFilter) {
+            Map outputFilterTable = TableHelper.getTableField(filterTable, "output");
+
+            outputFilter = GenericFilter.parseGeneric(outputFilterTable).getLeft();
+        }
+
+
+        Pair pattern = AppEngApi.findPatternFromFilters(node.getGrid(), getLevel(), inputFilter, outputFilter);
+
+        if (pattern.getRight() != null)
+            return MethodResult.of(null, pattern.getRight());
+
+        return MethodResult.of(AppEngApi.getObjectFromPattern(pattern.getLeft()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult isFluidCraftable(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public MethodResult getPatterns() {
+        if (!isAvailable())
             return notConnected();
 
-        Pair filter = FluidFilter.parse(arguments.getTable(0));
-        if (filter.rightPresent())
-            return MethodResult.of(false, filter.getRight());
-
-        FluidFilter parsedFilter = filter.getLeft();
-        if (parsedFilter.isEmpty())
-            return MethodResult.of(false, "EMPTY_FILTER");
+        return MethodResult.of(AppEngApi.listPatterns(node.getGrid(), getLevel()));
+    }
 
-        AEFluidKey fluid = AEFluidKey.of(parsedFilter.toFluidStack());
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getStoredEnergy() {
+        if (!isAvailable())
+            return notConnected();
 
-        return MethodResult.of(getCraftingService().isCraftable(fluid));
+        return MethodResult.of(node.getGrid().getEnergyService().getStoredPower());
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult exportFluid(@NotNull IArguments arguments) throws LuaException {
-        IFluidHandler handler = FluidUtil.getHandlerFromDirection(arguments.getString(1), owner);
-        return exportToTank(arguments, handler);
+    public final MethodResult getEnergyCapacity() {
+        if (!isAvailable())
+            return notConnected();
+
+        return MethodResult.of(node.getGrid().getEnergyService().getMaxStoredPower());
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult exportFluidToPeripheral(IComputerAccess computer, IArguments arguments) throws LuaException {
-        IFluidHandler handler = FluidUtil.getHandlerFromName(computer, arguments.getString(1));
+    public final MethodResult getEnergyUsage() {
+        if (!isAvailable())
+            return notConnected();
 
-        if (handler == null)
-            return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help.");
+        return MethodResult.of(node.getGrid().getEnergyService().getAvgPowerUsage());
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getAvgPowerInjection() {
+        if (!isAvailable())
+            return notConnected();
 
-        return exportToTank(arguments, handler);
+        return MethodResult.of(node.getGrid().getEnergyService().getAvgPowerInjection());
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult importFluid(IArguments arguments) throws LuaException {
-        IFluidHandler handler = FluidUtil.getHandlerFromDirection(arguments.getString(1), owner);
-        return importToME(arguments, handler);
+    public MethodResult getTotalExternItemStorage() {
+        if (!isAvailable())
+            return notConnected();
+
+        return MethodResult.of(AppEngApi.getTotalExternalItemStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult importFluidFromPeripheral(IComputerAccess computer, IArguments arguments) throws LuaException {
-        IFluidHandler handler = FluidUtil.getHandlerFromName(computer, arguments.getString(1));
+    public MethodResult getTotalExternFluidStorage() {
+        if (!isAvailable())
+            return notConnected();
 
-        if (handler == null)
-            return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help.");
+        return MethodResult.of(AppEngApi.getTotalExternalFluidStorage(node));
+    }
 
-        return importToME(arguments, handler);
+    @LuaFunction(mainThread = true)
+    public MethodResult getTotalExternChemicalStorage() {
+        if (!isAvailable())
+            return notConnected();
+
+        return MethodResult.of(AppEngApi.getTotalExternalChemicalStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult exportItem(@NotNull IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult getTotalItemStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        IItemHandler inventory = InventoryUtil.getHandlerFromDirection(arguments.getString(1), owner);
-        return exportToChest(arguments, inventory);
+        return MethodResult.of(AppEngApi.getTotalItemStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult exportItemToPeripheral(IComputerAccess computer, IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult getTotalFluidStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        IItemHandler inventory = InventoryUtil.getHandlerFromName(computer, arguments.getString(1));
+        return MethodResult.of(AppEngApi.getTotalFluidStorage(node));
+    }
 
-        if (inventory == null)
-            return MethodResult.of(0, "The target inventory does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help.");
+    @LuaFunction(mainThread = true)
+    public MethodResult getTotalChemicalStorage() {
+        if (!isAvailable())
+            return notConnected();
 
-        return exportToChest(arguments, inventory);
+        return MethodResult.of(AppEngApi.getTotalChemicalStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult importItem(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public MethodResult getUsedExternItemStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        IItemHandler inventory = InventoryUtil.getHandlerFromDirection(arguments.getString(1), owner);
-        return importToME(arguments, inventory);
+        return MethodResult.of(AppEngApi.getUsedExternalItemStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult importItemFromPeripheral(IComputerAccess computer, IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public MethodResult getUsedExternFluidStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        IItemHandler inventory = InventoryUtil.getHandlerFromName(computer, arguments.getString(1));
+        return MethodResult.of(AppEngApi.getUsedExternalFluidStorage(node));
+    }
 
-        if (inventory == null)
-            return MethodResult.of(0, "The target inventory does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help.");
+    @LuaFunction(mainThread = true)
+    public MethodResult getUsedExternChemicalStorage() {
+        if (!isAvailable())
+            return notConnected();
 
-        return importToME(arguments, inventory);
+        return MethodResult.of(AppEngApi.getUsedExternalChemicalStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getItem(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult getUsedItemStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        MEStorage monitor = AppEngApi.getMonitor(node);
-        Pair filter = ItemFilter.parse(arguments.getTable(0));
-        if (filter.rightPresent())
-            return MethodResult.of(null, filter.getRight());
+        return MethodResult.of(AppEngApi.getUsedItemStorage(node));
+    }
 
-        ItemFilter parsedFilter = filter.getLeft();
-        if (parsedFilter.isEmpty())
-            return MethodResult.of(null, "EMPTY_FILTER");
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getUsedFluidStorage() {
+        if (!isAvailable())
+            return notConnected();
 
-        return MethodResult.of(AppEngApi.getObjectFromStack(AppEngApi.findAEStackFromFilter(monitor, getCraftingService(), parsedFilter), getCraftingService()));
+        return MethodResult.of(AppEngApi.getUsedFluidStorage(node));
     }
 
     @LuaFunction(mainThread = true)
-    public final MethodResult listItems() {
-        if (!isConnected())
+    public MethodResult getUsedChemicalStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.listStacks(AppEngApi.getMonitor(node), getCraftingService()));
+        return MethodResult.of(AppEngApi.getUsedChemicalStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult listCraftableItems() {
-        if (!isConnected())
+    public MethodResult getAvailableExternItemStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.listCraftableStacks(AppEngApi.getMonitor(node), getCraftingService()));
+        return MethodResult.of(AppEngApi.getAvailableExternalItemStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult listFluid() {
-        if (!isConnected())
+    public MethodResult getAvailableExternFluidStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.listFluids(AppEngApi.getMonitor(node), getCraftingService()));
+        return MethodResult.of(AppEngApi.getAvailableExternalFluidStorage(node));
     }
 
     @LuaFunction(mainThread = true)
-    public final MethodResult listGas() {
-        if (!isConnected())
+    public MethodResult getAvailableExternChemicalStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.listGases(AppEngApi.getMonitor(node), getCraftingService(), 0));
+        return MethodResult.of(AppEngApi.getAvailableExternalChemicalStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult listCraftableFluid() {
-        if (!isConnected())
+    public final MethodResult getAvailableItemStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.listCraftableFluids(AppEngApi.getMonitor(node), getCraftingService()));
+        return MethodResult.of(AppEngApi.getAvailableItemStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getTotalItemStorage() {
-        if (!isConnected())
+    public final MethodResult getAvailableFluidStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.getTotalItemStorage(node));
+        return MethodResult.of(AppEngApi.getAvailableFluidStorage(node));
     }
 
     @LuaFunction(mainThread = true)
-    public final MethodResult getTotalFluidStorage() {
-        if (!isConnected())
+    public MethodResult getAvailableChemicalStorage() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.getTotalFluidStorage(node));
+        return MethodResult.of(AppEngApi.getAvailableChemicalStorage(node));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getUsedItemStorage() {
-        if (!isConnected())
+    public final MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.getUsedItemStorage(node));
+        Pair filter = ItemFilter.parse(arguments.getTable(0));
+        if (filter.rightPresent())
+            return MethodResult.of(false, filter.getRight());
+
+        ItemFilter parsedFilter = filter.getLeft();
+        if (parsedFilter.isEmpty())
+            return MethodResult.of(false, "EMPTY_FILTER");
+
+        String cpuName = arguments.optString(1, "");
+        ICraftingCPU target = AppEngApi.getCraftingCPU(node, cpuName);
+        if (!cpuName.isEmpty() && target == null)
+            return MethodResult.of(false, "CPU " + cpuName + " does not exists");
+
+        ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class);
+        Pair stack = AppEngApi.findAEStackFromFilter(AppEngApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft());
+        if (stack.getRight() == null && stack.getLeft() == 0)
+            return MethodResult.of(null, "NOT_CRAFTABLE");
+
+        CraftJob job = new CraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), tile, tile, target);
+        tile.addJob(job);
+        ServerWorker.add(job::startCrafting);
+        return MethodResult.of(true);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getUsedFluidStorage() {
-        if (!isConnected())
+    public final MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.getUsedFluidStorage(node));
+        Pair filter = FluidFilter.parse(arguments.getTable(0));
+        if (filter.rightPresent())
+            return MethodResult.of(false, filter.getRight());
+
+        FluidFilter parsedFilter = filter.getLeft();
+        if (parsedFilter.isEmpty())
+            return MethodResult.of(false, "EMPTY_FILTER");
+
+        String cpuName = arguments.optString(1, "");
+        ICraftingCPU target = AppEngApi.getCraftingCPU(node, cpuName);
+        if (!cpuName.isEmpty() && target == null)
+            return MethodResult.of(false, "CPU " + cpuName + " does not exists");
+
+        ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class);
+        Pair stack = AppEngApi.findAEFluidFromFilter(AppEngApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft());
+        if (stack.getRight() == null && stack.getLeft() == 0)
+            return MethodResult.of(null, "NOT_CRAFTABLE");
+
+        CraftJob job = new CraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), tile, tile, target);
+        tile.addJob(job);
+        ServerWorker.add(job::startCrafting);
+        return MethodResult.of(true);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getAvailableItemStorage() {
-        if (!isConnected())
+    public MethodResult getCraftingTasks() {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.getAvailableItemStorage(node));
+        ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class);
+
+        List jobs = new ArrayList<>();
+
+        for (ICraftingCPU cpu : craftingGrid.getCpus()) {
+            if (cpu.getJobStatus() != null)
+                jobs.add(AppEngApi.getObjectFromJob(cpu.getJobStatus(), cpu));
+        }
+        return MethodResult.of(jobs);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getAvailableFluidStorage() {
-        if (!isConnected())
+    public MethodResult cancelCraftingTasks(IArguments arguments) {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.getAvailableFluidStorage(node));
+        ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class);
+
+        Map filterTable;
+        try {
+            Optional> optionalTable = arguments.optTable(0);
+            if (optionalTable.isEmpty())
+                return MethodResult.of(null, "EMPTY_INPUT");
+            filterTable = optionalTable.get();
+        } catch (LuaException e) {
+            return MethodResult.of(null, "NO_TABLE");
+        }
+
+        Pair filter = GenericFilter.parseGeneric(filterTable);
+        if (filter.getRight() != null)
+            return MethodResult.of(null, filter.getRight());
+
+        int jobsCanceled = 0;
+        for (ICraftingCPU cpu : craftingGrid.getCpus()) {
+            if (cpu.getJobStatus() != null && filter.getLeft().test(cpu.getJobStatus().crafting())) {
+                if (cpu instanceof CraftingCPUCluster cpuCluster) {
+                    cpuCluster.cancel();
+                    jobsCanceled++;
+                }
+            }
+        }
+        return MethodResult.of(jobsCanceled, "SUCCESSFUL");
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult listCells() {
-        if (!isConnected())
+    public final MethodResult isItemCraftable(IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        return MethodResult.of(AppEngApi.listCells(node));
+        Pair filter = ItemFilter.parse(arguments.getTable(0));
+        if (filter.rightPresent())
+            return MethodResult.of(false, filter.getRight());
+
+        ItemFilter parsedFilter = filter.getLeft();
+        if (parsedFilter.isEmpty())
+            return MethodResult.of(false, "EMPTY_FILTER");
+
+        AEItemKey item = AEItemKey.of(parsedFilter.toItemStack());
+
+        return MethodResult.of(getCraftingService().isCraftable(item));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getCraftingCPUs() throws LuaException {
-        if (!isConnected())
+    public final MethodResult isFluidCrafting(IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
+        MEStorage monitor = AppEngApi.getMonitor(node);
         ICraftingService grid = node.getGrid().getService(ICraftingService.class);
-        List map = new ArrayList<>();
 
-        for (ICraftingCPU iCraftingCPU : grid.getCpus()) {
-            Object cpu = AppEngApi.getObjectFromCPU(iCraftingCPU);
-            map.add(cpu);
+        Pair filter = FluidFilter.parse(arguments.getTable(0));
+        if (filter.rightPresent())
+            return MethodResult.of(false, filter.getRight());
+
+        FluidFilter parsedFilter = filter.getLeft();
+        if (parsedFilter.isEmpty())
+            return MethodResult.of(false, "EMPTY_FILTER");
+        String cpuName = arguments.optString(1, "");
+        ICraftingCPU craftingCPU = AppEngApi.getCraftingCPU(node, cpuName);
+
+        return MethodResult.of(AppEngApi.isFluidCrafting(monitor, grid, parsedFilter, craftingCPU));
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult isFluidCraftable(IArguments arguments) throws LuaException {
+        if (!isAvailable())
+            return notConnected();
+
+        Pair filter = FluidFilter.parse(arguments.getTable(0));
+        if (filter.rightPresent())
+            return MethodResult.of(false, filter.getRight());
+
+        FluidFilter parsedFilter = filter.getLeft();
+        if (parsedFilter.isEmpty())
+            return MethodResult.of(false, "EMPTY_FILTER");
+
+        AEFluidKey fluid = AEFluidKey.of(parsedFilter.toFluidStack());
+
+        return MethodResult.of(getCraftingService().isCraftable(fluid));
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult exportFluid(IComputerAccess computer, IArguments arguments) throws LuaException {
+        String side = arguments.getString(1);
+        IFluidHandler fluidHandler;
+
+        if (Direction.byName(side.toUpperCase(Locale.ROOT)) == null && ComputerSide.valueOfInsensitive(side.toUpperCase(Locale.ROOT)) == null) {
+            fluidHandler = FluidUtil.getHandlerFromDirection(arguments.getString(1), owner);
+        } else {
+            fluidHandler = FluidUtil.getHandlerFromName(computer, arguments.getString(1));
         }
-        return MethodResult.of(map);
+
+        if (fluidHandler == null)
+            return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help.");
+
+        return exportToTank(arguments, fluidHandler);
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult importFluid(IComputerAccess computer, IArguments arguments) throws LuaException {
+        String side = arguments.getString(1);
+        IFluidHandler fluidHandler;
+
+        if (Direction.byName(side.toUpperCase(Locale.ROOT)) == null && ComputerSide.valueOfInsensitive(side.toUpperCase(Locale.ROOT)) == null) {
+            fluidHandler = FluidUtil.getHandlerFromDirection(arguments.getString(1), owner);
+        } else {
+            fluidHandler = FluidUtil.getHandlerFromName(computer, arguments.getString(1));
+        }
+
+        if (fluidHandler == null)
+            return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help.");
+
+        return importToME(arguments, fluidHandler);
     }
 
-    public final ICraftingCPU getCraftingCPU(String cpuName) {
-        if (cpuName.isEmpty()) return null;
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult isItemCrafting(IArguments arguments) throws LuaException {
+        if (!isAvailable())
+            return notConnected();
+
+        MEStorage monitor = AppEngApi.getMonitor(node);
         ICraftingService grid = node.getGrid().getService(ICraftingService.class);
-        if (grid == null) return null;
 
-        Iterator iterator = grid.getCpus().iterator();
-        if (!iterator.hasNext()) return null;
+        Pair filter = ItemFilter.parse(arguments.getTable(0));
+        if (filter.rightPresent())
+            return MethodResult.of(false, filter.getRight());
 
-        while (iterator.hasNext()) {
-            ICraftingCPU cpu = iterator.next();
+        ItemFilter parsedFilter = filter.getLeft();
+        if (parsedFilter.isEmpty())
+            return MethodResult.of(false, "EMPTY_FILTER");
+        String cpuName = arguments.optString(1, "");
+        ICraftingCPU craftingCPU = AppEngApi.getCraftingCPU(node, cpuName);
 
-            if (cpu.getName() != null && cpu.getName().getString().equals(cpuName)) {
-                return cpu;
-            }
-        }
+        return MethodResult.of(AppEngApi.isItemCrafting(monitor, grid, parsedFilter, craftingCPU));
+    }
 
-        return null;
+    @LuaFunction(mainThread = true)
+    public final MethodResult getCraftingCPUs() throws LuaException {
+        if (!isAvailable())
+            return notConnected();
+
+        ICraftingService grid = node.getGrid().getService(ICraftingService.class);
+        List map = new ArrayList<>();
+
+        for (ICraftingCPU iCraftingCPU : grid.getCpus()) {
+            Object cpu = AppEngApi.getObjectFromCPU(iCraftingCPU, false);
+            map.add(cpu);
+        }
+        return MethodResult.of(map);
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/NBTStoragePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/NBTStoragePeripheral.java
index 5e327d1f6..957594180 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/NBTStoragePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/NBTStoragePeripheral.java
@@ -18,7 +18,7 @@
 
 public class NBTStoragePeripheral extends BasePeripheral> {
 
-    public static final String PERIPHERAL_TYPE = "nbtStorage";
+    public static final String PERIPHERAL_TYPE = "nbt_storage";
 
     public NBTStoragePeripheral(NBTStorageEntity tileEntity) {
         super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity));
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java
index 8a6bf1913..8b10eb742 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java
@@ -27,7 +27,7 @@
 
 public class PlayerDetectorPeripheral extends BasePeripheral {
 
-    public static final String PERIPHERAL_TYPE = "playerDetector";
+    public static final String PERIPHERAL_TYPE = "player_detector";
     private static final int MAX_RANGE = APConfig.PERIPHERALS_CONFIG.playerDetMaxRange.get();
 
     public PlayerDetectorPeripheral(PeripheralBlockEntity tileEntity) {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java
index c11816dea..5e6625c4b 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RedstoneIntegratorPeripheral.java
@@ -10,7 +10,7 @@
 
 public class RedstoneIntegratorPeripheral extends BasePeripheral> {
 
-    public static final String PERIPHERAL_TYPE = "redstoneIntegrator";
+    public static final String PERIPHERAL_TYPE = "redstone_integrator";
 
     public RedstoneIntegratorPeripheral(RedstoneIntegratorEntity tileEntity) {
         super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity));
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java
index a45b81086..15ca27785 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java
@@ -9,6 +9,7 @@
 import dan200.computercraft.api.lua.LuaFunction;
 import dan200.computercraft.api.lua.MethodResult;
 import dan200.computercraft.api.peripheral.IComputerAccess;
+import dan200.computercraft.core.computer.ComputerSide;
 import de.srendi.advancedperipherals.AdvancedPeripherals;
 import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner;
 import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorage;
@@ -20,6 +21,7 @@
 import de.srendi.advancedperipherals.common.util.Pair;
 import de.srendi.advancedperipherals.common.util.inventory.*;
 import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral;
+import net.minecraft.core.Direction;
 import net.minecraft.world.item.ItemStack;
 import net.minecraftforge.fluids.FluidStack;
 import net.minecraftforge.fluids.capability.IFluidHandler;
@@ -29,10 +31,11 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 
-public class RsBridgePeripheral extends BasePeripheral> {
+public class RsBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral {
 
-    public static final String PERIPHERAL_TYPE = "rsBridge";
+    public static final String PERIPHERAL_TYPE = "rs_bridge";
 
     public RsBridgePeripheral(RsBridgeEntity tileEntity) {
         super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity));
@@ -50,27 +53,42 @@ private MethodResult notConnected() {
         return MethodResult.of(null, "NOT_CONNECTED");
     }
 
+    private boolean isAvailable() {
+        return getNetwork() != null;
+    }
+
     @Override
     public boolean isEnabled() {
         return APConfig.PERIPHERALS_CONFIG.enableRSBridge.get();
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final boolean isConnected() {
-        return getNetwork() != null;
+    public final MethodResult isConnected() {
+        return MethodResult.of(isAvailable());
     }
 
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult isOnline() {
+        // Is there a more proper method?
+        return MethodResult.of(getNode().isActive());
+    }
+
+
+    @Override
     @LuaFunction(mainThread = true)
     public final MethodResult listItems() {
-        if (!isConnected())
+        if (!isAvailable())
             return notConnected();
 
         return MethodResult.of(RefinedStorage.listItems(getNetwork()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
     public final MethodResult listCraftableItems() {
-        if (!isConnected())
+        if (!isAvailable())
             return notConnected();
 
         List items = new ArrayList<>();
@@ -78,9 +96,10 @@ public final MethodResult listCraftableItems() {
         return MethodResult.of(items);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final Object listCraftableFluids() {
-        if (!isConnected())
+    public final MethodResult listCraftableFluids() {
+        if (!isAvailable())
             return notConnected();
 
         List fluids = new ArrayList<>();
@@ -88,73 +107,148 @@ public final Object listCraftableFluids() {
         return MethodResult.of(fluids);
     }
 
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult listCells() {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult listDrives() {
+        return null;
+    }
+
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getMaxItemDiskStorage() {
-        if (!isConnected())
+    public final MethodResult getTotalItemStorage() {
+        if (!isAvailable())
             return notConnected();
 
         return MethodResult.of(RefinedStorage.getMaxItemDiskStorage(getNetwork()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getMaxFluidDiskStorage() {
-        if (!isConnected())
+    public final MethodResult getTotalFluidStorage() {
+        if (!isAvailable())
             return notConnected();
 
         return MethodResult.of(RefinedStorage.getMaxFluidDiskStorage(getNetwork()));
     }
 
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getUsedExternItemStorage() {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getUsedExternFluidStorage() {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getUsedItemStorage() {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getUsedFluidStorage() {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getAvailableExternItemStorage() {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getAvailableExternFluidStorage() {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getAvailableItemStorage() {
+        return null;
+    }
+
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getMaxItemExternalStorage() {
-        if (!isConnected())
+    public final MethodResult getAvailableFluidStorage() {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getTotalExternItemStorage() {
+        if (!isAvailable())
             return notConnected();
 
         return MethodResult.of(RefinedStorage.getMaxItemExternalStorage(getNetwork()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getMaxFluidExternalStorage() {
-        if (!isConnected())
+    public final MethodResult getTotalExternFluidStorage() {
+        if (!isAvailable())
             return notConnected();
 
         return MethodResult.of(RefinedStorage.getMaxFluidExternalStorage(getNetwork()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
     public final MethodResult listFluids() {
-        if (!isConnected())
+        if (!isAvailable())
             return notConnected();
 
         return MethodResult.of(RefinedStorage.listFluids(getNetwork()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
     public final MethodResult getEnergyUsage() {
-        if (!isConnected())
+        if (!isAvailable())
             return notConnected();
 
         return MethodResult.of(getNetwork().getEnergyUsage());
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getMaxEnergyStorage() {
-        if (!isConnected())
+    public final MethodResult getEnergyCapacity() {
+        if (!isAvailable())
             return notConnected();
 
         return MethodResult.of(getNetwork().getEnergyStorage().getMaxEnergyStored());
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getEnergyStorage() {
-        if (!isConnected())
+    public final MethodResult getStoredEnergy() {
+        if (!isAvailable())
             return notConnected();
 
         return MethodResult.of(getNetwork().getEnergyStorage().getEnergyStored());
     }
 
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getAvgPowerInjection() {
+        return null;
+    }
+
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult getPattern(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult getFilteredPatterns(IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
         Pair filter = ItemFilter.parse(arguments.getTable(0));
@@ -170,6 +264,12 @@ public final MethodResult getPattern(IArguments arguments) throws LuaException {
         return MethodResult.of(RefinedStorage.getObjectFromPattern(getNetwork().getCraftingManager().getPattern(patternItem), getNetwork()));
     }
 
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult getPatterns() {
+        return null;
+    }
+
     protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException {
         RsItemHandler itemHandler = new RsItemHandler(getNetwork());
         if (targetInventory == null)
@@ -218,81 +318,88 @@ protected MethodResult importToSystem(@NotNull IArguments arguments, @Nullable I
         return MethodResult.of(InventoryUtil.moveFluid(targetInventory, itemHandler, filter.getLeft()), null);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult exportItem(@NotNull IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult exportItem(IComputerAccess computer, IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        IItemHandler inventory = InventoryUtil.getHandlerFromDirection(arguments.getString(1), owner);
-        return exportToChest(arguments, inventory);
-    }
+        String side = arguments.getString(1);
+        IItemHandler inventory;
 
-    @LuaFunction(mainThread = true)
-    public final MethodResult exportItemToPeripheral(IComputerAccess computer, IArguments arguments) throws LuaException {
-        if (!isConnected())
-            return notConnected();
+        if (Direction.byName(side.toUpperCase(Locale.ROOT)) == null && ComputerSide.valueOfInsensitive(side.toUpperCase(Locale.ROOT)) == null) {
+            inventory = InventoryUtil.getHandlerFromDirection(arguments.getString(1), owner);
+        } else {
+            inventory = InventoryUtil.getHandlerFromName(computer, arguments.getString(1));
+        }
 
-        IItemHandler inventory = InventoryUtil.getHandlerFromName(computer, arguments.getString(1));
         return exportToChest(arguments, inventory);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult importItem(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult importItem(IComputerAccess computer, IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        IItemHandler inventory = InventoryUtil.getHandlerFromDirection(arguments.getString(1), owner);
-        return importToSystem(arguments, inventory);
-    }
+        String side = arguments.getString(1);
+        IItemHandler inventory;
 
-    @LuaFunction(mainThread = true)
-    public final MethodResult importItemFromPeripheral(IComputerAccess computer, IArguments arguments) throws LuaException {
-        if (!isConnected())
-            return notConnected();
+        if (Direction.byName(side.toUpperCase(Locale.ROOT)) == null && ComputerSide.valueOfInsensitive(side.toUpperCase(Locale.ROOT)) == null) {
+            inventory = InventoryUtil.getHandlerFromDirection(arguments.getString(1), owner);
+        } else {
+            inventory = InventoryUtil.getHandlerFromName(computer, arguments.getString(1));
+        }
 
-        IItemHandler inventory = InventoryUtil.getHandlerFromName(computer, arguments.getString(1));
         return importToSystem(arguments, inventory);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult exportFluid(@NotNull IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult exportFluid(IComputerAccess computer, IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        IFluidHandler inventory = FluidUtil.getHandlerFromDirection(arguments.getString(1), owner);
-        return exportToTank(arguments, inventory);
-    }
+        String side = arguments.getString(1);
+        IFluidHandler fluidHandler;
 
-    @LuaFunction(mainThread = true)
-    public final MethodResult exportFluidToPeripheral(IComputerAccess computer, IArguments arguments) throws LuaException {
-        if (!isConnected())
-            return notConnected();
+        if (Direction.byName(side.toUpperCase(Locale.ROOT)) == null && ComputerSide.valueOfInsensitive(side.toUpperCase(Locale.ROOT)) == null) {
+            fluidHandler = FluidUtil.getHandlerFromDirection(arguments.getString(1), owner);
+        } else {
+            fluidHandler = FluidUtil.getHandlerFromName(computer, arguments.getString(1));
+        }
 
-        IFluidHandler inventory = FluidUtil.getHandlerFromName(computer, arguments.getString(1));
-        return exportToTank(arguments, inventory);
+        if (fluidHandler == null)
+            return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help.");
+
+        return exportToTank(arguments, fluidHandler);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult importFluid(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult importFluid(IComputerAccess computer, IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
-        IFluidHandler inventory = FluidUtil.getHandlerFromDirection(arguments.getString(1), owner);
-        return importToSystem(arguments, inventory);
-    }
+        String side = arguments.getString(1);
+        IFluidHandler fluidHandler;
 
-    @LuaFunction(mainThread = true)
-    public final MethodResult importFluidFromPeripheral(IComputerAccess computer, IArguments arguments) throws LuaException {
-        if (!isConnected())
-            return notConnected();
+        if (Direction.byName(side.toUpperCase(Locale.ROOT)) == null && ComputerSide.valueOfInsensitive(side.toUpperCase(Locale.ROOT)) == null) {
+            fluidHandler = FluidUtil.getHandlerFromDirection(arguments.getString(1), owner);
+        } else {
+            fluidHandler = FluidUtil.getHandlerFromName(computer, arguments.getString(1));
+        }
 
-        IFluidHandler inventory = FluidUtil.getHandlerFromName(computer, arguments.getString(1));
-        return importToSystem(arguments, inventory);
+        if (fluidHandler == null)
+            return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help.");
+
+        return importToSystem(arguments, fluidHandler);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
     public final MethodResult getItem(IArguments arguments) throws LuaException {
-        if (!isConnected())
+        if (!isAvailable())
             return notConnected();
 
         Pair filter = ItemFilter.parse(arguments.getTable(0));
@@ -302,9 +409,16 @@ public final MethodResult getItem(IArguments arguments) throws LuaException {
         return MethodResult.of(RefinedStorage.getObjectFromStack(RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork()));
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult craftItem(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult getFluid(IArguments arguments) throws LuaException {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult craftItem(IComputerAccess computerAccess, IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
 
@@ -324,9 +438,10 @@ public final MethodResult craftItem(IArguments arguments) throws LuaException {
         return MethodResult.of(type == CalculationResultType.OK);
     }
 
+    @Override
     @LuaFunction(mainThread = true)
-    public final MethodResult craftFluid(IArguments arguments) throws LuaException {
-        if (!isConnected())
+    public final MethodResult craftFluid(IComputerAccess computerAccess, IArguments arguments) throws LuaException {
+        if (!isAvailable())
             return notConnected();
 
         Pair filter = FluidFilter.parse(arguments.getTable(0));
@@ -338,7 +453,6 @@ public final MethodResult craftFluid(IArguments arguments) throws LuaException {
             return MethodResult.of(null, "NOT_CRAFTABLE");
 
         ICalculationResult result = getNetwork().getCraftingManager().create(stack, filter.getLeft().getCount());
-        getNetwork().getCraftingManager().getPatterns();
         CalculationResultType type = result.getType();
         if (type == CalculationResultType.OK)
             getNetwork().getCraftingManager().start(result.getTask());
@@ -346,9 +460,20 @@ public final MethodResult craftFluid(IArguments arguments) throws LuaException {
         return MethodResult.of(type == CalculationResultType.OK);
     }
 
+    @Override
+    public MethodResult getCraftingTasks() {
+        return null;
+    }
+
+    @Override
+    public MethodResult cancelCraftingTasks(IArguments arguments) throws LuaException {
+        return null;
+    }
+
+    @Override
     @LuaFunction(mainThread = true)
     public final MethodResult isItemCrafting(IArguments arguments) throws LuaException {
-        if (!isConnected())
+        if (!isAvailable())
             return notConnected();
         Pair filter = ItemFilter.parse(arguments.getTable(0));
         if (filter.rightPresent())
@@ -366,9 +491,22 @@ public final MethodResult isItemCrafting(IArguments arguments) throws LuaExcepti
         return MethodResult.of(false);
     }
 
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult isFluidCraftable(IArguments arguments) throws LuaException {
+        return null;
+    }
+
+    @Override
+    @LuaFunction(mainThread = true)
+    public final MethodResult isFluidCrafting(IArguments arguments) throws LuaException {
+        return null;
+    }
+
+    @Override
     @LuaFunction(mainThread = true)
     public final MethodResult isItemCraftable(IArguments arguments) throws LuaException {
-        if (!isConnected())
+        if (!isAvailable())
             return notConnected();
 
         Pair filter = ItemFilter.parse(arguments.getTable(0));
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/EndAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/EndAutomataCorePeripheral.java
index 90f6ceda7..bb50f1d60 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/EndAutomataCorePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/EndAutomataCorePeripheral.java
@@ -10,7 +10,7 @@
 
 public class EndAutomataCorePeripheral extends WeakAutomataCorePeripheral {
 
-    public static final String TYPE = "endAutomata";
+    public static final String TYPE = "end_automata";
 
     public EndAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) {
         this(TYPE, turtle, side, AutomataCoreTier.TIER2);
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/HusbandryAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/HusbandryAutomataCorePeripheral.java
index baba65bfd..ba89f1629 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/HusbandryAutomataCorePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/HusbandryAutomataCorePeripheral.java
@@ -14,7 +14,7 @@
 import java.util.function.Predicate;
 
 public class HusbandryAutomataCorePeripheral extends WeakAutomataCorePeripheral {
-    public static final String TYPE = "husbandryAutomata";
+    public static final String TYPE = "husbandry_automata";
 
     private static final Predicate isAnimal = entity1 -> entity1.getType().getCategory().isFriendly();
     private static final Predicate isLivingEntity = LivingEntity.class::isInstance;
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java
index 40a991573..392dcfaf2 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java
@@ -8,7 +8,7 @@
 
 public class OverpoweredEndAutomataCorePeripheral extends EndAutomataCorePeripheral {
 
-    public static final String TYPE = "overpoweredEndAutomata";
+    public static final String TYPE = "overpowered_end_automata";
 
     public OverpoweredEndAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) {
         super(TYPE, turtle, side, AutomataCoreTier.OVERPOWERED_TIER2);
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java
index fc8f7e980..220e9ce49 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java
@@ -8,13 +8,14 @@
 
 public class OverpoweredHusbandryAutomataCorePeripheral extends HusbandryAutomataCorePeripheral {
 
-    public static final String TYPE = "overpoweredHusbandryAutomata";
+    public static final String TYPE = "overpowered_husbandry_automata";
 
     public OverpoweredHusbandryAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) {
         super(TYPE, turtle, side, AutomataCoreTier.OVERPOWERED_TIER2);
         setAttribute(ATTR_STORING_TOOL_DURABILITY);
     }
 
+    @Override
     public void addRotationCycle(int count) {
         super.addRotationCycle(count);
         if (AdvancedPeripherals.RANDOM.nextDouble() <= APConfig.METAPHYSICS_CONFIG.overpoweredAutomataBreakChance.get())
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java
index cca911a2a..1b19eb40e 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java
@@ -8,13 +8,14 @@
 
 public class OverpoweredWeakAutomataCorePeripheral extends WeakAutomataCorePeripheral {
 
-    public static final String TYPE = "overpoweredWeakAutomata";
+    public static final String TYPE = "overpowered_weak_automata";
 
     public OverpoweredWeakAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) {
         super(TYPE, turtle, side, AutomataCoreTier.OVERPOWERED_TIER1);
         setAttribute(ATTR_STORING_TOOL_DURABILITY);
     }
 
+    @Override
     public void addRotationCycle(int count) {
         super.addRotationCycle(count);
         if (AdvancedPeripherals.RANDOM.nextDouble() <= APConfig.METAPHYSICS_CONFIG.overpoweredAutomataBreakChance.get())
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java
index afaae9ebc..64bd72511 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java
@@ -3,17 +3,13 @@
 import dan200.computercraft.api.turtle.ITurtleAccess;
 import dan200.computercraft.api.turtle.TurtleSide;
 import de.srendi.advancedperipherals.common.addons.computercraft.operations.AutomataCoreTier;
-import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataBlockHandPlugin;
-import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataChargingPlugin;
-import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataItemSuckPlugin;
-import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataLookPlugin;
-import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataSoulFeedingPlugin;
+import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.*;
 import de.srendi.advancedperipherals.common.configuration.APConfig;
 import de.srendi.advancedperipherals.lib.metaphysics.IAutomataCoreTier;
 import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral;
 
 public class WeakAutomataCorePeripheral extends AutomataCorePeripheral {
-    public static final String TYPE = "weakAutomata";
+    public static final String TYPE = "weak_automata";
 
     public WeakAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) {
         this(TYPE, turtle, side, AutomataCoreTier.TIER1);
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java
index a92143043..3d580977c 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java
@@ -69,12 +69,12 @@ public final MethodResult digBlock(@NotNull IArguments arguments) throws LuaExce
             int previousDamageValue = selectedTool.getDamageValue();
             Pair result = owner.withPlayer(APFakePlayer.wrapActionWithShiftKey(sneak, APFakePlayer.wrapActionWithRot(yaw, pitch, APFakePlayer::digBlock)));
             if (!result.getLeft()) {
-                return MethodResult.of(null, result.getRight());
+                return MethodResult.of(false, result.getRight());
             }
             if (automataCore.hasAttribute(AutomataCorePeripheral.ATTR_STORING_TOOL_DURABILITY)) {
                 selectedTool.setDamageValue(previousDamageValue);
             }
-            return MethodResult.of(true);
+            return MethodResult.of(true, result.getRight());
         });
     }
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java
index 526ffd532..7c2ea5a92 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java
@@ -84,7 +84,7 @@ public final MethodResult scanItems() {
         int index = 1;
         for (ItemEntity item : items) {
             ItemStack stack = item.getItem();
-            Map itemData = LuaConverter.stackToObject(stack);
+            Map itemData = LuaConverter.itemStackToObject(stack);
             itemData.put("entityID", item.getId());
             data.put(index, itemData);
             index++;
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java
index fd94787a9..04c9711b2 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java
@@ -6,17 +6,13 @@
 import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral;
 import net.minecraft.world.level.block.entity.BlockEntity;
 import net.minecraftforge.common.capabilities.ForgeCapabilities;
-import net.minecraftforge.items.IItemHandler;
-import net.minecraftforge.registries.ForgeRegistries;
 import net.minecraftforge.fluids.FluidStack;
 import net.minecraftforge.fluids.capability.IFluidHandler;
+import net.minecraftforge.items.IItemHandler;
+import net.minecraftforge.registries.ForgeRegistries;
 import org.jetbrains.annotations.NotNull;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 
 public class BasinIntegration extends BlockEntityIntegrationPeripheral {
 
@@ -68,7 +64,7 @@ public final List getOutputFluids() {
 
     @LuaFunction(mainThread = true)
     public final Map getFilter() {
-        return LuaConverter.stackToObject(blockEntity.getFilter().getFilter());
+        return LuaConverter.itemStackToObject(blockEntity.getFilter().getFilter());
     }
 
     @LuaFunction(mainThread = true)
@@ -78,7 +74,7 @@ public final List getInventory() {
         IItemHandler handler = handlerOptional.get();
         List items = new ArrayList<>();
         for (int slot = 0; slot < handler.getSlots(); slot++) {
-            items.add(LuaConverter.stackToObject(handler.getStackInSlot(slot)));
+            items.add(LuaConverter.itemStackToObject(handler.getStackInSlot(slot)));
         }
         return items;
     }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BlazeBurnerIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/BlazeBurnerIntegration.java
index 88bde5dca..eb45e1f28 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BlazeBurnerIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/create/BlazeBurnerIntegration.java
@@ -18,7 +18,7 @@ public BlazeBurnerIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "blazeBurner";
+        return "blaze_burner";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/FluidTankIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/FluidTankIntegration.java
index e8d4b0779..cc59643e2 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/FluidTankIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/create/FluidTankIntegration.java
@@ -19,7 +19,7 @@ public FluidTankIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "fluidTank";
+        return "fluid_tank";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/MechanicalMixerIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/MechanicalMixerIntegration.java
index 0c87f7763..91140fd47 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/MechanicalMixerIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/create/MechanicalMixerIntegration.java
@@ -16,7 +16,7 @@ public MechanicalMixerIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "mechanicalMixer";
+        return "mechanical_mixer";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/ScrollValueBehaviourIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/ScrollValueBehaviourIntegration.java
index 32dbc4a1d..81e58614b 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/ScrollValueBehaviourIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/create/ScrollValueBehaviourIntegration.java
@@ -19,7 +19,7 @@ public ScrollValueBehaviourIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "scrollBehaviourEntity";
+        return "scroll_behaviour_entity";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/dimstorage/DimChestIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/dimstorage/DimChestIntegration.java
new file mode 100644
index 000000000..037775037
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/dimstorage/DimChestIntegration.java
@@ -0,0 +1,55 @@
+package de.srendi.advancedperipherals.common.addons.dimstorage;
+
+import dan200.computercraft.api.lua.LuaFunction;
+import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral;
+import edivad.dimstorage.api.Frequency;
+import edivad.dimstorage.blockentities.BlockEntityDimChest;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.UUID;
+
+public class DimChestIntegration extends BlockEntityIntegrationPeripheral {
+
+    protected DimChestIntegration(BlockEntity entity) {
+        super(entity);
+    }
+
+    @NotNull
+    @Override
+    public String getType() {
+        return "dimChest";
+    }
+
+    @LuaFunction(mainThread = true)
+    public final String getOwnerUUID() {
+        UUID uuid = blockEntity.getFrequency().getOwnerUUID();
+        if (uuid == null)
+            return null;
+        return uuid.toString();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final String getOwner() {
+        return blockEntity.getFrequency().getOwner();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final boolean hasOwner() {
+        return blockEntity.getFrequency().hasOwner();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final int getChannel() {
+        return blockEntity.getFrequency().getChannel();
+    }
+
+    @LuaFunction(mainThread = true)
+    public final boolean setChannel(int channel) {
+        Frequency fre = blockEntity.getFrequency();
+        if (fre.hasOwner()) return false;
+        fre.setChannel(channel);
+        blockEntity.setFrequency(fre);
+        return true;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/dimstorage/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/dimstorage/Integration.java
new file mode 100644
index 000000000..a74e46b62
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/dimstorage/Integration.java
@@ -0,0 +1,12 @@
+package de.srendi.advancedperipherals.common.addons.dimstorage;
+
+import de.srendi.advancedperipherals.common.addons.computercraft.integrations.IntegrationPeripheralProvider;
+import edivad.dimstorage.blockentities.BlockEntityDimChest;
+
+public class Integration implements Runnable {
+
+    @Override
+    public void run() {
+        IntegrationPeripheralProvider.registerBlockEntityIntegration(DimChestIntegration::new, BlockEntityDimChest.class);
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/MekanismCapabilities.java b/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/MekanismCapabilities.java
new file mode 100644
index 000000000..858a11b3d
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/MekanismCapabilities.java
@@ -0,0 +1,15 @@
+package de.srendi.advancedperipherals.common.addons.mekanism;
+
+import mekanism.api.chemical.gas.IGasHandler;
+import net.minecraftforge.common.capabilities.Capability;
+import net.minecraftforge.common.capabilities.CapabilityToken;
+
+import static net.minecraftforge.common.capabilities.CapabilityManager.get;
+
+public class MekanismCapabilities {
+
+    public static final Capability GAS_HANDLER = get(new CapabilityToken<>() {
+    });
+
+
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java b/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java
index 96ec59d49..52f1fe572 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java
@@ -107,7 +107,7 @@ public static Object visitorToObject(IVisitorData visitor) {
         map.put("saturation", visitor.getSaturation());
         map.put("happiness", visitor.getCitizenHappinessHandler().getHappiness(visitor.getColony(), visitor));
         map.put("skills", skillsToObject(visitor.getCitizenSkillHandler().getSkills()));
-        map.put("recruitCost", LuaConverter.stackToObject(visitor.getRecruitCost()));
+        map.put("recruitCost", LuaConverter.itemStackToObject(visitor.getRecruitCost()));
 
         return map;
     }
@@ -349,7 +349,7 @@ public static Object builderResourcesToObject(IColony colony, BlockPos pos) {
             Map map = new HashMap<>();
             ItemStack stack = resource.getItemStack().copy();
 
-            map.put("item", LuaConverter.stackToObject(stack));
+            map.put("item", LuaConverter.itemStackToObject(stack));
             map.put("displayName", resource.getName());
             map.put("available", resource.getAvailable());
             map.put("delivering", resource.getAmountInDelivery());
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnderCellIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnderCellIntegration.java
index cee6df8b1..b6e2dcf76 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnderCellIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnderCellIntegration.java
@@ -14,7 +14,7 @@ protected EnderCellIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "enderCell";
+        return "ender_cell";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnergyCellIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnergyCellIntegration.java
index c437e31a6..043b29f81 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnergyCellIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/EnergyCellIntegration.java
@@ -14,7 +14,7 @@ protected EnergyCellIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "energyCell";
+        return "energy_cell";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java
index d8f1a9db8..08f51db5e 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java
@@ -15,7 +15,7 @@ protected ReactorIntegration(BlockEntity entity) {
     @Override
     @NotNull
     public String getType() {
-        return "uraniniteReactor";
+        return "uraninite_reactor";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/SolarPanelIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/SolarPanelIntegration.java
index 238ce5999..c921ae00a 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/SolarPanelIntegration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/SolarPanelIntegration.java
@@ -14,7 +14,7 @@ protected SolarPanelIntegration(BlockEntity entity) {
     @NotNull
     @Override
     public String getType() {
-        return "solarPanel";
+        return "solar_panel";
     }
 
     @LuaFunction(mainThread = true)
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java
index 9e13e7d8d..2a102e1ea 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java
@@ -18,20 +18,14 @@
 import de.srendi.advancedperipherals.common.util.inventory.FluidFilter;
 import de.srendi.advancedperipherals.common.util.inventory.ItemFilter;
 import de.srendi.advancedperipherals.common.util.inventory.ItemUtil;
-import net.minecraft.core.NonNullList;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.resources.ResourceLocation;
-import net.minecraft.tags.TagKey;
-import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
-import net.minecraft.world.level.material.Fluid;
 import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.registries.ForgeRegistries;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.*;
-import java.util.function.Supplier;
-import java.util.stream.Stream;
+import java.util.stream.Collectors;
 
 public class RefinedStorage {
 
@@ -63,7 +57,7 @@ public static ItemStack findStackFromFilter(INetwork network, @Nullable ICraftin
             return ItemStack.EMPTY;
 
         for (ICraftingPattern pattern : crafting.getPatterns()) {
-            for(ItemStack stack : pattern.getOutputs()) {
+            for (ItemStack stack : pattern.getOutputs()) {
                 if (filter.test(stack.copy()))
                     return stack.copy();
             }
@@ -160,35 +154,43 @@ public static long getMaxFluidExternalStorage(INetwork network) {
     }
 
     public static Object getObjectFromPattern(ICraftingPattern pattern, INetwork network) {
-        if (pattern == null) return null;
+        if (pattern == null)
+            return null;
+
         Map map = new HashMap<>();
-        List outputsList = pattern.getOutputs();
-        List outputs = new ArrayList<>();
-        for (ItemStack itemStack : outputsList)
-            outputs.add(getObjectFromStack(itemStack.copy(), network));
-
-        map.put("outputs", outputs);
-
-        List> inputList = pattern.getInputs();
-        List inputs = new ArrayList<>();
-        for (List singleInputList : inputList) {
-            List inputs1 = new ArrayList<>();
-            for (ItemStack stack : singleInputList)
-                inputs1.add(getObjectFromStack(stack.copy(), network));
-            inputs.add(inputs1);
-        }
+        map.put("outputs", pattern.getOutputs().stream().map(stack -> getObjectFromStack(stack.copy(), network)).toList());
+        map.put("fluidOutputs", pattern.getFluidOutputs().stream().map(stack -> getObjectFromFluid(stack.copy(), network)).toList());
+
+        List>> inputs = pattern.getInputs().stream()
+                .map(singleInputList -> singleInputList.stream()
+                        .map(stack -> getObjectFromStack(stack.copy(), network))
+                        .collect(Collectors.toList()))
+                .collect(Collectors.toList());
+
+        List>> fluidInputs = pattern.getInputs().stream()
+                .map(singleInputList -> singleInputList.stream()
+                        .map(stack -> getObjectFromStack(stack.copy(), network))
+                        .collect(Collectors.toList()))
+                .collect(Collectors.toList());
 
         List byproducts = new ArrayList<>();
         if (!pattern.isProcessing()) {
-            List byproductsList = pattern.getByproducts();
-            for (ItemStack stack : byproductsList)
-                byproducts.add(getObjectFromStack(stack.copy(), network));
+            byproducts = pattern.getByproducts().stream()
+                    .map(stack -> getObjectFromStack(stack.copy(), network))
+                    .collect(Collectors.toList());
         }
 
+        map.put("fluidInputs", fluidInputs);
         map.put("inputs", inputs);
-        map.put("outputs", outputs);
         map.put("byproducts", byproducts);
         map.put("processing", pattern.isProcessing());
+        Map container = new HashMap<>();
+        map.put("name", pattern.getContainer().getName().getString());
+        map.put("position", LuaConverter.posToObject(pattern.getContainer().getPosition()));
+
+        map.put("container", container);
+        map.put("isValid", pattern.isValid());
+        map.put("errorMessage", pattern.getErrorMessage() == null ? "" : pattern.getErrorMessage().getString());
         return map;
     }
 
@@ -196,16 +198,13 @@ public static Map getObjectFromStack(@Nullable ItemStack itemSta
         if (itemStack == null)
             return Collections.emptyMap();
 
-        Map map = new HashMap<>();
+        Map map = LuaConverter.itemToObject(itemStack.getItem());
         CompoundTag nbt = itemStack.getTag();
-        Supplier>> tags = () -> itemStack.getItem().builtInRegistryHolder().tags();
         map.put("fingerprint", ItemUtil.getFingerprint(itemStack));
-        map.put("name", ItemUtil.getRegistryKey(itemStack.getItem()).toString());
         map.put("amount", itemStack.getCount());
         map.put("displayName", itemStack.getDisplayName().getString());
         map.put("isCraftable", isItemCraftable(network, itemStack));
         map.put("nbt", nbt == null ? null : NBTUtil.toLua(nbt));
-        map.put("tags", tags.get().findAny().isEmpty() ? null : LuaConverter.tagsToList(tags));
 
         return map;
     }
@@ -214,13 +213,10 @@ public static Map getObjectFromFluid(@Nullable FluidStack fluidS
         if (fluidStack == null)
             return Collections.emptyMap();
 
-        Map map = new HashMap<>();
-        Supplier>> tags = () -> fluidStack.getFluid().builtInRegistryHolder().tags();
-        map.put("name", ForgeRegistries.FLUIDS.getKey(fluidStack.getFluid()).toString());
+        Map map = LuaConverter.fluidToObject(fluidStack.getFluid());
         map.put("amount", fluidStack.getAmount());
         map.put("displayName", fluidStack.getDisplayName().getString());
         map.put("isCraftable", isFluidCraftable(network, fluidStack));
-        map.put("tags", tags.get().findAny().isEmpty() ? null : LuaConverter.tagsToList(tags));
 
         return map;
     }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java
index f945fb8b6..06da6c0bf 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java
@@ -19,7 +19,7 @@ public RsFluidHandler(@NotNull INetwork network) {
 
     @Override
     public int fill(FluidStack resource, FluidAction action) {
-        if(resource.isEmpty())
+        if (resource.isEmpty())
             return 0;
         return resource.getAmount() - network.insertFluid(resource, resource.getAmount(), action == FluidAction.SIMULATE ? Action.SIMULATE : Action.PERFORM).getAmount();
     }
@@ -28,7 +28,7 @@ public int fill(FluidStack resource, FluidAction action) {
     @Override
     public FluidStack drain(FluidFilter filter, FluidAction simulate) {
         FluidStack fluid = RefinedStorage.findFluidFromFilter(network, null, filter);
-        if(fluid == null)
+        if (fluid == null)
             return FluidStack.EMPTY;
         return network.extractFluid(fluid, filter.getCount(), IComparer.COMPARE_QUANTITY, simulate == FluidAction.SIMULATE ? Action.SIMULATE : Action.PERFORM);
     }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java
index a95035903..900c8a5b0 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java
@@ -11,6 +11,7 @@
 
 /**
  * Used to transfer item between an inventory and the RS system.
+ *
  * @see de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RsBridgePeripheral
  */
 public class RsItemHandler implements IStorageSystemItemHandler {
@@ -31,7 +32,8 @@ public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate
     @Override
     public ItemStack extractItem(ItemFilter filter, int count, boolean simulate) {
         ItemStack item = RefinedStorage.findStackFromFilter(network, network.getCraftingManager(), filter);
-        AdvancedPeripherals.debug("Trying to extract item: " + item + " from filter: " + filter);
+        if (item == null)
+            AdvancedPeripherals.debug("Trying to extract item: " + item + " from filter: " + filter);
         if(item == null)
             return ItemStack.EMPTY;
         ItemStack extracted = network.extractItem(item, count, IComparer.COMPARE_NBT, simulate ? Action.SIMULATE : Action.PERFORM);
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/PlayerDetectorBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/PlayerDetectorBlock.java
index 967f3bf6e..2f1e6c9d6 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/PlayerDetectorBlock.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/PlayerDetectorBlock.java
@@ -4,7 +4,7 @@
 import de.srendi.advancedperipherals.common.blocks.base.APBlockEntityBlock;
 import de.srendi.advancedperipherals.common.blocks.blockentities.PlayerDetectorEntity;
 import de.srendi.advancedperipherals.common.configuration.APConfig;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
 import net.minecraft.core.BlockPos;
 import net.minecraft.world.InteractionHand;
 import net.minecraft.world.InteractionResult;
@@ -18,13 +18,13 @@
 public class PlayerDetectorBlock extends APBlockEntityBlock {
 
     public PlayerDetectorBlock() {
-        super(BlockEntityTypes.PLAYER_DETECTOR, true);
+        super(APBlockEntityTypes.PLAYER_DETECTOR, true);
     }
 
     @NotNull
     @Override
     public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) {
-        return BlockEntityTypes.PLAYER_DETECTOR.get().create(pos, state);
+        return APBlockEntityTypes.PLAYER_DETECTOR.get().create(pos, state);
     }
 
     @Override
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java
index 83fb50abe..5d9475439 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/RedstoneIntegratorBlock.java
@@ -3,8 +3,8 @@
 import dan200.computercraft.shared.util.RedstoneUtil;
 import de.srendi.advancedperipherals.common.blocks.base.BaseBlockEntityBlock;
 import de.srendi.advancedperipherals.common.blocks.blockentities.RedstoneIntegratorEntity;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
-import de.srendi.advancedperipherals.common.setup.Blocks;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlocks;
 import net.minecraft.core.BlockPos;
 import net.minecraft.core.Direction;
 import net.minecraft.world.level.BlockGetter;
@@ -18,13 +18,13 @@
 public class RedstoneIntegratorBlock extends BaseBlockEntityBlock {
 
     public RedstoneIntegratorBlock() {
-        super(false, Properties.of(Material.METAL).isRedstoneConductor(Blocks::never));
+        super(false, Properties.of(Material.METAL).isRedstoneConductor(APBlocks::never));
     }
 
     @NotNull
     @Override
     public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) {
-        return BlockEntityTypes.REDSTONE_INTEGRATOR.get().create(pos, state);
+        return APBlockEntityTypes.REDSTONE_INTEGRATOR.get().create(pos, state);
     }
 
     @Override
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java
index 85a363f65..d0699eb82 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java
@@ -95,7 +95,8 @@ public MenuProvider getMenuProvider(@NotNull BlockState pState, Level pLevel, @N
         return menuProvider;
     }
 
-    public @NotNull RenderShape getRenderShape(@NotNull BlockState state) {
+    @NotNull
+    public RenderShape getRenderShape(@NotNull BlockState state) {
         return RenderShape.MODEL;
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryBlock.java
index 3d118525b..5bfa6325c 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryBlock.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryBlock.java
@@ -10,10 +10,8 @@
  * Used to assign a container to a TileEntity
  *
  * @param  The container related to this inventory
- * @deprecated Will be merged with the APBlock in 0.9
  */
 
-@Deprecated(since = "0.7.16", forRemoval = true)
 public interface IInventoryBlock {
 
     Component getDisplayName();
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java
index 2d5a17ba6..654fefeb3 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java
@@ -37,7 +37,7 @@
 import java.util.Collections;
 
 public abstract class PeripheralBlockEntity> extends BaseContainerBlockEntity implements WorldlyContainer, MenuProvider, IPeripheralTileEntity {
-    // TODO: move inventory logic to another tile entity!
+
     private static final String PERIPHERAL_SETTINGS_KEY = "peripheralSettings";
     protected CompoundTag peripheralSettings;
     protected NonNullList items;
@@ -47,7 +47,7 @@ public abstract class PeripheralBlockEntity> extends
     private LazyOptional fluidHandler;
     private LazyOptional peripheralCap;
 
-    public PeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) {
+    protected PeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) {
         super(tileEntityTypeIn, pos, state);
         if (this instanceof IInventoryBlock inventoryBlock) {
             items = NonNullList.withSize(inventoryBlock.getInvSize(), ItemStack.EMPTY);
@@ -116,6 +116,11 @@ public Iterable getConnectedComputers() {
         return peripheral.getConnectedComputers();
     }
 
+    @Nullable
+    public T getPeripheral() {
+        return peripheral;
+    }
+
     /*@Override
     public ITextComponent getDisplayName() {
         return this instanceof IInventoryBlock ? ((IInventoryBlock) this).getDisplayName() : null;
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java
index bace719d3..21a25c070 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java
@@ -19,7 +19,7 @@ public abstract class PoweredPeripheralBlockEntity>
 
     private final LazyOptional lazyEnergyStorage;
 
-    public PoweredPeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) {
+    protected PoweredPeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) {
         super(tileEntityTypeIn, pos, state);
         if (APConfig.PERIPHERALS_CONFIG.enablePoweredPeripherals.get()) {
             lazyEnergyStorage = LazyOptional.of(() -> new EnergyStorage(this.getMaxEnergyStored()));
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/BlockReaderEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/BlockReaderEntity.java
index db48c0460..33e7b128f 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/BlockReaderEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/BlockReaderEntity.java
@@ -2,7 +2,7 @@
 
 import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.BlockReaderPeripheral;
 import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
 import net.minecraft.core.BlockPos;
 import net.minecraft.world.level.block.state.BlockState;
 import org.jetbrains.annotations.NotNull;
@@ -10,7 +10,7 @@
 public class BlockReaderEntity extends PeripheralBlockEntity {
 
     public BlockReaderEntity(BlockPos pos, BlockState state) {
-        super(BlockEntityTypes.BLOCK_READER.get(), pos, state);
+        super(APBlockEntityTypes.BLOCK_READER.get(), pos, state);
     }
 
     @NotNull
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java
index 118611259..594645f0c 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java
@@ -2,7 +2,7 @@
 
 import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.ChatBoxPeripheral;
 import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
 import net.minecraft.core.BlockPos;
 import net.minecraft.world.level.Level;
 import net.minecraft.world.level.block.entity.BlockEntity;
@@ -11,8 +11,9 @@
 import org.jetbrains.annotations.NotNull;
 
 public class ChatBoxEntity extends PeripheralBlockEntity {
+
     public ChatBoxEntity(BlockPos pos, BlockState state) {
-        super(BlockEntityTypes.CHAT_BOX.get(), pos, state);
+        super(APBlockEntityTypes.CHAT_BOX.get(), pos, state);
     }
 
     @NotNull
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ColonyIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ColonyIntegratorEntity.java
index 8c6504791..27e9d5e1f 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ColonyIntegratorEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ColonyIntegratorEntity.java
@@ -2,7 +2,7 @@
 
 import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.ColonyPeripheral;
 import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
 import net.minecraft.core.BlockPos;
 import net.minecraft.world.level.block.state.BlockState;
 import org.jetbrains.annotations.NotNull;
@@ -10,7 +10,7 @@
 public class ColonyIntegratorEntity extends PeripheralBlockEntity {
 
     public ColonyIntegratorEntity(BlockPos pos, BlockState state) {
-        super(BlockEntityTypes.COLONY_INTEGRATOR.get(), pos, state);
+        super(APBlockEntityTypes.COLONY_INTEGRATOR.get(), pos, state);
     }
 
     @NotNull
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java
new file mode 100644
index 000000000..94c8b11d9
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java
@@ -0,0 +1,164 @@
+package de.srendi.advancedperipherals.common.blocks.blockentities;
+
+import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.DistanceDetectorPeripheral;
+import de.srendi.advancedperipherals.common.blocks.base.BaseBlock;
+import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity;
+import de.srendi.advancedperipherals.common.configuration.APConfig;
+import de.srendi.advancedperipherals.common.network.PacketHandler;
+import de.srendi.advancedperipherals.common.network.toclient.DistanceDetectorSyncPacket;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
+import de.srendi.advancedperipherals.common.util.HitResultUtil;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Direction;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.SlabBlock;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.level.block.state.properties.SlabType;
+import net.minecraft.world.phys.*;
+import org.jetbrains.annotations.NotNull;
+
+public class DistanceDetectorEntity extends PeripheralBlockEntity {
+
+    private double maxRange = APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get();
+    private float currentDistance = 0;
+    private boolean showLaser = true;
+    private boolean shouldCalculatePeriodically = false;
+    private boolean ignoreTransparent = true;
+    private DistanceDetectorPeripheral.DetectionType detectionType = DistanceDetectorPeripheral.DetectionType.BOTH;
+
+    public DistanceDetectorEntity(BlockPos pos, BlockState state) {
+        super(APBlockEntityTypes.DISTANCE_DETECTOR.get(), pos, state);
+    }
+
+    @NotNull
+    @Override
+    protected DistanceDetectorPeripheral createPeripheral() {
+        return new DistanceDetectorPeripheral(this);
+    }
+
+    public void setShowLaser(boolean showLaser) {
+        if (this.showLaser != showLaser)
+            PacketHandler.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, showLaser));
+        this.showLaser = showLaser;
+    }
+
+    public void setCurrentDistance(float currentDistance) {
+        if (this.currentDistance != currentDistance)
+            PacketHandler.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, showLaser));
+        this.currentDistance = currentDistance;
+    }
+
+    public void setShouldCalculatePeriodically(boolean shouldCalculatePeriodically) {
+        this.shouldCalculatePeriodically = shouldCalculatePeriodically;
+    }
+
+    public double getMaxDistance() {
+        return maxRange;
+    }
+
+    public void setMaxRange(double maxRange) {
+        this.maxRange = maxRange;
+    }
+
+    public float getCurrentDistance() {
+        return currentDistance;
+    }
+
+    public boolean getLaserVisibility() {
+        return showLaser;
+    }
+
+    public boolean shouldCalculatePeriodically() {
+        return shouldCalculatePeriodically;
+    }
+
+    public boolean ignoreTransparent() {
+        return ignoreTransparent;
+    }
+
+    public void setIgnoreTransparent(boolean ignoreTransparent) {
+        this.ignoreTransparent = ignoreTransparent;
+    }
+
+    public DistanceDetectorPeripheral.DetectionType getDetectionType() {
+        return detectionType;
+    }
+
+    public void setDetectionType(DistanceDetectorPeripheral.DetectionType detectionType) {
+        this.detectionType = detectionType;
+    }
+
+    @Override
+    public  void handleTick(Level level, BlockState state, BlockEntityType type) {
+        if (level.getGameTime() % APConfig.PERIPHERALS_CONFIG.distanceDetectorUpdateRate.get() == 0 && shouldCalculatePeriodically) {
+            // We calculate the distance every 2 ticks, so we do not have to run the getDistance function of the peripheral
+            // on the main thread which prevents the 1 tick yield time of the function.
+            // The calculateDistance function is not thread safe, so we have to run it on the main thread.
+            // It should be okay to run that function every 2 ticks, calculating it does not take too much time.
+            calculateDistance();
+        }
+    }
+
+    @Override
+    public AABB getRenderBoundingBox() {
+        Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front();
+        return AABB.ofSize(Vec3.atCenterOf(getBlockPos()), direction.getStepX() * currentDistance + 1, direction.getStepY() * currentDistance + 1, direction.getStepZ() * currentDistance + 1)
+                .move(direction.getStepX() * currentDistance / 2, direction.getStepY() * currentDistance / 2, direction.getStepZ() * currentDistance / 2);
+    }
+
+    public double calculateDistance() {
+        Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front();
+        Vec3 center = Vec3.atCenterOf(getBlockPos());
+        Vec3 from = center.add(direction.getStepX() * 0.501, direction.getStepY() * 0.501, direction.getStepZ() * 0.501);
+        Vec3 to = from.add(direction.getStepX() * maxRange, direction.getStepY() * maxRange, direction.getStepZ() * maxRange);
+        HitResult result = getResult(to, from);
+
+        float distance = calculateDistance(result, center, direction);
+        setCurrentDistance(distance);
+        return distance;
+    }
+
+    private HitResult getResult(Vec3 to, Vec3 from) {
+        if (detectionType == DistanceDetectorPeripheral.DetectionType.ENTITIES)
+            return HitResultUtil.getEntityHitResult(to, from, getLevel());
+        if (detectionType == DistanceDetectorPeripheral.DetectionType.BLOCK)
+            return HitResultUtil.getBlockHitResult(to, from, getLevel(), ignoreTransparent);
+        return HitResultUtil.getHitResult(to, from, getLevel(), ignoreTransparent);
+    }
+
+    private float calculateDistance(HitResult result, Vec3 center, Direction direction) {
+        float distance = 0;
+        if (result.getType() != HitResult.Type.MISS) {
+            if (result instanceof BlockHitResult blockHitResult) {
+                BlockState resultBlock = getLevel().getBlockState(blockHitResult.getBlockPos());
+                distance = distManhattan(Vec3.atCenterOf(blockHitResult.getBlockPos()), center);
+
+                distance = amendDistance(resultBlock, direction, distance);
+            }
+            if (result instanceof EntityHitResult entityHitResult) {
+                distance = distManhattan(entityHitResult.getLocation(), center);
+            }
+        }
+        return distance;
+    }
+
+    private float amendDistance(BlockState resultBlock, Direction direction, float distance) {
+        if (resultBlock.getBlock() instanceof SlabBlock && direction.getAxis() == Direction.Axis.Y) {
+            SlabType type = resultBlock.getValue(SlabBlock.TYPE);
+            if (type == SlabType.TOP && direction == Direction.UP)
+                return distance + 0.5f;
+            if (type == SlabType.BOTTOM && direction == Direction.DOWN)
+                return distance - 0.5f;
+        }
+        return distance;
+    }
+
+    private float distManhattan(Vec3 from, Vec3 to) {
+        float f = (float) Math.abs(from.x - to.x);
+        float f1 = (float) Math.abs(from.y - to.y);
+        float f2 = (float) Math.abs(from.z - to.z);
+        return f + f1 + f2;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java
index f8db556aa..a15e914d2 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java
@@ -1,15 +1,15 @@
 package de.srendi.advancedperipherals.common.blocks.blockentities;
 
 import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.EnergyDetectorPeripheral;
+import de.srendi.advancedperipherals.common.blocks.base.BaseBlock;
 import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity;
 import de.srendi.advancedperipherals.common.configuration.APConfig;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
 import de.srendi.advancedperipherals.common.util.EnergyStorageProxy;
 import net.minecraft.core.BlockPos;
 import net.minecraft.core.Direction;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.world.level.Level;
-import net.minecraft.world.level.block.JigsawBlock;
 import net.minecraft.world.level.block.entity.BlockEntity;
 import net.minecraft.world.level.block.entity.BlockEntityType;
 import net.minecraft.world.level.block.state.BlockState;
@@ -25,20 +25,21 @@
 
 public class EnergyDetectorEntity extends PeripheralBlockEntity {
 
-    //a zero size, zero transfer energy storage to ensure that cables connect
-    private final EnergyStorage zeroStorage = new EnergyStorage(0, 0, 0);
     public int transferRate = 0;
     //storageProxy that will forward the energy to the output but limit it to maxTransferRate
-    public EnergyStorageProxy storageProxy = new EnergyStorageProxy(this, APConfig.PERIPHERALS_CONFIG.energyDetectorMaxFlow.get());
-    LazyOptional energyStorageCap = LazyOptional.of(() -> storageProxy);
-    Direction energyInDirection = Direction.NORTH;
-    Direction energyOutDirection = Direction.SOUTH;
-    LazyOptional zeroStorageCap = LazyOptional.of(() -> zeroStorage);
+    public final EnergyStorageProxy storageProxy = new EnergyStorageProxy(this, APConfig.PERIPHERALS_CONFIG.energyDetectorMaxFlow.get());
+    //a zero size, zero transfer energy storage to ensure that cables connect
+    private final EnergyStorage zeroStorage = new EnergyStorage(0, 0, 0);
+    private final LazyOptional energyStorageCap = LazyOptional.of(() -> storageProxy);
+    private final LazyOptional zeroStorageCap = LazyOptional.of(() -> zeroStorage);
     @NotNull
     private Optional outReceivingStorage = Optional.empty();
 
+    private Direction energyInDirection = Direction.NORTH;
+    private Direction energyOutDirection = Direction.SOUTH;
+
     public EnergyDetectorEntity(BlockPos pos, BlockState state) {
-        super(BlockEntityTypes.ENERGY_DETECTOR.get(), pos, state);
+        super(APBlockEntityTypes.ENERGY_DETECTOR.get(), pos, state);
     }
 
     @NotNull
@@ -50,8 +51,8 @@ protected EnergyDetectorPeripheral createPeripheral() {
     @NotNull
     @Override
     public  LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) {
-        energyInDirection = getBlockState().getValue(JigsawBlock.ORIENTATION).front();
-        energyOutDirection = getBlockState().getValue(JigsawBlock.ORIENTATION).front().getOpposite();
+        energyInDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front();
+        energyOutDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front().getOpposite();
         if (cap == ForgeCapabilities.ENERGY) {
             if (direction == energyInDirection) {
                 return energyStorageCap.cast();
@@ -78,19 +79,19 @@ public  void handleTick(Level level, BlockState state, Bl
     }
 
     @Override
-    public void deserializeNBT(CompoundTag nbt) {
+    public void load(CompoundTag nbt) {
         storageProxy.setMaxTransferRate(nbt.getInt("rateLimit"));
-        super.deserializeNBT(nbt);
+        super.load(nbt);
     }
 
     public void invalidateStorages() {
         outReceivingStorage = Optional.empty();
     }
 
-    // returns the cached output storage of the receiving block or refetches it if it has been invalidated
+    // returns the cached output storage of the receiving block or fetches it if it has been invalidated
     @NotNull
     public Optional getOutputStorage() {
-        // the documentation says that the value of the LazyOptional should be cached locally and invallidated using addListener
+        // the documentation says that the value of the LazyOptional should be cached locally and invalidated using addListener
         if (outReceivingStorage.isEmpty()) {
             BlockEntity teOut = level.getBlockEntity(worldPosition.relative(energyOutDirection));
             if (teOut == null) {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnvironmentDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnvironmentDetectorEntity.java
index 64a4527cc..681ed938e 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnvironmentDetectorEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnvironmentDetectorEntity.java
@@ -3,7 +3,7 @@
 import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.EnvironmentDetectorPeripheral;
 import de.srendi.advancedperipherals.common.blocks.base.PoweredPeripheralBlockEntity;
 import de.srendi.advancedperipherals.common.configuration.APConfig;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
 import net.minecraft.core.BlockPos;
 import net.minecraft.world.level.block.state.BlockState;
 import org.jetbrains.annotations.NotNull;
@@ -11,7 +11,7 @@
 public class EnvironmentDetectorEntity extends PoweredPeripheralBlockEntity {
 
     public EnvironmentDetectorEntity(BlockPos pos, BlockState state) {
-        super(BlockEntityTypes.ENVIRONMENT_DETECTOR.get(), pos, state);
+        super(APBlockEntityTypes.ENVIRONMENT_DETECTOR.get(), pos, state);
     }
 
     @Override
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java
new file mode 100644
index 000000000..3a808db82
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java
@@ -0,0 +1,106 @@
+package de.srendi.advancedperipherals.common.blocks.blockentities;
+
+import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.FluidDetectorPeripheral;
+import de.srendi.advancedperipherals.common.blocks.base.BaseBlock;
+import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity;
+import de.srendi.advancedperipherals.common.configuration.APConfig;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
+import de.srendi.advancedperipherals.common.util.FluidStorageProxy;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Direction;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraftforge.common.capabilities.Capability;
+import net.minecraftforge.common.capabilities.ForgeCapabilities;
+import net.minecraftforge.common.util.LazyOptional;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.capability.IFluidHandler;
+import net.minecraftforge.fluids.capability.templates.FluidTank;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Optional;
+
+public class FluidDetectorEntity extends PeripheralBlockEntity {
+
+    public int transferRate = 0;
+    public FluidStack lastFlowedLiquid = FluidStack.EMPTY;
+
+    //storageProxy that will forward the fluid to the output but limit it to maxTransferRate
+    public final FluidStorageProxy storageProxy = new FluidStorageProxy(this, APConfig.PERIPHERALS_CONFIG.fluidDetectorMaxFlow.get());
+    //a zero size, zero transfer fluid storage to ensure that cables connect
+    private final FluidTank zeroStorage = new FluidTank(0);
+    private final LazyOptional fluidStorageCap = LazyOptional.of(() -> storageProxy);
+    private final LazyOptional zeroStorageCap = LazyOptional.of(() -> zeroStorage);
+    private Optional outReceivingStorage = Optional.empty();
+
+    private Direction fluidInDetection = Direction.NORTH;
+    private Direction fluidOutDirection = Direction.SOUTH;
+
+    public FluidDetectorEntity(BlockPos pos, BlockState state) {
+        super(APBlockEntityTypes.FLUID_DETECTOR.get(), pos, state);
+    }
+
+    @NotNull
+    @Override
+    protected FluidDetectorPeripheral createPeripheral() {
+        return new FluidDetectorPeripheral(this);
+    }
+
+    @NotNull
+    @Override
+    public  LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) {
+        fluidInDetection = getBlockState().getValue(BaseBlock.ORIENTATION).front();
+        fluidOutDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front().getOpposite();
+        if (cap == ForgeCapabilities.FLUID_HANDLER) {
+            if (direction == fluidInDetection) {
+                return fluidStorageCap.cast();
+            } else if (direction == fluidOutDirection) {
+                return zeroStorageCap.cast();
+            }
+        }
+        return super.getCapability(cap, direction);
+    }
+
+    @Override
+    public void saveAdditional(@NotNull CompoundTag compound) {
+        super.saveAdditional(compound);
+        compound.putInt("rateLimit", storageProxy.getMaxTransferRate());
+    }
+
+    @Override
+    public  void handleTick(Level level, BlockState state, BlockEntityType type) {
+        if (!level.isClientSide) {
+            // this handles the rare edge case that receiveFluid is called multiple times in one tick
+            transferRate = storageProxy.getTransferedInThisTick();
+            storageProxy.resetTransferedInThisTick();
+        }
+    }
+
+    @Override
+    public void load(CompoundTag nbt) {
+        storageProxy.setMaxTransferRate(nbt.getInt("rateLimit"));
+        super.load(nbt);
+    }
+
+    // returns the cached output storage of the receiving block or fetches it if it has been invalidated
+    @NotNull
+    public Optional getOutputStorage() {
+        // the documentation says that the value of the LazyOptional should be cached locally and invalidated using addListener
+        if (outReceivingStorage.isEmpty()) {
+            BlockEntity teOut = level.getBlockEntity(worldPosition.relative(fluidOutDirection));
+            if (teOut == null) {
+                return Optional.empty();
+            }
+            LazyOptional lazyOptionalOutStorage = teOut.getCapability(ForgeCapabilities.FLUID_HANDLER, fluidOutDirection.getOpposite());
+            outReceivingStorage = lazyOptionalOutStorage.resolve();
+            lazyOptionalOutStorage.addListener(l -> {
+                outReceivingStorage = Optional.empty();
+            });
+        }
+        return outReceivingStorage;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java
new file mode 100644
index 000000000..23f7dda1c
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java
@@ -0,0 +1,106 @@
+package de.srendi.advancedperipherals.common.blocks.blockentities;
+
+import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.GasDetectorPeripheral;
+import de.srendi.advancedperipherals.common.addons.mekanism.MekanismCapabilities;
+import de.srendi.advancedperipherals.common.blocks.base.BaseBlock;
+import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity;
+import de.srendi.advancedperipherals.common.configuration.APConfig;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
+import de.srendi.advancedperipherals.common.util.GasStorageProxy;
+import de.srendi.advancedperipherals.common.util.ZeroGasTank;
+import mekanism.api.chemical.gas.GasStack;
+import mekanism.api.chemical.gas.IGasHandler;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Direction;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraftforge.common.capabilities.Capability;
+import net.minecraftforge.common.util.LazyOptional;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Optional;
+
+public class GasDetectorEntity extends PeripheralBlockEntity {
+
+    public int transferRate = 0;
+    public GasStack lastFlowedGas = GasStack.EMPTY;
+
+    //storageProxy that will forward the gas to the output but limit it to maxTransferRate
+    public final GasStorageProxy storageProxy = new GasStorageProxy(this, APConfig.PERIPHERALS_CONFIG.gasDetectorMaxFlow.get());
+    //a zero size, zero transfer gas storage to ensure that cables connect
+    private final IGasHandler zeroStorage = new ZeroGasTank();
+    private final LazyOptional gasStorageCap = LazyOptional.of(() -> storageProxy);
+    private final LazyOptional zeroStorageCap = LazyOptional.of(() -> zeroStorage);
+    private Optional outReceivingStorage = Optional.empty();
+
+    private Direction gasInDirection = Direction.NORTH;
+    private Direction gasOutDirection = Direction.SOUTH;
+
+    public GasDetectorEntity(BlockPos pos, BlockState state) {
+        super(APBlockEntityTypes.GAS_DETECTOR.get(), pos, state);
+    }
+
+    @NotNull
+    @Override
+    protected GasDetectorPeripheral createPeripheral() {
+        return new GasDetectorPeripheral(this);
+    }
+
+    @NotNull
+    @Override
+    public  LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) {
+        gasInDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front();
+        gasOutDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front().getOpposite();
+        if (cap == MekanismCapabilities.GAS_HANDLER) {
+            if (direction == gasInDirection) {
+                return gasStorageCap.cast();
+            } else if (direction == gasOutDirection) {
+                return zeroStorageCap.cast();
+            }
+        }
+        return super.getCapability(cap, direction);
+    }
+
+    @Override
+    public void saveAdditional(@NotNull CompoundTag compound) {
+        super.saveAdditional(compound);
+        compound.putInt("rateLimit", storageProxy.getMaxTransferRate());
+    }
+
+    @Override
+    public  void handleTick(Level level, BlockState state, BlockEntityType type) {
+        if (!level.isClientSide) {
+            // this handles the rare edge case that receiveGas is called multiple times in one tick
+            transferRate = storageProxy.getTransferedInThisTick();
+            storageProxy.resetTransferedInThisTick();
+        }
+    }
+
+    @Override
+    public void load(CompoundTag nbt) {
+        storageProxy.setMaxTransferRate(nbt.getInt("rateLimit"));
+        super.load(nbt);
+    }
+
+    // returns the cached output storage of the receiving block or fetches it if it has been invalidated
+    @NotNull
+    public Optional getOutputStorage() {
+        // the documentation says that the value of the LazyOptional should be cached locally and invalidated using addListener
+        if (outReceivingStorage.isEmpty()) {
+            BlockEntity teOut = level.getBlockEntity(worldPosition.relative(gasOutDirection));
+            if (teOut == null) {
+                return Optional.empty();
+            }
+            LazyOptional lazyOptionalOutStorage = teOut.getCapability(MekanismCapabilities.GAS_HANDLER, gasOutDirection.getOpposite());
+            outReceivingStorage = lazyOptionalOutStorage.resolve();
+            lazyOptionalOutStorage.addListener(l -> {
+                outReceivingStorage = Optional.empty();
+            });
+        }
+        return outReceivingStorage;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GeoScannerEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GeoScannerEntity.java
index 225541a4d..56eab8959 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GeoScannerEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GeoScannerEntity.java
@@ -3,7 +3,7 @@
 import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.GeoScannerPeripheral;
 import de.srendi.advancedperipherals.common.blocks.base.PoweredPeripheralBlockEntity;
 import de.srendi.advancedperipherals.common.configuration.APConfig;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
 import net.minecraft.core.BlockPos;
 import net.minecraft.world.level.block.state.BlockState;
 import org.jetbrains.annotations.NotNull;
@@ -11,7 +11,7 @@
 public class GeoScannerEntity extends PoweredPeripheralBlockEntity {
 
     public GeoScannerEntity(BlockPos pos, BlockState state) {
-        super(BlockEntityTypes.GEO_SCANNER.get(), pos, state);
+        super(APBlockEntityTypes.GEO_SCANNER.get(), pos, state);
     }
 
     @Override
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java
index c973be0ae..02de8ae91 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java
@@ -5,7 +5,7 @@
 import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity;
 import de.srendi.advancedperipherals.common.container.InventoryManagerContainer;
 import de.srendi.advancedperipherals.common.items.MemoryCardItem;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
 import net.minecraft.core.BlockPos;
 import net.minecraft.core.Direction;
 import net.minecraft.nbt.CompoundTag;
@@ -26,7 +26,7 @@ public class InventoryManagerEntity extends PeripheralBlockEntity im
     private final IManagedGridNode mainNode = GridHelper.createManagedNode(this, MeBridgeEntityListener.INSTANCE);
 
     public MeBridgeEntity(BlockPos pos, BlockState state) {
-        super(BlockEntityTypes.ME_BRIDGE.get(), pos, state);
+        super(APBlockEntityTypes.ME_BRIDGE.get(), pos, state);
     }
 
     @NotNull
@@ -50,7 +50,7 @@ public  void handleTick(Level level, BlockState state, Bl
 
                 mainNode.setFlags(GridFlags.REQUIRE_CHANNEL);
                 mainNode.setIdlePowerUsage(APConfig.PERIPHERALS_CONFIG.meConsumption.get());
-                mainNode.setVisualRepresentation(new ItemStack(Blocks.ME_BRIDGE.get()));
+                mainNode.setVisualRepresentation(new ItemStack(APBlocks.ME_BRIDGE.get()));
                 mainNode.setInWorldNode(true);
                 mainNode.create(level, getBlockPos());
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/NBTStorageEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/NBTStorageEntity.java
index 707fec188..0b56fedc1 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/NBTStorageEntity.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/NBTStorageEntity.java
@@ -2,7 +2,7 @@
 
 import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.NBTStoragePeripheral;
 import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity;
-import de.srendi.advancedperipherals.common.setup.BlockEntityTypes;
+import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes;
 import net.minecraft.core.BlockPos;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.world.level.block.state.BlockState;
@@ -13,7 +13,7 @@ public class NBTStorageEntity extends PeripheralBlockEntity i
     private LazyOptional peripheralCap;
 
     public RsBridgeEntity(BlockPos pos, BlockState state) {
-        super(BlockEntityTypes.RS_BRIDGE.get(), pos, state, SPEC);
+        super(APBlockEntityTypes.RS_BRIDGE.get(), pos, state, SPEC);
         peripheralSettings = new CompoundTag();
     }
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java b/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java
index 858494f40..8de5e7386 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java
@@ -46,8 +46,8 @@ public static void register(RegisterCommandsEvent event) {
                 .executes(APCommands::safeExecute))
             .build();
         event.getDispatcher().register(Commands.literal(ROOT_LITERAL)
-            .then(Commands.literal("getHashItem").executes(context -> getHashItem(context.getSource())))
-            .then(Commands.literal(FORCELOAD_LITERAL)
+                .then(Commands.literal("getHashItem")
+                        .executes(context -> getHashItem(context.getSource()))).then(Commands.literal(FORCELOAD_LITERAL)
                 .executes(context -> forceloadHelp(context.getSource()))
                 .then(Commands.literal("help")
                     .executes(context -> forceloadHelp(context.getSource())))
diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java
index 9ebf6a61d..3c4aa971b 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java
@@ -33,7 +33,6 @@ public class GeneralConfig implements IAPConfig {
         configSpec = builder.build();
     }
 
-
     @Override
     public ForgeConfigSpec getConfigSpec() {
         return configSpec;
diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java
index 5a3a0d234..8ed5cd8ba 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java
@@ -44,6 +44,7 @@ public class PeripheralsConfig implements IAPConfig {
 
     // Chunky turtle
     public final ForgeConfigSpec.IntValue chunkLoadValidTime;
+
     public final ForgeConfigSpec.IntValue chunkyTurtleRadius;
     public final ForgeConfigSpec.BooleanValue enableChunkyTurtle;
 
@@ -88,13 +89,13 @@ public class PeripheralsConfig implements IAPConfig {
 
     // Compass turtle
     public final ForgeConfigSpec.BooleanValue enableCompassTurtle;
+    public final ForgeConfigSpec.IntValue compassAccurePlaceRadius;
+    public final ForgeConfigSpec.IntValue compassAccurePlaceFreeRadius;
 
-    //Compass turtle
+    // Distance Detector
     public final ForgeConfigSpec.BooleanValue enableDistanceDetector;
     public final ForgeConfigSpec.DoubleValue distanceDetectorRange;
     public final ForgeConfigSpec.IntValue distanceDetectorUpdateRate;
-    public final ForgeConfigSpec.IntValue compassAccurePlaceRadius;
-    public final ForgeConfigSpec.IntValue compassAccurePlaceFreeRadius;
 
     // Powered Peripherals
     public final ForgeConfigSpec.BooleanValue enablePoweredPeripherals;
diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerContainer.java
index 4ccc859cf..b4116aa2c 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerContainer.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/container/InventoryManagerContainer.java
@@ -3,8 +3,8 @@
 import de.srendi.advancedperipherals.common.container.base.BaseContainer;
 import de.srendi.advancedperipherals.common.container.base.SlotCondition;
 import de.srendi.advancedperipherals.common.container.base.SlotInputHandler;
-import de.srendi.advancedperipherals.common.setup.ContainerTypes;
-import de.srendi.advancedperipherals.common.setup.Items;
+import de.srendi.advancedperipherals.common.setup.APContainerTypes;
+import de.srendi.advancedperipherals.common.setup.APItems;
 import net.minecraft.core.BlockPos;
 import net.minecraft.world.entity.player.Inventory;
 import net.minecraft.world.entity.player.Player;
@@ -17,11 +17,11 @@
 public class InventoryManagerContainer extends BaseContainer {
 
     public InventoryManagerContainer(int id, Inventory inventory, BlockPos pos, Level level) {
-        super(ContainerTypes.INVENTORY_MANAGER_CONTAINER.get(), id, inventory, pos, level);
+        super(APContainerTypes.INVENTORY_MANAGER_CONTAINER.get(), id, inventory, pos, level);
         layoutPlayerInventorySlots(7, 84);
         if (tileEntity != null) {
             tileEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).ifPresent(handler -> {
-                addSlot(new SlotInputHandler(handler, 0, 79, 29, new SlotCondition().setNeededItem(Items.MEMORY_CARD.get()))); //Input
+                addSlot(new SlotInputHandler(handler, 0, 79, 29, new SlotCondition().setNeededItem(APItems.MEMORY_CARD.get()))); //Input
             });
         }
     }
@@ -44,7 +44,7 @@ public ItemStack quickMoveStack(@NotNull Player player, int index) {
                     return ItemStack.EMPTY;
                 }
             } else if (index <= 35) {
-                if (itemstack1.getItem().equals(Items.MEMORY_CARD.get())) {
+                if (itemstack1.getItem().equals(APItems.MEMORY_CARD.get())) {
                     if (!this.moveItemStackTo(itemstack1, 36, 37, true)) {
                         return ItemStack.EMPTY;
                     }
@@ -68,4 +68,5 @@ public ItemStack quickMoveStack(@NotNull Player player, int index) {
 
         return itemstack;
     }
+
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java b/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
index 522bfa0eb..fcecc6d1c 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/container/SmartGlassesContainer.java
@@ -26,7 +26,7 @@ public class SmartGlassesContainer extends ContainerComputerBase {
     public SmartGlassesContainer(int id, Predicate canUse, ServerComputer computer, Inventory playerInventory, IItemHandler inventory, ComputerContainerData data) {
         super(APContainerTypes.SMART_GLASSES_CONTAINER.get(), id, canUse, ComputerFamily.ADVANCED, computer, data);
 
-        /**
+        /*
          * Do player inventory before peripheral slots then quick move won't mixup
          */
 
@@ -56,6 +56,19 @@ public SmartGlassesContainer(int id, Predicate canUse, ServerComputer co
         addSlot(new SmartGlassesSlot(inventory, 8, 240, 166, SlotType.MODULES));
         addSlot(new SmartGlassesSlot(inventory, 9, 222, 184, SlotType.MODULES));
         addSlot(new SmartGlassesSlot(inventory, 10, 240, 184, SlotType.MODULES));
+
+        // Player inventory
+        for (var y = 0; y < 3; y++) {
+            for (var x = 0; x < 9; x++) {
+                addSlot(new Slot(playerInventory, x + y * 9 + 9, PLAYER_START_X + x * 18, PLAYER_START_Y + 1 + y * 18));
+            }
+        }
+
+        // Player hotbar
+        for (var x = 0; x < 9; x++) {
+            addSlot(new Slot(playerInventory, x, PLAYER_START_X + x * 18, PLAYER_START_Y + 3 * 18 + 5));
+        }
+
     }
 
     public SmartGlassesContainer(int id, Predicate predicate, ServerComputer computer, ComputerContainerData data, Inventory player, ItemStack glasses) {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/base/SlotCondition.java b/src/main/java/de/srendi/advancedperipherals/common/container/base/SlotCondition.java
index d1fae341c..1adcfcbc3 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/container/base/SlotCondition.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/container/base/SlotCondition.java
@@ -12,9 +12,9 @@
  */
 public class SlotCondition {
 
-    public List> neededTags = new ArrayList<>();
+    private List> neededTags = new ArrayList<>();
 
-    public List neededItems = new ArrayList<>();
+    private List neededItems = new ArrayList<>();
 
     /**
      * Sets the valid tags for the item
@@ -75,9 +75,9 @@ public boolean isValid(ItemStack stack) {
                 if (stack.getTags().noneMatch(tag::equals)) valid = false;
             }
         }
-        if (!neededItems.isEmpty()) {
-            if (!neededItems.contains(stack.getItem())) valid = false;
-        }
+        if (!neededItems.isEmpty() && (!neededItems.contains(stack.getItem())))
+            valid = false;
+
         return valid;
     }
 
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockLootTables.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockLootTables.java
index 894a18ff3..f0c88c869 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockLootTables.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockLootTables.java
@@ -1,6 +1,6 @@
 package de.srendi.advancedperipherals.common.data;
 
-import de.srendi.advancedperipherals.common.setup.Registration;
+import de.srendi.advancedperipherals.common.setup.APRegistration;
 import net.minecraft.world.level.block.Block;
 import net.minecraftforge.registries.RegistryObject;
 import org.jetbrains.annotations.NotNull;
@@ -9,7 +9,7 @@ public class BlockLootTables extends net.minecraft.data.loot.BlockLoot {
 
     @Override
     protected void addTables() {
-        Registration.BLOCKS.getEntries().stream().map(RegistryObject::get).forEach(registeredBlock -> {
+        APRegistration.BLOCKS.getEntries().stream().map(RegistryObject::get).forEach(registeredBlock -> {
             //Allow blocks to transfer their name to the dropped block when broken
             this.add(registeredBlock, (block) -> this.createNameableBlockEntityTable(block));
         });
@@ -18,6 +18,6 @@ protected void addTables() {
     @NotNull
     @Override
     protected Iterable getKnownBlocks() {
-        return Registration.BLOCKS.getEntries().stream().map(RegistryObject::get)::iterator;
+        return APRegistration.BLOCKS.getEntries().stream().map(RegistryObject::get)::iterator;
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java
index e10cef2c4..ae80747a0 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/BlockStatesAndModelsProvider.java
@@ -59,7 +59,8 @@ private void peripheralBlock(Block block, ModelFile file) {
         getVariantBuilder(block).forAllStates(state -> {
             ConfiguredModel.Builder builder = ConfiguredModel.builder().modelFile(file);
             FrontAndTop orientation = state.getValue(BaseBlock.ORIENTATION);
-            int x = 0, y;
+            int x = 0;
+            int y;
             if (orientation.top().getAxis() == Direction.Axis.Y) {
                 y = (int) (orientation.front().toYRot() + 180) % 360;
             } else {
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java b/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java
index a97c83964..c7c8c015b 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/DataGenerators.java
@@ -1,7 +1,7 @@
 package de.srendi.advancedperipherals.common.data;
 
 import de.srendi.advancedperipherals.AdvancedPeripherals;
-import de.srendi.advancedperipherals.common.setup.Registration;
+import de.srendi.advancedperipherals.common.setup.APRegistration;
 import net.minecraft.data.DataGenerator;
 import net.minecraftforge.common.data.ExistingFileHelper;
 import net.minecraftforge.data.event.GatherDataEvent;
@@ -19,7 +19,7 @@ public static void genData(GatherDataEvent event) {
         DataGenerator generator = event.getGenerator();
         ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
 
-        generator.addProvider(event.includeServer(), new BlockTagsProvider(generator, existingFileHelper, Registration.BLOCKS));
+        generator.addProvider(event.includeServer(), new BlockTagsProvider(generator, existingFileHelper, APRegistration.BLOCKS));
         generator.addProvider(event.includeServer(), new RecipesProvider(generator));
         generator.addProvider(event.includeServer(), new BlockLootTablesProvider(generator));
         generator.addProvider(event.includeServer(), new TurtleUpgradesProvider(generator));
@@ -29,5 +29,4 @@ public static void genData(GatherDataEvent event) {
         generator.addProvider(event.includeServer(), new ItemTagsProvider(generator, existingFileHelper));
         generator.addProvider(event.includeClient(), new EnUsLanguageProvider(generator));
     }
-
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java
index 3ff16d31c..53cb3a4bc 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java
@@ -85,6 +85,7 @@ private void addTurtles() {
         addTurtle(CCRegistration.ID.ENVIRONMENT_TURTLE, "Environment");
         addTurtle(CCRegistration.ID.PLAYER_TURTLE, "Player Detector");
         addTurtle(CCRegistration.ID.GEOSCANNER_TURTLE, "Geo");
+        addTurtle(CCRegistration.ID.COMPASS_TURTLE, "Compass");
         addTurtle(CCRegistration.ID.WEAK_AUTOMATA, "Weak automata");
         addTurtle(CCRegistration.ID.HUSBANDRY_AUTOMATA, "Husbandry automata");
         addTurtle(CCRegistration.ID.END_AUTOMATA, "End automata");
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java
index bb78f341b..385b75679 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java
@@ -2,7 +2,7 @@
 
 import dan200.computercraft.api.pocket.PocketUpgradeDataProvider;
 import dan200.computercraft.api.pocket.PocketUpgradeSerialiser;
-import de.srendi.advancedperipherals.common.setup.Blocks;
+import de.srendi.advancedperipherals.common.setup.APBlocks;
 import de.srendi.advancedperipherals.common.setup.CCRegistration;
 import net.minecraft.data.DataGenerator;
 import org.jetbrains.annotations.NotNull;
@@ -17,10 +17,10 @@ public PocketUpgradesProvider(DataGenerator output) {
 
     @Override
     protected void addUpgrades(@NotNull Consumer>> addUpgrade) {
-        simpleWithCustomItem(CCRegistration.ID.CHATTY_POCKET, CCRegistration.CHAT_BOX_POCKET.get(), Blocks.CHAT_BOX.get().asItem()).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.PLAYER_POCKET, CCRegistration.PLAYER_DETECTOR_POCKET.get(), Blocks.PLAYER_DETECTOR.get().asItem()).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.ENVIRONMENT_POCKET, CCRegistration.ENVIRONMENT_POCKET.get(), Blocks.ENVIRONMENT_DETECTOR.get().asItem()).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.GEOSCANNER_POCKET, CCRegistration.GEO_SCANNER_POCKET.get(), Blocks.GEO_SCANNER.get().asItem()).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.COLONY_POCKET, CCRegistration.COLONY_POCKET.get(), Blocks.COLONY_INTEGRATOR.get().asItem()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.CHATTY_POCKET, CCRegistration.CHAT_BOX_POCKET.get(), APBlocks.CHAT_BOX.get().asItem()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.PLAYER_POCKET, CCRegistration.PLAYER_DETECTOR_POCKET.get(), APBlocks.PLAYER_DETECTOR.get().asItem()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.ENVIRONMENT_POCKET, CCRegistration.ENVIRONMENT_POCKET.get(), APBlocks.ENVIRONMENT_DETECTOR.get().asItem()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.GEOSCANNER_POCKET, CCRegistration.GEO_SCANNER_POCKET.get(), APBlocks.GEO_SCANNER.get().asItem()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.COLONY_POCKET, CCRegistration.COLONY_POCKET.get(), APBlocks.COLONY_INTEGRATOR.get().asItem()).add(addUpgrade);
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java
index d3ca346a4..f2f22b7ab 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java
@@ -1,7 +1,8 @@
 package de.srendi.advancedperipherals.common.data;
 
 import de.srendi.advancedperipherals.AdvancedPeripherals;
-import de.srendi.advancedperipherals.common.setup.Registration;
+
+import de.srendi.advancedperipherals.common.setup.APRegistration;
 import net.minecraft.data.DataGenerator;
 import net.minecraft.data.tags.PoiTypeTagsProvider;
 import net.minecraft.data.tags.TagsProvider;
@@ -14,7 +15,6 @@
 
 public class PoiTypeProvider extends PoiTypeTagsProvider {
 
-
     public PoiTypeProvider(DataGenerator pGenerator, @Nullable ExistingFileHelper existingFileHelper) {
         super(pGenerator, AdvancedPeripherals.MOD_ID, existingFileHelper);
     }
@@ -22,7 +22,7 @@ public PoiTypeProvider(DataGenerator pGenerator, @Nullable ExistingFileHelper ex
     @Override
     protected void addTags() {
         TagsProvider.TagAppender appender = tag(PoiTypeTags.ACQUIRABLE_JOB_SITE);
-        Registration.POI_TYPES.getEntries().stream().map(RegistryObject::getKey).forEach(appender::add);
+        APRegistration.POI_TYPES.getEntries().stream().map(RegistryObject::getKey).forEach(appender::add);
     }
 
     @NotNull
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java
index d361c3f8a..58321dbd2 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java
@@ -5,7 +5,8 @@
 import com.refinedmods.refinedstorage.RSItems;
 import dan200.computercraft.shared.Registry;
 import de.srendi.advancedperipherals.AdvancedPeripherals;
-import de.srendi.advancedperipherals.common.setup.Blocks;
+import de.srendi.advancedperipherals.common.setup.APBlocks;
+import de.srendi.advancedperipherals.common.setup.APItems;
 import de.srendi.advancedperipherals.common.util.RawValue;
 import net.minecraft.data.DataGenerator;
 import net.minecraft.data.recipes.*;
@@ -28,16 +29,52 @@
 
 public class RecipesProvider extends RecipeProvider implements IConditionBuilder {
 
-    private static final Block CASING = Blocks.PERIPHERAL_CASING.get();
+    private static final Block CASING = APBlocks.PERIPHERAL_CASING.get();
     private static final String HAS_ITEM = "has_item";
 
-    public RecipesProvider(DataGenerator pGenerator) {
-        super(pGenerator);
+    public RecipesProvider(DataGenerator packOutput) {
+        super(packOutput);
     }
 
     @Override
     protected void buildCraftingRecipes(@NotNull Consumer consumer) {
-        ShapedRecipeBuilder.shaped(Blocks.CHAT_BOX.get())
+        addShapeless(consumer);
+        addShaped(consumer);
+        addSmithing(consumer);
+    }
+
+    private void addShapeless(@NotNull Consumer consumer) {
+        ShapelessRecipeBuilder.shapeless(APItems.OVERPOWERED_WEAK_AUTOMATA_CORE.get())
+                .requires(APItems.WEAK_AUTOMATA_CORE.get())
+                .requires(Items.NETHER_STAR)
+                .unlockedBy(HAS_ITEM, has(APItems.WEAK_AUTOMATA_CORE.get()))
+                .save(consumer);
+
+        ShapelessRecipeBuilder.shapeless(APItems.OVERPOWERED_END_AUTOMATA_CORE.get())
+                .requires(APItems.END_AUTOMATA_CORE.get())
+                .requires(Items.NETHER_STAR)
+                .unlockedBy(HAS_ITEM, has(APItems.END_AUTOMATA_CORE.get()))
+                .save(consumer);
+
+        ShapelessRecipeBuilder.shapeless(APItems.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE.get())
+                .requires(APItems.HUSBANDRY_AUTOMATA_CORE.get())
+                .requires(Items.NETHER_STAR)
+                .unlockedBy(HAS_ITEM, has(APItems.HUSBANDRY_AUTOMATA_CORE.get()))
+                .save(consumer);
+    }
+
+    private void addShaped(@NotNull Consumer consumer) {
+        /*ShapedRecipeBuilder.shaped(APItems.AR_GOGGLES.get())
+                .define('E', Tags.Items.ENDER_PEARLS)
+                .define('S', Tags.Items.RODS_WOODEN)
+                .define('G', Tags.Items.GLASS_BLACK)
+                .pattern("GSG")
+                .pattern(" E ")
+                .unlockedBy(HAS_ITEM, has(Items.STICK))
+                .save(consumer);
+        */
+
+        ShapedRecipeBuilder.shaped(APBlocks.CHAT_BOX.get())
                 .define('P', ItemTags.LOGS)
                 .define('A', CASING)
                 .define('G', Tags.Items.INGOTS_GOLD)
@@ -47,7 +84,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(CASING))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(de.srendi.advancedperipherals.common.setup.Items.CHUNK_CONTROLLER.get())
+        ShapedRecipeBuilder.shaped(APItems.CHUNK_CONTROLLER.get())
                 .define('I', Tags.Items.INGOTS_IRON)
                 .define('R', Tags.Items.DUSTS_REDSTONE)
                 .define('A', Items.ENDER_EYE)
@@ -57,7 +94,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(Items.RESPAWN_ANCHOR))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(de.srendi.advancedperipherals.common.setup.Items.COMPUTER_TOOL.get())
+        ShapedRecipeBuilder.shaped(APItems.COMPUTER_TOOL.get())
                 .define('I', Tags.Items.INGOTS_IRON)
                 .define('B', Items.BLUE_TERRACOTTA)
                 .pattern("I I")
@@ -66,7 +103,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(Items.BLUE_TERRACOTTA))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(Blocks.ENERGY_DETECTOR.get())
+        ShapedRecipeBuilder.shaped(APBlocks.ENERGY_DETECTOR.get())
                 .define('B', Tags.Items.STORAGE_BLOCKS_REDSTONE)
                 .define('R', Items.REDSTONE_TORCH)
                 .define('C', Items.COMPARATOR)
@@ -78,7 +115,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(CASING))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(Blocks.ENVIRONMENT_DETECTOR.get())
+        ShapedRecipeBuilder.shaped(APBlocks.ENVIRONMENT_DETECTOR.get())
                 .define('W', ItemTags.WOOL)
                 .define('S', ItemTags.SAPLINGS)
                 .define('C', Tags.Items.CROPS)
@@ -90,7 +127,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(CASING))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(Blocks.INVENTORY_MANAGER.get())
+        ShapedRecipeBuilder.shaped(APBlocks.INVENTORY_MANAGER.get())
                 .define('I', Tags.Items.INGOTS_IRON)
                 .define('C', Tags.Items.CHESTS)
                 .define('A', CASING)
@@ -100,7 +137,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(CASING))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(de.srendi.advancedperipherals.common.setup.Items.MEMORY_CARD.get())
+        ShapedRecipeBuilder.shaped(APItems.MEMORY_CARD.get())
                 .define('I', Tags.Items.INGOTS_IRON)
                 .define('W', Tags.Items.GLASS_WHITE)
                 .define('O', Items.OBSERVER)
@@ -111,7 +148,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(Items.OBSERVER))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(Blocks.PERIPHERAL_CASING.get())
+        ShapedRecipeBuilder.shaped(APBlocks.PERIPHERAL_CASING.get())
                 .define('I', Tags.Items.INGOTS_IRON)
                 .define('i', Items.IRON_BARS)
                 .define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE)
@@ -121,7 +158,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(Items.REDSTONE_BLOCK))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(Blocks.PLAYER_DETECTOR.get())
+        ShapedRecipeBuilder.shaped(APBlocks.PLAYER_DETECTOR.get())
                 .define('S', Items.SMOOTH_STONE)
                 .define('A', CASING)
                 .define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE)
@@ -131,7 +168,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(CASING))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(Blocks.REDSTONE_INTEGRATOR.get())
+        ShapedRecipeBuilder.shaped(APBlocks.REDSTONE_INTEGRATOR.get())
                 .define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE)
                 .define('A', CASING)
                 .define('C', Items.COMPARATOR)
@@ -141,7 +178,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(CASING))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(Blocks.BLOCK_READER.get())
+        ShapedRecipeBuilder.shaped(APBlocks.BLOCK_READER.get())
                 .define('O', Items.OBSERVER)
                 .define('I', Tags.Items.INGOTS_IRON)
                 .define('M', Registry.ModBlocks.WIRED_MODEM_FULL.get())
@@ -153,7 +190,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(CASING))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(Blocks.GEO_SCANNER.get())
+        ShapedRecipeBuilder.shaped(APBlocks.GEO_SCANNER.get())
                 .define('O', Items.OBSERVER)
                 .define('D', Tags.Items.GEMS_DIAMOND)
                 .define('C', CASING)
@@ -165,7 +202,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(CASING))
                 .save(consumer);
 
-        ShapedRecipeBuilder.shaped(Blocks.NBT_STORAGE.get())
+        ShapedRecipeBuilder.shaped(APBlocks.NBT_STORAGE.get())
                 .define('C', Tags.Items.CHESTS)
                 .define('A', CASING)
                 .define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE)
@@ -181,7 +218,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                         modLoaded("minecolonies")
                 )
                 .addRecipe(
-                        ShapedRecipeBuilder.shaped(Blocks.COLONY_INTEGRATOR.get())
+                        ShapedRecipeBuilder.shaped(APBlocks.COLONY_INTEGRATOR.get())
                                 .define('O', ItemTags.LOGS)
                                 .define('A', CASING)
                                 .define('R', Ingredient.fromValues(Stream.of(new RawValue(new ResourceLocation("minecolonies", "blockminecoloniesrack")))))
@@ -196,7 +233,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                         modLoaded("ae2")
                 )
                 .addRecipe(
-                        ShapedRecipeBuilder.shaped(Blocks.ME_BRIDGE.get())
+                        ShapedRecipeBuilder.shaped(APBlocks.ME_BRIDGE.get())
                                 .define('F', AEBlocks.FLUIX_BLOCK.asItem())
                                 .define('A', CASING)
                                 .define('I', AEBlocks.INTERFACE.asItem())
@@ -211,7 +248,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                         modLoaded("refinedstorage")
                 )
                 .addRecipe(
-                        ShapedRecipeBuilder.shaped(Blocks.RS_BRIDGE.get())
+                        ShapedRecipeBuilder.shaped(APBlocks.RS_BRIDGE.get())
                                 .define('Q', RSItems.QUARTZ_ENRICHED_IRON.get())
                                 .define('A', CASING)
                                 .define('I', RSBlocks.INTERFACE.get())
@@ -221,7 +258,7 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                                 .unlockedBy(HAS_ITEM, has(CASING))::save
                 ).build(consumer, new ResourceLocation(AdvancedPeripherals.MOD_ID, "rs_bridge"));
 
-        ShapedRecipeBuilder.shaped(de.srendi.advancedperipherals.common.setup.Items.WEAK_AUTOMATA_CORE.get())
+        ShapedRecipeBuilder.shaped(APItems.WEAK_AUTOMATA_CORE.get())
                 .define('A', CASING)
                 .define('R', Tags.Items.STORAGE_BLOCKS_REDSTONE)
                 .define('S', Items.SOUL_LANTERN)
@@ -233,23 +270,13 @@ protected void buildCraftingRecipes(@NotNull Consumer consumer)
                 .unlockedBy(HAS_ITEM, has(CASING))
                 .save(consumer);
 
-        ShapelessRecipeBuilder.shapeless(de.srendi.advancedperipherals.common.setup.Items.OVERPOWERED_WEAK_AUTOMATA_CORE.get())
-                .requires(de.srendi.advancedperipherals.common.setup.Items.WEAK_AUTOMATA_CORE.get())
-                .requires(Items.NETHER_STAR)
-                .unlockedBy(HAS_ITEM, has(de.srendi.advancedperipherals.common.setup.Items.WEAK_AUTOMATA_CORE.get()))
-                .save(consumer);
-
-        ShapelessRecipeBuilder.shapeless(de.srendi.advancedperipherals.common.setup.Items.OVERPOWERED_END_AUTOMATA_CORE.get())
-                .requires(de.srendi.advancedperipherals.common.setup.Items.END_AUTOMATA_CORE.get())
-                .requires(Items.NETHER_STAR)
-                .unlockedBy(HAS_ITEM, has(de.srendi.advancedperipherals.common.setup.Items.END_AUTOMATA_CORE.get()))
-                .save(consumer);
+    }
 
-        ShapelessRecipeBuilder.shapeless(de.srendi.advancedperipherals.common.setup.Items.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE.get())
-                .requires(de.srendi.advancedperipherals.common.setup.Items.HUSBANDRY_AUTOMATA_CORE.get())
-                .requires(Items.NETHER_STAR)
-                .unlockedBy(HAS_ITEM, has(de.srendi.advancedperipherals.common.setup.Items.HUSBANDRY_AUTOMATA_CORE.get()))
-                .save(consumer);
+    private void addSmithing(@NotNull Consumer consumer) {
+        UpgradeRecipeBuilder
+                .smithing(Ingredient.of(APItems.SMART_GLASSES.get()), Ingredient.of(Items.NETHERITE_INGOT), APItems.SMART_GLASSES_NETHERITE.get())
+                .unlocks("has_item", has(Items.NETHERITE_INGOT))
+                .save(consumer, new ResourceLocation(AdvancedPeripherals.MOD_ID, "armor/" + APItems.SMART_GLASSES_NETHERITE.getKey().location().getPath()));
     }
 
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java
index 3abf291bc..86d8e8bbe 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/data/TurtleUpgradesProvider.java
@@ -5,7 +5,6 @@
 import de.srendi.advancedperipherals.common.setup.APBlocks;
 import de.srendi.advancedperipherals.common.setup.APItems;
 import de.srendi.advancedperipherals.common.setup.CCRegistration;
-import de.srendi.advancedperipherals.common.setup.Items;
 import net.minecraft.data.DataGenerator;
 import org.jetbrains.annotations.NotNull;
 
@@ -26,12 +25,12 @@ protected void addUpgrades(@NotNull Consumer>
         simpleWithCustomItem(CCRegistration.ID.GEOSCANNER_TURTLE, CCRegistration.GEO_SCANNER_TURTLE.get(), APBlocks.GEO_SCANNER.get().asItem()).add(addUpgrade);
         simpleWithCustomItem(CCRegistration.ID.COMPASS_TURTLE, CCRegistration.COMPASS_TURTLE.get(), net.minecraft.world.item.Items.COMPASS).add(addUpgrade);
         simpleWithCustomItem(CCRegistration.ID.SADDLE_TURTLE, CCRegistration.SADDLE_TURTLE.get(), net.minecraft.world.item.Items.SADDLE).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.WEAK_AUTOMATA, CCRegistration.WEAK_TURTLE.get(), Items.WEAK_AUTOMATA_CORE.get()).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.END_AUTOMATA, CCRegistration.END_TURTLE.get(), Items.END_AUTOMATA_CORE.get()).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.HUSBANDRY_AUTOMATA, CCRegistration.HUSBANDRY_TURTLE.get(), Items.HUSBANDRY_AUTOMATA_CORE.get()).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.OP_WEAK_AUTOMATA, CCRegistration.OP_WEAK_TURTLE.get(), Items.OVERPOWERED_WEAK_AUTOMATA_CORE.get()).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.OP_END_AUTOMATA, CCRegistration.OP_END_TURTLE.get(), Items.OVERPOWERED_END_AUTOMATA_CORE.get()).add(addUpgrade);
-        simpleWithCustomItem(CCRegistration.ID.OP_HUSBANDRY_AUTOMATA, CCRegistration.OP_HUSBANDRY_TURTLE.get(), Items.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE.get()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.WEAK_AUTOMATA, CCRegistration.WEAK_TURTLE.get(), APItems.WEAK_AUTOMATA_CORE.get()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.END_AUTOMATA, CCRegistration.END_TURTLE.get(), APItems.END_AUTOMATA_CORE.get()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.HUSBANDRY_AUTOMATA, CCRegistration.HUSBANDRY_TURTLE.get(), APItems.HUSBANDRY_AUTOMATA_CORE.get()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.OP_WEAK_AUTOMATA, CCRegistration.OP_WEAK_TURTLE.get(), APItems.OVERPOWERED_WEAK_AUTOMATA_CORE.get()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.OP_END_AUTOMATA, CCRegistration.OP_END_TURTLE.get(), APItems.OVERPOWERED_END_AUTOMATA_CORE.get()).add(addUpgrade);
+        simpleWithCustomItem(CCRegistration.ID.OP_HUSBANDRY_AUTOMATA, CCRegistration.OP_HUSBANDRY_TURTLE.get(), APItems.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE.get()).add(addUpgrade);
 
     }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/APBlockItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/APBlockItem.java
index 296852eee..fbfc664f9 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/items/APBlockItem.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/items/APBlockItem.java
@@ -1,36 +1,21 @@
 package de.srendi.advancedperipherals.common.items;
 
 import de.srendi.advancedperipherals.common.items.base.BaseBlockItem;
-import de.srendi.advancedperipherals.common.util.inventory.ItemUtil;
-import net.minecraft.core.NonNullList;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraft.world.item.CreativeModeTab;
-import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.block.Block;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 import java.util.function.Supplier;
 
 public class APBlockItem extends BaseBlockItem {
 
-    @Nullable
-    private final ResourceLocation turtleID;
-    @Nullable
-    private final ResourceLocation pocketID;
     private final Supplier enabledSup;
 
-    public APBlockItem(Block blockIn, Properties properties, @Nullable ResourceLocation turtleID, @Nullable ResourceLocation pocketID, Supplier enabledSup) {
+    public APBlockItem(Block blockIn, Properties properties, Supplier enabledSup) {
         super(blockIn, properties);
-        this.turtleID = turtleID;
-        this.pocketID = pocketID;
         this.enabledSup = enabledSup;
     }
 
-    public APBlockItem(Block blockIn, @Nullable ResourceLocation turtleID, @Nullable ResourceLocation pocketID, Supplier enabledSup) {
+    public APBlockItem(Block blockIn, Supplier enabledSup) {
         super(blockIn);
-        this.turtleID = turtleID;
-        this.pocketID = pocketID;
         this.enabledSup = enabledSup;
     }
 
@@ -39,10 +24,4 @@ public boolean isEnabled() {
         return enabledSup.get();
     }
 
-    @Override
-    public void fillItemCategory(@NotNull CreativeModeTab group, @NotNull NonNullList items) {
-        super.fillItemCategory(group, items);
-        if(allowedIn(group))
-            ItemUtil.addComputerItemToTab(turtleID, pocketID, items);
-    }
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/APItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/APItem.java
index 04f5e9d8f..34ffcbeb5 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/items/APItem.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/items/APItem.java
@@ -1,35 +1,20 @@
 package de.srendi.advancedperipherals.common.items;
 
 import de.srendi.advancedperipherals.common.items.base.BaseItem;
-import de.srendi.advancedperipherals.common.util.inventory.ItemUtil;
-import net.minecraft.core.NonNullList;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraft.world.item.CreativeModeTab;
-import net.minecraft.world.item.ItemStack;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 import java.util.function.Supplier;
 
 public class APItem extends BaseItem {
 
-    @Nullable
-    private final ResourceLocation turtleID;
-    @Nullable
-    private final ResourceLocation pocketID;
     private final Supplier enabledSup;
 
-    public APItem(Properties properties, @Nullable ResourceLocation turtleID, @Nullable ResourceLocation pocketID, Supplier enabledSup) {
+    public APItem(Properties properties, Supplier enabledSup) {
         super(properties);
-        this.turtleID = turtleID;
-        this.pocketID = pocketID;
         this.enabledSup = enabledSup;
     }
 
-    public APItem(@Nullable ResourceLocation turtleID, @Nullable ResourceLocation pocketID, Supplier enabledSup) {
+    public APItem(Supplier enabledSup) {
         super();
-        this.turtleID = turtleID;
-        this.pocketID = pocketID;
         this.enabledSup = enabledSup;
     }
 
@@ -38,11 +23,4 @@ public boolean isEnabled() {
         return enabledSup.get();
     }
 
-    @Override
-    public void fillItemCategory(@NotNull CreativeModeTab group, @NotNull NonNullList items) {
-        super.fillItemCategory(group, items);
-        if(allowedIn(group))
-            ItemUtil.addComputerItemToTab(turtleID, pocketID, items);
-    }
-
 }
diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java b/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java
index 12394d92d..0dd8b101f 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java
@@ -1,12 +1,12 @@
 package de.srendi.advancedperipherals.common.items;
 
 import de.srendi.advancedperipherals.common.configuration.APConfig;
-import de.srendi.advancedperipherals.common.setup.Items;
+import de.srendi.advancedperipherals.common.items.base.BaseItem;
+import de.srendi.advancedperipherals.common.setup.APItems;
 import de.srendi.advancedperipherals.common.util.EnumColor;
 import de.srendi.advancedperipherals.lib.metaphysics.IFeedableAutomataCore;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.network.chat.Component;
-import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.InteractionHand;
 import net.minecraft.world.InteractionResult;
 import net.minecraft.world.entity.Entity;
@@ -27,7 +27,7 @@
 import java.util.Map;
 import java.util.Optional;
 
-public class WeakAutomataCore extends APItem implements IFeedableAutomataCore {
+public class WeakAutomataCore extends BaseItem implements IFeedableAutomataCore {
 
     private static final String CONSUMED_ENTITY_COUNT = "consumed_entity_count";
     private static final String CONSUMED_ENTITY_NAME = "consumed_entity_name";
@@ -37,24 +37,25 @@ public class WeakAutomataCore extends APItem implements IFeedableAutomataCore {
     static {
         Map endSouls = new HashMap<>();
         endSouls.put(ForgeRegistries.ENTITY_TYPES.getKey(EntityType.ENDERMAN).toString(), 10);
-        WeakAutomataCoreRecord endSoulRecord = new WeakAutomataCoreRecord(endSouls, Items.END_AUTOMATA_CORE.get());
+        WeakAutomataCoreRecord endSoulRecord = new WeakAutomataCoreRecord(endSouls, APItems.END_AUTOMATA_CORE.get());
 
         Map husbandrySouls = new HashMap<>();
         husbandrySouls.put(ForgeRegistries.ENTITY_TYPES.getKey(EntityType.COW).toString(), 3);
         husbandrySouls.put(ForgeRegistries.ENTITY_TYPES.getKey(EntityType.SHEEP).toString(), 3);
         husbandrySouls.put(ForgeRegistries.ENTITY_TYPES.getKey(EntityType.CHICKEN).toString(), 3);
-        WeakAutomataCoreRecord husbandrySoulRecord = new WeakAutomataCoreRecord(husbandrySouls, Items.HUSBANDRY_AUTOMATA_CORE.get());
+        WeakAutomataCoreRecord husbandrySoulRecord = new WeakAutomataCoreRecord(husbandrySouls, APItems.HUSBANDRY_AUTOMATA_CORE.get());
 
         endSoulRecord.ingredients.keySet().forEach(entityType -> AUTOMATA_CORE_REGISTRY.put(entityType, endSoulRecord));
         husbandrySoulRecord.ingredients.keySet().forEach(entityType -> AUTOMATA_CORE_REGISTRY.put(entityType, husbandrySoulRecord));
     }
 
-    public WeakAutomataCore(Properties properties, @Nullable ResourceLocation turtleID, @Nullable ResourceLocation pocketID) {
-        super(properties, turtleID, pocketID, APConfig.METAPHYSICS_CONFIG.enableWeakAutomataCore);
+    public WeakAutomataCore(Properties properties) {
+        super(properties);
     }
 
-    public WeakAutomataCore(@Nullable ResourceLocation turtleID, @Nullable ResourceLocation pocketID) {
-        super(turtleID, pocketID, APConfig.METAPHYSICS_CONFIG.enableWeakAutomataCore);
+    @Override
+    public boolean isEnabled() {
+        return APConfig.METAPHYSICS_CONFIG.enableWeakAutomataCore.get();
     }
 
     @Override
diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/base/SmartGlassesMaterials.java b/src/main/java/de/srendi/advancedperipherals/common/items/base/SmartGlassesMaterials.java
new file mode 100644
index 000000000..071976e3e
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/items/base/SmartGlassesMaterials.java
@@ -0,0 +1,73 @@
+package de.srendi.advancedperipherals.common.items.base;
+
+import de.srendi.advancedperipherals.AdvancedPeripherals;
+import net.minecraft.sounds.SoundEvent;
+import net.minecraft.sounds.SoundEvents;
+import net.minecraft.world.entity.EquipmentSlot;
+import net.minecraft.world.item.ArmorMaterial;
+import net.minecraft.world.item.Items;
+import net.minecraft.world.item.crafting.Ingredient;
+import org.jetbrains.annotations.NotNull;
+
+public enum SmartGlassesMaterials implements ArmorMaterial {
+
+    // We use the same name, so they use the same model texture
+    CHAIN("smart_glasses", 15, new int[]{1, 4, 5, 2}, 12, SoundEvents.ARMOR_EQUIP_CHAIN, 0.0F, 0.0F, Ingredient.of(Items.IRON_INGOT)),
+    NETHERITE("smart_glasses", 37, new int[]{3, 6, 8, 3}, 15, SoundEvents.ARMOR_EQUIP_NETHERITE, 3.0F, 0.1F, Ingredient.of(Items.NETHERITE_INGOT));
+
+    private static final int[] HEALTH_PER_SLOT = new int[]{13, 15, 16, 11};
+    private final String name;
+    private final int durabilityMultiplier;
+    private final int[] slotProtections;
+    private final int enchantmentValue;
+    private final SoundEvent sound;
+    private final float toughness;
+    private final float knockbackResistance;
+    private final Ingredient repairIngredient;
+
+    SmartGlassesMaterials(String pName, int pDurabilityMultiplier, int[] pSlotProtections, int pEnchantmentValue, SoundEvent pSound, float pToughness, float pKnockbackResistance, Ingredient pRepairIngredient) {
+        this.name = pName;
+        this.durabilityMultiplier = pDurabilityMultiplier;
+        this.slotProtections = pSlotProtections;
+        this.enchantmentValue = pEnchantmentValue;
+        this.sound = pSound;
+        this.toughness = pToughness;
+        this.knockbackResistance = pKnockbackResistance;
+        this.repairIngredient = pRepairIngredient;
+    }
+
+    public int getDurabilityForSlot(EquipmentSlot pSlot) {
+        return HEALTH_PER_SLOT[pSlot.getIndex()] * this.durabilityMultiplier;
+    }
+
+    public int getDefenseForSlot(EquipmentSlot pSlot) {
+        return this.slotProtections[pSlot.getIndex()];
+    }
+
+    public int getEnchantmentValue() {
+        return this.enchantmentValue;
+    }
+
+    @NotNull
+    public SoundEvent getEquipSound() {
+        return this.sound;
+    }
+
+    @NotNull
+    public Ingredient getRepairIngredient() {
+        return this.repairIngredient;
+    }
+
+    @NotNull
+    public String getName() {
+        return AdvancedPeripherals.MOD_ID + ":" + this.name;
+    }
+
+    public float getToughness() {
+        return this.toughness;
+    }
+
+    public float getKnockbackResistance() {
+        return this.knockbackResistance;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/network/base/IPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/base/IPacket.java
similarity index 89%
rename from src/main/java/de/srendi/advancedperipherals/network/base/IPacket.java
rename to src/main/java/de/srendi/advancedperipherals/common/network/base/IPacket.java
index 9a52059bb..1374f5bff 100644
--- a/src/main/java/de/srendi/advancedperipherals/network/base/IPacket.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/network/base/IPacket.java
@@ -1,4 +1,4 @@
-package de.srendi.advancedperipherals.network.base;
+package de.srendi.advancedperipherals.common.network.base;
 
 import net.minecraft.network.FriendlyByteBuf;
 import net.minecraftforge.network.NetworkEvent;
diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/DistanceDetectorSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/DistanceDetectorSyncPacket.java
new file mode 100644
index 000000000..484ec7520
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/DistanceDetectorSyncPacket.java
@@ -0,0 +1,59 @@
+package de.srendi.advancedperipherals.common.network.toclient;
+
+import de.srendi.advancedperipherals.AdvancedPeripherals;
+import de.srendi.advancedperipherals.common.blocks.blockentities.DistanceDetectorEntity;
+import de.srendi.advancedperipherals.common.network.base.IPacket;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.multiplayer.ClientLevel;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Registry;
+import net.minecraft.network.FriendlyByteBuf;
+import net.minecraft.resources.ResourceKey;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraftforge.network.NetworkEvent;
+
+public class DistanceDetectorSyncPacket implements IPacket {
+
+    private final BlockPos position;
+    private final ResourceKey world;
+    private final float distance;
+    private final boolean showLaser;
+
+    public DistanceDetectorSyncPacket(BlockPos position, ResourceKey world, float distance, boolean showLaser) {
+        this.position = position;
+        this.world = world;
+        this.distance = distance;
+        this.showLaser = showLaser;
+    }
+
+    @Override
+    public void handle(NetworkEvent.Context context) {
+        ClientLevel level = Minecraft.getInstance().level;
+        if (!level.dimension().equals(world))
+            return;
+
+        BlockEntity tileEntity = level.getBlockEntity(position);
+        if (tileEntity == null) {
+            AdvancedPeripherals.debug("Could not update distance detector at " + position + " in world " + world.location()
+                    + " because the world or the tile entity couldn't be found. Ignoring it");
+            return;
+        }
+        if (tileEntity instanceof DistanceDetectorEntity detector) {
+            detector.setCurrentDistance(distance);
+            detector.setShowLaser(showLaser);
+        }
+    }
+
+    @Override
+    public void encode(FriendlyByteBuf buffer) {
+        buffer.writeBlockPos(position);
+        buffer.writeResourceKey(world);
+        buffer.writeFloat(distance);
+        buffer.writeBoolean(showLaser);
+    }
+
+    public static DistanceDetectorSyncPacket decode(FriendlyByteBuf buffer) {
+        return new DistanceDetectorSyncPacket(buffer.readBlockPos(), buffer.readResourceKey(Registry.DIMENSION_REGISTRY), buffer.readFloat(), buffer.readBoolean());
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/network/toclient/SaddleTurtleInfoPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/SaddleTurtleInfoPacket.java
similarity index 100%
rename from src/main/java/de/srendi/advancedperipherals/network/toclient/SaddleTurtleInfoPacket.java
rename to src/main/java/de/srendi/advancedperipherals/common/network/toclient/SaddleTurtleInfoPacket.java
diff --git a/src/main/java/de/srendi/advancedperipherals/network/toclient/ToastToClientPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/ToastToClientPacket.java
similarity index 90%
rename from src/main/java/de/srendi/advancedperipherals/network/toclient/ToastToClientPacket.java
rename to src/main/java/de/srendi/advancedperipherals/common/network/toclient/ToastToClientPacket.java
index e2a804eff..3536d9462 100644
--- a/src/main/java/de/srendi/advancedperipherals/network/toclient/ToastToClientPacket.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/ToastToClientPacket.java
@@ -1,8 +1,8 @@
-package de.srendi.advancedperipherals.network.toclient;
+package de.srendi.advancedperipherals.common.network.toclient;
 
 import de.srendi.advancedperipherals.AdvancedPeripherals;
+import de.srendi.advancedperipherals.common.network.base.IPacket;
 import de.srendi.advancedperipherals.common.util.ToastUtil;
-import de.srendi.advancedperipherals.network.base.IPacket;
 import net.minecraft.network.FriendlyByteBuf;
 import net.minecraft.network.chat.Component;
 import net.minecraftforge.fml.loading.FMLEnvironment;
diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java
new file mode 100644
index 000000000..c6f5506ed
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/GlassesHotkeyPacket.java
@@ -0,0 +1,55 @@
+package de.srendi.advancedperipherals.common.network.toserver;
+
+import de.srendi.advancedperipherals.common.items.SmartGlassesItem;
+import de.srendi.advancedperipherals.common.network.base.IPacket;
+import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer;
+import net.minecraft.network.FriendlyByteBuf;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.item.ItemStack;
+import net.minecraftforge.network.NetworkEvent;
+import net.minecraftforge.server.ServerLifecycleHooks;
+
+import java.util.UUID;
+
+public class GlassesHotkeyPacket implements IPacket {
+
+    private final UUID player;
+    private final String keyBind;
+    private final int keyPressDuration;
+
+    public GlassesHotkeyPacket(UUID player, String keyBind, int keyPressDuration) {
+        this.player = player;
+        this.keyBind = keyBind;
+        this.keyPressDuration = keyPressDuration;
+    }
+
+    @Override
+    public void handle(NetworkEvent.Context context) {
+        MinecraftServer server = ServerLifecycleHooks.getCurrentServer();
+
+        ServerPlayer serverPlayer = server.getPlayerList().getPlayer(player);
+        if (serverPlayer == null)
+            return;
+
+        for (ItemStack stack : serverPlayer.getAllSlots()) {
+            if (stack.getItem() instanceof SmartGlassesItem) {
+                SmartGlassesComputer computer = SmartGlassesItem.getServerComputer(server, stack);
+
+                if (computer != null)
+                    computer.queueEvent("glassesKeyPressed", new Object[]{keyBind, keyPressDuration});
+            }
+        }
+    }
+
+    @Override
+    public void encode(FriendlyByteBuf buffer) {
+        buffer.writeUUID(player);
+        buffer.writeUtf(keyBind);
+        buffer.writeInt(keyPressDuration);
+    }
+
+    public static GlassesHotkeyPacket decode(FriendlyByteBuf buffer) {
+        return new GlassesHotkeyPacket(buffer.readUUID(), buffer.readUtf(), buffer.readInt());
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java
new file mode 100644
index 000000000..ab760488c
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java
@@ -0,0 +1,30 @@
+package de.srendi.advancedperipherals.common.setup;
+
+import com.google.common.collect.Sets;
+import de.srendi.advancedperipherals.common.addons.APAddons;
+import de.srendi.advancedperipherals.common.blocks.blockentities.*;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraftforge.registries.RegistryObject;
+
+public class APBlockEntityTypes {
+
+    protected static void register() {
+    }
+
+    public static final RegistryObject> CHAT_BOX = APRegistration.TILE_ENTITIES.register("chat_box", () -> new BlockEntityType<>(ChatBoxEntity::new, Sets.newHashSet(APBlocks.CHAT_BOX.get()), null));
+    public static final RegistryObject> ENVIRONMENT_DETECTOR = APRegistration.TILE_ENTITIES.register("environment_detector", () -> new BlockEntityType<>(EnvironmentDetectorEntity::new, Sets.newHashSet(APBlocks.ENVIRONMENT_DETECTOR.get()), null));
+    public static final RegistryObject> PLAYER_DETECTOR = APRegistration.TILE_ENTITIES.register("player_detector", () -> new BlockEntityType<>(PlayerDetectorEntity::new, Sets.newHashSet(APBlocks.PLAYER_DETECTOR.get()), null));
+    public static final RegistryObject> ME_BRIDGE = APAddons.appliedEnergisticsLoaded ? APRegistration.TILE_ENTITIES.register("me_bridge", () -> new BlockEntityType<>(MeBridgeEntity::new, Sets.newHashSet(APBlocks.ME_BRIDGE.get()), null)) : null;
+    public static final RegistryObject> RS_BRIDGE = APAddons.refinedStorageLoaded ? APRegistration.TILE_ENTITIES.register("rs_bridge", () -> new BlockEntityType<>(RsBridgeEntity::new, Sets.newHashSet(APBlocks.RS_BRIDGE.get()), null)) : null;
+    public static final RegistryObject> ENERGY_DETECTOR = APRegistration.TILE_ENTITIES.register("energy_detector", () -> new BlockEntityType<>(EnergyDetectorEntity::new, Sets.newHashSet(APBlocks.ENERGY_DETECTOR.get()), null));
+    public static final RegistryObject> FLUID_DETECTOR = APRegistration.TILE_ENTITIES.register("fluid_detector", () -> new BlockEntityType<>(FluidDetectorEntity::new, Sets.newHashSet(APBlocks.FLUID_DETECTOR.get()), null));
+    public static final RegistryObject> GAS_DETECTOR = APAddons.mekanismLoaded ? APRegistration.TILE_ENTITIES.register("gas_detector", () -> new BlockEntityType<>(GasDetectorEntity::new, Sets.newHashSet(APBlocks.GAS_DETECTOR.get()), null)) : null;
+    public static final RegistryObject> INVENTORY_MANAGER = APRegistration.TILE_ENTITIES.register("inventory_manager", () -> new BlockEntityType<>(InventoryManagerEntity::new, Sets.newHashSet(APBlocks.INVENTORY_MANAGER.get()), null));
+    public static final RegistryObject> REDSTONE_INTEGRATOR = APRegistration.TILE_ENTITIES.register("redstone_integrator", () -> new BlockEntityType<>(RedstoneIntegratorEntity::new, Sets.newHashSet(APBlocks.REDSTONE_INTEGRATOR.get()), null));
+    public static final RegistryObject> BLOCK_READER = APRegistration.TILE_ENTITIES.register("block_reader", () -> new BlockEntityType<>(BlockReaderEntity::new, Sets.newHashSet(APBlocks.BLOCK_READER.get()), null));
+    public static final RegistryObject> GEO_SCANNER = APRegistration.TILE_ENTITIES.register("geo_scanner", () -> new BlockEntityType<>(GeoScannerEntity::new, Sets.newHashSet(APBlocks.GEO_SCANNER.get()), null));
+    public static final RegistryObject> COLONY_INTEGRATOR = APRegistration.TILE_ENTITIES.register("colony_integrator", () -> new BlockEntityType<>(ColonyIntegratorEntity::new, Sets.newHashSet(APBlocks.COLONY_INTEGRATOR.get()), null));
+    public static final RegistryObject> NBT_STORAGE = APRegistration.TILE_ENTITIES.register("nbt_storage", () -> new BlockEntityType<>(NBTStorageEntity::new, Sets.newHashSet(APBlocks.NBT_STORAGE.get()), null));
+    public static final RegistryObject> DISTANCE_DETECTOR = APRegistration.TILE_ENTITIES.register("distance_detector", () -> new BlockEntityType<>(DistanceDetectorEntity::new, Sets.newHashSet(APBlocks.DISTANCE_DETECTOR.get()), null));
+
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java
new file mode 100644
index 000000000..aab4cdd0b
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java
@@ -0,0 +1,58 @@
+package de.srendi.advancedperipherals.common.setup;
+
+import de.srendi.advancedperipherals.common.blocks.PlayerDetectorBlock;
+import de.srendi.advancedperipherals.common.blocks.RedstoneIntegratorBlock;
+import de.srendi.advancedperipherals.common.blocks.base.APBlockEntityBlock;
+import de.srendi.advancedperipherals.common.blocks.base.BaseBlock;
+import de.srendi.advancedperipherals.common.configuration.APConfig;
+import de.srendi.advancedperipherals.common.items.APBlockItem;
+import net.minecraft.core.BlockPos;
+import net.minecraft.world.item.BlockItem;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.level.BlockGetter;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.state.BlockBehaviour;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.level.material.Material;
+import net.minecraftforge.fml.ModList;
+import net.minecraftforge.registries.RegistryObject;
+
+import java.util.function.Supplier;
+
+public class APBlocks {
+
+    protected static void register() {
+    }
+
+    public static final RegistryObject ENVIRONMENT_DETECTOR = register("environment_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.ENVIRONMENT_DETECTOR, false), () -> new APBlockItem(APBlocks.ENVIRONMENT_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableEnvironmentDetector));
+    public static final RegistryObject CHAT_BOX = register("chat_box", () -> new APBlockEntityBlock<>(APBlockEntityTypes.CHAT_BOX, true), () -> new APBlockItem(APBlocks.CHAT_BOX.get(), APConfig.PERIPHERALS_CONFIG.enableChatBox));
+    public static final RegistryObject PLAYER_DETECTOR = register("player_detector", PlayerDetectorBlock::new, () -> new APBlockItem(APBlocks.PLAYER_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enablePlayerDetector));
+    public static final RegistryObject ME_BRIDGE = register("me_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("ae2") ? APBlockEntityTypes.ME_BRIDGE : null, ModList.get().isLoaded("ae2")), () -> new APBlockItem(APBlocks.ME_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableMEBridge));
+    public static final RegistryObject RS_BRIDGE = register("rs_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("refinedstorage") ? APBlockEntityTypes.RS_BRIDGE : null, false), () -> new APBlockItem(APBlocks.RS_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableRSBridge));
+    public static final RegistryObject ENERGY_DETECTOR = register("energy_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.ENERGY_DETECTOR, true), () -> new APBlockItem(APBlocks.ENERGY_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableEnergyDetector));
+    public static final RegistryObject FLUID_DETECTOR = register("fluid_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.FLUID_DETECTOR, true), () -> new APBlockItem(APBlocks.FLUID_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableFluidDetector));
+    public static final RegistryObject GAS_DETECTOR = register("gas_detector", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("mekanism") ? APBlockEntityTypes.GAS_DETECTOR : null, true), () -> new APBlockItem(APBlocks.GAS_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableGasDetector));
+    public static final RegistryObject PERIPHERAL_CASING = register("peripheral_casing", BaseBlock::new, () -> new APBlockItem(APBlocks.PERIPHERAL_CASING.get(), new Item.Properties().stacksTo(16), () -> true));
+    public static final RegistryObject INVENTORY_MANAGER = register("inventory_manager", () -> new APBlockEntityBlock<>(APBlockEntityTypes.INVENTORY_MANAGER, false), () -> new APBlockItem(APBlocks.INVENTORY_MANAGER.get(), APConfig.PERIPHERALS_CONFIG.enableInventoryManager));
+    public static final RegistryObject REDSTONE_INTEGRATOR = register("redstone_integrator", RedstoneIntegratorBlock::new, () -> new APBlockItem(APBlocks.REDSTONE_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableRedstoneIntegrator));
+    public static final RegistryObject BLOCK_READER = register("block_reader", () -> new APBlockEntityBlock<>(APBlockEntityTypes.BLOCK_READER, true), () -> new APBlockItem(APBlocks.BLOCK_READER.get(), APConfig.PERIPHERALS_CONFIG.enableBlockReader));
+    public static final RegistryObject GEO_SCANNER = register("geo_scanner", () -> new APBlockEntityBlock<>(APBlockEntityTypes.GEO_SCANNER, false), () -> new APBlockItem(APBlocks.GEO_SCANNER.get(), APConfig.PERIPHERALS_CONFIG.enableGeoScanner));
+    public static final RegistryObject COLONY_INTEGRATOR = register("colony_integrator", () -> new APBlockEntityBlock<>(APBlockEntityTypes.COLONY_INTEGRATOR, false), () -> new APBlockItem(APBlocks.COLONY_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableColonyIntegrator));
+    public static final RegistryObject NBT_STORAGE = register("nbt_storage", () -> new APBlockEntityBlock<>(APBlockEntityTypes.NBT_STORAGE, false), () -> new APBlockItem(APBlocks.NBT_STORAGE.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage));
+    public static final RegistryObject DISTANCE_DETECTOR = register("distance_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.DISTANCE_DETECTOR, BlockBehaviour.Properties.of(Material.METAL).noOcclusion(), true), () -> new APBlockItem(APBlocks.DISTANCE_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage));
+
+    private static  RegistryObject registerNoItem(String name, Supplier block) {
+        return APRegistration.BLOCKS.register(name, block);
+    }
+
+    private static  RegistryObject register(String name, Supplier block, Supplier blockItem) {
+        RegistryObject registryObject = registerNoItem(name, block);
+        APRegistration.ITEMS.register(name, blockItem);
+        return registryObject;
+    }
+
+    public static boolean never(BlockState state, BlockGetter level, BlockPos pos) {
+        return false;
+    }
+
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java
new file mode 100644
index 000000000..b51d363b3
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APContainerTypes.java
@@ -0,0 +1,28 @@
+package de.srendi.advancedperipherals.common.setup;
+
+import dan200.computercraft.shared.network.container.ComputerContainerData;
+import dan200.computercraft.shared.network.container.ContainerData;
+import de.srendi.advancedperipherals.common.container.InventoryManagerContainer;
+import de.srendi.advancedperipherals.common.container.SmartGlassesContainer;
+import net.minecraft.core.BlockPos;
+import net.minecraft.world.inventory.MenuType;
+import net.minecraft.world.level.Level;
+import net.minecraftforge.common.extensions.IForgeMenuType;
+import net.minecraftforge.registries.RegistryObject;
+
+public class APContainerTypes {
+
+    public static final RegistryObject> INVENTORY_MANAGER_CONTAINER = APRegistration.CONTAINER_TYPES.register("memory_card_container", () -> IForgeMenuType.create((windowId, inv, data) -> {
+        BlockPos pos = data.readBlockPos();
+        Level level = inv.player.getCommandSenderWorld();
+        return new InventoryManagerContainer(windowId, inv, pos, level);
+    }));
+
+    public static final RegistryObject> SMART_GLASSES_CONTAINER = APRegistration.CONTAINER_TYPES.register("smart_glasses_container", () -> ContainerData.toType(ComputerContainerData::new,
+            (id, inv, data) -> new SmartGlassesContainer(id, player -> true, null, data, inv, data.displayStack())
+    ));
+
+    protected static void register() {
+    }
+
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/Registration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java
similarity index 100%
rename from src/main/java/de/srendi/advancedperipherals/common/setup/Registration.java
rename to src/main/java/de/srendi/advancedperipherals/common/setup/APRegistration.java
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APVillagers.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APVillagers.java
new file mode 100644
index 000000000..a91c83f7a
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APVillagers.java
@@ -0,0 +1,20 @@
+package de.srendi.advancedperipherals.common.setup;
+
+import com.google.common.collect.ImmutableSet;
+import dan200.computercraft.shared.Registry;
+import de.srendi.advancedperipherals.AdvancedPeripherals;
+import net.minecraft.sounds.SoundEvents;
+import net.minecraft.world.entity.ai.village.poi.PoiType;
+import net.minecraft.world.entity.npc.VillagerProfession;
+import net.minecraftforge.registries.RegistryObject;
+
+public class APVillagers {
+
+    public static final RegistryObject COMPUTER_SCIENTIST_POI = APRegistration.POI_TYPES.register("computer_scientist", () -> new PoiType(ImmutableSet.copyOf(Registry.ModBlocks.COMPUTER_ADVANCED.get().getStateDefinition().getPossibleStates()), 1, 1));
+
+    public static final RegistryObject COMPUTER_SCIENTIST = APRegistration.VILLAGER_PROFESSIONS.register("computer_scientist", () -> new VillagerProfession(AdvancedPeripherals.MOD_ID + ":computer_scientist", holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), ImmutableSet.of(), ImmutableSet.of(Registry.ModBlocks.COMPUTER_ADVANCED.get()), SoundEvents.VILLAGER_WORK_TOOLSMITH));
+
+    protected static void register() {
+    }
+
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/BlockEntityTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/BlockEntityTypes.java
deleted file mode 100644
index e215232e2..000000000
--- a/src/main/java/de/srendi/advancedperipherals/common/setup/BlockEntityTypes.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.srendi.advancedperipherals.common.setup;
-
-import com.google.common.collect.Sets;
-import de.srendi.advancedperipherals.common.blocks.blockentities.*;
-import net.minecraft.world.level.block.entity.BlockEntityType;
-import net.minecraftforge.fml.ModList;
-import net.minecraftforge.registries.RegistryObject;
-
-public class BlockEntityTypes {
-
-    public static final RegistryObject> CHAT_BOX = Registration.TILE_ENTITIES.register("chat_box", () -> new BlockEntityType<>(ChatBoxEntity::new, Sets.newHashSet(Blocks.CHAT_BOX.get()), null));
-    public static final RegistryObject> ENVIRONMENT_DETECTOR = Registration.TILE_ENTITIES.register("environment_detector", () -> new BlockEntityType<>(EnvironmentDetectorEntity::new, Sets.newHashSet(Blocks.ENVIRONMENT_DETECTOR.get()), null));
-    public static final RegistryObject> PLAYER_DETECTOR = Registration.TILE_ENTITIES.register("player_detector", () -> new BlockEntityType<>(PlayerDetectorEntity::new, Sets.newHashSet(Blocks.PLAYER_DETECTOR.get()), null));
-    public static final RegistryObject> ME_BRIDGE = ModList.get().isLoaded("ae2") ? Registration.TILE_ENTITIES.register("me_bridge", () -> new BlockEntityType<>(MeBridgeEntity::new, Sets.newHashSet(Blocks.ME_BRIDGE.get()), null)) : null;
-    public static final RegistryObject> RS_BRIDGE = ModList.get().isLoaded("refinedstorage") ? Registration.TILE_ENTITIES.register("rs_bridge", () -> new BlockEntityType<>(RsBridgeEntity::new, Sets.newHashSet(Blocks.RS_BRIDGE.get()), null)) : null;
-    public static final RegistryObject> ENERGY_DETECTOR = Registration.TILE_ENTITIES.register("energy_detector", () -> new BlockEntityType<>(EnergyDetectorEntity::new, Sets.newHashSet(Blocks.ENERGY_DETECTOR.get()), null));
-    public static final RegistryObject> INVENTORY_MANAGER = Registration.TILE_ENTITIES.register("inventory_manager", () -> new BlockEntityType<>(InventoryManagerEntity::new, Sets.newHashSet(Blocks.INVENTORY_MANAGER.get()), null));
-    public static final RegistryObject> REDSTONE_INTEGRATOR = Registration.TILE_ENTITIES.register("redstone_integrator", () -> new BlockEntityType<>(RedstoneIntegratorEntity::new, Sets.newHashSet(Blocks.REDSTONE_INTEGRATOR.get()), null));
-    public static final RegistryObject> BLOCK_READER = Registration.TILE_ENTITIES.register("block_reader", () -> new BlockEntityType<>(BlockReaderEntity::new, Sets.newHashSet(Blocks.BLOCK_READER.get()), null));
-    public static final RegistryObject> GEO_SCANNER = Registration.TILE_ENTITIES.register("geo_scanner", () -> new BlockEntityType<>(GeoScannerEntity::new, Sets.newHashSet(Blocks.GEO_SCANNER.get()), null));
-    public static final RegistryObject> COLONY_INTEGRATOR = Registration.TILE_ENTITIES.register("colony_integrator", () -> new BlockEntityType<>(ColonyIntegratorEntity::new, Sets.newHashSet(Blocks.COLONY_INTEGRATOR.get()), null));
-    public static final RegistryObject> NBT_STORAGE = Registration.TILE_ENTITIES.register("nbt_storage", () -> new BlockEntityType<>(NBTStorageEntity::new, Sets.newHashSet(Blocks.NBT_STORAGE.get()), null));
-
-    public static void register() {
-    }
-
-}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/Blocks.java b/src/main/java/de/srendi/advancedperipherals/common/setup/Blocks.java
deleted file mode 100644
index 238c2d939..000000000
--- a/src/main/java/de/srendi/advancedperipherals/common/setup/Blocks.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package de.srendi.advancedperipherals.common.setup;
-
-import de.srendi.advancedperipherals.common.blocks.PlayerDetectorBlock;
-import de.srendi.advancedperipherals.common.blocks.RedstoneIntegratorBlock;
-import de.srendi.advancedperipherals.common.blocks.base.APBlockEntityBlock;
-import de.srendi.advancedperipherals.common.blocks.base.BaseBlock;
-import de.srendi.advancedperipherals.common.configuration.APConfig;
-import de.srendi.advancedperipherals.common.items.APBlockItem;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.item.BlockItem;
-import net.minecraft.world.item.Item;
-import net.minecraft.world.level.BlockGetter;
-import net.minecraft.world.level.block.Block;
-import net.minecraft.world.level.block.state.BlockState;
-import net.minecraftforge.fml.ModList;
-import net.minecraftforge.registries.RegistryObject;
-
-import java.util.function.Supplier;
-
-public class Blocks {
-
-    public static final RegistryObject ENVIRONMENT_DETECTOR = register("environment_detector", () -> new APBlockEntityBlock<>(BlockEntityTypes.ENVIRONMENT_DETECTOR, false), () -> new APBlockItem(Blocks.ENVIRONMENT_DETECTOR.get(), CCRegistration.ID.ENVIRONMENT_TURTLE, CCRegistration.ID.ENVIRONMENT_POCKET, APConfig.PERIPHERALS_CONFIG.enableEnvironmentDetector::get));
-    public static final RegistryObject CHAT_BOX = register("chat_box", () -> new APBlockEntityBlock<>(BlockEntityTypes.CHAT_BOX, true), () -> new APBlockItem(Blocks.CHAT_BOX.get(), CCRegistration.ID.CHATTY_TURTLE, CCRegistration.ID.CHATTY_POCKET, APConfig.PERIPHERALS_CONFIG.enableChatBox::get));
-    public static final RegistryObject PLAYER_DETECTOR = register("player_detector", PlayerDetectorBlock::new, () -> new APBlockItem(Blocks.PLAYER_DETECTOR.get(), CCRegistration.ID.PLAYER_TURTLE, CCRegistration.ID.PLAYER_POCKET, APConfig.PERIPHERALS_CONFIG.enablePlayerDetector::get));
-    public static final RegistryObject ME_BRIDGE = register("me_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("ae2") ? BlockEntityTypes.ME_BRIDGE : null, ModList.get().isLoaded("ae2")), () -> new APBlockItem(Blocks.ME_BRIDGE.get(), null, null, APConfig.PERIPHERALS_CONFIG.enableMEBridge::get));
-    public static final RegistryObject RS_BRIDGE = register("rs_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("refinedstorage") ? BlockEntityTypes.RS_BRIDGE : null, false), () -> new APBlockItem(Blocks.RS_BRIDGE.get(), null, null, APConfig.PERIPHERALS_CONFIG.enableRSBridge::get));
-    public static final RegistryObject ENERGY_DETECTOR = register("energy_detector", () -> new APBlockEntityBlock<>(BlockEntityTypes.ENERGY_DETECTOR, true), () -> new APBlockItem(Blocks.ENERGY_DETECTOR.get(), null, null, APConfig.PERIPHERALS_CONFIG.enableEnergyDetector::get));
-    public static final RegistryObject PERIPHERAL_CASING = register("peripheral_casing", BaseBlock::new, () -> new APBlockItem(Blocks.PERIPHERAL_CASING.get(), new Item.Properties().stacksTo(16), null, null, () -> true));
-    public static final RegistryObject INVENTORY_MANAGER = register("inventory_manager", () -> new APBlockEntityBlock<>(BlockEntityTypes.INVENTORY_MANAGER, false), () -> new APBlockItem(Blocks.INVENTORY_MANAGER.get(), null, null, APConfig.PERIPHERALS_CONFIG.enableInventoryManager::get));
-    public static final RegistryObject REDSTONE_INTEGRATOR = register("redstone_integrator", RedstoneIntegratorBlock::new, () -> new APBlockItem(Blocks.REDSTONE_INTEGRATOR.get(), null, null, APConfig.PERIPHERALS_CONFIG.enableRedstoneIntegrator::get));
-    public static final RegistryObject BLOCK_READER = register("block_reader", () -> new APBlockEntityBlock<>(BlockEntityTypes.BLOCK_READER, true), () -> new APBlockItem(Blocks.BLOCK_READER.get(), null, null, APConfig.PERIPHERALS_CONFIG.enableBlockReader::get));
-    public static final RegistryObject GEO_SCANNER = register("geo_scanner", () -> new APBlockEntityBlock<>(BlockEntityTypes.GEO_SCANNER, false), () -> new APBlockItem(Blocks.GEO_SCANNER.get(), CCRegistration.ID.GEOSCANNER_TURTLE, CCRegistration.ID.GEOSCANNER_POCKET, APConfig.PERIPHERALS_CONFIG.enableGeoScanner::get));
-    public static final RegistryObject COLONY_INTEGRATOR = register("colony_integrator", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("minecolonies") ? BlockEntityTypes.COLONY_INTEGRATOR : null, false), () -> new APBlockItem(Blocks.COLONY_INTEGRATOR.get(), null, CCRegistration.ID.COLONY_POCKET, APConfig.PERIPHERALS_CONFIG.enableColonyIntegrator::get));
-    public static final RegistryObject NBT_STORAGE = register("nbt_storage", () -> new APBlockEntityBlock<>(BlockEntityTypes.NBT_STORAGE, false), () -> new APBlockItem(Blocks.NBT_STORAGE.get(), null, null, APConfig.PERIPHERALS_CONFIG.enableNBTStorage::get));
-
-    public static void register() {
-    }
-
-    private static  RegistryObject registerNoItem(String name, Supplier block) {
-        return Registration.BLOCKS.register(name, block);
-    }
-
-    private static  RegistryObject register(String name, Supplier block, Supplier blockItem) {
-        RegistryObject registryObject = registerNoItem(name, block);
-        Registration.ITEMS.register(name, blockItem);
-        return registryObject;
-    }
-
-    public static boolean never(BlockState state, BlockGetter level, BlockPos pos) {
-        return false;
-    }
-
-}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java
index d19ba1b01..45f877f6c 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java
@@ -5,9 +5,23 @@
 import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser;
 import de.srendi.advancedperipherals.AdvancedPeripherals;
 import de.srendi.advancedperipherals.common.addons.computercraft.integrations.IntegrationPeripheralProvider;
-import de.srendi.advancedperipherals.common.addons.computercraft.pocket.*;
-import de.srendi.advancedperipherals.common.addons.computercraft.turtles.*;
-import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.*;
+import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketChatBoxUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketColonyIntegratorUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketEnvironmentUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketGeoScannerUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketPlayerDetectorUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleChatBoxUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleChunkyUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleCompassUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleEnvironmentDetectorUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleGeoScannerUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtlePlayerDetectorUpgrade;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.EndAutomata;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.HusbandryAutomata;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.OverpoweredEndAutomata;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.OverpoweredHusbandryAutomata;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.OverpoweredWeakAutomata;
+import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.WeakAutomata;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraftforge.fml.common.Mod;
 import net.minecraftforge.registries.RegistryObject;
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/ContainerTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/ContainerTypes.java
deleted file mode 100644
index 68ed5dc8c..000000000
--- a/src/main/java/de/srendi/advancedperipherals/common/setup/ContainerTypes.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.srendi.advancedperipherals.common.setup;
-
-import de.srendi.advancedperipherals.common.container.InventoryManagerContainer;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.inventory.MenuType;
-import net.minecraft.world.level.Level;
-import net.minecraftforge.common.extensions.IForgeMenuType;
-import net.minecraftforge.registries.RegistryObject;
-
-public class ContainerTypes {
-
-    public static final RegistryObject> INVENTORY_MANAGER_CONTAINER = Registration.CONTAINER_TYPES.register("memory_card_container", () -> IForgeMenuType.create((windowId, inv, data) -> {
-        BlockPos pos = data.readBlockPos();
-        Level level = inv.player.getCommandSenderWorld();
-        return new InventoryManagerContainer(windowId, inv, pos, level);
-    }));
-
-    public static void register() {
-    }
-}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/Items.java b/src/main/java/de/srendi/advancedperipherals/common/setup/Items.java
deleted file mode 100644
index 5cf12df13..000000000
--- a/src/main/java/de/srendi/advancedperipherals/common/setup/Items.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package de.srendi.advancedperipherals.common.setup;
-
-import de.srendi.advancedperipherals.common.configuration.APConfig;
-import de.srendi.advancedperipherals.common.items.APItem;
-import de.srendi.advancedperipherals.common.items.MemoryCardItem;
-import de.srendi.advancedperipherals.common.items.WeakAutomataCore;
-import net.minecraft.world.item.Item;
-import net.minecraftforge.registries.RegistryObject;
-
-public class Items {
-
-    public static final RegistryObject CHUNK_CONTROLLER = Registration.ITEMS.register("chunk_controller", () -> new APItem(new Item.Properties().stacksTo(16), CCRegistration.ID.CHUNKY_TURTLE, null, APConfig.PERIPHERALS_CONFIG.enableChunkyTurtle::get));
-    public static final RegistryObject COMPUTER_TOOL = Registration.ITEMS.register("computer_tool", () -> new APItem(new Item.Properties().stacksTo(1), null, null, () -> true));
-    public static final RegistryObject MEMORY_CARD = Registration.ITEMS.register("memory_card", MemoryCardItem::new);
-    public static final RegistryObject END_AUTOMATA_CORE = Registration.ITEMS.register("end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), CCRegistration.ID.END_AUTOMATA, null, APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore));
-    public static final RegistryObject HUSBANDRY_AUTOMATA_CORE = Registration.ITEMS.register("husbandry_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), CCRegistration.ID.WEAK_AUTOMATA, null, APConfig.METAPHYSICS_CONFIG.enableHusbandryAutomataCore));
-    public static final RegistryObject WEAK_AUTOMATA_CORE = Registration.ITEMS.register("weak_automata_core", () -> new WeakAutomataCore(new Item.Properties().stacksTo(1), CCRegistration.ID.WEAK_AUTOMATA, null));
-    public static final RegistryObject OVERPOWERED_WEAK_AUTOMATA_CORE = Registration.ITEMS.register("overpowered_weak_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), CCRegistration.ID.OP_WEAK_AUTOMATA, null, APConfig.METAPHYSICS_CONFIG.enableWeakAutomataCore));
-    public static final RegistryObject OVERPOWERED_END_AUTOMATA_CORE = Registration.ITEMS.register("overpowered_end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), CCRegistration.ID.OP_END_AUTOMATA, null, APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore));
-    public static final RegistryObject OVERPOWERED_HUSBANDRY_AUTOMATA_CORE = Registration.ITEMS.register("overpowered_husbandry_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), CCRegistration.ID.OP_HUSBANDRY_AUTOMATA, null, APConfig.METAPHYSICS_CONFIG.enableHusbandryAutomataCore));
-
-    public static void register() {
-    }
-
-}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/Villagers.java b/src/main/java/de/srendi/advancedperipherals/common/setup/Villagers.java
deleted file mode 100644
index df00d9d8f..000000000
--- a/src/main/java/de/srendi/advancedperipherals/common/setup/Villagers.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.srendi.advancedperipherals.common.setup;
-
-import com.google.common.collect.ImmutableSet;
-import dan200.computercraft.shared.Registry;
-import de.srendi.advancedperipherals.AdvancedPeripherals;
-import net.minecraft.sounds.SoundEvents;
-import net.minecraft.world.entity.ai.village.poi.PoiType;
-import net.minecraft.world.entity.npc.VillagerProfession;
-import net.minecraftforge.registries.RegistryObject;
-
-public class Villagers {
-
-    public static final RegistryObject COMPUTER_SCIENTIST_POI = Registration.POI_TYPES.register("computer_scientist", () -> new PoiType(ImmutableSet.copyOf(Registry.ModBlocks.COMPUTER_ADVANCED.get().getStateDefinition().getPossibleStates()), 1, 1));
-    public static final RegistryObject COMPUTER_SCIENTIST = Registration.VILLAGER_PROFESSIONS.register("computer_scientist", () -> new VillagerProfession(AdvancedPeripherals.MOD_ID + ":computer_scientist", holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), ImmutableSet.of(), ImmutableSet.of(Registry.ModBlocks.COMPUTER_ADVANCED.get()), SoundEvents.VILLAGER_WORK_TOOLSMITH));
-
-    public static void register() {
-    }
-
-}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SlotType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SlotType.java
new file mode 100644
index 000000000..f5498935a
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SlotType.java
@@ -0,0 +1,22 @@
+package de.srendi.advancedperipherals.common.smartglasses;
+
+import net.minecraft.network.chat.Component;
+
+public enum SlotType {
+    PERIPHERALS(Component.translatable("text.advancedperipherals.smart_glasses.peripherals")),
+    MODULES(Component.translatable("text.advancedperipherals.smart_glasses.modules"));
+
+    private final Component name;
+
+    SlotType(Component name) {
+        this.name = name;
+    }
+
+    public Component getName() {
+        return name;
+    }
+
+    public static SlotType defaultType() {
+        return PERIPHERALS;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAPI.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAPI.java
new file mode 100644
index 000000000..04baafc24
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAPI.java
@@ -0,0 +1,11 @@
+package de.srendi.advancedperipherals.common.smartglasses;
+
+import dan200.computercraft.api.lua.ILuaAPI;
+
+public class SmartGlassesAPI implements ILuaAPI {
+    @Override
+    public String[] getNames() {
+        return new String[]{"smartglasses"};
+    }
+
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java
new file mode 100644
index 000000000..316c7a715
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java
@@ -0,0 +1,67 @@
+package de.srendi.advancedperipherals.common.smartglasses;
+
+import dan200.computercraft.api.peripheral.IPeripheral;
+import dan200.computercraft.api.pocket.IPocketAccess;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.entity.Entity;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Map;
+
+public class SmartGlassesAccess implements IPocketAccess {
+
+    private final SmartGlassesComputer computer;
+
+    public SmartGlassesAccess(SmartGlassesComputer computer) {
+        this.computer = computer;
+    }
+
+    @Nullable
+    @Override
+    public Entity getEntity() {
+        return computer.getEntity();
+    }
+
+    @Override
+    public int getColour() {
+        return 0;
+    }
+
+    @Override
+    public void setColour(int colour) {
+    }
+
+    @Override
+    public int getLight() {
+        return 0;
+    }
+
+    @Override
+    public void setLight(int colour) {
+    }
+
+    @Override
+    public CompoundTag getUpgradeNBTData() {
+        return new CompoundTag();
+    }
+
+    @Override
+    public void updateUpgradeNBTData() {
+
+    }
+
+    @Override
+    public void invalidatePeripheral() {
+
+    }
+
+    @Override
+    public Map getUpgrades() {
+        return computer.getUpgrades();
+    }
+
+    public SmartGlassesComputer getComputer() {
+        return computer;
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java
index 3f48b58e7..e28b7857a 100644
--- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java
@@ -1,9 +1,7 @@
 package de.srendi.advancedperipherals.common.smartglasses;
 
 import de.srendi.advancedperipherals.common.items.SmartGlassesItem;
-import de.srendi.advancedperipherals.common.setup.APItems;
 import net.minecraft.core.NonNullList;
-import net.minecraft.nbt.CompoundTag;
 import net.minecraft.world.ContainerHelper;
 import net.minecraft.world.item.ItemStack;
 import net.minecraftforge.items.IItemHandlerModifiable;
@@ -76,6 +74,7 @@ public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate
             } else {
                 existing.grow(reachedLimit ? limit : stack.getCount());
             }
+
             setChanged();
         }
 
@@ -110,7 +109,6 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) {
         return ItemHandlerHelper.copyStackWithSize(existing, toExtract);
     }
 
-    @NotNull
     @Override
     public ItemStack getStackInSlot(int slot) {
         return loadItems().get(slot);
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesMenuProvider.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesMenuProvider.java
new file mode 100644
index 000000000..bf1fb3b53
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesMenuProvider.java
@@ -0,0 +1,43 @@
+package de.srendi.advancedperipherals.common.smartglasses;
+
+import dan200.computercraft.shared.computer.core.ServerComputer;
+import de.srendi.advancedperipherals.common.container.SmartGlassesContainer;
+import net.minecraft.network.chat.Component;
+import net.minecraft.world.MenuProvider;
+import net.minecraft.world.entity.player.Inventory;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.inventory.AbstractContainerMenu;
+import net.minecraft.world.item.ItemStack;
+import net.minecraftforge.items.IItemHandler;
+import org.jetbrains.annotations.NotNull;
+
+import javax.annotation.Nullable;
+
+public class SmartGlassesMenuProvider implements MenuProvider {
+    private final ServerComputer computer;
+    private final Component name;
+    private final IItemHandler glassesContainer;
+
+    public SmartGlassesMenuProvider(ServerComputer computer, ItemStack stack, IItemHandler glassesContainer) {
+        this.computer = computer;
+        name = stack.getHoverName();
+        this.glassesContainer = glassesContainer;
+    }
+
+    @NotNull
+    @Override
+    public Component getDisplayName() {
+        return name;
+    }
+
+    @Nullable
+    @Override
+    public AbstractContainerMenu createMenu(int id, @NotNull Inventory inventory, @NotNull Player entity) {
+        return new SmartGlassesContainer(id,
+                p -> {
+                    return true;
+                },
+                computer, inventory, glassesContainer, null
+        );
+    }
+}
diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModule.java
new file mode 100644
index 000000000..57376e535
--- /dev/null
+++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModule.java
@@ -0,0 +1,38 @@
+package de.srendi.advancedperipherals.common.smartglasses.modules;
+
+import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess;
+import net.minecraft.resources.ResourceLocation;
+import org.jetbrains.annotations.Nullable;
+
+public interface IModule {
+
+    ResourceLocation getName();
+
+    /**
+     * Used to define the available functions of the module. This method only gets called once when indexing the modules
+     * 

+ * Return null if the module does not have any functions + * + * @return an object containing lua functions {@link dan200.computercraft.api.lua.LuaFunction} + */ + @Nullable + IModuleFunctions getFunctions(SmartGlassesAccess smartGlassesAccess); + + /** + * Classic tick function. + *

+ * Implementations should check if the entity is not null since the glasses can still tick without belonging to an entity + * @param smartGlassesAccess Contains access to the entity, the computer, the level or the upgrades + */ + default void tick(SmartGlassesAccess smartGlassesAccess) {} + + default void onUnequipped(SmartGlassesAccess smartGlassesAccess) {} + + /** + * ErrorConstants class contains constants for error messages. This is used for easier error handling for users. + */ + class ErrorConstants { + public static final String ALREADY_EXISTS = "ID_ALREADY_EXISTS"; + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleFunctions.java new file mode 100644 index 000000000..3656500eb --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleFunctions.java @@ -0,0 +1,13 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules; + +import de.srendi.advancedperipherals.lib.peripherals.IPeripheralPlugin; + +/** + * Used to define the available functions of the module. + * Functions can be defined by creating final public methods annotated with the @{@link dan200.computercraft.api.lua.LuaFunction} annotation + */ +public interface IModuleFunctions extends IPeripheralPlugin { + + IModuleFunctions EMPTY = new IModuleFunctions() {}; + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleItem.java new file mode 100644 index 000000000..bed3560a2 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/IModuleItem.java @@ -0,0 +1,24 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules; + +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +public interface IModuleItem { + + IModule createModule(SmartGlassesAccess access); + + /** + * This method is called every tick the item is in the inventory of the smart glasses + * Runs on the client and server side + * + * @param access The access to the smart glasses - Null on the client side + * @param module The module - Null on the client side + */ + default void inventoryTick(ItemStack itemStack, Level level, Entity entity, int inventorySlot, boolean isCurrentItem, @Nullable SmartGlassesAccess access, @Nullable IModule module) { + + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java new file mode 100644 index 000000000..67bf2b6f0 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java @@ -0,0 +1,114 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules; + +import de.srendi.advancedperipherals.common.addons.computercraft.owner.BasePeripheralOwner; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; +import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.FrontAndTop; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.apache.commons.lang3.NotImplementedException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; + +public class ModulePeripheralOwner extends BasePeripheralOwner { + + //TODO: Think about making our own smart glasses access so we don't have the not used stuff like the color or the light + // We would need to remove the pocket stuff from the SmartGlassesComputer + private final SmartGlassesComputer computer; + + public ModulePeripheralOwner(SmartGlassesComputer computer) { + this.computer = computer; + } + + @Nullable + @Override + public String getCustomName() { + return "smartglasses"; + } + + @Nullable + @Override + public Level getLevel() { + return computer.getEntity().getLevel(); + } + + @NotNull + @Override + public BlockPos getPos() { + return computer.getEntity().getOnPos(); + } + + @NotNull + @Override + public Direction getFacing() { + return Direction.NORTH; + } + + @NotNull + @Override + public FrontAndTop getOrientation() { + return FrontAndTop.NORTH_UP; + } + + @NotNull + public SmartGlassesComputer getComputer() { + return computer; + } + + @Nullable + @Override + public Player getOwner() { + Entity owner = computer.getEntity(); + if (owner instanceof Player player) return player; + return null; + } + + @NotNull + @Override + public CompoundTag getDataStorage() { + return computer.getUpgradeNBTData(); + } + + @Override + public void markDataStorageDirty() { + computer.updateUpgradeNBTData(); + } + + @Override + public T withPlayer(Function function) { + throw new NotImplementedException(); + } + + @Override + public ItemStack getToolInMainHand() { + return ItemStack.EMPTY; + } + + @Override + public ItemStack storeItem(ItemStack stored) { + throw new NotImplementedException(); + } + + @Override + public void destroyUpgrade() { + throw new NotImplementedException(); + } + + @Override + public boolean isMovementPossible(@NotNull Level level, @NotNull BlockPos pos) { + return false; + } + + @Override + public boolean move(@NotNull Level level, @NotNull BlockPos pos) { + return false; + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModule.java new file mode 100644 index 000000000..c695a8334 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModule.java @@ -0,0 +1,21 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.hotkey; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; +import net.minecraft.resources.ResourceLocation; + +public class HotkeyModule implements IModule { + + @Override + public ResourceLocation getName() { + return AdvancedPeripherals.getRL("hotkey"); + } + + @Override + public IModuleFunctions getFunctions(SmartGlassesAccess smartGlassesAccess) { + return null; + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java new file mode 100644 index 000000000..c2817a9c2 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java @@ -0,0 +1,58 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.hotkey; + +import de.srendi.advancedperipherals.client.KeyBindings; +import de.srendi.advancedperipherals.common.items.base.BaseItem; +import de.srendi.advancedperipherals.common.network.PacketHandler; +import de.srendi.advancedperipherals.common.network.toserver.GlassesHotkeyPacket; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; +import de.srendi.advancedperipherals.common.util.KeybindUtil; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +public class HotkeyModuleItem extends BaseItem implements IModuleItem { + + private static final String KEY_PRESS_DURATION_NBT = "KeyPressDuration"; + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public IModule createModule(SmartGlassesAccess access) { + return new HotkeyModule(); + } + + @Override + public void inventoryTick(@NotNull ItemStack stack, @NotNull Level level, @NotNull Entity entity, int slot, boolean isSelected) { + if (!level.isClientSide() || !(entity instanceof Player player)) + return; + + if (KeybindUtil.isKeyPressed(KeyBindings.GLASSES_HOTKEY_KEYBINDING)) { + // Add another 50ms to the duration, one tick + setKeyPressDuration(stack, getKeyPressDuration(stack) + 50); + } else if(getKeyPressDuration(stack) > 0) { + // If the key is not pressed, but the duration is greater than 0, we can assume that the key was pressed + // We can now post the event + + int duration = getKeyPressDuration(stack); + setKeyPressDuration(stack, 0); + + String keyBind = KeyBindings.GLASSES_HOTKEY_KEYBINDING.getKey().getName(); + PacketHandler.sendToServer(new GlassesHotkeyPacket(player.getUUID(), keyBind, duration)); + } + } + + public static int getKeyPressDuration(ItemStack stack) { + return stack.copy().getOrCreateTag().getInt(KEY_PRESS_DURATION_NBT); + } + + public static void setKeyPressDuration(ItemStack stack, int keyPressDuration) { + stack.getOrCreateTag().putInt(KEY_PRESS_DURATION_NBT, keyPressDuration); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectProperty.java new file mode 100644 index 000000000..4f332efd5 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectProperty.java @@ -0,0 +1,22 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; + +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.PropertyType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation is used to mark a field as a property. It is used for the properties of lua objects. + * Fields annotated with @ObjectProperty will be accessible in lua via the arguments/the filter table for the specific object. + * @see PropertyType + * @see OverlayObject + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.ANNOTATION_TYPE) +public @interface ObjectProperty { + + Class> type(); + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java new file mode 100644 index 000000000..2ad26b3a8 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -0,0 +1,42 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.MethodResult; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; +import de.srendi.advancedperipherals.common.util.Pair; + +public class OverlayGlassesFunctions implements IModuleFunctions { + + private final OverlayModule overlayModule; + private final SmartGlassesAccess access; + + public OverlayGlassesFunctions(OverlayModule overlayModule) { + this.overlayModule = overlayModule; + this.access = overlayModule.access; + } + + @LuaFunction + public final String test() { + return "Hello World! I'm an overlay module!"; + } + + @LuaFunction + public final MethodResult createPanel(String id, IArguments arguments) throws LuaException { + Panel panel = new Panel(id, overlayModule, arguments); + Pair success = overlayModule.addObject(panel); + if(!success.getRight()) + return MethodResult.of(success.getLeft(), IModule.ErrorConstants.ALREADY_EXISTS); + + return MethodResult.of(success.getLeft(), "SUCCESS"); + } + + @LuaFunction + public final MethodResult getObjects(IArguments arguments) { + return MethodResult.of((Object) overlayModule.getObjects().stream().map(OverlayObject::getId).toArray(String[]::new)); + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesItem.java new file mode 100644 index 000000000..20a3bd78b --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesItem.java @@ -0,0 +1,19 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; + +import de.srendi.advancedperipherals.common.items.base.BaseItem; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; + +public class OverlayGlassesItem extends BaseItem implements IModuleItem { + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public IModule createModule(SmartGlassesAccess smartGlassesAccess) { + return new OverlayModule(smartGlassesAccess); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java new file mode 100644 index 000000000..e7b5c9fe9 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java @@ -0,0 +1,69 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; +import de.srendi.advancedperipherals.common.util.Pair; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.CopyOnWriteArraySet; + + +/** + * We want to support scripts which were made for the plethora classes. So we call this item the same as the overlay item from plethora + * We'll first add our own implementation for a rendering system and then add the API endpoints for plethora scripts + */ +public class OverlayModule implements IModule { + + public final CopyOnWriteArraySet objects = new CopyOnWriteArraySet<>(); + public final SmartGlassesAccess access; + + public OverlayModule(SmartGlassesAccess access) { + this.access = access; + } + + @Override + public ResourceLocation getName() { + return AdvancedPeripherals.getRL("glasses"); + } + + @Override + public IModuleFunctions getFunctions(SmartGlassesAccess smartGlassesAccess) { + return new OverlayGlassesFunctions(this); + } + + @Override + public void tick(@NotNull SmartGlassesAccess smartGlassesAccess) { + /* + Entity entity = smartGlassesAccess.getEntity(); + if (entity != null && entity.getLevel().getGameTime() % 20 == 0) + AdvancedPeripherals.LOGGER.info("I'm an overlay module! And I'm alive!"); + */ + } + + public SmartGlassesAccess getAccess() { + return access; + } + + public CopyOnWriteArraySet getObjects() { + return objects; + } + + /** + * Adds an object to the module. If the object already exists, it will return the object and stop proceeding + * + * @param object The object which should be added + * @return A pair of the object and a boolean. The boolean is true if the object was added successfully and false if not. + * The object is the object which was added or the object which already exists(When not successful). + */ + public Pair addObject(OverlayObject object) { + for (OverlayObject overlayObject : objects) { + if (overlayObject.getId().equals(object.getId())) + return Pair.of(overlayObject, false); + } + objects.add(object); + return Pair.of(object, true); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java new file mode 100644 index 000000000..ff584021d --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java @@ -0,0 +1,194 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.BooleanProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.PropertyType; +import de.srendi.advancedperipherals.common.util.StringUtil; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.network.NetworkEvent; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.logging.log4j.Level; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + + +public abstract class OverlayObject { + + @BooleanProperty + private boolean enabled = true; + + private final String id; + private OverlayModule module; + private UUID player; + + public OverlayObject(String id, OverlayModule module, IArguments arguments) { + this.id = id; + this.module = module; + } + + /** + * For clientside initialization + */ + public OverlayObject(String id, UUID player) { + this.id = id; + this.player = player; + } + + @LuaFunction + public final String getId() { + return id; + } + + public OverlayModule getModule() { + return module; + } + + public UUID getPlayer() { + return player; + } + + @LuaFunction + public final void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + @LuaFunction + public final boolean isEnabled() { + return enabled; + } + + /** + * Maps properties from the provided arguments to the fields of this class. + *

+ * This method uses Java Reflection to map properties from IArguments to the fields of the classes. + * It only maps properties that have the annotation {@link ObjectProperty}. If a field does not have this annotation, + * a warning message is logged and the method returns. + *

+ * If a property is valid, its value is cast to the field type and set as the new value of the field. + * If a property is not valid, a warning message is logged and the method returns. + *

+ * If an error occurs during the mapping of properties, an exception message is logged and a LuaException is thrown. + * + * @param arguments the IArguments containing properties to be mapped + * @throws LuaException if an error occurs during the mapping of properties + * @see IArguments + * @see ObjectProperty + * @see PropertyType + */ + public void reflectivelyMapProperties(IArguments arguments) throws LuaException { + if (arguments.optTable(1).isEmpty()) + return; + + try { + Map properties = arguments.optTable(1).get().entrySet().stream() + .filter(entry -> entry.getKey() instanceof String) + .collect(Collectors.toMap(entry -> (String) entry.getKey(), Map.Entry::getValue)); + + Field[] allFields = FieldUtils.getAllFields(this.getClass()); + + for (Field field : allFields) { + if (properties.containsKey(field.getName())) { + var value = properties.get(field.getName()); + + Annotation[] fieldProperties = field.getAnnotations(); + ObjectProperty objectProperty = null; + Annotation propertyAnnotation = null; + + for (Annotation annotation : fieldProperties) { + objectProperty = annotation.annotationType().getAnnotation(ObjectProperty.class); + if (objectProperty != null) { + propertyAnnotation = annotation; + break; + } + } + + if (objectProperty == null) { + AdvancedPeripherals.debug("The field " + field.getName() + " has no ObjectProperty annotation and can't be changed.", Level.WARN); + return; + } + + PropertyType propertyType = PropertyType.of(objectProperty); + if (propertyType != null) { + value = castValueToFieldType(field, value); + if (propertyType.checkIsValid(value)) { + propertyType.init(propertyAnnotation); + value = propertyType.mapValue(value); + + // Make the field accessible + field.setAccessible(true); + + // Set the value of the field + field.set(this, castValueToFieldType(field, value)); + + } else { + AdvancedPeripherals.debug("The value " + value + " is not valid for the field " + field.getName() + ".", Level.WARN); + return; + } + } + } + } + } catch (LuaException | IllegalAccessException exception) { + AdvancedPeripherals.exception("An error occurred while mapping properties.", exception); + throw new LuaException("An error occurred while mapping properties."); + } + } + + /** + * Casts the given value to the type of the provided field. + * Can be overwritten if the desired casting is not supported. + * + * @param field the field object representing the type to cast to + * @param value the value to be casted + * @return the casted value + */ + public Object castValueToFieldType(Field field, Object value) { + Class fieldType = field.getType(); + + if (fieldType.isAssignableFrom(value.getClass())) { + return value; + } else if (fieldType.equals(Integer.TYPE)) { + return Integer.valueOf(StringUtil.removeFloatingPoints(value.toString())); + } else if (fieldType.equals(Double.TYPE)) { + return Double.valueOf(value.toString()); + } else if (fieldType.equals(Boolean.TYPE)) { + return Boolean.valueOf(value.toString()); + } else if (fieldType.equals(Long.TYPE)) { + return Long.valueOf(StringUtil.removeFloatingPoints(value.toString())); + } else if (fieldType.equals(Short.TYPE)) { + return Short.valueOf(StringUtil.removeFloatingPoints(value.toString())); + } else if (fieldType.equals(Byte.TYPE)) { + return Byte.valueOf(StringUtil.removeFloatingPoints(value.toString())); + } else if (fieldType.equals(Float.TYPE)) { + return Float.valueOf(value.toString()); + } else { + AdvancedPeripherals.debug("The field type " + fieldType.getName() + " is not supported for the value " + value + ".", Level.WARN); + } + return value; + } + + protected void handle(NetworkEvent.Context context) { + + } + + protected void encode(FriendlyByteBuf buffer) { + buffer.writeUtf(id); + Entity entity = module.getAccess().getEntity(); + if(entity instanceof Player player) { + buffer.writeBoolean(true); + buffer.writeUUID(player.getUUID()); + } else { + // Should theoretically never happen. But better safe than sorry + buffer.writeBoolean(false); + } + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java new file mode 100644 index 000000000..562c07f10 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java @@ -0,0 +1,61 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +/** + * A panel is the standard panel which can contain multiple render-able objects in it. + */ +public class Panel extends RenderableObject { + + public Panel(String id, OverlayModule module, IArguments arguments) throws LuaException { + super(id, module, arguments); + } + + /** + * constructor for the client side initialization + * + * @param id id of the object + * @param player the target player + */ + public Panel(String id, UUID player) { + super(id, player); + } + + @Override + protected void encode(FriendlyByteBuf buffer) { + super.encode(buffer); + buffer.writeInt(color); + buffer.writeDouble(opacity); + } + + @Nullable + public static Panel decode(FriendlyByteBuf buffer) { + String id = buffer.readUtf(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + double opacity = buffer.readDouble(); + + Panel clientPanel = new Panel(id, player); + clientPanel.color = color; + clientPanel.opacity = opacity; + + return clientPanel; + } + + @Override + protected void handle(NetworkEvent.Context context) { + super.handle(context); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java new file mode 100644 index 000000000..01cad70a2 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java @@ -0,0 +1,47 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FixedPointNumberProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FloatingNumberProperty; + +import java.util.UUID; + +public abstract class RenderableObject extends OverlayObject { + + @FloatingNumberProperty(min = 0, max = 1) + public double opacity = 1; + + @FixedPointNumberProperty(min = 0, max = 0xFFFFFF) + public int color = 0xFFFFFF; + + @LuaFunction + public double getOpacity() { + return opacity; + } + + @LuaFunction + public void setOpacity(double opacity) { + this.opacity = opacity; + } + + @LuaFunction + public int getColor() { + return color; + } + + @LuaFunction + public void setColor(int color) { + this.color = color; + } + + public RenderableObject(String id, OverlayModule module, IArguments arguments) throws LuaException { + super(id, module, arguments); + reflectivelyMapProperties(arguments); + } + + public RenderableObject(String id, UUID player) { + super(id, player); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanProperty.java new file mode 100644 index 000000000..dc082c9d8 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanProperty.java @@ -0,0 +1,15 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; + +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@ObjectProperty(type = BooleanType.class) +public @interface BooleanProperty { + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanType.java new file mode 100644 index 000000000..25ab0f531 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanType.java @@ -0,0 +1,20 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; + +public class BooleanType implements PropertyType { + + @Override + public boolean checkIsValid(Object type) { + return type instanceof Boolean; + } + + @Override + public Boolean mapValue(Object type) { + return (Boolean) type; + } + + @Override + public void init(Object property) { + // Nothing to init here, we don't have any filters for booleans + } +} + diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberProperty.java new file mode 100644 index 000000000..a65635363 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberProperty.java @@ -0,0 +1,18 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; + +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@ObjectProperty(type = FixedPointNumberType.class) +public @interface FixedPointNumberProperty { + + long min() default Long.MIN_VALUE; + long max() default Long.MAX_VALUE; + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberType.java new file mode 100644 index 000000000..04bf3bde7 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberType.java @@ -0,0 +1,34 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; + +import de.srendi.advancedperipherals.AdvancedPeripherals; + +public class FixedPointNumberType implements PropertyType { + + public long min; + public long max; + + @Override + public boolean checkIsValid(Object type) { + return type instanceof Long || type instanceof Integer || type instanceof Short || type instanceof Byte; + } + + @Override + public Number mapValue(Object type) { + if (type instanceof Long) + return Math.min(Math.max((long) type, min), max); + if (type instanceof Integer) + return Math.min(Math.max((int) type, (int) min), (int) max); + if (type instanceof Short) + return Math.min(Math.max((short) type, (short) min), (short) max); + return Math.min(Math.max((byte) type, (byte) min), (byte) max); + } + + @Override + public void init(Object property) { + FixedPointNumberProperty decimalProperty = (FixedPointNumberProperty) property; + min = decimalProperty.min(); + max = decimalProperty.max(); + AdvancedPeripherals.debug("Initialized number property with min " + min + " and max " + max); + } +} + diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java new file mode 100644 index 000000000..e377472f3 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java @@ -0,0 +1,18 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; + +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@ObjectProperty(type = FloatingNumberType.class) +public @interface FloatingNumberProperty { + + double min() default Double.MIN_VALUE; + double max() default Double.MAX_VALUE; + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java new file mode 100644 index 000000000..05d6eb8df --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java @@ -0,0 +1,29 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; + +import de.srendi.advancedperipherals.AdvancedPeripherals; + +public class FloatingNumberType implements PropertyType { + + public double min; + public double max; + + @Override + public boolean checkIsValid(Object type) { + return type instanceof Float || type instanceof Double; + } + + @Override + public Number mapValue(Object type) { + AdvancedPeripherals.debug("Mapping value " + type + " to " + Math.min(Math.max((double) type, min), max)); + return Math.min(Math.max((double) type, min), max); + } + + @Override + public void init(Object property) { + FloatingNumberProperty decimalProperty = (FloatingNumberProperty) property; + min = decimalProperty.min(); + max = decimalProperty.max(); + AdvancedPeripherals.debug("Initialized decimal property with min " + min + " and max " + max); + } +} + diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/PropertyType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/PropertyType.java new file mode 100644 index 000000000..bd29944ba --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/PropertyType.java @@ -0,0 +1,31 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; + +import java.lang.reflect.InvocationTargetException; + +/** + * This interface represents a property type. It is used to check if a value is valid for the property and to map the value to the correct type. + * + * @param the type of the property value + * @see ObjectProperty + */ +public interface PropertyType { + + boolean checkIsValid(Object type); + + T mapValue(Object type); + + static PropertyType of(ObjectProperty property) { + try { + return property.type().getDeclaredConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException exception) { + AdvancedPeripherals.exception("An error occurred while trying to create the property type", exception); + } + return null; + } + + void init(Object property); + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java index 85f813956..4ad348a96 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java @@ -28,7 +28,7 @@ public class CoordUtil { * @return If the player is in the {@code range} as well as in the {@code maxRange}, or {@code range} and {@code maxRange} are -1 */ public static boolean isInRange(@Nullable BlockPos pos, @Nullable Level world, @Nullable Player player, int range, int maxRange) { - // There are rare cases where these are null. For example if a player detector pocket computer runs while not in a player inventory + // There are rare cases where these can be null. For example if a player detector pocket computer runs while not in a player inventory // Fixes https://github.com/SirEndii/AdvancedPeripherals/issues/356 if (pos == null || world == null || player == null) { return false; @@ -105,21 +105,20 @@ public static boolean isInRange(@Nullable BlockPos blockPos, @Nullable Player pl } public static Direction getDirection(FrontAndTop orientation, String computerSide) throws LuaException { - if (computerSide == null) { + if (computerSide == null) throw new LuaException("null is not a valid side"); - } computerSide = computerSide.toLowerCase(Locale.ROOT); Direction dir = Direction.byName(computerSide); if (dir != null) return dir; + Direction top = orientation.top(); Direction front = orientation.front(); final ComputerSide side = ComputerSide.valueOfInsensitive(computerSide); - if (side == null) { + if (side == null) throw new LuaException(computerSide + " is not a valid side"); - } if (front.getAxis() == Direction.Axis.Y) { return switch (side) { @@ -140,6 +139,7 @@ public static Direction getDirection(FrontAndTop orientation, String computerSid case LEFT -> front.getClockWise(); }; } + } public static ComputerSide getComputerSide(FrontAndTop orientation, Direction direction) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/FluidStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/FluidStorageProxy.java new file mode 100644 index 000000000..a61361aa0 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/FluidStorageProxy.java @@ -0,0 +1,92 @@ +package de.srendi.advancedperipherals.common.util; + +import de.srendi.advancedperipherals.common.blocks.blockentities.FluidDetectorEntity; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public class FluidStorageProxy implements IFluidHandler { + + private final FluidDetectorEntity fluidDetectorEntity; + private int maxTransferRate; + private int transferedInThisTick = 0; + private final Fluid fluid = Fluids.EMPTY; + + public FluidStorageProxy(FluidDetectorEntity fluidDetectorEntity, int maxTransferRate) { + this.fluidDetectorEntity = fluidDetectorEntity; + this.maxTransferRate = maxTransferRate; + } + + + public int getMaxTransferRate() { + return maxTransferRate; + } + + public void setMaxTransferRate(int rate) { + maxTransferRate = rate; + } + + /** + * should be called on every tick + */ + public void resetTransferedInThisTick() { + transferedInThisTick = 0; + } + + public int getTransferedInThisTick() { + return transferedInThisTick; + } + + @Override + public int getTanks() { + return 1; + } + + @Override + public @NotNull FluidStack getFluidInTank(int tank) { + Optional out = fluidDetectorEntity.getOutputStorage(); + return out.map(outStorage -> outStorage.getFluidInTank(tank)).orElse(FluidStack.EMPTY); + } + + @Override + public int getTankCapacity(int tank) { + Optional out = fluidDetectorEntity.getOutputStorage(); + return out.map(outStorage -> outStorage.getTankCapacity(tank)).orElse(0); + } + + @Override + public boolean isFluidValid(int tank, @NotNull FluidStack stack) { + Optional out = fluidDetectorEntity.getOutputStorage(); + return out.map(outStorage -> outStorage.isFluidValid(tank, stack)).orElse(false); + } + + @Override + public int fill(FluidStack resource, IFluidHandler.FluidAction action) { + Optional out = fluidDetectorEntity.getOutputStorage(); + return out.map(outStorage -> { + FluidStack transferring = resource.copy(); + transferring.setAmount(Math.min(resource.getAmount(), maxTransferRate)); + int transferred = outStorage.fill(transferring, action); + if (!action.simulate()) { + transferedInThisTick += transferred; + fluidDetectorEntity.lastFlowedLiquid = resource.copy(); + //transferedInThisTick = transferred; + } + return transferred; + }).orElse(0); + } + + @Override + public @NotNull FluidStack drain(int maxDrain, IFluidHandler.FluidAction action) { + return FluidStack.EMPTY; + } + + @Override + public @NotNull FluidStack drain(FluidStack resource, IFluidHandler.FluidAction action) { + return FluidStack.EMPTY; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/GasStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/GasStorageProxy.java new file mode 100644 index 000000000..d4e514a6d --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/GasStorageProxy.java @@ -0,0 +1,99 @@ +package de.srendi.advancedperipherals.common.util; + +import de.srendi.advancedperipherals.common.blocks.blockentities.GasDetectorEntity; +import mekanism.api.Action; +import mekanism.api.chemical.gas.GasStack; +import mekanism.api.chemical.gas.IGasHandler; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public class GasStorageProxy implements IGasHandler { + + private final GasDetectorEntity fluidDetectorEntity; + private int maxTransferRate; + private int transferedInThisTick = 0; + + public GasStorageProxy(GasDetectorEntity fluidDetectorEntity, int maxTransferRate) { + this.fluidDetectorEntity = fluidDetectorEntity; + this.maxTransferRate = maxTransferRate; + } + + + public int getMaxTransferRate() { + return maxTransferRate; + } + + public void setMaxTransferRate(int rate) { + maxTransferRate = rate; + } + + /** + * should be called on every tick + */ + public void resetTransferedInThisTick() { + transferedInThisTick = 0; + } + + public int getTransferedInThisTick() { + return transferedInThisTick; + } + + @Override + public int getTanks() { + return 1; + } + + @NotNull + @Override + public GasStack getChemicalInTank(int tank) { + Optional out = fluidDetectorEntity.getOutputStorage(); + return out.map(outStorage -> outStorage.getChemicalInTank(tank)).orElse(GasStack.EMPTY); + } + + @Override + public void setChemicalInTank(int tank, @NotNull GasStack stack) { + Optional out = fluidDetectorEntity.getOutputStorage(); + out.ifPresent(outStorage -> outStorage.setChemicalInTank(tank, stack)); + } + + @Override + public long getTankCapacity(int tank) { + Optional out = fluidDetectorEntity.getOutputStorage(); + return out.map(outStorage -> outStorage.getTankCapacity(tank)).orElse(0L); + } + + @Override + public boolean isValid(int tank, @NotNull GasStack stack) { + Optional out = fluidDetectorEntity.getOutputStorage(); + return out.map(outStorage -> outStorage.isValid(tank, stack)).orElse(false); + } + + @NotNull + @Override + public GasStack insertChemical(@NotNull GasStack stack, @NotNull Action action) { + Optional out = fluidDetectorEntity.getOutputStorage(); + return out.map(outStorage -> { + GasStack transferring = stack.copy(); + transferring.setAmount(Math.min(stack.getAmount(), maxTransferRate)); + GasStack transferred = outStorage.insertChemical(transferring, action); + if (!action.simulate()) { + transferedInThisTick += transferring.getAmount() - transferred.getAmount(); + fluidDetectorEntity.lastFlowedGas = stack.copy(); + } + return transferred; + }).orElse(GasStack.EMPTY); + } + + @NotNull + @Override + public GasStack insertChemical(int tank, @NotNull GasStack stack, @NotNull Action action) { + return insertChemical(stack, action); + } + + @NotNull + @Override + public GasStack extractChemical(int tank, long amount, @NotNull Action action) { + return GasStack.EMPTY; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java new file mode 100644 index 000000000..1a9508a1e --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java @@ -0,0 +1,157 @@ +package de.srendi.advancedperipherals.common.util; + +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.DistanceDetectorPeripheral; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.*; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class HitResultUtil { + + /** + * This method is used to get the hit result of an entity from the start position of a block + * + * @param to the target position/max position + * @param from the source position like a block + * @param level the level + * @param ignoreTransparent if transparent blocks should be ignored + * @return the hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found + */ + @NotNull + public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreTransparent) { + EntityHitResult entityResult = getEntityHitResult(to, from, level); + BlockHitResult blockResult = getBlockHitResult(to, from, level, ignoreTransparent); + + if (entityResult.getType() != HitResult.Type.MISS && blockResult.getType() == HitResult.Type.MISS) + return entityResult; + + if (entityResult.getType() == HitResult.Type.MISS && blockResult.getType() != HitResult.Type.MISS) + return blockResult; + + if (entityResult.getType() == HitResult.Type.MISS && blockResult.getType() == HitResult.Type.MISS) + return BlockHitResult.miss(from, blockResult.getDirection(), new BlockPos(to)); + + double blockDistance = new BlockPos(from).distManhattan(blockResult.getBlockPos()); + double entityDistance = new BlockPos(from).distManhattan(new Vec3i(entityResult.getLocation().x, entityResult.getLocation().y, entityResult.getLocation().z)); + + if (blockDistance < entityDistance) + return blockResult; + + return entityResult; + } + + /** + * This method is used to get the hit result of an entity from the start position of a block + * This could be used to find an entity from the eyes position of another entity but since + * this method uses one AABB made out of the two coordinates, this would also find any entities + * which are not located in the ray you might want. {@link DistanceDetectorPeripheral#getDistance()} + * + * @param to the target position/max position + * @param from the source position like a block + * @param level the world + * @return the entity hit result. An empty HitResult with {@link HitResult.Type#MISS} as type if nothing found + */ + @NotNull + public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level) { + AABB checkingBox = new AABB(to, from); + + List entities = level.getEntities((Entity) null, checkingBox, (entity) -> true); + + if (entities.isEmpty()) + return new EmptyEntityHitResult(); + + Entity nearestEntity = null; + + // Find the nearest entity + for (Entity entity : entities) { + if (nearestEntity == null) { + nearestEntity = entity; + continue; + } + + double distance = new BlockPos(from).distManhattan(new Vec3i(entity.getX(), entity.getY(), entity.getZ())); + double nearestDistance = new BlockPos(from).distManhattan(new Vec3i(nearestEntity.getX(), nearestEntity.getY(), nearestEntity.getZ())); + + // If it's closer, set it as the nearest entity + if (distance < nearestDistance) + nearestEntity = entity; + } + + return new EntityHitResult(nearestEntity); + } + + /** + * This method is used to get the hit result of a block from the start position of a block + * + * @param to the target position/max position + * @param from the source position + * @param level the world + * @param ignoreNoOccluded if true, the method will ignore blocks which are not occluding like glass + * @return the block hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found + */ + @NotNull + public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreNoOccluded) { + return level.clip(new AdvancecClipContext(from, to, ignoreNoOccluded ? IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, null)); + } + + public static class EmptyEntityHitResult extends EntityHitResult { + + /** + * The super constructor is a NotNull argument but since this result is empty, we'll just return null + */ + public EmptyEntityHitResult() { + super(null, null); + } + + @NotNull + @Override + public Type getType() { + return Type.MISS; + } + } + + /** + * A shape getter which ignores blocks which are not occluding like glass + */ + private enum IgnoreNoOccludedContext implements ClipContext.ShapeGetter { + + INSTANCE; + + @NotNull + @Override + public VoxelShape get(BlockState pState, @NotNull BlockGetter pBlock, @NotNull BlockPos pPos, @NotNull CollisionContext pCollisionContext) { + return !pState.canOcclude() ? Shapes.empty() : pState.getCollisionShape(pBlock, pPos, pCollisionContext); + } + } + + /** + * A clip context but with a custom shape getter. Used to define another shape getter for the block like {@link IgnoreNoOccludedContext} + */ + private static class AdvancecClipContext extends ClipContext { + + private final ShapeGetter blockShapeGetter; + + protected AdvancecClipContext(Vec3 from, Vec3 to, ShapeGetter blockShapeGetter, Fluid fluidShapeGetter, @Nullable Entity entity) { + super(from, to, Block.COLLIDER, fluidShapeGetter, entity); + this.blockShapeGetter = blockShapeGetter; + } + + @NotNull + @Override + public VoxelShape getBlockShape(@NotNull BlockState pBlockState, @NotNull BlockGetter pLevel, @NotNull BlockPos pPos) { + return blockShapeGetter.get(pBlockState, pLevel, pPos, this.collisionContext); + } + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index eadb8b5c9..dee8f0062 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -23,6 +23,7 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.scores.Team; +import net.minecraft.world.level.material.Fluid; import net.minecraftforge.common.IForgeShearable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; @@ -51,30 +52,6 @@ public static Map entityToLua(Entity entity, boolean detailed) { data.put("isUnderWater", entity.isUnderWater()); data.put("isInLava", entity.isInLava()); data.put("isInWall", entity.isInWall()); - data.put("pitch", entity.getYRot()); - data.put("yaw", entity.getXRot()); - if (!detailed) { - return data; - } - Team team = entity.getTeam(); - data.put("team", team != null ? team.getName() : null); - data.put("name", entity.getName().getString()); - data.put("air", entity.getAirSupply()); - data.put("maxAir", entity.getMaxAirSupply()); - data.put("frozen", entity.getTicksFrozen()); - data.put("freezeTicks", entity.getTicksRequiredToFreeze()); - data.put("tags", entity.getTags()); - if (entity instanceof InventoryCarrier carrier) { - Map invMap = new HashMap<>(); - SimpleContainer inv = carrier.getInventory(); - for (int slot = 0; slot < inv.getContainerSize(); slot++) { - ItemStack item = inv.getItem(slot); - if (!item.isEmpty()) { - invMap.put(slot, itemStackToObject(item)); - } - } - data.put("inventory", invMap); - } return data; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/Pair.java b/src/main/java/de/srendi/advancedperipherals/common/util/Pair.java index e1e014214..376a2cacb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/Pair.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/Pair.java @@ -42,12 +42,12 @@ public boolean rightPresent() { } public void ifRightPresent(Consumer consumer) { - if(rightPresent()) + if (rightPresent()) consumer.accept(right); } public void ifLeftPresent(Consumer consumer) { - if(leftPresent()) + if (leftPresent()) consumer.accept(left); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/StringUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/StringUtil.java index f166eda25..c4a7ab396 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/StringUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/StringUtil.java @@ -31,4 +31,11 @@ public static String toHexString(byte[] bytes) { public static String convertAndToSectionMark(String str) { return str == null ? null : str.replaceAll("(? T withPlayer(ITurtleAccess turtle, Function function) { APFakePlayer player = getPlayer(turtle, turtle.getOwningPlayer()); load(player, turtle); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java index faad46a1f..da7510ba0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java @@ -1,5 +1,7 @@ package de.srendi.advancedperipherals.common.util.inventory; +import appeng.api.stacks.AEFluidKey; +import appeng.api.stacks.GenericStack; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.core.apis.TableHelper; import de.srendi.advancedperipherals.AdvancedPeripherals; @@ -17,7 +19,7 @@ import java.util.Map; -public class FluidFilter { +public class FluidFilter extends GenericFilter { private Fluid fluid = Fluids.EMPTY; private TagKey tag = null; @@ -97,6 +99,14 @@ public FluidFilter setCount(int count) { return this; } + @Override + public boolean test(GenericStack genericStack) { + if (genericStack.what() instanceof AEFluidKey aeFluidKey) { + return test(aeFluidKey.toStack(1)); + } + return false; + } + public boolean test(FluidStack stack) { if (!fingerprint.isEmpty()) { String testFingerprint = FluidUtil.getFingerprint(stack); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java new file mode 100644 index 000000000..64d148419 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java @@ -0,0 +1,69 @@ +package de.srendi.advancedperipherals.common.util.inventory; + +import appeng.api.stacks.GenericStack; +import de.srendi.advancedperipherals.common.util.Pair; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.Map; + +public abstract class GenericFilter { + + /** + * Try to parse a raw filter table to any existing filter type. Could be a fluid filter, an item filter, maybe something else + * in the future. + *

+ * If the function can't find a valid type for the given name/resource location, it will return an empty filter with + * a proper error message. + * + * @param rawFilter The raw filter, which is a map of strings and objects + * @return A pair of the parsed filter and an error message, if there is one + */ + public static Pair parseGeneric(Map rawFilter) { + // TODO: Add chemical filter support + + if (!rawFilter.containsKey("name")) { + if (rawFilter.containsKey("type") && rawFilter.get("type") instanceof String type) { + switch (type) { + case "item": + return ItemFilter.parse(rawFilter); + case "fluid": + return FluidFilter.parse(rawFilter); + } + } + // If the filter does not contain a name or a type, which should never happen, but players are players, we will just + // give the ItemFilter the task to parse the filter + return ItemFilter.parse(rawFilter); + } + String name = rawFilter.get("name").toString(); + + // Let's check in which registry this thing is + if (ItemUtil.getRegistryEntry(name, ForgeRegistries.ITEMS) != null) { + return ItemFilter.parse(rawFilter); + } else if (ItemUtil.getRegistryEntry(name, ForgeRegistries.FLUIDS) != null) { + return FluidFilter.parse(rawFilter); + } else { + // If the name is in neither of the registries, we will just return an empty filter + return Pair.of(empty(), "NO_VALID_FILTER_TYPE"); + } + + } + + public abstract boolean isEmpty(); + + public abstract boolean test(GenericStack genericStack); + + public static GenericFilter empty() { + return new GenericFilter() { + @Override + public boolean isEmpty() { + return true; + } + + @Override + public boolean test(GenericStack genericStack) { + return false; + } + }; + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemFluidHandler.java index f86f1e487..9cc76fbee 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemFluidHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemFluidHandler.java @@ -11,7 +11,7 @@ public interface IStorageSystemFluidHandler extends IFluidHandler { * Uses a filter to find the right item. The amount should never be greater than 64 * stack sizes greater than 64. * - * @param filter The parsed filter + * @param filter The parsed filter * @param simulate Should this action be simulated * @return extracted from the slot, must be empty if nothing can be extracted. The returned ItemStack can be safely modified after, so item handlers should return a new or copied stack. */ diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemItemHandler.java index f5b161f6a..63ae60a16 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemItemHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemItemHandler.java @@ -11,6 +11,7 @@ public interface IStorageSystemItemHandler extends IItemHandler { * Uses a filter to find the right item. The amount should never be greater than 64 * stack sizes greater than 64. * + * @param filter The parsed filter * @param filter The parsed filter * @param count The amount to extract * @param simulate Should this action be simulated diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java new file mode 100644 index 000000000..39b4fd114 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java @@ -0,0 +1,100 @@ +package de.srendi.advancedperipherals.common.util.inventory; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.MethodResult; +import dan200.computercraft.api.peripheral.IComputerAccess; + +/** + * Implementation for common storage peripheral functions. Used for AE2 {@link de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MeBridgePeripheral} + * and RS {@link de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RsBridgePeripheral} + *

+ * This ensures that these both bridges use the same methods. This makes it easier to support both in the same script + * In case there is a new mod which adds new ways to store and craft items, this ensures that the new peripheral + * has the same functions as the other ones + *

+ * Implementation needs to override {@link dan200.computercraft.api.lua.LuaFunction} + */ +public interface IStorageSystemPeripheral { + + MethodResult isConnected(); + + MethodResult isOnline(); + + MethodResult getItem(IArguments arguments) throws LuaException; + + MethodResult getFluid(IArguments arguments) throws LuaException; + + MethodResult listItems(); + + MethodResult listFluids(); + + MethodResult listCraftableItems(); + + MethodResult listCraftableFluids(); + + MethodResult listCells(); + + MethodResult listDrives(); + + MethodResult importItem(IComputerAccess computer, IArguments arguments) throws LuaException; + + MethodResult exportItem(IComputerAccess computer, IArguments arguments) throws LuaException; + + MethodResult importFluid(IComputerAccess computer, IArguments arguments) throws LuaException; + + MethodResult exportFluid(IComputerAccess computer, IArguments arguments) throws LuaException; + + MethodResult getFilteredPatterns(IArguments arguments) throws LuaException; + + MethodResult getPatterns(); + + MethodResult getStoredEnergy(); + + MethodResult getEnergyCapacity(); + + MethodResult getEnergyUsage(); + + MethodResult getAvgPowerInjection(); + + MethodResult getTotalExternItemStorage(); + + MethodResult getTotalExternFluidStorage(); + + MethodResult getTotalItemStorage(); + + MethodResult getTotalFluidStorage(); + + MethodResult getUsedExternItemStorage(); + + MethodResult getUsedExternFluidStorage(); + + MethodResult getUsedItemStorage(); + + MethodResult getUsedFluidStorage(); + + MethodResult getAvailableExternItemStorage(); + + MethodResult getAvailableExternFluidStorage(); + + MethodResult getAvailableItemStorage(); + + MethodResult getAvailableFluidStorage(); + + MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException; + + MethodResult getCraftingTasks(); + + MethodResult cancelCraftingTasks(IArguments arguments) throws LuaException; + + MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException; + + MethodResult isItemCraftable(IArguments arguments) throws LuaException; + + MethodResult isItemCrafting(IArguments arguments) throws LuaException; + + MethodResult isFluidCraftable(IArguments arguments) throws LuaException; + + MethodResult isFluidCrafting(IArguments arguments) throws LuaException; + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java index bd943c892..f44bb19f9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java @@ -1,5 +1,7 @@ package de.srendi.advancedperipherals.common.util.inventory; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.GenericStack; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.core.apis.TableHelper; import de.srendi.advancedperipherals.AdvancedPeripherals; @@ -17,7 +19,7 @@ import java.util.Map; -public class ItemFilter { +public class ItemFilter extends GenericFilter { private Item item = Items.AIR; private TagKey tag = null; @@ -67,14 +69,14 @@ public static Pair parse(Map item) { } if (item.containsKey("fromSlot")) { try { - itemFilter.fromSlot = TableHelper.getIntField(item, "fromSlot"); + itemFilter.fromSlot = TableHelper.getIntField(item, "fromSlot") - 1; } catch (LuaException luaException) { return Pair.of(null, "NO_VALID_FROMSLOT"); } } if (item.containsKey("toSlot")) { try { - itemFilter.toSlot = TableHelper.getIntField(item, "toSlot"); + itemFilter.toSlot = TableHelper.getIntField(item, "toSlot") - 1; } catch (LuaException luaException) { return Pair.of(null, "NO_VALID_TOSLOT"); } @@ -112,6 +114,14 @@ public ItemStack toItemStack() { return result; } + @Override + public boolean test(GenericStack genericStack) { + if (genericStack.what() instanceof AEItemKey aeItemKey) { + return test(aeItemKey.toStack()); + } + return false; + } + public boolean test(ItemStack stack) { if (!fingerprint.isEmpty()) { String testFingerprint = ItemUtil.getFingerprint(stack); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java index 665283d73..fbd61f7f2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java @@ -4,7 +4,6 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.StringUtil; import net.minecraft.ResourceLocationException; -import net.minecraft.core.NonNullList; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -27,9 +26,6 @@ public class ItemUtil { public static final Item POCKET_NORMAL = Registry.ModItems.POCKET_COMPUTER_NORMAL.get(); public static final Item POCKET_ADVANCED = Registry.ModItems.POCKET_COMPUTER_ADVANCED.get(); - private ItemUtil() { - } - public static T getRegistryEntry(String name, IForgeRegistry forgeRegistry) { ResourceLocation location; try { @@ -87,17 +83,6 @@ public static List getItemsFromItemHandler(IItemHandler handler) { return items; } - public static void addComputerItemToTab(ResourceLocation turtleID, ResourceLocation pocketID, NonNullList items) { - if (turtleID != null) { - items.add(makeTurtle(TURTLE_ADVANCED, turtleID.toString())); - items.add(makeTurtle(TURTLE_NORMAL, turtleID.toString())); - } - if (pocketID != null) { - items.add(makePocket(POCKET_ADVANCED, pocketID.toString())); - items.add(makePocket(POCKET_NORMAL, pocketID.toString())); - } - } - public static ResourceLocation getRegistryKey(Item item) { return ForgeRegistries.ITEMS.getKey(item); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrade.java b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrade.java index 37509a075..ce91b0037 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrade.java +++ b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrade.java @@ -115,10 +115,10 @@ private TradeBuilder(WandererTradesEvent event, ItemStack stack, Type type, int * This one is for normal villagers with any type of{@link ItemLike}. * {@link net.minecraft.world.item.Item} or {@link net.minecraft.world.level.block.Block} as example. * - * @param event this should be executed in an event - pass the villager trade event here - * @param itemLike the item for trade - * @param type the trade type - * @param emeraldAmount the emerald amount of the trade + * @param event this should be executed in an event - pass the villager trade event here + * @param itemLike the item for trade + * @param type the trade type + * @param emeraldAmount the emerald amount of the trade * @param professionLevel the profession level of the villager. 1 to 5 * @return a builder instance */ @@ -130,10 +130,10 @@ public static TradeBuilder createTrade(VillagerTradesEvent event, ItemLike itemL * Creates a new TradeBuilder instance. Can be used to create villager trades for normal villagers * This one is for normal villagers with item stacks * - * @param event this should be executed in an event - pass the villager trade event here - * @param itemStack the item for trade - * @param type the trade type - * @param emeraldAmount the emerald amount of the trade + * @param event this should be executed in an event - pass the villager trade event here + * @param itemStack the item for trade + * @param type the trade type + * @param emeraldAmount the emerald amount of the trade * @param professionLevel the profession level of the villager. 1 to 5 * @return a builder instance */ @@ -146,10 +146,10 @@ public static TradeBuilder createTrade(VillagerTradesEvent event, ItemStack item * This one is for wandering traders with any type of{@link ItemLike}. * {@link net.minecraft.world.item.Item} or {@link net.minecraft.world.level.block.Block} as example. * - * @param event this should be executed in an event - pass the villager trade event here - * @param itemLike the item for trade - * @param type the trade type - * @param emeraldAmount the emerald amount of the trade + * @param event this should be executed in an event - pass the villager trade event here + * @param itemLike the item for trade + * @param type the trade type + * @param emeraldAmount the emerald amount of the trade * @param professionLevel the profession level of the villager. 1 to 5 * @return a builder instance */ @@ -161,10 +161,10 @@ public static TradeBuilder createTrade(WandererTradesEvent event, ItemLike itemL * Creates a new TradeBuilder instance. Can be used to create villager trades for wandering traders. * This one is for normal villagers with item stacks * - * @param event this should be executed in an event - pass the villager trade event here - * @param itemStack the item for trade - * @param type the trade type - * @param emeraldAmount the emerald amount of the trade + * @param event this should be executed in an event - pass the villager trade event here + * @param itemStack the item for trade + * @param type the trade type + * @param emeraldAmount the emerald amount of the trade * @param professionLevel the profession level of the villager. 1 to 5 * @return a builder instance */ @@ -213,10 +213,10 @@ public TradeBuilder setXp(int xp) { */ public void build() { VillagerTrade trade = new VillagerTrade(type, emeraldAmount, itemAmount, maxUses, xp, item, itemStack); - if(wandererEvent != null) { - if(professionLevel == 1) + if (wandererEvent != null) { + if (professionLevel == 1) wandererEvent.getGenericTrades().add(trade); - if(professionLevel == 2) + if (professionLevel == 2) wandererEvent.getRareTrades().add(trade); return; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java index 539e5089d..f0ea18dd3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java +++ b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java @@ -2,10 +2,10 @@ import dan200.computercraft.shared.Registry; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.setup.Blocks; +import de.srendi.advancedperipherals.common.setup.APBlocks; +import de.srendi.advancedperipherals.common.setup.APItems; +import de.srendi.advancedperipherals.common.setup.APVillagers; import de.srendi.advancedperipherals.common.setup.CCRegistration; -import de.srendi.advancedperipherals.common.setup.Items; -import de.srendi.advancedperipherals.common.setup.Villagers; import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import net.minecraftforge.event.village.VillagerTradesEvent; import net.minecraftforge.event.village.WandererTradesEvent; @@ -19,7 +19,7 @@ public class VillagerTrades { @SubscribeEvent public static void registerWanderingTrade(WandererTradesEvent event) { - TradeBuilder.createTrade(event, Blocks.PERIPHERAL_CASING.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 1, 1) + TradeBuilder.createTrade(event, APBlocks.PERIPHERAL_CASING.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 1, 1) .setMaxUses(8) .build(); TradeBuilder.createTrade(event, Registry.ModBlocks.TURTLE_ADVANCED.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 1) @@ -29,24 +29,24 @@ public static void registerWanderingTrade(WandererTradesEvent event) { @SubscribeEvent public static void registerVillagerTrades(VillagerTradesEvent event) { - if (event.getType() == Villagers.COMPUTER_SCIENTIST.get()) { + if (event.getType() == APVillagers.COMPUTER_SCIENTIST.get()) { - TradeBuilder.createTrade(event, Blocks.PERIPHERAL_CASING.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 1, 1) + TradeBuilder.createTrade(event, APBlocks.PERIPHERAL_CASING.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 1, 1) .setXp(1) .build(); - TradeBuilder.createTrade(event, Blocks.CHAT_BOX.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 1) + TradeBuilder.createTrade(event, APBlocks.CHAT_BOX.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 1) .build(); TradeBuilder.createTrade(event, Registry.ModBlocks.MONITOR_NORMAL.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 1) .setItemAmount(2) .build(); - TradeBuilder.createTrade(event, Blocks.PERIPHERAL_CASING.get(), VillagerTrade.Type.EMERALD_FOR_ITEM, 1, 1) + TradeBuilder.createTrade(event, APBlocks.PERIPHERAL_CASING.get(), VillagerTrade.Type.EMERALD_FOR_ITEM, 1, 1) .setMaxUses(5) .build(); - TradeBuilder.createTrade(event, Blocks.INVENTORY_MANAGER.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 2) + TradeBuilder.createTrade(event, APBlocks.INVENTORY_MANAGER.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 2) .setXp(4) .build(); - TradeBuilder.createTrade(event, Blocks.REDSTONE_INTEGRATOR.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 2) + TradeBuilder.createTrade(event, APBlocks.REDSTONE_INTEGRATOR.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 2, 2) .setXp(3) .build(); TradeBuilder.createTrade(event, Registry.ModBlocks.COMPUTER_ADVANCED.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 3, 2) @@ -61,11 +61,11 @@ public static void registerVillagerTrades(VillagerTradesEvent event) { .setMaxUses(4) .setXp(7) .build(); - TradeBuilder.createTrade(event, Items.CHUNK_CONTROLLER.get(), VillagerTrade.Type.EMERALD_FOR_ITEM, 5, 3) + TradeBuilder.createTrade(event, APItems.CHUNK_CONTROLLER.get(), VillagerTrade.Type.EMERALD_FOR_ITEM, 5, 3) .setMaxUses(6) .setXp(8) .build(); - TradeBuilder.createTrade(event, Items.COMPUTER_TOOL.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 1, 3) + TradeBuilder.createTrade(event, APItems.COMPUTER_TOOL.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 1, 3) .setMaxUses(1) .setXp(16) .build(); @@ -74,25 +74,25 @@ public static void registerVillagerTrades(VillagerTradesEvent event) { .setItemAmount(4) .build(); - TradeBuilder.createTrade(event, Blocks.ENERGY_DETECTOR.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 4, 4) + TradeBuilder.createTrade(event, APBlocks.ENERGY_DETECTOR.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 4, 4) .setXp(6) .build(); TradeBuilder.createTrade(event, Registry.ModBlocks.COMPUTER_ADVANCED.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 4, 4) .setXp(5) .setMaxUses(3) .build(); - TradeBuilder.createTrade(event, Items.MEMORY_CARD.get(), VillagerTrade.Type.EMERALD_FOR_ITEM, 2, 4) + TradeBuilder.createTrade(event, APItems.MEMORY_CARD.get(), VillagerTrade.Type.EMERALD_FOR_ITEM, 2, 4) .setXp(4) .build(); TradeBuilder.createTrade(event, ItemUtil.makeTurtle(ItemUtil.TURTLE_ADVANCED, CCRegistration.ID.CHUNKY_TURTLE.toString()), VillagerTrade.Type.ITEM_FOR_EMERALD, 8, 4) .setXp(7) .build(); - TradeBuilder.createTrade(event, Items.CHUNK_CONTROLLER.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 6, 4) + TradeBuilder.createTrade(event, APItems.CHUNK_CONTROLLER.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 6, 4) .setMaxUses(6) .setXp(6) .build(); - TradeBuilder.createTrade(event, Blocks.ME_BRIDGE.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 4, 5) + TradeBuilder.createTrade(event, APBlocks.ME_BRIDGE.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 4, 5) .setItemAmount(2) .setXp(4) .build(); diff --git a/src/main/java/de/srendi/advancedperipherals/lib/metaphysics/IFeedableAutomataCore.java b/src/main/java/de/srendi/advancedperipherals/lib/metaphysics/IFeedableAutomataCore.java index 6c3534300..c8a4586ab 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/metaphysics/IFeedableAutomataCore.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/metaphysics/IFeedableAutomataCore.java @@ -1,3 +1,4 @@ package de.srendi.advancedperipherals.lib.metaphysics; -public interface IFeedableAutomataCore {} +public interface IFeedableAutomataCore { +} diff --git a/src/main/java/de/srendi/advancedperipherals/network/APNetworking.java b/src/main/java/de/srendi/advancedperipherals/network/APNetworking.java deleted file mode 100644 index f1064f26e..000000000 --- a/src/main/java/de/srendi/advancedperipherals/network/APNetworking.java +++ /dev/null @@ -1,75 +0,0 @@ -package de.srendi.advancedperipherals.network; - -import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.network.base.IPacket; -import de.srendi.advancedperipherals.network.toclient.ToastToClientPacket; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.PacketDistributor; -import net.minecraftforge.network.simple.SimpleChannel; - -import java.util.Optional; -import java.util.function.Function; - -public class APNetworking { - private static final String PROTOCOL_VERSION = ModLoadingContext.get().getActiveContainer().getModInfo().getVersion().toString(); - private static final SimpleChannel NETWORK_CHANNEL = NetworkRegistry.newSimpleChannel(new ResourceLocation(AdvancedPeripherals.MOD_ID, "main_channel"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals); - private static int id = 0; - - public static void init() { - registerServerToClient(ToastToClientPacket.class, ToastToClientPacket::decode); - } - - public static void registerServerToClient(Class packet, Function decode) { - NETWORK_CHANNEL.registerMessage(id++, packet, IPacket::encode, decode, IPacket::handle, Optional.of(NetworkDirection.PLAY_TO_CLIENT)); - } - - public static void registerClientToServer(Class packet, Function decode) { - NETWORK_CHANNEL.registerMessage(id++, packet, IPacket::encode, decode, IPacket::handle, Optional.of(NetworkDirection.PLAY_TO_SERVER)); - } - - /** - * Sends a packet to the server.

- * Must be called Client side. - */ - public static void sendToServer(Object msg) { - NETWORK_CHANNEL.sendToServer(msg); - } - - /** - * Send a packet to a specific player.

- * Must be called Server side. - */ - public static void sendTo(Object msg, ServerPlayer player) { - if (!(player instanceof FakePlayer)) { - NETWORK_CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), msg); - } - } - - public static void sendPacketToAll(Object packet) { - NETWORK_CHANNEL.send(PacketDistributor.ALL.noArg(), packet); - } - - public static ClientboundBlockEntityDataPacket createTEUpdatePacket(BlockEntity tile) { - return ClientboundBlockEntityDataPacket.create(tile); - } - - public static void sendToAllAround(Object mes, ResourceKey dim, BlockPos pos, int radius) { - NETWORK_CHANNEL.send(PacketDistributor.NEAR.with(() -> new PacketDistributor.TargetPoint(pos.getX(), pos.getY(), pos.getZ(), radius, dim)), mes); - } - - public static void sendToAllInWorld(Object mes, ServerLevel world) { - NETWORK_CHANNEL.send(PacketDistributor.DIMENSION.with(world::dimension), mes); - } -} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index be93663b7..dc4a3126c 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -2,3 +2,5 @@ public net.minecraft.world.level.block.entity.BeaconBlockEntity f_58652_ public net.minecraft.world.level.block.entity.BeaconBlockEntity f_58653_ public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210559_ # rawTemplates public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210560_ # templates +protected net.minecraft.world.level.ClipContext f_45686_ # collisionContext +public net.minecraft.world.level.block.entity.BeaconBlockEntity f_58650_ # levels \ No newline at end of file diff --git a/src/main/resources/assets/advancedperipherals/models/item/ar_goggles.json b/src/main/resources/assets/advancedperipherals/models/item/ar_goggles.json deleted file mode 100644 index 8cedf86ab..000000000 --- a/src/main/resources/assets/advancedperipherals/models/item/ar_goggles.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "advancedperipherals:item/ar_goggles" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/advancedperipherals/models/item/memory_card.json b/src/main/resources/assets/advancedperipherals/models/item/memory_card.json index 0579cb7a6..c39681fc7 100644 --- a/src/main/resources/assets/advancedperipherals/models/item/memory_card.json +++ b/src/main/resources/assets/advancedperipherals/models/item/memory_card.json @@ -1,6 +1,14 @@ { - "parent": "item/generated", + "parent": "minecraft:item/generated", "textures": { "layer0": "advancedperipherals:item/memory_card" - } + }, + "overrides": [ + { + "predicate": { + "advancedperipherals:bounded": 1 + }, + "model": "advancedperipherals:item/memory_card_bounded" + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/advancedperipherals/models/item/memory_card_bounded.json b/src/main/resources/assets/advancedperipherals/models/item/memory_card_bounded.json new file mode 100644 index 000000000..cf7733990 --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/models/item/memory_card_bounded.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "advancedperipherals:item/memory_card_bounded" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/advancedperipherals/models/item/smart_glasses.json b/src/main/resources/assets/advancedperipherals/models/item/smart_glasses.json new file mode 100644 index 000000000..bc29777ce --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/models/item/smart_glasses.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "advancedperipherals:item/smart_glasses" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/advancedperipherals/textures/gui/corners_glasses.png b/src/main/resources/assets/advancedperipherals/textures/gui/corners_glasses.png new file mode 100644 index 0000000000000000000000000000000000000000..18cf12823149b6195ab687d0015a1f5a3d098a85 GIT binary patch literal 999 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;3=GT*JzX3_ zD(1YsyVv)Pg9zIN!y?wpP0|WV3#Yz4V4Cw}MuGJLQT6D9TqhSXt9vY|J1G3(E%%R) zRkky#{n(O03DNFy%!^aBOcwJ|R4&9y`y{oOeBsP2(%Z)X&FR?N_y`rzL zzcibHYa?^R0Tu=pH3kI(MutXC1`ZzvhlH;NJRrH1TbP_<@)#8i(t&vG0f8CO5NRd` zCSeAF84O^Z%S0uZHUkZr!wU2ULqq&JpvC#_P4-rj7Cg?ce*gQs@b)Br{{OWTzK5Mp z-@0VVxmS$)*3bJ{etA+c3t#);6ve~8o_%5T`Te)LrOLyMmKYOoTLeRiF}cqePafpulv6E58si+}KZR}_PZ@8V#AI*aXaUqJmY%HMGLWymfT zj@P&Uv&kIaXeGmUId8kSzrX+W6`T<#*T^2Q=)3y(@#96UGX3ttb&08)r5k}^JZ;Xy z^pDIy?;j`)iLO`fZ*Mn<-}}}0ckK14dW>eP%hKc@Y2D-EnWBsm$|%8z8UaA5)$NHI zvCIJ-vJ5O~DiWZu{Zn+mu3=j7ynAk)^(KK85^X>qdTB1*mTUhv$4m2T?fZptYcjsw zZrq>r`n^oU{dZZ67fjB!hu1E!>2-j`7KSy5h=d0LL-NUmb0QC$7o7w7{rvg!-D1fK z9BZ<_C7rhP|Ni}Zw`kJG!@u;R3cU9PA9%#xAi6icRDb8J-BpLp_MT;#qbK>`X6ap{ zs|>4md20Ip{=2V4)`79~+|M`SYCoN1(t91m?2iQP5f;#J2c|TXFbL~^JR>eXKG^Hr tGiMWX&84p%K3oXW%*PDMFoOofe`Y_F^FYB_FMSutO`fiPF6*2UngGweOez2X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/gui/smart_glasses_gui.png b/src/main/resources/assets/advancedperipherals/textures/gui/smart_glasses_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..7606b08a65e7bfeb87fa72ceebe827b2749a6be0 GIT binary patch literal 1974 zcmdT_X;2eJ7~KR2AcJwph*Q8|@qo4pIDkY>wV+}+)DjT^NlQhJCNW?*gNaxVDu*4M zAsodB5-@>;QXm{cKw79I6_8>e0TT^}0^tZE5R%Y9#~+=x{&)ZE?!5VC-rM)yY{p6d zW5%1zHUR*PeU5vb1^}WxLVy8GyM@M8M6TcBPaiu1*iS9q0HA-#$LnxlQjvTFjYkAq zcD|%w1Y!A+gRg3!wqgTwEPMz&xwXAoe^+M`+_!Y^jvsVQuG#E_n&hDtjnma*P{TVl zM3qO+19Opuklxe7&ULxT&~U!M{^-P0X5k|uB07ao!L!@j?3n)E^nJOOR+Uv%n4gpk zPn5butyTwz!R^0vb#<+4YC6~PvYKTn(G|(;>{mWTr_Q6P-n+q;X@OZAQ7jh!(zKa= z5sq|gm~)zd(U~zQi+6GR+omfy9ASCDJzMg~b;$BdfsSt5uu^_gSqV90520eApj{WF z8vP;b%!{9#ey+04Bj?Mzt$?0qZTe(^_CF-2CSieIZhwWu^<_E(YVI`3pJ-s zfLqlyHP86P>E2?S-C*vfX>{q`zsCg`hdT3DiL~N)onGPN4c&1@?`60q8q<4t{?X?< z8{;SZ(=@7NJi80EEk_n8eM9`bdYz$BM!(GT-?f^6v{|05%{mPQ6l~vt6ODTR*}t!@ zW;ra$?A`q^By)3f45p<>3Kf*k8-{D^KN&UCtVjKJqqR`gBvmrr<=L!tTQoG3Ke83F z_UpV8b$oC(k;P)IjiytFP#!A*Dn5L~mjk2KA>vz;wQPehPG(um=mMo;3_a4Cma5p< z-WL^!6QAjK9H_@_M#$DKR?9qF5n&(G?q;3JKkc z!%%YTqYGTz+%6k|Ag>TiZuzQhtg8R}`2Zd2%JXbb_3GJ1PZX+x$>fCd&Zq3fDn;|< zlzZXg)f6_Mu@l^awSrc1?DS}L392U&;Ssv`p#~R`_6a7N*vb?n9T&m{m%MAkTgeX@ z(UW2>ArJW-nL!0@1HGGJ*OVG{svQ@|2nakx8WUB>c-W5ZMT42)Mu&sDE9_()-i$Xv z){Ms`=7HPY+n2OjQxu~<&K|?1TGA*K%|b6hCC%v<)mMdZ@qU`&B-c4dYmSdmp7T%x zkIM~0qtO@f`bSGoh4HSm94+n3Hz@Mh`ufrF(C6dhkpnr`To_I(0rzN|ZsV()n?o!; z$TTv}Qo_se{4Kx|>Y_PtN%ecRO#cRwQZm=|K+ez47+Sbb_e_Ip|Jr{pTE-e=;bL$5 SvF^*6>xhrHzZd%mHvKO?S3ZjX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedperipherals/textures/item/ar_goggles.png b/src/main/resources/assets/advancedperipherals/textures/item/smart_glasses.png similarity index 100% rename from src/main/resources/assets/advancedperipherals/textures/item/ar_goggles.png rename to src/main/resources/assets/advancedperipherals/textures/item/smart_glasses.png diff --git a/src/main/resources/assets/advancedperipherals/textures/models/ar_goggles.png b/src/main/resources/assets/advancedperipherals/textures/models/ar_goggles.png deleted file mode 100644 index 5ec507c48ee0a0c05dbc570c76a83bd57baf4645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1133 zcmaJ=&r1|h93M4Hwj>WB=s||@&=1|6A3D44wgQBW7FH@d4G+#WOYetkZl@6Wjv@9VDg z)%pm6sEqYU2|Ul>x4q&h{;qFKPvfZub*4~1OrxA)10t%yAwb3qWf&xYqD_pgfL4Mi zqx577rR0l(3XOo`VFIpUVKzauwz-y~jsQdsfnnW@P}@(IDN@%W)BrCtvL%9y-ZN=~ z{>i?iIys_-HLC3b+3E^dzyL@gU1QXA1UEwM>I!)69n%!K3qd0hYR{>Z94AF+1CkFk z`BjEx$zU+RHuJ$C+emT@%h3#ef_}DH;DZ7eBJ+d7)@&^;B&4pqExe0R8H6l>rgOPm zAlDRt_At$c!(mT@qbLk(je?VtoW@b^$*CplpOIsqJ*wN+fWbiHTF5=0v)2--;q zM+;euXCQ)323n-pA0*EV=%xm9&e>hOEDJHyL5it@m=vL~LO|CwAsh{LMWan2QRGCH z?c`cGo)LMmh2cd$)FFult_0Pr0ZdfjY6skwqFk>P3=3P9fUS=Mt;>c6xf`;e7x#rP zs+Z?##eE4D<Gei|p+D;t0 z`8BpV8kHJ%w%qg$c7D0^<;vp7{ImNf*B&mMpPH&JXWm`?R-4|QYMYyzdc68|IrZvy z&5x($cNgB?yi)gKX8CfcYp}PWt?bmX_|}8*N3i5jE5+>}-1zEBPY~JD4O|v(yddz1 Mb@oXM9fQ~Y0tFming9R* diff --git a/src/main/resources/assets/advancedperipherals/textures/item/empty_glasses_slot.png b/src/main/resources/assets/advancedperipherals/textures/slot/empty_glasses_slot.png similarity index 100% rename from src/main/resources/assets/advancedperipherals/textures/item/empty_glasses_slot.png rename to src/main/resources/assets/advancedperipherals/textures/slot/empty_glasses_slot.png diff --git a/src/main/resources/data/advancedperipherals/loot_tables/chest/scientist_common.json b/src/main/resources/data/advancedperipherals/loot_tables/chest/scientist_common.json new file mode 100644 index 000000000..8f7871296 --- /dev/null +++ b/src/main/resources/data/advancedperipherals/loot_tables/chest/scientist_common.json @@ -0,0 +1,133 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:diamond" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "advancedperipherals:weak_automata_core" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "advancedperipherals:peripheral_casing", + "weight": 5 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot", + "weight": 5 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gold_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:bread", + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecraft:iron_pickaxe", + "weight": 5 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:coal" + }, + { + "type": "minecraft:item", + "name": "minecraft:iron_shovel", + "weight": 5 + } + ], + "rolls": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 3.0 + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/advancedperipherals/structures/villages/scientist_taiga.nbt b/src/main/resources/data/advancedperipherals/structures/villages/scientist_taiga.nbt index fff19535bc88e57d545fc4d41676c6c96a740d29..f154b6eb9d137c312dc3077039e74b410ee9085b 100644 GIT binary patch literal 6265 zcmcII30RZIwk^J(f`YF|SyZsqf+CV&SOg7RT4~E|fTBo{B_VLxS7nnWpje%jGc*60v&}hYW}=z8 z<-PUaS`%eC*rPcrDgC^*r*_0{W0hlRPzgVVgvB!LK8f#~?1rc{w%^bx3Dn$RanJO`@kZC%ixAxB=*kqwFMMVM3;xta9s}gp`#xFk$}+ zrnCqXZsjQe^jkpQgjTM@v!ti3!ONxLL>z!Qowr=yuz#mBfmxUKTQR@w z1GPWq$SOnJ{xe8`4*rghRnSlW9J&h|;Uu5ay_ESK+;>1+ zRe259_9?Z=lYWvXjk(BZnPy!`Y5&A6KXmK*@Yhu$gTl0HBeu?5n~T2wJ%jBkn%I6o&5R{*t5LeB92L*CoyT^olAJW7& zCEqQ71f;_3IL2p#59_2y3m@#zdiWYPYdw4e-lPs~3jY^Dc4-YK)EnP||KNcF+nY%A zkBYy8Fy?M=Ud9Bnoml+HrmRxUn|InhzqTz6^UzzhKRx_M0ir^4@=NNmm7n5t#kQRK zp4Cw=>i%WwmDW@&jWVFIH&8n=y);4=Uf&b#CwA~eS2{l;wxwd5YQ|2trf%|BpkSK@#!t7tgUToa16KVlZSww`wbWxcPn<4Y z_TR44r{>^uw6*LS8E2#i=_G)3%EJdJIH8Qc5afJ_Jb=(vM$;3<9T2s0G+e_r9TFY} z(t@Yly5G&_$kNj;u03_YG;`vVdjJYO*TP6HnyH#YbRsG>Xoi{2il-={llZ>&JN3j( zG+c)Qk&zt1uxKimRTghMWUw3ZNHP%YtjGW|QDxCdthomhQ4e25Z&6|-BRc*BRcI*O zTMtPPl^a8<&F9STx<0g@+t=ZoVZ- z&Nj;;75<9w`8mlcei~XgqreZ&~uz(-`Zf+v^&@Sk>Et^3}%+T zCewWxc=cV_WAC#C#B!Ku7*@tKv{4;m4*gfF^{xzb*kO_lOvrHSn?oK%NH0gMhfSZ_ zX~c+}*U5%l*=;kU>2E47sNQLNXsCIij8Yn9LGp!1atd##Wpq+&%*zSNj(e?n>fiS7vuu^0!Xm*5hbI(!h(QJ$ns(D1sQ(KT`BiBrL4 z|ArIga!Q>O2ZW>cTsxY;mvQCL((&74NOW06{Rw~hbriZ8ROOTU5vuIbz8-x3@?Lb9 z<~J$Rmk=F<9a`0jjjttx3$S&MYv{?lw{9J8e!o$KYX3FIJ&k3Pqs}m`o0_CAHAz-q7lXnUQnAKj zaY2psQD_8d3U;bc0iUmaiA8X|iJyR>W2S2`ZXZ+d??9hvJR7Lf<){2>*?dz!chG9J zYH)7(AT3dxP9)l1@a9B#+p$A&9fw%aNht>3ybFHHymPs}TRcqKXD|9rN}ORdh9FW7 z9TuOQGCcz{UfHG3C(;y&o}Wwh@QxI8%7WgmW4|{1gNRJE!}NMbF9VL7E;0v)xQg4p zhHG%VJ#`s}$UMYO!3`gNjc-KgVj`O0s{9Ps7xKJwHx^+YRS#DZd?#0GWjuO?vlm%Y zzDr>`>lo~#_KY^$fKP{73HAMYP@r|$G3TybcZFSge9?Z{pX;8!8f3%-ssqFxEmf3Wgr>UX z9@%{>2`qGAT!SNRItBQvNGK>epbw$zukaUHXiA){Wzin~qj7Klf2;Bzp@8F#lmo}D zud500NM?a%#-6x`_p$^WFwZ=TKU3xN9g=|tkeYlN63hX2yet8_M)d+;)C8<6x*lOb zS76X@DXVZltgqMsR)Cm@>IFX24N!lXjk%hHuwyiCW-qe!0;+?5`(<};Sz*X zH9OT_avFC$krmLXLU7Y{p0m_com8R*Z<%!MTxojM!vlPu={2RhVFM=XZ~opay1Iw1SML{xZchkK@0=8KMVC%sUn0l$F<^pS*JFr~VDtr|<_H}>#(>mozN_-`t1+@Wu0t(9N z1IsUwfaMlwu7xGo^4EOUi6NKm1y`a>i(3v56(nkX4szoTXhZj|_k?ORMrd?=GHcuS z6E1$uN4^EIq;`*FmDrA$-+j+dgO_*7v5ngkx}!KsHAcbRP|-tR(RxaiZ$0j9o%Poc z2n^Jp)^nsLyhSfEQF zC7xMd7QQN#@mS=82w8z5WEF~#cn~3h+t;qwgCX!oJQN8WG{`L+?ISeXVeJmItYE`s z9ewf}a0B;cm&Y(7YUEDs_IDlxL{t{5b~|YGIa=V7@7RR|YED9G&Ov({4J`FUffOjg zF4by$@|RE^@WC0uN&@Sa_r?rSOi-?;2pNzUg>SnHP!W&ZB`kiv6Kr6PC!`11`)1|!%ev#|NZ_!7GieQ=M@Uj`E&TK| z)tEXDe>f4fsia(mm-jv}?J5po2LhmUzhoz`Zp3h7 zGVmPpn7L#KTxN0$3NL&clTG*s^a}M5__Z;i2kY~l;Kj)+p+nV12x7^_cL}*>oNtM5Sva#qD zB#Hh65|sumIc9pGi8~4YWRY54 zWJwM{j0zw|>7X!99lyV#?f@BXXY_iMuo21MH!1o7ca6r5E!kx##W6&DS7ff92*dAf zDjYvd7kIU87Kr%0i(b)H%THV8V$bU1uoUq3Q(IV+SwC{J)2|~oOt2DN=ZI!{X);xW zi|3YKL{w(CMfBT+Mw{SlRJ<#*r0pncd|J(xZ;}EN^o&o=ag_fnvL6TDoGVl zVrDUtV)5)^q1qHJ#!F>hS8Wkb5C6VUk~RL*7v#>m8QTw$Nki51*E)kLqj~4!?RU?- zsNALbVim?0;6m=DoBq4^dhY%vDF$xds(D;Pv^ddQ+WB%sGQQ7tn3K#j5{l=iTHM1| z7bo`&KRsF}Y<+e2A;%_CXop;!jb_J7;R++<6#?Cr&Q6c3Sb7pq-Yiu!mc|daMSjE#kW}69qE@IU*{w?J2p13a&&ks zfW3S^#%wriDwchWecGs?+jz#ZD$4p{Dm$+%`h{^bHjLasFYX+rwo%)HvVQIm+&2Cy z&flpfCjK#B%BPK%21$&>go-|El}bkL>gZH#U0&dt|1q}D5hb{Ia5(On`u0s}M;Nt( zI$Y^@8o?(`TdYMhSQaA!CM8rcG^d+6bwh1N%~v(zBa_0ktw+r>i#F{u@Npf{ywZKt zcWCihKwVYFGJSNkR9w;GvQYc9+BgYS_s^w_0BX(E;@NA(D;{T<3z`*oT?I6%z$n{D zsAwmpyO0&Ve)5%c;kBlMO_E#gpsuVoFoh!5@3<}p&s7qn4#f#{L06W>K|iNDvUIN~Yl6*Lh1=y)MwEu4aTI9UH1}bbY25Q5RjZ5XRAi&n%y;)*pI*IIwp0IVYLDGEFmj zDP2mNJ+yWcj-5EYpk5QXc9SlID_J=E*T-c^3K?`^lcx}OD{sahDNJp8Jaj(7q+eIU z+#Mn`Bhx?FFWc?6~q;*ZXqV9VgH`lyctSQB`Y|ncQ%4N8Dm?w@MVIO z=0{*TDKD*lj~atx$b&*=rF?(qT=ziYP{5LU>`{Y z!bZr}RLe2#7Wz$N#h6%bvAAs|e>@~%&+QQ7hASL41)suUq?|23ItA+zJ{xhK{3?C< zlkQioWw;rC|A?~@`mWg44<(%iE#$*evgOZ)S!VIlhJrc@(}>USUw$=tD7X7;%=xbq zO(qp5$Ie7pMmM8EcxP2JP!2MWuMNQ`8p`eT)6_L*;oMo}N>6Q4baNbR! zw*DkGoZhau^mu3V)^c1#*7N(NMH7v|exKIP4vqN>mk+6jT0CbmTe0DWQHge(#&TN> znR{?NEV4&EE$Gp)e)@sF=&&)3y14VTW-$*kRALwLvFT|_+xL6-M&T)BeG ze0)^QUUa4jqD2aixv-Kkd;Sg;9!%pbX8aIx#}#?irczSO{ftfCB=Q&yqBXtX$d`T` id3-R?Mp3bUHKw9h!;2v4S~FZzOi%dfTkGZb-uoYg8IwQ& literal 4478 zcmZ`*2UJtp)>c$NjW7%?NU@;8sFWCxCPY98AQ~7z2asYwiVdX*1OXj}nh+^Um0l+b zj5KKh8Ay;4K&pUX0TL-8l!Q_whC@vEbcGb-QyP{o%JeQq4je>00?ZpHx3S5*GWC;}>kl2`spr zRyNYhoa29WV&YhU+=0-aI2o0jUe~rF2QO$zTUkHLizfyh^1h%xT&$^=rWAj>Pl$P4 z^R&sv=vviyV*U-Epe@erq{}2{^#Q)GkF^*iQb%P$|3iL>z5Y7Mxvrb_wd=h@mW%z) zNm0E`x1Y{EZN1CULrLe|s9c);t13l+!yau_zZ8JIpZQze*Ej1|1x-y9+9)Xcr&=on zQ_yhASr47QI-k~1&mM_K<;Y^@#BQJhuZzWO+-)!|o-WBgP9&eJ(WG(AS|6lObJOs~ z=?)#-GINK9TMiN;0gSfK7tn4?p5|AK>#aomOWsTNmp-jxd|1wvZ?U>U=sbX*Dooj0 zdWCzsKbbh;=IU}(L~`wpHkxH(ZyCS#(FS|xlmrz=0ue|qz+^E_i! zxpi^wL6%eTagY9seLa#{CTm#{ipQFAGk%TgN2C1idD|ghGKn}gHz$%qI=y&KA@O>D)1849dwKlA zK&H-IM^|(-P9FU+wPkv7%AaWO$Gt}k(<7%(PNk|M6TKD>>z>iZ_`dF=xIf6O(~C~{ z5^m6ifHNu54jzT`J>U2bx~=wD%s5`1`ob^Si&fqkvRBfyz0ruO9@Th3CZ95Ynb4($ zc-$h6&|x(j@s2Nn=k-!YWKsfJ5HhXQ2}3rlvJR{L+dM%Z^8SA_c!&*;h5gIz-wuo6 zW04E~a#ThdJi{0J@W+F8sh=8m&woaM!Yv1M0461!+h9MUOrJv(wp74qk3;rK5ZKB) z?;kkft*oQHQy+6r821$2RqBAF?p3J2M(Dcwwp+?Zr8enplTnyb>-=$v`iO<1?TohR z{|_qI*~W;^r?4wg@cN^8B@4{$ce2t145p(SnabxU$J?KnJQV7(q%5e{Dz8})q%6MwskmfZgsz4QaU8fLdnMyUoD?bDQV6UO ztPN2<*PJOe{xYEXH}2c+acnosEjFt~RiF)#t5NQDMc{<9a$Mtz%0;}3t&S|MCtJf) zSqEAwC(cEcVco94wA->j7D8nK76$-*JkZm68+YK)s&@C=t9 zRL3H9RkLUj*HeX>&dP?}F?`sq4pnGg6!EZsY!JR+?bPfVEtH}9p9flml|IWqG|;gUDov<)RVn3k3MjA=4+Lu1hm~sJJ3YuObb2x%~`*W8?ZVQG+;y z$-5zC+hu?g(Z@i&s0ZFyzmBB#<$y^D$vjX-77H~GJq!bmTU%wNuk&8ms26YgbKOo3B_lwBY+Sa0cqW22>>Lm|38 zq7YnoEny0>aLSRieyS)X6>qLO_er6nXpopDrQv zk%+?1oRwx6NH-{d3Tu|8hQfOTTWW?u4cwAJ>$-l&N7NsThktGXrCV5;{Zq)zDhWn_ z6pZxQ2-z=g*%V9f&K{y<9wZLv*{B4!HD<06*hctt;RKs-Y#|(IwnE(fiWsfZCfrjM z>qb1C!tzlrT+Y50Es+ul&M0y&Uxl!ovLNx0n&SBXPj&jGNi0EsNG7GW-<9hYT&M&)9dOlx-z9H>MPQMh~* zO1*dlpiJI$hFVl@0soR_mVWRUEL(7Toav|Hz{0V`cq2GqoU>7XDWq6C^uBIk20 z1oEdgbogW?#xpga)b*;`fnwd)Ygf;wcb_4)8nvr)wUX%S8I^qpa>L=4IWhFNXA+Ax zGvQRi{Rmyvos&lpmso=8a0eOCP{Bn-F)0#?UV#BP8Sm%kux1;Gk}^+3;pSmhbLLve z_p2A&hLFKKP@06w=kiIL_73U`7$T^;6#}5iV2!&98X=D!~5ce4m?`wzwY>L0LSphew5D;2@ppdo7$eQ@DxRAbAN4FGG zML1+l+-5)4Y)cP-Y}`5ku3?VSl1-p^$XcSmb_0If=7Fe#{6I&h9o~ZC1Rr5}qxiu- zz;S`|R|r6b#1EkZF5r|Fmz4~Zf*N-OaqEvYi6dwnTytaQW+>UBEb|75KBd%D}cSHyR z%6<>X7+OQ8Hp)X5>`Dwwd)J)=csVB~w4MFrz}%DxL&?BpWyFKWgjO(~n zb4>pU_N%#=Hby-uKV1$~U)%`e{B9hZQoZ&Rgy}UfMP5ZQ9L+rR#+<@{06p|nqu_n1 zX3`%0=DSv&QU(*HOua5; z_$Xgub!ouaTONm5LQpMybI7K!8pc894Xhc<@H<Mi6r9_BWsSzHQwO02+UZRT+>8B^!($6NRWW$O4?D za!3f-s0Ok4aXwQ`sjKUEUe%{Y$JJ?NOpZi{%ZQJR_-p=J4P8g%`vk{QAa{E7iL*6l6CSkbPAZ9c!n6OEmG*I z#X#nV=cA&k2|OOSZ&8_YMP05nF_y-*-j(^d&Cj#fCzwULzov~T7Dwve9QY$en}!ps zrtHdNK2f?%x*N!zrXshR>PrsV94tOG`b*gOpPjt>-hH!6bh#b*sUnuy_=Fz3!d2x; zNk-4-X~C)4I>ua+bMYb%eJa z-Jw>R?{FgC*mwE-#N=x=!TQnmwzdbq$qxO2$TKazA^dLGL1w^DhV6XqvTslESZX`# z?AejOl1!It)3XL8wE{jH3tBLrSO{^V+&9$S4=(GXE4tTz+NV=-)UQMyM{Fua1nRiA zFNQSu`o={TBZD?m$^pg;34Cd3#QQI!AEL}({&w6+=5JiX2bTvr zv+Ks+1Uhd{Fk&wSsOvwuIozay+h10C7G03EvE!UaJo+mC0HZenZMT1RX^ext6}>2@ zGNbUUenfCV4#^zta$e_MYcQIqwL;Dr>Q{MLjq}@m4AQUBN2yBRe}h7dpnHWiL}&Bq z_DXH1rLBygiOLEMj(ZpIHRQg09<_8xN7`5Lm&f5+%Z1$2sjRCNXVdQP!;g+m`hD#i zZo?7cf8ENjwG}y)+%Lw&y1Ht1CR{9gJ~>8D#;ZvCyiSu9?8)`5l?}&|b>dey%AfbW U5}#@Kd25%?A2&n;<96)$Kdd|T!~g&Q diff --git a/src/main/resources/data/computercraft/lua/rom/programs/flat.lua b/src/main/resources/data/computercraft/lua/rom/programs/flat.lua new file mode 100644 index 000000000..05956edff --- /dev/null +++ b/src/main/resources/data/computercraft/lua/rom/programs/flat.lua @@ -0,0 +1 @@ +print("The earth is flat, at least in minecraft!") \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 1c0067a65..4cf3c0150 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,7 +1,6 @@ { "pack": { "description": "Advanced peripherals resources", - "pack_format": 8, - "_comment": "A pack_format of 6 requires json lang files and some texture changes from 1.16.2. Note: we require v6 pack meta for all mods." + "pack_format": 10 } } From 60f4f3e14171284169b6466959b6a890171d12d0 Mon Sep 17 00:00:00 2001 From: Srendi Date: Fri, 21 Jun 2024 17:20:00 +0200 Subject: [PATCH 068/188] Finished the dev/1.19.2 into dev/0.8 merge which needed some additional work since our revert accident (ed906c48697ebfdc86d268743a8e7aa280ae5d36) --- .../de/srendi/advancedperipherals/AdvancedPeripherals.java | 4 ++-- .../advancedperipherals/client/ClientEventSubscriber.java | 4 ++-- .../container => client/screens}/SaddleTurtleScreen.java | 0 .../common/addons/appliedenergistics/AppEngApi.java | 2 -- .../addons/computercraft/peripheral/ChatBoxPeripheral.java | 4 ++-- .../addons/computercraft/peripheral/SaddlePeripheral.java | 4 ++-- .../common/blocks/blockentities/DistanceDetectorEntity.java | 6 +++--- .../advancedperipherals/common/items/SmartGlassesItem.java | 2 -- .../network/{PacketHandler.java => APNetworking.java} | 2 +- .../advancedperipherals/common/setup/CCRegistration.java | 1 + .../common/smartglasses/SmartGlassesComputer.java | 1 - .../smartglasses/modules/hotkey/HotkeyModuleItem.java | 4 ++-- .../advancedperipherals/common/util/LuaConverter.java | 4 ---- 13 files changed, 15 insertions(+), 23 deletions(-) rename src/main/java/de/srendi/advancedperipherals/{common/container => client/screens}/SaddleTurtleScreen.java (100%) rename src/main/java/de/srendi/advancedperipherals/common/network/{PacketHandler.java => APNetworking.java} (99%) diff --git a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java index 14ce64ae3..615c49195 100644 --- a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java +++ b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java @@ -2,7 +2,7 @@ import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.configuration.APConfig; -import de.srendi.advancedperipherals.common.network.PacketHandler; +import de.srendi.advancedperipherals.common.network.APNetworking; import de.srendi.advancedperipherals.common.setup.APRegistration; import de.srendi.advancedperipherals.common.village.VillageStructures; import net.minecraft.resources.ResourceLocation; @@ -62,7 +62,7 @@ public static ResourceLocation getRL(String resource) { public void commonSetup(FMLCommonSetupEvent event) { event.enqueueWork(() -> { - PacketHandler.init(); + APNetworking.init(); VillageStructures.init(); }); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java index 0904a99a2..8b3d01dac 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java @@ -3,7 +3,7 @@ import com.mojang.blaze3d.platform.InputConstants; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; -import de.srendi.advancedperipherals.common.network.PacketHandler; +import de.srendi.advancedperipherals.common.network.APNetworking; import de.srendi.advancedperipherals.common.network.toserver.SaddleTurtleControlPacket; import net.minecraft.client.Minecraft; import net.minecraft.client.player.Input; @@ -78,7 +78,7 @@ public static void playerMove(MovementInputUpdateEvent event) { lastInput.right = input.right; lastInput.jumping = input.jumping; lastSneak = sneaking; - PacketHandler.sendToServer(new SaddleTurtleControlPacket(input.up, input.down, input.left, input.right, input.jumping, sneaking)); + APNetworking.sendToServer(new SaddleTurtleControlPacket(input.up, input.down, input.left, input.right, input.jumping, sneaking)); } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/container/SaddleTurtleScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java similarity index 100% rename from src/main/java/de/srendi/advancedperipherals/common/container/SaddleTurtleScreen.java rename to src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java index 6418060b1..cb3d49259 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java @@ -704,8 +704,6 @@ public static long getTotalChemicalStorage(IGridNode node) { if (!APAddons.appMekLoaded) return 0; - if (connectedInventoryEntity == null) - continue; for (IGridNode iGridNode : node.getGrid().getMachineNodes(DriveBlockEntity.class)) { DriveBlockEntity entity = (DriveBlockEntity) iGridNode.getService(IStorageProvider.class); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java index 629a65901..5b0490c4b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java @@ -17,12 +17,12 @@ import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.events.Events; +import de.srendi.advancedperipherals.common.network.APNetworking; +import de.srendi.advancedperipherals.common.network.toclient.ToastToClientPacket; import de.srendi.advancedperipherals.common.util.CoordUtil; import de.srendi.advancedperipherals.common.util.StringUtil; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralFunction; -import de.srendi.advancedperipherals.network.APNetworking; -import de.srendi.advancedperipherals.network.toclient.ToastToClientPacket; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentContents; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 04af84c82..251ce6574 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -11,7 +11,7 @@ import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; -import de.srendi.advancedperipherals.common.network.PacketHandler; +import de.srendi.advancedperipherals.common.network.APNetworking; import de.srendi.advancedperipherals.common.network.toclient.SaddleTurtleInfoPacket; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; @@ -110,7 +110,7 @@ private void sendHUD() { if (this.rider instanceof ServerPlayer player) { ITurtleAccess turtle = owner.getTurtle(); SaddleTurtleInfoPacket packet = new SaddleTurtleInfoPacket(turtle.getFuelLevel(), turtle.getFuelLimit(), barColor); - PacketHandler.sendTo(packet, player); + APNetworking.sendTo(packet, player); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 94c8b11d9..b9f45d060 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -4,7 +4,7 @@ import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; -import de.srendi.advancedperipherals.common.network.PacketHandler; +import de.srendi.advancedperipherals.common.network.APNetworking; import de.srendi.advancedperipherals.common.network.toclient.DistanceDetectorSyncPacket; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.util.HitResultUtil; @@ -40,13 +40,13 @@ protected DistanceDetectorPeripheral createPeripheral() { public void setShowLaser(boolean showLaser) { if (this.showLaser != showLaser) - PacketHandler.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, showLaser)); + APNetworking.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, showLaser)); this.showLaser = showLaser; } public void setCurrentDistance(float currentDistance) { if (this.currentDistance != currentDistance) - PacketHandler.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, showLaser)); + APNetworking.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, showLaser)); this.currentDistance = currentDistance; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java index 54f032130..9149b5da0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java @@ -5,7 +5,6 @@ import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.filesystem.IWritableMount; import dan200.computercraft.api.media.IMedia; -import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ServerComputerRegistry; import dan200.computercraft.shared.computer.core.ServerContext; @@ -16,7 +15,6 @@ import de.srendi.advancedperipherals.common.smartglasses.*; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; -import de.srendi.advancedperipherals.common.smartglasses.modules.ModulePeripheral; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java similarity index 99% rename from src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java rename to src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java index 8658d0d0d..1a6751ff4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/PacketHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java @@ -26,7 +26,7 @@ import java.util.Optional; import java.util.function.Function; -public class PacketHandler { +public class APNetworking { private static final String PROTOCOL_VERSION = ModLoadingContext.get().getActiveContainer().getModInfo().getVersion().toString(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java index 45f877f6c..f84b89141 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java @@ -16,6 +16,7 @@ import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleEnvironmentDetectorUpgrade; import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleGeoScannerUpgrade; import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtlePlayerDetectorUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.turtles.TurtleSaddleUpgrade; import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.EndAutomata; import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.HusbandryAutomata; import de.srendi.advancedperipherals.common.addons.computercraft.turtles.metaphysics.OverpoweredEndAutomata; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index 19e3750d1..77a0d96c9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -19,7 +19,6 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java index c2817a9c2..9dd8594a6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/hotkey/HotkeyModuleItem.java @@ -2,7 +2,7 @@ import de.srendi.advancedperipherals.client.KeyBindings; import de.srendi.advancedperipherals.common.items.base.BaseItem; -import de.srendi.advancedperipherals.common.network.PacketHandler; +import de.srendi.advancedperipherals.common.network.APNetworking; import de.srendi.advancedperipherals.common.network.toserver.GlassesHotkeyPacket; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; @@ -44,7 +44,7 @@ public void inventoryTick(@NotNull ItemStack stack, @NotNull Level level, @NotNu setKeyPressDuration(stack, 0); String keyBind = KeyBindings.GLASSES_HOTKEY_KEYBINDING.getKey().getName(); - PacketHandler.sendToServer(new GlassesHotkeyPacket(player.getUUID(), keyBind, duration)); + APNetworking.sendToServer(new GlassesHotkeyPacket(player.getUUID(), keyBind, duration)); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index dee8f0062..f06b28f33 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -9,21 +9,17 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.tags.TagKey; import net.minecraft.util.StringRepresentable; -import net.minecraft.world.SimpleContainer; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.Animal; -import net.minecraft.world.entity.npc.InventoryCarrier; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.scores.Team; -import net.minecraft.world.level.material.Fluid; import net.minecraftforge.common.IForgeShearable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; From 08a229f11d989c272d65a1a2adc55b8bc70124e8 Mon Sep 17 00:00:00 2001 From: Srendi Date: Fri, 28 Jun 2024 20:48:45 +0200 Subject: [PATCH 069/188] Fixed module function loading --- .../smartglasses/SmartGlassesComputer.java | 8 +++++++- .../modules/ModulePeripheral.java | 14 ++++++++++--- .../lib/peripherals/BasePeripheral.java | 20 +++++++++++++------ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index 77a0d96c9..820def72f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -35,6 +35,8 @@ public class SmartGlassesComputer extends ServerComputer implements IPocketAcces private final SmartGlassesAccess smartGlassesAccess = new SmartGlassesAccess(this); @Nullable private SmartGlassesItemHandler itemHandler = null; + @NotNull + private final ModulePeripheral peripheral; private int lightColour = -1; private boolean lightChanged = false; @@ -46,7 +48,8 @@ public class SmartGlassesComputer extends ServerComputer implements IPocketAcces public SmartGlassesComputer(ServerLevel world, int computerID, @Nullable String label, ComputerFamily family) { super(world, computerID, label, family, 39, 13); this.addAPI(new SmartGlassesAPI()); - this.setPeripheral(ComputerSide.BACK, new ModulePeripheral(this)); + peripheral = new ModulePeripheral(this); + this.setPeripheral(ComputerSide.BACK, peripheral); } @Nullable @@ -172,6 +175,9 @@ public void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) { continue; } modules.put(slot, newModule); + peripheral.updateModules(); + setPeripheral(ComputerSide.BACK, null); + setPeripheral(ComputerSide.BACK, peripheral); } else if (oldModule != null) { oldModule.onUnequipped(smartGlassesAccess); modules.remove(slot); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java index a57c6f5aa..749c94a99 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java @@ -10,11 +10,19 @@ public class ModulePeripheral extends BasePeripheral { public ModulePeripheral(SmartGlassesComputer computer) { super(PERIPHERAL_TYPE, new ModulePeripheralOwner(computer)); + + } + + public void updateModules() { + // We need to set the initialisation to false to the dynamic peripheral re-builds the plugins + initialized = false; + if (plugins != null) + plugins.clear(); + getPeripheralOwner().getComputer().getModules().values().forEach(module -> { - IModuleFunctions functions = module.getFunctions(computer.getSmartGlassesAccess()); - if (functions != null) { + IModuleFunctions functions = module.getFunctions(getPeripheralOwner().getComputer().getSmartGlassesAccess()); + if (functions != null) addPlugin(functions); - } }); } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index 09694d948..1f1ac4100 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -1,6 +1,10 @@ package de.srendi.advancedperipherals.lib.peripherals; -import dan200.computercraft.api.lua.*; +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IDynamicPeripheral; import dan200.computercraft.api.peripheral.IPeripheral; @@ -14,7 +18,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -131,16 +142,13 @@ protected Direction validateSide(String direction) throws LuaException { @Override @NotNull public String @NotNull [] getMethodNames() { - if (!initialized) - buildPlugins(); + buildPlugins(); return methodNames; } @Override @NotNull public MethodResult callMethod(@NotNull IComputerAccess access, @NotNull ILuaContext context, int index, @NotNull IArguments arguments) throws LuaException { - if (!initialized) - buildPlugins(); return pluggedMethods.get(index).apply(access, context, arguments); } From 3d9689cfb3496e1e4b79912d6848a8f878e216f3 Mon Sep 17 00:00:00 2001 From: Srendi Date: Fri, 28 Jun 2024 20:55:01 +0200 Subject: [PATCH 070/188] to -> so --- .../common/smartglasses/modules/ModulePeripheral.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java index 749c94a99..e72465756 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java @@ -14,7 +14,7 @@ public ModulePeripheral(SmartGlassesComputer computer) { } public void updateModules() { - // We need to set the initialisation to false to the dynamic peripheral re-builds the plugins + // We need to set the initialisation to false so the dynamic peripheral re-builds the plugins initialized = false; if (plugins != null) plugins.clear(); From 5148b8566687b9366a573e17213df10f76682f51 Mon Sep 17 00:00:00 2001 From: Srendi Date: Sun, 4 Aug 2024 01:21:50 +0200 Subject: [PATCH 071/188] [#515] Basic syncing and rendering of our Panel render object for the smart glasses. This is still a prototype and would not support other types of objects (like texts, circles or whatever we plan for the future) --- .../client/ClientRegistry.java | 3 + .../client/screens/SmartGlassesScreen.java | 2 +- .../smartglasses/OverlayModuleOverlay.java | 44 ++++++++ .../smartglasses/OverlayObjectHolder.java | 34 ++++++ .../widgets/SmartGlassesSettingsSwitch.java | 2 +- .../common/network/APNetworking.java | 6 ++ .../toclient/RenderableObjectClearPacket.java | 27 +++++ .../RenderableObjectDeletePacket.java | 29 +++++ .../toclient/RenderableObjectSyncPacket.java | 30 ++++++ .../overlay/OverlayGlassesFunctions.java | 12 ++- .../modules/overlay/OverlayModule.java | 50 ++++++++- .../modules/overlay/OverlayObject.java | 11 +- .../smartglasses/modules/overlay/Panel.java | 25 +---- .../modules/overlay/RenderableObject.java | 100 +++++++++++++++++- .../propertyTypes/FloatingNumberProperty.java | 4 +- .../propertyTypes/FloatingNumberType.java | 8 +- 16 files changed, 345 insertions(+), 42 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectClearPacket.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectDeletePacket.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index 9eaf6025f..a6235c32e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -7,6 +7,7 @@ import de.srendi.advancedperipherals.client.screens.InventoryManagerScreen; import de.srendi.advancedperipherals.client.screens.SaddleTurtleScreen; import de.srendi.advancedperipherals.client.screens.SmartGlassesScreen; +import de.srendi.advancedperipherals.client.smartglasses.OverlayModuleOverlay; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.setup.APContainerTypes; import de.srendi.advancedperipherals.common.setup.CCRegistration; @@ -28,6 +29,7 @@ public class ClientRegistry { private static final String[] TURTLE_MODELS = new String[]{"turtle_chat_box_upgrade_left", "turtle_chat_box_upgrade_right", "turtle_environment_upgrade_left", "turtle_environment_upgrade_right", "turtle_player_upgrade_left", "turtle_player_upgrade_right", "turtle_geoscanner_upgrade_left", "turtle_geoscanner_upgrade_right"}; public static final SaddleTurtleScreen SADDLE_TURTLE_OVERLAY = new SaddleTurtleScreen(); + public static final OverlayModuleOverlay OVERLAY_MODULE_OVERLAY = new OverlayModuleOverlay(); @SubscribeEvent public static void registerModels(ModelEvent.RegisterAdditional event) { @@ -71,5 +73,6 @@ public static void registeringRenderers(EntityRenderersEvent.RegisterRenderers e @SubscribeEvent public static void registeringOverlays(RegisterGuiOverlaysEvent event) { event.registerAboveAll(SaddleTurtleScreen.ID, SADDLE_TURTLE_OVERLAY); + event.registerAboveAll(OverlayModuleOverlay.ID, OVERLAY_MODULE_OVERLAY); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/SmartGlassesScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SmartGlassesScreen.java index 9b4aa2346..c81884b59 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/SmartGlassesScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/SmartGlassesScreen.java @@ -67,7 +67,7 @@ protected void renderTooltip(@NotNull PoseStack poseStack, int x, int y) { } @Override - protected void renderLabels(PoseStack poseStack, int x, int y) { + protected void renderLabels(@NotNull PoseStack poseStack, int x, int y) { FormattedCharSequence formattedcharsequence = currentType.getName().getVisualOrderText(); this.font.draw(poseStack, formattedcharsequence, (212 + ComputerSidebar.WIDTH - (float) this.font.width(formattedcharsequence) / 2), 133, 4210752); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java new file mode 100644 index 000000000..6b6d74b66 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java @@ -0,0 +1,44 @@ +package de.srendi.advancedperipherals.client.smartglasses; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Matrix4f; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.RenderableObject; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraftforge.client.gui.overlay.ForgeGui; +import net.minecraftforge.client.gui.overlay.IGuiOverlay; + +public class OverlayModuleOverlay implements IGuiOverlay { + public static final String ID = "overlay_module_overlay"; + + @Override + public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + poseStack.pushPose(); + + // Just a simple quads renderer to test the syncing to the client, will evolve while we implement more renderable objects + for (RenderableObject object : OverlayObjectHolder.getObjects()) { + float alpha = object.opacity; + float red = (float) (object.color >> 16 & 255) / 255.0F; + float green = (float) (object.color >> 8 & 255) / 255.0F; + float blue = (float) (object.color & 255) / 255.0F; + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + Matrix4f matrix = poseStack.last().pose(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + bufferbuilder.vertex(matrix, (float) object.x, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) object.x, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); + BufferUploader.drawWithShader(bufferbuilder.end()); + } + poseStack.popPose(); + + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java new file mode 100644 index 000000000..85659fb69 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -0,0 +1,34 @@ +package de.srendi.advancedperipherals.client.smartglasses; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.RenderableObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Static holder for client side renderable objects - will change + */ +public class OverlayObjectHolder { + + public static List objects = new ArrayList<>(); + + public static void addOrUpdateObject(RenderableObject object) { + removeObject(object.getId()); + objects.add(object); + AdvancedPeripherals.debug("Added object to client renderer " + object); + AdvancedPeripherals.debug("Having objects " + objects); + } + + public static List getObjects() { + return objects; + } + + public static void removeObject(String id) { + objects.removeIf(object -> object.getId().equals(id)); + } + + public static void clear() { + objects.clear(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/widgets/SmartGlassesSettingsSwitch.java b/src/main/java/de/srendi/advancedperipherals/client/widgets/SmartGlassesSettingsSwitch.java index 3ee6e1fb1..a6ab0c0cc 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/widgets/SmartGlassesSettingsSwitch.java +++ b/src/main/java/de/srendi/advancedperipherals/client/widgets/SmartGlassesSettingsSwitch.java @@ -79,7 +79,7 @@ public void renderTooltip(PoseStack poseStack, int x, int y) { } @Override - public void updateNarration(NarrationElementOutput pNarrationElementOutput) { + public void updateNarration(@NotNull NarrationElementOutput pNarrationElementOutput) { } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java index 1a6751ff4..6a11f1fcc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java @@ -3,6 +3,9 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.network.base.IPacket; import de.srendi.advancedperipherals.common.network.toclient.DistanceDetectorSyncPacket; +import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket; +import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket; +import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectSyncPacket; import de.srendi.advancedperipherals.common.network.toclient.SaddleTurtleInfoPacket; import de.srendi.advancedperipherals.common.network.toclient.ToastToClientPacket; import de.srendi.advancedperipherals.common.network.toserver.GlassesHotkeyPacket; @@ -38,6 +41,9 @@ public static void init() { registerServerToClient(DistanceDetectorSyncPacket.class, DistanceDetectorSyncPacket::decode); registerServerToClient(SaddleTurtleInfoPacket.class, SaddleTurtleInfoPacket::decode); registerServerToClient(ToastToClientPacket.class, ToastToClientPacket::decode); + registerServerToClient(RenderableObjectSyncPacket.class, RenderableObjectSyncPacket::decode); + registerServerToClient(RenderableObjectDeletePacket.class, RenderableObjectDeletePacket::decode); + registerServerToClient(RenderableObjectClearPacket.class, RenderableObjectClearPacket::decode); registerClientToServer(GlassesHotkeyPacket.class, GlassesHotkeyPacket::decode); registerClientToServer(SaddleTurtleControlPacket.class, SaddleTurtleControlPacket::decode); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectClearPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectClearPacket.java new file mode 100644 index 000000000..72fd6590a --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectClearPacket.java @@ -0,0 +1,27 @@ +package de.srendi.advancedperipherals.common.network.toclient; + +import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +public class RenderableObjectClearPacket implements IPacket { + + public RenderableObjectClearPacket() { + + } + + @Override + public void handle(NetworkEvent.Context context) { + OverlayObjectHolder.clear(); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + + } + + public static RenderableObjectClearPacket decode(FriendlyByteBuf buffer) { + return new RenderableObjectClearPacket(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectDeletePacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectDeletePacket.java new file mode 100644 index 000000000..6463b12b1 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectDeletePacket.java @@ -0,0 +1,29 @@ +package de.srendi.advancedperipherals.common.network.toclient; + +import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +public class RenderableObjectDeletePacket implements IPacket { + + private final String object; + + public RenderableObjectDeletePacket(String object) { + this.object = object; + } + + @Override + public void handle(NetworkEvent.Context context) { + OverlayObjectHolder.removeObject(object); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeUtf(object); + } + + public static RenderableObjectDeletePacket decode(FriendlyByteBuf buffer) { + return new RenderableObjectDeletePacket(buffer.readUtf()); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java new file mode 100644 index 000000000..8feedf25d --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java @@ -0,0 +1,30 @@ +package de.srendi.advancedperipherals.common.network.toclient; + +import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.RenderableObject; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +public class RenderableObjectSyncPacket implements IPacket { + + private final RenderableObject object; + + public RenderableObjectSyncPacket(RenderableObject object) { + this.object = object; + } + + @Override + public void handle(NetworkEvent.Context context) { + OverlayObjectHolder.addOrUpdateObject(object); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + object.encode(buffer); + } + + public static RenderableObjectSyncPacket decode(FriendlyByteBuf buffer) { + return new RenderableObjectSyncPacket(RenderableObject.decode(buffer)); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index 2ad26b3a8..703e8fcfa 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -27,7 +27,7 @@ public final String test() { @LuaFunction public final MethodResult createPanel(String id, IArguments arguments) throws LuaException { Panel panel = new Panel(id, overlayModule, arguments); - Pair success = overlayModule.addObject(panel); + Pair success = overlayModule.addObject(panel); if(!success.getRight()) return MethodResult.of(success.getLeft(), IModule.ErrorConstants.ALREADY_EXISTS); @@ -39,4 +39,14 @@ public final MethodResult getObjects(IArguments arguments) { return MethodResult.of((Object) overlayModule.getObjects().stream().map(OverlayObject::getId).toArray(String[]::new)); } + @LuaFunction + public final MethodResult removeObject(String id) { + return MethodResult.of(overlayModule.removeObject(id)); + } + + @LuaFunction + public final MethodResult clear() { + return MethodResult.of(overlayModule.clear()); + } + } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java index e7b5c9fe9..2adfb0ebc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java @@ -1,11 +1,16 @@ package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.network.APNetworking; +import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket; +import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket; +import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectSyncPacket; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; import de.srendi.advancedperipherals.common.util.Pair; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; import java.util.concurrent.CopyOnWriteArraySet; @@ -17,7 +22,7 @@ */ public class OverlayModule implements IModule { - public final CopyOnWriteArraySet objects = new CopyOnWriteArraySet<>(); + public final CopyOnWriteArraySet objects = new CopyOnWriteArraySet<>(); public final SmartGlassesAccess access; public OverlayModule(SmartGlassesAccess access) { @@ -47,7 +52,7 @@ public SmartGlassesAccess getAccess() { return access; } - public CopyOnWriteArraySet getObjects() { + public CopyOnWriteArraySet getObjects() { return objects; } @@ -58,12 +63,49 @@ public CopyOnWriteArraySet getObjects() { * @return A pair of the object and a boolean. The boolean is true if the object was added successfully and false if not. * The object is the object which was added or the object which already exists(When not successful). */ - public Pair addObject(OverlayObject object) { - for (OverlayObject overlayObject : objects) { + public Pair addObject(RenderableObject object) { + for (RenderableObject overlayObject : objects) { if (overlayObject.getId().equals(object.getId())) return Pair.of(overlayObject, false); } + APNetworking.sendTo(new RenderableObjectSyncPacket(object), (ServerPlayer) access.getEntity()); objects.add(object); return Pair.of(object, true); } + + /** + * Removes an object from the module if it exists and updates the client. + * + * @param id the object id + * @return true if the object existed and was removed, false if the object was not in the collection + */ + public boolean removeObject(String id) { + boolean removed = objects.removeIf(object -> object.getId().equals(id)); + + if (removed) + APNetworking.sendTo(new RenderableObjectDeletePacket(id), (ServerPlayer) access.getEntity()); + + return removed; + } + + /** + * Removes all objects from the module + * + * @return the amount of objects cleared + */ + public int clear() { + int size = objects.size(); + objects.clear(); + APNetworking.sendTo(new RenderableObjectClearPacket(), (ServerPlayer) access.getEntity()); + return size; + } + + /** + * Just sends a sync package to the client, this method should only be called from the setter lua functions from our objects + * + * @param object the object to sync to the player + */ + public void update(RenderableObject object) { + APNetworking.sendTo(new RenderableObjectSyncPacket(object), (ServerPlayer) access.getEntity()); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java index ff584021d..ae124e23b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java @@ -179,7 +179,7 @@ protected void handle(NetworkEvent.Context context) { } - protected void encode(FriendlyByteBuf buffer) { + public void encode(FriendlyByteBuf buffer) { buffer.writeUtf(id); Entity entity = module.getAccess().getEntity(); if(entity instanceof Player player) { @@ -191,4 +191,13 @@ protected void encode(FriendlyByteBuf buffer) { } } + @Override + public String toString() { + return "OverlayObject{" + + "enabled=" + enabled + + ", id='" + id + '\'' + + ", module=" + module + + ", player=" + player + + '}'; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java index 562c07f10..122f188df 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java @@ -2,10 +2,8 @@ import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; -import de.srendi.advancedperipherals.AdvancedPeripherals; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; -import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -29,29 +27,8 @@ public Panel(String id, UUID player) { } @Override - protected void encode(FriendlyByteBuf buffer) { + public void encode(FriendlyByteBuf buffer) { super.encode(buffer); - buffer.writeInt(color); - buffer.writeDouble(opacity); - } - - @Nullable - public static Panel decode(FriendlyByteBuf buffer) { - String id = buffer.readUtf(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); - return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - double opacity = buffer.readDouble(); - - Panel clientPanel = new Panel(id, player); - clientPanel.color = color; - clientPanel.opacity = opacity; - - return clientPanel; } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java index 01cad70a2..6e12719e3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java @@ -3,27 +3,43 @@ import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FixedPointNumberProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FloatingNumberProperty; +import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; -public abstract class RenderableObject extends OverlayObject { +// TODO: generate setters/getters lua functions out of our FloatingNumberProperty fields +public class RenderableObject extends OverlayObject { @FloatingNumberProperty(min = 0, max = 1) - public double opacity = 1; + public float opacity = 1; @FixedPointNumberProperty(min = 0, max = 0xFFFFFF) public int color = 0xFFFFFF; + @FixedPointNumberProperty(min = -32767, max = 32767) + public int x = 0; + + @FixedPointNumberProperty(min = -32767, max = 32767) + public int y = 0; + + @FixedPointNumberProperty(min = -32767, max = 32767) + public int maxX = 0; + + @FixedPointNumberProperty(min = -32767, max = 32767) + public int maxY = 0; + @LuaFunction - public double getOpacity() { + public float getOpacity() { return opacity; } @LuaFunction - public void setOpacity(double opacity) { + public void setOpacity(float opacity) { this.opacity = opacity; + getModule().update(this); } @LuaFunction @@ -34,6 +50,31 @@ public int getColor() { @LuaFunction public void setColor(int color) { this.color = color; + getModule().update(this); + } + + @LuaFunction + public void setMaxX(int maxX) { + this.maxX = maxX; + getModule().update(this); + } + + @LuaFunction + public void setMaxY(int maxY) { + this.maxY = maxY; + getModule().update(this); + } + + @LuaFunction + public void setX(int x) { + this.x = x; + getModule().update(this); + } + + @LuaFunction + public void setY(int y) { + this.y = y; + getModule().update(this); } public RenderableObject(String id, OverlayModule module, IArguments arguments) throws LuaException { @@ -44,4 +85,55 @@ public RenderableObject(String id, OverlayModule module, IArguments arguments) t public RenderableObject(String id, UUID player) { super(id, player); } + + @Override + public void encode(FriendlyByteBuf buffer) { + super.encode(buffer); + buffer.writeInt(color); + buffer.writeFloat(opacity); + + buffer.writeInt(x); + buffer.writeInt(y); + buffer.writeInt(maxX); + buffer.writeInt(maxY); + } + + public static RenderableObject decode(FriendlyByteBuf buffer) { + String id = buffer.readUtf(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + int x = buffer.readInt(); + int y = buffer.readInt(); + int sizeX = buffer.readInt(); + int sizeY = buffer.readInt(); + + RenderableObject clientObject = new RenderableObject(id, player); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.maxX = sizeX; + clientObject.maxY = sizeY; + + return clientObject; + } + + @Override + public String toString() { + return "RenderableObject{" + + "opacity=" + opacity + + ", color=" + color + + ", x=" + x + + ", y=" + y + + ", sizeX=" + maxX + + ", sizeY=" + maxY + + '}'; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java index e377472f3..6199d34a1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java @@ -12,7 +12,7 @@ @ObjectProperty(type = FloatingNumberType.class) public @interface FloatingNumberProperty { - double min() default Double.MIN_VALUE; - double max() default Double.MAX_VALUE; + float min() default Float.MIN_VALUE; + float max() default Float.MAX_VALUE; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java index 05d6eb8df..c5089f2ca 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java @@ -4,8 +4,8 @@ public class FloatingNumberType implements PropertyType { - public double min; - public double max; + public float min; + public float max; @Override public boolean checkIsValid(Object type) { @@ -14,8 +14,8 @@ public boolean checkIsValid(Object type) { @Override public Number mapValue(Object type) { - AdvancedPeripherals.debug("Mapping value " + type + " to " + Math.min(Math.max((double) type, min), max)); - return Math.min(Math.max((double) type, min), max); + AdvancedPeripherals.debug("Mapping value " + type + " to " + Math.min(Math.max((float) type, min), max)); + return Math.min(Math.max((float) type, min), max); } @Override From 558cc96689d238d089d9b8de74ce81ef356a4a2f Mon Sep 17 00:00:00 2001 From: Srendi Date: Sun, 4 Aug 2024 18:31:22 +0200 Subject: [PATCH 072/188] [#515] Implemented another rendering object, a circle Implemented a system to register rendering object types for network sync and rendering on the client --- .../client/ClientRegistry.java | 2 + .../smartglasses/OverlayModuleOverlay.java | 18 +--- .../smartglasses/OverlayObjectHolder.java | 10 +- .../smartglasses/objects/CircleRenderer.java | 53 +++++++++++ .../smartglasses/objects/IObjectRenderer.java | 11 +++ .../smartglasses/objects/PanelRenderer.java | 34 +++++++ .../toclient/RenderableObjectSyncPacket.java | 7 +- .../modules/overlay/ObjectDecodeRegistry.java | 25 +++++ .../overlay/OverlayGlassesFunctions.java | 20 ++++ .../modules/overlay/OverlayModule.java | 1 + .../modules/overlay/OverlayObject.java | 6 -- .../smartglasses/modules/overlay/Panel.java | 38 -------- .../modules/overlay/objects/Circle.java | 95 +++++++++++++++++++ .../modules/overlay/objects/Panel.java | 70 ++++++++++++++ .../{ => objects}/RenderableObject.java | 85 ++++++++--------- 15 files changed, 369 insertions(+), 106 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{ => objects}/RenderableObject.java (66%) diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index a6235c32e..27c1f9e51 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -8,6 +8,7 @@ import de.srendi.advancedperipherals.client.screens.SaddleTurtleScreen; import de.srendi.advancedperipherals.client.screens.SmartGlassesScreen; import de.srendi.advancedperipherals.client.smartglasses.OverlayModuleOverlay; +import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.setup.APContainerTypes; import de.srendi.advancedperipherals.common.setup.CCRegistration; @@ -58,6 +59,7 @@ public static void onClientSetup(FMLClientSetupEvent event) { ComputerCraftAPIClient.registerTurtleUpgradeModeller(CCRegistration.WEAK_TURTLE.get(), new MetaTurtleUpgradeModeller<>()); ItemPropertiesRegistry.register(); + OverlayObjectHolder.registerDecodeObjects(); } @SubscribeEvent diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java index 6b6d74b66..548ac4ed6 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java @@ -8,7 +8,7 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix4f; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; @@ -20,22 +20,8 @@ public class OverlayModuleOverlay implements IGuiOverlay { public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { poseStack.pushPose(); - // Just a simple quads renderer to test the syncing to the client, will evolve while we implement more renderable objects for (RenderableObject object : OverlayObjectHolder.getObjects()) { - float alpha = object.opacity; - float red = (float) (object.color >> 16 & 255) / 255.0F; - float green = (float) (object.color >> 8 & 255) / 255.0F; - float blue = (float) (object.color & 255) / 255.0F; - - RenderSystem.setShader(GameRenderer::getPositionColorShader); - BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); - Matrix4f matrix = poseStack.last().pose(); - bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - bufferbuilder.vertex(matrix, (float) object.x, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) object.x, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); - BufferUploader.drawWithShader(bufferbuilder.end()); + object.getRenderObject().render(object, gui, poseStack, partialTick, screenWidth, screenHeight); } poseStack.popPose(); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 85659fb69..2ab696997 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -1,7 +1,10 @@ package de.srendi.advancedperipherals.client.smartglasses; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Panel; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import java.util.ArrayList; import java.util.List; @@ -31,4 +34,9 @@ public static void removeObject(String id) { public static void clear() { objects.clear(); } + + public static void registerDecodeObjects() { + ObjectDecodeRegistry.register(Panel.ID, Panel::decode); + ObjectDecodeRegistry.register(Circle.ID, Circle::decode); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java new file mode 100644 index 000000000..184e9e7fb --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java @@ -0,0 +1,53 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Matrix4f; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraftforge.client.gui.overlay.ForgeGui; + +public class CircleRenderer implements IObjectRenderer { + + @Override + public void render(RenderableObject object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + Circle circle = (Circle) object; + + float alpha = object.opacity; + float red = (float) (object.color >> 16 & 255) / 255.0F; + float green = (float) (object.color >> 8 & 255) / 255.0F; + float blue = (float) (object.color & 255) / 255.0F; + + drawCircle(poseStack, circle.x, circle.y, circle.radius, 120, red, green, blue, alpha); + } + + public void drawCircle(PoseStack poseStack, float cx, float cy, float r, int numSegments, float red, float green, float blue, float alpha) { + RenderSystem.setShader(GameRenderer::getPositionColorShader); + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + + Matrix4f matrix = poseStack.last().pose(); + bufferbuilder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_COLOR); + + bufferbuilder.vertex(matrix, cx, cy, 1f).color(red, green, blue, alpha).endVertex(); + + double angle = Math.PI * 2 / numSegments; + + for (int i = 0; i <= numSegments; i++) { + double x = cx + r * Math.cos(i * angle); + double y = cy + r * Math.sin(i * angle); + + bufferbuilder.vertex(matrix, (float) y, (float) x, 0f).color(red, green, blue, alpha).endVertex(); + } + + BufferUploader.drawWithShader(bufferbuilder.end()); + } + + + +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java new file mode 100644 index 000000000..1295448e3 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java @@ -0,0 +1,11 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects; + +import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import net.minecraftforge.client.gui.overlay.ForgeGui; + +public interface IObjectRenderer { + + void render(RenderableObject object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight); + +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java new file mode 100644 index 000000000..441238ac5 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java @@ -0,0 +1,34 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Matrix4f; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraftforge.client.gui.overlay.ForgeGui; + +public class PanelRenderer implements IObjectRenderer { + + @Override + public void render(RenderableObject object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + float alpha = object.opacity; + float red = (float) (object.color >> 16 & 255) / 255.0F; + float green = (float) (object.color >> 8 & 255) / 255.0F; + float blue = (float) (object.color & 255) / 255.0F; + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + Matrix4f matrix = poseStack.last().pose(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + bufferbuilder.vertex(matrix, (float) object.x, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) object.x, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); + BufferUploader.drawWithShader(bufferbuilder.end()); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java index 8feedf25d..fb2a1ba68 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java @@ -2,7 +2,8 @@ import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; import de.srendi.advancedperipherals.common.network.base.IPacket; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; @@ -25,6 +26,8 @@ public void encode(FriendlyByteBuf buffer) { } public static RenderableObjectSyncPacket decode(FriendlyByteBuf buffer) { - return new RenderableObjectSyncPacket(RenderableObject.decode(buffer)); + int id = buffer.readInt(); + RenderableObject decodedObject = ObjectDecodeRegistry.getObject(id, buffer); + return new RenderableObjectSyncPacket(decodedObject); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java new file mode 100644 index 000000000..2406ca69b --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java @@ -0,0 +1,25 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; + +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public class ObjectDecodeRegistry { + + private static final Map> objectRegistry = new HashMap<>(); + + public static RenderableObject getObject(int id, FriendlyByteBuf buf) { + if (objectRegistry.containsKey(id)) { + return objectRegistry.get(id).apply(buf); + } + return null; + } + + public static void register(int id, Function function) { + objectRegistry.put(id, function); + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index 703e8fcfa..828cf1c95 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -7,7 +7,11 @@ import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Panel; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.util.Pair; +import net.minecraft.client.Minecraft; public class OverlayGlassesFunctions implements IModuleFunctions { @@ -34,6 +38,16 @@ public final MethodResult createPanel(String id, IArguments arguments) throws Lu return MethodResult.of(success.getLeft(), "SUCCESS"); } + @LuaFunction + public final MethodResult createCircle(String id, IArguments arguments) throws LuaException { + Circle circle = new Circle(id, overlayModule, arguments); + Pair success = overlayModule.addObject(circle); + if(!success.getRight()) + return MethodResult.of(success.getLeft(), IModule.ErrorConstants.ALREADY_EXISTS); + + return MethodResult.of(success.getLeft(), "SUCCESS"); + } + @LuaFunction public final MethodResult getObjects(IArguments arguments) { return MethodResult.of((Object) overlayModule.getObjects().stream().map(OverlayObject::getId).toArray(String[]::new)); @@ -49,4 +63,10 @@ public final MethodResult clear() { return MethodResult.of(overlayModule.clear()); } + // TODO: This will crash on dedicated servers + @LuaFunction + public final MethodResult getSize() { + return MethodResult.of(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight()); + } + } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java index 2adfb0ebc..100798218 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java @@ -8,6 +8,7 @@ import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.util.Pair; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java index ae124e23b..73c0219ce 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java @@ -10,7 +10,6 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.network.NetworkEvent; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.logging.log4j.Level; @@ -20,7 +19,6 @@ import java.util.UUID; import java.util.stream.Collectors; - public abstract class OverlayObject { @BooleanProperty @@ -175,10 +173,6 @@ public Object castValueToFieldType(Field field, Object value) { return value; } - protected void handle(NetworkEvent.Context context) { - - } - public void encode(FriendlyByteBuf buffer) { buffer.writeUtf(id); Entity entity = module.getAccess().getEntity(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java deleted file mode 100644 index 122f188df..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/Panel.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; - -import dan200.computercraft.api.lua.IArguments; -import dan200.computercraft.api.lua.LuaException; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - -import java.util.UUID; - -/** - * A panel is the standard panel which can contain multiple render-able objects in it. - */ -public class Panel extends RenderableObject { - - public Panel(String id, OverlayModule module, IArguments arguments) throws LuaException { - super(id, module, arguments); - } - - /** - * constructor for the client side initialization - * - * @param id id of the object - * @param player the target player - */ - public Panel(String id, UUID player) { - super(id, player); - } - - @Override - public void encode(FriendlyByteBuf buffer) { - super.encode(buffer); - } - - @Override - protected void handle(NetworkEvent.Context context) { - super.handle(context); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java new file mode 100644 index 000000000..d3631a2ec --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java @@ -0,0 +1,95 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.CircleRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FixedPointNumberProperty; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.UUID; + +public class Circle extends RenderableObject { + + public static final int ID = 1; + + @FixedPointNumberProperty(min = -32767, max = 32767) + public int radius = 0; + + public Circle(String id, OverlayModule module, IArguments arguments) throws LuaException { + super(id, module, arguments); + reflectivelyMapProperties(arguments); + } + + public Circle(String id, UUID player) { + super(id, player); + } + + @LuaFunction + public int getRadius() { + return radius; + } + + @LuaFunction + public void setRadius(int radius) { + this.radius = radius; + getModule().update(this); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(ID); + super.encode(buffer); + buffer.writeInt(radius); + } + + public static Circle decode(FriendlyByteBuf buffer) { + String id = buffer.readUtf(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + int x = buffer.readInt(); + int y = buffer.readInt(); + int maxX = buffer.readInt(); + int maxY = buffer.readInt(); + int radius = buffer.readInt(); + + Circle clientObject = new Circle(id, player); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.maxX = maxX; + clientObject.maxY = maxY; + clientObject.radius = radius; + + return clientObject; + } + + @Override + public IObjectRenderer getRenderObject() { + return new CircleRenderer(); + } + + @Override + public String toString() { + return "Circle{" + + "radius=" + radius + + ", opacity=" + opacity + + ", color=" + color + + ", x=" + x + + ", y=" + y + + ", maxX=" + maxX + + ", maxY=" + maxY + + '}'; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java new file mode 100644 index 000000000..d038c25f5 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java @@ -0,0 +1,70 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.PanelRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.UUID; + +/** + * A panel is the standard panel which can contain multiple render-able objects in it. + */ +public class Panel extends RenderableObject { + public static final int ID = 0; + + public Panel(String id, OverlayModule module, IArguments arguments) throws LuaException { + super(id, module, arguments); + } + + /** + * constructor for the client side initialization + * + * @param id id of the object + * @param player the target player + */ + public Panel(String id, UUID player) { + super(id, player); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(ID); + super.encode(buffer); + } + + public static Panel decode(FriendlyByteBuf buffer) { + String id = buffer.readUtf(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + int x = buffer.readInt(); + int y = buffer.readInt(); + int sizeX = buffer.readInt(); + int sizeY = buffer.readInt(); + + Panel clientObject = new Panel(id, player); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.maxX = sizeX; + clientObject.maxY = sizeY; + + return clientObject; + } + + @Override + public IObjectRenderer getRenderObject() { + return new PanelRenderer(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java similarity index 66% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java index 6e12719e3..36452c7b6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java @@ -1,9 +1,11 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FixedPointNumberProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FloatingNumberProperty; import net.minecraft.network.FriendlyByteBuf; @@ -31,59 +33,79 @@ public class RenderableObject extends OverlayObject { @FixedPointNumberProperty(min = -32767, max = 32767) public int maxY = 0; + public RenderableObject(String id, OverlayModule module, IArguments arguments) throws LuaException { + super(id, module, arguments); + reflectivelyMapProperties(arguments); + } + + public RenderableObject(String id, UUID player) { + super(id, player); + } + @LuaFunction - public float getOpacity() { + public final float getOpacity() { return opacity; } @LuaFunction - public void setOpacity(float opacity) { - this.opacity = opacity; + public final void setOpacity(double opacity) { + this.opacity = (float) opacity; getModule().update(this); } @LuaFunction - public int getColor() { + public final int getColor() { return color; } @LuaFunction - public void setColor(int color) { + public final void setColor(int color) { this.color = color; getModule().update(this); } @LuaFunction - public void setMaxX(int maxX) { + public final void setMaxX(int maxX) { this.maxX = maxX; getModule().update(this); } @LuaFunction - public void setMaxY(int maxY) { + public final int getMaxX() { + return maxX; + } + + @LuaFunction + public final void setMaxY(int maxY) { this.maxY = maxY; getModule().update(this); } @LuaFunction - public void setX(int x) { + public final int getMaxY() { + return maxY; + } + + @LuaFunction + public final void setX(int x) { this.x = x; getModule().update(this); } @LuaFunction - public void setY(int y) { - this.y = y; - getModule().update(this); + public final int getX() { + return x; } - public RenderableObject(String id, OverlayModule module, IArguments arguments) throws LuaException { - super(id, module, arguments); - reflectivelyMapProperties(arguments); + @LuaFunction + public final void setY(int y) { + this.y = y; + getModule().update(this); } - public RenderableObject(String id, UUID player) { - super(id, player); + @LuaFunction + public final int getY() { + return y; } @Override @@ -98,31 +120,8 @@ public void encode(FriendlyByteBuf buffer) { buffer.writeInt(maxY); } - public static RenderableObject decode(FriendlyByteBuf buffer) { - String id = buffer.readUtf(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); - return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - float opacity = buffer.readFloat(); - - int x = buffer.readInt(); - int y = buffer.readInt(); - int sizeX = buffer.readInt(); - int sizeY = buffer.readInt(); - - RenderableObject clientObject = new RenderableObject(id, player); - clientObject.color = color; - clientObject.opacity = opacity; - clientObject.x = x; - clientObject.y = y; - clientObject.maxX = sizeX; - clientObject.maxY = sizeY; - - return clientObject; + public IObjectRenderer getRenderObject() { + return null; } @Override From c095040c97fab3a3c6e4dd960500c55c79705c68 Mon Sep 17 00:00:00 2001 From: Srendi Date: Sun, 4 Aug 2024 20:47:59 +0200 Subject: [PATCH 073/188] [#515] Text type (without rendering), check if the object is enabled before rendering it --- .../smartglasses/OverlayModuleOverlay.java | 10 +-- .../smartglasses/OverlayObjectHolder.java | 2 + .../smartglasses/objects/TextRenderer.java | 18 ++++ .../modules/overlay/objects/Circle.java | 4 +- .../modules/overlay/objects/Panel.java | 5 +- .../modules/overlay/objects/Text.java | 84 +++++++++++++++++++ .../overlay/propertyTypes/StringProperty.java | 15 ++++ .../overlay/propertyTypes/StringType.java | 20 +++++ 8 files changed, 148 insertions(+), 10 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringProperty.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringType.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java index 548ac4ed6..12bcf2ef7 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java @@ -1,15 +1,7 @@ package de.srendi.advancedperipherals.client.smartglasses; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.BufferUploader; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.mojang.math.Matrix4f; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; -import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; @@ -21,6 +13,8 @@ public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int scr poseStack.pushPose(); for (RenderableObject object : OverlayObjectHolder.getObjects()) { + if (!object.isEnabled()) + continue; object.getRenderObject().render(object, gui, poseStack, partialTick, screenWidth, screenHeight); } poseStack.popPose(); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 2ab696997..7e00e279d 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -5,6 +5,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Panel; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Text; import java.util.ArrayList; import java.util.List; @@ -38,5 +39,6 @@ public static void clear() { public static void registerDecodeObjects() { ObjectDecodeRegistry.register(Panel.ID, Panel::decode); ObjectDecodeRegistry.register(Circle.ID, Circle::decode); + ObjectDecodeRegistry.register(Text.ID, Text::decode); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java new file mode 100644 index 000000000..7b1085a6d --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java @@ -0,0 +1,18 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects; + +import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import net.minecraftforge.client.gui.overlay.ForgeGui; + +public class TextRenderer implements IObjectRenderer { + + @Override + public void render(RenderableObject object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + float alpha = object.opacity; + float red = (float) (object.color >> 16 & 255) / 255.0F; + float green = (float) (object.color >> 8 & 255) / 255.0F; + float blue = (float) (object.color & 255) / 255.0F; + + + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java index d3631a2ec..5c598d9f2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java @@ -16,6 +16,8 @@ public class Circle extends RenderableObject { public static final int ID = 1; + private final IObjectRenderer renderer = new CircleRenderer(); + @FixedPointNumberProperty(min = -32767, max = 32767) public int radius = 0; @@ -77,7 +79,7 @@ public static Circle decode(FriendlyByteBuf buffer) { @Override public IObjectRenderer getRenderObject() { - return new CircleRenderer(); + return renderer; } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java index d038c25f5..4573d911c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java @@ -5,6 +5,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.PanelRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.TextRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import net.minecraft.network.FriendlyByteBuf; @@ -16,6 +17,8 @@ public class Panel extends RenderableObject { public static final int ID = 0; + private final IObjectRenderer renderer = new PanelRenderer(); + public Panel(String id, OverlayModule module, IArguments arguments) throws LuaException { super(id, module, arguments); } @@ -65,6 +68,6 @@ public static Panel decode(FriendlyByteBuf buffer) { @Override public IObjectRenderer getRenderObject() { - return new PanelRenderer(); + return renderer; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java new file mode 100644 index 000000000..39803f91d --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java @@ -0,0 +1,84 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.TextRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.StringProperty; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.UUID; + +public class Text extends RenderableObject { + public static final int ID = 2; + + private final IObjectRenderer renderer = new TextRenderer(); + + @StringProperty + public String content; + + public Text(String id, OverlayModule module, IArguments arguments) throws LuaException { + super(id, module, arguments); + reflectivelyMapProperties(arguments); + } + + public Text(String id, UUID player) { + super(id, player); + } + + @LuaFunction + public final String getContent() { + return content; + } + + @LuaFunction + public final void setContent(String content) { + this.content = content; + getModule().update(this); + } + + @Override + public IObjectRenderer getRenderObject() { + return renderer; + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(ID); + super.encode(buffer); + buffer.writeUtf(content); + } + + public static Text decode(FriendlyByteBuf buffer) { + String id = buffer.readUtf(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + int x = buffer.readInt(); + int y = buffer.readInt(); + int sizeX = buffer.readInt(); + int sizeY = buffer.readInt(); + String content = buffer.readUtf(); + + Text clientObject = new Text(id, player); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.maxX = sizeX; + clientObject.maxY = sizeY; + clientObject.content = content; + + return clientObject; + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringProperty.java new file mode 100644 index 000000000..4a86c946f --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringProperty.java @@ -0,0 +1,15 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; + +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@ObjectProperty(type = StringType.class) +public @interface StringProperty { + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringType.java new file mode 100644 index 000000000..797bdb6de --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringType.java @@ -0,0 +1,20 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; + +public class StringType implements PropertyType { + + @Override + public boolean checkIsValid(Object type) { + return type instanceof String; + } + + @Override + public String mapValue(Object type) { + return (String) type; + } + + @Override + public void init(Object property) { + // Nothing to init here, we don't have any filters for strings + } +} + From cd6f4e139db29d5597e0062be569508925bfb178 Mon Sep 17 00:00:00 2001 From: Srendi Date: Sun, 4 Aug 2024 20:53:11 +0200 Subject: [PATCH 074/188] begone --- .../common/smartglasses/modules/overlay/ObjectProperty.java | 2 +- .../common/smartglasses/modules/overlay/OverlayObject.java | 4 ++-- .../common/smartglasses/modules/overlay/objects/Circle.java | 2 +- .../modules/overlay/objects/RenderableObject.java | 4 ++-- .../common/smartglasses/modules/overlay/objects/Text.java | 2 +- .../{propertyTypes => propertytypes}/BooleanProperty.java | 2 +- .../overlay/{propertyTypes => propertytypes}/BooleanType.java | 2 +- .../FixedPointNumberProperty.java | 2 +- .../FixedPointNumberType.java | 2 +- .../FloatingNumberProperty.java | 2 +- .../{propertyTypes => propertytypes}/FloatingNumberType.java | 2 +- .../{propertyTypes => propertytypes}/PropertyType.java | 2 +- .../{propertyTypes => propertytypes}/StringProperty.java | 2 +- .../overlay/{propertyTypes => propertytypes}/StringType.java | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{propertyTypes => propertytypes}/BooleanProperty.java (94%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{propertyTypes => propertytypes}/BooleanType.java (94%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{propertyTypes => propertytypes}/FixedPointNumberProperty.java (95%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{propertyTypes => propertytypes}/FixedPointNumberType.java (97%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{propertyTypes => propertytypes}/FloatingNumberProperty.java (95%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{propertyTypes => propertytypes}/FloatingNumberType.java (97%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{propertyTypes => propertytypes}/PropertyType.java (97%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{propertyTypes => propertytypes}/StringProperty.java (94%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/{propertyTypes => propertytypes}/StringType.java (94%) diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectProperty.java index 4f332efd5..a580e14a6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectProperty.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectProperty.java @@ -1,6 +1,6 @@ package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.PropertyType; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.PropertyType; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java index 73c0219ce..72bb171a2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java @@ -4,8 +4,8 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.BooleanProperty; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.PropertyType; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.PropertyType; import de.srendi.advancedperipherals.common.util.StringUtil; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java index 5c598d9f2..cdb351d71 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java @@ -7,7 +7,7 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.CircleRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FixedPointNumberProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java index 36452c7b6..ec68efdcb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java @@ -6,8 +6,8 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FixedPointNumberProperty; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.FloatingNumberProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java index 39803f91d..0bc2a9784 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java @@ -7,7 +7,7 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.TextRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes.StringProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/BooleanProperty.java similarity index 94% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanProperty.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/BooleanProperty.java index dc082c9d8..120461133 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanProperty.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/BooleanProperty.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/BooleanType.java similarity index 94% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanType.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/BooleanType.java index 25ab0f531..1dfc36e8a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/BooleanType.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/BooleanType.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; public class BooleanType implements PropertyType { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberProperty.java similarity index 95% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberProperty.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberProperty.java index a65635363..f4a05242a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberProperty.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberProperty.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberType.java similarity index 97% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberType.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberType.java index 04bf3bde7..daf47a805 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FixedPointNumberType.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberType.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; import de.srendi.advancedperipherals.AdvancedPeripherals; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberProperty.java similarity index 95% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberProperty.java index 6199d34a1..bc7e66f3c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberProperty.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberProperty.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberType.java similarity index 97% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberType.java index c5089f2ca..7d0c708f5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/FloatingNumberType.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberType.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; import de.srendi.advancedperipherals.AdvancedPeripherals; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/PropertyType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/PropertyType.java similarity index 97% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/PropertyType.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/PropertyType.java index bd29944ba..bd74b3bed 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/PropertyType.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/PropertyType.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringProperty.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/StringProperty.java similarity index 94% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringProperty.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/StringProperty.java index 4a86c946f..17be93d2b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringProperty.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/StringProperty.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectProperty; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/StringType.java similarity index 94% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringType.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/StringType.java index 797bdb6de..05f67a1f2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertyTypes/StringType.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/StringType.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertyTypes; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; public class StringType implements PropertyType { From 50c06d4aa78cab940c9870ba15075bbadc82d76e Mon Sep 17 00:00:00 2001 From: endi Date: Mon, 5 Aug 2024 10:16:25 +0200 Subject: [PATCH 075/188] [#515] Fixed some rendering issues with circles --- .../client/smartglasses/objects/CircleRenderer.java | 6 +++--- .../common/smartglasses/modules/overlay/objects/Panel.java | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java index 184e9e7fb..e19d76b88 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java @@ -39,10 +39,10 @@ public void drawCircle(PoseStack poseStack, float cx, float cy, float r, int num double angle = Math.PI * 2 / numSegments; for (int i = 0; i <= numSegments; i++) { - double x = cx + r * Math.cos(i * angle); - double y = cy + r * Math.sin(i * angle); + double x = cx + r * Math.sin(i * angle); + double y = cy + r * Math.cos(i * angle); - bufferbuilder.vertex(matrix, (float) y, (float) x, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) x, (float) y, 0f).color(red, green, blue, alpha).endVertex(); } BufferUploader.drawWithShader(bufferbuilder.end()); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java index 4573d911c..c4b3597b0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java @@ -5,7 +5,6 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.PanelRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.TextRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import net.minecraft.network.FriendlyByteBuf; From 4b61372edbd9300da0b68db75a2408a96beee9a3 Mon Sep 17 00:00:00 2001 From: endi Date: Mon, 5 Aug 2024 13:10:56 +0200 Subject: [PATCH 076/188] [#515] Implemented a mechanism to selectively disable auto-updates for bulk syncing large amount of objects --- .../smartglasses/OverlayObjectHolder.java | 9 ++- .../common/network/APNetworking.java | 2 + .../RenderableObjectBulkSyncPacket.java | 44 +++++++++++++++ .../overlay/OverlayGlassesFunctions.java | 20 ++++++- .../modules/overlay/OverlayModule.java | 56 +++++++++++++++++-- .../propertytypes/FixedPointNumberType.java | 3 - .../propertytypes/FloatingNumberType.java | 4 -- 7 files changed, 123 insertions(+), 15 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 7e00e279d..8d382154e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -1,6 +1,5 @@ package de.srendi.advancedperipherals.client.smartglasses; -import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Panel; @@ -20,8 +19,12 @@ public class OverlayObjectHolder { public static void addOrUpdateObject(RenderableObject object) { removeObject(object.getId()); objects.add(object); - AdvancedPeripherals.debug("Added object to client renderer " + object); - AdvancedPeripherals.debug("Having objects " + objects); + } + + public static void addOrUpdateObjects(RenderableObject[] object) { + for (RenderableObject renderableObject : object) { + addOrUpdateObject(renderableObject); + } } public static List getObjects() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java index 6a11f1fcc..0caad2cf5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java @@ -3,6 +3,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.network.base.IPacket; import de.srendi.advancedperipherals.common.network.toclient.DistanceDetectorSyncPacket; +import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectBulkSyncPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectSyncPacket; @@ -44,6 +45,7 @@ public static void init() { registerServerToClient(RenderableObjectSyncPacket.class, RenderableObjectSyncPacket::decode); registerServerToClient(RenderableObjectDeletePacket.class, RenderableObjectDeletePacket::decode); registerServerToClient(RenderableObjectClearPacket.class, RenderableObjectClearPacket::decode); + registerServerToClient(RenderableObjectBulkSyncPacket.class, RenderableObjectBulkSyncPacket::decode); registerClientToServer(GlassesHotkeyPacket.class, GlassesHotkeyPacket::decode); registerClientToServer(SaddleTurtleControlPacket.class, SaddleTurtleControlPacket::decode); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java new file mode 100644 index 000000000..feb46a7c1 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java @@ -0,0 +1,44 @@ +package de.srendi.advancedperipherals.common.network.toclient; + +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +public class RenderableObjectBulkSyncPacket implements IPacket { + + private final RenderableObject[] objects; + + public RenderableObjectBulkSyncPacket(RenderableObject[] objects) { + this.objects = objects; + } + + @Override + public void handle(NetworkEvent.Context context) { + OverlayObjectHolder.addOrUpdateObjects(objects); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(objects.length); + for (RenderableObject object : objects) + object.encode(buffer); + } + + public static RenderableObjectBulkSyncPacket decode(FriendlyByteBuf buffer) { + AdvancedPeripherals.debug("Size" + buffer.readableBytes()); + + int size = buffer.readInt(); + RenderableObject[] objects = new RenderableObject[size]; + + for (int i = 0; i < size; i++) { + int id = buffer.readInt(); + objects[i] = ObjectDecodeRegistry.getObject(id, buffer); + } + + return new RenderableObjectBulkSyncPacket(objects); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index 828cf1c95..b127a5fe4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -49,10 +49,16 @@ public final MethodResult createCircle(String id, IArguments arguments) throws L } @LuaFunction - public final MethodResult getObjects(IArguments arguments) { + public final MethodResult getObjects() { return MethodResult.of((Object) overlayModule.getObjects().stream().map(OverlayObject::getId).toArray(String[]::new)); } + @LuaFunction + public final MethodResult getObject(IArguments arguments) throws LuaException { + String id = arguments.getString(0); + return MethodResult.of(overlayModule.getObjects().stream().filter(object -> object.getId().equals(id)).findFirst()); + } + @LuaFunction public final MethodResult removeObject(String id) { return MethodResult.of(overlayModule.removeObject(id)); @@ -69,4 +75,16 @@ public final MethodResult getSize() { return MethodResult.of(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight()); } + @LuaFunction + public final MethodResult update() { + return MethodResult.of(overlayModule.bulkUpdate()); + } + + @LuaFunction + public final MethodResult autoUpdate(IArguments arguments) throws LuaException { + overlayModule.autoUpdate = arguments.optBoolean(0, !overlayModule.autoUpdate); + return MethodResult.of(overlayModule.autoUpdate); + } + + } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java index 100798218..9d34b26d7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java @@ -2,6 +2,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.network.APNetworking; +import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectBulkSyncPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectSyncPacket; @@ -14,6 +15,9 @@ import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; @@ -24,8 +28,11 @@ public class OverlayModule implements IModule { public final CopyOnWriteArraySet objects = new CopyOnWriteArraySet<>(); + public final CopyOnWriteArrayList objectsToUpdate = new CopyOnWriteArrayList<>(); public final SmartGlassesAccess access; + public boolean autoUpdate = true; + public OverlayModule(SmartGlassesAccess access) { this.access = access; } @@ -65,12 +72,19 @@ public CopyOnWriteArraySet getObjects() { * The object is the object which was added or the object which already exists(When not successful). */ public Pair addObject(RenderableObject object) { - for (RenderableObject overlayObject : objects) { + List objectsToCheck = new ArrayList<>(); + objectsToCheck.addAll(objects); + objectsToCheck.addAll(objectsToUpdate); + for (RenderableObject overlayObject : objectsToCheck) { if (overlayObject.getId().equals(object.getId())) return Pair.of(overlayObject, false); } - APNetworking.sendTo(new RenderableObjectSyncPacket(object), (ServerPlayer) access.getEntity()); - objects.add(object); + if (autoUpdate) { + APNetworking.sendTo(new RenderableObjectSyncPacket(object), (ServerPlayer) access.getEntity()); + objects.add(object); + } else { + objectsToUpdate.add(object); + } return Pair.of(object, true); } @@ -97,6 +111,7 @@ public boolean removeObject(String id) { public int clear() { int size = objects.size(); objects.clear(); + objectsToUpdate.clear(); APNetworking.sendTo(new RenderableObjectClearPacket(), (ServerPlayer) access.getEntity()); return size; } @@ -107,6 +122,39 @@ public int clear() { * @param object the object to sync to the player */ public void update(RenderableObject object) { - APNetworking.sendTo(new RenderableObjectSyncPacket(object), (ServerPlayer) access.getEntity()); + if (autoUpdate) { + APNetworking.sendTo(new RenderableObjectSyncPacket(object), (ServerPlayer) access.getEntity()); + return; + } + + objectsToUpdate.add(object); + } + + + public int bulkUpdate() { + int size = objectsToUpdate.size(); + AdvancedPeripherals.debug("Updating " + size); + int packetCount = (int) Math.ceil((double) size / 15000); + + // In some cases, if the user creates a lot of objects above 15k, the packet payload can be too big. + // We split up the packets for every 15k objects to prevent the payload limit from mc + + // Iterate and send packets + for (int i = 0; i < packetCount; i++) { + int startIndex = i * 15000; + int endIndex = Math.min(startIndex + 15000, size); + + // Create a sublist for the current packet + List packetObjects = objectsToUpdate.subList(startIndex, endIndex); + + // Send the packet + APNetworking.sendTo(new RenderableObjectBulkSyncPacket(packetObjects.toArray(new RenderableObject[0])), + (ServerPlayer) access.getEntity() + ); + } + objects.addAll(objectsToUpdate); + objectsToUpdate.clear(); + + return size; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberType.java index daf47a805..2f84192c0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberType.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FixedPointNumberType.java @@ -1,7 +1,5 @@ package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; -import de.srendi.advancedperipherals.AdvancedPeripherals; - public class FixedPointNumberType implements PropertyType { public long min; @@ -28,7 +26,6 @@ public void init(Object property) { FixedPointNumberProperty decimalProperty = (FixedPointNumberProperty) property; min = decimalProperty.min(); max = decimalProperty.max(); - AdvancedPeripherals.debug("Initialized number property with min " + min + " and max " + max); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberType.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberType.java index 7d0c708f5..02c769b59 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberType.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/propertytypes/FloatingNumberType.java @@ -1,7 +1,5 @@ package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes; -import de.srendi.advancedperipherals.AdvancedPeripherals; - public class FloatingNumberType implements PropertyType { public float min; @@ -14,7 +12,6 @@ public boolean checkIsValid(Object type) { @Override public Number mapValue(Object type) { - AdvancedPeripherals.debug("Mapping value " + type + " to " + Math.min(Math.max((float) type, min), max)); return Math.min(Math.max((float) type, min), max); } @@ -23,7 +20,6 @@ public void init(Object property) { FloatingNumberProperty decimalProperty = (FloatingNumberProperty) property; min = decimalProperty.min(); max = decimalProperty.max(); - AdvancedPeripherals.debug("Initialized decimal property with min " + min + " and max " + max); } } From 2cc13a81e0f841c2d14b739be184ef6a04437e33 Mon Sep 17 00:00:00 2001 From: Srendi Date: Mon, 5 Aug 2024 22:11:45 +0200 Subject: [PATCH 077/188] [#515] Implemented batching for our render objects to improve the client rendering performance --- gradle.properties | 2 +- .../smartglasses/OverlayModuleOverlay.java | 24 ++++++++++++++++- .../smartglasses/objects/CircleRenderer.java | 19 ++++++++----- .../smartglasses/objects/IObjectRenderer.java | 4 ++- .../smartglasses/objects/PanelRenderer.java | 27 ++++++++++++------- .../smartglasses/objects/TextRenderer.java | 8 +++--- .../RenderableObjectBulkSyncPacket.java | 3 --- .../modules/overlay/OverlayModule.java | 1 - 8 files changed, 61 insertions(+), 27 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0f2e5c285..740b947f1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.logging.level=info # Minecraft related mod_id=advancedperipherals minecraft_version=1.19.2 -forge_version=43.3.13 +forge_version=43.4.0 loader_version=43 mod_version=0.8r release_type=release diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java index 12bcf2ef7..fea3a9dc9 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java @@ -5,6 +5,11 @@ import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class OverlayModuleOverlay implements IGuiOverlay { public static final String ID = "overlay_module_overlay"; @@ -12,11 +17,28 @@ public class OverlayModuleOverlay implements IGuiOverlay { public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { poseStack.pushPose(); + Map, List> batches = new HashMap<>(); + for (RenderableObject object : OverlayObjectHolder.getObjects()) { if (!object.isEnabled()) continue; - object.getRenderObject().render(object, gui, poseStack, partialTick, screenWidth, screenHeight); + + Class objectClass = object.getClass(); + + if (batches.containsKey(objectClass)) { + batches.get(objectClass).add(object); + continue; + } + + List newBatchArray = new ArrayList<>(); + newBatchArray.add(object); + batches.put(objectClass, newBatchArray); + } + + for (List batch : batches.values()) { + batch.get(0).getRenderObject().renderBatch(batch, gui, poseStack, partialTick, screenWidth, screenHeight); } + poseStack.popPose(); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java index e19d76b88..122514746 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java @@ -13,18 +13,23 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; +import java.util.List; + public class CircleRenderer implements IObjectRenderer { @Override - public void render(RenderableObject object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { - Circle circle = (Circle) object; + public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + for (RenderableObject object : objects) { + + Circle circle = (Circle) object; - float alpha = object.opacity; - float red = (float) (object.color >> 16 & 255) / 255.0F; - float green = (float) (object.color >> 8 & 255) / 255.0F; - float blue = (float) (object.color & 255) / 255.0F; + float alpha = object.opacity; + float red = (float) (object.color >> 16 & 255) / 255.0F; + float green = (float) (object.color >> 8 & 255) / 255.0F; + float blue = (float) (object.color & 255) / 255.0F; - drawCircle(poseStack, circle.x, circle.y, circle.radius, 120, red, green, blue, alpha); + drawCircle(poseStack, circle.x, circle.y, circle.radius, 120, red, green, blue, alpha); + } } public void drawCircle(PoseStack poseStack, float cx, float cy, float r, int numSegments, float red, float green, float blue, float alpha) { diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java index 1295448e3..24400d0fb 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java @@ -4,8 +4,10 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraftforge.client.gui.overlay.ForgeGui; +import java.util.List; + public interface IObjectRenderer { - void render(RenderableObject object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight); + void renderBatch(List object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java index 441238ac5..c9ad301ae 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java @@ -12,23 +12,30 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; +import java.util.List; + public class PanelRenderer implements IObjectRenderer { @Override - public void render(RenderableObject object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { - float alpha = object.opacity; - float red = (float) (object.color >> 16 & 255) / 255.0F; - float green = (float) (object.color >> 8 & 255) / 255.0F; - float blue = (float) (object.color & 255) / 255.0F; - + public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { RenderSystem.setShader(GameRenderer::getPositionColorShader); BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); Matrix4f matrix = poseStack.last().pose(); bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - bufferbuilder.vertex(matrix, (float) object.x, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) object.x, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); + + for (RenderableObject object : objects) { + float alpha = object.opacity; + float red = (float) (object.color >> 16 & 255) / 255.0F; + float green = (float) (object.color >> 8 & 255) / 255.0F; + float blue = (float) (object.color & 255) / 255.0F; + + bufferbuilder.vertex(matrix, (float) object.x, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, (float) object.x, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); + } + BufferUploader.drawWithShader(bufferbuilder.end()); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java index 7b1085a6d..c0409f48d 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java @@ -4,15 +4,17 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraftforge.client.gui.overlay.ForgeGui; +import java.util.List; + public class TextRenderer implements IObjectRenderer { @Override - public void render(RenderableObject object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { - float alpha = object.opacity; + public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + /*float alpha = object.opacity; float red = (float) (object.color >> 16 & 255) / 255.0F; float green = (float) (object.color >> 8 & 255) / 255.0F; float blue = (float) (object.color & 255) / 255.0F; - +*/ } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java index feb46a7c1..0bed227a3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java @@ -1,6 +1,5 @@ package de.srendi.advancedperipherals.common.network.toclient; -import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; import de.srendi.advancedperipherals.common.network.base.IPacket; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; @@ -29,8 +28,6 @@ public void encode(FriendlyByteBuf buffer) { } public static RenderableObjectBulkSyncPacket decode(FriendlyByteBuf buffer) { - AdvancedPeripherals.debug("Size" + buffer.readableBytes()); - int size = buffer.readInt(); RenderableObject[] objects = new RenderableObject[size]; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java index 9d34b26d7..55bac0d7e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java @@ -133,7 +133,6 @@ public void update(RenderableObject object) { public int bulkUpdate() { int size = objectsToUpdate.size(); - AdvancedPeripherals.debug("Updating " + size); int packetCount = (int) Math.ceil((double) size / 15000); // In some cases, if the user creates a lot of objects above 15k, the packet payload can be too big. From fe41501896c3f1c441fecad08558d0a9eb0330ea Mon Sep 17 00:00:00 2001 From: endi Date: Tue, 6 Aug 2024 13:11:04 +0200 Subject: [PATCH 078/188] [#515] Simplified the iDs of our render objects by switching to a map using the id as an integer. This greatly improves the performance by a huge factor allowing us to sync over 100k objects without any freezing. Implemented the text renderer with a font size --- .../smartglasses/OverlayObjectHolder.java | 29 +++++---- .../smartglasses/objects/TextRenderer.java | 14 ++-- .../RenderableObjectBulkSyncPacket.java | 16 +++-- .../RenderableObjectDeletePacket.java | 8 +-- .../overlay/OverlayGlassesFunctions.java | 44 ++++++------- .../modules/overlay/OverlayModule.java | 64 +++++++++---------- .../modules/overlay/OverlayObject.java | 21 +++--- .../modules/overlay/objects/Circle.java | 18 +++--- .../modules/overlay/objects/Panel.java | 18 +++--- .../overlay/objects/RenderableObject.java | 8 +-- .../modules/overlay/objects/Text.java | 38 ++++++++--- 11 files changed, 153 insertions(+), 125 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 8d382154e..8f4c986e6 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -6,42 +6,43 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Text; -import java.util.ArrayList; -import java.util.List; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; /** * Static holder for client side renderable objects - will change */ public class OverlayObjectHolder { - public static List objects = new ArrayList<>(); + public static Map objects = new HashMap<>(); public static void addOrUpdateObject(RenderableObject object) { - removeObject(object.getId()); - objects.add(object); + objects.put(object.getId(), object); } - public static void addOrUpdateObjects(RenderableObject[] object) { - for (RenderableObject renderableObject : object) { + public static void addOrUpdateObjects(Collection objects) { + for (RenderableObject renderableObject : objects) { addOrUpdateObject(renderableObject); } } - public static List getObjects() { - return objects; + public static void removeObject(int id) { + objects.remove(id); } - public static void removeObject(String id) { - objects.removeIf(object -> object.getId().equals(id)); + public static Collection getObjects() { + return objects.values(); } + public static void clear() { objects.clear(); } public static void registerDecodeObjects() { - ObjectDecodeRegistry.register(Panel.ID, Panel::decode); - ObjectDecodeRegistry.register(Circle.ID, Circle::decode); - ObjectDecodeRegistry.register(Text.ID, Text::decode); + ObjectDecodeRegistry.register(Panel.TYPE_ID, Panel::decode); + ObjectDecodeRegistry.register(Circle.TYPE_ID, Circle::decode); + ObjectDecodeRegistry.register(Text.TYPE_ID, Text::decode); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java index c0409f48d..8138e30af 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java @@ -2,6 +2,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Text; +import net.minecraft.client.Minecraft; import net.minecraftforge.client.gui.overlay.ForgeGui; import java.util.List; @@ -10,11 +12,13 @@ public class TextRenderer implements IObjectRenderer { @Override public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { - /*float alpha = object.opacity; - float red = (float) (object.color >> 16 & 255) / 255.0F; - float green = (float) (object.color >> 8 & 255) / 255.0F; - float blue = (float) (object.color & 255) / 255.0F; -*/ + + Minecraft minecraft = Minecraft.getInstance(); + for (RenderableObject object : objects) { + Text text = (Text) object; + poseStack.scale(text.fontSize, text.fontSize, 1); + minecraft.font.draw(poseStack, text.content, text.x / text.fontSize, text.y / text.fontSize, text.color); + } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java index 0bed227a3..d033c9eb2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java @@ -7,11 +7,15 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + public class RenderableObjectBulkSyncPacket implements IPacket { - private final RenderableObject[] objects; + private final Collection objects; - public RenderableObjectBulkSyncPacket(RenderableObject[] objects) { + public RenderableObjectBulkSyncPacket(Collection objects) { this.objects = objects; } @@ -22,18 +26,18 @@ public void handle(NetworkEvent.Context context) { @Override public void encode(FriendlyByteBuf buffer) { - buffer.writeInt(objects.length); + buffer.writeInt(objects.size()); for (RenderableObject object : objects) object.encode(buffer); } public static RenderableObjectBulkSyncPacket decode(FriendlyByteBuf buffer) { int size = buffer.readInt(); - RenderableObject[] objects = new RenderableObject[size]; + List objects = new ArrayList<>(); for (int i = 0; i < size; i++) { - int id = buffer.readInt(); - objects[i] = ObjectDecodeRegistry.getObject(id, buffer); + int typeId = buffer.readInt(); + objects.add(ObjectDecodeRegistry.getObject(typeId, buffer)); } return new RenderableObjectBulkSyncPacket(objects); diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectDeletePacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectDeletePacket.java index 6463b12b1..b1ef370a1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectDeletePacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectDeletePacket.java @@ -7,9 +7,9 @@ public class RenderableObjectDeletePacket implements IPacket { - private final String object; + private final int object; - public RenderableObjectDeletePacket(String object) { + public RenderableObjectDeletePacket(int object) { this.object = object; } @@ -20,10 +20,10 @@ public void handle(NetworkEvent.Context context) { @Override public void encode(FriendlyByteBuf buffer) { - buffer.writeUtf(object); + buffer.writeInt(object); } public static RenderableObjectDeletePacket decode(FriendlyByteBuf buffer) { - return new RenderableObjectDeletePacket(buffer.readUtf()); + return new RenderableObjectDeletePacket(buffer.readInt()); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index b127a5fe4..810851adc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -10,6 +10,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Panel; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Text; import de.srendi.advancedperipherals.common.util.Pair; import net.minecraft.client.Minecraft; @@ -24,43 +25,37 @@ public OverlayGlassesFunctions(OverlayModule overlayModule) { } @LuaFunction - public final String test() { - return "Hello World! I'm an overlay module!"; - } - - @LuaFunction - public final MethodResult createPanel(String id, IArguments arguments) throws LuaException { - Panel panel = new Panel(id, overlayModule, arguments); - Pair success = overlayModule.addObject(panel); - if(!success.getRight()) - return MethodResult.of(success.getLeft(), IModule.ErrorConstants.ALREADY_EXISTS); + public final MethodResult createPanel(IArguments arguments) throws LuaException { + Panel panel = new Panel(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(panel); - return MethodResult.of(success.getLeft(), "SUCCESS"); + return MethodResult.of(object, "SUCCESS"); } @LuaFunction - public final MethodResult createCircle(String id, IArguments arguments) throws LuaException { - Circle circle = new Circle(id, overlayModule, arguments); - Pair success = overlayModule.addObject(circle); - if(!success.getRight()) - return MethodResult.of(success.getLeft(), IModule.ErrorConstants.ALREADY_EXISTS); + public final MethodResult createCircle(IArguments arguments) throws LuaException { + Circle circle = new Circle(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(circle); - return MethodResult.of(success.getLeft(), "SUCCESS"); + return MethodResult.of(object, "SUCCESS"); } @LuaFunction - public final MethodResult getObjects() { - return MethodResult.of((Object) overlayModule.getObjects().stream().map(OverlayObject::getId).toArray(String[]::new)); + public final MethodResult createText(IArguments arguments) throws LuaException { + Text circle = new Text(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(circle); + + return MethodResult.of(object, "SUCCESS"); } @LuaFunction public final MethodResult getObject(IArguments arguments) throws LuaException { - String id = arguments.getString(0); - return MethodResult.of(overlayModule.getObjects().stream().filter(object -> object.getId().equals(id)).findFirst()); + int id = arguments.getInt(0); + return MethodResult.of(overlayModule.getObjects().get(id)); } @LuaFunction - public final MethodResult removeObject(String id) { + public final MethodResult removeObject(int id) { return MethodResult.of(overlayModule.removeObject(id)); } @@ -69,6 +64,11 @@ public final MethodResult clear() { return MethodResult.of(overlayModule.clear()); } + @LuaFunction + public final MethodResult getObjectsSize() { + return MethodResult.of(overlayModule.getObjects().size()); + } + // TODO: This will crash on dedicated servers @LuaFunction public final MethodResult getSize() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java index 55bac0d7e..e239fb020 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java @@ -10,16 +10,14 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; -import de.srendi.advancedperipherals.common.util.Pair; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.CopyOnWriteArraySet; - +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * We want to support scripts which were made for the plethora classes. So we call this item the same as the overlay item from plethora @@ -27,11 +25,12 @@ */ public class OverlayModule implements IModule { - public final CopyOnWriteArraySet objects = new CopyOnWriteArraySet<>(); - public final CopyOnWriteArrayList objectsToUpdate = new CopyOnWriteArrayList<>(); + public final ConcurrentHashMap objects = new ConcurrentHashMap<>(); + public final ConcurrentHashMap objectsToUpdate = new ConcurrentHashMap<>(); public final SmartGlassesAccess access; public boolean autoUpdate = true; + private int idCounter = 0; public OverlayModule(SmartGlassesAccess access) { this.access = access; @@ -60,7 +59,7 @@ public SmartGlassesAccess getAccess() { return access; } - public CopyOnWriteArraySet getObjects() { + public Map getObjects() { return objects; } @@ -71,21 +70,16 @@ public CopyOnWriteArraySet getObjects() { * @return A pair of the object and a boolean. The boolean is true if the object was added successfully and false if not. * The object is the object which was added or the object which already exists(When not successful). */ - public Pair addObject(RenderableObject object) { - List objectsToCheck = new ArrayList<>(); - objectsToCheck.addAll(objects); - objectsToCheck.addAll(objectsToUpdate); - for (RenderableObject overlayObject : objectsToCheck) { - if (overlayObject.getId().equals(object.getId())) - return Pair.of(overlayObject, false); - } + public RenderableObject addObject(RenderableObject object) { + int id = idCounter++; + object.setId(id); if (autoUpdate) { APNetworking.sendTo(new RenderableObjectSyncPacket(object), (ServerPlayer) access.getEntity()); - objects.add(object); + objects.put(id, object); } else { - objectsToUpdate.add(object); + objectsToUpdate.put(id, object); } - return Pair.of(object, true); + return object; } /** @@ -94,13 +88,13 @@ public Pair addObject(RenderableObject object) { * @param id the object id * @return true if the object existed and was removed, false if the object was not in the collection */ - public boolean removeObject(String id) { - boolean removed = objects.removeIf(object -> object.getId().equals(id)); + public boolean removeObject(int id) { + RenderableObject removed = objects.remove(id); - if (removed) + if (removed != null) APNetworking.sendTo(new RenderableObjectDeletePacket(id), (ServerPlayer) access.getEntity()); - return removed; + return removed != null; } /** @@ -111,6 +105,7 @@ public boolean removeObject(String id) { public int clear() { int size = objects.size(); objects.clear(); + idCounter = 0; objectsToUpdate.clear(); APNetworking.sendTo(new RenderableObjectClearPacket(), (ServerPlayer) access.getEntity()); return size; @@ -127,7 +122,7 @@ public void update(RenderableObject object) { return; } - objectsToUpdate.add(object); + objectsToUpdate.put(object.getId(), object); } @@ -137,22 +132,25 @@ public int bulkUpdate() { // In some cases, if the user creates a lot of objects above 15k, the packet payload can be too big. // We split up the packets for every 15k objects to prevent the payload limit from mc - - // Iterate and send packets for (int i = 0; i < packetCount; i++) { - int startIndex = i * 15000; - int endIndex = Math.min(startIndex + 15000, size); + List packetObjects = new ArrayList<>(); + int count = 0; - // Create a sublist for the current packet - List packetObjects = objectsToUpdate.subList(startIndex, endIndex); + for (RenderableObject object : objectsToUpdate.values()) { + packetObjects.add(object); + objects.put(object.getId(), object); + objectsToUpdate.remove(object.getId()); + count++; - // Send the packet - APNetworking.sendTo(new RenderableObjectBulkSyncPacket(packetObjects.toArray(new RenderableObject[0])), + if (count >= 15000) { + break; // Ensure we don't exceed the packet size limit + } + } + + APNetworking.sendTo(new RenderableObjectBulkSyncPacket(packetObjects), (ServerPlayer) access.getEntity() ); } - objects.addAll(objectsToUpdate); - objectsToUpdate.clear(); return size; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java index 72bb171a2..594af232b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java @@ -24,25 +24,27 @@ public abstract class OverlayObject { @BooleanProperty private boolean enabled = true; - private final String id; + private int id; private OverlayModule module; private UUID player; - public OverlayObject(String id, OverlayModule module, IArguments arguments) { - this.id = id; + public OverlayObject(OverlayModule module, IArguments arguments) { this.module = module; } /** * For clientside initialization */ - public OverlayObject(String id, UUID player) { - this.id = id; + public OverlayObject(UUID player) { this.player = player; } + public void setId(int id) { + this.id = id; + } + @LuaFunction - public final String getId() { + public int getId() { return id; } @@ -83,11 +85,11 @@ public final boolean isEnabled() { * @see PropertyType */ public void reflectivelyMapProperties(IArguments arguments) throws LuaException { - if (arguments.optTable(1).isEmpty()) + if (arguments.optTable(0).isEmpty()) return; try { - Map properties = arguments.optTable(1).get().entrySet().stream() + Map properties = arguments.optTable(0).get().entrySet().stream() .filter(entry -> entry.getKey() instanceof String) .collect(Collectors.toMap(entry -> (String) entry.getKey(), Map.Entry::getValue)); @@ -174,7 +176,7 @@ public Object castValueToFieldType(Field field, Object value) { } public void encode(FriendlyByteBuf buffer) { - buffer.writeUtf(id); + buffer.writeInt(id); Entity entity = module.getAccess().getEntity(); if(entity instanceof Player player) { buffer.writeBoolean(true); @@ -189,7 +191,6 @@ public void encode(FriendlyByteBuf buffer) { public String toString() { return "OverlayObject{" + "enabled=" + enabled + - ", id='" + id + '\'' + ", module=" + module + ", player=" + player + '}'; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java index cdb351d71..e6ce4c7e8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java @@ -13,21 +13,20 @@ import java.util.UUID; public class Circle extends RenderableObject { - - public static final int ID = 1; + public static final int TYPE_ID = 1; private final IObjectRenderer renderer = new CircleRenderer(); @FixedPointNumberProperty(min = -32767, max = 32767) public int radius = 0; - public Circle(String id, OverlayModule module, IArguments arguments) throws LuaException { - super(id, module, arguments); + public Circle(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); reflectivelyMapProperties(arguments); } - public Circle(String id, UUID player) { - super(id, player); + public Circle(UUID player) { + super(player); } @LuaFunction @@ -43,13 +42,13 @@ public void setRadius(int radius) { @Override public void encode(FriendlyByteBuf buffer) { - buffer.writeInt(ID); + buffer.writeInt(TYPE_ID); super.encode(buffer); buffer.writeInt(radius); } public static Circle decode(FriendlyByteBuf buffer) { - String id = buffer.readUtf(); + int objectId = buffer.readInt(); boolean hasValidUUID = buffer.readBoolean(); if (!hasValidUUID) { AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); @@ -65,7 +64,8 @@ public static Circle decode(FriendlyByteBuf buffer) { int maxY = buffer.readInt(); int radius = buffer.readInt(); - Circle clientObject = new Circle(id, player); + Circle clientObject = new Circle(player); + clientObject.setId(objectId); clientObject.color = color; clientObject.opacity = opacity; clientObject.x = x; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java index c4b3597b0..02306f0fd 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java @@ -14,32 +14,31 @@ * A panel is the standard panel which can contain multiple render-able objects in it. */ public class Panel extends RenderableObject { - public static final int ID = 0; + public static final int TYPE_ID = 0; private final IObjectRenderer renderer = new PanelRenderer(); - public Panel(String id, OverlayModule module, IArguments arguments) throws LuaException { - super(id, module, arguments); + public Panel(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); } /** * constructor for the client side initialization * - * @param id id of the object * @param player the target player */ - public Panel(String id, UUID player) { - super(id, player); + public Panel(UUID player) { + super(player); } @Override public void encode(FriendlyByteBuf buffer) { - buffer.writeInt(ID); + buffer.writeInt(TYPE_ID); super.encode(buffer); } public static Panel decode(FriendlyByteBuf buffer) { - String id = buffer.readUtf(); + int objectId = buffer.readInt(); boolean hasValidUUID = buffer.readBoolean(); if (!hasValidUUID) { AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); @@ -54,7 +53,8 @@ public static Panel decode(FriendlyByteBuf buffer) { int sizeX = buffer.readInt(); int sizeY = buffer.readInt(); - Panel clientObject = new Panel(id, player); + Panel clientObject = new Panel(player); + clientObject.setId(objectId); clientObject.color = color; clientObject.opacity = opacity; clientObject.x = x; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java index ec68efdcb..335060695 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java @@ -33,13 +33,13 @@ public class RenderableObject extends OverlayObject { @FixedPointNumberProperty(min = -32767, max = 32767) public int maxY = 0; - public RenderableObject(String id, OverlayModule module, IArguments arguments) throws LuaException { - super(id, module, arguments); + public RenderableObject(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); reflectivelyMapProperties(arguments); } - public RenderableObject(String id, UUID player) { - super(id, player); + public RenderableObject(UUID player) { + super(player); } @LuaFunction diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java index 0bc2a9784..b92639f13 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java @@ -7,26 +7,30 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.TextRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; public class Text extends RenderableObject { - public static final int ID = 2; + public static final int TYPE_ID = 2; private final IObjectRenderer renderer = new TextRenderer(); @StringProperty - public String content; + public String content = ""; - public Text(String id, OverlayModule module, IArguments arguments) throws LuaException { - super(id, module, arguments); + @FloatingNumberProperty(min = 0, max = 128) + public float fontSize = 1; + + public Text(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); reflectivelyMapProperties(arguments); } - public Text(String id, UUID player) { - super(id, player); + public Text(UUID player) { + super(player); } @LuaFunction @@ -40,6 +44,18 @@ public final void setContent(String content) { getModule().update(this); } + @LuaFunction + public double getFontSize() { + return fontSize; + } + + // For any reason, cc does not support float, only double. So we need to cast it here + @LuaFunction + public void setFontSize(double fontSize) { + this.fontSize = (float) fontSize; + getModule().update(this); + } + @Override public IObjectRenderer getRenderObject() { return renderer; @@ -47,13 +63,14 @@ public IObjectRenderer getRenderObject() { @Override public void encode(FriendlyByteBuf buffer) { - buffer.writeInt(ID); + buffer.writeInt(TYPE_ID); super.encode(buffer); buffer.writeUtf(content); + buffer.writeFloat(fontSize); } public static Text decode(FriendlyByteBuf buffer) { - String id = buffer.readUtf(); + int objectId = buffer.readInt(); boolean hasValidUUID = buffer.readBoolean(); if (!hasValidUUID) { AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); @@ -68,8 +85,10 @@ public static Text decode(FriendlyByteBuf buffer) { int sizeX = buffer.readInt(); int sizeY = buffer.readInt(); String content = buffer.readUtf(); + float fontSize = buffer.readFloat(); - Text clientObject = new Text(id, player); + Text clientObject = new Text(player); + clientObject.setId(objectId); clientObject.color = color; clientObject.opacity = opacity; clientObject.x = x; @@ -77,6 +96,7 @@ public static Text decode(FriendlyByteBuf buffer) { clientObject.maxX = sizeX; clientObject.maxY = sizeY; clientObject.content = content; + clientObject.fontSize = fontSize; return clientObject; } From 7f4e9e7fae294a6da5947203aadc05c4605f04c6 Mon Sep 17 00:00:00 2001 From: Srendi Date: Tue, 6 Aug 2024 20:58:23 +0200 Subject: [PATCH 079/188] Panel -> Rectangle --- .../client/smartglasses/OverlayObjectHolder.java | 4 ++-- ...PanelRenderer.java => RectangleRenderer.java} | 2 +- .../modules/overlay/OverlayGlassesFunctions.java | 10 ++++------ .../objects/{Panel.java => Rectangle.java} | 16 ++++++++-------- 4 files changed, 15 insertions(+), 17 deletions(-) rename src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/{PanelRenderer.java => RectangleRenderer.java} (97%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{Panel.java => Rectangle.java} (81%) diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 8f4c986e6..898bdc17d 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -2,7 +2,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Panel; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Rectangle; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Text; @@ -41,7 +41,7 @@ public static void clear() { } public static void registerDecodeObjects() { - ObjectDecodeRegistry.register(Panel.TYPE_ID, Panel::decode); + ObjectDecodeRegistry.register(Rectangle.TYPE_ID, Rectangle::decode); ObjectDecodeRegistry.register(Circle.TYPE_ID, Circle::decode); ObjectDecodeRegistry.register(Text.TYPE_ID, Text::decode); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java similarity index 97% rename from src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java rename to src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java index c9ad301ae..d65c517b1 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/PanelRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java @@ -14,7 +14,7 @@ import java.util.List; -public class PanelRenderer implements IObjectRenderer { +public class RectangleRenderer implements IObjectRenderer { @Override public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index 810851adc..e5c5ecc6d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -5,13 +5,11 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; -import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Panel; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Rectangle; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Text; -import de.srendi.advancedperipherals.common.util.Pair; import net.minecraft.client.Minecraft; public class OverlayGlassesFunctions implements IModuleFunctions { @@ -25,9 +23,9 @@ public OverlayGlassesFunctions(OverlayModule overlayModule) { } @LuaFunction - public final MethodResult createPanel(IArguments arguments) throws LuaException { - Panel panel = new Panel(overlayModule, arguments); - RenderableObject object = overlayModule.addObject(panel); + public final MethodResult createRectangle(IArguments arguments) throws LuaException { + Rectangle rectangle = new Rectangle(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(rectangle); return MethodResult.of(object, "SUCCESS"); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Rectangle.java similarity index 81% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Rectangle.java index 02306f0fd..14a5f4808 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Panel.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Rectangle.java @@ -4,21 +4,21 @@ import dan200.computercraft.api.lua.LuaException; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.PanelRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.RectangleRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; /** - * A panel is the standard panel which can contain multiple render-able objects in it. + * Just a rectangle */ -public class Panel extends RenderableObject { +public class Rectangle extends RenderableObject { public static final int TYPE_ID = 0; - private final IObjectRenderer renderer = new PanelRenderer(); + private final IObjectRenderer renderer = new RectangleRenderer(); - public Panel(OverlayModule module, IArguments arguments) throws LuaException { + public Rectangle(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); } @@ -27,7 +27,7 @@ public Panel(OverlayModule module, IArguments arguments) throws LuaException { * * @param player the target player */ - public Panel(UUID player) { + public Rectangle(UUID player) { super(player); } @@ -37,7 +37,7 @@ public void encode(FriendlyByteBuf buffer) { super.encode(buffer); } - public static Panel decode(FriendlyByteBuf buffer) { + public static Rectangle decode(FriendlyByteBuf buffer) { int objectId = buffer.readInt(); boolean hasValidUUID = buffer.readBoolean(); if (!hasValidUUID) { @@ -53,7 +53,7 @@ public static Panel decode(FriendlyByteBuf buffer) { int sizeX = buffer.readInt(); int sizeY = buffer.readInt(); - Panel clientObject = new Panel(player); + Rectangle clientObject = new Rectangle(player); clientObject.setId(objectId); clientObject.color = color; clientObject.opacity = opacity; From c81e8430c2f19b46b19e955adad30bf52636b754 Mon Sep 17 00:00:00 2001 From: Srendi Date: Tue, 6 Aug 2024 21:39:47 +0200 Subject: [PATCH 080/188] [#515] Shadow support for text renderer --- .../smartglasses/objects/TextRenderer.java | 6 +++++- .../modules/overlay/objects/Text.java | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java index 8138e30af..6c06c9dbc 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java @@ -17,7 +17,11 @@ public void renderBatch(List objects, ForgeGui gui, PoseStack for (RenderableObject object : objects) { Text text = (Text) object; poseStack.scale(text.fontSize, text.fontSize, 1); - minecraft.font.draw(poseStack, text.content, text.x / text.fontSize, text.y / text.fontSize, text.color); + if (text.shadow) { + minecraft.font.drawShadow(poseStack, text.content, text.x / text.fontSize, text.y / text.fontSize, text.color); + } else { + minecraft.font.draw(poseStack, text.content, text.x / text.fontSize, text.y / text.fontSize, text.color); + } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java index b92639f13..f2c6da639 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java @@ -7,6 +7,7 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.TextRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; import net.minecraft.network.FriendlyByteBuf; @@ -24,6 +25,9 @@ public class Text extends RenderableObject { @FloatingNumberProperty(min = 0, max = 128) public float fontSize = 1; + @BooleanProperty + public boolean shadow = false; + public Text(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); reflectivelyMapProperties(arguments); @@ -56,6 +60,16 @@ public void setFontSize(double fontSize) { getModule().update(this); } + @LuaFunction + public void setShadow(boolean shadow) { + this.shadow = shadow; + } + + @LuaFunction + public boolean isShadow() { + return shadow; + } + @Override public IObjectRenderer getRenderObject() { return renderer; @@ -67,6 +81,7 @@ public void encode(FriendlyByteBuf buffer) { super.encode(buffer); buffer.writeUtf(content); buffer.writeFloat(fontSize); + buffer.writeBoolean(shadow); } public static Text decode(FriendlyByteBuf buffer) { @@ -86,6 +101,7 @@ public static Text decode(FriendlyByteBuf buffer) { int sizeY = buffer.readInt(); String content = buffer.readUtf(); float fontSize = buffer.readFloat(); + boolean shadow = buffer.readBoolean(); Text clientObject = new Text(player); clientObject.setId(objectId); @@ -97,6 +113,7 @@ public static Text decode(FriendlyByteBuf buffer) { clientObject.maxY = sizeY; clientObject.content = content; clientObject.fontSize = fontSize; + clientObject.shadow = shadow; return clientObject; } From 614b1490a60e9d6277afc5f20d0414cb1573f134 Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 8 Aug 2024 18:30:20 +0200 Subject: [PATCH 081/188] [#515] Item renderer --- .../smartglasses/OverlayObjectHolder.java | 15 +-- .../smartglasses/objects/CircleRenderer.java | 4 +- .../smartglasses/objects/ItemRenderer.java | 29 ++++++ .../smartglasses/objects/TextRenderer.java | 4 +- .../overlay/OverlayGlassesFunctions.java | 21 +++-- .../{Circle.java => CircleObject.java} | 10 +- .../modules/overlay/objects/ItemObject.java | 93 +++++++++++++++++++ .../{Rectangle.java => RectangleObject.java} | 10 +- .../objects/{Text.java => TextObject.java} | 10 +- 9 files changed, 164 insertions(+), 32 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{Circle.java => CircleObject.java} (90%) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/ItemObject.java rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{Rectangle.java => RectangleObject.java} (85%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{Text.java => TextObject.java} (92%) diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 898bdc17d..a37b75325 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -1,10 +1,11 @@ package de.srendi.advancedperipherals.client.smartglasses; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Rectangle; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.CircleObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.ItemObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RectangleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Text; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.TextObject; import java.util.Collection; import java.util.HashMap; @@ -35,14 +36,14 @@ public static Collection getObjects() { return objects.values(); } - public static void clear() { objects.clear(); } public static void registerDecodeObjects() { - ObjectDecodeRegistry.register(Rectangle.TYPE_ID, Rectangle::decode); - ObjectDecodeRegistry.register(Circle.TYPE_ID, Circle::decode); - ObjectDecodeRegistry.register(Text.TYPE_ID, Text::decode); + ObjectDecodeRegistry.register(RectangleObject.TYPE_ID, RectangleObject::decode); + ObjectDecodeRegistry.register(CircleObject.TYPE_ID, CircleObject::decode); + ObjectDecodeRegistry.register(TextObject.TYPE_ID, TextObject::decode); + ObjectDecodeRegistry.register(ItemObject.TYPE_ID, ItemObject::decode); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java index 122514746..4ec9b5304 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java @@ -8,7 +8,7 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix4f; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; @@ -21,7 +21,7 @@ public class CircleRenderer implements IObjectRenderer { public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { for (RenderableObject object : objects) { - Circle circle = (Circle) object; + CircleObject circle = (CircleObject) object; float alpha = object.opacity; float red = (float) (object.color >> 16 & 255) / 255.0F; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java new file mode 100644 index 000000000..fb4760a34 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java @@ -0,0 +1,29 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects; + +import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.ItemObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.gui.overlay.ForgeGui; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.List; + +public class ItemRenderer implements IObjectRenderer { + + @Override + public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + Minecraft minecraft = Minecraft.getInstance(); + + for (RenderableObject object : objects) { + Item renderItem = ItemUtil.getRegistryEntry(((ItemObject) object).item, ForgeRegistries.ITEMS); + if (renderItem == null) + continue; + minecraft.getItemRenderer().renderGuiItem(new ItemStack(renderItem), object.x, object.y); + } + + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java index 6c06c9dbc..5d9ab006e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java @@ -2,7 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Text; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.TextObject; import net.minecraft.client.Minecraft; import net.minecraftforge.client.gui.overlay.ForgeGui; @@ -15,7 +15,7 @@ public void renderBatch(List objects, ForgeGui gui, PoseStack Minecraft minecraft = Minecraft.getInstance(); for (RenderableObject object : objects) { - Text text = (Text) object; + TextObject text = (TextObject) object; poseStack.scale(text.fontSize, text.fontSize, 1); if (text.shadow) { minecraft.font.drawShadow(poseStack, text.content, text.x / text.fontSize, text.y / text.fontSize, text.color); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index e5c5ecc6d..da5303c91 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -6,10 +6,11 @@ import dan200.computercraft.api.lua.MethodResult; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Circle; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Rectangle; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.CircleObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.ItemObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RectangleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.Text; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.TextObject; import net.minecraft.client.Minecraft; public class OverlayGlassesFunctions implements IModuleFunctions { @@ -24,7 +25,7 @@ public OverlayGlassesFunctions(OverlayModule overlayModule) { @LuaFunction public final MethodResult createRectangle(IArguments arguments) throws LuaException { - Rectangle rectangle = new Rectangle(overlayModule, arguments); + RectangleObject rectangle = new RectangleObject(overlayModule, arguments); RenderableObject object = overlayModule.addObject(rectangle); return MethodResult.of(object, "SUCCESS"); @@ -32,7 +33,7 @@ public final MethodResult createRectangle(IArguments arguments) throws LuaExcept @LuaFunction public final MethodResult createCircle(IArguments arguments) throws LuaException { - Circle circle = new Circle(overlayModule, arguments); + CircleObject circle = new CircleObject(overlayModule, arguments); RenderableObject object = overlayModule.addObject(circle); return MethodResult.of(object, "SUCCESS"); @@ -40,12 +41,20 @@ public final MethodResult createCircle(IArguments arguments) throws LuaException @LuaFunction public final MethodResult createText(IArguments arguments) throws LuaException { - Text circle = new Text(overlayModule, arguments); + TextObject circle = new TextObject(overlayModule, arguments); RenderableObject object = overlayModule.addObject(circle); return MethodResult.of(object, "SUCCESS"); } + @LuaFunction + public final MethodResult createItem(IArguments arguments) throws LuaException { + ItemObject item = new ItemObject(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(item); + + return MethodResult.of(object, "SUCCESS"); + } + @LuaFunction public final MethodResult getObject(IArguments arguments) throws LuaException { int id = arguments.getInt(0); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/CircleObject.java similarity index 90% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/CircleObject.java index e6ce4c7e8..1becd1b21 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Circle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/CircleObject.java @@ -12,7 +12,7 @@ import java.util.UUID; -public class Circle extends RenderableObject { +public class CircleObject extends RenderableObject { public static final int TYPE_ID = 1; private final IObjectRenderer renderer = new CircleRenderer(); @@ -20,12 +20,12 @@ public class Circle extends RenderableObject { @FixedPointNumberProperty(min = -32767, max = 32767) public int radius = 0; - public Circle(OverlayModule module, IArguments arguments) throws LuaException { + public CircleObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); reflectivelyMapProperties(arguments); } - public Circle(UUID player) { + public CircleObject(UUID player) { super(player); } @@ -47,7 +47,7 @@ public void encode(FriendlyByteBuf buffer) { buffer.writeInt(radius); } - public static Circle decode(FriendlyByteBuf buffer) { + public static CircleObject decode(FriendlyByteBuf buffer) { int objectId = buffer.readInt(); boolean hasValidUUID = buffer.readBoolean(); if (!hasValidUUID) { @@ -64,7 +64,7 @@ public static Circle decode(FriendlyByteBuf buffer) { int maxY = buffer.readInt(); int radius = buffer.readInt(); - Circle clientObject = new Circle(player); + CircleObject clientObject = new CircleObject(player); clientObject.setId(objectId); clientObject.color = color; clientObject.opacity = opacity; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/ItemObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/ItemObject.java new file mode 100644 index 000000000..192910bb4 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/ItemObject.java @@ -0,0 +1,93 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.ItemRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.UUID; + +public class ItemObject extends RenderableObject { + public static final int TYPE_ID = 3; + + private final IObjectRenderer renderer = new ItemRenderer(); + + @StringProperty + public String item = "minecraft:air"; + + public ItemObject(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); + reflectivelyMapProperties(arguments); + } + + public ItemObject(UUID player) { + super(player); + } + + public void setItem(String item) { + this.item = item; + } + + public String getItem() { + return item; + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(TYPE_ID); + super.encode(buffer); + buffer.writeUtf(item); + } + + public static ItemObject decode(FriendlyByteBuf buffer) { + int objectId = buffer.readInt(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + int x = buffer.readInt(); + int y = buffer.readInt(); + int maxX = buffer.readInt(); + int maxY = buffer.readInt(); + String item = buffer.readUtf(); + + ItemObject clientObject = new ItemObject(player); + clientObject.setId(objectId); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.maxX = maxX; + clientObject.maxY = maxY; + clientObject.item = item; + + return clientObject; + } + + @Override + public IObjectRenderer getRenderObject() { + return renderer; + } + + @Override + public String toString() { + return "ItemObject{" + + "item='" + item + '\'' + + ", opacity=" + opacity + + ", color=" + color + + ", x=" + x + + ", y=" + y + + ", maxX=" + maxX + + ", maxY=" + maxY + + '}'; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Rectangle.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RectangleObject.java similarity index 85% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Rectangle.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RectangleObject.java index 14a5f4808..553ac0ef8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Rectangle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RectangleObject.java @@ -13,12 +13,12 @@ /** * Just a rectangle */ -public class Rectangle extends RenderableObject { +public class RectangleObject extends RenderableObject { public static final int TYPE_ID = 0; private final IObjectRenderer renderer = new RectangleRenderer(); - public Rectangle(OverlayModule module, IArguments arguments) throws LuaException { + public RectangleObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); } @@ -27,7 +27,7 @@ public Rectangle(OverlayModule module, IArguments arguments) throws LuaException * * @param player the target player */ - public Rectangle(UUID player) { + public RectangleObject(UUID player) { super(player); } @@ -37,7 +37,7 @@ public void encode(FriendlyByteBuf buffer) { super.encode(buffer); } - public static Rectangle decode(FriendlyByteBuf buffer) { + public static RectangleObject decode(FriendlyByteBuf buffer) { int objectId = buffer.readInt(); boolean hasValidUUID = buffer.readBoolean(); if (!hasValidUUID) { @@ -53,7 +53,7 @@ public static Rectangle decode(FriendlyByteBuf buffer) { int sizeX = buffer.readInt(); int sizeY = buffer.readInt(); - Rectangle clientObject = new Rectangle(player); + RectangleObject clientObject = new RectangleObject(player); clientObject.setId(objectId); clientObject.color = color; clientObject.opacity = opacity; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/TextObject.java similarity index 92% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/TextObject.java index f2c6da639..fb1f55d9e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/Text.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/TextObject.java @@ -14,7 +14,7 @@ import java.util.UUID; -public class Text extends RenderableObject { +public class TextObject extends RenderableObject { public static final int TYPE_ID = 2; private final IObjectRenderer renderer = new TextRenderer(); @@ -28,12 +28,12 @@ public class Text extends RenderableObject { @BooleanProperty public boolean shadow = false; - public Text(OverlayModule module, IArguments arguments) throws LuaException { + public TextObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); reflectivelyMapProperties(arguments); } - public Text(UUID player) { + public TextObject(UUID player) { super(player); } @@ -84,7 +84,7 @@ public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(shadow); } - public static Text decode(FriendlyByteBuf buffer) { + public static TextObject decode(FriendlyByteBuf buffer) { int objectId = buffer.readInt(); boolean hasValidUUID = buffer.readBoolean(); if (!hasValidUUID) { @@ -103,7 +103,7 @@ public static Text decode(FriendlyByteBuf buffer) { float fontSize = buffer.readFloat(); boolean shadow = buffer.readBoolean(); - Text clientObject = new Text(player); + TextObject clientObject = new TextObject(player); clientObject.setId(objectId); clientObject.color = color; clientObject.opacity = opacity; From d0dafd8fc9f42360d6d0eca38903b0e7af744ffd Mon Sep 17 00:00:00 2001 From: endi Date: Wed, 28 Aug 2024 13:58:43 +0200 Subject: [PATCH 082/188] [#555] Further implement and test the unified ME and RS Bridge functions. Implemented storage disks and drives for the RS Bridge and fixed minor bugs for the ME Bridge --- .../addons/appliedenergistics/AppEngApi.java | 111 ++++------ .../peripheral/MeBridgePeripheral.java | 13 +- .../peripheral/RsBridgePeripheral.java | 59 ++++- .../addons/refinedstorage/RefinedStorage.java | 204 ++++++++++++------ .../common/util/LuaConverter.java | 7 +- .../common/util/inventory/FluidFilter.java | 2 +- .../inventory/IStorageSystemPeripheral.java | 12 ++ 7 files changed, 263 insertions(+), 145 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java index cb3d49259..998686e0e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java @@ -88,14 +88,14 @@ public static Pair findAEFluidFromFilter(MEStorage monitor, @N } if (crafting == null) - return null; + return Pair.of(0L, AEFluidKey.of(FluidStack.EMPTY)); for (var temp : crafting.getCraftables(param -> true)) { if (temp instanceof AEFluidKey key && item.test(key.toStack(1))) return Pair.of(0L, key); } - return null; + return Pair.of(0L, AEFluidKey.of(FluidStack.EMPTY)); } /** @@ -157,7 +157,7 @@ public static List listStacks(MEStorage monitor, ICraftingService servic KeyCounter keyCounter = monitor.getAvailableStacks(); for (Object2LongMap.Entry aeKey : keyCounter) { if (aeKey.getKey() instanceof AEItemKey itemKey) { - items.add(getObjectFromStack(Pair.of(aeKey.getLongValue(), itemKey), service)); + items.add(parseAeStack(Pair.of(aeKey.getLongValue(), itemKey), service)); } } return items; @@ -169,7 +169,7 @@ public static List listCraftableStacks(MEStorage monitor, ICraftingServi Set craftables = service.getCraftables(AEKeyFilter.none()); for (AEKey aeKey : craftables) { if (aeKey instanceof AEItemKey) { - items.add(getObjectFromStack(Pair.of(keyCounter.get(aeKey), aeKey), service)); + items.add(parseAeStack(Pair.of(keyCounter.get(aeKey), aeKey), service)); } } return items; @@ -179,7 +179,7 @@ public static List listFluids(MEStorage monitor, ICraftingService servic List items = new ArrayList<>(); for (Object2LongMap.Entry aeKey : monitor.getAvailableStacks()) { if (aeKey.getKey() instanceof AEFluidKey itemKey) { - items.add(getObjectFromStack(Pair.of(aeKey.getLongValue(), itemKey), service)); + items.add(parseAeStack(Pair.of(aeKey.getLongValue(), itemKey), service)); } } return items; @@ -189,7 +189,7 @@ public static List listGases(MEStorage monitor, ICraftingService service List items = new ArrayList<>(); for (Object2LongMap.Entry aeKey : monitor.getAvailableStacks()) { if (APAddons.appMekLoaded && aeKey.getKey() instanceof MekanismKey itemKey) { - items.add(getObjectFromStack(Pair.of(aeKey.getLongValue(), itemKey), service)); + items.add(parseAeStack(Pair.of(aeKey.getLongValue(), itemKey), service)); } } return items; @@ -201,7 +201,7 @@ public static List listCraftableFluids(MEStorage monitor, ICraftingServi Set craftables = service.getCraftables(AEKeyFilter.none()); for (AEKey aeKey : craftables) { if (aeKey instanceof AEFluidKey) { - items.add(getObjectFromStack(Pair.of(keyCounter.get(aeKey), aeKey), service)); + items.add(parseAeStack(Pair.of(keyCounter.get(aeKey), aeKey), service)); } } return items; @@ -230,7 +230,7 @@ public static List getPatterns(IGrid grid, Level level) { } public static List listPatterns(IGrid grid, Level level) { - return getPatterns(grid, level).stream().map(AppEngApi::getObjectFromPattern).collect(Collectors.toList()); + return getPatterns(grid, level).stream().map(AppEngApi::parsePattern).collect(Collectors.toList()); } public static List listDrives(IGrid grid) { @@ -243,7 +243,7 @@ public static List listDrives(IGrid grid) { if (drive == null || drive.getCellCount() != 10) continue; - drives.add(getObjectFromDrive(drive)); + drives.add(parseDrive(drive)); } return drives; @@ -256,21 +256,34 @@ private static Class tryCastMachineToContainer(Class return null; } - public static Map getObjectFromStack(Pair stack, @Nullable ICraftingService service) { - if (stack.getRight() == null) + public static Map parseAeStack(Pair stack, @Nullable ICraftingService service) { + if (stack == null || stack.getRight() == null) return Collections.emptyMap(); if (stack.getRight() instanceof AEItemKey itemKey) - return getObjectFromItemStack(Pair.of(stack.getLeft(), itemKey), service); + return parseItemStack(Pair.of(stack.getLeft(), itemKey), service); if (stack.getRight() instanceof AEFluidKey fluidKey) - return getObjectFromFluidStack(Pair.of(stack.getLeft(), fluidKey), service); + return parseFluidStack(Pair.of(stack.getLeft(), fluidKey), service); if (APAddons.appMekLoaded && (stack.getRight() instanceof MekanismKey gasKey)) - return getObjectFromGasStack(Pair.of(stack.getLeft(), gasKey), service); + return parseChemStack(Pair.of(stack.getLeft(), gasKey)); + + AdvancedPeripherals.debug("Could not create table from unknown stack " + stack.getRight().getClass() + " - Report this to the maintainer of ap", org.apache.logging.log4j.Level.WARN); + return Collections.emptyMap(); + } + + public static Map parseGenericStack(GenericStack stack) { + if (stack.what() == null) + return Collections.emptyMap(); + if (stack.what() instanceof AEItemKey aeItemKey) + return parseItemStack(Pair.of(stack.amount(), aeItemKey), null); + if (stack.what() instanceof AEFluidKey aeFluidKey) + return parseFluidStack(Pair.of(stack.amount(), aeFluidKey), null); - AdvancedPeripherals.debug("Could not create table from unknown stack " + stack.getRight().getClass() + " - Report this to the maintainer of ap", org.apache.logging.log4j.Level.ERROR); + AdvancedPeripherals.debug("Could not create table from unknown stack " + stack.getClass() + " - Report this to the maintainer of ap", org.apache.logging.log4j.Level.WARN); return Collections.emptyMap(); } - public static Map getObjectFromDrive(DriveBlockEntity drive) { + + public static Map parseDrive(DriveBlockEntity drive) { Map map = new HashMap<>(); map.put("powered", drive.isPowered()); @@ -288,7 +301,7 @@ public static Map getObjectFromDrive(DriveBlockEntity drive) { totalBytes += cellInventory.getTotalBytes(); usedBytes += cellInventory.getUsedBytes(); - driveCells.add(getObjectFromCell(cell, item)); + driveCells.add(parseCell(cell, item)); } } @@ -303,7 +316,7 @@ public static Map getObjectFromDrive(DriveBlockEntity drive) { return map; } - public static Map getObjectFromCell(BasicStorageCell cell, ItemStack cellItem) { + public static Map parseCell(IBasicCellItem cell, ItemStack cellItem) { Map map = new HashMap<>(); BasicCellInventory cellInventory = BasicCellHandler.INSTANCE.getCellInventory(cellItem, null); @@ -318,7 +331,7 @@ public static Map getObjectFromCell(BasicStorageCell cell, ItemS return map; } - private static Map getObjectFromItemStack(Pair stack, @Nullable ICraftingService craftingService) { + private static Map parseItemStack(Pair stack, @Nullable ICraftingService craftingService) { Map map = new HashMap<>(); String displayName = stack.getRight().getDisplayName().getString(); CompoundTag nbt = stack.getRight().toTag(); @@ -334,7 +347,7 @@ private static Map getObjectFromItemStack(Pair return map; } - private static Map getObjectFromFluidStack(Pair stack, @Nullable ICraftingService craftingService) { + private static Map parseFluidStack(Pair stack, @Nullable ICraftingService craftingService) { Map map = new HashMap<>(); long amount = stack.getLeft(); map.put("name", ForgeRegistries.FLUIDS.getKey(stack.getRight().getFluid()).toString()); @@ -346,7 +359,7 @@ private static Map getObjectFromFluidStack(Pair getObjectFromGasStack(Pair stack, @Nullable ICraftingService craftingService) { + private static Map parseChemStack(Pair stack) { Map map = new HashMap<>(); long amount = stack.getLeft(); map.put("name", stack.getRight().getStack().getTypeRegistryName().toString()); @@ -357,27 +370,27 @@ private static Map getObjectFromGasStack(Pair return map; } - public static Map getObjectFromPattern(IPatternDetails pattern) { + public static Map parsePattern(IPatternDetails pattern) { Map map = new HashMap<>(); - map.put("inputs", Arrays.stream(pattern.getInputs()).map(AppEngApi::getObjectFromPatternInput).collect(Collectors.toList())); - map.put("outputs", Arrays.stream(pattern.getOutputs()).map(AppEngApi::getObjectFromGenericStack).collect(Collectors.toList())); - map.put("primaryOutput", getObjectFromGenericStack(pattern.getPrimaryOutput())); + map.put("inputs", Arrays.stream(pattern.getInputs()).map(AppEngApi::parsePatternInput).collect(Collectors.toList())); + map.put("outputs", Arrays.stream(pattern.getOutputs()).map(AppEngApi::parseGenericStack).collect(Collectors.toList())); + map.put("primaryOutput", parseGenericStack(pattern.getPrimaryOutput())); return map; } - public static Map getObjectFromPatternInput(IPatternDetails.IInput patternInput) { + public static Map parsePatternInput(IPatternDetails.IInput patternInput) { Map map = new HashMap<>(); - map.put("primaryInput", getObjectFromGenericStack(patternInput.getPossibleInputs()[0])); + map.put("primaryInput", parseGenericStack(patternInput.getPossibleInputs()[0])); map.put("possibleInputs", Arrays.stream(Arrays.copyOfRange(patternInput.getPossibleInputs(), 1, patternInput.getPossibleInputs().length)) - .map(AppEngApi::getObjectFromGenericStack)); + .map(AppEngApi::parseGenericStack)); map.put("multiplier", patternInput.getMultiplier()); map.put("remaining", patternInput.getRemainingKey(patternInput.getPossibleInputs()[0].what())); return map; } - public static Map getObjectFromCPU(ICraftingCPU cpu, boolean recursive) { + public static Map parseCraftingCPU(ICraftingCPU cpu, boolean recursive) { Map map = new HashMap<>(); long storage = cpu.getAvailableStorage(); int coProcessors = cpu.getCoProcessors(); @@ -386,36 +399,26 @@ public static Map getObjectFromCPU(ICraftingCPU cpu, boolean rec map.put("coProcessors", coProcessors); map.put("isBusy", isBusy); if (!recursive) - map.put("craftingJob", cpu.getJobStatus() != null ? getObjectFromJob(cpu.getJobStatus(), null) : null); + map.put("craftingJob", cpu.getJobStatus() != null ? parseCraftingJob(cpu.getJobStatus(), null) : null); map.put("name", cpu.getName() != null ? cpu.getName().getString() : "Unnamed"); map.put("selectionMode", cpu.getSelectionMode().toString()); return map; } - public static Map getObjectFromJob(CraftingJobStatus job, @Nullable ICraftingCPU cpu) { + public static Map parseCraftingJob(CraftingJobStatus job, @Nullable ICraftingCPU cpu) { Map map = new HashMap<>(); - map.put("storage", getObjectFromGenericStack(job.crafting())); + map.put("storage", parseGenericStack(job.crafting())); map.put("elapsedTimeNanos", job.elapsedTimeNanos()); map.put("totalItem", job.totalItems()); map.put("progress", job.progress()); if (cpu != null) - map.put("cpu", getObjectFromCPU(cpu, true)); + map.put("cpu", parseCraftingCPU(cpu, true)); return map; } - public static Map getObjectFromGenericStack(GenericStack stack) { - if (stack.what() == null) - return Collections.emptyMap(); - if (stack.what() instanceof AEItemKey aeItemKey) - return getObjectFromItemStack(Pair.of(stack.amount(), aeItemKey), null); - if (stack.what() instanceof AEFluidKey aeFluidKey) - return getObjectFromFluidStack(Pair.of(stack.amount(), aeFluidKey), null); - return Collections.emptyMap(); - } - public static MEStorage getMonitor(IGridNode node) { return node.getGrid().getService(IStorageService.class).getInventory(); } @@ -941,7 +944,7 @@ public static List listCells(IGridNode node) { continue; if (stack.getItem() instanceof IBasicCellItem cell) { - items.add(getObjectFromCell(cell, stack)); + items.add(parseCell(cell, stack)); } else if (APAddons.aeThingsLoaded && stack.getItem() instanceof DISKDrive disk) { items.add(getObjectFromDisk(disk, stack)); } else if (APAddons.aeAdditionsLoaded && stack.getItem() instanceof SuperStorageCell superStorageCell) { @@ -953,26 +956,6 @@ public static List listCells(IGridNode node) { return items; } - private static Map getObjectFromCell(IBasicCellItem cell, ItemStack stack) { - Map map = new HashMap<>(); - - map.put("item", ItemUtil.getRegistryKey(stack.getItem()).toString()); - - String cellType = ""; - - if (cell.getKeyType().getClass().isAssignableFrom(AEKeyType.items().getClass())) { - cellType = "item"; - } else if (cell.getKeyType().getClass().isAssignableFrom(AEKeyType.fluids().getClass())) { - cellType = "fluid"; - } - - map.put("cellType", cellType); - map.put("bytesPerType", cell.getBytesPerType(null)); - map.put("totalBytes", cell.getBytes(null)); - - return map; - } - private static Map getObjectFromDisk(DISKDrive drive, ItemStack stack) { Map map = new HashMap<>(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java index 7eb22d097..db76848be 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java @@ -179,7 +179,7 @@ public final MethodResult getItem(IArguments arguments) throws LuaException { if (parsedFilter.isEmpty()) return MethodResult.of(null, "EMPTY_FILTER"); - return MethodResult.of(AppEngApi.getObjectFromStack(AppEngApi.findAEStackFromFilter(monitor, getCraftingService(), parsedFilter), getCraftingService())); + return MethodResult.of(AppEngApi.parseAeStack(AppEngApi.findAEStackFromFilter(monitor, getCraftingService(), parsedFilter), getCraftingService())); } @Override @@ -196,7 +196,7 @@ public MethodResult getFluid(IArguments arguments) throws LuaException { if (parsedFilter.isEmpty()) return MethodResult.of(null, "EMPTY_FILTER"); - return MethodResult.of(AppEngApi.findAEFluidFromFilter(AppEngApi.getMonitor(node), getCraftingService(), parsedFilter)); + return MethodResult.of(AppEngApi.parseAeStack(AppEngApi.findAEFluidFromFilter(AppEngApi.getMonitor(node), getCraftingService(), parsedFilter), getCraftingService())); } @Override @@ -232,7 +232,7 @@ public final MethodResult listCraftableFluids() { if (!isAvailable()) return notConnected(); - return MethodResult.of(AppEngApi.listCraftableStacks(AppEngApi.getMonitor(node), getCraftingService())); + return MethodResult.of(AppEngApi.listCraftableFluids(AppEngApi.getMonitor(node), getCraftingService())); } @Override @@ -328,13 +328,12 @@ public MethodResult getFilteredPatterns(IArguments arguments) throws LuaExceptio outputFilter = GenericFilter.parseGeneric(outputFilterTable).getLeft(); } - Pair pattern = AppEngApi.findPatternFromFilters(node.getGrid(), getLevel(), inputFilter, outputFilter); if (pattern.getRight() != null) return MethodResult.of(null, pattern.getRight()); - return MethodResult.of(AppEngApi.getObjectFromPattern(pattern.getLeft())); + return MethodResult.of(AppEngApi.parsePattern(pattern.getLeft())); } @Override @@ -610,7 +609,7 @@ public MethodResult getCraftingTasks() { for (ICraftingCPU cpu : craftingGrid.getCpus()) { if (cpu.getJobStatus() != null) - jobs.add(AppEngApi.getObjectFromJob(cpu.getJobStatus(), cpu)); + jobs.add(AppEngApi.parseCraftingJob(cpu.getJobStatus(), cpu)); } return MethodResult.of(jobs); } @@ -776,7 +775,7 @@ public final MethodResult getCraftingCPUs() throws LuaException { List map = new ArrayList<>(); for (ICraftingCPU iCraftingCPU : grid.getCpus()) { - Object cpu = AppEngApi.getObjectFromCPU(iCraftingCPU, false); + Object cpu = AppEngApi.parseCraftingCPU(iCraftingCPU, false); map.add(cpu); } return MethodResult.of(map); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java index 15ca27785..f09da885b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java @@ -92,7 +92,7 @@ public final MethodResult listCraftableItems() { return notConnected(); List items = new ArrayList<>(); - RefinedStorage.getCraftableItems(getNetwork()).forEach(item -> items.add(RefinedStorage.getObjectFromStack(item.copy(), getNetwork()))); + RefinedStorage.getCraftableItems(getNetwork()).forEach(item -> items.add(RefinedStorage.parseItemStack(item.copy(), getNetwork()))); return MethodResult.of(items); } @@ -103,20 +103,26 @@ public final MethodResult listCraftableFluids() { return notConnected(); List fluids = new ArrayList<>(); - RefinedStorage.getCraftableFluids(getNetwork()).forEach(fluid -> fluids.add(RefinedStorage.getObjectFromFluid(fluid, getNetwork()))); + RefinedStorage.getCraftableFluids(getNetwork()).forEach(fluid -> fluids.add(RefinedStorage.parseFluidStack(fluid, getNetwork()))); return MethodResult.of(fluids); } @Override @LuaFunction(mainThread = true) public final MethodResult listCells() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getStorageDisks(getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult listDrives() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getDiskDrives(getNetwork())); } @Override @@ -137,6 +143,11 @@ public final MethodResult getTotalFluidStorage() { return MethodResult.of(RefinedStorage.getMaxFluidDiskStorage(getNetwork())); } + @Override + public MethodResult getTotalChemicalStorage() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult getUsedExternItemStorage() { @@ -149,6 +160,11 @@ public final MethodResult getUsedExternFluidStorage() { return null; } + @Override + public MethodResult getUsedExternChemicalStorage() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult getUsedItemStorage() { @@ -161,6 +177,11 @@ public final MethodResult getUsedFluidStorage() { return null; } + @Override + public MethodResult getUsedChemicalStorage() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult getAvailableExternItemStorage() { @@ -173,6 +194,11 @@ public final MethodResult getAvailableExternFluidStorage() { return null; } + @Override + public MethodResult getAvailableExternChemicalStorage() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult getAvailableItemStorage() { @@ -185,6 +211,11 @@ public final MethodResult getAvailableFluidStorage() { return null; } + @Override + public MethodResult getAvailableChemicalStorage() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult getTotalExternItemStorage() { @@ -203,6 +234,11 @@ public final MethodResult getTotalExternFluidStorage() { return MethodResult.of(RefinedStorage.getMaxFluidExternalStorage(getNetwork())); } + @Override + public MethodResult getTotalExternChemicalStorage() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult listFluids() { @@ -242,7 +278,7 @@ public final MethodResult getStoredEnergy() { @Override @LuaFunction(mainThread = true) public final MethodResult getAvgPowerInjection() { - return null; + return MethodResult.of(0); } @Override @@ -261,7 +297,7 @@ public final MethodResult getFilteredPatterns(IArguments arguments) throws LuaEx ItemStack patternItem = RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), parsedFilter); - return MethodResult.of(RefinedStorage.getObjectFromPattern(getNetwork().getCraftingManager().getPattern(patternItem), getNetwork())); + return MethodResult.of(RefinedStorage.parsePattern(getNetwork().getCraftingManager().getPattern(patternItem), getNetwork())); } @Override @@ -406,13 +442,20 @@ public final MethodResult getItem(IArguments arguments) throws LuaException { if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - return MethodResult.of(RefinedStorage.getObjectFromStack(RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); + return MethodResult.of(RefinedStorage.parseItemStack(RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getFluid(IArguments arguments) throws LuaException { - return null; + if (!isAvailable()) + return notConnected(); + + Pair filter = FluidFilter.parse(arguments.getTable(0)); + if (filter.rightPresent()) + return MethodResult.of(null, filter.getRight()); + + return MethodResult.of(RefinedStorage.parseFluidStack(RefinedStorage.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java index 2a102e1ea..2505df226 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java @@ -4,6 +4,7 @@ import com.refinedmods.refinedstorage.api.autocrafting.ICraftingManager; import com.refinedmods.refinedstorage.api.autocrafting.ICraftingPattern; import com.refinedmods.refinedstorage.api.network.INetwork; +import com.refinedmods.refinedstorage.api.network.INetworkNodeGraphEntry; import com.refinedmods.refinedstorage.api.network.node.INetworkNode; import com.refinedmods.refinedstorage.api.storage.IStorage; import com.refinedmods.refinedstorage.api.storage.cache.IStorageCache; @@ -12,6 +13,7 @@ import com.refinedmods.refinedstorage.api.util.StackListEntry; import com.refinedmods.refinedstorage.apiimpl.API; import com.refinedmods.refinedstorage.apiimpl.network.node.NetworkNode; +import com.refinedmods.refinedstorage.apiimpl.network.node.diskdrive.DiskDriveNetworkNode; import dan200.computercraft.shared.util.NBTUtil; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.LuaConverter; @@ -89,13 +91,13 @@ public static FluidStack findFluidFromFilter(INetwork network, @Nullable ICrafti public static Object listFluids(INetwork network) { List fluids = new ArrayList<>(); - getFluids(network).forEach(item -> fluids.add(getObjectFromFluid(item, network))); + getFluids(network).forEach(item -> fluids.add(parseFluidStack(item, network))); return fluids; } public static Object listItems(INetwork network) { List items = new ArrayList<>(); - getItems(network).forEach(item -> items.add(getObjectFromStack(item, network))); + getItems(network).forEach(item -> items.add(parseItemStack(item, network))); return items; } @@ -153,30 +155,159 @@ public static long getMaxFluidExternalStorage(INetwork network) { return total; } - public static Object getObjectFromPattern(ICraftingPattern pattern, INetwork network) { + public static Object getItem(INetwork network, ItemStack item) { + for (ItemStack itemStack : getItems(network)) { + if (itemStack.sameItem(item) && Objects.equals(itemStack.getTag(), item.getTag())) + return parseItemStack(itemStack.copy(), network); + } + return null; + } + + public static List getCraftableItems(INetwork network) { + IStorageCache cache = network.getItemStorageCache(); + Collection> craftableEntries = cache.getCraftablesList().getStacks(); + List result = new ArrayList<>(craftableEntries.size()); + + for (StackListEntry entry : craftableEntries) { + result.add(entry.getStack().copy()); + } + + return result; + } + + public static List getCraftableFluids(INetwork network) { + IStorageCache cache = network.getFluidStorageCache(); + Collection> craftableEntries = cache.getCraftablesList().getStacks(); + List result = new ArrayList<>(craftableEntries.size()); + + for (StackListEntry entry : craftableEntries) + result.add(entry.getStack().copy()); + + return result; + } + + public static List getItems(INetwork network) { + IStorageCache cache = network.getItemStorageCache(); + Collection> entries = cache.getList().getStacks(); + List result = new ArrayList<>(entries.size()); + + for (StackListEntry entry : entries) + result.add(entry.getStack().copy()); + + return result; + } + + public static List getFluids(INetwork network) { + IStorageCache cache = network.getFluidStorageCache(); + Collection> entries = cache.getList().getStacks(); + List result = new ArrayList<>(entries.size()); + + for (StackListEntry entry : entries) + result.add(entry.getStack().copy()); + + return result; + } + + public static List getStorageDisks(INetwork network) { + List storageDisks = new ArrayList<>(); + + Collection collection = network.getNodeGraph().all(); + + for (INetworkNodeGraphEntry graphEntry : collection) { + INetworkNode node = graphEntry.getNode(); + if (node instanceof DiskDriveNetworkNode diskDrive) { + Arrays.stream(diskDrive.getFluidDisks()).filter(Objects::nonNull).forEach(disk -> storageDisks.add(parseStorageDisk(disk))); + Arrays.stream(diskDrive.getItemDisks()).filter(Objects::nonNull).forEach(disk -> storageDisks.add(parseStorageDisk(disk))); + } + } + + return storageDisks; + } + + public static List getDiskDrives(INetwork network) { + List diskDrives = new ArrayList<>(); + + Collection collection = network.getNodeGraph().all(); + + for (INetworkNodeGraphEntry graphEntry : collection) { + INetworkNode node = graphEntry.getNode(); + if (node instanceof DiskDriveNetworkNode diskDrive) { + diskDrives.add(parseDiskDrive(diskDrive)); + } + } + + return diskDrives; + } + + public static Object parseStorageDisk(IStorageDisk disk) { + Map properties = new HashMap<>(); + + properties.put("used", disk.getStored()); + properties.put("capacity", disk.getCapacity()); + + return properties; + } + + public static Object parseDiskDrive(DiskDriveNetworkNode diskDrive) { + Map properties = new HashMap<>(); + + long total = 0; + long used = 0; + + List disks = new ArrayList<>(); + for (IStorageDisk disk : diskDrive.getFluidDisks()) { + if (disk == null) + continue; + total += disk.getCapacity(); + used += disk.getStored(); + + disks.add(parseStorageDisk(disk)); + } + for (IStorageDisk disk : diskDrive.getItemDisks()) { + if (disk == null) + continue; + total += disk.getCapacity(); + used += disk.getStored(); + + disks.add(parseStorageDisk(disk)); + } + + properties.put("used", used); + properties.put("total", total); + properties.put("drives", disks); + properties.put("mode", diskDrive.getWhitelistBlacklistMode()); + properties.put("redstone_mode", diskDrive.getRedstoneMode().toString()); + properties.put("access_type", diskDrive.getAccessType().toString()); + properties.put("position", LuaConverter.posToObject(diskDrive.getPos())); + properties.put("priority", diskDrive.getPriority()); + + return properties; + } + + public static Object parsePattern(ICraftingPattern pattern, INetwork network) { if (pattern == null) return null; Map map = new HashMap<>(); - map.put("outputs", pattern.getOutputs().stream().map(stack -> getObjectFromStack(stack.copy(), network)).toList()); - map.put("fluidOutputs", pattern.getFluidOutputs().stream().map(stack -> getObjectFromFluid(stack.copy(), network)).toList()); + map.put("outputs", pattern.getOutputs().stream().map(stack -> parseItemStack(stack.copy(), network)).toList()); + map.put("fluidOutputs", pattern.getFluidOutputs().stream().map(stack -> parseFluidStack(stack.copy(), network)).toList()); List>> inputs = pattern.getInputs().stream() .map(singleInputList -> singleInputList.stream() - .map(stack -> getObjectFromStack(stack.copy(), network)) + .map(stack -> parseItemStack(stack.copy(), network)) .collect(Collectors.toList())) .collect(Collectors.toList()); List>> fluidInputs = pattern.getInputs().stream() .map(singleInputList -> singleInputList.stream() - .map(stack -> getObjectFromStack(stack.copy(), network)) + .map(stack -> parseItemStack(stack.copy(), network)) .collect(Collectors.toList())) .collect(Collectors.toList()); List byproducts = new ArrayList<>(); if (!pattern.isProcessing()) { byproducts = pattern.getByproducts().stream() - .map(stack -> getObjectFromStack(stack.copy(), network)) + .map(stack -> parseItemStack(stack.copy(), network)) .collect(Collectors.toList()); } @@ -194,7 +325,7 @@ public static Object getObjectFromPattern(ICraftingPattern pattern, INetwork net return map; } - public static Map getObjectFromStack(@Nullable ItemStack itemStack, INetwork network) { + public static Map parseItemStack(@Nullable ItemStack itemStack, INetwork network) { if (itemStack == null) return Collections.emptyMap(); @@ -209,7 +340,7 @@ public static Map getObjectFromStack(@Nullable ItemStack itemSta return map; } - public static Map getObjectFromFluid(@Nullable FluidStack fluidStack, INetwork network) { + public static Map parseFluidStack(@Nullable FluidStack fluidStack, INetwork network) { if (fluidStack == null) return Collections.emptyMap(); @@ -221,59 +352,6 @@ public static Map getObjectFromFluid(@Nullable FluidStack fluidS return map; } - public static Object getItem(INetwork network, ItemStack item) { - for (ItemStack itemStack : getItems(network)) { - if (itemStack.sameItem(item) && Objects.equals(itemStack.getTag(), item.getTag())) - return getObjectFromStack(itemStack.copy(), network); - } - return null; - } - - public static List getCraftableItems(INetwork network) { - IStorageCache cache = network.getItemStorageCache(); - Collection> craftableEntries = cache.getCraftablesList().getStacks(); - List result = new ArrayList<>(craftableEntries.size()); - - for (StackListEntry entry : craftableEntries) { - result.add(entry.getStack().copy()); - } - - return result; - } - - public static List getCraftableFluids(INetwork network) { - IStorageCache cache = network.getFluidStorageCache(); - Collection> craftableEntries = cache.getCraftablesList().getStacks(); - List result = new ArrayList<>(craftableEntries.size()); - - for (StackListEntry entry : craftableEntries) - result.add(entry.getStack().copy()); - - return result; - } - - public static List getItems(INetwork network) { - IStorageCache cache = network.getItemStorageCache(); - Collection> entries = cache.getList().getStacks(); - List result = new ArrayList<>(entries.size()); - - for (StackListEntry entry : entries) - result.add(entry.getStack().copy()); - - return result; - } - - public static List getFluids(INetwork network) { - IStorageCache cache = network.getFluidStorageCache(); - Collection> entries = cache.getList().getStacks(); - List result = new ArrayList<>(entries.size()); - - for (StackListEntry entry : entries) - result.add(entry.getStack().copy()); - - return result; - } - public void initiate() { api.getNetworkNodeRegistry().add(new ResourceLocation(AdvancedPeripherals.MOD_ID, "rs_bridge"), (tag, world, pos) -> read(tag, new RefinedStorageNode(world, pos))); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index f06b28f33..a5f759c7d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -26,7 +26,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collections; + +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -237,7 +238,9 @@ public static Map fluidToObject(@NotNull Fluid fluid) { } public static List tagsToList(@NotNull Supplier>> tags) { - if (tags.get().findAny().isEmpty()) return Collections.emptyList(); + // We use new ArrayList here instead of Collections.emptyList to prevent an issue with + // textutils.serialise. I just hope this does not lead to a memory leak + if (tags.get().findAny().isEmpty()) return new ArrayList<>(); return tags.get().map(LuaConverter::tagToString).toList(); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java index da7510ba0..223df66da 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java @@ -115,7 +115,7 @@ public boolean test(FluidStack stack) { // If the filter does not have nbt values, a tag or a fingerprint, just test if the items are the same if (fluid != Fluids.EMPTY) { - if (tag == null && nbt == null && fingerprint.isEmpty()) + if (tag == null && nbt == null) return stack.getFluid().isSame(fluid); } if (tag != null && !stack.getFluid().is(tag)) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java index 39b4fd114..d90bfc97e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java @@ -61,26 +61,38 @@ public interface IStorageSystemPeripheral { MethodResult getTotalExternFluidStorage(); + MethodResult getTotalExternChemicalStorage(); + MethodResult getTotalItemStorage(); MethodResult getTotalFluidStorage(); + MethodResult getTotalChemicalStorage(); + MethodResult getUsedExternItemStorage(); MethodResult getUsedExternFluidStorage(); + MethodResult getUsedExternChemicalStorage(); + MethodResult getUsedItemStorage(); MethodResult getUsedFluidStorage(); + MethodResult getUsedChemicalStorage(); + MethodResult getAvailableExternItemStorage(); MethodResult getAvailableExternFluidStorage(); + MethodResult getAvailableExternChemicalStorage(); + MethodResult getAvailableItemStorage(); MethodResult getAvailableFluidStorage(); + MethodResult getAvailableChemicalStorage(); + MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException; MethodResult getCraftingTasks(); From c1c67fba27cdbdc7d1a3041a4d54d212d5cf7476 Mon Sep 17 00:00:00 2001 From: endi Date: Fri, 30 Aug 2024 18:16:39 +0200 Subject: [PATCH 083/188] [#555] Implement patterns for the RS Bridge --- .../addons/appliedenergistics/AppEngApi.java | 4 +- .../peripheral/MeBridgePeripheral.java | 6 +- .../peripheral/RsBridgePeripheral.java | 53 +++++++++-- .../addons/refinedstorage/RefinedStorage.java | 87 +++++++++++++++++++ .../common/util/inventory/FluidFilter.java | 4 +- .../common/util/inventory/GenericFilter.java | 21 +++-- .../common/util/inventory/ItemFilter.java | 6 +- 7 files changed, 155 insertions(+), 26 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java index 998686e0e..405ba05a5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java @@ -123,7 +123,7 @@ public static Pair findPatternFromFilters(IGrid grid, L outerLoop: for (IPatternDetails.IInput input : pattern.getInputs()) { for (GenericStack possibleInput : input.getPossibleInputs()) { - if (inputFilter.test(possibleInput)) { + if (inputFilter.testAE(possibleInput)) { inputMatch = true; break outerLoop; } @@ -135,7 +135,7 @@ public static Pair findPatternFromFilters(IGrid grid, L if (outputFilter != null) { for (GenericStack output : pattern.getOutputs()) { - if (outputFilter.test(output)) { + if (outputFilter.testAE(output)) { outputMatch = true; break; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java index db76848be..86776f7b0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java @@ -314,8 +314,8 @@ public MethodResult getFilteredPatterns(IArguments arguments) throws LuaExceptio if (!hasAnyFilter) return MethodResult.of(null, "NO_FILTER"); - GenericFilter inputFilter = null; - GenericFilter outputFilter = null; + GenericFilter inputFilter = null; + GenericFilter outputFilter = null; if (hasInputFilter) { Map inputFilterTable = TableHelper.getTableField(filterTable, "input"); @@ -638,7 +638,7 @@ public MethodResult cancelCraftingTasks(IArguments arguments) { int jobsCanceled = 0; for (ICraftingCPU cpu : craftingGrid.getCpus()) { - if (cpu.getJobStatus() != null && filter.getLeft().test(cpu.getJobStatus().crafting())) { + if (cpu.getJobStatus() != null && filter.getLeft().testAE(cpu.getJobStatus().crafting())) { if (cpu instanceof CraftingCPUCluster cpuCluster) { cpuCluster.cancel(); jobsCanceled++; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java index f09da885b..fbe3d0ac5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; +import com.refinedmods.refinedstorage.api.autocrafting.ICraftingPattern; import com.refinedmods.refinedstorage.api.autocrafting.task.CalculationResultType; import com.refinedmods.refinedstorage.api.autocrafting.task.ICalculationResult; import com.refinedmods.refinedstorage.api.autocrafting.task.ICraftingTask; @@ -9,6 +10,7 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.core.apis.TableHelper; import dan200.computercraft.core.computer.ComputerSide; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; @@ -32,6 +34,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Map; +import java.util.Optional; public class RsBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral { @@ -287,23 +291,54 @@ public final MethodResult getFilteredPatterns(IArguments arguments) throws LuaEx if (!isAvailable()) return notConnected(); - Pair filter = ItemFilter.parse(arguments.getTable(0)); - if (filter.rightPresent()) - return MethodResult.of(false, filter.getRight()); + // Expected input is a table with either an input table, an output table or both to filter for both + Map filterTable; + try { + Optional> optionalTable = arguments.optTable(0); + if (optionalTable.isEmpty()) + return MethodResult.of(null, "EMPTY_INPUT"); + filterTable = optionalTable.get(); + } catch (LuaException e) { + return MethodResult.of(null, "NO_TABLE"); + } - ItemFilter parsedFilter = filter.getLeft(); - if (parsedFilter.isEmpty()) - return MethodResult.of(false, "EMPTY_FILTER"); + boolean hasInputFilter = filterTable.containsKey("input"); + boolean hasOutputFilter = filterTable.containsKey("output"); + boolean hasAnyFilter = hasInputFilter || hasOutputFilter; + + // If the player tries to filter for nothing, return nothing. + if (!hasAnyFilter) + return MethodResult.of(null, "NO_FILTER"); - ItemStack patternItem = RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), parsedFilter); + GenericFilter inputFilter = null; + GenericFilter outputFilter = null; - return MethodResult.of(RefinedStorage.parsePattern(getNetwork().getCraftingManager().getPattern(patternItem), getNetwork())); + if (hasInputFilter) { + Map inputFilterTable = TableHelper.getTableField(filterTable, "input"); + + inputFilter = GenericFilter.parseGeneric(inputFilterTable).getLeft(); + } + if (hasOutputFilter) { + Map outputFilterTable = TableHelper.getTableField(filterTable, "output"); + + outputFilter = GenericFilter.parseGeneric(outputFilterTable).getLeft(); + } + + Pair pattern = RefinedStorage.findPatternFromFilters(getNetwork(), inputFilter, outputFilter); + + if (pattern.getRight() != null) + return MethodResult.of(null, pattern.getRight()); + + return MethodResult.of(RefinedStorage.parsePattern(pattern.getLeft(), getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getPatterns() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getPatterns(getNetwork())); } protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java index 2505df226..0b885894a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java @@ -17,9 +17,12 @@ import dan200.computercraft.shared.util.NBTUtil; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.LuaConverter; +import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; +import de.srendi.advancedperipherals.common.util.inventory.GenericFilter; import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; +import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -89,6 +92,79 @@ public static FluidStack findFluidFromFilter(INetwork network, @Nullable ICrafti return FluidStack.EMPTY; } + /** + * Finds a pattern from filters. + * + * @param network The network to search patterns from. + * @param inputFilter The input filter to apply, can be null to ignore input filter. + * @param outputFilter The output filter to apply, can be null to ignore output filter. + * @return A Pair object containing the matched pattern and an error message if no pattern is found. + * The pattern can be null if no pattern is found. + * The error message is "NO_PATTERN_FOUND" if no pattern is found. + */ + public static Pair findPatternFromFilters(INetwork network, @Nullable GenericFilter inputFilter, @Nullable GenericFilter outputFilter) { + for (ICraftingPattern pattern : network.getCraftingManager().getPatterns()) { + if (pattern.getInputs().isEmpty()) + continue; + if (pattern.getOutputs().isEmpty()) + continue; + + boolean inputMatch = false; + boolean outputMatch = false; + + if (inputFilter != null) { + if (inputFilter instanceof ItemFilter itemInputFilter) { + outerLoop: + for (NonNullList input : pattern.getInputs()) { + for (ItemStack possibleInput : input) { + if (itemInputFilter.test(possibleInput)) { + inputMatch = true; + break outerLoop; + } + } + } + } else if(inputFilter instanceof FluidFilter itemFluidFilter) { + outerLoop: + for (NonNullList input : pattern.getFluidInputs()) { + for (FluidStack possibleInput : input) { + if (itemFluidFilter.test(possibleInput)) { + inputMatch = true; + break outerLoop; + } + } + } + } + } else { + inputMatch = true; + } + + if (outputFilter != null) { + if (outputFilter instanceof ItemFilter itemOutputFilter) { + for (ItemStack output : pattern.getOutputs()) { + if (itemOutputFilter.test(output)) { + outputMatch = true; + break; + } + } + } else if(outputFilter instanceof FluidFilter fluidOutputFilter) { + for (FluidStack output : pattern.getFluidOutputs()) { + if (fluidOutputFilter.test(output)) { + outputMatch = true; + break; + } + } + } + } else { + outputMatch = true; + } + + if (inputMatch && outputMatch) + return Pair.of(pattern, null); + } + + return Pair.of(null, "NO_PATTERN_FOUND"); + } + public static Object listFluids(INetwork network) { List fluids = new ArrayList<>(); getFluids(network).forEach(item -> fluids.add(parseFluidStack(item, network))); @@ -208,6 +284,17 @@ public static List getFluids(INetwork network) { return result; } + public static List getPatterns(INetwork network) { + List patterns = new ArrayList<>(); + Collection craftingPatterns = network.getCraftingManager().getPatterns(); + + for (ICraftingPattern pattern : craftingPatterns) { + patterns.add(parsePattern(pattern, network)); + } + + return patterns; + } + public static List getStorageDisks(INetwork network) { List storageDisks = new ArrayList<>(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java index 223df66da..3b898a434 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java @@ -19,7 +19,7 @@ import java.util.Map; -public class FluidFilter extends GenericFilter { +public class FluidFilter extends GenericFilter { private Fluid fluid = Fluids.EMPTY; private TagKey tag = null; @@ -100,7 +100,7 @@ public FluidFilter setCount(int count) { } @Override - public boolean test(GenericStack genericStack) { + public boolean testAE(GenericStack genericStack) { if (genericStack.what() instanceof AEFluidKey aeFluidKey) { return test(aeFluidKey.toStack(1)); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java index 64d148419..1667ed9ba 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java @@ -6,7 +6,7 @@ import java.util.Map; -public abstract class GenericFilter { +public abstract class GenericFilter { /** * Try to parse a raw filter table to any existing filter type. Could be a fluid filter, an item filter, maybe something else @@ -18,7 +18,7 @@ public abstract class GenericFilter { * @param rawFilter The raw filter, which is a map of strings and objects * @return A pair of the parsed filter and an error message, if there is one */ - public static Pair parseGeneric(Map rawFilter) { + public static Pair, String> parseGeneric(Map rawFilter) { // TODO: Add chemical filter support if (!rawFilter.containsKey("name")) { @@ -45,22 +45,29 @@ public static Pair parseGeneric(Map rawFi // If the name is in neither of the registries, we will just return an empty filter return Pair.of(empty(), "NO_VALID_FILTER_TYPE"); } - } public abstract boolean isEmpty(); - public abstract boolean test(GenericStack genericStack); + // AE2 stuff + public abstract boolean testAE(GenericStack genericStack); + + public abstract boolean test(T toTest); - public static GenericFilter empty() { - return new GenericFilter() { + public static GenericFilter empty() { + return new GenericFilter<>() { @Override public boolean isEmpty() { return true; } @Override - public boolean test(GenericStack genericStack) { + public boolean testAE(GenericStack genericStack) { + return false; + } + + @Override + public boolean test(Object toTest) { return false; } }; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java index f44bb19f9..8f0905eab 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java @@ -19,7 +19,7 @@ import java.util.Map; -public class ItemFilter extends GenericFilter { +public class ItemFilter extends GenericFilter { private Item item = Items.AIR; private TagKey tag = null; @@ -115,7 +115,7 @@ public ItemStack toItemStack() { } @Override - public boolean test(GenericStack genericStack) { + public boolean testAE(GenericStack genericStack) { if (genericStack.what() instanceof AEItemKey aeItemKey) { return test(aeItemKey.toStack()); } @@ -130,7 +130,7 @@ public boolean test(ItemStack stack) { // If the filter does not have nbt values, a tag or a fingerprint, just test if the items are the same if (item != Items.AIR) { - if (tag == null && nbt == null && fingerprint.isEmpty()) + if (tag == null && nbt == null) return stack.is(item); } if (tag != null && !stack.is(tag)) From 68e9d07f5692f9d7747c2e71fe4600a91b0134cd Mon Sep 17 00:00:00 2001 From: endi Date: Sat, 31 Aug 2024 11:33:37 +0200 Subject: [PATCH 084/188] [#555] Implement storage information functions and some crafting functions for the rs bridge --- .../peripheral/RsBridgePeripheral.java | 145 +++++++++++++++--- .../addons/refinedstorage/RefinedStorage.java | 66 +++++++- 2 files changed, 190 insertions(+), 21 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java index 96645a2bd..727abd601 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; +import com.refinedmods.refinedstorage.api.autocrafting.ICraftingManager; import com.refinedmods.refinedstorage.api.autocrafting.ICraftingPattern; import com.refinedmods.refinedstorage.api.autocrafting.task.CalculationResultType; import com.refinedmods.refinedstorage.api.autocrafting.task.ICalculationResult; @@ -148,76 +149,120 @@ public final MethodResult getTotalFluidStorage() { } @Override + @LuaFunction(mainThread = true) public MethodResult getTotalChemicalStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(-1); } @Override @LuaFunction(mainThread = true) public final MethodResult getUsedExternItemStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getUsedItemExternalStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getUsedExternFluidStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getUsedFluidExternalStorage(getNetwork())); } @Override + @LuaFunction(mainThread = true) public MethodResult getUsedExternChemicalStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(-1); } @Override @LuaFunction(mainThread = true) public final MethodResult getUsedItemStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getUsedItemDiskStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getUsedFluidStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getUsedFluidDiskStorage(getNetwork())); } @Override + @LuaFunction(mainThread = true) public MethodResult getUsedChemicalStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(-1); } @Override @LuaFunction(mainThread = true) public final MethodResult getAvailableExternItemStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getMaxItemExternalStorage(getNetwork()) - RefinedStorage.getUsedItemExternalStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getAvailableExternFluidStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getMaxFluidExternalStorage(getNetwork()) - RefinedStorage.getUsedFluidExternalStorage(getNetwork())); } @Override + @LuaFunction(mainThread = true) public MethodResult getAvailableExternChemicalStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(-1); } @Override @LuaFunction(mainThread = true) public final MethodResult getAvailableItemStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getMaxItemDiskStorage(getNetwork()) - RefinedStorage.getUsedItemDiskStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getAvailableFluidStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getMaxFluidDiskStorage(getNetwork()) - RefinedStorage.getUsedFluidDiskStorage(getNetwork())); } @Override + @LuaFunction(mainThread = true) public MethodResult getAvailableChemicalStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(-1); } @Override @@ -239,8 +284,12 @@ public final MethodResult getTotalExternFluidStorage() { } @Override + @LuaFunction(mainThread = true) public MethodResult getTotalExternChemicalStorage() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(-1); } @Override @@ -539,13 +588,44 @@ public final MethodResult craftFluid(IComputerAccess computerAccess, IArguments } @Override + @LuaFunction(mainThread = true) public MethodResult getCraftingTasks() { - return null; + if (!isAvailable()) + return notConnected(); + + return MethodResult.of(RefinedStorage.getCraftingTasks(getNetwork())); } @Override + @LuaFunction(mainThread = true) public MethodResult cancelCraftingTasks(IArguments arguments) throws LuaException { - return null; + if (!isAvailable()) + return notConnected(); + + Pair, String> filter = GenericFilter.parseGeneric(arguments.getTable(0)); + if (filter.getRight() != null) + return MethodResult.of(null, filter.getRight()); + + ICraftingManager craftingManager = getNetwork().getCraftingManager(); + int canceled = 0; + + for (ICraftingTask task : craftingManager.getTasks()) { + if (filter.getLeft() instanceof ItemFilter itemFilter) { + if (itemFilter.test(task.getRequested().getItem())) { + craftingManager.cancel(task.getId()); + canceled++; + } + } + + if (filter.getLeft() instanceof FluidFilter fluidFilter) { + if (fluidFilter.test(task.getRequested().getFluid())) { + craftingManager.cancel(task.getId()); + canceled++; + } + } + } + + return MethodResult.of(canceled); } @Override @@ -553,6 +633,7 @@ public MethodResult cancelCraftingTasks(IArguments arguments) throws LuaExceptio public final MethodResult isItemCrafting(IArguments arguments) throws LuaException { if (!isAvailable()) return notConnected(); + Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); @@ -572,13 +653,40 @@ public final MethodResult isItemCrafting(IArguments arguments) throws LuaExcepti @Override @LuaFunction(mainThread = true) public final MethodResult isFluidCraftable(IArguments arguments) throws LuaException { - return null; + if (!isAvailable()) + return notConnected(); + + Pair filter = FluidFilter.parse(arguments.getTable(0)); + if (filter.rightPresent()) + return MethodResult.of(false, filter.getRight()); + + FluidFilter parsedFilter = filter.getLeft(); + if (parsedFilter.isEmpty()) + return MethodResult.of(false, "EMPTY_FILTER"); + + return MethodResult.of(RefinedStorage.isFluidCraftable(getNetwork(), parsedFilter.toFluidStack())); } @Override @LuaFunction(mainThread = true) public final MethodResult isFluidCrafting(IArguments arguments) throws LuaException { - return null; + if (!isAvailable()) + return notConnected(); + + Pair filter = FluidFilter.parse(arguments.getTable(0)); + if (filter.rightPresent()) + return MethodResult.of(null, filter.getRight()); + + FluidStack stack = RefinedStorage.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); + if (stack.isEmpty()) + return MethodResult.of(null, "NOT_CRAFTABLE"); + + for (ICraftingTask task : getNetwork().getCraftingManager().getTasks()) { + FluidStack taskStack = task.getRequested().getFluid(); + if (taskStack != null && taskStack.isFluidEqual(stack)) + return MethodResult.of(true); + } + return MethodResult.of(false); } @Override @@ -594,6 +702,7 @@ public final MethodResult isItemCraftable(IArguments arguments) throws LuaExcept ItemFilter parsedFilter = filter.getLeft(); if (parsedFilter.isEmpty()) return MethodResult.of(false, "EMPTY_FILTER"); + return MethodResult.of(RefinedStorage.isItemCraftable(getNetwork(), parsedFilter.toItemStack())); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java index 9a380f8c8..4d88dddbb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java @@ -3,6 +3,7 @@ import com.refinedmods.refinedstorage.api.IRSAPI; import com.refinedmods.refinedstorage.api.autocrafting.ICraftingManager; import com.refinedmods.refinedstorage.api.autocrafting.ICraftingPattern; +import com.refinedmods.refinedstorage.api.autocrafting.task.ICraftingTask; import com.refinedmods.refinedstorage.api.network.INetwork; import com.refinedmods.refinedstorage.api.network.INetworkNodeGraphEntry; import com.refinedmods.refinedstorage.api.network.node.INetworkNode; @@ -211,6 +212,26 @@ public static long getMaxFluidDiskStorage(INetwork network) { return creative ? -1 : total; } + public static long getUsedItemDiskStorage(INetwork network) { + long used = 0; + for (IStorage store : network.getItemStorageCache().getStorages()) { + if (store instanceof IStorageDisk storageDisk) { + used += storageDisk.getStored(); + } + } + return used; + } + + public static long getUsedFluidDiskStorage(INetwork network) { + long used = 0; + for (IStorage store : network.getFluidStorageCache().getStorages()) { + if (store instanceof IStorageDisk storageDisk) { + used += storageDisk.getStored(); + } + } + return used; + } + public static long getMaxItemExternalStorage(INetwork network) { long total = 0; for (IStorage store : network.getItemStorageCache().getStorages()) { @@ -231,6 +252,26 @@ public static long getMaxFluidExternalStorage(INetwork network) { return total; } + public static long getUsedItemExternalStorage(INetwork network) { + long used = 0; + for (IStorage store : network.getItemStorageCache().getStorages()) { + if (store instanceof IExternalStorage externalStorage) { + used += externalStorage.getStored(); + } + } + return used; + } + + public static long getUsedFluidExternalStorage(INetwork network) { + long used = 0; + for (IStorage store : network.getFluidStorageCache().getStorages()) { + if (store instanceof IExternalStorage externalStorage) { + used += externalStorage.getStored(); + } + } + return used; + } + public static Object getItem(INetwork network, ItemStack item) { for (ItemStack itemStack : getItems(network)) { if (itemStack.sameItem(item) && Objects.equals(itemStack.getTag(), item.getTag())) @@ -314,9 +355,7 @@ public static List getStorageDisks(INetwork network) { public static List getDiskDrives(INetwork network) { List diskDrives = new ArrayList<>(); - Collection collection = network.getNodeGraph().all(); - - for (INetworkNodeGraphEntry graphEntry : collection) { + for (INetworkNodeGraphEntry graphEntry : network.getNodeGraph().all()) { INetworkNode node = graphEntry.getNode(); if (node instanceof DiskDriveNetworkNode diskDrive) { diskDrives.add(parseDiskDrive(diskDrive)); @@ -326,6 +365,27 @@ public static List getDiskDrives(INetwork network) { return diskDrives; } + public static List getCraftingTasks(INetwork network) { + List tasks = new ArrayList<>(); + + for (ICraftingTask task : network.getCraftingManager().getTasks()) { + tasks.add(parseCraftingTask(task, network)); + } + + return tasks; + } + + public static Object parseCraftingTask(ICraftingTask task, INetwork network) { + Map properties = new HashMap<>(); + + properties.put("id", task.getId()); + properties.put("pattern", parsePattern(task.getPattern(), network)); + properties.put("quantity", task.getQuantity()); + properties.put("completion", task.getCompletionPercentage()); + + return properties; + } + public static Object parseStorageDisk(IStorageDisk disk) { Map properties = new HashMap<>(); From 7021fe096d1320e8e2025b7dafe93c49e2684899 Mon Sep 17 00:00:00 2001 From: endi Date: Fri, 4 Oct 2024 16:13:18 +0200 Subject: [PATCH 085/188] Some 3D Rendering attempts. Currently, no really implemented api for 3d objects, just playing around with the renderer to get a feeling how I want to design the functions for the 3d objects --- .../client/RenderUtil.java | 255 ++++++++++++++++++ .../OverlayModuleLevelRenderer.java | 75 ++++++ .../smartglasses/OverlayModuleOverlay.java | 2 +- .../smartglasses/OverlayObjectHolder.java | 13 +- .../smartglasses/objects/BlockRenderer.java | 15 ++ .../smartglasses/objects/CircleRenderer.java | 4 +- .../smartglasses/objects/IObjectRenderer.java | 2 +- .../smartglasses/objects/ItemRenderer.java | 4 +- .../objects/RectangleRenderer.java | 2 +- .../smartglasses/objects/TextRenderer.java | 4 +- .../RenderableObjectBulkSyncPacket.java | 2 +- .../toclient/RenderableObjectSyncPacket.java | 2 +- .../smartglasses/SmartGlassesComputer.java | 12 - .../modules/overlay/ObjectDecodeRegistry.java | 2 +- .../overlay/OverlayGlassesFunctions.java | 19 +- .../modules/overlay/OverlayModule.java | 2 +- .../objects/three_dim/BlockObject.java | 86 ++++++ .../three_dim/ThreeDimensionalObject.java | 19 ++ .../objects/{ => two_dim}/CircleObject.java | 4 +- .../objects/{ => two_dim}/ItemObject.java | 4 +- .../{ => two_dim}/RectangleObject.java | 4 +- .../{ => two_dim}/RenderableObject.java | 18 +- .../objects/{ => two_dim}/TextObject.java | 4 +- 23 files changed, 514 insertions(+), 40 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/BlockRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{ => two_dim}/CircleObject.java (97%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{ => two_dim}/ItemObject.java (97%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{ => two_dim}/RectangleObject.java (96%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{ => two_dim}/RenderableObject.java (91%) rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{ => two_dim}/TextObject.java (97%) diff --git a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java new file mode 100644 index 000000000..ec7c34eb8 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java @@ -0,0 +1,255 @@ +package de.srendi.advancedperipherals.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix4f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class RenderUtil { + + public static void drawBox(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, float sX, float sY, float sZ) { + drawBox(stack, buffer, r, g, b, a, 0, 0, 0, sX, sY, sZ); + } + + public static void drawVoxelShape(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, VoxelShape shape, float x, float y, float z) { + renderVoxelShape(stack, buffer, r, g, b, a, shape); + } + + public static void drawBox(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, float pX, float pY, float pZ, float sX, float sY, float sZ) { + stack.pushPose(); + sX = sX / 16; //Sizes in pixels please + sY = sY / 16; + sZ = sZ / 16; + pX = pX / 16; + pY = pY / 16; + pZ = pZ / 16; + + drawPlane(stack, buffer, r, g, b, a, Perspective.UP, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Perspective.DOWN, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Perspective.RIGHT, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Perspective.LEFT, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Perspective.FRONT, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Perspective.BACK, pX, pY, pZ, sX, sY, sZ); + stack.popPose(); + } + + public static void drawPlane(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, Perspective perspective, float pX, float pY, float pZ, float sX, float sY, float sZ) { + stack.pushPose(); + Matrix4f matrix4f = stack.last().pose(); + + sX = sX / 2; + sY = sY / 2; + sZ = sZ / 2; + + pX = pX + 0.5f; + pY = pY + 0.5f; + pZ = pZ + 0.5f; + + + if (perspective == Perspective.UP) { + buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + } + if (perspective == Perspective.DOWN) { + buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + } + if (perspective == Perspective.BACK) { + buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + } + if (perspective == Perspective.FRONT) { + buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + } + if (perspective == Perspective.RIGHT) { + buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + } + if (perspective == Perspective.LEFT) { + buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + } + stack.popPose(); + } + + public static void renderVoxelShape(PoseStack poseStack, VertexConsumer consumer, float r, float g, float b, float a, VoxelShape shape) { + List list = shape.toAabbs(); + + for (AABB aabb : list) { + renderShape(poseStack, consumer, r, g, b, a, Shapes.create(aabb)); + } + } + + private static void renderShape(PoseStack poseStack, VertexConsumer consumer, float r, float g, float b, float a, VoxelShape shape) { + AtomicInteger perspective = new AtomicInteger(); + shape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> { + + minX = minX / 16; + minY = minY / 16; + minZ = minZ / 16; + maxX = maxX / 16; + maxY = maxY / 16; + maxZ = maxZ / 16; + + if (perspective.get() > 5) + perspective.set(0); + drawPlane(poseStack, consumer, r, g, b, a, Perspective.values()[perspective.getAndIncrement()], (float) minX, (float) minY, (float) minZ, (float) maxX, (float) maxY, (float) maxZ); + }); + perspective.set(0); + } + + public static void drawBox(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { + drawBox(stack, buffer, texture, 0, 0, 0, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + } + + public static void drawVoxelShape(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, VoxelShape shape, float pUOffset, float pVOffset, float pWidth, float pHeight) { + renderVoxelShape(stack, buffer, texture, shape, pUOffset, pVOffset, pWidth, pHeight); + } + + public static void drawBox(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, float pX, float pY, float pZ, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { + stack.pushPose(); + sX = sX / 16; //Sizes in pixels please + sY = sY / 16; + sZ = sZ / 16; + pX = pX / 16; + pY = pY / 16; + pZ = pZ / 16; + + drawPlane(stack, buffer, texture, Perspective.UP, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Perspective.DOWN, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Perspective.RIGHT, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Perspective.LEFT, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Perspective.FRONT, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Perspective.BACK, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + stack.popPose(); + } + + public static void drawPlane(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, Perspective perspective, float pX, float pY, float pZ, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { + stack.pushPose(); + Matrix4f matrix4f = stack.last().pose(); + + TextureAtlasSprite stillTexture = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture); + + sX = sX / 2; + sY = sY / 2; + sZ = sZ / 2; + + pX = pX + 0.5f; + pY = pY + 0.5f; + pZ = pZ + 0.5f; + + float u1 = stillTexture.getU(pUOffset); + float u2 = stillTexture.getU(pWidth); + float v1 = stillTexture.getV(pVOffset); + float v2 = stillTexture.getV(pHeight); + + if (perspective == Perspective.UP) { + buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + } + if (perspective == Perspective.DOWN) { + buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + } + if (perspective == Perspective.BACK) { + buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + } + if (perspective == Perspective.FRONT) { + buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + } + if (perspective == Perspective.RIGHT) { + buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + } + if (perspective == Perspective.LEFT) { + buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + } + stack.popPose(); + } + + public static void renderVoxelShape(PoseStack poseStack, VertexConsumer consumer, ResourceLocation texture, VoxelShape shape, float pUOffset, float pVOffset, float pWidth, float pHeight) { + List list = shape.toAabbs(); + + for (AABB aabb : list) { + renderShape(poseStack, consumer, texture, Shapes.create(aabb), pUOffset, pVOffset, pWidth, pHeight); + } + } + + private static void renderShape(PoseStack poseStack, VertexConsumer consumer, ResourceLocation texture, VoxelShape shape, float pUOffset, float pVOffset, float pWidth, float pHeight) { + AtomicInteger perspective = new AtomicInteger(); + shape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> { + + minX = minX / 16; + minY = minY / 16; + minZ = minZ / 16; + maxX = maxX / 16; + maxY = maxY / 16; + maxZ = maxZ / 16; + + if (perspective.get() > 5) + perspective.set(0); + drawPlane(poseStack, consumer, texture, Perspective.values()[perspective.getAndIncrement()], (float) minX, (float) minY, (float) minZ, (float) maxX, (float) maxY, (float) maxZ, pUOffset, pVOffset, pWidth, pHeight); + }); + perspective.set(0); + } + + public static float getBlue(int hex) { + return (hex & 0xFF) / 255.0F; + } + + public static float getGreen(int hex) { + return (hex >> 8 & 0xFF) / 255.0F; + } + + public static float getRed(int hex) { + return (hex >> 16 & 0xFF) / 255.0F; + } + + public static float getAlpha(int hex) { + return (hex >> 24 & 0xFF) / 255.0F; + } + + public enum Perspective { + + UP, DOWN, RIGHT, LEFT, FRONT, BACK + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java new file mode 100644 index 000000000..daaee7948 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java @@ -0,0 +1,75 @@ +package de.srendi.advancedperipherals.client.smartglasses; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.RenderUtil; +import de.srendi.advancedperipherals.common.util.EnumColor; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE, modid = AdvancedPeripherals.MOD_ID) +public class OverlayModuleLevelRenderer { + + @SubscribeEvent + public static void renderLevelState(RenderLevelStageEvent event) { + PoseStack posestack = event.getPoseStack(); + Vec3 view = Minecraft.getInstance().getEntityRenderDispatcher().camera.getPosition(); + + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) { + bufferbuilder.begin(RenderType.solid().mode(), DefaultVertexFormat.BLOCK); + BlockPos blockPos = new BlockPos(0, 190, 0); + + posestack.pushPose(); + posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); + float[] colors = EnumColor.GREEN.getRgb(); + RenderSystem.setShaderColor(colors[0], colors[1], colors[2], 0.8f); + + Minecraft.getInstance().getBlockRenderer().renderBatched(Blocks.STONE.defaultBlockState(), blockPos, event.getCamera().getEntity().level, posestack, bufferbuilder, false, event.getCamera().getEntity().level.random); + BufferUploader.drawWithShader(bufferbuilder.end()); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + + posestack.popPose(); + + blockPos = new BlockPos(2, 190, 0); + + colors = EnumColor.DARK_PURPLE.getRgb(); + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + bufferbuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL); + posestack.pushPose(); + + posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); + + RenderUtil.drawPlane(posestack, bufferbuilder, colors[0], colors[1], colors[2], 0.8f, RenderUtil.Perspective.UP, 0f, 0.5f, 0f, 0.5f, 0f, 1f); + + BufferUploader.drawWithShader(bufferbuilder.end()); + posestack.popPose(); + posestack.pushPose(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + bufferbuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL); + + blockPos = new BlockPos(5, 190, 0); + posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); + + RenderUtil.drawBox(posestack, bufferbuilder, colors[0], colors[1], colors[2], 0.8f, 16f, 16f, 12f); + BufferUploader.drawWithShader(bufferbuilder.end()); + posestack.popPose(); + + } + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java index fea3a9dc9..19eb647b1 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.client.smartglasses; import com.mojang.blaze3d.vertex.PoseStack; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index a37b75325..9c4f01440 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -1,11 +1,12 @@ package de.srendi.advancedperipherals.client.smartglasses; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.CircleObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.ItemObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RectangleObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.TextObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject; import java.util.Collection; import java.util.HashMap; @@ -45,5 +46,7 @@ public static void registerDecodeObjects() { ObjectDecodeRegistry.register(CircleObject.TYPE_ID, CircleObject::decode); ObjectDecodeRegistry.register(TextObject.TYPE_ID, TextObject::decode); ObjectDecodeRegistry.register(ItemObject.TYPE_ID, ItemObject::decode); + + ObjectDecodeRegistry.register(BlockObject.TYPE_ID, BlockObject::decode); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/BlockRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/BlockRenderer.java new file mode 100644 index 000000000..f2be38c11 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/BlockRenderer.java @@ -0,0 +1,15 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects; + +import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import net.minecraftforge.client.gui.overlay.ForgeGui; + +import java.util.List; + +public class BlockRenderer implements IObjectRenderer { + + @Override + public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java index 4ec9b5304..84874db7a 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java @@ -8,8 +8,8 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix4f; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.CircleObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java index 24400d0fb..aed68019d 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.client.smartglasses.objects; import com.mojang.blaze3d.vertex.PoseStack; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraftforge.client.gui.overlay.ForgeGui; import java.util.List; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java index fb4760a34..f822b1d68 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java @@ -1,8 +1,8 @@ package de.srendi.advancedperipherals.client.smartglasses.objects; import com.mojang.blaze3d.vertex.PoseStack; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.ItemObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import net.minecraft.client.Minecraft; import net.minecraft.world.item.Item; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java index d65c517b1..57c83282f 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java @@ -8,7 +8,7 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix4f; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java index 5d9ab006e..6c595579e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java @@ -1,8 +1,8 @@ package de.srendi.advancedperipherals.client.smartglasses.objects; import com.mojang.blaze3d.vertex.PoseStack; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.TextObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject; import net.minecraft.client.Minecraft; import net.minecraftforge.client.gui.overlay.ForgeGui; diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java index d033c9eb2..ab33587d3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java @@ -3,7 +3,7 @@ import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; import de.srendi.advancedperipherals.common.network.base.IPacket; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java index fb2a1ba68..c96d74506 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java @@ -3,7 +3,7 @@ import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; import de.srendi.advancedperipherals.common.network.base.IPacket; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index 820def72f..69642501f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -112,10 +112,6 @@ public void setItemHandler(@Nullable SmartGlassesItemHandler itemHandler) { this.itemHandler = itemHandler; } - public SmartGlassesItemHandler getItemHandler() { - return this.itemHandler; - } - public void markDirty() { isDirty = true; } @@ -217,14 +213,6 @@ public Map getModules() { return modules; } - @Override - protected void onTerminalChanged() { - super.onTerminalChanged(); - - /*if (entity instanceof ServerPlayer player && entity.isAlive()) { - // Broadcast the terminal to the current player. - }*/ - } @Override protected void onRemoved() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java index 2406ca69b..afa856c32 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java @@ -1,6 +1,6 @@ package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraft.network.FriendlyByteBuf; import java.util.HashMap; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index da5303c91..3bf0ce597 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -6,11 +6,12 @@ import dan200.computercraft.api.lua.MethodResult; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.CircleObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.ItemObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RectangleObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.TextObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject; import net.minecraft.client.Minecraft; public class OverlayGlassesFunctions implements IModuleFunctions { @@ -55,6 +56,14 @@ public final MethodResult createItem(IArguments arguments) throws LuaException { return MethodResult.of(object, "SUCCESS"); } + @LuaFunction + public final MethodResult createBlock(IArguments arguments) throws LuaException { + BlockObject block = new BlockObject(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(block); + + return MethodResult.of(object, "SUCCESS"); + } + @LuaFunction public final MethodResult getObject(IArguments arguments) throws LuaException { int id = arguments.getInt(0); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java index e239fb020..833d62833 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java @@ -9,7 +9,7 @@ import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java new file mode 100644 index 000000000..028477675 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java @@ -0,0 +1,86 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.BlockRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.UUID; + +public class BlockObject extends ThreeDimensionalObject { + public static final int TYPE_ID = 4; + + private final IObjectRenderer renderer = new BlockRenderer(); + + @StringProperty + public String block = "minecraft:air"; + + public BlockObject(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); + reflectivelyMapProperties(arguments); + } + + public BlockObject(UUID player) { + super(player); + } + + @LuaFunction + public void setBlock(String block) { + this.block = block; + getModule().update(this); + } + + @LuaFunction + public final String getBlock() { + return block; + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(TYPE_ID); + super.encode(buffer); + buffer.writeUtf(block); + } + + public static BlockObject decode(FriendlyByteBuf buffer) { + int objectId = buffer.readInt(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + int x = buffer.readInt(); + int y = buffer.readInt(); + int z = buffer.readInt(); + int maxX = buffer.readInt(); + int maxY = buffer.readInt(); + String block = buffer.readUtf(); + + BlockObject clientObject = new BlockObject(player); + clientObject.setId(objectId); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.z = z; + clientObject.maxX = maxX; + clientObject.maxY = maxY; + clientObject.block = block; + + return clientObject; + } + + @Override + public IObjectRenderer getRenderObject() { + return renderer; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java new file mode 100644 index 000000000..9b3ddbd68 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java @@ -0,0 +1,19 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; + +import java.util.UUID; + +public abstract class ThreeDimensionalObject extends RenderableObject { + + public ThreeDimensionalObject(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); + } + + public ThreeDimensionalObject(UUID player) { + super(player); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/CircleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java similarity index 97% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/CircleObject.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java index 1becd1b21..92821db04 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/CircleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim; import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; @@ -60,6 +60,7 @@ public static CircleObject decode(FriendlyByteBuf buffer) { int x = buffer.readInt(); int y = buffer.readInt(); + int z = buffer.readInt(); int maxX = buffer.readInt(); int maxY = buffer.readInt(); int radius = buffer.readInt(); @@ -70,6 +71,7 @@ public static CircleObject decode(FriendlyByteBuf buffer) { clientObject.opacity = opacity; clientObject.x = x; clientObject.y = y; + clientObject.z = z; clientObject.maxX = maxX; clientObject.maxY = maxY; clientObject.radius = radius; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/ItemObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java similarity index 97% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/ItemObject.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java index 192910bb4..7b1fe26f4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/ItemObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim; import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; @@ -56,6 +56,7 @@ public static ItemObject decode(FriendlyByteBuf buffer) { int x = buffer.readInt(); int y = buffer.readInt(); + int z = buffer.readInt(); int maxX = buffer.readInt(); int maxY = buffer.readInt(); String item = buffer.readUtf(); @@ -66,6 +67,7 @@ public static ItemObject decode(FriendlyByteBuf buffer) { clientObject.opacity = opacity; clientObject.x = x; clientObject.y = y; + clientObject.z = z; clientObject.maxX = maxX; clientObject.maxY = maxY; clientObject.item = item; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RectangleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java similarity index 96% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RectangleObject.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java index 553ac0ef8..883dc7b56 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RectangleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim; import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; @@ -50,6 +50,7 @@ public static RectangleObject decode(FriendlyByteBuf buffer) { int x = buffer.readInt(); int y = buffer.readInt(); + int z = buffer.readInt(); int sizeX = buffer.readInt(); int sizeY = buffer.readInt(); @@ -59,6 +60,7 @@ public static RectangleObject decode(FriendlyByteBuf buffer) { clientObject.opacity = opacity; clientObject.x = x; clientObject.y = y; + clientObject.z = z; clientObject.maxX = sizeX; clientObject.maxY = sizeY; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java similarity index 91% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java index 335060695..2e355fa4e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim; import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; @@ -27,6 +27,9 @@ public class RenderableObject extends OverlayObject { @FixedPointNumberProperty(min = -32767, max = 32767) public int y = 0; + @FixedPointNumberProperty(min = -32767, max = 32767) + public int z = 0; + @FixedPointNumberProperty(min = -32767, max = 32767) public int maxX = 0; @@ -108,6 +111,17 @@ public final int getY() { return y; } + @LuaFunction + public final void setZ(int z) { + this.z = z; + getModule().update(this); + } + + @LuaFunction + public final int getZ() { + return z; + } + @Override public void encode(FriendlyByteBuf buffer) { super.encode(buffer); @@ -116,6 +130,7 @@ public void encode(FriendlyByteBuf buffer) { buffer.writeInt(x); buffer.writeInt(y); + buffer.writeInt(z); buffer.writeInt(maxX); buffer.writeInt(maxY); } @@ -131,6 +146,7 @@ public String toString() { ", color=" + color + ", x=" + x + ", y=" + y + + ", z=" + z + ", sizeX=" + maxX + ", sizeY=" + maxY + '}'; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/TextObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java similarity index 97% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/TextObject.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java index fb1f55d9e..149973d11 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/TextObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim; import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; @@ -97,6 +97,7 @@ public static TextObject decode(FriendlyByteBuf buffer) { int x = buffer.readInt(); int y = buffer.readInt(); + int z = buffer.readInt(); int sizeX = buffer.readInt(); int sizeY = buffer.readInt(); String content = buffer.readUtf(); @@ -109,6 +110,7 @@ public static TextObject decode(FriendlyByteBuf buffer) { clientObject.opacity = opacity; clientObject.x = x; clientObject.y = y; + clientObject.z = z; clientObject.maxX = sizeX; clientObject.maxY = sizeY; clientObject.content = content; From a0b66bf819904b8f1e2e9a406b539f9d0a803e51 Mon Sep 17 00:00:00 2001 From: endi Date: Tue, 15 Oct 2024 21:17:07 +0200 Subject: [PATCH 086/188] Some rendering utilities, playing with 3d rendering for the 3d objects for the glasses --- .../client/RenderUtil.java | 129 ++++++++++-------- .../OverlayModuleLevelRenderer.java | 26 +++- .../resources/META-INF/accesstransformer.cfg | 3 +- 3 files changed, 100 insertions(+), 58 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java index ec7c34eb8..a71eaf742 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java @@ -7,7 +7,10 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -21,8 +24,8 @@ public static void drawBox(PoseStack stack, VertexConsumer buffer, float r, floa drawBox(stack, buffer, r, g, b, a, 0, 0, 0, sX, sY, sZ); } - public static void drawVoxelShape(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, VoxelShape shape, float x, float y, float z) { - renderVoxelShape(stack, buffer, r, g, b, a, shape); + public static void drawVoxelShape(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, VoxelShape shape) { + drawVoxelShape(stack, buffer, shape, 0f, 0f, 0f, r, g, b, a); } public static void drawBox(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, float pX, float pY, float pZ, float sX, float sY, float sZ) { @@ -34,16 +37,16 @@ public static void drawBox(PoseStack stack, VertexConsumer buffer, float r, floa pY = pY / 16; pZ = pZ / 16; - drawPlane(stack, buffer, r, g, b, a, Perspective.UP, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Perspective.DOWN, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Perspective.RIGHT, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Perspective.LEFT, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Perspective.FRONT, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Perspective.BACK, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Direction.UP, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Direction.DOWN, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Direction.EAST, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Direction.WEST, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Direction.NORTH, pX, pY, pZ, sX, sY, sZ); + drawPlane(stack, buffer, r, g, b, a, Direction.SOUTH, pX, pY, pZ, sX, sY, sZ); stack.popPose(); } - public static void drawPlane(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, Perspective perspective, float pX, float pY, float pZ, float sX, float sY, float sZ) { + public static void drawPlane(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, Direction perspective, float pX, float pY, float pZ, float sX, float sY, float sZ) { stack.pushPose(); Matrix4f matrix4f = stack.last().pose(); @@ -56,37 +59,37 @@ public static void drawPlane(PoseStack stack, VertexConsumer buffer, float r, fl pZ = pZ + 0.5f; - if (perspective == Perspective.UP) { + if (perspective == Direction.UP) { buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } - if (perspective == Perspective.DOWN) { + if (perspective == Direction.DOWN) { buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); } - if (perspective == Perspective.BACK) { + if (perspective == Direction.SOUTH) { buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); } - if (perspective == Perspective.FRONT) { + if (perspective == Direction.NORTH) { buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); } - if (perspective == Perspective.RIGHT) { + if (perspective == Direction.EAST) { buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } - if (perspective == Perspective.LEFT) { + if (perspective == Direction.WEST) { buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); @@ -95,30 +98,49 @@ public static void drawPlane(PoseStack stack, VertexConsumer buffer, float r, fl stack.popPose(); } - public static void renderVoxelShape(PoseStack poseStack, VertexConsumer consumer, float r, float g, float b, float a, VoxelShape shape) { - List list = shape.toAabbs(); - - for (AABB aabb : list) { - renderShape(poseStack, consumer, r, g, b, a, Shapes.create(aabb)); + public static void drawVoxelShape(PoseStack pPoseStack, VertexConsumer pConsumer, VoxelShape pShape, double pX, double pY, double pZ, float r, float g, float b, float a) { + for (Direction direction : Direction.values()) { + pShape.calculateFace(direction).forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> { + // Get the vertices for the face + float x1 = (float) (minX + pX); + float y1 = (float) (minY + pY); + float z1 = (float) (minZ + pZ); + float x2 = (float) (maxX + pX); + float y2 = (float) (maxY + pY); + float z2 = (float) (maxZ + pZ); + + // Calculate the normal for the face + Vec3i normalVec = direction.getNormal(); + float nx = normalVec.getX(); + float ny = normalVec.getY(); + float nz = normalVec.getZ(); + + PoseStack.Pose pose = pPoseStack.last(); + + //drawPlane(pPoseStack, pConsumer, r,g,b,a, direction, x1, y1, z1, x2, y2, z2); + // Draw the quad (two triangles) + pConsumer.vertex(pose.pose(), x1, y1, z1).color(r, g, b, a).normal(pose.normal(), nx, ny, nz).endVertex(); + pConsumer.vertex(pose.pose(), x2, y1, z1).color(r, g, b, a).normal(pose.normal(), nx, ny, nz).endVertex(); + pConsumer.vertex(pose.pose(), x2, y2, z2).color(r, g, b, a).normal(pose.normal(), nx, ny, nz).endVertex(); + pConsumer.vertex(pose.pose(), x1, y2, z2).color(r, g, b, a).normal(pose.normal(), nx, ny, nz).endVertex(); + }); } - } - - private static void renderShape(PoseStack poseStack, VertexConsumer consumer, float r, float g, float b, float a, VoxelShape shape) { - AtomicInteger perspective = new AtomicInteger(); - shape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> { - minX = minX / 16; - minY = minY / 16; - minZ = minZ / 16; - maxX = maxX / 16; - maxY = maxY / 16; - maxZ = maxZ / 16; + } - if (perspective.get() > 5) - perspective.set(0); - drawPlane(poseStack, consumer, r, g, b, a, Perspective.values()[perspective.getAndIncrement()], (float) minX, (float) minY, (float) minZ, (float) maxX, (float) maxY, (float) maxZ); + public static void drawShape(PoseStack pPoseStack, VertexConsumer pConsumer, VoxelShape pShape, double pX, double pY, double pZ, float r, float g, float b, float a) { + PoseStack.Pose posestack$pose = pPoseStack.last(); + pShape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> { + float f = (float) (maxX - minX); + float f1 = (float) (maxY - minY); + float f2 = (float) (maxZ - minZ); + float f3 = Mth.sqrt(f * f + f1 * f1 + f2 * f2); + f /= f3; + f1 /= f3; + f2 /= f3; + pConsumer.vertex(posestack$pose.pose(), (float) (minX + pX), (float) (minY + pY), (float) (minZ + pZ)).color(r, g, b, a).normal(posestack$pose.normal(), f, f1, f2).endVertex(); + pConsumer.vertex(posestack$pose.pose(), (float) (maxX + pX), (float) (maxY + pY), (float) (maxZ + pZ)).color(r, g, b, a).normal(posestack$pose.normal(), f, f1, f2).endVertex(); }); - perspective.set(0); } public static void drawBox(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { @@ -138,16 +160,16 @@ public static void drawBox(PoseStack stack, VertexConsumer buffer, ResourceLocat pY = pY / 16; pZ = pZ / 16; - drawPlane(stack, buffer, texture, Perspective.UP, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Perspective.DOWN, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Perspective.RIGHT, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Perspective.LEFT, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Perspective.FRONT, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Perspective.BACK, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Direction.UP, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Direction.DOWN, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Direction.EAST, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Direction.WEST, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Direction.NORTH, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(stack, buffer, texture, Direction.SOUTH, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); stack.popPose(); } - public static void drawPlane(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, Perspective perspective, float pX, float pY, float pZ, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { + public static void drawPlane(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, Direction perspective, float pX, float pY, float pZ, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { stack.pushPose(); Matrix4f matrix4f = stack.last().pose(); @@ -166,37 +188,37 @@ public static void drawPlane(PoseStack stack, VertexConsumer buffer, ResourceLoc float v1 = stillTexture.getV(pVOffset); float v2 = stillTexture.getV(pHeight); - if (perspective == Perspective.UP) { + if (perspective == Direction.UP) { buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } - if (perspective == Perspective.DOWN) { + if (perspective == Direction.DOWN) { buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); } - if (perspective == Perspective.BACK) { + if (perspective == Direction.SOUTH) { buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); } - if (perspective == Perspective.FRONT) { + if (perspective == Direction.NORTH) { buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); } - if (perspective == Perspective.RIGHT) { + if (perspective == Direction.EAST) { buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } - if (perspective == Perspective.LEFT) { + if (perspective == Direction.WEST) { buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); @@ -209,11 +231,11 @@ public static void renderVoxelShape(PoseStack poseStack, VertexConsumer consumer List list = shape.toAabbs(); for (AABB aabb : list) { - renderShape(poseStack, consumer, texture, Shapes.create(aabb), pUOffset, pVOffset, pWidth, pHeight); + drawShape(poseStack, consumer, texture, Shapes.create(aabb), pUOffset, pVOffset, pWidth, pHeight); } } - private static void renderShape(PoseStack poseStack, VertexConsumer consumer, ResourceLocation texture, VoxelShape shape, float pUOffset, float pVOffset, float pWidth, float pHeight) { + private static void drawShape(PoseStack poseStack, VertexConsumer consumer, ResourceLocation texture, VoxelShape shape, float pUOffset, float pVOffset, float pWidth, float pHeight) { AtomicInteger perspective = new AtomicInteger(); shape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> { @@ -226,7 +248,7 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Re if (perspective.get() > 5) perspective.set(0); - drawPlane(poseStack, consumer, texture, Perspective.values()[perspective.getAndIncrement()], (float) minX, (float) minY, (float) minZ, (float) maxX, (float) maxY, (float) maxZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(poseStack, consumer, texture, Direction.values()[perspective.getAndIncrement()], (float) minX, (float) minY, (float) minZ, (float) maxX, (float) maxY, (float) maxZ, pUOffset, pVOffset, pWidth, pHeight); }); perspective.set(0); } @@ -247,9 +269,4 @@ public static float getAlpha(int hex) { return (hex >> 24 & 0xFF) / 255.0F; } - public enum Perspective { - - UP, DOWN, RIGHT, LEFT, FRONT, BACK - } - } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java index daaee7948..c5324e84e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java @@ -6,6 +6,7 @@ import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.common.util.EnumColor; @@ -13,8 +14,14 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CandleBlock; +import net.minecraft.world.level.block.LecternBlock; import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -54,7 +61,7 @@ public static void renderLevelState(RenderLevelStageEvent event) { posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); - RenderUtil.drawPlane(posestack, bufferbuilder, colors[0], colors[1], colors[2], 0.8f, RenderUtil.Perspective.UP, 0f, 0.5f, 0f, 0.5f, 0f, 1f); + RenderUtil.drawPlane(posestack, bufferbuilder, colors[0], colors[1], colors[2], 0.8f, Direction.UP, 0f, 0.5f, 0f, 0.5f, 0f, 1f); BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); @@ -69,6 +76,23 @@ public static void renderLevelState(RenderLevelStageEvent event) { BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); + posestack.pushPose(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_NORMAL); + colors = EnumColor.LIGHT_PURPLE.getRgb(); + + blockPos = new BlockPos(0, 190, 2); + posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); + + VoxelShape shape = Block.box(0.0, 0.0, 0.0, 16.0, 18.0, 16.0); + RenderSystem.setShaderColor(colors[0], colors[1], colors[2], 0.6f); + + RenderUtil.drawVoxelShape(posestack, bufferbuilder, shape, 0f, 0f, 0f, colors[0], colors[1], colors[2], 0.6f); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + + BufferUploader.drawWithShader(bufferbuilder.end()); + posestack.popPose(); + } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index dc4a3126c..ceffd3bc5 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -3,4 +3,5 @@ public net.minecraft.world.level.block.entity.BeaconBlockEntity f_58653_ public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210559_ # rawTemplates public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210560_ # templates protected net.minecraft.world.level.ClipContext f_45686_ # collisionContext -public net.minecraft.world.level.block.entity.BeaconBlockEntity f_58650_ # levels \ No newline at end of file +public net.minecraft.world.level.block.entity.BeaconBlockEntity f_58650_ # levels +public net.minecraft.world.phys.shapes.VoxelShape m_83294_(Lnet/minecraft/core/Direction;)Lnet/minecraft/world/phys/shapes/VoxelShape; # calculateFace \ No newline at end of file From c7ede95b271934cee010b790202622ce1f62e332 Mon Sep 17 00:00:00 2001 From: endi Date: Mon, 21 Oct 2024 15:12:42 +0200 Subject: [PATCH 087/188] BlockRenderer --- .../OverlayModuleLevelRenderer.java | 44 +++++++++++++------ .../smartglasses/OverlayModuleOverlay.java | 6 ++- .../smartglasses/objects/IObjectRenderer.java | 9 ---- .../objects/threedim/BlockRenderer.java | 40 +++++++++++++++++ .../threedim/IThreeDObjectRenderer.java | 17 +++++++ .../objects/{ => twodim}/CircleRenderer.java | 4 +- .../ITwoDObjectRenderer.java} | 9 ++-- .../objects/{ => twodim}/ItemRenderer.java | 4 +- .../{ => twodim}/RectangleRenderer.java | 4 +- .../objects/{ => twodim}/TextRenderer.java | 4 +- .../objects/three_dim/BlockObject.java | 3 +- .../overlay/objects/two_dim/CircleObject.java | 3 +- .../overlay/objects/two_dim/ItemObject.java | 3 +- .../objects/two_dim/RectangleObject.java | 3 +- .../objects/two_dim/RenderableObject.java | 1 + .../overlay/objects/two_dim/TextObject.java | 3 +- 16 files changed, 115 insertions(+), 42 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/IThreeDObjectRenderer.java rename src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/{ => twodim}/CircleRenderer.java (97%) rename src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/{BlockRenderer.java => twodim/ITwoDObjectRenderer.java} (50%) rename src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/{ => twodim}/ItemRenderer.java (94%) rename src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/{ => twodim}/RectangleRenderer.java (96%) rename src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/{ => twodim}/TextRenderer.java (94%) diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java index c5324e84e..d9a7e1bdc 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java @@ -9,6 +9,9 @@ import com.mojang.blaze3d.vertex.VertexFormat; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.RenderUtil; +import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import de.srendi.advancedperipherals.common.util.EnumColor; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; @@ -17,16 +20,18 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.CandleBlock; -import net.minecraft.world.level.block.LecternBlock; import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + @Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE, modid = AdvancedPeripherals.MOD_ID) public class OverlayModuleLevelRenderer { @@ -37,6 +42,29 @@ public static void renderLevelState(RenderLevelStageEvent event) { BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) { + Map, List> batches = new HashMap<>(); + + for (RenderableObject object : OverlayObjectHolder.getObjects()) { + if (!object.isEnabled() || object.getRenderObject() instanceof ITwoDObjectRenderer) + continue; + + Class objectClass = object.getClass(); + + if (batches.containsKey(objectClass)) { + batches.get(objectClass).add(object); + continue; + } + + List newBatchArray = new ArrayList<>(); + newBatchArray.add(object); + batches.put(objectClass, newBatchArray); + } + + for (List batch : batches.values()) { + ((IThreeDObjectRenderer) batch.get(0).getRenderObject()).renderBatch(batch, event, posestack, view, bufferbuilder); + } + + bufferbuilder.begin(RenderType.solid().mode(), DefaultVertexFormat.BLOCK); BlockPos blockPos = new BlockPos(0, 190, 0); @@ -63,16 +91,6 @@ public static void renderLevelState(RenderLevelStageEvent event) { RenderUtil.drawPlane(posestack, bufferbuilder, colors[0], colors[1], colors[2], 0.8f, Direction.UP, 0f, 0.5f, 0f, 0.5f, 0f, 1f); - BufferUploader.drawWithShader(bufferbuilder.end()); - posestack.popPose(); - posestack.pushPose(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); - bufferbuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL); - - blockPos = new BlockPos(5, 190, 0); - posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); - - RenderUtil.drawBox(posestack, bufferbuilder, colors[0], colors[1], colors[2], 0.8f, 16f, 16f, 12f); BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java index 19eb647b1..8d6598dca 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java @@ -1,6 +1,8 @@ package de.srendi.advancedperipherals.client.smartglasses; import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; @@ -20,7 +22,7 @@ public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int scr Map, List> batches = new HashMap<>(); for (RenderableObject object : OverlayObjectHolder.getObjects()) { - if (!object.isEnabled()) + if (!object.isEnabled() || !(object.getRenderObject() instanceof ITwoDObjectRenderer)) continue; Class objectClass = object.getClass(); @@ -36,7 +38,7 @@ public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int scr } for (List batch : batches.values()) { - batch.get(0).getRenderObject().renderBatch(batch, gui, poseStack, partialTick, screenWidth, screenHeight); + ((ITwoDObjectRenderer) batch.get(0).getRenderObject()).renderBatch(batch, gui, poseStack, partialTick, screenWidth, screenHeight); } poseStack.popPose(); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java index aed68019d..e92129ac1 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java @@ -1,13 +1,4 @@ package de.srendi.advancedperipherals.client.smartglasses.objects; -import com.mojang.blaze3d.vertex.PoseStack; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; -import net.minecraftforge.client.gui.overlay.ForgeGui; - -import java.util.List; - public interface IObjectRenderer { - - void renderBatch(List object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight); - } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java new file mode 100644 index 000000000..47b772eb7 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java @@ -0,0 +1,40 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects.threedim; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.client.RenderUtil; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.event.RenderLevelStageEvent; + +import java.util.List; + +public class BlockRenderer implements IThreeDObjectRenderer { + + @Override + public void renderBatch(List objects, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) { + poseStack.pushPose(); + bufferBuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL); + + for (RenderableObject renderableObject : objects) { + poseStack.pushPose(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + float alpha = renderableObject.opacity; + float red = (float) (renderableObject.color >> 16 & 255) / 255.0F; + float green = (float) (renderableObject.color >> 8 & 255) / 255.0F; + float blue = (float) (renderableObject.color & 255) / 255.0F; + + poseStack.translate(-view.x +renderableObject.getX(), -view.y + renderableObject.getY(), -view.z + renderableObject.getZ()); + + RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, renderableObject.getMaxX(), renderableObject.getMaxY(), renderableObject.getMaxX()); + poseStack.popPose(); + } + BufferUploader.drawWithShader(bufferBuilder.end()); + poseStack.popPose(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/IThreeDObjectRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/IThreeDObjectRenderer.java new file mode 100644 index 000000000..7845a5003 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/IThreeDObjectRenderer.java @@ -0,0 +1,17 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects.threedim; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import net.minecraftforge.client.gui.overlay.ForgeGui; + +import java.util.List; + +public interface IThreeDObjectRenderer extends IObjectRenderer { + + void renderBatch(List object, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder); + +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java similarity index 97% rename from src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java rename to src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java index 84874db7a..42f3d9839 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/CircleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.client.smartglasses.objects; +package de.srendi.advancedperipherals.client.smartglasses.objects.twodim; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; @@ -15,7 +15,7 @@ import java.util.List; -public class CircleRenderer implements IObjectRenderer { +public class CircleRenderer implements ITwoDObjectRenderer { @Override public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/BlockRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ITwoDObjectRenderer.java similarity index 50% rename from src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/BlockRenderer.java rename to src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ITwoDObjectRenderer.java index f2be38c11..230edbca7 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/BlockRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ITwoDObjectRenderer.java @@ -1,15 +1,14 @@ -package de.srendi.advancedperipherals.client.smartglasses.objects; +package de.srendi.advancedperipherals.client.smartglasses.objects.twodim; import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraftforge.client.gui.overlay.ForgeGui; import java.util.List; -public class BlockRenderer implements IObjectRenderer { +public interface ITwoDObjectRenderer extends IObjectRenderer { - @Override - public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + void renderBatch(List object, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight); - } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java similarity index 94% rename from src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java rename to src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java index f822b1d68..e67483061 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/ItemRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.client.smartglasses.objects; +package de.srendi.advancedperipherals.client.smartglasses.objects.twodim; import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; @@ -12,7 +12,7 @@ import java.util.List; -public class ItemRenderer implements IObjectRenderer { +public class ItemRenderer implements ITwoDObjectRenderer { @Override public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java similarity index 96% rename from src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java rename to src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java index 57c83282f..d0521ede1 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/RectangleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.client.smartglasses.objects; +package de.srendi.advancedperipherals.client.smartglasses.objects.twodim; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; @@ -14,7 +14,7 @@ import java.util.List; -public class RectangleRenderer implements IObjectRenderer { +public class RectangleRenderer implements ITwoDObjectRenderer { @Override public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java similarity index 94% rename from src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java rename to src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java index 6c595579e..fdd376415 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.client.smartglasses.objects; +package de.srendi.advancedperipherals.client.smartglasses.objects.twodim; import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; @@ -8,7 +8,7 @@ import java.util.List; -public class TextRenderer implements IObjectRenderer { +public class TextRenderer implements ITwoDObjectRenderer { @Override public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java index 028477675..5f512c3f9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java @@ -4,8 +4,9 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.client.smartglasses.objects.BlockRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.BlockRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java index 92821db04..aa799a7a8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java @@ -5,7 +5,8 @@ import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.CircleRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.CircleRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java index 7b1fe26f4..76a7f8adc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java @@ -4,7 +4,8 @@ import dan200.computercraft.api.lua.LuaException; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.ItemRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ItemRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java index 883dc7b56..4ff0870dc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java @@ -4,7 +4,8 @@ import dan200.computercraft.api.lua.LuaException; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.RectangleRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.RectangleRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java index 2e355fa4e..2a4948c55 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java @@ -4,6 +4,7 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java index 149973d11..dd25a551d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java @@ -5,7 +5,8 @@ import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.TextRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.TextRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; From 0b2fcde5832f33f8f434c6fc3ef99ccd36f5f148 Mon Sep 17 00:00:00 2001 From: endi Date: Fri, 25 Oct 2024 10:42:47 +0200 Subject: [PATCH 088/188] Basic Box and Block renderer with depth test and culling configurable We couldn't use batching for this. We want to change the color, opacity and depthtest/culling for every object and one render call would not support different settings for each object --- .../client/RenderUtil.java | 6 +- .../OverlayModuleLevelRenderer.java | 38 +++------- .../smartglasses/OverlayModuleOverlay.java | 1 - .../smartglasses/OverlayObjectHolder.java | 2 + .../objects/threedim/BlockRenderer.java | 40 +++++++--- .../objects/threedim/BoxRenderer.java | 44 +++++++++++ .../threedim/IThreeDObjectRenderer.java | 19 ++++- .../objects/twodim/ItemRenderer.java | 4 +- .../overlay/OverlayGlassesFunctions.java | 14 ++++ .../objects/three_dim/BlockObject.java | 14 +++- .../overlay/objects/three_dim/BoxObject.java | 74 +++++++++++++++++++ .../three_dim/ThreeDimensionalObject.java | 40 ++++++++++ .../overlay/objects/two_dim/CircleObject.java | 1 - .../overlay/objects/two_dim/ItemObject.java | 1 - .../objects/two_dim/RectangleObject.java | 1 - .../objects/two_dim/RenderableObject.java | 17 ++++- .../overlay/objects/two_dim/TextObject.java | 1 - .../common/util/RegistryUtil.java | 25 +++++++ .../common/util/inventory/FluidFilter.java | 3 +- .../common/util/inventory/GenericFilter.java | 5 +- .../common/util/inventory/ItemFilter.java | 3 +- .../common/util/inventory/ItemUtil.java | 18 ----- 22 files changed, 297 insertions(+), 74 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/RegistryUtil.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java index a71eaf742..8232f1c90 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java @@ -129,7 +129,7 @@ public static void drawVoxelShape(PoseStack pPoseStack, VertexConsumer pConsumer } public static void drawShape(PoseStack pPoseStack, VertexConsumer pConsumer, VoxelShape pShape, double pX, double pY, double pZ, float r, float g, float b, float a) { - PoseStack.Pose posestack$pose = pPoseStack.last(); + PoseStack.Pose pose = pPoseStack.last(); pShape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> { float f = (float) (maxX - minX); float f1 = (float) (maxY - minY); @@ -138,8 +138,8 @@ public static void drawShape(PoseStack pPoseStack, VertexConsumer pConsumer, Vox f /= f3; f1 /= f3; f2 /= f3; - pConsumer.vertex(posestack$pose.pose(), (float) (minX + pX), (float) (minY + pY), (float) (minZ + pZ)).color(r, g, b, a).normal(posestack$pose.normal(), f, f1, f2).endVertex(); - pConsumer.vertex(posestack$pose.pose(), (float) (maxX + pX), (float) (maxY + pY), (float) (maxZ + pZ)).color(r, g, b, a).normal(posestack$pose.normal(), f, f1, f2).endVertex(); + pConsumer.vertex(pose.pose(), (float) (minX + pX), (float) (minY + pY), (float) (minZ + pZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex(); + pConsumer.vertex(pose.pose(), (float) (maxX + pX), (float) (maxY + pY), (float) (maxZ + pZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex(); }); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java index d9a7e1bdc..1e325bd08 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java @@ -10,7 +10,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import de.srendi.advancedperipherals.common.util.EnumColor; import net.minecraft.client.Minecraft; @@ -19,7 +19,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; @@ -42,46 +41,33 @@ public static void renderLevelState(RenderLevelStageEvent event) { BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) { - Map, List> batches = new HashMap<>(); + Map, List> batches = new HashMap<>(); for (RenderableObject object : OverlayObjectHolder.getObjects()) { - if (!object.isEnabled() || object.getRenderObject() instanceof ITwoDObjectRenderer) + if (!object.isEnabled() || !(object.getRenderObject() instanceof IThreeDObjectRenderer)) continue; - Class objectClass = object.getClass(); + ThreeDimensionalObject threeDimObject = (ThreeDimensionalObject) object; + + Class objectClass = threeDimObject.getClass(); if (batches.containsKey(objectClass)) { - batches.get(objectClass).add(object); + batches.get(objectClass).add(threeDimObject); continue; } - List newBatchArray = new ArrayList<>(); - newBatchArray.add(object); + List newBatchArray = new ArrayList<>(); + newBatchArray.add(threeDimObject); batches.put(objectClass, newBatchArray); } - for (List batch : batches.values()) { + for (List batch : batches.values()) { ((IThreeDObjectRenderer) batch.get(0).getRenderObject()).renderBatch(batch, event, posestack, view, bufferbuilder); } + BlockPos blockPos = new BlockPos(2, 190, 0); - bufferbuilder.begin(RenderType.solid().mode(), DefaultVertexFormat.BLOCK); - BlockPos blockPos = new BlockPos(0, 190, 0); - - posestack.pushPose(); - posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); - float[] colors = EnumColor.GREEN.getRgb(); - RenderSystem.setShaderColor(colors[0], colors[1], colors[2], 0.8f); - - Minecraft.getInstance().getBlockRenderer().renderBatched(Blocks.STONE.defaultBlockState(), blockPos, event.getCamera().getEntity().level, posestack, bufferbuilder, false, event.getCamera().getEntity().level.random); - BufferUploader.drawWithShader(bufferbuilder.end()); - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - - posestack.popPose(); - - blockPos = new BlockPos(2, 190, 0); - - colors = EnumColor.DARK_PURPLE.getRgb(); + float[] colors = EnumColor.DARK_PURPLE.getRgb(); RenderSystem.setShader(GameRenderer::getPositionColorShader); bufferbuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java index 8d6598dca..da7ec2ecc 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java @@ -1,7 +1,6 @@ package de.srendi.advancedperipherals.client.smartglasses; import com.mojang.blaze3d.vertex.PoseStack; -import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraftforge.client.gui.overlay.ForgeGui; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 9c4f01440..7bd0888ce 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -2,6 +2,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; @@ -47,6 +48,7 @@ public static void registerDecodeObjects() { ObjectDecodeRegistry.register(TextObject.TYPE_ID, TextObject::decode); ObjectDecodeRegistry.register(ItemObject.TYPE_ID, ItemObject::decode); + ObjectDecodeRegistry.register(BoxObject.TYPE_ID, BoxObject::decode); ObjectDecodeRegistry.register(BlockObject.TYPE_ID, BlockObject::decode); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java index 47b772eb7..4276c39c0 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java @@ -5,36 +5,58 @@ import com.mojang.blaze3d.vertex.BufferUploader; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; -import de.srendi.advancedperipherals.client.RenderUtil; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; +import de.srendi.advancedperipherals.common.util.RegistryUtil; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.event.RenderLevelStageEvent; +import net.minecraftforge.registries.ForgeRegistries; import java.util.List; public class BlockRenderer implements IThreeDObjectRenderer { @Override - public void renderBatch(List objects, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) { + public void renderBatch(List batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) { poseStack.pushPose(); - bufferBuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL); - for (RenderableObject renderableObject : objects) { + for (ThreeDimensionalObject renderableObject : batch) { poseStack.pushPose(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); + onPreRender(renderableObject); + + bufferBuilder.begin(RenderType.solid().mode(), DefaultVertexFormat.BLOCK); + + BlockObject block = (BlockObject) renderableObject; + + BlockPos blockPos = new BlockPos(renderableObject.getX(), renderableObject.getY(), renderableObject.getZ()); + + poseStack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); float alpha = renderableObject.opacity; float red = (float) (renderableObject.color >> 16 & 255) / 255.0F; float green = (float) (renderableObject.color >> 8 & 255) / 255.0F; float blue = (float) (renderableObject.color & 255) / 255.0F; - poseStack.translate(-view.x +renderableObject.getX(), -view.y + renderableObject.getY(), -view.z + renderableObject.getZ()); + RenderSystem.setShader(GameRenderer::getBlockShader); + RenderSystem.setShaderColor(red, green, blue, alpha); + + Block blockToRender = RegistryUtil.getRegistryEntry(block.block, ForgeRegistries.BLOCKS); + + if (blockToRender != null) + Minecraft.getInstance().getBlockRenderer().renderBatched(blockToRender.defaultBlockState(), blockPos, event.getCamera().getEntity().level, poseStack, bufferBuilder, false, event.getCamera().getEntity().level.random); - RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, renderableObject.getMaxX(), renderableObject.getMaxY(), renderableObject.getMaxX()); poseStack.popPose(); + BufferUploader.drawWithShader(bufferBuilder.end()); + onPostRender(renderableObject); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); } - BufferUploader.drawWithShader(bufferBuilder.end()); + + poseStack.popPose(); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java new file mode 100644 index 000000000..235ac2227 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java @@ -0,0 +1,44 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects.threedim; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import de.srendi.advancedperipherals.client.RenderUtil; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.event.RenderLevelStageEvent; + +import java.util.List; + +public class BoxRenderer implements IThreeDObjectRenderer { + + @Override + public void renderBatch(List batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) { + poseStack.pushPose(); + + for (ThreeDimensionalObject renderableObject : batch) { + poseStack.pushPose(); + onPreRender(renderableObject); + bufferBuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL); + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + float alpha = renderableObject.opacity; + float red = (float) (renderableObject.color >> 16 & 255) / 255.0F; + float green = (float) (renderableObject.color >> 8 & 255) / 255.0F; + float blue = (float) (renderableObject.color & 255) / 255.0F; + + poseStack.translate(-view.x + renderableObject.getX(), -view.y + renderableObject.getY(), -view.z + renderableObject.getZ()); + RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, renderableObject.getMaxX(), renderableObject.getMaxY(), renderableObject.getMaxX()); + BufferUploader.drawWithShader(bufferBuilder.end()); + onPostRender(renderableObject); + + poseStack.popPose(); + } + + poseStack.popPose(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/IThreeDObjectRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/IThreeDObjectRenderer.java index 7845a5003..119277f6f 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/IThreeDObjectRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/IThreeDObjectRenderer.java @@ -1,17 +1,30 @@ package de.srendi.advancedperipherals.client.smartglasses.objects.threedim; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.event.RenderLevelStageEvent; -import net.minecraftforge.client.gui.overlay.ForgeGui; import java.util.List; public interface IThreeDObjectRenderer extends IObjectRenderer { - void renderBatch(List object, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder); + void renderBatch(List batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder); + default void onPostRender(ThreeDimensionalObject object) { + if (object.disableCulling) + RenderSystem.enableCull(); + if (object.disableDepthTest) + RenderSystem.enableDepthTest(); + } + + default void onPreRender(ThreeDimensionalObject object) { + if (object.disableCulling) + RenderSystem.disableCull(); + if (object.disableDepthTest) + RenderSystem.disableDepthTest(); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java index e67483061..cf3913fbd 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java @@ -3,7 +3,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; -import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; +import de.srendi.advancedperipherals.common.util.RegistryUtil; import net.minecraft.client.Minecraft; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -19,7 +19,7 @@ public void renderBatch(List objects, ForgeGui gui, PoseStack Minecraft minecraft = Minecraft.getInstance(); for (RenderableObject object : objects) { - Item renderItem = ItemUtil.getRegistryEntry(((ItemObject) object).item, ForgeRegistries.ITEMS); + Item renderItem = RegistryUtil.getRegistryEntry(((ItemObject) object).item, ForgeRegistries.ITEMS); if (renderItem == null) continue; minecraft.getItemRenderer().renderGuiItem(new ItemStack(renderItem), object.x, object.y); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index 3bf0ce597..2314856b7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -7,6 +7,7 @@ import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; @@ -64,6 +65,14 @@ public final MethodResult createBlock(IArguments arguments) throws LuaException return MethodResult.of(object, "SUCCESS"); } + @LuaFunction + public final MethodResult createBox(IArguments arguments) throws LuaException { + BoxObject block = new BoxObject(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(block); + + return MethodResult.of(object, "SUCCESS"); + } + @LuaFunction public final MethodResult getObject(IArguments arguments) throws LuaException { int id = arguments.getInt(0); @@ -91,6 +100,11 @@ public final MethodResult getSize() { return MethodResult.of(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight()); } + @LuaFunction + public final MethodResult getCoords() { + return MethodResult.of(access.getEntity().position().x, access.getEntity().position().y, access.getEntity().position().z); + } + @LuaFunction public final MethodResult update() { return MethodResult.of(overlayModule.bulkUpdate()); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java index 5f512c3f9..ba09b0cb5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java @@ -6,7 +6,6 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.BlockRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; import net.minecraft.network.FriendlyByteBuf; @@ -14,7 +13,7 @@ import java.util.UUID; public class BlockObject extends ThreeDimensionalObject { - public static final int TYPE_ID = 4; + public static final int TYPE_ID = 5; private final IObjectRenderer renderer = new BlockRenderer(); @@ -31,7 +30,7 @@ public BlockObject(UUID player) { } @LuaFunction - public void setBlock(String block) { + public final void setBlock(String block) { this.block = block; getModule().update(this); } @@ -41,6 +40,7 @@ public final String getBlock() { return block; } + @Override public void encode(FriendlyByteBuf buffer) { buffer.writeInt(TYPE_ID); @@ -64,6 +64,11 @@ public static BlockObject decode(FriendlyByteBuf buffer) { int z = buffer.readInt(); int maxX = buffer.readInt(); int maxY = buffer.readInt(); + int maxZ = buffer.readInt(); + + boolean disableDepthTest = buffer.readBoolean(); + boolean disableCulling = buffer.readBoolean(); + String block = buffer.readUtf(); BlockObject clientObject = new BlockObject(player); @@ -75,6 +80,9 @@ public static BlockObject decode(FriendlyByteBuf buffer) { clientObject.z = z; clientObject.maxX = maxX; clientObject.maxY = maxY; + clientObject.maxZ = maxZ; + clientObject.disableDepthTest = disableDepthTest; + clientObject.disableCulling = disableCulling; clientObject.block = block; return clientObject; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java new file mode 100644 index 000000000..796531ee1 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java @@ -0,0 +1,74 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.BoxRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.UUID; + +public class BoxObject extends ThreeDimensionalObject { + public static final int TYPE_ID = 4; + + private final IObjectRenderer renderer = new BoxRenderer(); + + public BoxObject(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); + reflectivelyMapProperties(arguments); + } + + public BoxObject(UUID player) { + super(player); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(TYPE_ID); + super.encode(buffer); + } + + public static BoxObject decode(FriendlyByteBuf buffer) { + int objectId = buffer.readInt(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + int x = buffer.readInt(); + int y = buffer.readInt(); + int z = buffer.readInt(); + int maxX = buffer.readInt(); + int maxY = buffer.readInt(); + int maxZ = buffer.readInt(); + + boolean disableDepthTest = buffer.readBoolean(); + boolean disableCulling = buffer.readBoolean(); + + BoxObject clientObject = new BoxObject(player); + clientObject.setId(objectId); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.z = z; + clientObject.maxX = maxX; + clientObject.maxY = maxY; + clientObject.maxZ = maxZ; + clientObject.disableDepthTest = disableDepthTest; + clientObject.disableCulling = disableCulling; + + return clientObject; + } + + @Override + public IObjectRenderer getRenderObject() { + return renderer; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java index 9b3ddbd68..efdd161ce 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java @@ -2,13 +2,22 @@ import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; +import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; public abstract class ThreeDimensionalObject extends RenderableObject { + @BooleanProperty + public boolean disableDepthTest = false; + + @BooleanProperty + public boolean disableCulling = false; + public ThreeDimensionalObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); } @@ -16,4 +25,35 @@ public ThreeDimensionalObject(OverlayModule module, IArguments arguments) throws public ThreeDimensionalObject(UUID player) { super(player); } + + @LuaFunction + public final void setDepthTest(boolean depthTest) { + disableDepthTest = depthTest; + getModule().update(this); + } + + @LuaFunction + public final boolean getDepthTest() { + return disableDepthTest; + } + + @LuaFunction + public final void setCulling(boolean culling) { + disableCulling = culling; + getModule().update(this); + } + + @LuaFunction + public final boolean getCulling() { + return disableCulling; + } + + @Override + public void encode(FriendlyByteBuf buffer) { + super.encode(buffer); + + buffer.writeBoolean(disableDepthTest); + buffer.writeBoolean(disableCulling); + } + } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java index aa799a7a8..f535bb1e8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java @@ -5,7 +5,6 @@ import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.CircleRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java index 76a7f8adc..7a54bbc63 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java @@ -4,7 +4,6 @@ import dan200.computercraft.api.lua.LuaException; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ItemRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java index 4ff0870dc..6da199e43 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java @@ -4,7 +4,6 @@ import dan200.computercraft.api.lua.LuaException; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.RectangleRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java index 2a4948c55..ca2f6edbe 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java @@ -4,7 +4,6 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; @@ -37,6 +36,9 @@ public class RenderableObject extends OverlayObject { @FixedPointNumberProperty(min = -32767, max = 32767) public int maxY = 0; + @FixedPointNumberProperty(min = -32767, max = 32767) + public int maxZ = 0; + public RenderableObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); reflectivelyMapProperties(arguments); @@ -90,6 +92,17 @@ public final int getMaxY() { return maxY; } + @LuaFunction + public final void setMaxZ(int maxZ) { + this.maxZ = maxZ; + getModule().update(this); + } + + @LuaFunction + public final int getMaxZ() { + return maxZ; + } + @LuaFunction public final void setX(int x) { this.x = x; @@ -134,6 +147,7 @@ public void encode(FriendlyByteBuf buffer) { buffer.writeInt(z); buffer.writeInt(maxX); buffer.writeInt(maxY); + buffer.writeInt(maxZ); } public IObjectRenderer getRenderObject() { @@ -150,6 +164,7 @@ public String toString() { ", z=" + z + ", sizeX=" + maxX + ", sizeY=" + maxY + + ", sizeZ=" + maxZ + '}'; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java index dd25a551d..6d21b175d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java @@ -5,7 +5,6 @@ import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.TextRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/RegistryUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/RegistryUtil.java new file mode 100644 index 000000000..e28937168 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/RegistryUtil.java @@ -0,0 +1,25 @@ +package de.srendi.advancedperipherals.common.util; + +import net.minecraft.ResourceLocationException; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.IForgeRegistry; + +public class RegistryUtil { + + public static T getRegistryEntry(String name, IForgeRegistry forgeRegistry) { + ResourceLocation location; + try { + location = new ResourceLocation(name); + } catch (ResourceLocationException ex) { + location = null; + } + + T value; + if (location != null && forgeRegistry.containsKey(location) && (value = forgeRegistry.getValue(location)) != null) { + return value; + } else { + return null; + } + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java index 3e4a9046b..95d3884f5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java @@ -7,6 +7,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.NBTUtil; import de.srendi.advancedperipherals.common.util.Pair; +import de.srendi.advancedperipherals.common.util.RegistryUtil; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -40,7 +41,7 @@ public static Pair parse(Map item) { String name = TableHelper.getStringField(item, "name"); if (name.startsWith("#")) { fluidFilter.tag = TagKey.create(Registry.FLUID_REGISTRY, new ResourceLocation(name.substring(1))); - } else if ((fluidFilter.fluid = ItemUtil.getRegistryEntry(name, ForgeRegistries.FLUIDS)) == null) { + } else if ((fluidFilter.fluid = RegistryUtil.getRegistryEntry(name, ForgeRegistries.FLUIDS)) == null) { return Pair.of(null, "FLUID_NOT_FOUND"); } } catch (LuaException luaException) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java index 1667ed9ba..df8484325 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/GenericFilter.java @@ -2,6 +2,7 @@ import appeng.api.stacks.GenericStack; import de.srendi.advancedperipherals.common.util.Pair; +import de.srendi.advancedperipherals.common.util.RegistryUtil; import net.minecraftforge.registries.ForgeRegistries; import java.util.Map; @@ -37,9 +38,9 @@ public static Pair, String> parseGeneric(Map ra String name = rawFilter.get("name").toString(); // Let's check in which registry this thing is - if (ItemUtil.getRegistryEntry(name, ForgeRegistries.ITEMS) != null) { + if (RegistryUtil.getRegistryEntry(name, ForgeRegistries.ITEMS) != null) { return ItemFilter.parse(rawFilter); - } else if (ItemUtil.getRegistryEntry(name, ForgeRegistries.FLUIDS) != null) { + } else if (RegistryUtil.getRegistryEntry(name, ForgeRegistries.FLUIDS) != null) { return FluidFilter.parse(rawFilter); } else { // If the name is in neither of the registries, we will just return an empty filter diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java index e1b74aa0a..5b7cf0e29 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java @@ -7,6 +7,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.NBTUtil; import de.srendi.advancedperipherals.common.util.Pair; +import de.srendi.advancedperipherals.common.util.RegistryUtil; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -42,7 +43,7 @@ public static Pair parse(Map item) { String name = TableHelper.getStringField(item, "name"); if (name.startsWith("#")) { itemFilter.tag = TagKey.create(Registry.ITEM_REGISTRY, new ResourceLocation(name.substring(1))); - } else if ((itemFilter.item = ItemUtil.getRegistryEntry(name, ForgeRegistries.ITEMS)) == null) { + } else if ((itemFilter.item = RegistryUtil.getRegistryEntry(name, ForgeRegistries.ITEMS)) == null) { return Pair.of(null, "ITEM_NOT_FOUND"); } } catch (LuaException luaException) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java index fbd61f7f2..008d4d928 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java @@ -3,13 +3,11 @@ import dan200.computercraft.shared.Registry; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.StringUtil; -import net.minecraft.ResourceLocationException; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.IForgeRegistry; import org.apache.logging.log4j.Level; import java.nio.charset.StandardCharsets; @@ -26,22 +24,6 @@ public class ItemUtil { public static final Item POCKET_NORMAL = Registry.ModItems.POCKET_COMPUTER_NORMAL.get(); public static final Item POCKET_ADVANCED = Registry.ModItems.POCKET_COMPUTER_ADVANCED.get(); - public static T getRegistryEntry(String name, IForgeRegistry forgeRegistry) { - ResourceLocation location; - try { - location = new ResourceLocation(name); - } catch (ResourceLocationException ex) { - location = null; - } - - T value; - if (location != null && forgeRegistry.containsKey(location) && (value = forgeRegistry.getValue(location)) != null) { - return value; - } else { - return null; - } - } - /** * Fingerprints are MD5 hashes generated out of the nbt tag, the registry name and the display name from item stacks * Used to filter inventory specific operations. {@link de.srendi.advancedperipherals.common.addons.computercraft.peripheral.InventoryManagerPeripheral} From 07d14d84504d50aefd5bf2f454204cd914835551 Mon Sep 17 00:00:00 2001 From: Srendi Date: Mon, 4 Nov 2024 11:14:35 +0100 Subject: [PATCH 089/188] Fixed overlay object sync packets --- .../modules/overlay/objects/two_dim/CircleObject.java | 2 ++ .../modules/overlay/objects/two_dim/ItemObject.java | 2 ++ .../overlay/objects/two_dim/RectangleObject.java | 10 ++++++---- .../modules/overlay/objects/two_dim/TextObject.java | 10 ++++++---- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java index f535bb1e8..99600bd0c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java @@ -63,6 +63,7 @@ public static CircleObject decode(FriendlyByteBuf buffer) { int z = buffer.readInt(); int maxX = buffer.readInt(); int maxY = buffer.readInt(); + int maxZ = buffer.readInt(); int radius = buffer.readInt(); CircleObject clientObject = new CircleObject(player); @@ -74,6 +75,7 @@ public static CircleObject decode(FriendlyByteBuf buffer) { clientObject.z = z; clientObject.maxX = maxX; clientObject.maxY = maxY; + clientObject.maxZ = maxZ; clientObject.radius = radius; return clientObject; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java index 7a54bbc63..85a576e0b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java @@ -59,6 +59,7 @@ public static ItemObject decode(FriendlyByteBuf buffer) { int z = buffer.readInt(); int maxX = buffer.readInt(); int maxY = buffer.readInt(); + int maxZ = buffer.readInt(); String item = buffer.readUtf(); ItemObject clientObject = new ItemObject(player); @@ -70,6 +71,7 @@ public static ItemObject decode(FriendlyByteBuf buffer) { clientObject.z = z; clientObject.maxX = maxX; clientObject.maxY = maxY; + clientObject.maxZ = maxZ; clientObject.item = item; return clientObject; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java index 6da199e43..6e13ae990 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java @@ -51,8 +51,9 @@ public static RectangleObject decode(FriendlyByteBuf buffer) { int x = buffer.readInt(); int y = buffer.readInt(); int z = buffer.readInt(); - int sizeX = buffer.readInt(); - int sizeY = buffer.readInt(); + int maxX = buffer.readInt(); + int maxY = buffer.readInt(); + int maxZ = buffer.readInt(); RectangleObject clientObject = new RectangleObject(player); clientObject.setId(objectId); @@ -61,8 +62,9 @@ public static RectangleObject decode(FriendlyByteBuf buffer) { clientObject.x = x; clientObject.y = y; clientObject.z = z; - clientObject.maxX = sizeX; - clientObject.maxY = sizeY; + clientObject.maxX = maxX; + clientObject.maxY = maxY; + clientObject.maxZ = maxZ; return clientObject; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java index 6d21b175d..7e50e1735 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java @@ -98,8 +98,9 @@ public static TextObject decode(FriendlyByteBuf buffer) { int x = buffer.readInt(); int y = buffer.readInt(); int z = buffer.readInt(); - int sizeX = buffer.readInt(); - int sizeY = buffer.readInt(); + int maxX = buffer.readInt(); + int maxY = buffer.readInt(); + int maxZ = buffer.readInt(); String content = buffer.readUtf(); float fontSize = buffer.readFloat(); boolean shadow = buffer.readBoolean(); @@ -111,8 +112,9 @@ public static TextObject decode(FriendlyByteBuf buffer) { clientObject.x = x; clientObject.y = y; clientObject.z = z; - clientObject.maxX = sizeX; - clientObject.maxY = sizeY; + clientObject.maxX = maxX; + clientObject.maxY = maxY; + clientObject.maxZ = maxZ; clientObject.content = content; clientObject.fontSize = fontSize; clientObject.shadow = shadow; From 396e6b73765783c6e141848f5329ca56da0785e7 Mon Sep 17 00:00:00 2001 From: Srendi Date: Mon, 4 Nov 2024 16:06:47 +0100 Subject: [PATCH 090/188] Sphere renderer, very cursed --- .../client/RenderUtil.java | 205 ++++++++++++------ .../OverlayModuleLevelRenderer.java | 17 +- .../smartglasses/OverlayObjectHolder.java | 2 + .../objects/threedim/BoxRenderer.java | 4 +- .../objects/threedim/SphereRenderer.java | 49 +++++ .../overlay/OverlayGlassesFunctions.java | 9 + .../objects/three_dim/SphereObject.java | 88 ++++++++ 7 files changed, 306 insertions(+), 68 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java index 8232f1c90..47333264a 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.client; +import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix4f; @@ -48,66 +49,139 @@ public static void drawBox(PoseStack stack, VertexConsumer buffer, float r, floa public static void drawPlane(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, Direction perspective, float pX, float pY, float pZ, float sX, float sY, float sZ) { stack.pushPose(); + + pX = pX + 0.5f; + pY = pY + 0.5f; + pZ = pZ + 0.5f; + + stack.translate(pX, pY, pZ); + Matrix4f matrix4f = stack.last().pose(); sX = sX / 2; sY = sY / 2; sZ = sZ / 2; - pX = pX + 0.5f; - pY = pY + 0.5f; - pZ = pZ + 0.5f; - if (perspective == Direction.UP) { - buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } if (perspective == Direction.DOWN) { - buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); } if (perspective == Direction.SOUTH) { - buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); } if (perspective == Direction.NORTH) { - buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); } if (perspective == Direction.EAST) { - buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, -sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } if (perspective == Direction.WEST) { - buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } stack.popPose(); } + public static void drawSphere(PoseStack poseStack, BufferBuilder consumer, float radius, double pX, double pY, double pZ, float r, float g, float b, float a, int sectors, int stacks) { + poseStack.pushPose(); + + poseStack.translate(pX, pY, pZ); + + Matrix4f matrix4f = poseStack.last().pose(); + + float z, xy; + float nx1, ny1, nz1, nx2, ny2, nz2, nx3, ny3, nz3, nx4, ny4, nz4, lengthInv = (1.0f / radius); // vertex normal + float s, t; //TODO vertex texCoord + + float sectorStep = (float) (2 * Math.PI / sectors); + float stackStep = (float) (Math.PI / stacks); + float sectorAngle, stackAngle; + + for (int i = 1; i <= stacks; ++i) { + stackAngle = (float) (Math.PI / 2 - i * stackStep); + + xy = (float) (radius * Math.cos(stackAngle)); + z = (float) (radius * Math.sin(stackAngle)); + + for (int j = 0; j < sectors; ++j) { + + sectorAngle = j * sectorStep; + + float x1 = (float) (xy * Math.cos(sectorAngle)); + float y1 = (float) (xy * Math.sin(sectorAngle)); + + float x2 = (float) (xy * Math.cos(sectorAngle + sectorStep)); + float y2 = (float) (xy * Math.sin(sectorAngle + sectorStep)); + + float x3 = (float) (radius * Math.cos(stackAngle + stackStep) * Math.cos(sectorAngle + sectorStep)); + float y3 = (float) (radius * Math.cos(stackAngle + stackStep) * Math.sin(sectorAngle + sectorStep)); + float z3 = (float) (radius * Math.sin(stackAngle + stackStep)); + + float x4 = (float) (radius * Math.cos(stackAngle + stackStep) * Math.cos(sectorAngle)); + float y4 = (float) (radius * Math.cos(stackAngle + stackStep) * Math.sin(sectorAngle)); + float z4 = (float) (radius * Math.sin(stackAngle + stackStep)); + + nx1 = x1 * lengthInv; + ny1 = y1 * lengthInv; + nz1 = z * lengthInv; + + nx2 = x2 * lengthInv; + ny2 = y2 * lengthInv; + nz2 = z * lengthInv; + + nx3 = x3 * lengthInv; + ny3 = y3 * lengthInv; + nz3 = z3 * lengthInv; + + nx4 = x4 * lengthInv; + ny4 = y4 * lengthInv; + nz4 = z4 * lengthInv; + + // Triangle 1 + consumer.vertex(matrix4f, x1, y1, z).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx1, ny1, nz1).endVertex(); + consumer.vertex(matrix4f, x3, y3, z3).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx3, ny3, nz3).endVertex(); + consumer.vertex(matrix4f, x4, y4, z4).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx4, ny4, nz4).endVertex(); + + // Triangle 2 + consumer.vertex(matrix4f, x1, y1, z).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx1, ny1, nz1).endVertex(); + consumer.vertex(matrix4f, x2, y2, z).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx2, ny2, nz2).endVertex(); + consumer.vertex(matrix4f, x3, y3, z3).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx3, ny3, nz3).endVertex(); + } + } + poseStack.popPose(); + + } + public static void drawVoxelShape(PoseStack pPoseStack, VertexConsumer pConsumer, VoxelShape pShape, double pX, double pY, double pZ, float r, float g, float b, float a) { for (Direction direction : Direction.values()) { pShape.calculateFace(direction).forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> { // Get the vertices for the face - float x1 = (float) (minX + pX); - float y1 = (float) (minY + pY); - float z1 = (float) (minZ + pZ); - float x2 = (float) (maxX + pX); - float y2 = (float) (maxY + pY); - float z2 = (float) (maxZ + pZ); + float x1 = (float) (minX); + float y1 = (float) (minY); + float z1 = (float) (minZ); + float x2 = (float) (maxX); + float y2 = (float) (maxY); + float z2 = (float) (maxZ); // Calculate the normal for the face Vec3i normalVec = direction.getNormal(); @@ -138,8 +212,8 @@ public static void drawShape(PoseStack pPoseStack, VertexConsumer pConsumer, Vox f /= f3; f1 /= f3; f2 /= f3; - pConsumer.vertex(pose.pose(), (float) (minX + pX), (float) (minY + pY), (float) (minZ + pZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex(); - pConsumer.vertex(pose.pose(), (float) (maxX + pX), (float) (maxY + pY), (float) (maxZ + pZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex(); + pConsumer.vertex(pose.pose(), (float) (minX), (float) (minY), (float) (minZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex(); + pConsumer.vertex(pose.pose(), (float) (maxX), (float) (maxY), (float) (maxZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex(); }); } @@ -171,6 +245,13 @@ public static void drawBox(PoseStack stack, VertexConsumer buffer, ResourceLocat public static void drawPlane(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, Direction perspective, float pX, float pY, float pZ, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { stack.pushPose(); + + pX = pX + 0.5f; + pY = pY + 0.5f; + pZ = pZ + 0.5f; + + stack.translate(pX, pY, pZ); + Matrix4f matrix4f = stack.last().pose(); TextureAtlasSprite stillTexture = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture); @@ -179,50 +260,46 @@ public static void drawPlane(PoseStack stack, VertexConsumer buffer, ResourceLoc sY = sY / 2; sZ = sZ / 2; - pX = pX + 0.5f; - pY = pY + 0.5f; - pZ = pZ + 0.5f; - float u1 = stillTexture.getU(pUOffset); float u2 = stillTexture.getU(pWidth); float v1 = stillTexture.getV(pVOffset); float v2 = stillTexture.getV(pHeight); if (perspective == Direction.UP) { - buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, sZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, sZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, -sZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, -sZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } if (perspective == Direction.DOWN) { - buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, sZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, -sZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, -sZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, sZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, -1f, 0f).endVertex(); } if (perspective == Direction.SOUTH) { - buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, sZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, -sZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, -sZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, sZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); } if (perspective == Direction.NORTH) { - buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, sZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, sZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, -sZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, -sZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(1f, 0f, 0f).endVertex(); } if (perspective == Direction.EAST) { - buffer.vertex(matrix4f, -sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, -sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, -sZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, -sZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, -sZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, -sZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } if (perspective == Direction.WEST) { - buffer.vertex(matrix4f, -sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, -sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); - buffer.vertex(matrix4f, -sX + pX, sY + pY, sZ + pZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, -sY, sZ).color(1, 1, 1, 1f).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, -sY, sZ).color(1, 1, 1, 1f).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, sX, sY, sZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); + buffer.vertex(matrix4f, -sX, sY, sZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } stack.popPose(); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java index 1e325bd08..8a0fbac98 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java @@ -65,7 +65,9 @@ public static void renderLevelState(RenderLevelStageEvent event) { ((IThreeDObjectRenderer) batch.get(0).getRenderObject()).renderBatch(batch, event, posestack, view, bufferbuilder); } - BlockPos blockPos = new BlockPos(2, 190, 0); + //TODO Everything below here is just for debugging and testing. Will be removed before we push to production + + BlockPos blockPos = new BlockPos(2, 10, 0); float[] colors = EnumColor.DARK_PURPLE.getRgb(); @@ -85,7 +87,7 @@ public static void renderLevelState(RenderLevelStageEvent event) { bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_NORMAL); colors = EnumColor.LIGHT_PURPLE.getRgb(); - blockPos = new BlockPos(0, 190, 2); + blockPos = new BlockPos(0, 10, 2); posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); VoxelShape shape = Block.box(0.0, 0.0, 0.0, 16.0, 18.0, 16.0); @@ -97,6 +99,17 @@ public static void renderLevelState(RenderLevelStageEvent event) { BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); + bufferbuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR_NORMAL); + posestack.pushPose(); + + blockPos = new BlockPos(0, 10, 0); + posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); + + RenderUtil.drawSphere(posestack, bufferbuilder, 0.5f, 0f, 0f, 0f, colors[0], colors[1], colors[2], 0.6f, 128, 48); + + BufferUploader.drawWithShader(bufferbuilder.end()); + posestack.popPose(); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 7bd0888ce..54da6ea07 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -3,6 +3,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.SphereObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; @@ -50,5 +51,6 @@ public static void registerDecodeObjects() { ObjectDecodeRegistry.register(BoxObject.TYPE_ID, BoxObject::decode); ObjectDecodeRegistry.register(BlockObject.TYPE_ID, BlockObject::decode); + ObjectDecodeRegistry.register(SphereObject.TYPE_ID, SphereObject::decode); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java index 235ac2227..873c1e7ea 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java @@ -5,10 +5,10 @@ import com.mojang.blaze3d.vertex.BufferUploader; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexFormat; import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.RenderType; import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.event.RenderLevelStageEvent; @@ -23,7 +23,7 @@ public void renderBatch(List batch, RenderLevelStageEven for (ThreeDimensionalObject renderableObject : batch) { poseStack.pushPose(); onPreRender(renderableObject); - bufferBuilder.begin(RenderType.translucent().mode(), DefaultVertexFormat.POSITION_COLOR_NORMAL); + bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_NORMAL); RenderSystem.setShader(GameRenderer::getPositionColorShader); float alpha = renderableObject.opacity; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java new file mode 100644 index 000000000..e94071302 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java @@ -0,0 +1,49 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects.threedim; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexFormat; +import de.srendi.advancedperipherals.client.RenderUtil; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.SphereObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.event.RenderLevelStageEvent; + +import java.util.List; + +public class SphereRenderer implements IThreeDObjectRenderer { + + @Override + public void renderBatch(List batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) { + poseStack.pushPose(); + + for (ThreeDimensionalObject renderableObject : batch) { + poseStack.pushPose(); + onPreRender(renderableObject); + bufferBuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR_NORMAL); + + SphereObject sphere = (SphereObject) renderableObject; + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + float alpha = renderableObject.opacity; + float red = (float) (renderableObject.color >> 16 & 255) / 255.0F; + float green = (float) (renderableObject.color >> 8 & 255) / 255.0F; + float blue = (float) (renderableObject.color & 255) / 255.0F; + + poseStack.translate(-view.x + renderableObject.getX(), -view.y + renderableObject.getY(), -view.z + renderableObject.getZ()); + RenderUtil.drawSphere(poseStack, bufferBuilder, 1f, 0f, 0f, 0f, red, green, blue, alpha, sphere.sectors, sphere.stacks); + BufferUploader.drawWithShader(bufferBuilder.end()); + onPostRender(renderableObject); + + poseStack.popPose(); + } + + + poseStack.popPose(); + + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index 2314856b7..ccb6ecc75 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -8,6 +8,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.SphereObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; @@ -73,6 +74,14 @@ public final MethodResult createBox(IArguments arguments) throws LuaException { return MethodResult.of(object, "SUCCESS"); } + @LuaFunction + public final MethodResult createSphere(IArguments arguments) throws LuaException { + SphereObject block = new SphereObject(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(block); + + return MethodResult.of(object, "SUCCESS"); + } + @LuaFunction public final MethodResult getObject(IArguments arguments) throws LuaException { int id = arguments.getInt(0); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java new file mode 100644 index 000000000..daa9f6bfe --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java @@ -0,0 +1,88 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.SphereRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.UUID; + +public class SphereObject extends ThreeDimensionalObject { + public static final int TYPE_ID = 6; + + private final IObjectRenderer renderer = new SphereRenderer(); + + @FixedPointNumberProperty(min = 1, max = 1024) + public int sectors = 16; + + @FixedPointNumberProperty(min = 1, max = 1024) + public int stacks = 16; + + public SphereObject(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); + reflectivelyMapProperties(arguments); + } + + public SphereObject(UUID player) { + super(player); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(TYPE_ID); + super.encode(buffer); + buffer.writeInt(sectors); + buffer.writeInt(stacks); + } + + public static SphereObject decode(FriendlyByteBuf buffer) { + int objectId = buffer.readInt(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + int x = buffer.readInt(); + int y = buffer.readInt(); + int z = buffer.readInt(); + int maxX = buffer.readInt(); + int maxY = buffer.readInt(); + int maxZ = buffer.readInt(); + + boolean disableDepthTest = buffer.readBoolean(); + boolean disableCulling = buffer.readBoolean(); + + int sectors = buffer.readInt(); + int stacks = buffer.readInt(); + + SphereObject clientObject = new SphereObject(player); + clientObject.setId(objectId); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.z = z; + clientObject.maxX = maxX; + clientObject.maxY = maxY; + clientObject.maxZ = maxZ; + clientObject.disableDepthTest = disableDepthTest; + clientObject.disableCulling = disableCulling; + clientObject.sectors = sectors; + clientObject.stacks = stacks; + + return clientObject; + } + + @Override + public IObjectRenderer getRenderObject() { + return renderer; + } +} From 130d91cb6ddc0cfb1072c5fafd844f98cd8f9d17 Mon Sep 17 00:00:00 2001 From: Srendi Date: Tue, 5 Nov 2024 22:53:40 +0100 Subject: [PATCH 091/188] Torus Object implemented, clean up some inconsistencies, clean up RenderUtil.java, support for rotation and floating number coordinates --- .../client/RenderUtil.java | 248 +++++++++--------- .../OverlayModuleLevelRenderer.java | 21 +- .../smartglasses/OverlayObjectHolder.java | 2 + .../objects/threedim/BlockRenderer.java | 25 +- .../objects/threedim/BoxRenderer.java | 21 +- .../objects/threedim/SphereRenderer.java | 20 +- .../objects/threedim/TorusRenderer.java | 47 ++++ .../objects/twodim/CircleRenderer.java | 13 +- .../objects/twodim/ItemRenderer.java | 6 +- .../objects/twodim/RectangleRenderer.java | 20 +- .../objects/twodim/TextRenderer.java | 4 +- .../overlay/OverlayGlassesFunctions.java | 9 + .../objects/three_dim/BlockObject.java | 20 +- .../overlay/objects/three_dim/BoxObject.java | 19 +- .../objects/three_dim/SphereObject.java | 60 ++++- .../three_dim/ThreeDimensionalObject.java | 46 ++++ .../objects/three_dim/TorusObject.java | 152 +++++++++++ .../overlay/objects/two_dim/CircleObject.java | 12 +- .../overlay/objects/two_dim/ItemObject.java | 12 +- .../objects/two_dim/RectangleObject.java | 13 +- .../objects/two_dim/RenderableObject.java | 58 ++-- .../overlay/objects/two_dim/TextObject.java | 12 +- 22 files changed, 569 insertions(+), 271 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/TorusRenderer.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/TorusObject.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java index 47333264a..68359833f 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java @@ -4,33 +4,18 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix4f; +import com.mojang.math.Quaternion; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; - -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; public class RenderUtil { - public static void drawBox(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, float sX, float sY, float sZ) { - drawBox(stack, buffer, r, g, b, a, 0, 0, 0, sX, sY, sZ); - } - - public static void drawVoxelShape(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, VoxelShape shape) { - drawVoxelShape(stack, buffer, shape, 0f, 0f, 0f, r, g, b, a); - } - - public static void drawBox(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, float pX, float pY, float pZ, float sX, float sY, float sZ) { - stack.pushPose(); + public static void drawBox(PoseStack poseStack, VertexConsumer buffer, float r, float g, float b, float a, float pX, float pY, float pZ, float xRot, float yRot, float zRot, float sX, float sY, float sZ) { + poseStack.pushPose(); sX = sX / 16; //Sizes in pixels please sY = sY / 16; sZ = sZ / 16; @@ -38,25 +23,27 @@ public static void drawBox(PoseStack stack, VertexConsumer buffer, float r, floa pY = pY / 16; pZ = pZ / 16; - drawPlane(stack, buffer, r, g, b, a, Direction.UP, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Direction.DOWN, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Direction.EAST, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Direction.WEST, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Direction.NORTH, pX, pY, pZ, sX, sY, sZ); - drawPlane(stack, buffer, r, g, b, a, Direction.SOUTH, pX, pY, pZ, sX, sY, sZ); - stack.popPose(); + poseStack.mulPose(new Quaternion(xRot, yRot, zRot, true)); + + drawPlane(poseStack, buffer, r, g, b, a, Direction.UP, pX, pY, pZ, sX, sY, sZ); + drawPlane(poseStack, buffer, r, g, b, a, Direction.DOWN, pX, pY, pZ, sX, sY, sZ); + drawPlane(poseStack, buffer, r, g, b, a, Direction.EAST, pX, pY, pZ, sX, sY, sZ); + drawPlane(poseStack, buffer, r, g, b, a, Direction.WEST, pX, pY, pZ, sX, sY, sZ); + drawPlane(poseStack, buffer, r, g, b, a, Direction.NORTH, pX, pY, pZ, sX, sY, sZ); + drawPlane(poseStack, buffer, r, g, b, a, Direction.SOUTH, pX, pY, pZ, sX, sY, sZ); + poseStack.popPose(); } - public static void drawPlane(PoseStack stack, VertexConsumer buffer, float r, float g, float b, float a, Direction perspective, float pX, float pY, float pZ, float sX, float sY, float sZ) { - stack.pushPose(); + public static void drawPlane(PoseStack posestack, VertexConsumer buffer, float r, float g, float b, float a, Direction perspective, float pX, float pY, float pZ, float sX, float sY, float sZ) { + posestack.pushPose(); pX = pX + 0.5f; pY = pY + 0.5f; pZ = pZ + 0.5f; - stack.translate(pX, pY, pZ); - - Matrix4f matrix4f = stack.last().pose(); + posestack.translate(pX, pY, pZ); + + Matrix4f matrix4f = posestack.last().pose(); sX = sX / 2; sY = sY / 2; @@ -99,14 +86,96 @@ public static void drawPlane(PoseStack stack, VertexConsumer buffer, float r, fl buffer.vertex(matrix4f, sX, sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, -sX, sY, sZ).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } - stack.popPose(); + posestack.popPose(); } - public static void drawSphere(PoseStack poseStack, BufferBuilder consumer, float radius, double pX, double pY, double pZ, float r, float g, float b, float a, int sectors, int stacks) { + public static void drawTorus(PoseStack poseStack, BufferBuilder consumer, float majorRadius, float minorRadius, double pX, double pY, double pZ, float xRot, float yRot, float zRot, float r, float g, float b, float a, int sides, int rings) { poseStack.pushPose(); + poseStack.translate(pX, pY, pZ); + poseStack.mulPose(new Quaternion(xRot, yRot, zRot, true)); + + Matrix4f matrix4f = poseStack.last().pose(); + float x, y, z; + float nx, ny, nz; // vertex normal + + float ringStep = (float) (2 * Math.PI / rings); + float sideStep = (float) (2 * Math.PI / sides); + float ringAngle, sideAngle; + + // Start drawing quads + for (int i = 0; i < rings; ++i) { + ringAngle = i * ringStep; + float cosRingAngle = (float) Math.cos(ringAngle); + float sinRingAngle = (float) Math.sin(ringAngle); + + float nextRingAngle = (i + 1) * ringStep; + float nextCosRingAngle = (float) Math.cos(nextRingAngle); + float nextSinRingAngle = (float) Math.sin(nextRingAngle); + + // Calculate the center point of the minor circles + float centerX = majorRadius * cosRingAngle; + float centerY = majorRadius * sinRingAngle; + float nextCenterX = majorRadius * nextCosRingAngle; + float nextCenterY = majorRadius * nextSinRingAngle; + + for (int j = 0; j < sides; ++j) { + sideAngle = j * sideStep; + float cosSideAngle = (float) Math.cos(sideAngle); + float sinSideAngle = (float) Math.sin(sideAngle); + + float nextSideAngle = (j + 1) * sideStep; + float nextCosSideAngle = (float) Math.cos(nextSideAngle); + float nextSinSideAngle = (float) Math.sin(nextSideAngle); + + // Calculate vertex positions + x = centerX + minorRadius * cosSideAngle * cosRingAngle; + y = centerY + minorRadius * cosSideAngle * sinRingAngle; + z = minorRadius * sinSideAngle; + + // Calculate normal (simplified - for smooth shading, average normals of adjacent faces) + nx = x - centerX; + ny = y - centerY; + nz = z; + consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).overlayCoords(OverlayTexture.WHITE_OVERLAY_V).uv(0, 0).uv2(0xFFFFFF).normal(nx, ny, nz).endVertex(); + + x = centerX + minorRadius * nextCosSideAngle * cosRingAngle; + y = centerY + minorRadius * nextCosSideAngle * sinRingAngle; + z = minorRadius * nextSinSideAngle; + + nx = x - centerX; + ny = y - centerY; + nz = z; + consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).overlayCoords(OverlayTexture.WHITE_OVERLAY_V).uv(1, 0).uv2(0xFFF0F0).normal(nx, ny, nz).endVertex(); + + x = nextCenterX + minorRadius * nextCosSideAngle * nextCosRingAngle; + y = nextCenterY + minorRadius * nextCosSideAngle * nextSinRingAngle; + z = minorRadius * nextSinSideAngle; + + nx = x - nextCenterX; + ny = y - nextCenterY; + nz = z; + consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).overlayCoords(OverlayTexture.WHITE_OVERLAY_V).uv(0, 1).uv2(0xFFFFFF).normal(nx, ny, nz).endVertex(); + + x = nextCenterX + minorRadius * cosSideAngle * nextCosRingAngle; + y = nextCenterY + minorRadius * cosSideAngle * nextSinRingAngle; + z = minorRadius * sinSideAngle; + + nx = x - nextCenterX; + ny = y - nextCenterY; + nz = z; + consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).overlayCoords(OverlayTexture.RED_OVERLAY_V).uv(1, 1).uv2(0xF000F0).normal(nx, ny, nz).endVertex(); + } + } + + poseStack.popPose(); + } + + public static void drawSphere(PoseStack poseStack, BufferBuilder consumer, float radius, double pX, double pY, double pZ, float xRot, float yRot, float zRot, float r, float g, float b, float a, int sectors, int stacks) { + poseStack.pushPose(); poseStack.translate(pX, pY, pZ); - + poseStack.mulPose(new Quaternion(xRot, yRot, zRot, true)); + Matrix4f matrix4f = poseStack.last().pose(); float z, xy; @@ -172,61 +241,8 @@ public static void drawSphere(PoseStack poseStack, BufferBuilder consumer, float } - public static void drawVoxelShape(PoseStack pPoseStack, VertexConsumer pConsumer, VoxelShape pShape, double pX, double pY, double pZ, float r, float g, float b, float a) { - for (Direction direction : Direction.values()) { - pShape.calculateFace(direction).forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> { - // Get the vertices for the face - float x1 = (float) (minX); - float y1 = (float) (minY); - float z1 = (float) (minZ); - float x2 = (float) (maxX); - float y2 = (float) (maxY); - float z2 = (float) (maxZ); - - // Calculate the normal for the face - Vec3i normalVec = direction.getNormal(); - float nx = normalVec.getX(); - float ny = normalVec.getY(); - float nz = normalVec.getZ(); - - PoseStack.Pose pose = pPoseStack.last(); - - //drawPlane(pPoseStack, pConsumer, r,g,b,a, direction, x1, y1, z1, x2, y2, z2); - // Draw the quad (two triangles) - pConsumer.vertex(pose.pose(), x1, y1, z1).color(r, g, b, a).normal(pose.normal(), nx, ny, nz).endVertex(); - pConsumer.vertex(pose.pose(), x2, y1, z1).color(r, g, b, a).normal(pose.normal(), nx, ny, nz).endVertex(); - pConsumer.vertex(pose.pose(), x2, y2, z2).color(r, g, b, a).normal(pose.normal(), nx, ny, nz).endVertex(); - pConsumer.vertex(pose.pose(), x1, y2, z2).color(r, g, b, a).normal(pose.normal(), nx, ny, nz).endVertex(); - }); - } - - } - - public static void drawShape(PoseStack pPoseStack, VertexConsumer pConsumer, VoxelShape pShape, double pX, double pY, double pZ, float r, float g, float b, float a) { - PoseStack.Pose pose = pPoseStack.last(); - pShape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> { - float f = (float) (maxX - minX); - float f1 = (float) (maxY - minY); - float f2 = (float) (maxZ - minZ); - float f3 = Mth.sqrt(f * f + f1 * f1 + f2 * f2); - f /= f3; - f1 /= f3; - f2 /= f3; - pConsumer.vertex(pose.pose(), (float) (minX), (float) (minY), (float) (minZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex(); - pConsumer.vertex(pose.pose(), (float) (maxX), (float) (maxY), (float) (maxZ)).color(r, g, b, a).normal(pose.normal(), f, f1, f2).endVertex(); - }); - } - - public static void drawBox(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { - drawBox(stack, buffer, texture, 0, 0, 0, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - } - - public static void drawVoxelShape(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, VoxelShape shape, float pUOffset, float pVOffset, float pWidth, float pHeight) { - renderVoxelShape(stack, buffer, texture, shape, pUOffset, pVOffset, pWidth, pHeight); - } - - public static void drawBox(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, float pX, float pY, float pZ, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { - stack.pushPose(); + public static void drawBox(PoseStack poseStack, VertexConsumer buffer, ResourceLocation texture, float pX, float pY, float pZ, float xRot, float yRot, float zRot, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { + poseStack.pushPose(); sX = sX / 16; //Sizes in pixels please sY = sY / 16; sZ = sZ / 16; @@ -234,25 +250,27 @@ public static void drawBox(PoseStack stack, VertexConsumer buffer, ResourceLocat pY = pY / 16; pZ = pZ / 16; - drawPlane(stack, buffer, texture, Direction.UP, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Direction.DOWN, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Direction.EAST, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Direction.WEST, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Direction.NORTH, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - drawPlane(stack, buffer, texture, Direction.SOUTH, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); - stack.popPose(); + poseStack.mulPose(new Quaternion(xRot, yRot, zRot, true)); + + drawPlane(poseStack, buffer, texture, Direction.UP, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(poseStack, buffer, texture, Direction.DOWN, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(poseStack, buffer, texture, Direction.EAST, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(poseStack, buffer, texture, Direction.WEST, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(poseStack, buffer, texture, Direction.NORTH, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + drawPlane(poseStack, buffer, texture, Direction.SOUTH, pX, pY, pZ, sX, sY, sZ, pUOffset, pVOffset, pWidth, pHeight); + poseStack.popPose(); } - public static void drawPlane(PoseStack stack, VertexConsumer buffer, ResourceLocation texture, Direction perspective, float pX, float pY, float pZ, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { - stack.pushPose(); + public static void drawPlane(PoseStack poseStack, VertexConsumer buffer, ResourceLocation texture, Direction perspective, float pX, float pY, float pZ, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { + poseStack.pushPose(); pX = pX + 0.5f; pY = pY + 0.5f; pZ = pZ + 0.5f; - stack.translate(pX, pY, pZ); + poseStack.translate(pX, pY, pZ); - Matrix4f matrix4f = stack.last().pose(); + Matrix4f matrix4f = poseStack.last().pose(); TextureAtlasSprite stillTexture = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(texture); @@ -301,33 +319,7 @@ public static void drawPlane(PoseStack stack, VertexConsumer buffer, ResourceLoc buffer.vertex(matrix4f, sX, sY, sZ).color(1, 1, 1, 1f).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); buffer.vertex(matrix4f, -sX, sY, sZ).color(1, 1, 1, 1f).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(0f, 1f, 0f).endVertex(); } - stack.popPose(); - } - - public static void renderVoxelShape(PoseStack poseStack, VertexConsumer consumer, ResourceLocation texture, VoxelShape shape, float pUOffset, float pVOffset, float pWidth, float pHeight) { - List list = shape.toAabbs(); - - for (AABB aabb : list) { - drawShape(poseStack, consumer, texture, Shapes.create(aabb), pUOffset, pVOffset, pWidth, pHeight); - } - } - - private static void drawShape(PoseStack poseStack, VertexConsumer consumer, ResourceLocation texture, VoxelShape shape, float pUOffset, float pVOffset, float pWidth, float pHeight) { - AtomicInteger perspective = new AtomicInteger(); - shape.forAllEdges((minX, minY, minZ, maxX, maxY, maxZ) -> { - - minX = minX / 16; - minY = minY / 16; - minZ = minZ / 16; - maxX = maxX / 16; - maxY = maxY / 16; - maxZ = maxZ / 16; - - if (perspective.get() > 5) - perspective.set(0); - drawPlane(poseStack, consumer, texture, Direction.values()[perspective.getAndIncrement()], (float) minX, (float) minY, (float) minZ, (float) maxX, (float) maxY, (float) maxZ, pUOffset, pVOffset, pWidth, pHeight); - }); - perspective.set(0); + poseStack.popPose(); } public static float getBlue(int hex) { @@ -342,8 +334,4 @@ public static float getRed(int hex) { return (hex >> 16 & 0xFF) / 255.0F; } - public static float getAlpha(int hex) { - return (hex >> 24 & 0xFF) / 255.0F; - } - } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java index 8a0fbac98..cdadf3988 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java @@ -18,9 +18,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -82,30 +80,25 @@ public static void renderLevelState(RenderLevelStageEvent event) { BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); + bufferbuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR_NORMAL); posestack.pushPose(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); - bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_NORMAL); - colors = EnumColor.LIGHT_PURPLE.getRgb(); - blockPos = new BlockPos(0, 10, 2); + blockPos = new BlockPos(0, 10, 0); posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); - VoxelShape shape = Block.box(0.0, 0.0, 0.0, 16.0, 18.0, 16.0); - RenderSystem.setShaderColor(colors[0], colors[1], colors[2], 0.6f); - - RenderUtil.drawVoxelShape(posestack, bufferbuilder, shape, 0f, 0f, 0f, colors[0], colors[1], colors[2], 0.6f); - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + RenderUtil.drawSphere(posestack, bufferbuilder, 0.5f, 0f, 0f, 0f, 90f, 0f, 0f, colors[0], colors[1], colors[2], 0.6f, 128, 48); BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); - bufferbuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR_NORMAL); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_NORMAL); posestack.pushPose(); - blockPos = new BlockPos(0, 10, 0); + colors = EnumColor.DARK_BLUE.getRgb(); + blockPos = new BlockPos(6, 10, 0); posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); - RenderUtil.drawSphere(posestack, bufferbuilder, 0.5f, 0f, 0f, 0f, colors[0], colors[1], colors[2], 0.6f, 128, 48); + RenderUtil.drawTorus(posestack, bufferbuilder, 0.5f, 0.09f, 0f, 0f, 0f, 0f, 0f, 0f, colors[0], colors[1], colors[2], 0.6f, 300, 32); BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 54da6ea07..3dc4d94a0 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -4,6 +4,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.SphereObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.TorusObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; @@ -52,5 +53,6 @@ public static void registerDecodeObjects() { ObjectDecodeRegistry.register(BoxObject.TYPE_ID, BoxObject::decode); ObjectDecodeRegistry.register(BlockObject.TYPE_ID, BlockObject::decode); ObjectDecodeRegistry.register(SphereObject.TYPE_ID, SphereObject::decode); + ObjectDecodeRegistry.register(TorusObject.TYPE_ID, TorusObject::decode); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java index 4276c39c0..a295543b6 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java @@ -5,6 +5,8 @@ import com.mojang.blaze3d.vertex.BufferUploader; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Quaternion; +import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; import de.srendi.advancedperipherals.common.util.RegistryUtil; @@ -25,33 +27,34 @@ public class BlockRenderer implements IThreeDObjectRenderer { public void renderBatch(List batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) { poseStack.pushPose(); - for (ThreeDimensionalObject renderableObject : batch) { + for (ThreeDimensionalObject obj : batch) { poseStack.pushPose(); - onPreRender(renderableObject); + onPreRender(obj); bufferBuilder.begin(RenderType.solid().mode(), DefaultVertexFormat.BLOCK); - BlockObject block = (BlockObject) renderableObject; + BlockObject block = (BlockObject) obj; - BlockPos blockPos = new BlockPos(renderableObject.getX(), renderableObject.getY(), renderableObject.getZ()); - - poseStack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); - float alpha = renderableObject.opacity; - float red = (float) (renderableObject.color >> 16 & 255) / 255.0F; - float green = (float) (renderableObject.color >> 8 & 255) / 255.0F; - float blue = (float) (renderableObject.color & 255) / 255.0F; + poseStack.translate(-view.x + block.getX(), -view.y + block.getY(), -view.z + block.getZ()); + poseStack.mulPose(new Quaternion(block.xRot, block.yRot, block.zRot, true)); + poseStack.translate(-0.5f, -0.5f, -0.5f); + float alpha = block.opacity; + float red = RenderUtil.getRed(block.color); + float green = RenderUtil.getGreen(block.color); + float blue = RenderUtil.getBlue(block.color); RenderSystem.setShader(GameRenderer::getBlockShader); RenderSystem.setShaderColor(red, green, blue, alpha); Block blockToRender = RegistryUtil.getRegistryEntry(block.block, ForgeRegistries.BLOCKS); + BlockPos blockPos = new BlockPos(obj.getX(), obj.getY(), obj.getZ()); if (blockToRender != null) Minecraft.getInstance().getBlockRenderer().renderBatched(blockToRender.defaultBlockState(), blockPos, event.getCamera().getEntity().level, poseStack, bufferBuilder, false, event.getCamera().getEntity().level.random); poseStack.popPose(); BufferUploader.drawWithShader(bufferBuilder.end()); - onPostRender(renderableObject); + onPostRender(obj); RenderSystem.setShaderColor(1f, 1f, 1f, 1f); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java index 873c1e7ea..16b2ee29e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java @@ -7,6 +7,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexFormat; import de.srendi.advancedperipherals.client.RenderUtil; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.world.phys.Vec3; @@ -20,21 +21,23 @@ public class BoxRenderer implements IThreeDObjectRenderer { public void renderBatch(List batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) { poseStack.pushPose(); - for (ThreeDimensionalObject renderableObject : batch) { + for (ThreeDimensionalObject obj : batch) { poseStack.pushPose(); - onPreRender(renderableObject); + onPreRender(obj); bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_NORMAL); + BoxObject box = (BoxObject) obj; + RenderSystem.setShader(GameRenderer::getPositionColorShader); - float alpha = renderableObject.opacity; - float red = (float) (renderableObject.color >> 16 & 255) / 255.0F; - float green = (float) (renderableObject.color >> 8 & 255) / 255.0F; - float blue = (float) (renderableObject.color & 255) / 255.0F; + float alpha = box.opacity; + float red = RenderUtil.getRed(box.color); + float green = RenderUtil.getGreen(box.color); + float blue = RenderUtil.getBlue(box.color); - poseStack.translate(-view.x + renderableObject.getX(), -view.y + renderableObject.getY(), -view.z + renderableObject.getZ()); - RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, renderableObject.getMaxX(), renderableObject.getMaxY(), renderableObject.getMaxX()); + poseStack.translate(-view.x + box.getX(), -view.y + box.getY(), -view.z + box.getZ()); + RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, box.x, box.y, box.z, obj.xRot, obj.yRot, obj.zRot, obj.getMaxX(), obj.getMaxY(), obj.getMaxX()); BufferUploader.drawWithShader(bufferBuilder.end()); - onPostRender(renderableObject); + onPostRender(obj); poseStack.popPose(); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java index e94071302..ebea9bd70 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java @@ -21,23 +21,23 @@ public class SphereRenderer implements IThreeDObjectRenderer { public void renderBatch(List batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) { poseStack.pushPose(); - for (ThreeDimensionalObject renderableObject : batch) { + for (ThreeDimensionalObject obj : batch) { poseStack.pushPose(); - onPreRender(renderableObject); + onPreRender(obj); bufferBuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR_NORMAL); - SphereObject sphere = (SphereObject) renderableObject; + SphereObject sphere = (SphereObject) obj; RenderSystem.setShader(GameRenderer::getPositionColorShader); - float alpha = renderableObject.opacity; - float red = (float) (renderableObject.color >> 16 & 255) / 255.0F; - float green = (float) (renderableObject.color >> 8 & 255) / 255.0F; - float blue = (float) (renderableObject.color & 255) / 255.0F; + float alpha = sphere.opacity; + float red = RenderUtil.getRed(sphere.color); + float green = RenderUtil.getRed(sphere.color); + float blue = RenderUtil.getRed(sphere.color); - poseStack.translate(-view.x + renderableObject.getX(), -view.y + renderableObject.getY(), -view.z + renderableObject.getZ()); - RenderUtil.drawSphere(poseStack, bufferBuilder, 1f, 0f, 0f, 0f, red, green, blue, alpha, sphere.sectors, sphere.stacks); + poseStack.translate(-view.x, -view.y, -view.z); + RenderUtil.drawSphere(poseStack, bufferBuilder, sphere.radius, sphere.x, sphere.y, sphere.z, sphere.xRot, sphere.yRot, sphere.zRot, red, green, blue, alpha, sphere.sectors, sphere.stacks); BufferUploader.drawWithShader(bufferBuilder.end()); - onPostRender(renderableObject); + onPostRender(obj); poseStack.popPose(); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/TorusRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/TorusRenderer.java new file mode 100644 index 000000000..478f1e6cc --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/TorusRenderer.java @@ -0,0 +1,47 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects.threedim; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexFormat; +import de.srendi.advancedperipherals.client.RenderUtil; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.TorusObject; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.event.RenderLevelStageEvent; + +import java.util.List; + +public class TorusRenderer implements IThreeDObjectRenderer { + + @Override + public void renderBatch(List batch, RenderLevelStageEvent event, PoseStack poseStack, Vec3 view, BufferBuilder bufferBuilder) { + poseStack.pushPose(); + + for (ThreeDimensionalObject obj : batch) { + poseStack.pushPose(); + onPreRender(obj); + bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_NORMAL); + + TorusObject torus = (TorusObject) obj; + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + float alpha = torus.opacity; + float red = RenderUtil.getRed(torus.color); + float green = RenderUtil.getGreen(torus.color); + float blue = RenderUtil.getBlue(torus.color); + + poseStack.translate(-view.x + torus.x, -view.y + torus.y, -view.z + torus.z); + RenderUtil.drawTorus(poseStack, bufferBuilder, torus.majorRadius, torus.minorRadius, 0, 0, 0, torus.xRot, torus.yRot, torus.zRot, red, green, blue, alpha, torus.rings, torus.sides); + BufferUploader.drawWithShader(bufferBuilder.end()); + onPostRender(obj); + + poseStack.popPose(); + } + + poseStack.popPose(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java index 42f3d9839..2f64946bd 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java @@ -8,6 +8,7 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix4f; +import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraft.client.renderer.GameRenderer; @@ -19,14 +20,14 @@ public class CircleRenderer implements ITwoDObjectRenderer { @Override public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { - for (RenderableObject object : objects) { + for (RenderableObject obj : objects) { - CircleObject circle = (CircleObject) object; + CircleObject circle = (CircleObject) obj; - float alpha = object.opacity; - float red = (float) (object.color >> 16 & 255) / 255.0F; - float green = (float) (object.color >> 8 & 255) / 255.0F; - float blue = (float) (object.color & 255) / 255.0F; + float alpha = circle.opacity; + float red = RenderUtil.getRed(circle.color); + float green = RenderUtil.getGreen(circle.color); + float blue = RenderUtil.getBlue(circle.color); drawCircle(poseStack, circle.x, circle.y, circle.radius, 120, red, green, blue, alpha); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java index cf3913fbd..b7f4c2913 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java @@ -18,11 +18,11 @@ public class ItemRenderer implements ITwoDObjectRenderer { public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { Minecraft minecraft = Minecraft.getInstance(); - for (RenderableObject object : objects) { - Item renderItem = RegistryUtil.getRegistryEntry(((ItemObject) object).item, ForgeRegistries.ITEMS); + for (RenderableObject obj : objects) { + Item renderItem = RegistryUtil.getRegistryEntry(((ItemObject) obj).item, ForgeRegistries.ITEMS); if (renderItem == null) continue; - minecraft.getItemRenderer().renderGuiItem(new ItemStack(renderItem), object.x, object.y); + minecraft.getItemRenderer().renderGuiItem(new ItemStack(renderItem), (int) obj.x, (int) obj.y); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java index d0521ede1..872a5b6ea 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java @@ -8,6 +8,7 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix4f; +import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; @@ -23,19 +24,18 @@ public void renderBatch(List objects, ForgeGui gui, PoseStack Matrix4f matrix = poseStack.last().pose(); bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - for (RenderableObject object : objects) { - float alpha = object.opacity; - float red = (float) (object.color >> 16 & 255) / 255.0F; - float green = (float) (object.color >> 8 & 255) / 255.0F; - float blue = (float) (object.color & 255) / 255.0F; + for (RenderableObject obj : objects) { + float alpha = obj.opacity; + float red = RenderUtil.getRed(obj.color); + float green = RenderUtil.getGreen(obj.color); + float blue = RenderUtil.getBlue(obj.color); - bufferbuilder.vertex(matrix, (float) object.x, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.maxY, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) object.maxX, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, (float) object.x, (float) object.y, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.x, obj.maxY, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.maxX, obj.maxY, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.maxX, obj.y, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.x, obj.y, 0f).color(red, green, blue, alpha).endVertex(); } BufferUploader.drawWithShader(bufferbuilder.end()); - } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java index fdd376415..b80aa6e77 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java @@ -14,8 +14,8 @@ public class TextRenderer implements ITwoDObjectRenderer { public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { Minecraft minecraft = Minecraft.getInstance(); - for (RenderableObject object : objects) { - TextObject text = (TextObject) object; + for (RenderableObject obj : objects) { + TextObject text = (TextObject) obj; poseStack.scale(text.fontSize, text.fontSize, 1); if (text.shadow) { minecraft.font.drawShadow(poseStack, text.content, text.x / text.fontSize, text.y / text.fontSize, text.color); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index ccb6ecc75..bffed31cb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -9,6 +9,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BlockObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.BoxObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.SphereObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.TorusObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; @@ -82,6 +83,14 @@ public final MethodResult createSphere(IArguments arguments) throws LuaException return MethodResult.of(object, "SUCCESS"); } + @LuaFunction + public final MethodResult createTorus(IArguments arguments) throws LuaException { + TorusObject block = new TorusObject(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(block); + + return MethodResult.of(object, "SUCCESS"); + } + @LuaFunction public final MethodResult getObject(IArguments arguments) throws LuaException { int id = arguments.getInt(0); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java index ba09b0cb5..b2718e4fb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java @@ -40,7 +40,6 @@ public final String getBlock() { return block; } - @Override public void encode(FriendlyByteBuf buffer) { buffer.writeInt(TYPE_ID); @@ -59,15 +58,17 @@ public static BlockObject decode(FriendlyByteBuf buffer) { int color = buffer.readInt(); float opacity = buffer.readFloat(); - int x = buffer.readInt(); - int y = buffer.readInt(); - int z = buffer.readInt(); - int maxX = buffer.readInt(); - int maxY = buffer.readInt(); - int maxZ = buffer.readInt(); - + float x = buffer.readFloat(); + float y = buffer.readFloat(); + float z = buffer.readFloat(); + float maxX = buffer.readFloat(); + float maxY = buffer.readFloat(); + float maxZ = buffer.readFloat(); boolean disableDepthTest = buffer.readBoolean(); boolean disableCulling = buffer.readBoolean(); + float xRot = buffer.readFloat(); + float yRot = buffer.readFloat(); + float zRot = buffer.readFloat(); String block = buffer.readUtf(); @@ -83,6 +84,9 @@ public static BlockObject decode(FriendlyByteBuf buffer) { clientObject.maxZ = maxZ; clientObject.disableDepthTest = disableDepthTest; clientObject.disableCulling = disableCulling; + clientObject.xRot = xRot; + clientObject.yRot = yRot; + clientObject.zRot = zRot; clientObject.block = block; return clientObject; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java index 796531ee1..0aeb1f3c5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java @@ -41,15 +41,17 @@ public static BoxObject decode(FriendlyByteBuf buffer) { int color = buffer.readInt(); float opacity = buffer.readFloat(); - int x = buffer.readInt(); - int y = buffer.readInt(); - int z = buffer.readInt(); - int maxX = buffer.readInt(); - int maxY = buffer.readInt(); - int maxZ = buffer.readInt(); - + float x = buffer.readFloat(); + float y = buffer.readFloat(); + float z = buffer.readFloat(); + float maxX = buffer.readFloat(); + float maxY = buffer.readFloat(); + float maxZ = buffer.readFloat(); boolean disableDepthTest = buffer.readBoolean(); boolean disableCulling = buffer.readBoolean(); + float xRot = buffer.readFloat(); + float yRot = buffer.readFloat(); + float zRot = buffer.readFloat(); BoxObject clientObject = new BoxObject(player); clientObject.setId(objectId); @@ -63,6 +65,9 @@ public static BoxObject decode(FriendlyByteBuf buffer) { clientObject.maxZ = maxZ; clientObject.disableDepthTest = disableDepthTest; clientObject.disableCulling = disableCulling; + clientObject.xRot = xRot; + clientObject.yRot = yRot; + clientObject.zRot = zRot; return clientObject; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java index daa9f6bfe..781c600e7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java @@ -2,11 +2,13 @@ import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.SphereRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; @@ -22,6 +24,9 @@ public class SphereObject extends ThreeDimensionalObject { @FixedPointNumberProperty(min = 1, max = 1024) public int stacks = 16; + @FloatingNumberProperty(min = 0.001f, max = 128) + public float radius = 1; + public SphereObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); reflectivelyMapProperties(arguments); @@ -31,12 +36,46 @@ public SphereObject(UUID player) { super(player); } + @LuaFunction + public final void setRadius(float radius) { + this.radius = radius; + getModule().update(this); + } + + @LuaFunction + public final float getRadius() { + return radius; + } + + @LuaFunction + public final void setSectors(int sectors) { + this.sectors = sectors; + getModule().update(this); + } + + @LuaFunction + public final int getSectors() { + return sectors; + } + + @LuaFunction + public final void setStacks(int stacks) { + this.stacks = stacks; + getModule().update(this); + } + + @LuaFunction + public final int getStacks() { + return stacks; + } + @Override public void encode(FriendlyByteBuf buffer) { buffer.writeInt(TYPE_ID); super.encode(buffer); buffer.writeInt(sectors); buffer.writeInt(stacks); + buffer.writeFloat(radius); } public static SphereObject decode(FriendlyByteBuf buffer) { @@ -50,18 +89,21 @@ public static SphereObject decode(FriendlyByteBuf buffer) { int color = buffer.readInt(); float opacity = buffer.readFloat(); - int x = buffer.readInt(); - int y = buffer.readInt(); - int z = buffer.readInt(); - int maxX = buffer.readInt(); - int maxY = buffer.readInt(); - int maxZ = buffer.readInt(); - + float x = buffer.readFloat(); + float y = buffer.readFloat(); + float z = buffer.readFloat(); + float maxX = buffer.readFloat(); + float maxY = buffer.readFloat(); + float maxZ = buffer.readFloat(); boolean disableDepthTest = buffer.readBoolean(); boolean disableCulling = buffer.readBoolean(); + float xRot = buffer.readFloat(); + float yRot = buffer.readFloat(); + float zRot = buffer.readFloat(); int sectors = buffer.readInt(); int stacks = buffer.readInt(); + float radius = buffer.readFloat(); SphereObject clientObject = new SphereObject(player); clientObject.setId(objectId); @@ -75,8 +117,12 @@ public static SphereObject decode(FriendlyByteBuf buffer) { clientObject.maxZ = maxZ; clientObject.disableDepthTest = disableDepthTest; clientObject.disableCulling = disableCulling; + clientObject.xRot = xRot; + clientObject.yRot = yRot; + clientObject.zRot = zRot; clientObject.sectors = sectors; clientObject.stacks = stacks; + clientObject.radius = radius; return clientObject; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java index efdd161ce..2c219edbf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java @@ -6,6 +6,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import net.minecraft.network.FriendlyByteBuf; import java.util.UUID; @@ -18,6 +19,15 @@ public abstract class ThreeDimensionalObject extends RenderableObject { @BooleanProperty public boolean disableCulling = false; + @FloatingNumberProperty(min = 0, max = 360) + public float xRot = 0f; + + @FloatingNumberProperty(min = 0, max = 360) + public float yRot = 0f; + + @FloatingNumberProperty(min = 0, max = 360) + public float zRot = 0f; + public ThreeDimensionalObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); } @@ -48,12 +58,48 @@ public final boolean getCulling() { return disableCulling; } + @LuaFunction + public final void setXRot(double xRot) { + this.xRot = (float) xRot; + getModule().update(this); + } + + @LuaFunction + public final double getXRot() { + return xRot; + } + + @LuaFunction + public final void setYRot(double yRot) { + this.yRot = (float) yRot; + getModule().update(this); + } + + @LuaFunction + public final double getYRot() { + return yRot; + } + + @LuaFunction + public final void setZRot(double zRot) { + this.zRot = (float) zRot; + getModule().update(this); + } + + @LuaFunction + public final double getZRot() { + return zRot; + } + @Override public void encode(FriendlyByteBuf buffer) { super.encode(buffer); buffer.writeBoolean(disableDepthTest); buffer.writeBoolean(disableCulling); + buffer.writeFloat(xRot); + buffer.writeFloat(yRot); + buffer.writeFloat(zRot); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/TorusObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/TorusObject.java new file mode 100644 index 000000000..d47c300ee --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/TorusObject.java @@ -0,0 +1,152 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.TorusRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.UUID; + +public class TorusObject extends ThreeDimensionalObject { + public static final int TYPE_ID = 7; + + private final IObjectRenderer renderer = new TorusRenderer(); + + @FixedPointNumberProperty(min = 1, max = 1024) + public int sides = 32; + + @FixedPointNumberProperty(min = 1, max = 1024) + public int rings = 16; + + @FloatingNumberProperty(min = 0.001f, max = 128) + public float minorRadius = 0.1f; + + @FloatingNumberProperty(min = 0.001f, max = 128) + public float majorRadius = 0.5f; + + public TorusObject(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); + reflectivelyMapProperties(arguments); + } + + public TorusObject(UUID player) { + super(player); + } + + @LuaFunction + public final void setMinorRadius(float radius) { + this.minorRadius = radius; + getModule().update(this); + } + + @LuaFunction + public final float getMinorRadius() { + return minorRadius; + } + + @LuaFunction + public final void setMajorRadius(float radius) { + this.majorRadius = radius; + getModule().update(this); + } + + @LuaFunction + public final float getMajorRadius() { + return majorRadius; + } + + @LuaFunction + public final void setSides(int sides) { + this.sides = sides; + getModule().update(this); + } + + @LuaFunction + public final int getSides() { + return sides; + } + + @LuaFunction + public final void setRings(int rings) { + this.rings = rings; + getModule().update(this); + } + + @LuaFunction + public final int getRings() { + return rings; + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(TYPE_ID); + super.encode(buffer); + buffer.writeInt(sides); + buffer.writeInt(rings); + buffer.writeFloat(minorRadius); + buffer.writeFloat(majorRadius); + } + + public static TorusObject decode(FriendlyByteBuf buffer) { + int objectId = buffer.readInt(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return null; + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + float x = buffer.readFloat(); + float y = buffer.readFloat(); + float z = buffer.readFloat(); + float maxX = buffer.readFloat(); + float maxY = buffer.readFloat(); + float maxZ = buffer.readFloat(); + + boolean disableDepthTest = buffer.readBoolean(); + boolean disableCulling = buffer.readBoolean(); + float xRot = buffer.readFloat(); + float yRot = buffer.readFloat(); + float zRot = buffer.readFloat(); + + int sectors = buffer.readInt(); + int stacks = buffer.readInt(); + float minorRadius = buffer.readFloat(); + float majorRadius = buffer.readFloat(); + + TorusObject clientObject = new TorusObject(player); + clientObject.setId(objectId); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.z = z; + clientObject.maxX = maxX; + clientObject.maxY = maxY; + clientObject.maxZ = maxZ; + clientObject.disableDepthTest = disableDepthTest; + clientObject.disableCulling = disableCulling; + clientObject.xRot = xRot; + clientObject.yRot = yRot; + clientObject.zRot = zRot; + clientObject.sides = sectors; + clientObject.rings = stacks; + clientObject.minorRadius = minorRadius; + clientObject.majorRadius = majorRadius; + + return clientObject; + } + + @Override + public IObjectRenderer getRenderObject() { + return renderer; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java index 99600bd0c..8796fd0e6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java @@ -58,12 +58,12 @@ public static CircleObject decode(FriendlyByteBuf buffer) { int color = buffer.readInt(); float opacity = buffer.readFloat(); - int x = buffer.readInt(); - int y = buffer.readInt(); - int z = buffer.readInt(); - int maxX = buffer.readInt(); - int maxY = buffer.readInt(); - int maxZ = buffer.readInt(); + float x = buffer.readFloat(); + float y = buffer.readFloat(); + float z = buffer.readFloat(); + float maxX = buffer.readFloat(); + float maxY = buffer.readFloat(); + float maxZ = buffer.readFloat(); int radius = buffer.readInt(); CircleObject clientObject = new CircleObject(player); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java index 85a576e0b..c463fe885 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java @@ -54,12 +54,12 @@ public static ItemObject decode(FriendlyByteBuf buffer) { int color = buffer.readInt(); float opacity = buffer.readFloat(); - int x = buffer.readInt(); - int y = buffer.readInt(); - int z = buffer.readInt(); - int maxX = buffer.readInt(); - int maxY = buffer.readInt(); - int maxZ = buffer.readInt(); + float x = buffer.readFloat(); + float y = buffer.readFloat(); + float z = buffer.readFloat(); + float maxX = buffer.readFloat(); + float maxY = buffer.readFloat(); + float maxZ = buffer.readFloat(); String item = buffer.readUtf(); ItemObject clientObject = new ItemObject(player); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java index 6e13ae990..3f618b638 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java @@ -48,13 +48,12 @@ public static RectangleObject decode(FriendlyByteBuf buffer) { int color = buffer.readInt(); float opacity = buffer.readFloat(); - int x = buffer.readInt(); - int y = buffer.readInt(); - int z = buffer.readInt(); - int maxX = buffer.readInt(); - int maxY = buffer.readInt(); - int maxZ = buffer.readInt(); - + float x = buffer.readFloat(); + float y = buffer.readFloat(); + float z = buffer.readFloat(); + float maxX = buffer.readFloat(); + float maxY = buffer.readFloat(); + float maxZ = buffer.readFloat(); RectangleObject clientObject = new RectangleObject(player); clientObject.setId(objectId); clientObject.color = color; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java index ca2f6edbe..525dbcd4a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java @@ -21,23 +21,23 @@ public class RenderableObject extends OverlayObject { @FixedPointNumberProperty(min = 0, max = 0xFFFFFF) public int color = 0xFFFFFF; - @FixedPointNumberProperty(min = -32767, max = 32767) - public int x = 0; + @FloatingNumberProperty(min = -32767, max = 32767) + public float x = 0; - @FixedPointNumberProperty(min = -32767, max = 32767) - public int y = 0; + @FloatingNumberProperty(min = -32767, max = 32767) + public float y = 0; - @FixedPointNumberProperty(min = -32767, max = 32767) - public int z = 0; + @FloatingNumberProperty(min = -32767, max = 32767) + public float z = 0; - @FixedPointNumberProperty(min = -32767, max = 32767) - public int maxX = 0; + @FloatingNumberProperty(min = -32767, max = 32767) + public float maxX = 0; - @FixedPointNumberProperty(min = -32767, max = 32767) - public int maxY = 0; + @FloatingNumberProperty(min = -32767, max = 32767) + public float maxY = 0; - @FixedPointNumberProperty(min = -32767, max = 32767) - public int maxZ = 0; + @FloatingNumberProperty(min = -32767, max = 32767) + public float maxZ = 0; public RenderableObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); @@ -71,46 +71,46 @@ public final void setColor(int color) { } @LuaFunction - public final void setMaxX(int maxX) { + public final void setMaxX(float maxX) { this.maxX = maxX; getModule().update(this); } @LuaFunction - public final int getMaxX() { + public final float getMaxX() { return maxX; } @LuaFunction - public final void setMaxY(int maxY) { + public final void setMaxY(float maxY) { this.maxY = maxY; getModule().update(this); } @LuaFunction - public final int getMaxY() { + public final float getMaxY() { return maxY; } @LuaFunction - public final void setMaxZ(int maxZ) { + public final void setMaxZ(float maxZ) { this.maxZ = maxZ; getModule().update(this); } @LuaFunction - public final int getMaxZ() { + public final float getMaxZ() { return maxZ; } @LuaFunction - public final void setX(int x) { + public final void setX(float x) { this.x = x; getModule().update(this); } @LuaFunction - public final int getX() { + public final float getX() { return x; } @@ -121,18 +121,18 @@ public final void setY(int y) { } @LuaFunction - public final int getY() { + public final float getY() { return y; } @LuaFunction - public final void setZ(int z) { + public final void setZ(float z) { this.z = z; getModule().update(this); } @LuaFunction - public final int getZ() { + public final float getZ() { return z; } @@ -142,12 +142,12 @@ public void encode(FriendlyByteBuf buffer) { buffer.writeInt(color); buffer.writeFloat(opacity); - buffer.writeInt(x); - buffer.writeInt(y); - buffer.writeInt(z); - buffer.writeInt(maxX); - buffer.writeInt(maxY); - buffer.writeInt(maxZ); + buffer.writeFloat(x); + buffer.writeFloat(y); + buffer.writeFloat(z); + buffer.writeFloat(maxX); + buffer.writeFloat(maxY); + buffer.writeFloat(maxZ); } public IObjectRenderer getRenderObject() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java index 7e50e1735..bf628ac41 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java @@ -95,12 +95,12 @@ public static TextObject decode(FriendlyByteBuf buffer) { int color = buffer.readInt(); float opacity = buffer.readFloat(); - int x = buffer.readInt(); - int y = buffer.readInt(); - int z = buffer.readInt(); - int maxX = buffer.readInt(); - int maxY = buffer.readInt(); - int maxZ = buffer.readInt(); + float x = buffer.readFloat(); + float y = buffer.readFloat(); + float z = buffer.readFloat(); + float maxX = buffer.readFloat(); + float maxY = buffer.readFloat(); + float maxZ = buffer.readFloat(); String content = buffer.readUtf(); float fontSize = buffer.readFloat(); boolean shadow = buffer.readBoolean(); From c68ed105bba331ad1219045410d9f1ca76b441b8 Mon Sep 17 00:00:00 2001 From: Srendi Date: Fri, 8 Nov 2024 21:39:00 +0100 Subject: [PATCH 092/188] Textures for our 3d glasses objects, however we hit the mc limits here. I am unable to support textures and different colors/opacity at the same time. I either miss something or we need to make our own shaders --- .../client/RenderUtil.java | 92 ++++++++++++------- .../OverlayModuleLevelRenderer.java | 24 +++-- .../objects/threedim/BoxRenderer.java | 2 +- .../objects/threedim/SphereRenderer.java | 12 +-- .../objects/two_dim/RenderableObject.java | 34 +++---- 5 files changed, 100 insertions(+), 64 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java index 68359833f..4a4826238 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/client/RenderUtil.java @@ -1,6 +1,5 @@ package de.srendi.advancedperipherals.client; -import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix4f; @@ -11,6 +10,7 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.InventoryMenu; public class RenderUtil { @@ -89,21 +89,21 @@ public static void drawPlane(PoseStack posestack, VertexConsumer buffer, float r posestack.popPose(); } - public static void drawTorus(PoseStack poseStack, BufferBuilder consumer, float majorRadius, float minorRadius, double pX, double pY, double pZ, float xRot, float yRot, float zRot, float r, float g, float b, float a, int sides, int rings) { + public static void drawTorus(PoseStack poseStack, VertexConsumer consumer, float majorRadius, float minorRadius, double pX, double pY, double pZ, float xRot, float yRot, float zRot, float r, float g, float b, float a, int sides, int rings) { poseStack.pushPose(); poseStack.translate(pX, pY, pZ); poseStack.mulPose(new Quaternion(xRot, yRot, zRot, true)); Matrix4f matrix4f = poseStack.last().pose(); + TextureAtlasSprite texture = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(new ResourceLocation("block/crimson_stem")); float x, y, z; - float nx, ny, nz; // vertex normal + float nx, ny, nz; float ringStep = (float) (2 * Math.PI / rings); float sideStep = (float) (2 * Math.PI / sides); float ringAngle, sideAngle; - // Start drawing quads for (int i = 0; i < rings; ++i) { ringAngle = i * ringStep; float cosRingAngle = (float) Math.cos(ringAngle); @@ -128,16 +128,13 @@ public static void drawTorus(PoseStack poseStack, BufferBuilder consumer, float float nextCosSideAngle = (float) Math.cos(nextSideAngle); float nextSinSideAngle = (float) Math.sin(nextSideAngle); - // Calculate vertex positions - x = centerX + minorRadius * cosSideAngle * cosRingAngle; - y = centerY + minorRadius * cosSideAngle * sinRingAngle; - z = minorRadius * sinSideAngle; + float s = j / sides; + float t = i / rings; - // Calculate normal (simplified - for smooth shading, average normals of adjacent faces) - nx = x - centerX; - ny = y - centerY; - nz = z; - consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).overlayCoords(OverlayTexture.WHITE_OVERLAY_V).uv(0, 0).uv2(0xFFFFFF).normal(nx, ny, nz).endVertex(); + float u1 = getU(s * sides, texture.getU1(), texture.getU0(), sides); + float u2 = getU((s + 1.0f / sides) * sides, texture.getU1(), texture.getU0(), sides); + float v1 = getV(t * rings, texture.getV1(), texture.getV0(), rings); + float v2 = getV((t + 1.0f / rings) * rings, texture.getV1(), texture.getV0(), rings); x = centerX + minorRadius * nextCosSideAngle * cosRingAngle; y = centerY + minorRadius * nextCosSideAngle * sinRingAngle; @@ -146,16 +143,19 @@ public static void drawTorus(PoseStack poseStack, BufferBuilder consumer, float nx = x - centerX; ny = y - centerY; nz = z; - consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).overlayCoords(OverlayTexture.WHITE_OVERLAY_V).uv(1, 0).uv2(0xFFF0F0).normal(nx, ny, nz).endVertex(); + consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx, ny, nz).endVertex(); - x = nextCenterX + minorRadius * nextCosSideAngle * nextCosRingAngle; - y = nextCenterY + minorRadius * nextCosSideAngle * nextSinRingAngle; - z = minorRadius * nextSinSideAngle; + // Calculate vertex positions + x = centerX + minorRadius * cosSideAngle * cosRingAngle; + y = centerY + minorRadius * cosSideAngle * sinRingAngle; + z = minorRadius * sinSideAngle; - nx = x - nextCenterX; - ny = y - nextCenterY; + // Calculate normal + nx = x - centerX; + ny = y - centerY; nz = z; - consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).overlayCoords(OverlayTexture.WHITE_OVERLAY_V).uv(0, 1).uv2(0xFFFFFF).normal(nx, ny, nz).endVertex(); + + consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx, ny, nz).endVertex(); x = nextCenterX + minorRadius * cosSideAngle * nextCosRingAngle; y = nextCenterY + minorRadius * cosSideAngle * nextSinRingAngle; @@ -164,23 +164,34 @@ public static void drawTorus(PoseStack poseStack, BufferBuilder consumer, float nx = x - nextCenterX; ny = y - nextCenterY; nz = z; - consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).overlayCoords(OverlayTexture.RED_OVERLAY_V).uv(1, 1).uv2(0xF000F0).normal(nx, ny, nz).endVertex(); + consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx, ny, nz).endVertex(); + + + x = nextCenterX + minorRadius * nextCosSideAngle * nextCosRingAngle; + y = nextCenterY + minorRadius * nextCosSideAngle * nextSinRingAngle; + z = minorRadius * nextSinSideAngle; + + nx = x - nextCenterX; + ny = y - nextCenterY; + nz = z; + consumer.vertex(matrix4f, x, y, z).color(r, g, b, a).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx, ny, nz).endVertex(); } } poseStack.popPose(); } - public static void drawSphere(PoseStack poseStack, BufferBuilder consumer, float radius, double pX, double pY, double pZ, float xRot, float yRot, float zRot, float r, float g, float b, float a, int sectors, int stacks) { + public static void drawSphere(PoseStack poseStack, VertexConsumer consumer, float radius, double pX, double pY, double pZ, float xRot, float yRot, float zRot, float r, float g, float b, float a, int sectors, int stacks) { poseStack.pushPose(); poseStack.translate(pX, pY, pZ); poseStack.mulPose(new Quaternion(xRot, yRot, zRot, true)); Matrix4f matrix4f = poseStack.last().pose(); + TextureAtlasSprite texture = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(new ResourceLocation("block/dirt")); float z, xy; float nx1, ny1, nz1, nx2, ny2, nz2, nx3, ny3, nz3, nx4, ny4, nz4, lengthInv = (1.0f / radius); // vertex normal - float s, t; //TODO vertex texCoord + float s, t; float sectorStep = (float) (2 * Math.PI / sectors); float stackStep = (float) (Math.PI / stacks); @@ -226,21 +237,40 @@ public static void drawSphere(PoseStack poseStack, BufferBuilder consumer, float ny4 = y4 * lengthInv; nz4 = z4 * lengthInv; - // Triangle 1 - consumer.vertex(matrix4f, x1, y1, z).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx1, ny1, nz1).endVertex(); - consumer.vertex(matrix4f, x3, y3, z3).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx3, ny3, nz3).endVertex(); - consumer.vertex(matrix4f, x4, y4, z4).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx4, ny4, nz4).endVertex(); + s = j / sectors; + t = i / stacks; + + float u1 = getU(s * sectors, texture.getU1(), texture.getU0(), sectors); + float u2 = getU((s + 1.0d / sectors) * sectors, texture.getU1(), texture.getU0(), sectors); + float v1 = getV(t * stacks, texture.getV1(), texture.getV0(), stacks); + float v2 = getV((t + 1.0d / stacks) * stacks, texture.getV1(), texture.getV0(), stacks); + + // For a reason which I am too dumb to understand, the uv coords have a one pixel offset + // So... I just reverse it and it works + v1 -= (texture.getV1() - texture.getV0()) / stacks; + v2 -= (texture.getV1() - texture.getV0()) / stacks; + + consumer.vertex(matrix4f, x1, y1, z).color(r, g, b, a).uv(u1, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx1, ny1, nz1).endVertex(); + consumer.vertex(matrix4f, x2, y2, z).color(r, g, b, a).uv(u2, v1).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx2, ny2, nz2).endVertex(); + consumer.vertex(matrix4f, x3, y3, z3).color(r, g, b, a).uv(u2, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx3, ny3, nz3).endVertex(); + consumer.vertex(matrix4f, x4, y4, z4).color(r, g, b, a).uv(u1, v2).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx4, ny4, nz4).endVertex(); - // Triangle 2 - consumer.vertex(matrix4f, x1, y1, z).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx1, ny1, nz1).endVertex(); - consumer.vertex(matrix4f, x2, y2, z).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx2, ny2, nz2).endVertex(); - consumer.vertex(matrix4f, x3, y3, z3).color(r, g, b, a).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(0xF000F0).normal(nx3, ny3, nz3).endVertex(); } } poseStack.popPose(); } + private static float getU(double pU, float u1, float u0, float resolution) { + float f = u1 - u0; + return u0 + f * (float) pU / resolution; + } + + private static float getV(double pV, float v1, float v0, float resolution) { + float f = v1 - v0; + return v0 + f * (float) pV / resolution; + } + public static void drawBox(PoseStack poseStack, VertexConsumer buffer, ResourceLocation texture, float pX, float pY, float pZ, float xRot, float yRot, float zRot, float sX, float sY, float sZ, float pUOffset, float pVOffset, float pWidth, float pHeight) { poseStack.pushPose(); sX = sX / 16; //Sizes in pixels please diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java index cdadf3988..48bb64ccb 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java @@ -6,7 +6,7 @@ import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.VertexConsumer; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer; @@ -18,6 +18,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderLevelStageEvent; @@ -64,7 +65,6 @@ public static void renderLevelState(RenderLevelStageEvent event) { } //TODO Everything below here is just for debugging and testing. Will be removed before we push to production - BlockPos blockPos = new BlockPos(2, 10, 0); float[] colors = EnumColor.DARK_PURPLE.getRgb(); @@ -80,27 +80,33 @@ public static void renderLevelState(RenderLevelStageEvent event) { BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); - bufferbuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR_NORMAL); + VertexConsumer boxVertexConsumer = Minecraft.getInstance().renderBuffers().bufferSource().getBuffer(RenderType.entityCutout(InventoryMenu.BLOCK_ATLAS)); + //RenderSystem.setShader(GameRenderer::getPositionColorLightmapShader); + + //bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_LIGHTMAP); posestack.pushPose(); + colors = EnumColor.WHITE.getRgb(); blockPos = new BlockPos(0, 10, 0); posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); - RenderUtil.drawSphere(posestack, bufferbuilder, 0.5f, 0f, 0f, 0f, 90f, 0f, 0f, colors[0], colors[1], colors[2], 0.6f, 128, 48); + RenderUtil.drawSphere(posestack, boxVertexConsumer, 2f, 0f, 0f, 0f, 270f, 0f, 0f, colors[0], colors[1], colors[2], 0.4f, 16, 128); - BufferUploader.drawWithShader(bufferbuilder.end()); + //BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); - bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_NORMAL); + boxVertexConsumer = Minecraft.getInstance().renderBuffers().bufferSource().getBuffer(RenderType.entityCutout(InventoryMenu.BLOCK_ATLAS)); + + //bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_NORMAL); posestack.pushPose(); - colors = EnumColor.DARK_BLUE.getRgb(); + colors = EnumColor.WHITE.getRgb(); blockPos = new BlockPos(6, 10, 0); posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); - RenderUtil.drawTorus(posestack, bufferbuilder, 0.5f, 0.09f, 0f, 0f, 0f, 0f, 0f, 0f, colors[0], colors[1], colors[2], 0.6f, 300, 32); + RenderUtil.drawTorus(posestack, boxVertexConsumer, 1f, 0.4f, 0f, 0f, 0f, 0f, 0f, 0f, colors[0], colors[1], colors[2], 1f, 48, 48); - BufferUploader.drawWithShader(bufferbuilder.end()); + //BufferUploader.drawWithShader(bufferbuilder.end()); posestack.popPose(); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java index 16b2ee29e..8488d3ab0 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java @@ -35,7 +35,7 @@ public void renderBatch(List batch, RenderLevelStageEven float blue = RenderUtil.getBlue(box.color); poseStack.translate(-view.x + box.getX(), -view.y + box.getY(), -view.z + box.getZ()); - RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, box.x, box.y, box.z, obj.xRot, obj.yRot, obj.zRot, obj.getMaxX(), obj.getMaxY(), obj.getMaxX()); + RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, box.x, box.y, box.z, obj.xRot, obj.yRot, obj.zRot, obj.maxX, obj.maxY, obj.maxZ); BufferUploader.drawWithShader(bufferBuilder.end()); onPostRender(obj); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java index ebea9bd70..e3c468f06 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java @@ -2,14 +2,15 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.BufferUploader; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.VertexConsumer; import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.SphereObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.event.RenderLevelStageEvent; @@ -24,7 +25,7 @@ public void renderBatch(List batch, RenderLevelStageEven for (ThreeDimensionalObject obj : batch) { poseStack.pushPose(); onPreRender(obj); - bufferBuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR_NORMAL); + VertexConsumer boxVertexConsumer = Minecraft.getInstance().renderBuffers().bufferSource().getBuffer(RenderType.entitySmoothCutout(TextureAtlas.LOCATION_BLOCKS)); SphereObject sphere = (SphereObject) obj; @@ -35,8 +36,7 @@ public void renderBatch(List batch, RenderLevelStageEven float blue = RenderUtil.getRed(sphere.color); poseStack.translate(-view.x, -view.y, -view.z); - RenderUtil.drawSphere(poseStack, bufferBuilder, sphere.radius, sphere.x, sphere.y, sphere.z, sphere.xRot, sphere.yRot, sphere.zRot, red, green, blue, alpha, sphere.sectors, sphere.stacks); - BufferUploader.drawWithShader(bufferBuilder.end()); + RenderUtil.drawSphere(poseStack, boxVertexConsumer, sphere.radius, sphere.x, sphere.y, sphere.z, sphere.xRot, sphere.yRot, sphere.zRot, red, green, blue, alpha, sphere.sectors, sphere.stacks); onPostRender(obj); poseStack.popPose(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java index 525dbcd4a..c9c640bdc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java @@ -71,63 +71,63 @@ public final void setColor(int color) { } @LuaFunction - public final void setMaxX(float maxX) { - this.maxX = maxX; + public final void setMaxX(double maxX) { + this.maxX = (float) maxX; getModule().update(this); } @LuaFunction - public final float getMaxX() { + public final double getMaxX() { return maxX; } @LuaFunction - public final void setMaxY(float maxY) { - this.maxY = maxY; + public final void setMaxY(double maxY) { + this.maxY = (float) maxY; getModule().update(this); } @LuaFunction - public final float getMaxY() { + public final double getMaxY() { return maxY; } @LuaFunction - public final void setMaxZ(float maxZ) { - this.maxZ = maxZ; + public final void setMaxZ(double maxZ) { + this.maxZ = (float) maxZ; getModule().update(this); } @LuaFunction - public final float getMaxZ() { + public final double getMaxZ() { return maxZ; } @LuaFunction - public final void setX(float x) { - this.x = x; + public final void setX(double x) { + this.x = (float) x; getModule().update(this); } @LuaFunction - public final float getX() { + public final double getX() { return x; } @LuaFunction - public final void setY(int y) { - this.y = y; + public final void setY(double y) { + this.y = (float) y; getModule().update(this); } @LuaFunction - public final float getY() { + public final double getY() { return y; } @LuaFunction - public final void setZ(float z) { - this.z = z; + public final void setZ(double z) { + this.z = (float) z; getModule().update(this); } From 4fe0220df3fa8e3ced297350dfa9dc0050b4437a Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 17 Dec 2024 12:29:16 -0700 Subject: [PATCH 093/188] add volatile keyword to DistanceDetector fields --- .../DistanceDetectorPeripheral.java | 5 +- .../blockentities/DistanceDetectorEntity.java | 83 ++++++++++--------- 2 files changed, 47 insertions(+), 41 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index af1045e4c..8acb1a323 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -41,8 +41,7 @@ public final boolean ignoresTransparency() { @LuaFunction public final void setDetectionMode(int mode) { - if (mode > 2) mode = 2; - if (mode < 0) mode = 0; + mode = Math.min(Math.max(mode, 0), 2); getPeripheralOwner().tileEntity.setDetectionType(DetectionType.values()[mode]); } @@ -71,7 +70,7 @@ public final double getDistance() { @LuaFunction public final double calculateDistance() { - return getPeripheralOwner().tileEntity.calculateDistance() - 1; + return getPeripheralOwner().tileEntity.calculateAndUpdateDistance() - 1; } @LuaFunction diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index b9f45d060..d83d404c5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -19,14 +19,17 @@ import net.minecraft.world.phys.*; import org.jetbrains.annotations.NotNull; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + public class DistanceDetectorEntity extends PeripheralBlockEntity { - private double maxRange = APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get(); - private float currentDistance = 0; - private boolean showLaser = true; - private boolean shouldCalculatePeriodically = false; - private boolean ignoreTransparent = true; - private DistanceDetectorPeripheral.DetectionType detectionType = DistanceDetectorPeripheral.DetectionType.BOTH; + private volatile double maxRange = APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get(); + private final AtomicInteger currentDistance = new AtomicInteger(Float.floatToRawIntBits(0)); + private final AtomicBoolean showLaser = new AtomicBoolean(true); + private volatile boolean periodicallyCalculate = false; + private volatile boolean ignoreTransparent = true; + private volatile DistanceDetectorPeripheral.DetectionType detectionType = DistanceDetectorPeripheral.DetectionType.BOTH; public DistanceDetectorEntity(BlockPos pos, BlockState state) { super(APBlockEntityTypes.DISTANCE_DETECTOR.get(), pos, state); @@ -39,43 +42,44 @@ protected DistanceDetectorPeripheral createPeripheral() { } public void setShowLaser(boolean showLaser) { - if (this.showLaser != showLaser) - APNetworking.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, showLaser)); - this.showLaser = showLaser; + if (this.showLaser.getAndSet(showLaser) != showLaser) { + APNetworking.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), this.getCurrentDistance(), showLaser)); + } } public void setCurrentDistance(float currentDistance) { - if (this.currentDistance != currentDistance) - APNetworking.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, showLaser)); - this.currentDistance = currentDistance; + int currentDistanceBits = Float.floatToRawIntBits(currentDistance); + if (this.currentDistance.getAndSet(currentDistanceBits) != currentDistanceBits) { + APNetworking.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, this.getLaserVisibility())); + } } - public void setShouldCalculatePeriodically(boolean shouldCalculatePeriodically) { - this.shouldCalculatePeriodically = shouldCalculatePeriodically; + public void setShouldCalculatePeriodically(boolean periodicallyCalculate) { + this.periodicallyCalculate = periodicallyCalculate; } public double getMaxDistance() { - return maxRange; + return this.maxRange; } public void setMaxRange(double maxRange) { - this.maxRange = maxRange; + this.maxRange = Math.min(Math.max(maxRange, 0), APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get()); } public float getCurrentDistance() { - return currentDistance; + return Float.intBitsToFloat(this.currentDistance.get()); } public boolean getLaserVisibility() { - return showLaser; + return this.showLaser.get(); } public boolean shouldCalculatePeriodically() { - return shouldCalculatePeriodically; + return this.periodicallyCalculate; } public boolean ignoreTransparent() { - return ignoreTransparent; + return this.ignoreTransparent; } public void setIgnoreTransparent(boolean ignoreTransparent) { @@ -83,7 +87,7 @@ public void setIgnoreTransparent(boolean ignoreTransparent) { } public DistanceDetectorPeripheral.DetectionType getDetectionType() { - return detectionType; + return this.detectionType; } public void setDetectionType(DistanceDetectorPeripheral.DetectionType detectionType) { @@ -92,47 +96,53 @@ public void setDetectionType(DistanceDetectorPeripheral.DetectionType detectionT @Override public void handleTick(Level level, BlockState state, BlockEntityType type) { - if (level.getGameTime() % APConfig.PERIPHERALS_CONFIG.distanceDetectorUpdateRate.get() == 0 && shouldCalculatePeriodically) { + if (level.getGameTime() % APConfig.PERIPHERALS_CONFIG.distanceDetectorUpdateRate.get() == 0 && this.shouldCalculatePeriodically()) { // We calculate the distance every 2 ticks, so we do not have to run the getDistance function of the peripheral // on the main thread which prevents the 1 tick yield time of the function. // The calculateDistance function is not thread safe, so we have to run it on the main thread. // It should be okay to run that function every 2 ticks, calculating it does not take too much time. - calculateDistance(); + this.calculateAndUpdateDistance(); } } @Override public AABB getRenderBoundingBox() { + final float currentDistance = this.getCurrentDistance(); Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front(); return AABB.ofSize(Vec3.atCenterOf(getBlockPos()), direction.getStepX() * currentDistance + 1, direction.getStepY() * currentDistance + 1, direction.getStepZ() * currentDistance + 1) .move(direction.getStepX() * currentDistance / 2, direction.getStepY() * currentDistance / 2, direction.getStepZ() * currentDistance / 2); } public double calculateDistance() { + final double maxRange = this.maxRange; Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front(); Vec3 center = Vec3.atCenterOf(getBlockPos()); Vec3 from = center.add(direction.getStepX() * 0.501, direction.getStepY() * 0.501, direction.getStepZ() * 0.501); Vec3 to = from.add(direction.getStepX() * maxRange, direction.getStepY() * maxRange, direction.getStepZ() * maxRange); HitResult result = getResult(to, from); - float distance = calculateDistance(result, center, direction); - setCurrentDistance(distance); + return calculateDistance(result, level, center, direction); + } + + public double calculateAndUpdateDistance() { + double distance = this.calculateDistance(); + this.setCurrentDistance((float) distance); return distance; } private HitResult getResult(Vec3 to, Vec3 from) { - if (detectionType == DistanceDetectorPeripheral.DetectionType.ENTITIES) - return HitResultUtil.getEntityHitResult(to, from, getLevel()); - if (detectionType == DistanceDetectorPeripheral.DetectionType.BLOCK) - return HitResultUtil.getBlockHitResult(to, from, getLevel(), ignoreTransparent); - return HitResultUtil.getHitResult(to, from, getLevel(), ignoreTransparent); + return switch (this.detectionType) { + case ENTITIES -> HitResultUtil.getEntityHitResult(to, from, getLevel()); + case BLOCK -> HitResultUtil.getBlockHitResult(to, from, getLevel(), this.ignoreTransparent); + default -> HitResultUtil.getHitResult(to, from, getLevel(), this.ignoreTransparent); + }; } - private float calculateDistance(HitResult result, Vec3 center, Direction direction) { + private static float calculateDistance(HitResult result, Level level, Vec3 center, Direction direction) { float distance = 0; if (result.getType() != HitResult.Type.MISS) { if (result instanceof BlockHitResult blockHitResult) { - BlockState resultBlock = getLevel().getBlockState(blockHitResult.getBlockPos()); + BlockState resultBlock = level.getBlockState(blockHitResult.getBlockPos()); distance = distManhattan(Vec3.atCenterOf(blockHitResult.getBlockPos()), center); distance = amendDistance(resultBlock, direction, distance); @@ -144,7 +154,7 @@ private float calculateDistance(HitResult result, Vec3 center, Direction directi return distance; } - private float amendDistance(BlockState resultBlock, Direction direction, float distance) { + private static float amendDistance(BlockState resultBlock, Direction direction, float distance) { if (resultBlock.getBlock() instanceof SlabBlock && direction.getAxis() == Direction.Axis.Y) { SlabType type = resultBlock.getValue(SlabBlock.TYPE); if (type == SlabType.TOP && direction == Direction.UP) @@ -155,10 +165,7 @@ private float amendDistance(BlockState resultBlock, Direction direction, float d return distance; } - private float distManhattan(Vec3 from, Vec3 to) { - float f = (float) Math.abs(from.x - to.x); - float f1 = (float) Math.abs(from.y - to.y); - float f2 = (float) Math.abs(from.z - to.z); - return f + f1 + f2; + private static float distManhattan(Vec3 from, Vec3 to) { + return Math.abs((float)(from.x - to.x)) + Math.abs((float)(from.y - to.y)) + Math.abs((float)(from.z - to.z)); } } From 7a5b34b362f6cb66332f38526c9b4d0cec4cc46e Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 17 Dec 2024 15:47:00 -0700 Subject: [PATCH 094/188] fix distance detector max distance behaviour --- .../renderer/DistanceDetectorRenderer.java | 9 ++- .../DistanceDetectorPeripheral.java | 4 +- .../blockentities/DistanceDetectorEntity.java | 58 +++++----------- .../common/util/HitResultUtil.java | 67 ++++++++++--------- 4 files changed, 61 insertions(+), 77 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java index 6731f755e..55b7b6f05 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java @@ -28,8 +28,13 @@ public DistanceDetectorRenderer(BlockEntityRendererProvider.Context pContext) { @Override public void render(@NotNull DistanceDetectorEntity pBlockEntity, float pPartialTick, @NotNull PoseStack pPoseStack, MultiBufferSource pBufferSource, int pPackedLight, int pPackedOverlay) { - if (pBlockEntity.getLaserVisibility()) - renderBeaconBeam(pBlockEntity, pPoseStack, pBufferSource, BeaconRenderer.BEAM_LOCATION, pPartialTick, 1, 0, pBlockEntity.getCurrentDistance() - 0.5f, EnumColor.RED.getRgb(), 0.05f, 0.09f); + if (pBlockEntity.getLaserVisibility()) { + float distance = pBlockEntity.getCurrentDistance(); + if (distance == -1) { + distance = pBlockEntity.getMaxDistance(); + } + renderBeaconBeam(pBlockEntity, pPoseStack, pBufferSource, BeaconRenderer.BEAM_LOCATION, pPartialTick, 1, 0, distance + 0.5f, EnumColor.RED.getRgb(), 0.05f, 0.09f); + } } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 8acb1a323..9aef4caf5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -65,12 +65,12 @@ public final String getDetectionMode() { @LuaFunction public final double getDistance() { - return getPeripheralOwner().tileEntity.getCurrentDistance() - 1; + return getPeripheralOwner().tileEntity.getCurrentDistance(); } @LuaFunction public final double calculateDistance() { - return getPeripheralOwner().tileEntity.calculateAndUpdateDistance() - 1; + return getPeripheralOwner().tileEntity.calculateAndUpdateDistance(); } @LuaFunction diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index d83d404c5..08bbb7b7a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -24,7 +24,7 @@ public class DistanceDetectorEntity extends PeripheralBlockEntity { - private volatile double maxRange = APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get(); + private volatile float maxRange = (float) APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get(); private final AtomicInteger currentDistance = new AtomicInteger(Float.floatToRawIntBits(0)); private final AtomicBoolean showLaser = new AtomicBoolean(true); private volatile boolean periodicallyCalculate = false; @@ -58,12 +58,12 @@ public void setShouldCalculatePeriodically(boolean periodicallyCalculate) { this.periodicallyCalculate = periodicallyCalculate; } - public double getMaxDistance() { + public float getMaxDistance() { return this.maxRange; } - public void setMaxRange(double maxRange) { - this.maxRange = Math.min(Math.max(maxRange, 0), APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get()); + public void setMaxRange(float maxRange) { + this.maxRange = Math.min(Math.max(maxRange, 0), (float) APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get()); } public float getCurrentDistance() { @@ -117,11 +117,14 @@ public double calculateDistance() { final double maxRange = this.maxRange; Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front(); Vec3 center = Vec3.atCenterOf(getBlockPos()); - Vec3 from = center.add(direction.getStepX() * 0.501, direction.getStepY() * 0.501, direction.getStepZ() * 0.501); + Vec3 from = center; Vec3 to = from.add(direction.getStepX() * maxRange, direction.getStepY() * maxRange, direction.getStepZ() * maxRange); - HitResult result = getResult(to, from); - return calculateDistance(result, level, center, direction); + HitResult result = this.getHitResult(to, from); + if (result.getType() == HitResult.Type.MISS) { + return -1; + } + return getDistanceOnDirection(direction, result.getLocation(), center) - 0.5f; } public double calculateAndUpdateDistance() { @@ -130,42 +133,17 @@ public double calculateAndUpdateDistance() { return distance; } - private HitResult getResult(Vec3 to, Vec3 from) { + private HitResult getHitResult(Vec3 to, Vec3 from) { + Level level = this.getLevel(); return switch (this.detectionType) { - case ENTITIES -> HitResultUtil.getEntityHitResult(to, from, getLevel()); - case BLOCK -> HitResultUtil.getBlockHitResult(to, from, getLevel(), this.ignoreTransparent); - default -> HitResultUtil.getHitResult(to, from, getLevel(), this.ignoreTransparent); + case ENTITIES -> HitResultUtil.getEntityHitResult(to, from, level); + case BLOCK -> HitResultUtil.getBlockHitResult(to, from, level, this.ignoreTransparent); + default -> HitResultUtil.getHitResult(to, from, level, this.ignoreTransparent); }; } - private static float calculateDistance(HitResult result, Level level, Vec3 center, Direction direction) { - float distance = 0; - if (result.getType() != HitResult.Type.MISS) { - if (result instanceof BlockHitResult blockHitResult) { - BlockState resultBlock = level.getBlockState(blockHitResult.getBlockPos()); - distance = distManhattan(Vec3.atCenterOf(blockHitResult.getBlockPos()), center); - - distance = amendDistance(resultBlock, direction, distance); - } - if (result instanceof EntityHitResult entityHitResult) { - distance = distManhattan(entityHitResult.getLocation(), center); - } - } - return distance; - } - - private static float amendDistance(BlockState resultBlock, Direction direction, float distance) { - if (resultBlock.getBlock() instanceof SlabBlock && direction.getAxis() == Direction.Axis.Y) { - SlabType type = resultBlock.getValue(SlabBlock.TYPE); - if (type == SlabType.TOP && direction == Direction.UP) - return distance + 0.5f; - if (type == SlabType.BOTTOM && direction == Direction.DOWN) - return distance - 0.5f; - } - return distance; - } - - private static float distManhattan(Vec3 from, Vec3 to) { - return Math.abs((float)(from.x - to.x)) + Math.abs((float)(from.y - to.y)) + Math.abs((float)(from.z - to.z)); + private static float getDistanceOnDirection(Direction direction, Vec3 from, Vec3 to) { + Direction.Axis axis = direction.getAxis(); + return Math.abs((float)(axis.choose(from.x, from.y, from.z) - axis.choose(to.x, to.y, to.z))); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java index 1a9508a1e..d3d0c9c1e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java @@ -34,22 +34,19 @@ public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, boolean ig EntityHitResult entityResult = getEntityHitResult(to, from, level); BlockHitResult blockResult = getBlockHitResult(to, from, level, ignoreTransparent); - if (entityResult.getType() != HitResult.Type.MISS && blockResult.getType() == HitResult.Type.MISS) - return entityResult; - - if (entityResult.getType() == HitResult.Type.MISS && blockResult.getType() != HitResult.Type.MISS) + if (entityResult.getType() == HitResult.Type.MISS) { + if (blockResult.getType() == HitResult.Type.MISS) { + return BlockHitResult.miss(from, blockResult.getDirection(), new BlockPos(to)); + } return blockResult; + } else if (blockResult.getType() == HitResult.Type.MISS) { + return entityResult; + } - if (entityResult.getType() == HitResult.Type.MISS && blockResult.getType() == HitResult.Type.MISS) - return BlockHitResult.miss(from, blockResult.getDirection(), new BlockPos(to)); - - double blockDistance = new BlockPos(from).distManhattan(blockResult.getBlockPos()); - double entityDistance = new BlockPos(from).distManhattan(new Vec3i(entityResult.getLocation().x, entityResult.getLocation().y, entityResult.getLocation().z)); + double blockDistance = from.distanceToSqr(blockResult.getLocation()); + double entityDistance = from.distanceToSqr(entityResult.getLocation()); - if (blockDistance < entityDistance) - return blockResult; - - return entityResult; + return blockDistance < entityDistance ? blockResult : entityResult; } /** @@ -69,27 +66,24 @@ public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level List entities = level.getEntities((Entity) null, checkingBox, (entity) -> true); - if (entities.isEmpty()) - return new EmptyEntityHitResult(); - Entity nearestEntity = null; + Vec3 hitPos = null; + double nearestDist = 0; // Find the nearest entity for (Entity entity : entities) { - if (nearestEntity == null) { - nearestEntity = entity; - continue; + Vec3 pos = entity.getBoundingBox().clip(from, to).orElse(null); + if (pos != null) { + double distance = from.distanceToSqr(pos); + if (nearestEntity == null || distance < nearestDist) { + nearestEntity = entity; + hitPos = pos; + nearestDist = distance; + } } - - double distance = new BlockPos(from).distManhattan(new Vec3i(entity.getX(), entity.getY(), entity.getZ())); - double nearestDistance = new BlockPos(from).distManhattan(new Vec3i(nearestEntity.getX(), nearestEntity.getY(), nearestEntity.getZ())); - - // If it's closer, set it as the nearest entity - if (distance < nearestDistance) - nearestEntity = entity; } - return new EntityHitResult(nearestEntity); + return nearestEntity == null ? EmptyEntityHitResult.INSTANCE : new EntityHitResult(nearestEntity, hitPos); } /** @@ -103,15 +97,16 @@ public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level */ @NotNull public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreNoOccluded) { - return level.clip(new AdvancecClipContext(from, to, ignoreNoOccluded ? IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, null)); + return level.clip(new AdvancedClipContext(from, to, ignoreNoOccluded ? IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, null, true)); } public static class EmptyEntityHitResult extends EntityHitResult { + public static final EmptyEntityHitResult INSTANCE = new EmptyEntityHitResult(); /** * The super constructor is a NotNull argument but since this result is empty, we'll just return null */ - public EmptyEntityHitResult() { + private EmptyEntityHitResult() { super(null, null); } @@ -125,9 +120,10 @@ public Type getType() { /** * A shape getter which ignores blocks which are not occluding like glass */ - private enum IgnoreNoOccludedContext implements ClipContext.ShapeGetter { + private static class IgnoreNoOccludedContext implements ClipContext.ShapeGetter { + public static final IgnoreNoOccludedContext INSTANCE = new IgnoreNoOccludedContext(); - INSTANCE; + private IgnoreNoOccludedContext() {} @NotNull @Override @@ -139,18 +135,23 @@ public VoxelShape get(BlockState pState, @NotNull BlockGetter pBlock, @NotNull B /** * A clip context but with a custom shape getter. Used to define another shape getter for the block like {@link IgnoreNoOccludedContext} */ - private static class AdvancecClipContext extends ClipContext { + private static class AdvancedClipContext extends ClipContext { private final ShapeGetter blockShapeGetter; + private final boolean ignoreSourceBlock; - protected AdvancecClipContext(Vec3 from, Vec3 to, ShapeGetter blockShapeGetter, Fluid fluidShapeGetter, @Nullable Entity entity) { + protected AdvancedClipContext(Vec3 from, Vec3 to, ShapeGetter blockShapeGetter, Fluid fluidShapeGetter, @Nullable Entity entity, boolean ignoreSourceBlock) { super(from, to, Block.COLLIDER, fluidShapeGetter, entity); this.blockShapeGetter = blockShapeGetter; + this.ignoreSourceBlock = ignoreSourceBlock; } @NotNull @Override public VoxelShape getBlockShape(@NotNull BlockState pBlockState, @NotNull BlockGetter pLevel, @NotNull BlockPos pPos) { + if (this.ignoreSourceBlock && pPos.equals(new BlockPos(this.getFrom()))) { + return Shapes.empty(); + } return blockShapeGetter.get(pBlockState, pLevel, pPos, this.collisionContext); } } From a4906c29baf1084bc64261b25ce09897246c0216 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 17 Dec 2024 15:50:02 -0700 Subject: [PATCH 095/188] fix double float convert --- .../computercraft/peripheral/DistanceDetectorPeripheral.java | 2 +- .../common/blocks/blockentities/DistanceDetectorEntity.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 9aef4caf5..3a83fe304 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -85,7 +85,7 @@ public final void setCalculatePeriodically(boolean shouldRenderPeriodically) { @LuaFunction public final void setMaxRange(double maxDistance) { - getPeripheralOwner().tileEntity.setMaxRange(Math.max(0, Math.min(APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get(), maxDistance))); + getPeripheralOwner().tileEntity.setMaxRange((float) maxDistance); } @LuaFunction diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 08bbb7b7a..50ea33462 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -24,7 +24,7 @@ public class DistanceDetectorEntity extends PeripheralBlockEntity { - private volatile float maxRange = (float) APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get(); + private volatile float maxRange = APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue(); private final AtomicInteger currentDistance = new AtomicInteger(Float.floatToRawIntBits(0)); private final AtomicBoolean showLaser = new AtomicBoolean(true); private volatile boolean periodicallyCalculate = false; @@ -63,7 +63,7 @@ public float getMaxDistance() { } public void setMaxRange(float maxRange) { - this.maxRange = Math.min(Math.max(maxRange, 0), (float) APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get()); + this.maxRange = Math.min(Math.max(maxRange, 0), APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue()); } public float getCurrentDistance() { From 6ef834b7ba08efae0708338d64bdbcd68ffc89bf Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 12:07:57 -0700 Subject: [PATCH 096/188] Persistence distance detector settings --- .../renderer/DistanceDetectorRenderer.java | 2 +- .../DistanceDetectorPeripheral.java | 2 +- .../blocks/base/PeripheralBlockEntity.java | 7 +- .../blockentities/DistanceDetectorEntity.java | 110 ++++++++++++++---- .../common/network/APNetworking.java | 2 - .../toclient/DistanceDetectorSyncPacket.java | 59 ---------- 6 files changed, 95 insertions(+), 87 deletions(-) delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toclient/DistanceDetectorSyncPacket.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java index 55b7b6f05..2bb048706 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java @@ -31,7 +31,7 @@ public void render(@NotNull DistanceDetectorEntity pBlockEntity, float pPartialT if (pBlockEntity.getLaserVisibility()) { float distance = pBlockEntity.getCurrentDistance(); if (distance == -1) { - distance = pBlockEntity.getMaxDistance(); + distance = pBlockEntity.getMaxRange(); } renderBeaconBeam(pBlockEntity, pPoseStack, pBufferSource, BeaconRenderer.BEAM_LOCATION, pPartialTick, 1, 0, distance + 0.5f, EnumColor.RED.getRgb(), 0.05f, 0.09f); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 3a83fe304..105292147 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -90,7 +90,7 @@ public final void setMaxRange(double maxDistance) { @LuaFunction public final double getMaxRange() { - return getPeripheralOwner().tileEntity.getMaxDistance(); + return getPeripheralOwner().tileEntity.getMaxRange(); } public enum DetectionType { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java index 654fefeb3..e98b317d8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java @@ -230,7 +230,12 @@ public CompoundTag getPeripheralSettings() { @Override public void markSettingsChanged() { - setChanged(); + this.setChanged(); + } + + protected void sendUpdate() { + this.setChanged(); + this.getLevel().sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 11); } public ComputerSide getComputerSide(Direction direction) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 50ea33462..db5b451cc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -5,11 +5,13 @@ import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.network.APNetworking; -import de.srendi.advancedperipherals.common.network.toclient.DistanceDetectorSyncPacket; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.util.HitResultUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.SlabBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -17,6 +19,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.SlabType; import net.minecraft.world.phys.*; + import org.jetbrains.annotations.NotNull; import java.util.concurrent.atomic.AtomicBoolean; @@ -24,8 +27,8 @@ public class DistanceDetectorEntity extends PeripheralBlockEntity { - private volatile float maxRange = APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue(); - private final AtomicInteger currentDistance = new AtomicInteger(Float.floatToRawIntBits(0)); + private final AtomicInteger maxRange = new AtomicInteger(Float.floatToRawIntBits(APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue())); + private final AtomicInteger currentDistance = new AtomicInteger(Float.floatToRawIntBits(-1)); private final AtomicBoolean showLaser = new AtomicBoolean(true); private volatile boolean periodicallyCalculate = false; private volatile boolean ignoreTransparent = true; @@ -41,49 +44,70 @@ protected DistanceDetectorPeripheral createPeripheral() { return new DistanceDetectorPeripheral(this); } - public void setShowLaser(boolean showLaser) { - if (this.showLaser.getAndSet(showLaser) != showLaser) { - APNetworking.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), this.getCurrentDistance(), showLaser)); - } + public float getMaxRange() { + return Float.intBitsToFloat(this.maxRange.get()); } - public void setCurrentDistance(float currentDistance) { - int currentDistanceBits = Float.floatToRawIntBits(currentDistance); - if (this.currentDistance.getAndSet(currentDistanceBits) != currentDistanceBits) { - APNetworking.sendToAll(new DistanceDetectorSyncPacket(getBlockPos(), getLevel().dimension(), currentDistance, this.getLaserVisibility())); - } + protected void setMaxRangeNoUpdate(float maxRange) { + maxRange = Math.min(Math.max(maxRange, 0), APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue()); + int maxRangeBits = Float.floatToRawIntBits(maxRange); + this.maxRange.set(maxRangeBits); } - public void setShouldCalculatePeriodically(boolean periodicallyCalculate) { - this.periodicallyCalculate = periodicallyCalculate; + public void setMaxRange(float maxRange) { + maxRange = Math.min(Math.max(maxRange, 0), APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue()); + int maxRangeBits = Float.floatToRawIntBits(maxRange); + if (this.maxRange.getAndSet(maxRangeBits) != maxRange) { + this.sendUpdate(); + } } - public float getMaxDistance() { - return this.maxRange; + public float getCurrentDistance() { + return Float.intBitsToFloat(this.currentDistance.get()); } - public void setMaxRange(float maxRange) { - this.maxRange = Math.min(Math.max(maxRange, 0), APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue()); + protected void setCurrentDistanceNoUpdate(float currentDistance) { + int currentDistanceBits = Float.floatToRawIntBits(currentDistance); + this.currentDistance.set(currentDistanceBits); } - public float getCurrentDistance() { - return Float.intBitsToFloat(this.currentDistance.get()); + public void setCurrentDistance(float currentDistance) { + int currentDistanceBits = Float.floatToRawIntBits(currentDistance); + if (this.currentDistance.getAndSet(currentDistanceBits) != currentDistanceBits) { + this.sendUpdate(); + } } public boolean getLaserVisibility() { return this.showLaser.get(); } + protected void setShowLaserNoUpdate(boolean showLaser) { + this.showLaser.set(showLaser); + } + + public void setShowLaser(boolean showLaser) { + if (this.showLaser.getAndSet(showLaser) != showLaser) { + this.sendUpdate(); + } + } + public boolean shouldCalculatePeriodically() { return this.periodicallyCalculate; } + public void setShouldCalculatePeriodically(boolean periodicallyCalculate) { + this.periodicallyCalculate = periodicallyCalculate; + this.setChanged(); + } + public boolean ignoreTransparent() { return this.ignoreTransparent; } public void setIgnoreTransparent(boolean ignoreTransparent) { this.ignoreTransparent = ignoreTransparent; + this.setChanged(); } public DistanceDetectorPeripheral.DetectionType getDetectionType() { @@ -92,6 +116,7 @@ public DistanceDetectorPeripheral.DetectionType getDetectionType() { public void setDetectionType(DistanceDetectorPeripheral.DetectionType detectionType) { this.detectionType = detectionType; + this.setChanged(); } @Override @@ -107,14 +132,53 @@ public void handleTick(Level level, BlockState state, Bl @Override public AABB getRenderBoundingBox() { - final float currentDistance = this.getCurrentDistance(); + float currentDistance = this.getCurrentDistance(); + if (currentDistance == -1) { + currentDistance = this.getMaxRange(); + } Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front(); return AABB.ofSize(Vec3.atCenterOf(getBlockPos()), direction.getStepX() * currentDistance + 1, direction.getStepY() * currentDistance + 1, direction.getStepZ() * currentDistance + 1) - .move(direction.getStepX() * currentDistance / 2, direction.getStepY() * currentDistance / 2, direction.getStepZ() * currentDistance / 2); + .move(direction.getStepX() * currentDistance / 2, direction.getStepY() * currentDistance / 2, direction.getStepZ() * currentDistance / 2); + } + + @Override + public void load(@NotNull CompoundTag compound) { + this.setMaxRangeNoUpdate(compound.getFloat("maxRange")); + this.setCurrentDistanceNoUpdate(compound.getFloat("currentDistance")); + this.setShowLaserNoUpdate(compound.getBoolean("showLaser")); + this.setShouldCalculatePeriodically(compound.getBoolean("calculatePeriodically")); + this.setIgnoreTransparent(compound.getBoolean("ignoreTransparent")); + this.setDetectionType(DistanceDetectorPeripheral.DetectionType.values()[compound.getByte("detectionType")]); + super.load(compound); + } + + @Override + public void saveAdditional(@NotNull CompoundTag compound) { + super.saveAdditional(compound); + compound.putFloat("maxRange", this.getMaxRange()); + compound.putFloat("currentDistance", this.getCurrentDistance()); + compound.putBoolean("showLaser", this.getLaserVisibility()); + compound.putBoolean("calculatePeriodically", this.shouldCalculatePeriodically()); + compound.putBoolean("ignoreTransparent", this.ignoreTransparent()); + compound.putByte("detectionType", (byte) this.getDetectionType().ordinal()); + } + + @Override + public CompoundTag getUpdateTag() { + CompoundTag compound = super.getUpdateTag(); + compound.putFloat("maxRange", this.getMaxRange()); + compound.putFloat("currentDistance", this.getCurrentDistance()); + compound.putBoolean("showLaser", this.getLaserVisibility()); + return compound; + } + + @Override + public ClientboundBlockEntityDataPacket getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); } public double calculateDistance() { - final double maxRange = this.maxRange; + final double maxRange = this.getMaxRange(); Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front(); Vec3 center = Vec3.atCenterOf(getBlockPos()); Vec3 from = center; diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java index 0caad2cf5..d007a4b1d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java @@ -2,7 +2,6 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.network.base.IPacket; -import de.srendi.advancedperipherals.common.network.toclient.DistanceDetectorSyncPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectBulkSyncPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket; @@ -39,7 +38,6 @@ public class APNetworking { private static int index = 0; public static void init() { - registerServerToClient(DistanceDetectorSyncPacket.class, DistanceDetectorSyncPacket::decode); registerServerToClient(SaddleTurtleInfoPacket.class, SaddleTurtleInfoPacket::decode); registerServerToClient(ToastToClientPacket.class, ToastToClientPacket::decode); registerServerToClient(RenderableObjectSyncPacket.class, RenderableObjectSyncPacket::decode); diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/DistanceDetectorSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/DistanceDetectorSyncPacket.java deleted file mode 100644 index 484ec7520..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/DistanceDetectorSyncPacket.java +++ /dev/null @@ -1,59 +0,0 @@ -package de.srendi.advancedperipherals.common.network.toclient; - -import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.blocks.blockentities.DistanceDetectorEntity; -import de.srendi.advancedperipherals.common.network.base.IPacket; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.network.NetworkEvent; - -public class DistanceDetectorSyncPacket implements IPacket { - - private final BlockPos position; - private final ResourceKey world; - private final float distance; - private final boolean showLaser; - - public DistanceDetectorSyncPacket(BlockPos position, ResourceKey world, float distance, boolean showLaser) { - this.position = position; - this.world = world; - this.distance = distance; - this.showLaser = showLaser; - } - - @Override - public void handle(NetworkEvent.Context context) { - ClientLevel level = Minecraft.getInstance().level; - if (!level.dimension().equals(world)) - return; - - BlockEntity tileEntity = level.getBlockEntity(position); - if (tileEntity == null) { - AdvancedPeripherals.debug("Could not update distance detector at " + position + " in world " + world.location() - + " because the world or the tile entity couldn't be found. Ignoring it"); - return; - } - if (tileEntity instanceof DistanceDetectorEntity detector) { - detector.setCurrentDistance(distance); - detector.setShowLaser(showLaser); - } - } - - @Override - public void encode(FriendlyByteBuf buffer) { - buffer.writeBlockPos(position); - buffer.writeResourceKey(world); - buffer.writeFloat(distance); - buffer.writeBoolean(showLaser); - } - - public static DistanceDetectorSyncPacket decode(FriendlyByteBuf buffer) { - return new DistanceDetectorSyncPacket(buffer.readBlockPos(), buffer.readResourceKey(Registry.DIMENSION_REGISTRY), buffer.readFloat(), buffer.readBoolean()); - } -} From 3bdc361fdf71b857e9e4c648393f70910b8a4b9f Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 15:17:22 -0700 Subject: [PATCH 097/188] make calculateDistance run on mainThread --- .../computercraft/peripheral/DistanceDetectorPeripheral.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 105292147..ae6d22f20 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -68,7 +68,7 @@ public final double getDistance() { return getPeripheralOwner().tileEntity.getCurrentDistance(); } - @LuaFunction + @LuaFunction(mainThread = true) public final double calculateDistance() { return getPeripheralOwner().tileEntity.calculateAndUpdateDistance(); } From 9a504837ebe6ca0c0d0d78405a063c3f4123a427 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 15:37:54 -0700 Subject: [PATCH 098/188] allow setDetectionMode also accept string as mode --- .../DistanceDetectorPeripheral.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index ae6d22f20..79ef8581d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -40,9 +40,26 @@ public final boolean ignoresTransparency() { } @LuaFunction - public final void setDetectionMode(int mode) { - mode = Math.min(Math.max(mode, 0), 2); - getPeripheralOwner().tileEntity.setDetectionType(DetectionType.values()[mode]); + public final void setDetectionMode(IArguments args) throws LuaException { + Object mode = args.get(0); + if (mode == null) { + throw new LuaException("arg #1 must provide a mode name or an index between [0, 2]"); + } + DetectionType detectionType; + if (mode instanceof Number modeInd) { + int index = Math.min(Math.max(modeInd.intValue(), 0), 2); + detectionType = DetectionType.values()[index] + } else if (mode instanceof String modeStr) { + detectionType = switch (modeStr.toUpperCase()) { + case "BLOCK" -> DetectionType.BLOCK; + case "ENTITIES" -> DetectionType.ENTITIES; + case "BOTH" -> DetectionType.BOTH; + default -> throw new LuaException("Unknown detection mode '" + mode + "'"); + } + } else { + throw new LuaException("arg #1 must be a string or a number"); + } + getPeripheralOwner().tileEntity.setDetectionType(detectionType); } @LuaFunction From 4dcdc9eb0c883a371d48a24e930694992df9a038 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 17:21:55 -0700 Subject: [PATCH 099/188] fix styles --- .../common/blocks/blockentities/DistanceDetectorEntity.java | 4 ---- .../srendi/advancedperipherals/common/util/HitResultUtil.java | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index db5b451cc..b2bdd6b4f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -4,20 +4,16 @@ import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; -import de.srendi.advancedperipherals.common.network.APNetworking; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.util.HitResultUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.SlabBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.SlabType; import net.minecraft.world.phys.*; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java index d3d0c9c1e..4231a15df 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java @@ -3,7 +3,6 @@ import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.DistanceDetectorPeripheral; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.ClipContext; @@ -41,7 +40,7 @@ public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, boolean ig return blockResult; } else if (blockResult.getType() == HitResult.Type.MISS) { return entityResult; - } + } double blockDistance = from.distanceToSqr(blockResult.getLocation()); double entityDistance = from.distanceToSqr(entityResult.getLocation()); From 02d88edcbd116d11dd465bb878c9ab627f644ef1 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 17:25:45 -0700 Subject: [PATCH 100/188] add missing semicolons --- .../computercraft/peripheral/DistanceDetectorPeripheral.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 79ef8581d..da5994bb9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -48,14 +48,14 @@ public final void setDetectionMode(IArguments args) throws LuaException { DetectionType detectionType; if (mode instanceof Number modeInd) { int index = Math.min(Math.max(modeInd.intValue(), 0), 2); - detectionType = DetectionType.values()[index] + detectionType = DetectionType.values()[index]; } else if (mode instanceof String modeStr) { detectionType = switch (modeStr.toUpperCase()) { case "BLOCK" -> DetectionType.BLOCK; case "ENTITIES" -> DetectionType.ENTITIES; case "BOTH" -> DetectionType.BOTH; default -> throw new LuaException("Unknown detection mode '" + mode + "'"); - } + }; } else { throw new LuaException("arg #1 must be a string or a number"); } From 1a08c6a5bc1a4b711bb07c202fe35163a26783bc Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 17:26:38 -0700 Subject: [PATCH 101/188] add missing imports --- .../computercraft/peripheral/DistanceDetectorPeripheral.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index da5994bb9..362ed4ec1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -1,5 +1,7 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.DistanceDetectorEntity; From 0c0eb0cea9bcbaae0828ea0c7b87eac46b728c2a Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 17:31:55 -0700 Subject: [PATCH 102/188] rename DetectionType.ENTITIES -> DetectionType.ENTITY --- .../DistanceDetectorPeripheral.java | 27 ++++++++++++++----- .../blockentities/DistanceDetectorEntity.java | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 362ed4ec1..706579f7e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -54,7 +54,7 @@ public final void setDetectionMode(IArguments args) throws LuaException { } else if (mode instanceof String modeStr) { detectionType = switch (modeStr.toUpperCase()) { case "BLOCK" -> DetectionType.BLOCK; - case "ENTITIES" -> DetectionType.ENTITIES; + case "ENTITY" -> DetectionType.ENTITY; case "BOTH" -> DetectionType.BOTH; default -> throw new LuaException("Unknown detection mode '" + mode + "'"); }; @@ -67,13 +67,13 @@ public final void setDetectionMode(IArguments args) throws LuaException { @LuaFunction public final boolean detectsEntities() { DetectionType detectionType = getPeripheralOwner().tileEntity.getDetectionType(); - return detectionType == DetectionType.ENTITIES || detectionType == DetectionType.BOTH; + return detectionType.detectEntity(); } @LuaFunction public final boolean detectsBlocks() { DetectionType detectionType = getPeripheralOwner().tileEntity.getDetectionType(); - return detectionType == DetectionType.BLOCK || detectionType == DetectionType.BOTH; + return detectionType.detectBlock(); } @LuaFunction @@ -113,9 +113,24 @@ public final double getMaxRange() { } public enum DetectionType { - BLOCK, - ENTITIES, - BOTH + BLOCK(true, false), + ENTITY(false, true), + BOTH(true, true); + + private final boolean block, entity; + + private DetectionType(boolean block, boolean entity) { + this.block = block; + this.entity = entity; + } + + public boolean detectBlock() { + return this.block; + } + + public boolean detectEntity() { + return this.entity; + } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index b2bdd6b4f..78176d017 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -196,7 +196,7 @@ public double calculateAndUpdateDistance() { private HitResult getHitResult(Vec3 to, Vec3 from) { Level level = this.getLevel(); return switch (this.detectionType) { - case ENTITIES -> HitResultUtil.getEntityHitResult(to, from, level); + case ENTITY -> HitResultUtil.getEntityHitResult(to, from, level); case BLOCK -> HitResultUtil.getBlockHitResult(to, from, level, this.ignoreTransparent); default -> HitResultUtil.getHitResult(to, from, level, this.ignoreTransparent); }; From 44ff763743007965e2a8682daabacd2bcfcec25f Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 17:49:48 -0700 Subject: [PATCH 103/188] remove noOcclusion for distance detector --- .../de/srendi/advancedperipherals/common/setup/APBlocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java index aab4cdd0b..971a4faf9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java @@ -39,7 +39,7 @@ protected static void register() { public static final RegistryObject GEO_SCANNER = register("geo_scanner", () -> new APBlockEntityBlock<>(APBlockEntityTypes.GEO_SCANNER, false), () -> new APBlockItem(APBlocks.GEO_SCANNER.get(), APConfig.PERIPHERALS_CONFIG.enableGeoScanner)); public static final RegistryObject COLONY_INTEGRATOR = register("colony_integrator", () -> new APBlockEntityBlock<>(APBlockEntityTypes.COLONY_INTEGRATOR, false), () -> new APBlockItem(APBlocks.COLONY_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableColonyIntegrator)); public static final RegistryObject NBT_STORAGE = register("nbt_storage", () -> new APBlockEntityBlock<>(APBlockEntityTypes.NBT_STORAGE, false), () -> new APBlockItem(APBlocks.NBT_STORAGE.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage)); - public static final RegistryObject DISTANCE_DETECTOR = register("distance_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.DISTANCE_DETECTOR, BlockBehaviour.Properties.of(Material.METAL).noOcclusion(), true), () -> new APBlockItem(APBlocks.DISTANCE_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage)); + public static final RegistryObject DISTANCE_DETECTOR = register("distance_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.DISTANCE_DETECTOR, true), () -> new APBlockItem(APBlocks.DISTANCE_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage)); private static RegistryObject registerNoItem(String name, Supplier block) { return APRegistration.BLOCKS.register(name, block); From 763e0679ca1f6c77996c535f4fc4dbb2596cb6d5 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 17:58:24 -0700 Subject: [PATCH 104/188] make undetected color to dark red --- .../client/renderer/DistanceDetectorRenderer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java index 2bb048706..8c571b8f5 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java @@ -30,10 +30,12 @@ public DistanceDetectorRenderer(BlockEntityRendererProvider.Context pContext) { public void render(@NotNull DistanceDetectorEntity pBlockEntity, float pPartialTick, @NotNull PoseStack pPoseStack, MultiBufferSource pBufferSource, int pPackedLight, int pPackedOverlay) { if (pBlockEntity.getLaserVisibility()) { float distance = pBlockEntity.getCurrentDistance(); + float[] color = EnumColor.RED.getRgb(); if (distance == -1) { distance = pBlockEntity.getMaxRange(); + color = EnumColor.DARK_RED.getRgb(); } - renderBeaconBeam(pBlockEntity, pPoseStack, pBufferSource, BeaconRenderer.BEAM_LOCATION, pPartialTick, 1, 0, distance + 0.5f, EnumColor.RED.getRgb(), 0.05f, 0.09f); + renderBeaconBeam(pBlockEntity, pPoseStack, pBufferSource, BeaconRenderer.BEAM_LOCATION, pPartialTick, 1, 0, distance + 0.5f, color, 0.05f, 0.09f); } } From bea9dd3675be8a905d07719806f373e2b0cc369d Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 18:14:18 -0700 Subject: [PATCH 105/188] fix render bounding box --- .../common/blocks/blockentities/DistanceDetectorEntity.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 78176d017..c68caf610 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -132,9 +132,10 @@ public AABB getRenderBoundingBox() { if (currentDistance == -1) { currentDistance = this.getMaxRange(); } + currentDistance += 1.5f; Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front(); - return AABB.ofSize(Vec3.atCenterOf(getBlockPos()), direction.getStepX() * currentDistance + 1, direction.getStepY() * currentDistance + 1, direction.getStepZ() * currentDistance + 1) - .move(direction.getStepX() * currentDistance / 2, direction.getStepY() * currentDistance / 2, direction.getStepZ() * currentDistance / 2); + Vec3 blockPos = Vec3.atCenterOf(getBlockPos()); + return new AABB(blockPos, blockPos.add(direction.getStepX() * currentDistance, direction.getStepY() * currentDistance, direction.getStepZ() * currentDistance)); } @Override From 6f136c8f35382bb54bd9536d88e133ec5579cfd2 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 18 Dec 2024 18:16:46 -0700 Subject: [PATCH 106/188] default -> case BOTH --- .../common/blocks/blockentities/DistanceDetectorEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index c68caf610..3c51cfb97 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -199,7 +199,7 @@ private HitResult getHitResult(Vec3 to, Vec3 from) { return switch (this.detectionType) { case ENTITY -> HitResultUtil.getEntityHitResult(to, from, level); case BLOCK -> HitResultUtil.getBlockHitResult(to, from, level, this.ignoreTransparent); - default -> HitResultUtil.getHitResult(to, from, level, this.ignoreTransparent); + case BOTH -> HitResultUtil.getHitResult(to, from, level, this.ignoreTransparent); }; } From 5539199e6751eceb1276f17d12a527a34db51b5f Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 21 Dec 2024 14:33:39 -0700 Subject: [PATCH 107/188] support envionment detector on vs2 ship --- build.gradle | 37 +++++++++++++++++-- gradle.properties | 5 +++ .../common/addons/APAddons.java | 21 +++++++++++ .../computercraft/owner/IPeripheralOwner.java | 6 +++ .../owner/PocketPeripheralOwner.java | 9 +++++ .../DistanceDetectorPeripheral.java | 2 +- .../EnvironmentDetectorPeripheral.java | 17 +++++---- .../common/setup/APBlocks.java | 2 - .../common/util/LuaConverter.java | 19 ++++++++-- .../lib/peripherals/BasePeripheral.java | 26 +++++++++++++ 10 files changed, 126 insertions(+), 18 deletions(-) diff --git a/build.gradle b/build.gradle index b176a7695..2039440a0 100644 --- a/build.gradle +++ b/build.gradle @@ -246,7 +246,17 @@ repositories { maven { url = "https://cursemaven.com" content { - includeGroup "curse.maven" + includeGroup("curse.maven") + } + } + maven { + url = "https://maven.valkyrienskies.org" + content { + includeGroup("org.valkyrienskies") + includeGroup("org.valkyrienskies.core") + includeGroup("com.github.LlamaLad7") + includeGroup("com.github.Rubydesic") + includeGroup("org.mapstruct") } } } @@ -331,8 +341,8 @@ dependencies { // DimStorage compileOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}") compileOnly fg.deobf("curse.maven:edivadlib-638508:${edivadlib_version}") - runtimeOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}") - runtimeOnly fg.deobf("curse.maven:edivadlib-638508:${edivadlib_version}") + // runtimeOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}") + // runtimeOnly fg.deobf("curse.maven:edivadlib-638508:${edivadlib_version}") //Powah compileOnly fg.deobf("curse.maven:powah-633483:${powah_version}") @@ -340,7 +350,7 @@ dependencies { runtimeOnly fg.deobf("me.shedaniel.cloth:cloth-config-forge:8.2.88") runtimeOnly fg.deobf("dev.architectury:architectury-forge:6.2.43") - // Crash utilities. Used to debug the chunky turtle. Can be uncommented if not needed + // Crash utilities. Used to debug the chunky turtle. Can be commented if not needed runtimeOnly fg.deobf("curse.maven:crash-utilities-371813:4406293") testImplementation "org.junit.jupiter:junit-jupiter-api:${junit_version}" @@ -361,6 +371,25 @@ dependencies { // Create Crafts & Additions compileOnly fg.deobf("curse.maven:createaddition-439890:5099757") // runtimeOnly fg.deobf("curse.maven:createaddition-439890:5099757") + + // Valkyrien Skies 2 + implementation("org.joml:joml:1.10.4") { + transitive = false + } + implementation("org.joml:joml-primitives:1.10.0") { + transitive = false + } + // implementation fg.deobf("org.valkyrienskies:valkyrienskies-119-common:${vs2_version}") + implementation fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") { + transitive = false + } + compileOnly "org.valkyrienskies.core:api:${vs_core_version}" + compileOnly "org.valkyrienskies.core:api-game:${vs_core_version}" + compileOnly "org.valkyrienskies.core:util:${vs_core_version}" + compileOnly "org.valkyrienskies.core:impl:${vs_core_version}" + runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") + runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") + runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") } diff --git a/gradle.properties b/gradle.properties index 740b947f1..8f7c36183 100644 --- a/gradle.properties +++ b/gradle.properties @@ -37,6 +37,11 @@ ae2additions_version=4646599 kotlinforforge_version=3.12.0 appliedmekanistics_version=4734608 dimstorage_version=3927875 +valkyrien_skies_version=4994898 +eureka_ships_version=5321628 +clockwork_version=5171528 +vs2_version=2.1.2-beta.1+a04911c932 +vs_core_version=1.1.0+2a62e6a823 # Mod dependencies which are needed for other mods # For minecolonies diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java index 5bdce0093..6f00434c1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java @@ -2,14 +2,18 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorage; +import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.InterModComms; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; import top.theillusivec4.curios.api.CuriosApi; import top.theillusivec4.curios.api.SlotResult; import top.theillusivec4.curios.api.SlotTypeMessage; @@ -26,6 +30,7 @@ public class APAddons { public static final String MEKANISM_MODID = "mekanism"; public static final String AE_ADDITIONS_MODID = "ae2additions"; public static final String APP_MEKANISTICS_MODID = "appmek"; + public static final String VALKYRIEN_SKIES_MODID = "valkyrienskies"; public static boolean curiosLoaded; public static boolean refinedStorageLoaded; @@ -34,6 +39,7 @@ public class APAddons { public static boolean mekanismLoaded; public static boolean aeAdditionsLoaded; public static boolean appMekLoaded; + public static boolean vs2Loaded; // Use static so these checks run as early as possible, so we can use them for our registries static { @@ -45,6 +51,7 @@ public class APAddons { aeThingsLoaded = modList.isLoaded(AE_THINGS_MODID); aeAdditionsLoaded = modList.isLoaded(AE_ADDITIONS_MODID); appMekLoaded = modList.isLoaded(APP_MEKANISTICS_MODID); + vs2Loaded = modList.isLoaded(VALKYRIEN_SKIES_MODID); if (refinedStorageLoaded) RefinedStorage.instance = new RefinedStorage(); @@ -71,4 +78,18 @@ public static ItemStack getCurioGlasses(Player player) { return curioSlots.get(0).stack(); } + + public static boolean isBlockOnShip(Level level, BlockPos pos) { + if (!vs2Loaded) { + return false; + } + return VSGameUtilsKt.isBlockInShipyard(level, pos); + } + + public static Ship getVS2Ship(Level level, BlockPos pos) { + if (!vs2Loaded) { + return null; + } + return VSGameUtilsKt.getShipObjectManagingPos(level, pos); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java index c99e9442b..287c94e4e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java @@ -9,6 +9,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,6 +24,11 @@ public interface IPeripheralOwner { @NotNull BlockPos getPos(); + @NotNull + default Vec3 getCenterPos() { + return Vec3.atCenterOf(getPos()); + } + @NotNull Direction getFacing(); @NotNull FrontAndTop getOrientation(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java index ee9153f06..7c3f431ec 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java @@ -12,6 +12,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -50,6 +51,14 @@ public BlockPos getPos() { return owner.blockPosition(); } + @NotNull + @Override + public Vec3 getCenterPos() { + Entity owner = pocket.getEntity(); + if (owner == null) return new Vec3(0, 0, 0); + return owner.position(); + } + @NotNull @Override public Direction getFacing() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 706579f7e..bf1f63655 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -119,7 +119,7 @@ public enum DetectionType { private final boolean block, entity; - private DetectionType(boolean block, boolean entity) { + DetectionType(boolean block, boolean entity) { this.block = block; this.entity = entity; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index 0d8d07078..7bb85bd76 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -31,6 +31,7 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.SleepingTimeCheckEvent; import net.minecraftforge.eventbus.api.Event; @@ -87,24 +88,24 @@ public boolean isEnabled() { @LuaFunction(mainThread = true) public final String getBiome() { - Optional> biome = getLevel().getBiome(getPos()).unwrapKey(); + Optional> biome = getLevel().getBiome(this.getWorldBlockPos()).unwrapKey(); return biome.map(biomeResourceKey -> biomeResourceKey.location().toString()).orElse("unknown"); } @LuaFunction(mainThread = true) public final int getSkyLightLevel() { - return getLevel().getBrightness(LightLayer.SKY, getPos().offset(0, 1, 0)); + return getLevel().getBrightness(LightLayer.SKY, this.getWorldBlockPos().offset(0, 1, 0)); } @LuaFunction(mainThread = true) public final int getBlockLightLevel() { - return getLevel().getBrightness(LightLayer.BLOCK, getPos().offset(0, 1, 0)); + return getLevel().getBrightness(LightLayer.BLOCK, this.getWorldBlockPos().offset(0, 1, 0)); } @LuaFunction(mainThread = true) public final int getDayLightLevel() { Level level = getLevel(); - int i = level.getBrightness(LightLayer.SKY, getPos().offset(0, 1, 0)) - level.getSkyDarken(); + int i = level.getBrightness(LightLayer.SKY, this.getWorldBlockPos().offset(0, 1, 0)) - level.getSkyDarken(); float f = level.getSunAngle(1.0F); if (i > 0) { float f1 = f < (float) Math.PI ? 0.0F : ((float) Math.PI * 2F); @@ -122,7 +123,7 @@ public final long getTime() { @LuaFunction(mainThread = true) public final boolean isSlimeChunk() { - ChunkPos chunkPos = new ChunkPos(getPos()); + ChunkPos chunkPos = new ChunkPos(this.getWorldBlockPos()); return WorldgenRandom.seedSlimeChunk(chunkPos.x, chunkPos.z, ((WorldGenLevel) getLevel()).getSeed(), 987234911L).nextInt(10) == 0; } @@ -204,9 +205,9 @@ public final MethodResult scanEntities(@NotNull IComputerAccess access, @NotNull return MethodResult.of(null, "Radius exceeds max value"); return null; }, context -> { - BlockPos pos = owner.getPos(); - AABB box = new AABB(pos); - List> entities = getLevel().getEntities((Entity) null, box.inflate(radius), entity -> entity instanceof LivingEntity && entity.isAlive()).stream().map(entity -> LuaConverter.completeEntityWithPositionToLua(entity, pos, detailed)).toList(); + Vec3 pos = this.getWorldPos(); + AABB box = new AABB(pos, pos); + List> entities = getLevel().getEntities((Entity) null, box.inflate(radius + 0.5), entity -> entity instanceof LivingEntity && entity.isAlive()).stream().map(entity -> LuaConverter.completeEntityWithPositionToLua(entity, pos, detailed)).toList(); return MethodResult.of(entities); }, null); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java index 971a4faf9..cde058649 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java @@ -11,9 +11,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; import net.minecraftforge.fml.ModList; import net.minecraftforge.registries.RegistryObject; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index a5f759c7d..aebd5bbb6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -20,6 +20,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.IForgeShearable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; @@ -121,15 +122,27 @@ public static Map completeEntityWithPositionToLua(Entity entity, return completeEntityWithPositionToLua(entity, pos, false); } + public static Map completeEntityWithPositionToLua(Entity entity, Vec3 pos) { + return completeEntityWithPositionToLua(entity, pos, false); + } + public static Map completeEntityWithPositionToLua(Entity entity, BlockPos pos, boolean detailed) { return completeEntityWithPositionToLua(entity, ItemStack.EMPTY, pos, detailed); } + public static Map completeEntityWithPositionToLua(Entity entity, Vec3 pos, boolean detailed) { + return completeEntityWithPositionToLua(entity, ItemStack.EMPTY, pos, detailed); + } + public static Map completeEntityWithPositionToLua(Entity entity, ItemStack itemInHand, BlockPos pos, boolean detailed) { + return completeEntityWithPositionToLua(entity, itemInHand, Vec3.atCenterOf(pos), detailed); + } + + public static Map completeEntityWithPositionToLua(Entity entity, ItemStack itemInHand, Vec3 pos, boolean detailed) { Map data = completeEntityToLua(entity, itemInHand, detailed); - data.put("x", entity.getX() - pos.getX()); - data.put("y", entity.getY() - pos.getY()); - data.put("z", entity.getZ() - pos.getZ()); + data.put("x", entity.getX() - pos.x); + data.put("y", entity.getY() - pos.y); + data.put("z", entity.getZ() - pos.z); return data; } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index 1f1ac4100..ee3c72dcd 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -8,6 +8,7 @@ import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IDynamicPeripheral; import dan200.computercraft.api.peripheral.IPeripheral; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.owner.OperationAbility; import de.srendi.advancedperipherals.common.addons.computercraft.owner.PeripheralOwnerAbility; @@ -15,6 +16,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; +import org.valkyrienskies.core.api.ships.Ship; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -131,10 +136,31 @@ protected BlockPos getPos() { return owner.getPos(); } + protected Vec3 getCenterPos() { + return owner.getCenterPos(); + } + protected Level getLevel() { return owner.getLevel(); } + protected Vec3 getWorldPos() { + Vec3 pos = this.getCenterPos(); + if (!APAddons.vs2Loaded) { + return pos; + } + Ship ship = APAddons.getVS2Ship(this.getLevel(), this.getPos()); + if (ship == null) { + return pos; + } + Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); + return new Vec3(newPos.x, newPos.y, newPos.z); + } + + protected final BlockPos getWorldBlockPos() { + return new BlockPos(this.getWorldPos()); + } + protected Direction validateSide(String direction) throws LuaException { return CoordUtil.getDirection(owner.getOrientation(), direction); } From c3190c5f0de938d778889393696d2e8810bd83dd Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 21 Dec 2024 15:20:21 -0700 Subject: [PATCH 108/188] support distance detector --- .../peripheral/ChatBoxPeripheral.java | 12 +- .../peripheral/PlayerDetectorPeripheral.java | 120 ++++++++---------- .../blockentities/DistanceDetectorEntity.java | 48 +++++-- .../common/util/CoordUtil.java | 30 ++--- .../common/util/HitResultUtil.java | 63 +++++++-- .../lib/peripherals/BasePeripheral.java | 2 +- 6 files changed, 167 insertions(+), 108 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java index 5b0490c4b..5cd928762 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java @@ -240,7 +240,7 @@ public final MethodResult sendFormattedMessage(@NotNull IArguments arguments) th if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension) { continue; } - if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { player.sendSystemMessage(preparedMessage); } } @@ -272,7 +272,7 @@ public final MethodResult sendMessage(@NotNull IArguments arguments) throws LuaE if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension) { continue; } - if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { player.sendSystemMessage(preparedMessage); } } @@ -319,7 +319,7 @@ public final MethodResult sendFormattedMessageToPlayer(@NotNull IArguments argum return MethodResult.of(false, "NOT_SAME_DIMENSION"); } - if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { player.sendSystemMessage(preparedMessage); } return MethodResult.of(true); @@ -377,7 +377,7 @@ public final MethodResult sendFormattedToastToPlayer(@NotNull IArguments argumen return MethodResult.of(false, "NOT_SAME_DIMENSION"); } - if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { ToastToClientPacket packet = new ToastToClientPacket(titleComponent, preparedMessage); APNetworking.sendTo(packet, player); } @@ -416,7 +416,7 @@ public final MethodResult sendMessageToPlayer(@NotNull IArguments arguments) thr return MethodResult.of(false, "NOT_SAME_DIMENSION"); } - if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { player.sendSystemMessage(preparedMessage, false); } return MethodResult.of(true); @@ -455,7 +455,7 @@ public final MethodResult sendToastToPlayer(@NotNull IArguments arguments) throw return MethodResult.of(false, "NOT_SAME_DIMENSION"); } - if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { ToastToClientPacket packet = new ToastToClientPacket(Component.literal(title), preparedMessage); APNetworking.sendTo(packet, player); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java index 8b10eb742..8cc702635 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java @@ -21,6 +21,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.server.ServerLifecycleHooks; import java.util.*; @@ -67,10 +68,12 @@ public final MethodResult getPlayersInCoords(Map firstCoord, Map sec ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) + if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) { continue; - if (CoordUtil.isInRange(getPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE)) + } + if (CoordUtil.isInRange(getWorldPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE)) { playersName.add(player.getName().getString()); + } } return MethodResult.of(playersName); } @@ -81,10 +84,9 @@ public final List getPlayersInCubic(int x, int y, int z) { ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) - continue; - if (CoordUtil.isInRange(getPos(), getLevel(), player, x, y, z, MAX_RANGE)) + if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, x, y, z, MAX_RANGE)) { playersName.add(player.getName().getString()); + } } return playersName; } @@ -95,10 +97,9 @@ public final List getPlayersInRange(int range) { ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) - continue; - if (CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) + if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, MAX_RANGE)) { playersName.add(player.getName().getString()); + } } return playersName; } @@ -112,9 +113,12 @@ public final boolean isPlayersInCoords(Map firstCoord, Map secondCoo ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) + if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) { continue; - if (CoordUtil.isInRange(getPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE)) return true; + } + if (CoordUtil.isInRange(getWorldPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE)) { + return true; + } } return false; } @@ -126,9 +130,9 @@ public final boolean isPlayersInCubic(int x, int y, int z) { ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) - continue; - if (CoordUtil.isInRange(getPos(), getLevel(), player, x, y, z, MAX_RANGE)) return true; + if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, x, y, z, MAX_RANGE)) { + return true; + } } return false; } @@ -140,9 +144,9 @@ public final boolean isPlayersInRange(int range) { ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) - continue; - if (CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) return true; + if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, MAX_RANGE)) { + return true; + } } return false; } @@ -153,44 +157,27 @@ public final boolean isPlayerInCoords(Map firstCoord, Map secondCoor BlockPos secondPos = LuaConverter.convertToBlockPos(secondCoord); ResourceKey dimension = getLevel().dimension(); - for (Player player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) - continue; - if (CoordUtil.isInRange(getPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE)) - if(player.getName().getString().equals(username)) - return true; + ServerPlayer player = getPlayer(username); + if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) { + return false; } - return false; + return CoordUtil.isInRange(getWorldPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE); } @LuaFunction(mainThread = true) public final boolean isPlayerInCubic(int x, int y, int z, String username) { ResourceKey dimension = getLevel().dimension(); - for (Player player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) - continue; - if (CoordUtil.isInRange(getPos(), getLevel(), player, x, y, z, MAX_RANGE)) { - if(player.getName().getString().equals(username)) - return true; - } - } - return false; + ServerPlayer player = getPlayer(username); + return player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, x, y, z, MAX_RANGE); } @LuaFunction(mainThread = true) public final boolean isPlayerInRange(int range, String username) { ResourceKey dimension = getLevel().dimension(); - for (Player player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) - continue; - if (CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) { - if(player.getName().getString().equals(username)) - return true; - } - } - return false; + ServerPlayer player = getPlayer(username); + return player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, MAX_RANGE); } @LuaFunction(value = {"getPlayerPos", "getPlayer"}, mainThread = true) @@ -198,23 +185,22 @@ public final Map getPlayerPos(IArguments arguments) throws LuaEx if (!APConfig.PERIPHERALS_CONFIG.playerSpy.get()) throw new LuaException("This function is disabled in the config. Activate it or ask an admin if he can activate it."); ResourceKey dimension = getLevel().dimension(); + Vec3 pos = getWorldPos(); - ServerPlayer existingPlayer = null; - for (ServerPlayer player : getPlayers()) { - if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) - continue; - if (player.getName().getString().equals(arguments.getString(0))) { - if (MAX_RANGE == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, MAX_RANGE, MAX_RANGE)) - existingPlayer = player; - break; - } + ServerPlayer player = getPlayer(arguments.getString(0)); + if (player == null) { + return null; + } + if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) { + return null; + } + if (MAX_RANGE != -1 && !CoordUtil.isInRange(pos, getLevel(), player, MAX_RANGE, MAX_RANGE)) { + return null; } - if (existingPlayer == null) - return Collections.emptyMap(); Map info = new HashMap<>(); - double x = existingPlayer.getX(), y = existingPlayer.getY(), z = existingPlayer.getZ(); + double x = player.getX(), y = player.getY(), z = player.getZ(); if (APConfig.PERIPHERALS_CONFIG.playerSpyRandError.get()) { // We apply random error to the returned player position if so enabled in the configuration. @@ -235,7 +221,7 @@ public final Map getPlayerPos(IArguments arguments) throws LuaEx maxDistance = Math.max(minDistance, maxDistance); // Calculate Euclidean distance between the player locator and the player in question - double distanceFromPlayer = Math.sqrt(Math.pow(x - getPos().getX(), 2) + Math.pow(y - getPos().getY(), 2) + Math.pow(z - getPos().getZ(), 2)); + double distanceFromPlayer = Math.sqrt(Math.pow(x - pos.x, 2) + Math.pow(y - pos.y, 2) + Math.pow(z - pos.z, 2)); distanceFromPlayer -= minDistance; if (distanceFromPlayer > 0) { @@ -255,18 +241,16 @@ public final Map getPlayerPos(IArguments arguments) throws LuaEx info.put("y", Math.floor(y * unit) / unit); info.put("z", Math.floor(z * unit) / unit); if (APConfig.PERIPHERALS_CONFIG.morePlayerInformation.get()) { - info.put("yaw", existingPlayer.yRotO); - info.put("pitch", existingPlayer.xRotO); - info.put("dimension", existingPlayer.getLevel().dimension().location().toString()); - info.put("eyeHeight", existingPlayer.getEyeHeight()); - info.put("health", existingPlayer.getHealth()); - // TODO: remove the next line in next major version - info.put("maxHeatlh", existingPlayer.getMaxHealth()); // keep this for backward compatibility - info.put("maxHealth", existingPlayer.getMaxHealth()); - info.put("airSupply", existingPlayer.getAirSupply()); - info.put("respawnPosition", LuaConverter.posToObject(existingPlayer.getRespawnPosition())); - info.put("respawnDimension", existingPlayer.getRespawnDimension().location().toString()); - info.put("respawnAngle", existingPlayer.getRespawnAngle()); + info.put("yaw", player.yRotO); + info.put("pitch", player.xRotO); + info.put("dimension", player.getLevel().dimension().location().toString()); + info.put("eyeHeight", player.getEyeHeight()); + info.put("health", player.getHealth()); + info.put("maxHealth", player.getMaxHealth()); + info.put("airSupply", player.getAirSupply()); + info.put("respawnPosition", LuaConverter.posToObject(player.getRespawnPosition())); + info.put("respawnDimension", player.getRespawnDimension().location().toString()); + info.put("respawnAngle", player.getRespawnAngle()); } return info; } @@ -274,4 +258,8 @@ public final Map getPlayerPos(IArguments arguments) throws LuaEx private List getPlayers() { return ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers(); } + + private ServerPlayer getPlayer(String name) { + return ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayerByName(name); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 3c51cfb97..05c0cc26e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.DistanceDetectorPeripheral; import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; @@ -15,6 +16,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.*; +import org.joml.Vector3d; +import org.valkyrienskies.core.api.ships.Ship; import org.jetbrains.annotations.NotNull; @@ -134,7 +137,7 @@ public AABB getRenderBoundingBox() { } currentDistance += 1.5f; Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front(); - Vec3 blockPos = Vec3.atCenterOf(getBlockPos()); + Vec3 blockPos = Vec3.atCenterOf(this.getBlockPos()); return new AABB(blockPos, blockPos.add(direction.getStepX() * currentDistance, direction.getStepY() * currentDistance, direction.getStepZ() * currentDistance)); } @@ -174,18 +177,44 @@ public ClientboundBlockEntityDataPacket getUpdatePacket() { return ClientboundBlockEntityDataPacket.create(this); } + protected Vec3 getCenterPos() { + Vec3 pos = Vec3.atCenterOf(this.getBlockPos()); + if (!APAddons.vs2Loaded) { + return pos; + } + Ship ship = APAddons.getVS2Ship(this.getLevel(), this.getBlockPos()); + if (ship == null) { + return pos; + } + Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); + return new Vec3(newPos.x, newPos.y, newPos.z); + } + + protected Vec3 getDirection() { + Vec3 dir = Vec3.atLowerCornerOf(getBlockState().getValue(BaseBlock.ORIENTATION).front().getNormal()); + if (!APAddons.vs2Loaded) { + return dir; + } + Ship ship = APAddons.getVS2Ship(this.getLevel(), this.getBlockPos()); + if (ship == null) { + return dir; + }; + Vector3d newDir = ship.getShipToWorld().transformDirection(new Vector3d(dir.x, dir.y, dir.z)); + return new Vec3(newDir.x, newDir.y, newDir.z); + } + public double calculateDistance() { final double maxRange = this.getMaxRange(); - Direction direction = getBlockState().getValue(BaseBlock.ORIENTATION).front(); - Vec3 center = Vec3.atCenterOf(getBlockPos()); + Vec3 direction = getDirection(); + Vec3 center = getCenterPos(); Vec3 from = center; - Vec3 to = from.add(direction.getStepX() * maxRange, direction.getStepY() * maxRange, direction.getStepZ() * maxRange); + Vec3 to = from.add(direction.x * maxRange, direction.y * maxRange, direction.z * maxRange); HitResult result = this.getHitResult(to, from); if (result.getType() == HitResult.Type.MISS) { return -1; } - return getDistanceOnDirection(direction, result.getLocation(), center) - 0.5f; + return result.getLocation().distanceTo(center) - 0.5f; } public double calculateAndUpdateDistance() { @@ -198,13 +227,8 @@ private HitResult getHitResult(Vec3 to, Vec3 from) { Level level = this.getLevel(); return switch (this.detectionType) { case ENTITY -> HitResultUtil.getEntityHitResult(to, from, level); - case BLOCK -> HitResultUtil.getBlockHitResult(to, from, level, this.ignoreTransparent); - case BOTH -> HitResultUtil.getHitResult(to, from, level, this.ignoreTransparent); + case BLOCK -> HitResultUtil.getBlockHitResult(to, from, level, this.ignoreTransparent, this.getBlockPos()); + case BOTH -> HitResultUtil.getHitResult(to, from, level, this.ignoreTransparent, this.getBlockPos()); }; } - - private static float getDistanceOnDirection(Direction direction, Vec3 from, Vec3 to) { - Direction.Axis axis = direction.getAxis(); - return Math.abs((float)(axis.choose(from.x, from.y, from.z) - axis.choose(to.x, to.y, to.z))); - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java index 4ad348a96..389264ad0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java @@ -9,6 +9,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,7 +28,7 @@ public class CoordUtil { * * @return If the player is in the {@code range} as well as in the {@code maxRange}, or {@code range} and {@code maxRange} are -1 */ - public static boolean isInRange(@Nullable BlockPos pos, @Nullable Level world, @Nullable Player player, int range, int maxRange) { + public static boolean isInRange(@Nullable Vec3 pos, @Nullable Level world, @Nullable Player player, int range, int maxRange) { // There are rare cases where these can be null. For example if a player detector pocket computer runs while not in a player inventory // Fixes https://github.com/SirEndii/AdvancedPeripherals/issues/356 if (pos == null || world == null || player == null) { @@ -49,7 +50,7 @@ public static boolean isInRange(@Nullable BlockPos pos, @Nullable Level world, @ } // To fix issue #439 - private static boolean isPlayerInBlockRange(@NotNull BlockPos pos, @NotNull Level world, @NotNull Player player, double range) { + private static boolean isPlayerInBlockRange(@NotNull Vec3 pos, @NotNull Level world, @NotNull Player player, double range) { if (range != -1 && player.getLevel() != world) return false; @@ -59,13 +60,12 @@ private static boolean isPlayerInBlockRange(@NotNull BlockPos pos, @NotNull Leve ey = y; y = tmp; } - double bx = (double)(pos.getX() + 0.5), by = (double)(pos.getY() + 0.5), bz = (double)(pos.getZ() + 0.5); - return Math.abs(x - bx) <= range && Math.abs(z - bz) <= range && + return Math.abs(x - pos.x) <= range && Math.abs(z - pos.z) <= range && // check both feet position and eye position, and ensure it will work if player is higher than 2 blocks - ((y <= by && by <= ey) || Math.min(Math.abs(y - by), Math.abs(ey - by)) <= range); + ((y <= pos.y && pos.y <= ey) || Math.min(Math.abs(y - pos.y), Math.abs(ey - pos.y)) <= range); } - public static boolean isInRange(@Nullable BlockPos pos, @Nullable Level world, @Nullable Player player, int x, int y, int z, int maxRange) { + public static boolean isInRange(@Nullable Vec3 pos, @Nullable Level world, @Nullable Player player, int x, int y, int z, int maxRange) { if (pos == null || world == null || player == null) return false; @@ -76,7 +76,7 @@ public static boolean isInRange(@Nullable BlockPos pos, @Nullable Level world, @ return isPlayerInBlockRangeXYZ(pos, world, player, (double) x, (double) y, (double) z, maxRange); } - private static boolean isPlayerInBlockRangeXYZ(@NotNull BlockPos pos, @NotNull Level world, @NotNull Player player, double dx, double dy, double dz, int maxRange) { + private static boolean isPlayerInBlockRangeXYZ(@NotNull Vec3 pos, @NotNull Level world, @NotNull Player player, double dx, double dy, double dz, int maxRange) { if (maxRange != -1 && player.getLevel() != world) return false; @@ -86,20 +86,20 @@ private static boolean isPlayerInBlockRangeXYZ(@NotNull BlockPos pos, @NotNull L ey = y; y = tmp; } - double bx = (double)(pos.getX() + 0.5), by = (double)(pos.getY() + 0.5), bz = (double)(pos.getZ() + 0.5); - return Math.abs(x - bx) <= dx && Math.abs(z - bz) <= dz && - ((y <= by && by <= ey) || Math.min(Math.abs(y - by), Math.abs(ey - by)) <= dy); + return Math.abs(x - pos.x) <= dx && Math.abs(z - pos.z) <= dz && + ((y <= pos.y && pos.y <= ey) || Math.min(Math.abs(y - pos.y), Math.abs(ey - pos.y)) <= dy); } - public static boolean isInRange(@Nullable BlockPos blockPos, @Nullable Player player, @Nullable Level world, @NotNull BlockPos firstPos, @NotNull BlockPos secondPos, int maxRange) { - if (blockPos == null || world == null || player == null) + public static boolean isInRange(@Nullable Vec3 pos, @Nullable Player player, @Nullable Level world, @NotNull BlockPos firstPos, @NotNull BlockPos secondPos, int maxRange) { + if (pos == null || world == null || player == null) return false; - double i = Math.abs(player.getX() - blockPos.getX()); - double j = Math.abs(player.getZ() - blockPos.getZ()); + double x = Math.abs(player.getX() - pos.x); + double y = Math.abs(player.getY() - pos.y); + double z = Math.abs(player.getZ() - pos.z); // Check if the distance of the player is within the max range of the player detector // Use manhattan distance, not euclidean distance to keep same behavior than other `isInRange` functions - if (i + j > (maxRange != -1 ? maxRange : Integer.MAX_VALUE)) + if (maxRange != -1 && x + y + z > maxRange) return false; return world.getNearbyPlayers(TargetingConditions.forNonCombat(), null, new AABB(firstPos, secondPos)).contains(player); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java index 4231a15df..618cf90b2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java @@ -30,8 +30,23 @@ public class HitResultUtil { */ @NotNull public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreTransparent) { - EntityHitResult entityResult = getEntityHitResult(to, from, level); - BlockHitResult blockResult = getBlockHitResult(to, from, level, ignoreTransparent); + return getHitResult(to, from, level, ignoreTransparent, null); + } + + /** + * This method is used to get the hit result of an entity from the start position of a block + * + * @param to the target position/max position + * @param from the source position like a block + * @param level the level + * @param ignoreTransparent if transparent blocks should be ignored + * @param source the source Entity/BlockPos that will be ignored + * @return the hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found + */ + @NotNull + public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreTransparent, Object source) { + EntityHitResult entityResult = getEntityHitResult(to, from, level, source instanceof Entity ? (Entity) source : null); + BlockHitResult blockResult = getBlockHitResult(to, from, level, ignoreTransparent, source instanceof BlockPos ? (BlockPos) source : null); if (entityResult.getType() == HitResult.Type.MISS) { if (blockResult.getType() == HitResult.Type.MISS) { @@ -61,9 +76,26 @@ public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, boolean ig */ @NotNull public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level) { + return getEntityHitResult(to, from, level, null); + } + + /** + * This method is used to get the hit result of an entity from the start position of a block + * This could be used to find an entity from the eyes position of another entity but since + * this method uses one AABB made out of the two coordinates, this would also find any entities + * which are not located in the ray you might want. {@link DistanceDetectorPeripheral#getDistance()} + * + * @param to the target position/max position + * @param from the source position like a block + * @param level the world + * @param source the source Entity that will be ignored + * @return the entity hit result. An empty HitResult with {@link HitResult.Type#MISS} as type if nothing found + */ + @NotNull + public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level, Entity source) { AABB checkingBox = new AABB(to, from); - List entities = level.getEntities((Entity) null, checkingBox, (entity) -> true); + List entities = level.getEntities(source, checkingBox, (entity) -> true); Entity nearestEntity = null; Vec3 hitPos = null; @@ -96,7 +128,22 @@ public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level */ @NotNull public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreNoOccluded) { - return level.clip(new AdvancedClipContext(from, to, ignoreNoOccluded ? IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, null, true)); + return getBlockHitResult(to, from, level, ignoreNoOccluded); + } + + /** + * This method is used to get the hit result of a block from the start position of a block + * + * @param to the target position/max position + * @param from the source position + * @param level the world + * @param ignoreNoOccluded if true, the method will ignore blocks which are not occluding like glass + * @param source the source BlockPos that will be ignored + * @return the block hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found + */ + @NotNull + public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreNoOccluded, BlockPos source) { + return level.clip(new AdvancedClipContext(from, to, ignoreNoOccluded ? IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, null, source)); } public static class EmptyEntityHitResult extends EntityHitResult { @@ -137,18 +184,18 @@ public VoxelShape get(BlockState pState, @NotNull BlockGetter pBlock, @NotNull B private static class AdvancedClipContext extends ClipContext { private final ShapeGetter blockShapeGetter; - private final boolean ignoreSourceBlock; + private final BlockPos source; - protected AdvancedClipContext(Vec3 from, Vec3 to, ShapeGetter blockShapeGetter, Fluid fluidShapeGetter, @Nullable Entity entity, boolean ignoreSourceBlock) { + protected AdvancedClipContext(Vec3 from, Vec3 to, ShapeGetter blockShapeGetter, Fluid fluidShapeGetter, @Nullable Entity entity, BlockPos source) { super(from, to, Block.COLLIDER, fluidShapeGetter, entity); this.blockShapeGetter = blockShapeGetter; - this.ignoreSourceBlock = ignoreSourceBlock; + this.source = source; } @NotNull @Override public VoxelShape getBlockShape(@NotNull BlockState pBlockState, @NotNull BlockGetter pLevel, @NotNull BlockPos pPos) { - if (this.ignoreSourceBlock && pPos.equals(new BlockPos(this.getFrom()))) { + if (this.source != null && this.source.equals(pPos)) { return Shapes.empty(); } return blockShapeGetter.get(pBlockState, pLevel, pPos, this.collisionContext); diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index ee3c72dcd..3010fb82b 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -149,7 +149,7 @@ protected Vec3 getWorldPos() { if (!APAddons.vs2Loaded) { return pos; } - Ship ship = APAddons.getVS2Ship(this.getLevel(), this.getPos()); + Ship ship = APAddons.getVS2Ship(owner.getLevel(), owner.getPos()); if (ship == null) { return pos; } From de831d08798d3d1a09244083cd3c5699681d44b8 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 21 Dec 2024 16:08:02 -0700 Subject: [PATCH 109/188] support geoScanner on vs2 ship --- .../peripheral/GeoScannerPeripheral.java | 26 ++++++++++++++----- .../common/util/ScanUtils.java | 21 +++++++-------- .../lib/peripherals/BasePeripheral.java | 4 +++ 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java index c94496149..449256acb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java @@ -24,6 +24,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.Tags; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; @@ -60,13 +61,12 @@ public GeoScannerPeripheral(IPocketAccess pocket) { this(new PocketPeripheralOwner(pocket)); } - private static List> scan(Level level, BlockPos center, int radius) { - List> result = new ArrayList<>(); + private static List> scan(List> result, Level level, Vec3 center, int radius) { ScanUtils.relativeTraverseBlocks(level, center, radius, (state, pos) -> { HashMap data = new HashMap<>(6); - data.put("x", pos.getX()); - data.put("y", pos.getY()); - data.put("z", pos.getZ()); + data.put("x", pos.x); + data.put("y", pos.y); + data.put("z", pos.z); Block block = state.getBlock(); ResourceLocation name = ForgeRegistries.BLOCKS.getKey(block); @@ -103,7 +103,7 @@ public final MethodResult cost(int radius) { public final MethodResult chunkAnalyze() throws LuaException { return withOperation(SCAN_BLOCKS, SCAN_BLOCKS.free(), null, ignored -> { Level level = getLevel(); - LevelChunk chunk = level.getChunkAt(getPos()); + LevelChunk chunk = level.getChunkAt(getWorldBlockPos()); ChunkPos chunkPos = chunk.getPos(); HashMap data = new HashMap<>(); for (int x = chunkPos.getMinBlockX(); x <= chunkPos.getMaxBlockX(); x++) { @@ -131,6 +131,18 @@ public final MethodResult scan(@NotNull IArguments arguments) throws LuaExceptio return MethodResult.of(null, "Radius is exceed max value"); } return null; - }, context -> MethodResult.of(scan(getLevel(), getPos(), context.getRadius())), null); + }, context -> { + List> result = new ArrayList<>(); + scan(result, getLevel(), getCenterPos(), context.getRadius()); + if (isOnShip()) { + int i = result.size(); + scan(result, getLevel(), getWorldPos(), context.getRadius()); + for (; i < result.size(); i++) { + Map data = result.get(i); + data.put("notOnShip", true); + } + } + return MethodResult.of(result); + }, null); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/ScanUtils.java b/src/main/java/de/srendi/advancedperipherals/common/util/ScanUtils.java index 68a51bcd4..07194d1a7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/ScanUtils.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/ScanUtils.java @@ -3,32 +3,31 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import java.util.function.BiConsumer; public class ScanUtils { - public static void relativeTraverseBlocks(Level world, BlockPos center, int radius, BiConsumer consumer) { + public static void relativeTraverseBlocks(Level world, Vec3 center, double radius, BiConsumer consumer) { traverseBlocks(world, center, radius, consumer, true); } - public static void traverseBlocks(Level world, BlockPos center, int radius, BiConsumer consumer) { + public static void traverseBlocks(Level world, Vec3 center, double radius, BiConsumer consumer) { traverseBlocks(world, center, radius, consumer, false); } - public static void traverseBlocks(Level world, BlockPos center, int radius, BiConsumer consumer, boolean relativePosition) { - int x = center.getX(); - int y = center.getY(); - int z = center.getZ(); - for (int oX = x - radius; oX <= x + radius; oX++) { - for (int oY = y - radius; oY <= y + radius; oY++) { - for (int oZ = z - radius; oZ <= z + radius; oZ++) { + public static void traverseBlocks(Level world, Vec3 center, double radius, BiConsumer consumer, boolean relativePosition) { + final double x = center.x, y = center.y, z = center.z; + for (int oX = (int) (x - radius); oX <= (int) (x + radius); oX++) { + for (int oY = (int) (y - radius); oY <= (int) (y + radius); oY++) { + for (int oZ = (int) (z - radius); oZ <= (int) (z + radius); oZ++) { BlockPos subPos = new BlockPos(oX, oY, oZ); BlockState blockState = world.getBlockState(subPos); if (!blockState.isAir()) { if (relativePosition) { - consumer.accept(blockState, new BlockPos(oX - x, oY - y, oZ - z)); + consumer.accept(blockState, new Vec3(oX + 0.5 - center.x, oY + 0.5 - center.y, oZ + 0.5 - center.z)); } else { - consumer.accept(blockState, subPos); + consumer.accept(blockState, new Vec3(oX, oY, oZ)); } } } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index 3010fb82b..342ffb10e 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -144,6 +144,10 @@ protected Level getLevel() { return owner.getLevel(); } + protected boolean isOnShip() { + return APAddons.vs2Loaded && APAddons.isBlockOnShip(owner.getLevel(), owner.getPos()); + } + protected Vec3 getWorldPos() { Vec3 pos = this.getCenterPos(); if (!APAddons.vs2Loaded) { From 2c74533bb282e3b5325f82f49433f61b6d5e8469 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 21 Dec 2024 20:27:04 -0700 Subject: [PATCH 110/188] add ShipScannerPlugin for environment detector --- .../IntegrationPeripheralProvider.java | 2 +- .../operations/SphereOperation.java | 3 +- .../EnvironmentDetectorPeripheral.java | 13 ++-- .../peripheral/PlayerDetectorPeripheral.java | 1 - .../addons/valkyrienskies/Integration.java | 11 +++ .../valkyrienskies/ShipScannerPlugin.java | 78 +++++++++++++++++++ .../blockentities/DistanceDetectorEntity.java | 2 +- .../common/util/LuaConverter.java | 48 ++++++++++++ .../lib/peripherals/BasePeripheralPlugin.java | 34 ++++++++ 9 files changed, 180 insertions(+), 12 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/Integration.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java create mode 100644 src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheralPlugin.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java index 2d9ccb553..b3a9d8e7a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java @@ -23,7 +23,7 @@ public class IntegrationPeripheralProvider implements IPeripheralProvider { - private static final String[] SUPPORTED_MODS = new String[]{"botania", "create", "mekanism", "powah", "dimstorage"}; + private static final String[] SUPPORTED_MODS = new String[]{"botania", "create", "mekanism", "powah", "dimstorage", "valkyrienskies"}; private static final PriorityQueue integrations = new PriorityQueue<>(Comparator.comparingInt(IPeripheralIntegration::getPriority)); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java index 9e8e0ac0f..54217cede 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SphereOperation.java @@ -9,7 +9,8 @@ public enum SphereOperation implements IPeripheralOperation { SCAN_BLOCKS(2_000, 8, 16, 0.17), - SCAN_ENTITIES(2_000, 8, 16, 0.17); + SCAN_ENTITIES(2_000, 8, 16, 0.17), + SCAN_SHIPS(2_500, 8 * 3, 16 * 10 /* common view distance */, 0.17); private final int defaultCooldown; private final int defaultMaxFreeRadius; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index 7bb85bd76..24b4b4930 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -4,7 +4,6 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; -import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.pocket.IPocketAccess; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; @@ -18,7 +17,6 @@ import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralPlugin; -import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceKey; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -51,8 +49,9 @@ public class EnvironmentDetectorPeripheral extends BasePeripheral plugin : PERIPHERAL_PLUGINS) + for (Function plugin : PERIPHERAL_PLUGINS) { addPlugin(plugin.apply(owner)); + } } public EnvironmentDetectorPeripheral(PeripheralBlockEntity tileEntity) { @@ -197,17 +196,15 @@ public final boolean isSunny() { } @LuaFunction(mainThread = true) - public final MethodResult scanEntities(@NotNull IComputerAccess access, @NotNull IArguments arguments) throws LuaException { + public final MethodResult scanEntities(@NotNull IArguments arguments) throws LuaException { int radius = arguments.getInt(0); boolean detailed = arguments.count() > 1 ? arguments.getBoolean(1) : false; return withOperation(SCAN_ENTITIES, new SphereOperationContext(radius), context -> { - if (radius > SCAN_ENTITIES.getMaxCostRadius()) - return MethodResult.of(null, "Radius exceeds max value"); - return null; + return context.getRadius() > SCAN_ENTITIES.getMaxCostRadius() ? MethodResult.of(null, "Radius exceeds max value") : null; }, context -> { Vec3 pos = this.getWorldPos(); AABB box = new AABB(pos, pos); - List> entities = getLevel().getEntities((Entity) null, box.inflate(radius + 0.5), entity -> entity instanceof LivingEntity && entity.isAlive()).stream().map(entity -> LuaConverter.completeEntityWithPositionToLua(entity, pos, detailed)).toList(); + List> entities = getLevel().getEntities((Entity) null, box.inflate(context.getRadius() + 0.5), entity -> entity instanceof LivingEntity && entity.isAlive()).stream().map(entity -> LuaConverter.completeEntityWithPositionToLua(entity, pos, detailed)).toList(); return MethodResult.of(entities); }, null); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java index 8cc702635..75bf454d4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java @@ -19,7 +19,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.server.ServerLifecycleHooks; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/Integration.java new file mode 100644 index 000000000..a416cbbea --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/Integration.java @@ -0,0 +1,11 @@ +package de.srendi.advancedperipherals.common.addons.valkyrienskies; + +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.EnvironmentDetectorPeripheral; + +public class Integration implements Runnable { + + @Override + public void run() { + EnvironmentDetectorPeripheral.addIntegrationPlugin(ShipScannerPlugin::new); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java new file mode 100644 index 000000000..eb4ea5749 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java @@ -0,0 +1,78 @@ +package de.srendi.advancedperipherals.common.addons.valkyrienskies; + +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.MethodResult; +import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperationContext; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; +import de.srendi.advancedperipherals.common.util.LuaConverter; +import de.srendi.advancedperipherals.lib.peripherals.BasePeripheralPlugin; +import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; +import org.valkyrienskies.core.api.ships.ServerShip; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperation.SCAN_SHIPS; + +public class ShipScannerPlugin extends BasePeripheralPlugin { + public ShipScannerPlugin(IPeripheralOwner owner) { + super(owner); + } + + @Override + public IPeripheralOperation[] getOperations() { + return new IPeripheralOperation[]{SCAN_SHIPS}; + } + + @LuaFunction(mainThread = true) + public final MethodResult scanShips(int radius) throws LuaException { + return withOperation(SCAN_SHIPS, new SphereOperationContext(radius), context -> { + return context.getRadius() > SCAN_SHIPS.getMaxCostRadius() ? MethodResult.of(null, "Radius exceeds max value") : null; + }, context -> { + ServerLevel level = (ServerLevel) this.owner.getLevel(); + Vec3 pos = this.owner.getCenterPos(); + Ship ship = APAddons.getVS2Ship(level, new BlockPos(pos)); + if (ship != null) { + Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); + pos = new Vec3(newPos.x, newPos.y, newPos.z); + } + List shipPoses = VSGameUtilsKt.transformToNearbyShipsAndWorld(level, pos.x, pos.y, pos.z, context.getRadius()); + List> shipDatas = new ArrayList<>(shipPoses.size()); + for (Vector3d p : shipPoses) { + ServerShip s = VSGameUtilsKt.getShipManagingPos(level, p.x, p.y, p.z); + if (ship == null || s.getId() != ship.getId()) { + shipDatas.add(LuaConverter.shipToObject(s, pos)); + } + } + return MethodResult.of(shipDatas); + }, null); + } + + @LuaFunction + public final MethodResult scanShipCost(int radius) { + int estimatedCost = estimateShipCost(radius); + if (estimatedCost < 0) { + return MethodResult.of(null, "Radius exceeds max value"); + } + return MethodResult.of(estimatedCost); + } + + private static int estimateShipCost(int radius) { + if (radius <= SCAN_SHIPS.getMaxFreeRadius()) { + return 0; + } + if (radius > SCAN_SHIPS.getMaxCostRadius()) { + return -1; + } + return SCAN_SHIPS.getCost(SphereOperationContext.of(radius)); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 05c0cc26e..8858f9126 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -198,7 +198,7 @@ protected Vec3 getDirection() { Ship ship = APAddons.getVS2Ship(this.getLevel(), this.getBlockPos()); if (ship == null) { return dir; - }; + } Vector3d newDir = ship.getShipToWorld().transformDirection(new Vector3d(dir.x, dir.y, dir.z)); return new Vec3(newDir.x, newDir.y, newDir.z); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index aebd5bbb6..51ea7661a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -24,6 +24,14 @@ import net.minecraftforge.common.IForgeShearable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; +import org.joml.primitives.AABBic; +import org.joml.Quaterniondc; +import org.joml.Vector3d; +import org.joml.Vector3dc; +import org.valkyrienskies.core.api.ships.ServerShip; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.core.api.ships.properties.ShipInertiaData; +import org.valkyrienskies.core.api.ships.properties.ShipTransform; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -284,4 +292,44 @@ public static Object effectToObject(MobEffectInstance effect) { map.put("amplifier", effect.getAmplifier()); return map; } + + public static Map shipToObject(ServerShip ship, Vec3 pos) { + Map map = new HashMap<>(); + + map.put("id", ship.getId()); + map.put("slug", ship.getSlug()); + + ShipTransform tf = ship.getTransform(); + + Vector3dc worldPos = tf.getShipPositionInWorldCoordinates(); + Vector3dc shipPos = tf.getShipPositionInShipCoordinates(); + map.put("x", worldPos.x() - pos.x); + map.put("y", worldPos.y() - pos.y); + map.put("z", worldPos.z() - pos.z); + Quaterniondc rot = tf.getShipToWorldRotation(); + final double rotX = rot.x(), rotY = rot.y(), rotZ = rot.z(), rotW = rot.w(); + map.put("rotate", Map.of("x", rotX, "y", rotY, "z", rotZ, "w", rotW)); + // Not really correct? + // map.put("pitch", Math.toDegrees(Math.asin(-2 * (rotX * rotZ - rotW * rotY)))); + // map.put("roll", Math.toDegrees(Math.atan2(2 * (rotX * rotY + rotW * rotZ), rotW * rotW + rotX * rotX - rotY * rotY - rotZ * rotZ))); + // map.put("yaw", Math.toDegrees(Math.atan2(2 * (rotY * rotZ + rotW * rotX), rotW * rotW - rotX * rotX - rotY * rotY + rotZ * rotZ))); + + AABBic box = ship.getShipAABB(); + if (box != null) { + map.put("size", Map.of("x", box.maxX() - box.minX(), "y", box.maxY() - box.minY(), "z", box.maxZ() - box.minZ())); + map.put("corner", Map.of("x", shipPos.x() - box.minX(), "y", shipPos.y() - box.minY(), "z", shipPos.z() - box.minZ())); + } + Vector3dc omega = ship.getOmega(); + map.put("omega", Map.of("x", omega.x(), "y", omega.y(), "z", omega.z())); + Vector3dc velocity = ship.getVelocity(); + map.put("isStatic", ship.isStatic()); + map.put("velocity", Map.of("x", velocity.x(), "y", velocity.y(), "z", velocity.z())); + + ShipInertiaData data = ship.getInertiaData(); + map.put("mass", data.getMass()); + Vector3d com = tf.getShipToWorld().transformPosition(data.getCenterOfMassInShipSpace(), new Vector3d()); + map.put("centerOfMass", Map.of("x", com.x - pos.x, "y", com.y - pos.y, "z", com.z - pos.z)); + + return map; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheralPlugin.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheralPlugin.java new file mode 100644 index 000000000..af158aecc --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheralPlugin.java @@ -0,0 +1,34 @@ +package de.srendi.advancedperipherals.lib.peripherals; + +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.MethodResult; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.OperationAbility; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.PeripheralOwnerAbility; + +import org.jetbrains.annotations.Nullable; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public abstract class BasePeripheralPlugin implements IPeripheralPlugin { + protected final IPeripheralOwner owner; + + public BasePeripheralPlugin(IPeripheralOwner owner) { + this.owner = owner; + } + + public IPeripheralOwner getPeripheralOwner() { + return this.owner; + } + + protected MethodResult withOperation(IPeripheralOperation operation, T context, @Nullable IPeripheralCheck check, IPeripheralFunction method, @Nullable Consumer successCallback) throws LuaException { + return withOperation(operation, context, check, method, successCallback, null); + } + + protected MethodResult withOperation(IPeripheralOperation operation, T context, @Nullable IPeripheralCheck check, IPeripheralFunction method, @Nullable Consumer successCallback, @Nullable BiConsumer failCallback) throws LuaException { + OperationAbility operationAbility = this.owner.getAbility(PeripheralOwnerAbility.OPERATION); + if (operationAbility == null) throw new IllegalArgumentException("This shouldn't happen at all"); + return operationAbility.performOperation(operation, context, check, method, successCallback, failCallback); + } +} From bd49e5a8173bc23cda05bd90f942b85364ea5fc8 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 26 Dec 2024 17:53:00 -0700 Subject: [PATCH 111/188] add mountToShip for automata turtles --- .../operations/SingleOperation.java | 3 +- .../EnvironmentDetectorPeripheral.java | 2 +- .../WeakAutomataCorePeripheral.java | 17 ++++ .../plugins/AutomataVSMountPlugin.java | 96 +++++++++++++++++++ .../valkyrienskies/ShipScannerPlugin.java | 22 +---- .../addons/valkyrienskies/ValkyrienSkies.java | 34 +++++++ 6 files changed, 153 insertions(+), 21 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataVSMountPlugin.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java index 333eb905f..f2075d2a4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java @@ -16,7 +16,8 @@ public enum SingleOperation implements IPeripheralOperation { public static final String PERIPHERAL_TYPE = "environment_detector"; - private static final List> PERIPHERAL_PLUGINS = new LinkedList<>(); + private static final List> PERIPHERAL_PLUGINS = new ArrayList<>(); protected EnvironmentDetectorPeripheral(IPeripheralOwner owner) { super(PERIPHERAL_TYPE, owner); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java index 64bd72511..bc7fa0e6a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java @@ -2,14 +2,28 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.addons.computercraft.operations.AutomataCoreTier; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.*; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.lib.metaphysics.IAutomataCoreTier; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + public class WeakAutomataCorePeripheral extends AutomataCorePeripheral { public static final String TYPE = "weak_automata"; + private static final List> PERIPHERAL_PLUGINS = new ArrayList<>(); + + static { + PERIPHERAL_PLUGINS.add(AutomataItemSuckPlugin::new); + PERIPHERAL_PLUGINS.add(AutomataLookPlugin::new); + PERIPHERAL_PLUGINS.add(AutomataBlockHandPlugin::new); + PERIPHERAL_PLUGINS.add(AutomataSoulFeedingPlugin::new); + PERIPHERAL_PLUGINS.add(AutomataChargingPlugin::new); + } public WeakAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) { this(TYPE, turtle, side, AutomataCoreTier.TIER1); @@ -22,6 +36,9 @@ protected WeakAutomataCorePeripheral(String type, ITurtleAccess turtle, TurtleSi addPlugin(new AutomataBlockHandPlugin(this)); addPlugin(new AutomataSoulFeedingPlugin(this)); addPlugin(new AutomataChargingPlugin(this)); + if (APAddons.vs2Loaded) { + addPlugin(new AutomataVSMountPlugin(this)); + } } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataVSMountPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataVSMountPlugin.java new file mode 100644 index 000000000..584214e77 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataVSMountPlugin.java @@ -0,0 +1,96 @@ +package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.MethodResult; +import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperationContext; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; +import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; +import org.valkyrienskies.core.api.ships.ServerShip; +import org.valkyrienskies.core.api.ships.Ship; + +import java.util.List; +import java.util.stream.Collectors; + +import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.MOUNT_SHIP; + +public class AutomataVSMountPlugin extends AutomataCorePlugin { + + public AutomataVSMountPlugin(AutomataCorePeripheral automataCore) { + super(automataCore); + } + + @LuaFunction(mainThread = true) + public final boolean isOnShip() { + IPeripheralOwner owner = this.automataCore.getPeripheralOwner(); + return APAddons.isBlockOnShip(owner.getLevel(), owner.getPos()); + } + + @LuaFunction(mainThread = true) + public final MethodResult canMountToShip() { + List ships = this.getMountableShips(); + if (ships.size() == 0) { + return MethodResult.of(); + } + List shipNames = ships.stream().map(s -> s.getSlug()).collect(Collectors.toList()); + return MethodResult.of(shipNames); + } + + @LuaFunction(mainThread = true) + public final MethodResult mountToShip(IArguments args) throws LuaException { + String name = args.optString(0).orElse(null); + List ships = this.getMountableShips(); + if (ships.size() == 0) { + return MethodResult.of(false, "no mountable ship detected"); + } + ServerShip targetShip = null; + if (name == null) { + targetShip = ships.get(0); + } else { + for (ServerShip s : ships) { + if (s.getSlug().equals(name)) { + targetShip = s; + break; + } + } + } + if (targetShip == null) { + return MethodResult.of(false, "target ship not found"); + } + IPeripheralOwner owner = this.automataCore.getPeripheralOwner(); + Level level = owner.getLevel(); + Vec3 pos = this.getMountDetectPosition(); + Vector3d targetPos = targetShip.getWorldToShip().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); + BlockPos newPosition = new BlockPos(targetPos.x, targetPos.y, targetPos.z); + return this.automataCore.withOperation(MOUNT_SHIP, new SingleOperationContext(1, 1), context -> { + boolean result = owner.move(level, newPosition); + if (!result) { + return MethodResult.of(false, "cannot mount to ship"); + } + return MethodResult.of(true); + }, context -> { + if (!owner.isMovementPossible(level, newPosition)) { + return MethodResult.of(false, "move forbidden"); + } + return null; + }); + } + + protected Vec3 getMountDetectPosition() { + IPeripheralOwner owner = this.automataCore.getPeripheralOwner(); + return owner.getCenterPos().add(Vec3.atLowerCornerOf(owner.getFacing().getNormal())); + } + + protected List getMountableShips() { + IPeripheralOwner owner = this.automataCore.getPeripheralOwner(); + return ValkyrienSkies.getNearbyShips((ServerLevel) owner.getLevel(), this.getMountDetectPosition(), 0.5); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java index eb4ea5749..6450eec51 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java @@ -3,23 +3,19 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; -import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperationContext; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheralPlugin; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; -import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.phys.Vec3; -import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.ServerShip; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperation.SCAN_SHIPS; @@ -38,21 +34,9 @@ public final MethodResult scanShips(int radius) throws LuaException { return withOperation(SCAN_SHIPS, new SphereOperationContext(radius), context -> { return context.getRadius() > SCAN_SHIPS.getMaxCostRadius() ? MethodResult.of(null, "Radius exceeds max value") : null; }, context -> { - ServerLevel level = (ServerLevel) this.owner.getLevel(); Vec3 pos = this.owner.getCenterPos(); - Ship ship = APAddons.getVS2Ship(level, new BlockPos(pos)); - if (ship != null) { - Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); - pos = new Vec3(newPos.x, newPos.y, newPos.z); - } - List shipPoses = VSGameUtilsKt.transformToNearbyShipsAndWorld(level, pos.x, pos.y, pos.z, context.getRadius()); - List> shipDatas = new ArrayList<>(shipPoses.size()); - for (Vector3d p : shipPoses) { - ServerShip s = VSGameUtilsKt.getShipManagingPos(level, p.x, p.y, p.z); - if (ship == null || s.getId() != ship.getId()) { - shipDatas.add(LuaConverter.shipToObject(s, pos)); - } - } + List ships = ValkyrienSkies.getNearbyShips((ServerLevel) this.owner.getLevel(), pos, context.getRadius()); + List> shipDatas = ships.stream().map(s -> LuaConverter.shipToObject(s, pos)).collect(Collectors.toList()); return MethodResult.of(shipDatas); }, null); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java new file mode 100644 index 000000000..61d084da1 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java @@ -0,0 +1,34 @@ +package de.srendi.advancedperipherals.common.addons.valkyrienskies; + +import de.srendi.advancedperipherals.common.addons.APAddons; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; +import org.valkyrienskies.core.api.ships.ServerShip; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; + +import java.util.ArrayList; +import java.util.List; + +public final class ValkyrienSkies { + private ValkyrienSkies() {} + + public static List getNearbyShips(ServerLevel level, Vec3 pos, double radius) { + Ship ship = APAddons.getVS2Ship(level, new BlockPos(pos)); + if (ship != null) { + Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); + pos = new Vec3(newPos.x, newPos.y, newPos.z); + } + List shipPoses = VSGameUtilsKt.transformToNearbyShipsAndWorld(level, pos.x, pos.y, pos.z, radius); + List ships = new ArrayList<>(shipPoses.size()); + for (Vector3d p : shipPoses) { + ServerShip s = VSGameUtilsKt.getShipManagingPos(level, p.x, p.y, p.z); + if (ship == null || s.getId() != ship.getId()) { + ships.add(s); + } + } + return ships; + } +} From 83556a8ded5790f80662db077dc633fd1f0d90a4 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 31 Dec 2024 23:37:00 -0700 Subject: [PATCH 112/188] fix automata turtle interact with vs2 ship --- .../WeakAutomataCorePeripheral.java | 24 +++---- .../plugins/AutomataLookPlugin.java | 18 ++++-- .../AutomataVSMountPlugin.java | 4 +- .../addons/valkyrienskies/Integration.java | 2 + .../common/util/HitResultUtil.java | 2 +- .../common/util/fakeplayer/APFakePlayer.java | 64 +++++++------------ .../fakeplayer/FakePlayerProviderTurtle.java | 36 +++++++++-- .../lib/peripherals/BasePeripheral.java | 12 ++-- 8 files changed, 88 insertions(+), 74 deletions(-) rename src/main/java/de/srendi/advancedperipherals/common/addons/{computercraft/peripheral/plugins => valkyrienskies}/AutomataVSMountPlugin.java (95%) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java index bc7fa0e6a..dc0ac06d7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java @@ -8,6 +8,7 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.lib.metaphysics.IAutomataCoreTier; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; +import de.srendi.advancedperipherals.lib.peripherals.IPeripheralPlugin; import java.util.ArrayList; import java.util.List; @@ -18,11 +19,11 @@ public class WeakAutomataCorePeripheral extends AutomataCorePeripheral { private static final List> PERIPHERAL_PLUGINS = new ArrayList<>(); static { - PERIPHERAL_PLUGINS.add(AutomataItemSuckPlugin::new); - PERIPHERAL_PLUGINS.add(AutomataLookPlugin::new); - PERIPHERAL_PLUGINS.add(AutomataBlockHandPlugin::new); - PERIPHERAL_PLUGINS.add(AutomataSoulFeedingPlugin::new); - PERIPHERAL_PLUGINS.add(AutomataChargingPlugin::new); + addIntegrationPlugin(AutomataItemSuckPlugin::new); + addIntegrationPlugin(AutomataLookPlugin::new); + addIntegrationPlugin(AutomataBlockHandPlugin::new); + addIntegrationPlugin(AutomataSoulFeedingPlugin::new); + addIntegrationPlugin(AutomataChargingPlugin::new); } public WeakAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) { @@ -31,16 +32,15 @@ public WeakAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) { protected WeakAutomataCorePeripheral(String type, ITurtleAccess turtle, TurtleSide side, IAutomataCoreTier tier) { super(type, turtle, side, tier); - addPlugin(new AutomataItemSuckPlugin(this)); - addPlugin(new AutomataLookPlugin(this)); - addPlugin(new AutomataBlockHandPlugin(this)); - addPlugin(new AutomataSoulFeedingPlugin(this)); - addPlugin(new AutomataChargingPlugin(this)); - if (APAddons.vs2Loaded) { - addPlugin(new AutomataVSMountPlugin(this)); + for (Function plugin : PERIPHERAL_PLUGINS) { + addPlugin(plugin.apply(this)); } } + public static void addIntegrationPlugin(Function plugin) { + PERIPHERAL_PLUGINS.add(plugin); + } + @Override public boolean isEnabled() { return APConfig.METAPHYSICS_CONFIG.enableWeakAutomataCore.get(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java index a3b5446ac..6bf4759ad 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java @@ -14,6 +14,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; @@ -36,16 +37,21 @@ public final MethodResult lookAtBlock(@NotNull IArguments arguments) throws LuaE automataCore.addRotationCycle(); TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); HitResult result = owner.withPlayer(APFakePlayer.wrapActionWithRot(yaw, pitch, p -> p.findHit(true, false))); - if (result.getType() == HitResult.Type.MISS) + if (result.getType() == HitResult.Type.MISS) { return MethodResult.of(null, "No block find"); + } BlockHitResult blockHit = (BlockHitResult) result; BlockState state = owner.getLevel().getBlockState(blockHit.getBlockPos()); Map data = new HashMap<>(); ResourceLocation blockName = ForgeRegistries.BLOCKS.getKey(state.getBlock()); - if (blockName != null) - data.put("name", blockName.toString()); + data.put("name", blockName == null ? null : blockName.toString()); data.put("tags", LuaConverter.tagsToList(() -> state.getBlock().builtInRegistryHolder().tags())); + Vec3 pos = blockHit.getLocation(); + Vec3 origin = automataCore.getWorldPos(); + data.put("x", pos.x - origin.x); + data.put("y", pos.y - origin.y); + data.put("z", pos.z - origin.z); return MethodResult.of(data); } @@ -57,11 +63,13 @@ public final MethodResult lookAtEntity(@NotNull IArguments arguments) throws Lua automataCore.addRotationCycle(); HitResult result = automataCore.getPeripheralOwner().withPlayer(APFakePlayer.wrapActionWithRot(yaw, pitch, p -> p.findHit(false, true))); - if (result.getType() == HitResult.Type.MISS) + if (result.getType() == HitResult.Type.MISS) { return MethodResult.of(null, "No entity find"); + } EntityHitResult entityHit = (EntityHitResult) result; - return MethodResult.of(LuaConverter.entityToLua(entityHit.getEntity(), true)); + Vec3 origin = automataCore.getWorldPos(); + return MethodResult.of(LuaConverter.completeEntityWithPositionToLua(entityHit.getEntity(), origin, true)); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataVSMountPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java similarity index 95% rename from src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataVSMountPlugin.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java index 584214e77..e6699476b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataVSMountPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins; +package de.srendi.advancedperipherals.common.addons.valkyrienskies; import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; @@ -7,7 +7,7 @@ import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperationContext; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; -import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataCorePlugin; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/Integration.java index a416cbbea..b54a20c27 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/Integration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/Integration.java @@ -1,11 +1,13 @@ package de.srendi.advancedperipherals.common.addons.valkyrienskies; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.EnvironmentDetectorPeripheral; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.metaphysics.WeakAutomataCorePeripheral; public class Integration implements Runnable { @Override public void run() { EnvironmentDetectorPeripheral.addIntegrationPlugin(ShipScannerPlugin::new); + WeakAutomataCorePeripheral.addIntegrationPlugin(AutomataVSMountPlugin::new); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java index 618cf90b2..95ea8d085 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java @@ -128,7 +128,7 @@ public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level */ @NotNull public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreNoOccluded) { - return getBlockHitResult(to, from, level, ignoreNoOccluded); + return getBlockHitResult(to, from, level, ignoreNoOccluded, null); } /** diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java index a947a4c53..4068709db 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java @@ -3,6 +3,7 @@ import com.mojang.authlib.GameProfile; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.Pair; +import de.srendi.advancedperipherals.common.util.HitResultUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; @@ -33,6 +34,7 @@ import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.*; +import net.minecraft.world.phys.shapes.Shapes; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.util.FakePlayer; @@ -55,38 +57,33 @@ public class APFakePlayer extends FakePlayer { public static final GameProfile PROFILE = new GameProfile(UUID.fromString("6e483f02-30db-4454-b612-3a167614b276"), "[" + AdvancedPeripherals.MOD_ID + "]"); private static final Predicate collidablePredicate = EntitySelector.NO_SPECTATORS; - private final WeakReference owner; - - private BlockPos digPosition; - private Block digBlock; - + private BlockPos source = null; + private BlockPos digPosition = null; + private Block digBlock = null; private float currentDamage = 0; public APFakePlayer(ServerLevel world, Entity owner, GameProfile profile) { super(world, profile != null && profile.isComplete() ? profile : PROFILE); if (owner != null) { setCustomName(owner.getName()); - this.owner = new WeakReference<>(owner); - } else { - this.owner = null; } } + public void setSourceBlock(BlockPos pos) { + this.source = pos; + } + @Override public void awardStat(@NotNull Stat stat) { MinecraftServer server = level.getServer(); if (server != null && getGameProfile() != PROFILE) { Player player = server.getPlayerList().getPlayer(getUUID()); - if (player != null) + if (player != null) { player.awardStat(stat); + } } } - @Override - public boolean canAttack(@NotNull LivingEntity livingEntity) { - return true; - } - @Override public void openTextEdit(@NotNull SignBlockEntity sign) { } @@ -101,7 +98,6 @@ public void playSound(@NotNull SoundEvent soundIn, float volume, float pitch) { } private void setState(Block block, BlockPos pos) { - if (digPosition != null) { gameMode.handleBlockBreakAction(digPosition, ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, Direction.EAST, 320, 1); } @@ -121,12 +117,12 @@ public static Function wrapActionWithRot(float yaw, float p } public T doActionWithRot(float yaw, float pitch, Function action) { - final float oldRot = this.getYRot(); - this.setRot(oldRot + yaw, pitch); + final float yRot = this.getYRot(), xRot = this.getXRot(); + this.setRot(yRot + yaw, xRot + pitch); try { return action.apply(this); } finally { - this.setRot(oldRot, 0); + this.setRot(yRot, xRot); } } @@ -144,11 +140,6 @@ public T doActionWithShiftKey(boolean shift, Function actio } } - @Deprecated(forRemoval = true) - public Pair digBlock(Direction direction) { - return doActionWithRot(direction.toYRot() - this.getYRot(), direction == Direction.DOWN ? 90 : direction == Direction.UP ? -90 : 0, APFakePlayer::digBlock); - } - public Pair digBlock() { Level world = getLevel(); HitResult hit = findHit(true, false); @@ -290,33 +281,27 @@ public HitResult findHit(boolean skipEntity, boolean skipBlock) { @NotNull public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predicate entityFilter) { - AttributeInstance reachAttribute = getAttribute(ForgeMod.REACH_DISTANCE.get()); + AttributeInstance reachAttribute = this.getAttribute(ForgeMod.REACH_DISTANCE.get()); if (reachAttribute == null) throw new IllegalArgumentException("How did this happened?"); double range = reachAttribute.getValue(); - Vec3 origin = new Vec3(getX(), getY(), getZ()); - Vec3 look = getLookAngle(); + Vec3 origin = new Vec3(this.getX(), this.getY(), this.getZ()); + Vec3 look = this.getLookAngle(); Vec3 target = new Vec3(origin.x + look.x * range, origin.y + look.y * range, origin.z + look.z * range); - ClipContext traceContext = new ClipContext(origin, target, ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, this); - Vec3 directionVec = traceContext.getFrom().subtract(traceContext.getTo()); - Direction traceDirection = Direction.getNearest(directionVec.x, directionVec.y, directionVec.z); HitResult blockHit; if (skipBlock) { - blockHit = BlockHitResult.miss(traceContext.getTo(), traceDirection, new BlockPos(traceContext.getTo())); + Direction traceDirection = Direction.getNearest(look.x, look.y, look.z); + blockHit = BlockHitResult.miss(target, traceDirection, new BlockPos(target)); } else { - blockHit = BlockGetter.traverseBlocks(traceContext.getFrom(), traceContext.getTo(), traceContext, (rayTraceContext, blockPos) -> { - if (level.isEmptyBlock(blockPos) || blockPos.equals(blockPosition())) { - return null; - } - return new BlockHitResult(new Vec3(blockPos.getX(), blockPos.getY(), blockPos.getZ()), traceDirection, blockPos, false); - }, rayTraceContext -> BlockHitResult.miss(rayTraceContext.getTo(), traceDirection, new BlockPos(rayTraceContext.getTo()))); + blockHit = HitResultUtil.getBlockHitResult(target, origin, level, false, this.source); } - if (skipEntity) + if (skipEntity) { return blockHit; + } - List entities = level.getEntities(this, getBoundingBox().expandTowards(look.x * range, look.y * range, look.z * range).inflate(1), collidablePredicate); + List entities = level.getEntities(this, this.getBoundingBox().expandTowards(look.x * range, look.y * range, look.z * range).inflate(1), collidablePredicate); LivingEntity closestEntity = null; Vec3 closestVec = null; @@ -330,9 +315,6 @@ public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predic continue; } - // Removed a lot logic here to make Automata cores interact like a player. - // However, the results for some edge cases may change. Need more review and tests. - // Hit vehicle before passenger if (entity.isPassenger()) { continue; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java index 03696de42..60946c0b2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java @@ -3,6 +3,8 @@ import com.mojang.authlib.GameProfile; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.shared.util.WorldUtil; +import de.srendi.advancedperipherals.common.addons.APAddons; +import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -11,8 +13,12 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3;; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.InvWrapper; +import org.joml.Matrix4dc; +import org.joml.Vector3d; +import org.valkyrienskies.core.api.ships.Ship; import java.util.WeakHashMap; import java.util.function.Function; @@ -32,11 +38,27 @@ public static APFakePlayer getPlayer(ITurtleAccess turtle, GameProfile profile) } public static void load(APFakePlayer player, ITurtleAccess turtle) { - Direction direction = turtle.getDirection(); - player.setLevel((ServerLevel) turtle.getLevel()); - // Player position - BlockPos position = turtle.getPosition(); - player.moveTo(position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5, direction.toYRot(), 0); + ServerLevel level = (ServerLevel) turtle.getLevel(); + player.setLevel(level); + + BlockPos pos = turtle.getPosition(); + player.setSourceBlock(pos); + + Vec3 direction = Vec3.atLowerCornerOf(turtle.getDirection().getNormal()); + Vec3 position = Vec3.atCenterOf(pos); + if (APAddons.vs2Loaded) { + Ship ship = APAddons.getVS2Ship(level, pos); + if (ship != null) { + Matrix4dc matrix = ship.getShipToWorld(); + Vector3d newPos = matrix.transformPosition(new Vector3d(position.x, position.y, position.z)); + Vector3d newDir = matrix.transformDirection(new Vector3d(direction.x, direction.y, direction.z)); + position = new Vec3(newPos.x, newPos.y, newPos.z); + direction = new Vec3(newDir.x, newDir.y, newDir.z); + } + } + player.lookAt(EntityAnchorArgument.Anchor.FEET, position.add(direction)); + player.moveTo(position.x, position.y, position.z, player.getYRot(), player.getXRot()); + // Player inventory Inventory playerInventory = player.getInventory(); playerInventory.selected = 0; @@ -55,9 +77,9 @@ public static void load(APFakePlayer player, ITurtleAccess turtle) { // Add properties ItemStack activeStack = player.getItemInHand(InteractionHand.MAIN_HAND); - if (!activeStack.isEmpty()) + if (!activeStack.isEmpty()) { player.getAttributes().addTransientAttributeModifiers(activeStack.getAttributeModifiers(EquipmentSlot.MAINHAND)); - + } } public static void unload(APFakePlayer player, ITurtleAccess turtle) { diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index 342ffb10e..5ba11f4fd 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -132,23 +132,23 @@ public final Map getConfiguration() { return getPeripheralConfiguration(); } - protected BlockPos getPos() { + public BlockPos getPos() { return owner.getPos(); } - protected Vec3 getCenterPos() { + public Vec3 getCenterPos() { return owner.getCenterPos(); } - protected Level getLevel() { + public Level getLevel() { return owner.getLevel(); } - protected boolean isOnShip() { + public boolean isOnShip() { return APAddons.vs2Loaded && APAddons.isBlockOnShip(owner.getLevel(), owner.getPos()); } - protected Vec3 getWorldPos() { + public Vec3 getWorldPos() { Vec3 pos = this.getCenterPos(); if (!APAddons.vs2Loaded) { return pos; @@ -161,7 +161,7 @@ protected Vec3 getWorldPos() { return new Vec3(newPos.x, newPos.y, newPos.z); } - protected final BlockPos getWorldBlockPos() { + public final BlockPos getWorldBlockPos() { return new BlockPos(this.getWorldPos()); } From 00f327680e80a91455b6577d78489971e0ca4efc Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 31 Dec 2024 23:43:41 -0700 Subject: [PATCH 113/188] remove unused import --- .../de/srendi/advancedperipherals/common/util/LuaConverter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index 51ea7661a..f595127e7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -29,7 +29,6 @@ import org.joml.Vector3d; import org.joml.Vector3dc; import org.valkyrienskies.core.api.ships.ServerShip; -import org.valkyrienskies.core.api.ships.Ship; import org.valkyrienskies.core.api.ships.properties.ShipInertiaData; import org.valkyrienskies.core.api.ships.properties.ShipTransform; From aa1e2bfe238e7502f607fd8d9a5cd0b4998dadd2 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 31 Dec 2024 23:47:15 -0700 Subject: [PATCH 114/188] update github workflow --- .github/workflows/build-and-test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index f3c7b7f7e..f4379176b 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -3,7 +3,7 @@ name: Build and Test on: workflow_dispatch: push: - pull_request_target: + pull_request: types: - opened - synchronize From 263d02c3a80779075da173e0d3904e414cd1b784 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 31 Dec 2024 23:51:57 -0700 Subject: [PATCH 115/188] remove more unused imports --- .../peripheral/metaphysics/WeakAutomataCorePeripheral.java | 1 - .../common/addons/valkyrienskies/AutomataVSMountPlugin.java | 1 - .../common/addons/valkyrienskies/ShipScannerPlugin.java | 1 - .../common/util/fakeplayer/APFakePlayer.java | 4 ---- .../common/util/fakeplayer/FakePlayerProviderTurtle.java | 3 +-- 5 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java index dc0ac06d7..ea46ec4fa 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java @@ -2,7 +2,6 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; -import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.addons.computercraft.operations.AutomataCoreTier; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.*; import de.srendi.advancedperipherals.common.configuration.APConfig; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java index e6699476b..fa99b51ca 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java @@ -15,7 +15,6 @@ import net.minecraft.world.phys.Vec3; import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.ServerShip; -import org.valkyrienskies.core.api.ships.Ship; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java index 6450eec51..ee0786c76 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ShipScannerPlugin.java @@ -12,7 +12,6 @@ import net.minecraft.world.phys.Vec3; import org.valkyrienskies.core.api.ships.ServerShip; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java index 4068709db..3f3e66887 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java @@ -24,8 +24,6 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -34,7 +32,6 @@ import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.*; -import net.minecraft.world.phys.shapes.Shapes; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.util.FakePlayer; @@ -44,7 +41,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.ref.WeakReference; import java.util.List; import java.util.UUID; import java.util.function.Function; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java index 60946c0b2..26fd8d024 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java @@ -6,14 +6,13 @@ import de.srendi.advancedperipherals.common.addons.APAddons; import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.phys.Vec3;; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.InvWrapper; import org.joml.Matrix4dc; From 087f783678f7e93888d86b7b9559fd41389babbe Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 1 Jan 2025 11:16:20 -0700 Subject: [PATCH 116/188] add getCurrentShip method --- .../plugins/AutomataLookPlugin.java | 13 ++++++++- .../valkyrienskies/AutomataVSMountPlugin.java | 15 +++++++++- .../common/util/LuaConverter.java | 28 +++++++++++++++---- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java index 6bf4759ad..3aa10fd87 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java @@ -5,10 +5,12 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.core.apis.TableHelper; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; +import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; @@ -16,6 +18,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; +import org.valkyrienskies.core.api.ships.Ship; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -42,7 +45,8 @@ public final MethodResult lookAtBlock(@NotNull IArguments arguments) throws LuaE } BlockHitResult blockHit = (BlockHitResult) result; - BlockState state = owner.getLevel().getBlockState(blockHit.getBlockPos()); + BlockPos blockPos = blockHit.getBlockPos(); + BlockState state = owner.getLevel().getBlockState(blockPos); Map data = new HashMap<>(); ResourceLocation blockName = ForgeRegistries.BLOCKS.getKey(state.getBlock()); data.put("name", blockName == null ? null : blockName.toString()); @@ -52,6 +56,13 @@ public final MethodResult lookAtBlock(@NotNull IArguments arguments) throws LuaE data.put("x", pos.x - origin.x); data.put("y", pos.y - origin.y); data.put("z", pos.z - origin.z); + if (APAddons.vs2Loaded) { + Ship ship = APAddons.getVS2Ship(automataCore.getLevel(), blockPos); + if (ship != null) { + data.put("shipId", ship.getId()); + data.put("shipName", ship.getSlug()); + } + } return MethodResult.of(data); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java index fa99b51ca..758b46a85 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java @@ -8,6 +8,7 @@ import de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperationContext; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataCorePlugin; +import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -17,6 +18,7 @@ import org.valkyrienskies.core.api.ships.ServerShip; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.MOUNT_SHIP; @@ -33,6 +35,17 @@ public final boolean isOnShip() { return APAddons.isBlockOnShip(owner.getLevel(), owner.getPos()); } + @LuaFunction(mainThread = true) + public final MethodResult getCurrentShip() { + IPeripheralOwner owner = this.automataCore.getPeripheralOwner(); + ServerShip ship = (ServerShip) APAddons.getVS2Ship(owner.getLevel(), owner.getPos()); + if (ship == null) { + return MethodResult.of(); + } + Map data = LuaConverter.shipToObjectOnShip(ship, this.automataCore.getCenterPos()); + return MethodResult.of(data); + } + @LuaFunction(mainThread = true) public final MethodResult canMountToShip() { List ships = this.getMountableShips(); @@ -85,7 +98,7 @@ public final MethodResult mountToShip(IArguments args) throws LuaException { protected Vec3 getMountDetectPosition() { IPeripheralOwner owner = this.automataCore.getPeripheralOwner(); - return owner.getCenterPos().add(Vec3.atLowerCornerOf(owner.getFacing().getNormal())); + return owner.getCenterPos(); } protected List getMountableShips() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index f595127e7..2429d3b36 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -292,6 +292,10 @@ public static Object effectToObject(MobEffectInstance effect) { return map; } + public static Map shipToObject(ServerShip ship) { + return shipToObject(ship, null); + } + public static Map shipToObject(ServerShip ship, Vec3 pos) { Map map = new HashMap<>(); @@ -300,11 +304,13 @@ public static Map shipToObject(ServerShip ship, Vec3 pos) { ShipTransform tf = ship.getTransform(); - Vector3dc worldPos = tf.getShipPositionInWorldCoordinates(); Vector3dc shipPos = tf.getShipPositionInShipCoordinates(); - map.put("x", worldPos.x() - pos.x); - map.put("y", worldPos.y() - pos.y); - map.put("z", worldPos.z() - pos.z); + if (pos != null) { + Vector3dc worldPos = tf.getShipPositionInWorldCoordinates(); + map.put("x", worldPos.x() - pos.x); + map.put("y", worldPos.y() - pos.y); + map.put("z", worldPos.z() - pos.z); + } Quaterniondc rot = tf.getShipToWorldRotation(); final double rotX = rot.x(), rotY = rot.y(), rotZ = rot.z(), rotW = rot.w(); map.put("rotate", Map.of("x", rotX, "y", rotY, "z", rotZ, "w", rotW)); @@ -327,8 +333,20 @@ public static Map shipToObject(ServerShip ship, Vec3 pos) { ShipInertiaData data = ship.getInertiaData(); map.put("mass", data.getMass()); Vector3d com = tf.getShipToWorld().transformPosition(data.getCenterOfMassInShipSpace(), new Vector3d()); - map.put("centerOfMass", Map.of("x", com.x - pos.x, "y", com.y - pos.y, "z", com.z - pos.z)); + if (pos != null) { + map.put("centerOfMass", Map.of("x", com.x - pos.x, "y", com.y - pos.y, "z", com.z - pos.z)); + } + return map; + } + public static Map shipToObjectOnShip(ServerShip ship, Vec3 pos) { + Map map = shipToObject(ship); + Vector3dc shipPos = ship.getTransform().getShipPositionInShipCoordinates(); + map.put("x", shipPos.x() - pos.x); + map.put("y", shipPos.y() - pos.y); + map.put("z", shipPos.z() - pos.z); + Vector3dc com = ship.getInertiaData().getCenterOfMassInShipSpace(); + map.put("centerOfMass", Map.of("x", com.x() - pos.x, "y", com.y() - pos.y, "z", com.z() - pos.z)); return map; } } From 62f386202840646099c3e1f73b0a069a0d6da318 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 13 Jan 2025 15:34:19 -0700 Subject: [PATCH 117/188] aaa --- .github/workflows/build-and-test.yaml | 6 +++++- build.gradle | 2 +- gradle.properties | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index f4379176b..240ef7e87 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -10,4 +10,8 @@ on: jobs: build-and-test: - uses: IntelligenceModding/actions/.github/workflows/build-and-test.yaml@master \ No newline at end of file + uses: IntelligenceModding/actions/.github/workflows/build-and-test.yaml@master + with: + build: ${{ github.event_name != 'push' }} + build_name: AdvancedPeripherals + pr: ${{ github.event_name == 'pull_request' && github.event.pull_request.number || '' }} diff --git a/build.gradle b/build.gradle index 2039440a0..a323f6daf 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ wrapper { def isSnapshotVersion = project.hasProperty('teamcityBuild') -version = "${mod_version}" + (isSnapshotVersion ? "-SNAPSHOT" : "") +version = "${mod_version}" + (isSnapshotVersion ? "-SNAPSHOT" : "") + "${mod_artifact_suffix}" group = 'de.srendi.advancedperipherals' def static getenv(path = ".env") { diff --git a/gradle.properties b/gradle.properties index 8f7c36183..8984eae0b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,6 +4,7 @@ org.gradle.logging.level=info # Minecraft related mod_id=advancedperipherals +mod_artifact_suffix= minecraft_version=1.19.2 forge_version=43.4.0 loader_version=43 From 6ceba360e6f3db3eebafdb43516a92c7e4ade35d Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 14 Jan 2025 10:19:54 -0700 Subject: [PATCH 118/188] update pr-comment-artifacts --- .github/workflows/pr-comment-artifacts.yaml | 124 ++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 .github/workflows/pr-comment-artifacts.yaml diff --git a/.github/workflows/pr-comment-artifacts.yaml b/.github/workflows/pr-comment-artifacts.yaml new file mode 100644 index 000000000..3c468be48 --- /dev/null +++ b/.github/workflows/pr-comment-artifacts.yaml @@ -0,0 +1,124 @@ +# https://github.com/orgs/community/discussions/51403 + +name: Comment Artifacts + +on: + workflow_run: + types: + - "completed" + workflows: + - "Build and Test" + +permissions: + actions: read + attestations: read + contents: read + pull-requests: write + +jobs: + parse-metadata: + runs-on: ubuntu-latest + outputs: + PR_NUMBER: ${{ steps.metadata.outputs.PR_NUMBER }} + HEAD_SHA: ${{ steps.metadata.outputs.HEAD_SHA }} + ARTIFACT_ID: ${{ steps.metadata.outputs.ARTIFACT_ID }} + ARTIFACT_URL: ${{ steps.metadata.outputs.ARTIFACT_URL }} + ARTIFACT_EXP: ${{ steps.metadata.outputs.ARTIFACT_EXP }} + ARTIFACT_NAME: ${{ steps.metadata.outputs.ARTIFACT_NAME }} + steps: + - name: Get Artifact URL & PR Info + id: metadata + env: + GITHUB_TOKEN: ${{ github.token }} + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + WORKFLOW_RUN_EVENT_OBJ: ${{ toJSON(github.event.workflow_run) }} + PREVIOUS_JOB_ID: ${{ github.event.workflow_run.id }} + run: | + echo "Previous Job ID: $PREVIOUS_JOB_ID" + + LOG_URL="/repos/$OWNER/$REPO/actions/runs/$PREVIOUS_JOB_ID/logs" + echo "Getting previous logs: $LOG_URL" + gh api "$LOG_URL" >_logs.zip + echo "Unzipping logs" + unzip -p _logs.zip >_build.txt + + echo "Parsing logs" + function parse_var { + name=$1 + echo "Parsing output $name" + line=$(cat _build.txt | grep -m 1 "output:${name}=" | cat) + export parsed=${line#*"output:${name}="} + } + parse_var PR_NUMBER + PR_NUMBER=$parsed + echo "PR Number: $PR_NUMBER" + echo "PR_NUMBER=$PR_NUMBER" >> "$GITHUB_OUTPUT" + + parse_var HEAD_SHA + HEAD_SHA=$parsed + echo "Head sha: $HEAD_SHA" + echo "HEAD_SHA=$HEAD_SHA" >> "$GITHUB_OUTPUT" + + parse_var ARTIFACT_ID + ARTIFACT_ID=$parsed + echo "ARTIFACT ID: $ARTIFACT_ID" + echo "ARTIFACT_ID=$ARTIFACT_ID" >> "$GITHUB_OUTPUT" + + parse_var ARTIFACT_URL + ARTIFACT_URL=$parsed + echo "ARTIFACT URL: $ARTIFACT_URL" + echo "ARTIFACT_URL=$ARTIFACT_URL" >> "$GITHUB_OUTPUT" + + if [[ "$ARTIFACT_ID" != "" ]]; then + ARTIFACT_INFO="$(gh api "/repos/$OWNER/$REPO/actions/artifacts/$ARTIFACT_ID")" + ARTIFACT_EXP=$(echo "$ARTIFACT_INFO" | jq ".expires_at") + echo "ARTIFACT EXP: $ARTIFACT_EXP" + echo "ARTIFACT_EXP=$ARTIFACT_EXP" >> "$GITHUB_OUTPUT" + ARTIFACT_NAME=$(echo "$ARTIFACT_INFO" | jq ".name") + echo "ARTIFACT NAME: $ARTIFACT_NAME" + echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> "$GITHUB_OUTPUT" + fi + exit 0 + + comment-success: + if: ${{ needs.parse-metadata.outputs.PR_NUMBER != '' }} + runs-on: ubuntu-latest + needs: + - parse-metadata + steps: + - name: Find Comment + uses: peter-evans/find-comment@v3 + id: fc + with: + issue-number: ${{ needs.parse-metadata.outputs.PR_NUMBER }} + comment-author: 'github-actions[bot]' + body-includes: '## Build Preview' + + - name: Update Comment + env: + JOB_PATH: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}" + HEAD_SHA: ${{ needs.parse-metadata.outputs.HEAD_SHA }} + ARTIFACT_URL: ${{ needs.parse-metadata.outputs.ARTIFACT_URL }} + ARTIFACT_EXP: ${{ needs.parse-metadata.outputs.ARTIFACT_EXP }} + ARTIFACT_NAME: ${{ needs.parse-metadata.outputs.ARTIFACT_NAME }} + uses: peter-evans/create-or-update-comment@v4 + with: + issue-number: ${{ needs.parse-metadata.outputs.PR_NUMBER }} + comment-id: ${{ steps.fc.outputs.comment-id }} + edit-mode: replace + body: |- + ## Build Preview + + [![badge]]($JOB_PATH) + + You can find files attached to the below linked Workflow Run URL (Logs). + + | Name | Link | + |-----------|-------------------------| + | Commit | ${{ env.HEAD_SHA }} | + | Logs | ${{ env.JOB_PATH }} | + ${{ env.ARTIFACT_URL && format('| Jar Files | [{0}]({1}) |', env.ARTIFACT_NAME, env.ARTIFACT_URL) || '' }} + ${{ env.ARTIFACT_EXP && format('| Expires At | {0} |', env.ARTIFACT_EXP) || '' }} + + [badge]: https://img.shields.io/badge/${{ format('{0}-{1}', github.event.workflow_run.conclusion, github.event.workflow_run.conclusion == 'success' && '3fb950' || 'f85149') }}?style=for-the-badge&logo=github&label=build From 91f00921603169e040ccb7f3c107a0013f3025cc Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 14 Jan 2025 10:22:47 -0700 Subject: [PATCH 119/188] use raw output --- .github/workflows/pr-comment-artifacts.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-comment-artifacts.yaml b/.github/workflows/pr-comment-artifacts.yaml index 3c468be48..424d186b2 100644 --- a/.github/workflows/pr-comment-artifacts.yaml +++ b/.github/workflows/pr-comment-artifacts.yaml @@ -72,10 +72,10 @@ jobs: if [[ "$ARTIFACT_ID" != "" ]]; then ARTIFACT_INFO="$(gh api "/repos/$OWNER/$REPO/actions/artifacts/$ARTIFACT_ID")" - ARTIFACT_EXP=$(echo "$ARTIFACT_INFO" | jq ".expires_at") + ARTIFACT_EXP=$(echo "$ARTIFACT_INFO" | jq -r ".expires_at") echo "ARTIFACT EXP: $ARTIFACT_EXP" echo "ARTIFACT_EXP=$ARTIFACT_EXP" >> "$GITHUB_OUTPUT" - ARTIFACT_NAME=$(echo "$ARTIFACT_INFO" | jq ".name") + ARTIFACT_NAME=$(echo "$ARTIFACT_INFO" | jq -r ".name") echo "ARTIFACT NAME: $ARTIFACT_NAME" echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> "$GITHUB_OUTPUT" fi From 0d45cf3b488087575822871e31f357b1fbc8b889 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 14 Jan 2025 15:08:25 -0700 Subject: [PATCH 120/188] add publish --- .github/workflows/build-and-publish.yaml | 64 +++++++++++++++++++++ .github/workflows/build-and-test.yaml | 17 ------ .github/workflows/pr-comment-artifacts.yaml | 2 +- docs/RELEASE.md | 4 +- gradle.properties | 7 ++- 5 files changed, 73 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/build-and-publish.yaml delete mode 100644 .github/workflows/build-and-test.yaml diff --git a/.github/workflows/build-and-publish.yaml b/.github/workflows/build-and-publish.yaml new file mode 100644 index 000000000..f8b36ff7d --- /dev/null +++ b/.github/workflows/build-and-publish.yaml @@ -0,0 +1,64 @@ +name: Build and Test + +on: + workflow_dispatch: + push: + pull_request: + types: + - opened + - synchronize + +jobs: + generate-artifact-name: + runs-on: self-hosted + outputs: + name: ${{ steps.name.outputs.name }} + steps: + - name: Generate Name + id: name + run: | + if [[ "${{ github.event_name }}" == 'pull_request' ]]; then + suffix="PR ${{ github.event.number }}" + else + ref="${{ github.ref }}" + ref="${ref#refs/heads/}" + suffix="${ref//\//-}" + fi + name="AdvancedPeripherals $suffix" + echo "name: $name" + echo "name=$name" >> "$GITHUB_OUTPUT" + + build-and-test: + needs: + - generate-artifact-name + uses: IntelligenceModding/actions/.github/workflows/build-and-test.yaml@master + with: + build_name: ${{ needs.generate-artifact-name.outputs.name }} + pr: ${{ github.event_name == 'pull_request' && github.event.number || '' }} + check: ${{ github.event_name != 'push' }} + + publish: + if: ${{ github.event_name == 'push' && contains(github.ref, 'release/') }} + runs-on: self-hosted + needs: + - build-and-test + steps: + - name: Checkout sources + uses: actions/checkout@v4 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + - name: Download Builds + uses: actions/download-artifact@v4 + with: + name: ${{ needs.build-and-test.outputs.artifact-name }} + path: build/libs + - name: Patch Changelog + run: ./gradlew patchChangelog + - name: Github Release + run: ./gradlew githubRelease + - name: Publish Maven + run: ./gradlew publishAllPublicationsToPublicRepository + - name: Publish Modrinth + run: ./gradlew modrinth + - name: Publish CurseForge + run: ./gradlew publishCurseForge diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml deleted file mode 100644 index 240ef7e87..000000000 --- a/.github/workflows/build-and-test.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: Build and Test - -on: - workflow_dispatch: - push: - pull_request: - types: - - opened - - synchronize - -jobs: - build-and-test: - uses: IntelligenceModding/actions/.github/workflows/build-and-test.yaml@master - with: - build: ${{ github.event_name != 'push' }} - build_name: AdvancedPeripherals - pr: ${{ github.event_name == 'pull_request' && github.event.pull_request.number || '' }} diff --git a/.github/workflows/pr-comment-artifacts.yaml b/.github/workflows/pr-comment-artifacts.yaml index 424d186b2..8f5b3360a 100644 --- a/.github/workflows/pr-comment-artifacts.yaml +++ b/.github/workflows/pr-comment-artifacts.yaml @@ -110,7 +110,7 @@ jobs: body: |- ## Build Preview - [![badge]]($JOB_PATH) + [![badge]](${{ env.JOB_PATH }}) You can find files attached to the below linked Workflow Run URL (Logs). diff --git a/docs/RELEASE.md b/docs/RELEASE.md index a676e68d8..72db7935f 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -33,7 +33,9 @@ TOKEN= ### Release process - Execute `./gradlew patchChangelog` or manually update `CHANGELOG.md` and commit result to repository -- Run `git tag -` to create git tag and push it to repository via `git push --tags` +- ~~Run `git tag -` to create git tag and push it to repository via `git push --tags`~~ +- Upload project to github via `./gradlew githubRelease` - Upload project to curseforge via `./gradlew curseforge` - Upload project to modrinth via `./gradlew publishModrinth` +- Upload project to maven via `./gradlew publishAllPublicationsToPublicRepository` - Update `mod_version` to next patch or minor version, what you want diff --git a/gradle.properties b/gradle.properties index 8984eae0b..f4735631c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,11 +4,14 @@ org.gradle.logging.level=info # Minecraft related mod_id=advancedperipherals -mod_artifact_suffix= +# do not include mod_version/minecraft_version with equals sign anywhere else in the file (even in comments) +# also do not add space around the equal sign +# since we are using poor grep command to do automation :p +mod_version=0.8r minecraft_version=1.19.2 +mod_artifact_suffix= forge_version=43.4.0 loader_version=43 -mod_version=0.8r release_type=release mappings_channel=parchment mappings_version=2022.11.20-1.19.2 From 614c0887e37b5c4fd9fb15111630ed82907af95b Mon Sep 17 00:00:00 2001 From: Srendi Date: Wed, 15 Jan 2025 23:18:38 +0100 Subject: [PATCH 121/188] git ignore the runs folder from neogradle --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8fa3a9245..883beb3ce 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ build # other eclipse run +runs server # Files from Forge MDK From c28a618d0b9845b1174a9d23e07def74fd2f49ad Mon Sep 17 00:00:00 2001 From: zyxkad Date: Wed, 15 Jan 2025 12:48:30 -0700 Subject: [PATCH 122/188] add mobToLua --- .../advancedperipherals/common/util/LuaConverter.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index 2429d3b36..d1e40be74 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -76,11 +76,15 @@ public static Map livingEntityToLua(LivingEntity entity, boolean return data; } - public static Map animalToLua(Animal animal, ItemStack itemInHand, boolean detailed) { + public static Map mobToLua(Mob animal, boolean detailed) { Map data = livingEntityToLua(animal, detailed); - data.put("baby", animal.isBaby()); - data.put("inLove", animal.isInLove()); data.put("aggressive", animal.isAggressive()); + return data; + } + + public static Map animalToLua(Animal animal, ItemStack itemInHand, boolean detailed) { + Map data = mobToLua(animal, detailed); + data.put("inLove", animal.isInLove()); if (animal instanceof IForgeShearable shareable && !itemInHand.isEmpty()) { data.put("shareable", shareable.isShearable(itemInHand, animal.level, animal.blockPosition())); } @@ -121,6 +125,7 @@ public static Map completeEntityToLua(Entity entity, ItemStack i public static Map completeEntityToLua(Entity entity, ItemStack itemInHand, boolean detailed) { if (entity instanceof Player player) return playerToLua(player, detailed); if (entity instanceof Animal animal) return animalToLua(animal, itemInHand, detailed); + if (entity instanceof Mob mob) return mobToLua(mob, detailed); if (entity instanceof LivingEntity livingEntity) return livingEntityToLua(livingEntity, detailed); return entityToLua(entity, detailed); } From 181954246ac7c228e476081d51ad8191ca7362cd Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 16 Jan 2025 01:11:53 +0100 Subject: [PATCH 123/188] ME Bridge now acts like the item part from an interface. It has 9 slots without a menu and imports the items directly on inserts --- .../blocks/base/BaseBlockEntityBlock.java | 6 +-- .../common/blocks/base/IInventoryBlock.java | 16 +------- .../blocks/base/IInventoryMenuBlock.java | 20 +++++++++ .../blocks/base/PeripheralBlockEntity.java | 10 +++-- .../blockentities/EnergyDetectorEntity.java | 2 +- .../blockentities/FluidDetectorEntity.java | 2 +- .../blockentities/GasDetectorEntity.java | 2 +- .../blockentities/InventoryManagerEntity.java | 8 ++-- .../blocks/blockentities/MeBridgeEntity.java | 41 ++++++++++++++++++- 9 files changed, 77 insertions(+), 30 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryMenuBlock.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java index d0699eb82..0f4d836b7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java @@ -45,7 +45,9 @@ public BaseBlockEntityBlock(boolean belongToTickingEntity, Properties properties public InteractionResult use(@NotNull BlockState state, Level levelIn, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand handIn, @NotNull BlockHitResult hit) { if (levelIn.isClientSide) return InteractionResult.SUCCESS; BlockEntity tileEntity = levelIn.getBlockEntity(pos); - if (tileEntity != null && !(tileEntity instanceof IInventoryBlock)) return InteractionResult.PASS; + if (tileEntity != null && !(tileEntity instanceof IInventoryMenuBlock)) + return InteractionResult.PASS; + MenuProvider namedContainerProvider = this.getMenuProvider(state, levelIn, pos); if (namedContainerProvider != null) { if (!(player instanceof ServerPlayer serverPlayerEntity)) return InteractionResult.PASS; @@ -85,8 +87,6 @@ public BlockEntityTicker getTicker(Level level, @NotN }; } - - @Deprecated @Nullable @Override public MenuProvider getMenuProvider(@NotNull BlockState pState, Level pLevel, @NotNull BlockPos pPos) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryBlock.java index 5bfa6325c..5ca8c9ef6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryBlock.java @@ -1,22 +1,10 @@ package de.srendi.advancedperipherals.common.blocks.base; -import de.srendi.advancedperipherals.common.container.base.BaseContainer; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.level.Level; - /** - * Used to assign a container to a TileEntity + * Used to assign an inventory storage to a block entity * - * @param The container related to this inventory */ - -public interface IInventoryBlock { - - Component getDisplayName(); - - T createContainer(int id, Inventory playerInventory, BlockPos pos, Level world); +public interface IInventoryBlock { int getInvSize(); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryMenuBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryMenuBlock.java new file mode 100644 index 000000000..fbf724bfb --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryMenuBlock.java @@ -0,0 +1,20 @@ +package de.srendi.advancedperipherals.common.blocks.base; + +import de.srendi.advancedperipherals.common.container.base.BaseContainer; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.level.Level; + +/** + * Used to assign an inventory storage to a block entity with a proper container + + * @param + */ +public interface IInventoryMenuBlock extends IInventoryBlock { + + Component getDisplayName(); + + T createContainer(int id, Inventory playerInventory, BlockPos pos, Level world); + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java index e98b317d8..d6f256b4e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java @@ -49,7 +49,7 @@ public abstract class PeripheralBlockEntity> extends protected PeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) { super(tileEntityTypeIn, pos, state); - if (this instanceof IInventoryBlock inventoryBlock) { + if (this instanceof IInventoryBlock inventoryBlock) { items = NonNullList.withSize(inventoryBlock.getInvSize(), ItemStack.EMPTY); } else { items = NonNullList.withSize(0, ItemStack.EMPTY); @@ -140,9 +140,10 @@ public void load(@NotNull CompoundTag compound) { super.load(compound); } + @NotNull @Override protected Component getDefaultName() { - return this instanceof IInventoryBlock inventoryBlock ? inventoryBlock.getDisplayName() : null; + return this instanceof IInventoryMenuBlock inventoryBlock ? inventoryBlock.getDisplayName() : null; } @Nullable @@ -151,13 +152,14 @@ public AbstractContainerMenu createMenu(int id, @NotNull Inventory inventory, @N return createMenu(id, inventory); } + @NotNull @Override protected AbstractContainerMenu createMenu(int id, @NotNull Inventory player) { - return this instanceof IInventoryBlock inventoryBlock ? inventoryBlock.createContainer(id, player, worldPosition, level) : null; + return this instanceof IInventoryMenuBlock inventoryBlock ? inventoryBlock.createContainer(id, player, worldPosition, level) : null; } @Override - public int[] getSlotsForFace(@NotNull Direction side) { + public int @NotNull [] getSlotsForFace(@NotNull Direction side) { return new int[]{0}; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java index a15e914d2..1a9aaad04 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java @@ -79,7 +79,7 @@ public void handleTick(Level level, BlockState state, Bl } @Override - public void load(CompoundTag nbt) { + public void load(@NotNull CompoundTag nbt) { storageProxy.setMaxTransferRate(nbt.getInt("rateLimit")); super.load(nbt); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java index 3a808db82..81d713ec2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java @@ -81,7 +81,7 @@ public void handleTick(Level level, BlockState state, Bl } @Override - public void load(CompoundTag nbt) { + public void load(@NotNull CompoundTag nbt) { storageProxy.setMaxTransferRate(nbt.getInt("rateLimit")); super.load(nbt); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java index 23f7dda1c..e87529830 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java @@ -81,7 +81,7 @@ public void handleTick(Level level, BlockState state, Bl } @Override - public void load(CompoundTag nbt) { + public void load(@NotNull CompoundTag nbt) { storageProxy.setMaxTransferRate(nbt.getInt("rateLimit")); super.load(nbt); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java index f45f045df..7bd405898 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.InventoryManagerPeripheral; -import de.srendi.advancedperipherals.common.blocks.base.IInventoryBlock; +import de.srendi.advancedperipherals.common.blocks.base.IInventoryMenuBlock; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.container.InventoryManagerContainer; import de.srendi.advancedperipherals.common.items.MemoryCardItem; @@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable; import java.util.UUID; -public class InventoryManagerEntity extends PeripheralBlockEntity implements IInventoryBlock { +public class InventoryManagerEntity extends PeripheralBlockEntity implements IInventoryMenuBlock { private UUID owner = null; @@ -75,7 +75,7 @@ public Component getDisplayName() { } @Override - public void load(CompoundTag data) { + public void load(@NotNull CompoundTag data) { if (data.contains("ownerId")) { this.owner = data.getUUID("ownerId"); } @@ -85,7 +85,7 @@ public void load(CompoundTag data) { } @Override - public void saveAdditional(CompoundTag data) { + public void saveAdditional(@NotNull CompoundTag data) { super.saveAdditional(data); if (this.owner != null) { data.putUUID("ownerId", this.owner); diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java index c85092a9a..0001aa14b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java @@ -1,13 +1,22 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; -import appeng.api.networking.*; +import appeng.api.networking.GridFlags; +import appeng.api.networking.GridHelper; +import appeng.api.networking.IGridNode; +import appeng.api.networking.IInWorldGridNodeHost; +import appeng.api.networking.IManagedGridNode; import appeng.api.networking.crafting.ICraftingSimulationRequester; +import appeng.api.networking.energy.IEnergyService; import appeng.api.networking.security.IActionHost; import appeng.api.networking.security.IActionSource; +import appeng.api.stacks.AEItemKey; +import appeng.api.storage.StorageHelper; import appeng.api.util.AECableType; +import de.srendi.advancedperipherals.common.addons.appliedenergistics.AppEngApi; import de.srendi.advancedperipherals.common.addons.appliedenergistics.CraftJob; import de.srendi.advancedperipherals.common.addons.appliedenergistics.MeBridgeEntityListener; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MeBridgePeripheral; +import de.srendi.advancedperipherals.common.blocks.base.IInventoryBlock; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; @@ -27,7 +36,7 @@ import java.util.Optional; import java.util.concurrent.CopyOnWriteArrayList; -public class MeBridgeEntity extends PeripheralBlockEntity implements IActionSource, IActionHost, IInWorldGridNodeHost, ICraftingSimulationRequester { +public class MeBridgeEntity extends PeripheralBlockEntity implements IActionSource, IActionHost, IInWorldGridNodeHost, ICraftingSimulationRequester, IInventoryBlock { private final List jobs = new CopyOnWriteArrayList<>(); private boolean initialized = false; @@ -129,4 +138,32 @@ public IActionSource getActionSource() { public void addJob(CraftJob job) { jobs.add(job); } + + @Override + public int getInvSize() { + return 9; + } + + @Override + public void setItem(int index, @NotNull ItemStack stack) { + super.setItem(index, stack); + if (!initialized) + return; + + if (stack.isEmpty()) + return; + + IEnergyService energySrc = mainNode.getGrid().getEnergyService(); + int inserted = (int) StorageHelper.poweredInsert(energySrc, AppEngApi.getMonitor(getActionableNode()), AEItemKey.of(stack), stack.getCount(), this); + + if (inserted > 0) { + getItem(index).setCount(getItem(index).getCount() - inserted); + } + } + + @Override + public boolean canTakeItemThroughFace(int index, @NotNull ItemStack stack, @NotNull Direction direction) { + return false; + } + } From 327930d3dc4a758bdc33befeb8a2adc966d4e3d1 Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 16 Jan 2025 02:15:21 +0100 Subject: [PATCH 124/188] Support nbt hashes for filters and in item/fluid properties. --- CHANGELOG.md | 5 +++++ .../addons/appliedenergistics/AppEngApi.java | 4 ++++ .../addons/refinedstorage/RefinedStorage.java | 7 +++++-- .../common/util/LuaConverter.java | 2 ++ .../common/util/inventory/FluidFilter.java | 13 ++++++++++++- .../common/util/inventory/ItemFilter.java | 19 +++++++++++++++++-- 6 files changed, 45 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dde6f4283..425e8ab82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] + +For now, just a prototype changelog so I don't need to remember/search everything I did +### Added +- NBT Hashes for filters and item/fluid properties. Lightweight version of the fingerprints, cc also uses nbt hashes for everything nbt related + ## [1.19.2-0.7.37r] - 2024-10-06 ### Added diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java index 446418865..3a84e0466 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java @@ -341,6 +341,7 @@ private static Map parseItemStack(Pair stack, @ map.put("amount", amount); map.put("displayName", displayName); map.put("nbt", NBTUtil.toLua(nbt)); + map.put("nbtHash", NBTUtil.getNBTHash(nbt)); map.put("tags", LuaConverter.tagsToList(() -> stack.getRight().getItem().builtInRegistryHolder().tags())); map.put("isCraftable", craftingService != null && craftingService.isCraftable(stack.getRight())); @@ -349,9 +350,12 @@ private static Map parseItemStack(Pair stack, @ private static Map parseFluidStack(Pair stack, @Nullable ICraftingService craftingService) { Map map = new HashMap<>(); + CompoundTag nbt = stack.getRight().toTag(); long amount = stack.getLeft(); map.put("name", ForgeRegistries.FLUIDS.getKey(stack.getRight().getFluid()).toString()); map.put("amount", amount); + map.put("nbt", NBTUtil.toLua(nbt)); + map.put("nbtHash", NBTUtil.getNBTHash(nbt)); map.put("displayName", stack.getRight().getDisplayName().getString()); map.put("tags", LuaConverter.tagsToList(() -> stack.getRight().getFluid().builtInRegistryHolder().tags())); map.put("isCraftable", craftingService != null && craftingService.isCraftable(stack.getRight())); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java index 4d88dddbb..f28a22f08 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java @@ -482,7 +482,8 @@ public static Map parseItemStack(@Nullable ItemStack itemStack, map.put("amount", itemStack.getCount()); map.put("displayName", itemStack.getDisplayName().getString()); map.put("isCraftable", isItemCraftable(network, itemStack)); - map.put("nbt", nbt == null ? null : NBTUtil.toLua(nbt)); + map.put("nbtHash", NBTUtil.getNBTHash(nbt)); + map.put("nbt", NBTUtil.toLua(nbt)); return map; } @@ -492,10 +493,12 @@ public static Map parseFluidStack(@Nullable FluidStack fluidStac return Collections.emptyMap(); Map map = LuaConverter.fluidToObject(fluidStack.getFluid()); + CompoundTag nbt = fluidStack.getTag(); map.put("amount", fluidStack.getAmount()); map.put("displayName", fluidStack.getDisplayName().getString()); map.put("isCraftable", isFluidCraftable(network, fluidStack)); - + map.put("nbtHash", NBTUtil.getNBTHash(nbt)); + map.put("nbt", NBTUtil.toLua(nbt)); return map; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index 2429d3b36..9bd0a39bf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -196,6 +196,7 @@ public static Map itemStackToObject(@NotNull ItemStack stack) { map.put("displayName", stack.getDisplayName().getString()); map.put("maxStackSize", stack.getMaxStackSize()); map.put("nbt", NBTUtil.toLua(nbt)); + map.put("nbtHash", NBTUtil.getNBTHash(nbt)); map.put("fingerprint", ItemUtil.getFingerprint(stack)); return map; } @@ -210,6 +211,7 @@ public static Map fluidStackToObject(@NotNull FluidStack stack) map.put("count", stack.getAmount()); map.put("displayName", stack.getDisplayName().getString()); map.put("nbt", NBTUtil.toLua(nbt)); + map.put("nbtHash", NBTUtil.getNBTHash(nbt)); map.put("fingerprint", FluidUtil.getFingerprint(stack)); return map; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java index 95d3884f5..ede9e9efb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidFilter.java @@ -25,6 +25,7 @@ public class FluidFilter extends GenericFilter { private Fluid fluid = Fluids.EMPTY; private TagKey tag = null; private CompoundTag nbt = null; + private String nbtHash = null; private int count = 1000; private String fingerprint = ""; @@ -48,6 +49,13 @@ public static Pair parse(Map item) { return Pair.of(null, "NO_VALID_FLUID"); } } + if (item.containsKey("nbtHash")) { + try { + fluidFilter.nbtHash = TableHelper.getStringField(item, "nbtHash"); + } catch (LuaException luaException) { + return Pair.of(null, "NO_VALID_NBT_HASH"); + } + } if (item.containsKey("nbt")) { try { fluidFilter.nbt = NBTUtil.fromText(TableHelper.getStringField(item, "nbt")); @@ -86,7 +94,7 @@ public static FluidFilter empty() { } public boolean isEmpty() { - return fingerprint.isEmpty() && fluid == Fluids.EMPTY && tag == null && nbt == null; + return fingerprint.isEmpty() && fluid == Fluids.EMPTY && tag == null && nbt == null && nbtHash == null; } public FluidStack toFluidStack() { @@ -123,6 +131,9 @@ public boolean test(FluidStack stack) { if (nbt != null && !stack.getOrCreateTag().equals(nbt)) { return false; } + if (nbtHash != null && !dan200.computercraft.shared.util.NBTUtil.getNBTHash(stack.getOrCreateTag()).equals(nbtHash)) { + return false; + } return true; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java index 5b7cf0e29..41caa4db4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemFilter.java @@ -25,6 +25,7 @@ public class ItemFilter extends GenericFilter { private Item item = Items.AIR; private TagKey tag = null; private CompoundTag nbt = null; + private String nbtHash = null; private int count = 64; private String fingerprint = ""; public int fromSlot = -1; @@ -50,6 +51,13 @@ public static Pair parse(Map item) { return Pair.of(null, "NO_VALID_ITEM"); } } + if (item.containsKey("nbtHash")) { + try { + itemFilter.nbtHash = TableHelper.getStringField(item, "nbtHash"); + } catch (LuaException luaException) { + return Pair.of(null, "NO_VALID_NBT_HASH"); + } + } if (item.containsKey("nbt")) { try { itemFilter.nbt = NBTUtil.fromText(TableHelper.getStringField(item, "nbt")); @@ -106,7 +114,7 @@ public static ItemFilter empty() { } public boolean isEmpty() { - return fingerprint.isEmpty() && item == Items.AIR && tag == null && nbt == null; + return fingerprint.isEmpty() && item == Items.AIR && tag == null && nbt == null && nbtHash == null; } public ItemStack toItemStack() { @@ -128,7 +136,6 @@ public boolean test(ItemStack stack) { String testFingerprint = ItemUtil.getFingerprint(stack); return fingerprint.equals(testFingerprint); } - if (item != Items.AIR && !stack.is(item)) { return false; } @@ -138,6 +145,9 @@ public boolean test(ItemStack stack) { if (nbt != null && !stack.getOrCreateTag().equals(nbt)) { return false; } + if (nbtHash != null && !dan200.computercraft.shared.util.NBTUtil.getNBTHash(stack.getOrCreateTag()).equals(nbtHash)) { + return false; + } return true; } @@ -161,12 +171,17 @@ public Tag getNbt() { return nbt; } + public String getNbtHash() { + return nbtHash; + } + @Override public String toString() { return "ItemFilter{" + "item=" + ItemUtil.getRegistryKey(item) + ", tag=" + tag + ", nbt=" + nbt + + ", nbtHash=" + nbtHash + ", count=" + count + ", fingerprint='" + fingerprint + '\'' + ", fromSlot=" + fromSlot + From 447ff0d86ed5c833c3961e2c469c2e7b23ac21c9 Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 16 Jan 2025 02:20:42 +0100 Subject: [PATCH 125/188] Don't always create new ways to create lua objects for item stacks/fluid stacks and change the rs and me bridge `amount` key to `count` --- .../addons/appliedenergistics/AppEngApi.java | 27 ++++--------------- .../addons/refinedstorage/RefinedStorage.java | 19 +++---------- 2 files changed, 9 insertions(+), 37 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java index 3a84e0466..33ce9c20c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java @@ -20,6 +20,7 @@ import appeng.me.cells.BasicCellHandler; import appeng.me.cells.BasicCellInventory; import appeng.parts.storagebus.StorageBusPart; +import cc.tweaked.internal.cobalt.compiler.LuaC; import com.the9grounds.aeadditions.item.storage.StorageCell; import com.the9grounds.aeadditions.item.storage.SuperStorageCell; import dan200.computercraft.shared.util.NBTUtil; @@ -332,34 +333,16 @@ public static Map parseCell(IBasicCellItem cell, ItemStack cellI } private static Map parseItemStack(Pair stack, @Nullable ICraftingService craftingService) { - Map map = new HashMap<>(); - String displayName = stack.getRight().getDisplayName().getString(); - CompoundTag nbt = stack.getRight().toTag(); - long amount = stack.getLeft(); - map.put("fingerprint", ItemUtil.getFingerprint(stack.getRight().toStack())); - map.put("name", ItemUtil.getRegistryKey(stack.getRight().getItem()).toString()); - map.put("amount", amount); - map.put("displayName", displayName); - map.put("nbt", NBTUtil.toLua(nbt)); - map.put("nbtHash", NBTUtil.getNBTHash(nbt)); - map.put("tags", LuaConverter.tagsToList(() -> stack.getRight().getItem().builtInRegistryHolder().tags())); + Map map = LuaConverter.itemStackToObject(stack.getRight().toStack()); map.put("isCraftable", craftingService != null && craftingService.isCraftable(stack.getRight())); - + map.put("count", stack.getLeft()); return map; } private static Map parseFluidStack(Pair stack, @Nullable ICraftingService craftingService) { - Map map = new HashMap<>(); - CompoundTag nbt = stack.getRight().toTag(); - long amount = stack.getLeft(); - map.put("name", ForgeRegistries.FLUIDS.getKey(stack.getRight().getFluid()).toString()); - map.put("amount", amount); - map.put("nbt", NBTUtil.toLua(nbt)); - map.put("nbtHash", NBTUtil.getNBTHash(nbt)); - map.put("displayName", stack.getRight().getDisplayName().getString()); - map.put("tags", LuaConverter.tagsToList(() -> stack.getRight().getFluid().builtInRegistryHolder().tags())); + Map map = LuaConverter.fluidStackToObject(stack.getRight().toStack(1)); + map.put("count", stack.getLeft()); map.put("isCraftable", craftingService != null && craftingService.isCraftable(stack.getRight())); - return map; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java index f28a22f08..06df342ef 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java @@ -473,32 +473,21 @@ public static Object parsePattern(ICraftingPattern pattern, INetwork network) { } public static Map parseItemStack(@Nullable ItemStack itemStack, INetwork network) { - if (itemStack == null) + if (itemStack == null || itemStack.isEmpty()) return Collections.emptyMap(); - Map map = LuaConverter.itemToObject(itemStack.getItem()); - CompoundTag nbt = itemStack.getTag(); - map.put("fingerprint", ItemUtil.getFingerprint(itemStack)); - map.put("amount", itemStack.getCount()); - map.put("displayName", itemStack.getDisplayName().getString()); + Map map = LuaConverter.itemStackToObject(itemStack); map.put("isCraftable", isItemCraftable(network, itemStack)); - map.put("nbtHash", NBTUtil.getNBTHash(nbt)); - map.put("nbt", NBTUtil.toLua(nbt)); return map; } public static Map parseFluidStack(@Nullable FluidStack fluidStack, INetwork network) { - if (fluidStack == null) + if (fluidStack == null || fluidStack.isEmpty()) return Collections.emptyMap(); - Map map = LuaConverter.fluidToObject(fluidStack.getFluid()); - CompoundTag nbt = fluidStack.getTag(); - map.put("amount", fluidStack.getAmount()); - map.put("displayName", fluidStack.getDisplayName().getString()); + Map map = LuaConverter.fluidStackToObject(fluidStack); map.put("isCraftable", isFluidCraftable(network, fluidStack)); - map.put("nbtHash", NBTUtil.getNBTHash(nbt)); - map.put("nbt", NBTUtil.toLua(nbt)); return map; } From 0878c99744de192d7cbb01494c694e8d28e9ebf1 Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 16 Jan 2025 02:22:30 +0100 Subject: [PATCH 126/188] checkstyle --- .../addons/appliedenergistics/AppEngApi.java | 21 ++++++++++++------- .../addons/appliedenergistics/CraftJob.java | 6 +++++- .../peripheral/ChatBoxPeripheral.java | 5 ++--- .../peripheral/ColonyPeripheral.java | 7 ++++++- .../EnvironmentDetectorPeripheral.java | 8 ++++++- .../InventoryManagerPeripheral.java | 2 +- .../peripheral/MeBridgePeripheral.java | 13 ++++++++++-- .../peripheral/PlayerDetectorPeripheral.java | 5 ++++- .../peripheral/RsBridgePeripheral.java | 8 ++++++- .../peripheral/SaddlePeripheral.java | 2 +- .../WeakAutomataCorePeripheral.java | 6 +++++- .../plugins/AutomataBlockHandPlugin.java | 8 +++---- .../plugins/AutomataChargingPlugin.java | 2 +- .../plugins/AutomataEntityHandPlugin.java | 2 +- .../plugins/AutomataEntityTransferPlugin.java | 2 +- .../plugins/AutomataItemSuckPlugin.java | 2 +- .../plugins/AutomataLookPlugin.java | 2 +- .../plugins/AutomataWarpingPlugin.java | 6 ++---- .../addons/create/BasinIntegration.java | 6 +++++- .../addons/minecolonies/MineColonies.java | 6 +++++- .../addons/powah/FurnatorIntegration.java | 2 +- .../common/addons/powah/Integration.java | 2 +- .../addons/powah/ReactorIntegration.java | 2 +- .../addons/refinedstorage/RefinedStorage.java | 11 +++++++--- .../common/blocks/base/BaseBlock.java | 6 +++++- .../blocks/base/BaseBlockEntityBlock.java | 6 +++++- .../blocks/base/IInventoryMenuBlock.java | 5 ++--- .../blockentities/DistanceDetectorEntity.java | 7 ++++--- .../blockentities/InventoryManagerEntity.java | 2 +- .../RedstoneIntegratorEntity.java | 2 +- .../common/commands/APCommands.java | 3 --- .../configuration/PeripheralsConfig.java | 2 +- .../common/data/PoiTypeProvider.java | 1 - .../common/data/RecipesProvider.java | 6 +++++- .../common/entity/TurtleEnderPearl.java | 12 +++++------ .../common/entity/TurtleSeatEntity.java | 11 +++++----- .../common/items/SmartGlassesItem.java | 6 +++++- .../common/setup/APBlockEntityTypes.java | 16 +++++++++++++- .../common/setup/APEntities.java | 2 +- .../common/setup/APItems.java | 6 +++++- .../smartglasses/SmartGlassesComputer.java | 6 +++++- .../common/util/ChunkManager.java | 6 +++++- .../common/util/HitResultUtil.java | 6 +++++- .../common/util/LuaConverter.java | 7 +++---- .../common/util/NBTUtil.java | 12 ++++++++--- .../common/util/SwarmEventDispatcher.java | 6 +++--- .../common/util/fakeplayer/APFakePlayer.java | 8 +++++-- .../common/village/VillageStructures.java | 6 +++++- .../peripherals/AutomataCorePeripheral.java | 1 + .../lib/peripherals/BasePeripheral.java | 5 ++--- .../lib/peripherals/BasePeripheralPlugin.java | 1 - 51 files changed, 199 insertions(+), 94 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java index 33ce9c20c..d9e22e903 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java @@ -8,7 +8,12 @@ import appeng.api.networking.crafting.ICraftingCPU; import appeng.api.networking.crafting.ICraftingService; import appeng.api.networking.storage.IStorageService; -import appeng.api.stacks.*; +import appeng.api.stacks.AEFluidKey; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.AEKeyType; +import appeng.api.stacks.GenericStack; +import appeng.api.stacks.KeyCounter; import appeng.api.storage.AEKeyFilter; import appeng.api.storage.IStorageProvider; import appeng.api.storage.MEStorage; @@ -20,10 +25,8 @@ import appeng.me.cells.BasicCellHandler; import appeng.me.cells.BasicCellInventory; import appeng.parts.storagebus.StorageBusPart; -import cc.tweaked.internal.cobalt.compiler.LuaC; import com.the9grounds.aeadditions.item.storage.StorageCell; import com.the9grounds.aeadditions.item.storage.SuperStorageCell; -import dan200.computercraft.shared.util.NBTUtil; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.util.LuaConverter; @@ -31,7 +34,6 @@ import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; import de.srendi.advancedperipherals.common.util.inventory.GenericFilter; import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; -import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import io.github.projectet.ae2things.item.DISKDrive; import it.unimi.dsi.fastutil.objects.Object2LongMap; import me.ramidzkh.mekae2.ae2.MekanismKey; @@ -40,7 +42,6 @@ import mekanism.api.chemical.merged.MergedChemicalTank; import mekanism.common.tile.TileEntityChemicalTank; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -49,10 +50,16 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; public class AppEngApi { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java index 05db7c7c6..c7a0b6c95 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java @@ -2,7 +2,11 @@ import appeng.api.networking.IGrid; import appeng.api.networking.IGridNode; -import appeng.api.networking.crafting.*; +import appeng.api.networking.crafting.CalculationStrategy; +import appeng.api.networking.crafting.ICraftingCPU; +import appeng.api.networking.crafting.ICraftingPlan; +import appeng.api.networking.crafting.ICraftingService; +import appeng.api.networking.crafting.ICraftingSimulationRequester; import appeng.api.networking.security.IActionSource; import appeng.api.stacks.AEKey; import dan200.computercraft.api.lua.ILuaCallback; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java index d533a3a7b..9717a36e1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java @@ -24,9 +24,9 @@ import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralFunction; import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentContents; -import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; @@ -35,7 +35,6 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraftforge.server.ServerLifecycleHooks; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,8 +43,8 @@ import java.util.UUID; import java.util.function.Predicate; -import static de.srendi.advancedperipherals.common.commands.APCommands.ROOT_SAFE_EXEC_LITERAL; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SimpleFreeOperation.CHAT_MESSAGE; +import static de.srendi.advancedperipherals.common.commands.APCommands.ROOT_SAFE_EXEC_LITERAL; public class ChatBoxPeripheral extends BasePeripheral { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java index ae97a5c6b..12aefd596 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java @@ -32,7 +32,12 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.fml.ModList; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; public class ColonyPeripheral extends BasePeripheral { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index e0e8f9c94..580d1a7f4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -36,7 +36,13 @@ import net.minecraftforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.function.Function; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperation.SCAN_ENTITIES; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java index 6f93e56cf..21fe14a0d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java @@ -23,8 +23,8 @@ import net.minecraftforge.items.wrapper.PlayerArmorInvWrapper; import net.minecraftforge.items.wrapper.PlayerInvWrapper; import net.minecraftforge.items.wrapper.PlayerOffhandInvWrapper; - import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.List; import java.util.Map; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java index 86776f7b0..da6f24fd0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java @@ -25,7 +25,12 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.ServerWorker; -import de.srendi.advancedperipherals.common.util.inventory.*; +import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; +import de.srendi.advancedperipherals.common.util.inventory.FluidUtil; +import de.srendi.advancedperipherals.common.util.inventory.GenericFilter; +import de.srendi.advancedperipherals.common.util.inventory.IStorageSystemPeripheral; +import de.srendi.advancedperipherals.common.util.inventory.InventoryUtil; +import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.Direction; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -33,7 +38,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; public class MeBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java index 75bf454d4..c06aa150d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java @@ -23,7 +23,10 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.server.ServerLifecycleHooks; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class PlayerDetectorPeripheral extends BasePeripheral { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java index 727abd601..fab7268d7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java @@ -22,7 +22,13 @@ import de.srendi.advancedperipherals.common.blocks.blockentities.RsBridgeEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.Pair; -import de.srendi.advancedperipherals.common.util.inventory.*; +import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; +import de.srendi.advancedperipherals.common.util.inventory.FluidUtil; +import de.srendi.advancedperipherals.common.util.inventory.GenericFilter; +import de.srendi.advancedperipherals.common.util.inventory.IStorageSystemPeripheral; +import de.srendi.advancedperipherals.common.util.inventory.InventoryUtil; +import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; +import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 251ce6574..68c965e63 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -25,9 +25,9 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; + import java.util.Map; import java.util.function.Predicate; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java index ea46ec4fa..1d69afece 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java @@ -3,7 +3,11 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; import de.srendi.advancedperipherals.common.addons.computercraft.operations.AutomataCoreTier; -import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.*; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataBlockHandPlugin; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataChargingPlugin; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataItemSuckPlugin; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataLookPlugin; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.plugins.AutomataSoulFeedingPlugin; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.lib.metaphysics.IAutomataCoreTier; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java index 3d580977c..eea3037fb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java @@ -27,24 +27,22 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.SignItem; import net.minecraft.world.item.context.DirectionalPlaceContext; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.SignBlockEntity; -import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.event.entity.player.PlayerInteractEvent; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; + import java.util.Collections; import java.util.Map; import java.util.stream.Stream; -import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.DIG; -import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.USE_ON_BLOCK; -import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.ACCURE_PLACE; +import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.*; public class AutomataBlockHandPlugin extends AutomataCorePlugin { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataChargingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataChargingPlugin.java index d47108ac4..2ffdb4d43 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataChargingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataChargingPlugin.java @@ -11,8 +11,8 @@ import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.capabilities.ForgeCapabilities; - import org.jetbrains.annotations.NotNull; + import java.util.Objects; public class AutomataChargingPlugin extends AutomataCorePlugin { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java index 318d49a4b..821b9b876 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java @@ -18,9 +18,9 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; + import java.util.Collections; import java.util.List; import java.util.Map; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java index c8a231d7c..9f0d30166 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityTransferPlugin.java @@ -18,9 +18,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; + import java.util.Collections; import java.util.Map; import java.util.function.Predicate; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java index 7c2ea5a92..796e8f386 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataItemSuckPlugin.java @@ -15,8 +15,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; import net.minecraftforge.registries.ForgeRegistries; - import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java index 3aa10fd87..084f20289 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java @@ -18,9 +18,9 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; import org.valkyrienskies.core.api.ships.Ship; -import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java index 9c7ad8369..b07c0e3ee 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java @@ -11,11 +11,11 @@ import de.srendi.advancedperipherals.common.addons.computercraft.owner.PeripheralOwnerAbility; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.configuration.APConfig; +import de.srendi.advancedperipherals.common.entity.TurtleEnderPearl; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.common.util.NBTUtil; import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.ServerWorker; -import de.srendi.advancedperipherals.common.entity.TurtleEnderPearl; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; @@ -29,9 +29,7 @@ import java.util.Map; import java.util.Objects; -import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.WARP; -import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.PREPARE_PORTAL; -import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.ACTIVE_PORTAL; +import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.*; public class AutomataWarpingPlugin extends AutomataCorePlugin { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java index 04c9711b2..ab7ffce5c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/create/BasinIntegration.java @@ -12,7 +12,11 @@ import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; public class BasinIntegration extends BlockEntityIntegrationPeripheral { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java b/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java index 52f1fe572..7f5cae76c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/minecolonies/MineColonies.java @@ -9,7 +9,11 @@ import com.minecolonies.api.colony.permissions.Action; import com.minecolonies.api.colony.workorders.IWorkOrder; import com.minecolonies.api.entity.citizen.Skill; -import com.minecolonies.api.research.*; +import com.minecolonies.api.research.IGlobalResearch; +import com.minecolonies.api.research.IGlobalResearchTree; +import com.minecolonies.api.research.ILocalResearch; +import com.minecolonies.api.research.ILocalResearchTree; +import com.minecolonies.api.research.IResearchRequirement; import com.minecolonies.api.research.costs.IResearchCost; import com.minecolonies.api.research.effects.IResearchEffect; import com.minecolonies.api.research.util.ResearchState; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/FurnatorIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/FurnatorIntegration.java index fab5f2408..4f9f31400 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/FurnatorIntegration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/FurnatorIntegration.java @@ -1,8 +1,8 @@ package de.srendi.advancedperipherals.common.addons.powah; import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral; import de.srendi.advancedperipherals.common.util.LuaConverter; +import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/Integration.java index dcd8e301b..6de92c792 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/Integration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/Integration.java @@ -1,8 +1,8 @@ package de.srendi.advancedperipherals.common.addons.powah; import de.srendi.advancedperipherals.common.addons.computercraft.integrations.IntegrationPeripheralProvider; -import owmii.powah.block.energycell.EnergyCellTile; import owmii.powah.block.ender.EnderCellTile; +import owmii.powah.block.energycell.EnergyCellTile; import owmii.powah.block.furnator.FurnatorTile; import owmii.powah.block.magmator.MagmatorTile; import owmii.powah.block.reactor.ReactorPartTile; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java index 1b3accf7f..3dcb1979c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/powah/ReactorIntegration.java @@ -1,8 +1,8 @@ package de.srendi.advancedperipherals.common.addons.powah; import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral; import de.srendi.advancedperipherals.common.util.LuaConverter; +import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java index 06df342ef..5b71848f2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java @@ -15,14 +15,12 @@ import com.refinedmods.refinedstorage.apiimpl.API; import com.refinedmods.refinedstorage.apiimpl.network.node.NetworkNode; import com.refinedmods.refinedstorage.apiimpl.network.node.diskdrive.DiskDriveNetworkNode; -import dan200.computercraft.shared.util.NBTUtil; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; import de.srendi.advancedperipherals.common.util.inventory.GenericFilter; import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; -import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; @@ -30,7 +28,14 @@ import net.minecraftforge.fluids.FluidStack; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; public class RefinedStorage { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlock.java index 3472e78ee..9e714707b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlock.java @@ -4,7 +4,11 @@ import net.minecraft.core.FrontAndTop; import net.minecraft.tags.TagKey; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java index 0f4d836b7..7a9fb99f7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseBlockEntityBlock.java @@ -4,7 +4,11 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.BlockTags; -import net.minecraft.world.*; +import net.minecraft.world.Container; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryMenuBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryMenuBlock.java index fbf724bfb..1d028a8a4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryMenuBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/IInventoryMenuBlock.java @@ -8,10 +8,9 @@ /** * Used to assign an inventory storage to a block entity with a proper container - - * @param + * @param the container for that block entity */ -public interface IInventoryMenuBlock extends IInventoryBlock { +public interface IInventoryMenuBlock extends IInventoryBlock { Component getDisplayName(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 8858f9126..267107797 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -15,12 +15,13 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.*; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.Ship; -import org.jetbrains.annotations.NotNull; - import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java index 7bd405898..afa24f11b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/InventoryManagerEntity.java @@ -16,9 +16,9 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.server.ServerLifecycleHooks; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; + import java.util.UUID; public class InventoryManagerEntity extends PeripheralBlockEntity implements IInventoryMenuBlock { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java index 6edd77381..459eb1fc1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RedstoneIntegratorEntity.java @@ -12,9 +12,9 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; import java.util.concurrent.atomic.AtomicInteger; -import org.jetbrains.annotations.NotNull; public class RedstoneIntegratorEntity extends PeripheralBlockEntity { private static final String REDSTONE_EVENT_ID = "redstone_integrator"; diff --git a/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java b/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java index 8de5e7386..ae08e1ec9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java +++ b/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java @@ -4,7 +4,6 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.tree.LiteralCommandNode; - import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.core.computer.Environment; import dan200.computercraft.shared.command.UserLevel; @@ -12,11 +11,9 @@ import dan200.computercraft.shared.command.text.TableBuilder; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.core.ServerContext; - import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.ChunkyPeripheral; import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; - import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java index c730e0fc0..5c4a8de36 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java @@ -7,8 +7,8 @@ import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.fml.config.ModConfig; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.function.Predicate; import java.util.regex.Pattern; diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java index f2f22b7ab..9549f1cc3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/PoiTypeProvider.java @@ -1,7 +1,6 @@ package de.srendi.advancedperipherals.common.data; import de.srendi.advancedperipherals.AdvancedPeripherals; - import de.srendi.advancedperipherals.common.setup.APRegistration; import net.minecraft.data.DataGenerator; import net.minecraft.data.tags.PoiTypeTagsProvider; diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java index 58321dbd2..fd6a1635b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/RecipesProvider.java @@ -9,7 +9,11 @@ import de.srendi.advancedperipherals.common.setup.APItems; import de.srendi.advancedperipherals.common.util.RawValue; import net.minecraft.data.DataGenerator; -import net.minecraft.data.recipes.*; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.ShapelessRecipeBuilder; +import net.minecraft.data.recipes.UpgradeRecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java index 66876331f..911fb78f9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleEnderPearl.java @@ -11,6 +11,11 @@ import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.projectile.ThrowableProjectile; @@ -19,15 +24,10 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.function.Consumer; -import org.jetbrains.annotations.Nullable; public class TurtleEnderPearl extends ThrowableProjectile { diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index e2ef07f0b..f8fc1c492 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -2,16 +2,20 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.shared.computer.core.ServerComputer; +import dan200.computercraft.shared.network.container.ComputerContainerData; import dan200.computercraft.shared.turtle.blocks.TileTurtle; import dan200.computercraft.shared.turtle.core.TurtleBrain; import dan200.computercraft.shared.turtle.items.TurtleItemFactory; -import dan200.computercraft.shared.network.container.ComputerContainerData; import de.srendi.advancedperipherals.common.network.toserver.SaddleTurtleControlPacket; import de.srendi.advancedperipherals.common.setup.APEntities; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.HasCustomInventoryScreen; @@ -24,11 +28,6 @@ import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; -import net.minecraft.resources.ResourceLocation; - import org.jetbrains.annotations.Nullable; public class TurtleSeatEntity extends Entity implements HasCustomInventoryScreen { diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java index 9149b5da0..b7c4f9b4a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java @@ -12,7 +12,11 @@ import dan200.computercraft.shared.network.container.ComputerContainerData; import dan200.computercraft.shared.util.IDAssigner; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.smartglasses.*; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAPI; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesItemHandler; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesMenuProvider; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; import net.minecraft.ChatFormatting; diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java index ab760488c..a558242de 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java @@ -2,7 +2,21 @@ import com.google.common.collect.Sets; import de.srendi.advancedperipherals.common.addons.APAddons; -import de.srendi.advancedperipherals.common.blocks.blockentities.*; +import de.srendi.advancedperipherals.common.blocks.blockentities.BlockReaderEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.ChatBoxEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.ColonyIntegratorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.DistanceDetectorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.EnergyDetectorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.EnvironmentDetectorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.FluidDetectorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.GasDetectorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.GeoScannerEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.InventoryManagerEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.MeBridgeEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.NBTStorageEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.PlayerDetectorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.RedstoneIntegratorEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.RsBridgeEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.registries.RegistryObject; diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java index 3f94ddba9..d9976225b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java @@ -5,11 +5,11 @@ import de.srendi.advancedperipherals.common.entity.TurtleSeatEntity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.RegistryObject; @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) public class APEntities { diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java index 23ba2dc15..0825e5f6e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java @@ -1,7 +1,11 @@ package de.srendi.advancedperipherals.common.setup; import de.srendi.advancedperipherals.common.configuration.APConfig; -import de.srendi.advancedperipherals.common.items.*; +import de.srendi.advancedperipherals.common.items.APItem; +import de.srendi.advancedperipherals.common.items.MemoryCardItem; +import de.srendi.advancedperipherals.common.items.SmartGlassesInterfaceItem; +import de.srendi.advancedperipherals.common.items.SmartGlassesItem; +import de.srendi.advancedperipherals.common.items.WeakAutomataCore; import de.srendi.advancedperipherals.common.items.base.SmartGlassesMaterials; import de.srendi.advancedperipherals.common.smartglasses.modules.hotkey.HotkeyModuleItem; import de.srendi.advancedperipherals.common.smartglasses.modules.nightvision.NightVisionModuleItem; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index 69642501f..2da4b259e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -22,7 +22,11 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; /** * Basically just a {@link dan200.computercraft.shared.pocket.core.PocketServerComputer} but with some changes diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java b/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java index 3b338284d..8a8ec7e89 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java @@ -20,7 +20,11 @@ import java.time.LocalDateTime; import java.time.ZoneOffset; -import java.util.*; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.UUID; @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID) public class ChunkManager extends SavedData { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java index 95ea8d085..dd3398362 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java @@ -8,7 +8,11 @@ import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.*; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index 9bd0a39bf..cffc20ef6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -24,17 +24,16 @@ import net.minecraftforge.common.IForgeShearable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; -import org.joml.primitives.AABBic; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Quaterniondc; import org.joml.Vector3d; import org.joml.Vector3dc; +import org.joml.primitives.AABBic; import org.valkyrienskies.core.api.ships.ServerShip; import org.valkyrienskies.core.api.ships.properties.ShipInertiaData; import org.valkyrienskies.core.api.ships.properties.ShipTransform; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java index d308da9c3..114a6e9ed 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java @@ -5,11 +5,17 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.nbt.*; +import net.minecraft.nbt.ByteTag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.DoubleTag; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraftforge.server.ServerLifecycleHooks; import org.apache.logging.log4j.Level; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java index a434dcc99..97d7f00b8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/SwarmEventDispatcher.java @@ -1,23 +1,23 @@ package de.srendi.advancedperipherals.common.util; import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.shared.computer.core.ServerContext; import dan200.computercraft.shared.computer.core.ServerComputer; +import dan200.computercraft.shared.computer.core.ServerContext; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.server.MinecraftServer; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicBoolean; -import org.jetbrains.annotations.NotNull; /** * SwarmEventDispatcher will combine multiple same events which fired from different peripherals into one event as a table. diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java index 3f3e66887..1bffaa4be 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java @@ -2,8 +2,8 @@ import com.mojang.authlib.GameProfile; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.HitResultUtil; +import de.srendi.advancedperipherals.common.util.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; @@ -31,7 +31,11 @@ import net.minecraft.world.level.block.StructureBlock; import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.*; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.util.FakePlayer; diff --git a/src/main/java/de/srendi/advancedperipherals/common/village/VillageStructures.java b/src/main/java/de/srendi/advancedperipherals/common/village/VillageStructures.java index d88dd5f0b..2716741e8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/village/VillageStructures.java +++ b/src/main/java/de/srendi/advancedperipherals/common/village/VillageStructures.java @@ -5,7 +5,11 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; -import net.minecraft.data.worldgen.*; +import net.minecraft.data.worldgen.DesertVillagePools; +import net.minecraft.data.worldgen.PlainVillagePools; +import net.minecraft.data.worldgen.SavannaVillagePools; +import net.minecraft.data.worldgen.SnowyVillagePools; +import net.minecraft.data.worldgen.TaigaVillagePools; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement; diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java index 6327b87f6..9f827a232 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java @@ -11,6 +11,7 @@ import de.srendi.advancedperipherals.lib.metaphysics.IAutomataCoreTier; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index 5ba11f4fd..eb41f7430 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -17,11 +17,10 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import org.joml.Vector3d; -import org.valkyrienskies.core.api.ships.Ship; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; +import org.valkyrienskies.core.api.ships.Ship; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheralPlugin.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheralPlugin.java index af158aecc..1fc8b319f 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheralPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheralPlugin.java @@ -5,7 +5,6 @@ import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.owner.OperationAbility; import de.srendi.advancedperipherals.common.addons.computercraft.owner.PeripheralOwnerAbility; - import org.jetbrains.annotations.Nullable; import java.util.function.BiConsumer; From d43419a3e00a43c0277bb9fd22265d462682b37b Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 16 Jan 2025 19:07:56 +0100 Subject: [PATCH 127/188] Add wider chemical support for our rs and me bridge --- .../peripheral/MeBridgePeripheral.java | 40 +++++++++++++++++++ .../peripheral/RsBridgePeripheral.java | 40 +++++++++++++++++++ .../inventory/IStorageSystemPeripheral.java | 16 ++++++++ 3 files changed, 96 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java index da6f24fd0..f6bb25cea 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java @@ -208,6 +208,11 @@ public MethodResult getFluid(IArguments arguments) throws LuaException { return MethodResult.of(AppEngApi.parseAeStack(AppEngApi.findAEFluidFromFilter(AppEngApi.getMonitor(node), getCraftingService(), parsedFilter), getCraftingService())); } + @Override + public MethodResult getChemical(IArguments arguments) throws LuaException { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult listItems() { @@ -226,6 +231,11 @@ public final MethodResult listFluids() { return MethodResult.of(AppEngApi.listFluids(AppEngApi.getMonitor(node), getCraftingService())); } + @Override + public MethodResult listChemicals() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult listCraftableItems() { @@ -244,6 +254,11 @@ public final MethodResult listCraftableFluids() { return MethodResult.of(AppEngApi.listCraftableFluids(AppEngApi.getMonitor(node), getCraftingService())); } + @Override + public MethodResult listCraftableChemicals() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult listCells() { @@ -606,6 +621,11 @@ public final MethodResult craftFluid(IComputerAccess computer, IArguments argume return MethodResult.of(true); } + @Override + public MethodResult craftChemical(IComputerAccess computer, IArguments arguments) throws LuaException { + return null; + } + @Override @LuaFunction(mainThread = true) public MethodResult getCraftingTasks() { @@ -698,6 +718,16 @@ public final MethodResult isFluidCrafting(IArguments arguments) throws LuaExcept return MethodResult.of(AppEngApi.isFluidCrafting(monitor, grid, parsedFilter, craftingCPU)); } + @Override + public MethodResult isChemicalCraftable(IArguments arguments) throws LuaException { + return null; + } + + @Override + public MethodResult isChemicalCrafting(IArguments arguments) throws LuaException { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult isFluidCraftable(IArguments arguments) throws LuaException { @@ -735,6 +765,16 @@ public final MethodResult exportFluid(IComputerAccess computer, IArguments argum return exportToTank(arguments, fluidHandler); } + @Override + public MethodResult importChemical(IComputerAccess computer, IArguments arguments) throws LuaException { + return null; + } + + @Override + public MethodResult exportchemical(IComputerAccess computer, IArguments arguments) throws LuaException { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult importFluid(IComputerAccess computer, IArguments arguments) throws LuaException { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java index fab7268d7..9ece08fa6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java @@ -118,6 +118,11 @@ public final MethodResult listCraftableFluids() { return MethodResult.of(fluids); } + @Override + public MethodResult listCraftableChemicals() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult listCells() { @@ -307,6 +312,11 @@ public final MethodResult listFluids() { return MethodResult.of(RefinedStorage.listFluids(getNetwork())); } + @Override + public MethodResult listChemicals() { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult getEnergyUsage() { @@ -501,6 +511,16 @@ public final MethodResult exportFluid(IComputerAccess computer, IArguments argum return exportToTank(arguments, fluidHandler); } + @Override + public MethodResult importChemical(IComputerAccess computer, IArguments arguments) throws LuaException { + return null; + } + + @Override + public MethodResult exportchemical(IComputerAccess computer, IArguments arguments) throws LuaException { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult importFluid(IComputerAccess computer, IArguments arguments) throws LuaException { @@ -548,6 +568,11 @@ public final MethodResult getFluid(IArguments arguments) throws LuaException { return MethodResult.of(RefinedStorage.parseFluidStack(RefinedStorage.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); } + @Override + public MethodResult getChemical(IArguments arguments) throws LuaException { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult craftItem(IComputerAccess computerAccess, IArguments arguments) throws LuaException { @@ -593,6 +618,11 @@ public final MethodResult craftFluid(IComputerAccess computerAccess, IArguments return MethodResult.of(type == CalculationResultType.OK); } + @Override + public MethodResult craftChemical(IComputerAccess computer, IArguments arguments) throws LuaException { + return null; + } + @Override @LuaFunction(mainThread = true) public MethodResult getCraftingTasks() { @@ -695,6 +725,16 @@ public final MethodResult isFluidCrafting(IArguments arguments) throws LuaExcept return MethodResult.of(false); } + @Override + public MethodResult isChemicalCraftable(IArguments arguments) throws LuaException { + return null; + } + + @Override + public MethodResult isChemicalCrafting(IArguments arguments) throws LuaException { + return null; + } + @Override @LuaFunction(mainThread = true) public final MethodResult isItemCraftable(IArguments arguments) throws LuaException { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java index d90bfc97e..95190518c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java @@ -25,14 +25,20 @@ public interface IStorageSystemPeripheral { MethodResult getFluid(IArguments arguments) throws LuaException; + MethodResult getChemical(IArguments arguments) throws LuaException; + MethodResult listItems(); MethodResult listFluids(); + MethodResult listChemicals(); + MethodResult listCraftableItems(); MethodResult listCraftableFluids(); + MethodResult listCraftableChemicals(); + MethodResult listCells(); MethodResult listDrives(); @@ -45,6 +51,10 @@ public interface IStorageSystemPeripheral { MethodResult exportFluid(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult importChemical(IComputerAccess computer, IArguments arguments) throws LuaException; + + MethodResult exportchemical(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult getFilteredPatterns(IArguments arguments) throws LuaException; MethodResult getPatterns(); @@ -101,6 +111,8 @@ public interface IStorageSystemPeripheral { MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult craftChemical(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult isItemCraftable(IArguments arguments) throws LuaException; MethodResult isItemCrafting(IArguments arguments) throws LuaException; @@ -109,4 +121,8 @@ public interface IStorageSystemPeripheral { MethodResult isFluidCrafting(IArguments arguments) throws LuaException; + MethodResult isChemicalCraftable(IArguments arguments) throws LuaException; + + MethodResult isChemicalCrafting(IArguments arguments) throws LuaException; + } From 240a4dd837920f67a25317a3c54e23bc291eeffe Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 16 Jan 2025 19:52:57 +0100 Subject: [PATCH 128/188] [IntelligenceModding/Advanced-Peripherals-Features#90] Add customName, displayName and name to entity properties --- .../advancedperipherals/common/util/LuaConverter.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index cffc20ef6..396aec423 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -43,11 +43,15 @@ public class LuaConverter { - public static Map entityToLua(Entity entity, boolean detailed) { + public static Map entityToLua(Entity entity) { Map data = new HashMap<>(); data.put("id", entity.getId()); data.put("uuid", entity.getStringUUID()); + if (entity.hasCustomName()) + data.put("customName", entity.getCustomName().getString()); EntityType type = entity.getType(); + data.put("displayName", type.getDescription().getString()); + data.put("name", type.builtInRegistryHolder().key().location().toString()); data.put("type", type.getDescriptionId()); data.put("category", type.getCategory()); data.put("canBurn", entity.fireImmune()); @@ -60,7 +64,7 @@ public static Map entityToLua(Entity entity, boolean detailed) { } public static Map livingEntityToLua(LivingEntity entity, boolean detailed) { - Map data = entityToLua(entity, detailed); + Map data = entityToLua(entity); data.put("baby", entity.isBaby()); data.put("health", entity.getHealth()); data.put("maxHealth", entity.getMaxHealth()); @@ -121,7 +125,7 @@ public static Map completeEntityToLua(Entity entity, ItemStack i if (entity instanceof Player player) return playerToLua(player, detailed); if (entity instanceof Animal animal) return animalToLua(animal, itemInHand, detailed); if (entity instanceof LivingEntity livingEntity) return livingEntityToLua(livingEntity, detailed); - return entityToLua(entity, detailed); + return entityToLua(entity); } public static Map completeEntityWithPositionToLua(Entity entity, BlockPos pos) { From e140d5f8aeb46102607ad0fc165672da2908333d Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 13:36:46 -0700 Subject: [PATCH 129/188] update automata turtle logic fix fake player will not look at correct position after moved to another block fix fake player is not able to see non-collise blocks abstract getConnectedPeripheral(Class) in IPeripheralOwner add updateBlock method for update sign text (close IntelligenceModding/Advanced-Peripherals-Features#91) --- .../owner/BlockEntityPeripheralOwner.java | 9 ++- .../computercraft/owner/IPeripheralOwner.java | 10 +++- .../owner/PocketPeripheralOwner.java | 20 ++++++- .../owner/TurtlePeripheralOwner.java | 21 ++++++- .../OverpoweredEndAutomataCorePeripheral.java | 10 +--- ...oweredHusbandryAutomataCorePeripheral.java | 9 +-- ...OverpoweredWeakAutomataCorePeripheral.java | 9 +-- .../WeakAutomataCorePeripheral.java | 5 ++ .../plugins/AutomataBlockHandPlugin.java | 59 +++++++++++++++---- .../plugins/AutomataEntityHandPlugin.java | 4 +- .../blockentities/DistanceDetectorEntity.java | 5 +- .../modules/ModulePeripheralOwner.java | 21 ++++++- .../common/util/HitResultUtil.java | 54 ++++++++--------- .../common/util/LuaConverter.java | 1 + .../common/util/fakeplayer/APFakePlayer.java | 17 ++++-- .../fakeplayer/FakePlayerProviderTurtle.java | 5 +- .../peripherals/AutomataCorePeripheral.java | 26 +++++++- src/main/resources/META-INF/mods.toml | 2 +- 18 files changed, 201 insertions(+), 86 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java index a909d1eda..81250b6f2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.addons.computercraft.owner; +import dan200.computercraft.api.peripheral.IPeripheral; import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; import de.srendi.advancedperipherals.common.blocks.blockentities.InventoryManagerEntity; import de.srendi.advancedperipherals.common.util.DataStorageUtil; @@ -20,7 +21,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Objects; -import java.util.function.Function; public class BlockEntityPeripheralOwner extends BasePeripheralOwner { @@ -90,7 +90,7 @@ public void markDataStorageDirty() { } @Override - public T1 withPlayer(Function function) { + public T1 withPlayer(APFakePlayer.Action function) { throw new NotImplementedException(); } @@ -124,4 +124,9 @@ public BlockEntityPeripheralOwner attachFuel() { attachAbility(PeripheralOwnerAbility.FUEL, new TileEntityFuelAbility<>(this)); return this; } + + @Override + public U getConnectedPeripheral(Class type) { + throw new NotImplementedException(); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java index 287c94e4e..aa27af5cd 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.addons.computercraft.owner; +import dan200.computercraft.api.peripheral.IPeripheral; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; @@ -14,7 +15,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.function.Function; public interface IPeripheralOwner { @@ -39,7 +39,7 @@ default Vec3 getCenterPos() { void markDataStorageDirty(); - T withPlayer(Function function); + T withPlayer(APFakePlayer.Action function); ItemStack getToolInMainHand(); @@ -70,4 +70,10 @@ default void attachOperation(Collection> operations) { for (IPeripheralOperation operation : operations) operationAbility.registerOperation(operation); } + + T getConnectedPeripheral(Class type); + + default boolean hasConnectedPeripheral(Class type) { + return getConnectedPeripheral(type) == null; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java index 7c3f431ec..ffafe5d54 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java @@ -1,9 +1,11 @@ package de.srendi.advancedperipherals.common.addons.computercraft.owner; +import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.pocket.IPocketAccess; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.DataStorageUtil; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; +import de.srendi.advancedperipherals.lib.peripherals.IBasePeripheral; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.FrontAndTop; @@ -17,8 +19,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Function; - public class PocketPeripheralOwner extends BasePeripheralOwner { private final IPocketAccess pocket; @@ -97,7 +97,7 @@ public void markDataStorageDirty() { } @Override - public T withPlayer(Function function) { + public T withPlayer(APFakePlayer.Action function) { throw new NotImplementedException(); } @@ -125,4 +125,18 @@ public boolean isMovementPossible(@NotNull Level level, @NotNull BlockPos pos) { public boolean move(@NotNull Level level, @NotNull BlockPos pos) { return false; } + + @Override + public T getConnectedPeripheral(Class type) { + IPeripheral foundPeripheral = pocket.getUpgrades().values().stream() + .filter(peripheral -> { + if (peripheral == null || type.isInstance(peripheral)) { + return false; + } + return peripheral instanceof IBasePeripheral basePeripheral ? basePeripheral.isEnabled() : true; + }) + .findFirst() + .orElse(null); + return (T) foundPeripheral; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java index aee1a67c7..17dd0e3fb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java @@ -2,6 +2,7 @@ import com.mojang.authlib.GameProfile; import dan200.computercraft.ComputerCraft; +import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.shared.TurtlePermissions; @@ -9,6 +10,7 @@ import de.srendi.advancedperipherals.common.util.DataStorageUtil; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.common.util.fakeplayer.FakePlayerProviderTurtle; +import de.srendi.advancedperipherals.lib.peripherals.IBasePeripheral; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.FrontAndTop; @@ -20,7 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Function; +import java.util.stream.Stream; public class TurtlePeripheralOwner extends BasePeripheralOwner { public final ITurtleAccess turtle; @@ -82,7 +84,7 @@ public void markDataStorageDirty() { } @Override - public T withPlayer(Function function) { + public T withPlayer(APFakePlayer.Action function) { return FakePlayerProviderTurtle.withPlayer(turtle, function); } @@ -132,4 +134,19 @@ public TurtlePeripheralOwner attachFuel(int maxFuelConsumptionLevel) { attachAbility(PeripheralOwnerAbility.FUEL, new TurtleFuelAbility(this, maxFuelConsumptionLevel)); return this; } + + @Override + public T getConnectedPeripheral(Class type) { + IPeripheral foundPeripheral = Stream.of(TurtleSide.values()) + .map(side -> turtle.getPeripheral(side)) + .filter(peripheral -> { + if (peripheral == null || type.isInstance(peripheral)) { + return false; + } + return peripheral instanceof IBasePeripheral basePeripheral ? basePeripheral.isEnabled() : true; + }) + .findFirst() + .orElse(null); + return (T) foundPeripheral; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java index 392dcfaf2..ad2fd2f70 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java @@ -2,9 +2,7 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; -import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.operations.AutomataCoreTier; -import de.srendi.advancedperipherals.common.configuration.APConfig; public class OverpoweredEndAutomataCorePeripheral extends EndAutomataCorePeripheral { @@ -12,12 +10,10 @@ public class OverpoweredEndAutomataCorePeripheral extends EndAutomataCorePeriphe public OverpoweredEndAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) { super(TYPE, turtle, side, AutomataCoreTier.OVERPOWERED_TIER2); - setAttribute(ATTR_STORING_TOOL_DURABILITY); } - public void addRotationCycle(int count) { - super.addRotationCycle(count); - if (AdvancedPeripherals.RANDOM.nextDouble() <= APConfig.METAPHYSICS_CONFIG.overpoweredAutomataBreakChance.get()) - owner.destroyUpgrade(); + @Override + public boolean canOverpowerAction() { + return true; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java index 220e9ce49..fe4eaf449 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java @@ -2,9 +2,7 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; -import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.operations.AutomataCoreTier; -import de.srendi.advancedperipherals.common.configuration.APConfig; public class OverpoweredHusbandryAutomataCorePeripheral extends HusbandryAutomataCorePeripheral { @@ -12,13 +10,10 @@ public class OverpoweredHusbandryAutomataCorePeripheral extends HusbandryAutomat public OverpoweredHusbandryAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) { super(TYPE, turtle, side, AutomataCoreTier.OVERPOWERED_TIER2); - setAttribute(ATTR_STORING_TOOL_DURABILITY); } @Override - public void addRotationCycle(int count) { - super.addRotationCycle(count); - if (AdvancedPeripherals.RANDOM.nextDouble() <= APConfig.METAPHYSICS_CONFIG.overpoweredAutomataBreakChance.get()) - owner.destroyUpgrade(); + public boolean canOverpowerAction() { + return true; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java index 1b19eb40e..7f8e406ae 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java @@ -2,9 +2,7 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; -import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.operations.AutomataCoreTier; -import de.srendi.advancedperipherals.common.configuration.APConfig; public class OverpoweredWeakAutomataCorePeripheral extends WeakAutomataCorePeripheral { @@ -12,13 +10,10 @@ public class OverpoweredWeakAutomataCorePeripheral extends WeakAutomataCorePerip public OverpoweredWeakAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide side) { super(TYPE, turtle, side, AutomataCoreTier.OVERPOWERED_TIER1); - setAttribute(ATTR_STORING_TOOL_DURABILITY); } @Override - public void addRotationCycle(int count) { - super.addRotationCycle(count); - if (AdvancedPeripherals.RANDOM.nextDouble() <= APConfig.METAPHYSICS_CONFIG.overpoweredAutomataBreakChance.get()) - owner.destroyUpgrade(); + public boolean canOverpowerAction() { + return true; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java index ea46ec4fa..04351bd45 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/WeakAutomataCorePeripheral.java @@ -44,4 +44,9 @@ public static void addIntegrationPlugin(Function opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); + float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; + float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; + return automataCore.withOperation(USE_ON_BLOCK, context -> { + TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); + ItemStack selectedTool = owner.getToolInMainHand(); + int previousDamageValue = selectedTool.getDamageValue(); + InteractionResult result = owner.withPlayer(APFakePlayer.wrapActionWithRot(yaw, pitch, (player) -> this.updateBlock(player, opts))); + if (result.consumesAction() && automataCore.canOverpowerAction() && automataCore.afterOverpowerAction()) { + selectedTool.setDamageValue(previousDamageValue); + } + return MethodResult.of(result.consumesAction(), result.toString()); + }); + } + + private InteractionResult updateBlock(APFakePlayer player, Map options) { + Level world = player.getLevel(); + HitResult hit = player.findHit(true, false); + if (!(hit instanceof BlockHitResult blockHit)) { + return InteractionResult.PASS; + } + BlockPos pos = blockHit.getBlockPos(); + BlockEntity block = world.getBlockEntity(pos); + if (block instanceof SignBlockEntity sign) { + String text; + try { + text = TableHelper.optStringField(options, "text", null); + } catch (LuaException e) { + // Why not allow empty catch block? TAT + text = null; + } + if (text != null) { + setSignText(world, sign, StringUtil.convertAndToSectionMark(text)); + return InteractionResult.CONSUME; + } + } + return InteractionResult.PASS; + } + /** * placeBlock method will let turtle place a block with more details when compass has equipped. * It should not able to place fluids / use any item, because compass do not recognize them. @@ -110,10 +150,9 @@ public final MethodResult useOnBlock(@NotNull IArguments arguments) throws LuaEx * text: the text going to write on the sign. Default is null */ @LuaFunction(mainThread = true) - public MethodResult placeBlock(@NotNull Map options) throws LuaException { + public final MethodResult placeBlock(@NotNull Map options) throws LuaException { ITurtleAccess turtle = automataCore.getPeripheralOwner().getTurtle(); - CompassPeripheral compassPeripheral = Stream.of(TurtleSide.values()).map(side -> turtle.getPeripheral(side) instanceof CompassPeripheral compass ? compass : null).filter(peripheral -> peripheral != null).findFirst().orElse(null); - if (compassPeripheral == null || !compassPeripheral.isEnabled()) { + if (!automataCore.getPeripheralOwner().hasConnectedPeripheral(CompassPeripheral.class)) { return MethodResult.of(false, "COMPASS_NOT_EQUIPPED"); } int x = TableHelper.optIntField(options, "x", 0); @@ -176,12 +215,12 @@ private String deployOn(ItemStack stack, BlockPos position, Direction anchor, Di if (!(item instanceof BlockItem)) { return "NOT_BLOCK"; } - BlockItem block = (BlockItem) item; - InteractionResult res = block.place(context); + BlockItem blockItem = (BlockItem) item; + InteractionResult res = blockItem.place(context); if (!res.consumesAction()) { return "CANNOT_PLACE"; } - if (block instanceof SignItem) { + if (blockItem instanceof SignItem) { BlockEntity blockEntity = world.getBlockEntity(position); if (blockEntity instanceof SignBlockEntity sign) { String text = StringUtil.convertAndToSectionMark(TableHelper.optStringField(options, "text", null)); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java index 318d49a4b..78843999b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java @@ -53,9 +53,9 @@ public final MethodResult useOnAnimal(@NotNull IArguments arguments) throws LuaE ItemStack selectedTool = owner.getToolInMainHand(); int previousDamageValue = selectedTool.getDamageValue(); InteractionResult result = owner.withPlayer(APFakePlayer.wrapActionWithShiftKey(sneak, APFakePlayer.wrapActionWithRot(yaw, pitch, p -> p.useOnFilteredEntity(suitableEntity)))); - if (automataCore.hasAttribute(AutomataCorePeripheral.ATTR_STORING_TOOL_DURABILITY)) + if (automataCore.canOverpowerAction() && automataCore.afterOverpowerAction()) { selectedTool.setDamageValue(previousDamageValue); - + } return MethodResult.of(result.consumesAction(), result.toString()); }); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 8858f9126..e809409fb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -11,6 +11,7 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -227,8 +228,8 @@ private HitResult getHitResult(Vec3 to, Vec3 from) { Level level = this.getLevel(); return switch (this.detectionType) { case ENTITY -> HitResultUtil.getEntityHitResult(to, from, level); - case BLOCK -> HitResultUtil.getBlockHitResult(to, from, level, this.ignoreTransparent, this.getBlockPos()); - case BOTH -> HitResultUtil.getHitResult(to, from, level, this.ignoreTransparent, this.getBlockPos()); + case BLOCK -> HitResultUtil.getBlockHitResult(to, from, level, this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, this.getBlockPos()); + case BOTH -> HitResultUtil.getHitResult(to, from, level, this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, this.getBlockPos()); }; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java index 67bf2b6f0..62d22cdeb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java @@ -1,8 +1,11 @@ package de.srendi.advancedperipherals.common.smartglasses.modules; +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.core.computer.ComputerSide; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BasePeripheralOwner; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; +import de.srendi.advancedperipherals.lib.peripherals.IBasePeripheral; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.FrontAndTop; @@ -15,7 +18,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Function; +import java.util.stream.Stream; public class ModulePeripheralOwner extends BasePeripheralOwner { @@ -82,7 +85,7 @@ public void markDataStorageDirty() { } @Override - public T withPlayer(Function function) { + public T withPlayer(APFakePlayer.Action function) { throw new NotImplementedException(); } @@ -111,4 +114,18 @@ public boolean move(@NotNull Level level, @NotNull BlockPos pos) { return false; } + @Override + public T getConnectedPeripheral(Class type) { + IPeripheral foundPeripheral = Stream.of(ComputerSide.values()) + .map(side -> computer.getPeripheral(side)) + .filter(peripheral -> { + if (peripheral == null || type.isInstance(peripheral)) { + return false; + } + return peripheral instanceof IBasePeripheral basePeripheral ? basePeripheral.isEnabled() : true; + }) + .findFirst() + .orElse(null); + return (T) foundPeripheral; + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java index 95ea8d085..05f7d0b67 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java @@ -22,31 +22,31 @@ public class HitResultUtil { /** * This method is used to get the hit result of an entity from the start position of a block * - * @param to the target position/max position - * @param from the source position like a block - * @param level the level - * @param ignoreTransparent if transparent blocks should be ignored + * @param to the target position/max position + * @param from the source position like a block + * @param level the level + * @param shapeGetter the block collision shape getter * @return the hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found */ @NotNull - public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreTransparent) { - return getHitResult(to, from, level, ignoreTransparent, null); + public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, ClipContext.ShapeGetter shapeGetter) { + return getHitResult(to, from, level, shapeGetter, null); } /** * This method is used to get the hit result of an entity from the start position of a block * - * @param to the target position/max position - * @param from the source position like a block - * @param level the level - * @param ignoreTransparent if transparent blocks should be ignored - * @param source the source Entity/BlockPos that will be ignored + * @param to the target position/max position + * @param from the source position like a block + * @param level the level + * @param shapeGetter the block collision shape getter + * @param source the source Entity/BlockPos that will be ignored * @return the hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found */ @NotNull - public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreTransparent, Object source) { + public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, ClipContext.ShapeGetter shapeGetter, Object source) { EntityHitResult entityResult = getEntityHitResult(to, from, level, source instanceof Entity ? (Entity) source : null); - BlockHitResult blockResult = getBlockHitResult(to, from, level, ignoreTransparent, source instanceof BlockPos ? (BlockPos) source : null); + BlockHitResult blockResult = getBlockHitResult(to, from, level, shapeGetter, source instanceof BlockPos ? (BlockPos) source : null); if (entityResult.getType() == HitResult.Type.MISS) { if (blockResult.getType() == HitResult.Type.MISS) { @@ -120,30 +120,30 @@ public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level /** * This method is used to get the hit result of a block from the start position of a block * - * @param to the target position/max position - * @param from the source position - * @param level the world - * @param ignoreNoOccluded if true, the method will ignore blocks which are not occluding like glass + * @param to the target position/max position + * @param from the source position + * @param level the world + * @param shapeGetter the block collision shape getter * @return the block hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found */ @NotNull - public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreNoOccluded) { - return getBlockHitResult(to, from, level, ignoreNoOccluded, null); + public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, ClipContext.ShapeGetter shapeGetter) { + return getBlockHitResult(to, from, level, shapeGetter, null); } /** * This method is used to get the hit result of a block from the start position of a block * - * @param to the target position/max position - * @param from the source position - * @param level the world - * @param ignoreNoOccluded if true, the method will ignore blocks which are not occluding like glass - * @param source the source BlockPos that will be ignored + * @param to the target position/max position + * @param from the source position + * @param level the world + * @param shapeGetter the block collision shape getter + * @param source the source BlockPos that will be ignored * @return the block hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found */ @NotNull - public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, boolean ignoreNoOccluded, BlockPos source) { - return level.clip(new AdvancedClipContext(from, to, ignoreNoOccluded ? IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, null, source)); + public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, ClipContext.ShapeGetter shapeGetter, BlockPos source) { + return level.clip(new AdvancedClipContext(from, to, shapeGetter, ClipContext.Fluid.NONE, null, source)); } public static class EmptyEntityHitResult extends EntityHitResult { @@ -166,7 +166,7 @@ public Type getType() { /** * A shape getter which ignores blocks which are not occluding like glass */ - private static class IgnoreNoOccludedContext implements ClipContext.ShapeGetter { + public static class IgnoreNoOccludedContext implements ClipContext.ShapeGetter { public static final IgnoreNoOccludedContext INSTANCE = new IgnoreNoOccludedContext(); private IgnoreNoOccludedContext() {} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index d1e40be74..db0949b70 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -13,6 +13,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java index 3f3e66887..34cb0bddf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java @@ -24,6 +24,7 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -43,7 +44,6 @@ import java.util.List; import java.util.UUID; -import java.util.function.Function; import java.util.function.Predicate; public class APFakePlayer extends FakePlayer { @@ -108,11 +108,11 @@ public float getEyeHeight(@NotNull Pose pose) { return 0; } - public static Function wrapActionWithRot(float yaw, float pitch, Function action) { + public static Action wrapActionWithRot(float yaw, float pitch, Action action) { return player -> player.doActionWithRot(yaw, pitch, action); } - public T doActionWithRot(float yaw, float pitch, Function action) { + public T doActionWithRot(float yaw, float pitch, Action action) { final float yRot = this.getYRot(), xRot = this.getXRot(); this.setRot(yRot + yaw, xRot + pitch); try { @@ -122,11 +122,11 @@ public T doActionWithRot(float yaw, float pitch, Function a } } - public static Function wrapActionWithShiftKey(boolean shift, Function action) { + public static Action wrapActionWithShiftKey(boolean shift, Action action) { return player -> player.doActionWithShiftKey(shift, action); } - public T doActionWithShiftKey(boolean shift, Function action) { + public T doActionWithShiftKey(boolean shift, Action action) { boolean old = this.isShiftKeyDown(); this.setShiftKeyDown(shift); try { @@ -290,7 +290,7 @@ public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predic Direction traceDirection = Direction.getNearest(look.x, look.y, look.z); blockHit = BlockHitResult.miss(target, traceDirection, new BlockPos(target)); } else { - blockHit = HitResultUtil.getBlockHitResult(target, origin, level, false, this.source); + blockHit = HitResultUtil.getBlockHitResult(target, origin, level, ClipContext.Block.OUTLINE, this.source); } if (skipEntity) { @@ -349,4 +349,9 @@ public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predic } return blockHit; } + + @FunctionalInterface + public interface Action { + T apply(APFakePlayer player); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java index 26fd8d024..159fcda5c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java @@ -20,7 +20,6 @@ import org.valkyrienskies.core.api.ships.Ship; import java.util.WeakHashMap; -import java.util.function.Function; public final class FakePlayerProviderTurtle { @@ -55,8 +54,8 @@ public static void load(APFakePlayer player, ITurtleAccess turtle) { direction = new Vec3(newDir.x, newDir.y, newDir.z); } } + player.setPosRaw(position.x, position.y, position.z); player.lookAt(EntityAnchorArgument.Anchor.FEET, position.add(direction)); - player.moveTo(position.x, position.y, position.z, player.getYRot(), player.getXRot()); // Player inventory Inventory playerInventory = player.getInventory(); @@ -115,7 +114,7 @@ public static void unload(APFakePlayer player, ITurtleAccess turtle) { } } - public static T withPlayer(ITurtleAccess turtle, Function function) { + public static T withPlayer(ITurtleAccess turtle, APFakePlayer.Action function) { APFakePlayer player = getPlayer(turtle, turtle.getOwningPlayer()); load(player, turtle); T result = function.apply(player); diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java index 6327b87f6..cfd831709 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java @@ -4,6 +4,7 @@ import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; +import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation; import de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperationContext; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; @@ -17,11 +18,9 @@ import java.util.Map; public abstract class AutomataCorePeripheral extends BasePeripheral { - - public static final String ATTR_STORING_TOOL_DURABILITY = "storingToolDurability"; - private final IAutomataCoreTier tier; private final Map attributes = new HashMap<>(); + protected boolean destroyed = false; protected AutomataCorePeripheral(String type, ITurtleAccess turtle, TurtleSide side, IAutomataCoreTier tier) { super(type, new TurtlePeripheralOwner(turtle, side)); @@ -84,4 +83,25 @@ public void setAttribute(String attribute) { public Direction validateSide(String direction) throws LuaException { return super.validateSide(direction); } + + public boolean isDestroyed() { + return this.destroyed; + } + + public boolean canOverpowerAction() { + return false; + } + + public abstract double getBreakChance(); + + public boolean afterOverpowerAction() { + if (isDestroyed() || !canOverpowerAction()) { + return false; + } + if (AdvancedPeripherals.RANDOM.nextDouble() <= getBreakChance()) { + this.destroyed = true; + owner.destroyUpgrade(); + } + return true; + } } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 33142efab..f4a652f24 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -29,7 +29,7 @@ side = "BOTH" modId = "computercraft" mandatory = true versionRange = "[${cc_version},)" -ordering = "NONE" +ordering = "AFTER" side = "BOTH" [[dependencies.${mod_id}]] modId = "curios" From eaca2534245c7a0a81b38c75ead388578aa33103 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 15:35:37 -0700 Subject: [PATCH 130/188] add config to disable computer scientist trade --- .../advancedperipherals/common/configuration/WorldConfig.java | 2 ++ .../advancedperipherals/common/village/VillagerTrades.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java index 8ba81c97c..31178683b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java @@ -11,6 +11,7 @@ public class WorldConfig implements IAPConfig { public final ForgeConfigSpec.BooleanValue givePlayerBookOnJoin; public final ForgeConfigSpec.IntValue villagerStructureWeight; public final ForgeConfigSpec.BooleanValue enableWanderingTraderTrades; + public final ForgeConfigSpec.BooleanValue enableComputerScientistTrades; private final ForgeConfigSpec configSpec; public WorldConfig() { @@ -22,6 +23,7 @@ public WorldConfig() { givePlayerBookOnJoin = builder.comment("Gives the ap documentation to new players.").define("givePlayerBookOnJoin", true); villagerStructureWeight = builder.comment("The weight of the villager structures.").defineInRange("villagerStructureWeight", 10, 0, 16000); enableWanderingTraderTrades = builder.comment("Enable new wandering trader trades.").define("enableWanderingTraderTrades", true); + enableComputerScientistTrades = builder.comment("Enable computer scientist trades.").define("enableComputerScientistTrades", true); builder.pop(); configSpec = builder.build(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java index 11f4bb0e6..29819f5dc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java +++ b/src/main/java/de/srendi/advancedperipherals/common/village/VillagerTrades.java @@ -33,6 +33,9 @@ public static void registerWanderingTrade(WandererTradesEvent event) { @SubscribeEvent public static void registerVillagerTrades(VillagerTradesEvent event) { if (event.getType() == APVillagers.COMPUTER_SCIENTIST.get()) { + if (!APConfig.WORLD_CONFIG.enableComputerScientistTrades.get()) { + return; + } TradeBuilder.createTrade(event, APBlocks.PERIPHERAL_CASING.get(), VillagerTrade.Type.ITEM_FOR_EMERALD, 1, 1) .setXp(1) From 689be20b94140dff8d1b7d9008aaee3f377c980d Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 15:45:37 -0700 Subject: [PATCH 131/188] keep things sorted --- .../common/data/EnUsLanguageProvider.java | 90 ++++++++++--------- .../common/setup/APBlockEntityTypes.java | 18 ++-- .../common/setup/APBlocks.java | 20 ++--- .../common/setup/APItems.java | 18 ++-- .../common/setup/APVillagers.java | 2 +- .../common/setup/CCRegistration.java | 32 +++---- 6 files changed, 92 insertions(+), 88 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index 53cb3a4bc..9c2a79bd9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -43,60 +43,59 @@ protected void addTranslations() { private void addItems() { addItem(APItems.CHUNK_CONTROLLER, "Chunk Controller"); addItem(APItems.COMPUTER_TOOL, "Computer Tool"); - addItem(APItems.WEAK_AUTOMATA_CORE, "Weak Automata Core"); - addItem(APItems.HUSBANDRY_AUTOMATA_CORE, "Husbandry Automata Core"); addItem(APItems.END_AUTOMATA_CORE, "End Automata Core"); - addItem(APItems.OVERPOWERED_WEAK_AUTOMATA_CORE, "Overpowered Weak Automata Core"); - addItem(APItems.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE, "Overpowered Husbandry Automata Core"); - addItem(APItems.OVERPOWERED_END_AUTOMATA_CORE, "Overpowered End Automata Core"); + addItem(APItems.HOTKEY_MODULE, "Hotkey Module"); + addItem(APItems.HUSBANDRY_AUTOMATA_CORE, "Husbandry Automata Core"); addItem(APItems.MEMORY_CARD, "Memory Card"); + addItem(APItems.NIGHT_VISION_MODULE, "Night Vision Module"); + addItem(APItems.OVERLAY_MODULE, "Overlay Module"); + addItem(APItems.OVERPOWERED_END_AUTOMATA_CORE, "Overpowered End Automata Core"); + addItem(APItems.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE, "Overpowered Husbandry Automata Core"); + addItem(APItems.OVERPOWERED_WEAK_AUTOMATA_CORE, "Overpowered Weak Automata Core"); addItem(APItems.SMART_GLASSES, "Smart Glasses"); - addItem(APItems.SMART_GLASSES_NETHERITE, "Netherite reinforced Smart Glasses"); addItem(APItems.SMART_GLASSES_INTERFACE, "Smart Glasses Interface"); - addItem(APItems.OVERLAY_MODULE, "Overlay Module"); - addItem(APItems.NIGHT_VISION_MODULE, "Night Vision Module"); - addItem(APItems.HOTKEY_MODULE, "Hotkey Module"); + addItem(APItems.SMART_GLASSES_NETHERITE, "Netherite reinforced Smart Glasses"); + addItem(APItems.WEAK_AUTOMATA_CORE, "Weak Automata Core"); } private void addBlocks() { addBlock(APBlocks.BLOCK_READER, "Block Reader"); addBlock(APBlocks.CHAT_BOX, "Chat Box"); addBlock(APBlocks.COLONY_INTEGRATOR, "Colony Integrator"); + addBlock(APBlocks.DISTANCE_DETECTOR, "Distance Detector"); addBlock(APBlocks.ENERGY_DETECTOR, "Energy Detector"); + addBlock(APBlocks.ENVIRONMENT_DETECTOR, "Environment Detector"); addBlock(APBlocks.FLUID_DETECTOR, "Fluid Detector"); addBlock(APBlocks.GAS_DETECTOR, "Gas Detector"); - addBlock(APBlocks.ENVIRONMENT_DETECTOR, "Environment Detector"); addBlock(APBlocks.GEO_SCANNER, "Geo Scanner"); addBlock(APBlocks.INVENTORY_MANAGER, "Inventory Manager"); addBlock(APBlocks.ME_BRIDGE, "ME Bridge"); - addBlock(APBlocks.RS_BRIDGE, "RS Bridge"); addBlock(APBlocks.NBT_STORAGE, "NBT Storage"); addBlock(APBlocks.PERIPHERAL_CASING, "Peripheral Casing"); addBlock(APBlocks.PLAYER_DETECTOR, "Player Detector"); addBlock(APBlocks.REDSTONE_INTEGRATOR, "Redstone Integrator"); - addBlock(APBlocks.DISTANCE_DETECTOR, "Distance Detector"); + addBlock(APBlocks.RS_BRIDGE, "RS Bridge"); } private void addTurtles() { addTurtle(CCRegistration.ID.CHATTY_TURTLE, "Chatty"); addTurtle(CCRegistration.ID.CHUNKY_TURTLE, "Chunky"); addTurtle(CCRegistration.ID.COMPASS_TURTLE, "Compass"); - addTurtle(CCRegistration.ID.SADDLE_TURTLE, "Saddle"); + addTurtle(CCRegistration.ID.END_AUTOMATA, "End automata"); addTurtle(CCRegistration.ID.ENVIRONMENT_TURTLE, "Environment"); - addTurtle(CCRegistration.ID.PLAYER_TURTLE, "Player Detector"); addTurtle(CCRegistration.ID.GEOSCANNER_TURTLE, "Geo"); - addTurtle(CCRegistration.ID.COMPASS_TURTLE, "Compass"); - addTurtle(CCRegistration.ID.WEAK_AUTOMATA, "Weak automata"); addTurtle(CCRegistration.ID.HUSBANDRY_AUTOMATA, "Husbandry automata"); - addTurtle(CCRegistration.ID.END_AUTOMATA, "End automata"); - addTurtle(CCRegistration.ID.OP_WEAK_AUTOMATA, "Overpowered weak automata"); - addTurtle(CCRegistration.ID.OP_HUSBANDRY_AUTOMATA, "Overpowered husbandry automata"); addTurtle(CCRegistration.ID.OP_END_AUTOMATA, "Overpowered end automata"); + addTurtle(CCRegistration.ID.OP_HUSBANDRY_AUTOMATA, "Overpowered husbandry automata"); + addTurtle(CCRegistration.ID.OP_WEAK_AUTOMATA, "Overpowered weak automata"); + addTurtle(CCRegistration.ID.PLAYER_TURTLE, "Player Detector"); + addTurtle(CCRegistration.ID.SADDLE_TURTLE, "Saddle"); + addTurtle(CCRegistration.ID.WEAK_AUTOMATA, "Weak automata"); } private void addPockets() { - addPocket(CCRegistration.ID.COLONY_POCKET, "Colony"); addPocket(CCRegistration.ID.CHATTY_POCKET, "Chatty"); + addPocket(CCRegistration.ID.COLONY_POCKET, "Colony"); addPocket(CCRegistration.ID.ENVIRONMENT_POCKET, "Environment"); addPocket(CCRegistration.ID.GEOSCANNER_POCKET, "Geo"); addPocket(CCRegistration.ID.PLAYER_POCKET, "Player Detector"); @@ -104,50 +103,55 @@ private void addPockets() { private void addAdvancements() { addAdvancement("root", AdvancedPeripherals.NAME, "Every journey starts with the first block"); - addAdvancement("weak_automata_core", "First automata core", "Does the afterlife exist in minecraft?"); - addAdvancement("end_automata_core", "End automata core", "If you can code gps-free position location with this, you're a powerful human being"); - addAdvancement("husbandry_automata_core", "Husbandry automata core", "Is this core gluten-free?"); - addAdvancement("overpowered_automata_core", "Overpowered automata core", "Can you handle so much power?"); + addAdvancement("base_toolkit", "Gentleman's set!", "Collect a redstone integrator, inventory manager and energy detector. How did you even play without this?"); addAdvancement("nbt_toolkit", "No secrets", "Collect a NBT storage and block reader. Now, all the world's secrets are open to you!"); addAdvancement("sense_toolkit", "The truth can't hide forever", "Collect a geo scanner and environmental detector. There are no limits for observability!"); + + addAdvancement("end_automata_core", "End automata core", "If you can code gps-free position location with this, you're a powerful human being"); + addAdvancement("husbandry_automata_core", "Husbandry automata core", "Is this core gluten-free?"); + addAdvancement("overpowered_automata_core", "Overpowered automata core", "Can you handle so much power?"); + addAdvancement("weak_automata_core", "First automata core", "Does the afterlife exist in minecraft?"); } private void addTooltips() { addTooltip("show_desc", "&b[&7%s&b] &7For Description"); addTooltip("disabled", "&cThis item is disabled in config, so you can craft it, but it'll not have any functionality."); - addTooltip(APItems.COMPUTER_TOOL.get(), "&7This tool was made to tune our blocks. But for now, it's just a blue useless wrench."); + + addTooltip(APBlocks.BLOCK_READER.get(), "&7Reads nbt data of blocks to interact with blocks which do not have computer support."); + addTooltip(APBlocks.CHAT_BOX.get(), "&7Interacts with the ingame chat, can read and write messages."); + addTooltip(APBlocks.COLONY_INTEGRATOR.get(), "&7Interacts with Minecolonies to read data about your colony and citizens."); addTooltip(APBlocks.ENERGY_DETECTOR.get(), "&7Can detect energy flow and acts as a resistor."); - addTooltip(APItems.CHUNK_CONTROLLER.get(), "&7A crafting ingredient for the Chunky Turtle."); addTooltip(APBlocks.ENVIRONMENT_DETECTOR.get(), "&7This peripheral interacts with the minecraft world."); - addTooltip(APBlocks.PLAYER_DETECTOR.get(), "&7This peripheral can be used to interact with players, but don't be a stalker."); - addTooltip(APBlocks.RS_BRIDGE.get(), "&7The RS Bridge interacts with Refined Storage to manage your items."); + addTooltip(APBlocks.GEO_SCANNER.get(), "&7Scans the area around it to find some shiny ores."); + addTooltip(APBlocks.INVENTORY_MANAGER.get(), "&7This block is able to send or receive specific items from a player inventory."); addTooltip(APBlocks.ME_BRIDGE.get(), "&7The ME Bridge interacts with Applied Energistics to manage your items."); - addTooltip(APBlocks.CHAT_BOX.get(), "&7Interacts with the ingame chat, can read and write messages."); + addTooltip(APBlocks.NBT_STORAGE.get(), "&7Acts like a storage disk. Can store nbt based data."); addTooltip(APBlocks.PERIPHERAL_CASING.get(), "&7An empty hull without the love it deserves. Used as crafting ingredient"); - addTooltip(APItems.MEMORY_CARD.get(), "&7Can save the rights of a player to use it in an inventory manager."); - addTooltip("memory_card.bound", "&7Bound to &b%s&7."); - addTooltip(APBlocks.INVENTORY_MANAGER.get(), "&7This block is able to send or receive specific items from a player inventory."); + addTooltip(APBlocks.PLAYER_DETECTOR.get(), "&7This peripheral can be used to interact with players, but don't be a stalker."); addTooltip(APBlocks.REDSTONE_INTEGRATOR.get(), "&7This block is able to interact with redstone. Works exactly like the redstone api of an computer."); - addTooltip(APBlocks.BLOCK_READER.get(), "&7Reads nbt data of blocks to interact with blocks which do not have computer support."); - addTooltip(APBlocks.GEO_SCANNER.get(), "&7Scans the area around it to find some shiny ores."); - addTooltip(APBlocks.COLONY_INTEGRATOR.get(), "&7Interacts with Minecolonies to read data about your colony and citizens."); - addTooltip(APBlocks.NBT_STORAGE.get(), "&7Acts like a storage disk. Can store nbt based data."); - addTooltip(APItems.WEAK_AUTOMATA_CORE.get(), "&7Upgrade for turtles, which makes turtles more useful."); - addTooltip(APItems.OVERPOWERED_WEAK_AUTOMATA_CORE.get(), "&7Improved version of the weak automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile."); - addTooltip(APItems.HUSBANDRY_AUTOMATA_CORE.get(), "&7Upgrade for turtles, that allows basic and advanced interactions with animals."); - addTooltip(APItems.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE.get(), "&7Improved version of the husbandry automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile."); + addTooltip(APBlocks.RS_BRIDGE.get(), "&7The RS Bridge interacts with Refined Storage to manage your items."); + + addTooltip(APItems.CHUNK_CONTROLLER.get(), "&7A crafting ingredient for the Chunky Turtle."); addTooltip(APItems.END_AUTOMATA_CORE.get(), "&7Upgrade for turtles, that allows basic interaction with the world and teleportation in one dimension."); + addTooltip(APItems.HUSBANDRY_AUTOMATA_CORE.get(), "&7Upgrade for turtles, that allows basic and advanced interactions with animals."); addTooltip(APItems.OVERPOWERED_END_AUTOMATA_CORE.get(), "&7Improved version of the end automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile."); + addTooltip(APItems.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE.get(), "&7Improved version of the husbandry automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile."); + addTooltip(APItems.OVERPOWERED_WEAK_AUTOMATA_CORE.get(), "&7Improved version of the weak automata core, that provides some overpowered uses! Be careful, the upgrade is very fragile."); + addTooltip(APItems.WEAK_AUTOMATA_CORE.get(), "&7Upgrade for turtles, which makes turtles more useful."); + + addTooltip(APItems.COMPUTER_TOOL.get(), "&7This tool was made to tune our blocks. But for now, it's just a blue useless wrench."); + addTooltip(APItems.MEMORY_CARD.get(), "&7Can save the rights of a player to use it in an inventory manager."); + addTooltip("memory_card.bound", "&7Bound to &b%s&7."); } private void addTexts() { addText("removed_player", "Cleared the memory card"); addText("added_player", "Added you to the memory card"); - addText("automata_core_feed_by_player", "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?"); + addText("automata_core.feed_by_player", "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?"); addText("smart_glasses.peripherals", "Peripherals"); addText("smart_glasses.modules", "Modules"); - addText("saddle_turtle_dismount_hint", "Controlling %1$s. Press %2$s and %3$s to dismount."); + addText("saddle_turtle.dismount_hint", "Controlling %1$s. Press %2$s and %3$s to dismount."); } private void addKeybinds() { @@ -161,7 +165,7 @@ private void addAdvancement(@NotNull String advancement, @NotNull String name, @ } private void add(@NotNull Supplier key, @NotNull String name) { - add("entity.minecraft.villager." + AdvancedPeripherals.MOD_ID + "." + key.get().name(), name); + add(new ResourceLocation(key.get().name()).toLanguageKey("entity.minecraft.villager"), name); } private void addText(String key, String value) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java index a558242de..16c64d30a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java @@ -25,20 +25,20 @@ public class APBlockEntityTypes { protected static void register() { } + public static final RegistryObject> BLOCK_READER = APRegistration.TILE_ENTITIES.register("block_reader", () -> new BlockEntityType<>(BlockReaderEntity::new, Sets.newHashSet(APBlocks.BLOCK_READER.get()), null)); public static final RegistryObject> CHAT_BOX = APRegistration.TILE_ENTITIES.register("chat_box", () -> new BlockEntityType<>(ChatBoxEntity::new, Sets.newHashSet(APBlocks.CHAT_BOX.get()), null)); - public static final RegistryObject> ENVIRONMENT_DETECTOR = APRegistration.TILE_ENTITIES.register("environment_detector", () -> new BlockEntityType<>(EnvironmentDetectorEntity::new, Sets.newHashSet(APBlocks.ENVIRONMENT_DETECTOR.get()), null)); - public static final RegistryObject> PLAYER_DETECTOR = APRegistration.TILE_ENTITIES.register("player_detector", () -> new BlockEntityType<>(PlayerDetectorEntity::new, Sets.newHashSet(APBlocks.PLAYER_DETECTOR.get()), null)); - public static final RegistryObject> ME_BRIDGE = APAddons.appliedEnergisticsLoaded ? APRegistration.TILE_ENTITIES.register("me_bridge", () -> new BlockEntityType<>(MeBridgeEntity::new, Sets.newHashSet(APBlocks.ME_BRIDGE.get()), null)) : null; - public static final RegistryObject> RS_BRIDGE = APAddons.refinedStorageLoaded ? APRegistration.TILE_ENTITIES.register("rs_bridge", () -> new BlockEntityType<>(RsBridgeEntity::new, Sets.newHashSet(APBlocks.RS_BRIDGE.get()), null)) : null; + public static final RegistryObject> COLONY_INTEGRATOR = APRegistration.TILE_ENTITIES.register("colony_integrator", () -> new BlockEntityType<>(ColonyIntegratorEntity::new, Sets.newHashSet(APBlocks.COLONY_INTEGRATOR.get()), null)); + public static final RegistryObject> DISTANCE_DETECTOR = APRegistration.TILE_ENTITIES.register("distance_detector", () -> new BlockEntityType<>(DistanceDetectorEntity::new, Sets.newHashSet(APBlocks.DISTANCE_DETECTOR.get()), null)); public static final RegistryObject> ENERGY_DETECTOR = APRegistration.TILE_ENTITIES.register("energy_detector", () -> new BlockEntityType<>(EnergyDetectorEntity::new, Sets.newHashSet(APBlocks.ENERGY_DETECTOR.get()), null)); + public static final RegistryObject> ENVIRONMENT_DETECTOR = APRegistration.TILE_ENTITIES.register("environment_detector", () -> new BlockEntityType<>(EnvironmentDetectorEntity::new, Sets.newHashSet(APBlocks.ENVIRONMENT_DETECTOR.get()), null)); public static final RegistryObject> FLUID_DETECTOR = APRegistration.TILE_ENTITIES.register("fluid_detector", () -> new BlockEntityType<>(FluidDetectorEntity::new, Sets.newHashSet(APBlocks.FLUID_DETECTOR.get()), null)); public static final RegistryObject> GAS_DETECTOR = APAddons.mekanismLoaded ? APRegistration.TILE_ENTITIES.register("gas_detector", () -> new BlockEntityType<>(GasDetectorEntity::new, Sets.newHashSet(APBlocks.GAS_DETECTOR.get()), null)) : null; - public static final RegistryObject> INVENTORY_MANAGER = APRegistration.TILE_ENTITIES.register("inventory_manager", () -> new BlockEntityType<>(InventoryManagerEntity::new, Sets.newHashSet(APBlocks.INVENTORY_MANAGER.get()), null)); - public static final RegistryObject> REDSTONE_INTEGRATOR = APRegistration.TILE_ENTITIES.register("redstone_integrator", () -> new BlockEntityType<>(RedstoneIntegratorEntity::new, Sets.newHashSet(APBlocks.REDSTONE_INTEGRATOR.get()), null)); - public static final RegistryObject> BLOCK_READER = APRegistration.TILE_ENTITIES.register("block_reader", () -> new BlockEntityType<>(BlockReaderEntity::new, Sets.newHashSet(APBlocks.BLOCK_READER.get()), null)); public static final RegistryObject> GEO_SCANNER = APRegistration.TILE_ENTITIES.register("geo_scanner", () -> new BlockEntityType<>(GeoScannerEntity::new, Sets.newHashSet(APBlocks.GEO_SCANNER.get()), null)); - public static final RegistryObject> COLONY_INTEGRATOR = APRegistration.TILE_ENTITIES.register("colony_integrator", () -> new BlockEntityType<>(ColonyIntegratorEntity::new, Sets.newHashSet(APBlocks.COLONY_INTEGRATOR.get()), null)); + public static final RegistryObject> INVENTORY_MANAGER = APRegistration.TILE_ENTITIES.register("inventory_manager", () -> new BlockEntityType<>(InventoryManagerEntity::new, Sets.newHashSet(APBlocks.INVENTORY_MANAGER.get()), null)); + public static final RegistryObject> ME_BRIDGE = APAddons.appliedEnergisticsLoaded ? APRegistration.TILE_ENTITIES.register("me_bridge", () -> new BlockEntityType<>(MeBridgeEntity::new, Sets.newHashSet(APBlocks.ME_BRIDGE.get()), null)) : null; public static final RegistryObject> NBT_STORAGE = APRegistration.TILE_ENTITIES.register("nbt_storage", () -> new BlockEntityType<>(NBTStorageEntity::new, Sets.newHashSet(APBlocks.NBT_STORAGE.get()), null)); - public static final RegistryObject> DISTANCE_DETECTOR = APRegistration.TILE_ENTITIES.register("distance_detector", () -> new BlockEntityType<>(DistanceDetectorEntity::new, Sets.newHashSet(APBlocks.DISTANCE_DETECTOR.get()), null)); + public static final RegistryObject> PLAYER_DETECTOR = APRegistration.TILE_ENTITIES.register("player_detector", () -> new BlockEntityType<>(PlayerDetectorEntity::new, Sets.newHashSet(APBlocks.PLAYER_DETECTOR.get()), null)); + public static final RegistryObject> REDSTONE_INTEGRATOR = APRegistration.TILE_ENTITIES.register("redstone_integrator", () -> new BlockEntityType<>(RedstoneIntegratorEntity::new, Sets.newHashSet(APBlocks.REDSTONE_INTEGRATOR.get()), null)); + public static final RegistryObject> RS_BRIDGE = APAddons.refinedStorageLoaded ? APRegistration.TILE_ENTITIES.register("rs_bridge", () -> new BlockEntityType<>(RsBridgeEntity::new, Sets.newHashSet(APBlocks.RS_BRIDGE.get()), null)) : null; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java index cde058649..1afa60e8b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlocks.java @@ -22,22 +22,22 @@ public class APBlocks { protected static void register() { } - public static final RegistryObject ENVIRONMENT_DETECTOR = register("environment_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.ENVIRONMENT_DETECTOR, false), () -> new APBlockItem(APBlocks.ENVIRONMENT_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableEnvironmentDetector)); + public static final RegistryObject BLOCK_READER = register("block_reader", () -> new APBlockEntityBlock<>(APBlockEntityTypes.BLOCK_READER, true), () -> new APBlockItem(APBlocks.BLOCK_READER.get(), APConfig.PERIPHERALS_CONFIG.enableBlockReader)); public static final RegistryObject CHAT_BOX = register("chat_box", () -> new APBlockEntityBlock<>(APBlockEntityTypes.CHAT_BOX, true), () -> new APBlockItem(APBlocks.CHAT_BOX.get(), APConfig.PERIPHERALS_CONFIG.enableChatBox)); - public static final RegistryObject PLAYER_DETECTOR = register("player_detector", PlayerDetectorBlock::new, () -> new APBlockItem(APBlocks.PLAYER_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enablePlayerDetector)); - public static final RegistryObject ME_BRIDGE = register("me_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("ae2") ? APBlockEntityTypes.ME_BRIDGE : null, ModList.get().isLoaded("ae2")), () -> new APBlockItem(APBlocks.ME_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableMEBridge)); - public static final RegistryObject RS_BRIDGE = register("rs_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("refinedstorage") ? APBlockEntityTypes.RS_BRIDGE : null, false), () -> new APBlockItem(APBlocks.RS_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableRSBridge)); + public static final RegistryObject COLONY_INTEGRATOR = register("colony_integrator", () -> new APBlockEntityBlock<>(APBlockEntityTypes.COLONY_INTEGRATOR, false), () -> new APBlockItem(APBlocks.COLONY_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableColonyIntegrator)); + public static final RegistryObject DISTANCE_DETECTOR = register("distance_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.DISTANCE_DETECTOR, true), () -> new APBlockItem(APBlocks.DISTANCE_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage)); public static final RegistryObject ENERGY_DETECTOR = register("energy_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.ENERGY_DETECTOR, true), () -> new APBlockItem(APBlocks.ENERGY_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableEnergyDetector)); + public static final RegistryObject ENVIRONMENT_DETECTOR = register("environment_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.ENVIRONMENT_DETECTOR, false), () -> new APBlockItem(APBlocks.ENVIRONMENT_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableEnvironmentDetector)); public static final RegistryObject FLUID_DETECTOR = register("fluid_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.FLUID_DETECTOR, true), () -> new APBlockItem(APBlocks.FLUID_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableFluidDetector)); public static final RegistryObject GAS_DETECTOR = register("gas_detector", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("mekanism") ? APBlockEntityTypes.GAS_DETECTOR : null, true), () -> new APBlockItem(APBlocks.GAS_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableGasDetector)); - public static final RegistryObject PERIPHERAL_CASING = register("peripheral_casing", BaseBlock::new, () -> new APBlockItem(APBlocks.PERIPHERAL_CASING.get(), new Item.Properties().stacksTo(16), () -> true)); - public static final RegistryObject INVENTORY_MANAGER = register("inventory_manager", () -> new APBlockEntityBlock<>(APBlockEntityTypes.INVENTORY_MANAGER, false), () -> new APBlockItem(APBlocks.INVENTORY_MANAGER.get(), APConfig.PERIPHERALS_CONFIG.enableInventoryManager)); - public static final RegistryObject REDSTONE_INTEGRATOR = register("redstone_integrator", RedstoneIntegratorBlock::new, () -> new APBlockItem(APBlocks.REDSTONE_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableRedstoneIntegrator)); - public static final RegistryObject BLOCK_READER = register("block_reader", () -> new APBlockEntityBlock<>(APBlockEntityTypes.BLOCK_READER, true), () -> new APBlockItem(APBlocks.BLOCK_READER.get(), APConfig.PERIPHERALS_CONFIG.enableBlockReader)); public static final RegistryObject GEO_SCANNER = register("geo_scanner", () -> new APBlockEntityBlock<>(APBlockEntityTypes.GEO_SCANNER, false), () -> new APBlockItem(APBlocks.GEO_SCANNER.get(), APConfig.PERIPHERALS_CONFIG.enableGeoScanner)); - public static final RegistryObject COLONY_INTEGRATOR = register("colony_integrator", () -> new APBlockEntityBlock<>(APBlockEntityTypes.COLONY_INTEGRATOR, false), () -> new APBlockItem(APBlocks.COLONY_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableColonyIntegrator)); + public static final RegistryObject INVENTORY_MANAGER = register("inventory_manager", () -> new APBlockEntityBlock<>(APBlockEntityTypes.INVENTORY_MANAGER, false), () -> new APBlockItem(APBlocks.INVENTORY_MANAGER.get(), APConfig.PERIPHERALS_CONFIG.enableInventoryManager)); + public static final RegistryObject ME_BRIDGE = register("me_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("ae2") ? APBlockEntityTypes.ME_BRIDGE : null, ModList.get().isLoaded("ae2")), () -> new APBlockItem(APBlocks.ME_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableMEBridge)); public static final RegistryObject NBT_STORAGE = register("nbt_storage", () -> new APBlockEntityBlock<>(APBlockEntityTypes.NBT_STORAGE, false), () -> new APBlockItem(APBlocks.NBT_STORAGE.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage)); - public static final RegistryObject DISTANCE_DETECTOR = register("distance_detector", () -> new APBlockEntityBlock<>(APBlockEntityTypes.DISTANCE_DETECTOR, true), () -> new APBlockItem(APBlocks.DISTANCE_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enableNBTStorage)); + public static final RegistryObject PERIPHERAL_CASING = register("peripheral_casing", BaseBlock::new, () -> new APBlockItem(APBlocks.PERIPHERAL_CASING.get(), new Item.Properties().stacksTo(16), () -> true)); + public static final RegistryObject PLAYER_DETECTOR = register("player_detector", PlayerDetectorBlock::new, () -> new APBlockItem(APBlocks.PLAYER_DETECTOR.get(), APConfig.PERIPHERALS_CONFIG.enablePlayerDetector)); + public static final RegistryObject REDSTONE_INTEGRATOR = register("redstone_integrator", RedstoneIntegratorBlock::new, () -> new APBlockItem(APBlocks.REDSTONE_INTEGRATOR.get(), APConfig.PERIPHERALS_CONFIG.enableRedstoneIntegrator)); + public static final RegistryObject RS_BRIDGE = register("rs_bridge", () -> new APBlockEntityBlock<>(ModList.get().isLoaded("refinedstorage") ? APBlockEntityTypes.RS_BRIDGE : null, false), () -> new APBlockItem(APBlocks.RS_BRIDGE.get(), APConfig.PERIPHERALS_CONFIG.enableRSBridge)); private static RegistryObject registerNoItem(String name, Supplier block) { return APRegistration.BLOCKS.register(name, block); diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java index 0825e5f6e..36c5378e4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java @@ -16,20 +16,20 @@ public class APItems { public static final RegistryObject CHUNK_CONTROLLER = APRegistration.ITEMS.register("chunk_controller", () -> new APItem(new Item.Properties().stacksTo(16), APConfig.PERIPHERALS_CONFIG.enableChunkyTurtle)); - public static final RegistryObject SMART_GLASSES = APRegistration.ITEMS.register("smart_glasses", () -> new SmartGlassesItem(SmartGlassesMaterials.CHAIN)); - public static final RegistryObject SMART_GLASSES_NETHERITE = APRegistration.ITEMS.register("smart_glasses_netherite", () -> new SmartGlassesItem(SmartGlassesMaterials.NETHERITE)); - public static final RegistryObject SMART_GLASSES_INTERFACE = APRegistration.ITEMS.register("smart_glasses_interface", SmartGlassesInterfaceItem::new); - public static final RegistryObject OVERLAY_MODULE = APRegistration.ITEMS.register("overlay_module", OverlayGlassesItem::new); - public static final RegistryObject HOTKEY_MODULE = APRegistration.ITEMS.register("hotkey_module", HotkeyModuleItem::new); - public static final RegistryObject NIGHT_VISION_MODULE = APRegistration.ITEMS.register("nightvision_module", NightVisionModuleItem::new); public static final RegistryObject COMPUTER_TOOL = APRegistration.ITEMS.register("computer_tool", () -> new APItem(new Item.Properties().stacksTo(1), () -> true)); - public static final RegistryObject MEMORY_CARD = APRegistration.ITEMS.register("memory_card", MemoryCardItem::new); public static final RegistryObject END_AUTOMATA_CORE = APRegistration.ITEMS.register("end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); + public static final RegistryObject HOTKEY_MODULE = APRegistration.ITEMS.register("hotkey_module", HotkeyModuleItem::new); public static final RegistryObject HUSBANDRY_AUTOMATA_CORE = APRegistration.ITEMS.register("husbandry_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableHusbandryAutomataCore)); - public static final RegistryObject WEAK_AUTOMATA_CORE = APRegistration.ITEMS.register("weak_automata_core", () -> new WeakAutomataCore(new Item.Properties().stacksTo(1))); - public static final RegistryObject OVERPOWERED_WEAK_AUTOMATA_CORE = APRegistration.ITEMS.register("overpowered_weak_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableWeakAutomataCore)); + public static final RegistryObject MEMORY_CARD = APRegistration.ITEMS.register("memory_card", MemoryCardItem::new); + public static final RegistryObject NIGHT_VISION_MODULE = APRegistration.ITEMS.register("nightvision_module", NightVisionModuleItem::new); + public static final RegistryObject OVERLAY_MODULE = APRegistration.ITEMS.register("overlay_module", OverlayGlassesItem::new); public static final RegistryObject OVERPOWERED_END_AUTOMATA_CORE = APRegistration.ITEMS.register("overpowered_end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); public static final RegistryObject OVERPOWERED_HUSBANDRY_AUTOMATA_CORE = APRegistration.ITEMS.register("overpowered_husbandry_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableHusbandryAutomataCore)); + public static final RegistryObject OVERPOWERED_WEAK_AUTOMATA_CORE = APRegistration.ITEMS.register("overpowered_weak_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableWeakAutomataCore)); + public static final RegistryObject SMART_GLASSES = APRegistration.ITEMS.register("smart_glasses", () -> new SmartGlassesItem(SmartGlassesMaterials.CHAIN)); + public static final RegistryObject SMART_GLASSES_INTERFACE = APRegistration.ITEMS.register("smart_glasses_interface", SmartGlassesInterfaceItem::new); + public static final RegistryObject SMART_GLASSES_NETHERITE = APRegistration.ITEMS.register("smart_glasses_netherite", () -> new SmartGlassesItem(SmartGlassesMaterials.NETHERITE)); + public static final RegistryObject WEAK_AUTOMATA_CORE = APRegistration.ITEMS.register("weak_automata_core", () -> new WeakAutomataCore(new Item.Properties().stacksTo(1))); protected static void register() { } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APVillagers.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APVillagers.java index a91c83f7a..f0338f20c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APVillagers.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APVillagers.java @@ -12,7 +12,7 @@ public class APVillagers { public static final RegistryObject COMPUTER_SCIENTIST_POI = APRegistration.POI_TYPES.register("computer_scientist", () -> new PoiType(ImmutableSet.copyOf(Registry.ModBlocks.COMPUTER_ADVANCED.get().getStateDefinition().getPossibleStates()), 1, 1)); - public static final RegistryObject COMPUTER_SCIENTIST = APRegistration.VILLAGER_PROFESSIONS.register("computer_scientist", () -> new VillagerProfession(AdvancedPeripherals.MOD_ID + ":computer_scientist", holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), ImmutableSet.of(), ImmutableSet.of(Registry.ModBlocks.COMPUTER_ADVANCED.get()), SoundEvents.VILLAGER_WORK_TOOLSMITH)); + public static final RegistryObject COMPUTER_SCIENTIST = APRegistration.VILLAGER_PROFESSIONS.register("computer_scientist", () -> new VillagerProfession(AdvancedPeripherals.getRL("computer_scientist").toString(), holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), holder -> holder.is(COMPUTER_SCIENTIST_POI.getKey()), ImmutableSet.of(), ImmutableSet.of(Registry.ModBlocks.COMPUTER_ADVANCED.get()), SoundEvents.VILLAGER_WORK_TOOLSMITH)); protected static void register() { } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java index f84b89141..2e44565db 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java @@ -31,24 +31,24 @@ public class CCRegistration { public static final RegistryObject> CHAT_BOX_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.CHATTY_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleChatBoxUpgrade::new)); - public static final RegistryObject> PLAYER_DETECTOR_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.PLAYER_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtlePlayerDetectorUpgrade::new)); - public static final RegistryObject> ENVIRONMENT_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.ENVIRONMENT_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleEnvironmentDetectorUpgrade::new)); public static final RegistryObject> CHUNKY_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.CHUNKY_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleChunkyUpgrade::new)); - public static final RegistryObject> GEO_SCANNER_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.GEOSCANNER_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleGeoScannerUpgrade::new)); public static final RegistryObject> COMPASS_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.COMPASS_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleCompassUpgrade::new)); - public static final RegistryObject> SADDLE_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.SADDLE_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleSaddleUpgrade::new)); - public static final RegistryObject> WEAK_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.WEAK_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(WeakAutomata::new)); public static final RegistryObject> END_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.END_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(EndAutomata::new)); + public static final RegistryObject> ENVIRONMENT_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.ENVIRONMENT_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleEnvironmentDetectorUpgrade::new)); + public static final RegistryObject> GEO_SCANNER_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.GEOSCANNER_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleGeoScannerUpgrade::new)); public static final RegistryObject> HUSBANDRY_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.HUSBANDRY_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(HusbandryAutomata::new)); - public static final RegistryObject> OP_WEAK_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.OP_WEAK_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(OverpoweredWeakAutomata::new)); public static final RegistryObject> OP_END_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.OP_END_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(OverpoweredEndAutomata::new)); public static final RegistryObject> OP_HUSBANDRY_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.OP_HUSBANDRY_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(OverpoweredHusbandryAutomata::new)); + public static final RegistryObject> OP_WEAK_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.OP_WEAK_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(OverpoweredWeakAutomata::new)); + public static final RegistryObject> PLAYER_DETECTOR_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.PLAYER_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtlePlayerDetectorUpgrade::new)); + public static final RegistryObject> SADDLE_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.SADDLE_TURTLE.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(TurtleSaddleUpgrade::new)); + public static final RegistryObject> WEAK_TURTLE = APRegistration.TURTLE_SERIALIZER.register(ID.WEAK_AUTOMATA.getPath(), () -> TurtleUpgradeSerialiser.simpleWithCustomItem(WeakAutomata::new)); public static final RegistryObject> CHAT_BOX_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.CHATTY_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketChatBoxUpgrade::new)); - public static final RegistryObject> PLAYER_DETECTOR_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.PLAYER_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketPlayerDetectorUpgrade::new)); + public static final RegistryObject> COLONY_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.COLONY_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketColonyIntegratorUpgrade::new)); public static final RegistryObject> ENVIRONMENT_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.ENVIRONMENT_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketEnvironmentUpgrade::new)); public static final RegistryObject> GEO_SCANNER_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.GEOSCANNER_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketGeoScannerUpgrade::new)); - public static final RegistryObject> COLONY_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.COLONY_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketColonyIntegratorUpgrade::new)); + public static final RegistryObject> PLAYER_DETECTOR_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.PLAYER_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketPlayerDetectorUpgrade::new)); public static IntegrationPeripheralProvider integrationPeripheralProvider; @@ -61,24 +61,24 @@ protected static void register() { public static class ID { public static final ResourceLocation CHATTY_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "chatty_turtle"); - public static final ResourceLocation PLAYER_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "player_turtle"); - public static final ResourceLocation ENVIRONMENT_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "environment_turtle"); public static final ResourceLocation CHUNKY_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "chunky_turtle"); - public static final ResourceLocation GEOSCANNER_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "geoscanner_turtle"); public static final ResourceLocation COMPASS_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "compass_turtle"); - public static final ResourceLocation SADDLE_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "saddle_turtle"); - public static final ResourceLocation WEAK_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "weak_automata"); public static final ResourceLocation END_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "end_automata"); + public static final ResourceLocation ENVIRONMENT_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "environment_turtle"); + public static final ResourceLocation GEOSCANNER_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "geoscanner_turtle"); public static final ResourceLocation HUSBANDRY_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "husbandry_automata"); - public static final ResourceLocation OP_WEAK_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "overpowered_weak_automata"); public static final ResourceLocation OP_END_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "overpowered_end_automata"); public static final ResourceLocation OP_HUSBANDRY_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "overpowered_husbandry_automata"); + public static final ResourceLocation OP_WEAK_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "overpowered_weak_automata"); + public static final ResourceLocation PLAYER_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "player_turtle"); + public static final ResourceLocation SADDLE_TURTLE = new ResourceLocation(AdvancedPeripherals.MOD_ID, "saddle_turtle"); + public static final ResourceLocation WEAK_AUTOMATA = new ResourceLocation(AdvancedPeripherals.MOD_ID, "weak_automata"); public static final ResourceLocation CHATTY_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "chatty_pocket"); - public static final ResourceLocation PLAYER_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "player_pocket"); + public static final ResourceLocation COLONY_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "colony_pocket"); public static final ResourceLocation ENVIRONMENT_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "environment_pocket"); public static final ResourceLocation GEOSCANNER_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "geoscanner_pocket"); - public static final ResourceLocation COLONY_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "colony_pocket"); + public static final ResourceLocation PLAYER_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "player_pocket"); } } From 06ad7b79b926180a0148bc5e628633a8361a9512 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 15:45:54 -0700 Subject: [PATCH 132/188] update translation key --- .../advancedperipherals/client/screens/SaddleTurtleScreen.java | 2 +- .../advancedperipherals/common/items/WeakAutomataCore.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java index e206172a0..4fff59801 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java @@ -124,7 +124,7 @@ private void renderDismountHint(PoseStack stack) { Minecraft minecraft = Minecraft.getInstance(); Component name = Component.translatable("block.computercraft.turtle_normal.upgraded", Component.translatable("turtle.advancedperipherals.saddle_turtle")); // TODO: get and render turtle's label if exists - Component text = Component.translatable("text.advancedperipherals.saddle_turtle_dismount_hint", + Component text = Component.translatable("text.advancedperipherals.saddle_turtle.dismount_hint", name, minecraft.options.keyShift.getTranslatedKeyMessage(), minecraft.options.keyInventory.getTranslatedKeyMessage()); float top = 10; float x = (float)(this.screenWidth / 2 - textWidth(text) / 2); diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java b/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java index 0dd8b101f..45ea57ba5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/WeakAutomataCore.java @@ -74,7 +74,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List Date: Thu, 16 Jan 2025 15:46:09 -0700 Subject: [PATCH 133/188] check runData by if --- build.gradle | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index a323f6daf..647b8a371 100644 --- a/build.gradle +++ b/build.gradle @@ -324,11 +324,14 @@ dependencies { compileOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") compileOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") // IMPORTANT. This should be removed/commented when running `runData` - runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") - runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}") - runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}") - runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") - runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") + // Automated now, tho if you are not executing runData directly it's no help + if (!project.gradle.startParameter.taskNames.contains("runData")) { + runtimeOnly fg.deobf("com.ldtteam:minecolonies:${minecolonies_version}") + runtimeOnly fg.deobf("com.ldtteam:structurize:${structurize_version}") + runtimeOnly fg.deobf("com.ldtteam:multipiston:${multipiston_version}") + runtimeOnly fg.deobf("com.ldtteam:domum_ornamentum:${domumornamentum_version}:universal") + runtimeOnly fg.deobf("com.ldtteam:blockui:${blockui_version}") + } // Patchouli compileOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}") From 02d64baaa41eeada4fbfa3fe990d15939b8ab01c Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 15:48:49 -0700 Subject: [PATCH 134/188] run runData --- .../67cce32b1c3cbbcb1f646605f4914e3f196986c2 | 34 +++++++++---------- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +-- .../f95c7003282837dabaa33e3ffceec4e6865b5218 | 6 ++-- .../advancedperipherals/lang/en_us.json | 6 ++-- .../loot_tables/blocks/distance_detector.json | 6 ++++ .../loot_tables/blocks/fluid_detector.json | 6 ++++ .../loot_tables/blocks/gas_detector.json | 6 ++++ .../tags/blocks/mineable/pickaxe.json | 20 +++++------ .../tags/blocks/needs_iron_tool.json | 18 +++++----- 9 files changed, 62 insertions(+), 44 deletions(-) diff --git a/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 b/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 index fe9b9c502..ac730fb60 100644 --- a/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 +++ b/src/generated/resources/.cache/67cce32b1c3cbbcb1f646605f4914e3f196986c2 @@ -1,17 +1,17 @@ -// 1.19.2 2024-05-28T14:53:16.656615 LootTables -d865e8ac35302c486faf5c7122569c554186186d data/advancedperipherals/loot_tables/blocks/block_reader.json -a6f896cc3dbd8da12737825ec71e32970f54025c data/advancedperipherals/loot_tables/blocks/chat_box.json -f50f506ae1987537f76be4c05a81689b25798f91 data/advancedperipherals/loot_tables/blocks/colony_integrator.json -4dcad851450e4ddd8d28a0017a417bf6e5579bda data/advancedperipherals/loot_tables/blocks/distance_detector.json -1d1b858d09538dc66bab2c33a2f9c58361a9c472 data/advancedperipherals/loot_tables/blocks/energy_detector.json -317004b1358ef9bf83957d2d6796529a226161c7 data/advancedperipherals/loot_tables/blocks/environment_detector.json -df6186990887f77b7db37ebb8ee50a7e7f096b0a data/advancedperipherals/loot_tables/blocks/fluid_detector.json -cea5a036d4ccdcc6ef026d1a226b5e13f1060676 data/advancedperipherals/loot_tables/blocks/gas_detector.json -d5a3964f518b138cbd7305c819a36af3d9340e4a data/advancedperipherals/loot_tables/blocks/geo_scanner.json -8aa1deea908fd02f049e047c8ca16679bbef68a2 data/advancedperipherals/loot_tables/blocks/inventory_manager.json -9a2898a63e2e0c087ce8eba211c63d1c8b9fd4aa data/advancedperipherals/loot_tables/blocks/me_bridge.json -973770040bacb61482adb9739fd1d977f16c107f data/advancedperipherals/loot_tables/blocks/nbt_storage.json -b4b80e8c9d62b53d9252cdfc5918c077d3a01f6e data/advancedperipherals/loot_tables/blocks/peripheral_casing.json -58b6adbea5d4ae43ed9af0b627df2b8a4907acde data/advancedperipherals/loot_tables/blocks/player_detector.json -a58aebcc52684302968e7af4f50a12aff93aaf2d data/advancedperipherals/loot_tables/blocks/redstone_integrator.json -0ef1678f88b8fcb744bfd95261f66745340be8f4 data/advancedperipherals/loot_tables/blocks/rs_bridge.json +// 1.19.2 2025-01-16T15:46:41.860623 LootTables +618b63c020ab64890c8a2d2506dd61cd30259a44 data/advancedperipherals/loot_tables/blocks/block_reader.json +0923665563d05307a7fa7d711a2d7a994a31eb6e data/advancedperipherals/loot_tables/blocks/chat_box.json +bf2a80256cfba0bd8c0283d493882e5816882f1f data/advancedperipherals/loot_tables/blocks/colony_integrator.json +cff4b81aa381bc0d1172b0a4c8bb35c1b954a018 data/advancedperipherals/loot_tables/blocks/distance_detector.json +1c5dbe1a8e07e040a3c2893a002cd535ee41dc20 data/advancedperipherals/loot_tables/blocks/energy_detector.json +8cc03eca1d191f725bc558836f26a85a466cb127 data/advancedperipherals/loot_tables/blocks/environment_detector.json +12589e7642b383029457d97a64637494ea8507a3 data/advancedperipherals/loot_tables/blocks/fluid_detector.json +421a3ece56485bd46374844639bfd606ce4665ec data/advancedperipherals/loot_tables/blocks/gas_detector.json +a2ae352dce564b878daecf47026f268dd432fbcf data/advancedperipherals/loot_tables/blocks/geo_scanner.json +807d449d02c0af701f84d3e806ebac20d3a1f91c data/advancedperipherals/loot_tables/blocks/inventory_manager.json +bb9b442dfad1d5f31397585c8394c85243fa169a data/advancedperipherals/loot_tables/blocks/me_bridge.json +52b1fe2e265be456ebf48d7e0d9ebcc8c994176f data/advancedperipherals/loot_tables/blocks/nbt_storage.json +2651e6053857a31f5bccc360969924848a197ad5 data/advancedperipherals/loot_tables/blocks/peripheral_casing.json +6b5058b6bc49689bf2b858b89f3981a4bb681750 data/advancedperipherals/loot_tables/blocks/player_detector.json +6af6542c7b64aa22dbfcdb01299daf4911827a49 data/advancedperipherals/loot_tables/blocks/redstone_integrator.json +b221c6a82da0875264a112b54f847ac6a1f36797 data/advancedperipherals/loot_tables/blocks/rs_bridge.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index ea5891f84..581e50650 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2024-05-28T14:53:16.658014 Languages: en_us -2580077212426421e05822910bde2edff88e2346 assets/advancedperipherals/lang/en_us.json +// 1.19.2 2025-01-16T15:46:41.860244 Languages: en_us +bada6e2fe518841aa8104157f11ddea10e076ea9 assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 index 25f180a23..872307de5 100644 --- a/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 +++ b/src/generated/resources/.cache/f95c7003282837dabaa33e3ffceec4e6865b5218 @@ -1,4 +1,4 @@ -// 1.19.2 2024-05-28T14:53:16.656337 Block tags +// 1.19.2 2025-01-16T15:46:41.859383 Block tags e1f71dcb4f9e7e36e29b0ad09d6520dc3adfa4a6 data/forge/tags/blocks/needs_wood_tool.json -ef4684e10e5054e8cfd515dffa4a98169d281078 data/minecraft/tags/blocks/mineable/pickaxe.json -8de9358ffeaa8d5f015774f70244a93b915427b8 data/minecraft/tags/blocks/needs_iron_tool.json +03322cd493601129eaad6ba7c2a6d808023dfac1 data/minecraft/tags/blocks/mineable/pickaxe.json +277fe59db076a3eab3c97080531ad345f8ca5f3d data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index 4533665e0..c6d723fcd 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -33,7 +33,7 @@ "block.advancedperipherals.redstone_integrator": "Redstone Integrator", "block.advancedperipherals.rs_bridge": "RS Bridge", "curios.identifier.glasses": "Glasses", - "entity.minecraft.villager.advancedperipherals.advancedperipherals:computer_scientist": "Computer Scientist", + "entity.minecraft.villager.advancedperipherals.computer_scientist": "Computer Scientist", "item.advancedperipherals.chunk_controller": "Chunk Controller", "item.advancedperipherals.computer_tool": "Computer Tool", "item.advancedperipherals.end_automata_core": "End Automata Core", @@ -83,9 +83,9 @@ "pocket.advancedperipherals.geoscanner_pocket": "Geo", "pocket.advancedperipherals.player_pocket": "Player Detector", "text.advancedperipherals.added_player": "Added you to the memory card", - "text.advancedperipherals.automata_core_feed_by_player": "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?", + "text.advancedperipherals.automata_core.feed_by_player": "You're trying to feed an entity to a soul, but your own body refuses to do this. Maybe something more mechanical can do this?", "text.advancedperipherals.removed_player": "Cleared the memory card", - "text.advancedperipherals.saddle_turtle_dismount_hint": "Controlling %1$s. Press %2$s and %3$s to dismount.", + "text.advancedperipherals.saddle_turtle.dismount_hint": "Controlling %1$s. Press %2$s and %3$s to dismount.", "text.advancedperipherals.smart_glasses.modules": "Modules", "text.advancedperipherals.smart_glasses.peripherals": "Peripherals", "turtle.advancedperipherals.chatty_turtle": "Chatty", diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json index 21855bf71..4da55fb18 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/distance_detector.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:distance_detector" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json index 731bc1f02..a57de0eab 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/fluid_detector.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:fluid_detector" } ], diff --git a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json index dadeb8bc5..be3a1af68 100644 --- a/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json +++ b/src/generated/resources/data/advancedperipherals/loot_tables/blocks/gas_detector.json @@ -11,6 +11,12 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], "name": "advancedperipherals:gas_detector" } ], diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 8f9cf40b9..67218e709 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -1,20 +1,20 @@ { "values": [ - "advancedperipherals:environment_detector", + "advancedperipherals:block_reader", "advancedperipherals:chat_box", - "advancedperipherals:player_detector", - "advancedperipherals:me_bridge", - "advancedperipherals:rs_bridge", + "advancedperipherals:colony_integrator", + "advancedperipherals:distance_detector", "advancedperipherals:energy_detector", + "advancedperipherals:environment_detector", "advancedperipherals:fluid_detector", "advancedperipherals:gas_detector", - "advancedperipherals:peripheral_casing", - "advancedperipherals:inventory_manager", - "advancedperipherals:redstone_integrator", - "advancedperipherals:block_reader", "advancedperipherals:geo_scanner", - "advancedperipherals:colony_integrator", + "advancedperipherals:inventory_manager", + "advancedperipherals:me_bridge", "advancedperipherals:nbt_storage", - "advancedperipherals:distance_detector" + "advancedperipherals:peripheral_casing", + "advancedperipherals:player_detector", + "advancedperipherals:redstone_integrator", + "advancedperipherals:rs_bridge" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json index dcf31c50c..5a4f0e2b8 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json @@ -1,19 +1,19 @@ { "values": [ - "advancedperipherals:environment_detector", + "advancedperipherals:block_reader", "advancedperipherals:chat_box", - "advancedperipherals:player_detector", - "advancedperipherals:me_bridge", - "advancedperipherals:rs_bridge", + "advancedperipherals:colony_integrator", + "advancedperipherals:distance_detector", "advancedperipherals:energy_detector", + "advancedperipherals:environment_detector", "advancedperipherals:fluid_detector", "advancedperipherals:gas_detector", - "advancedperipherals:inventory_manager", - "advancedperipherals:redstone_integrator", - "advancedperipherals:block_reader", "advancedperipherals:geo_scanner", - "advancedperipherals:colony_integrator", + "advancedperipherals:inventory_manager", + "advancedperipherals:me_bridge", "advancedperipherals:nbt_storage", - "advancedperipherals:distance_detector" + "advancedperipherals:player_detector", + "advancedperipherals:redstone_integrator", + "advancedperipherals:rs_bridge" ] } \ No newline at end of file From b5d068613ecd3f0f0f71222aa26ad2890ecaa84c Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 15:59:56 -0700 Subject: [PATCH 135/188] fix capitalization issue --- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +-- .../advancedperipherals/lang/en_us.json | 20 ++++++------ .../common/data/EnUsLanguageProvider.java | 32 ++++++++++--------- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index 581e50650..e9f92dc08 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2025-01-16T15:46:41.860244 Languages: en_us -bada6e2fe518841aa8104157f11ddea10e076ea9 assets/advancedperipherals/lang/en_us.json +// 1.19.2 2025-01-16T15:59:34.693839 Languages: en_us +d0fe3ab5a88d6b925369860038c76f23d9910143 assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index c6d723fcd..014212826 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -2,19 +2,19 @@ "advancedperipherals.name": "Advanced Peripherals", "advancements.advancedperipherals.base_toolkit": "Gentleman's set!", "advancements.advancedperipherals.base_toolkit.description": "Collect a redstone integrator, inventory manager and energy detector. How did you even play without this?", - "advancements.advancedperipherals.end_automata_core": "End automata core", + "advancements.advancedperipherals.end_automata_core": "End Automata Core", "advancements.advancedperipherals.end_automata_core.description": "If you can code gps-free position location with this, you're a powerful human being", - "advancements.advancedperipherals.husbandry_automata_core": "Husbandry automata core", + "advancements.advancedperipherals.husbandry_automata_core": "Husbandry Automata Core", "advancements.advancedperipherals.husbandry_automata_core.description": "Is this core gluten-free?", "advancements.advancedperipherals.nbt_toolkit": "No secrets", "advancements.advancedperipherals.nbt_toolkit.description": "Collect a NBT storage and block reader. Now, all the world's secrets are open to you!", - "advancements.advancedperipherals.overpowered_automata_core": "Overpowered automata core", + "advancements.advancedperipherals.overpowered_automata_core": "Overpowered Automata Core", "advancements.advancedperipherals.overpowered_automata_core.description": "Can you handle so much power?", "advancements.advancedperipherals.root": "Advanced Peripherals", "advancements.advancedperipherals.root.description": "Every journey starts with the first block", "advancements.advancedperipherals.sense_toolkit": "The truth can't hide forever", "advancements.advancedperipherals.sense_toolkit.description": "Collect a geo scanner and environmental detector. There are no limits for observability!", - "advancements.advancedperipherals.weak_automata_core": "First automata core", + "advancements.advancedperipherals.weak_automata_core": "First Automata Core", "advancements.advancedperipherals.weak_automata_core.description": "Does the afterlife exist in minecraft?", "block.advancedperipherals.block_reader": "Block Reader", "block.advancedperipherals.chat_box": "Chat Box", @@ -91,14 +91,14 @@ "turtle.advancedperipherals.chatty_turtle": "Chatty", "turtle.advancedperipherals.chunky_turtle": "Chunky", "turtle.advancedperipherals.compass_turtle": "Compass", - "turtle.advancedperipherals.end_automata": "End automata", + "turtle.advancedperipherals.end_automata": "End Automata", "turtle.advancedperipherals.environment_turtle": "Environment", "turtle.advancedperipherals.geoscanner_turtle": "Geo", - "turtle.advancedperipherals.husbandry_automata": "Husbandry automata", - "turtle.advancedperipherals.overpowered_end_automata": "Overpowered end automata", - "turtle.advancedperipherals.overpowered_husbandry_automata": "Overpowered husbandry automata", - "turtle.advancedperipherals.overpowered_weak_automata": "Overpowered weak automata", + "turtle.advancedperipherals.husbandry_automata": "Husbandry Automata", + "turtle.advancedperipherals.overpowered_end_automata": "Overpowered End Automata", + "turtle.advancedperipherals.overpowered_husbandry_automata": "Overpowered Husbandry Automata", + "turtle.advancedperipherals.overpowered_weak_automata": "Overpowered Weak Automata", "turtle.advancedperipherals.player_turtle": "Player Detector", "turtle.advancedperipherals.saddle_turtle": "Saddle", - "turtle.advancedperipherals.weak_automata": "Weak automata" + "turtle.advancedperipherals.weak_automata": "Weak Automata" } \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index 9c2a79bd9..9627a4912 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -43,18 +43,19 @@ protected void addTranslations() { private void addItems() { addItem(APItems.CHUNK_CONTROLLER, "Chunk Controller"); addItem(APItems.COMPUTER_TOOL, "Computer Tool"); - addItem(APItems.END_AUTOMATA_CORE, "End Automata Core"); addItem(APItems.HOTKEY_MODULE, "Hotkey Module"); - addItem(APItems.HUSBANDRY_AUTOMATA_CORE, "Husbandry Automata Core"); addItem(APItems.MEMORY_CARD, "Memory Card"); addItem(APItems.NIGHT_VISION_MODULE, "Night Vision Module"); addItem(APItems.OVERLAY_MODULE, "Overlay Module"); - addItem(APItems.OVERPOWERED_END_AUTOMATA_CORE, "Overpowered End Automata Core"); - addItem(APItems.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE, "Overpowered Husbandry Automata Core"); - addItem(APItems.OVERPOWERED_WEAK_AUTOMATA_CORE, "Overpowered Weak Automata Core"); addItem(APItems.SMART_GLASSES, "Smart Glasses"); addItem(APItems.SMART_GLASSES_INTERFACE, "Smart Glasses Interface"); addItem(APItems.SMART_GLASSES_NETHERITE, "Netherite reinforced Smart Glasses"); + + addItem(APItems.END_AUTOMATA_CORE, "End Automata Core"); + addItem(APItems.HUSBANDRY_AUTOMATA_CORE, "Husbandry Automata Core"); + addItem(APItems.OVERPOWERED_END_AUTOMATA_CORE, "Overpowered End Automata Core"); + addItem(APItems.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE, "Overpowered Husbandry Automata Core"); + addItem(APItems.OVERPOWERED_WEAK_AUTOMATA_CORE, "Overpowered Weak Automata Core"); addItem(APItems.WEAK_AUTOMATA_CORE, "Weak Automata Core"); } @@ -81,16 +82,17 @@ private void addTurtles() { addTurtle(CCRegistration.ID.CHATTY_TURTLE, "Chatty"); addTurtle(CCRegistration.ID.CHUNKY_TURTLE, "Chunky"); addTurtle(CCRegistration.ID.COMPASS_TURTLE, "Compass"); - addTurtle(CCRegistration.ID.END_AUTOMATA, "End automata"); addTurtle(CCRegistration.ID.ENVIRONMENT_TURTLE, "Environment"); addTurtle(CCRegistration.ID.GEOSCANNER_TURTLE, "Geo"); - addTurtle(CCRegistration.ID.HUSBANDRY_AUTOMATA, "Husbandry automata"); - addTurtle(CCRegistration.ID.OP_END_AUTOMATA, "Overpowered end automata"); - addTurtle(CCRegistration.ID.OP_HUSBANDRY_AUTOMATA, "Overpowered husbandry automata"); - addTurtle(CCRegistration.ID.OP_WEAK_AUTOMATA, "Overpowered weak automata"); addTurtle(CCRegistration.ID.PLAYER_TURTLE, "Player Detector"); addTurtle(CCRegistration.ID.SADDLE_TURTLE, "Saddle"); - addTurtle(CCRegistration.ID.WEAK_AUTOMATA, "Weak automata"); + + addTurtle(CCRegistration.ID.END_AUTOMATA, "End Automata"); + addTurtle(CCRegistration.ID.HUSBANDRY_AUTOMATA, "Husbandry Automata"); + addTurtle(CCRegistration.ID.OP_END_AUTOMATA, "Overpowered End Automata"); + addTurtle(CCRegistration.ID.OP_HUSBANDRY_AUTOMATA, "Overpowered Husbandry Automata"); + addTurtle(CCRegistration.ID.OP_WEAK_AUTOMATA, "Overpowered Weak Automata"); + addTurtle(CCRegistration.ID.WEAK_AUTOMATA, "Weak Automata"); } private void addPockets() { @@ -108,10 +110,10 @@ private void addAdvancements() { addAdvancement("nbt_toolkit", "No secrets", "Collect a NBT storage and block reader. Now, all the world's secrets are open to you!"); addAdvancement("sense_toolkit", "The truth can't hide forever", "Collect a geo scanner and environmental detector. There are no limits for observability!"); - addAdvancement("end_automata_core", "End automata core", "If you can code gps-free position location with this, you're a powerful human being"); - addAdvancement("husbandry_automata_core", "Husbandry automata core", "Is this core gluten-free?"); - addAdvancement("overpowered_automata_core", "Overpowered automata core", "Can you handle so much power?"); - addAdvancement("weak_automata_core", "First automata core", "Does the afterlife exist in minecraft?"); + addAdvancement("end_automata_core", "End Automata Core", "If you can code gps-free position location with this, you're a powerful human being"); + addAdvancement("husbandry_automata_core", "Husbandry Automata Core", "Is this core gluten-free?"); + addAdvancement("overpowered_automata_core", "Overpowered Automata Core", "Can you handle so much power?"); + addAdvancement("weak_automata_core", "First Automata Core", "Does the afterlife exist in minecraft?"); } private void addTooltips() { From d064e078de031339273cebadfead43e645fb60e4 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 16:10:03 -0700 Subject: [PATCH 136/188] != --- .../common/addons/computercraft/owner/IPeripheralOwner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java index aa27af5cd..2dd333a9d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java @@ -74,6 +74,6 @@ default void attachOperation(Collection> operations) { T getConnectedPeripheral(Class type); default boolean hasConnectedPeripheral(Class type) { - return getConnectedPeripheral(type) == null; + return getConnectedPeripheral(type) != null; } } From 736ff91d06f3cbc55d46c6c799594d7330be01f7 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 16:18:16 -0700 Subject: [PATCH 137/188] add doc for updateBlock --- .../plugins/AutomataBlockHandPlugin.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java index 692e0a65d..4c3727bf2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java @@ -95,8 +95,21 @@ public final MethodResult useOnBlock(@NotNull IArguments arguments) throws LuaEx }); } + /** + * updateBlock method let turtle update specific block's status. + * It require a compass to be equipped to perform actions. + * + * @param options A table contains where to find the block and how to update the block + * yaw: relative yaw + * pitch: relative pitch + * + * text: the text going to write if the target is a sign. + */ @LuaFunction(mainThread = true) public final MethodResult updateBlock(@NotNull IArguments arguments) throws LuaException { + if (!automataCore.getPeripheralOwner().hasConnectedPeripheral(CompassPeripheral.class)) { + return MethodResult.of(false, "COMPASS_NOT_EQUIPPED"); + } Map opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; @@ -138,7 +151,7 @@ private InteractionResult updateBlock(APFakePlayer player, Map options) { /** * placeBlock method will let turtle place a block with more details when compass has equipped. - * It should not able to place fluids / use any item, because compass do not recognize them. + * It should not able to place fluids / use any item, because compass does not recognize them. * * @param options A table contains how to place the block: * x: the x offset relative to the turtle. Default 0 From 39d331b41c68ca17797fd2be28743dbf82c35e22 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 16:23:06 -0700 Subject: [PATCH 138/188] remove A whitespace --- .../peripheral/plugins/AutomataBlockHandPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java index 4c3727bf2..35170f91a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java @@ -102,7 +102,7 @@ public final MethodResult useOnBlock(@NotNull IArguments arguments) throws LuaEx * @param options A table contains where to find the block and how to update the block * yaw: relative yaw * pitch: relative pitch - * + * * text: the text going to write if the target is a sign. */ @LuaFunction(mainThread = true) From 8fc4714c958a13ba0155af0809740411a9126d30 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 16:42:15 -0700 Subject: [PATCH 139/188] add UPDATE_BLOCK operation --- .../addons/computercraft/operations/SingleOperation.java | 1 + .../peripheral/plugins/AutomataBlockHandPlugin.java | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java index f2075d2a4..980c329b9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/operations/SingleOperation.java @@ -10,6 +10,7 @@ public enum SingleOperation implements IPeripheralOperation { DIG(1000, 1), USE_ON_BLOCK(5000, 1), + UPDATE_BLOCK(500, 1), SUCK(1000, 1), USE_ON_ANIMAL(2500, 10), CAPTURE_ANIMAL(50_000, 100), diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java index 35170f91a..6e6f23e2a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java @@ -41,9 +41,10 @@ import java.util.Collections; import java.util.Map; +import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.ACCURE_PLACE; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.DIG; +import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.UPDATE_BLOCK; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.USE_ON_BLOCK; -import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SingleOperation.ACCURE_PLACE; public class AutomataBlockHandPlugin extends AutomataCorePlugin { @@ -113,7 +114,7 @@ public final MethodResult updateBlock(@NotNull IArguments arguments) throws LuaE Map opts = arguments.count() > 0 ? arguments.getTable(0) : Collections.emptyMap(); float yaw = opts != null ? (float) TableHelper.optNumberField(opts, "yaw", 0) : 0; float pitch = opts != null ? (float) TableHelper.optNumberField(opts, "pitch", 0) : 0; - return automataCore.withOperation(USE_ON_BLOCK, context -> { + return automataCore.withOperation(UPDATE_BLOCK, context -> { TurtlePeripheralOwner owner = automataCore.getPeripheralOwner(); ItemStack selectedTool = owner.getToolInMainHand(); int previousDamageValue = selectedTool.getDamageValue(); From 4ce3f365178a2885945d18cb291102bf5dd2bffd Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 17:18:57 -0700 Subject: [PATCH 140/188] canOverpowerAction -> canActiveOverpower --- .../metaphysics/OverpoweredEndAutomataCorePeripheral.java | 2 +- .../OverpoweredHusbandryAutomataCorePeripheral.java | 2 +- .../metaphysics/OverpoweredWeakAutomataCorePeripheral.java | 2 +- .../peripheral/plugins/AutomataBlockHandPlugin.java | 6 +++--- .../peripheral/plugins/AutomataEntityHandPlugin.java | 2 +- .../lib/peripherals/AutomataCorePeripheral.java | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java index ad2fd2f70..c925da8c1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredEndAutomataCorePeripheral.java @@ -13,7 +13,7 @@ public OverpoweredEndAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide sid } @Override - public boolean canOverpowerAction() { + public boolean canActiveOverpower() { return true; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java index fe4eaf449..2fee520d5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredHusbandryAutomataCorePeripheral.java @@ -13,7 +13,7 @@ public OverpoweredHusbandryAutomataCorePeripheral(ITurtleAccess turtle, TurtleSi } @Override - public boolean canOverpowerAction() { + public boolean canActiveOverpower() { return true; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java index 7f8e406ae..d8ed7a2c7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/metaphysics/OverpoweredWeakAutomataCorePeripheral.java @@ -13,7 +13,7 @@ public OverpoweredWeakAutomataCorePeripheral(ITurtleAccess turtle, TurtleSide si } @Override - public boolean canOverpowerAction() { + public boolean canActiveOverpower() { return true; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java index a823674c6..f7a89c5d5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java @@ -71,7 +71,7 @@ public final MethodResult digBlock(@NotNull IArguments arguments) throws LuaExce if (!result.getLeft()) { return MethodResult.of(false, result.getRight()); } - if (automataCore.canOverpowerAction() && automataCore.afterOverpowerAction()) { + if (automataCore.canActiveOverpower() && automataCore.afterOverpowerAction()) { selectedTool.setDamageValue(previousDamageValue); } return MethodResult.of(true, result.getRight()); @@ -89,7 +89,7 @@ public final MethodResult useOnBlock(@NotNull IArguments arguments) throws LuaEx ItemStack selectedTool = owner.getToolInMainHand(); int previousDamageValue = selectedTool.getDamageValue(); InteractionResult result = owner.withPlayer(APFakePlayer.wrapActionWithShiftKey(sneak, APFakePlayer.wrapActionWithRot(yaw, pitch, APFakePlayer::useOnBlock))); - if (result.consumesAction() && automataCore.canOverpowerAction() && automataCore.afterOverpowerAction()) { + if (result.consumesAction() && automataCore.canActiveOverpower() && automataCore.afterOverpowerAction()) { selectedTool.setDamageValue(previousDamageValue); } return MethodResult.of(result.consumesAction(), result.toString()); @@ -119,7 +119,7 @@ public final MethodResult updateBlock(@NotNull IArguments arguments) throws LuaE ItemStack selectedTool = owner.getToolInMainHand(); int previousDamageValue = selectedTool.getDamageValue(); InteractionResult result = owner.withPlayer(APFakePlayer.wrapActionWithRot(yaw, pitch, (player) -> this.updateBlock(player, opts))); - if (result.consumesAction() && automataCore.canOverpowerAction() && automataCore.afterOverpowerAction()) { + if (result.consumesAction() && automataCore.canActiveOverpower() && automataCore.afterOverpowerAction()) { selectedTool.setDamageValue(previousDamageValue); } return MethodResult.of(result.consumesAction(), result.toString()); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java index 4b40d26a2..b7ab0aba4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java @@ -53,7 +53,7 @@ public final MethodResult useOnAnimal(@NotNull IArguments arguments) throws LuaE ItemStack selectedTool = owner.getToolInMainHand(); int previousDamageValue = selectedTool.getDamageValue(); InteractionResult result = owner.withPlayer(APFakePlayer.wrapActionWithShiftKey(sneak, APFakePlayer.wrapActionWithRot(yaw, pitch, p -> p.useOnFilteredEntity(suitableEntity)))); - if (automataCore.canOverpowerAction() && automataCore.afterOverpowerAction()) { + if (automataCore.canActiveOverpower() && automataCore.afterOverpowerAction()) { selectedTool.setDamageValue(previousDamageValue); } return MethodResult.of(result.consumesAction(), result.toString()); diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java index c2c61c7aa..097e855d4 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java @@ -89,14 +89,14 @@ public boolean isDestroyed() { return this.destroyed; } - public boolean canOverpowerAction() { + public boolean canActiveOverpower() { return false; } public abstract double getBreakChance(); public boolean afterOverpowerAction() { - if (isDestroyed() || !canOverpowerAction()) { + if (isDestroyed() || !canActiveOverpower()) { return false; } if (AdvancedPeripherals.RANDOM.nextDouble() <= getBreakChance()) { From c2907bb59ff498c1ddfaaa82501654fb039aca13 Mon Sep 17 00:00:00 2001 From: Srendi Date: Fri, 17 Jan 2025 01:35:14 +0100 Subject: [PATCH 141/188] Crafting CPU `storage` -> `requestedItem` --- .../common/addons/appliedenergistics/AppEngApi.java | 2 +- .../addons/computercraft/peripheral/MeBridgePeripheral.java | 4 ++-- .../addons/computercraft/peripheral/RsBridgePeripheral.java | 4 ++-- .../common/util/inventory/IStorageSystemPeripheral.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java index d9e22e903..fbd53e35b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java @@ -402,7 +402,7 @@ public static Map parseCraftingCPU(ICraftingCPU cpu, boolean rec public static Map parseCraftingJob(CraftingJobStatus job, @Nullable ICraftingCPU cpu) { Map map = new HashMap<>(); - map.put("storage", parseGenericStack(job.crafting())); + map.put("requestedItem", parseGenericStack(job.crafting())); map.put("elapsedTimeNanos", job.elapsedTimeNanos()); map.put("totalItem", job.totalItems()); map.put("progress", job.progress()); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java index f6bb25cea..4a535157d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java @@ -628,7 +628,7 @@ public MethodResult craftChemical(IComputerAccess computer, IArguments arguments @Override @LuaFunction(mainThread = true) - public MethodResult getCraftingTasks() { + public MethodResult getCraftingJobs() { if (!isAvailable()) return notConnected(); @@ -645,7 +645,7 @@ public MethodResult getCraftingTasks() { @Override @LuaFunction(mainThread = true) - public MethodResult cancelCraftingTasks(IArguments arguments) { + public MethodResult cancelCraftingJobs(IArguments arguments) { if (!isAvailable()) return notConnected(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java index 9ece08fa6..98a51ff41 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java @@ -625,7 +625,7 @@ public MethodResult craftChemical(IComputerAccess computer, IArguments arguments @Override @LuaFunction(mainThread = true) - public MethodResult getCraftingTasks() { + public MethodResult getCraftingJobs() { if (!isAvailable()) return notConnected(); @@ -634,7 +634,7 @@ public MethodResult getCraftingTasks() { @Override @LuaFunction(mainThread = true) - public MethodResult cancelCraftingTasks(IArguments arguments) throws LuaException { + public MethodResult cancelCraftingJobs(IArguments arguments) throws LuaException { if (!isAvailable()) return notConnected(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java index 95190518c..216d9eb04 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java @@ -105,9 +105,9 @@ public interface IStorageSystemPeripheral { MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult getCraftingTasks(); + MethodResult getCraftingJobs(); - MethodResult cancelCraftingTasks(IArguments arguments) throws LuaException; + MethodResult cancelCraftingJobs(IArguments arguments) throws LuaException; MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException; From 4f5df918610719d76145a860e6a527998eb4e394 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 23:28:42 -0700 Subject: [PATCH 142/188] fix saddle turtle teleport between dimesions --- .../peripheral/ChunkyPeripheral.java | 6 ++ .../peripheral/MeBridgePeripheral.java | 2 +- .../peripheral/SaddlePeripheral.java | 68 +++++++++----- .../blockentities/DistanceDetectorEntity.java | 10 +- .../common/commands/APCommands.java | 3 + .../common/entity/TurtleSeatEntity.java | 29 ++++-- .../common/setup/APEntities.java | 6 +- .../common/util/ChunkManager.java | 12 ++- .../common/util/HitResultUtil.java | 45 ++++----- .../common/util/TeleportUtil.java | 39 ++++++++ .../common/util/fakeplayer/APFakePlayer.java | 91 ++++++++----------- .../peripherals/AutomataCorePeripheral.java | 7 ++ 12 files changed, 201 insertions(+), 117 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java index f56d18151..428574bcb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; +import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; @@ -44,6 +45,11 @@ public boolean isEnabled() { return APConfig.PERIPHERALS_CONFIG.enableChunkyTurtle.get(); } + @LuaFunction + public int getRadius() { + return ChunkManager.getMaxLoadRadius(); + } + public void updateChunkState() { // TODO: should find someway to update after turtle moved or while moving, but not every tick ServerLevel level = (ServerLevel) getLevel(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java index f6bb25cea..fd72bf43a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java @@ -46,7 +46,7 @@ public class MeBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral { - public static final String PERIPHERAL_TYPE = "meBridge"; + public static final String PERIPHERAL_TYPE = "me_bridge"; private final MeBridgeEntity tile; private IGridNode node; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 68c965e63..753548f18 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -14,8 +14,11 @@ import de.srendi.advancedperipherals.common.network.APNetworking; import de.srendi.advancedperipherals.common.network.toclient.SaddleTurtleInfoPacket; import de.srendi.advancedperipherals.common.util.LuaConverter; +import de.srendi.advancedperipherals.common.util.TeleportUtil; +import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -68,7 +71,7 @@ public boolean isEntityRiding() { @Override public void attach(@NotNull IComputerAccess computer) { super.attach(computer); - this.lastPos = owner.getPos(); + this.lastPos = this.owner.getPos(); } @Override @@ -84,19 +87,28 @@ public void update() { return; } this.seat.keepAlive(); - BlockPos pos = owner.getPos(); - BlockPos dir = pos.subtract(this.lastPos); - int dist = Math.abs(dir.getX()) + Math.abs(dir.getY()) + Math.abs(dir.getZ()); - if (dist != 0) { - Vec3 newPos = new Vec3(pos.getX() + 0.5, pos.getY() + 0.4, pos.getZ() + 0.5); - if (dist == 1 && ++this.moveProg < ANIM_DURATION) { - float step = ((float) this.moveProg) / ANIM_DURATION; - newPos = newPos.add(Vec3.atLowerCornerOf(dir).scale(step - 1)); - } else { - this.moveProg = 0; - this.lastPos = pos; + BlockPos pos = this.owner.getPos(); + Level level = this.owner.getLevel(); + if (this.seat.getLevel() != this.owner.getLevel()) { + this.seat = TeleportUtil.teleportToWithPassengers(this.seat, (ServerLevel) level, this.seat.getTurtlePos()); + this.seat.setTurtle(this.owner.getTurtle()); + this.seat.keepAlive(); + this.moveProg = 0; + this.lastPos = pos; + } else { + BlockPos dir = pos.subtract(this.lastPos); + int dist = Math.abs(dir.getX()) + Math.abs(dir.getY()) + Math.abs(dir.getZ()); + if (dist != 0) { + Vec3 newPos = this.seat.getTurtlePos(); + if (dist == 1 && ++this.moveProg < ANIM_DURATION) { + float step = ((float) this.moveProg) / ANIM_DURATION; + newPos = newPos.add(Vec3.atLowerCornerOf(dir).scale(step - 1)); + } else { + this.moveProg = 0; + this.lastPos = pos; + } + this.seat.moveTo(newPos); } - this.seat.moveTo(newPos.x(), newPos.y(), newPos.z()); } this.tickCount++; if (this.tickCount > 40) { @@ -108,21 +120,20 @@ public void update() { private void sendHUD() { if (this.rider instanceof ServerPlayer player) { - ITurtleAccess turtle = owner.getTurtle(); + ITurtleAccess turtle = this.owner.getTurtle(); SaddleTurtleInfoPacket packet = new SaddleTurtleInfoPacket(turtle.getFuelLevel(), turtle.getFuelLimit(), barColor); APNetworking.sendTo(packet, player); } } private boolean sitDown(@NotNull Entity entity) { - Level world = owner.getLevel(); - BlockPos pos = owner.getPos(); - this.seat = new TurtleSeatEntity(owner.getTurtle()); - this.seat.setPos(pos.getX() + 0.5, pos.getY() + 0.4, pos.getZ() + 0.5); + Level world = this.owner.getLevel(); + this.seat = new TurtleSeatEntity(this.owner.getTurtle()); + this.seat.setPos(this.seat.getTurtlePos()); if (!world.addFreshEntity(this.seat)) { return false; } - if (!entity.startRiding(this.seat, true)) { + if (!entity.startRiding(this.seat)) { return false; } if (entity instanceof TamableAnimal tamable) { @@ -138,14 +149,19 @@ private boolean standUp() { if (this.seat == null) { return false; } - boolean isVehicle = this.seat.isVehicle(); + Entity passenger = this.seat.getFirstPassenger(); + if (passenger != null) { + this.seat.ejectPassengers(); + BlockPos pos = this.owner.getPos(); + passenger.dismountTo(pos.getX() + 0.5, pos.getY() + 0.9, pos.getZ() + 0.5); + } this.seat.discard(); this.seat = null; this.rider = null; if (owner.getTurtle() instanceof TurtleBrain brain) { brain.getOwner().createServerComputer().queueEvent("saddle_release"); } - return isVehicle; + return passenger != null; } @LuaFunction(mainThread = true) @@ -154,14 +170,18 @@ public MethodResult capture() throws LuaException { return MethodResult.of(null, "Another entity is riding"); } return withOperation(SADDLE_CAPTURE, null, null, context -> { - Predicate suitableEntity = (entity) -> entity.isAlive(); + Predicate suitableEntity = Entity::isAlive; if (!APConfig.PERIPHERALS_CONFIG.allowSaddleTurtleCapturePlayer.get()) { suitableEntity = suitableEntity.and((entity) -> !(entity instanceof Player)); } final Predicate finalSuitableEntity = suitableEntity; - HitResult entityHit = owner.withPlayer(player -> player.findHit(false, true, finalSuitableEntity)); + final APFakePlayer.Action action = (player) -> player.findHit(false, true, finalSuitableEntity); + HitResult entityHit = owner.withPlayer(action); if (entityHit.getType() == HitResult.Type.MISS) { - return MethodResult.of(null, "Nothing found"); + entityHit = owner.withPlayer(APFakePlayer.wrapActionWithReachRange(1, APFakePlayer.wrapActionWithRot(0, -90, action))); + if (entityHit.getType() == HitResult.Type.MISS) { + return MethodResult.of(null, "Nothing found"); + } } LivingEntity entity = (LivingEntity) ((EntityHitResult) entityHit).getEntity(); if (!sitDown(entity)) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 2a719f949..89ee03b4d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -212,7 +212,7 @@ public double calculateDistance() { Vec3 from = center; Vec3 to = from.add(direction.x * maxRange, direction.y * maxRange, direction.z * maxRange); - HitResult result = this.getHitResult(to, from); + HitResult result = this.getHitResult(from, to); if (result.getType() == HitResult.Type.MISS) { return -1; } @@ -225,12 +225,12 @@ public double calculateAndUpdateDistance() { return distance; } - private HitResult getHitResult(Vec3 to, Vec3 from) { + private HitResult getHitResult(Vec3 from, Vec3 to) { Level level = this.getLevel(); return switch (this.detectionType) { - case ENTITY -> HitResultUtil.getEntityHitResult(to, from, level); - case BLOCK -> HitResultUtil.getBlockHitResult(to, from, level, this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, this.getBlockPos()); - case BOTH -> HitResultUtil.getHitResult(to, from, level, this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, this.getBlockPos()); + case ENTITY -> HitResultUtil.getEntityHitResult(from, to, level); + case BLOCK -> HitResultUtil.getBlockHitResult(from, to, level, this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, this.getBlockPos()); + case BOTH -> HitResultUtil.getHitResult(from, to, level, this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, this.getBlockPos()); }; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java b/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java index ae08e1ec9..a8519c562 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java +++ b/src/main/java/de/srendi/advancedperipherals/common/commands/APCommands.java @@ -13,6 +13,7 @@ import dan200.computercraft.shared.computer.core.ServerContext; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.ChunkyPeripheral; +import de.srendi.advancedperipherals.common.util.ChunkManager; import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; @@ -102,6 +103,8 @@ private static int forceloadDump(CommandSourceStack source) throws CommandSyntax ); } + ChunkManager manager = ChunkManager.get(source.getServer().overworld()); + source.sendSuccess(Component.literal("Forced " + manager.getForcedChunksCount() + " chunks"), true); table.display(source); return computers.length; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index f8fc1c492..a944ce34a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -16,6 +16,7 @@ import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.HasCustomInventoryScreen; @@ -26,6 +27,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.level.portal.PortalInfo; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; @@ -34,8 +36,8 @@ public class TurtleSeatEntity extends Entity implements HasCustomInventoryScreen // TODO: better rendering - private ITurtleAccess turtle; - private int life; + private ITurtleAccess turtle = null; + private int life = 0; private boolean forwardKey = false; private boolean backKey = false; @@ -58,7 +60,10 @@ public TurtleSeatEntity(EntityType type, Level world) { public TurtleSeatEntity(ITurtleAccess turtle) { this(APEntities.TURTLE_SEAT.get(), turtle.getLevel()); this.turtle = turtle; - this.life = 0; + } + + public void setTurtle(ITurtleAccess turtle) { + this.turtle = turtle; } public ITurtleAccess getOwner() { @@ -81,6 +86,11 @@ public void keepAlive() { this.life = 2; } + public Vec3 getTurtlePos() { + BlockPos pos = this.turtle.getPosition(); + return new Vec3(pos.getX() + 0.5, pos.getY() + 0.4, pos.getZ() + 0.5); + } + @Override public Packet getAddEntityPacket() { return new ClientboundAddEntityPacket(this); @@ -123,13 +133,13 @@ protected void removePassenger(Entity entity) { } @Override - public Vec3 getDismountLocationForPassenger(LivingEntity entity) { - return super.getDismountLocationForPassenger(entity).add(0, 0.5, 0); + public Entity getControllingPassenger() { + return null; // this.getFirstPassenger(); } @Override - public Entity getControllingPassenger() { - return null; // this.getFirstPassenger(); + public double getPassengersRidingOffset() { + return 0.15; } @Override @@ -221,6 +231,11 @@ public boolean canChangeDimensions() { return false; } + @Override + public PortalInfo findDimensionEntryPoint(ServerLevel newLevel) { + return new PortalInfo(this.getTurtlePos(), Vec3.ZERO, 0, 0); + } + @Override public boolean shouldBlockExplode(net.minecraft.world.level.Explosion a0, net.minecraft.world.level.BlockGetter a1, BlockPos a2, BlockState a3, float a4) { return false; diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java index d9976225b..bf397531f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java @@ -18,14 +18,14 @@ public class APEntities { () -> EntityType.Builder.of(TurtleEnderPearl::new, MobCategory.MISC) .sized(0.5F, 0.5F) .clientTrackingRange(4) - .updateInterval(5) + .updateInterval(4) .fireImmune() .build("turtle_ender_pearl")); public static final RegistryObject> TURTLE_SEAT = APRegistration.ENTITIES.register("turtle_seat", () -> EntityType.Builder.of(TurtleSeatEntity::new, MobCategory.MISC) - .sized(0.8F, 0.2F) + .sized(0.8F, 0.4F) .clientTrackingRange(4) - .updateInterval(4) + .updateInterval(1) .fireImmune() .build("turtle_seat")); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java b/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java index 8a8ec7e89..238b16943 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/ChunkManager.java @@ -39,6 +39,10 @@ public ChunkManager() { super(); } + public static int getMaxLoadRadius() { + return APConfig.PERIPHERALS_CONFIG.chunkyTurtleRadius.get(); + } + public static @NotNull ChunkManager get(@NotNull ServerLevel level) { return level.getDataStorage().computeIfAbsent(ChunkManager::load, ChunkManager::new, DATA_NAME); } @@ -81,6 +85,10 @@ private static boolean unforceChunk(UUID owner, ServerLevel level, ChunkPos pos) return ForgeChunkManager.forceChunk(level, AdvancedPeripherals.MOD_ID, owner, pos.x, pos.z, false, true); } + public synchronized int getForcedChunksCount() { + return this.forcedChunks.size(); + } + public synchronized boolean addForceChunk(ServerLevel level, UUID owner, ChunkPos pos) { AdvancedPeripherals.debug("Trying to load forced chunk cluster " + pos, Level.WARN); LoadChunkRecord oldRecord = forcedChunks.get(owner); @@ -91,7 +99,7 @@ public synchronized boolean addForceChunk(ServerLevel level, UUID owner, ChunkPo } unforceChunkRecord(owner, oldRecord, oldLevel); } - final int chunkRadius = APConfig.PERIPHERALS_CONFIG.chunkyTurtleRadius.get(); + final int chunkRadius = getMaxLoadRadius(); forcedChunks.put(owner, new LoadChunkRecord(level.dimension().location().toString(), pos, chunkRadius)); setDirty(); boolean result = true; @@ -154,7 +162,7 @@ public synchronized void init() { initialized = true; AdvancedPeripherals.debug(String.format("Schedule chunk manager init, forcedChunks = %d", forcedChunks.size()), Level.WARN); - final int chunkRadius = APConfig.PERIPHERALS_CONFIG.chunkyTurtleRadius.get(); + final int chunkRadius = getMaxLoadRadius(); final Map levels = getServerLevels(); forcedChunks.forEach((uuid, value) -> { String dimensionName = value.getDimensionName(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java index 801937e2c..b03e05d77 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java @@ -4,6 +4,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; @@ -20,37 +21,38 @@ import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.function.Predicate; public class HitResultUtil { /** * This method is used to get the hit result of an entity from the start position of a block * - * @param to the target position/max position * @param from the source position like a block + * @param to the target position/max position * @param level the level * @param shapeGetter the block collision shape getter * @return the hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found */ @NotNull - public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, ClipContext.ShapeGetter shapeGetter) { - return getHitResult(to, from, level, shapeGetter, null); + public static HitResult getHitResult(Vec3 from, Vec3 to, Level level, ClipContext.ShapeGetter shapeGetter) { + return getHitResult(from, to, level, shapeGetter, null); } /** * This method is used to get the hit result of an entity from the start position of a block * - * @param to the target position/max position * @param from the source position like a block + * @param to the target position/max position * @param level the level * @param shapeGetter the block collision shape getter * @param source the source Entity/BlockPos that will be ignored * @return the hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found */ @NotNull - public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, ClipContext.ShapeGetter shapeGetter, Object source) { - EntityHitResult entityResult = getEntityHitResult(to, from, level, source instanceof Entity ? (Entity) source : null); - BlockHitResult blockResult = getBlockHitResult(to, from, level, shapeGetter, source instanceof BlockPos ? (BlockPos) source : null); + public static HitResult getHitResult(Vec3 from, Vec3 to, Level level, ClipContext.ShapeGetter shapeGetter, Object source) { + EntityHitResult entityResult = getEntityHitResult(from, to, level, source instanceof Entity ? (Entity) source : null, source instanceof Predicate ? (Predicate) source : EntitySelector.NO_SPECTATORS); + BlockHitResult blockResult = getBlockHitResult(from, to, level, shapeGetter, source instanceof BlockPos ? (BlockPos) source : null); if (entityResult.getType() == HitResult.Type.MISS) { if (blockResult.getType() == HitResult.Type.MISS) { @@ -73,14 +75,14 @@ public static HitResult getHitResult(Vec3 to, Vec3 from, Level level, ClipContex * this method uses one AABB made out of the two coordinates, this would also find any entities * which are not located in the ray you might want. {@link DistanceDetectorPeripheral#getDistance()} * - * @param to the target position/max position * @param from the source position like a block + * @param to the target position/max position * @param level the world * @return the entity hit result. An empty HitResult with {@link HitResult.Type#MISS} as type if nothing found */ @NotNull - public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level) { - return getEntityHitResult(to, from, level, null); + public static EntityHitResult getEntityHitResult(Vec3 from, Vec3 to, Level level) { + return getEntityHitResult(from, to, level, null, EntitySelector.NO_SPECTATORS); } /** @@ -89,17 +91,18 @@ public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level * this method uses one AABB made out of the two coordinates, this would also find any entities * which are not located in the ray you might want. {@link DistanceDetectorPeripheral#getDistance()} * - * @param to the target position/max position - * @param from the source position like a block - * @param level the world - * @param source the source Entity that will be ignored + * @param from the source position like a block + * @param to the target position/max position + * @param level the world + * @param source the source Entity that will be ignored + * @param entityFilter the entity filter * @return the entity hit result. An empty HitResult with {@link HitResult.Type#MISS} as type if nothing found */ @NotNull - public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level, Entity source) { + public static EntityHitResult getEntityHitResult(Vec3 from, Vec3 to, Level level, Entity source, Predicate entityFilter) { AABB checkingBox = new AABB(to, from); - List entities = level.getEntities(source, checkingBox, (entity) -> true); + List entities = level.getEntities(source, checkingBox, entityFilter); Entity nearestEntity = null; Vec3 hitPos = null; @@ -124,29 +127,29 @@ public static EntityHitResult getEntityHitResult(Vec3 to, Vec3 from, Level level /** * This method is used to get the hit result of a block from the start position of a block * - * @param to the target position/max position * @param from the source position + * @param to the target position/max position * @param level the world * @param shapeGetter the block collision shape getter * @return the block hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found */ @NotNull - public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, ClipContext.ShapeGetter shapeGetter) { - return getBlockHitResult(to, from, level, shapeGetter, null); + public static BlockHitResult getBlockHitResult(Vec3 from, Vec3 to, Level level, ClipContext.ShapeGetter shapeGetter) { + return getBlockHitResult(from, to, level, shapeGetter, null); } /** * This method is used to get the hit result of a block from the start position of a block * - * @param to the target position/max position * @param from the source position + * @param to the target position/max position * @param level the world * @param shapeGetter the block collision shape getter * @param source the source BlockPos that will be ignored * @return the block hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found */ @NotNull - public static BlockHitResult getBlockHitResult(Vec3 to, Vec3 from, Level level, ClipContext.ShapeGetter shapeGetter, BlockPos source) { + public static BlockHitResult getBlockHitResult(Vec3 from, Vec3 to, Level level, ClipContext.ShapeGetter shapeGetter, BlockPos source) { return level.clip(new AdvancedClipContext(from, to, shapeGetter, ClipContext.Fluid.NONE, null, source)); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java new file mode 100644 index 000000000..08a44213e --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java @@ -0,0 +1,39 @@ +package de.srendi.advancedperipherals.common.util; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public final class TeleportUtil { + private TeleportUtil() {} + + public static T teleportToWithPassengers(T entity, ServerLevel newLevel, Vec3 newPos) { + Vec3 oldPos = entity.position(); + List passengers = new ArrayList<>(entity.getPassengers()); + T newEntity; + if (entity instanceof ServerPlayer player) { + player.teleportTo(newLevel, newPos.x, newPos.y, newPos.z, player.getYRot(), player.getXRot()); + newEntity = entity; + } else { + newEntity = (T) entity.getType().create(newLevel); + if (newEntity == null) { + return null; + } + entity.ejectPassengers(); + newEntity.restoreFrom(entity); + newEntity.moveTo(newPos.x, newPos.y, newPos.z, newEntity.getYRot(), newEntity.getXRot()); + newLevel.addDuringTeleport(newEntity); + entity.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION); + } + for (Entity p : passengers) { + Entity newPassenger = teleportToWithPassengers(p, newLevel, p.position().subtract(oldPos).add(newPos)); + newPassenger.startRiding(newEntity, true); + } + return newEntity; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java index bc7c6bbf2..d6d8d5728 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java @@ -61,6 +61,7 @@ public class APFakePlayer extends FakePlayer { private BlockPos digPosition = null; private Block digBlock = null; private float currentDamage = 0; + private double reachRange = -1; public APFakePlayer(ServerLevel world, Entity owner, GameProfile profile) { super(world, profile != null && profile.isComplete() ? profile : PROFILE); @@ -140,6 +141,31 @@ public T doActionWithShiftKey(boolean shift, Action action) { } } + public static Action wrapActionWithReachRange(double range, Action action) { + return player -> player.doActionWithReachRange(range, action); + } + + public T doActionWithReachRange(double range, Action action) { + this.reachRange = range; + try { + return action.apply(this); + } finally { + this.reachRange = -1; + } + } + + public double getReachRange() { + AttributeInstance reachAttribute = this.getAttribute(ForgeMod.REACH_DISTANCE.get()); + if (reachAttribute == null) { + throw new IllegalArgumentException("How did this happened?"); + } + double range = reachAttribute.getValue(); + if (this.reachRange >= 0 && this.reachRange < range) { + range = this.reachRange; + } + return range; + } + public Pair digBlock() { Level world = getLevel(); HitResult hit = findHit(true, false); @@ -281,76 +307,33 @@ public HitResult findHit(boolean skipEntity, boolean skipBlock) { @NotNull public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predicate entityFilter) { - AttributeInstance reachAttribute = this.getAttribute(ForgeMod.REACH_DISTANCE.get()); - if (reachAttribute == null) - throw new IllegalArgumentException("How did this happened?"); - - double range = reachAttribute.getValue(); + double range = this.getReachRange(); Vec3 origin = new Vec3(this.getX(), this.getY(), this.getZ()); Vec3 look = this.getLookAngle(); Vec3 target = new Vec3(origin.x + look.x * range, origin.y + look.y * range, origin.z + look.z * range); - HitResult blockHit; + + BlockHitResult blockHit; if (skipBlock) { Direction traceDirection = Direction.getNearest(look.x, look.y, look.z); blockHit = BlockHitResult.miss(target, traceDirection, new BlockPos(target)); } else { - blockHit = HitResultUtil.getBlockHitResult(target, origin, level, ClipContext.Block.OUTLINE, this.source); + blockHit = HitResultUtil.getBlockHitResult(origin, target, level, ClipContext.Block.OUTLINE, this.source); } if (skipEntity) { return blockHit; } - List entities = level.getEntities(this, this.getBoundingBox().expandTowards(look.x * range, look.y * range, look.z * range).inflate(1), collidablePredicate); - - LivingEntity closestEntity = null; - Vec3 closestVec = null; - double closestDistance = blockHit.getType() == HitResult.Type.MISS ? range * range : distanceToSqr(blockHit.getLocation()); - for (Entity entityHit : entities) { - if (!(entityHit instanceof LivingEntity entity)) { - continue; - } + Predicate entitySelector = collidablePredicate.and(LivingEntity.class::isInstance).and((entity) -> !entity.isPassenger()); + if (entityFilter != null) { // TODO: maybe let entityFilter returns the priority of the entity, instead of only returns the closest one. - if (entityFilter != null && !entityFilter.test(entity)) { - continue; - } - - // Hit vehicle before passenger - if (entity.isPassenger()) { - continue; - } - - AABB box = entity.getBoundingBox(); - Vec3 clipVec; - if (box.contains(origin)) { - clipVec = origin; - } else { - clipVec = box.clip(origin, target).orElse(null); - if (clipVec == null) { - continue; - } - } - double distance = origin.distanceToSqr(clipVec); - // Ignore small enough distance - if (distance <= 1e-6) { - distance = 0; - } - if (distance > closestDistance) { - continue; - } - if (distance == closestDistance && closestEntity != null) { - // Hit larger entity before smaller - if (closestEntity.getBoundingBox().getSize() >= box.getSize()) { - continue; - } - } - closestEntity = entity; - closestVec = clipVec; - closestDistance = distance; + entitySelector.and(entityFilter); } - if (closestEntity != null) { - return new EntityHitResult(closestEntity, closestVec); + EntityHitResult entityHit = HitResultUtil.getEntityHitResult(origin, target, level, this, entitySelector); + if (entityHit.getType() == HitResult.Type.ENTITY) { + return entityHit; } + return blockHit; } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java index 097e855d4..4c38ed502 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/AutomataCorePeripheral.java @@ -14,9 +14,11 @@ import net.minecraft.core.Direction; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; public abstract class AutomataCorePeripheral extends BasePeripheral { private final IAutomataCoreTier tier; @@ -30,6 +32,11 @@ protected AutomataCorePeripheral(String type, ITurtleAccess turtle, TurtleSide s this.tier = tier; } + @Override + public Set getAdditionalTypes() { + return Collections.singleton("automata"); + } + public void addRotationCycle() { addRotationCycle(1); } From d80f7879069aafbc3c17b043c848455a84cefa40 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Thu, 16 Jan 2025 23:33:44 -0700 Subject: [PATCH 143/188] fix stylecheck --- .../advancedperipherals/common/entity/TurtleSeatEntity.java | 1 - .../de/srendi/advancedperipherals/common/util/TeleportUtil.java | 1 - .../common/util/fakeplayer/APFakePlayer.java | 2 -- 3 files changed, 4 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index a944ce34a..894a5c08d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -20,7 +20,6 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.HasCustomInventoryScreen; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java index 08a44213e..4fb83d282 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java @@ -6,7 +6,6 @@ import net.minecraft.world.phys.Vec3; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public final class TeleportUtil { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java index d6d8d5728..d770e300c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java @@ -32,7 +32,6 @@ import net.minecraft.world.level.block.StructureBlock; import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; @@ -46,7 +45,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; import java.util.UUID; import java.util.function.Predicate; From ad45ce2de50fd0735577bd3bb3f0929056702bcb Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 17 Jan 2025 09:53:33 -0700 Subject: [PATCH 144/188] adjust positions --- .../client/ClientEventSubscriber.java | 7 ++++--- .../client/screens/SaddleTurtleScreen.java | 9 ++++++++- .../computercraft/peripheral/SaddlePeripheral.java | 9 +++++++-- .../common/entity/TurtleSeatEntity.java | 10 ++++++++-- .../common/setup/APEntities.java | 2 +- .../common/util/TeleportUtil.java | 4 +++- .../common/util/fakeplayer/APFakePlayer.java | 14 +++++--------- 7 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java index 8b3d01dac..0dfeb5c28 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientEventSubscriber.java @@ -31,13 +31,14 @@ public static void renderingHuds(RenderGuiOverlayEvent.Pre event) { @SubscribeEvent public static void playerTryDismount(InputEvent.Key event) { Minecraft minecraft = Minecraft.getInstance(); - if (!minecraft.options.keyShift.matches(event.getKey(), event.getScanCode())) { + boolean isShift = minecraft.options.keyShift.matches(event.getKey(), event.getScanCode()); + if (!isShift) { return; } switch (event.getAction()) { case InputConstants.PRESS: sneaking = true; - if (ClientRegistry.SADDLE_TURTLE_OVERLAY.isPlayerMountedOnTurtle()) { + if (ClientRegistry.SADDLE_TURTLE_OVERLAY.isPlayerControllingTurtle()) { minecraft.options.keyShift.setDown(false); } break; @@ -65,7 +66,7 @@ public static void playerMounting(EntityMountEvent event) { @SubscribeEvent public static void playerMove(MovementInputUpdateEvent event) { - if (ClientRegistry.SADDLE_TURTLE_OVERLAY.isPlayerMountedOnTurtle()) { + if (ClientRegistry.SADDLE_TURTLE_OVERLAY.isPlayerControllingTurtle()) { Input input = event.getInput(); if (sneaking == lastSneak && lastInput != null) { if (lastInput.up == input.up && lastInput.down == input.down && lastInput.left == input.left && lastInput.right == input.right && lastInput.jumping == input.jumping) { diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java index 4fff59801..ce3bcc07b 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java @@ -45,6 +45,11 @@ protected int textWidth(FormattedCharSequence text) { return getFont().width(text); } + public static boolean isPlayerControllingTurtle() { + LocalPlayer player = Minecraft.getInstance().player; + return player != null && player.getVehicle() instanceof TurtleSeatEntity; + } + public static boolean isPlayerMountedOnTurtle() { LocalPlayer player = Minecraft.getInstance().player; return player != null && player.getRootVehicle() instanceof TurtleSeatEntity; @@ -143,6 +148,8 @@ public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int scr if (this.shouldRenderFuelBar()) { this.renderFuelBar(poseStack); } - this.renderDismountHint(poseStack); + if (isPlayerControllingTurtle()) { + this.renderDismountHint(poseStack); + } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 753548f18..3dc63ffb6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -21,8 +21,11 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.entity.vehicle.Boat; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; @@ -170,7 +173,9 @@ public MethodResult capture() throws LuaException { return MethodResult.of(null, "Another entity is riding"); } return withOperation(SADDLE_CAPTURE, null, null, context -> { - Predicate suitableEntity = Entity::isAlive; + Predicate suitableEntity = EntitySelector.NO_SPECTATORS + .and((entity) -> entity instanceof LivingEntity || entity instanceof AbstractMinecart || entity instanceof Boat) + .and((entity) -> !entity.isPassenger()); if (!APConfig.PERIPHERALS_CONFIG.allowSaddleTurtleCapturePlayer.get()) { suitableEntity = suitableEntity.and((entity) -> !(entity instanceof Player)); } @@ -183,7 +188,7 @@ public MethodResult capture() throws LuaException { return MethodResult.of(null, "Nothing found"); } } - LivingEntity entity = (LivingEntity) ((EntityHitResult) entityHit).getEntity(); + Entity entity = ((EntityHitResult) entityHit).getEntity(); if (!sitDown(entity)) { return MethodResult.of(null, "Entity cannot sit"); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java index 894a5c08d..340bd3cc1 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/entity/TurtleSeatEntity.java @@ -20,6 +20,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.HasCustomInventoryScreen; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -87,7 +88,7 @@ public void keepAlive() { public Vec3 getTurtlePos() { BlockPos pos = this.turtle.getPosition(); - return new Vec3(pos.getX() + 0.5, pos.getY() + 0.4, pos.getZ() + 0.5); + return Vec3.atCenterOf(pos); } @Override @@ -131,6 +132,11 @@ protected void removePassenger(Entity entity) { } } + @Override + public Vec3 getDismountLocationForPassenger(LivingEntity entity) { + return this.getTurtlePos().add(0, 0.4, 0); + } + @Override public Entity getControllingPassenger() { return null; // this.getFirstPassenger(); @@ -138,7 +144,7 @@ public Entity getControllingPassenger() { @Override public double getPassengersRidingOffset() { - return 0.15; + return 0.05; } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java index bf397531f..ee3f2bf8e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APEntities.java @@ -23,7 +23,7 @@ public class APEntities { .build("turtle_ender_pearl")); public static final RegistryObject> TURTLE_SEAT = APRegistration.ENTITIES.register("turtle_seat", () -> EntityType.Builder.of(TurtleSeatEntity::new, MobCategory.MISC) - .sized(0.8F, 0.4F) + .sized(0.8F, 0.8F) .clientTrackingRange(4) .updateInterval(1) .fireImmune() diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java index 4fb83d282..179fd33e9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java @@ -31,7 +31,9 @@ public static T teleportToWithPassengers(T entity, ServerLeve } for (Entity p : passengers) { Entity newPassenger = teleportToWithPassengers(p, newLevel, p.position().subtract(oldPos).add(newPos)); - newPassenger.startRiding(newEntity, true); + if (newPassenger != null) { + newPassenger.startRiding(newEntity, true); + } } return newEntity; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java index d770e300c..13517fa1d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java @@ -53,7 +53,7 @@ public class APFakePlayer extends FakePlayer { Highly inspired by https://github.com/SquidDev-CC/plethora/blob/minecraft-1.12/src/main/java/org/squiddev/plethora/gameplay/PlethoraFakePlayer.java */ public static final GameProfile PROFILE = new GameProfile(UUID.fromString("6e483f02-30db-4454-b612-3a167614b276"), "[" + AdvancedPeripherals.MOD_ID + "]"); - private static final Predicate collidablePredicate = EntitySelector.NO_SPECTATORS; + private static final Predicate DEFAULT_ENTITY_FILTER = EntitySelector.NO_SPECTATORS.and(LivingEntity.class::isInstance).and((entity) -> !entity.isPassenger()); private BlockPos source = null; private BlockPos digPosition = null; @@ -300,11 +300,11 @@ public InteractionResult use(boolean skipEntity, boolean skipBlock, @Nullable Pr } public HitResult findHit(boolean skipEntity, boolean skipBlock) { - return findHit(skipEntity, skipBlock, null); + return findHit(skipEntity, skipBlock, DEFAULT_ENTITY_FILTER); } @NotNull - public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predicate entityFilter) { + public HitResult findHit(boolean skipEntity, boolean skipBlock, @NotNull Predicate entityFilter) { double range = this.getReachRange(); Vec3 origin = new Vec3(this.getX(), this.getY(), this.getZ()); Vec3 look = this.getLookAngle(); @@ -322,12 +322,8 @@ public HitResult findHit(boolean skipEntity, boolean skipBlock, @Nullable Predic return blockHit; } - Predicate entitySelector = collidablePredicate.and(LivingEntity.class::isInstance).and((entity) -> !entity.isPassenger()); - if (entityFilter != null) { - // TODO: maybe let entityFilter returns the priority of the entity, instead of only returns the closest one. - entitySelector.and(entityFilter); - } - EntityHitResult entityHit = HitResultUtil.getEntityHitResult(origin, target, level, this, entitySelector); + // TODO: maybe let entityFilter returns the priority of the entity, instead of only returns the closest one. + EntityHitResult entityHit = HitResultUtil.getEntityHitResult(origin, target, level, this, entityFilter); if (entityHit.getType() == HitResult.Type.ENTITY) { return entityHit; } From 82c8ce69f13c8143bdf95cb2b7982e822eaeb795 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 17 Jan 2025 10:03:27 -0700 Subject: [PATCH 145/188] fix cross dimension dismount with non-player --- .../common/addons/computercraft/peripheral/SaddlePeripheral.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java index 3dc63ffb6..b80b62428 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/SaddlePeripheral.java @@ -96,6 +96,7 @@ public void update() { this.seat = TeleportUtil.teleportToWithPassengers(this.seat, (ServerLevel) level, this.seat.getTurtlePos()); this.seat.setTurtle(this.owner.getTurtle()); this.seat.keepAlive(); + this.rider = this.seat.getFirstPassenger(); this.moveProg = 0; this.lastPos = pos; } else { From 85723675dc284dbcb491b51fc28bcdf1e6bed355 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 17 Jan 2025 14:52:09 -0700 Subject: [PATCH 146/188] fix missing operations --- .../peripheral/plugins/AutomataBlockHandPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java index f7a89c5d5..b06f91bbb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java @@ -54,7 +54,7 @@ public AutomataBlockHandPlugin(AutomataCorePeripheral automataCore) { @Override public @Nullable IPeripheralOperation[] getOperations() { - return new IPeripheralOperation[]{DIG, USE_ON_BLOCK}; + return new IPeripheralOperation[]{DIG, USE_ON_BLOCK, ACCURE_PLACE, UPDATE_BLOCK}; } @LuaFunction(mainThread = true) From 83a9d636ec94732bd8fd53a7f786e7c0d5786042 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 17 Jan 2025 14:52:54 -0700 Subject: [PATCH 147/188] sort --- .../peripheral/plugins/AutomataBlockHandPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java index b06f91bbb..d767c30ec 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataBlockHandPlugin.java @@ -54,7 +54,7 @@ public AutomataBlockHandPlugin(AutomataCorePeripheral automataCore) { @Override public @Nullable IPeripheralOperation[] getOperations() { - return new IPeripheralOperation[]{DIG, USE_ON_BLOCK, ACCURE_PLACE, UPDATE_BLOCK}; + return new IPeripheralOperation[]{ACCURE_PLACE, DIG, UPDATE_BLOCK, USE_ON_BLOCK}; } @LuaFunction(mainThread = true) From 794325ce38553e162e73578a5ac5978f29ca9e00 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 17 Jan 2025 14:57:48 -0700 Subject: [PATCH 148/188] add TODO --- .../de/srendi/advancedperipherals/common/util/TeleportUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java index 179fd33e9..24edd1379 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/TeleportUtil.java @@ -16,6 +16,7 @@ public static T teleportToWithPassengers(T entity, ServerLeve List passengers = new ArrayList<>(entity.getPassengers()); T newEntity; if (entity instanceof ServerPlayer player) { + // TODO <1.20.1>: player will be reconstruct in 1.20.1 player.teleportTo(newLevel, newPos.x, newPos.y, newPos.z, player.getYRot(), player.getXRot()); newEntity = entity; } else { From 12b1a3721959d55bf28d18fddab1d4eb81e9a74f Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 17 Jan 2025 15:11:32 -0700 Subject: [PATCH 149/188] add an override descriptor --- .../advancedperipherals/client/screens/SaddleTurtleScreen.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java index ce3bcc07b..7dc79a758 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java +++ b/src/main/java/de/srendi/advancedperipherals/client/screens/SaddleTurtleScreen.java @@ -136,6 +136,7 @@ private void renderDismountHint(PoseStack stack) { getFont().drawShadow(stack, text, x, top, 0xffffff); } + @Override public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { if (!isPlayerMountedOnTurtle()) { return; From 1363ef664e4f80df952adcee4239ecd657ac3d88 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 17 Jan 2025 17:32:48 -0700 Subject: [PATCH 150/188] fix peripheral will not update in smartglasses fix #658 --- .../common/items/SmartGlassesItem.java | 24 ++++- .../smartglasses/SmartGlassesComputer.java | 97 ++++++++++--------- .../smartglasses/SmartGlassesItemHandler.java | 48 +++++++-- 3 files changed, 109 insertions(+), 60 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java index b7c4f9b4a..12bb1fd68 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java @@ -5,6 +5,9 @@ import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.filesystem.IWritableMount; import dan200.computercraft.api.media.IMedia; +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.api.pocket.IPocketUpgrade; +import dan200.computercraft.shared.PocketUpgrades; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ServerComputerRegistry; import dan200.computercraft.shared.computer.core.ServerContext; @@ -23,6 +26,7 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; @@ -47,6 +51,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Map; public class SmartGlassesItem extends ArmorItem implements IComputerItem, IMedia { @@ -83,6 +88,9 @@ public LazyOptional getCapability(@NotNull Capability cap, @Nullable D private boolean tick(ItemStack stack, Level world, Entity entity, SmartGlassesComputer computer) { computer.setLevel((ServerLevel) world); + if (entity != null) { + computer.setPosition(entity.blockPosition()); + } boolean changed = false; @@ -118,16 +126,24 @@ private boolean tick(ItemStack stack, Level world, Entity entity, SmartGlassesCo computer.setStack(stack); } + for (Map.Entry e : computer.getUpgrades().entrySet()) { + IPocketUpgrade upgrade = PocketUpgrades.instance().get(e.getKey().toString()); + if (upgrade != null) { + upgrade.update(computer, e.getValue()); + } + } + return changed; } @Override public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNull Entity entity, int slotNum, boolean selected) { + LazyOptional optItemHandler = stack.getCapability(ForgeCapabilities.ITEM_HANDLER); SmartGlassesItemHandler itemHandler = (SmartGlassesItemHandler) optItemHandler.orElse(null); - for(int slot = 0; slot < itemHandler.getSlots(); slot++) { + for (int slot = 0; slot < itemHandler.getSlots(); slot++) { ItemStack itemStack = itemHandler.getStackInSlot(slot); - if(itemStack.getItem() instanceof IModuleItem iModuleItem) { + if (itemStack.getItem() instanceof IModuleItem iModuleItem) { SmartGlassesAccess glassesAccess = null; IModule module = null; if (!world.isClientSide) { @@ -155,7 +171,9 @@ public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNu @Override public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { - if (entity.level.isClientSide || entity.level.getServer() == null) return false; + if (entity.level.isClientSide || entity.level.getServer() == null) { + return false; + } SmartGlassesComputer computer = getServerComputer(entity.level.getServer(), stack); if (computer != null && tick(stack, entity.level, entity, computer)) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index 2da4b259e..8f5049e11 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -10,10 +10,10 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; import de.srendi.advancedperipherals.common.smartglasses.modules.ModulePeripheral; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Inventory; @@ -21,12 +21,13 @@ import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; +import com.google.common.collect.ImmutableMap; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import javax.annotation.Nullable; /** * Basically just a {@link dan200.computercraft.shared.pocket.core.PocketServerComputer} but with some changes @@ -40,20 +41,18 @@ public class SmartGlassesComputer extends ServerComputer implements IPocketAcces @Nullable private SmartGlassesItemHandler itemHandler = null; @NotNull - private final ModulePeripheral peripheral; + private final ModulePeripheral modulePeripheral; - private int lightColour = -1; - private boolean lightChanged = false; - private boolean isDirty = false; + private boolean isDirty = true; - private final Set tracking = new HashSet<>(); + private Map upgrades = Collections.emptyMap(); private final Map modules = new HashMap<>(); public SmartGlassesComputer(ServerLevel world, int computerID, @Nullable String label, ComputerFamily family) { super(world, computerID, label, family, 39, 13); this.addAPI(new SmartGlassesAPI()); - peripheral = new ModulePeripheral(this); - this.setPeripheral(ComputerSide.BACK, peripheral); + this.modulePeripheral = new ModulePeripheral(this); + this.setPeripheral(ComputerSide.BACK, this.modulePeripheral); } @Nullable @@ -65,7 +64,7 @@ public Entity getEntity() { if (entity instanceof Player player) { Inventory inventory = player.getInventory(); - if (inventory.items.contains(stack) || inventory.armor.contains(stack) || inventory.offhand.contains(stack)) { + if (inventory.contains(stack)) { return player; } return null; @@ -76,6 +75,16 @@ public Entity getEntity() { return null; } + @Override + public ServerLevel getLevel() { + return this.entity == null ? super.getLevel() : (ServerLevel) this.entity.getCommandSenderWorld(); + } + + @Override + public BlockPos getPosition() { + return this.entity == null ? super.getPosition() : this.entity.blockPosition(); + } + @Override public int getColour() { return 0; @@ -96,20 +105,11 @@ public ItemStack getStack() { @Override public int getLight() { - return lightColour; + return 0; } @Override public void setLight(int colour) { - if (colour < 0 || colour > 0xFFFFFF) { - colour = -1; - } - - if (lightColour == colour) { - return; - } - lightColour = colour; - lightChanged = true; } public void setItemHandler(@Nullable SmartGlassesItemHandler itemHandler) { @@ -139,34 +139,35 @@ public void updateUpgradeNBTData() { @Override public void invalidatePeripheral() { + updatePeripheralsAndModules(this.itemHandler); } @Override @NotNull public Map getUpgrades() { - return Collections.emptyMap(); + return this.upgrades; } + @Override public void setPeripheral(ComputerSide side, IPeripheral peripheral) { super.setPeripheral(side, peripheral); } public void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) { - for (int slot = 0; slot < 5; slot++) { + Set upgradesIdSet = new HashSet<>(); + ImmutableMap.Builder upgradesBuilder = new ImmutableMap.Builder<>(); + for (int slot = 0; slot < SmartGlassesItemHandler.PERIPHERAL_SLOTS; slot++) { + ComputerSide side = SmartGlassesSlot.indexToSide(slot); ItemStack peripheralItem = itemHandler.getStackInSlot(slot); - if (!peripheralItem.isEmpty()) { - IPocketUpgrade upgrade = PocketUpgrades.instance().get(peripheralItem); - if (upgrade != null) { - IPeripheral peripheral = upgrade.createPeripheral(smartGlassesAccess); - if (peripheral != null) { - setPeripheral(SmartGlassesSlot.indexToSide(slot), peripheral); - continue; - } - } + IPocketUpgrade upgrade = PocketUpgrades.instance().get(peripheralItem); + IPeripheral peripheral = upgrade != null ? upgrade.createPeripheral(smartGlassesAccess) : null; + setPeripheral(side, peripheral); + if (peripheral != null && upgradesIdSet.add(upgrade.getUpgradeID())) { + upgradesBuilder.put(upgrade.getUpgradeID(), peripheral); } - setPeripheral(SmartGlassesSlot.indexToSide(slot), null); } - for (int slot = 5; slot < 11; slot++) { + this.upgrades = upgradesBuilder.build(); + for (int slot = SmartGlassesItemHandler.PERIPHERAL_SLOTS; slot < SmartGlassesItemHandler.SLOTS; slot++) { ItemStack peripheralItem = itemHandler.getStackInSlot(slot); IModule oldModule = modules.get(slot); if (!peripheralItem.isEmpty() && peripheralItem.getItem() instanceof IModuleItem module) { @@ -175,32 +176,25 @@ public void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) { continue; } modules.put(slot, newModule); - peripheral.updateModules(); - setPeripheral(ComputerSide.BACK, null); - setPeripheral(ComputerSide.BACK, peripheral); } else if (oldModule != null) { oldModule.onUnequipped(smartGlassesAccess); modules.remove(slot); } } + this.modulePeripheral.updateModules(); + setPeripheral(ComputerSide.BACK, null); + setPeripheral(ComputerSide.BACK, this.modulePeripheral); + if (this.entity instanceof Player player) { + player.getInventory().setChanged(); + } } @Override public void tickServer() { super.tickServer(); - // Find any players which have gone missing and remove them from the tracking list. - tracking.removeIf(player -> !player.isAlive() || player.level != getLevel()); - - // And now find any new players, add them to the tracking list, and broadcast state where appropriate. - boolean sendState = hasOutputChanged() || lightChanged; - lightChanged = false; - if (sendState) { - tracking.addAll(getLevel().players()); - } - if (isDirty()) { - updatePeripheralsAndModules(this.itemHandler); + invalidatePeripheral(); isDirty = false; } @@ -210,14 +204,21 @@ public void tickServer() { } public void setEntity(@Nullable Entity entity) { + if (this.entity == entity) { + return; + } this.entity = entity; + if (entity == null) { + return; + } + this.setLevel((ServerLevel) this.entity.getCommandSenderWorld()); + this.setPosition(this.entity.blockPosition()); } public Map getModules() { return modules; } - @Override protected void onRemoved() { super.onRemoved(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java index e28b7857a..bd4a10a10 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java @@ -1,19 +1,26 @@ package de.srendi.advancedperipherals.common.smartglasses; +import dan200.computercraft.api.pocket.IPocketUpgrade; +import dan200.computercraft.shared.PocketUpgrades; import de.srendi.advancedperipherals.common.items.SmartGlassesItem; +import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleItem; import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.ContainerHelper; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; import javax.annotation.Nonnull; public class SmartGlassesItemHandler implements IItemHandlerModifiable { - private static final int SLOTS = 12; + public static final int SLOTS = 11; + public static final int PERIPHERAL_SLOTS = 5; private final ItemStack glasses; @Nullable @@ -40,7 +47,34 @@ public int getSlotLimit(int slot) { @Override public boolean isItemValid(int slot, @NotNull ItemStack stack) { - return !(stack.getItem() instanceof SmartGlassesItem); + if (stack.getItem() instanceof SmartGlassesItem) { + return false; + } + List items = this.loadItems(); + if (slot < PERIPHERAL_SLOTS) { + IPocketUpgrade upgrade = PocketUpgrades.instance().get(stack); + if (upgrade == null) { + return false; + } + ResourceLocation id = upgrade.getUpgradeID(); + for (int i = 0; i < PERIPHERAL_SLOTS; i++) { + IPocketUpgrade u = PocketUpgrades.instance().get(items.get(i)); + if (u != null && u.getUpgradeID().equals(id)) { + return false; + } + } + return true; + } + Item item = stack.getItem(); + if (!(item instanceof IModuleItem module)) { + return false; + } + for (int i = PERIPHERAL_SLOTS; i < SLOTS; i++) { + if (items.get(i).getItem() == item) { + return false; + } + } + return true; } @Override @@ -53,15 +87,11 @@ public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate return stack; } ItemStack existing = getStackInSlot(slot); - int limit = getSlotLimit(slot); - if (!existing.isEmpty()) { - if (!ItemHandlerHelper.canItemStacksStack(stack, existing)) { - return stack; - } - limit -= existing.getCount(); + return stack; } + int limit = getSlotLimit(slot); if (limit <= 0) { return stack; } @@ -117,7 +147,7 @@ public ItemStack getStackInSlot(int slot) { @Override public void setStackInSlot(int slot, @NotNull ItemStack stack) { NonNullList items = loadItems(); - if (stack.equals(items.get(slot))) { + if (ItemStack.isSameItemSameTags(stack, items.get(slot))) { return; } items.set(slot, stack); From 47315025ba52a4c4bac1c4979e733163debf27f1 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 17 Jan 2025 19:04:52 -0700 Subject: [PATCH 151/188] remove empty line --- .../advancedperipherals/common/items/SmartGlassesItem.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java index 12bb1fd68..cac85edaf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java @@ -138,7 +138,6 @@ private boolean tick(ItemStack stack, Level world, Entity entity, SmartGlassesCo @Override public void inventoryTick(@NotNull ItemStack stack, @NotNull Level world, @NotNull Entity entity, int slotNum, boolean selected) { - LazyOptional optItemHandler = stack.getCapability(ForgeCapabilities.ITEM_HANDLER); SmartGlassesItemHandler itemHandler = (SmartGlassesItemHandler) optItemHandler.orElse(null); for (int slot = 0; slot < itemHandler.getSlots(); slot++) { From 5d6ce680f2918db747f4fb18ac4bb6dab25fc74f Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 18 Jan 2025 00:28:08 -0700 Subject: [PATCH 152/188] fix automata turtle may dig itself at specific position fix #698 --- .../common/util/fakeplayer/APFakePlayer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java index 13517fa1d..60d0c56c5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/APFakePlayer.java @@ -167,10 +167,10 @@ public double getReachRange() { public Pair digBlock() { Level world = getLevel(); HitResult hit = findHit(true, false); - if (hit.getType() == HitResult.Type.MISS) { + if (!(hit instanceof BlockHitResult blockHit) || hit.getType() == HitResult.Type.MISS) { return Pair.of(false, "Nothing to break"); } - BlockPos pos = new BlockPos(hit.getLocation()); + BlockPos pos = blockHit.getBlockPos(); BlockState state = world.getBlockState(pos); Block block = state.getBlock(); From 917ab43c68a7521e97e992e5a2a2537646d649f6 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 18 Jan 2025 18:06:31 -0700 Subject: [PATCH 153/188] optimize getCapability abstract XDetector --- .../peripheral/BaseDetectorPeripheral.java | 42 ++++++ .../peripheral/EnergyDetectorPeripheral.java | 25 +--- .../peripheral/FluidDetectorPeripheral.java | 29 +--- .../peripheral/GasDetectorPeripheral.java | 28 +--- .../addons/mekanism/MekanismCapabilities.java | 6 +- .../blocks/base/APBlockEntityBlock.java | 8 +- .../blocks/base/BaseDetectorEntity.java | 127 ++++++++++++++++++ .../blocks/base/PeripheralBlockEntity.java | 93 ++++++------- .../base/PoweredPeripheralBlockEntity.java | 19 ++- .../blocks/blockentities/ChatBoxEntity.java | 4 +- .../blockentities/EnergyDetectorEntity.java | 90 ++----------- .../blockentities/FluidDetectorEntity.java | 88 ++---------- .../blockentities/GasDetectorEntity.java | 91 ++----------- .../blocks/blockentities/MeBridgeEntity.java | 7 +- .../common/util/EnergyStorageProxy.java | 76 ----------- .../common/util/FluidStorageProxy.java | 92 ------------- .../common/util/GasStorageProxy.java | 99 -------------- .../util/proxy/AbstractStorageProxy.java | 42 ++++++ .../common/util/proxy/EnergyStorageProxy.java | 74 ++++++++++ .../common/util/proxy/FluidStorageProxy.java | 85 ++++++++++++ .../common/util/proxy/GasStorageProxy.java | 95 +++++++++++++ .../common/util/proxy/IStorageProxy.java | 19 +++ .../common/util/{ => proxy}/ZeroGasTank.java | 2 +- 23 files changed, 587 insertions(+), 654 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BaseDetectorPeripheral.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/EnergyStorageProxy.java delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/FluidStorageProxy.java delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/GasStorageProxy.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/proxy/AbstractStorageProxy.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/proxy/EnergyStorageProxy.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/proxy/FluidStorageProxy.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/proxy/GasStorageProxy.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/proxy/IStorageProxy.java rename src/main/java/de/srendi/advancedperipherals/common/util/{ => proxy}/ZeroGasTank.java (94%) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BaseDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BaseDetectorPeripheral.java new file mode 100644 index 000000000..843c5554f --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/BaseDetectorPeripheral.java @@ -0,0 +1,42 @@ +package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; + +import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; +import de.srendi.advancedperipherals.common.blocks.base.BaseDetectorEntity; +import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; + +public abstract class BaseDetectorPeripheral extends BasePeripheral> { + protected BaseDetectorPeripheral(String type, E tileEntity) { + super(type, new BlockEntityPeripheralOwner<>(tileEntity)); + } + + @LuaFunction + public final long getMaxTransferRate() { + return owner.tileEntity.getMaxTransferRate(); + } + + @LuaFunction + public final long getTransferRateLimit() { + return owner.tileEntity.getTransferRateLimit(); + } + + @LuaFunction + public final void setTransferRateLimit(long transferRate) { + owner.tileEntity.setTransferRateLimit(transferRate); + } + + @LuaFunction + public final long getTransferRate() { + return owner.tileEntity.getTransferRate(); + } + + @LuaFunction + public final String getLastTransferedId() { + return owner.tileEntity.getLastTransferedId(); + } + + @LuaFunction + public final String getReadyTransferId() { + return owner.tileEntity.getReadyTransferId(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnergyDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnergyDetectorPeripheral.java index 0898fb611..5aff47acd 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnergyDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnergyDetectorPeripheral.java @@ -1,37 +1,18 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.EnergyDetectorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; -import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; -public class EnergyDetectorPeripheral extends BasePeripheral> { +public class EnergyDetectorPeripheral extends BaseDetectorPeripheral { - public static final String PERIPHERAL_TYPE = "energy_detector"; + public static final String TYPE = "energy_detector"; public EnergyDetectorPeripheral(EnergyDetectorEntity tileEntity) { - super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); + super(TYPE, tileEntity); } @Override public boolean isEnabled() { return APConfig.PERIPHERALS_CONFIG.enableEnergyDetector.get(); } - - @LuaFunction(mainThread = true) - public final int getTransferRateLimit() { - return owner.tileEntity.storageProxy.getMaxTransferRate(); - } - - @LuaFunction(mainThread = true) - public final void setTransferRateLimit(long transferRate) { - transferRate = Math.max(0, Math.min(APConfig.PERIPHERALS_CONFIG.energyDetectorMaxFlow.get(), transferRate)); - owner.tileEntity.storageProxy.setMaxTransferRate((int) transferRate); - } - - @LuaFunction(mainThread = true) - public final int getTransferRate() { - return owner.tileEntity.transferRate; - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/FluidDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/FluidDetectorPeripheral.java index c54dde612..60cd76182 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/FluidDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/FluidDetectorPeripheral.java @@ -1,43 +1,18 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.FluidDetectorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; -import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; -import net.minecraftforge.registries.ForgeRegistries; -public class FluidDetectorPeripheral extends BasePeripheral> { +public class FluidDetectorPeripheral extends BaseDetectorPeripheral { public static final String TYPE = "fluid_detector"; public FluidDetectorPeripheral(FluidDetectorEntity tileEntity) { - super(TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); + super(TYPE, tileEntity); } @Override public boolean isEnabled() { return APConfig.PERIPHERALS_CONFIG.enableFluidDetector.get(); } - - @LuaFunction(mainThread = true) - public final int getTransferRateLimit() { - return owner.tileEntity.storageProxy.getMaxTransferRate(); - } - - @LuaFunction(mainThread = true) - public final String getTransferedFluid() { - return ForgeRegistries.FLUIDS.getKey(owner.tileEntity.lastFlowedLiquid.getFluid()).toString(); - } - - @LuaFunction(mainThread = true) - public final void setTransferRateLimit(long transferRate) { - transferRate = Math.min(APConfig.PERIPHERALS_CONFIG.fluidDetectorMaxFlow.get(), transferRate); - owner.tileEntity.storageProxy.setMaxTransferRate((int) transferRate); - } - - @LuaFunction(mainThread = true) - public final int getTransferRate() { - return owner.tileEntity.transferRate; - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GasDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GasDetectorPeripheral.java index fd94811e3..c5a293179 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GasDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GasDetectorPeripheral.java @@ -1,42 +1,18 @@ package de.srendi.advancedperipherals.common.addons.computercraft.peripheral; -import dan200.computercraft.api.lua.LuaFunction; -import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.GasDetectorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; -import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; -public class GasDetectorPeripheral extends BasePeripheral> { +public class GasDetectorPeripheral extends BaseDetectorPeripheral { public static final String TYPE = "gas_detector"; public GasDetectorPeripheral(GasDetectorEntity tileEntity) { - super(TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); + super(TYPE, tileEntity); } @Override public boolean isEnabled() { return APConfig.PERIPHERALS_CONFIG.enableGasDetector.get(); } - - @LuaFunction(mainThread = true) - public final int getTransferRateLimit() { - return owner.tileEntity.storageProxy.getMaxTransferRate(); - } - - @LuaFunction(mainThread = true) - public final String getTransferedGas() { - return owner.tileEntity.lastFlowedGas.getRaw().getRegistryName().toString(); - } - - @LuaFunction(mainThread = true) - public final void setTransferRateLimit(long transferRate) { - transferRate = Math.min(APConfig.PERIPHERALS_CONFIG.gasDetectorMaxFlow.get(), transferRate); - owner.tileEntity.storageProxy.setMaxTransferRate((int) transferRate); - } - - @LuaFunction(mainThread = true) - public final int getTransferRate() { - return owner.tileEntity.transferRate; - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/MekanismCapabilities.java b/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/MekanismCapabilities.java index 858a11b3d..026e1c25a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/MekanismCapabilities.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/mekanism/MekanismCapabilities.java @@ -7,9 +7,5 @@ import static net.minecraftforge.common.capabilities.CapabilityManager.get; public class MekanismCapabilities { - - public static final Capability GAS_HANDLER = get(new CapabilityToken<>() { - }); - - + public static final Capability GAS_HANDLER = get(new CapabilityToken<>() {}); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/APBlockEntityBlock.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/APBlockEntityBlock.java index abbc0c374..5f26e6965 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/APBlockEntityBlock.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/APBlockEntityBlock.java @@ -1,6 +1,5 @@ package de.srendi.advancedperipherals.common.blocks.base; -import de.srendi.advancedperipherals.common.blocks.blockentities.EnergyDetectorEntity; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.entity.BlockEntity; @@ -33,11 +32,6 @@ public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState sta @Override public void onNeighborChange(BlockState state, LevelReader level, BlockPos pos, BlockPos neighbor) { super.onNeighborChange(state, level, pos, neighbor); - - BlockEntity blockEntity = level.getBlockEntity(pos); - - if(blockEntity instanceof EnergyDetectorEntity energyDetector) - energyDetector.invalidateStorages(); - + // BlockEntity blockEntity = level.getBlockEntity(pos); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java new file mode 100644 index 000000000..7fd847acc --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java @@ -0,0 +1,127 @@ +package de.srendi.advancedperipherals.common.blocks.base; + +import de.srendi.advancedperipherals.common.util.proxy.IStorageProxy; +import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class BaseDetectorEntity> extends PeripheralBlockEntity

{ + + private static final String RATE_LIMIT_TAG = "RateLimit"; + + private final Capability capability; + // proxy that will forward X to the output but limit it to maxTransferRate + private final S proxy = createProxy(); + private volatile long transferRate = 0; + private LazyOptional inputStorageCap = LazyOptional.empty(); + private LazyOptional zeroStorageCap = LazyOptional.empty(); + + protected BaseDetectorEntity(BlockEntityType tileEntityType, BlockPos pos, BlockState state, Capability capability) { + super(tileEntityType, pos, state); + this.capability = capability; + } + + @NotNull + protected abstract S createProxy(); + + @NotNull + protected abstract T getZeroStorage(); + + @NotNull + protected S getStorageProxy() { + return this.proxy; + } + + public long getTransferRate() { + return this.transferRate; + } + + public long getMaxTransferRate() { + return this.proxy.getMaxTransferRate(); + } + + public long getTransferRateLimit() { + return this.proxy.getTransferRate(); + } + + public void setTransferRateLimit(long rate) { + if (this.proxy.getTransferRate() != rate) { + this.proxy.setTransferRate(rate); + this.setChanged(); + } + } + + @Nullable + public String getLastTransferedId() { + return this.proxy.getLastTransferedId(); + } + + @Nullable + public String getReadyTransferId() { + return this.proxy.getReadyTransferId(); + } + + public Direction getInputDirection() { + return this.getBlockState().getValue(BaseBlock.ORIENTATION).front(); + } + + public Direction getOutputDirection() { + return this.getBlockState().getValue(BaseBlock.ORIENTATION).front().getOpposite(); + } + + @NotNull + @Override + public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { + Direction inputDirection = this.getInputDirection(); + Direction outputDirection = this.getOutputDirection(); + if (cap == this.capability) { + if (direction == inputDirection) { + if (!this.inputStorageCap.isPresent()) { + this.inputStorageCap = LazyOptional.of(this::getStorageProxy); + } + return this.inputStorageCap.cast(); + } else if (direction == outputDirection) { + if (!this.zeroStorageCap.isPresent()) { + this.zeroStorageCap = LazyOptional.of(this::getZeroStorage); + } + return this.zeroStorageCap.cast(); + } + } + return super.getCapability(cap, direction); + } + + @Override + public void saveAdditional(@NotNull CompoundTag compound) { + super.saveAdditional(compound); + compound.putLong(RATE_LIMIT_TAG, this.getTransferRateLimit()); + } + + @Override + public void load(@NotNull CompoundTag nbt) { + this.proxy.setTransferRate(nbt.getLong(RATE_LIMIT_TAG)); + super.load(nbt); + } + + @Override + public void handleTick(Level level, BlockState state, BlockEntityType type) { + if (!level.isClientSide) { + this.transferRate = this.proxy.getAndResetTransfered(); + } + } + + @NotNull + public LazyOptional getOutputStorage() { + Direction outputDirection = this.getOutputDirection(); + BlockEntity be = level.getBlockEntity(worldPosition.relative(outputDirection)); + return be == null ? LazyOptional.empty() : be.getCapability(this.capability, outputDirection.getOpposite()); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java index d6f256b4e..5014be652 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java @@ -1,7 +1,6 @@ package de.srendi.advancedperipherals.common.blocks.base; import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.shared.Capabilities; import de.srendi.advancedperipherals.AdvancedPeripherals; @@ -39,13 +38,11 @@ public abstract class PeripheralBlockEntity> extends BaseContainerBlockEntity implements WorldlyContainer, MenuProvider, IPeripheralTileEntity { private static final String PERIPHERAL_SETTINGS_KEY = "peripheralSettings"; - protected CompoundTag peripheralSettings; + protected CompoundTag peripheralSettings = new CompoundTag(); protected NonNullList items; - @Nullable - protected T peripheral = null; - private LazyOptional handler; - private LazyOptional fluidHandler; - private LazyOptional peripheralCap; + private LazyOptional handler = LazyOptional.empty(); + private LazyOptional fluidHandler = LazyOptional.empty(); + private LazyOptional peripheralCap = LazyOptional.empty(); protected PeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) { super(tileEntityTypeIn, pos, state); @@ -54,44 +51,27 @@ protected PeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos po } else { items = NonNullList.withSize(0, ItemStack.EMPTY); } - peripheralSettings = new CompoundTag(); } @NotNull @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { + public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { if (cap == Capabilities.CAPABILITY_PERIPHERAL) { - if (peripheral == null) - // Perform later peripheral creation, because creating peripheral - // on init of tile entity cause some infinity loop, if peripheral - // are depend on tile entity data - this.peripheral = createPeripheral(); - if (peripheral.isEnabled()) { - if (peripheralCap == null) { - peripheralCap = LazyOptional.of(() -> peripheral); - } else if (!peripheralCap.isPresent()) { - // Recreate peripheral to allow CC: Tweaked correctly handle - // peripheral update logic, so new peripheral and old one will be - // different - peripheral = createPeripheral(); - peripheralCap = LazyOptional.of(() -> peripheral); + return this.getLazyPeripheral().cast(); + } else if (cap == ForgeCapabilities.ITEM_HANDLER) { + if (!remove && direction != null && this instanceof IInventoryBlock) { + if (!handler.isPresent()) { + handler = LazyOptional.of(() -> new SidedInvWrapper(this, Direction.NORTH)); } - return peripheralCap.cast(); - } else { - AdvancedPeripherals.debug(peripheral.getType() + " is disabled, you can enable it in the Configuration."); + return handler.cast(); + } + } else if (cap == ForgeCapabilities.FLUID_HANDLER) { + if (!remove && direction != null) { + if (!fluidHandler.isPresent()) { + fluidHandler = LazyOptional.of(() -> new FluidTank(0)); + } + return fluidHandler.cast(); } - } - - if (cap == ForgeCapabilities.ITEM_HANDLER && !remove && direction != null && this instanceof IInventoryBlock) { - if (handler == null || !handler.isPresent()) - handler = LazyOptional.of(() -> new SidedInvWrapper(this, Direction.NORTH)); - return handler.cast(); - } - - if (cap == ForgeCapabilities.FLUID_HANDLER && !remove && direction != null) { - if (fluidHandler == null || !fluidHandler.isPresent()) - fluidHandler = LazyOptional.of(() -> new FluidTank(0)); - return fluidHandler.cast(); } return super.getCapability(cap, direction); } @@ -99,26 +79,39 @@ public LazyOptional getCapability(@NotNull Capability cap, @Nullabl @Override public void invalidateCaps() { super.invalidateCaps(); - if (peripheralCap != null) - peripheralCap.invalidate(); - if (handler != null) - handler.invalidate(); - if (fluidHandler != null) - fluidHandler.invalidate(); + peripheralCap.invalidate(); + handler.invalidate(); + fluidHandler.invalidate(); } @NotNull protected abstract T createPeripheral(); public Iterable getConnectedComputers() { - if (peripheral == null) // just avoid some NPE in strange cases - return Collections.emptyList(); - return peripheral.getConnectedComputers(); + return this.getLazyPeripheral().map(BasePeripheral::getConnectedComputers).orElse(Collections.emptyList()); + } + + public LazyOptional getLazyPeripheral() { + // Perform later peripheral creation, because creating peripheral + // on init of tile entity cause some infinity loop, if peripheral + // are depend on tile entity data + if (!this.peripheralCap.isPresent()) { + // Recreate peripheral to allow CC: Tweaked correctly handle + // peripheral update logic, so new peripheral and old one will be + // different + final T peripheral = createPeripheral(); + if (!peripheral.isEnabled()) { + AdvancedPeripherals.debug(peripheral.getType() + " is disabled, you can enable it in the Configuration."); + return LazyOptional.empty(); + } + this.peripheralCap = LazyOptional.of(() -> peripheral); + } + return this.peripheralCap; } @Nullable public T getPeripheral() { - return peripheral; + return this.getLazyPeripheral().orElse(null); } /*@Override @@ -130,7 +123,9 @@ public ITextComponent getDisplayName() { public void saveAdditional(@NotNull CompoundTag compound) { super.saveAdditional(compound); ContainerHelper.saveAllItems(compound, items); - if (!peripheralSettings.isEmpty()) compound.put(PERIPHERAL_SETTINGS_KEY, peripheralSettings); + if (!peripheralSettings.isEmpty()) { + compound.put(PERIPHERAL_SETTINGS_KEY, peripheralSettings); + } } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java index 21a25c070..4178f0c5c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PoweredPeripheralBlockEntity.java @@ -17,15 +17,10 @@ public abstract class PoweredPeripheralBlockEntity> extends PeripheralBlockEntity { - private final LazyOptional lazyEnergyStorage; + private LazyOptional lazyEnergyStorage = LazyOptional.empty(); protected PoweredPeripheralBlockEntity(BlockEntityType tileEntityTypeIn, BlockPos pos, BlockState state) { super(tileEntityTypeIn, pos, state); - if (APConfig.PERIPHERALS_CONFIG.enablePoweredPeripherals.get()) { - lazyEnergyStorage = LazyOptional.of(() -> new EnergyStorage(this.getMaxEnergyStored())); - } else { - lazyEnergyStorage = LazyOptional.empty(); - } } protected abstract int getMaxEnergyStored(); @@ -43,9 +38,14 @@ public void load(@NotNull CompoundTag compound) { } @Override - public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { - if (cap == ForgeCapabilities.ENERGY && lazyEnergyStorage.isPresent()) { - return lazyEnergyStorage.cast(); + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { + if (cap == ForgeCapabilities.ENERGY) { + if (APConfig.PERIPHERALS_CONFIG.enablePoweredPeripherals.get()) { + if (!lazyEnergyStorage.isPresent()) { + lazyEnergyStorage = LazyOptional.of(() -> new EnergyStorage(this.getMaxEnergyStored())); + } + return lazyEnergyStorage.cast(); + } } return super.getCapability(cap, direction); } @@ -55,5 +55,4 @@ public void invalidateCaps() { super.invalidateCaps(); this.lazyEnergyStorage.invalidate(); } - } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java index 594645f0c..789b0704f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java @@ -24,8 +24,6 @@ protected ChatBoxPeripheral createPeripheral() { @Override public void handleTick(Level level, BlockState state, BlockEntityType type) { - if (peripheral != null) { - peripheral.update(); - } + this.getLazyPeripheral().ifPresent(ChatBoxPeripheral::update); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java index 1a9aaad04..fd825dc4f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/EnergyDetectorEntity.java @@ -1,108 +1,40 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.EnergyDetectorPeripheral; -import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; -import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; +import de.srendi.advancedperipherals.common.blocks.base.BaseDetectorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; -import de.srendi.advancedperipherals.common.util.EnergyStorageProxy; +import de.srendi.advancedperipherals.common.util.proxy.EnergyStorageProxy; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.EnergyStorage; import net.minecraftforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.Optional; +public class EnergyDetectorEntity extends BaseDetectorEntity { -public class EnergyDetectorEntity extends PeripheralBlockEntity { - - public int transferRate = 0; - //storageProxy that will forward the energy to the output but limit it to maxTransferRate - public final EnergyStorageProxy storageProxy = new EnergyStorageProxy(this, APConfig.PERIPHERALS_CONFIG.energyDetectorMaxFlow.get()); - //a zero size, zero transfer energy storage to ensure that cables connect - private final EnergyStorage zeroStorage = new EnergyStorage(0, 0, 0); - private final LazyOptional energyStorageCap = LazyOptional.of(() -> storageProxy); - private final LazyOptional zeroStorageCap = LazyOptional.of(() -> zeroStorage); - @NotNull - private Optional outReceivingStorage = Optional.empty(); - - private Direction energyInDirection = Direction.NORTH; - private Direction energyOutDirection = Direction.SOUTH; + private static final EnergyStorage ZERO_STORAGE = new EnergyStorage(0, 0, 0); public EnergyDetectorEntity(BlockPos pos, BlockState state) { - super(APBlockEntityTypes.ENERGY_DETECTOR.get(), pos, state); + super(APBlockEntityTypes.ENERGY_DETECTOR.get(), pos, state, ForgeCapabilities.ENERGY); } - @NotNull @Override + @NotNull protected EnergyDetectorPeripheral createPeripheral() { return new EnergyDetectorPeripheral(this); } - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { - energyInDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front(); - energyOutDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front().getOpposite(); - if (cap == ForgeCapabilities.ENERGY) { - if (direction == energyInDirection) { - return energyStorageCap.cast(); - } else if (direction == energyOutDirection) { - return zeroStorageCap.cast(); - } - } - return super.getCapability(cap, direction); - } - @Override - public void saveAdditional(@NotNull CompoundTag compound) { - super.saveAdditional(compound); - compound.putInt("rateLimit", storageProxy.getMaxTransferRate()); - } - - @Override - public void handleTick(Level level, BlockState state, BlockEntityType type) { - if (!level.isClientSide) { - // this handles the rare edge case that receiveEnergy is called multiple times in one tick - transferRate = storageProxy.getTransferedInThisTick(); - storageProxy.resetTransferedInThisTick(); - } + @NotNull + protected EnergyStorageProxy createProxy() { + return new EnergyStorageProxy(this, APConfig.PERIPHERALS_CONFIG.energyDetectorMaxFlow.get()); } @Override - public void load(@NotNull CompoundTag nbt) { - storageProxy.setMaxTransferRate(nbt.getInt("rateLimit")); - super.load(nbt); - } - - public void invalidateStorages() { - outReceivingStorage = Optional.empty(); - } - - // returns the cached output storage of the receiving block or fetches it if it has been invalidated @NotNull - public Optional getOutputStorage() { - // the documentation says that the value of the LazyOptional should be cached locally and invalidated using addListener - if (outReceivingStorage.isEmpty()) { - BlockEntity teOut = level.getBlockEntity(worldPosition.relative(energyOutDirection)); - if (teOut == null) { - return Optional.empty(); - } - LazyOptional lazyOptionalOutStorage = teOut.getCapability(ForgeCapabilities.ENERGY, energyOutDirection.getOpposite()); - outReceivingStorage = lazyOptionalOutStorage.resolve(); - lazyOptionalOutStorage.addListener(l -> { - outReceivingStorage = Optional.empty(); - }); - } - return outReceivingStorage; + protected IEnergyStorage getZeroStorage() { + return ZERO_STORAGE; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java index 81d713ec2..82a9b7788 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/FluidDetectorEntity.java @@ -1,106 +1,40 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.FluidDetectorPeripheral; -import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; -import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; +import de.srendi.advancedperipherals.common.blocks.base.BaseDetectorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; -import de.srendi.advancedperipherals.common.util.FluidStorageProxy; +import de.srendi.advancedperipherals.common.util.proxy.FluidStorageProxy; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.templates.FluidTank; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.Optional; +public class FluidDetectorEntity extends BaseDetectorEntity { -public class FluidDetectorEntity extends PeripheralBlockEntity { - - public int transferRate = 0; - public FluidStack lastFlowedLiquid = FluidStack.EMPTY; - - //storageProxy that will forward the fluid to the output but limit it to maxTransferRate - public final FluidStorageProxy storageProxy = new FluidStorageProxy(this, APConfig.PERIPHERALS_CONFIG.fluidDetectorMaxFlow.get()); - //a zero size, zero transfer fluid storage to ensure that cables connect - private final FluidTank zeroStorage = new FluidTank(0); - private final LazyOptional fluidStorageCap = LazyOptional.of(() -> storageProxy); - private final LazyOptional zeroStorageCap = LazyOptional.of(() -> zeroStorage); - private Optional outReceivingStorage = Optional.empty(); - - private Direction fluidInDetection = Direction.NORTH; - private Direction fluidOutDirection = Direction.SOUTH; + private static final FluidTank ZERO_STORAGE = new FluidTank(0); public FluidDetectorEntity(BlockPos pos, BlockState state) { - super(APBlockEntityTypes.FLUID_DETECTOR.get(), pos, state); + super(APBlockEntityTypes.FLUID_DETECTOR.get(), pos, state, ForgeCapabilities.FLUID_HANDLER); } - @NotNull @Override + @NotNull protected FluidDetectorPeripheral createPeripheral() { return new FluidDetectorPeripheral(this); } - @NotNull @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { - fluidInDetection = getBlockState().getValue(BaseBlock.ORIENTATION).front(); - fluidOutDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front().getOpposite(); - if (cap == ForgeCapabilities.FLUID_HANDLER) { - if (direction == fluidInDetection) { - return fluidStorageCap.cast(); - } else if (direction == fluidOutDirection) { - return zeroStorageCap.cast(); - } - } - return super.getCapability(cap, direction); - } - - @Override - public void saveAdditional(@NotNull CompoundTag compound) { - super.saveAdditional(compound); - compound.putInt("rateLimit", storageProxy.getMaxTransferRate()); - } - - @Override - public void handleTick(Level level, BlockState state, BlockEntityType type) { - if (!level.isClientSide) { - // this handles the rare edge case that receiveFluid is called multiple times in one tick - transferRate = storageProxy.getTransferedInThisTick(); - storageProxy.resetTransferedInThisTick(); - } + @NotNull + protected FluidStorageProxy createProxy() { + return new FluidStorageProxy(this, APConfig.PERIPHERALS_CONFIG.fluidDetectorMaxFlow.get()); } @Override - public void load(@NotNull CompoundTag nbt) { - storageProxy.setMaxTransferRate(nbt.getInt("rateLimit")); - super.load(nbt); - } - - // returns the cached output storage of the receiving block or fetches it if it has been invalidated @NotNull - public Optional getOutputStorage() { - // the documentation says that the value of the LazyOptional should be cached locally and invalidated using addListener - if (outReceivingStorage.isEmpty()) { - BlockEntity teOut = level.getBlockEntity(worldPosition.relative(fluidOutDirection)); - if (teOut == null) { - return Optional.empty(); - } - LazyOptional lazyOptionalOutStorage = teOut.getCapability(ForgeCapabilities.FLUID_HANDLER, fluidOutDirection.getOpposite()); - outReceivingStorage = lazyOptionalOutStorage.resolve(); - lazyOptionalOutStorage.addListener(l -> { - outReceivingStorage = Optional.empty(); - }); - } - return outReceivingStorage; + protected IFluidHandler getZeroStorage() { + return ZERO_STORAGE; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java index e87529830..cb1cf6d2b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/GasDetectorEntity.java @@ -2,105 +2,40 @@ import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.GasDetectorPeripheral; import de.srendi.advancedperipherals.common.addons.mekanism.MekanismCapabilities; -import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; -import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; +import de.srendi.advancedperipherals.common.blocks.base.BaseDetectorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; -import de.srendi.advancedperipherals.common.util.GasStorageProxy; -import de.srendi.advancedperipherals.common.util.ZeroGasTank; -import mekanism.api.chemical.gas.GasStack; +import de.srendi.advancedperipherals.common.util.proxy.GasStorageProxy; +import de.srendi.advancedperipherals.common.util.proxy.ZeroGasTank; import mekanism.api.chemical.gas.IGasHandler; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.Optional; +public class GasDetectorEntity extends BaseDetectorEntity { -public class GasDetectorEntity extends PeripheralBlockEntity { - - public int transferRate = 0; - public GasStack lastFlowedGas = GasStack.EMPTY; - - //storageProxy that will forward the gas to the output but limit it to maxTransferRate - public final GasStorageProxy storageProxy = new GasStorageProxy(this, APConfig.PERIPHERALS_CONFIG.gasDetectorMaxFlow.get()); - //a zero size, zero transfer gas storage to ensure that cables connect - private final IGasHandler zeroStorage = new ZeroGasTank(); - private final LazyOptional gasStorageCap = LazyOptional.of(() -> storageProxy); - private final LazyOptional zeroStorageCap = LazyOptional.of(() -> zeroStorage); - private Optional outReceivingStorage = Optional.empty(); - - private Direction gasInDirection = Direction.NORTH; - private Direction gasOutDirection = Direction.SOUTH; + // a zero size, zero transfer gas storage to ensure that cables connect + private static final IGasHandler ZERO_STORAGE = new ZeroGasTank(); public GasDetectorEntity(BlockPos pos, BlockState state) { - super(APBlockEntityTypes.GAS_DETECTOR.get(), pos, state); + super(APBlockEntityTypes.GAS_DETECTOR.get(), pos, state, MekanismCapabilities.GAS_HANDLER); } - @NotNull @Override + @NotNull protected GasDetectorPeripheral createPeripheral() { return new GasDetectorPeripheral(this); } - @NotNull @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction direction) { - gasInDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front(); - gasOutDirection = getBlockState().getValue(BaseBlock.ORIENTATION).front().getOpposite(); - if (cap == MekanismCapabilities.GAS_HANDLER) { - if (direction == gasInDirection) { - return gasStorageCap.cast(); - } else if (direction == gasOutDirection) { - return zeroStorageCap.cast(); - } - } - return super.getCapability(cap, direction); - } - - @Override - public void saveAdditional(@NotNull CompoundTag compound) { - super.saveAdditional(compound); - compound.putInt("rateLimit", storageProxy.getMaxTransferRate()); - } - - @Override - public void handleTick(Level level, BlockState state, BlockEntityType type) { - if (!level.isClientSide) { - // this handles the rare edge case that receiveGas is called multiple times in one tick - transferRate = storageProxy.getTransferedInThisTick(); - storageProxy.resetTransferedInThisTick(); - } + @NotNull + protected GasStorageProxy createProxy() { + return new GasStorageProxy(this, APConfig.PERIPHERALS_CONFIG.gasDetectorMaxFlow.get()); } @Override - public void load(@NotNull CompoundTag nbt) { - storageProxy.setMaxTransferRate(nbt.getInt("rateLimit")); - super.load(nbt); - } - - // returns the cached output storage of the receiving block or fetches it if it has been invalidated @NotNull - public Optional getOutputStorage() { - // the documentation says that the value of the LazyOptional should be cached locally and invalidated using addListener - if (outReceivingStorage.isEmpty()) { - BlockEntity teOut = level.getBlockEntity(worldPosition.relative(gasOutDirection)); - if (teOut == null) { - return Optional.empty(); - } - LazyOptional lazyOptionalOutStorage = teOut.getCapability(MekanismCapabilities.GAS_HANDLER, gasOutDirection.getOpposite()); - outReceivingStorage = lazyOptionalOutStorage.resolve(); - lazyOptionalOutStorage.addListener(l -> { - outReceivingStorage = Optional.empty(); - }); - } - return outReceivingStorage; + protected IGasHandler getZeroStorage() { + return ZERO_STORAGE; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java index 0001aa14b..a828fd45d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java @@ -56,6 +56,10 @@ protected MeBridgePeripheral createPeripheral() { public void handleTick(Level level, BlockState state, BlockEntityType type) { if (!this.level.isClientSide) { if (!initialized) { + MeBridgePeripheral peripheral = this.getPeripheral(); + if (peripheral == null) { + return; + } mainNode.setFlags(GridFlags.REQUIRE_CHANNEL); mainNode.setIdlePowerUsage(APConfig.PERIPHERALS_CONFIG.meConsumption.get()); @@ -63,9 +67,6 @@ public void handleTick(Level level, BlockState state, Bl mainNode.setInWorldNode(true); mainNode.create(level, getBlockPos()); - //peripheral can be null if `getCapability` was not called before - if (peripheral == null) - peripheral = createPeripheral(); peripheral.setNode(mainNode); initialized = true; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/EnergyStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/EnergyStorageProxy.java deleted file mode 100644 index 81d7f4a00..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/util/EnergyStorageProxy.java +++ /dev/null @@ -1,76 +0,0 @@ -package de.srendi.advancedperipherals.common.util; - -import de.srendi.advancedperipherals.common.blocks.blockentities.EnergyDetectorEntity; -import net.minecraftforge.energy.IEnergyStorage; - -import java.util.Optional; - -public class EnergyStorageProxy implements IEnergyStorage { - - private final EnergyDetectorEntity energyDetectorTE; - private int maxTransferRate; - private int transferedInThisTick = 0; - - public EnergyStorageProxy(EnergyDetectorEntity energyDetectorTE, int maxTransferRate) { - this.energyDetectorTE = energyDetectorTE; - this.maxTransferRate = maxTransferRate; - } - - @Override - public boolean canReceive() { - return true; - } - - @Override - public int receiveEnergy(int maxReceive, boolean simulate) { - Optional out = energyDetectorTE.getOutputStorage(); - return out.map(outStorage -> { - int transferred = outStorage.receiveEnergy(Math.min(maxReceive, maxTransferRate), simulate); - if (!simulate) { - transferedInThisTick += transferred; - } - return transferred; - }).orElse(0); - } - - @Override - public int getEnergyStored() { - Optional out = energyDetectorTE.getOutputStorage(); - return out.map(IEnergyStorage::getEnergyStored).orElse(0); - } - - @Override - public int getMaxEnergyStored() { - Optional out = energyDetectorTE.getOutputStorage(); - return out.map(IEnergyStorage::getMaxEnergyStored).orElse(0); - } - - @Override - public boolean canExtract() { - return false; - } - - @Override - public int extractEnergy(int maxExtract, boolean simulate) { - return 0; - } - - public int getMaxTransferRate() { - return maxTransferRate; - } - - public void setMaxTransferRate(int rate) { - maxTransferRate = rate; - } - - /** - * should be called on every tick - */ - public void resetTransferedInThisTick() { - transferedInThisTick = 0; - } - - public int getTransferedInThisTick() { - return transferedInThisTick; - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/FluidStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/FluidStorageProxy.java deleted file mode 100644 index a61361aa0..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/util/FluidStorageProxy.java +++ /dev/null @@ -1,92 +0,0 @@ -package de.srendi.advancedperipherals.common.util; - -import de.srendi.advancedperipherals.common.blocks.blockentities.FluidDetectorEntity; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.Fluids; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -public class FluidStorageProxy implements IFluidHandler { - - private final FluidDetectorEntity fluidDetectorEntity; - private int maxTransferRate; - private int transferedInThisTick = 0; - private final Fluid fluid = Fluids.EMPTY; - - public FluidStorageProxy(FluidDetectorEntity fluidDetectorEntity, int maxTransferRate) { - this.fluidDetectorEntity = fluidDetectorEntity; - this.maxTransferRate = maxTransferRate; - } - - - public int getMaxTransferRate() { - return maxTransferRate; - } - - public void setMaxTransferRate(int rate) { - maxTransferRate = rate; - } - - /** - * should be called on every tick - */ - public void resetTransferedInThisTick() { - transferedInThisTick = 0; - } - - public int getTransferedInThisTick() { - return transferedInThisTick; - } - - @Override - public int getTanks() { - return 1; - } - - @Override - public @NotNull FluidStack getFluidInTank(int tank) { - Optional out = fluidDetectorEntity.getOutputStorage(); - return out.map(outStorage -> outStorage.getFluidInTank(tank)).orElse(FluidStack.EMPTY); - } - - @Override - public int getTankCapacity(int tank) { - Optional out = fluidDetectorEntity.getOutputStorage(); - return out.map(outStorage -> outStorage.getTankCapacity(tank)).orElse(0); - } - - @Override - public boolean isFluidValid(int tank, @NotNull FluidStack stack) { - Optional out = fluidDetectorEntity.getOutputStorage(); - return out.map(outStorage -> outStorage.isFluidValid(tank, stack)).orElse(false); - } - - @Override - public int fill(FluidStack resource, IFluidHandler.FluidAction action) { - Optional out = fluidDetectorEntity.getOutputStorage(); - return out.map(outStorage -> { - FluidStack transferring = resource.copy(); - transferring.setAmount(Math.min(resource.getAmount(), maxTransferRate)); - int transferred = outStorage.fill(transferring, action); - if (!action.simulate()) { - transferedInThisTick += transferred; - fluidDetectorEntity.lastFlowedLiquid = resource.copy(); - //transferedInThisTick = transferred; - } - return transferred; - }).orElse(0); - } - - @Override - public @NotNull FluidStack drain(int maxDrain, IFluidHandler.FluidAction action) { - return FluidStack.EMPTY; - } - - @Override - public @NotNull FluidStack drain(FluidStack resource, IFluidHandler.FluidAction action) { - return FluidStack.EMPTY; - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/GasStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/GasStorageProxy.java deleted file mode 100644 index d4e514a6d..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/util/GasStorageProxy.java +++ /dev/null @@ -1,99 +0,0 @@ -package de.srendi.advancedperipherals.common.util; - -import de.srendi.advancedperipherals.common.blocks.blockentities.GasDetectorEntity; -import mekanism.api.Action; -import mekanism.api.chemical.gas.GasStack; -import mekanism.api.chemical.gas.IGasHandler; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -public class GasStorageProxy implements IGasHandler { - - private final GasDetectorEntity fluidDetectorEntity; - private int maxTransferRate; - private int transferedInThisTick = 0; - - public GasStorageProxy(GasDetectorEntity fluidDetectorEntity, int maxTransferRate) { - this.fluidDetectorEntity = fluidDetectorEntity; - this.maxTransferRate = maxTransferRate; - } - - - public int getMaxTransferRate() { - return maxTransferRate; - } - - public void setMaxTransferRate(int rate) { - maxTransferRate = rate; - } - - /** - * should be called on every tick - */ - public void resetTransferedInThisTick() { - transferedInThisTick = 0; - } - - public int getTransferedInThisTick() { - return transferedInThisTick; - } - - @Override - public int getTanks() { - return 1; - } - - @NotNull - @Override - public GasStack getChemicalInTank(int tank) { - Optional out = fluidDetectorEntity.getOutputStorage(); - return out.map(outStorage -> outStorage.getChemicalInTank(tank)).orElse(GasStack.EMPTY); - } - - @Override - public void setChemicalInTank(int tank, @NotNull GasStack stack) { - Optional out = fluidDetectorEntity.getOutputStorage(); - out.ifPresent(outStorage -> outStorage.setChemicalInTank(tank, stack)); - } - - @Override - public long getTankCapacity(int tank) { - Optional out = fluidDetectorEntity.getOutputStorage(); - return out.map(outStorage -> outStorage.getTankCapacity(tank)).orElse(0L); - } - - @Override - public boolean isValid(int tank, @NotNull GasStack stack) { - Optional out = fluidDetectorEntity.getOutputStorage(); - return out.map(outStorage -> outStorage.isValid(tank, stack)).orElse(false); - } - - @NotNull - @Override - public GasStack insertChemical(@NotNull GasStack stack, @NotNull Action action) { - Optional out = fluidDetectorEntity.getOutputStorage(); - return out.map(outStorage -> { - GasStack transferring = stack.copy(); - transferring.setAmount(Math.min(stack.getAmount(), maxTransferRate)); - GasStack transferred = outStorage.insertChemical(transferring, action); - if (!action.simulate()) { - transferedInThisTick += transferring.getAmount() - transferred.getAmount(); - fluidDetectorEntity.lastFlowedGas = stack.copy(); - } - return transferred; - }).orElse(GasStack.EMPTY); - } - - @NotNull - @Override - public GasStack insertChemical(int tank, @NotNull GasStack stack, @NotNull Action action) { - return insertChemical(stack, action); - } - - @NotNull - @Override - public GasStack extractChemical(int tank, long amount, @NotNull Action action) { - return GasStack.EMPTY; - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/proxy/AbstractStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/AbstractStorageProxy.java new file mode 100644 index 000000000..b8e007c37 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/AbstractStorageProxy.java @@ -0,0 +1,42 @@ +package de.srendi.advancedperipherals.common.util.proxy; + +public abstract class AbstractStorageProxy implements IStorageProxy { + private final long maxTransferRate; + private volatile long transferRate; + private long transfered = 0; + + protected AbstractStorageProxy(long maxTransferRate) { + this.maxTransferRate = maxTransferRate; + this.transferRate = maxTransferRate; + } + + @Override + public long getMaxTransferRate() { + return this.maxTransferRate; + } + + @Override + public long getTransferRate() { + return this.transferRate; + } + + @Override + public void setTransferRate(long rate) { + this.transferRate = Math.min(rate, this.maxTransferRate); + } + + protected void resetStatus() { + this.transfered = 0; + } + + @Override + public long getAndResetTransfered() { + long transfered = this.transfered; + this.resetStatus(); + return transfered; + } + + protected void onTransfered(long amount) { + this.transfered += amount; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/proxy/EnergyStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/EnergyStorageProxy.java new file mode 100644 index 000000000..de4481be4 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/EnergyStorageProxy.java @@ -0,0 +1,74 @@ +package de.srendi.advancedperipherals.common.util.proxy; + +import de.srendi.advancedperipherals.common.blocks.blockentities.EnergyDetectorEntity; +import net.minecraftforge.energy.IEnergyStorage; + +public class EnergyStorageProxy extends AbstractStorageProxy implements IEnergyStorage { + + private final EnergyDetectorEntity energyDetectorTE; + private boolean lastTransfered = false; + private boolean wasReady = false; + private volatile boolean ready = false; + + public EnergyStorageProxy(EnergyDetectorEntity energyDetectorTE, int maxTransferRate) { + super(maxTransferRate); + this.energyDetectorTE = energyDetectorTE; + } + + @Override + public boolean canReceive() { + return true; + } + + @Override + public int receiveEnergy(int maxReceive, boolean simulate) { + return energyDetectorTE.getOutputStorage().map(outStorage -> { + int transferred = outStorage.receiveEnergy((int) Math.min(maxReceive, this.getTransferRate()), simulate); + if (!simulate) { + this.wasReady = true; + if (transferred > 0) { + this.lastTransfered = true; + this.onTransfered(transferred); + } + } + return transferred; + }).orElse(0); + } + + @Override + public String getLastTransferedId() { + return this.lastTransfered ? "forge:energy" : null; + } + + @Override + public String getReadyTransferId() { + return this.ready ? "forge:energy" : null; + } + + @Override + protected void resetStatus() { + super.resetStatus(); + this.ready = this.wasReady; + this.wasReady = false; + } + + @Override + public int getEnergyStored() { + return energyDetectorTE.getOutputStorage().map(IEnergyStorage::getEnergyStored).orElse(0); + } + + @Override + public int getMaxEnergyStored() { + return energyDetectorTE.getOutputStorage().map(IEnergyStorage::getMaxEnergyStored).orElse(0); + } + + @Override + public boolean canExtract() { + return false; + } + + @Override + public int extractEnergy(int maxExtract, boolean simulate) { + return 0; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/proxy/FluidStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/FluidStorageProxy.java new file mode 100644 index 000000000..ceccd2bcc --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/FluidStorageProxy.java @@ -0,0 +1,85 @@ +package de.srendi.advancedperipherals.common.util.proxy; + +import de.srendi.advancedperipherals.common.blocks.blockentities.FluidDetectorEntity; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +public class FluidStorageProxy extends AbstractStorageProxy implements IFluidHandler { + + private final FluidDetectorEntity fluidDetectorEntity; + private ResourceLocation lastTransfered = null; + private ResourceLocation wasReady = null; + private volatile ResourceLocation ready = null; + + public FluidStorageProxy(FluidDetectorEntity fluidDetectorEntity, int maxTransferRate) { + super(maxTransferRate); + this.fluidDetectorEntity = fluidDetectorEntity; + } + + @Override + public int getTanks() { + return 1; + } + + @Override + public @NotNull FluidStack getFluidInTank(int tank) { + return fluidDetectorEntity.getOutputStorage().map(outStorage -> outStorage.getFluidInTank(tank)).orElse(FluidStack.EMPTY); + } + + @Override + public int getTankCapacity(int tank) { + return fluidDetectorEntity.getOutputStorage().map(outStorage -> outStorage.getTankCapacity(tank)).orElse(0); + } + + @Override + public boolean isFluidValid(int tank, @NotNull FluidStack stack) { + return fluidDetectorEntity.getOutputStorage().map(outStorage -> outStorage.isFluidValid(tank, stack)).orElse(false); + } + + @Override + public int fill(FluidStack resource, IFluidHandler.FluidAction action) { + return fluidDetectorEntity.getOutputStorage().map(outStorage -> { + FluidStack transferring = resource.copy(); + transferring.setAmount((int) Math.min(resource.getAmount(), this.getTransferRate())); + int transferred = outStorage.fill(transferring, action); + if (!action.simulate()) { + this.wasReady = ForgeRegistries.FLUIDS.getKey(resource.getFluid()); + if (transferred > 0) { + this.onTransfered(transferred); + this.lastTransfered = this.wasReady; + } + } + return transferred; + }).orElse(0); + } + + @Override + public String getLastTransferedId() { + return this.lastTransfered == null ? null : this.lastTransfered.toString(); + } + + @Override + public String getReadyTransferId() { + return this.ready == null ? null : this.ready.toString(); + } + + @Override + protected void resetStatus() { + super.resetStatus(); + this.ready = this.wasReady; + this.wasReady = null; + } + + @Override + public @NotNull FluidStack drain(int maxDrain, IFluidHandler.FluidAction action) { + return FluidStack.EMPTY; + } + + @Override + public @NotNull FluidStack drain(FluidStack resource, IFluidHandler.FluidAction action) { + return FluidStack.EMPTY; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/proxy/GasStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/GasStorageProxy.java new file mode 100644 index 000000000..d2cf8f544 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/GasStorageProxy.java @@ -0,0 +1,95 @@ +package de.srendi.advancedperipherals.common.util.proxy; + +import de.srendi.advancedperipherals.common.blocks.blockentities.GasDetectorEntity; +import mekanism.api.Action; +import mekanism.api.chemical.gas.GasStack; +import mekanism.api.chemical.gas.IGasHandler; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +public class GasStorageProxy extends AbstractStorageProxy implements IGasHandler { + + private final GasDetectorEntity gasDetectorEntity; + private ResourceLocation lastTransfered = null; + private ResourceLocation wasReady = null; + private volatile ResourceLocation ready = null; + + public GasStorageProxy(GasDetectorEntity gasDetectorEntity, int maxTransferRate) { + super(maxTransferRate); + this.gasDetectorEntity = gasDetectorEntity; + } + + @Override + public int getTanks() { + return 1; + } + + @NotNull + @Override + public GasStack getChemicalInTank(int tank) { + return gasDetectorEntity.getOutputStorage().map(outStorage -> outStorage.getChemicalInTank(tank)).orElse(GasStack.EMPTY); + } + + @Override + public void setChemicalInTank(int tank, @NotNull GasStack stack) { + gasDetectorEntity.getOutputStorage().ifPresent(outStorage -> outStorage.setChemicalInTank(tank, stack)); + } + + @Override + public long getTankCapacity(int tank) { + return gasDetectorEntity.getOutputStorage().map(outStorage -> outStorage.getTankCapacity(tank)).orElse(0L); + } + + @Override + public boolean isValid(int tank, @NotNull GasStack stack) { + return gasDetectorEntity.getOutputStorage().map(outStorage -> outStorage.isValid(tank, stack)).orElse(false); + } + + @NotNull + @Override + public GasStack insertChemical(@NotNull GasStack stack, @NotNull Action action) { + return gasDetectorEntity.getOutputStorage().map(outStorage -> { + GasStack transferring = stack.copy(); + transferring.setAmount(Math.min(stack.getAmount(), this.getTransferRate())); + GasStack left = outStorage.insertChemical(transferring, action); + if (!action.simulate()) { + this.wasReady = stack.getTypeRegistryName(); + long transferred = transferring.getAmount() - left.getAmount(); + if (transferred > 0) { + this.onTransfered(transferred); + this.lastTransfered = this.wasReady; + } + } + return left; + }).orElse(GasStack.EMPTY); + } + + @Override + public String getLastTransferedId() { + return this.lastTransfered == null ? null : this.lastTransfered.toString(); + } + + @Override + public String getReadyTransferId() { + return this.ready == null ? null : this.ready.toString(); + } + + @Override + protected void resetStatus() { + super.resetStatus(); + this.ready = this.wasReady; + this.wasReady = null; + } + + @NotNull + @Override + public GasStack insertChemical(int tank, @NotNull GasStack stack, @NotNull Action action) { + return insertChemical(stack, action); + } + + @NotNull + @Override + public GasStack extractChemical(int tank, long amount, @NotNull Action action) { + return GasStack.EMPTY; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/proxy/IStorageProxy.java b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/IStorageProxy.java new file mode 100644 index 000000000..59ddee014 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/IStorageProxy.java @@ -0,0 +1,19 @@ +package de.srendi.advancedperipherals.common.util.proxy; + +import org.jetbrains.annotations.Nullable; + +public interface IStorageProxy { + long getMaxTransferRate(); + + long getTransferRate(); + + void setTransferRate(long rate); + + long getAndResetTransfered(); + + @Nullable + String getLastTransferedId(); + + @Nullable + String getReadyTransferId(); +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/ZeroGasTank.java b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/ZeroGasTank.java similarity index 94% rename from src/main/java/de/srendi/advancedperipherals/common/util/ZeroGasTank.java rename to src/main/java/de/srendi/advancedperipherals/common/util/proxy/ZeroGasTank.java index 48f81d3b1..bc92925f6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/ZeroGasTank.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/proxy/ZeroGasTank.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.util; +package de.srendi.advancedperipherals.common.util.proxy; import mekanism.api.Action; import mekanism.api.chemical.gas.GasStack; From 9aa306215fc3ee5e777e27f339856916d179978d Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 18 Jan 2025 18:38:33 -0700 Subject: [PATCH 154/188] add a few doc --- .../blocks/base/BaseDetectorEntity.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java index 7fd847acc..50ee19459 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java @@ -14,6 +14,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +/** + * @param The storage handle type + * @param The storage proxy type, must implements/extends both {@code } and {@link IStorageProxy} + */ public abstract class BaseDetectorEntity> extends PeripheralBlockEntity

{ private static final String RATE_LIMIT_TAG = "RateLimit"; @@ -41,18 +45,30 @@ protected S getStorageProxy() { return this.proxy; } + /** + * @return the transfered amount of stuff in the last tick + */ public long getTransferRate() { return this.transferRate; } + /** + * @return the possible maximum transfered amount + */ public long getMaxTransferRate() { return this.proxy.getMaxTransferRate(); } + /** + * @return the max amount of stuff can be transfered in a tick + */ public long getTransferRateLimit() { return this.proxy.getTransferRate(); } + /** + * @param rate the max amount of stuff can be transfered in a tick + */ public void setTransferRateLimit(long rate) { if (this.proxy.getTransferRate() != rate) { this.proxy.setTransferRate(rate); @@ -60,11 +76,17 @@ public void setTransferRateLimit(long rate) { } } + /** + * @return the ID of last transfered stuff + */ @Nullable public String getLastTransferedId() { return this.proxy.getLastTransferedId(); } + /** + * @return the ID of ready transfered stuff + */ @Nullable public String getReadyTransferId() { return this.proxy.getReadyTransferId(); From 27c1ff81274c85d9920aea30857280df1a434568 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 18 Jan 2025 19:02:16 -0700 Subject: [PATCH 155/188] add param

--- .../common/blocks/base/BaseDetectorEntity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java index 50ee19459..f0a92f033 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java @@ -17,6 +17,7 @@ /** * @param The storage handle type * @param The storage proxy type, must implements/extends both {@code } and {@link IStorageProxy} + * @param

The peripheral type, must extends {@link BasePeripheral} */ public abstract class BaseDetectorEntity> extends PeripheralBlockEntity

{ From c196a590d3009b6f2ba57bd8540318791034f0fd Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 20 Jan 2025 08:11:49 -0700 Subject: [PATCH 156/188] add cable p2p tunnel --- .../03e4de26f1265135874f8cdcaebc09d9c08eb42b | 3 +- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +- .../advancedperipherals/lang/en_us.json | 1 + .../p2p_attunements/cable_p2p_tunnel.json | 7 + .../AdvancedPeripherals.java | 9 ++ .../common/addons/APAddons.java | 41 +++-- .../AppEngApi.java | 2 +- .../{appliedenergistics => ae2}/CraftJob.java | 2 +- .../common/addons/ae2/Integration.java | 22 +++ .../MeBridgeEntityListener.java | 2 +- .../MeFluidHandler.java | 2 +- .../MeItemHandler.java | 2 +- .../common/addons/ae2/Registries.java | 23 +++ .../addons/ae2/WiredCableP2PTunnelPart.java | 143 ++++++++++++++++++ .../IntegrationPeripheralProvider.java | 11 +- .../peripheral/MeBridgePeripheral.java | 8 +- .../blocks/blockentities/MeBridgeEntity.java | 6 +- .../common/data/EnUsLanguageProvider.java | 2 + .../common/data/ItemTagsProvider.java | 4 + .../common/setup/APItems.java | 2 + src/main/resources/META-INF/mods.toml | 4 +- .../models/part/p2p/p2p_tunnel_cable.json | 6 + 22 files changed, 274 insertions(+), 32 deletions(-) create mode 100644 src/generated/resources/data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json rename src/main/java/de/srendi/advancedperipherals/common/addons/{appliedenergistics => ae2}/AppEngApi.java (99%) rename src/main/java/de/srendi/advancedperipherals/common/addons/{appliedenergistics => ae2}/CraftJob.java (98%) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java rename src/main/java/de/srendi/advancedperipherals/common/addons/{appliedenergistics => ae2}/MeBridgeEntityListener.java (90%) rename src/main/java/de/srendi/advancedperipherals/common/addons/{appliedenergistics => ae2}/MeFluidHandler.java (96%) rename src/main/java/de/srendi/advancedperipherals/common/addons/{appliedenergistics => ae2}/MeItemHandler.java (96%) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Registries.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java create mode 100644 src/main/resources/assets/advancedperipherals/models/part/p2p/p2p_tunnel_cable.json diff --git a/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b b/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b index 559ba3090..beca45b50 100644 --- a/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b +++ b/src/generated/resources/.cache/03e4de26f1265135874f8cdcaebc09d9c08eb42b @@ -1,2 +1,3 @@ -// 1.19.2 2024-05-28T14:53:16.653667 Tags for minecraft:item +// 1.19.2 2025-01-20T07:59:27.474151 Tags for minecraft:item +de4b4f45ec18b2b1f0db1c36882981042e20ee23 data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json 72eba3b11f69e16c87488f7c4ba7cfdad42c378e data/advancedperipherals/tags/items/smart_glasses.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index e9f92dc08..2cb09adb4 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2025-01-16T15:59:34.693839 Languages: en_us -d0fe3ab5a88d6b925369860038c76f23d9910143 assets/advancedperipherals/lang/en_us.json +// 1.19.2 2025-01-20T07:50:09.44057 Languages: en_us +ebf2194b8fece940adb61f1ae317f68799bd498f assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index 014212826..ef080ec50 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -34,6 +34,7 @@ "block.advancedperipherals.rs_bridge": "RS Bridge", "curios.identifier.glasses": "Glasses", "entity.minecraft.villager.advancedperipherals.computer_scientist": "Computer Scientist", + "item.advancedperipherals.cable_p2p_tunnel": "Cable P2P Tunnel", "item.advancedperipherals.chunk_controller": "Chunk Controller", "item.advancedperipherals.computer_tool": "Computer Tool", "item.advancedperipherals.end_automata_core": "End Automata Core", diff --git a/src/generated/resources/data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json b/src/generated/resources/data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json new file mode 100644 index 000000000..7fc8269c3 --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/tags/items/p2p_attunements/cable_p2p_tunnel.json @@ -0,0 +1,7 @@ +{ + "values": [ + "computercraft:cable", + "computercraft:wired_modem", + "computercraft:wired_modem_full" + ] +} \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java index 615c49195..6aade9e68 100644 --- a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java +++ b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java @@ -11,6 +11,7 @@ import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -35,6 +36,7 @@ public AdvancedPeripherals() { APConfig.register(ModLoadingContext.get()); modBus.addListener(this::commonSetup); + modBus.addListener(this::onLoadComplete); APRegistration.register(); MinecraftForge.EVENT_BUS.register(this); new APAddons(); @@ -67,4 +69,11 @@ public void commonSetup(FMLCommonSetupEvent event) { }); } + public void onLoadComplete(FMLLoadCompleteEvent event) { + event.enqueueWork(() -> { + if (APAddons.appliedEnergisticsLoaded) { + de.srendi.advancedperipherals.common.addons.ae2.Integration.onComplete(); + } + }); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java index 6f00434c1..2c9948e2a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java @@ -23,38 +23,51 @@ @Mod.EventBusSubscriber(modid = AdvancedPeripherals.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class APAddons { - public static final String CURIOS_MODID = "curios"; - public static final String REFINEDSTORAGE_MODID = "refinedstorage"; + public static final String AE_ADDITIONS_MODID = "ae2additions"; public static final String AE_THINGS_MODID = "ae2things"; public static final String APPLIEDENERGISTICS_MODID = "ae2"; - public static final String MEKANISM_MODID = "mekanism"; - public static final String AE_ADDITIONS_MODID = "ae2additions"; public static final String APP_MEKANISTICS_MODID = "appmek"; + public static final String BOTANIA_MODID = "botania"; + public static final String CREATE_MODID = "create"; + public static final String CURIOS_MODID = "curios"; + public static final String DIMSTORAGE_MODID = "dimstorage"; + public static final String MEKANISM_MODID = "mekanism"; + public static final String POWAH_MODID = "powah"; + public static final String REFINEDSTORAGE_MODID = "refinedstorage"; public static final String VALKYRIEN_SKIES_MODID = "valkyrienskies"; - public static boolean curiosLoaded; - public static boolean refinedStorageLoaded; + public static boolean aeAdditionsLoaded; public static boolean aeThingsLoaded; + public static boolean appMekLoaded; public static boolean appliedEnergisticsLoaded; + public static boolean botaniaLoaded; + public static boolean createLoaded; + public static boolean curiosLoaded; + public static boolean dimstorageLoaded; public static boolean mekanismLoaded; - public static boolean aeAdditionsLoaded; - public static boolean appMekLoaded; + public static boolean powahLoaded; + public static boolean refinedStorageLoaded; public static boolean vs2Loaded; // Use static so these checks run as early as possible, so we can use them for our registries static { ModList modList = ModList.get(); - curiosLoaded = modList.isLoaded(CURIOS_MODID); - refinedStorageLoaded = modList.isLoaded(REFINEDSTORAGE_MODID); - appliedEnergisticsLoaded = modList.isLoaded(APPLIEDENERGISTICS_MODID); - mekanismLoaded = modList.isLoaded(MEKANISM_MODID); - aeThingsLoaded = modList.isLoaded(AE_THINGS_MODID); aeAdditionsLoaded = modList.isLoaded(AE_ADDITIONS_MODID); + aeThingsLoaded = modList.isLoaded(AE_THINGS_MODID); appMekLoaded = modList.isLoaded(APP_MEKANISTICS_MODID); + appliedEnergisticsLoaded = modList.isLoaded(APPLIEDENERGISTICS_MODID); + botaniaLoaded = modList.isLoaded(BOTANIA_MODID); + createLoaded = modList.isLoaded(CREATE_MODID); + curiosLoaded = modList.isLoaded(CURIOS_MODID); + dimstorageLoaded = modList.isLoaded(DIMSTORAGE_MODID); + mekanismLoaded = modList.isLoaded(MEKANISM_MODID); + powahLoaded = modList.isLoaded(POWAH_MODID); + refinedStorageLoaded = modList.isLoaded(REFINEDSTORAGE_MODID); vs2Loaded = modList.isLoaded(VALKYRIEN_SKIES_MODID); - if (refinedStorageLoaded) + if (refinedStorageLoaded) { RefinedStorage.instance = new RefinedStorage(); + } } @SubscribeEvent diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AppEngApi.java similarity index 99% rename from src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AppEngApi.java index fbd53e35b..4ba53c7e5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/AppEngApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AppEngApi.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.addons.appliedenergistics; +package de.srendi.advancedperipherals.common.addons.ae2; import appeng.api.crafting.IPatternDetails; import appeng.api.inventories.InternalInventory; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/CraftJob.java similarity index 98% rename from src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/CraftJob.java index c7a0b6c95..e113ed21d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/CraftJob.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/CraftJob.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.addons.appliedenergistics; +package de.srendi.advancedperipherals.common.addons.ae2; import appeng.api.networking.IGrid; import appeng.api.networking.IGridNode; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java new file mode 100644 index 000000000..f34d985cb --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java @@ -0,0 +1,22 @@ +package de.srendi.advancedperipherals.common.addons.ae2; + +import appeng.api.features.P2PTunnelAttunement; +import dan200.computercraft.shared.Capabilities; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; + +public class Integration implements Runnable { + + @Override + public void run() { + } + + public static void onComplete() { + P2PTunnelAttunement.registerAttunementTag(Registries.CABLE_P2P_TUNNEL.get()); + } + + public static TagKey getCableP2PTag() { + return P2PTunnelAttunement.getAttunementTag(Registries.CABLE_P2P_TUNNEL.get()); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeBridgeEntityListener.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeBridgeEntityListener.java similarity index 90% rename from src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeBridgeEntityListener.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeBridgeEntityListener.java index 10cc242fb..009b6e8df 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeBridgeEntityListener.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeBridgeEntityListener.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.addons.appliedenergistics; +package de.srendi.advancedperipherals.common.addons.ae2; import appeng.api.networking.IGridNode; import appeng.api.networking.IGridNodeListener; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeFluidHandler.java similarity index 96% rename from src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeFluidHandler.java index 6f10b6be9..4eb75c853 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeFluidHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeFluidHandler.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.addons.appliedenergistics; +package de.srendi.advancedperipherals.common.addons.ae2; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeItemHandler.java similarity index 96% rename from src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeItemHandler.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeItemHandler.java index a3542cda3..1c5655f70 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/appliedenergistics/MeItemHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeItemHandler.java @@ -1,4 +1,4 @@ -package de.srendi.advancedperipherals.common.addons.appliedenergistics; +package de.srendi.advancedperipherals.common.addons.ae2; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Registries.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Registries.java new file mode 100644 index 000000000..75d27749c --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Registries.java @@ -0,0 +1,23 @@ +package de.srendi.advancedperipherals.common.addons.ae2; + +import appeng.api.parts.IPart; +import appeng.api.parts.IPartItem; +import appeng.api.parts.PartModels; +import appeng.items.parts.PartItem; +import appeng.items.parts.PartModelsHelper; +import de.srendi.advancedperipherals.common.setup.APRegistration; +import net.minecraft.world.item.Item; +import net.minecraftforge.registries.RegistryObject; + +import java.util.function.Function; + +public final class Registries { + private Registries() {} + + public static final RegistryObject> CABLE_P2P_TUNNEL = registerPart("cable_p2p_tunnel", WiredCableP2PTunnelPart.class, WiredCableP2PTunnelPart::new); + + private static RegistryObject> registerPart(String id, Class clazz, Function, T> factory) { + PartModels.registerModels(PartModelsHelper.createModels(clazz)); + return APRegistration.ITEMS.register(id, () -> new PartItem<>(new Item.Properties(), clazz, factory)); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java new file mode 100644 index 000000000..6c7b630a8 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java @@ -0,0 +1,143 @@ +package de.srendi.advancedperipherals.common.addons.ae2; + +import appeng.api.parts.IPartItem; +import appeng.api.parts.IPartModel; +import appeng.items.parts.PartModels; +import appeng.parts.p2p.CapabilityP2PTunnelPart; +import appeng.parts.p2p.P2PModels; +import dan200.computercraft.api.network.wired.IWiredElement; +import dan200.computercraft.api.network.wired.IWiredNode; +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.shared.Capabilities; +import dan200.computercraft.shared.peripheral.modem.wired.WiredModemElement; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.annotation.Nonnull; + +public class WiredCableP2PTunnelPart extends CapabilityP2PTunnelPart { + private static final P2PModels MODELS = new P2PModels(AdvancedPeripherals.getRL("part/p2p/p2p_tunnel_cable")); + + private final P2PWiredElement element = new P2PWiredElement(); + private final IWiredNode node = this.element.getNode(); + private final Set connected = new HashSet<>(); + private short lastFreq = 0; + + public WiredCableP2PTunnelPart(IPartItem partItem) { + super(partItem, Capabilities.CAPABILITY_WIRED_ELEMENT); + this.inputHandler = element; + this.outputHandler = element; + this.emptyHandler = element; + } + + @PartModels + public static List getModels() { + return MODELS.getModels(); + } + + @Override + public IPartModel getStaticModels() { + return MODELS.getModel(this.isPowered(), this.isActive()); + } + + public void onTunnelConfigChange() { + this.connectionsChanged(); + } + + public void onTunnelNetworkChange() { + this.connectionsChanged(); + } + + protected void connectionsChanged() { + if (this.lastFreq == this.getFrequency()) { + return; + } + this.lastFreq = this.getFrequency(); + + for (IWiredNode node : this.connected) { + System.err.println("Disconnecting from " + node); + this.node.disconnectFrom(node); + } + this.connected.clear(); + + WiredCableP2PTunnelPart in = this.getInput(); + if (in != null && in != this) { + System.err.println("Connecting to " + in.node); + this.node.connectTo(in.node); + this.connected.add(in.node); + } + for (WiredCableP2PTunnelPart out : WiredCableP2PTunnelPart.this.getOutputs()) { + if (out != this) { + System.err.println("Connecting to " + out.node); + this.node.connectTo(out.node); + this.connected.add(out.node); + } + } + } + + private class P2PWiredElement extends WiredModemElement { + private boolean updated = false; + + @Nonnull + @Override + public Level getLevel() { + return WiredCableP2PTunnelPart.this.getLevel(); + } + + @Nonnull + @Override + public Vec3 getPosition() { + return Vec3.atCenterOf(WiredCableP2PTunnelPart.this.getBlockEntity().getBlockPos()); + } + + @Nonnull + @Override + public String getSenderID() { + return "p2p"; + } + + @Override + protected void attachPeripheral(String name, IPeripheral peripheral) { + if (this.updated) { + return; + } + this.updated = true; + try { + WiredCableP2PTunnelPart.this.connectionsChanged(); + WiredCableP2PTunnelPart in = WiredCableP2PTunnelPart.this.getInput(); + if (in != null) { + in.element.attachPeripheral(name, peripheral); + } + for (WiredCableP2PTunnelPart out : WiredCableP2PTunnelPart.this.getOutputs()) { + out.element.attachPeripheral(name, peripheral); + } + } finally { + this.updated = false; + } + } + + @Override + protected void detachPeripheral(String name) { + if (this.updated) { + return; + } + this.updated = true; + try { + WiredCableP2PTunnelPart.this.connectionsChanged(); + WiredCableP2PTunnelPart in = WiredCableP2PTunnelPart.this.getInput(); + if (in != null) { + in.element.detachPeripheral(name); + } + for (WiredCableP2PTunnelPart out : WiredCableP2PTunnelPart.this.getOutputs()) { + out.element.detachPeripheral(name); + } + } finally { + this.updated = false; + } + } + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java index b3a9d8e7a..8f4dbb2cf 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java @@ -3,6 +3,7 @@ import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheralProvider; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.util.Platform; import de.srendi.advancedperipherals.lib.integrations.IPeripheralIntegration; import de.srendi.advancedperipherals.lib.peripherals.BlockEntityIntegrationPeripheral; @@ -23,7 +24,15 @@ public class IntegrationPeripheralProvider implements IPeripheralProvider { - private static final String[] SUPPORTED_MODS = new String[]{"botania", "create", "mekanism", "powah", "dimstorage", "valkyrienskies"}; + private static final String[] SUPPORTED_MODS = new String[]{ + APAddons.APPLIEDENERGISTICS_MODID, + APAddons.BOTANIA_MODID, + APAddons.CREATE_MODID, + APAddons.MEKANISM_MODID, + APAddons.POWAH_MODID, + APAddons.DIMSTORAGE_MODID, + APAddons.VALKYRIEN_SKIES_MODID + }; private static final PriorityQueue integrations = new PriorityQueue<>(Comparator.comparingInt(IPeripheralIntegration::getPriority)); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java index 4a535157d..705ff1edb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java @@ -16,10 +16,10 @@ import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.core.apis.TableHelper; import dan200.computercraft.core.computer.ComputerSide; -import de.srendi.advancedperipherals.common.addons.appliedenergistics.AppEngApi; -import de.srendi.advancedperipherals.common.addons.appliedenergistics.CraftJob; -import de.srendi.advancedperipherals.common.addons.appliedenergistics.MeFluidHandler; -import de.srendi.advancedperipherals.common.addons.appliedenergistics.MeItemHandler; +import de.srendi.advancedperipherals.common.addons.ae2.AppEngApi; +import de.srendi.advancedperipherals.common.addons.ae2.CraftJob; +import de.srendi.advancedperipherals.common.addons.ae2.MeFluidHandler; +import de.srendi.advancedperipherals.common.addons.ae2.MeItemHandler; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.MeBridgeEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java index 0001aa14b..cd7600449 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java @@ -12,9 +12,9 @@ import appeng.api.stacks.AEItemKey; import appeng.api.storage.StorageHelper; import appeng.api.util.AECableType; -import de.srendi.advancedperipherals.common.addons.appliedenergistics.AppEngApi; -import de.srendi.advancedperipherals.common.addons.appliedenergistics.CraftJob; -import de.srendi.advancedperipherals.common.addons.appliedenergistics.MeBridgeEntityListener; +import de.srendi.advancedperipherals.common.addons.ae2.AppEngApi; +import de.srendi.advancedperipherals.common.addons.ae2.CraftJob; +import de.srendi.advancedperipherals.common.addons.ae2.MeBridgeEntityListener; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MeBridgePeripheral; import de.srendi.advancedperipherals.common.blocks.base.IInventoryBlock; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index 9627a4912..1e874d486 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -57,6 +57,8 @@ private void addItems() { addItem(APItems.OVERPOWERED_HUSBANDRY_AUTOMATA_CORE, "Overpowered Husbandry Automata Core"); addItem(APItems.OVERPOWERED_WEAK_AUTOMATA_CORE, "Overpowered Weak Automata Core"); addItem(APItems.WEAK_AUTOMATA_CORE, "Weak Automata Core"); + + addItem(APItems.CABLE_P2P_TUNNEL, "Cable P2P Tunnel"); } private void addBlocks() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java index 8cd142217..611e3f235 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java @@ -19,5 +19,9 @@ protected ItemTagsProvider(DataGenerator generator, @Nullable ExistingFileHelper @Override protected void addTags() { tag(APTags.Items.SMART_GLASSES).add(APItems.SMART_GLASSES.get()).add(APItems.SMART_GLASSES_NETHERITE.get()); + tag(de.srendi.advancedperipherals.common.addons.ae2.Integration.getCableP2PTag()) + .add(dan200.computercraft.shared.Registry.ModItems.CABLE.get()) + .add(dan200.computercraft.shared.Registry.ModItems.WIRED_MODEM.get()) + .add(dan200.computercraft.shared.Registry.ModItems.WIRED_MODEM_FULL.get()); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java index 36c5378e4..394123407 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java @@ -1,5 +1,6 @@ package de.srendi.advancedperipherals.common.setup; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.items.APItem; import de.srendi.advancedperipherals.common.items.MemoryCardItem; @@ -15,6 +16,7 @@ public class APItems { + public static final RegistryObject CABLE_P2P_TUNNEL = APAddons.appliedEnergisticsLoaded ? (RegistryObject) (RegistryObject) de.srendi.advancedperipherals.common.addons.ae2.Registries.CABLE_P2P_TUNNEL : null; public static final RegistryObject CHUNK_CONTROLLER = APRegistration.ITEMS.register("chunk_controller", () -> new APItem(new Item.Properties().stacksTo(16), APConfig.PERIPHERALS_CONFIG.enableChunkyTurtle)); public static final RegistryObject COMPUTER_TOOL = APRegistration.ITEMS.register("computer_tool", () -> new APItem(new Item.Properties().stacksTo(1), () -> true)); public static final RegistryObject END_AUTOMATA_CORE = APRegistration.ITEMS.register("end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index f4a652f24..5ff034ed1 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,7 +1,7 @@ modLoader = "javafml" loaderVersion = "[${loader_version},)" -license = "All rights reserved" -issueTrackerURL = "https://github.com/Seniorendi/AdvancedPeripherals/issues" +license = "Apache-2.0" +issueTrackerURL = "https://github.com/IntelligenceModding/AdvancedPeripherals/issues" logoFile = "pack.png" [[mods]] modId = "${mod_id}" diff --git a/src/main/resources/assets/advancedperipherals/models/part/p2p/p2p_tunnel_cable.json b/src/main/resources/assets/advancedperipherals/models/part/p2p/p2p_tunnel_cable.json new file mode 100644 index 000000000..6baaf6042 --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/models/part/p2p/p2p_tunnel_cable.json @@ -0,0 +1,6 @@ +{ + "parent": "ae2:part/p2p/p2p_tunnel_base", + "textures": { + "type": "computercraft:block/wired_modem_face" + } +} From 94fa325386b0b29b06e682c4c0d8cfb679956e17 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 20 Jan 2025 08:15:16 -0700 Subject: [PATCH 157/188] remove debug logs --- .../common/addons/ae2/WiredCableP2PTunnelPart.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java index 6c7b630a8..4064b2442 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java @@ -59,20 +59,17 @@ protected void connectionsChanged() { this.lastFreq = this.getFrequency(); for (IWiredNode node : this.connected) { - System.err.println("Disconnecting from " + node); this.node.disconnectFrom(node); } this.connected.clear(); WiredCableP2PTunnelPart in = this.getInput(); if (in != null && in != this) { - System.err.println("Connecting to " + in.node); this.node.connectTo(in.node); this.connected.add(in.node); } for (WiredCableP2PTunnelPart out : WiredCableP2PTunnelPart.this.getOutputs()) { if (out != this) { - System.err.println("Connecting to " + out.node); this.node.connectTo(out.node); this.connected.add(out.node); } From 49dc39ee8e800a6affe55b21017bac56dfd6bef0 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 20 Jan 2025 08:15:40 -0700 Subject: [PATCH 158/188] add Overrides --- .../common/addons/ae2/WiredCableP2PTunnelPart.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java index 4064b2442..088df6373 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java @@ -44,10 +44,12 @@ public IPartModel getStaticModels() { return MODELS.getModel(this.isPowered(), this.isActive()); } + @Override public void onTunnelConfigChange() { this.connectionsChanged(); } + @Override public void onTunnelNetworkChange() { this.connectionsChanged(); } From 002c447003043c827b35378664af1dcb9dcacc97 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 20 Jan 2025 08:17:16 -0700 Subject: [PATCH 159/188] checkstyle --- .../advancedperipherals/common/addons/ae2/Integration.java | 2 -- .../integrations/IntegrationPeripheralProvider.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java index f34d985cb..3006888f5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java @@ -1,8 +1,6 @@ package de.srendi.advancedperipherals.common.addons.ae2; import appeng.api.features.P2PTunnelAttunement; -import dan200.computercraft.shared.Capabilities; -import net.minecraft.network.chat.Component; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java index 8f4dbb2cf..ca3fa9ad5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java @@ -31,7 +31,7 @@ public class IntegrationPeripheralProvider implements IPeripheralProvider { APAddons.MEKANISM_MODID, APAddons.POWAH_MODID, APAddons.DIMSTORAGE_MODID, - APAddons.VALKYRIEN_SKIES_MODID + APAddons.VALKYRIEN_SKIES_MODID, }; private static final PriorityQueue integrations = new PriorityQueue<>(Comparator.comparingInt(IPeripheralIntegration::getPriority)); From f16ee9c1a60f57807eaf2a89dd20678670155ed9 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Mon, 20 Jan 2025 08:24:30 -0700 Subject: [PATCH 160/188] updated -> updating --- .../common/addons/ae2/WiredCableP2PTunnelPart.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java index 088df6373..c0424c25d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java @@ -79,7 +79,7 @@ protected void connectionsChanged() { } private class P2PWiredElement extends WiredModemElement { - private boolean updated = false; + private boolean updating = false; @Nonnull @Override @@ -101,10 +101,10 @@ public String getSenderID() { @Override protected void attachPeripheral(String name, IPeripheral peripheral) { - if (this.updated) { + if (this.updating) { return; } - this.updated = true; + this.updating = true; try { WiredCableP2PTunnelPart.this.connectionsChanged(); WiredCableP2PTunnelPart in = WiredCableP2PTunnelPart.this.getInput(); @@ -115,16 +115,16 @@ protected void attachPeripheral(String name, IPeripheral peripheral) { out.element.attachPeripheral(name, peripheral); } } finally { - this.updated = false; + this.updating = false; } } @Override protected void detachPeripheral(String name) { - if (this.updated) { + if (this.updating) { return; } - this.updated = true; + this.updating = true; try { WiredCableP2PTunnelPart.this.connectionsChanged(); WiredCableP2PTunnelPart in = WiredCableP2PTunnelPart.this.getInput(); @@ -135,7 +135,7 @@ protected void detachPeripheral(String name) { out.element.detachPeripheral(name); } } finally { - this.updated = false; + this.updating = false; } } } From 91ef22ac3184a4d9a6420213a602cd7e4d2c62c3 Mon Sep 17 00:00:00 2001 From: Srendi Date: Mon, 20 Jan 2025 23:30:50 +0100 Subject: [PATCH 161/188] Create p2p item model --- .../advancedperipherals/models/item/cable_p2p_tunnel.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/resources/assets/advancedperipherals/models/item/cable_p2p_tunnel.json diff --git a/src/main/resources/assets/advancedperipherals/models/item/cable_p2p_tunnel.json b/src/main/resources/assets/advancedperipherals/models/item/cable_p2p_tunnel.json new file mode 100644 index 000000000..334ded781 --- /dev/null +++ b/src/main/resources/assets/advancedperipherals/models/item/cable_p2p_tunnel.json @@ -0,0 +1,6 @@ +{ + "parent": "ae2:item/p2p_tunnel_base", + "textures": { + "type": "computercraft:block/wired_modem_face" + } +} \ No newline at end of file From a97a7b9d6bd9fa0feeacb8888d04a1322df63b48 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 21 Jan 2025 07:43:39 -0700 Subject: [PATCH 162/188] fix peripheral will not connect when changing tunnel type peripheral_detach event will be trigger twice when ME network shutdown somehow --- .../addons/ae2/WiredCableP2PTunnelPart.java | 151 +++++++++++------- 1 file changed, 89 insertions(+), 62 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java index c0424c25d..93d1f586f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java @@ -1,37 +1,44 @@ package de.srendi.advancedperipherals.common.addons.ae2; +import appeng.api.networking.IGridNodeListener; import appeng.api.parts.IPartItem; import appeng.api.parts.IPartModel; import appeng.items.parts.PartModels; import appeng.parts.p2p.CapabilityP2PTunnelPart; import appeng.parts.p2p.P2PModels; +import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.network.wired.IWiredElement; +import dan200.computercraft.api.network.wired.IWiredNetworkChange; import dan200.computercraft.api.network.wired.IWiredNode; -import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.Capabilities; -import dan200.computercraft.shared.peripheral.modem.wired.WiredModemElement; import de.srendi.advancedperipherals.AdvancedPeripherals; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.Nonnull; public class WiredCableP2PTunnelPart extends CapabilityP2PTunnelPart { private static final P2PModels MODELS = new P2PModels(AdvancedPeripherals.getRL("part/p2p/p2p_tunnel_cable")); - private final P2PWiredElement element = new P2PWiredElement(); + private final IWiredElement element = new P2PWiredElement(); + private final IWiredElement outElement = new P2PWiredElement(); private final IWiredNode node = this.element.getNode(); - private final Set connected = new HashSet<>(); - private short lastFreq = 0; + private Set connected = new HashSet<>(); + private boolean activated = false; public WiredCableP2PTunnelPart(IPartItem partItem) { super(partItem, Capabilities.CAPABILITY_WIRED_ELEMENT); - this.inputHandler = element; - this.outputHandler = element; - this.emptyHandler = element; + this.inputHandler = outElement; + this.outputHandler = outElement; + this.emptyHandler = outElement; } @PartModels @@ -46,51 +53,96 @@ public IPartModel getStaticModels() { @Override public void onTunnelConfigChange() { + super.onTunnelConfigChange(); this.connectionsChanged(); } @Override public void onTunnelNetworkChange() { + super.onTunnelNetworkChange(); this.connectionsChanged(); } protected void connectionsChanged() { - if (this.lastFreq == this.getFrequency()) { + if (this.isClientSide()) { return; } - this.lastFreq = this.getFrequency(); - - for (IWiredNode node : this.connected) { - this.node.disconnectFrom(node); + if (!this.isActive()) { + return; + } + if (!this.activated) { + this.activated = true; + this.node.connectTo(this.outElement.getNode()); } - this.connected.clear(); + Stream nodeStream = this.getOutputStream().filter(out -> out != this); WiredCableP2PTunnelPart in = this.getInput(); if (in != null && in != this) { - this.node.connectTo(in.node); - this.connected.add(in.node); + nodeStream = Stream.concat(nodeStream, Stream.of(in)); + } + Set nodes = nodeStream.collect(Collectors.toCollection(HashSet::new)); + + for (WiredCableP2PTunnelPart part : this.connected.stream().filter(n -> !nodes.contains(n)).collect(Collectors.toList())) { + if (part.connected.contains(this)) { + this.node.disconnectFrom(part.node); + part.connected.remove(this); + } + this.connected.remove(part); } - for (WiredCableP2PTunnelPart out : WiredCableP2PTunnelPart.this.getOutputs()) { - if (out != this) { - this.node.connectTo(out.node); - this.connected.add(out.node); + + for (WiredCableP2PTunnelPart part : nodes) { + if (!this.connected.contains(part)) { + this.node.connectTo(part.node); + this.connected.add(part); + part.connected.add(this); } } + this.sendBlockUpdate(); + } + + @Override + protected void onMainNodeStateChanged(IGridNodeListener.State reason) { + super.onMainNodeStateChanged(reason); + if (this.isActive()) { + this.connectionsChanged(); + this.refreshConnection(); + } else if (this.activated) { + this.activated = false; + this.node.remove(); + this.connected.clear(); + } } - private class P2PWiredElement extends WiredModemElement { - private boolean updating = false; + protected BlockPos getFacingPos() { + return this.getHost().getLocation().getPos().relative(this.getSide()); + } - @Nonnull - @Override - public Level getLevel() { - return WiredCableP2PTunnelPart.this.getLevel(); + protected void refreshConnection() { + BlockEntity cable = this.getLevel().getBlockEntity(this.getFacingPos()); + IWiredElement elem = cable == null ? null : cable.getCapability(Capabilities.CAPABILITY_WIRED_ELEMENT, this.getSide().getOpposite()).orElse(null); + if (elem == null) { + return; } + elem.getNode().connectTo(this.outElement.getNode()); + } + + @Override + public void onNeighborChanged(BlockGetter level, BlockPos pos, BlockPos neighbor) { + if (!this.getFacingPos().equals(neighbor)) { + return; + } + if (this.activated) { + this.refreshConnection(); + } + } + + private class P2PWiredElement implements IWiredElement { + private final IWiredNode node = ComputerCraftAPI.createWiredNodeForElement(this); @Nonnull @Override - public Vec3 getPosition() { - return Vec3.atCenterOf(WiredCableP2PTunnelPart.this.getBlockEntity().getBlockPos()); + public IWiredNode getNode() { + return node; } @Nonnull @@ -99,44 +151,19 @@ public String getSenderID() { return "p2p"; } + @Nonnull @Override - protected void attachPeripheral(String name, IPeripheral peripheral) { - if (this.updating) { - return; - } - this.updating = true; - try { - WiredCableP2PTunnelPart.this.connectionsChanged(); - WiredCableP2PTunnelPart in = WiredCableP2PTunnelPart.this.getInput(); - if (in != null) { - in.element.attachPeripheral(name, peripheral); - } - for (WiredCableP2PTunnelPart out : WiredCableP2PTunnelPart.this.getOutputs()) { - out.element.attachPeripheral(name, peripheral); - } - } finally { - this.updating = false; - } + public Level getLevel() { + return WiredCableP2PTunnelPart.this.getLevel(); } + @Nonnull @Override - protected void detachPeripheral(String name) { - if (this.updating) { - return; - } - this.updating = true; - try { - WiredCableP2PTunnelPart.this.connectionsChanged(); - WiredCableP2PTunnelPart in = WiredCableP2PTunnelPart.this.getInput(); - if (in != null) { - in.element.detachPeripheral(name); - } - for (WiredCableP2PTunnelPart out : WiredCableP2PTunnelPart.this.getOutputs()) { - out.element.detachPeripheral(name); - } - } finally { - this.updating = false; - } + public Vec3 getPosition() { + return Vec3.atCenterOf(WiredCableP2PTunnelPart.this.getBlockEntity().getBlockPos()); } + + @Override + public void networkChanged(IWiredNetworkChange change) {} } } From 04c6f27e897caf94f6aadb041ec61cf9cc7e7166 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 21 Jan 2025 12:15:55 -0700 Subject: [PATCH 163/188] fix peripheral will detach and reattach when ME grid changes --- .../common/addons/ae2/WiredCableP2PTunnelPart.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java index 93d1f586f..596ce5e62 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/WiredCableP2PTunnelPart.java @@ -38,7 +38,7 @@ public WiredCableP2PTunnelPart(IPartItem partItem) { super(partItem, Capabilities.CAPABILITY_WIRED_ELEMENT); this.inputHandler = outElement; this.outputHandler = outElement; - this.emptyHandler = outElement; + this.emptyHandler = null; // should never used } @PartModels @@ -97,13 +97,18 @@ protected void connectionsChanged() { part.connected.add(this); } } - this.sendBlockUpdate(); } @Override protected void onMainNodeStateChanged(IGridNodeListener.State reason) { super.onMainNodeStateChanged(reason); + if (reason == IGridNodeListener.State.GRID_BOOT) { + return; + } if (this.isActive()) { + if (!this.getMainNode().hasGridBooted()) { + return; + } this.connectionsChanged(); this.refreshConnection(); } else if (this.activated) { From 2b2f9d13954266be5d91c8c4bb1f8cfe60e05b2f Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 21 Jan 2025 15:14:59 -0700 Subject: [PATCH 164/188] remove ae2.Integration and rename ae2.Registries to ae2.AE2Registries --- .../AdvancedPeripherals.java | 3 ++- .../{Registries.java => AE2Registries.java} | 23 +++++++++++++++++-- .../common/addons/ae2/Integration.java | 20 ---------------- .../IntegrationPeripheralProvider.java | 1 - .../common/data/ItemTagsProvider.java | 10 ++++---- .../common/setup/APItems.java | 3 ++- 6 files changed, 30 insertions(+), 30 deletions(-) rename src/main/java/de/srendi/advancedperipherals/common/addons/ae2/{Registries.java => AE2Registries.java} (54%) delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java diff --git a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java index 6aade9e68..8f7a80ffd 100644 --- a/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java +++ b/src/main/java/de/srendi/advancedperipherals/AdvancedPeripherals.java @@ -1,6 +1,7 @@ package de.srendi.advancedperipherals; import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.addons.ae2.AE2Registries; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.network.APNetworking; import de.srendi.advancedperipherals.common.setup.APRegistration; @@ -72,7 +73,7 @@ public void commonSetup(FMLCommonSetupEvent event) { public void onLoadComplete(FMLLoadCompleteEvent event) { event.enqueueWork(() -> { if (APAddons.appliedEnergisticsLoaded) { - de.srendi.advancedperipherals.common.addons.ae2.Integration.onComplete(); + AE2Registries.finishRegister(); } }); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Registries.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AE2Registries.java similarity index 54% rename from src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Registries.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AE2Registries.java index 75d27749c..b4759df1d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Registries.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AE2Registries.java @@ -1,18 +1,22 @@ package de.srendi.advancedperipherals.common.addons.ae2; +import appeng.api.features.P2PTunnelAttunement; import appeng.api.parts.IPart; import appeng.api.parts.IPartItem; import appeng.api.parts.PartModels; import appeng.items.parts.PartItem; import appeng.items.parts.PartModelsHelper; +import dan200.computercraft.shared.Registry.ModItems; import de.srendi.advancedperipherals.common.setup.APRegistration; +import net.minecraft.data.tags.TagsProvider; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraftforge.registries.RegistryObject; import java.util.function.Function; -public final class Registries { - private Registries() {} +public final class AE2Registries { + private AE2Registries() {} public static final RegistryObject> CABLE_P2P_TUNNEL = registerPart("cable_p2p_tunnel", WiredCableP2PTunnelPart.class, WiredCableP2PTunnelPart::new); @@ -20,4 +24,19 @@ private static RegistryObject> registerPart(String PartModels.registerModels(PartModelsHelper.createModels(clazz)); return APRegistration.ITEMS.register(id, () -> new PartItem<>(new Item.Properties(), clazz, factory)); } + + public static void finishRegister() { + P2PTunnelAttunement.registerAttunementTag(CABLE_P2P_TUNNEL.get()); + } + + public static TagKey getCableP2PTag() { + return P2PTunnelAttunement.getAttunementTag(CABLE_P2P_TUNNEL.get()); + } + + public static void registerTags(Function, TagsProvider.TagAppender> tagger) { + tagger.apply(getCableP2PTag()) + .add(ModItems.CABLE.get()) + .add(ModItems.WIRED_MODEM.get()) + .add(ModItems.WIRED_MODEM_FULL.get()); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java deleted file mode 100644 index 3006888f5..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/Integration.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.ae2; - -import appeng.api.features.P2PTunnelAttunement; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; - -public class Integration implements Runnable { - - @Override - public void run() { - } - - public static void onComplete() { - P2PTunnelAttunement.registerAttunementTag(Registries.CABLE_P2P_TUNNEL.get()); - } - - public static TagKey getCableP2PTag() { - return P2PTunnelAttunement.getAttunementTag(Registries.CABLE_P2P_TUNNEL.get()); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java index ca3fa9ad5..eaf6cda03 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/integrations/IntegrationPeripheralProvider.java @@ -25,7 +25,6 @@ public class IntegrationPeripheralProvider implements IPeripheralProvider { private static final String[] SUPPORTED_MODS = new String[]{ - APAddons.APPLIEDENERGISTICS_MODID, APAddons.BOTANIA_MODID, APAddons.CREATE_MODID, APAddons.MEKANISM_MODID, diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java index 611e3f235..b3b9d4520 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/ItemTagsProvider.java @@ -1,6 +1,7 @@ package de.srendi.advancedperipherals.common.data; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.addons.ae2.AE2Registries; import de.srendi.advancedperipherals.common.setup.APItems; import de.srendi.advancedperipherals.common.setup.APTags; import net.minecraft.core.Registry; @@ -18,10 +19,9 @@ protected ItemTagsProvider(DataGenerator generator, @Nullable ExistingFileHelper @Override protected void addTags() { - tag(APTags.Items.SMART_GLASSES).add(APItems.SMART_GLASSES.get()).add(APItems.SMART_GLASSES_NETHERITE.get()); - tag(de.srendi.advancedperipherals.common.addons.ae2.Integration.getCableP2PTag()) - .add(dan200.computercraft.shared.Registry.ModItems.CABLE.get()) - .add(dan200.computercraft.shared.Registry.ModItems.WIRED_MODEM.get()) - .add(dan200.computercraft.shared.Registry.ModItems.WIRED_MODEM_FULL.get()); + tag(APTags.Items.SMART_GLASSES) + .add(APItems.SMART_GLASSES.get()) + .add(APItems.SMART_GLASSES_NETHERITE.get()); + AE2Registries.registerTags(this::tag); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java index 394123407..57d45b1e3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APItems.java @@ -1,6 +1,7 @@ package de.srendi.advancedperipherals.common.setup; import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.addons.ae2.AE2Registries; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.items.APItem; import de.srendi.advancedperipherals.common.items.MemoryCardItem; @@ -16,7 +17,7 @@ public class APItems { - public static final RegistryObject CABLE_P2P_TUNNEL = APAddons.appliedEnergisticsLoaded ? (RegistryObject) (RegistryObject) de.srendi.advancedperipherals.common.addons.ae2.Registries.CABLE_P2P_TUNNEL : null; + public static final RegistryObject CABLE_P2P_TUNNEL = APAddons.appliedEnergisticsLoaded ? (RegistryObject) (RegistryObject) AE2Registries.CABLE_P2P_TUNNEL : null; public static final RegistryObject CHUNK_CONTROLLER = APRegistration.ITEMS.register("chunk_controller", () -> new APItem(new Item.Properties().stacksTo(16), APConfig.PERIPHERALS_CONFIG.enableChunkyTurtle)); public static final RegistryObject COMPUTER_TOOL = APRegistration.ITEMS.register("computer_tool", () -> new APItem(new Item.Properties().stacksTo(1), () -> true)); public static final RegistryObject END_AUTOMATA_CORE = APRegistration.ITEMS.register("end_automata_core", () -> new APItem(new Item.Properties().stacksTo(1), APConfig.METAPHYSICS_CONFIG.enableEndAutomataCore)); From 2d8c8e25711cdf64c4760a69f41876b5d113050d Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 21 Jan 2025 16:08:23 -0700 Subject: [PATCH 165/188] change config type from common to server to allow each save has its own config values close #693 --- .../common/configuration/APConfig.java | 30 ------------------- .../common/configuration/GeneralConfig.java | 2 +- .../configuration/MetaphysicsConfig.java | 2 +- .../configuration/PeripheralsConfig.java | 2 +- .../common/configuration/WorldConfig.java | 5 +--- 5 files changed, 4 insertions(+), 37 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java index f19dbc4c2..9f4b892bd 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java @@ -3,7 +3,6 @@ import com.electronwill.nightconfig.core.file.CommentedFileConfig; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.config.ConfigFileTypeHandler; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.loading.FMLPaths; @@ -12,8 +11,6 @@ public class APConfig extends ModConfig { - public static final ConfigFileHandler CONFIG_FILE_HANDLER = new ConfigFileHandler(); - public static final GeneralConfig GENERAL_CONFIG = new GeneralConfig(); public static final PeripheralsConfig PERIPHERALS_CONFIG = new PeripheralsConfig(); public static final MetaphysicsConfig METAPHYSICS_CONFIG = new MetaphysicsConfig(); @@ -24,37 +21,10 @@ public APConfig(IAPConfig config, ModContainer container) { } public static void register(ModLoadingContext context) { - //Creates the config folder - FMLPaths.getOrCreateGameRelativePath(FMLPaths.CONFIGDIR.get().resolve("Advancedperipherals"), "Advancedperipherals"); - ModContainer modContainer = context.getActiveContainer(); modContainer.addConfig(new APConfig(GENERAL_CONFIG, modContainer)); modContainer.addConfig(new APConfig(PERIPHERALS_CONFIG, modContainer)); modContainer.addConfig(new APConfig(METAPHYSICS_CONFIG, modContainer)); modContainer.addConfig(new APConfig(WORLD_CONFIG, modContainer)); } - - @Override - public ConfigFileTypeHandler getHandler() { - return CONFIG_FILE_HANDLER; - } - - public static class ConfigFileHandler extends ConfigFileTypeHandler { - - public static Path getPath(Path path) { - if (path.endsWith("serverconfig")) return FMLPaths.CONFIGDIR.get(); - - return path; - } - - @Override - public Function reader(Path configBasePath) { - return super.reader(getPath(configBasePath)); - } - - @Override - public void unload(Path configBasePath, ModConfig config) { - super.unload(getPath(configBasePath), config); - } - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java index 3c4aa971b..8f07728e7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/GeneralConfig.java @@ -45,6 +45,6 @@ public String getFileName() { @Override public ModConfig.Type getType() { - return ModConfig.Type.COMMON; + return ModConfig.Type.SERVER; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/MetaphysicsConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/MetaphysicsConfig.java index e45fdcbde..7a29fe96c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/MetaphysicsConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/MetaphysicsConfig.java @@ -47,6 +47,6 @@ public String getFileName() { @Override public ModConfig.Type getType() { - return ModConfig.Type.COMMON; + return ModConfig.Type.SERVER; } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java index 5c4a8de36..066ededac 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/PeripheralsConfig.java @@ -268,7 +268,7 @@ public String getFileName() { @Override public ModConfig.Type getType() { - return ModConfig.Type.COMMON; + return ModConfig.Type.SERVER; } private List> parseChatBoxCommandFilters() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java index 31178683b..9bc456e48 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/WorldConfig.java @@ -41,9 +41,6 @@ public String getFileName() { @Override public ModConfig.Type getType() { - return ModConfig.Type.COMMON; + return ModConfig.Type.SERVER; } - /* - [ - */ } From d4aeaf933f610ea507a2705e05361647ee0cbca5 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 21 Jan 2025 16:15:27 -0700 Subject: [PATCH 166/188] remove unused imports --- .../advancedperipherals/common/configuration/APConfig.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java b/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java index 9f4b892bd..651ccd789 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java +++ b/src/main/java/de/srendi/advancedperipherals/common/configuration/APConfig.java @@ -1,13 +1,8 @@ package de.srendi.advancedperipherals.common.configuration; -import com.electronwill.nightconfig.core.file.CommentedFileConfig; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.loading.FMLPaths; - -import java.nio.file.Path; -import java.util.function.Function; public class APConfig extends ModConfig { From d25a8444a1b96bb4d307373f4ebc0a39b987ec03 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 25 Jan 2025 15:10:53 -0700 Subject: [PATCH 167/188] fix smart glasses position should be eye position but not feet position --- .../common/addons/APAddons.java | 4 +- .../computercraft/owner/IPeripheralOwner.java | 19 +++++++- .../owner/PocketPeripheralOwner.java | 1 - .../blockentities/DistanceDetectorEntity.java | 39 ++++------------- .../smartglasses/SmartGlassesComputer.java | 4 +- .../modules/ModulePeripheral.java | 14 +++--- .../modules/ModulePeripheralOwner.java | 25 ++++++++--- .../overlay/OverlayGlassesFunctions.java | 4 +- .../lib/peripherals/BasePeripheral.java | 43 +++++++++++-------- 9 files changed, 86 insertions(+), 67 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java index 2c9948e2a..b48fbbfb9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java @@ -93,14 +93,14 @@ public static ItemStack getCurioGlasses(Player player) { } public static boolean isBlockOnShip(Level level, BlockPos pos) { - if (!vs2Loaded) { + if (level == null || !vs2Loaded) { return false; } return VSGameUtilsKt.isBlockInShipyard(level, pos); } public static Ship getVS2Ship(Level level, BlockPos pos) { - if (!vs2Loaded) { + if (level == null || !vs2Loaded) { return null; } return VSGameUtilsKt.getShipObjectManagingPos(level, pos); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java index 2dd333a9d..8fea843c6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java @@ -1,6 +1,7 @@ package de.srendi.advancedperipherals.common.addons.computercraft.owner; import dan200.computercraft.api.peripheral.IPeripheral; +import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; @@ -11,9 +12,11 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; +import org.valkyrienskies.core.api.ships.Ship; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - import java.util.Collection; public interface IPeripheralOwner { @@ -33,6 +36,20 @@ default Vec3 getCenterPos() { @NotNull FrontAndTop getOrientation(); + @NotNull + default Vec3 getDirection() { + Vec3 dir = Vec3.atLowerCornerOf(getFacing().getNormal()); + if (!APAddons.vs2Loaded) { + return dir; + } + Ship ship = APAddons.getVS2Ship(getLevel(), getPos()); + if (ship == null) { + return dir; + } + Vector3d newDir = ship.getShipToWorld().transformDirection(new Vector3d(dir.x, dir.y, dir.z)); + return new Vec3(newDir.x, newDir.y, newDir.z); + } + @Nullable Player getOwner(); @NotNull CompoundTag getDataStorage(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java index ffafe5d54..42e20349f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java @@ -67,7 +67,6 @@ public Direction getFacing() { return owner.getDirection(); } - /** * Not used for pockets */ diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 89ee03b4d..baa376c6f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -1,6 +1,6 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; -import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.DistanceDetectorPeripheral; import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; @@ -20,8 +20,6 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; -import org.joml.Vector3d; -import org.valkyrienskies.core.api.ships.Ship; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -179,36 +177,15 @@ public ClientboundBlockEntityDataPacket getUpdatePacket() { return ClientboundBlockEntityDataPacket.create(this); } - protected Vec3 getCenterPos() { - Vec3 pos = Vec3.atCenterOf(this.getBlockPos()); - if (!APAddons.vs2Loaded) { - return pos; - } - Ship ship = APAddons.getVS2Ship(this.getLevel(), this.getBlockPos()); - if (ship == null) { - return pos; - } - Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); - return new Vec3(newPos.x, newPos.y, newPos.z); - } - - protected Vec3 getDirection() { - Vec3 dir = Vec3.atLowerCornerOf(getBlockState().getValue(BaseBlock.ORIENTATION).front().getNormal()); - if (!APAddons.vs2Loaded) { - return dir; - } - Ship ship = APAddons.getVS2Ship(this.getLevel(), this.getBlockPos()); - if (ship == null) { - return dir; - } - Vector3d newDir = ship.getShipToWorld().transformDirection(new Vector3d(dir.x, dir.y, dir.z)); - return new Vec3(newDir.x, newDir.y, newDir.z); - } - public double calculateDistance() { + DistanceDetectorPeripheral peripheral = this.getPeripheral(); + if (peripheral == null) { + return -1; + } + BlockEntityPeripheralOwner owner = peripheral.getPeripheralOwner(); final double maxRange = this.getMaxRange(); - Vec3 direction = getDirection(); - Vec3 center = getCenterPos(); + Vec3 direction = owner.getDirection(); + Vec3 center = peripheral.getWorldPos(); Vec3 from = center; Vec3 to = from.add(direction.x * maxRange, direction.y * maxRange, direction.z * maxRange); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index 8f5049e11..eac317fec 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -82,7 +82,7 @@ public ServerLevel getLevel() { @Override public BlockPos getPosition() { - return this.entity == null ? super.getPosition() : this.entity.blockPosition(); + return this.entity == null ? super.getPosition() : new BlockPos(this.entity.getEyePosition()); } @Override @@ -212,7 +212,7 @@ public void setEntity(@Nullable Entity entity) { return; } this.setLevel((ServerLevel) this.entity.getCommandSenderWorld()); - this.setPosition(this.entity.blockPosition()); + this.setPosition(new BlockPos(this.entity.getEyePosition())); } public Map getModules() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java index e72465756..760b03ed2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java @@ -6,7 +6,7 @@ public class ModulePeripheral extends BasePeripheral { - public static final String PERIPHERAL_TYPE = "smartGlasses"; + public static final String PERIPHERAL_TYPE = "smart_glasses"; public ModulePeripheral(SmartGlassesComputer computer) { super(PERIPHERAL_TYPE, new ModulePeripheralOwner(computer)); @@ -15,14 +15,14 @@ public ModulePeripheral(SmartGlassesComputer computer) { public void updateModules() { // We need to set the initialisation to false so the dynamic peripheral re-builds the plugins - initialized = false; - if (plugins != null) - plugins.clear(); + clearAllPlugins(); - getPeripheralOwner().getComputer().getModules().values().forEach(module -> { - IModuleFunctions functions = module.getFunctions(getPeripheralOwner().getComputer().getSmartGlassesAccess()); - if (functions != null) + SmartGlassesComputer computer = getPeripheralOwner().getComputer(); + computer.getModules().values().forEach(module -> { + IModuleFunctions functions = module.getFunctions(computer.getSmartGlassesAccess()); + if (functions != null) { addPlugin(functions); + } }); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java index 62d22cdeb..b7407a577 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java @@ -14,6 +14,8 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -45,19 +47,33 @@ public Level getLevel() { @NotNull @Override public BlockPos getPos() { - return computer.getEntity().getOnPos(); + return new BlockPos(computer.getEntity().getEyePosition()); + } + + @NotNull + @Override + public Vec3 getCenterPos() { + return computer.getEntity().getEyePosition(); } @NotNull @Override public Direction getFacing() { - return Direction.NORTH; + Vec3 dir = getDirection(); + return Direction.getNearest(dir.x, dir.y, dir.z); } @NotNull @Override public FrontAndTop getOrientation() { - return FrontAndTop.NORTH_UP; + Vec3 up = computer.getEntity().getUpVector(1.0f); + return FrontAndTop.fromFrontAndTop(getFacing(), Direction.getNearest(up.x, up.y, up.z)); + } + + @NotNull + @Override + public Vec3 getDirection() { + return computer.getEntity().getLookAngle(); } @NotNull @@ -69,8 +85,7 @@ public SmartGlassesComputer getComputer() { @Override public Player getOwner() { Entity owner = computer.getEntity(); - if (owner instanceof Player player) return player; - return null; + return owner instanceof Player player ? player : null; } @NotNull diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index bffed31cb..d0c99a7e5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -16,6 +16,7 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject; import net.minecraft.client.Minecraft; +import net.minecraft.world.phys.Vec3; public class OverlayGlassesFunctions implements IModuleFunctions { @@ -120,7 +121,8 @@ public final MethodResult getSize() { @LuaFunction public final MethodResult getCoords() { - return MethodResult.of(access.getEntity().position().x, access.getEntity().position().y, access.getEntity().position().z); + Vec3 pos = access.getEntity().getEyePosition(); + return MethodResult.of(pos.x, pos.y, pos.z); } @LuaFunction diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index eb41f7430..4b99a1f1a 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -41,7 +41,7 @@ public abstract class BasePeripheral implements IBas protected final O owner; protected final List pluggedMethods = new ArrayList<>(); protected boolean initialized = false; - protected List plugins = null; + protected final List plugins = new LinkedList<>(); protected String[] methodNames = new String[0]; protected BasePeripheral(String type, O owner) { @@ -49,32 +49,41 @@ protected BasePeripheral(String type, O owner) { this.owner = owner; } + protected void clearAllPlugins() { + this.initialized = false; + plugins.clear(); + } + protected void buildPlugins() { - if (!initialized) { - initialized = true; - this.pluggedMethods.clear(); - if (plugins != null) plugins.forEach(plugin -> { - if (plugin.isSuitable(this)) - pluggedMethods.addAll(plugin.getMethods()); - }); - owner.getAbilities().forEach(ability -> { - if (ability instanceof IPeripheralPlugin peripheralPlugin) - pluggedMethods.addAll(peripheralPlugin.getMethods()); - }); - this.methodNames = pluggedMethods.stream().map(BoundMethod::getName).toArray(String[]::new); + if (this.initialized) { + return; } + this.initialized = true; + this.pluggedMethods.clear(); + this.plugins.forEach(plugin -> { + if (plugin.isSuitable(this)) { + this.pluggedMethods.addAll(plugin.getMethods()); + } + }); + owner.getAbilities().forEach(ability -> { + if (ability instanceof IPeripheralPlugin peripheralPlugin) { + this.pluggedMethods.addAll(peripheralPlugin.getMethods()); + } + }); + this.methodNames = this.pluggedMethods.stream().map(BoundMethod::getName).toArray(String[]::new); } protected void addPlugin(@NotNull IPeripheralPlugin plugin) { - if (plugins == null) plugins = new LinkedList<>(); - plugins.add(plugin); + this.plugins.add(plugin); IPeripheralOperation[] operations = plugin.getOperations(); if (operations != null) { OperationAbility operationAbility = owner.getAbility(PeripheralOwnerAbility.OPERATION); - if (operationAbility == null) + if (operationAbility == null) { throw new IllegalArgumentException("This is not possible to attach plugin with operations to not operationable owner"); - for (IPeripheralOperation operation : operations) + } + for (IPeripheralOperation operation : operations) { operationAbility.registerOperation(operation); + } } } From 27be42cf98f1ec59d9b59900441ac1372c9e1219 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 25 Jan 2025 15:13:14 -0700 Subject: [PATCH 168/188] rename getWorldPos -> getPhysicsPos --- .../peripheral/ChatBoxPeripheral.java | 12 +++++------ .../EnvironmentDetectorPeripheral.java | 12 +++++------ .../peripheral/GeoScannerPeripheral.java | 4 ++-- .../peripheral/PlayerDetectorPeripheral.java | 20 +++++++++---------- .../plugins/AutomataLookPlugin.java | 4 ++-- .../blockentities/DistanceDetectorEntity.java | 2 +- .../lib/peripherals/BasePeripheral.java | 6 +++--- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java index 9717a36e1..88f3cf3aa 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java @@ -250,7 +250,7 @@ public final MethodResult sendFormattedMessage(@NotNull IArguments arguments) th if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension) { continue; } - if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, range, maxRange)) { player.sendSystemMessage(preparedMessage); } } @@ -293,7 +293,7 @@ public final MethodResult sendMessage(@NotNull IArguments arguments) throws LuaE if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension) { continue; } - if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, range, maxRange)) { player.sendSystemMessage(preparedMessage); } } @@ -340,7 +340,7 @@ public final MethodResult sendFormattedMessageToPlayer(@NotNull IArguments argum return MethodResult.of(false, "NOT_SAME_DIMENSION"); } - if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, range, maxRange)) { player.sendSystemMessage(preparedMessage); } return MethodResult.of(true); @@ -398,7 +398,7 @@ public final MethodResult sendFormattedToastToPlayer(@NotNull IArguments argumen return MethodResult.of(false, "NOT_SAME_DIMENSION"); } - if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, range, maxRange)) { ToastToClientPacket packet = new ToastToClientPacket(titleComponent, preparedMessage); APNetworking.sendTo(packet, player); } @@ -437,7 +437,7 @@ public final MethodResult sendMessageToPlayer(@NotNull IArguments arguments) thr return MethodResult.of(false, "NOT_SAME_DIMENSION"); } - if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, range, maxRange)) { player.sendSystemMessage(preparedMessage, false); } return MethodResult.of(true); @@ -476,7 +476,7 @@ public final MethodResult sendToastToPlayer(@NotNull IArguments arguments) throw return MethodResult.of(false, "NOT_SAME_DIMENSION"); } - if (CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, maxRange)) { + if (CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, range, maxRange)) { ToastToClientPacket packet = new ToastToClientPacket(Component.literal(title), preparedMessage); APNetworking.sendTo(packet, player); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index 580d1a7f4..92c668b17 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -93,24 +93,24 @@ public boolean isEnabled() { @LuaFunction(mainThread = true) public final String getBiome() { - Optional> biome = getLevel().getBiome(this.getWorldBlockPos()).unwrapKey(); + Optional> biome = getLevel().getBiome(this.getPhysicsBlockPos()).unwrapKey(); return biome.map(biomeResourceKey -> biomeResourceKey.location().toString()).orElse("unknown"); } @LuaFunction(mainThread = true) public final int getSkyLightLevel() { - return getLevel().getBrightness(LightLayer.SKY, this.getWorldBlockPos().offset(0, 1, 0)); + return getLevel().getBrightness(LightLayer.SKY, this.getPhysicsBlockPos().offset(0, 1, 0)); } @LuaFunction(mainThread = true) public final int getBlockLightLevel() { - return getLevel().getBrightness(LightLayer.BLOCK, this.getWorldBlockPos().offset(0, 1, 0)); + return getLevel().getBrightness(LightLayer.BLOCK, this.getPhysicsBlockPos().offset(0, 1, 0)); } @LuaFunction(mainThread = true) public final int getDayLightLevel() { Level level = getLevel(); - int i = level.getBrightness(LightLayer.SKY, this.getWorldBlockPos().offset(0, 1, 0)) - level.getSkyDarken(); + int i = level.getBrightness(LightLayer.SKY, this.getPhysicsBlockPos().offset(0, 1, 0)) - level.getSkyDarken(); float f = level.getSunAngle(1.0F); if (i > 0) { float f1 = f < (float) Math.PI ? 0.0F : ((float) Math.PI * 2F); @@ -128,7 +128,7 @@ public final long getTime() { @LuaFunction(mainThread = true) public final boolean isSlimeChunk() { - ChunkPos chunkPos = new ChunkPos(this.getWorldBlockPos()); + ChunkPos chunkPos = new ChunkPos(this.getPhysicsBlockPos()); return WorldgenRandom.seedSlimeChunk(chunkPos.x, chunkPos.z, ((WorldGenLevel) getLevel()).getSeed(), 987234911L).nextInt(10) == 0; } @@ -208,7 +208,7 @@ public final MethodResult scanEntities(@NotNull IArguments arguments) throws Lua return withOperation(SCAN_ENTITIES, new SphereOperationContext(radius), context -> { return context.getRadius() > SCAN_ENTITIES.getMaxCostRadius() ? MethodResult.of(null, "Radius exceeds max value") : null; }, context -> { - Vec3 pos = this.getWorldPos(); + Vec3 pos = this.getPhysicsPos(); AABB box = new AABB(pos, pos); List> entities = getLevel().getEntities((Entity) null, box.inflate(context.getRadius() + 0.5), entity -> entity instanceof LivingEntity && entity.isAlive()).stream().map(entity -> LuaConverter.completeEntityWithPositionToLua(entity, pos, detailed)).toList(); return MethodResult.of(entities); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java index 449256acb..766586170 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java @@ -103,7 +103,7 @@ public final MethodResult cost(int radius) { public final MethodResult chunkAnalyze() throws LuaException { return withOperation(SCAN_BLOCKS, SCAN_BLOCKS.free(), null, ignored -> { Level level = getLevel(); - LevelChunk chunk = level.getChunkAt(getWorldBlockPos()); + LevelChunk chunk = level.getChunkAt(getPhysicsBlockPos()); ChunkPos chunkPos = chunk.getPos(); HashMap data = new HashMap<>(); for (int x = chunkPos.getMinBlockX(); x <= chunkPos.getMaxBlockX(); x++) { @@ -136,7 +136,7 @@ public final MethodResult scan(@NotNull IArguments arguments) throws LuaExceptio scan(result, getLevel(), getCenterPos(), context.getRadius()); if (isOnShip()) { int i = result.size(); - scan(result, getLevel(), getWorldPos(), context.getRadius()); + scan(result, getLevel(), getPhysicsPos(), context.getRadius()); for (; i < result.size(); i++) { Map data = result.get(i); data.put("notOnShip", true); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java index c06aa150d..dc05ba478 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java @@ -73,7 +73,7 @@ public final MethodResult getPlayersInCoords(Map firstCoord, Map sec if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) { continue; } - if (CoordUtil.isInRange(getWorldPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE)) { + if (CoordUtil.isInRange(getPhysicsPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE)) { playersName.add(player.getName().getString()); } } @@ -86,7 +86,7 @@ public final List getPlayersInCubic(int x, int y, int z) { ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, x, y, z, MAX_RANGE)) { + if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, x, y, z, MAX_RANGE)) { playersName.add(player.getName().getString()); } } @@ -99,7 +99,7 @@ public final List getPlayersInRange(int range) { ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, MAX_RANGE)) { + if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, range, MAX_RANGE)) { playersName.add(player.getName().getString()); } } @@ -118,7 +118,7 @@ public final boolean isPlayersInCoords(Map firstCoord, Map secondCoo if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) { continue; } - if (CoordUtil.isInRange(getWorldPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE)) { + if (CoordUtil.isInRange(getPhysicsPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE)) { return true; } } @@ -132,7 +132,7 @@ public final boolean isPlayersInCubic(int x, int y, int z) { ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, x, y, z, MAX_RANGE)) { + if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, x, y, z, MAX_RANGE)) { return true; } } @@ -146,7 +146,7 @@ public final boolean isPlayersInRange(int range) { ResourceKey dimension = getLevel().dimension(); for (ServerPlayer player : getPlayers()) { - if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, MAX_RANGE)) { + if (player.getLevel().dimension() == dimension && CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, range, MAX_RANGE)) { return true; } } @@ -163,7 +163,7 @@ public final boolean isPlayerInCoords(Map firstCoord, Map secondCoor if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension) { return false; } - return CoordUtil.isInRange(getWorldPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE); + return CoordUtil.isInRange(getPhysicsPos(), player, getLevel(), firstPos, secondPos, MAX_RANGE); } @LuaFunction(mainThread = true) @@ -171,7 +171,7 @@ public final boolean isPlayerInCubic(int x, int y, int z, String username) { ResourceKey dimension = getLevel().dimension(); ServerPlayer player = getPlayer(username); - return player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, x, y, z, MAX_RANGE); + return player.getLevel().dimension() == dimension && CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, x, y, z, MAX_RANGE); } @LuaFunction(mainThread = true) @@ -179,7 +179,7 @@ public final boolean isPlayerInRange(int range, String username) { ResourceKey dimension = getLevel().dimension(); ServerPlayer player = getPlayer(username); - return player.getLevel().dimension() == dimension && CoordUtil.isInRange(getWorldPos(), getLevel(), player, range, MAX_RANGE); + return player.getLevel().dimension() == dimension && CoordUtil.isInRange(getPhysicsPos(), getLevel(), player, range, MAX_RANGE); } @LuaFunction(value = {"getPlayerPos", "getPlayer"}, mainThread = true) @@ -187,7 +187,7 @@ public final Map getPlayerPos(IArguments arguments) throws LuaEx if (!APConfig.PERIPHERALS_CONFIG.playerSpy.get()) throw new LuaException("This function is disabled in the config. Activate it or ask an admin if he can activate it."); ResourceKey dimension = getLevel().dimension(); - Vec3 pos = getWorldPos(); + Vec3 pos = getPhysicsPos(); ServerPlayer player = getPlayer(arguments.getString(0)); if (player == null) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java index 084f20289..1a7a0201a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java @@ -52,7 +52,7 @@ public final MethodResult lookAtBlock(@NotNull IArguments arguments) throws LuaE data.put("name", blockName == null ? null : blockName.toString()); data.put("tags", LuaConverter.tagsToList(() -> state.getBlock().builtInRegistryHolder().tags())); Vec3 pos = blockHit.getLocation(); - Vec3 origin = automataCore.getWorldPos(); + Vec3 origin = automataCore.getPhysicsPos(); data.put("x", pos.x - origin.x); data.put("y", pos.y - origin.y); data.put("z", pos.z - origin.z); @@ -79,7 +79,7 @@ public final MethodResult lookAtEntity(@NotNull IArguments arguments) throws Lua } EntityHitResult entityHit = (EntityHitResult) result; - Vec3 origin = automataCore.getWorldPos(); + Vec3 origin = automataCore.getPhysicsPos(); return MethodResult.of(LuaConverter.completeEntityWithPositionToLua(entityHit.getEntity(), origin, true)); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index baa376c6f..0042788ad 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -185,7 +185,7 @@ public double calculateDistance() { BlockEntityPeripheralOwner owner = peripheral.getPeripheralOwner(); final double maxRange = this.getMaxRange(); Vec3 direction = owner.getDirection(); - Vec3 center = peripheral.getWorldPos(); + Vec3 center = peripheral.getPhysicsPos(); Vec3 from = center; Vec3 to = from.add(direction.x * maxRange, direction.y * maxRange, direction.z * maxRange); diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index 4b99a1f1a..72706f173 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -156,7 +156,7 @@ public boolean isOnShip() { return APAddons.vs2Loaded && APAddons.isBlockOnShip(owner.getLevel(), owner.getPos()); } - public Vec3 getWorldPos() { + public Vec3 getPhysicsPos() { Vec3 pos = this.getCenterPos(); if (!APAddons.vs2Loaded) { return pos; @@ -169,8 +169,8 @@ public Vec3 getWorldPos() { return new Vec3(newPos.x, newPos.y, newPos.z); } - public final BlockPos getWorldBlockPos() { - return new BlockPos(this.getWorldPos()); + public final BlockPos getPhysicsBlockPos() { + return new BlockPos(this.getPhysicsPos()); } protected Direction validateSide(String direction) throws LuaException { From 2e86ba843f00f035824ade4e26115d08565ab573 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 25 Jan 2025 16:12:13 -0700 Subject: [PATCH 169/188] add IPeripheralOwner.getHoldingEntity --- .../owner/BlockEntityPeripheralOwner.java | 13 +++++++---- .../computercraft/owner/IPeripheralOwner.java | 22 +++++++++++++++++-- .../owner/InventoryManagerOwner.java | 17 ++++++++++++++ .../owner/PocketPeripheralOwner.java | 6 ++--- .../owner/TurtlePeripheralOwner.java | 7 ++++++ 5 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/InventoryManagerOwner.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java index 81250b6f2..c30806f59 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java @@ -12,16 +12,17 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.Nameable; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; + +import java.util.Objects; import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Objects; - public class BlockEntityPeripheralOwner extends BasePeripheralOwner { public final T tileEntity; @@ -70,11 +71,15 @@ public FrontAndTop getOrientation() { return tileEntity.getBlockState().getValue(BaseBlock.ORIENTATION); } + @Nullable + @Override + public Entity getHoldingEntity() { + return null; + } + @Nullable @Override public Player getOwner() { - if (tileEntity instanceof InventoryManagerEntity inventoryManagerEntity) - return inventoryManagerEntity.getOwnerPlayer(); return null; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java index 8fea843c6..175df2645 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java @@ -15,9 +15,11 @@ import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.Ship; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; public interface IPeripheralOwner { @@ -50,7 +52,23 @@ default Vec3 getDirection() { return new Vec3(newDir.x, newDir.y, newDir.z); } - @Nullable Player getOwner(); + @Nullable Entity getHoldingEntity(); + + @Nullable + default Player getOwner() { + Entity owner = pocket.getHoldingEntity(); + Set checked = new HashSet<>(); + while (owner != null && checked.add(owner)) { + if (owner instanceof Player player) { + return (Player) player; + } + if (!(owner instanceof OwnableEntity ownable)) { + break; + } + owner = ownable.getOwner(); + } + return null; + } @NotNull CompoundTag getDataStorage(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/InventoryManagerOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/InventoryManagerOwner.java new file mode 100644 index 000000000..c9bc48605 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/InventoryManagerOwner.java @@ -0,0 +1,17 @@ +package de.srendi.advancedperipherals.common.addons.computercraft.owner; + +import de.srendi.advancedperipherals.common.blocks.blockentities.InventoryManagerEntity; +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; + +public class InventoryManagerOwner extends BlockEntityPeripheralOwner { + public InventoryManagerOwner(InventoryManagerEntity tile) { + super(tile); + } + + @Nullable + @Override + public Player getOwner() { + return tileEntity.getOwnerPlayer(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java index 42e20349f..3577e8df9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java @@ -78,10 +78,8 @@ public FrontAndTop getOrientation() { @Nullable @Override - public Player getOwner() { - Entity owner = pocket.getEntity(); - if (owner instanceof Player player) return player; - return null; + public Entity getHoldingEntity() { + return pocket.getEntity(); } @NotNull diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java index 17dd0e3fb..e8365fcc7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java @@ -15,6 +15,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.FrontAndTop; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -64,6 +65,12 @@ public FrontAndTop getOrientation() { return FrontAndTop.fromFrontAndTop(getFacing(), Direction.UP); } + @Nullable + @Override + public Entity getHoldingEntity() { + return null; + } + @Nullable @Override public Player getOwner() { From 2dc9428b73857d639a7583349a73d4f2c5457fcf Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 25 Jan 2025 16:16:26 -0700 Subject: [PATCH 170/188] remove item.copy()s refactor fingerprint generator --- .../InventoryManagerPeripheral.java | 43 ++++++++----------- .../common/util/LuaConverter.java | 12 +++++- .../common/util/inventory/FluidUtil.java | 23 +++++----- .../common/util/inventory/ItemUtil.java | 32 +++++++++----- 4 files changed, 61 insertions(+), 49 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java index 21fe14a0d..eaabc32f0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java @@ -4,7 +4,7 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.InventoryManagerOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.InventoryManagerEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.LuaConverter; @@ -29,12 +29,12 @@ import java.util.List; import java.util.Map; -public class InventoryManagerPeripheral extends BasePeripheral> { +public class InventoryManagerPeripheral extends BasePeripheral { public static final String PERIPHERAL_TYPE = "inventory_manager"; public InventoryManagerPeripheral(InventoryManagerEntity tileEntity) { - super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); + super(PERIPHERAL_TYPE, new InventoryManagerOwner(tileEntity)); } @Override @@ -103,13 +103,13 @@ private MethodResult removeItemCommon(String invDirection, ItemFilter filter) th @LuaFunction(value = {"list", "getItems"}, mainThread = true) public final List getItems() throws LuaException { List items = new ArrayList<>(); - int i = 0; //Used to let users easily sort the items by the slots. Also, a better way for the user to see where an item actually is - for (ItemStack stack : getOwnerPlayer().getInventory().items) { - ItemStack copiedStack = stack.copy(); - if (!copiedStack.isEmpty()) - items.add(LuaConverter.stackToObjectWithSlot(copiedStack, i)); - - i++; + List stacks = getOwnerPlayer().getInventory().items; + // Used to let users easily sort the items by the slots. Also, a better way for the user to see where an item actually is + for (int slot = 0; slot < stacks.size(); slot++) { + ItemStack stack = stacks.get(slot); + if (!stack.isEmpty()) { + items.add(LuaConverter.stackToObjectWithSlot(stack, slot)); + } } return items; } @@ -127,7 +127,7 @@ public final MethodResult getItemsChest(String target) throws LuaException { List items = new ArrayList<>(); for (int slot = 0; slot < inventoryTo.getSlots(); slot++) { if (!inventoryTo.getStackInSlot(slot).isEmpty()) { - items.add(LuaConverter.stackToObjectWithSlot(inventoryTo.getStackInSlot(slot).copy(), slot)); + items.add(LuaConverter.stackToObjectWithSlot(inventoryTo.getStackInSlot(slot), slot)); } } return MethodResult.of(items); @@ -137,9 +137,8 @@ public final MethodResult getItemsChest(String target) throws LuaException { public final List getArmor() throws LuaException { List items = new ArrayList<>(); for (ItemStack stack : getOwnerPlayer().getInventory().armor) { - ItemStack copiedStack = stack.copy(); - if (!copiedStack.isEmpty()) { - items.add(LuaConverter.stackToObjectWithSlot(copiedStack, ArmorSlot.getSlotForItem(copiedStack))); + if (!stack.isEmpty()) { + items.add(LuaConverter.stackToObjectWithSlot(stack, ArmorSlot.getSlotForItem(stack))); } } return items; @@ -157,24 +156,18 @@ public final boolean isPlayerEquipped() throws LuaException { @LuaFunction(mainThread = true) public final boolean isWearing(int index) throws LuaException { - int i = 0; - for (ItemStack stack : getOwnerPlayer().getInventory().armor) { - if (!stack.isEmpty()) { - if (index == i - 100) return true; - i++; - } - } - return false; + List armor = getOwnerPlayer().getInventory().armor; + return 0 <= index && index < armor.size() && armor.get(index); } @LuaFunction(mainThread = true) public final int getEmptySpace() throws LuaException { - int i = 0; + int count = 0; for (ItemStack stack : getOwnerPlayer().getInventory().items) { if (stack.isEmpty()) - i++; + count++; } - return i; + return count; } @LuaFunction(mainThread = true) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index 32eea9135..4c0dd08ad 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -44,6 +44,8 @@ public class LuaConverter { + private static final CompoundTag EMPTY_TAG = new CompoundTag(); + public static Map entityToLua(Entity entity) { Map data = new HashMap<>(); data.put("id", entity.getId()); @@ -200,7 +202,10 @@ public static Map itemStackToObject(@NotNull ItemStack stack) { return null; } Map map = itemToObject(stack.getItem()); - CompoundTag nbt = stack.copy().getOrCreateTag(); + CompoundTag nbt = stack.getTag(); + if (nbt == null) { + nbt = EMPTY_TAG; + } map.put("count", stack.getCount()); map.put("displayName", stack.getDisplayName().getString()); map.put("maxStackSize", stack.getMaxStackSize()); @@ -216,7 +221,10 @@ public static Map fluidStackToObject(@NotNull FluidStack stack) return null; } Map map = fluidToObject(stack.getFluid()); - CompoundTag nbt = stack.copy().getOrCreateTag(); + CompoundTag nbt = stack.getTag(); + if (nbt == null) { + nbt = EMPTY_TAG; + } map.put("count", stack.getAmount()); map.put("displayName", stack.getDisplayName().getString()); map.put("nbt", NBTUtil.toLua(nbt)); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java index a3d8cdec6..64e61a02a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java @@ -28,8 +28,7 @@ public class FluidUtil { - private FluidUtil() { - } + private FluidUtil() {} @Nullable public static IFluidHandler extractHandler(@Nullable Object object) { @@ -76,16 +75,16 @@ public static IFluidHandler getHandlerFromName(@NotNull IComputerAccess access, @NotNull public static String getFingerprint(@NotNull FluidStack stack) { - String fingerprint = stack.getOrCreateTag() + getRegistryKey(stack).toString() + stack.getDisplayName().getString(); - try { - byte[] bytesOfHash = fingerprint.getBytes(StandardCharsets.UTF_8); - MessageDigest md = MessageDigest.getInstance("MD5"); - return StringUtil.toHexString(md.digest(bytesOfHash)); - } catch (NoSuchAlgorithmException ex) { - AdvancedPeripherals.debug("Could not parse fingerprint.", org.apache.logging.log4j.Level.ERROR); - ex.printStackTrace(); + MessageDigest md = ItemUtil.getMessageDigest("MD5"); + if (md == null) { + return ""; + } + CompoundTag tag = stack.getTag(); + md.update(getRegistryKey(stack).toString().getBytes(StandardCharsets.UTF_8)); + if (tag != null && !tag.isEmpty()) { + md.update(tag.getAsString().getBytes(StandardCharsets.UTF_8)); } - return ""; + return StringUtil.toHexString(md.digest()); } public static ResourceLocation getRegistryKey(Fluid fluid) { @@ -93,6 +92,6 @@ public static ResourceLocation getRegistryKey(Fluid fluid) { } public static ResourceLocation getRegistryKey(FluidStack fluid) { - return ForgeRegistries.FLUIDS.getKey(fluid.copy().getFluid()); + return ForgeRegistries.FLUIDS.getKey(fluid.getFluid()); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java index 008d4d928..03ee69088 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java @@ -24,6 +24,18 @@ public class ItemUtil { public static final Item POCKET_NORMAL = Registry.ModItems.POCKET_COMPUTER_NORMAL.get(); public static final Item POCKET_ADVANCED = Registry.ModItems.POCKET_COMPUTER_ADVANCED.get(); + private ItemUtil() {} + + static MessageDigest getMessageDigest(String algorithm) { + try { + return MessageDigest.getInstance(algorithm); + } catch (NoSuchAlgorithmException ex) { + AdvancedPeripherals.debug("Could not generate fingerprint.", Level.ERROR); + ex.printStackTrace(); + return null; + } + } + /** * Fingerprints are MD5 hashes generated out of the nbt tag, the registry name and the display name from item stacks * Used to filter inventory specific operations. {@link de.srendi.advancedperipherals.common.addons.computercraft.peripheral.InventoryManagerPeripheral} @@ -31,16 +43,16 @@ public class ItemUtil { * @return A generated MD5 hash from the item stack */ public static String getFingerprint(ItemStack stack) { - String fingerprint = stack.getOrCreateTag() + getRegistryKey(stack).toString() + stack.getDisplayName().getString(); - try { - byte[] bytesOfHash = fingerprint.getBytes(StandardCharsets.UTF_8); - MessageDigest md = MessageDigest.getInstance("MD5"); - return StringUtil.toHexString(md.digest(bytesOfHash)); - } catch (NoSuchAlgorithmException ex) { - AdvancedPeripherals.debug("Could not parse fingerprint.", Level.ERROR); - ex.printStackTrace(); + MessageDigest md = getMessageDigest("MD5"); + if (md == null) { + return ""; + } + CompoundTag tag = stack.getTag(); + md.update(getRegistryKey(stack).toString().getBytes(StandardCharsets.UTF_8)); + if (tag != null && !tag.isEmpty()) { + md.update(tag.getAsString().getBytes(StandardCharsets.UTF_8)); } - return ""; + return StringUtil.toHexString(md.digest()); } public static ItemStack makeTurtle(Item turtle, String upgrade) { @@ -70,6 +82,6 @@ public static ResourceLocation getRegistryKey(Item item) { } public static ResourceLocation getRegistryKey(ItemStack item) { - return ForgeRegistries.ITEMS.getKey(item.copy().getItem()); + return ForgeRegistries.ITEMS.getKey(item.getItem()); } } From 9c238102356f85a4efd92dcbeb07d155aadece20 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 25 Jan 2025 18:02:25 -0700 Subject: [PATCH 171/188] refactor DistanceDetector --- .../renderer/DistanceDetectorRenderer.java | 2 +- .../owner/BlockEntityPeripheralOwner.java | 1 - .../computercraft/owner/IPeripheralOwner.java | 4 +- .../owner/PocketPeripheralOwner.java | 1 - .../DistanceDetectorPeripheral.java | 190 ++++++++++++++++-- .../InventoryManagerPeripheral.java | 2 +- .../blocks/base/PeripheralBlockEntity.java | 8 +- .../blockentities/DistanceDetectorEntity.java | 125 +++--------- .../modules/ModulePeripheralOwner.java | 6 + .../common/util/HitResultUtil.java | 31 ++- .../common/util/inventory/FluidUtil.java | 3 +- .../common/util/inventory/ItemUtil.java | 1 + 12 files changed, 247 insertions(+), 127 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java index 8c571b8f5..a0b6f8a7c 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/renderer/DistanceDetectorRenderer.java @@ -28,7 +28,7 @@ public DistanceDetectorRenderer(BlockEntityRendererProvider.Context pContext) { @Override public void render(@NotNull DistanceDetectorEntity pBlockEntity, float pPartialTick, @NotNull PoseStack pPoseStack, MultiBufferSource pBufferSource, int pPackedLight, int pPackedOverlay) { - if (pBlockEntity.getLaserVisibility()) { + if (pBlockEntity.getShowLaser()) { float distance = pBlockEntity.getCurrentDistance(); float[] color = EnumColor.RED.getRgb(); if (distance == -1) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java index c30806f59..0a593045a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/BlockEntityPeripheralOwner.java @@ -2,7 +2,6 @@ import dan200.computercraft.api.peripheral.IPeripheral; import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; -import de.srendi.advancedperipherals.common.blocks.blockentities.InventoryManagerEntity; import de.srendi.advancedperipherals.common.util.DataStorageUtil; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralTileEntity; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java index 175df2645..c5a4a8975 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java @@ -8,6 +8,8 @@ import net.minecraft.core.Direction; import net.minecraft.core.FrontAndTop; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.OwnableEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -56,7 +58,7 @@ default Vec3 getDirection() { @Nullable default Player getOwner() { - Entity owner = pocket.getHoldingEntity(); + Entity owner = getHoldingEntity(); Set checked = new HashSet<>(); while (owner != null && checked.add(owner)) { if (owner instanceof Player player) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java index 3577e8df9..f4ed40416 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java @@ -11,7 +11,6 @@ import net.minecraft.core.FrontAndTop; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index bf1f63655..41f535aad 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -4,16 +4,41 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.DistanceDetectorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; +import de.srendi.advancedperipherals.common.util.HitResultUtil; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; -public class DistanceDetectorPeripheral extends BasePeripheral> { +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + +public class DistanceDetectorPeripheral extends BasePeripheral { public static final String PERIPHERAL_TYPE = "distance_detector"; + private final DistanceDetectorEntity tileEntity; + private final AtomicInteger maxRange; + private volatile float currentDistance; + private final AtomicBoolean showLaser; + private volatile boolean calculatePeriodically; + private volatile boolean ignoreTransparent; + private final AtomicReference detectionType; + public DistanceDetectorPeripheral(DistanceDetectorEntity tileEntity) { super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); + this.tileEntity = tileEntity; + this.maxRange = new AtomicInteger(Float.floatToRawIntBits(this.tileEntity.getMaxRange())); + this.currentDistance = this.tileEntity.getCurrentDistance(); + this.showLaser = new AtomicBoolean(this.tileEntity.getShowLaser()); + this.calculatePeriodically = this.tileEntity.getCalculatePeriodically(); + this.ignoreTransparent = this.tileEntity.getIgnoreTransparent(); + this.detectionType = new AtomicReference<>(this.tileEntity.getDetectionType()); } @Override @@ -21,24 +46,115 @@ public boolean isEnabled() { return APConfig.PERIPHERALS_CONFIG.enableDistanceDetector.get(); } + public float getConfiguredMaxRange() { + return APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue(); + } + + public float getMaxRange() { + return Float.intBitsToFloat(this.maxRange.get()); + } + + public void setMaxRange(float maxRange) { + maxRange = Math.min(Math.max(maxRange, 0), this.getConfiguredMaxRange()); + int maxRangeBits = Float.floatToRawIntBits(maxRange); + if (this.maxRange.getAndSet(maxRangeBits) == maxRange) { + return; + } + if (this.tileEntity != null) { + this.tileEntity.setMaxRange(maxRange); + this.tileEntity.sendUpdate(); + } + this.owner.markDataStorageDirty(); + } + + public float getCurrentDistance() { + return this.currentDistance; + } + + public void setCurrentDistance(float currentDistance) { + // Since setCurrentDistance should only invokes from main thread, volatile field should be safe here. + if (this.currentDistance == currentDistance) { + return; + } + this.currentDistance = currentDistance; + if (this.tileEntity != null) { + this.tileEntity.setCurrentDistance(currentDistance); + this.tileEntity.sendUpdate(); + } + this.owner.markDataStorageDirty(); + } + + public boolean getCalculatePeriodically() { + return this.calculatePeriodically; + } + + public void setCalculatePeriodically(boolean calculatePeriodically) { + this.calculatePeriodically = calculatePeriodically; + if (this.tileEntity != null) { + this.tileEntity.setCalculatePeriodically(calculatePeriodically); + } + this.owner.markDataStorageDirty(); + } + + public boolean getShowLaser() { + return this.showLaser.get(); + } + + public void setShowLaser(boolean showLaser) { + if (this.showLaser.getAndSet(showLaser) == showLaser) { + return; + } + if (this.tileEntity != null) { + this.tileEntity.setShowLaser(showLaser); + this.tileEntity.sendUpdate(); + } + this.owner.markDataStorageDirty(); + } + + public boolean getIgnoreTransparent() { + return this.ignoreTransparent; + } + + public void setIgnoreTransparent(boolean ignoreTransparent) { + this.ignoreTransparent = ignoreTransparent; + if (this.tileEntity != null) { + this.tileEntity.setIgnoreTransparent(ignoreTransparent); + } + this.owner.markDataStorageDirty(); + } + + public DetectionType getDetectionType() { + return this.detectionType.get(); + } + + public void setDetectionType(DetectionType detectionType) { + if (this.detectionType.getAndSet(detectionType) == detectionType) { + return; + } + if (this.tileEntity != null) { + this.tileEntity.setDetectionType(detectionType); + } + this.owner.markDataStorageDirty(); + } + @LuaFunction public final void setLaserVisibility(boolean laser) { - getPeripheralOwner().tileEntity.setShowLaser(laser); + this.setShowLaser(laser); } @LuaFunction public final boolean getLaserVisibility() { - return getPeripheralOwner().tileEntity.getLaserVisibility(); + return this.getShowLaser(); } @LuaFunction - public final void setIgnoreTransparency(boolean enable) { - getPeripheralOwner().tileEntity.setIgnoreTransparent(enable); + public final void setIgnoreTransparencyLua(boolean enable) { + this.setIgnoreTransparent(enable); } @LuaFunction public final boolean ignoresTransparency() { - return getPeripheralOwner().tileEntity.ignoreTransparent(); + return this.getIgnoreTransparent(); } @LuaFunction @@ -61,55 +177,85 @@ public final void setDetectionMode(IArguments args) throws LuaException { } else { throw new LuaException("arg #1 must be a string or a number"); } - getPeripheralOwner().tileEntity.setDetectionType(detectionType); + this.setDetectionType(detectionType); } @LuaFunction public final boolean detectsEntities() { - DetectionType detectionType = getPeripheralOwner().tileEntity.getDetectionType(); - return detectionType.detectEntity(); + return this.getDetectionType().detectEntity(); } @LuaFunction public final boolean detectsBlocks() { - DetectionType detectionType = getPeripheralOwner().tileEntity.getDetectionType(); - return detectionType.detectBlock(); + return this.getDetectionType().detectBlock(); } @LuaFunction public final String getDetectionMode() { - DetectionType detectionType = getPeripheralOwner().tileEntity.getDetectionType(); - return detectionType.toString(); + return this.getDetectionType().toString(); } @LuaFunction public final double getDistance() { - return getPeripheralOwner().tileEntity.getCurrentDistance(); + return this.getCurrentDistance(); } @LuaFunction(mainThread = true) public final double calculateDistance() { - return getPeripheralOwner().tileEntity.calculateAndUpdateDistance(); + return this.calculateAndUpdateDistance(); } @LuaFunction public final boolean shouldCalculatePeriodically() { - return getPeripheralOwner().tileEntity.shouldCalculatePeriodically(); + return this.getCalculatePeriodically(); } @LuaFunction - public final void setCalculatePeriodically(boolean shouldRenderPeriodically) { - getPeripheralOwner().tileEntity.setShouldCalculatePeriodically(shouldRenderPeriodically); + public final void setCalculatePeriodicallyLua(boolean shouldCalculatePeriodically) { + this.setCalculatePeriodically(shouldCalculatePeriodically); } @LuaFunction - public final void setMaxRange(double maxDistance) { - getPeripheralOwner().tileEntity.setMaxRange((float) maxDistance); + public final void setMaxRangeLua(double maxDistance) { + this.setMaxRange((float) maxDistance); } @LuaFunction - public final double getMaxRange() { - return getPeripheralOwner().tileEntity.getMaxRange(); + public final double getMaxRangeLua() { + return this.getMaxRange(); + } + + protected double calculateDistanceImpl() { + final double maxRange = this.getMaxRange(); + Vec3 direction = this.owner.getDirection(); + Vec3 center = this.getPhysicsPos(); + Vec3 from = center; + Vec3 to = from.add(direction.scale(maxRange)); + + HitResult result = this.getHitResult(from, to); + if (result.getType() == HitResult.Type.MISS) { + return -1; + } + return result.getLocation().distanceTo(center) - 0.5f; + } + + /** + * calculateAndUpdateDistance should only invokes from server main thread + */ + public double calculateAndUpdateDistance() { + double distance = this.calculateDistanceImpl(); + this.setCurrentDistance((float) distance); + return distance; + } + + protected HitResult getHitResult(Vec3 from, Vec3 to) { + Level level = this.getLevel(); + ClipContext.ShapeGetter shapeGetter = this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER; + return switch (this.getDetectionType()) { + case ENTITY -> HitResultUtil.getEntityHitResult(from, to, level, this.owner.getHoldingEntity()); + case BLOCK -> HitResultUtil.getBlockHitResult(from, to, level, shapeGetter, this.getPos()); + case BOTH -> HitResultUtil.getHitResult(from, to, level, shapeGetter, this.owner); + }; } public enum DetectionType { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java index eaabc32f0..72fda1b7f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/InventoryManagerPeripheral.java @@ -157,7 +157,7 @@ public final boolean isPlayerEquipped() throws LuaException { @LuaFunction(mainThread = true) public final boolean isWearing(int index) throws LuaException { List armor = getOwnerPlayer().getInventory().armor; - return 0 <= index && index < armor.size() && armor.get(index); + return 0 <= index && index < armor.size() && !armor.get(index).isEmpty(); } @LuaFunction(mainThread = true) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java index 5014be652..e9507f900 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java @@ -20,6 +20,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -230,9 +231,12 @@ public void markSettingsChanged() { this.setChanged(); } - protected void sendUpdate() { + public void sendUpdate() { this.setChanged(); - this.getLevel().sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 11); + Level level = this.getLevel(); + if (level != null) { + level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 11); + } } public ComputerSide getComputerSide(Direction direction) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 0042788ad..828a61b4c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -1,35 +1,28 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; -import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.DistanceDetectorPeripheral; import de.srendi.advancedperipherals.common.blocks.base.BaseBlock; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; -import de.srendi.advancedperipherals.common.util.HitResultUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; - public class DistanceDetectorEntity extends PeripheralBlockEntity { - private final AtomicInteger maxRange = new AtomicInteger(Float.floatToRawIntBits(APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue())); - private final AtomicInteger currentDistance = new AtomicInteger(Float.floatToRawIntBits(-1)); - private final AtomicBoolean showLaser = new AtomicBoolean(true); - private volatile boolean periodicallyCalculate = false; + private volatile float maxRange = APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue(); + private float currentDistance = -1; + private volatile boolean showLaser = true; + private volatile boolean calculatePeriodically = false; private volatile boolean ignoreTransparent = true; private volatile DistanceDetectorPeripheral.DetectionType detectionType = DistanceDetectorPeripheral.DetectionType.BOTH; @@ -44,69 +37,43 @@ protected DistanceDetectorPeripheral createPeripheral() { } public float getMaxRange() { - return Float.intBitsToFloat(this.maxRange.get()); - } - - protected void setMaxRangeNoUpdate(float maxRange) { - maxRange = Math.min(Math.max(maxRange, 0), APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue()); - int maxRangeBits = Float.floatToRawIntBits(maxRange); - this.maxRange.set(maxRangeBits); + return this.maxRange; } public void setMaxRange(float maxRange) { - maxRange = Math.min(Math.max(maxRange, 0), APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue()); - int maxRangeBits = Float.floatToRawIntBits(maxRange); - if (this.maxRange.getAndSet(maxRangeBits) != maxRange) { - this.sendUpdate(); - } + this.maxRange = Math.min(Math.max(maxRange, 0), APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue()); } public float getCurrentDistance() { - return Float.intBitsToFloat(this.currentDistance.get()); - } - - protected void setCurrentDistanceNoUpdate(float currentDistance) { - int currentDistanceBits = Float.floatToRawIntBits(currentDistance); - this.currentDistance.set(currentDistanceBits); + return this.currentDistance; } public void setCurrentDistance(float currentDistance) { - int currentDistanceBits = Float.floatToRawIntBits(currentDistance); - if (this.currentDistance.getAndSet(currentDistanceBits) != currentDistanceBits) { - this.sendUpdate(); - } - } - - public boolean getLaserVisibility() { - return this.showLaser.get(); + this.currentDistance = currentDistance; } - protected void setShowLaserNoUpdate(boolean showLaser) { - this.showLaser.set(showLaser); + public boolean getShowLaser() { + return this.showLaser; } public void setShowLaser(boolean showLaser) { - if (this.showLaser.getAndSet(showLaser) != showLaser) { - this.sendUpdate(); - } + this.showLaser = showLaser; } - public boolean shouldCalculatePeriodically() { - return this.periodicallyCalculate; + public boolean getCalculatePeriodically() { + return this.calculatePeriodically; } - public void setShouldCalculatePeriodically(boolean periodicallyCalculate) { - this.periodicallyCalculate = periodicallyCalculate; - this.setChanged(); + public void setCalculatePeriodically(boolean calculatePeriodically) { + this.calculatePeriodically = calculatePeriodically; } - public boolean ignoreTransparent() { + public boolean getIgnoreTransparent() { return this.ignoreTransparent; } public void setIgnoreTransparent(boolean ignoreTransparent) { this.ignoreTransparent = ignoreTransparent; - this.setChanged(); } public DistanceDetectorPeripheral.DetectionType getDetectionType() { @@ -115,17 +82,21 @@ public DistanceDetectorPeripheral.DetectionType getDetectionType() { public void setDetectionType(DistanceDetectorPeripheral.DetectionType detectionType) { this.detectionType = detectionType; - this.setChanged(); } @Override public void handleTick(Level level, BlockState state, BlockEntityType type) { - if (level.getGameTime() % APConfig.PERIPHERALS_CONFIG.distanceDetectorUpdateRate.get() == 0 && this.shouldCalculatePeriodically()) { + DistanceDetectorPeripheral peripheral = this.getPeripheral(); + if (peripheral == null) { + return; + } + + if (level.getGameTime() % APConfig.PERIPHERALS_CONFIG.distanceDetectorUpdateRate.get() == 0 && this.getCalculatePeriodically()) { // We calculate the distance every 2 ticks, so we do not have to run the getDistance function of the peripheral // on the main thread which prevents the 1 tick yield time of the function. // The calculateDistance function is not thread safe, so we have to run it on the main thread. // It should be okay to run that function every 2 ticks, calculating it does not take too much time. - this.calculateAndUpdateDistance(); + peripheral.calculateAndUpdateDistance(); } } @@ -143,10 +114,10 @@ public AABB getRenderBoundingBox() { @Override public void load(@NotNull CompoundTag compound) { - this.setMaxRangeNoUpdate(compound.getFloat("maxRange")); - this.setCurrentDistanceNoUpdate(compound.getFloat("currentDistance")); - this.setShowLaserNoUpdate(compound.getBoolean("showLaser")); - this.setShouldCalculatePeriodically(compound.getBoolean("calculatePeriodically")); + this.setMaxRange(compound.getFloat("maxRange")); + this.setCurrentDistance(compound.getFloat("currentDistance")); + this.setShowLaser(compound.getBoolean("showLaser")); + this.setCalculatePeriodically(compound.getBoolean("calculatePeriodically")); this.setIgnoreTransparent(compound.getBoolean("ignoreTransparent")); this.setDetectionType(DistanceDetectorPeripheral.DetectionType.values()[compound.getByte("detectionType")]); super.load(compound); @@ -157,9 +128,9 @@ public void saveAdditional(@NotNull CompoundTag compound) { super.saveAdditional(compound); compound.putFloat("maxRange", this.getMaxRange()); compound.putFloat("currentDistance", this.getCurrentDistance()); - compound.putBoolean("showLaser", this.getLaserVisibility()); - compound.putBoolean("calculatePeriodically", this.shouldCalculatePeriodically()); - compound.putBoolean("ignoreTransparent", this.ignoreTransparent()); + compound.putBoolean("showLaser", this.getShowLaser()); + compound.putBoolean("calculatePeriodically", this.getCalculatePeriodically()); + compound.putBoolean("ignoreTransparent", this.getIgnoreTransparent()); compound.putByte("detectionType", (byte) this.getDetectionType().ordinal()); } @@ -168,7 +139,7 @@ public CompoundTag getUpdateTag() { CompoundTag compound = super.getUpdateTag(); compound.putFloat("maxRange", this.getMaxRange()); compound.putFloat("currentDistance", this.getCurrentDistance()); - compound.putBoolean("showLaser", this.getLaserVisibility()); + compound.putBoolean("showLaser", this.getShowLaser()); return compound; } @@ -176,38 +147,4 @@ public CompoundTag getUpdateTag() { public ClientboundBlockEntityDataPacket getUpdatePacket() { return ClientboundBlockEntityDataPacket.create(this); } - - public double calculateDistance() { - DistanceDetectorPeripheral peripheral = this.getPeripheral(); - if (peripheral == null) { - return -1; - } - BlockEntityPeripheralOwner owner = peripheral.getPeripheralOwner(); - final double maxRange = this.getMaxRange(); - Vec3 direction = owner.getDirection(); - Vec3 center = peripheral.getPhysicsPos(); - Vec3 from = center; - Vec3 to = from.add(direction.x * maxRange, direction.y * maxRange, direction.z * maxRange); - - HitResult result = this.getHitResult(from, to); - if (result.getType() == HitResult.Type.MISS) { - return -1; - } - return result.getLocation().distanceTo(center) - 0.5f; - } - - public double calculateAndUpdateDistance() { - double distance = this.calculateDistance(); - this.setCurrentDistance((float) distance); - return distance; - } - - private HitResult getHitResult(Vec3 from, Vec3 to) { - Level level = this.getLevel(); - return switch (this.detectionType) { - case ENTITY -> HitResultUtil.getEntityHitResult(from, to, level); - case BLOCK -> HitResultUtil.getBlockHitResult(from, to, level, this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, this.getBlockPos()); - case BOTH -> HitResultUtil.getHitResult(from, to, level, this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER, this.getBlockPos()); - }; - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java index b7407a577..f7353f1ef 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheralOwner.java @@ -81,6 +81,12 @@ public SmartGlassesComputer getComputer() { return computer; } + @Nullable + @Override + public Entity getHoldingEntity() { + return computer.getEntity(); + } + @Nullable @Override public Player getOwner() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java index b03e05d77..6112dc4a7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/HitResultUtil.java @@ -1,5 +1,8 @@ package de.srendi.advancedperipherals.common.util; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.DistanceDetectorPeripheral; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -46,11 +49,18 @@ public static HitResult getHitResult(Vec3 from, Vec3 to, Level level, ClipContex * @param to the target position/max position * @param level the level * @param shapeGetter the block collision shape getter - * @param source the source Entity/BlockPos that will be ignored + * @param source the source Entity/BlockPos that will be ignored, or an {@link IPeripheralOwner} to auto determine the source. * @return the hit result. {@link BlockHitResult#miss(Vec3, Direction, BlockPos)} if nothing found */ @NotNull public static HitResult getHitResult(Vec3 from, Vec3 to, Level level, ClipContext.ShapeGetter shapeGetter, Object source) { + if (source instanceof IPeripheralOwner owner) { + if (owner instanceof BlockEntityPeripheralOwner || owner instanceof TurtlePeripheralOwner) { + source = owner.getPos(); + } else { + source = owner.getHoldingEntity(); + } + } EntityHitResult entityResult = getEntityHitResult(from, to, level, source instanceof Entity ? (Entity) source : null, source instanceof Predicate ? (Predicate) source : EntitySelector.NO_SPECTATORS); BlockHitResult blockResult = getBlockHitResult(from, to, level, shapeGetter, source instanceof BlockPos ? (BlockPos) source : null); @@ -82,7 +92,24 @@ public static HitResult getHitResult(Vec3 from, Vec3 to, Level level, ClipContex */ @NotNull public static EntityHitResult getEntityHitResult(Vec3 from, Vec3 to, Level level) { - return getEntityHitResult(from, to, level, null, EntitySelector.NO_SPECTATORS); + return getEntityHitResult(from, to, level, null); + } + + /** + * This method is used to get the hit result of an entity from the start position of a block + * This could be used to find an entity from the eyes position of another entity but since + * this method uses one AABB made out of the two coordinates, this would also find any entities + * which are not located in the ray you might want. {@link DistanceDetectorPeripheral#getDistance()} + * + * @param from the source position like a block + * @param to the target position/max position + * @param level the world + * @param source the source Entity that will be ignored + * @return the entity hit result. An empty HitResult with {@link HitResult.Type#MISS} as type if nothing found + */ + @NotNull + public static EntityHitResult getEntityHitResult(Vec3 from, Vec3 to, Level level, Entity source) { + return getEntityHitResult(from, to, level, source, EntitySelector.NO_SPECTATORS); } /** diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java index 64e61a02a..f6fcbae85 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/FluidUtil.java @@ -3,11 +3,11 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; -import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; import de.srendi.advancedperipherals.common.util.CoordUtil; import de.srendi.advancedperipherals.common.util.StringUtil; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -23,7 +23,6 @@ import java.nio.charset.StandardCharsets; import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.Objects; public class FluidUtil { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java index 03ee69088..87f47ae77 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/ItemUtil.java @@ -3,6 +3,7 @@ import dan200.computercraft.shared.Registry; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.util.StringUtil; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; From f1e2c5a54f6a9ba3d00bbdd095c991fac3585a9a Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 25 Jan 2025 19:46:46 -0700 Subject: [PATCH 172/188] fix registeriation --- .../ae219fa7c7d3297c14e454863eac3998a4eab78c | 3 +- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +- .../advancedperipherals/lang/en_us.json | 1 + .../pocket_upgrades/distance_pocket.json | 4 ++ .../owner/PocketPeripheralOwner.java | 10 ++- .../peripheral/ChatBoxPeripheral.java | 5 +- .../peripheral/ColonyPeripheral.java | 5 +- .../DistanceDetectorPeripheral.java | 29 ++++++-- .../EnvironmentDetectorPeripheral.java | 5 +- .../peripheral/GeoScannerPeripheral.java | 5 +- .../peripheral/PlayerDetectorPeripheral.java | 5 +- .../pocket/PocketChatBoxUpgrade.java | 4 +- .../pocket/PocketColonyIntegratorUpgrade.java | 4 +- .../pocket/PocketDistanceDetectorUpgrade.java | 23 +++++++ .../pocket/PocketEnvironmentUpgrade.java | 4 +- .../pocket/PocketGeoScannerUpgrade.java | 4 +- .../pocket/PocketPlayerDetectorUpgrade.java | 4 +- .../common/data/EnUsLanguageProvider.java | 1 + .../common/data/PocketUpgradesProvider.java | 5 +- .../common/items/SmartGlassesItem.java | 2 +- .../common/setup/CCRegistration.java | 3 + .../smartglasses/SmartGlassesComputer.java | 68 +++++++++++++------ .../smartglasses/SmartGlassesItemHandler.java | 2 +- .../common/util/DataStorageUtil.java | 16 ++++- .../common/util/NBTUtil.java | 1 + .../lib/peripherals/DisabledPeripheral.java | 9 +-- 26 files changed, 166 insertions(+), 60 deletions(-) create mode 100644 src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketDistanceDetectorUpgrade.java diff --git a/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c b/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c index 8fe8c2d79..5821f3f8a 100644 --- a/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c +++ b/src/generated/resources/.cache/ae219fa7c7d3297c14e454863eac3998a4eab78c @@ -1,6 +1,7 @@ -// 1.19.2 2024-05-28T14:53:16.655934 Pocket Computer Upgrades +// 1.19.2 2025-01-25T19:46:21.23515 Pocket Computer Upgrades b672635324c0df354e587efc81d0b19a581eae2f data/advancedperipherals/computercraft/pocket_upgrades/chatty_pocket.json 30b8f663613c7ce77048fd69631afcc11a682276 data/advancedperipherals/computercraft/pocket_upgrades/colony_pocket.json +661dc77bd0442bfb2a5ed80cff271071817bb22d data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json d4647159c2f2693a9c5e8d12bf740635751d29a8 data/advancedperipherals/computercraft/pocket_upgrades/environment_pocket.json 8216a0a7d8ebe3ae738c8fc3626df25eb0a2e07a data/advancedperipherals/computercraft/pocket_upgrades/geoscanner_pocket.json a38aa83593f7ad0ace98e01bb3b5f06f272ef734 data/advancedperipherals/computercraft/pocket_upgrades/player_pocket.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index 2cb09adb4..c804ec644 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.19.2 2025-01-20T07:50:09.44057 Languages: en_us -ebf2194b8fece940adb61f1ae317f68799bd498f assets/advancedperipherals/lang/en_us.json +// 1.19.2 2025-01-25T19:46:21.234203 Languages: en_us +e858500d72e9279f0fe0e8b2d03f94469c8d1f65 assets/advancedperipherals/lang/en_us.json diff --git a/src/generated/resources/assets/advancedperipherals/lang/en_us.json b/src/generated/resources/assets/advancedperipherals/lang/en_us.json index ef080ec50..3da1acb77 100644 --- a/src/generated/resources/assets/advancedperipherals/lang/en_us.json +++ b/src/generated/resources/assets/advancedperipherals/lang/en_us.json @@ -80,6 +80,7 @@ "keybind.advancedperipherals.description": "Show Description", "pocket.advancedperipherals.chatty_pocket": "Chatty", "pocket.advancedperipherals.colony_pocket": "Colony", + "pocket.advancedperipherals.distance_pocket": "Distance Detector", "pocket.advancedperipherals.environment_pocket": "Environment", "pocket.advancedperipherals.geoscanner_pocket": "Geo", "pocket.advancedperipherals.player_pocket": "Player Detector", diff --git a/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json new file mode 100644 index 000000000..0d83ccc1d --- /dev/null +++ b/src/generated/resources/data/advancedperipherals/computercraft/pocket_upgrades/distance_pocket.json @@ -0,0 +1,4 @@ +{ + "type": "advancedperipherals:distance_pocket", + "item": "advancedperipherals:distance_detector" +} \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java index f4ed40416..b9bc35ce5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java @@ -2,6 +2,7 @@ import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.pocket.IPocketAccess; +import dan200.computercraft.api.pocket.IPocketUpgrade; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.DataStorageUtil; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; @@ -20,12 +21,15 @@ public class PocketPeripheralOwner extends BasePeripheralOwner { private final IPocketAccess pocket; + private final IPocketUpgrade upgrade; - public PocketPeripheralOwner(IPocketAccess pocket) { + public PocketPeripheralOwner(IPocketAccess pocket, IPocketUpgrade upgrade) { super(); this.pocket = pocket; - if(APConfig.PERIPHERALS_CONFIG.disablePocketFuelConsumption.get()) + this.upgrade = upgrade; + if (APConfig.PERIPHERALS_CONFIG.disablePocketFuelConsumption.get()) { attachAbility(PeripheralOwnerAbility.FUEL, new InfinitePocketFuelAbility(this)); + } } @Nullable @@ -84,7 +88,7 @@ public Entity getHoldingEntity() { @NotNull @Override public CompoundTag getDataStorage() { - return DataStorageUtil.getDataStorage(pocket); + return DataStorageUtil.getDataStorage(pocket, upgrade); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java index 88f3cf3aa..7616d1e27 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java @@ -7,6 +7,7 @@ import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.pocket.IPocketAccess; +import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; import de.srendi.advancedperipherals.AdvancedPeripherals; @@ -66,8 +67,8 @@ public ChatBoxPeripheral(ITurtleAccess turtle, TurtleSide side) { this(new TurtlePeripheralOwner(turtle, side)); } - public ChatBoxPeripheral(IPocketAccess pocket) { - this(new PocketPeripheralOwner(pocket)); + public ChatBoxPeripheral(IPocketAccess pocket, IPocketUpgrade upgrade) { + this(new PocketPeripheralOwner(pocket, upgrade)); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java index 12aefd596..8b5a9a1e9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ColonyPeripheral.java @@ -18,6 +18,7 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.pocket.IPocketAccess; +import dan200.computercraft.api.pocket.IPocketUpgrade; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; @@ -50,8 +51,8 @@ public ColonyPeripheral(PeripheralBlockEntity tileEntity) { super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); } - public ColonyPeripheral(IPocketAccess access) { - super(PERIPHERAL_TYPE, new PocketPeripheralOwner(access)); + public ColonyPeripheral(IPocketAccess access, IPocketUpgrade upgrade) { + super(PERIPHERAL_TYPE, new PocketPeripheralOwner(access, upgrade)); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 41f535aad..7babcdf91 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -3,12 +3,16 @@ import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.pocket.IPocketAccess; +import dan200.computercraft.api.pocket.IPocketUpgrade; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; +import de.srendi.advancedperipherals.common.addons.computercraft.owner.PocketPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.DistanceDetectorEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.HitResultUtil; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; @@ -41,6 +45,23 @@ public DistanceDetectorPeripheral(DistanceDetectorEntity tileEntity) { this.detectionType = new AtomicReference<>(this.tileEntity.getDetectionType()); } + // TODO: thread safely save data + protected DistanceDetectorPeripheral(IPeripheralOwner owner) { + super(PERIPHERAL_TYPE, owner); + this.tileEntity = null; + CompoundTag data = this.owner.getDataStorage(); + this.maxRange = new AtomicInteger(Float.floatToRawIntBits(data.contains("maxRange") ? data.getFloat("maxRange") : this.getConfiguredMaxRange())); + this.currentDistance = data.contains("currentDistance") ? data.getFloat("currentDistance") : -1; + this.showLaser = new AtomicBoolean(data.contains("showLaser") ? data.getBoolean("showLaser") : true); + this.calculatePeriodically = data.contains("calculatePeriodically") ? data.getBoolean("calculatePeriodically") : false; + this.ignoreTransparent = data.contains("ignoreTransparent") ? data.getBoolean("ignoreTransparent") : true; + this.detectionType = new AtomicReference<>(data.contains("detectionType") ? DetectionType.values()[data.getByte("detectionType")] : DetectionType.BOTH); + } + + public DistanceDetectorPeripheral(IPocketAccess pocket, IPocketUpgrade upgrade) { + this(new PocketPeripheralOwner(pocket, upgrade)); + } + @Override public boolean isEnabled() { return APConfig.PERIPHERALS_CONFIG.enableDistanceDetector.get(); @@ -147,7 +168,7 @@ public final boolean getLaserVisibility() { return this.getShowLaser(); } - @LuaFunction + @LuaFunction(value = {"setIgnoreTransparency"}) public final void setIgnoreTransparencyLua(boolean enable) { this.setIgnoreTransparent(enable); } @@ -210,17 +231,17 @@ public final boolean shouldCalculatePeriodically() { return this.getCalculatePeriodically(); } - @LuaFunction + @LuaFunction(value = {"setCalculatePeriodically"}) public final void setCalculatePeriodicallyLua(boolean shouldCalculatePeriodically) { this.setCalculatePeriodically(shouldCalculatePeriodically); } - @LuaFunction + @LuaFunction(value = {"setMaxRange"}) public final void setMaxRangeLua(double maxDistance) { this.setMaxRange((float) maxDistance); } - @LuaFunction + @LuaFunction(value = {"getMaxRange"}) public final double getMaxRangeLua() { return this.getMaxRange(); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index 92c668b17..a30fd0a5d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -5,6 +5,7 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.pocket.IPocketAccess; +import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; import de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperationContext; @@ -68,8 +69,8 @@ public EnvironmentDetectorPeripheral(ITurtleAccess turtle, TurtleSide side) { this(new TurtlePeripheralOwner(turtle, side).attachFuel(1)); } - public EnvironmentDetectorPeripheral(IPocketAccess pocket) { - this(new PocketPeripheralOwner(pocket)); + public EnvironmentDetectorPeripheral(IPocketAccess pocket, IPocketUpgrade upgrade) { + this(new PocketPeripheralOwner(pocket, upgrade)); } private static int estimateCost(int radius) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java index 766586170..6a9ccacb8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/GeoScannerPeripheral.java @@ -5,6 +5,7 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.pocket.IPocketAccess; +import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; import de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperationContext; @@ -57,8 +58,8 @@ public GeoScannerPeripheral(ITurtleAccess turtle, TurtleSide side) { this(new TurtlePeripheralOwner(turtle, side).attachFuel(1)); } - public GeoScannerPeripheral(IPocketAccess pocket) { - this(new PocketPeripheralOwner(pocket)); + public GeoScannerPeripheral(IPocketAccess pocket, IPocketUpgrade upgrade) { + this(new PocketPeripheralOwner(pocket, upgrade)); } private static List> scan(List> result, Level level, Vec3 center, int radius) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java index dc05ba478..fc3e5c058 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java @@ -5,6 +5,7 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.pocket.IPocketAccess; +import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; @@ -41,8 +42,8 @@ public PlayerDetectorPeripheral(ITurtleAccess access, TurtleSide side) { super(PERIPHERAL_TYPE, new TurtlePeripheralOwner(access, side)); } - public PlayerDetectorPeripheral(IPocketAccess pocket) { - super(PERIPHERAL_TYPE, new PocketPeripheralOwner(pocket)); + public PlayerDetectorPeripheral(IPocketAccess pocket, IPocketUpgrade upgrade) { + super(PERIPHERAL_TYPE, new PocketPeripheralOwner(pocket, upgrade)); } private boolean isAllowedMultiDimensional() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketChatBoxUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketChatBoxUpgrade.java index e0a17833b..5264a1b46 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketChatBoxUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketChatBoxUpgrade.java @@ -15,8 +15,8 @@ public PocketChatBoxUpgrade(ResourceLocation id, ItemStack stack) { @Nullable @Override - public ChatBoxPeripheral getPeripheral(IPocketAccess access) { - return new ChatBoxPeripheral(access); + public ChatBoxPeripheral getPeripheral(IPocketAccess pocketAccess) { + return new ChatBoxPeripheral(pocketAccess, this); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketColonyIntegratorUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketColonyIntegratorUpgrade.java index 752ccb18e..6c439404f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketColonyIntegratorUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketColonyIntegratorUpgrade.java @@ -13,7 +13,7 @@ public PocketColonyIntegratorUpgrade(ResourceLocation id, ItemStack stack) { } @Override - protected ColonyPeripheral getPeripheral(IPocketAccess access) { - return new ColonyPeripheral(access); + protected ColonyPeripheral getPeripheral(IPocketAccess pocketAccess) { + return new ColonyPeripheral(pocketAccess, this); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketDistanceDetectorUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketDistanceDetectorUpgrade.java new file mode 100644 index 000000000..82b47d31f --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketDistanceDetectorUpgrade.java @@ -0,0 +1,23 @@ +package de.srendi.advancedperipherals.common.addons.computercraft.pocket; + +import dan200.computercraft.api.pocket.IPocketAccess; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.DistanceDetectorPeripheral; +import de.srendi.advancedperipherals.lib.pocket.BasePocketUpgrade; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PocketDistanceDetectorUpgrade extends BasePocketUpgrade { + + public PocketDistanceDetectorUpgrade(ResourceLocation id, ItemStack stack) { + super(id, stack); + } + + @Nullable + @Override + public DistanceDetectorPeripheral getPeripheral(@NotNull IPocketAccess pocketAccess) { + return new DistanceDetectorPeripheral(pocketAccess, this); + } + +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketEnvironmentUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketEnvironmentUpgrade.java index dc6719b17..dd23a28b8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketEnvironmentUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketEnvironmentUpgrade.java @@ -16,8 +16,8 @@ public PocketEnvironmentUpgrade(ResourceLocation id, ItemStack stack) { @Nullable @Override - public EnvironmentDetectorPeripheral getPeripheral(@NotNull IPocketAccess iPocketAccess) { - return new EnvironmentDetectorPeripheral(iPocketAccess); + public EnvironmentDetectorPeripheral getPeripheral(@NotNull IPocketAccess pocketAccess) { + return new EnvironmentDetectorPeripheral(pocketAccess, this); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketGeoScannerUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketGeoScannerUpgrade.java index 98823d94a..03d23d26a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketGeoScannerUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketGeoScannerUpgrade.java @@ -16,8 +16,8 @@ public PocketGeoScannerUpgrade(ResourceLocation id, ItemStack stack) { @Nullable @Override - public GeoScannerPeripheral getPeripheral(@NotNull IPocketAccess iPocketAccess) { - return new GeoScannerPeripheral(iPocketAccess); + public GeoScannerPeripheral getPeripheral(@NotNull IPocketAccess pocketAccess) { + return new GeoScannerPeripheral(pocketAccess, this); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketPlayerDetectorUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketPlayerDetectorUpgrade.java index 1e2b6bb43..422b02e0f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketPlayerDetectorUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/pocket/PocketPlayerDetectorUpgrade.java @@ -16,8 +16,8 @@ public PocketPlayerDetectorUpgrade(ResourceLocation id, ItemStack stack) { @Nullable @Override - public PlayerDetectorPeripheral getPeripheral(@NotNull IPocketAccess iPocketAccess) { - return new PlayerDetectorPeripheral(iPocketAccess); + public PlayerDetectorPeripheral getPeripheral(@NotNull IPocketAccess pocketAccess) { + return new PlayerDetectorPeripheral(pocketAccess, this); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java index 1e874d486..832cf08be 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/EnUsLanguageProvider.java @@ -100,6 +100,7 @@ private void addTurtles() { private void addPockets() { addPocket(CCRegistration.ID.CHATTY_POCKET, "Chatty"); addPocket(CCRegistration.ID.COLONY_POCKET, "Colony"); + addPocket(CCRegistration.ID.DISTANCE_POCKET, "Distance Detector"); addPocket(CCRegistration.ID.ENVIRONMENT_POCKET, "Environment"); addPocket(CCRegistration.ID.GEOSCANNER_POCKET, "Geo"); addPocket(CCRegistration.ID.PLAYER_POCKET, "Player Detector"); diff --git a/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java b/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java index 385b75679..a021dbee7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java +++ b/src/main/java/de/srendi/advancedperipherals/common/data/PocketUpgradesProvider.java @@ -18,9 +18,10 @@ public PocketUpgradesProvider(DataGenerator output) { @Override protected void addUpgrades(@NotNull Consumer>> addUpgrade) { simpleWithCustomItem(CCRegistration.ID.CHATTY_POCKET, CCRegistration.CHAT_BOX_POCKET.get(), APBlocks.CHAT_BOX.get().asItem()).add(addUpgrade); - simpleWithCustomItem(CCRegistration.ID.PLAYER_POCKET, CCRegistration.PLAYER_DETECTOR_POCKET.get(), APBlocks.PLAYER_DETECTOR.get().asItem()).add(addUpgrade); + simpleWithCustomItem(CCRegistration.ID.COLONY_POCKET, CCRegistration.COLONY_POCKET.get(), APBlocks.COLONY_INTEGRATOR.get().asItem()).add(addUpgrade); + simpleWithCustomItem(CCRegistration.ID.DISTANCE_POCKET, CCRegistration.DISTANCE_DETECTOR_POCKET.get(), APBlocks.DISTANCE_DETECTOR.get().asItem()).add(addUpgrade); simpleWithCustomItem(CCRegistration.ID.ENVIRONMENT_POCKET, CCRegistration.ENVIRONMENT_POCKET.get(), APBlocks.ENVIRONMENT_DETECTOR.get().asItem()).add(addUpgrade); simpleWithCustomItem(CCRegistration.ID.GEOSCANNER_POCKET, CCRegistration.GEO_SCANNER_POCKET.get(), APBlocks.GEO_SCANNER.get().asItem()).add(addUpgrade); - simpleWithCustomItem(CCRegistration.ID.COLONY_POCKET, CCRegistration.COLONY_POCKET.get(), APBlocks.COLONY_INTEGRATOR.get().asItem()).add(addUpgrade); + simpleWithCustomItem(CCRegistration.ID.PLAYER_POCKET, CCRegistration.PLAYER_DETECTOR_POCKET.get(), APBlocks.PLAYER_DETECTOR.get().asItem()).add(addUpgrade); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java index cac85edaf..14b1e8c94 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java @@ -248,7 +248,7 @@ public SmartGlassesComputer getOrCreateComputer(ServerLevel level, Entity entity setComputerID(stack, computerID); } - computer = new SmartGlassesComputer(level, getComputerID(stack), getLabel(stack), getFamily()); + computer = new SmartGlassesComputer(level, getComputerID(stack), getLabel(stack), getFamily(), stack.getOrCreateTag().getCompound(SmartGlassesComputer.UPGRADE_DATAS_TAG).copy()); setInstanceID(stack, computer.register()); setSessionID(stack, registry.getSessionID()); diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java index 2e44565db..a72ff2f45 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/CCRegistration.java @@ -7,6 +7,7 @@ import de.srendi.advancedperipherals.common.addons.computercraft.integrations.IntegrationPeripheralProvider; import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketChatBoxUpgrade; import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketColonyIntegratorUpgrade; +import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketDistanceDetectorUpgrade; import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketEnvironmentUpgrade; import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketGeoScannerUpgrade; import de.srendi.advancedperipherals.common.addons.computercraft.pocket.PocketPlayerDetectorUpgrade; @@ -46,6 +47,7 @@ public class CCRegistration { public static final RegistryObject> CHAT_BOX_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.CHATTY_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketChatBoxUpgrade::new)); public static final RegistryObject> COLONY_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.COLONY_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketColonyIntegratorUpgrade::new)); + public static final RegistryObject> DISTANCE_DETECTOR_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.DISTANCE_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketDistanceDetectorUpgrade::new)); public static final RegistryObject> ENVIRONMENT_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.ENVIRONMENT_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketEnvironmentUpgrade::new)); public static final RegistryObject> GEO_SCANNER_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.GEOSCANNER_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketGeoScannerUpgrade::new)); public static final RegistryObject> PLAYER_DETECTOR_POCKET = APRegistration.POCKET_SERIALIZER.register(ID.PLAYER_POCKET.getPath(), () -> PocketUpgradeSerialiser.simpleWithCustomItem(PocketPlayerDetectorUpgrade::new)); @@ -76,6 +78,7 @@ public static class ID { public static final ResourceLocation CHATTY_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "chatty_pocket"); public static final ResourceLocation COLONY_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "colony_pocket"); + public static final ResourceLocation DISTANCE_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "distance_pocket"); public static final ResourceLocation ENVIRONMENT_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "environment_pocket"); public static final ResourceLocation GEOSCANNER_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "geoscanner_pocket"); public static final ResourceLocation PLAYER_POCKET = new ResourceLocation(AdvancedPeripherals.MOD_ID, "player_pocket"); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index eac317fec..600a21742 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -34,6 +34,8 @@ */ public class SmartGlassesComputer extends ServerComputer implements IPocketAccess { + public static final String UPGRADE_DATAS_TAG = "UpgradeDatas"; + @Nullable private Entity entity; private ItemStack stack = ItemStack.EMPTY; @@ -42,16 +44,19 @@ public class SmartGlassesComputer extends ServerComputer implements IPocketAcces private SmartGlassesItemHandler itemHandler = null; @NotNull private final ModulePeripheral modulePeripheral; + private final CompoundTag upgradeDatas; + private boolean peripheralOutdated = false; private boolean isDirty = true; private Map upgrades = Collections.emptyMap(); private final Map modules = new HashMap<>(); - public SmartGlassesComputer(ServerLevel world, int computerID, @Nullable String label, ComputerFamily family) { + public SmartGlassesComputer(ServerLevel world, int computerID, @Nullable String label, ComputerFamily family, @NotNull CompoundTag upgradeDatas) { super(world, computerID, label, family, 39, 13); this.addAPI(new SmartGlassesAPI()); this.modulePeripheral = new ModulePeripheral(this); + this.upgradeDatas = upgradeDatas; this.setPeripheral(ComputerSide.BACK, this.modulePeripheral); } @@ -97,6 +102,8 @@ public void setColour(int colour) { public void setStack(ItemStack stack) { this.stack = stack; + this.invalidatePeripheral(); + this.updateUpgradeNBTData(); } public ItemStack getStack() { @@ -116,30 +123,36 @@ public void setItemHandler(@Nullable SmartGlassesItemHandler itemHandler) { this.itemHandler = itemHandler; } - public void markDirty() { - isDirty = true; + @Override + @NotNull + public CompoundTag getUpgradeNBTData() { + return this.upgradeDatas; } - public boolean isDirty() { - return isDirty; + public void setUpgradeData(@NotNull ComputerSide side, @NotNull ResourceLocation id, @NotNull CompoundTag data) { + data.putString("UpgradeSide", side.getName()); + this.upgradeDatas.put(id.toString(), data); + this.updateUpgradeNBTData(); } - @Override - @NotNull - public CompoundTag getUpgradeNBTData() { - return new CompoundTag(); + public void removeUpgradeData(@NotNull ComputerSide side) { + for (String id : this.upgradeDatas.getAllKeys()) { + if (side.getName().equals(this.upgradeDatas.getCompound(id).getString("UpgradeSide"))) { + this.upgradeDatas.remove(id); + this.updateUpgradeNBTData(); + return; + } + } } @Override public void updateUpgradeNBTData() { - if (entity instanceof Player player) { - player.getInventory().setChanged(); - } + this.isDirty = true; } @Override public void invalidatePeripheral() { - updatePeripheralsAndModules(this.itemHandler); + this.peripheralOutdated = true; } @Override @@ -153,7 +166,7 @@ public void setPeripheral(ComputerSide side, IPeripheral peripheral) { super.setPeripheral(side, peripheral); } - public void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) { + private void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) { Set upgradesIdSet = new HashSet<>(); ImmutableMap.Builder upgradesBuilder = new ImmutableMap.Builder<>(); for (int slot = 0; slot < SmartGlassesItemHandler.PERIPHERAL_SLOTS; slot++) { @@ -162,9 +175,15 @@ public void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) { IPocketUpgrade upgrade = PocketUpgrades.instance().get(peripheralItem); IPeripheral peripheral = upgrade != null ? upgrade.createPeripheral(smartGlassesAccess) : null; setPeripheral(side, peripheral); - if (peripheral != null && upgradesIdSet.add(upgrade.getUpgradeID())) { - upgradesBuilder.put(upgrade.getUpgradeID(), peripheral); + if (peripheral != null) { + ResourceLocation id = upgrade.getUpgradeID(); + if (upgradesIdSet.add(id)) { + upgradesBuilder.put(id, peripheral); + setUpgradeData(side, id, this.upgradeDatas.getCompound(id.toString())); + continue; + } } + removeUpgradeData(side); } this.upgrades = upgradesBuilder.build(); for (int slot = SmartGlassesItemHandler.PERIPHERAL_SLOTS; slot < SmartGlassesItemHandler.SLOTS; slot++) { @@ -193,12 +212,21 @@ public void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) { public void tickServer() { super.tickServer(); - if (isDirty()) { - invalidatePeripheral(); - isDirty = false; + if (this.peripheralOutdated && this.itemHandler != null) { + this.peripheralOutdated = false; + this.updatePeripheralsAndModules(this.itemHandler); + } + + if (this.isDirty) { + this.isDirty = false; + CompoundTag data = this.stack.getOrCreateTag(); + data.put(UPGRADE_DATAS_TAG, this.upgradeDatas.copy()); + if (entity instanceof Player player) { + player.getInventory().setChanged(); + } } - modules.values().forEach(module -> { + this.modules.values().forEach(module -> { module.tick(smartGlassesAccess); }); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java index bd4a10a10..d3b27fad6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesItemHandler.java @@ -157,7 +157,7 @@ public void setStackInSlot(int slot, @NotNull ItemStack stack) { public void setChanged() { if (this.computer != null) { - this.computer.markDirty(); + this.computer.invalidatePeripheral(); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/DataStorageUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/DataStorageUtil.java index 0499427cc..52585dbb4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/DataStorageUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/DataStorageUtil.java @@ -1,14 +1,17 @@ package de.srendi.advancedperipherals.common.util; import dan200.computercraft.api.pocket.IPocketAccess; +import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralTileEntity; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import org.jetbrains.annotations.NotNull; public class DataStorageUtil { + private DataStorageUtil() {} public static CompoundTag getDataStorage(@NotNull ITurtleAccess access, @NotNull TurtleSide side) { return access.getUpgradeNBTData(side); @@ -18,8 +21,17 @@ public static CompoundTag getDataStorage(@NotNull IPeripheralTileEntity tileEnti return tileEntity.getPeripheralSettings(); } - public static CompoundTag getDataStorage(@NotNull IPocketAccess pocket) { - return pocket.getUpgradeNBTData(); + public static CompoundTag getDataStorage(@NotNull IPocketAccess pocket, @NotNull IPocketUpgrade upgrade) { + String id = upgrade.getUpgradeID().toString(); + CompoundTag datas = pocket.getUpgradeNBTData(); + Tag tag = datas.get(id); + if (tag instanceof CompoundTag data) { + return data; + } + CompoundTag data = new CompoundTag(); + datas.put(id, data); + pocket.updateUpgradeNBTData(); + return data; } /** diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java b/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java index 114a6e9ed..bb6e37ebd 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/NBTUtil.java @@ -23,6 +23,7 @@ import java.util.Map; public class NBTUtil { + private NBTUtil() {} public static Tag toDirectNBT(Object object) { // Mostly dan200.computercraft.shared.util toNBTTag method diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/DisabledPeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/DisabledPeripheral.java index 8fd524d0c..c97099586 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/DisabledPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/DisabledPeripheral.java @@ -1,17 +1,18 @@ package de.srendi.advancedperipherals.lib.peripherals; import dan200.computercraft.api.pocket.IPocketAccess; +import dan200.computercraft.api.pocket.IPocketUpgrade; import de.srendi.advancedperipherals.common.addons.computercraft.owner.PocketPeripheralOwner; public class DisabledPeripheral extends BasePeripheral { - public static final DisabledPeripheral INSTANCE = new DisabledPeripheral("disabledPeripheral", null); + public static final DisabledPeripheral INSTANCE = new DisabledPeripheral("disabledPeripheral", null, null); - private DisabledPeripheral(String type, IPocketAccess access) { - super(type, new PocketPeripheralOwner(access)); + private DisabledPeripheral(String type, IPocketAccess access, IPocketUpgrade upgrade) { + super(type, new PocketPeripheralOwner(access, upgrade)); } @Override public boolean isEnabled() { - return true; + return false; } } From 7e4b0410c902e1ee1eabcc60b1e84f5ec4893674 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 25 Jan 2025 20:21:52 -0700 Subject: [PATCH 173/188] fix smartglass direction --- .../owner/PocketPeripheralOwner.java | 31 +++++++++++-------- .../DistanceDetectorPeripheral.java | 6 +++- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java index b9bc35ce5..21dc65ae6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/PocketPeripheralOwner.java @@ -42,41 +42,46 @@ public String getCustomName() { @Override public Level getLevel() { Entity owner = pocket.getEntity(); - if (owner == null) return null; - return owner.getCommandSenderWorld(); + return owner == null ? null : owner.getCommandSenderWorld(); } @NotNull @Override public BlockPos getPos() { Entity owner = pocket.getEntity(); - if (owner == null) return new BlockPos(0, 0, 0); - return owner.blockPosition(); + return owner == null ? BlockPos.ZERO : new BlockPos(owner.getEyePosition()); } @NotNull @Override public Vec3 getCenterPos() { Entity owner = pocket.getEntity(); - if (owner == null) return new Vec3(0, 0, 0); - return owner.position(); + return owner == null ? Vec3.ZERO : owner.getEyePosition(); } @NotNull @Override public Direction getFacing() { - Entity owner = pocket.getEntity(); - if (owner == null) return Direction.NORTH; - return owner.getDirection(); + Vec3 dir = getDirection(); + return Direction.getNearest(dir.x, dir.y, dir.z); } - /** - * Not used for pockets - */ @NotNull @Override public FrontAndTop getOrientation() { - return FrontAndTop.NORTH_UP; + Entity owner = pocket.getEntity(); + if (owner == null) { + return FrontAndTop.NORTH_UP; + } + Vec3 up = owner.getUpVector(1.0f); + return FrontAndTop.fromFrontAndTop(getFacing(), Direction.getNearest(up.x, up.y, up.z)); + } + + @NotNull + @Override + public Vec3 getDirection() { + Entity owner = pocket.getEntity(); + return owner == null ? /* North */ new Vec3(0, 0, -1) : owner.getLookAngle(); } @Nullable diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 7babcdf91..b3c01366d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -257,7 +257,11 @@ protected double calculateDistanceImpl() { if (result.getType() == HitResult.Type.MISS) { return -1; } - return result.getLocation().distanceTo(center) - 0.5f; + double distance = result.getLocation().distanceTo(center); + if (this.tileEntity != null) { + distance -= 0.5; + } + return distance; } /** From 17d99c31724ef4a63fc940eb8a6e84e4fc800546 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 25 Jan 2025 21:26:23 -0700 Subject: [PATCH 174/188] abstract peripheral ticker --- .../peripheral/ChatBoxPeripheral.java | 1 + .../DistanceDetectorPeripheral.java | 23 +++++++++++++++---- .../peripheral/PlayerDetectorPeripheral.java | 11 +++++++++ .../turtles/TurtleChatBoxUpgrade.java | 11 --------- .../blocks/base/BaseDetectorEntity.java | 3 ++- .../blocks/base/PeripheralBlockEntity.java | 6 +++++ .../blocks/blockentities/ChatBoxEntity.java | 8 ------- .../blockentities/DistanceDetectorEntity.java | 19 --------------- .../blocks/blockentities/MeBridgeEntity.java | 3 ++- .../blockentities/PlayerDetectorEntity.java | 16 ------------- .../smartglasses/SmartGlassesAccess.java | 2 -- .../lib/peripherals/IBasePeripheral.java | 2 ++ .../peripherals/IPeripheralTileEntity.java | 5 +--- .../lib/pocket/BasePocketUpgrade.java | 8 +++++++ .../lib/turtle/PeripheralTurtleUpgrade.java | 8 +++++++ 15 files changed, 60 insertions(+), 66 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java index 7616d1e27..920f64f13 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java @@ -485,6 +485,7 @@ public final MethodResult sendToastToPlayer(@NotNull IArguments arguments) throw }); } + @Override public void update() { lastConsumedMessage = Events.traverseChatMessages(lastConsumedMessage, message -> { for (IComputerAccess computer : getConnectedComputers()) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index b3c01366d..6a59adba7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -71,6 +71,10 @@ public float getConfiguredMaxRange() { return APConfig.PERIPHERALS_CONFIG.distanceDetectorRange.get().floatValue(); } + public int getUpdateRate() { + return APConfig.PERIPHERALS_CONFIG.distanceDetectorUpdateRate.get(); + } + public float getMaxRange() { return Float.intBitsToFloat(this.maxRange.get()); } @@ -168,7 +172,7 @@ public final boolean getLaserVisibility() { return this.getShowLaser(); } - @LuaFunction(value = {"setIgnoreTransparency"}) + @LuaFunction(value = "setIgnoreTransparency") public final void setIgnoreTransparencyLua(boolean enable) { this.setIgnoreTransparent(enable); } @@ -231,17 +235,17 @@ public final boolean shouldCalculatePeriodically() { return this.getCalculatePeriodically(); } - @LuaFunction(value = {"setCalculatePeriodically"}) + @LuaFunction(value = "setCalculatePeriodically") public final void setCalculatePeriodicallyLua(boolean shouldCalculatePeriodically) { this.setCalculatePeriodically(shouldCalculatePeriodically); } - @LuaFunction(value = {"setMaxRange"}) + @LuaFunction(value = "setMaxRange") public final void setMaxRangeLua(double maxDistance) { this.setMaxRange((float) maxDistance); } - @LuaFunction(value = {"getMaxRange"}) + @LuaFunction(value = "getMaxRange") public final double getMaxRangeLua() { return this.getMaxRange(); } @@ -273,6 +277,17 @@ public double calculateAndUpdateDistance() { return distance; } + @Override + public void update() { + if (this.getCalculatePeriodically() && this.getLevel().getGameTime() % this.getUpdateRate() == 0) { + // We calculate the distance every 2 ticks, so we do not have to run the getDistance function of the peripheral + // on the main thread which prevents the 1 tick yield time of the function. + // The calculateDistance function is not thread safe, so we have to run it on the main thread. + // It should be okay to run that function every 2 ticks, calculating it does not take too much time. + this.calculateAndUpdateDistance(); + } + } + protected HitResult getHitResult(Vec3 from, Vec3 to) { Level level = this.getLevel(); ClipContext.ShapeGetter shapeGetter = this.ignoreTransparent ? HitResultUtil.IgnoreNoOccludedContext.INSTANCE : ClipContext.Block.COLLIDER; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java index fc3e5c058..b5f418993 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java @@ -14,6 +14,7 @@ import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; +import de.srendi.advancedperipherals.common.events.Events; import de.srendi.advancedperipherals.common.util.CoordUtil; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; @@ -33,6 +34,7 @@ public class PlayerDetectorPeripheral extends BasePeripheral { public static final String PERIPHERAL_TYPE = "player_detector"; private static final int MAX_RANGE = APConfig.PERIPHERALS_CONFIG.playerDetMaxRange.get(); + private long lastConsumedMessage = Events.getLastPlayerMessageID() - 1; public PlayerDetectorPeripheral(PeripheralBlockEntity tileEntity) { super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); @@ -265,4 +267,13 @@ private List getPlayers() { private ServerPlayer getPlayer(String name) { return ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayerByName(name); } + + @Override + public void update() { + lastConsumedMessage = Events.traversePlayerMessages(lastConsumedMessage, message -> getConnectedComputers().forEach(computer -> { + if(message.eventName().equals("playerChangedDimension")) { + computer.queueEvent(message.eventName(), message.playerName(), message.fromDimension(), message.toDimension()); + } else computer.queueEvent(message.eventName(), message.playerName(), message.fromDimension()); + })); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleChatBoxUpgrade.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleChatBoxUpgrade.java index b82aafab2..f8d9f7e4d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleChatBoxUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/turtles/TurtleChatBoxUpgrade.java @@ -29,15 +29,4 @@ public ModelResourceLocation getRightModel() { protected ChatBoxPeripheral buildPeripheral(@NotNull ITurtleAccess turtle, @NotNull TurtleSide side) { return new ChatBoxPeripheral(turtle, side); } - - @Override - public void update(@NotNull ITurtleAccess turtle, @NotNull TurtleSide side) { - super.update(turtle, side); - if (turtle.getLevel().isClientSide) - return; - - if (turtle.getPeripheral(side) instanceof ChatBoxPeripheral chatBox) { - chatBox.update(); - } - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java index f0a92f033..0912220ab 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/BaseDetectorEntity.java @@ -136,7 +136,8 @@ public void load(@NotNull CompoundTag nbt) { @Override public void handleTick(Level level, BlockState state, BlockEntityType type) { - if (!level.isClientSide) { + super.handleTick(level, state, type); + if (!level.isClientSide()) { this.transferRate = this.proxy.getAndResetTransfered(); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java index e9507f900..e62d578c7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/base/PeripheralBlockEntity.java @@ -22,6 +22,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.capabilities.Capability; @@ -243,4 +244,9 @@ public ComputerSide getComputerSide(Direction direction) { FrontAndTop orientation = getBlockState().getValue(BaseBlock.ORIENTATION); return CoordUtil.getComputerSide(orientation, direction); } + + @Override + public void handleTick(Level level, BlockState state, BlockEntityType type) { + this.getLazyPeripheral().ifPresent(BasePeripheral::update); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java index 789b0704f..24e57b8d6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/ChatBoxEntity.java @@ -4,9 +4,6 @@ import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; @@ -21,9 +18,4 @@ public ChatBoxEntity(BlockPos pos, BlockState state) { protected ChatBoxPeripheral createPeripheral() { return new ChatBoxPeripheral(this); } - - @Override - public void handleTick(Level level, BlockState state, BlockEntityType type) { - this.getLazyPeripheral().ifPresent(ChatBoxPeripheral::update); - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java index 828a61b4c..9af645790 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/DistanceDetectorEntity.java @@ -9,9 +9,6 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -84,22 +81,6 @@ public void setDetectionType(DistanceDetectorPeripheral.DetectionType detectionT this.detectionType = detectionType; } - @Override - public void handleTick(Level level, BlockState state, BlockEntityType type) { - DistanceDetectorPeripheral peripheral = this.getPeripheral(); - if (peripheral == null) { - return; - } - - if (level.getGameTime() % APConfig.PERIPHERALS_CONFIG.distanceDetectorUpdateRate.get() == 0 && this.getCalculatePeriodically()) { - // We calculate the distance every 2 ticks, so we do not have to run the getDistance function of the peripheral - // on the main thread which prevents the 1 tick yield time of the function. - // The calculateDistance function is not thread safe, so we have to run it on the main thread. - // It should be okay to run that function every 2 ticks, calculating it does not take too much time. - peripheral.calculateAndUpdateDistance(); - } - } - @Override public AABB getRenderBoundingBox() { float currentDistance = this.getCurrentDistance(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java index d7d857cb1..16a66d976 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java @@ -54,7 +54,8 @@ protected MeBridgePeripheral createPeripheral() { @Override public void handleTick(Level level, BlockState state, BlockEntityType type) { - if (!this.level.isClientSide) { + super.handleTick(level, state, type); + if (!this.level.isClientSide()) { if (!initialized) { MeBridgePeripheral peripheral = this.getPeripheral(); if (peripheral == null) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/PlayerDetectorEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/PlayerDetectorEntity.java index 08a0ac6ef..789d6c36b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/PlayerDetectorEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/PlayerDetectorEntity.java @@ -2,21 +2,14 @@ import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.PlayerDetectorPeripheral; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; -import de.srendi.advancedperipherals.common.events.Events; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; public class PlayerDetectorEntity extends PeripheralBlockEntity { - private Long lastConsumedMessage; - public PlayerDetectorEntity(BlockPos pos, BlockState state) { super(APBlockEntityTypes.PLAYER_DETECTOR.get(), pos, state); - lastConsumedMessage = Events.getLastPlayerMessageID() - 1; } @NotNull @@ -24,13 +17,4 @@ public PlayerDetectorEntity(BlockPos pos, BlockState state) { protected PlayerDetectorPeripheral createPeripheral() { return new PlayerDetectorPeripheral(this); } - - @Override - public void handleTick(Level level, BlockState state, BlockEntityType type) { - lastConsumedMessage = Events.traversePlayerMessages(lastConsumedMessage, message -> getConnectedComputers().forEach(computer -> { - if(message.eventName().equals("playerChangedDimension")) { - computer.queueEvent(message.eventName(), message.playerName(), message.fromDimension(), message.toDimension()); - } else computer.queueEvent(message.eventName(), message.playerName(), message.fromDimension()); - })); - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java index 316c7a715..b43017d0c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java @@ -48,12 +48,10 @@ public CompoundTag getUpgradeNBTData() { @Override public void updateUpgradeNBTData() { - } @Override public void invalidatePeripheral() { - } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IBasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IBasePeripheral.java index d1736f7e6..2bdd8fadc 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IBasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IBasePeripheral.java @@ -16,4 +16,6 @@ default void queueEvent(String event, Object... args) { } T getPeripheralOwner(); + + default void update() {} } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IPeripheralTileEntity.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IPeripheralTileEntity.java index 47c526faa..cc3caa796 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IPeripheralTileEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/IPeripheralTileEntity.java @@ -11,8 +11,5 @@ public interface IPeripheralTileEntity { void markSettingsChanged(); - default void handleTick(Level level, BlockState state, BlockEntityType type) { - - } - + default void handleTick(Level level, BlockState state, BlockEntityType type) {} } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/pocket/BasePocketUpgrade.java b/src/main/java/de/srendi/advancedperipherals/lib/pocket/BasePocketUpgrade.java index 291a333de..ea6e01fdd 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/pocket/BasePocketUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/pocket/BasePocketUpgrade.java @@ -28,4 +28,12 @@ public IPeripheral createPeripheral(@NotNull IPocketAccess access) { if (!peripheral.isEnabled()) return DisabledPeripheral.INSTANCE; return peripheral; } + + @Override + public void update(@NotNull IPocketAccess access, @Nullable IPeripheral peripheral) { + super.update(access, peripheral); + if (peripheral instanceof IBasePeripheral basePeripheral) { + basePeripheral.update(); + } + } } diff --git a/src/main/java/de/srendi/advancedperipherals/lib/turtle/PeripheralTurtleUpgrade.java b/src/main/java/de/srendi/advancedperipherals/lib/turtle/PeripheralTurtleUpgrade.java index 2f06c5944..9171dc811 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/turtle/PeripheralTurtleUpgrade.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/turtle/PeripheralTurtleUpgrade.java @@ -47,4 +47,12 @@ public boolean isItemSuitable(@NotNull ItemStack stack) { } return super.isItemSuitable(stack); } + + @Override + public void update(@NotNull ITurtleAccess turtle, @NotNull TurtleSide side) { + super.update(turtle, side); + if (!turtle.getLevel().isClientSide() && turtle.getPeripheral(side) instanceof IBasePeripheral basePeripheral) { + basePeripheral.update(); + } + } } From 34d978905e05d749e5b47c33048d7e0d70ba8666 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 25 Jan 2025 22:08:10 -0700 Subject: [PATCH 175/188] fix data storage for smartglass and save distance detector data in smartglass --- .../DistanceDetectorPeripheral.java | 32 ++++++++++++------- .../common/items/SmartGlassesItem.java | 2 +- .../smartglasses/SmartGlassesAccess.java | 4 ++- .../smartglasses/SmartGlassesComputer.java | 8 ++--- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java index 6a59adba7..8b595fdf8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/DistanceDetectorPeripheral.java @@ -26,6 +26,7 @@ public class DistanceDetectorPeripheral extends BasePeripheral public static final String PERIPHERAL_TYPE = "distance_detector"; + private final AtomicBoolean isDirty = new AtomicBoolean(false); private final DistanceDetectorEntity tileEntity; private final AtomicInteger maxRange; private volatile float currentDistance; @@ -37,6 +38,7 @@ public class DistanceDetectorPeripheral extends BasePeripheral public DistanceDetectorPeripheral(DistanceDetectorEntity tileEntity) { super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); this.tileEntity = tileEntity; + // TODO: let distance detector block also use data storage this.maxRange = new AtomicInteger(Float.floatToRawIntBits(this.tileEntity.getMaxRange())); this.currentDistance = this.tileEntity.getCurrentDistance(); this.showLaser = new AtomicBoolean(this.tileEntity.getShowLaser()); @@ -45,7 +47,6 @@ public DistanceDetectorPeripheral(DistanceDetectorEntity tileEntity) { this.detectionType = new AtomicReference<>(this.tileEntity.getDetectionType()); } - // TODO: thread safely save data protected DistanceDetectorPeripheral(IPeripheralOwner owner) { super(PERIPHERAL_TYPE, owner); this.tileEntity = null; @@ -89,7 +90,7 @@ public void setMaxRange(float maxRange) { this.tileEntity.setMaxRange(maxRange); this.tileEntity.sendUpdate(); } - this.owner.markDataStorageDirty(); + this.isDirty.set(true); } public float getCurrentDistance() { @@ -97,16 +98,12 @@ public float getCurrentDistance() { } public void setCurrentDistance(float currentDistance) { - // Since setCurrentDistance should only invokes from main thread, volatile field should be safe here. - if (this.currentDistance == currentDistance) { - return; - } this.currentDistance = currentDistance; if (this.tileEntity != null) { this.tileEntity.setCurrentDistance(currentDistance); this.tileEntity.sendUpdate(); } - this.owner.markDataStorageDirty(); + this.isDirty.set(true); } public boolean getCalculatePeriodically() { @@ -118,7 +115,7 @@ public void setCalculatePeriodically(boolean calculatePeriodically) { if (this.tileEntity != null) { this.tileEntity.setCalculatePeriodically(calculatePeriodically); } - this.owner.markDataStorageDirty(); + this.isDirty.set(true); } public boolean getShowLaser() { @@ -133,7 +130,7 @@ public void setShowLaser(boolean showLaser) { this.tileEntity.setShowLaser(showLaser); this.tileEntity.sendUpdate(); } - this.owner.markDataStorageDirty(); + this.isDirty.set(true); } public boolean getIgnoreTransparent() { @@ -145,7 +142,7 @@ public void setIgnoreTransparent(boolean ignoreTransparent) { if (this.tileEntity != null) { this.tileEntity.setIgnoreTransparent(ignoreTransparent); } - this.owner.markDataStorageDirty(); + this.isDirty.set(true); } public DetectionType getDetectionType() { @@ -159,7 +156,7 @@ public void setDetectionType(DetectionType detectionType) { if (this.tileEntity != null) { this.tileEntity.setDetectionType(detectionType); } - this.owner.markDataStorageDirty(); + this.isDirty.set(true); } @LuaFunction @@ -286,6 +283,19 @@ public void update() { // It should be okay to run that function every 2 ticks, calculating it does not take too much time. this.calculateAndUpdateDistance(); } + + if (this.isDirty.getAndSet(false)) { + if (this.tileEntity == null) { + CompoundTag data = this.owner.getDataStorage(); + data.putFloat("maxRange", this.getMaxRange()); + data.putFloat("currentDistance", this.getCurrentDistance()); + data.putBoolean("showLaser", this.getShowLaser()); + data.putBoolean("calculatePeriodically", this.getCalculatePeriodically()); + data.putBoolean("ignoreTransparent", this.getIgnoreTransparent()); + data.putByte("detectionType", (byte) this.getDetectionType().ordinal()); + } + this.owner.markDataStorageDirty(); + } } protected HitResult getHitResult(Vec3 from, Vec3 to) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java index 14b1e8c94..cb5c1a112 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java +++ b/src/main/java/de/srendi/advancedperipherals/common/items/SmartGlassesItem.java @@ -248,7 +248,7 @@ public SmartGlassesComputer getOrCreateComputer(ServerLevel level, Entity entity setComputerID(stack, computerID); } - computer = new SmartGlassesComputer(level, getComputerID(stack), getLabel(stack), getFamily(), stack.getOrCreateTag().getCompound(SmartGlassesComputer.UPGRADE_DATAS_TAG).copy()); + computer = new SmartGlassesComputer(level, getComputerID(stack), getLabel(stack), getFamily(), stack.getOrCreateTag().getCompound(SmartGlassesComputer.UPGRADE_DATAS_TAG)); setInstanceID(stack, computer.register()); setSessionID(stack, registry.getSessionID()); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java index b43017d0c..50420c042 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesAccess.java @@ -43,15 +43,17 @@ public void setLight(int colour) { @Override public CompoundTag getUpgradeNBTData() { - return new CompoundTag(); + return computer.getUpgradeNBTData(); } @Override public void updateUpgradeNBTData() { + computer.updateUpgradeNBTData(); } @Override public void invalidatePeripheral() { + computer.invalidatePeripheral(); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index 600a21742..2880f55f4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -212,18 +212,18 @@ private void updatePeripheralsAndModules(SmartGlassesItemHandler itemHandler) { public void tickServer() { super.tickServer(); + boolean shouldUpdateInventory = this.peripheralOutdated || this.isDirty; if (this.peripheralOutdated && this.itemHandler != null) { this.peripheralOutdated = false; this.updatePeripheralsAndModules(this.itemHandler); } - if (this.isDirty) { this.isDirty = false; CompoundTag data = this.stack.getOrCreateTag(); data.put(UPGRADE_DATAS_TAG, this.upgradeDatas.copy()); - if (entity instanceof Player player) { - player.getInventory().setChanged(); - } + } + if (shouldUpdateInventory && entity instanceof Player player) { + player.getInventory().setChanged(); } this.modules.values().forEach(module -> { From 8d1b6f711f62898b84a1dbad93d09b6a51ca8be5 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sun, 26 Jan 2025 16:12:40 -0700 Subject: [PATCH 176/188] fix ClassNotFoundException when VS is not installed --- .../advancedperipherals/common/addons/APAddons.java | 10 +--------- .../addons/computercraft/owner/IPeripheralOwner.java | 3 ++- .../peripheral/plugins/AutomataLookPlugin.java | 3 ++- .../addons/valkyrienskies/AutomataVSMountPlugin.java | 3 ++- .../common/addons/valkyrienskies/ValkyrienSkies.java | 3 +-- .../util/fakeplayer/FakePlayerProviderTurtle.java | 3 ++- .../lib/peripherals/BasePeripheral.java | 5 +++-- 7 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java index b48fbbfb9..a1241b4d6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java @@ -12,7 +12,6 @@ import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; -import org.valkyrienskies.core.api.ships.Ship; import org.valkyrienskies.mod.common.VSGameUtilsKt; import top.theillusivec4.curios.api.CuriosApi; import top.theillusivec4.curios.api.SlotResult; @@ -93,16 +92,9 @@ public static ItemStack getCurioGlasses(Player player) { } public static boolean isBlockOnShip(Level level, BlockPos pos) { - if (level == null || !vs2Loaded) { + if (!vs2Loaded) { return false; } return VSGameUtilsKt.isBlockInShipyard(level, pos); } - - public static Ship getVS2Ship(Level level, BlockPos pos) { - if (level == null || !vs2Loaded) { - return null; - } - return VSGameUtilsKt.getShipObjectManagingPos(level, pos); - } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java index c5a4a8975..4ed959fd8 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java @@ -16,6 +16,7 @@ import net.minecraft.world.phys.Vec3; import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.Collection; import java.util.HashSet; @@ -46,7 +47,7 @@ default Vec3 getDirection() { if (!APAddons.vs2Loaded) { return dir; } - Ship ship = APAddons.getVS2Ship(getLevel(), getPos()); + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(getLevel(), getPos()); if (ship == null) { return dir; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java index 1a7a0201a..855271248 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java @@ -20,6 +20,7 @@ import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.Collections; import java.util.HashMap; @@ -57,7 +58,7 @@ public final MethodResult lookAtBlock(@NotNull IArguments arguments) throws LuaE data.put("y", pos.y - origin.y); data.put("z", pos.z - origin.z); if (APAddons.vs2Loaded) { - Ship ship = APAddons.getVS2Ship(automataCore.getLevel(), blockPos); + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(automataCore.getLevel(), blockPos); if (ship != null) { data.put("shipId", ship.getId()); data.put("shipName", ship.getSlug()); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java index 758b46a85..543b673cc 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/AutomataVSMountPlugin.java @@ -16,6 +16,7 @@ import net.minecraft.world.phys.Vec3; import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.ServerShip; +import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.List; import java.util.Map; @@ -38,7 +39,7 @@ public final boolean isOnShip() { @LuaFunction(mainThread = true) public final MethodResult getCurrentShip() { IPeripheralOwner owner = this.automataCore.getPeripheralOwner(); - ServerShip ship = (ServerShip) APAddons.getVS2Ship(owner.getLevel(), owner.getPos()); + ServerShip ship = (ServerShip) VSGameUtilsKt.getShipObjectManagingPos(owner.getLevel(), owner.getPos()); if (ship == null) { return MethodResult.of(); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java index 61d084da1..2a18aeca9 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java @@ -1,6 +1,5 @@ package de.srendi.advancedperipherals.common.addons.valkyrienskies; -import de.srendi.advancedperipherals.common.addons.APAddons; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.phys.Vec3; @@ -16,7 +15,7 @@ public final class ValkyrienSkies { private ValkyrienSkies() {} public static List getNearbyShips(ServerLevel level, Vec3 pos, double radius) { - Ship ship = APAddons.getVS2Ship(level, new BlockPos(pos)); + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, new BlockPos(pos)); if (ship != null) { Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); pos = new Vec3(newPos.x, newPos.y, newPos.z); diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java index 159fcda5c..2fd019fc6 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java @@ -18,6 +18,7 @@ import org.joml.Matrix4dc; import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.WeakHashMap; @@ -45,7 +46,7 @@ public static void load(APFakePlayer player, ITurtleAccess turtle) { Vec3 direction = Vec3.atLowerCornerOf(turtle.getDirection().getNormal()); Vec3 position = Vec3.atCenterOf(pos); if (APAddons.vs2Loaded) { - Ship ship = APAddons.getVS2Ship(level, pos); + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, pos); if (ship != null) { Matrix4dc matrix = ship.getShipToWorld(); Vector3d newPos = matrix.transformPosition(new Vector3d(position.x, position.y, position.z)); diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index 72706f173..f7261df7b 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.ArrayList; import java.util.Collections; @@ -153,7 +154,7 @@ public Level getLevel() { } public boolean isOnShip() { - return APAddons.vs2Loaded && APAddons.isBlockOnShip(owner.getLevel(), owner.getPos()); + return APAddons.isBlockOnShip(owner.getLevel(), owner.getPos()); } public Vec3 getPhysicsPos() { @@ -161,7 +162,7 @@ public Vec3 getPhysicsPos() { if (!APAddons.vs2Loaded) { return pos; } - Ship ship = APAddons.getVS2Ship(owner.getLevel(), owner.getPos()); + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(owner.getLevel(), owner.getPos()); if (ship == null) { return pos; } From 303af091a03c2ed369fdfbfc7599a9f748eae162 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 8 Mar 2025 17:09:41 -0700 Subject: [PATCH 177/188] move valkyrienskies stuff to a middle integration class to prevent early stage class loading resolve #715 --- build.gradle | 35 +++++++--------- gradle.properties | 42 ++++++++++--------- .../common/addons/APAddons.java | 4 +- .../computercraft/owner/IPeripheralOwner.java | 11 +---- .../EnvironmentDetectorPeripheral.java | 4 +- .../plugins/AutomataLookPlugin.java | 12 ++---- .../addons/valkyrienskies/ValkyrienSkies.java | 33 +++++++++++++++ .../fakeplayer/FakePlayerProviderTurtle.java | 15 ++----- .../lib/peripherals/BasePeripheral.java | 15 ++----- 9 files changed, 89 insertions(+), 82 deletions(-) diff --git a/build.gradle b/build.gradle index 647b8a371..63cae26c5 100644 --- a/build.gradle +++ b/build.gradle @@ -201,12 +201,12 @@ repositories { } } maven { - name = "Modmaven Jei" + name = "Modmaven" url = 'https://modmaven.dev/' content { - includeGroup("mezz.jei") includeGroup("appeng") includeGroup("mekanism") + includeGroup("mezz.jei") } } maven { @@ -314,7 +314,7 @@ dependencies { // Botania compileOnly fg.deobf("vazkii.botania:Botania:${botania_version}") - runtimeOnly fg.deobf("vazkii.botania:Botania:${botania_version}") + // runtimeOnly fg.deobf("vazkii.botania:Botania:${botania_version}") // Minecolonies // Change to compileOnly when running `runData` @@ -339,7 +339,7 @@ dependencies { // Create compileOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") - runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") + // runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") // DimStorage compileOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}") @@ -376,23 +376,18 @@ dependencies { // runtimeOnly fg.deobf("curse.maven:createaddition-439890:5099757") // Valkyrien Skies 2 - implementation("org.joml:joml:1.10.4") { - transitive = false - } - implementation("org.joml:joml-primitives:1.10.0") { - transitive = false - } - // implementation fg.deobf("org.valkyrienskies:valkyrienskies-119-common:${vs2_version}") - implementation fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") { - transitive = false - } + compileOnly("org.joml:joml:1.10.4") + compileOnly("org.joml:joml-primitives:1.10.0") + // compileOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-common:${vs2_version}") + compileOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") compileOnly "org.valkyrienskies.core:api:${vs_core_version}" compileOnly "org.valkyrienskies.core:api-game:${vs_core_version}" compileOnly "org.valkyrienskies.core:util:${vs_core_version}" compileOnly "org.valkyrienskies.core:impl:${vs_core_version}" - runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") - runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") - runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") + // runtimeOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") + // runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") + // runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") + // runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") } @@ -427,12 +422,12 @@ task setupServer(type: Copy) { } ["Client", "Server"].forEach { name -> - tasks.register("test$name", JavaExec.class).configure { + tasks.register("test${name}", JavaExec.class).configure { it.group('In-game tests') it.description("Runs tests on a temporary Minecraft instance.") - it.dependsOn(setupServer, "prepareRunTest$name", "cleanTest$name", 'compileTestModJava') + it.dependsOn(setupServer, "prepareRunTest${name}", "cleanTest${name}", 'compileTestModJava') - JavaExec exec = tasks.getByName("runTest$name") + JavaExec exec = tasks.getByName("runTest${name}") exec.copyTo(it) it.setClasspath(exec.getClasspath()) it.mainClass = exec.mainClass diff --git a/gradle.properties b/gradle.properties index f4735631c..93e3534e5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -org.gradle.jvmargs=-Xmx4G org.gradle.daemon=false +org.gradle.jvmargs=-Xmx4G org.gradle.logging.level=info # Minecraft related @@ -10,53 +10,57 @@ mod_id=advancedperipherals mod_version=0.8r minecraft_version=1.19.2 mod_artifact_suffix= + forge_version=43.4.0 loader_version=43 + release_type=release + mappings_channel=parchment mappings_version=2022.11.20-1.19.2 -jb_annotations=21.0.1 # Test dependencies -junit_version=5.7.2 hamcrest_version=2.2 +jb_annotations=21.0.1 +junit_version=5.7.2 kotlin_version=1.8.0 kotlinx_coroutines_version=1.7.3 ttoolkit_version=0.1.3 # Mod dependencies cc_version=1.101.3 -curios_version=1.19.2-5.1.4.1 -minecolonies_version=1.19.2-1.1.473-BETA -appliedenergistics_version=12.9.9 -patchouli_version=1.19.2-77 -refinedstorage_version=1.11.7 + +ae2additions_version=4646599 +ae2things_version=4367610 +appliedenergistics_version=12.9.12 +appliedmekanistics_version=4734608 botania_version=1.19.2-440-FORGE +clockwork_version=5171528 create_version=0.5.1.f-46 createca_version=5099757 +curios_version=1.19.2-5.1.4.1 +dimstorage_version=3927875 +eureka_ships_version=5321628 +kotlinforforge_version=3.12.0 mekanism_version=1.19.2-10.3.9.13 -ae2things_version=4367610 +minecolonies_version=1.19.2-1.1.473-BETA +patchouli_version=1.19.2-77 powah_version=4183078 -ae2additions_version=4646599 -kotlinforforge_version=3.12.0 -appliedmekanistics_version=4734608 -dimstorage_version=3927875 +refinedstorage_version=1.11.7 valkyrien_skies_version=4994898 -eureka_ships_version=5321628 -clockwork_version=5171528 vs2_version=2.1.2-beta.1+a04911c932 vs_core_version=1.1.0+2a62e6a823 # Mod dependencies which are needed for other mods # For minecolonies -structurize_version=1.19.2-1.0.649-BETA -multipiston_version=1.19.2-1.2.21-ALPHA blockui_version=1.19.2-0.0.102-ALPHA domumornamentum_version=1.19-1.0.141-BETA +multipiston_version=1.19.2-1.2.21-ALPHA +structurize_version=1.19.2-1.0.649-BETA # For DimStorage edivadlib_version=3927847 -# Mod dependencies for testing stuff(Only used in the dev environment) +# Mod dependencies for testing stuff (Only used in the dev environment) +jade_version=4914105 jei_version=1.19.2-forge:11.6.0.1016 -jade_version=4914105 \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java index a1241b4d6..9e209e822 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java @@ -2,6 +2,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorage; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; @@ -12,7 +13,6 @@ import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import top.theillusivec4.curios.api.CuriosApi; import top.theillusivec4.curios.api.SlotResult; import top.theillusivec4.curios.api.SlotTypeMessage; @@ -95,6 +95,6 @@ public static boolean isBlockOnShip(Level level, BlockPos pos) { if (!vs2Loaded) { return false; } - return VSGameUtilsKt.isBlockInShipyard(level, pos); + return ValkyrienSkies.isBlockOnShip(level, pos); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java index 4ed959fd8..fc737aa5a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/IPeripheralOwner.java @@ -2,6 +2,7 @@ import dan200.computercraft.api.peripheral.IPeripheral; import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralOperation; import net.minecraft.core.BlockPos; @@ -14,9 +15,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import org.joml.Vector3d; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.Collection; import java.util.HashSet; @@ -47,12 +45,7 @@ default Vec3 getDirection() { if (!APAddons.vs2Loaded) { return dir; } - Ship ship = VSGameUtilsKt.getShipObjectManagingPos(getLevel(), getPos()); - if (ship == null) { - return dir; - } - Vector3d newDir = ship.getShipToWorld().transformDirection(new Vector3d(dir.x, dir.y, dir.z)); - return new Vec3(newDir.x, newDir.y, newDir.z); + return ValkyrienSkies.transformToWorldDir(getLevel(), getPos(), dir); } @Nullable Entity getHoldingEntity(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java index a30fd0a5d..62db06f6a 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/EnvironmentDetectorPeripheral.java @@ -8,6 +8,7 @@ import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleSide; + import de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperationContext; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; @@ -18,6 +19,7 @@ import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralPlugin; + import net.minecraft.resources.ResourceKey; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -35,7 +37,6 @@ import net.minecraftforge.event.entity.player.SleepingTimeCheckEvent; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.server.ServerLifecycleHooks; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.HashMap; @@ -45,6 +46,7 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; +import org.jetbrains.annotations.NotNull; import static de.srendi.advancedperipherals.common.addons.computercraft.operations.SphereOperation.SCAN_ENTITIES; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java index 855271248..cba185c95 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataLookPlugin.java @@ -7,9 +7,11 @@ import dan200.computercraft.core.apis.TableHelper; import de.srendi.advancedperipherals.common.addons.APAddons; import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer; import de.srendi.advancedperipherals.lib.peripherals.AutomataCorePeripheral; + import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockState; @@ -18,13 +20,11 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.NotNull; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.jetbrains.annotations.NotNull; public class AutomataLookPlugin extends AutomataCorePlugin { @@ -58,11 +58,7 @@ public final MethodResult lookAtBlock(@NotNull IArguments arguments) throws LuaE data.put("y", pos.y - origin.y); data.put("z", pos.z - origin.z); if (APAddons.vs2Loaded) { - Ship ship = VSGameUtilsKt.getShipObjectManagingPos(automataCore.getLevel(), blockPos); - if (ship != null) { - data.put("shipId", ship.getId()); - data.put("shipName", ship.getSlug()); - } + ValkyrienSkies.encodeShipInfo(automataCore.getLevel(), blockPos, data); } return MethodResult.of(data); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java index 2a18aeca9..9e032a0eb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/valkyrienskies/ValkyrienSkies.java @@ -2,6 +2,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import org.joml.Vector3d; import org.valkyrienskies.core.api.ships.ServerShip; @@ -10,10 +11,42 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; public final class ValkyrienSkies { private ValkyrienSkies() {} + public static boolean isBlockOnShip(Level level, BlockPos pos) { + return VSGameUtilsKt.isBlockInShipyard(level, pos); + } + + public static Vec3 transformToWorldPos(Level level, BlockPos blockPos, Vec3 pos) { + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, blockPos); + if (ship == null) { + return pos; + } + Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); + return new Vec3(newPos.x, newPos.y, newPos.z); + } + + public static Vec3 transformToWorldDir(Level level, BlockPos blockPos, Vec3 dir) { + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, blockPos); + if (ship == null) { + return dir; + } + Vector3d newDir = ship.getShipToWorld().transformDirection(new Vector3d(dir.x, dir.y, dir.z)); + return new Vec3(newDir.x, newDir.y, newDir.z); + } + + public static void encodeShipInfo(Level level, BlockPos blockPos, Map data) { + Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, blockPos); + if (ship == null) { + return; + } + data.put("shipId", ship.getId()); + data.put("shipName", ship.getSlug()); + } + public static List getNearbyShips(ServerLevel level, Vec3 pos, double radius) { Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, new BlockPos(pos)); if (ship != null) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java index 2fd019fc6..aa9b0b86e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/fakeplayer/FakePlayerProviderTurtle.java @@ -4,6 +4,7 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.shared.util.WorldUtil; import de.srendi.advancedperipherals.common.addons.APAddons; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -15,10 +16,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.InvWrapper; -import org.joml.Matrix4dc; -import org.joml.Vector3d; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.WeakHashMap; @@ -46,14 +43,8 @@ public static void load(APFakePlayer player, ITurtleAccess turtle) { Vec3 direction = Vec3.atLowerCornerOf(turtle.getDirection().getNormal()); Vec3 position = Vec3.atCenterOf(pos); if (APAddons.vs2Loaded) { - Ship ship = VSGameUtilsKt.getShipObjectManagingPos(level, pos); - if (ship != null) { - Matrix4dc matrix = ship.getShipToWorld(); - Vector3d newPos = matrix.transformPosition(new Vector3d(position.x, position.y, position.z)); - Vector3d newDir = matrix.transformDirection(new Vector3d(direction.x, direction.y, direction.z)); - position = new Vec3(newPos.x, newPos.y, newPos.z); - direction = new Vec3(newDir.x, newDir.y, newDir.z); - } + position = ValkyrienSkies.transformToWorldPos(level, pos, position); + direction = ValkyrienSkies.transformToWorldDir(level, pos, direction); } player.setPosRaw(position.x, position.y, position.z); player.lookAt(EntityAnchorArgument.Anchor.FEET, position.add(direction)); diff --git a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java index f7261df7b..78ded5854 100644 --- a/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/lib/peripherals/BasePeripheral.java @@ -12,16 +12,12 @@ import de.srendi.advancedperipherals.common.addons.computercraft.owner.IPeripheralOwner; import de.srendi.advancedperipherals.common.addons.computercraft.owner.OperationAbility; import de.srendi.advancedperipherals.common.addons.computercraft.owner.PeripheralOwnerAbility; +import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import de.srendi.advancedperipherals.common.util.CoordUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.joml.Vector3d; -import org.valkyrienskies.core.api.ships.Ship; -import org.valkyrienskies.mod.common.VSGameUtilsKt; import java.util.ArrayList; import java.util.Collections; @@ -34,6 +30,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.function.Consumer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public abstract class BasePeripheral implements IBasePeripheral, IDynamicPeripheral { @@ -162,12 +160,7 @@ public Vec3 getPhysicsPos() { if (!APAddons.vs2Loaded) { return pos; } - Ship ship = VSGameUtilsKt.getShipObjectManagingPos(owner.getLevel(), owner.getPos()); - if (ship == null) { - return pos; - } - Vector3d newPos = ship.getShipToWorld().transformPosition(new Vector3d(pos.x, pos.y, pos.z)); - return new Vec3(newPos.x, newPos.y, newPos.z); + return ValkyrienSkies.transformToWorldPos(owner.getLevel(), owner.getPos(), pos); } public final BlockPos getPhysicsBlockPos() { From 222b703e8f4cc49b9d425431970805a992139f64 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 8 Mar 2025 17:11:59 -0700 Subject: [PATCH 178/188] re-enable testing environement mods --- build.gradle | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 63cae26c5..93366c8b5 100644 --- a/build.gradle +++ b/build.gradle @@ -314,7 +314,7 @@ dependencies { // Botania compileOnly fg.deobf("vazkii.botania:Botania:${botania_version}") - // runtimeOnly fg.deobf("vazkii.botania:Botania:${botania_version}") + runtimeOnly fg.deobf("vazkii.botania:Botania:${botania_version}") // Minecolonies // Change to compileOnly when running `runData` @@ -339,7 +339,7 @@ dependencies { // Create compileOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") - // runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") + runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") // DimStorage compileOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}") @@ -384,10 +384,10 @@ dependencies { compileOnly "org.valkyrienskies.core:api-game:${vs_core_version}" compileOnly "org.valkyrienskies.core:util:${vs_core_version}" compileOnly "org.valkyrienskies.core:impl:${vs_core_version}" - // runtimeOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") - // runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") - // runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") - // runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") + runtimeOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") + runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") + runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") + runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") } From 5072193ad2cc80b17148a43bf64805128b792fb0 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Sat, 7 Jun 2025 16:50:15 -0600 Subject: [PATCH 179/188] refactor entity convertion in LuaConverter --- .../common/util/LuaConverter.java | 172 +++++++++++------- 1 file changed, 103 insertions(+), 69 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index 4c0dd08ad..551f00970 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -22,6 +22,7 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.phys.Vec3; +import net.minecraft.world.scores.Team; import net.minecraftforge.common.IForgeShearable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; @@ -45,75 +46,89 @@ public class LuaConverter { private static final CompoundTag EMPTY_TAG = new CompoundTag(); + private static final Map, List>> ENTITY_CONVERTERS = new HashMap<>(); - public static Map entityToLua(Entity entity) { - Map data = new HashMap<>(); - data.put("id", entity.getId()); - data.put("uuid", entity.getStringUUID()); - if (entity.hasCustomName()) - data.put("customName", entity.getCustomName().getString()); - EntityType type = entity.getType(); - data.put("displayName", type.getDescription().getString()); - data.put("name", type.builtInRegistryHolder().key().location().toString()); - data.put("type", type.getDescriptionId()); - data.put("category", type.getCategory()); - data.put("canBurn", entity.fireImmune()); - data.put("canFreeze", entity.canFreeze()); - data.put("isGlowing", entity.isCurrentlyGlowing()); - data.put("isUnderWater", entity.isUnderWater()); - data.put("isInLava", entity.isInLava()); - data.put("isInWall", entity.isInWall()); - return data; + /** + * registerEntityConverter register a converter for a type of entity. + * If an old converter exists, it will invoke the old one first before invoke the new converter. + * + * @param clazz The entity's class + * @param converter The {@link EntityConverter} + */ + public static void registerEntityConverter(Class clazz, EntityConverter converter) { + ENTITY_CONVERTERS.computeIfAbsent(clazz, (k) -> new ArrayList<>(1)).add(converter); } - public static Map livingEntityToLua(LivingEntity entity, boolean detailed) { - Map data = entityToLua(entity); - data.put("baby", entity.isBaby()); - data.put("health", entity.getHealth()); - data.put("maxHealth", entity.getMaxHealth()); - data.put("lastDamageSource", entity.getLastDamageSource() == null ? null : entity.getLastDamageSource().toString()); - if (detailed) { - Map effMap = new HashMap<>(); - entity.getActiveEffectsMap().forEach((key, value) -> { - effMap.put(key.getDescriptionId(), effectToObject(value)); - }); - data.put("effects", effMap); - } - return data; + /** + * register default entity converters + */ + static { + registerEntityConverter(Entity.class, (entity, data, ctx) -> { + data.put("id", entity.getId()); + data.put("uuid", entity.getStringUUID()); + if (entity.hasCustomName()) + data.put("customName", entity.getCustomName().getString()); + EntityType type = entity.getType(); + data.put("displayName", type.getDescription().getString()); + data.put("name", type.builtInRegistryHolder().key().location().toString()); + if (ctx.detailed()) { + data.put("type", type.getDescriptionId()); + data.put("category", type.getCategory()); + data.put("canBurn", entity.fireImmune()); + data.put("canFreeze", entity.canFreeze()); + data.put("tags", entity.getTags()); + data.put("isGlowing", entity.isCurrentlyGlowing()); + data.put("isUnderWater", entity.isUnderWater()); + data.put("isInLava", entity.isInLava()); + data.put("isInWall", entity.isInWall()); + data.put("team", teamToLua(entity.getTeam())); + } + }); + registerEntityConverter(LivingEntity.class, (entity, data, ctx) -> { + data.put("baby", entity.isBaby()); + data.put("health", entity.getHealth()); + data.put("maxHealth", entity.getMaxHealth()); + if (ctx.detailed()) { + data.put("lastDamageSource", entity.getLastDamageSource() == null ? null : entity.getLastDamageSource().toString()); + Map effMap = new HashMap<>(); + entity.getActiveEffectsMap().forEach((key, value) -> { + effMap.put(key.getDescriptionId(), effectToLua(value)); + }); + data.put("effects", effMap); + } + }); + registerEntityConverter(Mob.class, (entity, data, ctx) -> { + data.put("aggressive", entity.isAggressive()); + }); + registerEntityConverter(Animal.class, (entity, data, ctx) -> { + data.put("inLove", entity.isInLove()); + if (ctx.detailed() && !ctx.itemInHand().isEmpty() entity instanceof IForgeShearable shareable) { + data.put("shareable", shareable.isShearable(ctx.itemInHand(), entity.level, entity.blockPosition())); + } + }); + registerEntityConverter(Player.class, (entity, data, ctx) -> { + data.put("score", entity.getScore()); + data.put("luck", entity.getLuck()); + Inventory inv = entity.getInventory(); + data.put("handSlot", inv.selected); + if (ctx.detailed()) { + Map invMap = new HashMap<>(); + for (int slot = 0; slot < inv.getContainerSize(); slot++) { + ItemStack item = inv.getItem(slot); + if (!item.isEmpty()) { + invMap.put(slot, itemStackToObject(item)); + } + } + data.put("inventory", invMap); + } + }); } - public static Map mobToLua(Mob animal, boolean detailed) { - Map data = livingEntityToLua(animal, detailed); - data.put("aggressive", animal.isAggressive()); - return data; - } + @FunctionalInterface + public interface EntityConverter { + void entityToMap(T entity, Map data, Context ctx); - public static Map animalToLua(Animal animal, ItemStack itemInHand, boolean detailed) { - Map data = mobToLua(animal, detailed); - data.put("inLove", animal.isInLove()); - if (animal instanceof IForgeShearable shareable && !itemInHand.isEmpty()) { - data.put("shareable", shareable.isShearable(itemInHand, animal.level, animal.blockPosition())); - } - return data; - } - - public static Map playerToLua(Player player, boolean detailed) { - Map data = livingEntityToLua(player, detailed); - data.put("score", player.getScore()); - data.put("luck", player.getLuck()); - Inventory inv = player.getInventory(); - data.put("handSlot", inv.selected); - if (detailed) { - Map invMap = new HashMap<>(); - for (int slot = 0; slot < inv.getContainerSize(); slot++) { - ItemStack item = inv.getItem(slot); - if (!item.isEmpty()) { - invMap.put(slot, itemStackToObject(item)); - } - } - data.put("inventory", invMap); - } - return data; + record Context(boolean detailed, ItemStack itemInHand) {} } public static Map completeEntityToLua(Entity entity) { @@ -129,11 +144,20 @@ public static Map completeEntityToLua(Entity entity, ItemStack i } public static Map completeEntityToLua(Entity entity, ItemStack itemInHand, boolean detailed) { - if (entity instanceof Player player) return playerToLua(player, detailed); - if (entity instanceof Animal animal) return animalToLua(animal, itemInHand, detailed); - if (entity instanceof Mob mob) return mobToLua(mob, detailed); - if (entity instanceof LivingEntity livingEntity) return livingEntityToLua(livingEntity, detailed); - return entityToLua(entity); + if (entity == null) { + return null; + } + EntityConverter.Context ctx = new EntityConverter.Context(detailed, itemInHand); + Map data = new HashMap<>(); + for (Class entityClass = entity.getClass(); Entity.class.isAssignableFrom(entityClass); entityClass = entityClass.getSuperclass()) { + List> converters = ENTITY_CONVERTERS.get((Class) entityClass); + if (converters != null) { + for (EntityConverter converter : converters) { + converter.entityToMap(entity, data, ctx); + } + } + } + return data; } public static Map completeEntityWithPositionToLua(Entity entity, BlockPos pos) { @@ -303,7 +327,7 @@ public static BlockPos convertToBlockPos(BlockPos center, Map table) throw return new BlockPos(center.getX() + relative.getX(), center.getY() + relative.getY(), center.getZ() + relative.getZ()); } - public static Object effectToObject(MobEffectInstance effect) { + public static Map effectToLua(MobEffectInstance effect) { Map map = new HashMap<>(); map.put("name", effect.getDescriptionId()); map.put("duration", effect.getDuration()); @@ -311,6 +335,16 @@ public static Object effectToObject(MobEffectInstance effect) { return map; } + public static Map teamToLua(Team team) { + if (team == null) { + return null; + } + Map map = new HashMap<>(); + map.put("name", team.getName()); + map.put("color", team.getColor()); + return map; + } + public static Map shipToObject(ServerShip ship) { return shipToObject(ship, null); } From 2e49ba9d50eb712cd238e7623c3bbd39b7b1e966 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 13 Jun 2025 21:26:21 -0600 Subject: [PATCH 180/188] small fixes --- build.gradle | 14 +++++++------- .../plugins/AutomataEntityHandPlugin.java | 2 +- .../common/util/LuaConverter.java | 10 ++++------ 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index 93366c8b5..6daf20a52 100644 --- a/build.gradle +++ b/build.gradle @@ -3,17 +3,17 @@ import net.darkhax.curseforgegradle.TaskPublishCurseForge import java.text.SimpleDateFormat plugins { - id "maven-publish" + id 'checkstyle' + id 'com.github.breadmoirai.github-release' version '2.5.2' + id 'com.modrinth.minotaur' version '2.+' + id 'java' + id 'maven-publish' id 'net.darkhax.curseforgegradle' version '1.1.16' - id 'org.jetbrains.changelog' version '1.2.1' - id "com.modrinth.minotaur" version "2.+" - id "org.jetbrains.kotlin.jvm" version "1.6.10" id 'net.minecraftforge.gradle' version '[6.0.18,6.2)' + id 'org.jetbrains.changelog' version '1.2.1' + id 'org.jetbrains.kotlin.jvm' version '1.6.10' id 'org.parchmentmc.librarian.forgegradle' version '1.+' id 'org.spongepowered.mixin' version '0.7.+' - id "com.github.breadmoirai.github-release" version "2.5.2" - id 'checkstyle' - id 'java' } java { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java index b7ab0aba4..2139e4ab5 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataEntityHandPlugin.java @@ -76,7 +76,7 @@ public final MethodResult inspectAnimal(@NotNull IArguments arguments) throws Lu if (!(entity instanceof Animal animal)) return MethodResult.of(null, "Well, entity is not animal entity, but how?"); - return MethodResult.of(LuaConverter.animalToLua(animal, owner.getToolInMainHand(), true)); + return MethodResult.of(LuaConverter.completeEntityToLua(animal, owner.getToolInMainHand(), true)); } @LuaFunction(mainThread = true) diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java index 551f00970..aa9690e88 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/LuaConverter.java @@ -59,9 +59,7 @@ public static void registerEntityConverter(Class clazz, En ENTITY_CONVERTERS.computeIfAbsent(clazz, (k) -> new ArrayList<>(1)).add(converter); } - /** - * register default entity converters - */ + // register default entity converters static { registerEntityConverter(Entity.class, (entity, data, ctx) -> { data.put("id", entity.getId()); @@ -73,7 +71,7 @@ public static void registerEntityConverter(Class clazz, En data.put("name", type.builtInRegistryHolder().key().location().toString()); if (ctx.detailed()) { data.put("type", type.getDescriptionId()); - data.put("category", type.getCategory()); + data.put("category", type.getCategory().getName()); data.put("canBurn", entity.fireImmune()); data.put("canFreeze", entity.canFreeze()); data.put("tags", entity.getTags()); @@ -102,7 +100,7 @@ public static void registerEntityConverter(Class clazz, En }); registerEntityConverter(Animal.class, (entity, data, ctx) -> { data.put("inLove", entity.isInLove()); - if (ctx.detailed() && !ctx.itemInHand().isEmpty() entity instanceof IForgeShearable shareable) { + if (ctx.detailed() && !ctx.itemInHand().isEmpty() && entity instanceof IForgeShearable shareable) { data.put("shareable", shareable.isShearable(ctx.itemInHand(), entity.level, entity.blockPosition())); } }); @@ -153,7 +151,7 @@ public static Map completeEntityToLua(Entity entity, ItemStack i List> converters = ENTITY_CONVERTERS.get((Class) entityClass); if (converters != null) { for (EntityConverter converter : converters) { - converter.entityToMap(entity, data, ctx); + ((EntityConverter) converter).entityToMap(entity, data, ctx); } } } From b7889127815d925e44088d8911061233dd951099 Mon Sep 17 00:00:00 2001 From: Srendi Date: Mon, 30 Jun 2025 19:45:35 +0200 Subject: [PATCH 181/188] Move to curse maven for create since they were removed from the tterrag repository. Disable transistive for the VS dependencies to prevent issues with expected create dependencies --- build.gradle | 14 ++++++++------ gradle.properties | 3 ++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 93366c8b5..a3da52840 100644 --- a/build.gradle +++ b/build.gradle @@ -213,8 +213,6 @@ repositories { name = "Create maven" url = "https://maven.tterrag.com/" content { - includeGroup("com.simibubi.create") - includeGroup("com.jozufozu.flywheel") includeGroup("com.tterrag.registrate") } } @@ -338,8 +336,8 @@ dependencies { runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}") // Create - compileOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") - runtimeOnly fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:all") + compileOnly fg.deobf("curse.maven:create-328085:${create_version}") + runtimeOnly fg.deobf("curse.maven:create-328085:${create_version}") // DimStorage compileOnly fg.deobf("curse.maven:dimstorage-353882:${dimstorage_version}") @@ -379,12 +377,16 @@ dependencies { compileOnly("org.joml:joml:1.10.4") compileOnly("org.joml:joml-primitives:1.10.0") // compileOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-common:${vs2_version}") - compileOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") + compileOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") { + transitive = false + } compileOnly "org.valkyrienskies.core:api:${vs_core_version}" compileOnly "org.valkyrienskies.core:api-game:${vs_core_version}" compileOnly "org.valkyrienskies.core:util:${vs_core_version}" compileOnly "org.valkyrienskies.core:impl:${vs_core_version}" - runtimeOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") + runtimeOnly fg.deobf("org.valkyrienskies:valkyrienskies-119-forge:${vs2_version}") { + transitive = false + } runtimeOnly fg.deobf("curse.maven:valkyrien-skies-258371:${valkyrien_skies_version}") runtimeOnly fg.deobf("curse.maven:eureka-ships-654384:${eureka_ships_version}") runtimeOnly fg.deobf("curse.maven:clockwork-807792:${clockwork_version}") diff --git a/gradle.properties b/gradle.properties index 93e3534e5..4ecca0d00 100644 --- a/gradle.properties +++ b/gradle.properties @@ -36,7 +36,8 @@ appliedenergistics_version=12.9.12 appliedmekanistics_version=4734608 botania_version=1.19.2-440-FORGE clockwork_version=5171528 -create_version=0.5.1.f-46 +#v0.5.1 +create_version=5797604 createca_version=5099757 curios_version=1.19.2-5.1.4.1 dimstorage_version=3927875 From 380fce6bfcf28267404c4e1e87b7cdaa5b4ff91b Mon Sep 17 00:00:00 2001 From: Srendi Date: Mon, 30 Jun 2025 19:51:49 +0200 Subject: [PATCH 182/188] Bump the forge version since for some reason .4.0 quits the game as soon as I try to open the world menu --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 4ecca0d00..b4e3848fa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ mod_version=0.8r minecraft_version=1.19.2 mod_artifact_suffix= -forge_version=43.4.0 +forge_version=43.5.0 loader_version=43 release_type=release From f8277407a1cf5d06070da1897e10c49037b081be Mon Sep 17 00:00:00 2001 From: Srendi Date: Thu, 3 Jul 2025 15:26:30 +0200 Subject: [PATCH 183/188] Refactor some decoding logic, add a line object and renderer, implement pixelated lines for circles and lines --- .../client/ClientRegistry.java | 2 +- .../OverlayModuleLevelRenderer.java | 8 +- .../smartglasses/OverlayModuleOverlay.java | 2 +- .../smartglasses/OverlayObjectHolder.java | 4 +- .../objects/threedim/BlockRenderer.java | 2 +- .../objects/threedim/BoxRenderer.java | 2 +- .../objects/threedim/SphereRenderer.java | 2 +- .../objects/threedim/TorusRenderer.java | 2 +- .../objects/twodim/CircleRenderer.java | 152 ++++++++++++++++-- .../objects/twodim/ITwoDObjectRenderer.java | 2 +- .../objects/twodim/ItemRenderer.java | 2 +- .../objects/twodim/LineRenderer.java | 103 ++++++++++++ .../objects/twodim/RectangleRenderer.java | 2 +- .../objects/twodim/TextRenderer.java | 2 +- .../RenderableObjectBulkSyncPacket.java | 2 +- .../toclient/RenderableObjectSyncPacket.java | 2 +- .../modules/overlay/ObjectDecodeRegistry.java | 2 +- .../overlay/OverlayGlassesFunctions.java | 11 +- .../modules/overlay/OverlayModule.java | 2 +- .../modules/overlay/OverlayObject.java | 3 +- .../{two_dim => }/RenderableObject.java | 92 ++++++++++- .../objects/three_dim/BlockObject.java | 38 +---- .../overlay/objects/three_dim/BoxObject.java | 38 +---- .../objects/three_dim/SphereObject.java | 38 +---- .../three_dim/ThreeDimensionalObject.java | 47 +----- .../objects/three_dim/TorusObject.java | 37 +---- .../overlay/objects/two_dim/CircleObject.java | 101 +++++++++--- .../overlay/objects/two_dim/ItemObject.java | 31 +--- .../overlay/objects/two_dim/LineObject.java | 97 +++++++++++ .../objects/two_dim/RectangleObject.java | 33 +--- .../overlay/objects/two_dim/TextObject.java | 31 +--- 31 files changed, 584 insertions(+), 308 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/LineRenderer.java rename src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/{two_dim => }/RenderableObject.java (61%) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/LineObject.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index 27c1f9e51..bcdc7dfac 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -75,6 +75,6 @@ public static void registeringRenderers(EntityRenderersEvent.RegisterRenderers e @SubscribeEvent public static void registeringOverlays(RegisterGuiOverlaysEvent event) { event.registerAboveAll(SaddleTurtleScreen.ID, SADDLE_TURTLE_OVERLAY); - event.registerAboveAll(OverlayModuleOverlay.ID, OVERLAY_MODULE_OVERLAY); + event.registerBelowAll(OverlayModuleOverlay.ID, OVERLAY_MODULE_OVERLAY); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java index 48bb64ccb..1a8aa23c2 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleLevelRenderer.java @@ -11,7 +11,7 @@ import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.IThreeDObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.ThreeDimensionalObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.util.EnumColor; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; @@ -65,7 +65,7 @@ public static void renderLevelState(RenderLevelStageEvent event) { } //TODO Everything below here is just for debugging and testing. Will be removed before we push to production - BlockPos blockPos = new BlockPos(2, 10, 0); + BlockPos blockPos = new BlockPos(2, 100, 0); float[] colors = EnumColor.DARK_PURPLE.getRgb(); @@ -87,7 +87,7 @@ public static void renderLevelState(RenderLevelStageEvent event) { posestack.pushPose(); colors = EnumColor.WHITE.getRgb(); - blockPos = new BlockPos(0, 10, 0); + blockPos = new BlockPos(0, 100, 0); posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); RenderUtil.drawSphere(posestack, boxVertexConsumer, 2f, 0f, 0f, 0f, 270f, 0f, 0f, colors[0], colors[1], colors[2], 0.4f, 16, 128); @@ -101,7 +101,7 @@ public static void renderLevelState(RenderLevelStageEvent event) { posestack.pushPose(); colors = EnumColor.WHITE.getRgb(); - blockPos = new BlockPos(6, 10, 0); + blockPos = new BlockPos(6, 100, 0); posestack.translate(-view.x + blockPos.getX(), -view.y + blockPos.getY(), -view.z + blockPos.getZ()); RenderUtil.drawTorus(posestack, boxVertexConsumer, 1f, 0.4f, 0f, 0f, 0f, 0f, 0f, 0f, colors[0], colors[1], colors[2], 1f, 48, 48); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java index da7ec2ecc..1a5fde8a5 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java @@ -2,7 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java index 3dc4d94a0..e319679fd 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayObjectHolder.java @@ -7,8 +7,9 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.TorusObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.LineObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject; import java.util.Collection; @@ -49,6 +50,7 @@ public static void registerDecodeObjects() { ObjectDecodeRegistry.register(CircleObject.TYPE_ID, CircleObject::decode); ObjectDecodeRegistry.register(TextObject.TYPE_ID, TextObject::decode); ObjectDecodeRegistry.register(ItemObject.TYPE_ID, ItemObject::decode); + ObjectDecodeRegistry.register(LineObject.TYPE_ID, LineObject::decode); ObjectDecodeRegistry.register(BoxObject.TYPE_ID, BoxObject::decode); ObjectDecodeRegistry.register(BlockObject.TYPE_ID, BlockObject::decode); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java index a295543b6..152f9c3fe 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BlockRenderer.java @@ -36,7 +36,7 @@ public void renderBatch(List batch, RenderLevelStageEven BlockObject block = (BlockObject) obj; poseStack.translate(-view.x + block.getX(), -view.y + block.getY(), -view.z + block.getZ()); - poseStack.mulPose(new Quaternion(block.xRot, block.yRot, block.zRot, true)); + poseStack.mulPose(new Quaternion(block.rotX, block.rotY, block.rotZ, true)); poseStack.translate(-0.5f, -0.5f, -0.5f); float alpha = block.opacity; float red = RenderUtil.getRed(block.color); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java index 8488d3ab0..e773a6ec4 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/BoxRenderer.java @@ -35,7 +35,7 @@ public void renderBatch(List batch, RenderLevelStageEven float blue = RenderUtil.getBlue(box.color); poseStack.translate(-view.x + box.getX(), -view.y + box.getY(), -view.z + box.getZ()); - RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, box.x, box.y, box.z, obj.xRot, obj.yRot, obj.zRot, obj.maxX, obj.maxY, obj.maxZ); + RenderUtil.drawBox(poseStack, bufferBuilder, red, green, blue, alpha, box.x, box.y, box.z, obj.rotX, obj.rotY, obj.rotZ, obj.maxX, obj.maxY, obj.maxZ); BufferUploader.drawWithShader(bufferBuilder.end()); onPostRender(obj); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java index e3c468f06..71388a20e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/SphereRenderer.java @@ -36,7 +36,7 @@ public void renderBatch(List batch, RenderLevelStageEven float blue = RenderUtil.getRed(sphere.color); poseStack.translate(-view.x, -view.y, -view.z); - RenderUtil.drawSphere(poseStack, boxVertexConsumer, sphere.radius, sphere.x, sphere.y, sphere.z, sphere.xRot, sphere.yRot, sphere.zRot, red, green, blue, alpha, sphere.sectors, sphere.stacks); + RenderUtil.drawSphere(poseStack, boxVertexConsumer, sphere.radius, sphere.x, sphere.y, sphere.z, sphere.rotX, sphere.rotY, sphere.rotZ, red, green, blue, alpha, sphere.sectors, sphere.stacks); onPostRender(obj); poseStack.popPose(); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/TorusRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/TorusRenderer.java index 478f1e6cc..7921b8a71 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/TorusRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/threedim/TorusRenderer.java @@ -35,7 +35,7 @@ public void renderBatch(List batch, RenderLevelStageEven float blue = RenderUtil.getBlue(torus.color); poseStack.translate(-view.x + torus.x, -view.y + torus.y, -view.z + torus.z); - RenderUtil.drawTorus(poseStack, bufferBuilder, torus.majorRadius, torus.minorRadius, 0, 0, 0, torus.xRot, torus.yRot, torus.zRot, red, green, blue, alpha, torus.rings, torus.sides); + RenderUtil.drawTorus(poseStack, bufferBuilder, torus.majorRadius, torus.minorRadius, 0, 0, 0, torus.rotX, torus.rotY, torus.rotZ, red, green, blue, alpha, torus.rings, torus.sides); BufferUploader.drawWithShader(bufferBuilder.end()); onPostRender(obj); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java index 2f64946bd..5929b3e8e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/CircleRenderer.java @@ -8,9 +8,11 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix4f; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; @@ -29,31 +31,159 @@ public void renderBatch(List objects, ForgeGui gui, PoseStack float green = RenderUtil.getGreen(circle.color); float blue = RenderUtil.getBlue(circle.color); - drawCircle(poseStack, circle.x, circle.y, circle.radius, 120, red, green, blue, alpha); + drawCircle(poseStack, circle, red, green, blue, alpha); } } - public void drawCircle(PoseStack poseStack, float cx, float cy, float r, int numSegments, float red, float green, float blue, float alpha) { + public void drawCircle(PoseStack t, CircleObject circle, float red, float green, float blue, float alpha) { + float r = circle.radius; + float cx = circle.x; + float cy = circle.y; + float cz = circle.z; + float rotX = circle.rotX; + float rotY = circle.rotY; + float rotZ = circle.rotZ; + float borderWidth = circle.borderWidth; + int segments = circle.segments; + + boolean isFilled = circle.filled; + boolean isPixelated = circle.pixelated; + + PoseStack poseStack = new PoseStack(); + + poseStack.translate(cx, cy, cz); + + poseStack.pushPose(); + + poseStack.mulPose(Vector3f.XP.rotationDegrees(rotX)); + poseStack.mulPose(Vector3f.YP.rotationDegrees(rotY)); + poseStack.mulPose(Vector3f.ZP.rotationDegrees(rotZ)); + + RenderSystem.disableCull(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); Matrix4f matrix = poseStack.last().pose(); - bufferbuilder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_COLOR); - bufferbuilder.vertex(matrix, cx, cy, 1f).color(red, green, blue, alpha).endVertex(); + // Normal, smooth lines + if (!isPixelated) { + if (isFilled) { + + bufferbuilder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_COLOR); + + bufferbuilder.vertex(matrix, 0, 0, 0f).color(red, green, blue, alpha).endVertex(); + + double angleStep = Math.PI * 2 / segments; + + for (int i = 0; i <= segments; i++) { + double angle = i * angleStep; + double x = r * Math.sin(angle); + double y = r * Math.cos(angle); + + bufferbuilder.vertex(matrix, (float) x, (float) y, 0).color(red, green, blue, alpha).endVertex(); + } - double angle = Math.PI * 2 / numSegments; + } else { + float outerRadius = r; + float innerRadius = r - borderWidth; - for (int i = 0; i <= numSegments; i++) { - double x = cx + r * Math.sin(i * angle); - double y = cy + r * Math.cos(i * angle); + bufferbuilder.begin(VertexFormat.Mode.TRIANGLE_STRIP, DefaultVertexFormat.POSITION_COLOR); - bufferbuilder.vertex(matrix, (float) x, (float) y, 0f).color(red, green, blue, alpha).endVertex(); + double angleStep = Math.PI * 2 / segments; + + for (int i = 0; i <= segments; i++) { + double angle = i * angleStep; + + // Outer circle vertex + double outerX = innerRadius * Math.sin(angle); + double outerY = innerRadius * Math.cos(angle); + bufferbuilder.vertex(matrix, (float) outerX, (float) outerY, 0f).color(red, green, blue, alpha).endVertex(); + + // Inner circle vertex + double innerX = outerRadius * Math.sin(angle); + double innerY = outerRadius * Math.cos(angle); + bufferbuilder.vertex(matrix, (float) innerX, (float) innerY, 0f).color(red, green, blue, alpha).endVertex(); + } + } + + BufferUploader.drawWithShader(bufferbuilder.end()); + + return; } + // Pixelated lines + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + + final float PIXEL_SIZE = borderWidth; // Defines the size of each "pixel" square + + // The thickness of the hollow line in terms of pixel units. + // A value of 1.0f means the line will be roughly one pixel thick. + final float LINE_THICKNESS_PIXELS = 1f; + + // Calculate the effective min/max coordinates in the relative space + float effectiveMinX = -r - PIXEL_SIZE; + float effectiveMaxX = r + PIXEL_SIZE; + float effectiveMinY = -r - PIXEL_SIZE; + float effectiveMaxY = r + PIXEL_SIZE; + +// Start the loop at the first multiple of PIXEL_SIZE that is less than or equal to effectiveMinX/Y + float startX = (float) Math.floor(effectiveMinX / PIXEL_SIZE) * PIXEL_SIZE; + float startY = (float) Math.floor(effectiveMinY / PIXEL_SIZE) * PIXEL_SIZE; + + + for (float x = startX; x <= effectiveMaxX; x += PIXEL_SIZE) { + for (float y = startY; y <= effectiveMaxY; y += PIXEL_SIZE) { + // Calculate the center of the current pixel cell. + // This is where you determine if the *center* of this block should be drawn. + float pixelCenterX = x + (PIXEL_SIZE / 2.0F); + float pixelCenterY = y + (PIXEL_SIZE / 2.0F); + + // Distance is calculated from (pixelCenterX, pixelCenterY) to (0,0) + double distanceToCenter = Math.sqrt( + Math.pow(pixelCenterX, 2) + Math.pow(pixelCenterY, 2) + ); + + boolean shouldDrawPixel; + + if (!isFilled) { + float outerRadius = r + (LINE_THICKNESS_PIXELS * (PIXEL_SIZE / 2.0F)); + float innerRadius = r - (LINE_THICKNESS_PIXELS * (PIXEL_SIZE / 2.0F)); + + if (innerRadius < 0) innerRadius = 0; + + shouldDrawPixel = (distanceToCenter <= outerRadius) && (distanceToCenter >= innerRadius); + } else { + shouldDrawPixel = distanceToCenter <= r + (PIXEL_SIZE / 2.0F); + } + + if (shouldDrawPixel) { + // Vertices for the QUAD (a PIXEL_SIZE x PIXEL_SIZE square) + // These coordinates are now relative to the current origin (0,0,0) + float p_x1 = x; + float p_y1 = y; + float p_z = 0f; // z-coordinate is relative to cz, so 0 in this space + + float p_x2 = x + PIXEL_SIZE; + float p_y2 = y + PIXEL_SIZE; + + // Vertices for the QUAD + // Ensure proper winding order (counter-clockwise for front face) + bufferbuilder.vertex(matrix, p_x1, p_y2, p_z).color(red, green, blue, alpha).endVertex(); // Bottom-left + bufferbuilder.vertex(matrix, p_x2, p_y2, p_z).color(red, green, blue, alpha).endVertex(); // Bottom-right + bufferbuilder.vertex(matrix, p_x2, p_y1, p_z).color(red, green, blue, alpha).endVertex(); // Top-right + bufferbuilder.vertex(matrix, p_x1, p_y1, p_z).color(red, green, blue, alpha).endVertex(); // Top-left + } + } + } + + RenderSystem.enableCull(); + BufferUploader.drawWithShader(bufferbuilder.end()); - } + poseStack.popPose(); + } } + diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ITwoDObjectRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ITwoDObjectRenderer.java index 230edbca7..543f3580c 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ITwoDObjectRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ITwoDObjectRenderer.java @@ -2,7 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraftforge.client.gui.overlay.ForgeGui; import java.util.List; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java index b7f4c2913..6d2ff7ccb 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/ItemRenderer.java @@ -2,7 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.util.RegistryUtil; import net.minecraft.client.Minecraft; import net.minecraft.world.item.Item; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/LineRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/LineRenderer.java new file mode 100644 index 000000000..71579398a --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/LineRenderer.java @@ -0,0 +1,103 @@ +package de.srendi.advancedperipherals.client.smartglasses.objects.twodim; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Matrix4f; +import de.srendi.advancedperipherals.client.RenderUtil; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.LineObject; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraftforge.client.gui.overlay.ForgeGui; + +import java.util.List; + +public class LineRenderer implements ITwoDObjectRenderer { + + @Override + public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + RenderSystem.setShader(GameRenderer::getPositionColorShader); + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + Matrix4f matrix = poseStack.last().pose(); + + for (RenderableObject obj : objects) { + + LineObject line = (LineObject) obj; + + float alpha = obj.opacity; + float red = RenderUtil.getRed(obj.color); + float green = RenderUtil.getGreen(obj.color); + float blue = RenderUtil.getBlue(obj.color); + + // Start and end points of the line + float x1 = obj.x; + float y1 = obj.y; + float z1 = obj.z; + + float x2 = obj.maxX; + float y2 = obj.maxY; + float z2 = obj.maxZ; + + // Normal, smooth lines + if (!line.pixelated) { + bufferbuilder.begin(VertexFormat.Mode.DEBUG_LINE_STRIP, DefaultVertexFormat.POSITION_COLOR); + bufferbuilder.vertex(matrix, x1, y1, 0).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, x2, y2, 0).color(red, green, blue, alpha).endVertex(); + BufferUploader.drawWithShader(bufferbuilder.end()); + + continue; // Skip the rest of the loop for this object + } + + // Pixelated lines + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + + // Calculate the delta for each axis + float dx = x2 - x1; + float dy = y2 - y1; + float dz = z2 - z1; + + final float PIXEL_SIZE = line.pixelSize; + + float maxDim = Math.max(Math.abs(dx), Math.max(Math.abs(dy), Math.abs(dz))); + int numPixels = (int) Math.ceil(maxDim / PIXEL_SIZE); + + if (numPixels == 0) { + numPixels = 1; // Always draw at least one pixel for very short lines + } + + // Iterate and draw a square for each "pixel" + for (int i = 0; i <= numPixels; i++) { + float t = (float) i / numPixels; // Interpolation factor (0.0 to 1.0) + + // Calculate the exact point on the line + float currentX = x1 + dx * t; + float currentY = y1 + dy * t; + float currentZ = z1 + dz * t; + + // Snap current point to the nearest pixel grid for consistent placement. + // This is key for placing pixels at corners or full side of each other. + currentX = Math.round(currentX / PIXEL_SIZE) * PIXEL_SIZE; + currentY = Math.round(currentY / PIXEL_SIZE) * PIXEL_SIZE; + currentZ = Math.round(currentZ / PIXEL_SIZE) * PIXEL_SIZE; + + float p_x1 = currentX; + float p_y1 = currentY; + float p_z1 = currentZ; + + float p_x2 = currentX + PIXEL_SIZE; + float p_y2 = currentY + PIXEL_SIZE; + float p_z2 = currentZ; + + bufferbuilder.vertex(matrix, p_x1, p_y2, p_z1).color(red, green, blue, alpha).endVertex(); // Bottom-left + bufferbuilder.vertex(matrix, p_x2, p_y2, p_z1).color(red, green, blue, alpha).endVertex(); // Bottom-right + bufferbuilder.vertex(matrix, p_x2, p_y1, p_z2).color(red, green, blue, alpha).endVertex(); // Top-right + bufferbuilder.vertex(matrix, p_x1, p_y1, p_z2).color(red, green, blue, alpha).endVertex(); // Top-left + } + BufferUploader.drawWithShader(bufferbuilder.end()); + } + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java index 872a5b6ea..7212596f1 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java @@ -9,7 +9,7 @@ import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix4f; import de.srendi.advancedperipherals.client.RenderUtil; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.client.renderer.GameRenderer; import net.minecraftforge.client.gui.overlay.ForgeGui; diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java index b80aa6e77..570020a49 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.client.smartglasses.objects.twodim; import com.mojang.blaze3d.vertex.PoseStack; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject; import net.minecraft.client.Minecraft; import net.minecraftforge.client.gui.overlay.ForgeGui; diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java index ab33587d3..d033c9eb2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectBulkSyncPacket.java @@ -3,7 +3,7 @@ import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; import de.srendi.advancedperipherals.common.network.base.IPacket; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java index c96d74506..fb2a1ba68 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/RenderableObjectSyncPacket.java @@ -3,7 +3,7 @@ import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; import de.srendi.advancedperipherals.common.network.base.IPacket; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.ObjectDecodeRegistry; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java index afa856c32..2406ca69b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/ObjectDecodeRegistry.java @@ -1,6 +1,6 @@ package de.srendi.advancedperipherals.common.smartglasses.modules.overlay; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.network.FriendlyByteBuf; import java.util.HashMap; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index d0c99a7e5..b27b2ad94 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -12,8 +12,9 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.three_dim.TorusObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.ItemObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.LineObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject; import net.minecraft.client.Minecraft; import net.minecraft.world.phys.Vec3; @@ -44,6 +45,14 @@ public final MethodResult createCircle(IArguments arguments) throws LuaException return MethodResult.of(object, "SUCCESS"); } + @LuaFunction + public final MethodResult createLine(IArguments arguments) throws LuaException { + LineObject rectangle = new LineObject(overlayModule, arguments); + RenderableObject object = overlayModule.addObject(rectangle); + + return MethodResult.of(object, "SUCCESS"); + } + @LuaFunction public final MethodResult createText(IArguments arguments) throws LuaException { TextObject circle = new TextObject(overlayModule, arguments); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java index 833d62833..e239fb020 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java @@ -9,7 +9,7 @@ import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesAccess; import de.srendi.advancedperipherals.common.smartglasses.modules.IModule; import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java index 594af232b..ec4be1bdb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayObject.java @@ -4,6 +4,7 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.PropertyType; import de.srendi.advancedperipherals.common.util.StringUtil; @@ -156,7 +157,7 @@ public Object castValueToFieldType(Field field, Object value) { if (fieldType.isAssignableFrom(value.getClass())) { return value; } else if (fieldType.equals(Integer.TYPE)) { - return Integer.valueOf(StringUtil.removeFloatingPoints(value.toString())); + return Double.valueOf(value.toString()).intValue(); } else if (fieldType.equals(Double.TYPE)) { return Double.valueOf(value.toString()); } else if (fieldType.equals(Boolean.TYPE)) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java similarity index 61% rename from src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java rename to src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java index c9c640bdc..110fb4f4d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java @@ -1,8 +1,9 @@ -package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim; +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects; import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayObject; @@ -10,7 +11,10 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import net.minecraft.network.FriendlyByteBuf; +import java.util.Optional; import java.util.UUID; +import java.util.function.Function; +import java.util.function.Supplier; // TODO: generate setters/getters lua functions out of our FloatingNumberProperty fields public class RenderableObject extends OverlayObject { @@ -18,7 +22,7 @@ public class RenderableObject extends OverlayObject { @FloatingNumberProperty(min = 0, max = 1) public float opacity = 1; - @FixedPointNumberProperty(min = 0, max = 0xFFFFFF) + @FixedPointNumberProperty(min = 0, max = Integer.MAX_VALUE) public int color = 0xFFFFFF; @FloatingNumberProperty(min = -32767, max = 32767) @@ -39,9 +43,17 @@ public class RenderableObject extends OverlayObject { @FloatingNumberProperty(min = -32767, max = 32767) public float maxZ = 0; + @FloatingNumberProperty(min = 0, max = 360) + public float rotX = 0f; + + @FloatingNumberProperty(min = 0, max = 360) + public float rotY = 0f; + + @FloatingNumberProperty(min = 0, max = 360) + public float rotZ = 0f; + public RenderableObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); - reflectivelyMapProperties(arguments); } public RenderableObject(UUID player) { @@ -136,6 +148,39 @@ public final float getZ() { return z; } + @LuaFunction + public final void setRotX(double xRot) { + this.rotX = (float) xRot; + getModule().update(this); + } + + @LuaFunction + public final double getRotX() { + return rotX; + } + + @LuaFunction + public final void setRotY(double yRot) { + this.rotY = (float) yRot; + getModule().update(this); + } + + @LuaFunction + public final double getRotY() { + return rotY; + } + + @LuaFunction + public final void setRotZ(double zRot) { + this.rotZ = (float) zRot; + getModule().update(this); + } + + @LuaFunction + public final double getRotZ() { + return rotZ; + } + @Override public void encode(FriendlyByteBuf buffer) { super.encode(buffer); @@ -148,6 +193,47 @@ public void encode(FriendlyByteBuf buffer) { buffer.writeFloat(maxX); buffer.writeFloat(maxY); buffer.writeFloat(maxZ); + buffer.writeFloat(rotX); + buffer.writeFloat(rotY); + buffer.writeFloat(rotZ); + } + + protected static Optional baseDecode(FriendlyByteBuf buffer, Function constructor) { + int objectId = buffer.readInt(); + boolean hasValidUUID = buffer.readBoolean(); + if (!hasValidUUID) { + AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + return Optional.empty(); + } + UUID player = buffer.readUUID(); + int color = buffer.readInt(); + float opacity = buffer.readFloat(); + + float x = buffer.readFloat(); + float y = buffer.readFloat(); + float z = buffer.readFloat(); + float maxX = buffer.readFloat(); + float maxY = buffer.readFloat(); + float maxZ = buffer.readFloat(); + float rotX = buffer.readFloat(); + float rotY = buffer.readFloat(); + float rotZ = buffer.readFloat(); + + T clientObject = constructor.apply(player); + clientObject.setId(objectId); + clientObject.color = color; + clientObject.opacity = opacity; + clientObject.x = x; + clientObject.y = y; + clientObject.z = z; + clientObject.maxX = maxX; + clientObject.maxY = maxY; + clientObject.maxZ = maxZ; + clientObject.rotX = rotX; + clientObject.rotY = rotY; + clientObject.rotZ = rotZ; + + return Optional.of(clientObject); } public IObjectRenderer getRenderObject() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java index b2718e4fb..1f83c4c01 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BlockObject.java @@ -7,9 +7,12 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.BlockRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; import net.minecraft.network.FriendlyByteBuf; +import java.util.Optional; import java.util.UUID; public class BlockObject extends ThreeDimensionalObject { @@ -48,45 +51,18 @@ public void encode(FriendlyByteBuf buffer) { } public static BlockObject decode(FriendlyByteBuf buffer) { - int objectId = buffer.readInt(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + Optional optionalObject = RenderableObject.baseDecode(buffer, BlockObject::new); + if (optionalObject.isEmpty()) return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - float opacity = buffer.readFloat(); - - float x = buffer.readFloat(); - float y = buffer.readFloat(); - float z = buffer.readFloat(); - float maxX = buffer.readFloat(); - float maxY = buffer.readFloat(); - float maxZ = buffer.readFloat(); + boolean disableDepthTest = buffer.readBoolean(); boolean disableCulling = buffer.readBoolean(); - float xRot = buffer.readFloat(); - float yRot = buffer.readFloat(); - float zRot = buffer.readFloat(); String block = buffer.readUtf(); - BlockObject clientObject = new BlockObject(player); - clientObject.setId(objectId); - clientObject.color = color; - clientObject.opacity = opacity; - clientObject.x = x; - clientObject.y = y; - clientObject.z = z; - clientObject.maxX = maxX; - clientObject.maxY = maxY; - clientObject.maxZ = maxZ; + BlockObject clientObject = optionalObject.get(); clientObject.disableDepthTest = disableDepthTest; clientObject.disableCulling = disableCulling; - clientObject.xRot = xRot; - clientObject.yRot = yRot; - clientObject.zRot = zRot; clientObject.block = block; return clientObject; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java index 0aeb1f3c5..2743b57b2 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/BoxObject.java @@ -6,8 +6,11 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.BoxRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import net.minecraft.network.FriendlyByteBuf; +import java.util.Optional; import java.util.UUID; public class BoxObject extends ThreeDimensionalObject { @@ -31,43 +34,16 @@ public void encode(FriendlyByteBuf buffer) { } public static BoxObject decode(FriendlyByteBuf buffer) { - int objectId = buffer.readInt(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + Optional optionalObject = RenderableObject.baseDecode(buffer, BoxObject::new); + if (optionalObject.isEmpty()) return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - float opacity = buffer.readFloat(); - float x = buffer.readFloat(); - float y = buffer.readFloat(); - float z = buffer.readFloat(); - float maxX = buffer.readFloat(); - float maxY = buffer.readFloat(); - float maxZ = buffer.readFloat(); boolean disableDepthTest = buffer.readBoolean(); - boolean disableCulling = buffer.readBoolean(); - float xRot = buffer.readFloat(); - float yRot = buffer.readFloat(); - float zRot = buffer.readFloat(); + boolean disableCulling = buffer.readBoolean();; - BoxObject clientObject = new BoxObject(player); - clientObject.setId(objectId); - clientObject.color = color; - clientObject.opacity = opacity; - clientObject.x = x; - clientObject.y = y; - clientObject.z = z; - clientObject.maxX = maxX; - clientObject.maxY = maxY; - clientObject.maxZ = maxZ; + BoxObject clientObject = optionalObject.get(); clientObject.disableDepthTest = disableDepthTest; clientObject.disableCulling = disableCulling; - clientObject.xRot = xRot; - clientObject.yRot = yRot; - clientObject.zRot = zRot; return clientObject; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java index 781c600e7..6e93a6014 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/SphereObject.java @@ -7,10 +7,13 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.SphereRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import net.minecraft.network.FriendlyByteBuf; +import java.util.Optional; import java.util.UUID; public class SphereObject extends ThreeDimensionalObject { @@ -79,47 +82,20 @@ public void encode(FriendlyByteBuf buffer) { } public static SphereObject decode(FriendlyByteBuf buffer) { - int objectId = buffer.readInt(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + Optional optionalObject = RenderableObject.baseDecode(buffer, SphereObject::new); + if (optionalObject.isEmpty()) return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - float opacity = buffer.readFloat(); - - float x = buffer.readFloat(); - float y = buffer.readFloat(); - float z = buffer.readFloat(); - float maxX = buffer.readFloat(); - float maxY = buffer.readFloat(); - float maxZ = buffer.readFloat(); + boolean disableDepthTest = buffer.readBoolean(); boolean disableCulling = buffer.readBoolean(); - float xRot = buffer.readFloat(); - float yRot = buffer.readFloat(); - float zRot = buffer.readFloat(); int sectors = buffer.readInt(); int stacks = buffer.readInt(); float radius = buffer.readFloat(); - SphereObject clientObject = new SphereObject(player); - clientObject.setId(objectId); - clientObject.color = color; - clientObject.opacity = opacity; - clientObject.x = x; - clientObject.y = y; - clientObject.z = z; - clientObject.maxX = maxX; - clientObject.maxY = maxY; - clientObject.maxZ = maxZ; + SphereObject clientObject = optionalObject.get(); clientObject.disableDepthTest = disableDepthTest; clientObject.disableCulling = disableCulling; - clientObject.xRot = xRot; - clientObject.yRot = yRot; - clientObject.zRot = zRot; clientObject.sectors = sectors; clientObject.stacks = stacks; clientObject.radius = radius; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java index 2c219edbf..71114bf45 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/ThreeDimensionalObject.java @@ -4,7 +4,7 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; -import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import net.minecraft.network.FriendlyByteBuf; @@ -19,15 +19,6 @@ public abstract class ThreeDimensionalObject extends RenderableObject { @BooleanProperty public boolean disableCulling = false; - @FloatingNumberProperty(min = 0, max = 360) - public float xRot = 0f; - - @FloatingNumberProperty(min = 0, max = 360) - public float yRot = 0f; - - @FloatingNumberProperty(min = 0, max = 360) - public float zRot = 0f; - public ThreeDimensionalObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); } @@ -58,48 +49,12 @@ public final boolean getCulling() { return disableCulling; } - @LuaFunction - public final void setXRot(double xRot) { - this.xRot = (float) xRot; - getModule().update(this); - } - - @LuaFunction - public final double getXRot() { - return xRot; - } - - @LuaFunction - public final void setYRot(double yRot) { - this.yRot = (float) yRot; - getModule().update(this); - } - - @LuaFunction - public final double getYRot() { - return yRot; - } - - @LuaFunction - public final void setZRot(double zRot) { - this.zRot = (float) zRot; - getModule().update(this); - } - - @LuaFunction - public final double getZRot() { - return zRot; - } - @Override public void encode(FriendlyByteBuf buffer) { super.encode(buffer); buffer.writeBoolean(disableDepthTest); buffer.writeBoolean(disableCulling); - buffer.writeFloat(xRot); - buffer.writeFloat(yRot); - buffer.writeFloat(zRot); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/TorusObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/TorusObject.java index d47c300ee..0bf411ab3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/TorusObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/three_dim/TorusObject.java @@ -7,10 +7,13 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.threedim.TorusRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.CircleObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import net.minecraft.network.FriendlyByteBuf; +import java.util.Optional; import java.util.UUID; public class TorusObject extends ThreeDimensionalObject { @@ -94,49 +97,21 @@ public void encode(FriendlyByteBuf buffer) { } public static TorusObject decode(FriendlyByteBuf buffer) { - int objectId = buffer.readInt(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + Optional optionalObject = RenderableObject.baseDecode(buffer, TorusObject::new); + if (optionalObject.isEmpty()) return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - float opacity = buffer.readFloat(); - - float x = buffer.readFloat(); - float y = buffer.readFloat(); - float z = buffer.readFloat(); - float maxX = buffer.readFloat(); - float maxY = buffer.readFloat(); - float maxZ = buffer.readFloat(); boolean disableDepthTest = buffer.readBoolean(); boolean disableCulling = buffer.readBoolean(); - float xRot = buffer.readFloat(); - float yRot = buffer.readFloat(); - float zRot = buffer.readFloat(); int sectors = buffer.readInt(); int stacks = buffer.readInt(); float minorRadius = buffer.readFloat(); float majorRadius = buffer.readFloat(); - TorusObject clientObject = new TorusObject(player); - clientObject.setId(objectId); - clientObject.color = color; - clientObject.opacity = opacity; - clientObject.x = x; - clientObject.y = y; - clientObject.z = z; - clientObject.maxX = maxX; - clientObject.maxY = maxY; - clientObject.maxZ = maxZ; + TorusObject clientObject = optionalObject.get(); clientObject.disableDepthTest = disableDepthTest; clientObject.disableCulling = disableCulling; - clientObject.xRot = xRot; - clientObject.yRot = yRot; - clientObject.zRot = zRot; clientObject.sides = sectors; clientObject.rings = stacks; clientObject.minorRadius = minorRadius; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java index 8796fd0e6..6cabbd143 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/CircleObject.java @@ -7,9 +7,13 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.CircleRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; import net.minecraft.network.FriendlyByteBuf; +import owmii.powah.lib.client.util.Render; +import java.util.Optional; import java.util.UUID; public class CircleObject extends RenderableObject { @@ -20,6 +24,18 @@ public class CircleObject extends RenderableObject { @FixedPointNumberProperty(min = -32767, max = 32767) public int radius = 0; + @BooleanProperty + public boolean filled = true; + + @BooleanProperty + public boolean pixelated = false; + + @FixedPointNumberProperty(min = 0, max = 32767) + public int borderWidth = 4; + + @FixedPointNumberProperty(min = 0, max = 100) + public int segments = 25; + public CircleObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); reflectivelyMapProperties(arguments); @@ -40,43 +56,78 @@ public void setRadius(int radius) { getModule().update(this); } + @LuaFunction + public boolean isFilled() { + return filled; + } + + @LuaFunction + public void setFilled(boolean filled) { + this.filled = filled; + getModule().update(this); + } + + @LuaFunction + public boolean isPixelated() { + return pixelated; + } + + @LuaFunction + public void setPixelated(boolean pixelated) { + this.pixelated = pixelated; + getModule().update(this); + } + + @LuaFunction + public int getBorderWidth() { + return borderWidth; + } + + @LuaFunction + public void setBorderWidth(int borderWidth) { + this.borderWidth = borderWidth; + getModule().update(this); + } + + @LuaFunction + public int getSegments() { + return segments; + } + + @LuaFunction + public void setSegments(int segments) { + this.segments = segments; + getModule().update(this); + } + @Override public void encode(FriendlyByteBuf buffer) { buffer.writeInt(TYPE_ID); super.encode(buffer); buffer.writeInt(radius); + buffer.writeBoolean(filled); + buffer.writeBoolean(pixelated); + buffer.writeInt(borderWidth); + buffer.writeInt(segments); } public static CircleObject decode(FriendlyByteBuf buffer) { - int objectId = buffer.readInt(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + Optional optionalObject = RenderableObject.baseDecode(buffer, CircleObject::new); + if (optionalObject.isEmpty()) return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - float opacity = buffer.readFloat(); - - float x = buffer.readFloat(); - float y = buffer.readFloat(); - float z = buffer.readFloat(); - float maxX = buffer.readFloat(); - float maxY = buffer.readFloat(); - float maxZ = buffer.readFloat(); + int radius = buffer.readInt(); + boolean filled = buffer.readBoolean(); + boolean pixelated = buffer.readBoolean(); + int borderWidth = buffer.readInt(); + int segments = buffer.readInt(); - CircleObject clientObject = new CircleObject(player); - clientObject.setId(objectId); - clientObject.color = color; - clientObject.opacity = opacity; - clientObject.x = x; - clientObject.y = y; - clientObject.z = z; - clientObject.maxX = maxX; - clientObject.maxY = maxY; - clientObject.maxZ = maxZ; + CircleObject clientObject = optionalObject.get(); clientObject.radius = radius; + clientObject.filled = filled; + clientObject.pixelated = pixelated; + clientObject.borderWidth = borderWidth; + clientObject.segments = segments; return clientObject; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java index c463fe885..0c3a9ace4 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/ItemObject.java @@ -6,9 +6,11 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ItemRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; import net.minecraft.network.FriendlyByteBuf; +import java.util.Optional; import java.util.UUID; public class ItemObject extends RenderableObject { @@ -44,34 +46,13 @@ public void encode(FriendlyByteBuf buffer) { } public static ItemObject decode(FriendlyByteBuf buffer) { - int objectId = buffer.readInt(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + Optional optionalObject = RenderableObject.baseDecode(buffer, ItemObject::new); + if (optionalObject.isEmpty()) return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - float opacity = buffer.readFloat(); - - float x = buffer.readFloat(); - float y = buffer.readFloat(); - float z = buffer.readFloat(); - float maxX = buffer.readFloat(); - float maxY = buffer.readFloat(); - float maxZ = buffer.readFloat(); + String item = buffer.readUtf(); - ItemObject clientObject = new ItemObject(player); - clientObject.setId(objectId); - clientObject.color = color; - clientObject.opacity = opacity; - clientObject.x = x; - clientObject.y = y; - clientObject.z = z; - clientObject.maxX = maxX; - clientObject.maxY = maxY; - clientObject.maxZ = maxZ; + ItemObject clientObject = optionalObject.get(); clientObject.item = item; return clientObject; diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/LineObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/LineObject.java new file mode 100644 index 000000000..8589c8343 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/LineObject.java @@ -0,0 +1,97 @@ +package de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; +import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.LineRenderer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FixedPointNumberProperty; +import net.minecraft.network.FriendlyByteBuf; + +import java.util.Optional; +import java.util.UUID; + +/** + * Just a line + */ +public class LineObject extends RenderableObject { + public static final int TYPE_ID = 8; + + @BooleanProperty + public boolean pixelated = false; + + @FixedPointNumberProperty(min = 0, max = 32767) + public int pixelSize = 4; + + private final IObjectRenderer renderer = new LineRenderer(); + + public LineObject(OverlayModule module, IArguments arguments) throws LuaException { + super(module, arguments); + reflectivelyMapProperties(arguments); + } + + /** + * constructor for the client side initialization + * + * @param player the target player + */ + public LineObject(UUID player) { + super(player); + } + + @LuaFunction + public void setPixelated(boolean pixelated) { + this.pixelated = pixelated; + getModule().update(this); + } + + @LuaFunction + public boolean isPixelated() { + return pixelated; + } + + @LuaFunction + public void setPixelSize(int pixelSize) { + this.pixelSize = pixelSize; + getModule().update(this); + } + + @LuaFunction + public int getPixelSize() { + return pixelSize; + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeInt(TYPE_ID); + super.encode(buffer); + buffer.writeBoolean(pixelated); + buffer.writeInt(pixelSize); + } + + public static LineObject decode(FriendlyByteBuf buffer) { + Optional optionalObject = RenderableObject.baseDecode(buffer, LineObject::new); + if (optionalObject.isEmpty()) + return null; + + boolean pixelated = buffer.readBoolean(); + int pixelSize = buffer.readInt(); + + LineObject clientObject = optionalObject.get(); + + clientObject.pixelated = pixelated; + clientObject.pixelSize = pixelSize; + + return clientObject; + + } + + @Override + public IObjectRenderer getRenderObject() { + return renderer; + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java index 3f618b638..4656c80c7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java @@ -6,8 +6,11 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.RectangleRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.network.FriendlyByteBuf; +import org.w3c.dom.css.Rect; +import java.util.Optional; import java.util.UUID; /** @@ -38,34 +41,8 @@ public void encode(FriendlyByteBuf buffer) { } public static RectangleObject decode(FriendlyByteBuf buffer) { - int objectId = buffer.readInt(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); - return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - float opacity = buffer.readFloat(); - - float x = buffer.readFloat(); - float y = buffer.readFloat(); - float z = buffer.readFloat(); - float maxX = buffer.readFloat(); - float maxY = buffer.readFloat(); - float maxZ = buffer.readFloat(); - RectangleObject clientObject = new RectangleObject(player); - clientObject.setId(objectId); - clientObject.color = color; - clientObject.opacity = opacity; - clientObject.x = x; - clientObject.y = y; - clientObject.z = z; - clientObject.maxX = maxX; - clientObject.maxY = maxY; - clientObject.maxZ = maxZ; - - return clientObject; + Optional optionalObject = RenderableObject.baseDecode(buffer, RectangleObject::new); + return optionalObject.orElse(null); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java index bf628ac41..903629c2d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java @@ -7,11 +7,13 @@ import de.srendi.advancedperipherals.client.smartglasses.objects.IObjectRenderer; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.TextRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.BooleanProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.FloatingNumberProperty; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.propertytypes.StringProperty; import net.minecraft.network.FriendlyByteBuf; +import java.util.Optional; import java.util.UUID; public class TextObject extends RenderableObject { @@ -85,36 +87,15 @@ public void encode(FriendlyByteBuf buffer) { } public static TextObject decode(FriendlyByteBuf buffer) { - int objectId = buffer.readInt(); - boolean hasValidUUID = buffer.readBoolean(); - if (!hasValidUUID) { - AdvancedPeripherals.exception("Tried to decode a buffer for an OverlayObject but without a valid player as target.", new IllegalArgumentException()); + Optional optionalObject = RenderableObject.baseDecode(buffer, TextObject::new); + if (optionalObject.isEmpty()) return null; - } - UUID player = buffer.readUUID(); - int color = buffer.readInt(); - float opacity = buffer.readFloat(); - - float x = buffer.readFloat(); - float y = buffer.readFloat(); - float z = buffer.readFloat(); - float maxX = buffer.readFloat(); - float maxY = buffer.readFloat(); - float maxZ = buffer.readFloat(); + String content = buffer.readUtf(); float fontSize = buffer.readFloat(); boolean shadow = buffer.readBoolean(); - TextObject clientObject = new TextObject(player); - clientObject.setId(objectId); - clientObject.color = color; - clientObject.opacity = opacity; - clientObject.x = x; - clientObject.y = y; - clientObject.z = z; - clientObject.maxX = maxX; - clientObject.maxY = maxY; - clientObject.maxZ = maxZ; + TextObject clientObject = optionalObject.get(); clientObject.content = content; clientObject.fontSize = fontSize; clientObject.shadow = shadow; From 7f32526702459239937d917f97637336da962ccd Mon Sep 17 00:00:00 2001 From: Srendi Date: Fri, 25 Jul 2025 12:32:14 +0200 Subject: [PATCH 184/188] Add screen size functions which are synced from the client to the server --- .../common/network/APNetworking.java | 5 ++ .../OverlayModuleClientRequestPacket.java | 36 +++++++++++ .../OverlayModuleClientInfoPacket.java | 63 +++++++++++++++++++ .../smartglasses/SmartGlassesComputer.java | 5 ++ .../modules/ModulePeripheral.java | 9 ++- .../overlay/OverlayGlassesFunctions.java | 8 ++- .../modules/overlay/OverlayModule.java | 38 ++++++++--- 7 files changed, 152 insertions(+), 12 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toclient/OverlayModuleClientRequestPacket.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/network/toserver/OverlayModuleClientInfoPacket.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java index d007a4b1d..fd6f78a8e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java +++ b/src/main/java/de/srendi/advancedperipherals/common/network/APNetworking.java @@ -2,6 +2,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.network.toclient.OverlayModuleClientRequestPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectBulkSyncPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket; @@ -9,6 +10,7 @@ import de.srendi.advancedperipherals.common.network.toclient.SaddleTurtleInfoPacket; import de.srendi.advancedperipherals.common.network.toclient.ToastToClientPacket; import de.srendi.advancedperipherals.common.network.toserver.GlassesHotkeyPacket; +import de.srendi.advancedperipherals.common.network.toserver.OverlayModuleClientInfoPacket; import de.srendi.advancedperipherals.common.network.toserver.SaddleTurtleControlPacket; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; @@ -44,8 +46,11 @@ public static void init() { registerServerToClient(RenderableObjectDeletePacket.class, RenderableObjectDeletePacket::decode); registerServerToClient(RenderableObjectClearPacket.class, RenderableObjectClearPacket::decode); registerServerToClient(RenderableObjectBulkSyncPacket.class, RenderableObjectBulkSyncPacket::decode); + registerServerToClient(OverlayModuleClientRequestPacket.class, OverlayModuleClientRequestPacket::decode); + registerClientToServer(GlassesHotkeyPacket.class, GlassesHotkeyPacket::decode); registerClientToServer(SaddleTurtleControlPacket.class, SaddleTurtleControlPacket::decode); + registerClientToServer(OverlayModuleClientInfoPacket.class, OverlayModuleClientInfoPacket::decode); } public static void registerServerToClient(Class packet, Function decode) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toclient/OverlayModuleClientRequestPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/OverlayModuleClientRequestPacket.java new file mode 100644 index 000000000..7051d3f49 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toclient/OverlayModuleClientRequestPacket.java @@ -0,0 +1,36 @@ +package de.srendi.advancedperipherals.common.network.toclient; + +import de.srendi.advancedperipherals.client.smartglasses.OverlayObjectHolder; +import de.srendi.advancedperipherals.common.addons.minecolonies.MineColonies; +import de.srendi.advancedperipherals.common.network.APNetworking; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.network.toserver.OverlayModuleClientInfoPacket; +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +public class OverlayModuleClientRequestPacket implements IPacket { + + public OverlayModuleClientRequestPacket() { + + } + + @Override + public void handle(NetworkEvent.Context context) { + Minecraft minecraft = Minecraft.getInstance(); + + int sizeX = minecraft.getWindow().getWidth(), sizeY = minecraft.getWindow().getHeight(); + double guiScale = minecraft.getWindow().getGuiScale(); + + APNetworking.sendToServer(new OverlayModuleClientInfoPacket(minecraft.player.getUUID(), sizeX, sizeY, guiScale)); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + + } + + public static OverlayModuleClientRequestPacket decode(FriendlyByteBuf buffer) { + return new OverlayModuleClientRequestPacket(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/network/toserver/OverlayModuleClientInfoPacket.java b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/OverlayModuleClientInfoPacket.java new file mode 100644 index 000000000..5f9b33f26 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/network/toserver/OverlayModuleClientInfoPacket.java @@ -0,0 +1,63 @@ +package de.srendi.advancedperipherals.common.network.toserver; + +import de.srendi.advancedperipherals.common.items.SmartGlassesItem; +import de.srendi.advancedperipherals.common.network.base.IPacket; +import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.OverlayModule; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.server.ServerLifecycleHooks; + +import java.util.UUID; + +public class OverlayModuleClientInfoPacket implements IPacket { + + private final UUID player; + private final int screenWidth; + private final int screenHeight; + private final double guiScale; + + public OverlayModuleClientInfoPacket(UUID player, int screenWidth, int screenHeight, double guiScale) { + this.player = player; + this.screenWidth = screenWidth; + this.screenHeight = screenHeight; + this.guiScale = guiScale; + } + + @Override + public void handle(NetworkEvent.Context context) { + MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + + ServerPlayer serverPlayer = server.getPlayerList().getPlayer(player); + if (serverPlayer == null) + return; + + for (ItemStack stack : serverPlayer.getAllSlots()) { + if (stack.getItem() instanceof SmartGlassesItem) { + SmartGlassesComputer computer = SmartGlassesItem.getServerComputer(server, stack); + + if (computer != null) { + OverlayModule module = computer.getModule(OverlayModule.class); + + if (module != null) + module.setScreenSizes(screenWidth, screenHeight, guiScale); + } + } + } + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeUUID(player); + buffer.writeInt(screenWidth); + buffer.writeInt(screenHeight); + buffer.writeDouble(guiScale); + } + + public static OverlayModuleClientInfoPacket decode(FriendlyByteBuf buffer) { + return new OverlayModuleClientInfoPacket(buffer.readUUID(), buffer.readInt(), buffer.readInt(), buffer.readDouble()); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java index 2880f55f4..e76a5ee0c 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/SmartGlassesComputer.java @@ -247,6 +247,11 @@ public Map getModules() { return modules; } + @Nullable + public T getModule(Class module) { + return modules.values().stream().filter(module::isInstance).map(module::cast).findFirst().orElse(null); + } + @Override protected void onRemoved() { super.onRemoved(); diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java index 760b03ed2..14aef19d0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/ModulePeripheral.java @@ -3,6 +3,7 @@ import dan200.computercraft.api.lua.LuaFunction; import de.srendi.advancedperipherals.common.smartglasses.SmartGlassesComputer; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; +import org.jetbrains.annotations.NotNull; public class ModulePeripheral extends BasePeripheral { @@ -10,11 +11,10 @@ public class ModulePeripheral extends BasePeripheral { public ModulePeripheral(SmartGlassesComputer computer) { super(PERIPHERAL_TYPE, new ModulePeripheralOwner(computer)); - } public void updateModules() { - // We need to set the initialisation to false so the dynamic peripheral re-builds the plugins + // We need to set the initialization to false so the dynamic peripheral re-builds the plugins clearAllPlugins(); SmartGlassesComputer computer = getPeripheralOwner().getComputer(); @@ -35,4 +35,9 @@ public boolean isEnabled() { public final String[] getModules() { return getPeripheralOwner().getComputer().getModules().values().stream().map(module -> module.getName().toString()).toArray(String[]::new); } + + @LuaFunction(mainThread = true) + public final boolean hasModule(@NotNull String module) { + return getPeripheralOwner().getComputer().getModules().values().stream().anyMatch(m -> m.getName().toString().equals(module)); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java index b27b2ad94..b9bd68184 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayGlassesFunctions.java @@ -122,10 +122,14 @@ public final MethodResult getObjectsSize() { return MethodResult.of(overlayModule.getObjects().size()); } - // TODO: This will crash on dedicated servers @LuaFunction public final MethodResult getSize() { - return MethodResult.of(Minecraft.getInstance().getWindow().getWidth(), Minecraft.getInstance().getWindow().getHeight()); + return MethodResult.of(overlayModule.getScreenWidth(), overlayModule.getScreenHeight()); + } + + @LuaFunction + public final MethodResult getGuiScale() { + return MethodResult.of(overlayModule.getGuiScale()); } @LuaFunction diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java index e239fb020..d56776558 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/OverlayModule.java @@ -2,6 +2,7 @@ import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.network.APNetworking; +import de.srendi.advancedperipherals.common.network.toclient.OverlayModuleClientRequestPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectBulkSyncPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectClearPacket; import de.srendi.advancedperipherals.common.network.toclient.RenderableObjectDeletePacket; @@ -11,7 +12,10 @@ import de.srendi.advancedperipherals.common.smartglasses.modules.IModuleFunctions; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -19,10 +23,6 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -/** - * We want to support scripts which were made for the plethora classes. So we call this item the same as the overlay item from plethora - * We'll first add our own implementation for a rendering system and then add the API endpoints for plethora scripts - */ public class OverlayModule implements IModule { public final ConcurrentHashMap objects = new ConcurrentHashMap<>(); @@ -32,6 +32,10 @@ public class OverlayModule implements IModule { public boolean autoUpdate = true; private int idCounter = 0; + private int screenWidth = 0; + private int screenHeight = 0; + private double guiScale = 1; + public OverlayModule(SmartGlassesAccess access) { this.access = access; } @@ -48,11 +52,29 @@ public IModuleFunctions getFunctions(SmartGlassesAccess smartGlassesAccess) { @Override public void tick(@NotNull SmartGlassesAccess smartGlassesAccess) { - /* + Entity entity = smartGlassesAccess.getEntity(); - if (entity != null && entity.getLevel().getGameTime() % 20 == 0) - AdvancedPeripherals.LOGGER.info("I'm an overlay module! And I'm alive!"); - */ + if (entity instanceof ServerPlayer player && entity.getLevel().getGameTime() % 2 == 0) { + APNetworking.sendTo(new OverlayModuleClientRequestPacket(), player); + } + } + + public void setScreenSizes(int screenWidth, int screenHeight, double guiScale) { + this.screenWidth = screenWidth; + this.screenHeight = screenHeight; + this.guiScale = guiScale; + } + + public int getScreenWidth() { + return screenWidth; + } + + public int getScreenHeight() { + return screenHeight; + } + + public double getGuiScale() { + return guiScale; } public SmartGlassesAccess getAccess() { From 94d236feb64a0cc61a76fbed9340ce8365abc080 Mon Sep 17 00:00:00 2001 From: Srendi Date: Sat, 9 Aug 2025 14:12:36 +0200 Subject: [PATCH 185/188] Port bridge changes from 1.21.1 back --- .../objects/twodim/RectangleRenderer.java | 8 +- .../objects/twodim/TextRenderer.java | 14 +- .../common/addons/APAddons.java | 4 +- .../addons/ae2/{AppEngApi.java => AEApi.java} | 60 +-- ...tener.java => MEBridgeEntityListener.java} | 4 +- ...eFluidHandler.java => MEFluidHandler.java} | 9 +- ...{MeItemHandler.java => MEItemHandler.java} | 9 +- ...eripheral.java => MEBridgePeripheral.java} | 397 ++++++++---------- .../peripheral/RsBridgePeripheral.java | 296 ++++++------- .../{RefinedStorage.java => RSApi.java} | 8 +- .../{RefinedStorageNode.java => RSNode.java} | 4 +- .../addons/refinedstorage/RsFluidHandler.java | 2 +- .../addons/refinedstorage/RsItemHandler.java | 2 +- .../blocks/blockentities/MeBridgeEntity.java | 18 +- .../blocks/blockentities/RsBridgeEntity.java | 8 +- .../overlay/objects/RenderableObject.java | 1 + .../objects/two_dim/RectangleObject.java | 1 + .../overlay/objects/two_dim/TextObject.java | 32 +- .../common/util/StatusConstants.java | 49 +++ .../inventory/IStorageSystemPeripheral.java | 112 +++-- 20 files changed, 471 insertions(+), 567 deletions(-) rename src/main/java/de/srendi/advancedperipherals/common/addons/ae2/{AppEngApi.java => AEApi.java} (94%) rename src/main/java/de/srendi/advancedperipherals/common/addons/ae2/{MeBridgeEntityListener.java => MEBridgeEntityListener.java} (81%) rename src/main/java/de/srendi/advancedperipherals/common/addons/ae2/{MeFluidHandler.java => MEFluidHandler.java} (83%) rename src/main/java/de/srendi/advancedperipherals/common/addons/ae2/{MeItemHandler.java => MEItemHandler.java} (84%) rename src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/{MeBridgePeripheral.java => MEBridgePeripheral.java} (61%) rename src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/{RefinedStorage.java => RSApi.java} (99%) rename src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/{RefinedStorageNode.java => RSNode.java} (88%) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/StatusConstants.java diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java index 7212596f1..ef203870e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java @@ -30,10 +30,10 @@ public void renderBatch(List objects, ForgeGui gui, PoseStack float green = RenderUtil.getGreen(obj.color); float blue = RenderUtil.getBlue(obj.color); - bufferbuilder.vertex(matrix, obj.x, obj.maxY, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, obj.maxX, obj.maxY, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, obj.maxX, obj.y, 0f).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, obj.x, obj.y, 0f).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.x, obj.maxY, obj.z).color(red, green, blue, 0.0001f).endVertex(); + bufferbuilder.vertex(matrix, obj.maxX, obj.maxY, obj.z).color(red, green, blue, 0.00f).endVertex(); + bufferbuilder.vertex(matrix, obj.maxX, obj.y, obj.z).color(red, green, blue, 0.0f).endVertex(); + bufferbuilder.vertex(matrix, obj.x, obj.y, obj.z).color(red, green, blue, 0f).endVertex(); } BufferUploader.drawWithShader(bufferbuilder.end()); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java index 570020a49..ac7c37163 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java @@ -12,16 +12,24 @@ public class TextRenderer implements ITwoDObjectRenderer { @Override public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { - Minecraft minecraft = Minecraft.getInstance(); for (RenderableObject obj : objects) { TextObject text = (TextObject) obj; + poseStack.pushPose(); poseStack.scale(text.fontSize, text.fontSize, 1); + + float x = text.x; + + if (text.center) { + x -= (minecraft.font.width(text.content) * text.fontSize) / 2f; + } + if (text.shadow) { - minecraft.font.drawShadow(poseStack, text.content, text.x / text.fontSize, text.y / text.fontSize, text.color); + minecraft.font.drawShadow(poseStack, text.content, x / text.fontSize, text.y / text.fontSize, text.color); } else { - minecraft.font.draw(poseStack, text.content, text.x / text.fontSize, text.y / text.fontSize, text.color); + minecraft.font.draw(poseStack, text.content, x / text.fontSize, text.y / text.fontSize, text.color); } + poseStack.popPose(); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java index 9e209e822..bdc4e4265 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/APAddons.java @@ -1,7 +1,7 @@ package de.srendi.advancedperipherals.common.addons; import de.srendi.advancedperipherals.AdvancedPeripherals; -import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorage; +import de.srendi.advancedperipherals.common.addons.refinedstorage.RSApi; import de.srendi.advancedperipherals.common.addons.valkyrienskies.ValkyrienSkies; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; @@ -65,7 +65,7 @@ public class APAddons { vs2Loaded = modList.isLoaded(VALKYRIEN_SKIES_MODID); if (refinedStorageLoaded) { - RefinedStorage.instance = new RefinedStorage(); + RSApi.instance = new RSApi(); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AppEngApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AEApi.java similarity index 94% rename from src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AppEngApi.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AEApi.java index 4ba53c7e5..5aa8ffa91 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AppEngApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AEApi.java @@ -62,7 +62,7 @@ import java.util.Set; import java.util.stream.Collectors; -public class AppEngApi { +public class AEApi { public static Pair findAEStackFromStack(MEStorage monitor, @Nullable ICraftingService crafting, ItemStack item) { return findAEStackFromFilter(monitor, crafting, ItemFilter.fromStack(item)); @@ -238,7 +238,7 @@ public static List getPatterns(IGrid grid, Level level) { } public static List listPatterns(IGrid grid, Level level) { - return getPatterns(grid, level).stream().map(AppEngApi::parsePattern).collect(Collectors.toList()); + return getPatterns(grid, level).stream().map(AEApi::parsePattern).collect(Collectors.toList()); } public static List listDrives(IGrid grid) { @@ -367,8 +367,8 @@ private static Map parseChemStack(Pair stack) public static Map parsePattern(IPatternDetails pattern) { Map map = new HashMap<>(); - map.put("inputs", Arrays.stream(pattern.getInputs()).map(AppEngApi::parsePatternInput).collect(Collectors.toList())); - map.put("outputs", Arrays.stream(pattern.getOutputs()).map(AppEngApi::parseGenericStack).collect(Collectors.toList())); + map.put("inputs", Arrays.stream(pattern.getInputs()).map(AEApi::parsePatternInput).collect(Collectors.toList())); + map.put("outputs", Arrays.stream(pattern.getOutputs()).map(AEApi::parseGenericStack).collect(Collectors.toList())); map.put("primaryOutput", parseGenericStack(pattern.getPrimaryOutput())); return map; } @@ -378,7 +378,7 @@ public static Map parsePatternInput(IPatternDetails.IInput patte map.put("primaryInput", parseGenericStack(patternInput.getPossibleInputs()[0])); map.put("possibleInputs", Arrays.stream(Arrays.copyOfRange(patternInput.getPossibleInputs(), 1, patternInput.getPossibleInputs().length)) - .map(AppEngApi::parseGenericStack)); + .map(AEApi::parseGenericStack)); map.put("multiplier", patternInput.getMultiplier()); map.put("remaining", patternInput.getRemainingKey(patternInput.getPossibleInputs()[0].what())); return map; @@ -417,14 +417,8 @@ public static MEStorage getMonitor(IGridNode node) { return node.getGrid().getService(IStorageService.class).getInventory(); } - public static boolean isItemCrafting(MEStorage monitor, ICraftingService grid, ItemFilter filter, + public static boolean isCrafting(ICraftingService grid, GenericFilter filter, @Nullable ICraftingCPU craftingCPU) { - Pair stack = AppEngApi.findAEStackFromFilter(monitor, grid, filter); - - // If the item stack does not exist, it cannot be crafted. - if (stack == null) - return false; - // If the passed cpu is null, check all cpus if (craftingCPU == null) { // Loop through all crafting cpus and check if the item is being crafted. @@ -436,45 +430,7 @@ public static boolean isItemCrafting(MEStorage monitor, ICraftingService grid, I if (jobStatus == null) continue; - if (jobStatus.crafting().what().equals(stack.getRight())) - return true; - } - } - } else { - if (craftingCPU.isBusy()) { - CraftingJobStatus jobStatus = craftingCPU.getJobStatus(); - - // avoid null pointer exception - if (jobStatus == null) - return false; - - return jobStatus.crafting().what().equals(stack.getRight()); - } - } - - return false; - } - - public static boolean isFluidCrafting(MEStorage monitor, ICraftingService grid, FluidFilter filter, - @Nullable ICraftingCPU craftingCPU) { - Pair stack = AppEngApi.findAEFluidFromFilter(monitor, grid, filter); - - // If the fluid stack does not exist, it cannot be crafted. - if (stack == null) - return false; - - // If the passed cpu is null, check all cpus - if (craftingCPU == null) { - // Loop through all crafting cpus and check if the fluid is being crafted. - for (ICraftingCPU cpu : grid.getCpus()) { - if (cpu.isBusy()) { - CraftingJobStatus jobStatus = cpu.getJobStatus(); - - // avoid null pointer exception - if (jobStatus == null) - continue; - - if (jobStatus.crafting().what().equals(stack.getRight())) + if (filter.testAE(jobStatus.crafting())) return true; } } @@ -486,7 +442,7 @@ public static boolean isFluidCrafting(MEStorage monitor, ICraftingService grid, if (jobStatus == null) return false; - return jobStatus.crafting().what().equals(stack.getRight()); + return filter.testAE(jobStatus.crafting()); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeBridgeEntityListener.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MEBridgeEntityListener.java similarity index 81% rename from src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeBridgeEntityListener.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MEBridgeEntityListener.java index 009b6e8df..439caf900 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeBridgeEntityListener.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MEBridgeEntityListener.java @@ -4,9 +4,9 @@ import appeng.api.networking.IGridNodeListener; import de.srendi.advancedperipherals.common.blocks.blockentities.MeBridgeEntity; -public class MeBridgeEntityListener implements IGridNodeListener { +public class MEBridgeEntityListener implements IGridNodeListener { - public static final MeBridgeEntityListener INSTANCE = new MeBridgeEntityListener(); + public static final MEBridgeEntityListener INSTANCE = new MEBridgeEntityListener(); @Override public void onSecurityBreak(MeBridgeEntity nodeOwner, IGridNode node) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MEFluidHandler.java similarity index 83% rename from src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeFluidHandler.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MEFluidHandler.java index 4eb75c853..73936fb83 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeFluidHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MEFluidHandler.java @@ -4,6 +4,7 @@ import appeng.api.networking.security.IActionSource; import appeng.api.stacks.AEFluidKey; import appeng.api.storage.MEStorage; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MEBridgePeripheral; import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; import de.srendi.advancedperipherals.common.util.inventory.IStorageSystemFluidHandler; @@ -13,16 +14,16 @@ /** * Used to transfer item between an inventory and the ME system. * - * @see de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MeBridgePeripheral + * @see MEBridgePeripheral */ -public class MeFluidHandler implements IStorageSystemFluidHandler { +public class MEFluidHandler implements IStorageSystemFluidHandler { @NotNull private final MEStorage storageMonitor; @NotNull private final IActionSource actionSource; - public MeFluidHandler(@NotNull MEStorage storageMonitor, @NotNull IActionSource actionSource) { + public MEFluidHandler(@NotNull MEStorage storageMonitor, @NotNull IActionSource actionSource) { this.storageMonitor = storageMonitor; this.actionSource = actionSource; } @@ -40,7 +41,7 @@ public int fill(FluidStack resource, FluidAction action) { @NotNull @Override public FluidStack drain(FluidFilter filter, FluidAction simulate) { - Pair itemKey = AppEngApi.findAEFluidFromFilter(storageMonitor, null, filter); + Pair itemKey = AEApi.findAEFluidFromFilter(storageMonitor, null, filter); if (itemKey == null) return FluidStack.EMPTY; long extracted = storageMonitor.extract(itemKey.getRight(), filter.getCount(), simulate == FluidAction.SIMULATE ? Actionable.SIMULATE : Actionable.MODULATE, actionSource); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MEItemHandler.java similarity index 84% rename from src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeItemHandler.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MEItemHandler.java index 1c5655f70..4fdc79dac 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MeItemHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/MEItemHandler.java @@ -4,6 +4,7 @@ import appeng.api.networking.security.IActionSource; import appeng.api.stacks.AEItemKey; import appeng.api.storage.MEStorage; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MEBridgePeripheral; import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.inventory.IStorageSystemItemHandler; import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; @@ -13,16 +14,16 @@ /** * Used to transfer item between an inventory and the ME system. * - * @see de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MeBridgePeripheral + * @see MEBridgePeripheral */ -public class MeItemHandler implements IStorageSystemItemHandler { +public class MEItemHandler implements IStorageSystemItemHandler { @NotNull private final MEStorage storageMonitor; @NotNull private final IActionSource actionSource; - public MeItemHandler(@NotNull MEStorage storageMonitor, @NotNull IActionSource actionSource) { + public MEItemHandler(@NotNull MEStorage storageMonitor, @NotNull IActionSource actionSource) { this.storageMonitor = storageMonitor; this.actionSource = actionSource; } @@ -40,7 +41,7 @@ public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate @Override public ItemStack extractItem(ItemFilter filter, int count, boolean simulate) { - Pair itemKey = AppEngApi.findAEStackFromFilter(storageMonitor, null, filter); + Pair itemKey = AEApi.findAEStackFromFilter(storageMonitor, null, filter); if (itemKey.getRight() == null) return ItemStack.EMPTY; long extracted = storageMonitor.extract(itemKey.getRight(), count, simulate ? Actionable.SIMULATE : Actionable.MODULATE, actionSource); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MEBridgePeripheral.java similarity index 61% rename from src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MEBridgePeripheral.java index 6d028fefb..e4978a18e 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MeBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MEBridgePeripheral.java @@ -13,18 +13,20 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.MethodResult; +import dan200.computercraft.api.lua.ObjectLuaTable; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.core.apis.TableHelper; import dan200.computercraft.core.computer.ComputerSide; -import de.srendi.advancedperipherals.common.addons.ae2.AppEngApi; +import de.srendi.advancedperipherals.common.addons.ae2.AEApi; import de.srendi.advancedperipherals.common.addons.ae2.CraftJob; -import de.srendi.advancedperipherals.common.addons.ae2.MeFluidHandler; -import de.srendi.advancedperipherals.common.addons.ae2.MeItemHandler; +import de.srendi.advancedperipherals.common.addons.ae2.MEFluidHandler; +import de.srendi.advancedperipherals.common.addons.ae2.MEItemHandler; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.blocks.blockentities.MeBridgeEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.ServerWorker; +import de.srendi.advancedperipherals.common.util.StatusConstants; import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; import de.srendi.advancedperipherals.common.util.inventory.FluidUtil; import de.srendi.advancedperipherals.common.util.inventory.GenericFilter; @@ -44,13 +46,13 @@ import java.util.Map; import java.util.Optional; -public class MeBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral { +public class MEBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral { public static final String PERIPHERAL_TYPE = "me_bridge"; private final MeBridgeEntity tile; private IGridNode node; - public MeBridgePeripheral(MeBridgeEntity tileEntity) { + public MEBridgePeripheral(MeBridgeEntity tileEntity) { super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); this.tile = tileEntity; this.node = tileEntity.getActionableNode(); @@ -77,15 +79,15 @@ private ICraftingService getCraftingService() { * @return the exportable amount or null with a string if something went wrong */ protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException { - MEStorage monitor = AppEngApi.getMonitor(node); - MeItemHandler itemHandler = new MeItemHandler(monitor, tile); + MEStorage monitor = AEApi.getMonitor(node); + MEItemHandler itemHandler = new MEItemHandler(monitor, tile); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(0, filter.getRight()); if (targetInventory == null) - return MethodResult.of(0, "Target Inventory does not exist"); + return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND.toString()); return MethodResult.of(InventoryUtil.moveItem(itemHandler, targetInventory, filter.getLeft()), null); } @@ -98,15 +100,15 @@ protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable II * @return the exportable amount or null with a string if something went wrong */ protected MethodResult exportToTank(@NotNull IArguments arguments, @Nullable IFluidHandler targetTank) throws LuaException { - MEStorage monitor = AppEngApi.getMonitor(node); - MeFluidHandler fluidHandler = new MeFluidHandler(monitor, tile); + MEStorage monitor = AEApi.getMonitor(node); + MEFluidHandler fluidHandler = new MEFluidHandler(monitor, tile); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(0, filter.getRight()); if (targetTank == null) - return MethodResult.of(0, "Target Tank does not exist"); + return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND.toString()); return MethodResult.of(InventoryUtil.moveFluid(fluidHandler, targetTank, filter.getLeft()), null); } @@ -119,15 +121,15 @@ protected MethodResult exportToTank(@NotNull IArguments arguments, @Nullable IFl * @return the imported amount or null with a string if something went wrong */ protected MethodResult importToME(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException { - MEStorage monitor = AppEngApi.getMonitor(node); - MeItemHandler itemHandler = new MeItemHandler(monitor, tile); + MEStorage monitor = AEApi.getMonitor(node); + MEItemHandler itemHandler = new MEItemHandler(monitor, tile); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(0, filter.getRight()); if (targetInventory == null) - return MethodResult.of(0, "Target Inventory does not exist"); + return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND.toString()); return MethodResult.of(InventoryUtil.moveItem(targetInventory, itemHandler, filter.getLeft()), null); } @@ -140,21 +142,21 @@ protected MethodResult importToME(@NotNull IArguments arguments, @Nullable IItem * @return the imported amount or null with a string if something went wrong */ protected MethodResult importToME(@NotNull IArguments arguments, @Nullable IFluidHandler targetTank) throws LuaException { - MEStorage monitor = AppEngApi.getMonitor(node); - MeFluidHandler fluidHandler = new MeFluidHandler(monitor, tile); + MEStorage monitor = AEApi.getMonitor(node); + MEFluidHandler fluidHandler = new MEFluidHandler(monitor, tile); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(0, filter.getRight()); if (targetTank == null) - return MethodResult.of(0, "Target Tank does not exist"); + return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND.toString()); return MethodResult.of(InventoryUtil.moveFluid(targetTank, fluidHandler, filter.getLeft()), null); } - private MethodResult notConnected() { - return MethodResult.of(null, "NOT_CONNECTED"); + private MethodResult notConnected(@Nullable Object defaultValue) { + return MethodResult.of(defaultValue, StatusConstants.NOT_CONNECTED.toString()); } private boolean isAvailable() { @@ -163,8 +165,8 @@ private boolean isAvailable() { @Override @LuaFunction(mainThread = true) - public final MethodResult isConnected() { - return MethodResult.of(isAvailable()); + public final boolean isConnected() { + return isAvailable(); } @Override @@ -177,25 +179,25 @@ public MethodResult isOnline() { @LuaFunction(mainThread = true) public final MethodResult getItem(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(null); - MEStorage monitor = AppEngApi.getMonitor(node); + MEStorage monitor = AEApi.getMonitor(node); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); ItemFilter parsedFilter = filter.getLeft(); if (parsedFilter.isEmpty()) - return MethodResult.of(null, "EMPTY_FILTER"); + return MethodResult.of(null, StatusConstants.EMPTY_FILTER.toString()); - return MethodResult.of(AppEngApi.parseAeStack(AppEngApi.findAEStackFromFilter(monitor, getCraftingService(), parsedFilter), getCraftingService())); + return MethodResult.of(AEApi.parseAeStack(AEApi.findAEStackFromFilter(monitor, getCraftingService(), parsedFilter), getCraftingService())); } @Override @LuaFunction(mainThread = true) public MethodResult getFluid(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(null); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -203,9 +205,9 @@ public MethodResult getFluid(IArguments arguments) throws LuaException { FluidFilter parsedFilter = filter.getLeft(); if (parsedFilter.isEmpty()) - return MethodResult.of(null, "EMPTY_FILTER"); + return MethodResult.of(null, StatusConstants.EMPTY_FILTER.toString()); - return MethodResult.of(AppEngApi.parseAeStack(AppEngApi.findAEFluidFromFilter(AppEngApi.getMonitor(node), getCraftingService(), parsedFilter), getCraftingService())); + return MethodResult.of(AEApi.parseAeStack(AEApi.findAEFluidFromFilter(AEApi.getMonitor(node), getCraftingService(), parsedFilter), getCraftingService())); } @Override @@ -215,73 +217,73 @@ public MethodResult getChemical(IArguments arguments) throws LuaException { @Override @LuaFunction(mainThread = true) - public final MethodResult listItems() { + public final MethodResult getItems(IArguments arguments) { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(AppEngApi.listStacks(AppEngApi.getMonitor(node), getCraftingService())); + return MethodResult.of(AEApi.listStacks(AEApi.getMonitor(node), getCraftingService())); } @Override @LuaFunction(mainThread = true) - public final MethodResult listFluids() { + public final MethodResult getFluids(IArguments arguments) { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(AppEngApi.listFluids(AppEngApi.getMonitor(node), getCraftingService())); + return MethodResult.of(AEApi.listFluids(AEApi.getMonitor(node), getCraftingService())); } @Override - public MethodResult listChemicals() { + public MethodResult getChemicals(IArguments arguments) { return null; } @Override @LuaFunction(mainThread = true) - public final MethodResult listCraftableItems() { + public final MethodResult getCraftableItems(IArguments arguments) { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(AppEngApi.listCraftableStacks(AppEngApi.getMonitor(node), getCraftingService())); + return MethodResult.of(AEApi.listCraftableStacks(AEApi.getMonitor(node), getCraftingService())); } @Override @LuaFunction(mainThread = true) - public final MethodResult listCraftableFluids() { + public final MethodResult getCraftableFluids(IArguments arguments) { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(AppEngApi.listCraftableFluids(AppEngApi.getMonitor(node), getCraftingService())); + return MethodResult.of(AEApi.listCraftableFluids(AEApi.getMonitor(node), getCraftingService())); } @Override - public MethodResult listCraftableChemicals() { + public MethodResult getCraftableChemicals(IArguments arguments) { return null; } @Override @LuaFunction(mainThread = true) - public final MethodResult listCells() { + public final MethodResult getCells() { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(AppEngApi.listCells(node)); + return MethodResult.of(AEApi.listCells(node)); } @Override @LuaFunction(mainThread = true) - public MethodResult listDrives() { + public MethodResult getDrives() { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(AppEngApi.listDrives(node.getGrid())); + return MethodResult.of(AEApi.listDrives(node.getGrid())); } @Override @LuaFunction(mainThread = true) public final MethodResult importItem(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); String side = arguments.getString(1); IItemHandler inventory; @@ -299,7 +301,7 @@ public final MethodResult importItem(IComputerAccess computer, IArguments argume @LuaFunction(mainThread = true) public final MethodResult exportItem(IComputerAccess computer, @NotNull IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); String side = arguments.getString(1); IItemHandler inventory; @@ -315,20 +317,18 @@ public final MethodResult exportItem(IComputerAccess computer, @NotNull IArgumen @Override @LuaFunction(mainThread = true) - public MethodResult getFilteredPatterns(IArguments arguments) throws LuaException { + public MethodResult getPatterns(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(null); // Expected input is a table with either an input table, an output table or both to filter for both Map filterTable; - try { - Optional> optionalTable = arguments.optTable(0); - if (optionalTable.isEmpty()) - return MethodResult.of(null, "EMPTY_INPUT"); - filterTable = optionalTable.get(); - } catch (LuaException e) { - return MethodResult.of(null, "NO_TABLE"); - } + + Optional> optionalTable = arguments.optTable(0); + if (optionalTable.isEmpty()) + return MethodResult.of(AEApi.listPatterns(node.getGrid(), getLevel())); + + filterTable = optionalTable.get(); boolean hasInputFilter = filterTable.containsKey("input"); boolean hasOutputFilter = filterTable.containsKey("output"); @@ -336,7 +336,7 @@ public MethodResult getFilteredPatterns(IArguments arguments) throws LuaExceptio // If the player tries to filter for nothing, return nothing. if (!hasAnyFilter) - return MethodResult.of(null, "NO_FILTER"); + return MethodResult.of(null, StatusConstants.MISSING_FILTER.toString()); GenericFilter inputFilter = null; GenericFilter outputFilter = null; @@ -352,28 +352,19 @@ public MethodResult getFilteredPatterns(IArguments arguments) throws LuaExceptio outputFilter = GenericFilter.parseGeneric(outputFilterTable).getLeft(); } - Pair pattern = AppEngApi.findPatternFromFilters(node.getGrid(), getLevel(), inputFilter, outputFilter); + Pair pattern = AEApi.findPatternFromFilters(node.getGrid(), getLevel(), inputFilter, outputFilter); if (pattern.getRight() != null) return MethodResult.of(null, pattern.getRight()); - return MethodResult.of(AppEngApi.parsePattern(pattern.getLeft())); - } - - @Override - @LuaFunction(mainThread = true) - public MethodResult getPatterns() { - if (!isAvailable()) - return notConnected(); - - return MethodResult.of(AppEngApi.listPatterns(node.getGrid(), getLevel())); + return MethodResult.of(AEApi.parsePattern(pattern.getLeft())); } @Override @LuaFunction(mainThread = true) public final MethodResult getStoredEnergy() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(node.getGrid().getEnergyService().getStoredPower()); } @@ -382,7 +373,7 @@ public final MethodResult getStoredEnergy() { @LuaFunction(mainThread = true) public final MethodResult getEnergyCapacity() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(node.getGrid().getEnergyService().getMaxStoredPower()); } @@ -391,181 +382,181 @@ public final MethodResult getEnergyCapacity() { @LuaFunction(mainThread = true) public final MethodResult getEnergyUsage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(node.getGrid().getEnergyService().getAvgPowerUsage()); } - @Override @LuaFunction(mainThread = true) - public final MethodResult getAvgPowerInjection() { + public final MethodResult getAverageEnergyInput() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(node.getGrid().getEnergyService().getAvgPowerInjection()); } @Override @LuaFunction(mainThread = true) - public MethodResult getTotalExternItemStorage() { + public MethodResult getTotalExternalItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getTotalExternalItemStorage(node)); + return MethodResult.of(AEApi.getTotalExternalItemStorage(node)); } @Override @LuaFunction(mainThread = true) - public MethodResult getTotalExternFluidStorage() { + public MethodResult getTotalExternalFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getTotalExternalFluidStorage(node)); + return MethodResult.of(AEApi.getTotalExternalFluidStorage(node)); } @LuaFunction(mainThread = true) - public MethodResult getTotalExternChemicalStorage() { + public MethodResult getTotalExternalChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getTotalExternalChemicalStorage(node)); + return MethodResult.of(AEApi.getTotalExternalChemicalStorage(node)); } @Override @LuaFunction(mainThread = true) public final MethodResult getTotalItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getTotalItemStorage(node)); + return MethodResult.of(AEApi.getTotalItemStorage(node)); } @Override @LuaFunction(mainThread = true) public final MethodResult getTotalFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getTotalFluidStorage(node)); + return MethodResult.of(AEApi.getTotalFluidStorage(node)); } @LuaFunction(mainThread = true) public MethodResult getTotalChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getTotalChemicalStorage(node)); + return MethodResult.of(AEApi.getTotalChemicalStorage(node)); } @Override @LuaFunction(mainThread = true) - public MethodResult getUsedExternItemStorage() { + public MethodResult getUsedExternalItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getUsedExternalItemStorage(node)); + return MethodResult.of(AEApi.getUsedExternalItemStorage(node)); } @Override @LuaFunction(mainThread = true) - public MethodResult getUsedExternFluidStorage() { + public MethodResult getUsedExternalFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getUsedExternalFluidStorage(node)); + return MethodResult.of(AEApi.getUsedExternalFluidStorage(node)); } + @Override @LuaFunction(mainThread = true) - public MethodResult getUsedExternChemicalStorage() { + public MethodResult getUsedExternalChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getUsedExternalChemicalStorage(node)); + return MethodResult.of(AEApi.getUsedExternalChemicalStorage(node)); } @Override @LuaFunction(mainThread = true) public final MethodResult getUsedItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getUsedItemStorage(node)); + return MethodResult.of(AEApi.getUsedItemStorage(node)); } @Override @LuaFunction(mainThread = true) public final MethodResult getUsedFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getUsedFluidStorage(node)); + return MethodResult.of(AEApi.getUsedFluidStorage(node)); } @LuaFunction(mainThread = true) public MethodResult getUsedChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getUsedChemicalStorage(node)); + return MethodResult.of(AEApi.getUsedChemicalStorage(node)); } @Override @LuaFunction(mainThread = true) - public MethodResult getAvailableExternItemStorage() { + public MethodResult getAvailableExternalItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getAvailableExternalItemStorage(node)); + return MethodResult.of(AEApi.getAvailableExternalItemStorage(node)); } @Override @LuaFunction(mainThread = true) - public MethodResult getAvailableExternFluidStorage() { + public MethodResult getAvailableExternalFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getAvailableExternalFluidStorage(node)); + return MethodResult.of(AEApi.getAvailableExternalFluidStorage(node)); } @LuaFunction(mainThread = true) - public MethodResult getAvailableExternChemicalStorage() { + public MethodResult getAvailableExternalChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getAvailableExternalChemicalStorage(node)); + return MethodResult.of(AEApi.getAvailableExternalChemicalStorage(node)); } @Override @LuaFunction(mainThread = true) public final MethodResult getAvailableItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getAvailableItemStorage(node)); + return MethodResult.of(AEApi.getAvailableItemStorage(node)); } @Override @LuaFunction(mainThread = true) public final MethodResult getAvailableFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getAvailableFluidStorage(node)); + return MethodResult.of(AEApi.getAvailableFluidStorage(node)); } @LuaFunction(mainThread = true) public MethodResult getAvailableChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(AppEngApi.getAvailableChemicalStorage(node)); + return MethodResult.of(AEApi.getAvailableChemicalStorage(node)); } @Override @LuaFunction(mainThread = true) public final MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(null); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -573,17 +564,17 @@ public final MethodResult craftItem(IComputerAccess computer, IArguments argumen ItemFilter parsedFilter = filter.getLeft(); if (parsedFilter.isEmpty()) - return MethodResult.of(false, "EMPTY_FILTER"); + return MethodResult.of(false, StatusConstants.EMPTY_FILTER.toString()); String cpuName = arguments.optString(1, ""); - ICraftingCPU target = AppEngApi.getCraftingCPU(node, cpuName); + ICraftingCPU target = AEApi.getCraftingCPU(node, cpuName); if (!cpuName.isEmpty() && target == null) return MethodResult.of(false, "CPU " + cpuName + " does not exists"); ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class); - Pair stack = AppEngApi.findAEStackFromFilter(AppEngApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft()); + Pair stack = AEApi.findAEStackFromFilter(AEApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft()); if (stack.getRight() == null && stack.getLeft() == 0) - return MethodResult.of(null, "NOT_CRAFTABLE"); + return MethodResult.of(null, StatusConstants.NOT_CRAFTABLE.toString()); CraftJob job = new CraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), tile, tile, target); tile.addJob(job); @@ -595,7 +586,7 @@ public final MethodResult craftItem(IComputerAccess computer, IArguments argumen @LuaFunction(mainThread = true) public final MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(null); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -603,17 +594,17 @@ public final MethodResult craftFluid(IComputerAccess computer, IArguments argume FluidFilter parsedFilter = filter.getLeft(); if (parsedFilter.isEmpty()) - return MethodResult.of(false, "EMPTY_FILTER"); + return MethodResult.of(false, StatusConstants.EMPTY_FILTER.toString()); String cpuName = arguments.optString(1, ""); - ICraftingCPU target = AppEngApi.getCraftingCPU(node, cpuName); + ICraftingCPU target = AEApi.getCraftingCPU(node, cpuName); if (!cpuName.isEmpty() && target == null) return MethodResult.of(false, "CPU " + cpuName + " does not exists"); ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class); - Pair stack = AppEngApi.findAEFluidFromFilter(AppEngApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft()); + Pair stack = AEApi.findAEFluidFromFilter(AEApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft()); if (stack.getRight() == null && stack.getLeft() == 0) - return MethodResult.of(null, "NOT_CRAFTABLE"); + return MethodResult.of(null, StatusConstants.NOT_CRAFTABLE.toString()); CraftJob job = new CraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), tile, tile, target); tile.addJob(job); @@ -628,9 +619,9 @@ public MethodResult craftChemical(IComputerAccess computer, IArguments arguments @Override @LuaFunction(mainThread = true) - public MethodResult getCraftingJobs() { + public MethodResult getCraftingTasks() { if (!isAvailable()) - return notConnected(); + return notConnected(null); ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class); @@ -638,118 +629,67 @@ public MethodResult getCraftingJobs() { for (ICraftingCPU cpu : craftingGrid.getCpus()) { if (cpu.getJobStatus() != null) - jobs.add(AppEngApi.parseCraftingJob(cpu.getJobStatus(), cpu)); + jobs.add(AEApi.parseCraftingJob(cpu.getJobStatus(), cpu)); } return MethodResult.of(jobs); } @Override @LuaFunction(mainThread = true) - public MethodResult cancelCraftingJobs(IArguments arguments) { + public MethodResult getCraftingTask(int id) { + return null; + } + + + @Override + @LuaFunction(mainThread = true) + public MethodResult cancelCraftingTasks(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class); - Map filterTable; - try { - Optional> optionalTable = arguments.optTable(0); - if (optionalTable.isEmpty()) - return MethodResult.of(null, "EMPTY_INPUT"); - filterTable = optionalTable.get(); - } catch (LuaException e) { - return MethodResult.of(null, "NO_TABLE"); - } - - Pair filter = GenericFilter.parseGeneric(filterTable); + Pair, String> filter = GenericFilter.parseGeneric(arguments.getTable(0)); if (filter.getRight() != null) - return MethodResult.of(null, filter.getRight()); + return MethodResult.of(0, filter.getRight()); + + GenericFilter parsedFilter = filter.getLeft(); int jobsCanceled = 0; for (ICraftingCPU cpu : craftingGrid.getCpus()) { - if (cpu.getJobStatus() != null && filter.getLeft().testAE(cpu.getJobStatus().crafting())) { + if (cpu.getJobStatus() != null && parsedFilter.testAE(cpu.getJobStatus().crafting())) { if (cpu instanceof CraftingCPUCluster cpuCluster) { cpuCluster.cancel(); jobsCanceled++; } } } - return MethodResult.of(jobsCanceled, "SUCCESSFUL"); + return MethodResult.of(jobsCanceled); } @Override @LuaFunction(mainThread = true) - public final MethodResult isItemCraftable(IArguments arguments) throws LuaException { + public final MethodResult isCraftable(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); - - Pair filter = ItemFilter.parse(arguments.getTable(0)); - if (filter.rightPresent()) - return MethodResult.of(false, filter.getRight()); + return notConnected(false); - ItemFilter parsedFilter = filter.getLeft(); - if (parsedFilter.isEmpty()) - return MethodResult.of(false, "EMPTY_FILTER"); - - AEItemKey item = AEItemKey.of(parsedFilter.toItemStack()); - - return MethodResult.of(getCraftingService().isCraftable(item)); - } - - @Override - @LuaFunction(mainThread = true) - public final MethodResult isFluidCrafting(IArguments arguments) throws LuaException { - if (!isAvailable()) - return notConnected(); - - MEStorage monitor = AppEngApi.getMonitor(node); - ICraftingService grid = node.getGrid().getService(ICraftingService.class); - - Pair filter = FluidFilter.parse(arguments.getTable(0)); - if (filter.rightPresent()) + Pair, String> filter = GenericFilter.parseGeneric(new ObjectLuaTable(arguments.getTable(0))); + if (filter.getRight() != null) return MethodResult.of(false, filter.getRight()); - FluidFilter parsedFilter = filter.getLeft(); + GenericFilter parsedFilter = filter.getLeft(); if (parsedFilter.isEmpty()) - return MethodResult.of(false, "EMPTY_FILTER"); - String cpuName = arguments.optString(1, ""); - ICraftingCPU craftingCPU = AppEngApi.getCraftingCPU(node, cpuName); - - return MethodResult.of(AppEngApi.isFluidCrafting(monitor, grid, parsedFilter, craftingCPU)); - } + return MethodResult.of(false, StatusConstants.EMPTY_FILTER.toString()); - @Override - public MethodResult isChemicalCraftable(IArguments arguments) throws LuaException { - return null; - } - - @Override - public MethodResult isChemicalCrafting(IArguments arguments) throws LuaException { - return null; + return MethodResult.of(AEApi.findPatternFromFilters(node.getGrid(), getLevel(), null, parsedFilter).getLeft() != null); } @Override @LuaFunction(mainThread = true) - public final MethodResult isFluidCraftable(IArguments arguments) throws LuaException { + public final MethodResult exportFluid(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); - - Pair filter = FluidFilter.parse(arguments.getTable(0)); - if (filter.rightPresent()) - return MethodResult.of(false, filter.getRight()); + return notConnected(0); - FluidFilter parsedFilter = filter.getLeft(); - if (parsedFilter.isEmpty()) - return MethodResult.of(false, "EMPTY_FILTER"); - - AEFluidKey fluid = AEFluidKey.of(parsedFilter.toFluidStack()); - - return MethodResult.of(getCraftingService().isCraftable(fluid)); - } - - @Override - @LuaFunction(mainThread = true) - public final MethodResult exportFluid(IComputerAccess computer, IArguments arguments) throws LuaException { String side = arguments.getString(1); IFluidHandler fluidHandler; @@ -759,9 +699,6 @@ public final MethodResult exportFluid(IComputerAccess computer, IArguments argum fluidHandler = FluidUtil.getHandlerFromName(computer, arguments.getString(1)); } - if (fluidHandler == null) - return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help."); - return exportToTank(arguments, fluidHandler); } @@ -771,13 +708,16 @@ public MethodResult importChemical(IComputerAccess computer, IArguments argument } @Override - public MethodResult exportchemical(IComputerAccess computer, IArguments arguments) throws LuaException { + public MethodResult exportChemical(IComputerAccess computer, IArguments arguments) throws LuaException { return null; } @Override @LuaFunction(mainThread = true) public final MethodResult importFluid(IComputerAccess computer, IArguments arguments) throws LuaException { + if (!isAvailable()) + return notConnected(0); + String side = arguments.getString(1); IFluidHandler fluidHandler; @@ -787,44 +727,41 @@ public final MethodResult importFluid(IComputerAccess computer, IArguments argum fluidHandler = FluidUtil.getHandlerFromName(computer, arguments.getString(1)); } - if (fluidHandler == null) - return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help."); - return importToME(arguments, fluidHandler); } @Override @LuaFunction(mainThread = true) - public final MethodResult isItemCrafting(IArguments arguments) throws LuaException { + public final MethodResult isCrafting(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(false); - MEStorage monitor = AppEngApi.getMonitor(node); ICraftingService grid = node.getGrid().getService(ICraftingService.class); - Pair filter = ItemFilter.parse(arguments.getTable(0)); - if (filter.rightPresent()) + Pair, String> filter = GenericFilter.parseGeneric(new ObjectLuaTable(arguments.getTable(0))); + if (filter.getRight() != null) return MethodResult.of(false, filter.getRight()); - ItemFilter parsedFilter = filter.getLeft(); + GenericFilter parsedFilter = filter.getLeft(); if (parsedFilter.isEmpty()) - return MethodResult.of(false, "EMPTY_FILTER"); + return MethodResult.of(false, StatusConstants.EMPTY_FILTER.toString()); + String cpuName = arguments.optString(1, ""); - ICraftingCPU craftingCPU = AppEngApi.getCraftingCPU(node, cpuName); + ICraftingCPU craftingCPU = AEApi.getCraftingCPU(node, cpuName); - return MethodResult.of(AppEngApi.isItemCrafting(monitor, grid, parsedFilter, craftingCPU)); + return MethodResult.of(AEApi.isCrafting(grid, parsedFilter, craftingCPU)); } @LuaFunction(mainThread = true) - public final MethodResult getCraftingCPUs() throws LuaException { + public final MethodResult getCraftingCPUs() { if (!isAvailable()) - return notConnected(); + return notConnected(null); ICraftingService grid = node.getGrid().getService(ICraftingService.class); List map = new ArrayList<>(); for (ICraftingCPU iCraftingCPU : grid.getCpus()) { - Object cpu = AppEngApi.parseCraftingCPU(iCraftingCPU, false); + Object cpu = AEApi.parseCraftingCPU(iCraftingCPU, false); map.add(cpu); } return MethodResult.of(map); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java index 98a51ff41..cd14a8dd0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java @@ -15,13 +15,14 @@ import dan200.computercraft.core.computer.ComputerSide; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; -import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorage; -import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorageNode; +import de.srendi.advancedperipherals.common.addons.refinedstorage.RSApi; +import de.srendi.advancedperipherals.common.addons.refinedstorage.RSNode; import de.srendi.advancedperipherals.common.addons.refinedstorage.RsFluidHandler; import de.srendi.advancedperipherals.common.addons.refinedstorage.RsItemHandler; import de.srendi.advancedperipherals.common.blocks.blockentities.RsBridgeEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.Pair; +import de.srendi.advancedperipherals.common.util.StatusConstants; import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; import de.srendi.advancedperipherals.common.util.inventory.FluidUtil; import de.srendi.advancedperipherals.common.util.inventory.GenericFilter; @@ -52,7 +53,7 @@ public RsBridgePeripheral(RsBridgeEntity tileEntity) { super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); } - private RefinedStorageNode getNode() { + private RSNode getNode() { return owner.tileEntity.getNode(); } @@ -60,10 +61,11 @@ private INetwork getNetwork() { return getNode().getNetwork(); } - private MethodResult notConnected() { - return MethodResult.of(null, "NOT_CONNECTED"); + private MethodResult notConnected(@Nullable Object defaultValue) { + return MethodResult.of(defaultValue, StatusConstants.NOT_CONNECTED.toString()); } + private boolean isAvailable() { return getNetwork() != null; } @@ -75,8 +77,8 @@ public boolean isEnabled() { @Override @LuaFunction(mainThread = true) - public final MethodResult isConnected() { - return MethodResult.of(isAvailable()); + public final boolean isConnected() { + return isAvailable(); } @Override @@ -89,108 +91,108 @@ public final MethodResult isOnline() { @Override @LuaFunction(mainThread = true) - public final MethodResult listItems() { + public final MethodResult getItems(IArguments arguments) { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(RefinedStorage.listItems(getNetwork())); + return MethodResult.of(RSApi.listItems(getNetwork())); } @Override @LuaFunction(mainThread = true) - public final MethodResult listCraftableItems() { + public final MethodResult getCraftableItems(IArguments arguments) { if (!isAvailable()) - return notConnected(); + return notConnected(null); List items = new ArrayList<>(); - RefinedStorage.getCraftableItems(getNetwork()).forEach(item -> items.add(RefinedStorage.parseItemStack(item, getNetwork()))); + RSApi.getCraftableItems(getNetwork()).forEach(item -> items.add(RSApi.parseItemStack(item, getNetwork()))); return MethodResult.of(items); } @Override @LuaFunction(mainThread = true) - public final MethodResult listCraftableFluids() { + public final MethodResult getCraftableFluids(IArguments arguments) { if (!isAvailable()) - return notConnected(); + return notConnected(null); List fluids = new ArrayList<>(); - RefinedStorage.getCraftableFluids(getNetwork()).forEach(fluid -> fluids.add(RefinedStorage.parseFluidStack(fluid, getNetwork()))); + RSApi.getCraftableFluids(getNetwork()).forEach(fluid -> fluids.add(RSApi.parseFluidStack(fluid, getNetwork()))); return MethodResult.of(fluids); } @Override - public MethodResult listCraftableChemicals() { + public MethodResult getCraftableChemicals(IArguments arguments) { return null; } @Override @LuaFunction(mainThread = true) - public final MethodResult listCells() { + public final MethodResult getCells() { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(RefinedStorage.getStorageDisks(getNetwork())); + return MethodResult.of(RSApi.getStorageDisks(getNetwork())); } @Override @LuaFunction(mainThread = true) - public final MethodResult listDrives() { + public final MethodResult getDrives() { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(RefinedStorage.getDiskDrives(getNetwork())); + return MethodResult.of(RSApi.getDiskDrives(getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getTotalItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getMaxItemDiskStorage(getNetwork())); + return MethodResult.of(RSApi.getMaxItemDiskStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getTotalFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getMaxFluidDiskStorage(getNetwork())); + return MethodResult.of(RSApi.getMaxFluidDiskStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public MethodResult getTotalChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(-1); } @Override @LuaFunction(mainThread = true) - public final MethodResult getUsedExternItemStorage() { + public final MethodResult getUsedExternalItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getUsedItemExternalStorage(getNetwork())); + return MethodResult.of(RSApi.getUsedItemExternalStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) - public final MethodResult getUsedExternFluidStorage() { + public final MethodResult getUsedExternalFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getUsedFluidExternalStorage(getNetwork())); + return MethodResult.of(RSApi.getUsedFluidExternalStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) - public MethodResult getUsedExternChemicalStorage() { + public MethodResult getUsedExternalChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(-1); } @@ -199,52 +201,52 @@ public MethodResult getUsedExternChemicalStorage() { @LuaFunction(mainThread = true) public final MethodResult getUsedItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getUsedItemDiskStorage(getNetwork())); + return MethodResult.of(RSApi.getUsedItemDiskStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getUsedFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getUsedFluidDiskStorage(getNetwork())); + return MethodResult.of(RSApi.getUsedFluidDiskStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public MethodResult getUsedChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(-1); } @Override @LuaFunction(mainThread = true) - public final MethodResult getAvailableExternItemStorage() { + public final MethodResult getAvailableExternalItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getMaxItemExternalStorage(getNetwork()) - RefinedStorage.getUsedItemExternalStorage(getNetwork())); + return MethodResult.of(RSApi.getMaxItemExternalStorage(getNetwork()) - RSApi.getUsedItemExternalStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) - public final MethodResult getAvailableExternFluidStorage() { + public final MethodResult getAvailableExternalFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getMaxFluidExternalStorage(getNetwork()) - RefinedStorage.getUsedFluidExternalStorage(getNetwork())); + return MethodResult.of(RSApi.getMaxFluidExternalStorage(getNetwork()) - RSApi.getUsedFluidExternalStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) - public MethodResult getAvailableExternChemicalStorage() { + public MethodResult getAvailableExternalChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(-1); } @@ -253,67 +255,67 @@ public MethodResult getAvailableExternChemicalStorage() { @LuaFunction(mainThread = true) public final MethodResult getAvailableItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getMaxItemDiskStorage(getNetwork()) - RefinedStorage.getUsedItemDiskStorage(getNetwork())); + return MethodResult.of(RSApi.getMaxItemDiskStorage(getNetwork()) - RSApi.getUsedItemDiskStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getAvailableFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getMaxFluidDiskStorage(getNetwork()) - RefinedStorage.getUsedFluidDiskStorage(getNetwork())); + return MethodResult.of(RSApi.getMaxFluidDiskStorage(getNetwork()) - RSApi.getUsedFluidDiskStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) public MethodResult getAvailableChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(-1); } @Override @LuaFunction(mainThread = true) - public final MethodResult getTotalExternItemStorage() { + public final MethodResult getTotalExternalItemStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getMaxItemExternalStorage(getNetwork())); + return MethodResult.of(RSApi.getMaxItemExternalStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) - public final MethodResult getTotalExternFluidStorage() { + public final MethodResult getTotalExternalFluidStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); - return MethodResult.of(RefinedStorage.getMaxFluidExternalStorage(getNetwork())); + return MethodResult.of(RSApi.getMaxFluidExternalStorage(getNetwork())); } @Override @LuaFunction(mainThread = true) - public MethodResult getTotalExternChemicalStorage() { + public MethodResult getTotalExternalChemicalStorage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(-1); } @Override @LuaFunction(mainThread = true) - public final MethodResult listFluids() { + public final MethodResult getFluids(IArguments arguments) { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(RefinedStorage.listFluids(getNetwork())); + return MethodResult.of(RSApi.listFluids(getNetwork())); } @Override - public MethodResult listChemicals() { + public MethodResult getChemicals(IArguments arguments) { return null; } @@ -321,7 +323,7 @@ public MethodResult listChemicals() { @LuaFunction(mainThread = true) public final MethodResult getEnergyUsage() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(getNetwork().getEnergyUsage()); } @@ -330,7 +332,7 @@ public final MethodResult getEnergyUsage() { @LuaFunction(mainThread = true) public final MethodResult getEnergyCapacity() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(getNetwork().getEnergyStorage().getMaxEnergyStored()); } @@ -339,33 +341,29 @@ public final MethodResult getEnergyCapacity() { @LuaFunction(mainThread = true) public final MethodResult getStoredEnergy() { if (!isAvailable()) - return notConnected(); + return notConnected(0); return MethodResult.of(getNetwork().getEnergyStorage().getEnergyStored()); } - @Override @LuaFunction(mainThread = true) - public final MethodResult getAvgPowerInjection() { + public final MethodResult getAverageEnergyInput() { return MethodResult.of(0); } @Override @LuaFunction(mainThread = true) - public final MethodResult getFilteredPatterns(IArguments arguments) throws LuaException { + public final MethodResult getPatterns(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(null); // Expected input is a table with either an input table, an output table or both to filter for both Map filterTable; - try { - Optional> optionalTable = arguments.optTable(0); - if (optionalTable.isEmpty()) - return MethodResult.of(null, "EMPTY_INPUT"); - filterTable = optionalTable.get(); - } catch (LuaException e) { - return MethodResult.of(null, "NO_TABLE"); - } + Optional> optionalTable = arguments.optTable(0); + if (optionalTable.isEmpty()) + return MethodResult.of(RSApi.getPatterns(getNetwork())); + + filterTable = optionalTable.get(); boolean hasInputFilter = filterTable.containsKey("input"); boolean hasOutputFilter = filterTable.containsKey("output"); @@ -373,7 +371,7 @@ public final MethodResult getFilteredPatterns(IArguments arguments) throws LuaEx // If the player tries to filter for nothing, return nothing. if (!hasAnyFilter) - return MethodResult.of(null, "NO_FILTER"); + return MethodResult.of(null, StatusConstants.MISSING_FILTER.toString()); GenericFilter inputFilter = null; GenericFilter outputFilter = null; @@ -389,27 +387,18 @@ public final MethodResult getFilteredPatterns(IArguments arguments) throws LuaEx outputFilter = GenericFilter.parseGeneric(outputFilterTable).getLeft(); } - Pair pattern = RefinedStorage.findPatternFromFilters(getNetwork(), inputFilter, outputFilter); + Pair pattern = RSApi.findPatternFromFilters(getNetwork(), inputFilter, outputFilter); if (pattern.getRight() != null) return MethodResult.of(null, pattern.getRight()); - return MethodResult.of(RefinedStorage.parsePattern(pattern.getLeft(), getNetwork())); - } - - @Override - @LuaFunction(mainThread = true) - public final MethodResult getPatterns() { - if (!isAvailable()) - return notConnected(); - - return MethodResult.of(RefinedStorage.getPatterns(getNetwork())); + return MethodResult.of(RSApi.parsePattern(pattern.getLeft(), getNetwork())); } protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException { RsItemHandler itemHandler = new RsItemHandler(getNetwork()); if (targetInventory == null) - return MethodResult.of(0, "INVALID_TARGET"); + return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -421,7 +410,7 @@ protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable II protected MethodResult importToSystem(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException { RsItemHandler itemHandler = new RsItemHandler(getNetwork()); if (targetInventory == null) - return MethodResult.of(0, "INVALID_TARGET"); + return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -433,7 +422,7 @@ protected MethodResult importToSystem(@NotNull IArguments arguments, @Nullable I protected MethodResult exportToTank(@NotNull IArguments arguments, @Nullable IFluidHandler targetInventory) throws LuaException { RsFluidHandler itemHandler = new RsFluidHandler(getNetwork()); if (targetInventory == null) - return MethodResult.of(0, "INVALID_TARGET"); + return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -445,7 +434,7 @@ protected MethodResult exportToTank(@NotNull IArguments arguments, @Nullable IFl protected MethodResult importToSystem(@NotNull IArguments arguments, @Nullable IFluidHandler targetInventory) throws LuaException { RsFluidHandler itemHandler = new RsFluidHandler(getNetwork()); if (targetInventory == null) - return MethodResult.of(0, "INVALID_TARGET"); + return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -458,7 +447,7 @@ protected MethodResult importToSystem(@NotNull IArguments arguments, @Nullable I @LuaFunction(mainThread = true) public final MethodResult exportItem(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); String side = arguments.getString(1); IItemHandler inventory; @@ -476,7 +465,7 @@ public final MethodResult exportItem(IComputerAccess computer, IArguments argume @LuaFunction(mainThread = true) public final MethodResult importItem(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); String side = arguments.getString(1); IItemHandler inventory; @@ -494,7 +483,7 @@ public final MethodResult importItem(IComputerAccess computer, IArguments argume @LuaFunction(mainThread = true) public final MethodResult exportFluid(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); String side = arguments.getString(1); IFluidHandler fluidHandler; @@ -505,9 +494,6 @@ public final MethodResult exportFluid(IComputerAccess computer, IArguments argum fluidHandler = FluidUtil.getHandlerFromName(computer, arguments.getString(1)); } - if (fluidHandler == null) - return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help."); - return exportToTank(arguments, fluidHandler); } @@ -517,7 +503,7 @@ public MethodResult importChemical(IComputerAccess computer, IArguments argument } @Override - public MethodResult exportchemical(IComputerAccess computer, IArguments arguments) throws LuaException { + public MethodResult exportChemical(IComputerAccess computer, IArguments arguments) throws LuaException { return null; } @@ -525,7 +511,7 @@ public MethodResult exportchemical(IComputerAccess computer, IArguments argument @LuaFunction(mainThread = true) public final MethodResult importFluid(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); String side = arguments.getString(1); IFluidHandler fluidHandler; @@ -536,9 +522,6 @@ public final MethodResult importFluid(IComputerAccess computer, IArguments argum fluidHandler = FluidUtil.getHandlerFromName(computer, arguments.getString(1)); } - if (fluidHandler == null) - return MethodResult.of(0, "The target tank does not exist. Make sure the bridge is exposed in the computer network. Reach out to our discord or our documentation for help."); - return importToSystem(arguments, fluidHandler); } @@ -546,26 +529,26 @@ public final MethodResult importFluid(IComputerAccess computer, IArguments argum @LuaFunction(mainThread = true) public final MethodResult getItem(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - return MethodResult.of(RefinedStorage.parseItemStack(RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); + return MethodResult.of(RSApi.parseItemStack(RSApi.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); } @Override @LuaFunction(mainThread = true) public final MethodResult getFluid(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - return MethodResult.of(RefinedStorage.parseFluidStack(RefinedStorage.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); + return MethodResult.of(RSApi.parseFluidStack(RSApi.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); } @Override @@ -577,16 +560,15 @@ public MethodResult getChemical(IArguments arguments) throws LuaException { @LuaFunction(mainThread = true) public final MethodResult craftItem(IComputerAccess computerAccess, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); - + return notConnected(null); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - ItemStack stack = RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); + ItemStack stack = RSApi.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); if (stack.isEmpty()) - return MethodResult.of(null, "NOT_CRAFTABLE"); + return MethodResult.of(null, StatusConstants.NOT_CRAFTABLE.toString()); ICalculationResult result = getNetwork().getCraftingManager().create(stack, filter.getLeft().getCount()); CalculationResultType type = result.getType(); @@ -600,15 +582,15 @@ public final MethodResult craftItem(IComputerAccess computerAccess, IArguments a @LuaFunction(mainThread = true) public final MethodResult craftFluid(IComputerAccess computerAccess, IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(null); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - FluidStack stack = RefinedStorage.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); + FluidStack stack = RSApi.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); if (stack.isEmpty()) - return MethodResult.of(null, "NOT_CRAFTABLE"); + return MethodResult.of(null, StatusConstants.NOT_CRAFTABLE.toString()); ICalculationResult result = getNetwork().getCraftingManager().create(stack, filter.getLeft().getCount()); CalculationResultType type = result.getType(); @@ -623,20 +605,25 @@ public MethodResult craftChemical(IComputerAccess computer, IArguments arguments return null; } + @Override + public MethodResult getCraftingTask(int id) { + return null; + } + @Override @LuaFunction(mainThread = true) - public MethodResult getCraftingJobs() { + public MethodResult getCraftingTasks() { if (!isAvailable()) - return notConnected(); + return notConnected(null); - return MethodResult.of(RefinedStorage.getCraftingTasks(getNetwork())); + return MethodResult.of(RSApi.getCraftingTasks(getNetwork())); } @Override @LuaFunction(mainThread = true) - public MethodResult cancelCraftingJobs(IArguments arguments) throws LuaException { + public MethodResult cancelCraftingTasks(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(0); Pair, String> filter = GenericFilter.parseGeneric(arguments.getTable(0)); if (filter.getRight() != null) @@ -666,15 +653,15 @@ public MethodResult cancelCraftingJobs(IArguments arguments) throws LuaException @Override @LuaFunction(mainThread = true) - public final MethodResult isItemCrafting(IArguments arguments) throws LuaException { + public final MethodResult isCrafting(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(false); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - ItemStack stack = RefinedStorage.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); + ItemStack stack = RSApi.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); if (stack.isEmpty()) return MethodResult.of(null, "NOT_CRAFTABLE"); @@ -688,58 +675,9 @@ public final MethodResult isItemCrafting(IArguments arguments) throws LuaExcepti @Override @LuaFunction(mainThread = true) - public final MethodResult isFluidCraftable(IArguments arguments) throws LuaException { - if (!isAvailable()) - return notConnected(); - - Pair filter = FluidFilter.parse(arguments.getTable(0)); - if (filter.rightPresent()) - return MethodResult.of(false, filter.getRight()); - - FluidFilter parsedFilter = filter.getLeft(); - if (parsedFilter.isEmpty()) - return MethodResult.of(false, "EMPTY_FILTER"); - - return MethodResult.of(RefinedStorage.isFluidCraftable(getNetwork(), parsedFilter.toFluidStack())); - } - - @Override - @LuaFunction(mainThread = true) - public final MethodResult isFluidCrafting(IArguments arguments) throws LuaException { - if (!isAvailable()) - return notConnected(); - - Pair filter = FluidFilter.parse(arguments.getTable(0)); - if (filter.rightPresent()) - return MethodResult.of(null, filter.getRight()); - - FluidStack stack = RefinedStorage.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); - if (stack.isEmpty()) - return MethodResult.of(null, "NOT_CRAFTABLE"); - - for (ICraftingTask task : getNetwork().getCraftingManager().getTasks()) { - FluidStack taskStack = task.getRequested().getFluid(); - if (taskStack != null && taskStack.isFluidEqual(stack)) - return MethodResult.of(true); - } - return MethodResult.of(false); - } - - @Override - public MethodResult isChemicalCraftable(IArguments arguments) throws LuaException { - return null; - } - - @Override - public MethodResult isChemicalCrafting(IArguments arguments) throws LuaException { - return null; - } - - @Override - @LuaFunction(mainThread = true) - public final MethodResult isItemCraftable(IArguments arguments) throws LuaException { + public final MethodResult isCraftable(IArguments arguments) throws LuaException { if (!isAvailable()) - return notConnected(); + return notConnected(false); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -749,6 +687,6 @@ public final MethodResult isItemCraftable(IArguments arguments) throws LuaExcept if (parsedFilter.isEmpty()) return MethodResult.of(false, "EMPTY_FILTER"); - return MethodResult.of(RefinedStorage.isItemCraftable(getNetwork(), parsedFilter.toItemStack())); + return MethodResult.of(RSApi.isItemCraftable(getNetwork(), parsedFilter.toItemStack())); } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSApi.java similarity index 99% rename from src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSApi.java index 5b71848f2..ff9c67875 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorage.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSApi.java @@ -38,13 +38,13 @@ import java.util.Objects; import java.util.stream.Collectors; -public class RefinedStorage { +public class RSApi { - public static RefinedStorage instance; + public static RSApi instance; private final IRSAPI api; - public RefinedStorage() { + public RSApi() { api = API.instance(); initiate(); } @@ -497,7 +497,7 @@ public static Map parseFluidStack(@Nullable FluidStack fluidStac } public void initiate() { - api.getNetworkNodeRegistry().add(new ResourceLocation(AdvancedPeripherals.MOD_ID, "rs_bridge"), (tag, world, pos) -> read(tag, new RefinedStorageNode(world, pos))); + api.getNetworkNodeRegistry().add(new ResourceLocation(AdvancedPeripherals.MOD_ID, "rs_bridge"), (tag, world, pos) -> read(tag, new RSNode(world, pos))); } public IRSAPI getApi() { diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorageNode.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSNode.java similarity index 88% rename from src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorageNode.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSNode.java index 6c19489de..d80f191bb 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RefinedStorageNode.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSNode.java @@ -10,9 +10,9 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; -public class RefinedStorageNode extends NetworkNode { +public class RSNode extends NetworkNode { - public RefinedStorageNode(Level level, BlockPos pos) { + public RSNode(Level level, BlockPos pos) { super(level, pos); } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java index 06da6c0bf..b2b3ff62b 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java @@ -27,7 +27,7 @@ public int fill(FluidStack resource, FluidAction action) { @NotNull @Override public FluidStack drain(FluidFilter filter, FluidAction simulate) { - FluidStack fluid = RefinedStorage.findFluidFromFilter(network, null, filter); + FluidStack fluid = RSApi.findFluidFromFilter(network, null, filter); if (fluid == null) return FluidStack.EMPTY; return network.extractFluid(fluid, filter.getCount(), IComparer.COMPARE_QUANTITY, simulate == FluidAction.SIMULATE ? Action.SIMULATE : Action.PERFORM); diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java index 900c8a5b0..dd7e6fe13 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java @@ -31,7 +31,7 @@ public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate @Override public ItemStack extractItem(ItemFilter filter, int count, boolean simulate) { - ItemStack item = RefinedStorage.findStackFromFilter(network, network.getCraftingManager(), filter); + ItemStack item = RSApi.findStackFromFilter(network, network.getCraftingManager(), filter); if (item == null) AdvancedPeripherals.debug("Trying to extract item: " + item + " from filter: " + filter); if(item == null) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java index 16a66d976..e1d16f3a7 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java @@ -12,10 +12,10 @@ import appeng.api.stacks.AEItemKey; import appeng.api.storage.StorageHelper; import appeng.api.util.AECableType; -import de.srendi.advancedperipherals.common.addons.ae2.AppEngApi; +import de.srendi.advancedperipherals.common.addons.ae2.AEApi; import de.srendi.advancedperipherals.common.addons.ae2.CraftJob; -import de.srendi.advancedperipherals.common.addons.ae2.MeBridgeEntityListener; -import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MeBridgePeripheral; +import de.srendi.advancedperipherals.common.addons.ae2.MEBridgeEntityListener; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MEBridgePeripheral; import de.srendi.advancedperipherals.common.blocks.base.IInventoryBlock; import de.srendi.advancedperipherals.common.blocks.base.PeripheralBlockEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; @@ -36,11 +36,11 @@ import java.util.Optional; import java.util.concurrent.CopyOnWriteArrayList; -public class MeBridgeEntity extends PeripheralBlockEntity implements IActionSource, IActionHost, IInWorldGridNodeHost, ICraftingSimulationRequester, IInventoryBlock { +public class MeBridgeEntity extends PeripheralBlockEntity implements IActionSource, IActionHost, IInWorldGridNodeHost, ICraftingSimulationRequester, IInventoryBlock { private final List jobs = new CopyOnWriteArrayList<>(); private boolean initialized = false; - private final IManagedGridNode mainNode = GridHelper.createManagedNode(this, MeBridgeEntityListener.INSTANCE); + private final IManagedGridNode mainNode = GridHelper.createManagedNode(this, MEBridgeEntityListener.INSTANCE); public MeBridgeEntity(BlockPos pos, BlockState state) { super(APBlockEntityTypes.ME_BRIDGE.get(), pos, state); @@ -48,8 +48,8 @@ public MeBridgeEntity(BlockPos pos, BlockState state) { @NotNull @Override - protected MeBridgePeripheral createPeripheral() { - return new MeBridgePeripheral(this); + protected MEBridgePeripheral createPeripheral() { + return new MEBridgePeripheral(this); } @Override @@ -57,7 +57,7 @@ public void handleTick(Level level, BlockState state, Bl super.handleTick(level, state, type); if (!this.level.isClientSide()) { if (!initialized) { - MeBridgePeripheral peripheral = this.getPeripheral(); + MEBridgePeripheral peripheral = this.getPeripheral(); if (peripheral == null) { return; } @@ -156,7 +156,7 @@ public void setItem(int index, @NotNull ItemStack stack) { return; IEnergyService energySrc = mainNode.getGrid().getEnergyService(); - int inserted = (int) StorageHelper.poweredInsert(energySrc, AppEngApi.getMonitor(getActionableNode()), AEItemKey.of(stack), stack.getCount(), this); + int inserted = (int) StorageHelper.poweredInsert(energySrc, AEApi.getMonitor(getActionableNode()), AEItemKey.of(stack), stack.getCount(), this); if (inserted > 0) { getItem(index).setCount(getItem(index).getCount() - inserted); diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java index aee5e4a58..22a9f0c7d 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java @@ -7,7 +7,7 @@ import dan200.computercraft.api.peripheral.IPeripheral; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RsBridgePeripheral; -import de.srendi.advancedperipherals.common.addons.refinedstorage.RefinedStorageNode; +import de.srendi.advancedperipherals.common.addons.refinedstorage.RSNode; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralTileEntity; import net.minecraft.core.BlockPos; @@ -22,7 +22,7 @@ import static dan200.computercraft.shared.Capabilities.CAPABILITY_PERIPHERAL; -public class RsBridgeEntity extends NetworkNodeBlockEntity implements INetworkNodeProxy, IRedstoneConfigurable, IPeripheralTileEntity { +public class RsBridgeEntity extends NetworkNodeBlockEntity implements INetworkNodeProxy, IRedstoneConfigurable, IPeripheralTileEntity { private static final String PERIPHERAL_SETTINGS = "AP_SETTINGS"; //I have no clue what this does, but it works @@ -51,8 +51,8 @@ public LazyOptional getCapability(@NotNull Capability cap, @Nullabl return super.getCapability(cap, direction); } - public RefinedStorageNode createNode(Level level, BlockPos blockPos) { - return new RefinedStorageNode(level, blockPos); + public RSNode createNode(Level level, BlockPos blockPos) { + return new RSNode(level, blockPos); } @Override diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java index 110fb4f4d..ff92bbd70 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/RenderableObject.java @@ -54,6 +54,7 @@ public class RenderableObject extends OverlayObject { public RenderableObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); + reflectivelyMapProperties(arguments); } public RenderableObject(UUID player) { diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java index 4656c80c7..cd3af074f 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/RectangleObject.java @@ -23,6 +23,7 @@ public class RectangleObject extends RenderableObject { public RectangleObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); + reflectivelyMapProperties(arguments); } /** diff --git a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java index 903629c2d..72da53f55 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java +++ b/src/main/java/de/srendi/advancedperipherals/common/smartglasses/modules/overlay/objects/two_dim/TextObject.java @@ -30,6 +30,9 @@ public class TextObject extends RenderableObject { @BooleanProperty public boolean shadow = false; + @BooleanProperty + public boolean center = false; + public TextObject(OverlayModule module, IArguments arguments) throws LuaException { super(module, arguments); reflectivelyMapProperties(arguments); @@ -39,11 +42,6 @@ public TextObject(UUID player) { super(player); } - @LuaFunction - public final String getContent() { - return content; - } - @LuaFunction public final void setContent(String content) { this.content = content; @@ -51,8 +49,8 @@ public final void setContent(String content) { } @LuaFunction - public double getFontSize() { - return fontSize; + public final String getContent() { + return content; } // For any reason, cc does not support float, only double. So we need to cast it here @@ -62,9 +60,15 @@ public void setFontSize(double fontSize) { getModule().update(this); } + @LuaFunction + public double getFontSize() { + return fontSize; + } + @LuaFunction public void setShadow(boolean shadow) { this.shadow = shadow; + getModule().update(this); } @LuaFunction @@ -72,6 +76,17 @@ public boolean isShadow() { return shadow; } + @LuaFunction + public void setCenter(boolean center) { + this.center = center; + getModule().update(this); + } + + @LuaFunction + public boolean isCenter() { + return center; + } + @Override public IObjectRenderer getRenderObject() { return renderer; @@ -84,6 +99,7 @@ public void encode(FriendlyByteBuf buffer) { buffer.writeUtf(content); buffer.writeFloat(fontSize); buffer.writeBoolean(shadow); + buffer.writeBoolean(center); } public static TextObject decode(FriendlyByteBuf buffer) { @@ -94,11 +110,13 @@ public static TextObject decode(FriendlyByteBuf buffer) { String content = buffer.readUtf(); float fontSize = buffer.readFloat(); boolean shadow = buffer.readBoolean(); + boolean center = buffer.readBoolean(); TextObject clientObject = optionalObject.get(); clientObject.content = content; clientObject.fontSize = fontSize; clientObject.shadow = shadow; + clientObject.center = center; return clientObject; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/StatusConstants.java b/src/main/java/de/srendi/advancedperipherals/common/util/StatusConstants.java new file mode 100644 index 000000000..c697f5026 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/StatusConstants.java @@ -0,0 +1,49 @@ +package de.srendi.advancedperipherals.common.util; + +public enum StatusConstants { + + // Crafting Jobs + CALCULATION_STARTED, + CRAFTING_STARTED, + JOB_CANCELED, + JOB_DONE, + NOT_CRAFTABLE, + MISSING_ITEMS, // If there are missing items for a crafting recipe/job after the calculation is done + CPU_NOT_FOUND, + // Filters + EMPTY_FILTER, + FILTER_ITEM_NOT_FOUND, // Item could not be found in registry + FILTER_FLUID_NOT_FOUND, // Fluid could not be found in registry + FILTER_CHEMICAL_NOT_FOUND, // Chemical could not be found in registry + MISSING_FILTER, + NO_VALID_FLUID, // Fluid property of filter is not a string + NO_VALID_ITEM, // Item property of filter is not a string + NO_VALID_FROMSLOT, + NO_VALID_TOSLOT, + NO_VALID_NBT_HASH, + NO_VALID_NBT, + NO_VALID_FINGERPRINT, + NO_VALID_COUNT, + NO_VALID_FILTER_TYPE, + // Inventory, + INVENTORY_NOT_FOUND, + TARGET_NOT_FOUND, + ITEM_NOT_FOUND, // Debug message when an item couldn't be found in an/the target inventory + FLUID_NOT_FOUND, + CHEMICAL_NOT_FOUND, + // Misc + NOT_CONNECTED, + NOT_FOUND, // Generic not found state + ADDON_NOT_LOADED, + UNKNOWN_ERROR; + + public String withInfo(String extraInfo) { + return this + "_" + extraInfo; + } + + /*public String withInfo(APAddon addon) { + return this + "_" + addon.getModId(); + }*/ + + +} \ No newline at end of file diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java index 216d9eb04..2936490d3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java @@ -4,9 +4,10 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IComputerAccess; +import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MEBridgePeripheral; /** - * Implementation for common storage peripheral functions. Used for AE2 {@link de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MeBridgePeripheral} + * Implementation for common storage peripheral functions. Used for AE2 {@link MEBridgePeripheral} * and RS {@link de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RsBridgePeripheral} *

* This ensures that these both bridges use the same methods. This makes it easier to support both in the same script @@ -17,112 +18,105 @@ */ public interface IStorageSystemPeripheral { - MethodResult isConnected(); + boolean isConnected(); - MethodResult isOnline(); + MethodResult isOnline(); - MethodResult getItem(IArguments arguments) throws LuaException; + MethodResult getItem(IArguments arguments) throws LuaException; - MethodResult getFluid(IArguments arguments) throws LuaException; + MethodResult getFluid(IArguments arguments) throws LuaException; - MethodResult getChemical(IArguments arguments) throws LuaException; + MethodResult getChemical(IArguments arguments) throws LuaException; - MethodResult listItems(); + MethodResult getItems(IArguments arguments) throws LuaException; - MethodResult listFluids(); + MethodResult getFluids(IArguments arguments) throws LuaException; - MethodResult listChemicals(); + MethodResult getChemicals(IArguments arguments) throws LuaException; - MethodResult listCraftableItems(); + MethodResult getCraftableItems(IArguments arguments) throws LuaException; - MethodResult listCraftableFluids(); + MethodResult getCraftableFluids(IArguments arguments) throws LuaException; - MethodResult listCraftableChemicals(); + MethodResult getCraftableChemicals(IArguments arguments) throws LuaException; - MethodResult listCells(); + MethodResult getCells(); - MethodResult listDrives(); + MethodResult getDrives(); - MethodResult importItem(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult importItem(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult exportItem(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult exportItem(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult importFluid(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult importFluid(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult exportFluid(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult exportFluid(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult importChemical(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult importChemical(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult exportchemical(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult exportChemical(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult getFilteredPatterns(IArguments arguments) throws LuaException; + MethodResult getStoredEnergy(); - MethodResult getPatterns(); + MethodResult getEnergyCapacity(); - MethodResult getStoredEnergy(); + MethodResult getEnergyUsage(); - MethodResult getEnergyCapacity(); + MethodResult getAverageEnergyInput(); - MethodResult getEnergyUsage(); + MethodResult getTotalExternalItemStorage(); - MethodResult getAvgPowerInjection(); + MethodResult getTotalExternalFluidStorage(); - MethodResult getTotalExternItemStorage(); + MethodResult getTotalExternalChemicalStorage(); - MethodResult getTotalExternFluidStorage(); + MethodResult getTotalItemStorage(); - MethodResult getTotalExternChemicalStorage(); + MethodResult getTotalFluidStorage(); - MethodResult getTotalItemStorage(); + MethodResult getTotalChemicalStorage(); - MethodResult getTotalFluidStorage(); + MethodResult getUsedExternalItemStorage(); - MethodResult getTotalChemicalStorage(); + MethodResult getUsedExternalFluidStorage(); - MethodResult getUsedExternItemStorage(); + MethodResult getUsedExternalChemicalStorage(); - MethodResult getUsedExternFluidStorage(); + MethodResult getUsedItemStorage(); - MethodResult getUsedExternChemicalStorage(); + MethodResult getUsedFluidStorage(); - MethodResult getUsedItemStorage(); + MethodResult getUsedChemicalStorage(); - MethodResult getUsedFluidStorage(); + MethodResult getAvailableExternalItemStorage(); - MethodResult getUsedChemicalStorage(); + MethodResult getAvailableExternalFluidStorage(); - MethodResult getAvailableExternItemStorage(); + MethodResult getAvailableExternalChemicalStorage(); - MethodResult getAvailableExternFluidStorage(); + MethodResult getAvailableItemStorage(); - MethodResult getAvailableExternChemicalStorage(); + MethodResult getAvailableFluidStorage(); - MethodResult getAvailableItemStorage(); + MethodResult getAvailableChemicalStorage(); - MethodResult getAvailableFluidStorage(); + MethodResult getCraftingTasks(); - MethodResult getAvailableChemicalStorage(); + // A function to get our BasicCraftJob object with the id + MethodResult getCraftingTask(int id); - MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult cancelCraftingTasks(IArguments arguments) throws LuaException; - MethodResult getCraftingJobs(); + MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult cancelCraftingJobs(IArguments arguments) throws LuaException; + MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult craftChemical(IComputerAccess computer, IArguments arguments) throws LuaException; - MethodResult craftChemical(IComputerAccess computer, IArguments arguments) throws LuaException; + MethodResult isCraftable(IArguments arguments) throws LuaException; - MethodResult isItemCraftable(IArguments arguments) throws LuaException; + MethodResult isCrafting(IArguments arguments) throws LuaException; - MethodResult isItemCrafting(IArguments arguments) throws LuaException; - - MethodResult isFluidCraftable(IArguments arguments) throws LuaException; - - MethodResult isFluidCrafting(IArguments arguments) throws LuaException; - - MethodResult isChemicalCraftable(IArguments arguments) throws LuaException; - - MethodResult isChemicalCrafting(IArguments arguments) throws LuaException; + MethodResult getPatterns(IArguments arguments) throws LuaException; } From 5ba38b418b9ea7848a0caed8119fc696675689d0 Mon Sep 17 00:00:00 2001 From: Srendi Date: Sat, 9 Aug 2025 17:01:41 +0200 Subject: [PATCH 186/188] Prioritize batch rendering based on weight for smart glasses' overlay objects to fix rendering order issues. Add weight to object renderers and adjust transparency handling. --- .../client/ClientRegistry.java | 5 +-- .../smartglasses/OverlayModuleOverlay.java | 33 ++++++++++++------- .../smartglasses/objects/IObjectRenderer.java | 9 +++++ .../objects/twodim/RectangleRenderer.java | 15 ++++++--- .../objects/twodim/TextRenderer.java | 6 +++- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java index bcdc7dfac..4a784dfc3 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java +++ b/src/main/java/de/srendi/advancedperipherals/client/ClientRegistry.java @@ -20,6 +20,7 @@ import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @@ -72,9 +73,9 @@ public static void registeringRenderers(EntityRenderersEvent.RegisterRenderers e event.registerBlockEntityRenderer(APBlockEntityTypes.DISTANCE_DETECTOR.get(), DistanceDetectorRenderer::new); } - @SubscribeEvent + @SubscribeEvent(priority = EventPriority.LOWEST) public static void registeringOverlays(RegisterGuiOverlaysEvent event) { event.registerAboveAll(SaddleTurtleScreen.ID, SADDLE_TURTLE_OVERLAY); - event.registerBelowAll(OverlayModuleOverlay.ID, OVERLAY_MODULE_OVERLAY); + event.registerAboveAll(OverlayModuleOverlay.ID, OVERLAY_MODULE_OVERLAY); } } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java index 1a5fde8a5..6ef3fab90 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/OverlayModuleOverlay.java @@ -3,6 +3,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.srendi.advancedperipherals.client.smartglasses.objects.twodim.ITwoDObjectRenderer; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.RectangleObject; +import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; @@ -10,6 +12,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TreeMap; public class OverlayModuleOverlay implements IGuiOverlay { public static final String ID = "overlay_module_overlay"; @@ -18,28 +21,34 @@ public class OverlayModuleOverlay implements IGuiOverlay { public void render(ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { poseStack.pushPose(); - Map, List> batches = new HashMap<>(); + Map, List>> prioritizedBatches = new TreeMap<>(); for (RenderableObject object : OverlayObjectHolder.getObjects()) { - if (!object.isEnabled() || !(object.getRenderObject() instanceof ITwoDObjectRenderer)) + if (!object.isEnabled() || !(object.getRenderObject() instanceof ITwoDObjectRenderer)) { continue; + } + // We need to sort the objects by their weight, some things can't be rendered before something else. + // For example, when texts are rendered before our circles, rectangles, etc., the other objects can't be transparent anymore + int weight = object.getRenderObject().getWeight(); Class objectClass = object.getClass(); - if (batches.containsKey(objectClass)) { - batches.get(objectClass).add(object); - continue; - } + // Get or create the batch map for the current weight + Map, List> batchesForWeight = prioritizedBatches.computeIfAbsent(weight, k -> new HashMap<>()); - List newBatchArray = new ArrayList<>(); - newBatchArray.add(object); - batches.put(objectClass, newBatchArray); - } + List batch = batchesForWeight.computeIfAbsent(objectClass, k -> new ArrayList<>()); - for (List batch : batches.values()) { - ((ITwoDObjectRenderer) batch.get(0).getRenderObject()).renderBatch(batch, gui, poseStack, partialTick, screenWidth, screenHeight); + batch.add(object); } + for (Map, List> batchesForWeight : prioritizedBatches.values()) { + for (List batch : batchesForWeight.values()) { + + if (!batch.isEmpty()) { + ((ITwoDObjectRenderer) batch.get(0).getRenderObject()).renderBatch(batch, gui, poseStack, partialTick, screenWidth, screenHeight); + } + } + } poseStack.popPose(); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java index e92129ac1..aeefb36a9 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/IObjectRenderer.java @@ -1,4 +1,13 @@ package de.srendi.advancedperipherals.client.smartglasses.objects; public interface IObjectRenderer { + /** + * Get the weight of the renderer. Lower weight means higher priority and it will render first. + * Some things need to be rendered before others to prevent color and opacity issues. + * @return the weight of the renderer. + */ + default int getWeight() { + return 100; + } + } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java index ef203870e..bc8f91678 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java @@ -21,19 +21,24 @@ public class RectangleRenderer implements ITwoDObjectRenderer { public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { RenderSystem.setShader(GameRenderer::getPositionColorShader); BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); - Matrix4f matrix = poseStack.last().pose(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); for (RenderableObject obj : objects) { + poseStack.pushPose(); + Matrix4f matrix = poseStack.last().pose(); + float alpha = obj.opacity; float red = RenderUtil.getRed(obj.color); float green = RenderUtil.getGreen(obj.color); float blue = RenderUtil.getBlue(obj.color); - bufferbuilder.vertex(matrix, obj.x, obj.maxY, obj.z).color(red, green, blue, 0.0001f).endVertex(); - bufferbuilder.vertex(matrix, obj.maxX, obj.maxY, obj.z).color(red, green, blue, 0.00f).endVertex(); - bufferbuilder.vertex(matrix, obj.maxX, obj.y, obj.z).color(red, green, blue, 0.0f).endVertex(); - bufferbuilder.vertex(matrix, obj.x, obj.y, obj.z).color(red, green, blue, 0f).endVertex(); + bufferbuilder.vertex(matrix, obj.x, obj.maxY, obj.z).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.maxX, obj.maxY, obj.z).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.maxX, obj.y, obj.z).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.x, obj.y, obj.z).color(red, green, blue, alpha).endVertex(); + poseStack.popPose(); + } BufferUploader.drawWithShader(bufferbuilder.end()); diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java index ac7c37163..57cb0fa5e 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java @@ -24,13 +24,17 @@ public void renderBatch(List objects, ForgeGui gui, PoseStack x -= (minecraft.font.width(text.content) * text.fontSize) / 2f; } - if (text.shadow) { + if (!text.shadow) { minecraft.font.drawShadow(poseStack, text.content, x / text.fontSize, text.y / text.fontSize, text.color); } else { minecraft.font.draw(poseStack, text.content, x / text.fontSize, text.y / text.fontSize, text.color); } poseStack.popPose(); } + } + @Override + public int getWeight() { + return 110; } } From ab353424ed045a0bd0bc862987325445faafaa3d Mon Sep 17 00:00:00 2001 From: Srendi Date: Sat, 9 Aug 2025 20:24:55 +0200 Subject: [PATCH 187/188] Further adapt the current bridge system to the 1.21.1 one, support scripts from 1.21.1 without changes --- .../common/addons/ae2/AEApi.java | 41 ++- .../common/addons/ae2/AECraftJob.java | 312 ++++++++++++++++++ .../common/addons/ae2/CraftJob.java | 138 -------- .../peripheral/MEBridgePeripheral.java | 132 +++++--- .../peripheral/RsBridgePeripheral.java | 170 ++++++---- .../common/addons/refinedstorage/RSApi.java | 13 +- .../addons/refinedstorage/RSCraftJob.java | 191 +++++++++++ ...sFluidHandler.java => RSFluidHandler.java} | 4 +- ...{RsItemHandler.java => RSItemHandler.java} | 6 +- .../blocks/blockentities/MeBridgeEntity.java | 39 ++- ...sBridgeEntity.java => RSBridgeEntity.java} | 54 ++- .../common/setup/APBlockEntityTypes.java | 4 +- .../common/util/BasicCraftJob.java | 206 ++++++++++++ .../inventory/IStorageSystemPeripheral.java | 35 ++ 14 files changed, 1077 insertions(+), 268 deletions(-) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AECraftJob.java delete mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/ae2/CraftJob.java create mode 100644 src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSCraftJob.java rename src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/{RsFluidHandler.java => RSFluidHandler.java} (91%) rename src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/{RsItemHandler.java => RSItemHandler.java} (87%) rename src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/{RsBridgeEntity.java => RSBridgeEntity.java} (60%) create mode 100644 src/main/java/de/srendi/advancedperipherals/common/util/BasicCraftJob.java diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AEApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AEApi.java index 5aa8ffa91..51958de66 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AEApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AEApi.java @@ -19,11 +19,13 @@ import appeng.api.storage.MEStorage; import appeng.api.storage.cells.IBasicCellItem; import appeng.blockentity.storage.DriveBlockEntity; +import appeng.crafting.execution.CraftingCpuLogic; import appeng.crafting.pattern.EncodedPatternItem; import appeng.helpers.iface.PatternContainer; import appeng.items.storage.BasicStorageCell; import appeng.me.cells.BasicCellHandler; import appeng.me.cells.BasicCellInventory; +import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.parts.storagebus.StorageBusPart; import com.the9grounds.aeadditions.item.storage.StorageCell; import com.the9grounds.aeadditions.item.storage.SuperStorageCell; @@ -290,6 +292,14 @@ public static Map parseGenericStack(GenericStack stack) { return Collections.emptyMap(); } + public static List parseKeyCounter(KeyCounter counter) { + List parsedKeys = new ArrayList<>(); + for (AEKey key : counter.keySet()) { + parsedKeys.add(parseGenericStack(new GenericStack(key, counter.get(key)))); + } + + return parsedKeys; + } public static Map parseDrive(DriveBlockEntity drive) { Map map = new HashMap<>(); @@ -393,24 +403,34 @@ public static Map parseCraftingCPU(ICraftingCPU cpu, boolean rec map.put("coProcessors", coProcessors); map.put("isBusy", isBusy); if (!recursive) - map.put("craftingJob", cpu.getJobStatus() != null ? parseCraftingJob(cpu.getJobStatus(), null) : null); + map.put("craftingJob", cpu.getJobStatus() != null ? parseCraftingJob(cpu.getJobStatus(), null, null) : null); map.put("name", cpu.getName() != null ? cpu.getName().getString() : "Unnamed"); map.put("selectionMode", cpu.getSelectionMode().toString()); return map; } - public static Map parseCraftingJob(CraftingJobStatus job, @Nullable ICraftingCPU cpu) { - Map map = new HashMap<>(); - map.put("requestedItem", parseGenericStack(job.crafting())); - map.put("elapsedTimeNanos", job.elapsedTimeNanos()); - map.put("totalItem", job.totalItems()); - map.put("progress", job.progress()); + public static Object parseCraftingJob(CraftingJobStatus status, AECraftJob craftJob, @Nullable ICraftingCPU cpu) { + Map properties = new HashMap<>(); - if (cpu != null) - map.put("cpu", parseCraftingCPU(cpu, true)); + properties.put("bridge_id", craftJob == null ? -1 : craftJob.getId()); + properties.put("quantity", status.crafting().amount()); + properties.put("resource", parseGenericStack(status.crafting())); - return map; + if (cpu != null) { + CraftingCpuLogic craftingCpuLogic = ((CraftingCPUCluster) cpu).craftingLogic; + long pending = craftingCpuLogic.getPendingOutputs(status.crafting().what()); + long active = craftingCpuLogic.getWaitingFor(status.crafting().what()); + long crafted = status.crafting().amount() - (pending + active); + properties.put("completion", crafted / (double) status.crafting().amount()); + properties.put("crafted", crafted); + + properties.put("id", craftingCpuLogic.getLastLink().getCraftingID().toString()); + + properties.put("cpu", parseCraftingCPU(cpu, true)); + } + + return properties; } public static MEStorage getMonitor(IGridNode node) { @@ -419,6 +439,7 @@ public static MEStorage getMonitor(IGridNode node) { public static boolean isCrafting(ICraftingService grid, GenericFilter filter, @Nullable ICraftingCPU craftingCPU) { + // If the passed cpu is null, check all cpus if (craftingCPU == null) { // Loop through all crafting cpus and check if the item is being crafted. diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AECraftJob.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AECraftJob.java new file mode 100644 index 000000000..f59291c09 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/AECraftJob.java @@ -0,0 +1,312 @@ +package de.srendi.advancedperipherals.common.addons.ae2; + +import appeng.api.networking.IGrid; +import appeng.api.networking.IGridNode; +import appeng.api.networking.crafting.CalculationStrategy; +import appeng.api.networking.crafting.CraftingJobStatus; +import appeng.api.networking.crafting.ICraftingCPU; +import appeng.api.networking.crafting.ICraftingLink; +import appeng.api.networking.crafting.ICraftingPlan; +import appeng.api.networking.crafting.ICraftingRequester; +import appeng.api.networking.crafting.ICraftingService; +import appeng.api.networking.crafting.ICraftingSimulationRequester; +import appeng.api.networking.crafting.ICraftingSubmitResult; +import appeng.api.networking.security.IActionSource; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.KeyCounter; +import appeng.me.cluster.implementations.CraftingCPUCluster; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.peripheral.IComputerAccess; +import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.blocks.blockentities.MeBridgeEntity; +import de.srendi.advancedperipherals.common.util.BasicCraftJob; +import de.srendi.advancedperipherals.common.util.StatusConstants; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.function.Supplier; + +//TODO needs to persistent - should be stored in the me bridge +// We also need to do the same for the rs bridge. So we want to create a proper interface to keep the lua functions the same +public class AECraftJob extends BasicCraftJob { + + private final IGridNode node; + private final IActionSource source; + private final ICraftingSimulationRequester simulationRequester; + private final ICraftingRequester requester; + private ICraftingCPU targetCpu; + private final AEKey toCraft; + + private Future futureJob; + private ICraftingPlan currentJob; + @Nullable + private ICraftingLink jobLink; // Job after calculation was done + // Because the properties in `CraftingJobStatus` are set when the object is created, we need to create a supplier which + // always re-fetches the object from the cpu + private Supplier jobStatus; + // In the case the job is done and would return null, we have this cached one. + private CraftingJobStatus cachedStatus; + + public AECraftJob(Level world, final IComputerAccess computer, IGridNode node, AEKey item, long amount, MeBridgeEntity bridge, ICraftingCPU target) { + super(computer, "ae", world, amount); + this.node = node; + this.source = bridge; + this.toCraft = item; + this.simulationRequester = bridge; + this.requester = bridge; + this.targetCpu = target; + } + + @LuaFunction + public final Object getCraftingCPU() { + return AEApi.parseCraftingCPU(targetCpu, true); + } + + @Nullable + public ICraftingLink getJobLink() { + return jobLink; + } + + public ICraftingCPU getTargetCpu() { + return targetCpu; + } + + public AEKey getToCraft() { + return toCraft; + } + + @Override + protected boolean isJobDone() { + return jobLink != null && jobLink.isDone(); + } + + @Override + protected boolean isJobCanceled() { + return jobLink != null && jobLink.isCanceled(); + } + + @Override + public Object getParsedRequestedItem() { + if (getJobStatus() == null) { + return null; + } + return AEApi.parseGenericStack(getJobStatus().crafting()); + } + + @Override + public long getElapsedTime() { + if (getJobStatus() == null) { + return -1; + } + return getJobStatus().elapsedTimeNanos(); + } + + @Override + public long getTotalItems() { + if (getJobStatus() == null) { + return -1; + } + return getJobStatus().totalItems(); + } + + @Override + public long getItemProgress() { + if (getJobStatus() == null) { + return -1; + } + return getJobStatus().progress(); + } + + @Override + public Object getEmittedItems() { + if (currentJob == null) { + return null; + } + return AEApi.parseKeyCounter(currentJob.emittedItems()); + } + + @Override + public Object getUsedItems() { + if (currentJob == null) { + return null; + } + return AEApi.parseKeyCounter(currentJob.usedItems()); + } + + @Override + public Object getMissingItems() { + if (currentJob == null) { + return null; + } + return AEApi.parseKeyCounter(currentJob.missingItems()); + } + + @Override + public boolean hasMultiplePaths() { + if (currentJob == null) { + return false; + } + return currentJob.multiplePaths(); + } + + @Override + public Object getFinalOutput() { + if (currentJob == null) { + return null; + } + return AEApi.parseGenericStack(currentJob.finalOutput()); + } + + @Override + public boolean cancel() { + if (targetCpu instanceof CraftingCPUCluster cluster) { + if (cluster.isBusy()) { + cluster.cancel(); + return true; + } + } + return false; + } + + @LuaFunction + public long getUsedBytes() { + if (currentJob == null) { + return -1; + } + return currentJob.bytes(); + } + + public AECraftJob withJobStatus(Supplier jobStatus) { + this.jobStatus = jobStatus; + return this; + } + + public AECraftJob withCPU(ICraftingCPU craftingCpu) { + if (this.targetCpu == null) { + this.targetCpu = craftingCpu; + } + return this; + } + + public void startCalculation() { + if (startedCalculation) { + return; + } + startedCalculation = true; + + IGrid grid = node.getGrid(); + + ICraftingService craftingService = grid.getService(ICraftingService.class); + + if (!craftingService.isCraftable(toCraft)) { + fireEvent(true, StatusConstants.NOT_CRAFTABLE); + calculationNotSuccessful = true; + return; + } + + futureJob = craftingService.beginCraftingCalculation(world, this.simulationRequester, toCraft, amount, CalculationStrategy.REPORT_MISSING_ITEMS); + fireEvent(false, StatusConstants.CALCULATION_STARTED); + } + + public void maybeCraft() { + if (startedCrafting || futureJob == null || !futureJob.isDone()) { + return; + } + ICraftingPlan job; + + try { + job = futureJob.get(); + } catch (ExecutionException | InterruptedException ex) { + AdvancedPeripherals.debug("Tried to get job, but job calculation is not done. Should be done.", org.apache.logging.log4j.Level.ERROR); + ex.printStackTrace(); + fireEvent(true, StatusConstants.UNKNOWN_ERROR); + return; + } + + if (job == null) { + AdvancedPeripherals.debug("Job is null, should not be null.", org.apache.logging.log4j.Level.ERROR); + fireEvent(true, StatusConstants.UNKNOWN_ERROR); + return; + } + this.currentJob = job; + + KeyCounter missing = job.missingItems(); + if (!missing.isEmpty()) { + fireEvent(true, StatusConstants.MISSING_ITEMS); + calculationNotSuccessful = true; + return; + } + + IGrid grid = node.getGrid(); + + ICraftingService craftingService = grid.getService(ICraftingService.class); + ICraftingSubmitResult submitResult = craftingService.submitJob(job, requester, targetCpu, false, this.source); + if (!submitResult.successful()) { + calculationNotSuccessful = true; + fireEvent(true, submitResult.errorCode().toString()); + return; + } + + this.jobLink = submitResult.link(); + this.futureJob = null; + setStartedCrafting(); + prepareCPUAndStatus(craftingService); + } + + public void jobStateChanged() { + ICraftingLink jobLink = this.jobLink; + if (jobLink == null) { + fireEvent(true, StatusConstants.UNKNOWN_ERROR); + return; + } + + if (jobLink.isCanceled() && !isJobCanceled) { + fireEvent(false, StatusConstants.JOB_CANCELED); + setJobCanceled(); + return; + } + + if (jobLink.isDone() && !isJobDone) { + fireEvent(false, StatusConstants.JOB_DONE); + setJobDone(); + } + } + + private void prepareCPUAndStatus(ICraftingService service) { + if (jobLink == null || jobStatus != null || !startedCrafting) { + return; + } + for (ICraftingCPU cpu : service.getCpus()) { + if (cpu instanceof CraftingCPUCluster cpuCluster) { + if (cpuCluster.craftingLogic.getLastLink() != null && cpuCluster.craftingLogic.getLastLink().getCraftingID().equals(jobLink.getCraftingID())) { + this.jobStatus = () -> { + // Compare the id of the job in the cpu. This job object can exist longer than the job needs time to complete. So the cpu could have a new job + if (cpuCluster.craftingLogic.getLastLink() != null && cpuCluster.craftingLogic.getLastLink().getCraftingID().equals(jobLink.getCraftingID())) + return cpuCluster.getJobStatus(); + return null; + }; + cpuCluster.craftingLogic.addListener((key) -> { + // The last time the listeners are called from the cpu logic is when the job is finished + // These listeners are not intended by ae2 to be used like this, but it works, and we don't modify the key + if (cpuCluster.getJobStatus() != null) { + this.cachedStatus = cpuCluster.getJobStatus(); + } + }); + this.targetCpu = cpu; + return; + } + } + } + AdvancedPeripherals.debug("Could not find CPU or job link even after job started", org.apache.logging.log4j.Level.WARN); + } + + private CraftingJobStatus getJobStatus() { + if (jobStatus == null || jobStatus.get() == null && cachedStatus != null) { + return cachedStatus; + } + cachedStatus = jobStatus.get(); + return jobStatus.get(); + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/CraftJob.java b/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/CraftJob.java deleted file mode 100644 index e113ed21d..000000000 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/ae2/CraftJob.java +++ /dev/null @@ -1,138 +0,0 @@ -package de.srendi.advancedperipherals.common.addons.ae2; - -import appeng.api.networking.IGrid; -import appeng.api.networking.IGridNode; -import appeng.api.networking.crafting.CalculationStrategy; -import appeng.api.networking.crafting.ICraftingCPU; -import appeng.api.networking.crafting.ICraftingPlan; -import appeng.api.networking.crafting.ICraftingService; -import appeng.api.networking.crafting.ICraftingSimulationRequester; -import appeng.api.networking.security.IActionSource; -import appeng.api.stacks.AEKey; -import dan200.computercraft.api.lua.ILuaCallback; -import dan200.computercraft.api.lua.LuaException; -import dan200.computercraft.api.lua.MethodResult; -import dan200.computercraft.api.peripheral.IComputerAccess; -import de.srendi.advancedperipherals.AdvancedPeripherals; -import net.minecraft.world.level.Level; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -public class CraftJob implements ILuaCallback { - - public static final String EVENT = "crafting"; - - private final IComputerAccess computer; - private final IGridNode node; - private final IActionSource source; - private final ICraftingSimulationRequester requester; - private final ICraftingCPU target; - private final AEKey item; - - private final long amount; - private final Level world; - private Future futureJob; - private boolean startedCrafting = false; - - private MethodResult result; - private LuaException exception; - - public CraftJob(Level world, final IComputerAccess computer, IGridNode node, AEKey item, long amount, IActionSource source, - ICraftingSimulationRequester requester, ICraftingCPU target) { - this.computer = computer; - this.node = node; - this.world = world; - this.source = source; - this.item = item; - this.amount = amount; - this.requester = requester; - this.target = target; - } - - protected void fireEvent(boolean success, @Nullable String exception) { - this.result = MethodResult.of(success, exception); - this.exception = new LuaException(exception); - this.computer.queueEvent(EVENT, success, exception); - } - - protected void fireNotConnected() { - fireEvent(false, "not connected"); - } - - public void setStartedCrafting(boolean startedCrafting) { - this.startedCrafting = startedCrafting; - } - - public boolean isCraftingStarted() { - return startedCrafting; - } - - public void startCrafting() { - IGrid grid = node.getGrid(); - if (grid == null) { //true when the block is not connected - fireNotConnected(); - return; - } - - ICraftingService crafting = grid.getService(ICraftingService.class); - - if (item == null) { - AdvancedPeripherals.debug("Could not get AEItem from monitor", org.apache.logging.log4j.Level.FATAL); - return; - } - - if (!crafting.isCraftable(item)) { - fireEvent(false, item.getId().toString() + " is not craftable"); - return; - } - - futureJob = crafting.beginCraftingCalculation(world, this.requester, item, amount, CalculationStrategy.REPORT_MISSING_ITEMS); - fireEvent(true, "Started calculation of the recipe. After it's finished, the system will start crafting the item."); - } - - public void maybeCraft() { - if (startedCrafting || futureJob == null || !futureJob.isDone()) - return; - ICraftingPlan job; - try { - job = futureJob.get(); - } catch (ExecutionException | InterruptedException ex) { - AdvancedPeripherals.debug("Tried to get job, but job calculation is not done. Should be done.", org.apache.logging.log4j.Level.FATAL); - ex.printStackTrace(); - return; - } - - if (job == null) { - AdvancedPeripherals.debug("Job is null, should not be null.", org.apache.logging.log4j.Level.FATAL); - return; - } - - if (job.simulation()) { - return; - } - - IGrid grid = node.getGrid(); - if (grid == null) { - return; - } - - //TODO: Create events or methods like `isCraftingFinished` or `getCraftingJobState` - ICraftingService crafting = grid.getService(ICraftingService.class); - crafting.submitJob(job, null, target, false, this.source); - - setStartedCrafting(true); - - this.futureJob = null; - } - - @NotNull - @Override - public MethodResult resume(Object[] objects) { - if (result != null) return result; - if (exception != null) return MethodResult.of(exception); - return MethodResult.of(); - } -} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MEBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MEBridgePeripheral.java index e4978a18e..17f9541b0 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MEBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/MEBridgePeripheral.java @@ -18,7 +18,7 @@ import dan200.computercraft.core.apis.TableHelper; import dan200.computercraft.core.computer.ComputerSide; import de.srendi.advancedperipherals.common.addons.ae2.AEApi; -import de.srendi.advancedperipherals.common.addons.ae2.CraftJob; +import de.srendi.advancedperipherals.common.addons.ae2.AECraftJob; import de.srendi.advancedperipherals.common.addons.ae2.MEFluidHandler; import de.srendi.advancedperipherals.common.addons.ae2.MEItemHandler; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; @@ -35,6 +35,10 @@ import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.Direction; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; @@ -49,12 +53,14 @@ public class MEBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral { public static final String PERIPHERAL_TYPE = "me_bridge"; - private final MeBridgeEntity tile; + + private final MeBridgeEntity bridge; + private final ICapabilityProvider capabilityWrapper = new CapabilityWrapper(this); private IGridNode node; public MEBridgePeripheral(MeBridgeEntity tileEntity) { super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); - this.tile = tileEntity; + this.bridge = tileEntity; this.node = tileEntity.getActionableNode(); } @@ -62,6 +68,11 @@ public void setNode(IManagedGridNode node) { this.node = node.getNode(); } + @Override + public Object getTarget() { + return capabilityWrapper; + } + @Override public boolean isEnabled() { return APConfig.PERIPHERALS_CONFIG.enableMEBridge.get(); @@ -71,6 +82,14 @@ private ICraftingService getCraftingService() { return node.getGrid().getCraftingService(); } + protected MEItemHandler getItemHandler() { + return new MEItemHandler(AEApi.getMonitor(node), bridge); + } + + protected MEFluidHandler getFluidHandler() { + return new MEFluidHandler(AEApi.getMonitor(node), bridge); + } + /** * exports an item out of the system to a valid inventory * @@ -79,8 +98,7 @@ private ICraftingService getCraftingService() { * @return the exportable amount or null with a string if something went wrong */ protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException { - MEStorage monitor = AEApi.getMonitor(node); - MEItemHandler itemHandler = new MEItemHandler(monitor, tile); + MEItemHandler itemHandler = getItemHandler(); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -100,8 +118,7 @@ protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable II * @return the exportable amount or null with a string if something went wrong */ protected MethodResult exportToTank(@NotNull IArguments arguments, @Nullable IFluidHandler targetTank) throws LuaException { - MEStorage monitor = AEApi.getMonitor(node); - MEFluidHandler fluidHandler = new MEFluidHandler(monitor, tile); + MEFluidHandler fluidHandler = getFluidHandler(); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -121,8 +138,7 @@ protected MethodResult exportToTank(@NotNull IArguments arguments, @Nullable IFl * @return the imported amount or null with a string if something went wrong */ protected MethodResult importToME(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException { - MEStorage monitor = AEApi.getMonitor(node); - MEItemHandler itemHandler = new MEItemHandler(monitor, tile); + MEItemHandler itemHandler = getItemHandler(); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -142,8 +158,7 @@ protected MethodResult importToME(@NotNull IArguments arguments, @Nullable IItem * @return the imported amount or null with a string if something went wrong */ protected MethodResult importToME(@NotNull IArguments arguments, @Nullable IFluidHandler targetTank) throws LuaException { - MEStorage monitor = AEApi.getMonitor(node); - MEFluidHandler fluidHandler = new MEFluidHandler(monitor, tile); + MEFluidHandler fluidHandler = getFluidHandler(); Pair filter = FluidFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) @@ -553,37 +568,41 @@ public MethodResult getAvailableChemicalStorage() { } @Override - @LuaFunction(mainThread = true) + @LuaFunction public final MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) return notConnected(null); Pair filter = ItemFilter.parse(arguments.getTable(0)); if (filter.rightPresent()) - return MethodResult.of(false, filter.getRight()); + return MethodResult.of(null, filter.getRight()); ItemFilter parsedFilter = filter.getLeft(); if (parsedFilter.isEmpty()) - return MethodResult.of(false, StatusConstants.EMPTY_FILTER.toString()); + return MethodResult.of(null, StatusConstants.EMPTY_FILTER.toString()); String cpuName = arguments.optString(1, ""); - ICraftingCPU target = AEApi.getCraftingCPU(node, cpuName); - if (!cpuName.isEmpty() && target == null) - return MethodResult.of(false, "CPU " + cpuName + " does not exists"); - ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class); - Pair stack = AEApi.findAEStackFromFilter(AEApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft()); - if (stack.getRight() == null && stack.getLeft() == 0) - return MethodResult.of(null, StatusConstants.NOT_CRAFTABLE.toString()); + return new CraftJobCallback(computer, () -> { + ICraftingCPU target = AEApi.getCraftingCPU(node, cpuName); + if (!cpuName.isEmpty() && target == null) { + return MethodResult.of(null, StatusConstants.CPU_NOT_FOUND.withInfo(cpuName)); + } - CraftJob job = new CraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), tile, tile, target); - tile.addJob(job); - ServerWorker.add(job::startCrafting); - return MethodResult.of(true); + ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class); + Pair stack = AEApi.findAEStackFromFilter(AEApi.getMonitor(bridge.getGridNode()), craftingGrid, parsedFilter); + if (stack.getRight() == null && stack.getLeft() == 0) { + return MethodResult.of(null, StatusConstants.NOT_CRAFTABLE.toString()); + } + + AECraftJob job = new AECraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), bridge, target); + bridge.addJob(job); + return MethodResult.of(job.withCPU(target)); + }).pull; } @Override - @LuaFunction(mainThread = true) + @LuaFunction public final MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) return notConnected(null); @@ -597,19 +616,20 @@ public final MethodResult craftFluid(IComputerAccess computer, IArguments argume return MethodResult.of(false, StatusConstants.EMPTY_FILTER.toString()); String cpuName = arguments.optString(1, ""); - ICraftingCPU target = AEApi.getCraftingCPU(node, cpuName); - if (!cpuName.isEmpty() && target == null) - return MethodResult.of(false, "CPU " + cpuName + " does not exists"); + return new CraftJobCallback(computer, () -> { + ICraftingCPU target = AEApi.getCraftingCPU(node, cpuName); + if (!cpuName.isEmpty() && target == null) + return MethodResult.of(null, StatusConstants.CPU_NOT_FOUND.withInfo(cpuName)); - ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class); - Pair stack = AEApi.findAEFluidFromFilter(AEApi.getMonitor(tile.getGridNode()), craftingGrid, filter.getLeft()); - if (stack.getRight() == null && stack.getLeft() == 0) - return MethodResult.of(null, StatusConstants.NOT_CRAFTABLE.toString()); + ICraftingService craftingGrid = node.getGrid().getService(ICraftingService.class); + Pair stack = AEApi.findAEFluidFromFilter(AEApi.getMonitor(bridge.getGridNode()), craftingGrid, parsedFilter); + if (stack.getRight() == null && stack.getLeft() == 0) + return MethodResult.of(false, StatusConstants.NOT_CRAFTABLE.toString()); - CraftJob job = new CraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), tile, tile, target); - tile.addJob(job); - ServerWorker.add(job::startCrafting); - return MethodResult.of(true); + AECraftJob job = new AECraftJob(owner.getLevel(), computer, node, stack.getRight(), parsedFilter.getCount(), bridge, target); + bridge.addJob(job); + return MethodResult.of(job.withCPU(target)); + }).pull; } @Override @@ -627,9 +647,11 @@ public MethodResult getCraftingTasks() { List jobs = new ArrayList<>(); - for (ICraftingCPU cpu : craftingGrid.getCpus()) { - if (cpu.getJobStatus() != null) - jobs.add(AEApi.parseCraftingJob(cpu.getJobStatus(), cpu)); + for (AECraftJob job : bridge.getJobs()) { + for (ICraftingCPU cpu : craftingGrid.getCpus()) { + if (cpu.isBusy() && job.getToCraft().matches(cpu.getJobStatus().crafting())) + jobs.add(AEApi.parseCraftingJob(cpu.getJobStatus(), job, cpu)); + } } return MethodResult.of(jobs); } @@ -637,7 +659,17 @@ public MethodResult getCraftingTasks() { @Override @LuaFunction(mainThread = true) public MethodResult getCraftingTask(int id) { - return null; + if (!isAvailable()) + return notConnected(null); + + AECraftJob foundJob = null; + + for (AECraftJob job : bridge.getJobs()) { + if (job.getId() == id) { + foundJob = job; + } + } + return MethodResult.of(foundJob); } @@ -766,4 +798,22 @@ public final MethodResult getCraftingCPUs() { } return MethodResult.of(map); } + + private static final class CapabilityWrapper implements ICapabilityProvider { + private final MEBridgePeripheral peripheral; + + private CapabilityWrapper(MEBridgePeripheral peripheral) { + this.peripheral = peripheral; + } + + @Override + public LazyOptional getCapability(final Capability cap, final Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return LazyOptional.of(this.peripheral::getItemHandler).cast(); + } else if (cap == ForgeCapabilities.FLUID_HANDLER) { + return LazyOptional.of(this.peripheral::getFluidHandler).cast(); + } + return LazyOptional.empty(); + } + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java index cd14a8dd0..a0b002894 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/RsBridgePeripheral.java @@ -2,8 +2,6 @@ import com.refinedmods.refinedstorage.api.autocrafting.ICraftingManager; import com.refinedmods.refinedstorage.api.autocrafting.ICraftingPattern; -import com.refinedmods.refinedstorage.api.autocrafting.task.CalculationResultType; -import com.refinedmods.refinedstorage.api.autocrafting.task.ICalculationResult; import com.refinedmods.refinedstorage.api.autocrafting.task.ICraftingTask; import com.refinedmods.refinedstorage.api.network.INetwork; import dan200.computercraft.api.lua.IArguments; @@ -13,13 +11,13 @@ import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.core.apis.TableHelper; import dan200.computercraft.core.computer.ComputerSide; -import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.owner.BlockEntityPeripheralOwner; import de.srendi.advancedperipherals.common.addons.refinedstorage.RSApi; +import de.srendi.advancedperipherals.common.addons.refinedstorage.RSCraftJob; import de.srendi.advancedperipherals.common.addons.refinedstorage.RSNode; -import de.srendi.advancedperipherals.common.addons.refinedstorage.RsFluidHandler; -import de.srendi.advancedperipherals.common.addons.refinedstorage.RsItemHandler; -import de.srendi.advancedperipherals.common.blocks.blockentities.RsBridgeEntity; +import de.srendi.advancedperipherals.common.addons.refinedstorage.RSFluidHandler; +import de.srendi.advancedperipherals.common.addons.refinedstorage.RSItemHandler; +import de.srendi.advancedperipherals.common.blocks.blockentities.RSBridgeEntity; import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.StatusConstants; @@ -29,10 +27,13 @@ import de.srendi.advancedperipherals.common.util.inventory.IStorageSystemPeripheral; import de.srendi.advancedperipherals.common.util.inventory.InventoryUtil; import de.srendi.advancedperipherals.common.util.inventory.ItemFilter; -import de.srendi.advancedperipherals.common.util.inventory.ItemUtil; import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; @@ -45,12 +46,16 @@ import java.util.Map; import java.util.Optional; -public class RsBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral { +public class RsBridgePeripheral extends BasePeripheral> implements IStorageSystemPeripheral { public static final String PERIPHERAL_TYPE = "rs_bridge"; - public RsBridgePeripheral(RsBridgeEntity tileEntity) { + private final RSBridgeEntity bridge; + private final ICapabilityProvider capabilityWrapper = new CapabilityWrapper(this); + + public RsBridgePeripheral(RSBridgeEntity tileEntity) { super(PERIPHERAL_TYPE, new BlockEntityPeripheralOwner<>(tileEntity)); + this.bridge = tileEntity; } private RSNode getNode() { @@ -70,11 +75,24 @@ private boolean isAvailable() { return getNetwork() != null; } + @Override + public Object getTarget() { + return capabilityWrapper; + } + @Override public boolean isEnabled() { return APConfig.PERIPHERALS_CONFIG.enableRSBridge.get(); } + protected RSItemHandler getItemHandler() { + return new RSItemHandler(getNetwork()); + } + + protected RSFluidHandler getFluidHandler() { + return new RSFluidHandler(getNetwork()); + } + @Override @LuaFunction(mainThread = true) public final boolean isConnected() { @@ -396,7 +414,7 @@ public final MethodResult getPatterns(IArguments arguments) throws LuaException } protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException { - RsItemHandler itemHandler = new RsItemHandler(getNetwork()); + RSItemHandler itemHandler = new RSItemHandler(getNetwork()); if (targetInventory == null) return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND); @@ -408,7 +426,7 @@ protected MethodResult exportToChest(@NotNull IArguments arguments, @Nullable II } protected MethodResult importToSystem(@NotNull IArguments arguments, @Nullable IItemHandler targetInventory) throws LuaException { - RsItemHandler itemHandler = new RsItemHandler(getNetwork()); + RSItemHandler itemHandler = new RSItemHandler(getNetwork()); if (targetInventory == null) return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND); @@ -420,7 +438,7 @@ protected MethodResult importToSystem(@NotNull IArguments arguments, @Nullable I } protected MethodResult exportToTank(@NotNull IArguments arguments, @Nullable IFluidHandler targetInventory) throws LuaException { - RsFluidHandler itemHandler = new RsFluidHandler(getNetwork()); + RSFluidHandler itemHandler = new RSFluidHandler(getNetwork()); if (targetInventory == null) return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND); @@ -432,7 +450,7 @@ protected MethodResult exportToTank(@NotNull IArguments arguments, @Nullable IFl } protected MethodResult importToSystem(@NotNull IArguments arguments, @Nullable IFluidHandler targetInventory) throws LuaException { - RsFluidHandler itemHandler = new RsFluidHandler(getNetwork()); + RSFluidHandler itemHandler = new RSFluidHandler(getNetwork()); if (targetInventory == null) return MethodResult.of(0, StatusConstants.TARGET_NOT_FOUND); @@ -535,7 +553,7 @@ public final MethodResult getItem(IArguments arguments) throws LuaException { if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - return MethodResult.of(RSApi.parseItemStack(RSApi.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); + return MethodResult.of(RSApi.parseItemStack(RSApi.findItemFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()), getNetwork())); } @Override @@ -557,8 +575,8 @@ public MethodResult getChemical(IArguments arguments) throws LuaException { } @Override - @LuaFunction(mainThread = true) - public final MethodResult craftItem(IComputerAccess computerAccess, IArguments arguments) throws LuaException { + @LuaFunction + public final MethodResult craftItem(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) return notConnected(null); @@ -566,21 +584,20 @@ public final MethodResult craftItem(IComputerAccess computerAccess, IArguments a if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - ItemStack stack = RSApi.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); - if (stack.isEmpty()) - return MethodResult.of(null, StatusConstants.NOT_CRAFTABLE.toString()); + return new CraftJobCallback(computer, () -> { + ItemStack stack = RSApi.findItemFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); + if (stack.isEmpty()) + return MethodResult.of(null, "NOT_CRAFTABLE"); - ICalculationResult result = getNetwork().getCraftingManager().create(stack, filter.getLeft().getCount()); - CalculationResultType type = result.getType(); - if (type == CalculationResultType.OK) - getNetwork().getCraftingManager().start(result.getTask()); - AdvancedPeripherals.debug("Crafting Result of '" + ItemUtil.getRegistryKey(stack).toString() + "':" + type); - return MethodResult.of(type == CalculationResultType.OK); + RSCraftJob job = new RSCraftJob(computer, getLevel(), filter.getLeft().getCount(), stack, getNetwork().getCraftingManager()); + bridge.addJob(job); + return MethodResult.of(job); + }).pull; } @Override - @LuaFunction(mainThread = true) - public final MethodResult craftFluid(IComputerAccess computerAccess, IArguments arguments) throws LuaException { + @LuaFunction + public final MethodResult craftFluid(IComputerAccess computer, IArguments arguments) throws LuaException { if (!isAvailable()) return notConnected(null); @@ -588,16 +605,15 @@ public final MethodResult craftFluid(IComputerAccess computerAccess, IArguments if (filter.rightPresent()) return MethodResult.of(null, filter.getRight()); - FluidStack stack = RSApi.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); - if (stack.isEmpty()) - return MethodResult.of(null, StatusConstants.NOT_CRAFTABLE.toString()); + return new CraftJobCallback(computer, () -> { + FluidStack stack = RSApi.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); + if (stack.isEmpty()) + return MethodResult.of(null, "NOT_CRAFTABLE"); - ICalculationResult result = getNetwork().getCraftingManager().create(stack, filter.getLeft().getCount()); - CalculationResultType type = result.getType(); - if (type == CalculationResultType.OK) - getNetwork().getCraftingManager().start(result.getTask()); - AdvancedPeripherals.debug("Crafting Result of '" + FluidUtil.getRegistryKey(stack).toString() + "':" + type); - return MethodResult.of(type == CalculationResultType.OK); + RSCraftJob job = new RSCraftJob(computer, getLevel(), filter.getLeft().getCount(), stack, getNetwork().getCraftingManager()); + bridge.addJob(job); + return MethodResult.of(job); + }).pull; } @Override @@ -606,17 +622,28 @@ public MethodResult craftChemical(IComputerAccess computer, IArguments arguments } @Override - public MethodResult getCraftingTask(int id) { - return null; + @LuaFunction(mainThread = true) + public MethodResult getCraftingTasks() { + if (!isAvailable()) + return notConnected(null); + + return MethodResult.of(RSApi.getCraftingTasks(getNetwork(), bridge)); } @Override @LuaFunction(mainThread = true) - public MethodResult getCraftingTasks() { + public MethodResult getCraftingTask(int id) { if (!isAvailable()) return notConnected(null); - return MethodResult.of(RSApi.getCraftingTasks(getNetwork())); + RSCraftJob foundJob = null; + + for (RSCraftJob job : bridge.getJobs()) { + if (job.getId() == id) { + foundJob = job; + } + } + return MethodResult.of(foundJob); } @Override @@ -657,18 +684,33 @@ public final MethodResult isCrafting(IArguments arguments) throws LuaException { if (!isAvailable()) return notConnected(false); - Pair filter = ItemFilter.parse(arguments.getTable(0)); - if (filter.rightPresent()) + Pair, String> filter = GenericFilter.parseGeneric(arguments.getTable(0)); + if (filter.getRight() != null) return MethodResult.of(null, filter.getRight()); - ItemStack stack = RSApi.findStackFromFilter(getNetwork(), getNetwork().getCraftingManager(), filter.getLeft()); - if (stack.isEmpty()) - return MethodResult.of(null, "NOT_CRAFTABLE"); + GenericFilter parsedFilter = filter.getLeft(); + + if (parsedFilter instanceof ItemFilter itemFilter) { + ItemStack stack = RSApi.findItemFromFilter(getNetwork(), getNetwork().getCraftingManager(), itemFilter); + if (stack.isEmpty()) + return MethodResult.of(null, "NOT_CRAFTABLE"); - for (ICraftingTask task : getNetwork().getCraftingManager().getTasks()) { - ItemStack taskStack = task.getRequested().getItem(); - if (taskStack != null && taskStack.sameItem(stack)) - return MethodResult.of(true); + for (ICraftingTask task : getNetwork().getCraftingManager().getTasks()) { + ItemStack taskStack = task.getRequested().getItem(); + if (taskStack != null && taskStack.sameItem(stack)) + return MethodResult.of(true); + } + } + if (parsedFilter instanceof FluidFilter itemFilter) { + FluidStack stack = RSApi.findFluidFromFilter(getNetwork(), getNetwork().getCraftingManager(), itemFilter); + if (stack.isEmpty()) + return MethodResult.of(null, "NOT_CRAFTABLE"); + + for (ICraftingTask task : getNetwork().getCraftingManager().getTasks()) { + FluidStack taskStack = task.getRequested().getFluid(); + if (taskStack != null && taskStack.isFluidEqual(stack)) + return MethodResult.of(true); + } } return MethodResult.of(false); } @@ -679,14 +721,30 @@ public final MethodResult isCraftable(IArguments arguments) throws LuaException if (!isAvailable()) return notConnected(false); - Pair filter = ItemFilter.parse(arguments.getTable(0)); - if (filter.rightPresent()) - return MethodResult.of(false, filter.getRight()); + Pair, String> filter = GenericFilter.parseGeneric(arguments.getTable(0)); + if (filter.getRight() != null) + return MethodResult.of(null, filter.getRight()); + + GenericFilter parsedFilter = filter.getLeft(); + + return MethodResult.of(RSApi.findPatternFromFilters(getNetwork(), null, parsedFilter).getLeft() != null); + } + + private static final class CapabilityWrapper implements ICapabilityProvider { + private final RsBridgePeripheral peripheral; - ItemFilter parsedFilter = filter.getLeft(); - if (parsedFilter.isEmpty()) - return MethodResult.of(false, "EMPTY_FILTER"); + private CapabilityWrapper(RsBridgePeripheral peripheral) { + this.peripheral = peripheral; + } - return MethodResult.of(RSApi.isItemCraftable(getNetwork(), parsedFilter.toItemStack())); + @Override + public LazyOptional getCapability(final Capability cap, final Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return LazyOptional.of(this.peripheral::getItemHandler).cast(); + } else if (cap == ForgeCapabilities.FLUID_HANDLER) { + return LazyOptional.of(this.peripheral::getFluidHandler).cast(); + } + return LazyOptional.empty(); + } } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSApi.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSApi.java index ff9c67875..383918038 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSApi.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSApi.java @@ -16,6 +16,7 @@ import com.refinedmods.refinedstorage.apiimpl.network.node.NetworkNode; import com.refinedmods.refinedstorage.apiimpl.network.node.diskdrive.DiskDriveNetworkNode; import de.srendi.advancedperipherals.AdvancedPeripherals; +import de.srendi.advancedperipherals.common.blocks.blockentities.RSBridgeEntity; import de.srendi.advancedperipherals.common.util.LuaConverter; import de.srendi.advancedperipherals.common.util.Pair; import de.srendi.advancedperipherals.common.util.inventory.FluidFilter; @@ -54,11 +55,11 @@ private static INetworkNode read(CompoundTag tag, NetworkNode node) { return node; } - public static ItemStack findStackFromStack(INetwork network, @Nullable ICraftingManager crafting, ItemStack item) { - return findStackFromFilter(network, crafting, ItemFilter.fromStack(item)); + public static ItemStack findItemFromStack(INetwork network, @Nullable ICraftingManager crafting, ItemStack item) { + return findItemFromFilter(network, crafting, ItemFilter.fromStack(item)); } - public static ItemStack findStackFromFilter(INetwork network, @Nullable ICraftingManager crafting, ItemFilter filter) { + public static ItemStack findItemFromFilter(INetwork network, @Nullable ICraftingManager crafting, ItemFilter filter) { for (StackListEntry temp : network.getItemStorageCache().getList().getStacks()) { if (filter.test(temp.getStack())) return temp.getStack().copy(); @@ -370,11 +371,11 @@ public static List getDiskDrives(INetwork network) { return diskDrives; } - public static List getCraftingTasks(INetwork network) { + public static List getCraftingTasks(INetwork network, RSBridgeEntity entity) { List tasks = new ArrayList<>(); - for (ICraftingTask task : network.getCraftingManager().getTasks()) { - tasks.add(parseCraftingTask(task, network)); + for (RSCraftJob task : entity.getJobs()) { + tasks.add(parseCraftingTask(task.getCraftingTask(), network)); } return tasks; diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSCraftJob.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSCraftJob.java new file mode 100644 index 000000000..4461d7e22 --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSCraftJob.java @@ -0,0 +1,191 @@ +package de.srendi.advancedperipherals.common.addons.refinedstorage; + +import com.refinedmods.refinedstorage.api.autocrafting.ICraftingManager; +import com.refinedmods.refinedstorage.api.autocrafting.task.CalculationResultType; +import com.refinedmods.refinedstorage.api.autocrafting.task.ICalculationResult; +import com.refinedmods.refinedstorage.api.autocrafting.task.ICraftingRequestInfo; +import com.refinedmods.refinedstorage.api.autocrafting.task.ICraftingTask; +import dan200.computercraft.api.peripheral.IComputerAccess; +import de.srendi.advancedperipherals.common.util.BasicCraftJob; +import de.srendi.advancedperipherals.common.util.LuaConverter; +import de.srendi.advancedperipherals.common.util.StatusConstants; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidStack; + +public class RSCraftJob extends BasicCraftJob { + + private final ICraftingManager craftingManager; + private final ItemStack itemToCraft; + private final FluidStack fluidToCraft; + + private ICalculationResult calculationResult; + private ICraftingTask craftingTask; + + public RSCraftJob(IComputerAccess computer, Level world, long amount, ItemStack itemToCraft, ICraftingManager calculationResult) { + super(computer, "rs", world, amount); + this.craftingManager = calculationResult; + this.itemToCraft = itemToCraft; + this.fluidToCraft = FluidStack.EMPTY; + } + + public RSCraftJob(IComputerAccess computer, Level world, long amount, FluidStack fluidToCraft, ICraftingManager calculationResult) { + super(computer, "rs", world, amount); + this.craftingManager = calculationResult; + this.fluidToCraft = fluidToCraft; + this.itemToCraft = ItemStack.EMPTY; + } + + @Override + protected boolean isJobDone() { + return craftingTask != null && craftingTask.getCompletionPercentage() == 100; + } + + @Override + protected boolean isJobCanceled() { + return craftingTask != null && craftingTask.getCompletionPercentage() != 100 && craftingManager.getTasks().stream().noneMatch(task -> task.getId() == this.craftingTask.getId()); + } + + @Override + public Object getParsedRequestedItem() { + return LuaConverter.itemStackToObject(itemToCraft, (int) amount); + } + + @Override + public long getElapsedTime() { + if (craftingTask == null) { + return -1; + } + return System.nanoTime() - craftingTask.getStartTime() * 1_000; + } + + @Override + public long getTotalItems() { + if (craftingTask == null || craftingTask.getRequested() == null) { + return -1; + } + ICraftingRequestInfo requestInfo = craftingTask.getRequested(); + + return requestInfo.getFluid() != null ? requestInfo.getFluid().getAmount() : requestInfo.getItem().getCount(); + } + + @Override + public long getItemProgress() { + return 0; + } + + @Override + public Object getEmittedItems() { + return null; + } + + @Override + public Object getUsedItems() { + return null; + } + + @Override + public Object getMissingItems() { + return null; + } + + @Override + public boolean hasMultiplePaths() { + return false; + } + + @Override + public Object getFinalOutput() { + return null; + } + + @Override + public boolean cancel() { + if (isJobDone() || isJobCanceled()) { + return false; + } + craftingManager.cancel(craftingTask.getId()); + return true; + } + + public ICraftingTask getCraftingTask() { + return craftingTask; + } + + @Override + protected void maybeCraft() { + if (startedCrafting || calculationNotSuccessful || calculationResult == null) { + return; + } + + CalculationResultType type = calculationResult.getType(); + + if (type == CalculationResultType.MISSING) { + fireEvent(true, StatusConstants.MISSING_ITEMS); + calculationNotSuccessful = true; + return; + } + + if (!calculationResult.isOk()) { + calculationNotSuccessful = true; + fireEvent(true, type.toString()); + return; + } + + craftingManager.start(calculationResult.getTask()); + this.craftingTask = calculationResult.getTask(); + setStartedCrafting(); + } + + @Override + protected void startCalculation() { + if (startedCalculation) { + return; + } + startedCalculation = true; + maybeCalculateFluid(); + maybeCalculateItem(); + } + + private void maybeCalculateItem() { + if (itemToCraft.isEmpty()) { + return; + } + + calculationResult = craftingManager.create(itemToCraft, (int) amount); + fireEvent(false, StatusConstants.CALCULATION_STARTED); + } + + private void maybeCalculateFluid() { + if (fluidToCraft.isEmpty()) { + return; + } + + if (craftingManager.getPattern(fluidToCraft) == null) { + fireEvent(true, StatusConstants.NOT_CRAFTABLE); + return; + } + + calculationResult = craftingManager.create(fluidToCraft, (int) amount); + fireEvent(false, StatusConstants.CALCULATION_STARTED); + } + + @Override + public void jobStateChanged() { + if (this.craftingTask == null) { + fireEvent(true, StatusConstants.UNKNOWN_ERROR); + return; + } + + if (isJobCanceled() && !isJobCanceled) { + fireEvent(false, StatusConstants.JOB_CANCELED); + setJobCanceled(); + return; + } + + if (isJobDone() && !isJobDone) { + fireEvent(true, StatusConstants.JOB_DONE); + setJobDone(); + } + } +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSFluidHandler.java similarity index 91% rename from src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSFluidHandler.java index b2b3ff62b..a92b414ee 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsFluidHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSFluidHandler.java @@ -8,12 +8,12 @@ import net.minecraftforge.fluids.FluidStack; import org.jetbrains.annotations.NotNull; -public class RsFluidHandler implements IStorageSystemFluidHandler { +public class RSFluidHandler implements IStorageSystemFluidHandler { @NotNull private final INetwork network; - public RsFluidHandler(@NotNull INetwork network) { + public RSFluidHandler(@NotNull INetwork network) { this.network = network; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSItemHandler.java similarity index 87% rename from src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java rename to src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSItemHandler.java index dd7e6fe13..185944568 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RsItemHandler.java +++ b/src/main/java/de/srendi/advancedperipherals/common/addons/refinedstorage/RSItemHandler.java @@ -14,12 +14,12 @@ * * @see de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RsBridgePeripheral */ -public class RsItemHandler implements IStorageSystemItemHandler { +public class RSItemHandler implements IStorageSystemItemHandler { @NotNull private final INetwork network; - public RsItemHandler(@NotNull INetwork network) { + public RSItemHandler(@NotNull INetwork network) { this.network = network; } @@ -31,7 +31,7 @@ public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate @Override public ItemStack extractItem(ItemFilter filter, int count, boolean simulate) { - ItemStack item = RSApi.findStackFromFilter(network, network.getCraftingManager(), filter); + ItemStack item = RSApi.findItemFromFilter(network, network.getCraftingManager(), filter); if (item == null) AdvancedPeripherals.debug("Trying to extract item: " + item + " from filter: " + filter); if(item == null) diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java index e1d16f3a7..5479b6910 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/MeBridgeEntity.java @@ -1,19 +1,24 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; +import appeng.api.config.Actionable; import appeng.api.networking.GridFlags; import appeng.api.networking.GridHelper; import appeng.api.networking.IGridNode; import appeng.api.networking.IInWorldGridNodeHost; import appeng.api.networking.IManagedGridNode; +import appeng.api.networking.crafting.ICraftingLink; +import appeng.api.networking.crafting.ICraftingRequester; import appeng.api.networking.crafting.ICraftingSimulationRequester; import appeng.api.networking.energy.IEnergyService; import appeng.api.networking.security.IActionHost; import appeng.api.networking.security.IActionSource; import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.AEKey; import appeng.api.storage.StorageHelper; import appeng.api.util.AECableType; +import com.google.common.collect.ImmutableSet; import de.srendi.advancedperipherals.common.addons.ae2.AEApi; -import de.srendi.advancedperipherals.common.addons.ae2.CraftJob; +import de.srendi.advancedperipherals.common.addons.ae2.AECraftJob; import de.srendi.advancedperipherals.common.addons.ae2.MEBridgeEntityListener; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MEBridgePeripheral; import de.srendi.advancedperipherals.common.blocks.base.IInventoryBlock; @@ -21,6 +26,7 @@ import de.srendi.advancedperipherals.common.configuration.APConfig; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; import de.srendi.advancedperipherals.common.setup.APBlocks; +import de.srendi.advancedperipherals.common.util.BasicCraftJob; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.player.Player; @@ -35,10 +41,11 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; -public class MeBridgeEntity extends PeripheralBlockEntity implements IActionSource, IActionHost, IInWorldGridNodeHost, ICraftingSimulationRequester, IInventoryBlock { +public class MeBridgeEntity extends PeripheralBlockEntity implements IActionSource, IInWorldGridNodeHost, ICraftingSimulationRequester, IInventoryBlock, ICraftingRequester { - private final List jobs = new CopyOnWriteArrayList<>(); + private final List jobs = new CopyOnWriteArrayList<>(); private boolean initialized = false; private final IManagedGridNode mainNode = GridHelper.createManagedNode(this, MEBridgeEntityListener.INSTANCE); @@ -73,10 +80,10 @@ public void handleTick(Level level, BlockState state, Bl } // Try to start the job if the job calculation finished - jobs.forEach(CraftJob::maybeCraft); + jobs.forEach(BasicCraftJob::tick); - // Remove the job if the crafting started, we can't do anything with it anymore - jobs.removeIf(CraftJob::isCraftingStarted); + // Remove the job if the crafting calculation failed, we can't do anything with it anymore + jobs.removeIf(BasicCraftJob::canBePurged); } } @@ -137,10 +144,14 @@ public IActionSource getActionSource() { return this; } - public void addJob(CraftJob job) { + public void addJob(AECraftJob job) { jobs.add(job); } + public List getJobs() { + return jobs; + } + @Override public int getInvSize() { return 9; @@ -168,4 +179,18 @@ public boolean canTakeItemThroughFace(int index, @NotNull ItemStack stack, @NotN return false; } + @Override + public ImmutableSet getRequestedJobs() { + return jobs.stream().filter(BasicCraftJob::isCraftingStarted).map(AECraftJob::getJobLink).collect(Collectors.toCollection(ImmutableSet::of)); + } + + @Override + public long insertCraftedItems(ICraftingLink link, AEKey what, long amount, Actionable mode) { + return 0; + } + + @Override + public void jobStateChange(ICraftingLink link) { + jobs.stream().filter(BasicCraftJob::isCraftingStarted).filter((job) -> job.getJobLink().getCraftingID().equals(link.getCraftingID())).forEach(AECraftJob::jobStateChanged); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RSBridgeEntity.java similarity index 60% rename from src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java rename to src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RSBridgeEntity.java index 22a9f0c7d..d137b7812 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RsBridgeEntity.java +++ b/src/main/java/de/srendi/advancedperipherals/common/blocks/blockentities/RSBridgeEntity.java @@ -1,5 +1,7 @@ package de.srendi.advancedperipherals.common.blocks.blockentities; +import com.refinedmods.refinedstorage.api.autocrafting.ICraftingManager; +import com.refinedmods.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorListener; import com.refinedmods.refinedstorage.api.network.node.INetworkNodeProxy; import com.refinedmods.refinedstorage.blockentity.NetworkNodeBlockEntity; import com.refinedmods.refinedstorage.blockentity.config.IRedstoneConfigurable; @@ -7,22 +9,29 @@ import dan200.computercraft.api.peripheral.IPeripheral; import de.srendi.advancedperipherals.AdvancedPeripherals; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.RsBridgePeripheral; +import de.srendi.advancedperipherals.common.addons.refinedstorage.RSCraftJob; import de.srendi.advancedperipherals.common.addons.refinedstorage.RSNode; import de.srendi.advancedperipherals.common.setup.APBlockEntityTypes; +import de.srendi.advancedperipherals.common.util.BasicCraftJob; import de.srendi.advancedperipherals.lib.peripherals.IPeripheralTileEntity; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + import static dan200.computercraft.shared.Capabilities.CAPABILITY_PERIPHERAL; -public class RsBridgeEntity extends NetworkNodeBlockEntity implements INetworkNodeProxy, IRedstoneConfigurable, IPeripheralTileEntity { +public class RSBridgeEntity extends NetworkNodeBlockEntity implements INetworkNodeProxy, IRedstoneConfigurable, IPeripheralTileEntity, ICraftingMonitorListener { private static final String PERIPHERAL_SETTINGS = "AP_SETTINGS"; //I have no clue what this does, but it works @@ -30,9 +39,11 @@ public class RsBridgeEntity extends NetworkNodeBlockEntity implements IN protected CompoundTag peripheralSettings; protected RsBridgePeripheral peripheral = new RsBridgePeripheral(this); private LazyOptional peripheralCap; + private final List jobs = new CopyOnWriteArrayList<>(); + private boolean addedListener = false; - public RsBridgeEntity(BlockPos pos, BlockState state) { - super(APBlockEntityTypes.RS_BRIDGE.get(), pos, state, SPEC); + public RSBridgeEntity(BlockPos pos, BlockState state) { + super(APBlockEntityTypes.RS_BRIDGE.get(), pos, state, SPEC, RSNode.class); peripheralSettings = new CompoundTag(); } @@ -51,6 +62,33 @@ public LazyOptional getCapability(@NotNull Capability cap, @Nullabl return super.getCapability(cap, direction); } + @Override + public void handleTick(Level level, BlockState state, BlockEntityType type) { + if (getNode().getNetwork() != null) { + ICraftingManager manager = getNode().getNetwork().getCraftingManager(); + if (manager != null && !this.addedListener) { + manager.addListener(this); + this.addedListener = true; + } else if (manager == null && this.addedListener) { + this.addedListener = false; + } + } + + // Try to start the job if the job calculation finished + jobs.forEach(BasicCraftJob::tick); + + // Remove the job if the crafting calculation failed, we can't do anything with it anymore + jobs.removeIf(BasicCraftJob::canBePurged); + } + + public void addJob(RSCraftJob job) { + jobs.add(job); + } + + public List getJobs() { + return jobs; + } + public RSNode createNode(Level level, BlockPos blockPos) { return new RSNode(level, blockPos); } @@ -77,4 +115,14 @@ public void markSettingsChanged() { setChanged(); } + @Override + public void onAttached() { + + } + + @Override + public void onChanged() { + // Not as perfect as we currently do it for our AE jobs. This is called for every job even if they aren't created from the bridge + jobs.stream().filter(BasicCraftJob::isCraftingStarted).forEach(BasicCraftJob::jobStateChanged); + } } diff --git a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java index 16c64d30a..16ace7696 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java +++ b/src/main/java/de/srendi/advancedperipherals/common/setup/APBlockEntityTypes.java @@ -16,7 +16,7 @@ import de.srendi.advancedperipherals.common.blocks.blockentities.NBTStorageEntity; import de.srendi.advancedperipherals.common.blocks.blockentities.PlayerDetectorEntity; import de.srendi.advancedperipherals.common.blocks.blockentities.RedstoneIntegratorEntity; -import de.srendi.advancedperipherals.common.blocks.blockentities.RsBridgeEntity; +import de.srendi.advancedperipherals.common.blocks.blockentities.RSBridgeEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.registries.RegistryObject; @@ -39,6 +39,6 @@ protected static void register() { public static final RegistryObject> NBT_STORAGE = APRegistration.TILE_ENTITIES.register("nbt_storage", () -> new BlockEntityType<>(NBTStorageEntity::new, Sets.newHashSet(APBlocks.NBT_STORAGE.get()), null)); public static final RegistryObject> PLAYER_DETECTOR = APRegistration.TILE_ENTITIES.register("player_detector", () -> new BlockEntityType<>(PlayerDetectorEntity::new, Sets.newHashSet(APBlocks.PLAYER_DETECTOR.get()), null)); public static final RegistryObject> REDSTONE_INTEGRATOR = APRegistration.TILE_ENTITIES.register("redstone_integrator", () -> new BlockEntityType<>(RedstoneIntegratorEntity::new, Sets.newHashSet(APBlocks.REDSTONE_INTEGRATOR.get()), null)); - public static final RegistryObject> RS_BRIDGE = APAddons.refinedStorageLoaded ? APRegistration.TILE_ENTITIES.register("rs_bridge", () -> new BlockEntityType<>(RsBridgeEntity::new, Sets.newHashSet(APBlocks.RS_BRIDGE.get()), null)) : null; + public static final RegistryObject> RS_BRIDGE = APAddons.refinedStorageLoaded ? APRegistration.TILE_ENTITIES.register("rs_bridge", () -> new BlockEntityType<>(RSBridgeEntity::new, Sets.newHashSet(APBlocks.RS_BRIDGE.get()), null)) : null; } diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/BasicCraftJob.java b/src/main/java/de/srendi/advancedperipherals/common/util/BasicCraftJob.java new file mode 100644 index 000000000..227bdcffa --- /dev/null +++ b/src/main/java/de/srendi/advancedperipherals/common/util/BasicCraftJob.java @@ -0,0 +1,206 @@ +package de.srendi.advancedperipherals.common.util; + +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.peripheral.IComputerAccess; +import de.srendi.advancedperipherals.common.util.StatusConstants; +import net.minecraft.world.level.Level; + +import java.util.concurrent.atomic.AtomicLong; + +public abstract class BasicCraftJob { + + protected static final String EVENT = "_crafting"; + private static final int JOB_DONE_PURGE_TIME = 5 * 60 * 1000; + + public static final AtomicLong ID_SEQ = new AtomicLong(); + + protected final long id = ID_SEQ.incrementAndGet(); + protected final IComputerAccess computer; + protected final String eventName; + protected final long amount; + protected final Level world; + + protected boolean startedCrafting = false; + protected boolean startedCalculation = false; + protected boolean calculationNotSuccessful = false; + protected boolean errorOccurred = false; + protected boolean isJobDone = false; + protected long jobDoneTime = 0; + protected boolean isJobCanceled = false; + protected String debugMessage = null; + + public BasicCraftJob(IComputerAccess computer, String eventName, Level world, long amount) { + this.computer = computer; + this.eventName = eventName; + this.world = world; + this.amount = amount; + } + + @LuaFunction + public final long getId() { + return id; + } + + protected abstract boolean isJobDone(); + + @LuaFunction + public final boolean isDone() { + return isJobDone(); + } + + protected abstract boolean isJobCanceled(); + + @LuaFunction + public final boolean isCanceled() { + return isJobCanceled(); + } + + @LuaFunction + public final boolean isCraftingStarted() { + return startedCrafting; + } + + @LuaFunction + public final boolean isCalculationStarted() { + return startedCalculation; + } + + @LuaFunction + public final boolean isCalculationNotSuccessful() { + return calculationNotSuccessful; + } + + @LuaFunction + public final boolean hasErrorOccurred() { + return errorOccurred; + } + + @LuaFunction + public final String getDebugMessage() { + return debugMessage; + } + + @LuaFunction(value = "getRequestedItem") + public final Object getRequestedItemLua() { + return getParsedRequestedItem(); + } + + @LuaFunction(value = "getElapsedTime") + public final long getElapsedTimeLua() { + return getElapsedTime(); + } + + @LuaFunction(value = "getTotalItems") + public final long getTotalItemsLua() { + return getTotalItems(); + } + + @LuaFunction(value = "getItemProgress") + public final long getItemProgressLua() { + return getItemProgress(); + } + + @LuaFunction(value = "getEmittedItems") + public final Object getEmittedItemsLua() { + return getEmittedItems(); + } + + @LuaFunction(value = "getUsedItems") + public final Object getUsedItemsLua() { + return getUsedItems(); + } + + @LuaFunction(value = "getMissingItems") + public final Object getMissingItemsLua() { + return getMissingItems(); + } + + @LuaFunction(value = "hasMultiplePaths") + public final boolean hasMultiplePathsLua() { + return hasMultiplePaths(); + } + + @LuaFunction(value = "getFinalOutput") + public final Object getFinalOutputLua() { + return getFinalOutput(); + } + + @LuaFunction(value = "cancel") + public final boolean cancelLua() { + return cancel(); + } + + public abstract Object getParsedRequestedItem(); + + public abstract long getElapsedTime(); + + public abstract long getTotalItems(); + + public abstract long getItemProgress(); + + public abstract Object getEmittedItems(); + + public abstract Object getUsedItems(); + + public abstract Object getMissingItems(); + + public abstract boolean hasMultiplePaths(); + + public abstract Object getFinalOutput(); + + public abstract boolean cancel(); + + public Level getWorld() { + return world; + } + + public long getAmount() { + return amount; + } + + public boolean canBePurged() { + return calculationNotSuccessful || ((isJobDone || isJobCanceled) && jobDoneTime + JOB_DONE_PURGE_TIME < System.currentTimeMillis()); + } + + protected void fireNotConnected() { + fireEvent(true, StatusConstants.NOT_CONNECTED); + } + + public void setStartedCrafting() { + this.startedCrafting = true; + fireEvent(false, StatusConstants.CRAFTING_STARTED); + } + + public void setJobCanceled() { + this.isJobCanceled = true; + this.jobDoneTime = System.currentTimeMillis(); + } + + public void setJobDone() { + this.isJobDone = true; + this.jobDoneTime = System.currentTimeMillis(); + } + + protected void fireEvent(boolean error, StatusConstants message) { + this.computer.queueEvent(eventName + EVENT, error, this.id, message.toString()); + this.debugMessage = message.toString(); + this.errorOccurred = error; + } + + protected void fireEvent(boolean error, String message) { + this.computer.queueEvent(eventName + EVENT, error, this.id, message); + this.debugMessage = message; + this.errorOccurred = error; + } + + public final void tick() { + startCalculation(); + maybeCraft(); + } + + protected abstract void maybeCraft(); + + protected abstract void startCalculation(); + + public abstract void jobStateChanged(); +} diff --git a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java index 2936490d3..e567e39d3 100644 --- a/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java +++ b/src/main/java/de/srendi/advancedperipherals/common/util/inventory/IStorageSystemPeripheral.java @@ -1,10 +1,16 @@ package de.srendi.advancedperipherals.common.util.inventory; import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.ILuaCallback; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IComputerAccess; import de.srendi.advancedperipherals.common.addons.computercraft.peripheral.MEBridgePeripheral; +import de.srendi.advancedperipherals.common.util.ServerWorker; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; /** * Implementation for common storage peripheral functions. Used for AE2 {@link MEBridgePeripheral} @@ -119,4 +125,33 @@ public interface IStorageSystemPeripheral { MethodResult getPatterns(IArguments arguments) throws LuaException; + // TODO: In 1.20.1 we should use the mainThread descriptor instead + @Deprecated(forRemoval = true, since = "1.20.1") + class CraftJobCallback implements ILuaCallback { + public static final String EVENT_ID = "_bridge_craft_requested"; + private static final AtomicInteger ID_SEQ = new AtomicInteger(); + + public final MethodResult pull = MethodResult.pullEvent(EVENT_ID, this); + private final int id = ID_SEQ.incrementAndGet(); + private volatile MethodResult result; + + public CraftJobCallback(IComputerAccess computer, Supplier worker) { + ServerWorker.add(() -> { + this.result = worker.get(); + computer.queueEvent(EVENT_ID, this.id); + }); + } + + @NotNull + @Override + public MethodResult resume(Object[] datas) { + if (!(datas[0] instanceof String event) || !(datas[1] instanceof Number taskId)) { + return this.pull; + } + if (!event.equals(EVENT_ID) || taskId.intValue() != this.id) { + return this.pull; + } + return this.result; + } + } } From 6a91ec0819f604146f90b6b443c567d4d126e0f0 Mon Sep 17 00:00:00 2001 From: Srendi Date: Mon, 18 Aug 2025 00:28:23 +0200 Subject: [PATCH 188/188] Add rotation support for the text and rectangle --- .../objects/twodim/RectangleRenderer.java | 24 ++++++++++++++---- .../objects/twodim/TextRenderer.java | 25 +++++++++++++++---- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java index bc8f91678..55618cf74 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/RectangleRenderer.java @@ -8,6 +8,7 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; import de.srendi.advancedperipherals.client.RenderUtil; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import net.minecraft.client.renderer.GameRenderer; @@ -18,25 +19,38 @@ public class RectangleRenderer implements ITwoDObjectRenderer { @Override - public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + public void renderBatch(List objects, ForgeGui gui, PoseStack ignored, float partialTick, int screenWidth, int screenHeight) { RenderSystem.setShader(GameRenderer::getPositionColorShader); BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); for (RenderableObject obj : objects) { + float rotX = obj.rotX; + float rotY = obj.rotY; + float rotZ = obj.rotZ; + + PoseStack poseStack = new PoseStack(); + + poseStack.translate(obj.x, obj.y, obj.z); + poseStack.pushPose(); + Matrix4f matrix = poseStack.last().pose(); + poseStack.mulPose(Vector3f.XP.rotationDegrees(rotX)); + poseStack.mulPose(Vector3f.YP.rotationDegrees(rotY)); + poseStack.mulPose(Vector3f.ZP.rotationDegrees(rotZ)); + float alpha = obj.opacity; float red = RenderUtil.getRed(obj.color); float green = RenderUtil.getGreen(obj.color); float blue = RenderUtil.getBlue(obj.color); - bufferbuilder.vertex(matrix, obj.x, obj.maxY, obj.z).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, obj.maxX, obj.maxY, obj.z).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, obj.maxX, obj.y, obj.z).color(red, green, blue, alpha).endVertex(); - bufferbuilder.vertex(matrix, obj.x, obj.y, obj.z).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, 0, obj.maxY - obj.y, 0).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.maxX - obj.x, obj.maxY - obj.y, 0).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, obj.maxX - obj.x, 0, 0).color(red, green, blue, alpha).endVertex(); + bufferbuilder.vertex(matrix, 0, 0, 0).color(red, green, blue, alpha).endVertex(); poseStack.popPose(); } diff --git a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java index 57cb0fa5e..ecde02ad7 100644 --- a/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java +++ b/src/main/java/de/srendi/advancedperipherals/client/smartglasses/objects/twodim/TextRenderer.java @@ -1,6 +1,8 @@ package de.srendi.advancedperipherals.client.smartglasses.objects.twodim; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.RenderableObject; import de.srendi.advancedperipherals.common.smartglasses.modules.overlay.objects.two_dim.TextObject; import net.minecraft.client.Minecraft; @@ -11,12 +13,13 @@ public class TextRenderer implements ITwoDObjectRenderer { @Override - public void renderBatch(List objects, ForgeGui gui, PoseStack poseStack, float partialTick, int screenWidth, int screenHeight) { + public void renderBatch(List objects, ForgeGui gui, PoseStack ignored, float partialTick, int screenWidth, int screenHeight) { Minecraft minecraft = Minecraft.getInstance(); for (RenderableObject obj : objects) { TextObject text = (TextObject) obj; - poseStack.pushPose(); - poseStack.scale(text.fontSize, text.fontSize, 1); + float rotX = obj.rotX; + float rotY = obj.rotY; + float rotZ = obj.rotZ; float x = text.x; @@ -24,10 +27,22 @@ public void renderBatch(List objects, ForgeGui gui, PoseStack x -= (minecraft.font.width(text.content) * text.fontSize) / 2f; } + PoseStack poseStack = new PoseStack(); + + poseStack.translate(x / text.fontSize, text.y / text.fontSize, obj.z); + + poseStack.pushPose(); + + poseStack.mulPose(Vector3f.XP.rotationDegrees(rotX)); + poseStack.mulPose(Vector3f.YP.rotationDegrees(rotY)); + poseStack.mulPose(Vector3f.ZP.rotationDegrees(rotZ)); + + poseStack.scale(text.fontSize, text.fontSize, 1); + if (!text.shadow) { - minecraft.font.drawShadow(poseStack, text.content, x / text.fontSize, text.y / text.fontSize, text.color); + minecraft.font.drawShadow(poseStack, text.content, 0, 0, text.color); } else { - minecraft.font.draw(poseStack, text.content, x / text.fontSize, text.y / text.fontSize, text.color); + minecraft.font.draw(poseStack, text.content, 0, 0, text.color); } poseStack.popPose(); }