package com.thebrokenrail.reliccraft.mixin; import com.thebrokenrail.reliccraft.item.TimeDilaterItem; import com.thebrokenrail.reliccraft.packet.UpdateTimeDilationS2CPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyConstant; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.function.BooleanSupplier; @SuppressWarnings("unused") @Mixin(ServerWorld.class) public abstract class MixinServerWorld extends MixinWorld { @Unique private TimeDilaterItem.TimeSpeedState timeSpeedState; @Inject(at = @At("RETURN"), method = "tick") public void tick(BooleanSupplier shouldKeepTicking, CallbackInfo info) { UpdateTimeDilationS2CPacket.send((ServerWorld) (Object) this, getTimeSpeed()); } @ModifyConstant(constant = @Constant(longValue = 1L), method = "tickTime") public long tickTime(long value) { return value * TimeDilaterItem.getTimeDilationFactor(getTimeSpeed()); } @Shadow public abstract MinecraftServer getServer(); @Override public void setTimeSpeed(TimeDilaterItem.TimeSpeed timeSpeed) { TimeDilaterItem.TimeSpeedState state = getServer().getWorld(World.OVERWORLD).getPersistentStateManager().getOrCreate(TimeDilaterItem.TimeSpeedState::new, TimeDilaterItem.TIME_SPEED_KEY); state.setTimeSpeed(timeSpeed); getServer().getWorld(World.OVERWORLD).getPersistentStateManager().set(state); } @Override public TimeDilaterItem.TimeSpeed getTimeSpeed() { return getServer().getWorld(World.OVERWORLD).getPersistentStateManager().getOrCreate(TimeDilaterItem.TimeSpeedState::new, TimeDilaterItem.TIME_SPEED_KEY).getTimeSpeed(); } }