2 using System.Collections.Generic;
3 using System.Collections.ObjectModel;
6 using Vintagestory.API.MathTools;
7 using Vintagestory.API.Common;
15 public struct ColumnMeta
18 public Vec2i Location;
21 public TimeSpan ChunkAge;//OLDEST CHUNK. from chunk last edit
24 public float Temperature;// Temperature - surface
27 public ushort YMax;// Y feature height
30 public Dictionary<int, uint> RockRatio;//[Column] Geographic region (rock) Ratio. [BlockID * count]
33 public float Fertility;
36 public float ForestDensity;
39 public float Rainfall;
42 public float ShrubDensity;
45 public ushort AirBlocks;
48 public ushort NonAirBlocks;
50 //[ProtoMember(12,OverwriteList = true)]
52 public ushort[,] HeightMap;
54 public ColumnMeta(Vec2i loc, int chunkSize = 32)
57 ChunkAge = TimeSpan.Zero;
60 RockRatio = new Dictionary<int, uint>(10);
67 HeightMap = new ushort[chunkSize, chunkSize];
70 internal void UpdateFieldsFrom(ClimateCondition climate, IMapChunk mapChunk, TimeSpan chunkAge)
72 this.ChunkAge = chunkAge;
73 this.Temperature = climate.Temperature;
74 this.Fertility = climate.Fertility;
75 this.ForestDensity = climate.ForestDensity;
76 this.Rainfall = climate.Rainfall;
77 this.ShrubDensity = climate.ShrubDensity;
79 this.YMax = mapChunk.YMax;
84 public class ColumnsMetadata : KeyedCollection<Vec2i, ColumnMeta>
86 private ColumnsMetadata()
88 throw new NotSupportedException();
91 public ColumnsMetadata(Vec2i startChunkColumn)
93 North_mostChunk = startChunkColumn.Y;
94 South_mostChunk = startChunkColumn.Y;
95 East_mostChunk = startChunkColumn.X;
96 West_mostChunk = startChunkColumn.X;
99 public int North_mostChunk
104 public int South_mostChunk
109 public int East_mostChunk
114 public int West_mostChunk
119 protected override Vec2i GetKeyForItem(ColumnMeta item)
121 return item.Location;
124 internal void Update(ColumnMeta metaData)
126 if (this.Contains(metaData.Location))
128 this.Remove(metaData.Location);
138 public new void Add(ColumnMeta newItem)
140 if (North_mostChunk > newItem.Location.Y)
142 North_mostChunk = newItem.Location.Y;
145 if (South_mostChunk < newItem.Location.Y)
147 South_mostChunk = newItem.Location.Y;
150 if (East_mostChunk < newItem.Location.X)
152 East_mostChunk = newItem.Location.X;
155 if (West_mostChunk > newItem.Location.X)
157 West_mostChunk = newItem.Location.X;