using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Text.RegularExpressions; using Vintagestory.API.Client; using Vintagestory.API.Common; using Vintagestory.API.Common.Entities; using Vintagestory.API.Config; using Vintagestory.API.MathTools; using Vintagestory.GameContent; namespace Automap { public static class DefaultDesignators { public static BlockDesignator Roads = new BlockDesignator( new AssetLocation("game", "stonepath"), Color.Yellow, EnumBlockMaterial.Gravel ); public static BlockDesignator GroundSigns = new BlockDesignator( new AssetLocation("game", "sign-ground"), Color.Teal, EnumBlockMaterial.Wood, DecodeSign ); public static BlockDesignator WallSigns = new BlockDesignator( new AssetLocation("game", "sign-wall"), Color.Teal, EnumBlockMaterial.Wood, DecodeSign ); public static BlockDesignator PostSigns = new BlockDesignator( new AssetLocation("game", "signpost"), Color.Teal, EnumBlockMaterial.Wood, DecodePostSign ); public static BlockDesignator Translocators = new BlockDesignator( new AssetLocation("game", "statictranslocator-normal"), Color.SteelBlue, EnumBlockMaterial.Metal, DecodeTranslocator ); public static EntityDesignator Traders = new EntityDesignator( new AssetLocation("game", "humanoid-trader"), Color.LightGoldenrodYellow, EnumEntityState.Active, KeepTrackOfMerchant ); /// /// Not just blocks, but block-entities as well! /// /// The block designators. public static List DefaultBlockDesignators() { return new List{ DefaultDesignators.Roads, DefaultDesignators.GroundSigns, DefaultDesignators.WallSigns, DefaultDesignators.PostSigns, DefaultDesignators.Translocators, }; } public static List DefaultEntityDesignators() { return new List{ DefaultDesignators.Traders, }; } #region Designators 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 { Name = "Sign", PrettyLocation = posn.PrettyCoords(clientAPI), Location = posn.Copy(), Notes = signEntity.text, Timestamp = DateTime.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 { Name = "Signpost", PrettyLocation = posn.PrettyCoords(clientAPI), Location = posn.Copy(), Notes = string.Join(",", signEntity.textByCardinalDirection), Timestamp = DateTime.UtcNow, } ); } } internal static void KeepTrackOfMerchant(ICoreClientAPI clientAPI, EntitiesOfInterest poi, BlockPos posn, Entity entity) { //clientAPI.Logger.VerboseDebug("Trader: {0} @ {1}", entity.GetName(), posn); var traderJoe = entity as EntityTrader; var traderName = entity.GetBehavior()?.DisplayName; string code; // this makes me ill switch (entity.Code.Path) { case "humanoid-trader-artisan": code = "{0} the artisan"; break; case "humanoid-trader-treasurehunter": code = "{0} the treasure hunter"; break; case "humanoid-trader-buildmaterials": code = "{0} the building materials trader"; break; case "humanoid-trader-clothing": code = "{0} the clothing merchant"; break; case "humanoid-trader-commodities": code = "{0} the commodities merchant"; break; case "humanoid-trader-foods": code = "{0} the foods supplier"; break; case "humanoid-trader-furniture": code = "{0} the furniture trader"; break; case "humanoid-trader-luxuries": code = "{0} the luxuries merchant"; break; case "humanoid-trader-survivalgoods": code = "{0} the survival goods supplier"; break; default: code = ""; break; } var message = string.Format(code, traderName); if (traderJoe.TradeProps != null) { message += $" - Gears: {traderJoe.TradeProps.Money}, "; } poi.AddReplace(new EntityOfInterest { Name = "Trader", PrettyLocation = posn.PrettyCoords(clientAPI), Location = posn.Copy(), Notes = message, Timestamp = DateTime.UtcNow, EntityId = entity.EntityId }); } internal static void DecodeTranslocator(ICoreClientAPI clientAPI, PointsOfInterest poi, BlockPos posn, Block block) { #if DEBUG clientAPI.Logger.VerboseDebug("TRANSLOCATOR Designator Invoked!"); #endif //Where to? and from! BlockEntityStaticTranslocator te = clientAPI.World.BlockAccessor.GetBlockEntity(posn) as BlockEntityStaticTranslocator; if (te != null) { //FIXME: Delayed rescan ? StringBuilder textTarget = new StringBuilder(); //translocatorEntity.GetBlockInfo(clientAPI.World.Player, textTarget); textTarget.Append(te.FullyRepaired ? "Functional, " : "Broken, "); textTarget.Append(te.Activated ? "Online, " : "Offline, "); textTarget.Append(" Target: [ "); textTarget.Append(te.TargetLocation != null ? "Set ]" : "Invalid ]");//Or ABS coords? textTarget.AppendFormat(", Range ({0} ~ {1})", te.MinTeleporterRangeInBlocks, te.MaxTeleporterRangeInBlocks); poi.AddReplace( new PointOfInterest { Name = "Translocator", PrettyLocation = posn.PrettyCoords(clientAPI), Location = posn.Copy(), Notes = textTarget.ToString(), Timestamp = DateTime.UtcNow, Destination = te.TargetLocation != null ? new BlockPosJson(te.TargetLocation.Copy()) : null } ); } } #endregion } }