Converted EnvironmentData and GravityData to records cause we never need to modify them

This commit is contained in:
XevianLight
2026-02-04 19:13:15 -07:00
parent bf09330426
commit 3557dcdb17
4 changed files with 36 additions and 58 deletions

View File

@@ -103,9 +103,8 @@ public class EnvironmentSavedData extends SavedData {
public void setOxygen(Level level, BlockPos pos, boolean value) {
var data = getDataForPosition(level, pos);
data.setOxygen(value);
// Aphelion.LOGGER.info("Set oxygen for {} to {}", pos, value);
putOrRemove(level, pos.asLong(), data.pack());
putOrRemove(level, pos.asLong(), data.withOxygen(value).pack());
}
public void setOxygen(Level level, Collection<BlockPos> positions, boolean value) {
@@ -116,8 +115,7 @@ public class EnvironmentSavedData extends SavedData {
public void resetOxygen(Level level, BlockPos pos) {
var data = getDataForPosition(level, pos);
data.setOxygen(defaultData(level).hasOxygen());
putOrRemove(level, pos.asLong(), data.pack());
putOrRemove(level, pos.asLong(), data.withOxygen(defaultData(level).hasOxygen()).pack());
}
public void resetOxygen(Level level, Collection<BlockPos> positions) {
@@ -133,8 +131,7 @@ public class EnvironmentSavedData extends SavedData {
public void setGravity(Level level, BlockPos pos, float value) {
var data = getDataForPosition(level, pos);
data.setGravity(value);
putOrRemove(level, pos.asLong(), data.pack());
putOrRemove(level, pos.asLong(), data.withGravity(value).pack());
}
public void setGravity(Level level, Collection<BlockPos> positions, float value) {
@@ -145,8 +142,7 @@ public class EnvironmentSavedData extends SavedData {
public void resetGravity(Level level, BlockPos pos) {
var data = getDataForPosition(level, pos);
data.setGravity(defaultData(level).getGravity());
putOrRemove(level, pos.asLong(), data.pack());
putOrRemove(level, pos.asLong(), data.withGravity(defaultData(level).getGravity()).pack());
}
public short getTemperature(Level level, BlockPos pos) {
@@ -156,8 +152,7 @@ public class EnvironmentSavedData extends SavedData {
public void setTemperature(Level level, BlockPos pos, short value) {
var data = getDataForPosition(level, pos);
data.setTemperature(value);
putOrRemove(level, pos.asLong(), data.pack());
putOrRemove(level, pos.asLong(), data.withTemperature(value).pack());
}
public void setTemperature(Level level, Collection<BlockPos> positions, short value) {
@@ -168,8 +163,7 @@ public class EnvironmentSavedData extends SavedData {
public void resetTemperature(Level level, BlockPos pos) {
var data = getDataForPosition(level, pos);
data.setTemperature(defaultData(level).getTemperature());
putOrRemove(level, pos.asLong(), data.pack());
putOrRemove(level, pos.asLong(), data.withTemperature((defaultData(level).getTemperature())).pack());
}
private void putOrRemove(Level level, long key, int packed) {

View File

@@ -1,8 +1,6 @@
package net.xevianlight.aphelion.core.saveddata;
import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag;
@@ -10,8 +8,6 @@ import net.minecraft.nbt.Tag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.saveddata.SavedData;
import net.xevianlight.aphelion.client.ClientOxygenCache;
import net.xevianlight.aphelion.core.saveddata.types.EnvironmentData;
import net.xevianlight.aphelion.core.saveddata.types.GravityData;
import net.xevianlight.aphelion.planet.Planet;
import net.xevianlight.aphelion.planet.PlanetCache;
@@ -19,7 +15,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
@@ -105,7 +100,7 @@ public class GravitySavedData extends SavedData {
List<GravityData> regions = getGravityRegions(pos);
for (var e : regions) {
sum += e.getAccel();
sum += e.getGravity();
}
return sum;
@@ -120,7 +115,7 @@ public class GravitySavedData extends SavedData {
List<GravityData> regions = getGravityRegions(pos);
for (var e : regions) {
var accel = e.getAccel();
var accel = e.getGravity();
if (accel > max) max = accel;
}

View File

@@ -1,6 +1,6 @@
package net.xevianlight.aphelion.core.saveddata.types;
public final class EnvironmentData {
public record EnvironmentData (boolean oxygen, short temperature, float gravity){
@@ -26,9 +26,6 @@ public final class EnvironmentData {
private static final int TEMPERATURE_BIT = OXYGEN_BIT + OXYGEN_BITS; // next 16 bits
private static final int GRAVITY_BIT = TEMPERATURE_BIT + TEMPERATURE_BITS; // next 15 bits
private boolean oxygen;
private short temperature;
private float gravity;
public EnvironmentData(boolean oxygen, short temperature, float gravity) {
this.oxygen = oxygen;
@@ -36,6 +33,19 @@ public final class EnvironmentData {
this.gravity = gravity;
}
public EnvironmentData withOxygen(boolean newOxygen) {
return new EnvironmentData(newOxygen, this.temperature, this.gravity);
}
public EnvironmentData withTemperature(short newTemperature) {
return new EnvironmentData(this.oxygen, newTemperature, this.gravity);
}
@Deprecated
public EnvironmentData withGravity(float newGravity) {
return new EnvironmentData(this.oxygen, this.temperature, newGravity);
}
public int pack() {
int packedData = 0;
@@ -76,23 +86,12 @@ public final class EnvironmentData {
return oxygen;
}
public void setOxygen(boolean oxygen) {
this.oxygen = oxygen;
}
public short getTemperature() {
return temperature;
}
public void setTemperature(short temperature) {
this.temperature = temperature;
}
public float getGravity() {
return gravity;
}
public void setGravity(float gravity) {
this.gravity = gravity;
}
}

View File

@@ -1,8 +1,8 @@
package net.xevianlight.aphelion.core.saveddata.types;
public class GravityData {
private float accel;
private float radius;
// A record seems more useful here since this class is really only to help us interpret these values as they are written to the disk as an integer.
// We never store GravityData for any reason other than to test its values or to pack it into an integer.
public record GravityData (float gravity, float radius) {
public static final float DEFAULT_GRAVITY = 9.80665f; // 1G
public static final float GRAVITY_PRECISION = 100.0f;
@@ -10,40 +10,30 @@ public class GravityData {
public static final float MAX_RADIUS = Short.MAX_VALUE / RADIUS_PRECISION;
public static final float MAX_GRAVITY = Short.MAX_VALUE / GRAVITY_PRECISION;
public GravityData(float accel, float radius) {
this.accel = accel;
this.radius = radius;
public GravityData {
gravity = Math.clamp(gravity, 0f, MAX_GRAVITY);
radius = Math.clamp(radius, 0f, MAX_RADIUS);
}
public int pack() {
int packed = 0;
int g = Math.round(gravity * GRAVITY_PRECISION) & 0xFFFF;
int r = Math.round(radius * RADIUS_PRECISION) & 0xFFFF;
packed |= (int) (this.accel * GRAVITY_PRECISION);
packed |= (int) (this.radius * RADIUS_PRECISION) << 16;
return packed;
return g | (r << 16);
}
public float getAccel() {
return accel;
}
public void setAccel(float accel) {
this.accel = accel;
public float getGravity() {
return gravity;
}
public float getRadius() {
return radius;
}
public void setRadius(short radius) {
this.radius = radius;
}
public static GravityData unpack(int packed) {
float accel = (packed & 0xFFFF) / GRAVITY_PRECISION;
float radius = (packed >> 16) / RADIUS_PRECISION;
float gravity = (packed & 0xFFFF) / GRAVITY_PRECISION;
float radius = ((packed >>> 16) & 0xFFFF) / RADIUS_PRECISION;
return new GravityData(accel, radius);
return new GravityData(gravity, radius);
}
}