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
Raw Normal View History

2020-04-04 02:32:34 +00:00
package com.thebrokenrail.reliccraft.mixin;
2020-06-28 16:38:49 +00:00
import com.thebrokenrail.reliccraft.item.TimeDilaterItem;
2020-04-04 02:32:34 +00:00
import com.thebrokenrail.reliccraft.packet.UpdateTimeDilationS2CPacket;
2020-06-28 16:38:49 +00:00
import net.minecraft.server.MinecraftServer;
2020-04-04 02:32:34 +00:00
import net.minecraft.server.world.ServerWorld;
2020-06-28 16:38:49 +00:00
import net.minecraft.world.World;
2020-04-04 02:32:34 +00:00
import org.spongepowered.asm.mixin.Mixin;
2020-06-28 16:38:49 +00:00
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
2020-04-04 02:32:34 +00:00
import org.spongepowered.asm.mixin.injection.At;
2020-06-28 16:38:49 +00:00
import org.spongepowered.asm.mixin.injection.Constant;
2020-04-04 02:32:34 +00:00
import org.spongepowered.asm.mixin.injection.Inject;
2020-06-28 16:38:49 +00:00
import org.spongepowered.asm.mixin.injection.ModifyConstant;
2020-04-04 02:32:34 +00:00
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.function.BooleanSupplier;
@SuppressWarnings("unused")
@Mixin(ServerWorld.class)
public abstract class MixinServerWorld extends MixinWorld {
2020-06-28 16:38:49 +00:00
@Unique
private TimeDilaterItem.TimeSpeedState timeSpeedState;
2020-04-04 02:32:34 +00:00
@Inject(at = @At("RETURN"), method = "tick")
public void tick(BooleanSupplier shouldKeepTicking, CallbackInfo info) {
UpdateTimeDilationS2CPacket.send((ServerWorld) (Object) this, getTimeSpeed());
}
2020-06-28 16:38:49 +00:00
@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();
}
2020-04-04 02:32:34 +00:00
}