• R/O
  • HTTP
  • SSH
  • HTTPS

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Automap (client) [VS plugin mod]


File Info

修訂. 1c8849af29a916822885541c010ffc4b7bb90d5a
大小 6,669 bytes
時間 2022-05-02 03:22:25
作者 melchior
Log Message

2nd Entity processing fix attempt

Content

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;

using Hjg.Pngcs.Chunks;

using Vintagestory.API.Client;
using Vintagestory.API.Common;
using Vintagestory.API.MathTools;

namespace Automap
{
    public static class Helpers
    {
        static Helpers()
        {
            //Called once - thus it can only be in a static constructor.
            PngChunk.FactoryRegister(PngMetadataChunk.ID, typeof(PngMetadataChunk));
        }

        /// <summary>
        /// Hue, Saturation Value colorspace
        /// </summary>
        /// <returns>The color equiv.</returns>
        /// <param name="hue">0 - 360 for hue.</param>
        /// <param name="saturation"> 0 - 1 for saturation or value..</param>
        /// <param name="value"> 0 - 1 for saturation or value..</param>
        public static Color FromHSV(double hue, double saturation, double value)
        {
            int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;
            double f = hue / 60 - Math.Floor(hue / 60);

            value *= 255;
            int v = Convert.ToInt32(value);
            int p = Convert.ToInt32(value * (1 - saturation));
            int q = Convert.ToInt32(value * (1 - f * saturation));
            int t = Convert.ToInt32(value * (1 - (1 - f) * saturation));

			switch (hi) 
            {
				case 0: return Color.FromArgb(255, v, t, p);
				case 1: return Color.FromArgb(255, q, v, p);
				case 2: return Color.FromArgb(255, p, v, t);
				case 3: return Color.FromArgb(255, p, q, v);
				case 4: return Color.FromArgb(255, t, p, v);
				default: return Color.FromArgb(255, v, p, q);
            };
        }

        public static string PrettyCoords(this BlockPos location, ICoreClientAPI ClientApi)
        {
            var start = ClientApi.World.DefaultSpawnPosition.AsBlockPos;

            return string.Format("X{0}, Y{1}, Z{2}", location.X - start.X, location.Y, location.Z - start.Z);
        }

        /// <summary>
        /// Chunk location to User display coordinate system
        /// </summary>
        /// <returns>Friendly string</returns>
        /// <param name="location">Chunk Coords.</param>
        public static string PrettyCoords(this Vec2i location, ICoreClientAPI ClientApi)
        {
            var start = ClientApi.World.DefaultSpawnPosition.AsBlockPos;
            var chunkSize = ClientApi.World.BlockAccessor.ChunkSize;

            return string.Format("X{0}, Z{1}", (location.X * chunkSize) - start.X, (location.Y * chunkSize) - start.Z);
        }

        public static BlockPos AverageHighestPos(List<BlockPos> positions)
        {
            int x = 0, y = 0, z = 0, length = positions.Count;
            foreach (BlockPos pos in positions)
            {
                x += pos.X;
                y = Math.Max(y, pos.Y);//Mutant Y-axis, take "HIGHEST"
                z += pos.Z;
            }
            return new BlockPos(x / length, y, z / length);
        }

        public static BlockPos PickRepresentativePosition(List<BlockPos> positions)
        {
            var averagePos = AverageHighestPos(positions);
            if (positions.Any(pos => pos.X == averagePos.X && pos.Y == averagePos.Y && pos.Z == averagePos.Z))
            {
                return averagePos;//lucky ~ center was it!
            }

            //Otherwise...pick one
            var whichever = positions.Last(poz => poz.Y == averagePos.Y);

            return whichever;
        }

		public static ushort RainHeight2DMap(this IMapChunk mapChunk, int x, int y, int chunkSize = 32)
		{
			//int num = posZ % this.chunksize * this.chunksize + posX % this.chunksize;
			int index = (y % chunkSize) * chunkSize + (x % chunkSize);
			return mapChunk.RainHeightMap[index];
		}


        /// <summary>
        /// Find a BLOCK partial path match: BlockID
        /// </summary>
        /// <returns>Matching finds</returns>
        /// <param name="assetName">Asset name.</param>
        public static Dictionary<int, string> ArbitrarytBlockIdHunter(this ICoreAPI CoreApi, AssetLocation assetName, EnumBlockMaterial? material = null)
        {
            Dictionary<int, string> arbBlockIDTable = new Dictionary<int, string>();
            uint emptyCount = 0;

            if (CoreApi.World.Blocks != null)
            {

#if DEBUG
                //CoreApi.World.Logger.VerboseDebug(" World Blocks [Count: {0}]", CoreApi.World.Blocks.Count);
#endif
                //If Brute force won't work; use GROOT FORCE!
                //var theBlock = ClientApi.World.BlockAccessor.GetBlock(0);

                if (!material.HasValue)
                {
                    foreach (Block blk in CoreApi.World.Blocks)
                    {
                        if (blk.IsMissing || blk.Id == 0 || blk.BlockId == 0)
                        {
                            emptyCount++;
                        }
                        else if (blk.Code != null && blk.Code.BeginsWith(assetName.Domain, assetName.Path))
                        {
#if DEBUG
                            //CoreApi.World.Logger.VerboseDebug("Block: [{0} ({1})] =  #{2}", blk.Code.Path, blk.BlockMaterial, blk.BlockId);
#endif

                            arbBlockIDTable.Add(blk.BlockId, blk.Code.Path);
                        }
                    }
                }
                else
                {
                    foreach (Block blk in CoreApi.World.Blocks)
                    {
                        if (blk.IsMissing || blk.Id == 0 || blk.BlockId == 0)
                        {
                            emptyCount++;
                        }
                        else if (blk.Code != null && material.Value == blk.BlockMaterial && blk.Code.BeginsWith(assetName.Domain, assetName.Path))
                        {
#if DEBUG
                            //CoreApi.World.Logger.VerboseDebug("Block: [{0} ({1})] =  #{2}", blk.Code.Path, blk.BlockMaterial, blk.BlockId);
#endif

                            arbBlockIDTable.Add(blk.BlockId, blk.Code.Path);
                        }
                    }
                }

#if DEBUG
                //CoreApi.World.Logger.VerboseDebug("Block gaps: {0}", emptyCount);
#endif
            }

            return arbBlockIDTable;
        }

		public static Mod Self(this ICoreClientAPI ownApi)
		{
		AutomapMod ownMod = ownApi.ModLoader.GetModSystem<AutomapMod>( );
		return ownMod.Mod;
		}


		public static bool EndsWith(this AssetLocation asset, string domain, string endPath)
		{
		return asset.Domain.Equals(domain,StringComparison.InvariantCultureIgnoreCase) && asset.Path.EndsWith(endPath, StringComparison.InvariantCultureIgnoreCase);
		}
    }
}