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) { public void setOxygen(Level level, BlockPos pos, boolean value) {
var data = getDataForPosition(level, pos); var data = getDataForPosition(level, pos);
data.setOxygen(value);
// Aphelion.LOGGER.info("Set oxygen for {} to {}", pos, 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) { 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) { public void resetOxygen(Level level, BlockPos pos) {
var data = getDataForPosition(level, pos); var data = getDataForPosition(level, pos);
data.setOxygen(defaultData(level).hasOxygen()); putOrRemove(level, pos.asLong(), data.withOxygen(defaultData(level).hasOxygen()).pack());
putOrRemove(level, pos.asLong(), data.pack());
} }
public void resetOxygen(Level level, Collection<BlockPos> positions) { 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) { public void setGravity(Level level, BlockPos pos, float value) {
var data = getDataForPosition(level, pos); var data = getDataForPosition(level, pos);
data.setGravity(value); putOrRemove(level, pos.asLong(), data.withGravity(value).pack());
putOrRemove(level, pos.asLong(), data.pack());
} }
public void setGravity(Level level, Collection<BlockPos> positions, float value) { 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) { public void resetGravity(Level level, BlockPos pos) {
var data = getDataForPosition(level, pos); var data = getDataForPosition(level, pos);
data.setGravity(defaultData(level).getGravity()); putOrRemove(level, pos.asLong(), data.withGravity(defaultData(level).getGravity()).pack());
putOrRemove(level, pos.asLong(), data.pack());
} }
public short getTemperature(Level level, BlockPos pos) { 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) { public void setTemperature(Level level, BlockPos pos, short value) {
var data = getDataForPosition(level, pos); var data = getDataForPosition(level, pos);
data.setTemperature(value); putOrRemove(level, pos.asLong(), data.withTemperature(value).pack());
putOrRemove(level, pos.asLong(), data.pack());
} }
public void setTemperature(Level level, Collection<BlockPos> positions, short value) { 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) { public void resetTemperature(Level level, BlockPos pos) {
var data = getDataForPosition(level, pos); var data = getDataForPosition(level, pos);
data.setTemperature(defaultData(level).getTemperature()); putOrRemove(level, pos.asLong(), data.withTemperature((defaultData(level).getTemperature())).pack());
putOrRemove(level, pos.asLong(), data.pack());
} }
private void putOrRemove(Level level, long key, int packed) { private void putOrRemove(Level level, long key, int packed) {

View File

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

View File

@@ -1,6 +1,6 @@
package net.xevianlight.aphelion.core.saveddata.types; 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 TEMPERATURE_BIT = OXYGEN_BIT + OXYGEN_BITS; // next 16 bits
private static final int GRAVITY_BIT = TEMPERATURE_BIT + TEMPERATURE_BITS; // next 15 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) { public EnvironmentData(boolean oxygen, short temperature, float gravity) {
this.oxygen = oxygen; this.oxygen = oxygen;
@@ -36,6 +33,19 @@ public final class EnvironmentData {
this.gravity = gravity; 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() { public int pack() {
int packedData = 0; int packedData = 0;
@@ -76,23 +86,12 @@ public final class EnvironmentData {
return oxygen; return oxygen;
} }
public void setOxygen(boolean oxygen) {
this.oxygen = oxygen;
}
public short getTemperature() { public short getTemperature() {
return temperature; return temperature;
} }
public void setTemperature(short temperature) {
this.temperature = temperature;
}
public float getGravity() { public float getGravity() {
return gravity; return gravity;
} }
public void setGravity(float gravity) {
this.gravity = gravity;
}
} }

View File

@@ -1,8 +1,8 @@
package net.xevianlight.aphelion.core.saveddata.types; package net.xevianlight.aphelion.core.saveddata.types;
public class GravityData { // 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.
private float accel; // We never store GravityData for any reason other than to test its values or to pack it into an integer.
private float radius; public record GravityData (float gravity, float radius) {
public static final float DEFAULT_GRAVITY = 9.80665f; // 1G public static final float DEFAULT_GRAVITY = 9.80665f; // 1G
public static final float GRAVITY_PRECISION = 100.0f; 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_RADIUS = Short.MAX_VALUE / RADIUS_PRECISION;
public static final float MAX_GRAVITY = Short.MAX_VALUE / GRAVITY_PRECISION; public static final float MAX_GRAVITY = Short.MAX_VALUE / GRAVITY_PRECISION;
public GravityData(float accel, float radius) { public GravityData {
this.accel = accel; gravity = Math.clamp(gravity, 0f, MAX_GRAVITY);
this.radius = radius; radius = Math.clamp(radius, 0f, MAX_RADIUS);
} }
public int pack() { 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); return g | (r << 16);
packed |= (int) (this.radius * RADIUS_PRECISION) << 16;
return packed;
} }
public float getAccel() { public float getGravity() {
return accel; return gravity;
}
public void setAccel(float accel) {
this.accel = accel;
} }
public float getRadius() { public float getRadius() {
return radius; return radius;
} }
public void setRadius(short radius) {
this.radius = radius;
}
public static GravityData unpack(int packed) { public static GravityData unpack(int packed) {
float accel = (packed & 0xFFFF) / GRAVITY_PRECISION; float gravity = (packed & 0xFFFF) / GRAVITY_PRECISION;
float radius = (packed >> 16) / RADIUS_PRECISION; float radius = ((packed >>> 16) & 0xFFFF) / RADIUS_PRECISION;
return new GravityData(accel, radius); return new GravityData(gravity, radius);
} }
} }