From 7b424d42cc1d6428c72d1671f2c0dc2d06cde769 Mon Sep 17 00:00:00 2001 From: haykam821 <24855774+haykam821@users.noreply.github.com> Date: Sat, 7 Dec 2024 19:38:38 -0500 Subject: [PATCH] Add lock setters --- .../xyz/nucleoid/extras/lobby/NEItems.java | 7 ++ .../lobby/block/ContainerLockAccess.java | 12 ++++ .../extras/lobby/item/LockSetterItem.java | 71 +++++++++++++++++++ .../mixin/lobby/BeaconBlockEntityMixin.java | 32 +++++++++ .../LockableContainerBlockEntityMixin.java | 32 +++++++++ .../data/nucleoid_extras/lang/en_us.json | 5 ++ src/main/resources/extras.mixins.json | 2 + 7 files changed, 161 insertions(+) create mode 100644 src/main/java/xyz/nucleoid/extras/lobby/block/ContainerLockAccess.java create mode 100644 src/main/java/xyz/nucleoid/extras/lobby/item/LockSetterItem.java create mode 100644 src/main/java/xyz/nucleoid/extras/mixin/lobby/BeaconBlockEntityMixin.java create mode 100644 src/main/java/xyz/nucleoid/extras/mixin/lobby/LockableContainerBlockEntityMixin.java diff --git a/src/main/java/xyz/nucleoid/extras/lobby/NEItems.java b/src/main/java/xyz/nucleoid/extras/lobby/NEItems.java index 823b08c4..22c404e7 100644 --- a/src/main/java/xyz/nucleoid/extras/lobby/NEItems.java +++ b/src/main/java/xyz/nucleoid/extras/lobby/NEItems.java @@ -47,6 +47,7 @@ import xyz.nucleoid.extras.lobby.item.LobbyBlockItem; import xyz.nucleoid.extras.lobby.item.LobbyHeadItem; import xyz.nucleoid.extras.lobby.item.LobbyTallBlockItem; +import xyz.nucleoid.extras.lobby.item.LockSetterItem; import xyz.nucleoid.extras.lobby.item.QuickArmorStandItem; import xyz.nucleoid.extras.lobby.item.RuleBookItem; import xyz.nucleoid.extras.lobby.item.tater.CreativeTaterBoxItem; @@ -75,6 +76,7 @@ public class NEItems { entries.add(NEItems.GOLD_LAUNCH_PAD); entries.add(NEItems.IRON_LAUNCH_PAD); entries.add(NEItems.CONTRIBUTOR_STATUE); + entries.add(NEItems.LOCK_SETTER); entries.add(NEItems.INFINITE_DISPENSER); entries.add(NEItems.INFINITE_DROPPER); entries.add(NEItems.SNAKE_BLOCK); @@ -493,6 +495,11 @@ public class NEItems { .component(NEDataComponentTypes.LAUNCHER, LauncherComponent.DEFAULT) .maxCount(1), settings -> new LaunchFeatherItem(settings)); + public static final Item LOCK_SETTER = register("lock_setter", new Item.Settings() + .component(DataComponentTypes.LOCK, LockSetterItem.createUnlockableLock()) + .component(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, true) + .maxCount(1), LockSetterItem::new); + public static final Item RULE_BOOK = register("rule_book", new Item.Settings() .rarity(Rarity.EPIC) .component(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, true), settings -> new RuleBookItem(settings)); diff --git a/src/main/java/xyz/nucleoid/extras/lobby/block/ContainerLockAccess.java b/src/main/java/xyz/nucleoid/extras/lobby/block/ContainerLockAccess.java new file mode 100644 index 00000000..76fdcff8 --- /dev/null +++ b/src/main/java/xyz/nucleoid/extras/lobby/block/ContainerLockAccess.java @@ -0,0 +1,12 @@ +package xyz.nucleoid.extras.lobby.block; + +import net.minecraft.inventory.ContainerLock; +import net.minecraft.text.Text; + +public interface ContainerLockAccess { + ContainerLock getContainerLock(); + + void setContainerLock(ContainerLock lock); + + Text getContainerLockName(); +} diff --git a/src/main/java/xyz/nucleoid/extras/lobby/item/LockSetterItem.java b/src/main/java/xyz/nucleoid/extras/lobby/item/LockSetterItem.java new file mode 100644 index 00000000..48a0cf91 --- /dev/null +++ b/src/main/java/xyz/nucleoid/extras/lobby/item/LockSetterItem.java @@ -0,0 +1,71 @@ +package xyz.nucleoid.extras.lobby.item; + +import eu.pb4.polymer.core.api.item.SimplePolymerItem; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.ContainerLock; +import net.minecraft.item.ItemUsageContext; +import net.minecraft.item.Items; +import net.minecraft.predicate.NumberRange.IntRange; +import net.minecraft.predicate.item.ItemPredicate; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import xyz.nucleoid.extras.lobby.block.ContainerLockAccess; + +public class LockSetterItem extends SimplePolymerItem { + public LockSetterItem(Settings settings) { + super(settings, Items.TRIAL_KEY, false); + } + + @Override + public ActionResult useOnBlock(ItemUsageContext context) { + var world = context.getWorld(); + var user = context.getPlayer(); + + if (!world.isClient() && user.isCreativeLevelTwoOp()) { + var stack = context.getStack(); + var newLock = stack.get(DataComponentTypes.LOCK); + + if (newLock != null) { + var pos = context.getBlockPos(); + var blockEntity = world.getBlockEntity(pos); + + if (blockEntity instanceof ContainerLockAccess access) { + var currentLock = access.getContainerLock(); + + if (currentLock == ContainerLock.EMPTY) { + access.setContainerLock(newLock); + sendFeedback(user, access, "locked"); + } else if (!newLock.equals(currentLock)) { + sendFeedback(user, access, "already_locked"); + return ActionResult.FAIL; + } else { + access.setContainerLock(ContainerLock.EMPTY); + sendFeedback(user, access, "unlocked"); + } + + return ActionResult.SUCCESS_SERVER; + } + } + } + + return ActionResult.PASS; + } + + private static void sendFeedback(PlayerEntity player, ContainerLockAccess access, String suffix) { + var text = Text.translatable("text.nucleoid_extras.lock_setter." + suffix, access.getContainerLockName()); + player.sendMessage(text, true); + + player.playSoundToPlayer(SoundEvents.BLOCK_CHEST_LOCKED, SoundCategory.BLOCKS, 1, 1); + } + + public static ContainerLock createUnlockableLock() { + var predicate = ItemPredicate.Builder.create() + .count(IntRange.exactly(-1)) + .build(); + + return new ContainerLock(predicate); + } +} diff --git a/src/main/java/xyz/nucleoid/extras/mixin/lobby/BeaconBlockEntityMixin.java b/src/main/java/xyz/nucleoid/extras/mixin/lobby/BeaconBlockEntityMixin.java new file mode 100644 index 00000000..42f2401d --- /dev/null +++ b/src/main/java/xyz/nucleoid/extras/mixin/lobby/BeaconBlockEntityMixin.java @@ -0,0 +1,32 @@ +package xyz.nucleoid.extras.mixin.lobby; + +import net.minecraft.block.entity.BeaconBlockEntity; +import net.minecraft.inventory.ContainerLock; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import xyz.nucleoid.extras.lobby.block.ContainerLockAccess; + +@Mixin(BeaconBlockEntity.class) +public abstract class BeaconBlockEntityMixin implements ContainerLockAccess { + @Shadow + private ContainerLock lock; + + @Shadow + public abstract Text getDisplayName(); + + @Override + public ContainerLock getContainerLock() { + return this.lock; + } + + @Override + public void setContainerLock(ContainerLock lock) { + this.lock = lock; + } + + @Override + public Text getContainerLockName() { + return this.getDisplayName(); + } +} diff --git a/src/main/java/xyz/nucleoid/extras/mixin/lobby/LockableContainerBlockEntityMixin.java b/src/main/java/xyz/nucleoid/extras/mixin/lobby/LockableContainerBlockEntityMixin.java new file mode 100644 index 00000000..aeb3edeb --- /dev/null +++ b/src/main/java/xyz/nucleoid/extras/mixin/lobby/LockableContainerBlockEntityMixin.java @@ -0,0 +1,32 @@ +package xyz.nucleoid.extras.mixin.lobby; + +import net.minecraft.block.entity.LockableContainerBlockEntity; +import net.minecraft.inventory.ContainerLock; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import xyz.nucleoid.extras.lobby.block.ContainerLockAccess; + +@Mixin(LockableContainerBlockEntity.class) +public abstract class LockableContainerBlockEntityMixin implements ContainerLockAccess { + @Shadow + private ContainerLock lock; + + @Shadow + public abstract Text getDisplayName(); + + @Override + public ContainerLock getContainerLock() { + return this.lock; + } + + @Override + public void setContainerLock(ContainerLock lock) { + this.lock = lock; + } + + @Override + public Text getContainerLockName() { + return this.getDisplayName(); + } +} diff --git a/src/main/resources/data/nucleoid_extras/lang/en_us.json b/src/main/resources/data/nucleoid_extras/lang/en_us.json index ee34bc39..1b037039 100644 --- a/src/main/resources/data/nucleoid_extras/lang/en_us.json +++ b/src/main/resources/data/nucleoid_extras/lang/en_us.json @@ -367,6 +367,7 @@ "item.nucleoid_extras.game_portal_opener": "Game Portal Opener", "item.nucleoid_extras.launch_feather": "Launch Feather", + "item.nucleoid_extras.lock_setter": "Lock Setter", "item.nucleoid_extras.tater_box": "Tater Box", "item.nucleoid_extras.creative_tater_box": "Creative Tater Box", "item.nucleoid_extras.tater_guidebook": "Tater Guidebook", @@ -399,6 +400,10 @@ "text.nucleoid_extras.lobby_items": "Do not use this block outside of lobby!", "text.nucleoid_extras.lobby_only": "(Lobby Only!)", + "text.nucleoid_extras.lock_setter.already_locked": "%s has already has a different lock!", + "text.nucleoid_extras.lock_setter.locked": "%s is now locked!", + "text.nucleoid_extras.lock_setter.unlocked": "%s has been unlocked!", + "text.nucleoid_extras.statistics.web_url": "Click here to check out all the stats for this game!", "text.nucleoid_extras.statistics.bundle_header": "Statistics for %s", "text.nucleoid_extras.statistics.stat": "%s: %s", diff --git a/src/main/resources/extras.mixins.json b/src/main/resources/extras.mixins.json index 42090007..05f15ad2 100644 --- a/src/main/resources/extras.mixins.json +++ b/src/main/resources/extras.mixins.json @@ -14,7 +14,9 @@ "datafixer.Schema1460Mixin", "debug.EntityMixin", "lobby.ArmorStandEntityAccessor", + "lobby.BeaconBlockEntityMixin", "lobby.LivingEntityAccessor", + "lobby.LockableContainerBlockEntityMixin", "lobby.ServerChunkLoadingManagerAccessor", "lobby.ServerPlayerEntityMixin", "lobby.SkullBlockEntityAccessor",