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 Designator Roads =
- new Designator(
+ {
+ public static BlockDesignator Roads =
+ new BlockDesignator(
new AssetLocation("game", "stonepath"),
Color.Yellow,
EnumBlockMaterial.Gravel
);
- public static Designator GroundSigns =
- new Designator(
+ public static BlockDesignator GroundSigns =
+ new BlockDesignator(
new AssetLocation("game", "sign-ground"),
Color.Teal,
EnumBlockMaterial.Wood,
DecodeSign
);
- public static Designator WallSigns =
- new Designator(
+ public static BlockDesignator WallSigns =
+ new BlockDesignator(
new AssetLocation("game", "sign-wall"),
Color.Teal,
EnumBlockMaterial.Wood,
DecodeSign
);
- public static Designator PostSigns =
- new Designator(
+ public static BlockDesignator PostSigns =
+ new BlockDesignator(
new AssetLocation("game", "signpost"),
Color.Teal,
EnumBlockMaterial.Wood,
DecodePostSign
);
- internal static void DecodeSign(ICoreClientAPI clientAPI, PointsOfInterest poi, BlockPos posn, Block block)
- {
- clientAPI.Logger.VerboseDebug("Sign Designator Invoked!");
- //sign Text into a POI field...
- BlockEntitySign signEntity = clientAPI.World.BlockAccessor.GetBlockEntity(posn) as BlockEntitySign;
-
- if (signEntity != null && !String.IsNullOrEmpty(signEntity.text))
+ 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
+ );
+
+ /// <summary>
+ /// Not just blocks, but block-entities as well!
+ /// </summary>
+ /// <returns>The block designators.</returns>
+ public static List<BlockDesignator> DefaultBlockDesignators()
{
-
- poi.AddReplace(
- new PointOfInterest {
- Location = posn.Copy( ),
- Notes = signEntity.text,
- Timestamp = DateTimeOffset.UtcNow,
- }
- );
-
+ return new List<BlockDesignator>{
+ DefaultDesignators.Roads,
+ DefaultDesignators.GroundSigns,
+ DefaultDesignators.WallSigns,
+ DefaultDesignators.PostSigns,
+ DefaultDesignators.Translocators,
+ };
}
+ public static List<EntityDesignator> DefaultEntityDesignators()
+ {
+ return new List<EntityDesignator>{
+ DefaultDesignators.Traders,
+ };
}
+ #region Designators
- internal static void DecodePostSign(ICoreClientAPI clientAPI, PointsOfInterest poi, BlockPos posn, Block block)
+ internal static void DecodeSign(ICoreClientAPI clientAPI, PointsOfInterest poi, BlockPos posn, Block block)
{
- clientAPI.Logger.VerboseDebug("Post-sign Designator Invoked!");
- //sign post Text into a POI field...
- BlockEntitySignPost signEntity = clientAPI.World.BlockAccessor.GetBlockEntity(posn) as BlockEntitySignPost;
-
- if (signEntity != null && signEntity.textByCardinalDirection?.Length > 0 ) {
+#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,
+ }
+ );
+ }
+ }
- poi.AddReplace(
- new PointOfInterest {
- Location = posn.Copy( ),
- Notes = string.Join(",", signEntity.textByCardinalDirection),
- 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
+ {
+ 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<EntityBehaviorNameTag>()?.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
}
}