This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
RelicCraft/src/main/java/com/thebrokenrail/reliccraft/mixin/MixinServerWorld.java

50 lines
2.0 KiB
Java

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();
}
}