2 using System.Collections.Generic;
5 using System.Reflection;
7 using System.Text.RegularExpressions;
11 using Vintagestory.API.Client;
12 using Vintagestory.API.Common;
13 using Vintagestory.API.Config;
14 using Vintagestory.API.Datastructures;
15 using Vintagestory.API.MathTools;
16 using Vintagestory.Common;
22 public class JsonGenerator
24 private ICoreClientAPI ClientAPI { get; set; }
25 private ILogger Logger { get; set; }
26 private string path { get; set; }
27 private readonly int chunkSize;
30 public JsonGenerator(ICoreClientAPI _ClientAPI, ILogger _Logger, string _path )
32 this.ClientAPI = _ClientAPI;
33 this.Logger = _Logger;
35 this.chunkSize = ClientAPI.World.BlockAccessor.ChunkSize;
40 /// Generates the JSON Metadata. (in Map object format )
42 public void GenerateJSONMetadata(ColumnsMetadata chunkTopMetadata, Vec2i startChunkColumn, PointsOfInterest POIs, EntitiesOfInterest EOIs, Dictionary<int, string> RockIdCodes )
44 string jsonFilename = Path.Combine(path, "Metadata.js");
46 StreamWriter stream = new StreamWriter(jsonFilename, false, Encoding.UTF8);
49 JsonTextWriter jsonWriter = new JsonTextWriter(stream);
51 jsonWriter.Formatting = Formatting.None;
52 jsonWriter.StringEscapeHandling = StringEscapeHandling.EscapeHtml;
53 jsonWriter.Indentation = 0;
54 //jsonWriter.AutoCompleteOnClose = true;
55 jsonWriter.QuoteChar = '\'';
56 jsonWriter.DateFormatHandling = DateFormatHandling.IsoDateFormat;
57 jsonWriter.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
60 jsonWriter.WriteRaw("ViewFrame.chunks={};\n");
61 jsonWriter.WriteRaw("ViewFrame.chunks.worldSeedNum=");
62 jsonWriter.WriteValue(ClientAPI.World.Seed);
63 jsonWriter.WriteRaw(";\n");
65 jsonWriter.WriteRaw("ViewFrame.chunks.genTime=");
66 jsonWriter.WriteValue(DateTimeOffset.UtcNow);
67 jsonWriter.WriteRaw(";\n");
69 jsonWriter.WriteRaw("ViewFrame.chunks.startCoords=");
70 jsonWriter.WriteStartArray( );
71 jsonWriter.WriteValue(startChunkColumn.X);
72 jsonWriter.WriteValue(startChunkColumn.Y);
73 jsonWriter.WriteEndArray( );
74 jsonWriter.WriteRaw(";\n");
76 jsonWriter.WriteRaw("ViewFrame.chunks.chunkSize=");
77 jsonWriter.WriteValue(chunkSize);
78 jsonWriter.WriteRaw(";\n");
80 jsonWriter.WriteRaw("ViewFrame.chunks.northMostChunk=");
81 jsonWriter.WriteValue(chunkTopMetadata.North_mostChunk);
82 jsonWriter.WriteRaw(";\n");
84 jsonWriter.WriteRaw("ViewFrame.chunks.southMostChunk=");
85 jsonWriter.WriteValue(chunkTopMetadata.South_mostChunk);
86 jsonWriter.WriteRaw(";\n");
88 jsonWriter.WriteRaw("ViewFrame.chunks.westMostChunk=");
89 jsonWriter.WriteValue(chunkTopMetadata.West_mostChunk);
90 jsonWriter.WriteRaw(";\n");
92 jsonWriter.WriteRaw("ViewFrame.chunks.eastMostChunk=");
93 jsonWriter.WriteValue(chunkTopMetadata.East_mostChunk);
94 jsonWriter.WriteRaw(";\n");
97 //MAP object format - [key, value]: key is "x_y"
98 jsonWriter.WriteRaw("ViewFrame.chunks.chunkMetadata=");
99 jsonWriter.WriteStartConstructor("Map");
100 jsonWriter.WriteStartArray( );//An array of... 2-component arrays
103 foreach (var shard in chunkTopMetadata) {
104 jsonWriter.WriteStartArray( );//Start tuple
105 jsonWriter.WriteValue($"{shard.Location.X}_{shard.Location.Y}");//Key of Tuple
107 jsonWriter.WriteStartObject( );
108 jsonWriter.WritePropertyName("prettyCoord");
109 jsonWriter.WriteValue(shard.Location.PrettyCoords(ClientAPI));
111 jsonWriter.WritePropertyName("chunkAge");
112 jsonWriter.WriteValue(shard.ChunkAge);
114 jsonWriter.WritePropertyName("temp");
115 jsonWriter.WriteValue(shard.Temperature);
117 jsonWriter.WritePropertyName("YMax");
118 jsonWriter.WriteValue(shard.YMax);
120 jsonWriter.WritePropertyName("fert");
121 jsonWriter.WriteValue(shard.Fertility);
123 jsonWriter.WritePropertyName("forestDens");
124 jsonWriter.WriteValue(shard.ForestDensity);
126 jsonWriter.WritePropertyName("rain");
127 jsonWriter.WriteValue(shard.Rainfall);
129 jsonWriter.WritePropertyName("shrubDens");
130 jsonWriter.WriteValue(shard.ShrubDensity);
132 jsonWriter.WritePropertyName("airBlocks");
133 jsonWriter.WriteValue(shard.AirBlocks);
135 jsonWriter.WritePropertyName("nonAirBlocks");
136 jsonWriter.WriteValue(shard.NonAirBlocks);
139 //Start rockMap ; FOR a Ratio....on tooltip GUI
140 jsonWriter.WritePropertyName("rockRatio");
141 jsonWriter.WriteStartConstructor("Map");
142 jsonWriter.WriteStartArray( );
143 foreach (var rockEntry in shard.RockRatio) {
144 var rockBlock = ClientAPI.World.GetBlock(rockEntry.Key);
145 jsonWriter.WriteStartArray( );
146 jsonWriter.WriteValue(rockBlock.Code.Path);
147 jsonWriter.WriteValue(rockEntry.Value);//Total per chunk-column
148 jsonWriter.WriteEndArray( );
150 jsonWriter.WriteEndArray( );
151 jsonWriter.WriteEndConstructor( );//end rock-map
153 jsonWriter.WriteEndObject( );//end Map value: {Object}
154 jsonWriter.WriteEndArray( );//end Tuple
157 jsonWriter.WriteEndArray( );//Enclose tuples of chunkMetadata
158 jsonWriter.WriteEndConstructor( );//Close constructor of Map (chunkMetadata)
159 jsonWriter.WriteRaw(";\n");
161 jsonWriter.WriteRaw("ViewFrame.chunks.pointsOfInterest=");
162 jsonWriter.WriteStartConstructor("Map");
163 jsonWriter.WriteStartArray( );//An array of... 2-component arrays
165 foreach (var poi in POIs) {
166 EmitJsonMap(poi, jsonWriter);
169 foreach (var poi in EOIs) {
170 EmitJsonMap(poi, jsonWriter);
173 jsonWriter.WriteEndArray( );
174 jsonWriter.WriteEndConstructor( );
175 jsonWriter.WriteRaw(";\n");
177 jsonWriter.WriteWhitespace("\n");
178 jsonWriter.WriteComment("============= BlockID's for Rockmap / Rock-ratios ===============");
179 jsonWriter.WriteWhitespace("\n");
181 jsonWriter.WriteRaw("ViewFrame.chunks.rock_Lookup =");
182 jsonWriter.WriteStartConstructor("Map");
183 jsonWriter.WriteStartArray( );//An array of... 2-component arrays
185 foreach (var entry in RockIdCodes) {
186 var block = ClientAPI.World.GetBlock(entry.Key);
187 // stream.Write("{0},", Lang.GetUnformatted(block.Code.Path));
188 jsonWriter.WriteStartArray( );
189 jsonWriter.WriteValue(block.Code.Path);
191 jsonWriter.WriteStartObject( );
192 jsonWriter.WritePropertyName("assetCode");
193 jsonWriter.WriteValue(entry.Value);
195 jsonWriter.WritePropertyName("name");
196 jsonWriter.WriteValue(Lang.GetUnformatted(block.Code.Path));
199 jsonWriter.WriteEndObject( );
200 jsonWriter.WriteEndArray( );
202 jsonWriter.WriteEndArray( );
203 jsonWriter.WriteEndConstructor( );
204 //stream.Write("]);\n");
205 jsonWriter.WriteRaw(";\n");
213 public void EmitJsonMap(PointOfInterest @this, JsonTextWriter jsonWriter)
215 jsonWriter.WriteStartArray( );
216 jsonWriter.WriteValue($"{@this.Location.X}_{@this.Location.Z}");
218 jsonWriter.WriteStartArray( );
219 //jsonWriter.WriteValue(@this.Name);
221 jsonWriter.WriteValue(@this.Location.X);
222 jsonWriter.WriteValue(@this.Location.Z); //Y is HEIGHT from Mantle... Z is Right from edge of world
224 jsonWriter.WriteValue(@this.Location.PrettyCoords(ClientAPI));
226 jsonWriter.WriteValue(@this.Notes);//put more escaping in Java-script if needed
228 jsonWriter.WriteValue(@this.Timestamp);
230 jsonWriter.WriteEndArray( );
231 jsonWriter.WriteEndArray( );
234 public void EmitJsonMap(EntityOfInterest @this, JsonTextWriter jsonWriter)
236 jsonWriter.WriteStartArray( );
237 jsonWriter.WriteValue($"{@this.Location.X}_{@this.Location.Z}");
240 jsonWriter.WriteStartArray( );
241 //jsonWriter.WriteValue(@this.Name);
243 jsonWriter.WriteValue(@this.Location.X);
244 jsonWriter.WriteValue(@this.Location.Z); //Y is HEIGHT from Mantle... Z is Right from edge of world
246 jsonWriter.WriteValue(@this.Location.PrettyCoords(ClientAPI));
248 jsonWriter.WriteValue(@this.Notes);//put more escaping in Java-script if needed
250 jsonWriter.WriteValue(@this.Timestamp);
252 jsonWriter.WriteValue(@this.EntityId);
254 jsonWriter.WriteEndArray( );
255 jsonWriter.WriteEndArray( );
259 /// Dynamically reflect Points-of-Something fields for metadata descriptors
261 /// <returns>Json-array names of fields for use in map display.</returns>
262 public string MakePreBuiltJSON( )
264 var builder = new StringBuilder(512);
265 builder.Append("ViewFrame.chunks={};\n");
266 builder.AppendFormat("ViewFrame.chunks.worldSeedNum='{0}';",
269 builder.AppendFormat("ViewFrame.chunks.chunkSize={0};",
273 builder.Append("ViewFrame.chunks.chunkMetadataNames=[");
274 var fields = typeof(ColumnMeta).GetFields( );
275 var attsToSort = new List<DisplayNameAttribute>( );
277 foreach (var f in fields) {
278 var att = f.GetCustomAttribute(typeof(DisplayNameAttribute));
280 attsToSort.Add(( DisplayNameAttribute )att);
284 foreach (var att in attsToSort.OrderBy(a => a.order))
285 builder.AppendFormat("'{0}',", att.name);
286 builder.Append("];\n");
288 builder.Append("ViewFrame.chunks.pointsOfInterestNames=[");
289 fields = typeof(PointOfInterest).GetFields( );
290 attsToSort = new List<DisplayNameAttribute>( );
292 foreach (var f in fields) {
293 var att = f.GetCustomAttribute(typeof(DisplayNameAttribute));
295 attsToSort.Add(( DisplayNameAttribute )att);
297 foreach (var att in attsToSort.OrderBy(a => a.order))
298 builder.AppendFormat("'{0}',", att.name);
299 builder.Append("];\n");
301 builder.Append("ViewFrame.chunks.entityOfInterestNames=[");
302 fields = typeof(EntityOfInterest).GetFields( );
303 attsToSort = new List<DisplayNameAttribute>( );
305 foreach (var f in fields) {
306 var att = f.GetCustomAttribute(typeof(DisplayNameAttribute));
308 attsToSort.Add(( DisplayNameAttribute )att);
310 foreach (var att in attsToSort.OrderBy(a => a.order))
311 builder.AppendFormat("'{0}',", att.name);
312 builder.Append("];\n");
314 return builder.ToString( );