From 622ffa31de2db10becebe1e0d0a1626bf90471f9 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 9 Aug 2023 17:53:05 +0100 Subject: [PATCH] Fixed broken players when a passenger disconnects whilst being carried --- .../unicopia/mixin/MixinPlayerManager.java | 37 +++++++++++++++++++ src/main/resources/unicopia.mixin.json | 1 + 2 files changed, 38 insertions(+) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerManager.java diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerManager.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerManager.java new file mode 100644 index 00000000..eb70cb8a --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerManager.java @@ -0,0 +1,37 @@ +package com.minelittlepony.unicopia.mixin; + +import org.jetbrains.annotations.Nullable; +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 com.minelittlepony.unicopia.entity.player.Pony; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; + +@Mixin(PlayerManager.class) +abstract class MixinPlayerManager { + @Inject(method = "remove", at = @At("HEAD")) + public void onRemove(ServerPlayerEntity player, CallbackInfo info) { + player.getPassengerList().stream() + .flatMap(passenger -> Pony.of(passenger).stream()) + .forEach(passenger -> passenger.setCarrier((Entity)null)); + player.removeAllPassengers(); + + @Nullable + Entity vehicle = null; + if (player.hasVehicle() && (vehicle = player.getRootVehicle()).hasPlayerRider()) { + if (vehicle.streamPassengersAndSelf().anyMatch(e -> { + return e != player && e instanceof PlayerEntity; + })) { + player.stopRiding(); + Pony.of(player).setCarrier((Entity)null); + } + } + } + +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 097d0b86..323dda19 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -28,6 +28,7 @@ "MixinPersistentProjectileEntity", "MixinPlayerEntity", "MixinPlayerInventory", + "MixinPlayerManager", "MixinPowderSnowBlock", "MixinProjectileEntity", "MixinServerPlayerEntity",