12 public Dictionary<Point3, int>
m_toSet = [];
31 public virtual void UpdateIsTop(
int value,
int x,
int y,
int z) {
35 if (chunkAtCell !=
null) {
45 public override void OnBlockAdded(
int value,
int oldValue,
int x,
int y,
int z) {
49 public override void OnBlockModified(
int value,
int oldValue,
int x,
int y,
int z) {
55 if (neighborY == y + 1) {
70 if (chunkAtCell !=
null) {
78 if (fluidBlock !=
null) {
79 surfaceFluidBlock = fluidBlock;
81 return y + surfaceFluidBlock.GetLevelHeight(level);
83 surfaceFluidBlock =
null;
90 surfaceFluidBlock =
null;
98 if (surfaceHeight.HasValue) {
99 y = (int)surfaceHeight.Value;
117 vector.X = Math.Sign(level - num6) - Math.Sign(level - num7);
118 vector.Y = Math.Sign(level - num8) - Math.Sign(level - num9);
143 base.Load(valuesDictionary);
150 for (
int i = 0; i < 2; i++) {
164 int num = m_fluidBlock.MaxLevel + 1;
166 for (
int j = 0; j < 4; j++) {
215 FlowTo(x + 1, y, z, level + 1);
220 FlowTo(x - 1, y, z, level + 1);
225 FlowTo(x, y, z + 1, level + 1);
230 FlowTo(x, y, z - 1, level + 1);
238 foreach (KeyValuePair<Point3, int> item
in m_toSet) {
242 int value = item.Value;
246 if (fluidBlock !=
null
267 public virtual bool OnFluidInteract(
int interactValue,
int x,
int y,
int z,
int fluidValue) {
278 Set(x, y, z, fluidValue);
285 float num =
float.MaxValue;
293 for (
int i = num6; i <= num7; i++) {
294 for (
int j = num2; j <= num3; j++) {
296 if (chunkAtCell ==
null) {
300 for (
int l = num4; l <= num5; l++, k++) {
306 if (flowingFluidOnly) {
315 float num8 = p.X - (j + 0.5f);
316 float num9 = p.Y - (l + 1f);
317 float num10 = p.Z - (i + 0.5f);
318 float num11 = num8 * num8 + num9 * num9 + num10 * num10;
325 if (num ==
float.MaxValue) {
328 return MathF.Sqrt(num);
331 public void Set(
int x,
int y,
int z,
int value) {
332 Point3 key =
new(x, y, z);
336 public void FlowTo(
int x,
int y,
int z,
int level) {
345 if (level < level2) {
358 if (!levels.TryGetValue(
new Point3(x, y, z), out
int value)) {
359 value =
int.MaxValue;
361 if (level >= value) {
364 levels[
new Point3(x, y, z)] = level;
static int Min(int x1, int x2)
virtual bool IsFluidBlocker_(int value)
static FluidBlock[] FluidBlocks
static int GetLevel(int data)
static int SetLevel(int data, int level)
bool IsTheSameFluid(int contents)
static int SetIsTop(int data, bool isTop)
static float OctavedNoise(float x, float frequency, int octaves, float frequencyStep, float amplitudeStep, bool ridged=false)
SubsystemTerrain SubsystemTerrain
SubsystemAmbientSounds SubsystemAmbientSounds
void FlowTo(int x, int y, int z, int level)
void Set(int x, int y, int z, int value)
Dictionary< Point3, Vector2 > m_fluidRandomFlowDirections
SubsystemTime SubsystemTime
virtual bool OnFluidInteract(int interactValue, int x, int y, int z, int fluidValue)
float? GetSurfaceHeight(int x, int y, int z)
static Point2[] m_sideNeighbors
int LevelAtNearestFall(int x, int y, int z, int level, Dictionary< Point3, int > levels)
Dictionary< Point3, int > m_visited
float? GetSurfaceHeight(int x, int y, int z, out FluidBlock surfaceFluidBlock)
override void OnItemHarvested(int x, int y, int z, int blockValue, ref BlockDropValue dropValue, ref int newBlockValue)
override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ)
Dictionary< Point3, bool > m_toUpdate
float? CalculateDistanceToFluid(Vector3 p, int radius, bool flowingFluidOnly)
SubsystemAudio SubsystemAudio
virtual void UpdateIsTop(int value, int x, int y, int z)
Vector2? CalculateFlowSpeed(int x, int y, int z)
Vector2? CalculateFlowSpeed(int x, int y, int z, out FluidBlock surfaceBlock, out float? surfaceHeight)
override void OnBlockAdded(int value, int oldValue, int x, int y, int z)
override void Load(ValuesDictionary valuesDictionary)
SubsystemFluidBlockBehavior(FluidBlock fluidBlock, bool generateSources)
Dictionary< Point3, int > m_toSet
override void OnBlockModified(int value, int oldValue, int x, int y, int z)
static int CalculateCellIndex(int x, int y, int z)
virtual int GetCellValueFast(int index)
virtual void SetCellValueFast(int x, int y, int z, int value)
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
static int ToCell(float x)
virtual TerrainChunk GetChunkAtCell(int x, int z)
static int MakeBlockValue(int contents)
static int ExtractData(int value)
ValuesDictionary ValuesDictionary
static Vector2 Normalize(Vector2 v)