package com.thebrokenrail.twine.mixin; import com.thebrokenrail.twine.Twine; import com.thebrokenrail.twine.component.StageDataComponent; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.ChunkPos; 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.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ServerPlayerEntity.class) public abstract class MixinServerPlayerEntity { @Shadow public abstract ServerWorld getServerWorld(); @Unique private ChunkPos getChunkPos() { return new ChunkPos(((ServerPlayerEntity) (Object) this).getBlockPos()); } @Unique private long lastTime = -1L; @Inject(at = @At("RETURN"), method = "tick") public void tick(CallbackInfo info) { StageDataComponent component = StageDataComponent.getFromWorld(getServerWorld()); StageDataComponent.StageData[] data = component.getData(((ServerPlayerEntity) (Object) this).getUuid()); int stage = StageDataComponent.findStageOfChunk(getChunkPos(), data); StageDataComponent.StageData stageObj = data[stage]; if (lastTime != -1) { long diff = Math.max(0, getServerWorld().getTime() - lastTime); if (diff > 5) { System.out.println(diff); } stageObj.time = stageObj.time + Math.max(0, getServerWorld().getTime() - lastTime); } lastTime = getServerWorld().getTime(); if (stageObj.time >= 24000 && stage + 1 < Twine.STAGE_COUNT) { StageDataComponent.StageData old = data[stage + 1]; if (old != null) { old.time = 0; } StageDataComponent.StageData newData = new StageDataComponent.StageData(); ChunkPos pos = getChunkPos(); newData.x = pos.x; newData.z = pos.z; data[stage + 1] = newData; data[stage] = old; } component.markDirty(); } }