From e928c814ee4fd92ef6ad708947e33e4d8ad6f726 Mon Sep 17 00:00:00 2001 From: The Grand Dog Date: Thu, 20 Feb 2020 19:00:41 -0500 Subject: [PATCH] indentation --- Automap/AutomapMod.cs | 29 +- Automap/Data/BlockDesignator.cs | 26 +- Automap/Data/ColumnMeta.cs | 130 ++-- Automap/Data/CommandData.cs | 50 +- Automap/Data/EntitiesOfInterest.cs | 38 +- Automap/Data/EntityDesignator.cs | 26 +- Automap/Data/PngMetadataChunk.cs | 24 +- Automap/Data/PointOfInterest.cs | 20 +- Automap/Data/StatusData.cs | 73 +- Automap/Designators/DefaultDesignators.cs | 136 ++-- Automap/Renderers/AlternateRenderer.cs | 196 ++--- Automap/Renderers/IChunkRenderer.cs | 4 +- Automap/Renderers/StandardRenerer.cs | 229 +++--- Automap/Subsystems/AutomapGUIDialog.cs | 159 ++-- Automap/Subsystems/AutomapSystem.cs | 1150 +++++++++++++++-------------- 15 files changed, 1189 insertions(+), 1101 deletions(-) diff --git a/Automap/AutomapMod.cs b/Automap/AutomapMod.cs index 7babd0e..6b07d22 100644 --- a/Automap/AutomapMod.cs +++ b/Automap/AutomapMod.cs @@ -20,36 +20,37 @@ namespace Automap } public override void StartClientSide(ICoreClientAPI api) - { + { this.API = api; - if (api.Side == EnumAppSide.Client) { - this.ClientAPI = api as ICoreClientAPI; - this.Logger = Mod.Logger; + if (api.Side == EnumAppSide.Client) + { + this.ClientAPI = api as ICoreClientAPI; + this.Logger = Mod.Logger; - ClientAPI.Logger.VerboseDebug("Automap Present!"); - _localAutomap = new AutomapSystem( this.ClientAPI, this.Logger); - _automapDialog = new AutomapGUIDialog(ClientAPI, _localAutomap); + ClientAPI.Logger.VerboseDebug("Automap Present!"); + _localAutomap = new AutomapSystem(this.ClientAPI, this.Logger); + _automapDialog = new AutomapGUIDialog(ClientAPI, _localAutomap); - ClientAPI.Input.RegisterHotKey(AutomapGUIDialog._automapControlPanelKey, "Automap control panel", GlKeys.M, HotkeyType.GUIOrOtherControls, shiftPressed: true); - ClientAPI.Input.SetHotKeyHandler(AutomapGUIDialog._automapControlPanelKey, ToggleAM_Dialog); + ClientAPI.Input.RegisterHotKey(AutomapGUIDialog._automapControlPanelKey, "Automap control panel", GlKeys.M, HotkeyType.GUIOrOtherControls, shiftPressed: true); + ClientAPI.Input.SetHotKeyHandler(AutomapGUIDialog._automapControlPanelKey, ToggleAM_Dialog); } base.StartClientSide(api); } - public override double ExecuteOrder( ) + public override double ExecuteOrder() { - return 0.2; + return 0.2; } private bool ToggleAM_Dialog(KeyCombination comb) { - if (_automapDialog.IsOpened( )) _automapDialog.TryClose( ); - else _automapDialog.TryOpen( ); + if (_automapDialog.IsOpened()) _automapDialog.TryClose(); + else _automapDialog.TryOpen(); - return true; + return true; } } } diff --git a/Automap/Data/BlockDesignator.cs b/Automap/Data/BlockDesignator.cs index 353e3c9..815b13a 100644 --- a/Automap/Data/BlockDesignator.cs +++ b/Automap/Data/BlockDesignator.cs @@ -15,38 +15,38 @@ namespace Automap /// Point of Interest Rule Designator /// public class BlockDesignator - { + { public Color OverwriteColor; public BlockDesignatonAction SpecialAction; public AssetLocation Pattern; public EnumBlockMaterial? Material; public bool Enabled { get; set; } - private BlockDesignator( ) + private BlockDesignator() { - throw new NotSupportedException( ); + throw new NotSupportedException(); } - public BlockDesignator( AssetLocation pattern , Color overwriteColor, EnumBlockMaterial? material) - { + public BlockDesignator(AssetLocation pattern, Color overwriteColor, EnumBlockMaterial? material) + { this.Pattern = pattern; this.OverwriteColor = overwriteColor; this.Material = material; this.Enabled = true; } - public BlockDesignator(AssetLocation pattern, Color overwriteColor, EnumBlockMaterial? material ,BlockDesignatonAction specialAct ) + public BlockDesignator(AssetLocation pattern, Color overwriteColor, EnumBlockMaterial? material, BlockDesignatonAction specialAct) { - this.Pattern = pattern; - this.OverwriteColor = overwriteColor; - this.Material = material; - this.SpecialAction = specialAct; - this.Enabled = true; + this.Pattern = pattern; + this.OverwriteColor = overwriteColor; + this.Material = material; + this.SpecialAction = specialAct; + this.Enabled = true; } - public override string ToString( ) + public override string ToString() { - return Pattern.ToShortString() +"|"+ OverwriteColor.Name + "|" + Material ?? ""; + return Pattern.ToShortString() + "|" + OverwriteColor.Name + "|" + Material ?? ""; } } } diff --git a/Automap/Data/ColumnMeta.cs b/Automap/Data/ColumnMeta.cs index 00d4b09..bd07aaa 100644 --- a/Automap/Data/ColumnMeta.cs +++ b/Automap/Data/ColumnMeta.cs @@ -27,7 +27,7 @@ namespace Automap public ushort YMax;// Y feature height [ProtoMember(5)] - public Dictionary RockRatio;//[Column] Geographic region (rock) Ratio. [BlockID * count] + public Dictionary RockRatio;//[Column] Geographic region (rock) Ratio. [BlockID * count] [ProtoMember(6)] public float Fertility; @@ -49,105 +49,115 @@ namespace Automap //[ProtoMember(12,OverwriteList = true)] [ProtoIgnore] - public ushort[ , ] HeightMap; + public ushort[,] HeightMap; public ColumnMeta(Vec2i loc, int chunkSize = 32) { - Location = loc; - ChunkAge = TimeSpan.Zero; - Temperature = 0f; - YMax = 0; - RockRatio = new Dictionary( 10 ); - Fertility = 0f; - ForestDensity = 0f; - Rainfall = 0f; - ShrubDensity = 0f; - AirBlocks = 0; - NonAirBlocks = 0; - HeightMap = new ushort[chunkSize, chunkSize]; - } - - internal void UpdateFieldsFrom(ClimateCondition climate, IMapChunk mapChunk ,TimeSpan chunkAge) + Location = loc; + ChunkAge = TimeSpan.Zero; + Temperature = 0f; + YMax = 0; + RockRatio = new Dictionary(10); + Fertility = 0f; + ForestDensity = 0f; + Rainfall = 0f; + ShrubDensity = 0f; + AirBlocks = 0; + NonAirBlocks = 0; + HeightMap = new ushort[chunkSize, chunkSize]; + } + + internal void UpdateFieldsFrom(ClimateCondition climate, IMapChunk mapChunk, TimeSpan chunkAge) { - this.ChunkAge = chunkAge; - this.Temperature = climate.Temperature; - this.Fertility = climate.Fertility; - this.ForestDensity = climate.ForestDensity; - this.Rainfall = climate.Rainfall; - this.ShrubDensity = climate.ShrubDensity; - - this.YMax = mapChunk.YMax; - + this.ChunkAge = chunkAge; + this.Temperature = climate.Temperature; + this.Fertility = climate.Fertility; + this.ForestDensity = climate.ForestDensity; + this.Rainfall = climate.Rainfall; + this.ShrubDensity = climate.ShrubDensity; + + this.YMax = mapChunk.YMax; + } } public class ColumnsMetadata : KeyedCollection { - private ColumnsMetadata( ) + private ColumnsMetadata() { throw new NotSupportedException(); } public ColumnsMetadata(Vec2i startChunkColumn) { - North_mostChunk = startChunkColumn.Y; - South_mostChunk = startChunkColumn.Y; - East_mostChunk = startChunkColumn.X; - West_mostChunk = startChunkColumn.X; + North_mostChunk = startChunkColumn.Y; + South_mostChunk = startChunkColumn.Y; + East_mostChunk = startChunkColumn.X; + West_mostChunk = startChunkColumn.X; } - public int North_mostChunk { + public int North_mostChunk + { get; private set; } - public int South_mostChunk { + public int South_mostChunk + { get; private set; } - public int East_mostChunk { + public int East_mostChunk + { get; private set; } - public int West_mostChunk { + public int West_mostChunk + { get; private set; } protected override Vec2i GetKeyForItem(ColumnMeta item) { - return item.Location; + return item.Location; } internal void Update(ColumnMeta metaData) { - if (this.Contains(metaData.Location)) { - this.Remove(metaData.Location); - this.Add(metaData); - } - else { - this.Add(metaData); - } + if (this.Contains(metaData.Location)) + { + this.Remove(metaData.Location); + this.Add(metaData); + } + else + { + this.Add(metaData); + } } public new void Add(ColumnMeta newItem) { - if (North_mostChunk > newItem.Location.Y) { - North_mostChunk = newItem.Location.Y; - } - - if (South_mostChunk < newItem.Location.Y) { - South_mostChunk = newItem.Location.Y; - } - - if (East_mostChunk < newItem.Location.X) { - East_mostChunk = newItem.Location.X; - } - - if (West_mostChunk > newItem.Location.X) { - West_mostChunk = newItem.Location.X; - } - - base.Add(newItem); + if (North_mostChunk > newItem.Location.Y) + { + North_mostChunk = newItem.Location.Y; + } + + if (South_mostChunk < newItem.Location.Y) + { + South_mostChunk = newItem.Location.Y; + } + + if (East_mostChunk < newItem.Location.X) + { + East_mostChunk = newItem.Location.X; + } + + if (West_mostChunk > newItem.Location.X) + { + West_mostChunk = newItem.Location.X; + } + + base.Add(newItem); } } diff --git a/Automap/Data/CommandData.cs b/Automap/Data/CommandData.cs index 88ebe3a..2391c0a 100644 --- a/Automap/Data/CommandData.cs +++ b/Automap/Data/CommandData.cs @@ -29,72 +29,74 @@ namespace Automap //Choose : Renderer(s) - public CommandData( RunState assumeState, bool[] theseDelegates) + public CommandData(RunState assumeState, bool[] theseDelegates) { - State = assumeState; + State = assumeState; - DelegatesFlags = new List(theseDelegates.Length); - foreach (var df in theseDelegates) { - DelegatesFlags.Add(new DelegateState( ) { + DelegatesFlags = new List(theseDelegates.Length); + foreach (var df in theseDelegates) + { + DelegatesFlags.Add(new DelegateState() + { Enabled = df, AlternateColor = null, - }); + }); - } + } } public CommandData(RunState assumeState) { - State = assumeState;//Never RUN. + State = assumeState;//Never RUN. - DelegatesFlags = new List(); + DelegatesFlags = new List(); } public void FromBytes(BinaryReader stream) { - var temp = ProtoBuf.Serializer.Deserialize(stream.BaseStream); - this.State = temp.State; - this.DelegatesFlags = temp.DelegatesFlags; + var temp = ProtoBuf.Serializer.Deserialize(stream.BaseStream); + this.State = temp.State; + this.DelegatesFlags = temp.DelegatesFlags; } public void ToBytes(BinaryWriter stream) { - ProtoBuf.Serializer.Serialize(stream.BaseStream, this); - + ProtoBuf.Serializer.Serialize(stream.BaseStream, this); + } - public int GetAttributeId( ) + public int GetAttributeId() { - return 12346; + return 12346; } - public object GetValue( ) + public object GetValue() { - return this; + return this; } - public string ToJsonToken( ) + public string ToJsonToken() { return $"New-State:{State}, Delegates# {DelegatesFlags.Count} "; } public bool Equals(IWorldAccessor worldForResolve, IAttribute attr) { - var other = attr.GetValue( ) as CommandData; + var other = attr.GetValue() as CommandData; - if (this.State == other.State ) - { - return true; + if (this.State == other.State) + { + return true; } - return false; + return false; } } diff --git a/Automap/Data/EntitiesOfInterest.cs b/Automap/Data/EntitiesOfInterest.cs index f0564fb..72b9f3e 100644 --- a/Automap/Data/EntitiesOfInterest.cs +++ b/Automap/Data/EntitiesOfInterest.cs @@ -12,33 +12,35 @@ namespace Automap /// Entities of interest. /// /// Tracked by ID - these never leave. - public class EntitiesOfInterest + public class EntitiesOfInterest { private Dictionary entitySet = new Dictionary(50); internal void Upsert(Entity something, string message = @"") { - if (entitySet.ContainsKey(something.EntityId)) { - var movingPOI = entitySet[something.EntityId]; - movingPOI.Location = something.Pos.AsBlockPos.Copy( ); - movingPOI.Timestamp = DateTimeOffset.UtcNow; - } - else { - PointOfInterest newPOI = new PointOfInterest( ); - newPOI.EntityId = something.EntityId; - newPOI.Location = something.Pos.AsBlockPos.Copy( ); - newPOI.Timestamp = DateTimeOffset.UtcNow; - newPOI.Notes = message; - entitySet.Add(something.EntityId, newPOI ); - } - + if (entitySet.ContainsKey(something.EntityId)) + { + var movingPOI = entitySet[something.EntityId]; + movingPOI.Location = something.Pos.AsBlockPos.Copy(); + movingPOI.Timestamp = DateTimeOffset.UtcNow; + } + else + { + PointOfInterest newPOI = new PointOfInterest(); + newPOI.EntityId = something.EntityId; + newPOI.Location = something.Pos.AsBlockPos.Copy(); + newPOI.Timestamp = DateTimeOffset.UtcNow; + newPOI.Notes = message; + entitySet.Add(something.EntityId, newPOI); + } + } - public List PointsList { - get - { + public List PointsList + { + get { return entitySet.Values.ToList(); } } diff --git a/Automap/Data/EntityDesignator.cs b/Automap/Data/EntityDesignator.cs index 899671d..82b1e25 100644 --- a/Automap/Data/EntityDesignator.cs +++ b/Automap/Data/EntityDesignator.cs @@ -23,31 +23,31 @@ namespace Automap public EnumEntityState? StateCheck;//Needed? public bool Enabled { get; set; } - private EntityDesignator( ) + private EntityDesignator() { - throw new NotSupportedException( ); + throw new NotSupportedException(); } public EntityDesignator(AssetLocation pattern, Color overwriteColor, EnumEntityState? state) { - this.Pattern = pattern; - this.OverwriteColor = overwriteColor; - this.StateCheck = state; - this.Enabled = true; + this.Pattern = pattern; + this.OverwriteColor = overwriteColor; + this.StateCheck = state; + this.Enabled = true; } public EntityDesignator(AssetLocation pattern, Color overwriteColor, EnumEntityState? state, EntityDesignatonAction specialAct) { - this.Pattern = pattern; - this.OverwriteColor = overwriteColor; - this.StateCheck = state; - this.SpecialAction = specialAct; - this.Enabled = true; + this.Pattern = pattern; + this.OverwriteColor = overwriteColor; + this.StateCheck = state; + this.SpecialAction = specialAct; + this.Enabled = true; } - public override string ToString( ) + public override string ToString() { - return Pattern.ToShortString( ) + "|" + OverwriteColor.Name + "|" + StateCheck ?? ""; + return Pattern.ToShortString() + "|" + OverwriteColor.Name + "|" + StateCheck ?? ""; } } } diff --git a/Automap/Data/PngMetadataChunk.cs b/Automap/Data/PngMetadataChunk.cs index df81944..c62aadf 100644 --- a/Automap/Data/PngMetadataChunk.cs +++ b/Automap/Data/PngMetadataChunk.cs @@ -21,33 +21,33 @@ namespace Automap public PngMetadataChunk(ImageInfo info) : base(ID, info) { - + } - public override ChunkOrderingConstraint GetOrderingConstraint( ) + public override ChunkOrderingConstraint GetOrderingConstraint() { - return ChunkOrderingConstraint.NONE; + return ChunkOrderingConstraint.NONE; } - public override ChunkRaw CreateRawChunk( ) - { - var datas = SerializerUtil.Serialize(ChunkMetadata); + public override ChunkRaw CreateRawChunk() + { + var datas = SerializerUtil.Serialize(ChunkMetadata); - ChunkRaw rawChunk = createEmptyChunk(datas.Length, true); - rawChunk.Data = datas; + ChunkRaw rawChunk = createEmptyChunk(datas.Length, true); + rawChunk.Data = datas; - return rawChunk; + return rawChunk; } public override void ParseFromRaw(ChunkRaw rawChunk) { - this.ChunkMetadata = SerializerUtil.Deserialize(rawChunk.Data); + this.ChunkMetadata = SerializerUtil.Deserialize(rawChunk.Data); } public override void CloneDataFromRead(PngChunk other) { - PngMetadataChunk clone = ( PngMetadataChunk )other; - this.ChunkMetadata = clone.ChunkMetadata; + PngMetadataChunk clone = (PngMetadataChunk) other; + this.ChunkMetadata = clone.ChunkMetadata; } } diff --git a/Automap/Data/PointOfInterest.cs b/Automap/Data/PointOfInterest.cs index 116a6f3..65eafd6 100644 --- a/Automap/Data/PointOfInterest.cs +++ b/Automap/Data/PointOfInterest.cs @@ -10,7 +10,7 @@ namespace Automap /// Actual Physical Point in space - that is interesting. /// public struct PointOfInterest - { + { public string Notes; public BlockPos Location; public DateTimeOffset Timestamp; @@ -21,18 +21,20 @@ namespace Automap { protected override BlockPos GetKeyForItem(PointOfInterest item) { - return item.Location; + return item.Location; } internal void AddReplace(PointOfInterest poi) { - if (this.Contains(poi.Location)) { - this.Remove(poi.Location); - this.Add(poi); - } - else { - this.Add(poi); - } + if (this.Contains(poi.Location)) + { + this.Remove(poi.Location); + this.Add(poi); + } + else + { + this.Add(poi); + } } } diff --git a/Automap/Data/StatusData.cs b/Automap/Data/StatusData.cs index a877ef4..ef6bdd1 100644 --- a/Automap/Data/StatusData.cs +++ b/Automap/Data/StatusData.cs @@ -3,66 +3,57 @@ using System.IO; using Vintagestory.API.Common; using Vintagestory.API.Datastructures; -namespace Automap -{ - public class StatusData : IAttribute - { +namespace Automap { + public class StatusData : IAttribute { public uint TotalUpdates { get; set; } public uint VoidChunks { get; set; } public uint Delta { get; set; } public uint Max_N, Max_E, Max_S, Max_W; public RunState CurrentState { get; set; } - public StatusData(uint totalUpdates, uint voidChunks, uint delta, RunState currently ) - { - TotalUpdates = totalUpdates; - VoidChunks = voidChunks; - Delta = delta; - CurrentState = currently; + public StatusData(uint totalUpdates, uint voidChunks, uint delta, RunState currently) { + TotalUpdates = totalUpdates; + VoidChunks = voidChunks; + Delta = delta; + CurrentState = currently; } - public void FromBytes(BinaryReader stream) - { - TotalUpdates = stream.ReadUInt32( ); - VoidChunks = stream.ReadUInt32( ); - Delta = stream.ReadUInt32( ); - CurrentState = ( RunState )stream.ReadByte( ); + public void FromBytes(BinaryReader stream) { + TotalUpdates = stream.ReadUInt32(); + VoidChunks = stream.ReadUInt32(); + Delta = stream.ReadUInt32(); + CurrentState = (RunState) stream.ReadByte(); } - public int GetAttributeId( ) - { - return 12345; + public int GetAttributeId() { + return 12345; } - public object GetValue( ) - { - return this; + public object GetValue() { + return this; } - public void ToBytes(BinaryWriter stream) - { - stream.Write(TotalUpdates); - stream.Write(VoidChunks); - stream.Write(Delta); - stream.Write((byte)CurrentState); + public void ToBytes(BinaryWriter stream) { + stream.Write(TotalUpdates); + stream.Write(VoidChunks); + stream.Write(Delta); + stream.Write((byte) CurrentState); } - public string ToJsonToken( ) - { - return $"TotalUpdate:{TotalUpdates}, VoidChunks:{VoidChunks}, Delta:{Delta}"; + public string ToJsonToken() { + return $"TotalUpdate:{TotalUpdates}, VoidChunks:{VoidChunks}, Delta:{Delta}"; } - public bool Equals(IWorldAccessor worldForResolve, IAttribute attr) - { - StatusData other = attr.GetValue( ) as StatusData; + public bool Equals(IWorldAccessor worldForResolve, IAttribute attr) { + StatusData other = attr.GetValue() as StatusData; - if (this.TotalUpdates == other.TotalUpdates && - this.VoidChunks == other.VoidChunks && - this.Delta == other.Delta && - this.CurrentState == other.CurrentState) { - return true; - } - return false; + if (this.TotalUpdates == other.TotalUpdates && + this.VoidChunks == other.VoidChunks && + this.Delta == other.Delta && + this.CurrentState == other.CurrentState) { + return true; + } + return false; } } } diff --git a/Automap/Designators/DefaultDesignators.cs b/Automap/Designators/DefaultDesignators.cs index a6b653f..19b448e 100644 --- a/Automap/Designators/DefaultDesignators.cs +++ b/Automap/Designators/DefaultDesignators.cs @@ -55,7 +55,7 @@ namespace Automap new EntityDesignator( new AssetLocation("game", "humanoid-trader"), Color.LightGoldenrodYellow, - EnumEntityState.Active, + EnumEntityState.Active, KeepTrackOfMerchant ); @@ -63,9 +63,9 @@ namespace Automap /// Not just blocks, but block-entities as well! /// /// The block designators. - public static List DefaultBlockDesignators( ) + public static List DefaultBlockDesignators() { - return new List{ + return new List{ DefaultDesignators.Roads, DefaultDesignators.GroundSigns, DefaultDesignators.WallSigns, @@ -74,7 +74,7 @@ namespace Automap }; } - public static List DefaultEntityDesignators( ) + public static List DefaultEntityDesignators() { return new List{ DefaultDesignators.Traders, @@ -83,86 +83,92 @@ namespace Automap internal static void DecodeSign(ICoreClientAPI clientAPI, PointsOfInterest poi, BlockPos posn, Block block) { - #if DEBUG - clientAPI.Logger.VerboseDebug("Sign Designator Invoked!"); - #endif - //sign Text into a POI field... - BlockEntitySign signEntity = clientAPI.World.BlockAccessor.GetBlockEntity(posn) as BlockEntitySign; - - if (signEntity != null && !String.IsNullOrEmpty(signEntity.text)) - { - - poi.AddReplace( - new PointOfInterest { - Location = posn.Copy( ), - Notes = signEntity.text, - Timestamp = DateTimeOffset.UtcNow, - } - ); - - } +#if DEBUG + clientAPI.Logger.VerboseDebug("Sign Designator Invoked!"); +#endif + //sign Text into a POI field... + BlockEntitySign signEntity = clientAPI.World.BlockAccessor.GetBlockEntity(posn) as BlockEntitySign; + + if (signEntity != null && !String.IsNullOrEmpty(signEntity.text)) + { + + poi.AddReplace( + new PointOfInterest + { + Location = posn.Copy(), + Notes = signEntity.text, + Timestamp = DateTimeOffset.UtcNow, + } + ); + + } } internal static void DecodePostSign(ICoreClientAPI clientAPI, PointsOfInterest poi, BlockPos posn, Block block) { - #if DEBUG - clientAPI.Logger.VerboseDebug("Post-sign Designator Invoked!"); - #endif - //sign post Text into a POI field... - BlockEntitySignPost signEntity = clientAPI.World.BlockAccessor.GetBlockEntity(posn) as BlockEntitySignPost; - - if (signEntity != null && signEntity.textByCardinalDirection?.Length > 0 ) { - - poi.AddReplace( - new PointOfInterest { - Location = posn.Copy( ), - Notes = string.Join(",", signEntity.textByCardinalDirection), - Timestamp = DateTimeOffset.UtcNow, - } - ); - - } +#if DEBUG + clientAPI.Logger.VerboseDebug("Post-sign Designator Invoked!"); +#endif + //sign post Text into a POI field... + BlockEntitySignPost signEntity = clientAPI.World.BlockAccessor.GetBlockEntity(posn) as BlockEntitySignPost; + + if (signEntity != null && signEntity.textByCardinalDirection?.Length > 0) + { + + poi.AddReplace( + new PointOfInterest + { + Location = posn.Copy(), + Notes = string.Join(",", signEntity.textByCardinalDirection), + Timestamp = DateTimeOffset.UtcNow, + } + ); + + } } internal static void KeepTrackOfMerchant(ICoreClientAPI clientAPI, EntitiesOfInterest poi, BlockPos posn, Entity entity) { - clientAPI.Logger.VerboseDebug("Trader: {0} @ {1}", entity.GetName( ), posn); - - var message = $"{entity.GetName( )}"; - var traderJoe = entity as EntityTrader; - if (traderJoe.TradeProps != null) { - message = $"{traderJoe.GetName( )} Alive:{traderJoe.Alive} - Gears: {traderJoe.TradeProps.Money}, "; - } - poi.Upsert(entity, message); + clientAPI.Logger.VerboseDebug("Trader: {0} @ {1}", entity.GetName(), posn); + + var message = $"{entity.GetName()}"; + var traderJoe = entity as EntityTrader; + if (traderJoe.TradeProps != null) + { + message = $"{traderJoe.GetName()} Alive:{traderJoe.Alive} - Gears: {traderJoe.TradeProps.Money}, "; + } + poi.Upsert(entity, message); } internal static void DecodeTranslocator(ICoreClientAPI clientAPI, PointsOfInterest poi, BlockPos posn, Block block) { - clientAPI.Logger.VerboseDebug("TRANSLOCATOR Designator Invoked!"); - //Where to? and from! - - BlockEntityStaticTranslocator te = clientAPI.World.BlockAccessor.GetBlockEntity(posn) as BlockEntityStaticTranslocator; + clientAPI.Logger.VerboseDebug("TRANSLOCATOR Designator Invoked!"); + //Where to? and from! - if (te != null ) { + BlockEntityStaticTranslocator te = clientAPI.World.BlockAccessor.GetBlockEntity(posn) as BlockEntityStaticTranslocator; - StringBuilder textTarget = new StringBuilder( ); - //translocatorEntity.GetBlockInfo(clientAPI.World.Player, textTarget); + if (te != null) + { - textTarget.Append(te.Activated ? "Online " : "offline "); - textTarget.Append(" Dest.: "); - textTarget.Append(te.TargetLocation != null ? te.TargetLocation.PrettyCoords(clientAPI) : "???");//Or ABS coords? + StringBuilder textTarget = new StringBuilder(); + //translocatorEntity.GetBlockInfo(clientAPI.World.Player, textTarget); - poi.AddReplace( - new PointOfInterest { - Location = posn.Copy( ), - Notes = textTarget.ToString(), - Timestamp = DateTimeOffset.UtcNow, - } - ); + textTarget.Append(te.Activated ? "Online " : "offline "); + textTarget.Append(" Dest.: "); + textTarget.Append(te.TargetLocation != null ? te.TargetLocation.PrettyCoords(clientAPI) : "???");//Or ABS coords? - } + poi.AddReplace( + new PointOfInterest + { + Location = posn.Copy(), + Notes = textTarget.ToString(), + Timestamp = DateTimeOffset.UtcNow, + } + ); + + } } } } diff --git a/Automap/Renderers/AlternateRenderer.cs b/Automap/Renderers/AlternateRenderer.cs index 93fcd16..69ff326 100644 --- a/Automap/Renderers/AlternateRenderer.cs +++ b/Automap/Renderers/AlternateRenderer.cs @@ -21,106 +21,114 @@ namespace Automap /// Logger. public AlternateRenderer(ICoreClientAPI clientAPI, ILogger logger) : base(clientAPI, logger) { - chunkSize = ClientAPI.World.BlockAccessor.ChunkSize; + chunkSize = ClientAPI.World.BlockAccessor.ChunkSize; } public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta metaData, PngWriter pngWriter, out uint pixelCount) - { - pixelCount = 0; - BlockPos tmpPos = new BlockPos( ); - Vec2i localpos = new Vec2i( ); - var chunksColumn = new IWorldChunk[ClientAPI.World.BlockAccessor.MapSizeY / chunkSize]; - - int topChunkY = mc.YMax / chunkSize;//Heywaitaminute -- this isn't a highest FEATURE, if Rainmap isn't accurate! - //Metadata of DateTime chunk was edited, chunk coords.,world-seed? Y-Max feature height - //Grab a chunk COLUMN... Topmost Y down... - for (int chunkY = 0; chunkY <= topChunkY; chunkY++) { - chunksColumn[chunkY] = ClientAPI.World.BlockAccessor.GetChunk(chunkPos.X, chunkY, chunkPos.Y); - //What to do if chunk is a void? invalid? - } - - //pre-create PNG line slices... - ImageLine[ ] lines = Enumerable.Repeat(new object( ), chunkSize).Select(l => new ImageLine(pngWriter.ImgInfo)).ToArray( ); - ushort[ ] allMapYs = mc.RainHeightMap; - for (int posIndex = 0; posIndex < (chunkSize * chunkSize); posIndex++) { - int currY = allMapYs[posIndex]; - int localChunkY = currY / chunkSize; - if (localChunkY >= (chunksColumn.Length)) continue; //Out of range! - if (chunksColumn[localChunkY] == null) continue; - - MapUtil.PosInt2d(posIndex, chunkSize, localpos); - int localX = localpos.X; - int localZ = localpos.Y; - - chunksColumn[localChunkY].Unpack( ); - int blockId = chunksColumn[localChunkY].Blocks[MapUtil.Index3d(localX, currY % chunkSize, localZ, chunkSize, chunkSize)]; - - Block block = ClientAPI.World.Blocks[blockId]; - - tmpPos.Set(chunkSize * chunkPos.X + localX, currY, chunkSize * chunkPos.Y + localZ); - - int red; - int green; - int blue; - - //============ POI Population ================= - if (BlockID_Designators.ContainsKey(blockId)) { - var desig = BlockID_Designators[blockId]; - red = desig.OverwriteColor.R; - green = desig.OverwriteColor.G; - blue = desig.OverwriteColor.B; - - - ImageLineHelper.SetPixel(lines[localZ], localX, red, green, blue); - continue; - } - - float b = GetSlope(localX, localZ, allMapYs); - - int col = block.GetColor(ClientAPI, tmpPos); - int packedFormat = ColorUtil.ColorMultiply3Clamped(col, b); - - red = ColorUtil.ColorB(packedFormat); - green = ColorUtil.ColorG(packedFormat); - blue = ColorUtil.ColorR(packedFormat); - ImageLineHelper.SetPixel(lines[localZ], localX, red, green, blue); - - //chunkImage.SetPixel(localX, localZ, pixelColor); - pixelCount++; - } - - for (int row = 0; row < pngWriter.ImgInfo.Rows; row++) { - pngWriter.WriteRow(lines[row], row); - } - - pngWriter.End( ); + { + pixelCount = 0; + BlockPos tmpPos = new BlockPos(); + Vec2i localpos = new Vec2i(); + var chunksColumn = new IWorldChunk[ClientAPI.World.BlockAccessor.MapSizeY / chunkSize]; + + int topChunkY = mc.YMax / chunkSize;//Heywaitaminute -- this isn't a highest FEATURE, if Rainmap isn't accurate! + //Metadata of DateTime chunk was edited, chunk coords.,world-seed? Y-Max feature height + //Grab a chunk COLUMN... Topmost Y down... + for (int chunkY = 0; chunkY <= topChunkY; chunkY++) + { + chunksColumn[chunkY] = ClientAPI.World.BlockAccessor.GetChunk(chunkPos.X, chunkY, chunkPos.Y); + //What to do if chunk is a void? invalid? + } + + //pre-create PNG line slices... + ImageLine[] lines = Enumerable.Repeat(new object(), chunkSize).Select(l => new ImageLine(pngWriter.ImgInfo)).ToArray(); + ushort[] allMapYs = mc.RainHeightMap; + for (int posIndex = 0; posIndex < (chunkSize * chunkSize); posIndex++) + { + int currY = allMapYs[posIndex]; + int localChunkY = currY / chunkSize; + if (localChunkY >= (chunksColumn.Length)) continue; //Out of range! + if (chunksColumn[localChunkY] == null) continue; + + MapUtil.PosInt2d(posIndex, chunkSize, localpos); + int localX = localpos.X; + int localZ = localpos.Y; + + chunksColumn[localChunkY].Unpack(); + int blockId = chunksColumn[localChunkY].Blocks[MapUtil.Index3d(localX, currY % chunkSize, localZ, chunkSize, chunkSize)]; + + Block block = ClientAPI.World.Blocks[blockId]; + + tmpPos.Set(chunkSize * chunkPos.X + localX, currY, chunkSize * chunkPos.Y + localZ); + + int red; + int green; + int blue; + + //============ POI Population ================= + if (BlockID_Designators.ContainsKey(blockId)) + { + var desig = BlockID_Designators[blockId]; + red = desig.OverwriteColor.R; + green = desig.OverwriteColor.G; + blue = desig.OverwriteColor.B; + + + ImageLineHelper.SetPixel(lines[localZ], localX, red, green, blue); + continue; + } + + float b = GetSlope(localX, localZ, allMapYs); + + int col = block.GetColor(ClientAPI, tmpPos); + int packedFormat = ColorUtil.ColorMultiply3Clamped(col, b); + + red = ColorUtil.ColorB(packedFormat); + green = ColorUtil.ColorG(packedFormat); + blue = ColorUtil.ColorR(packedFormat); + ImageLineHelper.SetPixel(lines[localZ], localX, red, green, blue); + + //chunkImage.SetPixel(localX, localZ, pixelColor); + pixelCount++; + } + + for (int row = 0; row < pngWriter.ImgInfo.Rows; row++) + { + pngWriter.WriteRow(lines[row], row); + } + + pngWriter.End(); } - private float GetSlope(int x, int y, ushort[ ] heightMap) + private float GetSlope(int x, int y, ushort[] heightMap) { - int baseY = heightMap[MapUtil.Index2d(x, y, chunkSize)]; - float runningY = 0; - // check bounds. i hate this. - int locIndex; - if (x > 0) { - locIndex = MapUtil.Index2d(x - 1, y, chunkSize); - runningY += (baseY - heightMap[locIndex]); - } - if (x < chunkSize - 1) { - locIndex = MapUtil.Index2d(x + 1, y, chunkSize); - runningY += (baseY - heightMap[locIndex]); - } - if (y > 0) { - locIndex = MapUtil.Index2d(x, y - 1, chunkSize); - runningY += (baseY - heightMap[locIndex]); - } - if (y < chunkSize - 1) { - locIndex = MapUtil.Index2d(x, y + 1, chunkSize); - runningY += (baseY - heightMap[locIndex]); - } - runningY /= 4; // average now - runningY /= 5; // idk - return 1 + runningY; + int baseY = heightMap[MapUtil.Index2d(x, y, chunkSize)]; + float runningY = 0; + // check bounds. i hate this. + int locIndex; + if (x > 0) + { + locIndex = MapUtil.Index2d(x - 1, y, chunkSize); + runningY += (baseY - heightMap[locIndex]); + } + if (x < chunkSize - 1) + { + locIndex = MapUtil.Index2d(x + 1, y, chunkSize); + runningY += (baseY - heightMap[locIndex]); + } + if (y > 0) + { + locIndex = MapUtil.Index2d(x, y - 1, chunkSize); + runningY += (baseY - heightMap[locIndex]); + } + if (y < chunkSize - 1) + { + locIndex = MapUtil.Index2d(x, y + 1, chunkSize); + runningY += (baseY - heightMap[locIndex]); + } + runningY /= 4; // average now + runningY /= 5; // idk + return 1 + runningY; } } } diff --git a/Automap/Renderers/IChunkRenderer.cs b/Automap/Renderers/IChunkRenderer.cs index f233499..f2b703a 100644 --- a/Automap/Renderers/IChunkRenderer.cs +++ b/Automap/Renderers/IChunkRenderer.cs @@ -17,8 +17,8 @@ namespace Automap protected IChunkRenderer(ICoreClientAPI clientAPI, ILogger logger) { - this.ClientAPI = clientAPI; - this.Logger = logger; + this.ClientAPI = clientAPI; + this.Logger = logger; } public abstract void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mapChunk, ColumnMeta metaData, PngWriter pngWriter, out uint pixelCount); diff --git a/Automap/Renderers/StandardRenerer.cs b/Automap/Renderers/StandardRenerer.cs index 947b25a..3ee4c7f 100644 --- a/Automap/Renderers/StandardRenerer.cs +++ b/Automap/Renderers/StandardRenerer.cs @@ -19,133 +19,142 @@ namespace Automap /// /// Client API. /// Logger. - public StandardRenderer(ICoreClientAPI clientAPI, ILogger logger) : base (clientAPI, logger) + public StandardRenderer(ICoreClientAPI clientAPI, ILogger logger) : base(clientAPI, logger) { - chunkSize = ClientAPI.World.BlockAccessor.ChunkSize; + chunkSize = ClientAPI.World.BlockAccessor.ChunkSize; } public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta metaData, PngWriter pngWriter, out uint pixelCount) { - pixelCount = 0; - BlockPos tmpPos = new BlockPos( ); - Vec2i localpos = new Vec2i( ); - - var chunksColumn = new IWorldChunk[ClientAPI.World.BlockAccessor.MapSizeY / chunkSize]; + pixelCount = 0; + BlockPos tmpPos = new BlockPos(); + Vec2i localpos = new Vec2i(); - int topChunkY = mc.YMax / chunkSize;//Heywaitaminute -- this isn't a highest FEATURE, if Rainmap isn't accurate! + var chunksColumn = new IWorldChunk[ClientAPI.World.BlockAccessor.MapSizeY / chunkSize]; - for (int chunkY = 0; chunkY <= topChunkY; chunkY++) { - chunksColumn[chunkY] = ClientAPI.World.BlockAccessor.GetChunk(chunkPos.X, chunkY, chunkPos.Y); - //What to do if chunk is a void? invalid? - } + int topChunkY = mc.YMax / chunkSize;//Heywaitaminute -- this isn't a highest FEATURE, if Rainmap isn't accurate! - // Prefetch map chunks, in pattern - IMapChunk[ ] mapChunks = new IMapChunk[ ] - { + for (int chunkY = 0; chunkY <= topChunkY; chunkY++) + { + chunksColumn[chunkY] = ClientAPI.World.BlockAccessor.GetChunk(chunkPos.X, chunkY, chunkPos.Y); + //What to do if chunk is a void? invalid? + } + + // Prefetch map chunks, in pattern + IMapChunk[] mapChunks = new IMapChunk[] + { ClientAPI.World.BlockAccessor.GetMapChunk(chunkPos.X - 1, chunkPos.Y - 1), ClientAPI.World.BlockAccessor.GetMapChunk(chunkPos.X - 1, chunkPos.Y), ClientAPI.World.BlockAccessor.GetMapChunk(chunkPos.X, chunkPos.Y - 1) - }; - - //pre-create PNG line slices... - ImageLine[ ] lines = Enumerable.Repeat(new object( ), chunkSize).Select(l => new ImageLine(pngWriter.ImgInfo)).ToArray( ); - - for (int posIndex = 0; posIndex < (chunkSize * chunkSize); posIndex++) { - int mapY = mc.RainHeightMap[posIndex]; - int localChunkY = mapY / chunkSize; - if (localChunkY >= (chunksColumn.Length)) continue;//Out of range! - - MapUtil.PosInt2d(posIndex, chunkSize, localpos); - int localX = localpos.X; - int localZ = localpos.Y; - - float b = 1; - int leftTop, rightTop, leftBot; - - IMapChunk leftTopMapChunk = mc; - IMapChunk rightTopMapChunk = mc; - IMapChunk leftBotMapChunk = mc; - - int topX = localX - 1; - int botX = localX; - int leftZ = localZ - 1; - int rightZ = localZ; - - if (topX < 0 && leftZ < 0) { - leftTopMapChunk = mapChunks[0]; - rightTopMapChunk = mapChunks[1]; - leftBotMapChunk = mapChunks[2]; - } - else { - if (topX < 0) { - leftTopMapChunk = mapChunks[1]; - rightTopMapChunk = mapChunks[1]; - } - if (leftZ < 0) { - leftTopMapChunk = mapChunks[2]; - leftBotMapChunk = mapChunks[2]; - } - } - - topX = GameMath.Mod(topX, chunkSize); - leftZ = GameMath.Mod(leftZ, chunkSize); - - leftTop = leftTopMapChunk == null ? 0 : Math.Sign(mapY - leftTopMapChunk.RainHeightMap[leftZ * chunkSize + topX]); - rightTop = rightTopMapChunk == null ? 0 : Math.Sign(mapY - rightTopMapChunk.RainHeightMap[rightZ * chunkSize + topX]); - leftBot = leftBotMapChunk == null ? 0 : Math.Sign(mapY - leftBotMapChunk.RainHeightMap[leftZ * chunkSize + botX]); + }; - float slopeness = (leftTop + rightTop + leftBot); + //pre-create PNG line slices... + ImageLine[] lines = Enumerable.Repeat(new object(), chunkSize).Select(l => new ImageLine(pngWriter.ImgInfo)).ToArray(); - if (slopeness > 0) b = 1.2f; - if (slopeness < 0) b = 0.8f; - - b -= 0.15f; //Slope boost value - - if (chunksColumn[localChunkY] == null) { - - continue; - } - - chunksColumn[localChunkY].Unpack( ); - int blockId = chunksColumn[localChunkY].Blocks[MapUtil.Index3d(localpos.X, mapY % chunkSize, localpos.Y, chunkSize, chunkSize)]; - - Block block = ClientAPI.World.Blocks[blockId]; - - tmpPos.Set(chunkSize * chunkPos.X + localpos.X, mapY, chunkSize * chunkPos.Y + localpos.Y); - - int avgCol = block.GetColor(ClientAPI, tmpPos); - int rndCol = block.GetRandomColor(ClientAPI, tmpPos, BlockFacing.UP); - int col = ColorUtil.ColorOverlay(avgCol, rndCol, 0.125f); - var packedFormat = ColorUtil.ColorMultiply3Clamped(col, b); - - int red = ColorUtil.ColorB(packedFormat); - int green = ColorUtil.ColorG(packedFormat); - int blue = ColorUtil.ColorR(packedFormat); - - - //============ POI Population ================= - if (BlockID_Designators.ContainsKey(blockId)) { - var desig = BlockID_Designators[blockId]; - - if (desig.Enabled) + for (int posIndex = 0; posIndex < (chunkSize * chunkSize); posIndex++) { - red = desig.OverwriteColor.R; - green = desig.OverwriteColor.G; - blue = desig.OverwriteColor.B; + int mapY = mc.RainHeightMap[posIndex]; + int localChunkY = mapY / chunkSize; + if (localChunkY >= (chunksColumn.Length)) continue;//Out of range! + + MapUtil.PosInt2d(posIndex, chunkSize, localpos); + int localX = localpos.X; + int localZ = localpos.Y; + + float b = 1; + int leftTop, rightTop, leftBot; + + IMapChunk leftTopMapChunk = mc; + IMapChunk rightTopMapChunk = mc; + IMapChunk leftBotMapChunk = mc; + + int topX = localX - 1; + int botX = localX; + int leftZ = localZ - 1; + int rightZ = localZ; + + if (topX < 0 && leftZ < 0) + { + leftTopMapChunk = mapChunks[0]; + rightTopMapChunk = mapChunks[1]; + leftBotMapChunk = mapChunks[2]; + } + else + { + if (topX < 0) + { + leftTopMapChunk = mapChunks[1]; + rightTopMapChunk = mapChunks[1]; + } + if (leftZ < 0) + { + leftTopMapChunk = mapChunks[2]; + leftBotMapChunk = mapChunks[2]; + } + } + + topX = GameMath.Mod(topX, chunkSize); + leftZ = GameMath.Mod(leftZ, chunkSize); + + leftTop = leftTopMapChunk == null ? 0 : Math.Sign(mapY - leftTopMapChunk.RainHeightMap[leftZ * chunkSize + topX]); + rightTop = rightTopMapChunk == null ? 0 : Math.Sign(mapY - rightTopMapChunk.RainHeightMap[rightZ * chunkSize + topX]); + leftBot = leftBotMapChunk == null ? 0 : Math.Sign(mapY - leftBotMapChunk.RainHeightMap[leftZ * chunkSize + botX]); + + float slopeness = (leftTop + rightTop + leftBot); + + if (slopeness > 0) b = 1.2f; + if (slopeness < 0) b = 0.8f; + + b -= 0.15f; //Slope boost value + + if (chunksColumn[localChunkY] == null) + { + + continue; + } + + chunksColumn[localChunkY].Unpack(); + int blockId = chunksColumn[localChunkY].Blocks[MapUtil.Index3d(localpos.X, mapY % chunkSize, localpos.Y, chunkSize, chunkSize)]; + + Block block = ClientAPI.World.Blocks[blockId]; + + tmpPos.Set(chunkSize * chunkPos.X + localpos.X, mapY, chunkSize * chunkPos.Y + localpos.Y); + + int avgCol = block.GetColor(ClientAPI, tmpPos); + int rndCol = block.GetRandomColor(ClientAPI, tmpPos, BlockFacing.UP); + int col = ColorUtil.ColorOverlay(avgCol, rndCol, 0.125f); + var packedFormat = ColorUtil.ColorMultiply3Clamped(col, b); + + int red = ColorUtil.ColorB(packedFormat); + int green = ColorUtil.ColorG(packedFormat); + int blue = ColorUtil.ColorR(packedFormat); + + + //============ POI Population ================= + if (BlockID_Designators.ContainsKey(blockId)) + { + var desig = BlockID_Designators[blockId]; + + if (desig.Enabled) + { + red = desig.OverwriteColor.R; + green = desig.OverwriteColor.G; + blue = desig.OverwriteColor.B; + } + } + + ImageLineHelper.SetPixel(lines[localZ], localX, red, green, blue); + + //chunkImage.SetPixel(localX, localZ, pixelColor); + pixelCount++; } - } - ImageLineHelper.SetPixel(lines[localZ], localX, red, green, blue); - - //chunkImage.SetPixel(localX, localZ, pixelColor); - pixelCount++; - } - - for (int row = 0; row < pngWriter.ImgInfo.Rows; row++) { - pngWriter.WriteRow(lines[row], row); - } + for (int row = 0; row < pngWriter.ImgInfo.Rows; row++) + { + pngWriter.WriteRow(lines[row], row); + } - pngWriter.End( ); + pngWriter.End(); } } } diff --git a/Automap/Subsystems/AutomapGUIDialog.cs b/Automap/Subsystems/AutomapGUIDialog.cs index 615aa30..3fbdac1 100644 --- a/Automap/Subsystems/AutomapGUIDialog.cs +++ b/Automap/Subsystems/AutomapGUIDialog.cs @@ -17,9 +17,9 @@ namespace Automap private long dashTickHandle; - public override string ToggleKeyCombinationCode { - get - { + public override string ToggleKeyCombinationCode + { + get { return _automapControlPanelKey; } } @@ -28,53 +28,53 @@ namespace Automap private RunState lastState; - public AutomapGUIDialog(ICoreClientAPI capi,AutomapSystem ams) : base(capi) - { + public AutomapGUIDialog(ICoreClientAPI capi, AutomapSystem ams) : base(capi) + { + + Logger = capi.Logger; + SetupDialog(); + capi.Event.RegisterEventBusListener(AutomapStatusMsg, 1.0D, AutomapSystem.AutomapStatusEventKey); - Logger = capi.Logger; - SetupDialog( ); - capi.Event.RegisterEventBusListener(AutomapStatusMsg, 1.0D, AutomapSystem.AutomapStatusEventKey); - } //Event for GUI status display - private void SetupDialog( ) + private void SetupDialog() { - ElementBounds dialogBounds = ElementStdBounds.AutosizedMainDialog.WithAlignment(EnumDialogArea.CenterMiddle); - - ElementBounds textBounds = ElementBounds.Fixed(0, 40, 500, 300); - - ElementBounds bgBounds = ElementBounds.Fill.WithFixedPadding(GuiStyle.ElementToDialogPadding); - bgBounds.BothSizing = ElementSizing.FitToChildren; - bgBounds.WithChildren(textBounds); - - ElementBounds toggleBounds = textBounds.CopyOffsetedSibling(0, 72, 5, 2); - toggleBounds.fixedHeight = 24; - toggleBounds.fixedWidth = 64; - - ElementBounds txtStatusBounds = textBounds.CopyOffsetedSibling(0, 26, 2, 4); - txtStatusBounds.fixedHeight = 16; - txtStatusBounds.percentWidth = 1; - - ElementBounds btnNoteArea = textBounds.CopyOffsetedSibling(0, 42, 2, 5); - btnNoteArea.fixedHeight = 24; - btnNoteArea.fixedWidth = 20; - - ElementBounds txtNoteArea = btnNoteArea.CopyOffsetedSibling(64, 0, 1, 6); - txtNoteArea.fixedHeight = 24; - txtNoteArea.fixedWidth = 256; - - - this.SingleComposer = capi.Gui.CreateCompo("automapControlPanel", dialogBounds) - .AddShadedDialogBG(bgBounds) - .AddDialogTitleBar("Automap Controls", OnTitleBarCloseClicked) - .AddStaticText("Configure Automap settings:", CairoFont.WhiteDetailText( ), textBounds) - .AddToggleButton("Run", CairoFont.ButtonText( ), RunToggle, toggleBounds, "btnRun") - .AddDynamicText("Idle.", CairoFont.WhiteSmallText( ).WithFontSize(12), EnumTextOrientation.Left, txtStatusBounds, _statusTextKey) - .AddTextInput(txtNoteArea,null,CairoFont.WhiteMediumText().WithFontSize(16),_noteTextKey) - .AddButton("Note:",CreateNote,btnNoteArea,CairoFont.ButtonText()) - .Compose( ); + ElementBounds dialogBounds = ElementStdBounds.AutosizedMainDialog.WithAlignment(EnumDialogArea.CenterMiddle); + + ElementBounds textBounds = ElementBounds.Fixed(0, 40, 500, 300); + + ElementBounds bgBounds = ElementBounds.Fill.WithFixedPadding(GuiStyle.ElementToDialogPadding); + bgBounds.BothSizing = ElementSizing.FitToChildren; + bgBounds.WithChildren(textBounds); + + ElementBounds toggleBounds = textBounds.CopyOffsetedSibling(0, 72, 5, 2); + toggleBounds.fixedHeight = 24; + toggleBounds.fixedWidth = 64; + + ElementBounds txtStatusBounds = textBounds.CopyOffsetedSibling(0, 26, 2, 4); + txtStatusBounds.fixedHeight = 16; + txtStatusBounds.percentWidth = 1; + + ElementBounds btnNoteArea = textBounds.CopyOffsetedSibling(0, 42, 2, 5); + btnNoteArea.fixedHeight = 24; + btnNoteArea.fixedWidth = 20; + + ElementBounds txtNoteArea = btnNoteArea.CopyOffsetedSibling(64, 0, 1, 6); + txtNoteArea.fixedHeight = 24; + txtNoteArea.fixedWidth = 256; + + + this.SingleComposer = capi.Gui.CreateCompo("automapControlPanel", dialogBounds) + .AddShadedDialogBG(bgBounds) + .AddDialogTitleBar("Automap Controls", OnTitleBarCloseClicked) + .AddStaticText("Configure Automap settings:", CairoFont.WhiteDetailText(), textBounds) + .AddToggleButton("Run", CairoFont.ButtonText(), RunToggle, toggleBounds, "btnRun") + .AddDynamicText("Idle.", CairoFont.WhiteSmallText().WithFontSize(12), EnumTextOrientation.Left, txtStatusBounds, _statusTextKey) + .AddTextInput(txtNoteArea, null, CairoFont.WhiteMediumText().WithFontSize(16), _noteTextKey) + .AddButton("Note:", CreateNote, btnNoteArea, CairoFont.ButtonText()) + .Compose(); //Controls for ALL Block & Entity Designators (Enable/Disable) //_automapSystem.BlockID_Designators @@ -86,9 +86,9 @@ namespace Automap } - private void OnTitleBarCloseClicked( ) + private void OnTitleBarCloseClicked() { - TryClose( ); + TryClose(); } /// @@ -98,51 +98,54 @@ namespace Automap /// Run. internal void RunToggle(bool toggle) { - Logger.VerboseDebug("Dialog Changed; [ Automap Enabled: {0} ]", toggle); - var statusText = this.SingleComposer.GetDynamicText(_statusTextKey); - statusText.SetNewText($"State: {(toggle? "Run": "Halt" )}, Total: {totalShards}, Nulls: {voidShards} " ); + Logger.VerboseDebug("Dialog Changed; [ Automap Enabled: {0} ]", toggle); + var statusText = this.SingleComposer.GetDynamicText(_statusTextKey); + statusText.SetNewText($"State: {(toggle ? "Run" : "Halt")}, Total: {totalShards}, Nulls: {voidShards} "); - CommandData cmd; + CommandData cmd; - if (toggle) { - dashTickHandle = capi.Event.RegisterGameTickListener(UpdateDashDisplay, 6001); - cmd = new CommandData(toggle ? RunState.Run : RunState.Stop, new bool[ ] { true, true, true, true, true }); - } - else { - capi.Event.UnregisterGameTickListener(dashTickHandle); - cmd = new CommandData(toggle ? RunState.Run : RunState.Stop); - } - - capi.Event.PushEvent(AutomapSystem.AutomapCommandEventKey, cmd); + if (toggle) + { + dashTickHandle = capi.Event.RegisterGameTickListener(UpdateDashDisplay, 6001); + cmd = new CommandData(toggle ? RunState.Run : RunState.Stop, new bool[] { true, true, true, true, true }); + } + else + { + capi.Event.UnregisterGameTickListener(dashTickHandle); + cmd = new CommandData(toggle ? RunState.Run : RunState.Stop); + } + + capi.Event.PushEvent(AutomapSystem.AutomapCommandEventKey, cmd); } - private bool CreateNote( ) + private bool CreateNote() { - var noteCmd = new CommandData(RunState.Notation); - var txtNote = this.SingleComposer.GetTextInput(_noteTextKey); - if (!String.IsNullOrWhiteSpace(txtNote.GetText( ))) { - noteCmd.Notation = txtNote.GetText( ); - txtNote.SetValue(string.Empty); + var noteCmd = new CommandData(RunState.Notation); + var txtNote = this.SingleComposer.GetTextInput(_noteTextKey); + if (!String.IsNullOrWhiteSpace(txtNote.GetText())) + { + noteCmd.Notation = txtNote.GetText(); + txtNote.SetValue(string.Empty); - capi.Event.PushEvent(AutomapSystem.AutomapCommandEventKey, noteCmd); - } - return false;//??? + capi.Event.PushEvent(AutomapSystem.AutomapCommandEventKey, noteCmd); + } + return false;//??? } private void AutomapStatusMsg(string eventName, ref EnumHandling handling, IAttribute data) { - Logger.VerboseDebug("MsgBus RX: AutomapStatusMsg"); - StatusData realData = data as StatusData; - totalShards = realData.TotalUpdates; - voidShards = realData.VoidChunks; - changesThisTick = realData.Delta; - lastState = realData.CurrentState; + Logger.VerboseDebug("MsgBus RX: AutomapStatusMsg"); + StatusData realData = data as StatusData; + totalShards = realData.TotalUpdates; + voidShards = realData.VoidChunks; + changesThisTick = realData.Delta; + lastState = realData.CurrentState; } - private void UpdateDashDisplay(float delay ) + private void UpdateDashDisplay(float delay) { - var statusText = this.SingleComposer.GetDynamicText(_statusTextKey); - statusText.SetNewText($"State: {lastState}, Total: {totalShards}, Delta: {changesThisTick} Nulls: {voidShards} "); + var statusText = this.SingleComposer.GetDynamicText(_statusTextKey); + statusText.SetNewText($"State: {lastState}, Total: {totalShards}, Delta: {changesThisTick} Nulls: {voidShards} "); } diff --git a/Automap/Subsystems/AutomapSystem.cs b/Automap/Subsystems/AutomapSystem.cs index 419bab9..45e9146 100644 --- a/Automap/Subsystems/AutomapSystem.cs +++ b/Automap/Subsystems/AutomapSystem.cs @@ -22,7 +22,7 @@ using Vintagestory.API.MathTools; using Vintagestory.Common; namespace Automap -{ +{ public class AutomapSystem { private Thread cartographer_thread; @@ -36,12 +36,12 @@ namespace Automap private const string chunkFile_filter = @"*_*.png"; private static Regex chunkShardRegex = new Regex(@"(?[\d]+)_(?[\d]+).png", RegexOptions.Singleline); - private ConcurrentDictionary columnCounter = new ConcurrentDictionary(3, 150 ); + private ConcurrentDictionary columnCounter = new ConcurrentDictionary(3, 150); private ColumnsMetadata chunkTopMetadata; private PointsOfInterest POIs = new PointsOfInterest(); private EntitiesOfInterest EOIs = new EntitiesOfInterest(); - internal Dictionary BlockID_Designators { get; private set;} + internal Dictionary BlockID_Designators { get; private set; } internal Dictionary Entity_Designators { get; private set; } internal Dictionary RockIdCodes { get; private set; } @@ -60,49 +60,49 @@ namespace Automap public AutomapSystem(ICoreClientAPI clientAPI, ILogger logger) { - this.ClientAPI = clientAPI; - this.Logger = logger; - chunkSize = ClientAPI.World.BlockAccessor.ChunkSize; - ClientAPI.Event.LevelFinalize += EngageAutomap; + this.ClientAPI = clientAPI; + this.Logger = logger; + chunkSize = ClientAPI.World.BlockAccessor.ChunkSize; + ClientAPI.Event.LevelFinalize += EngageAutomap; - //TODO:Choose which one from GUI - this.ChunkRenderer = new StandardRenderer(clientAPI, logger); + //TODO:Choose which one from GUI + this.ChunkRenderer = new StandardRenderer(clientAPI, logger); - //Listen on bus for commands - ClientAPI.Event.RegisterEventBusListener(CommandListener, 1.0, AutomapSystem.AutomapCommandEventKey); + //Listen on bus for commands + ClientAPI.Event.RegisterEventBusListener(CommandListener, 1.0, AutomapSystem.AutomapCommandEventKey); } #region Internals - private void EngageAutomap( ) + private void EngageAutomap() { - path = ClientAPI.GetOrCreateDataPath(_mapPath); - path = ClientAPI.GetOrCreateDataPath(Path.Combine(path, "World_" + ClientAPI.World.Seed));//Add name of World too...'ServerApi.WorldManager.CurrentWorldName' + path = ClientAPI.GetOrCreateDataPath(_mapPath); + path = ClientAPI.GetOrCreateDataPath(Path.Combine(path, "World_" + ClientAPI.World.Seed));//Add name of World too...'ServerApi.WorldManager.CurrentWorldName' - stylesFile = ClientAPI.World.AssetManager.Get(new AssetLocation(_domain, "config/automap_format.css")); - Logger.VerboseDebug("CSS loaded: {0} size: {1}",stylesFile.IsLoaded() ,stylesFile.ToText( ).Length); + stylesFile = ClientAPI.World.AssetManager.Get(new AssetLocation(_domain, "config/automap_format.css")); + Logger.VerboseDebug("CSS loaded: {0} size: {1}", stylesFile.IsLoaded(), stylesFile.ToText().Length); - Prefill_POI_Designators( ); - startChunkColumn = new Vec2i((ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.X / chunkSize), (ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.Z / chunkSize)); - chunkTopMetadata = new ColumnsMetadata(startChunkColumn); + Prefill_POI_Designators(); + startChunkColumn = new Vec2i((ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.X / chunkSize), (ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.Z / chunkSize)); + chunkTopMetadata = new ColumnsMetadata(startChunkColumn); - Logger.Notification("AUTOMAP Start {0}", startChunkColumn); - Reload_Metadata( ); + Logger.Notification("AUTOMAP Start {0}", startChunkColumn); + Reload_Metadata(); - ClientAPI.Event.ChunkDirty += ChunkAChanging; + ClientAPI.Event.ChunkDirty += ChunkAChanging; - cartographer_thread = new Thread(Cartographer); - cartographer_thread.Name = "Cartographer"; - cartographer_thread.Priority = ThreadPriority.Lowest; - cartographer_thread.IsBackground = true; + cartographer_thread = new Thread(Cartographer); + cartographer_thread.Name = "Cartographer"; + cartographer_thread.Priority = ThreadPriority.Lowest; + cartographer_thread.IsBackground = true; - ClientAPI.Event.RegisterGameTickListener(AwakenCartographer, 6000); + ClientAPI.Event.RegisterGameTickListener(AwakenCartographer, 6000); } private void ChunkAChanging(Vec3i chunkCoord, IWorldChunk chunk, EnumChunkDirtyReason reason) - { - Vec2i topPosition = new Vec2i(chunkCoord.X, chunkCoord.Z); + { + Vec2i topPosition = new Vec2i(chunkCoord.X, chunkCoord.Z); columnCounter.AddOrUpdate(topPosition, 1, (key, colAct) => colAct + 1); } @@ -110,490 +110,529 @@ namespace Automap private void AwakenCartographer(float delayed) { - if (CurrentState == RunState.Run && (ClientAPI.IsGamePaused != false || ClientAPI.IsShuttingDown != true)) { - #if DEBUG - Logger.VerboseDebug("Cartographer re-trigger from [{0}]", cartographer_thread.ThreadState); - #endif + if (CurrentState == RunState.Run && (ClientAPI.IsGamePaused != false || ClientAPI.IsShuttingDown != true)) + { +#if DEBUG + Logger.VerboseDebug("Cartographer re-trigger from [{0}]", cartographer_thread.ThreadState); +#endif - if (cartographer_thread.ThreadState.HasFlag(ThreadState.Unstarted)) { - cartographer_thread.Start( ); - } - else if (cartographer_thread.ThreadState.HasFlag(ThreadState.WaitSleepJoin)) { - //Time to (re)write chunk shards - cartographer_thread.Interrupt( ); - } - //#if DEBUG - //ClientAPI.TriggerChatMessage($"Automap {updatedChunksTotal} Updates - MAX (N:{chunkTopMetadata.North_mostChunk},S:{chunkTopMetadata.South_mostChunk},E:{chunkTopMetadata.East_mostChunk}, W:{chunkTopMetadata.West_mostChunk} - TOTAL: {chunkTopMetadata.Count})"); - //#endif - } - else if (CurrentState == RunState.Snapshot) { - //TODO: Snapshot generator second thread... - } + if (cartographer_thread.ThreadState.HasFlag(ThreadState.Unstarted)) + { + cartographer_thread.Start(); + } + else if (cartographer_thread.ThreadState.HasFlag(ThreadState.WaitSleepJoin)) + { + //Time to (re)write chunk shards + cartographer_thread.Interrupt(); + } + //#if DEBUG + //ClientAPI.TriggerChatMessage($"Automap {updatedChunksTotal} Updates - MAX (N:{chunkTopMetadata.North_mostChunk},S:{chunkTopMetadata.South_mostChunk},E:{chunkTopMetadata.East_mostChunk}, W:{chunkTopMetadata.West_mostChunk} - TOTAL: {chunkTopMetadata.Count})"); + //#endif + } + else if (CurrentState == RunState.Snapshot) + { + //TODO: Snapshot generator second thread... + } } - private void Cartographer( ) + private void Cartographer() { - wake: - Logger.VerboseDebug("Cartographer thread awoken"); - - try { - uint ejectedItem = 0; - uint updatedChunks = 0; + wake: + Logger.VerboseDebug("Cartographer thread awoken"); - //-- Should dodge enumerator changing underfoot....at a cost. - if (!columnCounter.IsEmpty) { - var tempSet = columnCounter.ToArray( ).OrderByDescending(kvp => kvp.Value); - foreach (var mostActiveCol in tempSet) { - - var mapChunk = ClientAPI.World.BlockAccessor.GetMapChunk(mostActiveCol.Key); - - if (mapChunk == null) { - Logger.Warning("SKIP CHUNK: ({0}) - Map Chunk NULL!", mostActiveCol.Key); - nullChunkCount++; - columnCounter.TryRemove(mostActiveCol.Key, out ejectedItem ); - continue; - } - - ColumnMeta chunkMeta = CreateColumnMetadata(mostActiveCol,mapChunk); - PngWriter pngWriter = SetupPngImage(mostActiveCol.Key, chunkMeta); - UpdateEntityMetadata( ); - ProcessChunkBlocks(mostActiveCol.Key, mapChunk, chunkMeta); - - uint updatedPixels = 0; - - ChunkRenderer.GenerateChunkPngShard(mostActiveCol.Key, mapChunk, chunkMeta, pngWriter , out updatedPixels); - - if (updatedPixels > 0) { - - #if DEBUG - Logger.VerboseDebug("Wrote chunk shard: ({0}) - Edits#:{1}, Pixels#:{2}", mostActiveCol.Key, mostActiveCol.Value, updatedPixels); - #endif - updatedChunks++; - chunkTopMetadata.Update(chunkMeta); - columnCounter.TryRemove(mostActiveCol.Key, out ejectedItem); - } - else { - columnCounter.TryRemove(mostActiveCol.Key, out ejectedItem); - Logger.VerboseDebug("Un-painted chunk: ({0}) ", mostActiveCol.Key); - } + try + { + uint ejectedItem = 0; + uint updatedChunks = 0; - } - } + //-- Should dodge enumerator changing underfoot....at a cost. + if (!columnCounter.IsEmpty) + { + var tempSet = columnCounter.ToArray().OrderByDescending(kvp => kvp.Value); + foreach (var mostActiveCol in tempSet) + { + + var mapChunk = ClientAPI.World.BlockAccessor.GetMapChunk(mostActiveCol.Key); + + if (mapChunk == null) + { + Logger.Warning("SKIP CHUNK: ({0}) - Map Chunk NULL!", mostActiveCol.Key); + nullChunkCount++; + columnCounter.TryRemove(mostActiveCol.Key, out ejectedItem); + continue; + } + + ColumnMeta chunkMeta = CreateColumnMetadata(mostActiveCol, mapChunk); + PngWriter pngWriter = SetupPngImage(mostActiveCol.Key, chunkMeta); + UpdateEntityMetadata(); + ProcessChunkBlocks(mostActiveCol.Key, mapChunk, chunkMeta); + + uint updatedPixels = 0; + + ChunkRenderer.GenerateChunkPngShard(mostActiveCol.Key, mapChunk, chunkMeta, pngWriter, out updatedPixels); + + if (updatedPixels > 0) + { + +#if DEBUG + Logger.VerboseDebug("Wrote chunk shard: ({0}) - Edits#:{1}, Pixels#:{2}", mostActiveCol.Key, mostActiveCol.Value, updatedPixels); +#endif + updatedChunks++; + chunkTopMetadata.Update(chunkMeta); + columnCounter.TryRemove(mostActiveCol.Key, out ejectedItem); + } + else + { + columnCounter.TryRemove(mostActiveCol.Key, out ejectedItem); + Logger.VerboseDebug("Un-painted chunk: ({0}) ", mostActiveCol.Key); + } + + } + } - UpdateStatus(this.updatedChunksTotal, this.nullChunkCount, updatedChunks); + UpdateStatus(this.updatedChunksTotal, this.nullChunkCount, updatedChunks); - if (updatedChunks > 0) { - //What about chunk updates themselves; a update bitmap isn't kept... - updatedChunksTotal += updatedChunks; - GenerateMapHTML( ); - GenerateJSONMetadata( ); - updatedChunks = 0; - } + if (updatedChunks > 0) + { + //What about chunk updates themselves; a update bitmap isn't kept... + updatedChunksTotal += updatedChunks; + GenerateMapHTML(); + GenerateJSONMetadata(); + updatedChunks = 0; + } - //Then sleep until interupted again, and repeat + //Then sleep until interupted again, and repeat - Logger.VerboseDebug("Thread '{0}' about to sleep indefinitely.", Thread.CurrentThread.Name); + Logger.VerboseDebug("Thread '{0}' about to sleep indefinitely.", Thread.CurrentThread.Name); - Thread.Sleep(Timeout.Infinite); + Thread.Sleep(Timeout.Infinite); - } catch (ThreadInterruptedException) { + } + catch (ThreadInterruptedException) + { - Logger.VerboseDebug("Thread '{0}' interupted [awoken]", Thread.CurrentThread.Name); - goto wake; + Logger.VerboseDebug("Thread '{0}' interupted [awoken]", Thread.CurrentThread.Name); + goto wake; - } catch (ThreadAbortException) { - Logger.VerboseDebug("Thread '{0}' aborted.", Thread.CurrentThread.Name); + } + catch (ThreadAbortException) + { + Logger.VerboseDebug("Thread '{0}' aborted.", Thread.CurrentThread.Name); - } finally { - Logger.VerboseDebug("Thread '{0}' executing finally block.", Thread.CurrentThread.Name); - } + } + finally + { + Logger.VerboseDebug("Thread '{0}' executing finally block.", Thread.CurrentThread.Name); + } } - private void UpdateStatus( uint totalUpdates, uint voidChunks, uint delta) + private void UpdateStatus(uint totalUpdates, uint voidChunks, uint delta) { - StatusData updateData = new StatusData(totalUpdates, voidChunks, delta, RunState.Run); + StatusData updateData = new StatusData(totalUpdates, voidChunks, delta, RunState.Run); - this.ClientAPI.Event.PushEvent(AutomapStatusEventKey, updateData); + this.ClientAPI.Event.PushEvent(AutomapStatusEventKey, updateData); } - private void Prefill_POI_Designators( ) + private void Prefill_POI_Designators() { - this.BlockID_Designators = new Dictionary( ); - this.Entity_Designators = new Dictionary( ); - this.RockIdCodes = Helpers.ArbitrarytBlockIdHunter(ClientAPI, new AssetLocation(GlobalConstants.DefaultDomain, "rock"), EnumBlockMaterial.Stone); + this.BlockID_Designators = new Dictionary(); + this.Entity_Designators = new Dictionary(); + this.RockIdCodes = Helpers.ArbitrarytBlockIdHunter(ClientAPI, new AssetLocation(GlobalConstants.DefaultDomain, "rock"), EnumBlockMaterial.Stone); - //Add special marker types for BlockID's of "Interest", overwrite colour, and method + //Add special marker types for BlockID's of "Interest", overwrite colour, and method - Install_POI_Designators(DefaultDesignators.DefaultBlockDesignators(), DefaultDesignators.DefaultEntityDesignators()); + Install_POI_Designators(DefaultDesignators.DefaultBlockDesignators(), DefaultDesignators.DefaultEntityDesignators()); } private void Install_POI_Designators(ICollection blockDesig, List entDesig) { - Logger.VerboseDebug("Connecting {0} standard Block-Designators", blockDesig.Count); - foreach (var designator in blockDesig) { - var blockIDs = Helpers.ArbitrarytBlockIdHunter(ClientAPI, designator.Pattern, designator.Material); - if (blockIDs.Count > 0) { Logger.VerboseDebug("Designator {0} has {1} associated blockIDs", designator.ToString( ), blockIDs.Count); } - foreach (var entry in blockIDs) { - BlockID_Designators.Add(entry.Key, designator); + Logger.VerboseDebug("Connecting {0} standard Block-Designators", blockDesig.Count); + foreach (var designator in blockDesig) + { + var blockIDs = Helpers.ArbitrarytBlockIdHunter(ClientAPI, designator.Pattern, designator.Material); + if (blockIDs.Count > 0) { Logger.VerboseDebug("Designator {0} has {1} associated blockIDs", designator.ToString(), blockIDs.Count); } + foreach (var entry in blockIDs) + { + BlockID_Designators.Add(entry.Key, designator); + } } - } - this.ChunkRenderer.BlockID_Designators = BlockID_Designators; - - - Logger.VerboseDebug("Connecting {0} standard Entity-Designators", entDesig.Count); - foreach (var designator in entDesig) { - //Get Variants first, from EntityTypes...better be populated! - var matched = ClientAPI.World.EntityTypes.FindAll(entp => entp.Code.BeginsWith(designator.Pattern.Domain, designator.Pattern.Path)); - - foreach (var match in matched) { - Logger.VerboseDebug("Linked Entity: {0} Designator: {1}", match.Code, designator); - this.Entity_Designators.Add(match.Code, designator); - } - - - - //EntityProperties props = ClientAPI.World.GetEntityType(designator.Pattern); - } - - - } - - - private void GenerateMapHTML( ) - { - string mapFilename = Path.Combine(path, "Automap.html"); - - int TopNorth = chunkTopMetadata.North_mostChunk; - int TopSouth = chunkTopMetadata.South_mostChunk; - int TopEast = chunkTopMetadata.East_mostChunk; - int TopWest = chunkTopMetadata.West_mostChunk; - - using (StreamWriter outputText = new StreamWriter(File.Open(mapFilename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))) { - using (HtmlTextWriter tableWriter = new HtmlTextWriter(outputText)) { - tableWriter.BeginRender( ); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Html); - - tableWriter.RenderBeginTag(HtmlTextWriterTag.Head); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Title); - tableWriter.WriteEncodedText("Generated Automap"); - tableWriter.RenderEndTag( ); - //CSS style here - tableWriter.RenderBeginTag(HtmlTextWriterTag.Style); - tableWriter.Write(stylesFile.ToText( )); - tableWriter.RenderEndTag( );// - - //## JSON map-state data ###################### - tableWriter.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript"); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Script); - - tableWriter.Write("var available_images = ["); - - foreach (var shard in this.chunkTopMetadata) { - tableWriter.Write("{{X:{0},Y:{1} }}, ", shard.Location.X, shard.Location.Y); - } - - tableWriter.Write(" ];\n"); - - tableWriter.RenderEndTag( ); - - tableWriter.RenderEndTag( ); - - tableWriter.RenderBeginTag(HtmlTextWriterTag.Body); - tableWriter.RenderBeginTag(HtmlTextWriterTag.P); - tableWriter.WriteEncodedText($"Created {DateTimeOffset.UtcNow.ToString("u")}"); - tableWriter.RenderEndTag( ); - tableWriter.RenderBeginTag(HtmlTextWriterTag.P); - tableWriter.WriteEncodedText($"W:{TopWest}, E: {TopEast}, N:{TopNorth}, S:{TopSouth} "); - tableWriter.RenderEndTag( ); - tableWriter.WriteLine( ); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Table); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Caption); - tableWriter.WriteEncodedText($"Start: {startChunkColumn}, Seed: {ClientAPI.World.Seed}\n"); - tableWriter.RenderEndTag( ); - - //################ X-Axis ####################### - tableWriter.RenderBeginTag(HtmlTextWriterTag.Thead); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Tr); - - tableWriter.RenderBeginTag(HtmlTextWriterTag.Th); - tableWriter.Write("N, W"); - tableWriter.RenderEndTag( ); - - for (int xAxisT = TopWest; xAxisT <= TopEast; xAxisT++) { - tableWriter.RenderBeginTag(HtmlTextWriterTag.Th); - tableWriter.Write(xAxisT); - tableWriter.RenderEndTag( ); - } - - tableWriter.RenderBeginTag(HtmlTextWriterTag.Th); - tableWriter.Write("N, E"); - tableWriter.RenderEndTag( ); - - tableWriter.RenderEndTag( ); - tableWriter.RenderEndTag( ); - //###### ################################ - - //###### - Chunk rows & Y-axis cols - tableWriter.RenderBeginTag(HtmlTextWriterTag.Tbody); - - //######## for every vertical row - for (int yAxis = TopNorth; yAxis <= TopSouth; yAxis++) { - tableWriter.RenderBeginTag(HtmlTextWriterTag.Tr); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); - tableWriter.Write(yAxis);//legend: Y-axis - tableWriter.RenderEndTag( ); - - for (int xAxis = TopWest; xAxis <= TopEast; xAxis++) { - //###### #### for chunk shard - tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); - var colLoc = new Vec2i(xAxis, yAxis); - if (chunkTopMetadata.Contains( colLoc)){ - ColumnMeta meta = chunkTopMetadata[colLoc]; - //Tooltip first - tableWriter.AddAttribute(HtmlTextWriterAttribute.Class, "tooltip"); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Div); - - tableWriter.AddAttribute(HtmlTextWriterAttribute.Src, $"{xAxis}_{yAxis}.png"); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Img); - tableWriter.RenderEndTag( ); - // Tooltip text - tableWriter.AddAttribute(HtmlTextWriterAttribute.Class, "tooltiptext"); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Span); - - StringBuilder tooltipText = new StringBuilder( ); - tooltipText.Append($"{meta.Location.PrettyCoords(ClientAPI)} "); - tooltipText.Append($" Max-Height: {meta.YMax}, Temp: {meta.Temperature.ToString("F1")} " ); - tooltipText.Append($" Rainfall: {meta.Rainfall.ToString("F1")}, "); - tooltipText.Append($" Shrubs: {meta.ShrubDensity.ToString("F1")}, "); - tooltipText.Append($" Forest: {meta.ForestDensity.ToString("F1")}, "); - tooltipText.Append($" Fertility: {meta.Fertility.ToString("F1")}, "); - - if (meta.RockRatio != null) { - foreach (KeyValuePair blockID in meta.RockRatio) { - var block = ClientAPI.World.GetBlock(blockID.Key); - tooltipText.AppendFormat(" {0} × {1},\t", block.Code.GetName( ), meta.RockRatio[blockID.Key]); - } - } + this.ChunkRenderer.BlockID_Designators = BlockID_Designators; - tableWriter.WriteEncodedText(tooltipText.ToString() ); - - tableWriter.RenderEndTag( );// - - tableWriter.RenderEndTag( );// --tooltip enclosure - } - else { - tableWriter.Write("?"); - } + Logger.VerboseDebug("Connecting {0} standard Entity-Designators", entDesig.Count); + foreach (var designator in entDesig) + { + //Get Variants first, from EntityTypes...better be populated! + var matched = ClientAPI.World.EntityTypes.FindAll(entp => entp.Code.BeginsWith(designator.Pattern.Domain, designator.Pattern.Path)); - tableWriter.RenderEndTag( ); - }//############ ########### + foreach (var match in matched) + { + Logger.VerboseDebug("Linked Entity: {0} Designator: {1}", match.Code, designator); + this.Entity_Designators.Add(match.Code, designator); + } - tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); - tableWriter.Write(yAxis);//legend: Y-axis - tableWriter.RenderEndTag( ); - tableWriter.RenderEndTag( ); - - } - tableWriter.RenderEndTag( ); - //################ X-Axis ####################### - tableWriter.RenderBeginTag(HtmlTextWriterTag.Tfoot); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Tr); + //EntityProperties props = ClientAPI.World.GetEntityType(designator.Pattern); + } - tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); - tableWriter.Write("S, W"); - tableWriter.RenderEndTag( ); - for (int xAxisB = TopWest; xAxisB <= TopEast; xAxisB++) { - tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); - tableWriter.Write(xAxisB); - tableWriter.RenderEndTag( ); } - tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); - tableWriter.Write("S, E"); - tableWriter.RenderEndTag( ); - - tableWriter.RenderEndTag( ); - tableWriter.RenderEndTag( ); - //###### ################################ - - - tableWriter.RenderEndTag( );// - //############## POI list ##################### - tableWriter.RenderBeginTag(HtmlTextWriterTag.P); - tableWriter.WriteLine("Points of Interest"); - tableWriter.RenderEndTag( ); - tableWriter.RenderBeginTag(HtmlTextWriterTag.Ul); - foreach (var poi in this.POIs) { - tableWriter.RenderBeginTag(HtmlTextWriterTag.Li); - tableWriter.WriteEncodedText(poi.Location.PrettyCoords(this.ClientAPI)+"\t"); - tableWriter.WriteEncodedText(poi.Notes+ "\t"); - tableWriter.WriteEncodedText(poi.Timestamp.ToString("u")); - tableWriter.RenderEndTag( ); - } - - foreach (var eoi in this.EOIs.PointsList) { - tableWriter.RenderBeginTag(HtmlTextWriterTag.Li); - tableWriter.WriteEncodedText(eoi.Location.PrettyCoords(this.ClientAPI)+ "\t"); - tableWriter.WriteEncodedText(eoi.Notes+ "\t"); - tableWriter.WriteEncodedText(eoi.Timestamp.ToString("u") ); - tableWriter.RenderEndTag( ); - } + private void GenerateMapHTML() + { + string mapFilename = Path.Combine(path, "Automap.html"); - tableWriter.RenderEndTag( ); + int TopNorth = chunkTopMetadata.North_mostChunk; + int TopSouth = chunkTopMetadata.South_mostChunk; + int TopEast = chunkTopMetadata.East_mostChunk; + int TopWest = chunkTopMetadata.West_mostChunk; + + using (StreamWriter outputText = new StreamWriter(File.Open(mapFilename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))) + { + using (HtmlTextWriter tableWriter = new HtmlTextWriter(outputText)) + { + tableWriter.BeginRender(); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Html); + + tableWriter.RenderBeginTag(HtmlTextWriterTag.Head); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Title); + tableWriter.WriteEncodedText("Generated Automap"); + tableWriter.RenderEndTag(); + //CSS style here + tableWriter.RenderBeginTag(HtmlTextWriterTag.Style); + tableWriter.Write(stylesFile.ToText()); + tableWriter.RenderEndTag();// + + //## JSON map-state data ###################### + tableWriter.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript"); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Script); + + tableWriter.Write("var available_images = ["); + + foreach (var shard in this.chunkTopMetadata) + { + tableWriter.Write("{{X:{0},Y:{1} }}, ", shard.Location.X, shard.Location.Y); + } + + tableWriter.Write(" ];\n"); + + tableWriter.RenderEndTag(); + + tableWriter.RenderEndTag(); + + tableWriter.RenderBeginTag(HtmlTextWriterTag.Body); + tableWriter.RenderBeginTag(HtmlTextWriterTag.P); + tableWriter.WriteEncodedText($"Created {DateTimeOffset.UtcNow.ToString("u")}"); + tableWriter.RenderEndTag(); + tableWriter.RenderBeginTag(HtmlTextWriterTag.P); + tableWriter.WriteEncodedText($"W:{TopWest}, E: {TopEast}, N:{TopNorth}, S:{TopSouth} "); + tableWriter.RenderEndTag(); + tableWriter.WriteLine(); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Table); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Caption); + tableWriter.WriteEncodedText($"Start: {startChunkColumn}, Seed: {ClientAPI.World.Seed}\n"); + tableWriter.RenderEndTag(); + + //################ X-Axis ####################### + tableWriter.RenderBeginTag(HtmlTextWriterTag.Thead); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Tr); + + tableWriter.RenderBeginTag(HtmlTextWriterTag.Th); + tableWriter.Write("N, W"); + tableWriter.RenderEndTag(); + + for (int xAxisT = TopWest; xAxisT <= TopEast; xAxisT++) + { + tableWriter.RenderBeginTag(HtmlTextWriterTag.Th); + tableWriter.Write(xAxisT); + tableWriter.RenderEndTag(); + } + + tableWriter.RenderBeginTag(HtmlTextWriterTag.Th); + tableWriter.Write("N, E"); + tableWriter.RenderEndTag(); + + tableWriter.RenderEndTag(); + tableWriter.RenderEndTag(); + //###### ################################ + + //###### - Chunk rows & Y-axis cols + tableWriter.RenderBeginTag(HtmlTextWriterTag.Tbody); + + //######## for every vertical row + for (int yAxis = TopNorth; yAxis <= TopSouth; yAxis++) + { + tableWriter.RenderBeginTag(HtmlTextWriterTag.Tr); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); + tableWriter.Write(yAxis);//legend: Y-axis + tableWriter.RenderEndTag(); + + for (int xAxis = TopWest; xAxis <= TopEast; xAxis++) + { + //###### #### for chunk shard + tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); + var colLoc = new Vec2i(xAxis, yAxis); + if (chunkTopMetadata.Contains(colLoc)) + { + ColumnMeta meta = chunkTopMetadata[colLoc]; + //Tooltip first + tableWriter.AddAttribute(HtmlTextWriterAttribute.Class, "tooltip"); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Div); + + tableWriter.AddAttribute(HtmlTextWriterAttribute.Src, $"{xAxis}_{yAxis}.png"); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Img); + tableWriter.RenderEndTag(); + // Tooltip text + tableWriter.AddAttribute(HtmlTextWriterAttribute.Class, "tooltiptext"); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Span); + + StringBuilder tooltipText = new StringBuilder(); + tooltipText.Append($"{meta.Location.PrettyCoords(ClientAPI)} "); + tooltipText.Append($" Max-Height: {meta.YMax}, Temp: {meta.Temperature.ToString("F1")} "); + tooltipText.Append($" Rainfall: {meta.Rainfall.ToString("F1")}, "); + tooltipText.Append($" Shrubs: {meta.ShrubDensity.ToString("F1")}, "); + tooltipText.Append($" Forest: {meta.ForestDensity.ToString("F1")}, "); + tooltipText.Append($" Fertility: {meta.Fertility.ToString("F1")}, "); + + if (meta.RockRatio != null) + { + foreach (KeyValuePair blockID in meta.RockRatio) + { + var block = ClientAPI.World.GetBlock(blockID.Key); + tooltipText.AppendFormat(" {0} × {1},\t", block.Code.GetName(), meta.RockRatio[blockID.Key]); + } + } + + tableWriter.WriteEncodedText(tooltipText.ToString()); + + tableWriter.RenderEndTag();// + + + tableWriter.RenderEndTag();// --tooltip enclosure + } + else + { + tableWriter.Write("?"); + } + + tableWriter.RenderEndTag(); + }//############ ########### + + tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); + tableWriter.Write(yAxis);//legend: Y-axis + tableWriter.RenderEndTag(); + + tableWriter.RenderEndTag(); + + } + tableWriter.RenderEndTag(); + + //################ X-Axis ####################### + tableWriter.RenderBeginTag(HtmlTextWriterTag.Tfoot); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Tr); + + tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); + tableWriter.Write("S, W"); + tableWriter.RenderEndTag(); + + for (int xAxisB = TopWest; xAxisB <= TopEast; xAxisB++) + { + tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); + tableWriter.Write(xAxisB); + tableWriter.RenderEndTag(); + } + + tableWriter.RenderBeginTag(HtmlTextWriterTag.Td); + tableWriter.Write("S, E"); + tableWriter.RenderEndTag(); + + tableWriter.RenderEndTag(); + tableWriter.RenderEndTag(); + //###### ################################ + + + tableWriter.RenderEndTag();// + + //############## POI list ##################### + tableWriter.RenderBeginTag(HtmlTextWriterTag.P); + tableWriter.WriteLine("Points of Interest"); + tableWriter.RenderEndTag(); + tableWriter.RenderBeginTag(HtmlTextWriterTag.Ul); + foreach (var poi in this.POIs) + { + tableWriter.RenderBeginTag(HtmlTextWriterTag.Li); + tableWriter.WriteEncodedText(poi.Location.PrettyCoords(this.ClientAPI) + "\t"); + tableWriter.WriteEncodedText(poi.Notes + "\t"); + tableWriter.WriteEncodedText(poi.Timestamp.ToString("u")); + tableWriter.RenderEndTag(); + } + + foreach (var eoi in this.EOIs.PointsList) + { + tableWriter.RenderBeginTag(HtmlTextWriterTag.Li); + tableWriter.WriteEncodedText(eoi.Location.PrettyCoords(this.ClientAPI) + "\t"); + tableWriter.WriteEncodedText(eoi.Notes + "\t"); + tableWriter.WriteEncodedText(eoi.Timestamp.ToString("u")); + tableWriter.RenderEndTag(); + } + + tableWriter.RenderEndTag(); - - tableWriter.RenderEndTag( );//### ### - - tableWriter.EndRender( ); - tableWriter.Flush( ); - } - outputText.Flush( ); - } - Logger.VerboseDebug("Generated HTML map"); + tableWriter.RenderEndTag();//### ### + + tableWriter.EndRender(); + tableWriter.Flush(); + } + outputText.Flush(); + } + + Logger.VerboseDebug("Generated HTML map"); } /// /// Generates the JSON Metadata. (in MAP object format ) /// - private void GenerateJSONMetadata( ) + private void GenerateJSONMetadata() { - string jsonFilename = Path.Combine(path, "Metadata.js"); + string jsonFilename = Path.Combine(path, "Metadata.js"); - StreamWriter jsonWriter = new StreamWriter(jsonFilename, false, Encoding.UTF8); - using (jsonWriter) + StreamWriter jsonWriter = new StreamWriter(jsonFilename, false, Encoding.UTF8); + using (jsonWriter) { - jsonWriter.WriteLine("var worldSeedNum = {0};", ClientAPI.World.Seed); - jsonWriter.WriteLine("var genTime = new Date('{0}');", DateTimeOffset.UtcNow.ToString("O")); - jsonWriter.WriteLine("var startCoords = {{X:{0},Y:{1}}};", startChunkColumn.X, startChunkColumn.Y); - jsonWriter.WriteLine("var chunkSize = {0};", chunkSize); - jsonWriter.WriteLine("var northMostChunk ={0};", chunkTopMetadata.North_mostChunk); - jsonWriter.WriteLine("var southMostChunk ={0};", chunkTopMetadata.South_mostChunk); - jsonWriter.WriteLine("var eastMostChunk ={0};", chunkTopMetadata.East_mostChunk); - jsonWriter.WriteLine("var westMostChunk ={0};", chunkTopMetadata.West_mostChunk); - //MAP object format - [key, value]: key is "x_y" - jsonWriter.Write("let shardsMetadata = new Map(["); - foreach (var shard in chunkTopMetadata) + jsonWriter.WriteLine("var worldSeedNum = {0};", ClientAPI.World.Seed); + jsonWriter.WriteLine("var genTime = new Date('{0}');", DateTimeOffset.UtcNow.ToString("O")); + jsonWriter.WriteLine("var startCoords = {{X:{0},Y:{1}}};", startChunkColumn.X, startChunkColumn.Y); + jsonWriter.WriteLine("var chunkSize = {0};", chunkSize); + jsonWriter.WriteLine("var northMostChunk ={0};", chunkTopMetadata.North_mostChunk); + jsonWriter.WriteLine("var southMostChunk ={0};", chunkTopMetadata.South_mostChunk); + jsonWriter.WriteLine("var eastMostChunk ={0};", chunkTopMetadata.East_mostChunk); + jsonWriter.WriteLine("var westMostChunk ={0};", chunkTopMetadata.West_mostChunk); + //MAP object format - [key, value]: key is "x_y" + jsonWriter.Write("let shardsMetadata = new Map(["); + foreach (var shard in chunkTopMetadata) { - jsonWriter.Write("['{0}_{1}',", shard.Location.X, shard.Location.Y); - jsonWriter.Write("{"); - jsonWriter.Write("ChunkAge: '{0}',", shard.ChunkAge);//World age - relative? or last edit ?? - jsonWriter.Write("Temperature: {0},", shard.Temperature.ToString("F1")); - jsonWriter.Write("YMax: {0},", shard.YMax); - jsonWriter.Write("Fertility: {0},", shard.Fertility.ToString("F1")); - jsonWriter.Write("ForestDensity: {0},", shard.ForestDensity.ToString("F1")); - jsonWriter.Write("Rainfall: {0},", shard.Rainfall.ToString("F1")); - jsonWriter.Write("ShrubDensity: {0},", shard.ShrubDensity.ToString("F1")); - jsonWriter.Write("AirBlocks: {0},", shard.AirBlocks); - jsonWriter.Write("NonAirBlocks: {0},", shard.NonAirBlocks); - //TODO: Heightmap - //TODO: Rock-ratio - jsonWriter.Write("}],"); + jsonWriter.Write("['{0}_{1}',", shard.Location.X, shard.Location.Y); + jsonWriter.Write("{"); + jsonWriter.Write("ChunkAge: '{0}',", shard.ChunkAge);//World age - relative? or last edit ?? + jsonWriter.Write("Temperature: {0},", shard.Temperature.ToString("F1")); + jsonWriter.Write("YMax: {0},", shard.YMax); + jsonWriter.Write("Fertility: {0},", shard.Fertility.ToString("F1")); + jsonWriter.Write("ForestDensity: {0},", shard.ForestDensity.ToString("F1")); + jsonWriter.Write("Rainfall: {0},", shard.Rainfall.ToString("F1")); + jsonWriter.Write("ShrubDensity: {0},", shard.ShrubDensity.ToString("F1")); + jsonWriter.Write("AirBlocks: {0},", shard.AirBlocks); + jsonWriter.Write("NonAirBlocks: {0},", shard.NonAirBlocks); + //TODO: Heightmap + //TODO: Rock-ratio + jsonWriter.Write("}],"); } - jsonWriter.Write("]);\n\n"); + jsonWriter.Write("]);\n\n"); + - - jsonWriter.Write("let pointsOfInterest = new Map(["); - foreach (var poi in POIs) + jsonWriter.Write("let pointsOfInterest = new Map(["); + foreach (var poi in POIs) { jsonWriter.Write("['{0}_{1}',", poi.Location.X, poi.Location.Y); jsonWriter.Write("{"); - jsonWriter.Write("notes: '{0}',", poi.Notes.Replace("'"," ")); + jsonWriter.Write("notes: '{0}',", poi.Notes.Replace("'", " ")); jsonWriter.Write("timestamp : new Date('{0}'),", poi.Timestamp.ToString("O")); - jsonWriter.Write("chunkPos:'{0}_{1}',", (poi.Location.X/chunkSize), (poi.Location.Y/chunkSize)); + jsonWriter.Write("chunkPos:'{0}_{1}',", (poi.Location.X / chunkSize), (poi.Location.Y / chunkSize)); jsonWriter.Write("}],"); } - foreach (var poi in EOIs.PointsList) + foreach (var poi in EOIs.PointsList) { - jsonWriter.Write("['{0}_{1}',", poi.Location.X, poi.Location.Y); - jsonWriter.Write("{"); - jsonWriter.Write("notes: '{0}',", poi.Notes.Replace("'", " ")); - jsonWriter.Write("timestamp : new Date('{0}'),", poi.Timestamp.ToString("O")); - jsonWriter.Write("chunkPos:'{0}_{1}',", (poi.Location.X / chunkSize), (poi.Location.Y / chunkSize)); - jsonWriter.Write("}],"); + jsonWriter.Write("['{0}_{1}',", poi.Location.X, poi.Location.Y); + jsonWriter.Write("{"); + jsonWriter.Write("notes: '{0}',", poi.Notes.Replace("'", " ")); + jsonWriter.Write("timestamp : new Date('{0}'),", poi.Timestamp.ToString("O")); + jsonWriter.Write("chunkPos:'{0}_{1}',", (poi.Location.X / chunkSize), (poi.Location.Y / chunkSize)); + jsonWriter.Write("}],"); } - jsonWriter.Write("]);\n\n"); + jsonWriter.Write("]);\n\n"); - jsonWriter.Flush( ); - } + jsonWriter.Flush(); + } } private ColumnMeta CreateColumnMetadata(KeyValuePair mostActiveCol, IMapChunk mapChunk) { - ColumnMeta data = new ColumnMeta(mostActiveCol.Key.Copy(), chunkSize); - BlockPos equivBP = new BlockPos(mostActiveCol.Key.X * chunkSize, - mapChunk.YMax, - mostActiveCol.Key.Y * chunkSize); + ColumnMeta data = new ColumnMeta(mostActiveCol.Key.Copy(), chunkSize); + BlockPos equivBP = new BlockPos(mostActiveCol.Key.X * chunkSize, + mapChunk.YMax, + mostActiveCol.Key.Y * chunkSize); - var climate = ClientAPI.World.BlockAccessor.GetClimateAt(equivBP); - data.UpdateFieldsFrom(climate, mapChunk,TimeSpan.FromHours(ClientAPI.World.Calendar.TotalHours)); + var climate = ClientAPI.World.BlockAccessor.GetClimateAt(equivBP); + data.UpdateFieldsFrom(climate, mapChunk, TimeSpan.FromHours(ClientAPI.World.Calendar.TotalHours)); - return data; + return data; } /// /// Reload chunk bounds from chunk shards /// /// The metadata. - private void Reload_Metadata( ) - { - var worldmapDir = new DirectoryInfo(path); + private void Reload_Metadata() + { + var worldmapDir = new DirectoryInfo(path); - if (worldmapDir.Exists) { + if (worldmapDir.Exists) + { - var files = worldmapDir.GetFiles(chunkFile_filter); + var files = worldmapDir.GetFiles(chunkFile_filter); - if (files.Length > 0) { - #if DEBUG - Logger.VerboseDebug("{0} Existing world chunk shards", files.Length); - #endif + if (files.Length > 0) + { +#if DEBUG + Logger.VerboseDebug("{0} Existing world chunk shards", files.Length); +#endif - - foreach (var shardFile in files) { - if (shardFile.Length < 512) continue; - var result = chunkShardRegex.Match(shardFile.Name); - if (result.Success) { - int X_chunk_pos = int.Parse(result.Groups["X"].Value ); - int Z_chunk_pos = int.Parse(result.Groups["Z"].Value ); - - //Parse PNG chunks for METADATA in shard - using (var fileStream = shardFile.OpenRead( )) - { - //TODO: Add corrupted PNG Exception handing HERE ! - PngReader pngRead = new PngReader(fileStream ); - pngRead.ReadSkippingAllRows( ); - pngRead.End( ); + foreach (var shardFile in files) + { - PngMetadataChunk metadataFromPng = pngRead.GetChunksList( ).GetById1(PngMetadataChunk.ID) as PngMetadataChunk; + if (shardFile.Length < 512) continue; + var result = chunkShardRegex.Match(shardFile.Name); + if (result.Success) + { + int X_chunk_pos = int.Parse(result.Groups["X"].Value); + int Z_chunk_pos = int.Parse(result.Groups["Z"].Value); - chunkTopMetadata.Add(metadataFromPng.ChunkMetadata); - } - - } - } + //Parse PNG chunks for METADATA in shard + using (var fileStream = shardFile.OpenRead()) + { + //TODO: Add corrupted PNG Exception handing HERE ! + PngReader pngRead = new PngReader(fileStream); + pngRead.ReadSkippingAllRows(); + pngRead.End(); - } - } - else { - #if DEBUG - Logger.VerboseDebug("Could not open world map directory"); - #endif - } + PngMetadataChunk metadataFromPng = pngRead.GetChunksList().GetById1(PngMetadataChunk.ID) as PngMetadataChunk; + + chunkTopMetadata.Add(metadataFromPng.ChunkMetadata); + } + + } + } + + } + } + else + { +#if DEBUG + Logger.VerboseDebug("Could not open world map directory"); +#endif + } @@ -601,22 +640,22 @@ namespace Automap private PngWriter SetupPngImage(Vec2i coord, ColumnMeta metadata) { - ImageInfo imageInf = new ImageInfo(chunkSize, chunkSize, 8, false); - - string filename = $"{coord.X}_{coord.Y}.png"; - filename = Path.Combine(path, filename); - - PngWriter pngWriter = FileHelper.CreatePngWriter(filename, imageInf, true); - PngMetadata meta = pngWriter.GetMetadata( ); - meta.SetTimeNow( ); - meta.SetText("Chunk_X", coord.X.ToString("D")); - meta.SetText("Chunk_Y", coord.Y.ToString("D")); - //Setup specialized meta-data PNG chunks here... - PngMetadataChunk pngChunkMeta = new PngMetadataChunk(pngWriter.ImgInfo); - pngChunkMeta.ChunkMetadata = metadata; - pngWriter.GetChunksList( ).Queue(pngChunkMeta); - - return pngWriter; + ImageInfo imageInf = new ImageInfo(chunkSize, chunkSize, 8, false); + + string filename = $"{coord.X}_{coord.Y}.png"; + filename = Path.Combine(path, filename); + + PngWriter pngWriter = FileHelper.CreatePngWriter(filename, imageInf, true); + PngMetadata meta = pngWriter.GetMetadata(); + meta.SetTimeNow(); + meta.SetText("Chunk_X", coord.X.ToString("D")); + meta.SetText("Chunk_Y", coord.Y.ToString("D")); + //Setup specialized meta-data PNG chunks here... + PngMetadataChunk pngChunkMeta = new PngMetadataChunk(pngWriter.ImgInfo); + pngChunkMeta.ChunkMetadata = metadata; + pngWriter.GetChunksList().Queue(pngChunkMeta); + + return pngWriter; } /// @@ -628,149 +667,164 @@ namespace Automap private void ProcessChunkBlocks(Vec2i key, IMapChunk mapChunk, ColumnMeta chunkMeta) { - int targetChunkY = mapChunk.YMax / chunkSize;//Surface ... - for (; targetChunkY > 0; targetChunkY--) { - WorldChunk chunkData = ClientAPI.World.BlockAccessor.GetChunk(key.X, targetChunkY, key.Y) as WorldChunk; + int targetChunkY = mapChunk.YMax / chunkSize;//Surface ... + for (; targetChunkY > 0; targetChunkY--) + { + WorldChunk chunkData = ClientAPI.World.BlockAccessor.GetChunk(key.X, targetChunkY, key.Y) as WorldChunk; - if (chunkData == null || chunkData.BlockEntities == null) { - #if DEBUG - Logger.VerboseDebug("Chunk null or empty X{0} Y{1} Z{2}", key.X,targetChunkY,key.Y); - #endif - continue; - } + if (chunkData == null || chunkData.BlockEntities == null) + { +#if DEBUG + Logger.VerboseDebug("Chunk null or empty X{0} Y{1} Z{2}", key.X, targetChunkY, key.Y); +#endif + continue; + } - /*************** Chunk Entities Scanning *********************/ - if (chunkData.BlockEntities != null && chunkData.BlockEntities.Length > 0) { - #if DEBUG - Logger.VerboseDebug("Surface@ {0} = BlockEntities: {1}", key, chunkData.BlockEntities.Length); - #endif + /*************** Chunk Entities Scanning *********************/ + if (chunkData.BlockEntities != null && chunkData.BlockEntities.Length > 0) + { +#if DEBUG + Logger.VerboseDebug("Surface@ {0} = BlockEntities: {1}", key, chunkData.BlockEntities.Length); +#endif - foreach (var blockEnt in chunkData.BlockEntities) { - - if (blockEnt != null && blockEnt.Block != null && BlockID_Designators.ContainsKey(blockEnt.Block.BlockId)) - { - var designator = BlockID_Designators[blockEnt.Block.BlockId]; - designator.SpecialAction(ClientAPI, POIs, blockEnt.Pos.Copy( ), blockEnt.Block); - } - } - - } - /********************* Chunk/Column BLOCKs scanning ****************/ - //Heightmap, Stats, block tally - chunkData.Unpack( ); - - int X_index, Y_index, Z_index; - X_index = Y_index = Z_index = 0; - - do { - do { - do { - /* Encode packed indicie - (y * chunksize + z) * chunksize + x - */ - var indicie = Helpers.ChunkBlockIndicie16(X_index, Y_index, Z_index); - int aBlockId = chunkData.Blocks[indicie]; - - if (aBlockId == 0) {//Air - chunkMeta.AirBlocks++; - continue; - } + foreach (var blockEnt in chunkData.BlockEntities) + { - if (RockIdCodes.ContainsKey(aBlockId)) { - if (chunkMeta.RockRatio.ContainsKey(aBlockId)) { chunkMeta.RockRatio[aBlockId]++; } else { chunkMeta.RockRatio.Add(aBlockId, 1); } - } - - chunkMeta.NonAirBlocks++; + if (blockEnt != null && blockEnt.Block != null && BlockID_Designators.ContainsKey(blockEnt.Block.BlockId)) + { + var designator = BlockID_Designators[blockEnt.Block.BlockId]; + designator.SpecialAction(ClientAPI, POIs, blockEnt.Pos.Copy(), blockEnt.Block); + } + } - //Heightmap - if (chunkMeta.HeightMap[X_index, Z_index] == 0) - { chunkMeta.HeightMap[X_index, Z_index] = ( ushort )(Y_index + (targetChunkY * chunkSize)); } + } + /********************* Chunk/Column BLOCKs scanning ****************/ + //Heightmap, Stats, block tally + chunkData.Unpack(); - } - while (X_index++ < (chunkSize - 1)); - X_index = 0; - } - while (Z_index++ < (chunkSize - 1)); - Z_index = 0; - } - while (Y_index++ < (chunkSize - 1)); + int X_index, Y_index, Z_index; + X_index = Y_index = Z_index = 0; - } + do + { + do + { + do + { + /* Encode packed indicie + (y * chunksize + z) * chunksize + x + */ + var indicie = Helpers.ChunkBlockIndicie16(X_index, Y_index, Z_index); + int aBlockId = chunkData.Blocks[indicie]; + + if (aBlockId == 0) + {//Air + chunkMeta.AirBlocks++; + continue; + } + + if (RockIdCodes.ContainsKey(aBlockId)) + { + if (chunkMeta.RockRatio.ContainsKey(aBlockId)) { chunkMeta.RockRatio[aBlockId]++; } else { chunkMeta.RockRatio.Add(aBlockId, 1); } + } + + chunkMeta.NonAirBlocks++; + + //Heightmap + if (chunkMeta.HeightMap[X_index, Z_index] == 0) + { chunkMeta.HeightMap[X_index, Z_index] = (ushort) (Y_index + (targetChunkY * chunkSize)); } + + } + while (X_index++ < (chunkSize - 1)); + X_index = 0; + } + while (Z_index++ < (chunkSize - 1)); + Z_index = 0; + } + while (Y_index++ < (chunkSize - 1)); + + } } - private void UpdateEntityMetadata( ) + private void UpdateEntityMetadata() { - Logger.Debug("Presently {0} Entities", ClientAPI.World.LoadedEntities.Count); - //Mabey scan only for 'new' entities by tracking ID in set? - foreach (var loadedEntity in ClientAPI.World.LoadedEntities.ToList()) { - - #if DEBUG - //Logger.VerboseDebug($"ENTITY: ({loadedEntity.Value.Code}) = #{loadedEntity.Value.EntityId} {loadedEntity.Value.State} {loadedEntity.Value.LocalPos} <<<<<<<<<<<<"); - #endif - - var dMatch = Entity_Designators.SingleOrDefault(se => se.Key.Equals(loadedEntity.Value.Code)); - if (dMatch.Value != null) { - dMatch.Value.SpecialAction(ClientAPI, this.EOIs, loadedEntity.Value.LocalPos.AsBlockPos.Copy( ), loadedEntity.Value); - } + Logger.Debug("Presently {0} Entities", ClientAPI.World.LoadedEntities.Count); + //Mabey scan only for 'new' entities by tracking ID in set? + foreach (var loadedEntity in ClientAPI.World.LoadedEntities.ToList()) + { - } +#if DEBUG + //Logger.VerboseDebug($"ENTITY: ({loadedEntity.Value.Code}) = #{loadedEntity.Value.EntityId} {loadedEntity.Value.State} {loadedEntity.Value.LocalPos} <<<<<<<<<<<<"); +#endif + + var dMatch = Entity_Designators.SingleOrDefault(se => se.Key.Equals(loadedEntity.Value.Code)); + if (dMatch.Value != null) + { + dMatch.Value.SpecialAction(ClientAPI, this.EOIs, loadedEntity.Value.LocalPos.AsBlockPos.Copy(), loadedEntity.Value); + } + + } } private void AddNote(string notation) - { - var playerNodePoi = new PointOfInterest( ) { - Location = ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.Copy(), - Notes = notation, - Timestamp = DateTimeOffset.UtcNow, - }; - - this.POIs.AddReplace(playerNodePoi); + { + var playerNodePoi = new PointOfInterest() + { + Location = ClientAPI.World.Player.Entity.LocalPos.AsBlockPos.Copy(), + Notes = notation, + Timestamp = DateTimeOffset.UtcNow, + }; + + this.POIs.AddReplace(playerNodePoi); } private void CommandListener(string eventName, ref EnumHandling handling, IAttribute data) { - Logger.VerboseDebug("MsgBus RX: AutomapCommandMsg: {0}", data.ToJsonToken() ); + Logger.VerboseDebug("MsgBus RX: AutomapCommandMsg: {0}", data.ToJsonToken()); - CommandData cmdData = data as CommandData; + CommandData cmdData = data as CommandData; - if (CurrentState != RunState.Snapshot) { - switch (cmdData.State) { - case RunState.Run: - CurrentState = cmdData.State; - AwakenCartographer(0.0f); - break; + if (CurrentState != RunState.Snapshot) + { + switch (cmdData.State) + { + case RunState.Run: + CurrentState = cmdData.State; + AwakenCartographer(0.0f); + break; - case RunState.Stop: - CurrentState = cmdData.State; - break; + case RunState.Stop: + CurrentState = cmdData.State; + break; - case RunState.Snapshot: - CurrentState = RunState.Stop; - //Snapshot starts a second thread/process... + case RunState.Snapshot: + CurrentState = RunState.Stop; + //Snapshot starts a second thread/process... - break; + break; - case RunState.Notation: - //Add to POI list where player location - AddNote(cmdData.Notation); - break; - } + case RunState.Notation: + //Add to POI list where player location + AddNote(cmdData.Notation); + break; + } - } + } - if (CurrentState != cmdData.State) { - CurrentState = cmdData.State; - AwakenCartographer(0.0f); - } + if (CurrentState != cmdData.State) + { + CurrentState = cmdData.State; + AwakenCartographer(0.0f); + } - #if DEBUG - ClientAPI.TriggerChatMessage($"Automap commanded to: {cmdData.State} "); - #endif +#if DEBUG + ClientAPI.TriggerChatMessage($"Automap commanded to: {cmdData.State} "); +#endif } -- 2.11.0