diff --git a/Novetus/NovetusCore/NovetusCore.projitems b/Novetus/NovetusCore/NovetusCore.projitems index 6f9a110..3f36769 100644 --- a/Novetus/NovetusCore/NovetusCore.projitems +++ b/Novetus/NovetusCore/NovetusCore.projitems @@ -27,7 +27,6 @@ - Component diff --git a/Novetus/NovetusCore/StorageAndFunctions/GlobalFuncs.cs b/Novetus/NovetusCore/StorageAndFunctions/GlobalFuncs.cs index f9f5c65..da9f46e 100644 --- a/Novetus/NovetusCore/StorageAndFunctions/GlobalFuncs.cs +++ b/Novetus/NovetusCore/StorageAndFunctions/GlobalFuncs.cs @@ -2375,5 +2375,23 @@ public class GlobalFuncs return false; } + + public static bool IsIPValid(string IP) + { + IPAddress address; + if (IPAddress.TryParse(IP, out address)) + { + switch (address.AddressFamily) + { + case System.Net.Sockets.AddressFamily.InterNetwork: + return true; + case System.Net.Sockets.AddressFamily.InterNetworkV6: + default: + break; + } + } + + return false; + } } #endregion diff --git a/Novetus/NovetusCore/StorageAndFunctions/SecurityFuncs.cs b/Novetus/NovetusCore/StorageAndFunctions/SecurityFuncs.cs index 887d526..bc64ef6 100644 --- a/Novetus/NovetusCore/StorageAndFunctions/SecurityFuncs.cs +++ b/Novetus/NovetusCore/StorageAndFunctions/SecurityFuncs.cs @@ -253,16 +253,8 @@ public class SecurityFuncs try { - string url = "http://checkip.dyndns.org"; - WebRequest req = WebRequest.Create(url); - WebResponse resp = req.GetResponse(); - StreamReader sr = new StreamReader(resp.GetResponseStream()); - string response = sr.ReadToEnd().Trim(); - string[] a = response.Split(':'); - string a2 = a[1].Substring(1); - string[] a3 = a2.Split('<'); - ipAddress = a3[0]; - } + ipAddress = new WebClient().DownloadString("https://ipv4.icanhazip.com/").TrimEnd(); + } #if URI || LAUNCHER || CMD catch (Exception ex) { diff --git a/Novetus/NovetusCore/StorageAndFunctions/VarStorage.cs b/Novetus/NovetusCore/StorageAndFunctions/VarStorage.cs deleted file mode 100644 index 3b43b9b..0000000 --- a/Novetus/NovetusCore/StorageAndFunctions/VarStorage.cs +++ /dev/null @@ -1,92 +0,0 @@ -#region Usings -using System; -using System.Drawing; -using System.Net.NetworkInformation; -using System.Net.Sockets; -#endregion - -#region Variable Storage -public class VarStorage -{ - #region Asset Cache Definition - public class AssetCacheDef - { - public AssetCacheDef(string clas, string[] id, string[] ext, - string[] dir, string[] gamedir) - { - Class = clas; - Id = id; - Ext = ext; - Dir = dir; - GameDir = gamedir; - } - - public string Class { get; set; } - public string[] Id { get; set; } - public string[] Ext { get; set; } - public string[] Dir { get; set; } - public string[] GameDir { get; set; } - } - #endregion - - #region Game Server Definition - public class GameServer - { - public GameServer(string name, string ip, string port, string client) - { - ServerName = SecurityFuncs.Base64DecodeOld(name); - ServerIP = SecurityFuncs.Base64DecodeOld(ip); - ServerPort = Convert.ToInt32(SecurityFuncs.Base64DecodeOld(port)); - ServerClient = SecurityFuncs.Base64DecodeOld(client); - ServerStatus = PingServer(ServerIP, ServerPort); - } - - public bool IsValid() - { - if (!string.IsNullOrWhiteSpace(ServerName) && - !string.IsNullOrWhiteSpace(ServerClient) && - !string.IsNullOrWhiteSpace(ServerIP) && - !string.IsNullOrWhiteSpace(ServerPort.ToString()) && - GlobalFuncs.IsClientValid(ServerClient) && - (!ServerIP.Equals("localhost") || !ServerIP.Equals("127.0.0.1")) && - !GetStatusString().Equals("Offline")) - { - return true; - } - else - { - return false; - } - } - - //Modified from https://stackoverflow.com/questions/22903861/how-to-check-remote-ip-and-port-is-available - public static bool PingServer(string hostUri, int portNumber) - { - try - { - using (var client = new UdpClient(hostUri, portNumber)) - return true; - } - catch (SocketException ex) - { -#if URI || LAUNCHER || CMD - GlobalFuncs.LogExceptions(ex); -#endif - return false; - } - } - - public string GetStatusString() - { - return (ServerStatus ? "Online" : "Offline"); - } - - public string ServerName { get; set; } - public string ServerIP { get; set; } - public int ServerPort { get; set; } - public string ServerClient { get; set; } - public bool ServerStatus { get; set; } - } - #endregion -} -#endregion diff --git a/Novetus/NovetusLauncher/Classes/Launcher/GameServer.cs b/Novetus/NovetusLauncher/Classes/Launcher/GameServer.cs new file mode 100644 index 0000000..8c47961 --- /dev/null +++ b/Novetus/NovetusLauncher/Classes/Launcher/GameServer.cs @@ -0,0 +1,65 @@ +#region Usings +using System; +using System.Net.Sockets; +#endregion + +#region Game Server Definition +public class GameServer +{ + public GameServer(string name, string ip, string port, string client) + { + ServerName = SecurityFuncs.Base64DecodeOld(name); + ServerIP = SecurityFuncs.Base64DecodeOld(ip); + ServerPort = Convert.ToInt32(SecurityFuncs.Base64DecodeOld(port)); + ServerClient = SecurityFuncs.Base64DecodeOld(client); + ServerStatus = PingServer(ServerIP, ServerPort); + } + + public bool IsValid() + { + if (!string.IsNullOrWhiteSpace(ServerName) && + !string.IsNullOrWhiteSpace(ServerClient) && + !string.IsNullOrWhiteSpace(ServerIP) && + !string.IsNullOrWhiteSpace(ServerPort.ToString()) && + GlobalFuncs.IsClientValid(ServerClient) && + GlobalFuncs.IsIPValid(ServerIP) && + (!ServerIP.Equals("localhost") || !ServerIP.Equals("127.0.0.1")) && + !GetStatusString().Equals("Offline")) + { + return true; + } + else + { + return false; + } + } + + //Modified from https://stackoverflow.com/questions/22903861/how-to-check-remote-ip-and-port-is-available + public static bool PingServer(string hostUri, int portNumber) + { + try + { + using (var client = new UdpClient(hostUri, portNumber)) + return true; + } + catch (SocketException ex) + { +#if URI || LAUNCHER || CMD + GlobalFuncs.LogExceptions(ex); +#endif + return false; + } + } + + public string GetStatusString() + { + return (ServerStatus ? "Online" : "Offline"); + } + + public string ServerName { get; set; } + public string ServerIP { get; set; } + public int ServerPort { get; set; } + public string ServerClient { get; set; } + public bool ServerStatus { get; set; } +} +#endregion diff --git a/Novetus/NovetusLauncher/Classes/SDK/ROBLOXHelpers.cs b/Novetus/NovetusLauncher/Classes/SDK/ROBLOXHelpers.cs index a439787..b2dbe6e 100644 --- a/Novetus/NovetusLauncher/Classes/SDK/ROBLOXHelpers.cs +++ b/Novetus/NovetusLauncher/Classes/SDK/ROBLOXHelpers.cs @@ -33,14 +33,35 @@ public enum RobloxFileType } #endregion +#region Asset Cache Definition +public class AssetCacheDef +{ + public AssetCacheDef(string clas, string[] id, string[] ext, + string[] dir, string[] gamedir) + { + Class = clas; + Id = id; + Ext = ext; + Dir = dir; + GameDir = gamedir; + } + + public string Class { get; set; } + public string[] Id { get; set; } + public string[] Ext { get; set; } + public string[] Dir { get; set; } + public string[] GameDir { get; set; } +} +#endregion + #region Roblox Type Definitions public struct RobloxDefs { - public static VarStorage.AssetCacheDef Fonts + public static AssetCacheDef Fonts { get { - return new VarStorage.AssetCacheDef("SpecialMesh", + return new AssetCacheDef("SpecialMesh", new string[] { "MeshId", "TextureId" }, new string[] { ".mesh", ".png" }, new string[] { GlobalPaths.AssetCacheDirFonts, GlobalPaths.AssetCacheDirTextures }, @@ -48,11 +69,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef Sky + public static AssetCacheDef Sky { get { - return new VarStorage.AssetCacheDef("Sky", + return new AssetCacheDef("Sky", new string[] { "SkyboxBk", "SkyboxDn", "SkyboxFt", "SkyboxLf", "SkyboxRt", "SkyboxUp" }, new string[] { ".png" }, new string[] { GlobalPaths.AssetCacheDirSky }, @@ -60,11 +81,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef Decal + public static AssetCacheDef Decal { get { - return new VarStorage.AssetCacheDef("Decal", + return new AssetCacheDef("Decal", new string[] { "Texture" }, new string[] { ".png" }, new string[] { GlobalPaths.AssetCacheDirTextures }, @@ -72,11 +93,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef Texture + public static AssetCacheDef Texture { get { - return new VarStorage.AssetCacheDef("Texture", + return new AssetCacheDef("Texture", new string[] { "Texture" }, new string[] { ".png" }, new string[] { GlobalPaths.AssetCacheDirTextures }, @@ -84,11 +105,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef HopperBin + public static AssetCacheDef HopperBin { get { - return new VarStorage.AssetCacheDef("HopperBin", + return new AssetCacheDef("HopperBin", new string[] { "TextureId" }, new string[] { ".png" }, new string[] { GlobalPaths.AssetCacheDirTextures }, @@ -96,11 +117,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef Tool + public static AssetCacheDef Tool { get { - return new VarStorage.AssetCacheDef("Tool", + return new AssetCacheDef("Tool", new string[] { "TextureId" }, new string[] { ".png" }, new string[] { GlobalPaths.AssetCacheDirTextures }, @@ -108,11 +129,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef Sound + public static AssetCacheDef Sound { get { - return new VarStorage.AssetCacheDef("Sound", + return new AssetCacheDef("Sound", new string[] { "SoundId" }, new string[] { ".wav" }, new string[] { GlobalPaths.AssetCacheDirSounds }, @@ -120,11 +141,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ImageLabel + public static AssetCacheDef ImageLabel { get { - return new VarStorage.AssetCacheDef("ImageLabel", + return new AssetCacheDef("ImageLabel", new string[] { "Image" }, new string[] { ".png" }, new string[] { GlobalPaths.AssetCacheDirTextures }, @@ -132,11 +153,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef Shirt + public static AssetCacheDef Shirt { get { - return new VarStorage.AssetCacheDef("Shirt", + return new AssetCacheDef("Shirt", new string[] { "ShirtTemplate" }, new string[] { ".png" }, new string[] { GlobalPaths.AssetCacheDirTextures }, @@ -144,11 +165,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ShirtGraphic + public static AssetCacheDef ShirtGraphic { get { - return new VarStorage.AssetCacheDef("ShirtGraphic", + return new AssetCacheDef("ShirtGraphic", new string[] { "Graphic" }, new string[] { ".png" }, new string[] { GlobalPaths.AssetCacheDirTextures }, @@ -156,11 +177,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef Pants + public static AssetCacheDef Pants { get { - return new VarStorage.AssetCacheDef("Pants", + return new AssetCacheDef("Pants", new string[] { "PantsTemplate" }, new string[] { ".png" }, new string[] { GlobalPaths.AssetCacheDirTextures }, @@ -168,11 +189,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef Script + public static AssetCacheDef Script { get { - return new VarStorage.AssetCacheDef("Script", + return new AssetCacheDef("Script", new string[] { "LinkedSource" }, new string[] { ".lua" }, new string[] { GlobalPaths.AssetCacheDirScripts }, @@ -180,11 +201,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef LocalScript + public static AssetCacheDef LocalScript { get { - return new VarStorage.AssetCacheDef("LocalScript", + return new AssetCacheDef("LocalScript", new string[] { "LinkedSource" }, new string[] { ".lua" }, new string[] { GlobalPaths.AssetCacheDirScripts }, @@ -193,11 +214,11 @@ public struct RobloxDefs } //item defs below - public static VarStorage.AssetCacheDef ItemHatFonts + public static AssetCacheDef ItemHatFonts { get { - return new VarStorage.AssetCacheDef("SpecialMesh", + return new AssetCacheDef("SpecialMesh", new string[] { "MeshId", "TextureId" }, new string[] { ".mesh", ".png" }, new string[] { GlobalPaths.hatdirFonts, GlobalPaths.hatdirTextures }, @@ -205,11 +226,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ItemHatSound + public static AssetCacheDef ItemHatSound { get { - return new VarStorage.AssetCacheDef("Sound", + return new AssetCacheDef("Sound", new string[] { "SoundId" }, new string[] { ".wav" }, new string[] { GlobalPaths.hatdirSounds }, @@ -217,11 +238,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ItemHatScript + public static AssetCacheDef ItemHatScript { get { - return new VarStorage.AssetCacheDef("Script", + return new AssetCacheDef("Script", new string[] { "LinkedSource" }, new string[] { ".lua" }, new string[] { GlobalPaths.hatdirScripts }, @@ -229,11 +250,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ItemHatLocalScript + public static AssetCacheDef ItemHatLocalScript { get { - return new VarStorage.AssetCacheDef("LocalScript", + return new AssetCacheDef("LocalScript", new string[] { "LinkedSource" }, new string[] { ".lua" }, new string[] { GlobalPaths.hatdirScripts }, @@ -241,11 +262,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ItemHeadFonts + public static AssetCacheDef ItemHeadFonts { get { - return new VarStorage.AssetCacheDef("SpecialMesh", + return new AssetCacheDef("SpecialMesh", new string[] { "MeshId", "TextureId" }, new string[] { ".mesh", ".png" }, new string[] { GlobalPaths.headdirFonts, GlobalPaths.headdirTextures }, @@ -253,11 +274,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ItemFaceTexture + public static AssetCacheDef ItemFaceTexture { get { - return new VarStorage.AssetCacheDef("Decal", + return new AssetCacheDef("Decal", new string[] { "Texture" }, new string[] { ".png" }, new string[] { GlobalPaths.facedirTextures }, @@ -265,11 +286,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ItemShirtTexture + public static AssetCacheDef ItemShirtTexture { get { - return new VarStorage.AssetCacheDef("Shirt", + return new AssetCacheDef("Shirt", new string[] { "ShirtTemplate" }, new string[] { ".png" }, new string[] { GlobalPaths.shirtdirTextures }, @@ -277,11 +298,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ItemTShirtTexture + public static AssetCacheDef ItemTShirtTexture { get { - return new VarStorage.AssetCacheDef("ShirtGraphic", + return new AssetCacheDef("ShirtGraphic", new string[] { "Graphic" }, new string[] { ".png" }, new string[] { GlobalPaths.tshirtdirTextures }, @@ -289,11 +310,11 @@ public struct RobloxDefs } } - public static VarStorage.AssetCacheDef ItemPantsTexture + public static AssetCacheDef ItemPantsTexture { get { - return new VarStorage.AssetCacheDef("Pants", + return new AssetCacheDef("Pants", new string[] { "PantsTemplate" }, new string[] { ".png" }, new string[] { GlobalPaths.pantsdirTextures }, diff --git a/Novetus/NovetusLauncher/Forms/SDK/AssetSDK.cs b/Novetus/NovetusLauncher/Forms/SDK/AssetSDK.cs index 96e6969..a8e1128 100644 --- a/Novetus/NovetusLauncher/Forms/SDK/AssetSDK.cs +++ b/Novetus/NovetusLauncher/Forms/SDK/AssetSDK.cs @@ -330,12 +330,12 @@ public partial class AssetSDK : Form } } - public static void DownloadFromNodes(XDocument doc, VarStorage.AssetCacheDef assetdef, string name = "", string meshname = "") + public static void DownloadFromNodes(XDocument doc, AssetCacheDef assetdef, string name = "", string meshname = "") { DownloadFromNodes(doc, assetdef.Class, assetdef.Id[0], assetdef.Ext[0], assetdef.Dir[0], assetdef.GameDir[0], name, meshname); } - public static void DownloadFromNodes(XDocument doc, VarStorage.AssetCacheDef assetdef, int idIndex, int extIndex, int outputPathIndex, int inGameDirIndex, string name = "", string meshname = "") + public static void DownloadFromNodes(XDocument doc, AssetCacheDef assetdef, int idIndex, int extIndex, int outputPathIndex, int inGameDirIndex, string name = "", string meshname = "") { DownloadFromNodes(doc, assetdef.Class, assetdef.Id[idIndex], assetdef.Ext[extIndex], assetdef.Dir[outputPathIndex], assetdef.GameDir[inGameDirIndex], name, meshname); } diff --git a/Novetus/NovetusLauncher/Forms/SDK/ItemCreationSDK.cs b/Novetus/NovetusLauncher/Forms/SDK/ItemCreationSDK.cs index 9ed3264..e578d21 100644 --- a/Novetus/NovetusLauncher/Forms/SDK/ItemCreationSDK.cs +++ b/Novetus/NovetusLauncher/Forms/SDK/ItemCreationSDK.cs @@ -406,7 +406,7 @@ public partial class ItemCreationSDK : Form #region Functions #region XML Editing/Fetching - public static void SetItemFontVals(XDocument doc, VarStorage.AssetCacheDef assetdef, int idIndex, int outputPathIndex, int inGameDirIndex, string assetpath, string assetfilename) + public static void SetItemFontVals(XDocument doc, AssetCacheDef assetdef, int idIndex, int outputPathIndex, int inGameDirIndex, string assetpath, string assetfilename) { SetItemFontVals(doc, assetdef.Class, assetdef.Id[idIndex], assetdef.Dir[outputPathIndex], assetdef.GameDir[inGameDirIndex], assetpath, assetfilename); } @@ -440,7 +440,7 @@ public partial class ItemCreationSDK : Form } } - public static void SetItemFontValEmpty(XDocument doc, VarStorage.AssetCacheDef assetdef, int idIndex) + public static void SetItemFontValEmpty(XDocument doc, AssetCacheDef assetdef, int idIndex) { var v = from nodes in doc.Descendants("Item") where nodes.Attribute("class").Value == assetdef.Class @@ -465,7 +465,7 @@ public partial class ItemCreationSDK : Form } } - public static string GetItemFontVals(XDocument doc, VarStorage.AssetCacheDef assetdef, int idIndex) + public static string GetItemFontVals(XDocument doc, AssetCacheDef assetdef, int idIndex) { return GetItemFontVals(doc, assetdef.Class, assetdef.Id[idIndex]); } @@ -497,7 +497,7 @@ public partial class ItemCreationSDK : Form return ""; } - public static void SetItemCoordVals(XDocument doc, VarStorage.AssetCacheDef assetdef, Vector3 coord, string CoordClass, string CoordName) + public static void SetItemCoordVals(XDocument doc, AssetCacheDef assetdef, Vector3 coord, string CoordClass, string CoordName) { SetItemCoordVals(doc, assetdef.Class, coord, CoordClass, CoordName); } @@ -556,7 +556,7 @@ public partial class ItemCreationSDK : Form } } - public static string GetItemCoordVals(XDocument doc, VarStorage.AssetCacheDef assetdef, string CoordClass, string CoordName) + public static string GetItemCoordVals(XDocument doc, AssetCacheDef assetdef, string CoordClass, string CoordName) { return GetItemCoordVals(doc, assetdef.Class, CoordClass, CoordName); } @@ -619,7 +619,7 @@ public partial class ItemCreationSDK : Form return coord; } - public static void SetItemRotationVals(XDocument doc, VarStorage.AssetCacheDef assetdef, Vector3 right, Vector3 up, Vector3 forward, string CoordClass, string CoordName) + public static void SetItemRotationVals(XDocument doc, AssetCacheDef assetdef, Vector3 right, Vector3 up, Vector3 forward, string CoordClass, string CoordName) { SetItemRotationVals(doc, assetdef.Class, right, up, forward, CoordClass, CoordName); } @@ -726,7 +726,7 @@ public partial class ItemCreationSDK : Form } } - public static string GetItemRotationVals(XDocument doc, VarStorage.AssetCacheDef assetdef, string CoordClass, string CoordName) + public static string GetItemRotationVals(XDocument doc, AssetCacheDef assetdef, string CoordClass, string CoordName) { return GetItemRotationVals(doc, assetdef.Class, CoordClass, CoordName); } diff --git a/Novetus/NovetusLauncher/Forms/ServerBrowser.cs b/Novetus/NovetusLauncher/Forms/ServerBrowser.cs index 22e1d98..8933f06 100644 --- a/Novetus/NovetusLauncher/Forms/ServerBrowser.cs +++ b/Novetus/NovetusLauncher/Forms/ServerBrowser.cs @@ -16,8 +16,8 @@ namespace NovetusLauncher public partial class ServerBrowser : Form { #region Private Variables - List serverList = new List(); - private VarStorage.GameServer selectedServer; + List serverList = new List(); + private GameServer selectedServer; private string oldIP; private int oldPort; #endregion @@ -136,8 +136,11 @@ namespace NovetusLauncher { string DecodedLine = SecurityFuncs.Base64DecodeOld(line); string[] serverInfo = DecodedLine.Split('|'); - VarStorage.GameServer gameServer = new VarStorage.GameServer(serverInfo[0], serverInfo[1], serverInfo[2], serverInfo[3]); - serverList.Add(gameServer); + GameServer gameServer = new GameServer(serverInfo[0], serverInfo[1], serverInfo[2], serverInfo[3]); + if (gameServer.IsValid()) + { + serverList.Add(gameServer); + } } } } @@ -181,9 +184,6 @@ namespace NovetusLauncher foreach (var server in serverList) { - if (!server.IsValid()) - continue; - var serverItem = new ListViewItem(server.ServerName); var serverClient = new ListViewItem.ListViewSubItem(serverItem, server.ServerClient); diff --git a/Novetus/NovetusLauncher/Novetus.Launcher.csproj b/Novetus/NovetusLauncher/Novetus.Launcher.csproj index f59b100..6db0286 100644 --- a/Novetus/NovetusLauncher/Novetus.Launcher.csproj +++ b/Novetus/NovetusLauncher/Novetus.Launcher.csproj @@ -158,6 +158,7 @@ CharacterCustomizationExtended.cs + diff --git a/changelog.txt b/changelog.txt index ced8587..77638ad 100644 --- a/changelog.txt +++ b/changelog.txt @@ -52,6 +52,7 @@ Changes from Pre-Release 5: - Server hosters may now insert a "SkipSecurity" object into Lighting that will skip security. SkipSecurity may also be removed to re-enable security. - Increased the speed of loading outfits in 2011 clients. - Fixed issues with launching Novetus from itch.io. +- The server browser now pings the server and shows the current server status. Changes from 1.2.4.1: - The OBJ2MeshV1GUI, The Asset Localizer, and the Item SDK have been merged to form the Asset SDK! - Works with the Roblox Asset Delivery API! Note: Script assets wil have to be downloaded manually in order to be used in scripts.