diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java index 9c956da0..4bf059c3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java @@ -1,7 +1,9 @@ package io.izzel.arclight.common.mixin.bukkit; import com.google.common.base.Function; +import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.core.util.DamageSourceBridge; +import io.izzel.arclight.common.bridge.core.world.WorldBridge; import io.izzel.arclight.common.mod.util.ArclightCaptures; import io.izzel.arclight.common.mod.util.DistValidate; import net.minecraft.core.BlockPos; @@ -11,16 +13,21 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; import org.bukkit.Bukkit; import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.block.sign.Side; import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.craftbukkit.v.block.CraftBlockState; import org.bukkit.craftbukkit.v.block.CraftBlockStates; +import org.bukkit.craftbukkit.v.block.CraftSign; import org.bukkit.craftbukkit.v.block.data.CraftBlockData; import org.bukkit.craftbukkit.v.damage.CraftDamageSource; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.entity.Item; +import org.bukkit.entity.Player; import org.bukkit.event.block.BlockFadeEvent; import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.block.BlockGrowEvent; @@ -32,6 +39,7 @@ import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ItemSpawnEvent; +import org.bukkit.event.player.PlayerSignOpenEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; @@ -236,4 +244,32 @@ public static NotePlayEvent callNotePlayEvent(Level world, BlockPos pos, NoteBlo cir.setReturnValue(event); } } + + /** + * @author sj-hub9796 + * @reason + */ + @Overwrite + public static boolean callPlayerSignOpenEvent(net.minecraft.world.entity.player.Player player, SignBlockEntity tileEntitySign, boolean front, PlayerSignOpenEvent.Cause cause) { + Block block = CraftBlock.at(tileEntitySign.getLevel(), tileEntitySign.getBlockPos()); + Sign sign; + if (CraftBlockStates.getBlockState(block) instanceof Sign sign1) { + sign = sign1; + } else { + sign = new CraftSign<>(((WorldBridge) tileEntitySign.getLevel()).bridge$getWorld(), tileEntitySign); + } + Side side = front ? Side.FRONT : Side.BACK; + return callPlayerSignOpenEvent(((ServerPlayerEntityBridge) player).bridge$getBukkitEntity(), sign, side, cause); + } + + /** + * @author sj-hub9796 + * @reason + */ + @Overwrite + public static boolean callPlayerSignOpenEvent(Player player, Sign sign, Side side, PlayerSignOpenEvent.Cause cause) { + PlayerSignOpenEvent event = new PlayerSignOpenEvent(player, sign, side, cause); + Bukkit.getPluginManager().callEvent(event); + return !event.isCancelled(); + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BannerBlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BannerBlockEntityMixin.java new file mode 100644 index 00000000..fb8b42b2 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BannerBlockEntityMixin.java @@ -0,0 +1,45 @@ +package io.izzel.arclight.common.mixin.core.world.level.block.entity; + +import io.izzel.arclight.mixin.Decorate; +import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.level.block.entity.BannerBlockEntity; +import net.minecraft.world.level.block.entity.BannerPatternLayers; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.List; + +@Mixin(BannerBlockEntity.class) +public abstract class BannerBlockEntityMixin extends BlockEntity { + + @Shadow private BannerPatternLayers patterns; + + public BannerBlockEntityMixin(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { + super(blockEntityType, blockPos, blockState); + } + + @Decorate(method = "method_58121", inject = true, at = @At(value = "FIELD", target = "Lnet/minecraft/world/level/block/entity/BannerBlockEntity;patterns:Lnet/minecraft/world/level/block/entity/BannerPatternLayers;", opcode = Opcodes.PUTFIELD)) + private void arclight$setPatterns(BannerPatternLayers layers) { + this.setPatterns(layers); + } + + @Decorate(method = "applyImplicitComponents", inject = true, at = @At(value = "FIELD", target = "Lnet/minecraft/world/level/block/entity/BannerBlockEntity;patterns:Lnet/minecraft/world/level/block/entity/BannerPatternLayers;", opcode = Opcodes.PUTFIELD)) + private void arclight$applyLimits(BlockEntity.DataComponentInput dataComponentInput) { + this.setPatterns((BannerPatternLayers) dataComponentInput.getOrDefault(DataComponents.BANNER_PATTERNS, BannerPatternLayers.EMPTY)); // CraftBukkit - apply limits + } + + // CraftBukkit start + public void setPatterns(BannerPatternLayers bannerpatternlayers) { + if (bannerpatternlayers.layers().size() > 20) { + bannerpatternlayers = new BannerPatternLayers(List.copyOf(bannerpatternlayers.layers().subList(0, 20))); + } + this.patterns = bannerpatternlayers; + } + // CraftBukkit end +} diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 16734e11..c6f3eeec 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -491,6 +491,7 @@ "world.level.block.entity.BrushableBlockEntityMixin", "world.level.block.entity.CampfireBlockEntityMixin", "world.level.block.entity.ChestBlockEntityMixin", + "world.level.block.entity.BannerBlockEntityMixin", "world.level.block.entity.ChiseledBookShelfBlockEntityMixin", "world.level.block.entity.CommandBlockLogicMixin", "world.level.block.entity.CommandBlockTileEntity1Mixin",