From 732889ad8d64215473e3bc6cf05187150ebdfa92 Mon Sep 17 00:00:00 2001 From: Mgazul Date: Thu, 31 Oct 2024 02:55:26 +0800 Subject: [PATCH] Fixed #340 --- .../world/level/block/MixinDoorBlock.java | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/modules/banner-server/src/main/java/com/mohistmc/banner/mixin/world/level/block/MixinDoorBlock.java b/modules/banner-server/src/main/java/com/mohistmc/banner/mixin/world/level/block/MixinDoorBlock.java index 3427b1109..a4e5a0768 100644 --- a/modules/banner-server/src/main/java/com/mohistmc/banner/mixin/world/level/block/MixinDoorBlock.java +++ b/modules/banner-server/src/main/java/com/mohistmc/banner/mixin/world/level/block/MixinDoorBlock.java @@ -1,5 +1,6 @@ package com.mohistmc.banner.mixin.world.level.block; +import java.util.concurrent.atomic.AtomicInteger; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -11,6 +12,7 @@ import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.gameevent.GameEvent; +import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.event.block.BlockRedstoneEvent; import org.jetbrains.annotations.Nullable; @@ -18,6 +20,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; @Mixin(DoorBlock.class) public abstract class MixinDoorBlock extends Block{ @@ -34,6 +37,15 @@ public MixinDoorBlock(Properties properties) { super(properties); } + @Unique + private final AtomicInteger banner$power = new AtomicInteger(); + @Unique + private final AtomicInteger banner$oldPower = new AtomicInteger(); + @Unique + private org.bukkit.block.Block bukkitBlock; + @Unique + private BlockRedstoneEvent eventRedstone; + /** * @author wdog5 * @reason @@ -41,19 +53,22 @@ public MixinDoorBlock(Properties properties) { @Overwrite public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { // CraftBukkit start - BlockPos otherHalf = pos.relative(state.getValue(HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN); - World bworld = level.getWorld(); - org.bukkit.block.Block bukkitBlock = bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()); - org.bukkit.block.Block blockTop = bworld.getBlockAt(otherHalf.getX(), otherHalf.getY(), otherHalf.getZ()); - - int power = bukkitBlock.getBlockPower(); - int powerTop = blockTop.getBlockPower(); - if (powerTop > power) power = powerTop; - int oldPower = (Boolean) state.getValue(POWERED) ? 15 : 0; + { + BlockPos otherHalf = pos.relative(state.getValue(HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN); + World bworld = level.getWorld(); + bukkitBlock = bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()); + org.bukkit.block.Block blockTop = bworld.getBlockAt(otherHalf.getX(), otherHalf.getY(), otherHalf.getZ()); - if (oldPower == 0 ^ power == 0) { - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power); - level.getCraftServer().getPluginManager().callEvent(eventRedstone); + int power = bukkitBlock.getBlockPower(); + int powerTop = blockTop.getBlockPower(); + if (powerTop > power) power = powerTop; + banner$power.set(power); + int oldPower = (Boolean) state.getValue(POWERED) ? 15 : 0; + banner$oldPower.set(oldPower); + } + if (banner$oldPower.get() == 0 ^ banner$power.get() == 0) { + eventRedstone = new BlockRedstoneEvent(bukkitBlock, banner$oldPower.get(), banner$power.get()); + Bukkit.getPluginManager().callEvent(eventRedstone); boolean bl = eventRedstone.getNewCurrent() > 0; if (bl != (Boolean) state.getValue(OPEN)) { this.playSound((Entity) null, level, pos, bl);