diff --git a/src/main/java/one/devos/nautical/succ/SimpleEquipableItem.java b/src/main/java/one/devos/nautical/succ/SimpleEquipableItem.java new file mode 100644 index 0000000..3c01a93 --- /dev/null +++ b/src/main/java/one/devos/nautical/succ/SimpleEquipableItem.java @@ -0,0 +1,27 @@ +package one.devos.nautical.succ; + +import java.util.Objects; + +import org.jetbrains.annotations.NotNull; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.Equipable; +import net.minecraft.world.item.Item; + +/** + * Workaround for QSL bug: QSL#320 + */ +public class SimpleEquipableItem extends Item implements Equipable { + private final EquipmentSlot slot; + + public SimpleEquipableItem(Properties settings, EquipmentSlot slot) { + super(settings); + this.slot = Objects.requireNonNull(slot); + } + + @Override + @NotNull + public EquipmentSlot getEquipmentSlot() { + return slot; + } +} diff --git a/src/main/java/one/devos/nautical/succ/Succ.java b/src/main/java/one/devos/nautical/succ/Succ.java index bd3528b..5af5a40 100644 --- a/src/main/java/one/devos/nautical/succ/Succ.java +++ b/src/main/java/one/devos/nautical/succ/Succ.java @@ -32,8 +32,8 @@ public class Succ implements ModInitializer { public static TwisterChampionTrigger TWISTER_CHAMPION = CriteriaTriggers.register(new TwisterChampionTrigger()); - public static Item SUCTION_CUP = new SuctionCupItem(new QuiltItemSettings().equipmentSlot(EquipmentSlot.HEAD).maxCount(2)); - public static Item SUCTION_CUP_BOOTS = new Item(new QuiltItemSettings().equipmentSlot(EquipmentSlot.FEET).maxCount(1)); + public static Item SUCTION_CUP = new SuctionCupItem(new QuiltItemSettings().maxCount(2)); + public static Item SUCTION_CUP_BOOTS = new SimpleEquipableItem(new QuiltItemSettings().maxCount(1), EquipmentSlot.FEET); @SuppressWarnings("deprecation") // entity constructor deprecated to prevent misuse, should only be used here public static EntityType SUCTION_CUP_ENTITY_TYPE = FabricEntityTypeBuilder .create(MobCategory.MISC, ClimbingSuctionCupEntity::new) diff --git a/src/main/java/one/devos/nautical/succ/SuctionCupItem.java b/src/main/java/one/devos/nautical/succ/SuctionCupItem.java index bb40f8d..0de1f30 100644 --- a/src/main/java/one/devos/nautical/succ/SuctionCupItem.java +++ b/src/main/java/one/devos/nautical/succ/SuctionCupItem.java @@ -1,9 +1,10 @@ package one.devos.nautical.succ; +import org.jetbrains.annotations.NotNull; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -14,6 +15,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Equipable; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; @@ -22,7 +24,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -public class SuctionCupItem extends Item { +public class SuctionCupItem extends Item implements Equipable { public static final EquipmentSlot[] CUP_SLOTS = { EquipmentSlot.MAINHAND, EquipmentSlot.OFFHAND, EquipmentSlot.FEET }; public static final TagKey HAND_CLIMBING_CUPS = TagKey.create(Registries.ITEM, Succ.id("hand_climbing_cups")); public static final TagKey FEET_CLIMBING_CUPS = TagKey.create(Registries.ITEM, Succ.id("feet_climbing_cups")); @@ -38,6 +40,7 @@ public SuctionCupItem(Properties properties) { } @Override + @NotNull public InteractionResult useOn(UseOnContext context) { Player player = context.getPlayer(); if (player instanceof ServerPlayer serverPlayer) { @@ -46,6 +49,12 @@ public InteractionResult useOn(UseOnContext context) { return InteractionResult.FAIL; } + @Override + @NotNull + public EquipmentSlot getEquipmentSlot() { + return EquipmentSlot.HEAD; + } + public void tryStartClimbing(ServerPlayer player, UseOnContext ctx) { if (GlobalClimbingManager.isClimbing(player)) { return; @@ -56,9 +65,6 @@ public void tryStartClimbing(ServerPlayer player, UseOnContext ctx) { return; } Level level = ctx.getLevel(); - if (level == null) { - return; - } if (missingCups(player)) { fail(player, MISSING_CUPS); return; @@ -74,7 +80,7 @@ public void tryStartClimbing(ServerPlayer player, UseOnContext ctx) { return; } // offset to the center of the block to prevent getting stuck in adjacent walls - clickPos = new Vec3(Math.floor(headPos.getX()) + 0.5, clickPos.y, Math.floor(headPos.getZ()) + 0.5); + clickPos = new Vec3(headPos.getX() + 0.5, clickPos.y, headPos.getZ() + 0.5); GlobalClimbingManager.startClimbing(player, clickPos, clickedFace); } diff --git a/src/main/java/one/devos/nautical/succ/mixin/InventoryMixin.java b/src/main/java/one/devos/nautical/succ/mixin/InventoryMixin.java index 49a1e37..98e427f 100644 --- a/src/main/java/one/devos/nautical/succ/mixin/InventoryMixin.java +++ b/src/main/java/one/devos/nautical/succ/mixin/InventoryMixin.java @@ -8,10 +8,10 @@ import net.minecraft.world.entity.player.Inventory; import one.devos.nautical.succ.LocalClimbingManager; -@Mixin(Inventory.class) // note: this is a client-only mixin despite entity not being client only +@Mixin(Inventory.class) // note: this is a client-only mixin despite Inventory not being client only public class InventoryMixin { @Inject(method = "swapPaint", at = @At("HEAD"), cancellable = true) - private void succ$preventItemSwapping(double scrollAmount, CallbackInfo ci) { + private void succ$preventItemSwappingWhileClimbing(double scrollAmount, CallbackInfo ci) { if (LocalClimbingManager.INSTANCE != null) { ci.cancel(); }