50 lines
2.0 KiB
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();
|
|
}
|
|
}
|