From 7ce41083cd5c73f32eb4bc48eb09061ad90e93a2 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sat, 29 Oct 2022 17:05:37 +0800 Subject: [PATCH] Update forge to 43.1.47 --- README.md | 2 +- .../network/ServerPlayNetHandlerMixin.java | 7 ++-- .../core/world/entity/LivingEntityMixin.java | 2 +- .../mixin/core/world/entity/MobMixin.java | 7 ++++ .../ai/behavior/StartAttackingMixin.java | 9 +++++ .../item/StandingAndWallBlockItemMixin.java | 33 +++++++++++++++++++ .../main/resources/mixins.arclight.core.json | 1 + build.gradle | 2 +- 8 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/StandingAndWallBlockItemMixin.java diff --git a/README.md b/README.md index 5309c710..2dc15497 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A Bukkit server implementation utilizing Mixin. | Release | Forge | Status | Build | |:-------------:|:-------:|:------:|:------------------------------------------------------------------------------------------------------------------------------------------------------:| -| Horn (1.19.x) | 43.1.3 | ACTIVE | [![1.19 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-19?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-19) | +| Horn (1.19.x) | 43.1.47 | ACTIVE | [![1.19 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-19?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-19) | | 1.18.x | 40.1.80 | LTS | [![1.18 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-18?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-18) | | 1.16.x | 36.2.39 | LTS | [![1.16 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-16?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-16) | diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java index 6d2191f4..0667f12a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java @@ -1298,7 +1298,6 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB // CraftBukkit end InteractionResult enuminteractionresult = interaction.run(player, entity, hand); - if (ForgeHooks.onInteractEntityAt(player, entity, entity.position(), hand) != null) return; // CraftBukkit start if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) { @@ -1324,7 +1323,11 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Override public void onInteraction(InteractionHand hand, Vec3 vec) { - this.performInteraction(hand, (player, e, h) -> e.interactAt(player, vec, h), + this.performInteraction(hand, (player, e, h) -> { + var onInteractEntityAtResult = ForgeHooks.onInteractEntityAt(player, entity, vec, hand); + if (onInteractEntityAtResult != null) return onInteractEntityAtResult; + return e.interactAt(player, vec, h); + }, new PlayerInteractAtEntityEvent(getCraftPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(), new org.bukkit.util.Vector(vec.x, vec.y, vec.z), (hand == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND)); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java index 373713f9..2ecc8c66 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java @@ -919,7 +919,7 @@ public abstract class LivingEntityMixin extends EntityMixin implements LivingEnt org.bukkit.inventory.EquipmentSlot bukkitHand = null; for (InteractionHand hand : InteractionHand.values()) { itemstack1 = this.getItemInHand(hand); - if (itemstack1.getItem() == Items.TOTEM_OF_UNDYING) { + if (itemstack1.is(Items.TOTEM_OF_UNDYING) && ForgeHooks.onLivingUseTotem((LivingEntity) (Object) this, damageSourceIn, itemstack1, hand)) { itemstack = itemstack1.copy(); bukkitHand = CraftEquipmentSlot.getHand(hand); // itemstack1.shrink(1); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java index c31c2ac0..aa01352d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java @@ -22,6 +22,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.event.entity.living.LivingChangeTargetEvent; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.entity.CraftLivingEntity; import org.bukkit.craftbukkit.v.event.CraftEventFactory; @@ -140,6 +141,12 @@ public abstract class MobMixin extends LivingEntityMixin implements MobEntityBri } else { livingEntity = null; } + var changeTargetEvent = ForgeHooks.onLivingChangeTarget((LivingEntity) (Object) this, livingEntity, LivingChangeTargetEvent.LivingTargetType.MOB_TARGET); + if (changeTargetEvent.isCanceled()) { + arclight$targetSuccess = false; + return; + } + livingEntity = changeTargetEvent.getNewTarget(); } this.target = livingEntity; ForgeHooks.onLivingSetAttackTarget((Mob) (Object) this, this.target); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/StartAttackingMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/StartAttackingMixin.java index 6ea8fdc7..db63957d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/StartAttackingMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/StartAttackingMixin.java @@ -5,6 +5,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.behavior.StartAttacking; import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.event.entity.living.LivingChangeTargetEvent; import org.bukkit.craftbukkit.v.entity.CraftLivingEntity; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.event.entity.EntityTargetEvent; @@ -25,7 +27,14 @@ public class StartAttackingMixin { return; } livingEntity = ((event.getTarget() != null) ? ((CraftLivingEntity) event.getTarget()).getHandle() : null); + var changeTargetEvent = ForgeHooks.onLivingChangeTarget(mob, livingEntity, LivingChangeTargetEvent.LivingTargetType.BEHAVIOR_TARGET); + if (changeTargetEvent.isCanceled()) { + return; + } + livingEntity = changeTargetEvent.getNewTarget(); mob.getBrain().setMemory(MemoryModuleType.ATTACK_TARGET, livingEntity); mob.getBrain().eraseMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE); + // noinspection removal + ForgeHooks.onLivingSetAttackTarget(mob, livingEntity, LivingChangeTargetEvent.LivingTargetType.BEHAVIOR_TARGET); // TODO: Remove in 1.20 } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/StandingAndWallBlockItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/StandingAndWallBlockItemMixin.java new file mode 100644 index 00000000..674a0594 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/StandingAndWallBlockItemMixin.java @@ -0,0 +1,33 @@ +package io.izzel.arclight.common.mixin.core.world.item; + +import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.StandingAndWallBlockItem; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.state.BlockState; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.craftbukkit.v.block.data.CraftBlockData; +import org.bukkit.event.block.BlockCanBuildEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(StandingAndWallBlockItem.class) +public class StandingAndWallBlockItemMixin { + + @Inject(method = "getPlacementState", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At("RETURN")) + private void arclight$blockCanPlace(BlockPlaceContext context, CallbackInfoReturnable cir, BlockState place, BlockState defaultReturn) { + if (defaultReturn != null) { + var result = cir.getReturnValue() != null; + var player = (context.getPlayer() instanceof ServerPlayerEntityBridge bridge) ? bridge.bridge$getBukkitEntity() : null; + + var event = new BlockCanBuildEvent(CraftBlock.at(context.getLevel(), context.getClickedPos()), player, CraftBlockData.fromData(defaultReturn), result); + Bukkit.getPluginManager().callEvent(event); + + cir.setReturnValue(event.isBuildable() ? defaultReturn : null); + } + } +} diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 407b19ed..ba984f8e 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -304,6 +304,7 @@ "world.item.ShearsItemMixin", "world.item.SnowballItemMixin", "world.item.SpawnEggItemMixin", + "world.item.StandingAndWallBlockItemMixin", "world.item.TridentItemMixin", "world.item.crafting.BlastingRecipeMixin", "world.item.crafting.CampfireCookingRecipeMixin", diff --git a/build.gradle b/build.gradle index 47dcf3a7..94f5406c 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ allprojects { ext { agpVersion = '1.23' minecraftVersion = '1.19.2' - forgeVersion = '43.1.3' + forgeVersion = '43.1.47' apiVersion = '1.5.0' toolsVersion = '1.3.0' mixinVersion = '0.8.5'