// Decompiled with JetBrains decompiler // Type: Terraria.Utils // Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null // MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83 // Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics.PackedVector; using Microsoft.Xna.Framework.Input; using ReLogic.Content; using ReLogic.Graphics; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; using Terraria.DataStructures; using Terraria.GameContent; using Terraria.UI; using Terraria.UI.Chat; using Terraria.Utilities; using Terraria.Utilities.Terraria.Utilities; namespace Terraria { public static class Utils { public const long MaxCoins = 999999999; public static Dictionary charLengths = new Dictionary(); private static Regex _substitutionRegex = new Regex("{(\\?(?:!)?)?([a-zA-Z][\\w\\.]*)}", RegexOptions.Compiled); private const ulong RANDOM_MULTIPLIER = 25214903917; private const ulong RANDOM_ADD = 11; private const ulong RANDOM_MASK = 281474976710655; public static Color ColorLerp_BlackToWhite(float percent) => Color.Lerp(Color.Black, Color.White, percent); public static Vector2 Round(Vector2 input) => new Vector2((float) Math.Round((double) input.X), (float) Math.Round((double) input.Y)); public static bool IsPowerOfTwo(int x) => x != 0 && (x & x - 1) == 0; public static float SmoothStep(float min, float max, float x) => MathHelper.Clamp((float) (((double) x - (double) min) / ((double) max - (double) min)), 0.0f, 1f); public static float UnclampedSmoothStep(float min, float max, float x) => (float) (((double) x - (double) min) / ((double) max - (double) min)); public static Dictionary ParseArguements(string[] args) { string str1 = (string) null; string str2 = ""; Dictionary dictionary = new Dictionary(); string str3; for (int index = 0; index < args.Length; ++index) { if (args[index].Length != 0) { if (args[index][0] == '-' || args[index][0] == '+') { if (str1 != null) { dictionary.Add(str1.ToLower(), str2); str3 = ""; } str1 = args[index]; str2 = ""; } else { if (str2 != "") str2 += " "; str2 += args[index]; } } } if (str1 != null) { dictionary.Add(str1.ToLower(), str2); str3 = ""; } return dictionary; } public static void Swap(ref T t1, ref T t2) { T obj = t1; t1 = t2; t2 = obj; } public static T Clamp(T value, T min, T max) where T : IComparable { if (value.CompareTo(max) > 0) return max; return value.CompareTo(min) < 0 ? min : value; } public static float Turn01ToCyclic010(float value) => (float) (1.0 - (Math.Cos((double) value * 6.28318548202515) * 0.5 + 0.5)); public static float PingPongFrom01To010(float value) { value %= 1f; if ((double) value < 0.0) ++value; return (double) value >= 0.5 ? (float) (2.0 - (double) value * 2.0) : value * 2f; } public static float MultiLerp(float percent, params float[] floats) { float num1 = (float) (1.0 / ((double) floats.Length - 1.0)); float num2 = num1; int index; for (index = 0; (double) percent / (double) num2 > 1.0 && index < floats.Length - 2; ++index) num2 += num1; return MathHelper.Lerp(floats[index], floats[index + 1], (percent - num1 * (float) index) / num1); } public static float WrappedLerp(float value1, float value2, float percent) { float amount = percent * 2f; if ((double) amount > 1.0) amount = 2f - amount; return MathHelper.Lerp(value1, value2, amount); } public static float GetLerpValue(float from, float to, float t, bool clamped = false) { if (clamped) { if ((double) from < (double) to) { if ((double) t < (double) from) return 0.0f; if ((double) t > (double) to) return 1f; } else { if ((double) t < (double) to) return 1f; if ((double) t > (double) from) return 0.0f; } } return (float) (((double) t - (double) from) / ((double) to - (double) from)); } public static float Remap( float fromValue, float fromMin, float fromMax, float toMin, float toMax, bool clamped = true) { return MathHelper.Lerp(toMin, toMax, Utils.GetLerpValue(fromMin, fromMax, fromValue, clamped)); } public static void ClampWithinWorld( ref int minX, ref int minY, ref int maxX, ref int maxY, bool lastValuesInclusiveToIteration = false, int fluffX = 0, int fluffY = 0) { int num = lastValuesInclusiveToIteration ? 1 : 0; minX = Utils.Clamp(minX, fluffX, Main.maxTilesX - num - fluffX); maxX = Utils.Clamp(maxX, fluffX, Main.maxTilesX - num - fluffX); minY = Utils.Clamp(minY, fluffY, Main.maxTilesY - num - fluffY); maxY = Utils.Clamp(maxY, fluffY, Main.maxTilesY - num - fluffY); } public static double GetLerpValue(double from, double to, double t, bool clamped = false) { if (clamped) { if (from < to) { if (t < from) return 0.0; if (t > to) return 1.0; } else { if (t < to) return 1.0; if (t > from) return 0.0; } } return (t - from) / (to - from); } public static string[] ConvertMonoArgsToDotNet(string[] brokenArgs) { ArrayList arrayList = new ArrayList(); string str = ""; for (int index = 0; index < brokenArgs.Length; ++index) { if (brokenArgs[index].StartsWith("-")) { if (str != "") { arrayList.Add((object) str); str = ""; } else arrayList.Add((object) ""); arrayList.Add((object) brokenArgs[index]); } else { if (str != "") str += " "; str += brokenArgs[index]; } } arrayList.Add((object) str); string[] strArray = new string[arrayList.Count]; arrayList.CopyTo((Array) strArray); return strArray; } public static T Max(params T[] args) where T : IComparable { T obj = args[0]; for (int index = 1; index < args.Length; ++index) { if (obj.CompareTo((object) args[index]) < 0) obj = args[index]; } return obj; } public static List> WordwrapStringSmart( string text, Color c, DynamicSpriteFont font, int maxWidth, int maxLines) { TextSnippet[] array = ChatManager.ParseMessage(text, c).ToArray(); List> textSnippetListList = new List>(); List textSnippetList1 = new List(); for (int index1 = 0; index1 < array.Length; ++index1) { TextSnippet textSnippet = array[index1]; string[] strArray = textSnippet.Text.Split('\n'); for (int index2 = 0; index2 < strArray.Length - 1; ++index2) { textSnippetList1.Add(textSnippet.CopyMorph(strArray[index2])); textSnippetListList.Add(textSnippetList1); textSnippetList1 = new List(); } textSnippetList1.Add(textSnippet.CopyMorph(strArray[strArray.Length - 1])); } textSnippetListList.Add(textSnippetList1); if (maxWidth != -1) { for (int index3 = 0; index3 < textSnippetListList.Count; ++index3) { List textSnippetList2 = textSnippetListList[index3]; float num1 = 0.0f; for (int index4 = 0; index4 < textSnippetList2.Count; ++index4) { float stringLength = textSnippetList2[index4].GetStringLength(font); if ((double) stringLength + (double) num1 > (double) maxWidth) { int num2 = maxWidth - (int) num1; if ((double) num1 > 0.0) num2 -= 16; int num3 = Math.Min(textSnippetList2[index4].Text.Length, num2 / 8); if (num3 < 0) num3 = 0; string[] strArray = textSnippetList2[index4].Text.Split(' '); int num4 = num3; if (strArray.Length > 1) { num4 = 0; for (int index5 = 0; index5 < strArray.Length && num4 + strArray[index5].Length <= num3; ++index5) num4 += strArray[index5].Length + 1; if (num4 > num3) num4 = num3; } string newText1 = textSnippetList2[index4].Text.Substring(0, num4); string newText2 = textSnippetList2[index4].Text.Substring(num4); List textSnippetList3 = new List() { textSnippetList2[index4].CopyMorph(newText2) }; for (int index6 = index4 + 1; index6 < textSnippetList2.Count; ++index6) textSnippetList3.Add(textSnippetList2[index6]); textSnippetList2[index4] = textSnippetList2[index4].CopyMorph(newText1); textSnippetListList[index3] = textSnippetListList[index3].Take(index4 + 1).ToList(); textSnippetListList.Insert(index3 + 1, textSnippetList3); break; } num1 += stringLength; } } } if (maxLines != -1) { while (textSnippetListList.Count > 10) textSnippetListList.RemoveAt(10); } return textSnippetListList; } public static string[] WordwrapString( string text, DynamicSpriteFont font, int maxWidth, int maxLines, out int lineAmount) { string[] strArray = new string[maxLines]; int index1 = 0; List stringList1 = new List((IEnumerable) text.Split('\n')); List stringList2 = new List((IEnumerable) stringList1[0].Split(' ')); for (int index2 = 1; index2 < stringList1.Count && index2 < maxLines; ++index2) { stringList2.Add("\n"); stringList2.AddRange((IEnumerable) stringList1[index2].Split(' ')); } bool flag = true; while (stringList2.Count > 0) { string str1 = stringList2[0]; string str2 = " "; if (stringList2.Count == 1) str2 = ""; if (str1 == "\n") { // ISSUE: explicit reference operation ^ref strArray[index1++] += str1; flag = true; if (index1 < maxLines) stringList2.RemoveAt(0); else break; } else if (flag) { if ((double) font.MeasureString(str1).X > (double) maxWidth) { char ch = str1[0]; string str3 = ch.ToString() ?? ""; int num = 1; while (true) { DynamicSpriteFont dynamicSpriteFont = font; string str4 = str3; ch = str1[num]; string str5 = ch.ToString(); string str6 = str4 + str5 + "-"; if ((double) dynamicSpriteFont.MeasureString(str6).X <= (double) maxWidth) { string str7 = str3; ch = str1[num++]; string str8 = ch.ToString(); str3 = str7 + str8; } else break; } string str9 = str3 + "-"; strArray[index1++] = str9 + " "; if (index1 < maxLines) { stringList2.RemoveAt(0); stringList2.Insert(0, str1.Substring(num)); } else break; } else { ref string local = ref strArray[index1]; local = local + str1 + str2; flag = false; stringList2.RemoveAt(0); } } else if ((double) font.MeasureString(strArray[index1] + str1).X > (double) maxWidth) { ++index1; if (index1 < maxLines) flag = true; else break; } else { ref string local = ref strArray[index1]; local = local + str1 + str2; flag = false; stringList2.RemoveAt(0); } } lineAmount = index1; if (lineAmount == maxLines) --lineAmount; return strArray; } public static Rectangle CenteredRectangle(Vector2 center, Vector2 size) => new Rectangle((int) ((double) center.X - (double) size.X / 2.0), (int) ((double) center.Y - (double) size.Y / 2.0), (int) size.X, (int) size.Y); public static Vector2 Vector2FromElipse(Vector2 angleVector, Vector2 elipseSizes) { if (elipseSizes == Vector2.Zero || angleVector == Vector2.Zero) return Vector2.Zero; angleVector.Normalize(); Vector2 vector2 = Vector2.One / Vector2.Normalize(elipseSizes); angleVector *= vector2; angleVector.Normalize(); return angleVector * elipseSizes / 2f; } public static bool FloatIntersect( float r1StartX, float r1StartY, float r1Width, float r1Height, float r2StartX, float r2StartY, float r2Width, float r2Height) { return (double) r1StartX <= (double) r2StartX + (double) r2Width && (double) r1StartY <= (double) r2StartY + (double) r2Height && (double) r1StartX + (double) r1Width >= (double) r2StartX && (double) r1StartY + (double) r1Height >= (double) r2StartY; } public static long CoinsCount(out bool overFlowing, Item[] inv, params int[] ignoreSlots) { List intList = new List((IEnumerable) ignoreSlots); long num = 0; for (int index = 0; index < inv.Length; ++index) { if (!intList.Contains(index)) { switch (inv[index].type) { case 71: num += (long) inv[index].stack; break; case 72: num += (long) (inv[index].stack * 100); break; case 73: num += (long) (inv[index].stack * 10000); break; case 74: num += (long) (inv[index].stack * 1000000); break; } if (num >= 999999999L) { overFlowing = true; return 999999999; } } } overFlowing = false; return num; } public static int[] CoinsSplit(long count) { int[] numArray = new int[4]; long num1 = 0; long num2 = 1000000; for (int index = 3; index >= 0; --index) { numArray[index] = (int) ((count - num1) / num2); num1 += (long) numArray[index] * num2; num2 /= 100L; } return numArray; } public static long CoinsCombineStacks(out bool overFlowing, params long[] coinCounts) { long num = 0; foreach (long coinCount in coinCounts) { num += coinCount; if (num >= 999999999L) { overFlowing = true; return 999999999; } } overFlowing = false; return num; } public static void PoofOfSmoke(Vector2 position) { int num = Main.rand.Next(3, 7); for (int index1 = 0; index1 < num; ++index1) { int index2 = Gore.NewGore(position, (Main.rand.NextFloat() * 6.283185f).ToRotationVector2() * new Vector2(2f, 0.7f) * 0.7f, Main.rand.Next(11, 14)); Main.gore[index2].scale = 0.7f; Main.gore[index2].velocity *= 0.5f; } for (int index = 0; index < 10; ++index) { Dust dust = Main.dust[Dust.NewDust(position, 14, 14, 16, Alpha: 100, Scale: 1.5f)]; dust.position += new Vector2(5f); dust.velocity = (Main.rand.NextFloat() * 6.283185f).ToRotationVector2() * new Vector2(2f, 0.7f) * 0.7f * (float) (0.5 + 0.5 * (double) Main.rand.NextFloat()); } } public static Vector2 ToScreenPosition(this Vector2 worldPosition) => Vector2.Transform(worldPosition - Main.screenPosition, Main.GameViewMatrix.ZoomMatrix) / Main.UIScale; public static string PrettifyPercentDisplay(float percent, string originalFormat) => string.Format("{0:" + originalFormat + "}", (object) percent).TrimEnd('0', '%', ' ').TrimEnd('.', ' ').TrimStart('0', ' ') + "%"; public static void TrimTextIfNeeded( ref string text, DynamicSpriteFont font, float scale, float maxWidth) { int num = 0; for (Vector2 vector2 = font.MeasureString(text) * scale; (double) vector2.X > (double) maxWidth; vector2 = font.MeasureString(text) * scale) { text = text.Substring(0, text.Length - 1); ++num; } if (num <= 0) return; text = text.Substring(0, text.Length - 1) + "…"; } public static string FormatWith(string original, object obj) { string input = original; PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj); return Utils._substitutionRegex.Replace(input, (MatchEvaluator) (match => { if (match.Groups[1].Length != 0) return ""; PropertyDescriptor propertyDescriptor = properties.Find(match.Groups[2].ToString(), false); return propertyDescriptor == null ? "" : (propertyDescriptor.GetValue(obj) ?? (object) "").ToString(); })); } public static bool TryCreatingDirectory(string folderPath) { if (Directory.Exists(folderPath)) return true; try { Directory.CreateDirectory(folderPath); return true; } catch (Exception ex) { string folderPath1 = folderPath; FancyErrorPrinter.ShowDirectoryCreationFailError(ex, folderPath1); return false; } } public static void OpenFolder(string folderPath) { if (!Utils.TryCreatingDirectory(folderPath)) return; Process.Start(folderPath); } public static byte[] ToByteArray(this string str) { byte[] numArray = new byte[str.Length * 2]; Buffer.BlockCopy((Array) str.ToCharArray(), 0, (Array) numArray, 0, numArray.Length); return numArray; } public static float NextFloat(this UnifiedRandom r) => (float) r.NextDouble(); public static float NextFloatDirection(this UnifiedRandom r) => (float) (r.NextDouble() * 2.0 - 1.0); public static float NextFloat(this UnifiedRandom random, FloatRange range) => random.NextFloat() * (range.Maximum - range.Minimum) + range.Minimum; public static T NextFromList(this UnifiedRandom random, params T[] objs) => objs[random.Next(objs.Length)]; public static int Next(this UnifiedRandom random, IntRange range) => random.Next(range.Minimum, range.Maximum + 1); public static Vector2 NextVector2Square(this UnifiedRandom r, float min, float max) => new Vector2((max - min) * (float) r.NextDouble() + min, (max - min) * (float) r.NextDouble() + min); public static Vector2 NextVector2FromRectangle(this UnifiedRandom r, Rectangle rect) => new Vector2((float) rect.X + r.NextFloat() * (float) rect.Width, (float) rect.Y + r.NextFloat() * (float) rect.Height); public static Vector2 NextVector2Unit( this UnifiedRandom r, float startRotation = 0.0f, float rotationRange = 6.283185f) { return (startRotation + rotationRange * r.NextFloat()).ToRotationVector2(); } public static Vector2 NextVector2Circular( this UnifiedRandom r, float circleHalfWidth, float circleHalfHeight) { return r.NextVector2Unit() * new Vector2(circleHalfWidth, circleHalfHeight) * r.NextFloat(); } public static Vector2 NextVector2CircularEdge( this UnifiedRandom r, float circleHalfWidth, float circleHalfHeight) { return r.NextVector2Unit() * new Vector2(circleHalfWidth, circleHalfHeight); } public static int Width(this Asset asset) => !asset.IsLoaded ? 0 : asset.Value.Width; public static int Height(this Asset asset) => !asset.IsLoaded ? 0 : asset.Value.Height; public static Rectangle Frame( this Asset tex, int horizontalFrames = 1, int verticalFrames = 1, int frameX = 0, int frameY = 0, int sizeOffsetX = 0, int sizeOffsetY = 0) { return !tex.IsLoaded ? Rectangle.Empty : tex.Value.Frame(horizontalFrames, verticalFrames, frameX, frameY, sizeOffsetX, sizeOffsetY); } public static Rectangle OffsetSize(this Rectangle rect, int xSize, int ySize) { rect.Width += xSize; rect.Height += ySize; return rect; } public static Vector2 Size(this Asset tex) => !tex.IsLoaded ? Vector2.Zero : tex.Value.Size(); public static Rectangle Frame( this Texture2D tex, int horizontalFrames = 1, int verticalFrames = 1, int frameX = 0, int frameY = 0, int sizeOffsetX = 0, int sizeOffsetY = 0) { int num1 = tex.Width / horizontalFrames; int num2 = tex.Height / verticalFrames; return new Rectangle(num1 * frameX, num2 * frameY, num1 + sizeOffsetX, num2 + sizeOffsetY); } public static Vector2 OriginFlip( this Rectangle rect, Vector2 origin, SpriteEffects effects) { if (effects.HasFlag((Enum) SpriteEffects.FlipHorizontally)) origin.X = (float) rect.Width - origin.X; if (effects.HasFlag((Enum) SpriteEffects.FlipVertically)) origin.Y = (float) rect.Height - origin.Y; return origin; } public static Vector2 Size(this Texture2D tex) => new Vector2((float) tex.Width, (float) tex.Height); public static void WriteRGB(this BinaryWriter bb, Color c) { bb.Write(c.R); bb.Write(c.G); bb.Write(c.B); } public static void WriteVector2(this BinaryWriter bb, Vector2 v) { bb.Write(v.X); bb.Write(v.Y); } public static void WritePackedVector2(this BinaryWriter bb, Vector2 v) { HalfVector2 halfVector2 = new HalfVector2(v.X, v.Y); bb.Write(halfVector2.PackedValue); } public static Color ReadRGB(this BinaryReader bb) => new Color((int) bb.ReadByte(), (int) bb.ReadByte(), (int) bb.ReadByte()); public static Vector2 ReadVector2(this BinaryReader bb) => new Vector2(bb.ReadSingle(), bb.ReadSingle()); public static Vector2 ReadPackedVector2(this BinaryReader bb) => new HalfVector2() { PackedValue = bb.ReadUInt32() }.ToVector2(); public static Vector2 Left(this Rectangle r) => new Vector2((float) r.X, (float) (r.Y + r.Height / 2)); public static Vector2 Right(this Rectangle r) => new Vector2((float) (r.X + r.Width), (float) (r.Y + r.Height / 2)); public static Vector2 Top(this Rectangle r) => new Vector2((float) (r.X + r.Width / 2), (float) r.Y); public static Vector2 Bottom(this Rectangle r) => new Vector2((float) (r.X + r.Width / 2), (float) (r.Y + r.Height)); public static Vector2 TopLeft(this Rectangle r) => new Vector2((float) r.X, (float) r.Y); public static Vector2 TopRight(this Rectangle r) => new Vector2((float) (r.X + r.Width), (float) r.Y); public static Vector2 BottomLeft(this Rectangle r) => new Vector2((float) r.X, (float) (r.Y + r.Height)); public static Vector2 BottomRight(this Rectangle r) => new Vector2((float) (r.X + r.Width), (float) (r.Y + r.Height)); public static Vector2 Center(this Rectangle r) => new Vector2((float) (r.X + r.Width / 2), (float) (r.Y + r.Height / 2)); public static Vector2 Size(this Rectangle r) => new Vector2((float) r.Width, (float) r.Height); public static float Distance(this Rectangle r, Vector2 point) { if (Utils.FloatIntersect((float) r.Left, (float) r.Top, (float) r.Width, (float) r.Height, point.X, point.Y, 0.0f, 0.0f)) return 0.0f; return (double) point.X >= (double) r.Left && (double) point.X <= (double) r.Right ? ((double) point.Y < (double) r.Top ? (float) r.Top - point.Y : point.Y - (float) r.Bottom) : ((double) point.Y >= (double) r.Top && (double) point.Y <= (double) r.Bottom ? ((double) point.X < (double) r.Left ? (float) r.Left - point.X : point.X - (float) r.Right) : ((double) point.X < (double) r.Left ? ((double) point.Y < (double) r.Top ? Vector2.Distance(point, r.TopLeft()) : Vector2.Distance(point, r.BottomLeft())) : ((double) point.Y < (double) r.Top ? Vector2.Distance(point, r.TopRight()) : Vector2.Distance(point, r.BottomRight())))); } public static Vector2 ClosestPointInRect(this Rectangle r, Vector2 point) { Vector2 vector2 = point; if ((double) vector2.X < (double) r.Left) vector2.X = (float) r.Left; if ((double) vector2.X > (double) r.Right) vector2.X = (float) r.Right; if ((double) vector2.Y < (double) r.Top) vector2.Y = (float) r.Top; if ((double) vector2.Y > (double) r.Bottom) vector2.Y = (float) r.Bottom; return vector2; } public static Rectangle Modified(this Rectangle r, int x, int y, int w, int h) => new Rectangle(r.X + x, r.Y + y, r.Width + w, r.Height + h); public static float ToRotation(this Vector2 v) => (float) Math.Atan2((double) v.Y, (double) v.X); public static Vector2 ToRotationVector2(this float f) => new Vector2((float) Math.Cos((double) f), (float) Math.Sin((double) f)); public static Vector2 RotatedBy( this Vector2 spinningpoint, double radians, Vector2 center = default (Vector2)) { float num1 = (float) Math.Cos(radians); float num2 = (float) Math.Sin(radians); Vector2 vector2_1 = spinningpoint - center; Vector2 vector2_2 = center; vector2_2.X += (float) ((double) vector2_1.X * (double) num1 - (double) vector2_1.Y * (double) num2); vector2_2.Y += (float) ((double) vector2_1.X * (double) num2 + (double) vector2_1.Y * (double) num1); return vector2_2; } public static Vector2 RotatedByRandom(this Vector2 spinninpoint, double maxRadians) => spinninpoint.RotatedBy(Main.rand.NextDouble() * maxRadians - Main.rand.NextDouble() * maxRadians); public static Vector2 Floor(this Vector2 vec) { vec.X = (float) (int) vec.X; vec.Y = (float) (int) vec.Y; return vec; } public static bool HasNaNs(this Vector2 vec) => float.IsNaN(vec.X) || float.IsNaN(vec.Y); public static bool Between(this Vector2 vec, Vector2 minimum, Vector2 maximum) => (double) vec.X >= (double) minimum.X && (double) vec.X <= (double) maximum.X && (double) vec.Y >= (double) minimum.Y && (double) vec.Y <= (double) maximum.Y; public static Vector2 ToVector2(this Point p) => new Vector2((float) p.X, (float) p.Y); public static Vector2 ToVector2(this Point16 p) => new Vector2((float) p.X, (float) p.Y); public static Vector2 ToWorldCoordinates(this Point p, float autoAddX = 8f, float autoAddY = 8f) => p.ToVector2() * 16f + new Vector2(autoAddX, autoAddY); public static Vector2 ToWorldCoordinates(this Point16 p, float autoAddX = 8f, float autoAddY = 8f) => p.ToVector2() * 16f + new Vector2(autoAddX, autoAddY); public static Vector2 MoveTowards( this Vector2 currentPosition, Vector2 targetPosition, float maxAmountAllowedToMove) { Vector2 v = targetPosition - currentPosition; return (double) v.Length() < (double) maxAmountAllowedToMove ? targetPosition : currentPosition + v.SafeNormalize(Vector2.Zero) * maxAmountAllowedToMove; } public static Point16 ToTileCoordinates16(this Vector2 vec) => new Point16((int) vec.X >> 4, (int) vec.Y >> 4); public static Point ToTileCoordinates(this Vector2 vec) => new Point((int) vec.X >> 4, (int) vec.Y >> 4); public static Point ToPoint(this Vector2 v) => new Point((int) v.X, (int) v.Y); public static Vector2 SafeNormalize(this Vector2 v, Vector2 defaultValue) => v == Vector2.Zero || v.HasNaNs() ? defaultValue : Vector2.Normalize(v); public static Vector2 ClosestPointOnLine(this Vector2 P, Vector2 A, Vector2 B) { Vector2 vector2_1 = P - A; Vector2 vector2_2 = B - A; float num1 = vector2_2.LengthSquared(); Vector2 vector2_3 = vector2_2; float num2 = Vector2.Dot(vector2_1, vector2_3) / num1; if ((double) num2 < 0.0) return A; return (double) num2 > 1.0 ? B : A + vector2_2 * num2; } public static bool RectangleLineCollision( Vector2 rectTopLeft, Vector2 rectBottomRight, Vector2 lineStart, Vector2 lineEnd) { if (lineStart.Between(rectTopLeft, rectBottomRight) || lineEnd.Between(rectTopLeft, rectBottomRight)) return true; Vector2 P = new Vector2(rectBottomRight.X, rectTopLeft.Y); Vector2 vector2 = new Vector2(rectTopLeft.X, rectBottomRight.Y); Vector2[] vector2Array = new Vector2[4] { rectTopLeft.ClosestPointOnLine(lineStart, lineEnd), P.ClosestPointOnLine(lineStart, lineEnd), vector2.ClosestPointOnLine(lineStart, lineEnd), rectBottomRight.ClosestPointOnLine(lineStart, lineEnd) }; for (int index = 0; index < vector2Array.Length; ++index) { if (vector2Array[0].Between(rectTopLeft, vector2)) return true; } return false; } public static Vector2 RotateRandom(this Vector2 spinninpoint, double maxRadians) => spinninpoint.RotatedBy(Main.rand.NextDouble() * maxRadians - Main.rand.NextDouble() * maxRadians); public static float AngleTo(this Vector2 Origin, Vector2 Target) => (float) Math.Atan2((double) Target.Y - (double) Origin.Y, (double) Target.X - (double) Origin.X); public static float AngleFrom(this Vector2 Origin, Vector2 Target) => (float) Math.Atan2((double) Origin.Y - (double) Target.Y, (double) Origin.X - (double) Target.X); public static Vector2 rotateTowards( Vector2 currentPosition, Vector2 currentVelocity, Vector2 targetPosition, float maxChange) { float num = currentVelocity.Length(); float targetAngle = currentPosition.AngleTo(targetPosition); return currentVelocity.ToRotation().AngleTowards(targetAngle, (float) Math.PI / 180f).ToRotationVector2() * num; } public static float Distance(this Vector2 Origin, Vector2 Target) => Vector2.Distance(Origin, Target); public static float DistanceSQ(this Vector2 Origin, Vector2 Target) => Vector2.DistanceSquared(Origin, Target); public static Vector2 DirectionTo(this Vector2 Origin, Vector2 Target) => Vector2.Normalize(Target - Origin); public static Vector2 DirectionFrom(this Vector2 Origin, Vector2 Target) => Vector2.Normalize(Origin - Target); public static bool WithinRange(this Vector2 Origin, Vector2 Target, float MaxRange) => (double) Vector2.DistanceSquared(Origin, Target) <= (double) MaxRange * (double) MaxRange; public static Vector2 XY(this Vector4 vec) => new Vector2(vec.X, vec.Y); public static Vector2 ZW(this Vector4 vec) => new Vector2(vec.Z, vec.W); public static Vector3 XZW(this Vector4 vec) => new Vector3(vec.X, vec.Z, vec.W); public static Vector3 YZW(this Vector4 vec) => new Vector3(vec.Y, vec.Z, vec.W); public static Color MultiplyRGB(this Color firstColor, Color secondColor) => new Color((int) (byte) ((double) ((int) firstColor.R * (int) secondColor.R) / (double) byte.MaxValue), (int) (byte) ((double) ((int) firstColor.G * (int) secondColor.G) / (double) byte.MaxValue), (int) (byte) ((double) ((int) firstColor.B * (int) secondColor.B) / (double) byte.MaxValue)); public static Color MultiplyRGBA(this Color firstColor, Color secondColor) => new Color((int) (byte) ((double) ((int) firstColor.R * (int) secondColor.R) / (double) byte.MaxValue), (int) (byte) ((double) ((int) firstColor.G * (int) secondColor.G) / (double) byte.MaxValue), (int) (byte) ((double) ((int) firstColor.B * (int) secondColor.B) / (double) byte.MaxValue), (int) (byte) ((double) ((int) firstColor.A * (int) secondColor.A) / (double) byte.MaxValue)); public static string Hex3(this Color color) { byte num = color.R; string str1 = num.ToString("X2"); num = color.G; string str2 = num.ToString("X2"); num = color.B; string str3 = num.ToString("X2"); return (str1 + str2 + str3).ToLower(); } public static string Hex4(this Color color) { byte num = color.R; string str1 = num.ToString("X2"); num = color.G; string str2 = num.ToString("X2"); num = color.B; string str3 = num.ToString("X2"); num = color.A; string str4 = num.ToString("X2"); return (str1 + str2 + str3 + str4).ToLower(); } public static int ToDirectionInt(this bool value) => !value ? -1 : 1; public static int ToInt(this bool value) => !value ? 0 : 1; public static int ModulusPositive(this int myInteger, int modulusNumber) => (myInteger % modulusNumber + modulusNumber) % modulusNumber; public static float AngleLerp(this float curAngle, float targetAngle, float amount) { float angle; if ((double) targetAngle < (double) curAngle) { float num = targetAngle + 6.283185f; angle = (double) num - (double) curAngle > (double) curAngle - (double) targetAngle ? MathHelper.Lerp(curAngle, targetAngle, amount) : MathHelper.Lerp(curAngle, num, amount); } else { if ((double) targetAngle <= (double) curAngle) return curAngle; float num = targetAngle - 6.283185f; angle = (double) targetAngle - (double) curAngle > (double) curAngle - (double) num ? MathHelper.Lerp(curAngle, num, amount) : MathHelper.Lerp(curAngle, targetAngle, amount); } return MathHelper.WrapAngle(angle); } public static float AngleTowards(this float curAngle, float targetAngle, float maxChange) { curAngle = MathHelper.WrapAngle(curAngle); targetAngle = MathHelper.WrapAngle(targetAngle); if ((double) curAngle < (double) targetAngle) { if ((double) targetAngle - (double) curAngle > 3.14159274101257) curAngle += 6.283185f; } else if ((double) curAngle - (double) targetAngle > 3.14159274101257) curAngle -= 6.283185f; curAngle += MathHelper.Clamp(targetAngle - curAngle, -maxChange, maxChange); return MathHelper.WrapAngle(curAngle); } public static bool deepCompare(this int[] firstArray, int[] secondArray) { if (firstArray == null && secondArray == null) return true; if (firstArray == null || secondArray == null || firstArray.Length != secondArray.Length) return false; for (int index = 0; index < firstArray.Length; ++index) { if (firstArray[index] != secondArray[index]) return false; } return true; } public static List GetTrueIndexes(this bool[] array) { List intList = new List(); for (int index = 0; index < array.Length; ++index) { if (array[index]) intList.Add(index); } return intList; } public static List GetTrueIndexes(params bool[][] arrays) { List source = new List(); foreach (bool[] array in arrays) source.AddRange((IEnumerable) array.GetTrueIndexes()); return source.Distinct().ToList(); } public static bool PressingShift(this KeyboardState kb) => kb.IsKeyDown(Keys.LeftShift) || kb.IsKeyDown(Keys.RightShift); public static bool PressingControl(this KeyboardState kb) => kb.IsKeyDown(Keys.LeftControl) || kb.IsKeyDown(Keys.RightControl); public static bool PlotLine(Point16 p0, Point16 p1, Utils.TileActionAttempt plot, bool jump = true) => Utils.PlotLine((int) p0.X, (int) p0.Y, (int) p1.X, (int) p1.Y, plot, jump); public static bool PlotLine(Point p0, Point p1, Utils.TileActionAttempt plot, bool jump = true) => Utils.PlotLine(p0.X, p0.Y, p1.X, p1.Y, plot, jump); private static bool PlotLine( int x0, int y0, int x1, int y1, Utils.TileActionAttempt plot, bool jump = true) { if (x0 == x1 && y0 == y1) return plot(x0, y0); bool flag = Math.Abs(y1 - y0) > Math.Abs(x1 - x0); if (flag) { Utils.Swap(ref x0, ref y0); Utils.Swap(ref x1, ref y1); } int num1 = Math.Abs(x1 - x0); int num2 = Math.Abs(y1 - y0); int num3 = num1 / 2; int num4 = y0; int num5 = x0 < x1 ? 1 : -1; int num6 = y0 < y1 ? 1 : -1; for (int index = x0; index != x1; index += num5) { if (flag) { if (!plot(num4, index)) return false; } else if (!plot(index, num4)) return false; num3 -= num2; if (num3 < 0) { num4 += num6; if (!jump) { if (flag) { if (!plot(num4, index)) return false; } else if (!plot(index, num4)) return false; } num3 += num1; } } return true; } public static int RandomNext(ref ulong seed, int bits) { seed = Utils.RandomNextSeed(seed); return (int) (seed >> 48 - bits); } public static ulong RandomNextSeed(ulong seed) => (ulong) ((long) seed * 25214903917L + 11L & 281474976710655L); public static float RandomFloat(ref ulong seed) => (float) Utils.RandomNext(ref seed, 24) / 1.677722E+07f; public static int RandomInt(ref ulong seed, int max) { if ((max & -max) == max) return (int) ((long) max * (long) Utils.RandomNext(ref seed, 31) >> 31); int num1; int num2; do { num1 = Utils.RandomNext(ref seed, 31); num2 = num1 % max; } while (num1 - num2 + (max - 1) < 0); return num2; } public static int RandomInt(ref ulong seed, int min, int max) => Utils.RandomInt(ref seed, max - min) + min; public static bool PlotTileLine( Vector2 start, Vector2 end, float width, Utils.TileActionAttempt plot) { float num = width / 2f; Vector2 vector2_1 = end - start; Vector2 vector2_2 = vector2_1 / vector2_1.Length(); Vector2 vector2_3 = new Vector2(-vector2_2.Y, vector2_2.X) * num; Point tileCoordinates1 = (start - vector2_3).ToTileCoordinates(); Point tileCoordinates2 = (start + vector2_3).ToTileCoordinates(); Point tileCoordinates3 = start.ToTileCoordinates(); Point tileCoordinates4 = end.ToTileCoordinates(); Point lineMinOffset = new Point(tileCoordinates1.X - tileCoordinates3.X, tileCoordinates1.Y - tileCoordinates3.Y); Point lineMaxOffset = new Point(tileCoordinates2.X - tileCoordinates3.X, tileCoordinates2.Y - tileCoordinates3.Y); return Utils.PlotLine(tileCoordinates3.X, tileCoordinates3.Y, tileCoordinates4.X, tileCoordinates4.Y, (Utils.TileActionAttempt) ((x, y) => Utils.PlotLine(x + lineMinOffset.X, y + lineMinOffset.Y, x + lineMaxOffset.X, y + lineMaxOffset.Y, plot, false))); } public static bool PlotTileTale( Vector2 start, Vector2 end, float width, Utils.TileActionAttempt plot) { float halfWidth = width / 2f; Vector2 vector2_1 = end - start; Vector2 vector2_2 = vector2_1 / vector2_1.Length(); Vector2 perpOffset = new Vector2(-vector2_2.Y, vector2_2.X); Point pointStart = start.ToTileCoordinates(); Point tileCoordinates1 = end.ToTileCoordinates(); int length = 0; Utils.PlotLine(pointStart.X, pointStart.Y, tileCoordinates1.X, tileCoordinates1.Y, (Utils.TileActionAttempt) ((_param1, _param2) => { ++length; return true; })); length--; int curLength = 0; return Utils.PlotLine(pointStart.X, pointStart.Y, tileCoordinates1.X, tileCoordinates1.Y, (Utils.TileActionAttempt) ((x, y) => { float num = (float) (1.0 - (double) curLength / (double) length); ++curLength; Point tileCoordinates2 = (start - perpOffset * halfWidth * num).ToTileCoordinates(); Point tileCoordinates3 = (start + perpOffset * halfWidth * num).ToTileCoordinates(); Point point1 = new Point(tileCoordinates2.X - pointStart.X, tileCoordinates2.Y - pointStart.Y); Point point2 = new Point(tileCoordinates3.X - pointStart.X, tileCoordinates3.Y - pointStart.Y); return Utils.PlotLine(x + point1.X, y + point1.Y, x + point2.X, y + point2.Y, plot, false); })); } public static bool PlotTileArea(int x, int y, Utils.TileActionAttempt plot) { if (!WorldGen.InWorld(x, y)) return false; List pointList1 = new List(); List pointList2 = new List(); HashSet pointSet = new HashSet(); pointList2.Add(new Point(x, y)); while (pointList2.Count > 0) { pointList1.Clear(); pointList1.AddRange((IEnumerable) pointList2); pointList2.Clear(); while (pointList1.Count > 0) { Point point1 = pointList1[0]; if (!WorldGen.InWorld(point1.X, point1.Y, 1)) { pointList1.Remove(point1); } else { pointSet.Add(point1); pointList1.Remove(point1); if (plot(point1.X, point1.Y)) { Point point2 = new Point(point1.X - 1, point1.Y); if (!pointSet.Contains(point2)) pointList2.Add(point2); point2 = new Point(point1.X + 1, point1.Y); if (!pointSet.Contains(point2)) pointList2.Add(point2); point2 = new Point(point1.X, point1.Y - 1); if (!pointSet.Contains(point2)) pointList2.Add(point2); point2 = new Point(point1.X, point1.Y + 1); if (!pointSet.Contains(point2)) pointList2.Add(point2); } } } } return true; } public static int RandomConsecutive(double random, int odds) => (int) Math.Log(1.0 - random, 1.0 / (double) odds); public static Vector2 RandomVector2(UnifiedRandom random, float min, float max) => new Vector2((max - min) * (float) random.NextDouble() + min, (max - min) * (float) random.NextDouble() + min); public static bool IndexInRange(this T[] t, int index) => index >= 0 && index < t.Length; public static bool IndexInRange(this List t, int index) => index >= 0 && index < t.Count; public static T SelectRandom(UnifiedRandom random, params T[] choices) => choices[random.Next(choices.Length)]; public static void DrawBorderStringFourWay( SpriteBatch sb, DynamicSpriteFont font, string text, float x, float y, Color textColor, Color borderColor, Vector2 origin, float scale = 1f) { Color color = borderColor; Vector2 zero = Vector2.Zero; for (int index = 0; index < 5; ++index) { switch (index) { case 0: zero.X = x - 2f; zero.Y = y; break; case 1: zero.X = x + 2f; zero.Y = y; break; case 2: zero.X = x; zero.Y = y - 2f; break; case 3: zero.X = x; zero.Y = y + 2f; break; default: zero.X = x; zero.Y = y; color = textColor; break; } DynamicSpriteFontExtensionMethods.DrawString(sb, font, text, zero, color, 0.0f, origin, scale, SpriteEffects.None, 0.0f); } } public static Vector2 DrawBorderString( SpriteBatch sb, string text, Vector2 pos, Color color, float scale = 1f, float anchorx = 0.0f, float anchory = 0.0f, int maxCharactersDisplayed = -1) { if (maxCharactersDisplayed != -1 && text.Length > maxCharactersDisplayed) text.Substring(0, maxCharactersDisplayed); DynamicSpriteFont font = FontAssets.MouseText.Value; Vector2 vector2 = font.MeasureString(text); ChatManager.DrawColorCodedStringWithShadow(sb, font, text, pos, color, 0.0f, new Vector2(anchorx, anchory) * vector2, new Vector2(scale), spread: 1.5f); return vector2 * scale; } public static Vector2 DrawBorderStringBig( SpriteBatch spriteBatch, string text, Vector2 pos, Color color, float scale = 1f, float anchorx = 0.0f, float anchory = 0.0f, int maxCharactersDisplayed = -1) { if (maxCharactersDisplayed != -1 && text.Length > maxCharactersDisplayed) text.Substring(0, maxCharactersDisplayed); DynamicSpriteFont dynamicSpriteFont = FontAssets.DeathText.Value; for (int index1 = -1; index1 < 2; ++index1) { for (int index2 = -1; index2 < 2; ++index2) DynamicSpriteFontExtensionMethods.DrawString(spriteBatch, dynamicSpriteFont, text, pos + new Vector2((float) index1, (float) index2), Color.Black, 0.0f, new Vector2(anchorx, anchory) * dynamicSpriteFont.MeasureString(text), scale, SpriteEffects.None, 0.0f); } DynamicSpriteFontExtensionMethods.DrawString(spriteBatch, dynamicSpriteFont, text, pos, color, 0.0f, new Vector2(anchorx, anchory) * dynamicSpriteFont.MeasureString(text), scale, SpriteEffects.None, 0.0f); return dynamicSpriteFont.MeasureString(text) * scale; } public static void DrawInvBG(SpriteBatch sb, Rectangle R, Color c = default (Color)) => Utils.DrawInvBG(sb, R.X, R.Y, R.Width, R.Height, c); public static void DrawInvBG(SpriteBatch sb, float x, float y, float w, float h, Color c = default (Color)) => Utils.DrawInvBG(sb, (int) x, (int) y, (int) w, (int) h, c); public static void DrawInvBG(SpriteBatch sb, int x, int y, int w, int h, Color c = default (Color)) { if (c == new Color()) c = new Color(63, 65, 151, (int) byte.MaxValue) * 0.785f; Texture2D texture = TextureAssets.InventoryBack13.Value; if (w < 20) w = 20; if (h < 20) h = 20; sb.Draw(texture, new Rectangle(x, y, 10, 10), new Rectangle?(new Rectangle(0, 0, 10, 10)), c); sb.Draw(texture, new Rectangle(x + 10, y, w - 20, 10), new Rectangle?(new Rectangle(10, 0, 10, 10)), c); sb.Draw(texture, new Rectangle(x + w - 10, y, 10, 10), new Rectangle?(new Rectangle(texture.Width - 10, 0, 10, 10)), c); sb.Draw(texture, new Rectangle(x, y + 10, 10, h - 20), new Rectangle?(new Rectangle(0, 10, 10, 10)), c); sb.Draw(texture, new Rectangle(x + 10, y + 10, w - 20, h - 20), new Rectangle?(new Rectangle(10, 10, 10, 10)), c); sb.Draw(texture, new Rectangle(x + w - 10, y + 10, 10, h - 20), new Rectangle?(new Rectangle(texture.Width - 10, 10, 10, 10)), c); sb.Draw(texture, new Rectangle(x, y + h - 10, 10, 10), new Rectangle?(new Rectangle(0, texture.Height - 10, 10, 10)), c); sb.Draw(texture, new Rectangle(x + 10, y + h - 10, w - 20, 10), new Rectangle?(new Rectangle(10, texture.Height - 10, 10, 10)), c); sb.Draw(texture, new Rectangle(x + w - 10, y + h - 10, 10, 10), new Rectangle?(new Rectangle(texture.Width - 10, texture.Height - 10, 10, 10)), c); } public static string ReadEmbeddedResource(string path) { using (Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path)) { using (StreamReader streamReader = new StreamReader(manifestResourceStream)) return streamReader.ReadToEnd(); } } public static void DrawSplicedPanel( SpriteBatch sb, Texture2D texture, int x, int y, int w, int h, int leftEnd, int rightEnd, int topEnd, int bottomEnd, Color c) { if (w < leftEnd + rightEnd) w = leftEnd + rightEnd; if (h < topEnd + bottomEnd) h = topEnd + bottomEnd; sb.Draw(texture, new Rectangle(x, y, leftEnd, topEnd), new Rectangle?(new Rectangle(0, 0, leftEnd, topEnd)), c); sb.Draw(texture, new Rectangle(x + leftEnd, y, w - leftEnd - rightEnd, topEnd), new Rectangle?(new Rectangle(leftEnd, 0, texture.Width - leftEnd - rightEnd, topEnd)), c); sb.Draw(texture, new Rectangle(x + w - rightEnd, y, topEnd, rightEnd), new Rectangle?(new Rectangle(texture.Width - rightEnd, 0, rightEnd, topEnd)), c); sb.Draw(texture, new Rectangle(x, y + topEnd, leftEnd, h - topEnd - bottomEnd), new Rectangle?(new Rectangle(0, topEnd, leftEnd, texture.Height - topEnd - bottomEnd)), c); sb.Draw(texture, new Rectangle(x + leftEnd, y + topEnd, w - leftEnd - rightEnd, h - topEnd - bottomEnd), new Rectangle?(new Rectangle(leftEnd, topEnd, texture.Width - leftEnd - rightEnd, texture.Height - topEnd - bottomEnd)), c); sb.Draw(texture, new Rectangle(x + w - rightEnd, y + topEnd, rightEnd, h - topEnd - bottomEnd), new Rectangle?(new Rectangle(texture.Width - rightEnd, topEnd, rightEnd, texture.Height - topEnd - bottomEnd)), c); sb.Draw(texture, new Rectangle(x, y + h - bottomEnd, leftEnd, bottomEnd), new Rectangle?(new Rectangle(0, texture.Height - bottomEnd, leftEnd, bottomEnd)), c); sb.Draw(texture, new Rectangle(x + leftEnd, y + h - bottomEnd, w - leftEnd - rightEnd, bottomEnd), new Rectangle?(new Rectangle(leftEnd, texture.Height - bottomEnd, texture.Width - leftEnd - rightEnd, bottomEnd)), c); sb.Draw(texture, new Rectangle(x + w - rightEnd, y + h - bottomEnd, rightEnd, bottomEnd), new Rectangle?(new Rectangle(texture.Width - rightEnd, texture.Height - bottomEnd, rightEnd, bottomEnd)), c); } public static void DrawSettingsPanel( SpriteBatch spriteBatch, Vector2 position, float width, Color color) { Utils.DrawPanel(TextureAssets.SettingsPanel.Value, 2, 0, spriteBatch, position, width, color); } public static void DrawSettings2Panel( SpriteBatch spriteBatch, Vector2 position, float width, Color color) { Utils.DrawPanel(TextureAssets.SettingsPanel.Value, 2, 0, spriteBatch, position, width, color); } public static void DrawPanel( Texture2D texture, int edgeWidth, int edgeShove, SpriteBatch spriteBatch, Vector2 position, float width, Color color) { spriteBatch.Draw(texture, position, new Rectangle?(new Rectangle(0, 0, edgeWidth, texture.Height)), color); spriteBatch.Draw(texture, new Vector2(position.X + (float) edgeWidth, position.Y), new Rectangle?(new Rectangle(edgeWidth + edgeShove, 0, texture.Width - (edgeWidth + edgeShove) * 2, texture.Height)), color, 0.0f, Vector2.Zero, new Vector2((width - (float) (edgeWidth * 2)) / (float) (texture.Width - (edgeWidth + edgeShove) * 2), 1f), SpriteEffects.None, 0.0f); spriteBatch.Draw(texture, new Vector2(position.X + width - (float) edgeWidth, position.Y), new Rectangle?(new Rectangle(texture.Width - edgeWidth, 0, edgeWidth, texture.Height)), color); } public static void DrawRectangle( SpriteBatch sb, Vector2 start, Vector2 end, Color colorStart, Color colorEnd, float width) { Utils.DrawLine(sb, start, new Vector2(start.X, end.Y), colorStart, colorEnd, width); Utils.DrawLine(sb, start, new Vector2(end.X, start.Y), colorStart, colorEnd, width); Utils.DrawLine(sb, end, new Vector2(start.X, end.Y), colorStart, colorEnd, width); Utils.DrawLine(sb, end, new Vector2(end.X, start.Y), colorStart, colorEnd, width); } public static void DrawLaser( SpriteBatch sb, Texture2D tex, Vector2 start, Vector2 end, Vector2 scale, Utils.LaserLineFraming framing) { Vector2 vector2_1 = start; Vector2 vector2_2 = Vector2.Normalize(end - start); float distanceLeft1 = (end - start).Length(); float rotation = vector2_2.ToRotation() - 1.570796f; if (vector2_2.HasNaNs()) return; float distanceCovered; Rectangle frame; Vector2 origin; Color color; framing(0, vector2_1, distanceLeft1, new Rectangle(), out distanceCovered, out frame, out origin, out color); sb.Draw(tex, vector2_1, new Rectangle?(frame), color, rotation, frame.Size() / 2f, scale, SpriteEffects.None, 0.0f); float distanceLeft2 = distanceLeft1 - distanceCovered * scale.Y; Vector2 vector2_3 = vector2_1 + vector2_2 * ((float) frame.Height - origin.Y) * scale.Y; if ((double) distanceLeft2 > 0.0) { float num = 0.0f; while ((double) num + 1.0 < (double) distanceLeft2) { framing(1, vector2_3, distanceLeft2 - num, frame, out distanceCovered, out frame, out origin, out color); if ((double) distanceLeft2 - (double) num < (double) frame.Height) { distanceCovered *= (distanceLeft2 - num) / (float) frame.Height; frame.Height = (int) ((double) distanceLeft2 - (double) num); } sb.Draw(tex, vector2_3, new Rectangle?(frame), color, rotation, origin, scale, SpriteEffects.None, 0.0f); num += distanceCovered * scale.Y; vector2_3 += vector2_2 * distanceCovered * scale.Y; } } framing(2, vector2_3, distanceLeft2, new Rectangle(), out distanceCovered, out frame, out origin, out color); sb.Draw(tex, vector2_3, new Rectangle?(frame), color, rotation, origin, scale, SpriteEffects.None, 0.0f); } public static void DrawLine(SpriteBatch spriteBatch, Point start, Point end, Color color) => Utils.DrawLine(spriteBatch, new Vector2((float) (start.X << 4), (float) (start.Y << 4)), new Vector2((float) (end.X << 4), (float) (end.Y << 4)), color); public static void DrawLine(SpriteBatch spriteBatch, Vector2 start, Vector2 end, Color color) { float num1 = Vector2.Distance(start, end); Vector2 v = (end - start) / num1; Vector2 vector2 = start; Vector2 screenPosition = Main.screenPosition; float rotation = v.ToRotation(); for (float num2 = 0.0f; (double) num2 <= (double) num1; num2 += 4f) { float num3 = num2 / num1; spriteBatch.Draw(TextureAssets.BlackTile.Value, vector2 - screenPosition, new Rectangle?(), new Color(new Vector4(num3, num3, num3, 1f) * color.ToVector4()), rotation, Vector2.Zero, 0.25f, SpriteEffects.None, 0.0f); vector2 = start + num2 * v; } } public static void DrawLine( SpriteBatch spriteBatch, Vector2 start, Vector2 end, Color colorStart, Color colorEnd, float width) { float num1 = Vector2.Distance(start, end); Vector2 v = (end - start) / num1; Vector2 vector2 = start; Vector2 screenPosition = Main.screenPosition; float rotation = v.ToRotation(); float scale = width / 16f; for (float num2 = 0.0f; (double) num2 <= (double) num1; num2 += width) { float amount = num2 / num1; spriteBatch.Draw(TextureAssets.BlackTile.Value, vector2 - screenPosition, new Rectangle?(), Color.Lerp(colorStart, colorEnd, amount), rotation, Vector2.Zero, scale, SpriteEffects.None, 0.0f); vector2 = start + num2 * v; } } public static void DrawRectForTilesInWorld( SpriteBatch spriteBatch, Rectangle rect, Color color) { Utils.DrawRectForTilesInWorld(spriteBatch, new Point(rect.X, rect.Y), new Point(rect.X + rect.Width, rect.Y + rect.Height), color); } public static void DrawRectForTilesInWorld( SpriteBatch spriteBatch, Point start, Point end, Color color) { Utils.DrawRect(spriteBatch, new Vector2((float) (start.X << 4), (float) (start.Y << 4)), new Vector2((float) ((end.X << 4) - 4), (float) ((end.Y << 4) - 4)), color); } public static void DrawRect(SpriteBatch spriteBatch, Rectangle rect, Color color) => Utils.DrawRect(spriteBatch, new Vector2((float) rect.X, (float) rect.Y), new Vector2((float) (rect.X + rect.Width), (float) (rect.Y + rect.Height)), color); public static void DrawRect(SpriteBatch spriteBatch, Vector2 start, Vector2 end, Color color) { Utils.DrawLine(spriteBatch, start, new Vector2(start.X, end.Y), color); Utils.DrawLine(spriteBatch, start, new Vector2(end.X, start.Y), color); Utils.DrawLine(spriteBatch, end, new Vector2(start.X, end.Y), color); Utils.DrawLine(spriteBatch, end, new Vector2(end.X, start.Y), color); } public static void DrawRect( SpriteBatch spriteBatch, Vector2 topLeft, Vector2 topRight, Vector2 bottomRight, Vector2 bottomLeft, Color color) { Utils.DrawLine(spriteBatch, topLeft, topRight, color); Utils.DrawLine(spriteBatch, topRight, bottomRight, color); Utils.DrawLine(spriteBatch, bottomRight, bottomLeft, color); Utils.DrawLine(spriteBatch, bottomLeft, topLeft, color); } public static void DrawCursorSingle( SpriteBatch sb, Color color, float rot = float.NaN, float scale = 1f, Vector2 manualPosition = default (Vector2), int cursorSlot = 0, int specialMode = 0) { bool flag1 = false; bool flag2 = true; bool flag3 = true; Vector2 origin = Vector2.Zero; Vector2 vector2_1 = new Vector2((float) Main.mouseX, (float) Main.mouseY); if (manualPosition != Vector2.Zero) vector2_1 = manualPosition; if (float.IsNaN(rot)) { rot = 0.0f; } else { flag1 = true; rot -= 2.356194f; } if (cursorSlot == 4 || cursorSlot == 5) { flag2 = false; origin = new Vector2(8f); if (flag1 && specialMode == 0) { float num1 = rot; if ((double) num1 < 0.0) num1 += 6.283185f; for (float num2 = 0.0f; (double) num2 < 4.0; ++num2) { if ((double) Math.Abs(num1 - 1.570796f * num2) <= 0.785398185253143) { rot = 1.570796f * num2; break; } } } } Vector2 vector2_2 = Vector2.One; if (Main.ThickMouse && cursorSlot == 0 || cursorSlot == 1) vector2_2 = Main.DrawThickCursor(cursorSlot == 1); if (flag2) sb.Draw(TextureAssets.Cursors[cursorSlot].Value, vector2_1 + vector2_2 + Vector2.One, new Rectangle?(), color.MultiplyRGB(new Color(0.2f, 0.2f, 0.2f, 0.5f)), rot, origin, scale * 1.1f, SpriteEffects.None, 0.0f); if (!flag3) return; sb.Draw(TextureAssets.Cursors[cursorSlot].Value, vector2_1 + vector2_2, new Rectangle?(), color, rot, origin, scale, SpriteEffects.None, 0.0f); } public delegate bool TileActionAttempt(int x, int y); public delegate void LaserLineFraming( int stage, Vector2 currentPosition, float distanceLeft, Rectangle lastFrame, out float distanceCovered, out Rectangle frame, out Vector2 origin, out Color color); public delegate Color ColorLerpMethod(float percent); } }