From 911c616f229af8a36fed6c693ea797e6ace3fb41 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sun, 11 May 2025 14:43:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E9=98=BB=E6=AD=A2=E5=A4=96?= =?UTF-8?q?=E9=83=A8stopRiding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/client/ClickHandler.java | 4 +++ .../entity/{ => mixin}/CupidLove.java | 2 +- .../entity/mixin/CustomStopRiding.java | 12 +++++++ .../entity/{ => mixin}/ICustomKnockback.java | 2 +- .../entity/projectile/ProjectileEntity.java | 2 +- .../event/LivingEventHandler.java | 2 +- .../mixins/LivingEntityMixin.java | 12 ++++++- .../superbwarfare/mixins/PlayerMixin.java | 34 +++++++++++++++---- .../superbwarfare/mixins/VillagerMixin.java | 2 +- .../message/send/PlayerStopRidingMessage.java | 5 ++- .../superbwarfare/perk/ammo/CupidArrow.java | 2 +- 11 files changed, 65 insertions(+), 14 deletions(-) rename src/main/java/com/atsuishio/superbwarfare/entity/{ => mixin}/CupidLove.java (84%) create mode 100644 src/main/java/com/atsuishio/superbwarfare/entity/mixin/CustomStopRiding.java rename src/main/java/com/atsuishio/superbwarfare/entity/{ => mixin}/ICustomKnockback.java (88%) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index 759e5dfcf..0ebcbc94e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.compat.CompatHolder; import com.atsuishio.superbwarfare.compat.clothconfig.ClothConfigHelper; import com.atsuishio.superbwarfare.config.client.ReloadConfig; import com.atsuishio.superbwarfare.entity.MortarEntity; +import com.atsuishio.superbwarfare.entity.mixin.CustomStopRiding; import com.atsuishio.superbwarfare.entity.vehicle.base.ArmedVehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.CannonEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; @@ -467,5 +468,8 @@ public class ClickHandler { return; } PacketDistributor.sendToServer(new PlayerStopRidingMessage(0)); + + CustomStopRiding customStopRiding = CustomStopRiding.getInstance(player); + customStopRiding.superbwarfare$stopRiding(); } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/CupidLove.java b/src/main/java/com/atsuishio/superbwarfare/entity/mixin/CupidLove.java similarity index 84% rename from src/main/java/com/atsuishio/superbwarfare/entity/CupidLove.java rename to src/main/java/com/atsuishio/superbwarfare/entity/mixin/CupidLove.java index 01a83a8c9..375a6fb32 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/CupidLove.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/mixin/CupidLove.java @@ -1,4 +1,4 @@ -package com.atsuishio.superbwarfare.entity; +package com.atsuishio.superbwarfare.entity.mixin; import net.minecraft.world.entity.npc.Villager; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/mixin/CustomStopRiding.java b/src/main/java/com/atsuishio/superbwarfare/entity/mixin/CustomStopRiding.java new file mode 100644 index 000000000..42f55bb87 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/entity/mixin/CustomStopRiding.java @@ -0,0 +1,12 @@ +package com.atsuishio.superbwarfare.entity.mixin; + +import net.minecraft.world.entity.Entity; + +public interface CustomStopRiding { + + static CustomStopRiding getInstance(Entity entity) { + return (CustomStopRiding) entity; + } + + void superbwarfare$stopRiding(); +} diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/ICustomKnockback.java b/src/main/java/com/atsuishio/superbwarfare/entity/mixin/ICustomKnockback.java similarity index 88% rename from src/main/java/com/atsuishio/superbwarfare/entity/ICustomKnockback.java rename to src/main/java/com/atsuishio/superbwarfare/entity/mixin/ICustomKnockback.java index a2fb4e274..845ac4bb3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/ICustomKnockback.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/mixin/ICustomKnockback.java @@ -1,4 +1,4 @@ -package com.atsuishio.superbwarfare.entity; +package com.atsuishio.superbwarfare.entity.mixin; import net.minecraft.world.entity.LivingEntity; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java index 3921d613e..6d973d287 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java @@ -5,8 +5,8 @@ import com.atsuishio.superbwarfare.component.ModDataComponents; import com.atsuishio.superbwarfare.config.server.MiscConfig; import com.atsuishio.superbwarfare.config.server.ProjectileConfig; import com.atsuishio.superbwarfare.entity.DPSGeneratorEntity; -import com.atsuishio.superbwarfare.entity.ICustomKnockback; import com.atsuishio.superbwarfare.entity.TargetEntity; +import com.atsuishio.superbwarfare.entity.mixin.ICustomKnockback; import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.network.message.receive.ClientIndicatorMessage; diff --git a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java index cf69d1b35..64fdb2a71 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java @@ -5,8 +5,8 @@ import com.atsuishio.superbwarfare.component.ModDataComponents; import com.atsuishio.superbwarfare.config.common.GameplayConfig; import com.atsuishio.superbwarfare.config.server.MiscConfig; import com.atsuishio.superbwarfare.config.server.VehicleConfig; -import com.atsuishio.superbwarfare.entity.ICustomKnockback; import com.atsuishio.superbwarfare.entity.TargetEntity; +import com.atsuishio.superbwarfare.entity.mixin.ICustomKnockback; import com.atsuishio.superbwarfare.entity.vehicle.LaserTowerEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.ArmedVehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.ContainerMobileVehicleEntity; diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityMixin.java index 59e91f24e..495f68b7a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityMixin.java @@ -1,7 +1,9 @@ package com.atsuishio.superbwarfare.mixins; -import com.atsuishio.superbwarfare.entity.ICustomKnockback; +import com.atsuishio.superbwarfare.entity.mixin.ICustomKnockback; +import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.event.ClientEventHandler; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import org.spongepowered.asm.mixin.Mixin; @@ -39,4 +41,12 @@ public class LivingEntityMixin implements ICustomKnockback { } } } + + @Inject(method = "stopRiding()V", at = @At("HEAD"), cancellable = true) + public void stopRiding(CallbackInfo ci) { + Entity entity = ((LivingEntity) (Object) this).getVehicle(); + if (entity instanceof VehicleEntity) { + ci.cancel(); + } + } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/PlayerMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/PlayerMixin.java index bfecb0c37..2beadd56d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/PlayerMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/PlayerMixin.java @@ -1,38 +1,60 @@ package com.atsuishio.superbwarfare.mixins; +import com.atsuishio.superbwarfare.entity.mixin.CustomStopRiding; import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; +import net.minecraft.tags.BlockTags; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; 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.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -/** - * Code based on @Luke100000's ImmersiveAircraft - */ @Mixin(value = Player.class, priority = 1145) -public abstract class PlayerMixin extends Entity { +public abstract class PlayerMixin extends Entity implements CustomStopRiding { public PlayerMixin(EntityType type, Level world) { super(type, world); } + /** + * Code based on @Luke100000's ImmersiveAircraft + */ @Inject(method = "wantsToStopRiding", at = @At("HEAD"), cancellable = true) - void shouldDismountInjection(CallbackInfoReturnable cir) { + public void shouldDismountInjection(CallbackInfoReturnable cir) { if (this.getRootVehicle() instanceof VehicleEntity) { cir.setReturnValue(false); } } @Inject(method = "updatePlayerPose()V", at = @At("TAIL")) - void updatePostInjection(CallbackInfo ci) { + public void updatePostInjection(CallbackInfo ci) { if (getRootVehicle() instanceof VehicleEntity) { this.setPose(Pose.STANDING); } } + + @Override + public void superbwarfare$stopRiding() { + Entity entity = this.getVehicle(); + this.removeVehicle(); + if (entity != null && entity != this.getVehicle() && !this.level().isClientSide) { + Vec3 vec3; + if (this.isRemoved()) { + vec3 = this.position(); + } else if (!entity.isRemoved() && !this.level().getBlockState(entity.blockPosition()).is(BlockTags.PORTALS)) { + vec3 = entity.getDismountLocationForPassenger((Player) (Object) this); + } else { + double d0 = Math.max(this.getY(), entity.getY()); + vec3 = new Vec3(this.getX(), d0, this.getZ()); + } + + this.dismountTo(vec3.x, vec3.y, vec3.z); + } + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/VillagerMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/VillagerMixin.java index 2d36f6b59..293d6cea9 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/VillagerMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/VillagerMixin.java @@ -1,6 +1,6 @@ package com.atsuishio.superbwarfare.mixins; -import com.atsuishio.superbwarfare.entity.CupidLove; +import com.atsuishio.superbwarfare.entity.mixin.CupidLove; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.npc.Villager; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/PlayerStopRidingMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/PlayerStopRidingMessage.java index 418148b79..df828a098 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/PlayerStopRidingMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/PlayerStopRidingMessage.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.network.message.send; import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.entity.mixin.CustomStopRiding; import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import io.netty.buffer.ByteBuf; import net.minecraft.network.codec.ByteBufCodecs; @@ -24,7 +25,9 @@ public record PlayerStopRidingMessage(int msgType) implements CustomPacketPayloa var vehicle = player.getVehicle(); if (!(vehicle instanceof VehicleEntity)) return; - player.stopRiding(); + CustomStopRiding customStopRiding = CustomStopRiding.getInstance(player); + customStopRiding.superbwarfare$stopRiding(); + player.setJumping(false); } diff --git a/src/main/java/com/atsuishio/superbwarfare/perk/ammo/CupidArrow.java b/src/main/java/com/atsuishio/superbwarfare/perk/ammo/CupidArrow.java index d1eb9694d..6d41345f3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/perk/ammo/CupidArrow.java +++ b/src/main/java/com/atsuishio/superbwarfare/perk/ammo/CupidArrow.java @@ -1,6 +1,6 @@ package com.atsuishio.superbwarfare.perk.ammo; -import com.atsuishio.superbwarfare.entity.CupidLove; +import com.atsuishio.superbwarfare.entity.mixin.CupidLove; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.Perk;