From 458854b73b09e6f8c6059f629473480d1bb36e18 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Fri, 26 Apr 2024 10:06:35 -0600 Subject: [PATCH 01/31] 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 02/31] 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 03/31] 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 04/31] 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 05/31] 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 06/31] 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 07/31] 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 08/31] 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 09/31] 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 10/31] 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 11/31] 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 12/31] 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 13/31] 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 14/31] 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 15/31] 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 16/31] 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 17/31] 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 18/31] 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 19/31] 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 20/31] 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 21/31] 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 22/31] 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 23/31] 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 24/31] 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 25/31] 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 26/31] 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 27/31] 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 28/31] 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 29/31] 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 df4a445cb083ebfc44b1de43b96e7b83fac58486 Mon Sep 17 00:00:00 2001 From: zyxkad Date: Tue, 28 May 2024 14:54:40 -0600 Subject: [PATCH 30/31] 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 31/31] 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;