Skip to content

Commit

Permalink
fixed dupe glitch using shulker boxes with transmitter (#274)
Browse files Browse the repository at this point in the history
  • Loading branch information
NewJumper authored and Pedro270707 committed May 1, 2024
1 parent 4f64f92 commit 184004a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
Expand Down Expand Up @@ -85,7 +86,7 @@ public static InteractionResult transmit(Level level, Player player, ItemStack t
MenuProvider menu = level.getBlockState(linkedPos).getMenuProvider(level, linkedPos);
if(menu != null && !level.isClientSide()) {
player.playSound(DDSounds.TRANSMITTER_OPEN, 1, 1);
player.openMenu(menu);
if(player instanceof ServerPlayer serverPlayer) serverPlayer.openMenu(menu);
if(level.getBlockEntity(linkedPos) instanceof ChestBlockEntity chest) chest.startOpen(player);
}

Expand All @@ -100,9 +101,10 @@ private static boolean canConnect(Level level, BlockPos target) {
return level.getBlockState(target).is(DDTags.Blocks.TRANSMITTABLE);
}

private static void formConnection(Level level, ItemStack stack, BlockPos pos) {
public static void formConnection(Level level, ItemStack stack, BlockPos pos) {
CompoundTag tag = stack.getOrCreateTag();
if(pos == null) {
stack.removeTagKey("block");
stack.removeTagKey("blockPos");
return;
}
Expand All @@ -111,7 +113,7 @@ private static void formConnection(Level level, ItemStack stack, BlockPos pos) {
tag.putIntArray("blockPos", List.of(pos.getX(), pos.getY(), pos.getZ()));
}

private static void actionBarMessage(Player player, String key, SoundEvent sound) {
public static void actionBarMessage(Player player, String key, SoundEvent sound) {
player.displayClientMessage(Component.translatable("block." + DeeperDarker.MOD_ID + "." + key), true);
player.playSound(sound);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.kyanite.deeperdarker.mixin;

import com.kyanite.deeperdarker.DeeperDarker;
import com.kyanite.deeperdarker.content.DDItems;
import com.kyanite.deeperdarker.content.DDSounds;
import com.kyanite.deeperdarker.content.items.SculkTransmitterItem;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack;
Expand All @@ -10,21 +12,34 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import java.util.Arrays;

@Mixin(value = { AbstractFurnaceMenu.class, BeaconMenu.class, BrewingStandMenu.class, CartographyTableMenu.class, ChestMenu.class, CraftingMenu.class, DispenserMenu.class, EnchantmentMenu.class, GrindstoneMenu.class, HopperMenu.class, ItemCombinerMenu.class, LoomMenu.class, ShulkerBoxMenu.class, StonecutterMenu.class })
public class ContainerMenuMixin {
@Inject(method = "stillValid", at = @At("RETURN"), cancellable = true)
@Inject(method = "stillValid", at = @At("HEAD"), cancellable = true)
public void stillValid(Player player, CallbackInfoReturnable<Boolean> cir) {
if(cir.getReturnValue()) return;
if(player.getMainHandItem().is(DDItems.SCULK_TRANSMITTER)) cir.setReturnValue(true);
else {
ItemStack transmitter = ItemStack.EMPTY;
if(player.getMainHandItem().is(DDItems.SCULK_TRANSMITTER) && SculkTransmitterItem.isLinked(player.getMainHandItem())) {
transmitter = player.getMainHandItem();
} else {
for(ItemStack stack : player.getInventory().items) {
if(stack.is(DDItems.SCULK_TRANSMITTER)) {
cir.setReturnValue(true);
if(stack.is(DDItems.SCULK_TRANSMITTER) && SculkTransmitterItem.isLinked(stack)) {
transmitter = stack;
break;
}
}
}

if(!transmitter.isEmpty()) {
String block = transmitter.getTag().getString("block");
int[] pos = transmitter.getTag().getIntArray("blockPos");
BlockPos linkedPos = new BlockPos(pos[0], pos[1], pos[2]);

if(player.level().getBlockState(linkedPos).getBlock().getDescriptionId().equals(block)) {
cir.setReturnValue(true);
cir.cancel();
} else {
SculkTransmitterItem.actionBarMessage(player, "not_found", DDSounds.TRANSMITTER_ERROR);
SculkTransmitterItem.formConnection(player.level(), transmitter, null);
}
}
}
}

0 comments on commit 184004a

Please sign in to comment.