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 {
103 public int South_mostChunk {
107 public int East_mostChunk {
111 public int West_mostChunk {
115 protected override Vec2i GetKeyForItem(ColumnMeta item)
117 return item.Location;
120 internal void Update(ColumnMeta metaData)
122 if (this.Contains(metaData.Location)) {
123 this.Remove(metaData.Location);
132 public new void Add(ColumnMeta newItem)
134 if (North_mostChunk > newItem.Location.Y) {
135 North_mostChunk = newItem.Location.Y;
138 if (South_mostChunk < newItem.Location.Y) {
139 South_mostChunk = newItem.Location.Y;
142 if (East_mostChunk < newItem.Location.X) {
143 East_mostChunk = newItem.Location.X;
146 if (West_mostChunk > newItem.Location.X) {
147 West_mostChunk = newItem.Location.X;