diff --git a/src/main/java/carpet/mixins/ServerWorld_fakePlayersDimensionChange.java b/src/main/java/carpet/mixins/ServerWorld_fakePlayersDimensionChange.java new file mode 100644 index 00000000..bac8a685 --- /dev/null +++ b/src/main/java/carpet/mixins/ServerWorld_fakePlayersDimensionChange.java @@ -0,0 +1,37 @@ +package carpet.mixins; + +import carpet.patches.EntityPlayerMPFake; +import net.minecraft.entity.Entity; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.ServerTask; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ServerWorld.class) +public abstract class ServerWorld_fakePlayersDimensionChange +{ + @Shadow private boolean ticking; + + @Shadow /*@Nonnull*/ public abstract MinecraftServer getServer(); + + @Redirect( method = "removePlayer", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/world/ServerWorld;removeEntity(Lnet/minecraft/entity/Entity;)V" + )) + private void crashRemovePlayer(ServerWorld serverWorld, Entity entity_1, ServerPlayerEntity serverPlayerEntity_1) + { + if ( !(ticking && serverPlayerEntity_1 instanceof EntityPlayerMPFake) ) + serverWorld.removeEntity(entity_1); + else + getServer().method_18858(new ServerTask(getServer().getTicks(), () -> + { + serverWorld.removeEntity(serverPlayerEntity_1); + serverPlayerEntity_1.onTeleportationDone(); + })); + + } +} diff --git a/src/main/java/carpet/patches/EntityPlayerMPFake.java b/src/main/java/carpet/patches/EntityPlayerMPFake.java index 464c0219..3c8ec9aa 100644 --- a/src/main/java/carpet/patches/EntityPlayerMPFake.java +++ b/src/main/java/carpet/patches/EntityPlayerMPFake.java @@ -59,6 +59,7 @@ public class EntityPlayerMPFake extends ServerPlayerEntity server.getPlayerManager().sendToDimension(new EntitySetHeadYawS2CPacket(instance, (byte) (instance.headYaw * 256 / 360)), instance.dimension); server.getPlayerManager().sendToDimension(new EntityPositionS2CPacket(instance), instance.dimension); instance.getServerWorld().method_14178().updateCameraPosition(instance); + instance.dataTracker.set(PLAYER_MODEL_BIT_MASK, (byte) 0x7f); // show all model layers (incl. capes) return instance; } @@ -106,7 +107,7 @@ public class EntityPlayerMPFake extends ServerPlayerEntity this.getServerWorld().method_14178().updateCameraPosition(this); } super.tick(); - this.method_14226(); + if (!removed) this.method_14226(); } @Override diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index b0c1ef8d..a270bf9b 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -27,6 +27,8 @@ "ServerWorld_unloadedEntityMixin", "MobEntity_leashMixin", + "ServerWorld_fakePlayersDimensionChange", + "ServerPlayNetworkHandlerMixin", "MinecraftServer_scarpetMixin", "PlayerListHeaderS2CPacketMixin",