Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Diagnostics;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace URWSSSelector
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- ReadWriteMem RWMain;
- Process URW;
- public bool Active = false;
- public bool MoveLocation = false;
- public RECT WindowRect;
- Rectangle GameRect = new Rectangle();
- byte[] LoadedMap;
- private Rectangle GameMap;
- Point ClosestLand = new Point(0, 0);
- private int[] TileIDFilter = new[] { 180, 181, 182, 183, 177, 244, 247, 178 };
- public TileSearchSettings TSS = new TileSearchSettings();
- private Dictionary<int, string> TileNames = new Dictionary<int, string>();
- private Dictionary<int, List<Point>> TileLocations = new Dictionary<int, List<Point>>();
- string GameTitle = "";
- Point MouseLocation;
- int[] HighCountTiles = new int[] { 3, 15, 180, 181, 233, 235, 236, 238, 247 };
- int[] LowCountTiles = new int[] { 16, 20, 30, 31, 46, 47, 60, 86, 91, 93, 94, 176, 210, 211, 228, 237, 239, 250, 251 };
- const int DWMWA_EXTENDED_FRAME_BOUNDS = 9;
- [DllImport("dwmapi.dll")]
- static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out RECT pvAttribute, int cbAttribute);
- [DllImport("user32.dll", SetLastError = true)]
- static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
- [DllImport("user32.dll")]
- public static extern IntPtr GetForegroundWindow();
- [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
- static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, int wParam, IntPtr lParam);
- [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
- static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, int wParam, string lParam);
- [DllImport("user32.dll")]
- static extern bool SetForegroundWindow(IntPtr hWnd);
- [StructLayout(LayoutKind.Sequential)]
- public struct RECT
- {
- public int Left; // x position of upper-left corner
- public int Top; // y position of upper-left corner
- public int Right; // x position of lower-right corner
- public int Bottom; // y position of lower-right corner
- }
- Point StartLocation
- {
- get
- {
- return new Point(RWMain.Read<int>((int)Address.XStart), RWMain.Read<int>((int)Address.YStart));
- }
- set
- {
- RWMain.Write((int)Address.XStart, value.X);
- RWMain.Write((int)Address.YStart, value.Y);
- }
- }
- byte[] MapIDArray
- {
- get
- {
- return RWMain.Read<byte[]>((int)Address.MapTileIDArray, 6293502);
- }
- set
- {
- RWMain.Write((int)Address.MapTileIDArray, value);
- }
- }
- private void LoadTileNames()
- {
- TileNames.Add(3, "Lichenous pine forest");
- TileNames.Add(15, "Coniferous forest");
- TileNames.Add(16, "Grove");
- TileNames.Add(20, "High cliff");
- TileNames.Add(30, "Camp");
- TileNames.Add(31, "Shelter");
- TileNames.Add(46, "Road");
- TileNames.Add(47, "Pasture");
- TileNames.Add(60, "Cave");
- TileNames.Add(86, "Settlement");
- TileNames.Add(91, "Hill");
- TileNames.Add(93, "Cliff");
- TileNames.Add(94, "Mountain");
- TileNames.Add(176, "Ford");
- TileNames.Add(177, "Rapids");
- TileNames.Add(178, "River");
- TileNames.Add(180, "Sea");
- TileNames.Add(181, "Shallow Sea");
- TileNames.Add(182, "Deep Water");
- TileNames.Add(183, "Shallow Water");
- TileNames.Add(210, "Fortified village");
- TileNames.Add(211, "Settlement");
- TileNames.Add(228, "Thicket");
- TileNames.Add(233, "Open mire");
- TileNames.Add(235, "Spruce mire");
- TileNames.Add(236, "Pine mire");
- TileNames.Add(237, "Bushes");
- TileNames.Add(238, "Heathland");
- TileNames.Add(239, "Village");
- TileNames.Add(244, "Water");
- TileNames.Add(247, "Water");
- TileNames.Add(250, "Ground");
- TileNames.Add(251, "Field");
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- try
- {
- URW = Process.GetProcessesByName("urw")[0];
- RWMain = new ReadWriteMem(URW);
- TSS.URW = URW;
- string VersionInfo = VersionCheck();
- if (VersionInfo.Length > 0) { MessageBox.Show(VersionInfo); Environment.Exit(0); }
- new Thread(WindowThread) { IsBackground = true }.Start();
- LoadedMap = MapIDArray;
- LoadTileNames();
- if (LoadedMap[0] == 0)
- {
- MessageBox.Show("Map has not been generated. Exiting.");
- Environment.Exit(0);
- }
- SetForegroundWindow(URW.MainWindowHandle);
- this.MouseWheel += Form1_MouseWheel;
- }
- catch
- {
- MessageBox.Show("Unreal world not found running. Closing URWSSSelector.");
- Environment.Exit(0);
- }
- foreach (int i in LowCountTiles)
- {
- TileLocations.Add(i, new List<Point>());
- }
- for (int i = 0; i < LoadedMap.Length; i++)
- {
- if (LowCountTiles.Contains(LoadedMap[i]))
- {
- TileLocations[LoadedMap[i]].Add(new Point((i % 3073), (i / 3073)));
- }
- }
- //MessageBox.Show(TileLocations.Keys.Count().ToString());
- TSS.CalculateMode();
- }
- private string VersionCheck()
- {
- FileVersionInfo Info = URW.MainModule.FileVersionInfo;
- string Folder = Info.FileName.Substring(0, Info.FileName.Length - 8);
- List<string> Lines = new List<string>();
- Lines.AddRange(File.ReadAllLines(Folder + "\\news.txt"));
- for (int i = 0; i < Lines.Count; i++)
- {
- if (Lines[i].ToLower().Contains("3.63") && i < 10)
- {
- return "";
- }
- }
- return "Game version mismatch, please check thread on official forum for updates.";
- }
- private Rectangle GetMap()
- {
- Bitmap bmpScreen = new Bitmap(GameRect.Width, GameRect.Height);
- Point TopLeft = new Point(0, 0);
- Point BottomRight = new Point(0, 0);
- using (Graphics g = Graphics.FromImage(bmpScreen))
- {
- g.CopyFromScreen(GameRect.Location, new Point(0,0), GameRect.Size, CopyPixelOperation.SourceCopy);
- }
- for (int x = 0; x < bmpScreen.Width; x++)
- {
- for (int y = 0; y < bmpScreen.Height; y++)
- {
- Color Pixel = bmpScreen.GetPixel(x, y);
- if (Pixel.B > 190 && Pixel.R < 20 && Pixel.G < 30)
- {
- if (TopLeft.X == 0) { TopLeft = new Point(x, y); }
- else { BottomRight = new Point(x, y); }
- }
- }
- }
- MoveLocation = true;
- return new Rectangle(TopLeft, new Size(BottomRight.X - TopLeft.X, BottomRight.Y - TopLeft.Y));
- }
- private Point GetMouseXYMap(MouseEventArgs e)
- {
- int X = 0, Y = 0;
- if (GameMap.Width > 0)
- {
- X = (int)((e.X - GameMap.X) * (3073m / GameMap.Width));
- Y = (int)((e.Y - GameMap.Y) * (2049m / GameMap.Height));
- if (MoveLocation)
- {
- if (X < 48) { X = 48; }
- if (X > 3024) { X = 3024; }
- if (Y < 48) { Y = 48; }
- if (Y > 2000) { Y = 2000; }
- int LocationIndex = (Y * 3073) + X;
- if (!TileIDFilter.Contains((int)LoadedMap[LocationIndex]) && TSS.Mode == 0)
- {
- StartLocation = new Point(X, Y);
- GameTitle = string.Format("UnReal World - Closest Land, X: {0} - Y: {1}, {2}", X, Y, TileNames[(int)LoadedMap[LocationIndex]]);
- }
- else // find nearest landmass
- {
- //ClosestLand = StartLocation;
- Point OldCursorDistance = new Point(9999,9999);
- Point NewCursorDistance = new Point(9999,9999);
- int SearchCount = 0;
- if (TSS.TileIDs.Count > 0)
- {
- foreach (int i in TSS.TileIDs)
- {
- if (TileLocations.ContainsKey(i))
- {
- if (SearchCount < 100000)
- {
- SearchCount += TileLocations[i].Count();
- }
- else break;
- }
- }
- }
- if (SearchCount > 0 && SearchCount < 100000 && TSS.TileIDs.Count > 0) // Search sorted tiles
- {
- foreach (int ID in TSS.TileIDs) // Search each tile ID
- {
- if (!TileIDFilter.Contains(ID)) // Filter unwanted tile arrays
- {
- foreach (Point P in TileLocations[ID]) // Compare each tiles X/Y
- {
- if (P.X > 48 && P.X < 3024 && P.Y > 48 && P.Y < 2000) // Tile within map bounds
- {
- NewCursorDistance.X = Math.Abs(P.X - X); NewCursorDistance.Y = Math.Abs(P.Y - Y);
- //OldCursorDistance.X = Math.Abs(ClosestLand.X - X); OldCursorDistance.Y = Math.Abs(ClosestLand.Y - Y);
- if (OldCursorDistance.X + OldCursorDistance.Y > NewCursorDistance.X + NewCursorDistance.Y)
- {
- OldCursorDistance = NewCursorDistance;
- ClosestLand.X = P.X; ClosestLand.Y = P.Y;//new Point(XSearch, YSearch);
- StartLocation = ClosestLand;
- GameTitle = string.Format("UnReal World - {3}, X: {0} - Y: {1}, {2}", ClosestLand.X, ClosestLand.Y, TileNames[ID], TSS.ModeText);
- }
- }
- }
- }
- }
- }
- else // Search by radius
- {
- for (int XSearch = X - TSS.SearchRadius; XSearch < X + TSS.SearchRadius; XSearch++)
- {
- for (int YSearch = Y - TSS.SearchRadius; YSearch < Y + TSS.SearchRadius; YSearch++)
- {
- int SearchIndex = (YSearch * 3073) + XSearch;
- if (SearchIndex > 0 && SearchIndex < LoadedMap.Length)
- {
- if (!TileIDFilter.Contains((int)LoadedMap[SearchIndex]))
- {
- if (XSearch > 48 && XSearch < 3024 && YSearch > 48 && YSearch < 2000)
- {
- if (TSS.Mode == 0)// Default mode
- {
- //OldCursorDistance.X = Math.Abs(ClosestLand.X - X); OldCursorDistance.Y = Math.Abs(ClosestLand.Y - Y);
- NewCursorDistance.X = Math.Abs(XSearch - X); NewCursorDistance.Y = Math.Abs(YSearch - Y);
- if (OldCursorDistance.X + OldCursorDistance.Y > NewCursorDistance.X + NewCursorDistance.Y)
- {
- OldCursorDistance = NewCursorDistance;
- ClosestLand.X = XSearch; ClosestLand.Y = YSearch;// = new Point(XSearch, YSearch);
- StartLocation = ClosestLand;
- GameTitle = string.Format("UnReal World - Closest Land, X: {0} - Y: {1}, {2}", ClosestLand.X, ClosestLand.Y, TileNames[(int)LoadedMap[SearchIndex]]);
- }
- }
- else if (TSS.Mode != 0 && TSS.TileIDs.Count > 0) // Additional modes
- {
- if (TSS.TileIDs.Contains((int)LoadedMap[SearchIndex]))
- {
- //OldCursorDistance.X = Math.Abs(ClosestLand.X - X); OldCursorDistance.Y = Math.Abs(ClosestLand.Y - Y);
- NewCursorDistance.X = Math.Abs(XSearch - X); NewCursorDistance.Y = Math.Abs(YSearch - Y);
- if (OldCursorDistance.X + OldCursorDistance.Y > NewCursorDistance.X + NewCursorDistance.Y)
- {
- OldCursorDistance = NewCursorDistance;
- ClosestLand.X = XSearch; ClosestLand.Y = YSearch;//new Point(XSearch, YSearch);
- StartLocation = ClosestLand;
- GameTitle = string.Format("UnReal World - {3}, X: {0} - Y: {1}, {2}", ClosestLand.X, ClosestLand.Y, TileNames[(int)LoadedMap[SearchIndex]], TSS.ModeText);
- }
- }
- }
- }
- }
- }
- }
- }
- }
- //if (ClosestLand.X + ClosestLand.Y > 0) { StartLocation = ClosestLand; }
- }
- SendMessage(URW.MainWindowHandle, 0x000C, 0, GameTitle);
- SendMessage(URW.MainWindowHandle, 0x0102, '-', IntPtr.Zero);
- }
- }
- return new Point(X, Y);
- }
- private void WindowThread()
- {
- IntPtr ThisHandle = IntPtr.Zero;
- this.Invoke(new Action(() => ThisHandle = this.Handle));
- while (Thread.CurrentThread.IsAlive)
- {
- if (DwmGetWindowAttribute(RWMain.TargetProcess.MainWindowHandle, DWMWA_EXTENDED_FRAME_BOUNDS, out WindowRect, Marshal.SizeOf(typeof(RECT))) != 0)
- {
- GetWindowRect(RWMain.TargetProcess.MainWindowHandle, out WindowRect);
- }
- GameRect = new Rectangle(new Point(WindowRect.Left, WindowRect.Top), new Size(WindowRect.Right - WindowRect.Left, WindowRect.Bottom - WindowRect.Top));
- this.Invoke(new Action(() => this.Location = GameRect.Location));
- this.Invoke(new Action(() => this.Size = GameRect.Size));
- if (GetForegroundWindow() != RWMain.TargetProcess.MainWindowHandle && GetForegroundWindow() != ThisHandle)
- {
- this.Invoke(new Action(() => this.Visible = false));
- }
- else if (GetForegroundWindow() == RWMain.TargetProcess.MainWindowHandle)
- {
- this.Invoke(new Action(() => this.Visible = true));
- }
- if (GameMap.Width <= 0)
- {
- GameMap = GetMap();
- }
- Thread.Sleep(10);
- }
- }
- private int CountTile(int ID)
- {
- int i = 0;
- int TileCount = 0;
- while (i < LoadedMap.Length)
- {
- if (LoadedMap[i] == ID)
- {
- TileCount++;
- }
- i++;
- }
- return TileCount;
- }
- private void Form1_MouseMove(object sender, MouseEventArgs e)
- {
- if (MouseLocation != e.Location)
- {
- MouseLocation = e.Location;
- GetMouseXYMap(e);
- }
- }
- private void Form1_MouseDown(object sender, MouseEventArgs e)
- {
- if (e.Button == MouseButtons.Right)
- {
- SendMessage(URW.MainWindowHandle, 0x000C, 0, "UnReal World");
- Environment.Exit(0);
- }
- else if (e.Button == MouseButtons.Middle && TSS.Mode == 3)
- {
- TSS.OpenList();
- }
- else if(e.Button == MouseButtons.Left)
- {
- }
- }
- private void Form1_MouseWheel(object sender, MouseEventArgs e)
- {
- if (e.Delta < 0)
- {
- if (TSS.Mode == 0) { TSS.Mode = 5; }
- else { TSS.Mode -= 1; }
- }
- else
- {
- if (TSS.Mode == 5) { TSS.Mode = 0; }
- else { TSS.Mode += 1; }
- }
- ClosestLand = new Point(-1000, -1000);
- TSS.CalculateMode();
- GetMouseXYMap(e);
- }
- private void Form1_FormClosing(object sender, FormClosingEventArgs e)
- {
- SendMessage(URW.MainWindowHandle, 0x000C, 0, "UnReal World");
- }
- }
- public class TileSearchSettings
- {
- public int Mode = 0;
- public int SearchRadius = 200;
- public List<int> TileIDs = new List<int>();
- private TileChecklist TCL;
- public Process URW;
- public string ModeText = "";
- public TileSearchSettings()
- {
- TCL = new TileChecklist(this)
- {
- Opacity = 1,
- Enabled = true
- };
- }
- public void CalculateMode()
- {
- TileIDs.Clear();
- if (TCL.Visible) { TCL.Hide(); }
- switch (Mode)
- {
- case 0: // Default, closest land
- SearchRadius = 200;
- break;
- case 1: // Closest village or settlement
- ModeText = "Closest Village/Settlement";
- SearchRadius = 200;
- TileIDs.AddRange(new int[] { 239, 211, 86 });
- break;
- case 2: // Closest cave
- ModeText = "Closest cave";
- SearchRadius = 200;
- TileIDs.Add(60);
- break;
- case 3: // Custom
- ModeText = "Custom";
- SearchRadius = 200;
- TileIDs = TCL.GetCheckedIDs();
- if (TileIDs.Count == 0) { OpenList(); }
- break;
- case 4: // High ground
- ModeText = "High ground";
- SearchRadius = 200;
- TileIDs.AddRange(new int[] { 94, 93, 91, 60, 20 });
- break;
- case 5: // Dense Forests
- ModeText = "Dense Forests";
- SearchRadius = 200;
- TileIDs.AddRange(new int[] { 3, 15 });
- break;
- case 6:
- break;
- case 7:
- break;
- default:
- break;
- }
- }
- public void OpenList()
- {
- TCL.ShowDialog();
- }
- }
- public static class Extensions
- {
- public static string ReplaceModifiedString(this string s)
- {
- return s.Replace('Σ', 'ä').Replace('Ø', '¥').Replace('─', 'Ä').Replace('÷', 'ö');
- }
- }
- public class ReadWriteMem
- {
- [DllImport("Kernel32.dll")]
- private static extern bool ReadProcessMemory(IntPtr hProcess, int BaseAddress, byte[] Buffer, int Size, ref int NumberOfBytesRead);
- [DllImport("Kernel32.dll")]
- private static extern bool WriteProcessMemory(IntPtr hProcess, int BaseAddress, byte[] Buffer, int Size, ref int NumberOfBytesWritten);
- private Process Proc;
- public Process TargetProcess
- {
- get { return Proc; }
- set { Proc = value; }
- }
- public IntPtr WindowHandle = IntPtr.Zero;
- public int ProcBaseAddress = 0;
- public const int VersionOffset = 0x0000;
- public ReadWriteMem(Process T)
- {
- TargetProcess = T;
- ProcBaseAddress = T.MainModule.BaseAddress.ToInt32();
- WindowHandle = T.Handle;
- }
- public bool Write(int BaseAddress, dynamic obj, byte pb = 1)
- {
- byte[] Buffer = BitConverter.GetBytes(obj);
- int BytesWritten = 0;
- if (Buffer.Length == 2 && Buffer[1] == 0) { WriteProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, new byte[] { (byte)obj }, 1, ref BytesWritten); }
- else { WriteProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, Buffer.Length, ref BytesWritten); }
- switch (BytesWritten)
- {
- case 0: return false;
- default: return true;
- }
- }
- public bool Write(int BaseAddress, byte[] Buffer, byte pb = 1)
- {
- int BytesWritten = 0;
- WriteProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, Buffer.Length, ref BytesWritten);
- switch (BytesWritten)
- {
- case 0: return false;
- default: return true;
- }
- }
- public bool Write(int BaseAddress, string Text, byte pb = 1)
- {
- byte[] Buffer = Encoding.GetEncoding("IBM865").GetBytes(Text.ReplaceModifiedString());
- int BytesWritten = 0;
- WriteProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, Buffer.Length, ref BytesWritten);
- switch (BytesWritten)
- {
- case 0: return false;
- default: return true;
- }
- }
- public T Read<T>(int BaseAddress, byte pb = 1)
- {
- byte[] Buffer;
- int BytesRead = 0;
- switch (Type.GetTypeCode(typeof(T)))
- {
- case TypeCode.Byte:
- Buffer = new byte[1];
- ReadProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, 1, ref BytesRead);
- return (T)Convert.ChangeType(Buffer[0], typeof(T));
- case TypeCode.Int16:
- Buffer = new byte[2];
- ReadProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, 2, ref BytesRead);
- return (T)Convert.ChangeType(BitConverter.ToUInt16(Buffer, 0), typeof(T));
- case TypeCode.Int32:
- Buffer = new byte[4];
- ReadProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, 4, ref BytesRead);
- return (T)Convert.ChangeType(BitConverter.ToUInt32(Buffer, 0), typeof(T));
- case TypeCode.UInt32:
- Buffer = new byte[4];
- ReadProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, 4, ref BytesRead);
- return (T)Convert.ChangeType(BitConverter.ToUInt32(Buffer, 0), typeof(T));
- case TypeCode.Single:
- Buffer = new byte[4];
- ReadProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, 4, ref BytesRead);
- return (T)Convert.ChangeType(BitConverter.ToSingle(Buffer, 0), typeof(T));
- default:
- return (T)Convert.ChangeType(false, typeof(T));
- }
- }
- public T Read<T>(int BaseAddress, int Length, byte pb = 1)
- {
- byte[] Buffer;
- int BytesRead = 0;
- switch (Type.GetTypeCode(typeof(T)))
- {
- case TypeCode.Object:
- Buffer = new byte[Length];
- ReadProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, Length, ref BytesRead);
- return (T)Convert.ChangeType(Buffer, typeof(T));
- case TypeCode.String:
- Buffer = new byte[Length];
- ReadProcessMemory(Proc.Handle, (pb * ProcBaseAddress) + BaseAddress + VersionOffset, Buffer, Length, ref BytesRead);
- return (T)Convert.ChangeType(Encoding.GetEncoding("IBM865").GetString(Buffer, 0, Buffer.Length).Split(new char[] { '\0' })[0].ReplaceModifiedString(), typeof(T));
- default:
- return (T)Convert.ChangeType(false, typeof(T));
- }
- }
- }
- public enum Address
- {
- MapTileIDArray = 0x8C6928,
- XStart = 0x1B4BA0,
- YStart = 0x1B4BA4
- }
- }
- namespace URWSSSelector
- {
- public partial class TileChecklist : Form
- {
- public TileChecklist(TileSearchSettings TSS)
- {
- InitializeComponent();
- SearchSettings = TSS;
- }
- TileSearchSettings SearchSettings;
- private void TileChecklist_Load(object sender, EventArgs e)
- {
- }
- public List<int> GetCheckedIDs()
- {
- List<int> Return = new List<int>();
- for (int i = 0; i < cbList.CheckedItems.Count; i++)
- {
- int TileID = int.Parse(cbList.CheckedItems[i].ToString().Split(' ')[0]);
- Return.Add(TileID);
- }
- return Return;
- }
- private void cbList_ItemCheck(object sender, ItemCheckEventArgs e)
- {
- if (e.NewValue == CheckState.Checked)
- {
- SearchSettings.TileIDs.Add(int.Parse(cbList.Items[e.Index].ToString().Split(' ')[0]));
- }
- else if (e.NewValue == CheckState.Unchecked)
- {
- SearchSettings.TileIDs.Remove(int.Parse(cbList.Items[e.Index].ToString().Split(' ')[0]));
- }
- }
- private void TileChecklist_FormClosing(object sender, FormClosingEventArgs e)
- {
- if (SearchSettings.TileIDs.Count == 0)
- {
- SearchSettings.TileIDs = GetCheckedIDs();
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement