55 lines
2.1 KiB
Java
55 lines
2.1 KiB
Java
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 (stage + 1 < Twine.STAGE_COUNT) {
|
|
if (lastTime != -1L) {
|
|
stageObj.time = stageObj.time + Math.max(0, getServerWorld().getTime() - lastTime);
|
|
}
|
|
if (stageObj.time >= Twine.STAGE_TIME) {
|
|
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;
|
|
}
|
|
}
|
|
lastTime = getServerWorld().getTime();
|
|
component.markDirty();
|
|
}
|
|
}
|