diff --git a/src/main/java/carpet/fakes/EntityInterface.java b/src/main/java/carpet/fakes/EntityInterface.java index 80093eda..6234ce07 100644 --- a/src/main/java/carpet/fakes/EntityInterface.java +++ b/src/main/java/carpet/fakes/EntityInterface.java @@ -1,6 +1,9 @@ package carpet.fakes; +import java.util.stream.Stream; + import carpet.script.EntityEventsGroup; +import net.minecraft.world.entity.Entity; public interface EntityInterface { @@ -19,4 +22,5 @@ public interface EntityInterface int getPublicNetherPortalCooldown(); void setPublicNetherPortalCooldown(int what); + Stream cm$getIndirectPassengersStream(); } diff --git a/src/main/java/carpet/mixins/EntityMixin.java b/src/main/java/carpet/mixins/EntityMixin.java index 42f09a9c..4c781b08 100644 --- a/src/main/java/carpet/mixins/EntityMixin.java +++ b/src/main/java/carpet/mixins/EntityMixin.java @@ -6,6 +6,9 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; + +import java.util.stream.Stream; + import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -37,4 +40,13 @@ public abstract class EntityMixin implements EntityInterface { if (getControllingPassenger() instanceof EntityPlayerMPFake) cir.setReturnValue(!level.isClientSide()); } + + @Shadow + protected abstract Stream getIndirectPassengersStream(); + + @Override + public Stream cm$getIndirectPassengersStream() + { + return this.getIndirectPassengersStream(); + } } diff --git a/src/main/java/carpet/mixins/TickRateManager_fakePlayersMixin.java b/src/main/java/carpet/mixins/TickRateManager_fakePlayersMixin.java new file mode 100644 index 00000000..170ce137 --- /dev/null +++ b/src/main/java/carpet/mixins/TickRateManager_fakePlayersMixin.java @@ -0,0 +1,26 @@ +package carpet.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; + +import carpet.fakes.EntityInterface; +import carpet.patches.EntityPlayerMPFake; +import net.minecraft.world.TickRateManager; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; + +@Mixin(TickRateManager.class) +abstract class TickRateManager_fakePlayersMixin { + @Shadow + abstract boolean runsNormally(); + + @ModifyReturnValue(method = "isEntityFrozen", at = @At("TAIL")) + private boolean handler(boolean alreadyFrozen, Entity entity) { + if (alreadyFrozen) return true; + return !runsNormally() && (entity instanceof EntityPlayerMPFake) + && !((EntityInterface) entity).cm$getIndirectPassengersStream().anyMatch(e -> e instanceof Player && !(e instanceof EntityPlayerMPFake)); + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 0eed301f..ea6587fa 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -49,6 +49,7 @@ "MobMixin", "Villager_aiMixin", "Player_fakePlayersMixin", + "TickRateManager_fakePlayersMixin", "ServerGamePacketListenerImpl_coreMixin", "MinecraftServer_scarpetMixin", "ExperienceOrb_xpNoCooldownMixin",