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",