BetterEnd/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java
2021-12-18 23:57:44 +03:00

54 lines
1.8 KiB
Java

package ru.betterend.mixin.common;
import net.minecraft.world.level.levelgen.NoiseChunk;
import net.minecraft.world.level.levelgen.NoiseSettings;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.betterend.interfaces.TargetChecker;
@Mixin(NoiseChunk.NoiseInterpolator.class)
public class NoiseInterpolatorMixin {
@Final
@Shadow(aliases = "this$0")
private NoiseChunk this$0;
@Inject(method = "fillSlice", at = @At("HEAD"), cancellable = true)
private void be_fillSlice(double[][] data, int x, CallbackInfo info) {
if (!TargetChecker.class.cast(this$0).isTarget()) {
return;
}
info.cancel();
NoiseChunkAccessor accessor = NoiseChunkAccessor.class.cast(this$0);
NoiseSettings noiseSettings = accessor.bnv_getNoiseSettings();
final int sizeY = noiseSettings.getCellHeight();
final int sizeXZ = noiseSettings.getCellWidth();
final int cellsY = accessor.bnv_getCellCountY() + 1;
final int cellsXZ = accessor.bnv_getCellCountXZ() + 1;
final int firstCellZ = accessor.bnv_getFirstCellZ();
final int cellNoiseMinY = accessor.bnv_getCellNoiseMinY();
x *= sizeXZ;
for (int cellXZ = 0; cellXZ < cellsXZ; ++cellXZ) {
int z = (firstCellZ + cellXZ) * sizeXZ;
for (int cellY = 0; cellY < cellsY; ++cellY) {
int y = (cellY + cellNoiseMinY) * sizeY;
data[cellXZ][cellY] = be_calculateNoise(x, y, z);
}
}
}
private float be_calculateNoise(int x, int y, int z) {
float gradient = (64 - y) * 0.1F;
float sinX = (float) Math.sin(x * 0.1);
float sinZ = (float) Math.sin(z * 0.1);
return gradient + sinX + sinZ;
}
}