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();
}