diff --git a/BackendServices/AuxiliaryServices/HomeTools/HomeTools.csproj b/BackendServices/AuxiliaryServices/HomeTools/HomeTools.csproj index ebf2c6b46..35bc6d058 100644 --- a/BackendServices/AuxiliaryServices/HomeTools/HomeTools.csproj +++ b/BackendServices/AuxiliaryServices/HomeTools/HomeTools.csproj @@ -1,8 +1,9 @@ - netstandard2.1 + net6.0 enable + true false diff --git a/BackendServices/AuxiliaryServices/HomeTools/UnBAR/LegacyMapper.cs b/BackendServices/AuxiliaryServices/HomeTools/UnBAR/LegacyMapper.cs index 9775f99b2..b66f4056a 100644 --- a/BackendServices/AuxiliaryServices/HomeTools/UnBAR/LegacyMapper.cs +++ b/BackendServices/AuxiliaryServices/HomeTools/UnBAR/LegacyMapper.cs @@ -25,10 +25,10 @@ public Task MapperStart(string foldertomap, string? helperfolder, string prefix, if (string.IsNullOrEmpty(prefix)) { -#if NETSTANDARD2_1_OR_GREATER - Match match = new Regex(@"[0-9a-fA-F]{8}-[0-9a-fA-F]{8}-[0-9a-fA-F]{8}-[0-9a-fA-F]{8}").Match(foldertomap); -#elif NET7_0_OR_GREATER +#if NET7_0_OR_GREATER Match match = UUIDRegex().Match(foldertomap); +#else + Match match = new Regex(@"[0-9a-fA-F]{8}-[0-9a-fA-F]{8}-[0-9a-fA-F]{8}-[0-9a-fA-F]{8}").Match(foldertomap); #endif if (match.Success) prefix = $"objects/{match.Groups[0].Value}/"; @@ -85,7 +85,7 @@ public Task MapperStart(string foldertomap, string? helperfolder, string prefix, { if (File.Exists(Path.Combine(foldertomap, file.Name))) { - new FileInfo(Path.Combine(foldertomap, text).ToUpper()).Directory.Create(); + new FileInfo(Path.Combine(foldertomap, text).ToUpper()).Directory?.Create(); if (!File.Exists(Path.Combine(foldertomap, text.ToUpper()))) { File.Move(Path.Combine(foldertomap, file.Name), Path.Combine(foldertomap, text.ToUpper())); @@ -104,7 +104,7 @@ public Task MapperStart(string foldertomap, string? helperfolder, string prefix, { if (File.Exists(Path.Combine(foldertomap, file.Name))) { - new FileInfo(Path.Combine(foldertomap, cdatafromatmos).ToUpper()).Directory.Create(); + new FileInfo(Path.Combine(foldertomap, cdatafromatmos).ToUpper()).Directory?.Create(); if (!File.Exists(Path.Combine(foldertomap, cdatafromatmos.ToUpper()))) { File.Move(Path.Combine(foldertomap, file.Name), Path.Combine(foldertomap, cdatafromatmos.ToUpper())); @@ -270,23 +270,25 @@ private void CopyFiles(string sourceDir, string targetDir) Directory.CreateDirectory(targetDir); // Get all files in the source directory and its subdirectories - string[] files = Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories); - - foreach (string file in files) + foreach (string file in Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories)) { filePathList.Add(file); try { string targetPath = Path.Combine(targetDir, Path.GetRelativePath(sourceDir, file)); + string? directorytargetPath = Path.GetDirectoryName(targetPath); - // Create the directory structure in the target directory if it doesn't exist - Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); + if (!string.IsNullOrEmpty(directorytargetPath)) + { + // Create the directory structure in the target directory if it doesn't exist + Directory.CreateDirectory(directorytargetPath); - // Copy the file to the target directory - File.Copy(file, targetPath, true); // Use true to overwrite existing files + // Copy the file to the target directory + File.Copy(file, targetPath, true); // Use true to overwrite existing files + } } - catch (Exception) + catch { // Not Important. } diff --git a/BackendServices/AuxiliaryServices/WebAPIService/CDS/CTRExploitProcess.cs b/BackendServices/AuxiliaryServices/WebAPIService/CDS/CTRExploitProcess.cs index ba380a0ba..b82503bbe 100644 --- a/BackendServices/AuxiliaryServices/WebAPIService/CDS/CTRExploitProcess.cs +++ b/BackendServices/AuxiliaryServices/WebAPIService/CDS/CTRExploitProcess.cs @@ -132,7 +132,7 @@ public class CTRExploitProcess { byte[]? TestFileBytes = LIBSECURE.InitiateBlowfishBuffer(EncryptedFileBytes, ToolsImpl.DefaultKey, GuessedIV, "CTR"); - if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindbyteSequence(TestFileBytes, new byte[] { 0xAD, 0xEF, 0x17, 0xE1, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 })) + if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindBytePattern(TestFileBytes, new byte[] { 0xAD, 0xEF, 0x17, 0xE1, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 }) != -1) { CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Valid File was bruteforced! - {0}", DateTime.Now.ToString()); CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Found IV - {0}", DataTypesUtils.ByteArrayToHexString(GuessedIV)); @@ -145,7 +145,7 @@ public class CTRExploitProcess { TestFileBytes = LIBSECURE.InitiateBlowfishBuffer(EncryptedFileBytes, ToolsImpl.DefaultKey, GuessedIV, "CTR"); - if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindbyteSequence(TestFileBytes, new byte[] { 0xE1, 0x17, 0xEF, 0xAD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 })) + if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindBytePattern(TestFileBytes, new byte[] { 0xE1, 0x17, 0xEF, 0xAD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 }) != -1) { CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Valid File was bruteforced! - {0}", DateTime.Now.ToString()); CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Found IV - {0}", DataTypesUtils.ByteArrayToHexString(GuessedIV)); @@ -158,7 +158,7 @@ public class CTRExploitProcess { TestFileBytes = LIBSECURE.InitiateBlowfishBuffer(EncryptedFileBytes, ToolsImpl.DefaultKey, GuessedIV, "CTR"); - if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindbyteSequence(TestFileBytes, new byte[] { 0xAD, 0xEF, 0x17, 0xE1, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 })) + if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindBytePattern(TestFileBytes, new byte[] { 0xAD, 0xEF, 0x17, 0xE1, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 }) != 1) { CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Valid File was bruteforced! - {0}", DateTime.Now.ToString()); CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Found IV - {0}", DataTypesUtils.ByteArrayToHexString(GuessedIV)); @@ -171,7 +171,7 @@ public class CTRExploitProcess { TestFileBytes = LIBSECURE.InitiateBlowfishBuffer(EncryptedFileBytes, ToolsImpl.DefaultKey, GuessedIV, "CTR"); - if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindbyteSequence(TestFileBytes, new byte[] { 0xE1, 0x17, 0xEF, 0xAD, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 })) + if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindBytePattern(TestFileBytes, new byte[] { 0xE1, 0x17, 0xEF, 0xAD, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 }) != -1) { CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Valid File was bruteforced! - {0}", DateTime.Now.ToString()); CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Found IV - {0}", DataTypesUtils.ByteArrayToHexString(GuessedIV)); @@ -184,7 +184,7 @@ public class CTRExploitProcess { TestFileBytes = LIBSECURE.InitiateBlowfishBuffer(EncryptedFileBytes, ToolsImpl.DefaultKey, GuessedIV, "CTR"); - if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindbyteSequence(TestFileBytes, new byte[] { 0xE1, 0x17, 0xEF, 0xAD, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 })) + if (TestFileBytes != null && TestFileBytes.Length > 12 && DataTypesUtils.FindBytePattern(TestFileBytes, new byte[] { 0xE1, 0x17, 0xEF, 0xAD, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 }) != -1) { CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Valid File was bruteforced! - {0}", DateTime.Now.ToString()); CustomLogger.LoggerAccessor.LogInfo("[CDS] - CTRExploitProcess - Found IV - {0}", DataTypesUtils.ByteArrayToHexString(GuessedIV)); diff --git a/BackendServices/AuxiliaryServices/WebAPIService/HELLFIRE/Helpers/NPTicket.cs b/BackendServices/AuxiliaryServices/WebAPIService/HELLFIRE/Helpers/NPTicket.cs index 8c5c6f360..8536d3562 100644 --- a/BackendServices/AuxiliaryServices/WebAPIService/HELLFIRE/Helpers/NPTicket.cs +++ b/BackendServices/AuxiliaryServices/WebAPIService/HELLFIRE/Helpers/NPTicket.cs @@ -60,7 +60,7 @@ public class NPTicket extractedData[i] = 0x20; } - if (DataTypesUtils.FindbyteSequence(ticketData, new byte[] { 0x52, 0x50, 0x43, 0x4E })) + if (DataTypesUtils.FindBytePattern(ticketData, new byte[] { 0x52, 0x50, 0x43, 0x4E }) != -1) { LoggerAccessor.LogInfo($"[HFGames] : User {Encoding.ASCII.GetString(extractedData).Replace("H", string.Empty)} logged in and is on RPCN"); diff --git a/BackendServices/AuxiliaryServices/WebAPIService/OHS/Batch.cs b/BackendServices/AuxiliaryServices/WebAPIService/OHS/Batch.cs index e45aeac4d..e43942216 100644 --- a/BackendServices/AuxiliaryServices/WebAPIService/OHS/Batch.cs +++ b/BackendServices/AuxiliaryServices/WebAPIService/OHS/Batch.cs @@ -129,6 +129,9 @@ public class Batch case "usercounter/incrementmany/": resultfromcommand = UserCounter.Increment_Many(PostData, ContentType, directorypath, data, game); break; + case "usercounter/increment_setentry/": + resultfromcommand = UserCounter.IncrementSetEntry(PostData, ContentType, directorypath, data, game); + break; case "userinventory/addglobalitems/": resultfromcommand = UserInventory.AddGlobalItems(PostData, ContentType, directorypath + $"/{project}/", data, game); break; diff --git a/BackendServices/AuxiliaryServices/WebAPIService/OHS/JaminProcessor.cs b/BackendServices/AuxiliaryServices/WebAPIService/OHS/JaminProcessor.cs index 65ee34ed5..f573126af 100644 --- a/BackendServices/AuxiliaryServices/WebAPIService/OHS/JaminProcessor.cs +++ b/BackendServices/AuxiliaryServices/WebAPIService/OHS/JaminProcessor.cs @@ -11,7 +11,7 @@ public class JaminProcessor { public static bool VerifyHash(string str, string referencehash) { - if (EncryptDecrypt.Hash32Str(str) == referencehash.ToUpper()) + if (EncryptDecrypt.Hash32Str(str).Equals(referencehash, StringComparison.InvariantCultureIgnoreCase)) return true; return false; @@ -309,8 +309,8 @@ public static object[] ExecuteLuaScript(string luaScript) private static string ToLiteral(string input) { StringBuilder literal = new StringBuilder(input.Length + 2); - literal.Append("\""); - foreach (var c in input) + literal.Append('"'); + foreach (char c in input) { switch (c) { @@ -327,10 +327,8 @@ private static string ToLiteral(string input) default: // ASCII printable character if (c >= 0x20 && c <= 0x7e) - { literal.Append(c); // As UTF16 escaped character - } else { literal.Append(@"\u"); @@ -339,7 +337,7 @@ private static string ToLiteral(string input) break; } } - literal.Append("\""); + literal.Append('"'); return literal.ToString(); } } diff --git a/BackendServices/AuxiliaryServices/WebAPIService/OHS/Leaderboard.cs b/BackendServices/AuxiliaryServices/WebAPIService/OHS/Leaderboard.cs index 55cbebc7f..4d88692f0 100644 --- a/BackendServices/AuxiliaryServices/WebAPIService/OHS/Leaderboard.cs +++ b/BackendServices/AuxiliaryServices/WebAPIService/OHS/Leaderboard.cs @@ -8,6 +8,7 @@ using System.Text; using System.Text.RegularExpressions; using System; +using System.Linq; namespace WebAPIService.OHS { @@ -374,13 +375,16 @@ public static string UpdateScoreboard(string json, string nameToUpdate, int newS { foreach (var entry in entries) { - var rankData = new Dictionary - { - { "[\"user\"]", $"\"{entry.Name}\"" }, // Enclose string in double quotes and put it inside the brackets - { "[\"score\"]", $"\"{entry.Score}\"" } // For numbers, no need to enclose in quotes and put it inside the brackets - }; + if (!string.IsNullOrEmpty(entry.Name)) + { + var rankData = new Dictionary + { + { "[\"user\"]", $"\"{entry.Name}\"" }, // Enclose string in double quotes and put it inside the brackets + { "[\"score\"]", $"\"{entry.Score}\"" } // For numbers, no need to enclose in quotes and put it inside the brackets + }; - luaTable.Add(entry.Rank, rankData); + luaTable.Add(entry.Rank, rankData); + } } // Step 3: Format the Lua table as a string using regex @@ -421,7 +425,7 @@ public static string RequestByUsers(string? jsontable, string scoreboardpath) { StringBuilder? resultBuilder = new StringBuilder(); - foreach (string user in data.Users) + foreach (string user in data.Users.Where(user => !string.IsNullOrEmpty(user))) { string? scoreboarddata = File.ReadAllText(scoreboardfile); @@ -441,7 +445,7 @@ public static string RequestByUsers(string? jsontable, string scoreboardpath) { foreach (var entry in entries) { - if (entry.Name == user) + if (!string.IsNullOrEmpty(entry.Name) && entry.Name.Equals(user)) { if (entry.Score != 0) { @@ -492,7 +496,7 @@ public static string RequestByUsers(string? jsontable, string scoreboardpath) foreach (var entry in scoreentries) { - if (i >= 1) + if (i >= 1 && !string.IsNullOrEmpty(entry.Name)) { var rankData = new Dictionary { @@ -564,11 +568,7 @@ public static string RequestByUsers(string? jsontable, string scoreboardpath) string scoreboardfile = scoreboardpath + $"/scoreboard_{key}.json"; if (!File.Exists(scoreboardfile)) - { - Scoreboard? scoreboard = GenerateSampleScoreboard(numEntries); - File.WriteAllText(scoreboardfile, JsonConvert.SerializeObject(scoreboard, Formatting.Indented)); - scoreboard = null; - } + File.WriteAllText(scoreboardfile, JsonConvert.SerializeObject(GenerateSampleScoreboard(numEntries), Formatting.Indented)); scoreboardfile = File.ReadAllText(scoreboardfile); @@ -596,7 +596,7 @@ public static string RequestByUsers(string? jsontable, string scoreboardpath) foreach (var entry in entries) { - if (i >= start) + if (i >= start && !string.IsNullOrEmpty(entry.Name)) { var rankData = new Dictionary { @@ -632,15 +632,12 @@ public static string RequestByUsers(string? jsontable, string scoreboardpath) public static Scoreboard GenerateSampleScoreboard(int numEntries) { Scoreboard scoreboard = new Scoreboard(); - Random? random = new Random(); - scoreboard.Entries = new List(); + scoreboard.Entries = new List(numEntries); for (int i = 1; i <= numEntries; i++) { - string playerName = ScoreboardNameGenerator.GenerateRandomName(); - int score = random.Next(100, 1000); // Generate a random score between 100 and 999 - scoreboard.Entries.Add(new ScoreboardEntry { Name = playerName, Score = score }); + scoreboard.Entries.Add(new ScoreboardEntry { Name = string.Empty, Score = 0 }); } // Sort the entries by score in descending order @@ -652,8 +649,6 @@ public static Scoreboard GenerateSampleScoreboard(int numEntries) scoreboard.Entries[i].Rank = i + 1; } - random = null; - return scoreboard; } @@ -763,19 +758,6 @@ public override void WriteJson(JsonWriter writer, ScoreBoardUpdate? value, JsonS } } - public class ScoreboardNameGenerator - { - private static Random random = new Random(); - - // List of silly French-sounding words to be used in the names - private static string[] sillyFrenchWords = { "Croissant", "Baguette", "Fougasse", "TarteAuFromage", "Tabernack", "UnePetiteContine", "ChuckNorris", "Pamplemousse", "JimCarrey", "Fromage" }; - - public static string GenerateRandomName() - { - return sillyFrenchWords[random.Next(0, sillyFrenchWords.Length)]; - } - } - public class ScoreboardEntry { public string? Name { get; set; } diff --git a/BackendServices/AuxiliaryServices/WebAPIService/OHS/User.cs b/BackendServices/AuxiliaryServices/WebAPIService/OHS/User.cs index de8f7caef..cd29bf7b0 100644 --- a/BackendServices/AuxiliaryServices/WebAPIService/OHS/User.cs +++ b/BackendServices/AuxiliaryServices/WebAPIService/OHS/User.cs @@ -227,7 +227,7 @@ public class User // Check if the "key" property exists and if it is an object if (jsonObject.TryGetValue("key", out JToken? keyValueToken) && keyValueToken.Type == JTokenType.Object) // Convert the JToken to a Lua table-like string - output = JaminProcessor.ConvertJTokenToLuaTable(keyValueToken, false); + output = JaminProcessor.ConvertJTokenToLuaTable(keyValueToken, true); // Nested, because we expect the array instead. } } } @@ -245,7 +245,7 @@ public class User // Check if the "key" property exists and if it is an object if (jsonObject.TryGetValue("key", out JToken? keyValueToken) && keyValueToken.Type == JTokenType.Object) // Convert the JToken to a Lua table-like string - output = JaminProcessor.ConvertJTokenToLuaTable(keyValueToken, false); + output = JaminProcessor.ConvertJTokenToLuaTable(keyValueToken, true); // Nested, because we expect the array instead. } } } diff --git a/BackendServices/AuxiliaryServices/WebAPIService/OHS/UserCounter.cs b/BackendServices/AuxiliaryServices/WebAPIService/OHS/UserCounter.cs index fd1118dc4..9d94ac7c4 100644 --- a/BackendServices/AuxiliaryServices/WebAPIService/OHS/UserCounter.cs +++ b/BackendServices/AuxiliaryServices/WebAPIService/OHS/UserCounter.cs @@ -7,7 +7,6 @@ using Newtonsoft.Json.Linq; using Newtonsoft.Json; using CyberBackendLibrary.HTTP; -using System.Threading.Tasks; using System.Text; namespace WebAPIService.OHS @@ -135,7 +134,7 @@ public class UserCounter public static string? Increment(byte[] PostData, string ContentType, string directorypath, string batchparams, int game, bool v2) { string? dataforohs = null; - string? output = null; + (string?, string?)? output = null; if (string.IsNullOrEmpty(batchparams)) { @@ -183,28 +182,20 @@ public class UserCounter JToken? existingKey = jObjectFromFile.SelectToken($"$..{key}"); if (existingKey != null && existingKey.Type == JTokenType.Integer) - { // Increment the value of the existing key (assuming it's an integer) - int currentValue = existingKey.Value(); - int newValue = 0; - - // CurrentValue is stored file value already, value is the requested change. - if (currentValue > value) - newValue = currentValue - value; - else - newValue = currentValue + value; - - existingKey.Replace(newValue); - - // Set the output to the incremented value - output = existingKey.ToString(); - } - else + existingKey.Replace(existingKey.Value() + value); + else if (key != null) { + JToken? KeyEntry = jObjectFromFile["key"]; + existingKey = value; - output = existingKey.ToString(); + + if (KeyEntry != null) + KeyEntry[key] = existingKey; } + output = (key?.ToString(), existingKey?.ToString()); + File.WriteAllText(profileCurDataString, jObjectFromFile.ToString(Formatting.Indented)); } } @@ -226,7 +217,173 @@ public class UserCounter File.WriteAllText(profileCurDataString, JsonConvert.SerializeObject(newProfile)); // Set the output to incremented value - output = value.ToString(); + output = (keystring, value.ToString()); + } + } + } + catch (Exception ex) + { + LoggerAccessor.LogError($"[UserCounter] - Json Format Error - {ex}"); + } + } + } + + if (!string.IsNullOrEmpty(batchparams)) + { + if (output == null) + return "{ }"; + else + return v2 ? $"{{ [\"{output.Value.Item1}\"] = {output.Value.Item2} }}" : output.Value.Item2; + } + else + { + if (output == null) + dataforohs = JaminProcessor.JaminFormat("{ [\"status\"] = \"fail\" }", game); + else + dataforohs = JaminProcessor.JaminFormat($"{{ [\"status\"] = \"success\", [\"value\"] = {(v2 ? $"{{ [\"{output.Value.Item1}\"] = {output.Value.Item2} }}" : output.Value.Item2)} }}", game); + } + + return dataforohs; + } + + public static string? IncrementSetEntry(byte[] PostData, string ContentType, string directorypath, string batchparams, int game) + { + string? dataforohs = null; + string? output = null; + + if (string.IsNullOrEmpty(batchparams)) + { + string? boundary = HTTPProcessor.ExtractBoundary(ContentType); + + if (!string.IsNullOrEmpty(boundary)) + { + using (MemoryStream ms = new MemoryStream(PostData)) + { + var data = MultipartFormDataParser.Parse(ms, boundary); + LoggerAccessor.LogInfo($"[OHS] : Client Version - {data.GetParameterValue("version")}"); + dataforohs = JaminProcessor.JaminDeFormat(data.GetParameterValue("data"), true, game); + ms.Flush(); + } + } + } + else + dataforohs = batchparams; + + if (!string.IsNullOrEmpty(dataforohs)) + { + // Deserialize the JSON data into a JObject + JObject? jObject = JsonConvert.DeserializeObject(dataforohs); + + if (jObject != null) + { + string? counter_key = jObject.Value("counter_key"); + string? entry_project = jObject.Value("entry_project"); + string? entry_key = jObject.Value("entry_key"); + JObject? entry_value = jObject.Value("entry_value"); + string? counter_project = jObject.Value("counter_project"); + string? user = jObject.Value("user"); + int counter_value = jObject.Value("counter_value"); + + try + { + string CounterDataStringPath = directorypath + $"/{counter_project}/User_Profiles/{user}_Stats.json"; + string EntryDataStringPath = directorypath + $"/{entry_project}/User_Profiles/{user}.json"; + + // Step 1 : Update Counter + + if (File.Exists(CounterDataStringPath)) + { + JObject? jObjectFromFile = JObject.Parse(File.ReadAllText(CounterDataStringPath)); + + if (jObjectFromFile != null) + { + JToken? existingKey = jObjectFromFile.SelectToken($"$..{counter_key}"); + + if (existingKey != null && existingKey.Type == JTokenType.Integer) + // Increment the value of the existing key (assuming it's an integer) + existingKey.Replace(existingKey.Value() + counter_value); + else if (counter_key != null) + { + JToken? KeyEntry = jObjectFromFile["key"]; + + existingKey = counter_value; + + if (KeyEntry != null) + KeyEntry[counter_key] = existingKey; + } + + output = existingKey?.ToString(); + + File.WriteAllText(CounterDataStringPath, jObjectFromFile.ToString(Formatting.Indented)); + } + } + else if (counter_key != null) + { + string? keystring = counter_key; + + if (!string.IsNullOrEmpty(keystring) && user != null) + { + // Create a new profile with the key field and set it to 1 + var newProfile = new OHSUserProfile + { + user = user, + key = new JObject { { keystring, counter_value < 0 ? 0 : counter_value } } + }; + + Directory.CreateDirectory(directorypath + $"/{counter_project}/User_Profiles"); + + File.WriteAllText(CounterDataStringPath, JsonConvert.SerializeObject(newProfile)); + + // Set the output to incremented value + output = counter_value.ToString(); + } + } + + // Step 2 : Update User entry + + if (File.Exists(EntryDataStringPath)) + { + string profiledata = File.ReadAllText(EntryDataStringPath); + + if (!string.IsNullOrEmpty(profiledata)) + { + JObject? profilejObject = JObject.Parse(profiledata); + + if (profilejObject != null) + { + // Check if the key name already exists in the JSON + JToken? existingKey = profilejObject.DescendantsAndSelf().FirstOrDefault(t => t.Path == entry_key); + + if (existingKey != null && entry_value != null) + // Update the value of the existing key + existingKey.Replace(JToken.FromObject(entry_value)); + else if (entry_key != null && entry_value != null) + { + JToken? KeyEntry = profilejObject["key"]; + + if (KeyEntry != null) + // Step 2: Add a new entry to the "Key" object + KeyEntry[entry_key] = JToken.FromObject(entry_value); + } + + File.WriteAllText(EntryDataStringPath, profilejObject.ToString(Formatting.Indented)); + } + } + } + else if (entry_key != null) + { + string? keystring = entry_key; + + if (keystring != null && user != null && entry_value != null) + { + // Create a new profile with the key field + OHSUserProfile newProfile = new OHSUserProfile + { + user = user, + key = new JObject { { keystring, JToken.FromObject(entry_value) } } + }; + + File.WriteAllText(EntryDataStringPath, JsonConvert.SerializeObject(newProfile)); } } } @@ -242,14 +399,14 @@ public class UserCounter if (string.IsNullOrEmpty(output)) return "{ }"; else - return v2 ? $"{{ [\"sessionCount\"] = {output} }}" : output; + return output; } else { if (string.IsNullOrEmpty(output)) dataforohs = JaminProcessor.JaminFormat("{ [\"status\"] = \"fail\" }", game); else - dataforohs = JaminProcessor.JaminFormat($"{{ [\"status\"] = \"success\", [\"value\"] = {(v2 ? $"{{ [\"sessionCount\"] = {output} }}" : output)} }}", game); + dataforohs = JaminProcessor.JaminFormat($"{{ [\"status\"] = \"success\", [\"value\"] = {output} }}", game); } return dataforohs; @@ -300,7 +457,7 @@ public class UserCounter // Check if the "key" property exists and if it is an object if (jsonObject.TryGetValue("key", out JToken? keyValueToken) && keyValueToken.Type == JTokenType.Object) // Convert the JToken to a Lua table-like string - output = JaminProcessor.ConvertJTokenToLuaTable(keyValueToken, false); + output = JaminProcessor.ConvertJTokenToLuaTable(keyValueToken, true); // Nested, because we expect the array instead. } } } @@ -539,28 +696,21 @@ public class UserCounter JToken? existingKey = jObjectFromFile.SelectToken($"$..{keys[i]}"); if (existingKey != null && existingKey.Type == JTokenType.Integer) - { // Increment the value of the existing key (assuming it's an integer) - int currentValue = existingKey.Value(); - int newValue = 0; - - // CurrentValue is stored file value already, value is the requested change. - if (currentValue > values[i]) - newValue = currentValue - values[i]; - else - newValue = currentValue + values[i]; - - existingKey.Replace(newValue); - - // Set the output to the incremented value - IncrementResults.Add(keys[i], existingKey.ToString()); - } + existingKey.Replace(existingKey.Value() + values[i]); else { + JToken? KeyEntry = jObjectFromFile["key"]; + existingKey = values[i]; - IncrementResults.Add(keys[i], values[i].ToString()); + + if (KeyEntry != null) + KeyEntry[keys[i]] = existingKey; } + // Set the output to the incremented value + IncrementResults.Add(keys[i], existingKey.ToString()); + File.WriteAllText(profileCurDataString, jObjectFromFile.ToString(Formatting.Indented)); } } diff --git a/BackendServices/AuxiliaryServices/WebAPIService/WebAPIService.csproj b/BackendServices/AuxiliaryServices/WebAPIService/WebAPIService.csproj index 232fb878d..a20a79cc3 100644 --- a/BackendServices/AuxiliaryServices/WebAPIService/WebAPIService.csproj +++ b/BackendServices/AuxiliaryServices/WebAPIService/WebAPIService.csproj @@ -1,15 +1,16 @@ - netstandard2.1 + net6.0 enable + true false - + diff --git a/BackendServices/CastleLibrary/CastleLibrary.csproj b/BackendServices/CastleLibrary/CastleLibrary.csproj index a43b15433..0a425e101 100644 --- a/BackendServices/CastleLibrary/CastleLibrary.csproj +++ b/BackendServices/CastleLibrary/CastleLibrary.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net6.0 + net6.0 $(NoWarn);CP0003 @@ -16,6 +16,7 @@ False True + true false diff --git a/BackendServices/CavemanTcp/CavemanTcp.csproj b/BackendServices/CavemanTcp/CavemanTcp.csproj index 3f0305f02..faa426070 100644 --- a/BackendServices/CavemanTcp/CavemanTcp.csproj +++ b/BackendServices/CavemanTcp/CavemanTcp.csproj @@ -1,7 +1,7 @@  - netstandard2.1;net6.0 + net6.0 2.0.2 Joel Christner CavemanTcp is a simple TCP client and server providing easy integration and full control over network reads and writes, allowing you to build your own state machines with ease. @@ -14,6 +14,7 @@ Add permitted, blocked IPs CavemanTcp CavemanTcp + true false diff --git a/BackendServices/CompressionLibrary/CompressionLibrary.csproj b/BackendServices/CompressionLibrary/CompressionLibrary.csproj index 0f168d042..8023cc385 100644 --- a/BackendServices/CompressionLibrary/CompressionLibrary.csproj +++ b/BackendServices/CompressionLibrary/CompressionLibrary.csproj @@ -1,7 +1,8 @@ - netstandard2.0 + net6.0 + true false diff --git a/BackendServices/CompressionLibrary/Ionic.Exploration/ParallelGZipOutputStream.cs b/BackendServices/CompressionLibrary/Ionic.Exploration/ParallelGZipOutputStream.cs new file mode 100644 index 000000000..740f0e957 --- /dev/null +++ b/BackendServices/CompressionLibrary/Ionic.Exploration/ParallelGZipOutputStream.cs @@ -0,0 +1,1353 @@ +//#define Trace + +// ParallelGZipOutputStream.cs +// ------------------------------------------------------------------ +// +// A GzipStream that does compression only, and only in output. It uses a +// divide-and-conquer approach with multiple threads to exploit multiple +// CPUs for the DEFLATE computation. +// +// Last Saved: <2011-July-11 14:36:48> +// ------------------------------------------------------------------ +// +// Copyright (c) 2009-2011 by Dino Chiesa +// All rights reserved! +// +// ------------------------------------------------------------------ +// +// compile: c:\.net4.0\csc.exe /t:module /R:Ionic.Zip.dll @@ORIG@@ +// flymake: c:\.net4.0\csc.exe /t:module /R:Ionic.Zip.dll @@FILE@@ +// + +using System; +using System.Collections.Concurrent; +using System.Threading.Tasks; +using System.Threading; +using Ionic.Zlib; +using System.IO; + + +namespace Ionic.Exploration +{ + internal class WorkItem + { + public byte[] buffer; + public byte[] compressed; + public int crc; + public int index; + public int ordinal; + public int inputBytesAvailable; + public int compressedBytesAvailable; + + public ZlibCodec compressor; + + public WorkItem(int size, + CompressionLevel compressLevel, + CompressionStrategy strategy) + { + buffer= new byte[size]; + // alloc 5 bytes overhead for every block (margin of safety= 2) + int n = size + ((size / 32768)+1) * 5 * 2; + compressed = new byte[n]; + + compressor = new ZlibCodec(); + compressor.InitializeDeflate(compressLevel, false); + compressor.OutputBuffer = compressed; + compressor.InputBuffer = buffer; + } + } + + /// + /// A class for compressing and decompressing streams using the + /// Deflate algorithm with multiple threads. + /// + /// + /// + /// + /// This class is for compression only, and that can be only + /// through writing. + /// + /// + /// + /// For more information on the Deflate algorithm, see IETF RFC 1952, + /// "GZIP file format specification version 4.3" http://tools.ietf.org/html/rfc1952 + /// + /// + /// + /// This class is similar to , except that this + /// implementation uses an approach that employs multiple worker threads + /// to perform the compression. On a multi-cpu or multi-core computer, + /// the performance of this class can be significantly higher than the + /// single-threaded DeflateStream, particularly for larger streams. How + /// large? In my experience, Anything over 10mb is a good candidate for parallel + /// compression. + /// + /// + /// + /// The tradeoff is that this class uses more memory and more CPU than the + /// vanilla DeflateStream, and also is slightly less efficient as a compressor. For + /// large files the size of the compressed data stream can be less than 1% + /// larger than the size of a compressed data stream from the vanialla + /// DeflateStream. For smaller files the difference can be larger. The + /// difference will also be larger if you set the BufferSize to be lower + /// than the default value. Your mileage may vary. Finally, for small + /// files, the ParallelGZipOutputStream can be much slower than the vanilla + /// DeflateStream, because of the overhead of using the thread pool. + /// + /// + /// + /// + public class ParallelGZipOutputStream : Stream + { + private static readonly int IO_BUFFER_SIZE_DEFAULT = 64 * 1024; + + private System.Collections.Generic.List _pool; + private bool _leaveOpen; + private bool emitting; + private Stream _outStream; + private Crc.CRC32 _runningCrc; + private int _currentlyFilling; + private AutoResetEvent _newlyCompressedBlob; + private int _lastWritten; + private int _latestCompressed; + private string _comment; + private string _FileName; + private int _lastFilled; + private int _bufferSize; + private int _nBuckets; + private object _latestLock = new object(); + private object _outputLock = new object(); + private bool _isClosed; + private bool _firstWriteDone; + private int _Crc32; + private Int64 _totalBytesProcessed; + private CompressionLevel _compressLevel; + private volatile Exception _pendingException; + private object _eLock = new Object(); // protects _pendingException + private BlockingCollection _toWrite; + private BlockingCollection _toCompress; + private BlockingCollection _toFill; + + // This bitfield is used only when Trace is defined. + + //private TraceBits _DesiredTrace = TraceBits.All; + private TraceBits _DesiredTrace = TraceBits.Compress | + TraceBits.Session | + TraceBits.WriteTake | + TraceBits.WriteEnter | + TraceBits.EmitEnter | + TraceBits.EmitDone | + TraceBits.EmitLock | + TraceBits.EmitSkip | + TraceBits.EmitBegin; + + /// + /// Create a ParallelGZipOutputStream. + /// + /// + /// + /// + /// This stream compresses data written into it via the DEFLATE + /// algorithm (see RFC 1951), and writes out the compressed byte stream. + /// + /// + /// + /// The instance will use the default compression level, the default + /// buffer sizes and the default number of threads and buffers per + /// thread. + /// + /// + /// + /// This class is similar to , + /// except that this implementation uses an approach that employs + /// multiple worker threads to perform the DEFLATE. On a multi-cpu or + /// multi-core computer, the performance of this class can be + /// significantly higher than the single-threaded DeflateStream, + /// particularly for larger streams. How large? Anything over 10mb is + /// a good candidate for parallel compression. + /// + /// + /// + /// + /// + /// + /// This example shows how to use a ParallelGZipOutputStream to compress + /// data. It reads a file, compresses it, and writes the compressed data to + /// a second, output file. + /// + /// + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n= -1; + /// String outputFile = fileToCompress + ".compressed"; + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (var raw = System.IO.File.Create(outputFile)) + /// { + /// using (Stream compressor = new ParallelGZipOutputStream(raw)) + /// { + /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + /// { + /// compressor.Write(buffer, 0, n); + /// } + /// } + /// } + /// } + /// + /// + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Dim outputFile As String = (fileToCompress & ".compressed") + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using raw As FileStream = File.Create(outputFile) + /// Using compressor As Stream = New ParallelGZipOutputStream(raw) + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// End Using + /// + /// + /// The stream to which compressed data will be written. + public ParallelGZipOutputStream(Stream stream) + : this(stream, CompressionLevel.Default, CompressionStrategy.Default, false) + { + } + + /// + /// Create a ParallelDeflateOutputStream using the specified CompressionLevel. + /// + /// + /// See the + /// constructor for example code. + /// + /// The stream to which compressed data will be written. + /// A tuning knob to trade speed for effectiveness. + public ParallelGZipOutputStream(Stream stream, CompressionLevel level) + : this(stream, level, CompressionStrategy.Default, false) + { + } + + /// + /// Create a ParallelDeflateOutputStream and specify whether to leave the captive stream open + /// when the ParallelDeflateOutputStream is closed. + /// + /// + /// See the + /// constructor for example code. + /// + /// The stream to which compressed data will be written. + /// + /// true if the application would like the stream to remain open after inflation/deflation. + /// + public ParallelGZipOutputStream(Stream stream, bool leaveOpen) + : this(stream, CompressionLevel.Default, CompressionStrategy.Default, leaveOpen) + { + } + + /// + /// Create a ParallelDeflateOutputStream and specify whether to leave the captive stream open + /// when the ParallelDeflateOutputStream is closed. + /// + /// + /// See the + /// constructor for example code. + /// + /// The stream to which compressed data will be written. + /// A tuning knob to trade speed for effectiveness. + /// + /// true if the application would like the stream to remain open after inflation/deflation. + /// + public ParallelGZipOutputStream(Stream stream, CompressionLevel level, bool leaveOpen) + : this(stream, level, CompressionStrategy.Default, leaveOpen) + { + } + + /// + /// Create a ParallelDeflateOutputStream using the specified + /// CompressionLevel and CompressionStrategy, and specifying whether to + /// leave the captive stream open when the ParallelDeflateOutputStream is + /// closed. + /// + /// + /// See the + /// constructor for example code. + /// + /// The stream to which compressed data will be written. + /// A tuning knob to trade speed for effectiveness. + /// + /// By tweaking this parameter, you may be able to optimize the compression for + /// data with particular characteristics. + /// + /// + /// true if the application would like the stream to remain open after inflation/deflation. + /// + public ParallelGZipOutputStream(Stream stream, + CompressionLevel level, + CompressionStrategy strategy, + bool leaveOpen) + { + TraceOutput(TraceBits.Lifecycle | TraceBits.Session, "-------------------------------------------------------"); + TraceOutput(TraceBits.Lifecycle | TraceBits.Session, "Create {0:X8}", GetHashCode()); + _outStream = stream; + _compressLevel= level; + Strategy = strategy; + _leaveOpen = leaveOpen; + + _nBuckets = 4; // default + _bufferSize = IO_BUFFER_SIZE_DEFAULT; + } + + + /// + /// The ZLIB strategy to be used during compression. + /// + /// + public CompressionStrategy Strategy + { + get; + private set; + } + + /// + /// The number of buffers to use. + /// + /// + /// + /// + /// This property sets the number of memory buffers to create. This + /// sets an upper limit on the amount of memory the stream can use, + /// and also the degree of parallelism the stream can employ. + /// + /// + /// + /// The divide-and-conquer approach taken by this class assumes a + /// single thread from the application will call Write(). There + /// will be multiple Tasks that then compress (DEFLATE) the data + /// written into the stream. The application's thread aggregates + /// those results and emits the compressed output. + /// + /// + /// + /// The default value is 4. Different values may deliver better or + /// worse results, depending on the dynamic performance + /// characteristics of your storage and compute resources. If you + /// have more than 2 CPUs, or more than 3gb memory, you probably + /// want to increase this value. + /// + /// + /// + /// The total amount of storage space allocated for buffering will + /// be (M*S*2), where M is the multiple (this property), S is the + /// size of each buffer (). There are 2 + /// buffers used by the compressor, one for input and one for + /// output. If you retain the default values for Buckets (4), and + /// BufferSize (64k), then the ParallelDeflateOutputStream will use + /// 512kb of buffer memory in total. + /// + /// + /// + /// The application can set this value at any time, but it is effective + /// only before the first call to Write(), which is when the buffers are + /// allocated. + /// + /// + public int Buckets + { + get + { + return _nBuckets; + } + set + { + if (value < 1 || value > 10240) + throw new ArgumentOutOfRangeException("Buckets", + "Buckets must be between 1 and 10240"); + _nBuckets = value; + TraceOutput(TraceBits.Instance, "Buckets {0}", _nBuckets); + } + } + + /// + /// The size of the buffers used by the compressor threads. + /// + /// + /// + /// + /// The default buffer size is 128k. The application can set + /// this value at any time, but it is effective only before + /// the first Write(). + /// + /// + /// + /// Larger buffer sizes implies larger memory consumption but allows + /// more efficient compression. Using smaller buffer sizes consumes less + /// memory but result in less effective compression. For example, using + /// the default buffer size of 128k, the compression delivered is within + /// 1% of the compression delivered by the single-threaded . On the other hand, using a + /// BufferSize of 8k can result in a compressed data stream that is 5% + /// larger than that delivered by the single-threaded + /// DeflateStream. Excessively small buffer sizes can also cause + /// the speed of the ParallelDeflateOutputStream to drop, because of + /// larger thread scheduling overhead dealing with many many small + /// buffers. + /// + /// + /// + /// The total amount of storage space allocated for buffering will be + /// (n*M*S*2), where n is the number of CPUs, M is the multiple (), S is the size of each buffer (this + /// property), and there are 2 buffers used by the compressor, one for + /// input and one for output. For example, if your machine has a total + /// of 4 cores, and if you set to 3, and + /// you keep the default buffer size of 128k, then the + /// ParallelDeflateOutputStream will use 3mb of buffer memory in + /// total. + /// + /// + /// + public int BufferSize + { + get { return _bufferSize;} + set + { + if (value < 1024) + throw new ArgumentOutOfRangeException("BufferSize", + "BufferSize must be greater than 1024 bytes"); + _bufferSize = value; + TraceOutput(TraceBits.Instance, "BufferSize {0}", _bufferSize); + } + } + + /// + /// The CRC32 for the pre-compressed data that was written through the stream. + /// + /// + /// This value is meaningful only after a call to Close(). + /// + public int Crc32 { get { return _Crc32; } } + + + /// + /// The total number of uncompressed bytes processed by the ParallelGZipOutputStream. + /// + /// + /// This value is meaningful only after a call to Close(). + /// + public Int64 BytesProcessed { get { return _totalBytesProcessed; } } + + + /// + /// The comment on the GZIP stream. + /// + /// + /// + /// + /// The GZIP format allows for each file to optionally have an associated + /// comment stored with the file. The comment is encoded with the ISO-8859-1 + /// code page. To include a comment in a GZIP stream you create, set this + /// property before calling Write() for the first time on the + /// ParallelGZipOutputStream. + /// + /// + /// + public String Comment + { + get + { + return _comment; + } + set + { + if (_firstWriteDone) + throw new InvalidOperationException(); + + _comment = value; + } + } + + + /// + /// The FileName for the GZIP stream. + /// + /// + /// + /// + /// + /// The GZIP format optionally allows each compressed file to embed an + /// associated filename. This property holds that value. Set this + /// property before calling Write() the first time on the + /// ParallelGZipOutputStream. The actual filename is encoded + /// into the GZIP bytestream with the ISO-8859-1 code page, according + /// to RFC 1952. It is the application's responsibility to insure that + /// the FileName can be encoded and decoded correctly with this code + /// page. + /// + /// + /// + /// The value of this property is merely written into the GZIP output. + /// There is nothing in this class that verifies that the value you + /// set here is consistent with any filesystem file the compressed + /// data eventually written to, if any. + /// + /// + public String FileName + { + get { return _FileName; } + set + { + if (_firstWriteDone) + throw new InvalidOperationException(); + + _FileName = value; + if (_FileName == null) return; + if (_FileName.IndexOf("/") != -1) + _FileName = _FileName.Replace("/", "\\"); + + if (_FileName.EndsWith("\\")) + throw new ArgumentException("FileName", "The FileName property may not end in slash."); + + if (_FileName.IndexOf("\\") != -1) + _FileName = Path.GetFileName(_FileName); + } + } + + + /// + /// The last modified time for the GZIP stream. + /// + /// + /// + /// GZIP allows the storage of a last modified time with each GZIP entry. + /// When compressing data, you must set this before the first call to + /// Write(), in order for it to be written to the output stream. + /// + public DateTime? LastModified; + + + private void _TakeAndCompress() + { + Random rnd = new Random(); + + while (!_toCompress.IsCompleted) + { + WorkItem workitem = null; + int ix = -1; + try + { + ix = _toCompress.Take(); + workitem = _pool[ix]; + } + catch (InvalidOperationException) + { + // The collection has been completed. + // Some other thread has called CompleteAdding() + // after this thread passed the + // IsCompleted check. + } + if (workitem == null) continue; + + try + { + TraceOutput(TraceBits.Compress, + "Compress lock wi({0}) ord({1})", + workitem.index, + workitem.ordinal); + + // compress one buffer + Crc.CRC32 crc = new Crc.CRC32(); + int ib = workitem.inputBytesAvailable; + crc.SlurpBlock(workitem.buffer, 0, workitem.inputBytesAvailable); + DeflateOneSegment(workitem); + workitem.crc = crc.Crc32Result; + TraceOutput(TraceBits.Compress, + "Compress done wi({0}) ord({1}) ib-({2}) cba({3})", + workitem.index, + workitem.ordinal, + ib, + workitem.compressedBytesAvailable + ); + + lock(_latestLock) + { + if (workitem.ordinal > _latestCompressed) + _latestCompressed = workitem.ordinal; + } + + _toWrite.Add(workitem.index); + _newlyCompressedBlob.Set(); + } + catch (Exception exc1) + { + lock(_eLock) + { + // expose the exception to the main thread + if (_pendingException!=null) + _pendingException = exc1; + } + } + } + } + + + + private void _InitializeBuffers() + { + _toCompress = new BlockingCollection(Buckets); + _toFill = new BlockingCollection(Buckets); + _toWrite = new BlockingCollection(new ConcurrentQueue()); + _pool = new System.Collections.Generic.List(); + for(int i=0; i < Buckets; i++) + { + _pool.Add(new WorkItem(_bufferSize, _compressLevel, Strategy)); + _toFill.Add(i); + + // Start one perpetual compressor task per bucket. + Task.Factory.StartNew( _TakeAndCompress ); + } + + // for diagnostic purposes only + for(int i=0; i < _pool.Count; i++) + _pool[i].index= i; + + _newlyCompressedBlob = new AutoResetEvent(false); + _runningCrc = new Crc.CRC32(); + _currentlyFilling = -1; + _lastFilled = -1; + _lastWritten = -1; + _latestCompressed = -1; + } + + + internal static readonly DateTime _unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + internal static readonly System.Text.Encoding iso8859dash1 = System.Text.Encoding.GetEncoding("iso-8859-1"); + + + private int EmitHeader() + { + byte[] commentBytes = (Comment == null) ? null : iso8859dash1.GetBytes(Comment); + byte[] filenameBytes = (FileName == null) ? null : iso8859dash1.GetBytes(FileName); + + int cbLength = (Comment == null) ? 0 : commentBytes.Length + 1; + int fnLength = (FileName == null) ? 0 : filenameBytes.Length + 1; + + int bufferLength = 10 + cbLength + fnLength; + byte[] header = new byte[bufferLength]; + int i = 0; + // ID + header[i++] = 0x1F; + header[i++] = 0x8B; + + // compression method + header[i++] = 8; + byte flag = 0; + if (Comment != null) + flag ^= 0x10; + if (FileName != null) + flag ^= 0x8; + + // flag + header[i++] = flag; + + // mtime + if (!LastModified.HasValue) LastModified = DateTime.Now; + TimeSpan delta = LastModified.Value - _unixEpoch; + Int32 timet = (Int32)delta.TotalSeconds; + Array.Copy(!BitConverter.IsLittleEndian ? BitConverter.GetBytes(EndianTools.EndianUtils.EndianSwap(timet)) : BitConverter.GetBytes(timet), 0, header, i, 4); + i += 4; + + // xflg + header[i++] = 0; // this field is totally useless + // OS + header[i++] = 0xFF; // 0xFF == unspecified + + // extra field length - only if FEXTRA is set, which it is not. + //header[i++]= 0; + //header[i++]= 0; + + // filename + if (fnLength != 0) + { + Array.Copy(filenameBytes, 0, header, i, fnLength - 1); + i += fnLength - 1; + header[i++] = 0; // terminate + } + + // comment + if (cbLength != 0) + { + Array.Copy(commentBytes, 0, header, i, cbLength - 1); + i += cbLength - 1; + header[i++] = 0; // terminate + } + + _outStream.Write(header, 0, header.Length); + + return header.Length; // bytes written + } + + + + private void _EmitPendingBuffers(bool doAll, bool mustWait) + { + // When combining parallel deflation with a ZipSegmentedStream, it's + // possible for the ZSS to throw from within this method. In that + // case, Close/Dispose will be called on this stream, if this stream + // is employed within a using or try/finally pair as required. But + // this stream is unaware of the pending exception, so the Close() + // method invokes this method AGAIN. This can lead to a deadlock. + // Therefore, failfast if re-entering. + + if (emitting) return; + emitting = true; + + if (doAll || mustWait) + _newlyCompressedBlob.WaitOne(); + + do + { + int firstSkip = -1; + int millisecondsToWait = doAll ? 200 : (mustWait ? -1 : 0); + int nextToWrite; + + while (_toWrite.TryTake(out nextToWrite, millisecondsToWait)) + { + WorkItem workitem = _pool[nextToWrite]; + if (workitem.ordinal != _lastWritten + 1) + { + // not the needed ordinal, so requeue and try again. + TraceOutput(TraceBits.EmitSkip, + "Emit skip wi({0}) ord({1}) lw({2}) fs({3})", + workitem.index, + workitem.ordinal, + _lastWritten, + firstSkip); + + _toWrite.Add(nextToWrite); + + if (firstSkip == nextToWrite) + { + // We went around the list once. + // None of the items in the list is the one we want. + // Now wait for a compressor to signal. + _newlyCompressedBlob.WaitOne(); + firstSkip = -1; + } + else if (firstSkip == -1) + firstSkip = nextToWrite; + + continue; + } + + firstSkip = -1; + + TraceOutput(TraceBits.EmitBegin, + "Emit begin wi({0}) ord({1}) cba({2})", + workitem.index, + workitem.ordinal, + workitem.compressedBytesAvailable); + + _outStream.Write(workitem.compressed, 0, workitem.compressedBytesAvailable); + _runningCrc.Combine(workitem.crc, workitem.inputBytesAvailable); + _totalBytesProcessed += workitem.inputBytesAvailable; + workitem.inputBytesAvailable= 0; + + TraceOutput(TraceBits.EmitDone, + "Emit done wi({0}) ord({1}) cba({2}) mtw({3})", + workitem.index, + workitem.ordinal, + workitem.compressedBytesAvailable, + millisecondsToWait); + + _lastWritten = workitem.ordinal; + _toFill.Add(workitem.index); + + // don't wait next time through + if (millisecondsToWait == -1) millisecondsToWait = 0; + } + + } while (doAll && + !_toCompress.IsCompleted && + (_lastWritten != _latestCompressed)); + + emitting = false; + } + + + + + + /// + /// Write data to the stream. + /// + /// + /// + /// + /// + /// To use the ParallelGZipOutputStream to compress data, create a + /// ParallelGZipOutputStream, passing a writable output stream. + /// Then call Write() on that ParallelGZipOutputStream, providing + /// uncompressed data as input. The data sent to the output stream + /// will be the compressed form of the data written into the stream. + /// + /// + /// + /// To decompress data, use the class. + /// Any RFC-1951 + /// + /// + /// + /// The buffer holding data to write to the stream. + /// the offset within that data array to find the first byte to write. + /// the number of bytes to write. + public override void Write(byte[] buffer, int offset, int count) + { + bool wantWaitEmit = false; + if (_isClosed) + throw new InvalidOperationException(); + + // dispense any exception that occurred on the BG threads + if (_pendingException != null) + throw _pendingException; + + if (count == 0) return; // NOP + + TraceOutput(TraceBits.WriteEnter, "Write enter"); + + if (!_firstWriteDone) + { + _InitializeBuffers(); + _firstWriteDone = true; + EmitHeader(); + } + + do + { + // may need to make buffers available + _EmitPendingBuffers(false, wantWaitEmit); + + wantWaitEmit = false; + // use current, or get a buffer to fill + int ix = -1; + if (_currentlyFilling >= 0) + { + ix = _currentlyFilling; + TraceOutput(TraceBits.WriteTake, + "Write notake wi({0}) lf({1})", + ix, + _lastFilled); + } + else + { + TraceOutput(TraceBits.WriteTake, "Write take?"); + if (!_toFill.TryTake(out ix, 0)) + { + // no available buffers, so... need to emit + // compressed buffers. + wantWaitEmit = true; + continue; + } + + TraceOutput(TraceBits.WriteTake, + "Write take wi({0}) lf({1})", + ix, + _lastFilled); + ++_lastFilled; // TODO: consider rollover? + } + + WorkItem workitem = _pool[ix]; + + int limit = ((workitem.buffer.Length - workitem.inputBytesAvailable) > count) + ? count + : (workitem.buffer.Length - workitem.inputBytesAvailable); + + workitem.ordinal = _lastFilled; + + TraceOutput(TraceBits.Write, + "Write lock wi({0}) ord({1}) iba({2})", + workitem.index, + workitem.ordinal, + workitem.inputBytesAvailable ); + + // copy from the provided buffer to our workitem, starting at + // the tail end of whatever data we might have in there currently. + Array.Copy(buffer, + offset, + workitem.buffer, + workitem.inputBytesAvailable, + limit); + + count -= limit; + offset += limit; + workitem.inputBytesAvailable += limit; + + if (workitem.inputBytesAvailable==workitem.buffer.Length) + { + TraceOutput(TraceBits.Write, + "Write full wi({0}) ord({1}) iba({2})", + workitem.index, + workitem.ordinal, + workitem.inputBytesAvailable ); + _toCompress.Add(ix); + _currentlyFilling = -1; // will get a new buffer next time + } + else + { + _currentlyFilling = ix; + } + + if (count > 0) + TraceOutput(TraceBits.WriteEnter, "Write more"); + } + while (count > 0); // until no more to write + + TraceOutput(TraceBits.WriteEnter, "Write exit"); + return; + } + + + + /// + /// Write data to the stream. + /// + /// + /// + /// + /// + /// To use the ParallelGZipOutputStream to compress data, create a + /// ParallelGZipOutputStream, passing a writable output stream. + /// Then call Write() on that ParallelGZipOutputStream, providing + /// uncompressed data as input. The data sent to the output stream + /// will be the compressed form of the data written into the stream. + /// + /// + /// + /// To decompress data, use the class. + /// Any RFC-1951 + /// + /// + /// + /// The buffer holding data to write to the stream. + public override void Write(ReadOnlySpan buffer) + { + byte[] BufferArray = buffer.ToArray(); + int count = BufferArray.Length; + int offset = 0; + + bool wantWaitEmit = false; + if (_isClosed) + throw new InvalidOperationException(); + + // dispense any exception that occurred on the BG threads + if (_pendingException != null) + throw _pendingException; + + if (count == 0) return; // NOP + + TraceOutput(TraceBits.WriteEnter, "Write enter"); + + if (!_firstWriteDone) + { + _InitializeBuffers(); + _firstWriteDone = true; + EmitHeader(); + } + + do + { + // may need to make buffers available + _EmitPendingBuffers(false, wantWaitEmit); + + wantWaitEmit = false; + // use current, or get a buffer to fill + int ix = -1; + if (_currentlyFilling >= 0) + { + ix = _currentlyFilling; + TraceOutput(TraceBits.WriteTake, + "Write notake wi({0}) lf({1})", + ix, + _lastFilled); + } + else + { + TraceOutput(TraceBits.WriteTake, "Write take?"); + if (!_toFill.TryTake(out ix, 0)) + { + // no available buffers, so... need to emit + // compressed buffers. + wantWaitEmit = true; + continue; + } + + TraceOutput(TraceBits.WriteTake, + "Write take wi({0}) lf({1})", + ix, + _lastFilled); + ++_lastFilled; // TODO: consider rollover? + } + + WorkItem workitem = _pool[ix]; + + int limit = ((workitem.buffer.Length - workitem.inputBytesAvailable) > count) + ? count + : (workitem.buffer.Length - workitem.inputBytesAvailable); + + workitem.ordinal = _lastFilled; + + TraceOutput(TraceBits.Write, + "Write lock wi({0}) ord({1}) iba({2})", + workitem.index, + workitem.ordinal, + workitem.inputBytesAvailable); + + // copy from the provided buffer to our workitem, starting at + // the tail end of whatever data we might have in there currently. + Array.Copy(BufferArray, + offset, + workitem.buffer, + workitem.inputBytesAvailable, + limit); + + count -= limit; + offset += limit; + workitem.inputBytesAvailable += limit; + + if (workitem.inputBytesAvailable == workitem.buffer.Length) + { + TraceOutput(TraceBits.Write, + "Write full wi({0}) ord({1}) iba({2})", + workitem.index, + workitem.ordinal, + workitem.inputBytesAvailable); + _toCompress.Add(ix); + _currentlyFilling = -1; // will get a new buffer next time + } + else + { + _currentlyFilling = ix; + } + + if (count > 0) + TraceOutput(TraceBits.WriteEnter, "Write more"); + } + while (count > 0); // until no more to write + + TraceOutput(TraceBits.WriteEnter, "Write exit"); + return; + } + + + + private void _FlushFinish() + { + // After writing a series of compressed buffers, each one closed + // with Flush.Sync, we now write the final one as Flush.Finish, + // and then stop. + byte[] buffer = new byte[128]; + ZlibCodec compressor = new ZlibCodec(); + int rc = compressor.InitializeDeflate(_compressLevel, false); + compressor.InputBuffer = null; + compressor.NextIn = 0; + compressor.AvailableBytesIn = 0; + compressor.OutputBuffer = buffer; + compressor.NextOut = 0; + compressor.AvailableBytesOut = buffer.Length; + rc = compressor.Deflate(FlushType.Finish); + + if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) + throw new Exception("deflating: " + compressor.Message); + + if (buffer.Length - compressor.AvailableBytesOut > 0) + { + TraceOutput(TraceBits.EmitBegin, + "Emit begin flush bytes({0})", + buffer.Length - compressor.AvailableBytesOut); + + _outStream.Write(buffer, 0, buffer.Length - compressor.AvailableBytesOut); + + TraceOutput(TraceBits.EmitDone, + "Emit done flush"); + } + + compressor.EndDeflate(); + + _Crc32 = _runningCrc.Crc32Result; + } + + + private void _EmitTrailer() + { + // Emit the GZIP trailer: CRC32 and size mod 2^32 + _outStream.Write(!BitConverter.IsLittleEndian ? BitConverter.GetBytes(EndianTools.EndianUtils.EndianSwap(_runningCrc.Crc32Result)) : BitConverter.GetBytes(_runningCrc.Crc32Result), 0, 4); + + int c2 = (Int32)(_totalBytesProcessed & 0x00000000FFFFFFFF); + _outStream.Write(!BitConverter.IsLittleEndian ? BitConverter.GetBytes(EndianTools.EndianUtils.EndianSwap(c2)) : BitConverter.GetBytes(c2), 0, 4); + } + + + private void _Flush(bool lastInput) + { + if (_isClosed) + throw new InvalidOperationException(); + + // post the current partial buffer to the _toCompress queue + if (_currentlyFilling>=0) + { + _toCompress.Add(_currentlyFilling); + TraceOutput(TraceBits.Flush, + "Flush filled wi({0})", + _currentlyFilling); + + _currentlyFilling = -1; // get a new buffer next Write() + } + + if (lastInput) + { + //_toWrite.CompleteAdding(); // cannot do because of sifting + _toCompress.CompleteAdding(); + _EmitPendingBuffers(true, false); + _FlushFinish(); + _EmitTrailer(); + } + else + { + _EmitPendingBuffers(false, false); + } + } + + + + /// + /// Flush the stream. + /// + public override void Flush() + { + _Flush(false); + } + + + + /// + /// Close the stream. + /// + /// + /// + /// The application must call Close() on this stream to guarantee + /// that all of the data written in has been compressed, and the + /// compressed data has been written out. + /// + /// + /// Close() is called implicitly when this stream is used within + /// a using clause. + /// + /// + public override void Close() + { + TraceOutput(TraceBits.Session, "Close {0:X8}", this.GetHashCode()); + + if (_isClosed) return; + + _Flush(true); + + if (!_leaveOpen) + _outStream.Close(); + + _isClosed= true; + } + + + + /// Dispose the object + /// + /// + /// Because ParallelDeflateOutputStream is IDisposable, the + /// application must call this method when finished using the instance. + /// + /// + /// This method is generally called implicitly upon exit from + /// a using scope in C# (Using in VB). + /// + /// + new public void Dispose() + { + TraceOutput(TraceBits.Lifecycle, "Dispose {0:X8}", this.GetHashCode()); + _pool = null; + Close(); + Dispose(true); + } + + + + /// The Dispose method + protected override void Dispose(bool disposeManagedResources) + { + if (disposeManagedResources) + { + // dispose managed resources + } + } + + + + private bool DeflateOneSegment(WorkItem workitem) + { + ZlibCodec compressor = workitem.compressor; + int rc = 0; + compressor.ResetDeflate(); + compressor.NextIn = 0; + + compressor.AvailableBytesIn = workitem.inputBytesAvailable; + + // step 1: deflate the buffer + compressor.NextOut = 0; + compressor.AvailableBytesOut = workitem.compressed.Length; + do + { + compressor.Deflate(FlushType.None); + } + while (compressor.AvailableBytesIn > 0 || compressor.AvailableBytesOut == 0); + + // step 2: flush (sync) + rc = compressor.Deflate(FlushType.Sync); + + workitem.compressedBytesAvailable = (int) compressor.TotalBytesOut; + return true; + } + + + + [System.Diagnostics.ConditionalAttribute("Trace")] + private void TraceOutput(TraceBits bits, string format, params object[] varParams) + { + if ((bits & _DesiredTrace) != 0) + { + lock(_outputLock) + { + int tid = Thread.CurrentThread.GetHashCode(); +#if !SILVERLIGHT + Console.ForegroundColor = (ConsoleColor) (tid % 8 + 8); +#endif + Console.Write("{0:000} PGOS ", tid); + Console.WriteLine(format, varParams); +#if !SILVERLIGHT + Console.ResetColor(); +#endif + } + } + } + + + + // used only when Trace is defined + [Flags] + enum TraceBits : uint + { + None = 0, + NotUsed1 = 1, + EmitLock = 2, + EmitEnter = 4, // enter _EmitPending + EmitBegin = 8, // begin to write out + EmitDone = 16, // done writing out + EmitSkip = 32, // writer skipping a workitem + EmitAll = 58, // All Emit flags + Flush = 64, + Lifecycle = 128, // constructor/disposer + Session = 256, // Close/Reset + Synch = 512, // thread synchronization + Instance = 1024, // instance settings + Compress = 2048, // compress task + Write = 4096, // filling buffers, when caller invokes Write() + WriteEnter = 8192, // upon entry to Write() + WriteTake = 16384, // on _toFill.Take() + All = 0xffffffff, + } + + + + /// + /// Indicates whether the stream supports Seek operations. + /// + /// + /// Always returns false. + /// + public override bool CanSeek + { + get { return false; } + } + + + /// + /// Indicates whether the stream supports Read operations. + /// + /// + /// Always returns false. + /// + public override bool CanRead + { + get {return false;} + } + + /// + /// Indicates whether the stream supports Write operations. + /// + /// + /// Returns true if the provided stream is writable. + /// + public override bool CanWrite + { + get { return _outStream.CanWrite; } + } + + /// + /// Reading this property always throws a NotSupportedException. + /// + public override long Length + { + get { throw new NotSupportedException(); } + } + + /// + /// Writing this property always throws a NotSupportedException. + /// On Read, the value is the number of bytes written so far to the + /// output. + /// + /// + public override long Position + { + get { return _outStream.Position; } + set { throw new NotSupportedException(); } + } + + /// + /// This method always throws a NotSupportedException. + /// + public override int Read(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + + /// + /// This method always throws a NotSupportedException. + /// + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + /// + /// This method always throws a NotSupportedException. + /// + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + } +} + + diff --git a/BackendServices/CustomLogger/CustomLogger.csproj b/BackendServices/CustomLogger/CustomLogger.csproj index 609380193..a81953daf 100644 --- a/BackendServices/CustomLogger/CustomLogger.csproj +++ b/BackendServices/CustomLogger/CustomLogger.csproj @@ -1,7 +1,8 @@ - netstandard2.0 + net6.0 + true false diff --git a/BackendServices/CyberBackendLibrary/Crypto/WebCrypto.cs b/BackendServices/CyberBackendLibrary/Crypto/WebCrypto.cs index df84ac364..54352877e 100644 --- a/BackendServices/CyberBackendLibrary/Crypto/WebCrypto.cs +++ b/BackendServices/CyberBackendLibrary/Crypto/WebCrypto.cs @@ -11,6 +11,90 @@ public static class WebCrypto { public static readonly byte[] AuthIV = new byte[] { 0x30, 0x57, 0xB5, 0x1F, 0x32, 0xD4, 0xAD, 0xBF, 0xAA, 0xAA, 0x21, 0x41, 0x6C, 0xDC, 0x5D, 0xF5 }; + private static readonly double[] ChecksumDoubleBox = new double[] { + 2.7887184390393327E-68, -1.8618331480548654E+44, -4.3020517462112105E-88, 2.7690669394447383E-306, + -4.4732610650720826E+186, -1.4390889935876456E-122, 9.011151663372176E-162, 4.2908917155383753E-218, + -2.4128387770212816E-68, -2.302277439516697E+17, -1.42652914942737E+76, -5.8837740751567983E+133, + 1.5920040750264217E+296, 1.0396241970410689E+80, -4.5251989463276728E-37, -99908801504.216187, + -9.6938069800013986E-234, 7154320198.8792391, 3.3350146220305454, 4.5992494633926639E+296, + 0.00015538478019864411, -2.3770471563162649E-231, -3.7776792306925663E-257, -3.2751772927936956E-79, + 2.9753036182759686E+19, -3.4108151155201765E-97, 1.8254489178010996E-150, -1.533309463713607E+223, + -3.3038829395282477E-163, -3.5867627522725082E-44, -8.0575990854406417E+228, -4.5693368234658098E+218, + 1.5758545622916187E+250, -3.8469203628037247E+75, -7.7468478373878765E+283, 2.9070685939131584E-109, + 6.3703271911431292E-267, 3221.4418522251376, 5.4205212587320372E+146, -8.0205306949294802E+33, + -9.4975431916177958E-136, 3.667794057662362E-115, 7.7199257831233639E-151, -2.1070369526203118E+101, + 1.6411659940921769E-155, -3.6168969623686786E-163, 2.1579389902107392E-277, 4.874590773217776E-111, + 4.0857360992391282E-165, 1.0606435456003952E+267, 5.7931290514683669E-152, -6.7290098482703866E+52, + 1.2606024827897781E+296, -1.6704953006900546E-176, -3.0078722972120132E+48, 3.1447104851678525E+301, + 1915.2152581197442, 3.3184196363573966E+181, 6.1149917535759973E-276, 5.4064678119532772E-23, + -1.0984738414178737E-88, 6.1990027968293353E-291, 3.4566479109573149E-196, -5.3509295815048191E-26, + 1.6505428070349743E+277, -9.6811524958504798E+67, 1.1280023390074459E+149, -4.9292339788735822E-68, + 2.2601210796010041E+178, 8.5226517645726473E+190, -1.0017171101609985E-279, -3.65646314408369E-50, + 2.2970458601470527E+32, 1.0565926139826181E+120, -1.2064366402132023E-257, -2.9763571200300399E-212, + 7.4113698535820762E+30, 4.8640419208754734E-102, 10521018956905.494, 2.4526076739600515E-218, + -1.5830022524963814E-73, 3.4336565057851734E+189, -2.3577655252445132E-156, -9.8917585013646492E-214, + 1.0989790604300809E+275, -1.2587740892853646E+280, 9.4814881264904194E-182, -1.1571531521085438E+237, + 1.229603368447179E+177, -2.604114864379276E+231, -9.2664762752613728E+19, 3.1108827462661377E+207, + -0.00097578440812214106, -1.6334311869848364E+64, 2.1522092663265792E-148, -9.703594347075139E-116, + -5.38618978004519E+153, 1.5183273612167631E-68, 1.488965790360276E+231, -1.9635140707561793E+263, + 8.3909068205945064E-24, 9.0358877500255654E+296, -9.1999672792620295E+304, 3.5512093967849135E+264, + -2.8892650165544142E+105, 4.3108753206738937E-193, -1.8348272430681013E-43, 5.1858841474652699E-213, + -3.004636725533007E-243, 6.132335794645227E+296, -3.7468512147382775E-154, 7.6218053022237471E-96, + 4.3743536049921071E-103, 5.9816034318820231E-216, 1.460199038405993E-91, 6.5876192666238764E+29, + -7.3794025156926594E+268, 5.7991955341983553E-13, -5.6634238293438093E+89, -5.8200791917381605E+113, + -9.382352775848059E+207, 2.861558467972407E-77, 2.4696625114917344E-110, 2.7557374555587394E-267, + -2.4824860795877484E+248, -2.3404664456505793E+142, 1.1936363470265948E-138, -5.1554094132155965E+218, + -2.1345621384067773E+95, 3.9095198281989856E-22, -2.5788222256938449E+115, 1.9099286980025499E-239, + 5.5884812735780678E-97, -4.3532845559098668E-234, -1.2510799969917003E-181, 4.5603347604034982E+136, + 4.7061203764035123E-83, 9.1737236235132167E-41, -2.613613939729813E-298, 1.9880402498870573E+83, + 1.7345656478778084E+249, -3.0319077060207514E-105, -6.7629333338910013E+294, -1.6866269280513859E+99, + -3.3783315435921158E-248, -5.0835175037376279E+51, 2.2823484706956437E+223, -5.2350800373676555E-66, + 2.1938940008469276E-254, 2.6638615147066538E+223, 2.4842709854584848E+182, -1.0299057921221703E-27, + 3.0990818534379688E+185, 2.0262114067427639E-188, -5.4296554749002973E+66, 4.7675539353956493E+169, + 1.3573132727962003E-118, -6.5274465463956772E-14, -4.5392607746338724E-127, 1.6102418832131022E-23, + -1.1847308830399821E+132, 1.2513568633577283E-16, -1.0228949260107244E+112, -8.9922531416247386E+192, + 7.916548295980459E-222, 1.2312727320104881E+232, -1.6122158694745404E-18, -3.481233193000274E-90, + 1.1167822845877998E-174, 3.0933218387919583E+155, 3.5277642137107372E+44, -2.9137622769215298E+290, + 1.9957749835438084E+236, 6.1872472933038688E-164, 5.2600259335078834E+243, -1.4443859349276303E+148, + 5.1467859055870169E+229, 7.7995527993037581E+130, -1.1114533180621355E-125, 2.6399665987764258E+231, + 4.2784642805717917E+60, 5.4325889050482818E-24, 2.3471782221662184E-139, 1.5023114689184499E+139, + -7.739248628015553E-261, -1.2718020201744012E+243, -1.9381306484670001E+67, -4.6914660580129212E+70, + -1.1133219329239814E-265, 3.6846941503987795E+249, -2.0748351868579771E+204, 6.6937077510630353E+112, + -6.2048307225072857E-139, 3.176804470596129E-165, -2.7918709132760115E-30, -1.0492637299075539E+301, + -2.6913198235452055E+26, -2.9117223403452271E+233, -4.7027363008739307E-228, 1.8114587021063903E-271, + -1.3241417053933245E+48, 3.6325124729858898E+91, -6.2457791807094912E-141, -1.4491174268613238E+237, + 9.8874123752594577E+120, -2.0319709324516646E+28, -1.5957803938054728E+152, 3.1874238863547971E+279, + -1.8250643090422224E-303, 5.9599696895418363E+64, -2.2787607401244759E-36, 1.5008922629428054E+65, + 1.1505681598544734E+148, -1.3637263423245691E+49, -4.8856652999596355E-147, -2.9116196687899166E+205, + 1.8874332547772457E+175, -6.5990215259187729E-33, 2.6264478209319808E+277, 1.5689005450286684E-299, + -6.1497353187898311E-262, 1.9581923365154108E+242, 3.8357464877695169E+219, -7.0508384785114966E+159, + 6.0207319343426195E+116, 1.5765702742095276E+54, 4.9958914890061474E+286, -3.6781148546295676E-239, + -6.0586380916259018E-146, 1.0108359360144948E-84, 1.0745744993668423E-293, 9.2956759200531128E+287, + -4.7638929609005592E+115, 9.5054275587231182E-84, -1.8743692919210275E+266, -2.0903280235511906E-65, + 2.6520969143313191E+44, 2.5068662790255933E-108, 7.4153606567030972E-173, 0.027621597514295559, + 1.4414796379735879E-59, 8.9494241208820869E+230, -1.9129924797775677E+176, -3.8951193066001035E-157, + 1.1346280594792284E-121, -2.316668663199865E-205, -1.5072932644663529E-226, -1.629331170675189E-133, + 1.9851829729633109E-177, 9.7822255568416942E+240, 9.862710004113815E-199, -6.1538515262395028E+109, + 6.7804585434686301E-67, -6.4119939251743156E-51, -5.3875889389093929E+155, 8.3674428579373504E+136 + }; + + private static readonly byte[] ChecksumByteBox = new byte[] { 244, 255, 193, 198, 73, + 25, 27, 127, 192, 90, 35, 239, 122, 141, 223, 225, 111, 127, 53, 226, 240, 185, + 90, 26, 57, 224, 100, 115, 35, 196, 114, 197, 142, 108, 119, 62, 60, 55, 16, 167, + 73, 53, 169, 40, 105, 223, 222, 166, 178, 14, 131, 5, 9, 148, 181, 37, 215, 123, + 75, 255, 32, 134, 166, 29, 115, 164, 102, 232, 166, 204, 45, 202, 57, 75, 21, 119, + 255, 197, 117, 203, 227, 3, 51, 167, 232, 34, 125, 150, 10, 90, 112, 252, 33, 76, + 41, 216, 1, 65, 153, 8, 186, 201, 230, 193, 150, 240, 75, 181, 160, 15, 69, 214, + 176, 36, 71, 251, 216, 105, 35, 95, 220, 233, 168, 63, 51, 116, 54, 152, 208, + 228, 207, 248, 167, 183, 184, 16, 102, 84, 156, 99, 82, 204, 43, 74, 72, 247, + 134, 63, 26, 91, 190, 240, 10, 245, 244, 23, 100, 143, 35, 130, 51, 81, 57, 120, + 175, 192, 179, 240, 193, 60, 233, 177, 128, 67, 103, 48, 98, 101, 134, 114, 92, + 114, 155, 187, 63, 120, 7, 246, 12, 9, 6, 131, 57, 217, 8, 49, 253, 166, 38, 0, + 242, 163, 128, 236, 2, 210, 86, 54, 63, 124, 252, 5, 175, 108, 65, 216, 106, 240, + 186, 72, 63, 38, 93, 220, 44, 18, 193, 255, 179, 67, 231, 39, 254, 235, 174, 24, + 112, 136, 67, 56, 237, 179, 166, 68, 167, 147, 197, 51, 58, 248, 240, 215, 57, + 64, 72, 113 }; + public static string? Encrypt(object ObjectToEncrypt, string AccessKey, byte[] IV, bool xmlsecuretags = false, bool xmlbody = false) { string? result = null; @@ -128,5 +212,30 @@ public static class WebCrypto return AESCTR256EncryptDecrypt .InitiateCTRBuffer(Convert.FromBase64String(Encoding.UTF8.GetString(ByteArrayToDecrypt).Replace("", string.Empty).Replace("", string.Empty)), Convert.FromBase64String(AccessKey), IV); } + + public static string? ProcessSecureCheckum(byte[] inputData, long initialValue) + { + byte currentByte = 0; + int DataIndex = 0; + double tempDouble = BitConverter.Int64BitsToDouble(!BitConverter.IsLittleEndian ? EndianTools.EndianUtils.EndianSwap(initialValue) : initialValue); + byte[] CheckSumBytes = new byte[inputData.Length]; + + Ionic.Crc.CRC32 crc = new(); + + do + { + currentByte = (byte)(inputData[DataIndex] ^ BitConverter.DoubleToInt64Bits(!BitConverter.IsLittleEndian ? EndianTools.EndianUtils.EndianSwap(tempDouble) : tempDouble)); + CheckSumBytes[DataIndex] = currentByte; + tempDouble = ChecksumDoubleBox[currentByte] / + (((uint)ChecksumByteBox[(uint)tempDouble & 0xFF] << 0x10) | + ((uint)ChecksumByteBox[(uint)tempDouble >> 8 & 0xFF] << 8) | + ChecksumByteBox[(uint)tempDouble >> 0x10 & 0xFF] | 0x3F000000); + DataIndex++; + } while (DataIndex != inputData.Length); + + crc.SlurpBlock(CheckSumBytes, 0, CheckSumBytes.Length); + + return $"{crc.Crc32Result:X4}"; + } } } diff --git a/BackendServices/CyberBackendLibrary/CyberBackendLibrary.csproj b/BackendServices/CyberBackendLibrary/CyberBackendLibrary.csproj index e74469f83..8fa3c66b9 100644 --- a/BackendServices/CyberBackendLibrary/CyberBackendLibrary.csproj +++ b/BackendServices/CyberBackendLibrary/CyberBackendLibrary.csproj @@ -1,8 +1,9 @@  - netstandard2.1 + net6.0 enable + true false diff --git a/BackendServices/CyberBackendLibrary/DataTypes/DataTypesUtils.cs b/BackendServices/CyberBackendLibrary/DataTypes/DataTypesUtils.cs index 728a2679a..bff957dd3 100644 --- a/BackendServices/CyberBackendLibrary/DataTypes/DataTypesUtils.cs +++ b/BackendServices/CyberBackendLibrary/DataTypes/DataTypesUtils.cs @@ -2,10 +2,14 @@ using System.Linq; using System.IO; using System; +#if NETCOREAPP3_0_OR_GREATER +using System.Runtime.Intrinsics.X86; +using System.Runtime.Intrinsics; +#endif namespace CyberBackendLibrary.DataTypes { - public static class DataTypesUtils + public class DataTypesUtils { /// /// Transform a byte array to it's hexadecimal representation. @@ -35,14 +39,19 @@ public static string ByteArrayToHexString(byte[] byteArray) public static bool AreArraysIdentical(byte[] arr1, byte[] arr2) { // Check if the length of both arrays is the same - if (arr1.Length != arr2.Length) + if (!AreIntegersIdentical(arr1.Length, arr2.Length)) return false; // Compare each element in the arrays for (int i = 0; i < arr1.Length; i++) { +#if NETCOREAPP3_0_OR_GREATER + if (!AreBytesIdentical(arr1[i], arr2[i])) + return false; +#else if (arr1[i] != arr2[i]) return false; +#endif } // If all elements are identical, return true @@ -130,22 +139,23 @@ public static byte[] CombineByteArrays(byte[] first, byte[][]? second) /// A byte array. public static byte[] ReadSmallFileChunck(string filePath, int bytesToRead) { - byte[] result = new byte[bytesToRead]; + if (bytesToRead <= 0) + throw new ArgumentOutOfRangeException(nameof(bytesToRead), "[DataTypesUtils] - ReadSmallFileChunck() - Number of bytes to read must be greater than zero."); + + int bytesRead = 0; + Span result = new byte[bytesToRead]; using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using BinaryReader reader = new BinaryReader(fileStream); - int bytesRead = reader.Read(result, 0, bytesToRead); + bytesRead = reader.Read(result); - // If the file is less than 10 bytes, pad with null bytes - for (int i = bytesRead; i < bytesToRead; i++) - { - result[i] = 0; - } - reader.Close(); + // If the file is less than 'bytesToRead', pad with null bytes + if (bytesRead < bytesToRead) + result[bytesRead..].Fill(0); } - return result; + return result.ToArray(); } /// @@ -171,37 +181,6 @@ public static string[][] AddElement(string[][] original, string[] newElement) /// Finds a sequence of bytes within a byte array. /// Trouve une séquence de bytes dans un tableau de bytes. /// - /// The array in which we search for the sequence. - /// The byte array sequence to find. - /// A boolean. - public static bool FindbyteSequence(byte[] byteArray, byte[] sequenceToFind) - { - for (int i = 0; i < byteArray.Length - sequenceToFind.Length + 1; i++) - { - if (byteArray[i] == sequenceToFind[0]) - { - bool found = true; - for (int j = 1; j < sequenceToFind.Length; j++) - { - if (byteArray[i + j] != sequenceToFind[j]) - { - found = false; - break; - } - } - - if (found) - return true; - } - } - - return false; - } - - /// - /// Finds a sequence of bytes within a byte array. - /// Trouve une s�quence de bytes dans un tableau de bytes. - /// /// The array in which we search for the sequence. /// The byte array sequence to find. /// The offset from where we start our research. @@ -213,6 +192,33 @@ public static int FindBytePattern(byte[] buffer, byte[] searchPattern, int offse { for (int i = offset; i <= buffer.Length - searchPattern.Length; i++) { +#if NETCOREAPP3_0_OR_GREATER + if (AreBytesIdentical(buffer[i], searchPattern[0])) + { + if (buffer.Length > 1) + { + bool matched = true; + for (int y = 1; y <= searchPattern.Length - 1; y++) + { + if (!AreBytesIdentical(buffer[i + y], searchPattern[y])) + { + matched = false; + break; + } + } + if (matched) + { + found = i; + break; + } + } + else + { + found = i; + break; + } + } +#else if (buffer[i] == searchPattern[0]) { if (buffer.Length > 1) @@ -238,6 +244,7 @@ public static int FindBytePattern(byte[] buffer, byte[] searchPattern, int offse break; } } +#endif } } return found; @@ -245,7 +252,7 @@ public static int FindBytePattern(byte[] buffer, byte[] searchPattern, int offse /// /// Finds a sequence of bytes within a byte array. - /// Trouve une s�quence de bytes dans un tableau de bytes. + /// Trouve une séquence de bytes dans un tableau de bytes. /// /// The Span byte in which we search for the sequence. /// The Span byte sequence to find. @@ -258,11 +265,40 @@ public static int FindBytePattern(ReadOnlySpan buffer, ReadOnlySpan for (int i = offset; i < buffer.Length - searchPattern.Length + 1; i++) { +#if NETCOREAPP3_0_OR_GREATER + if (AreBytesIdentical(buffer[i], searchPattern[0]) && buffer.Slice(i, searchPattern.Length).SequenceEqual(searchPattern)) + return i; +#else if (buffer[i] == searchPattern[0] && buffer.Slice(i, searchPattern.Length).SequenceEqual(searchPattern)) return i; +#endif } return -1; } + + public static bool AreIntegersIdentical(int a, int b) + { +#if NETCOREAPP3_0_OR_GREATER + // With SIMD, Check if the comparison results are all 1's (indicating equality) + if (Avx2.IsSupported) + return Avx2.CompareEqual(Vector256.Create(a), Vector256.Create(b)).Equals(Vector256.AllBitsSet); + else if (Sse2.IsSupported) + return Sse2.CompareEqual(Vector128.Create(a), Vector128.Create(b)).Equals(Vector128.AllBitsSet); +#endif + return a == b; + } + + public static bool AreBytesIdentical(byte a, byte b) + { +#if NETCOREAPP3_0_OR_GREATER + // With SIMD, Check if the comparison results are all 1's (indicating equality) + if (Avx2.IsSupported) + return Avx2.CompareEqual(Vector256.Create(a), Vector256.Create(b)).Equals(Vector256.AllBitsSet); + else if (Sse2.IsSupported) + return Sse2.CompareEqual(Vector128.Create(a), Vector128.Create(b)).Equals(Vector128.AllBitsSet); +#endif + return a == b; + } } } diff --git a/BackendServices/CyberBackendLibrary/HTTP/HugeMemoryStream.cs b/BackendServices/CyberBackendLibrary/Extension/HugeMemoryStream.cs similarity index 92% rename from BackendServices/CyberBackendLibrary/HTTP/HugeMemoryStream.cs rename to BackendServices/CyberBackendLibrary/Extension/HugeMemoryStream.cs index dbba63a74..b6ba9f292 100644 --- a/BackendServices/CyberBackendLibrary/HTTP/HugeMemoryStream.cs +++ b/BackendServices/CyberBackendLibrary/Extension/HugeMemoryStream.cs @@ -1,7 +1,7 @@ using System; using System.IO; -namespace CyberBackendLibrary.HTTP +namespace CyberBackendLibrary.Extension { // This class removes the 2gb limit of the classic MemoryStream (but might consume more ram). public class HugeMemoryStream : Stream @@ -25,32 +25,23 @@ public class HugeMemoryStream : Stream public HugeMemoryStream(Stream st) { - st.Position = 0; st.CopyTo(this); - st.Close(); - st.Dispose(); - Position = 0; } public HugeMemoryStream(Stream st, long BufferSize) { int bytesRead = 0; - byte[] buffer = new byte[BufferSize]; - - // Read from source and write to destination in chunks - while ((bytesRead = st.Read(buffer, 0, buffer.Length)) > 0) + Span buffer = new byte[BufferSize]; + while ((bytesRead = st.Read(buffer)) > 0) { - Write(buffer, 0, bytesRead); + Write(buffer[..bytesRead]); } - st.Close(); - st.Dispose(); - Position = 0; + Flush(); } public HugeMemoryStream(Span SpanToMem) { Write(SpanToMem); - Position = 0; } public HugeMemoryStream() @@ -62,7 +53,7 @@ private int GetPageCount(long length) { int pageCount = (int)(length / PAGE_SIZE) + 1; - if ((length % PAGE_SIZE) == 0) + if (length % PAGE_SIZE == 0) pageCount--; return pageCount; diff --git a/BackendServices/CyberBackendLibrary/FileSystem/StaticFileSystem.cs b/BackendServices/CyberBackendLibrary/FileSystem/StaticFileSystem.cs index 68c884073..349011a9f 100644 --- a/BackendServices/CyberBackendLibrary/FileSystem/StaticFileSystem.cs +++ b/BackendServices/CyberBackendLibrary/FileSystem/StaticFileSystem.cs @@ -31,8 +31,11 @@ public static IEnumerable AllFilesAndFoldersLinq(this DirectoryI public static IEnumerable? GetMediaFilesList(string directoryPath) { + // Define a set of valid extensions for media quick lookup + HashSet validExtensions = new HashSet(StringComparer.OrdinalIgnoreCase) { ".mp3", ".aac", ".ts" }; + return Directory.EnumerateFiles(directoryPath, "*.*") - .Where(s => (s.ToLower().EndsWith(".mp3") || s.ToLower().EndsWith(".aac") || s.ToLower().EndsWith(".ts")) && !File.GetAttributes(s).HasFlag(FileAttributes.Hidden)); + .Where(s => validExtensions.Contains(Path.GetExtension(s)) && !File.GetAttributes(s).HasFlag(FileAttributes.Hidden)); } public static string? GetM3UStreamFromDirectory(string directoryPath, string httpdirectoryrequest) diff --git a/BackendServices/CyberBackendLibrary/GeoLocalization/GeoIP.cs b/BackendServices/CyberBackendLibrary/GeoLocalization/GeoIP.cs index 84083e0e3..49f87b5a9 100644 --- a/BackendServices/CyberBackendLibrary/GeoLocalization/GeoIP.cs +++ b/BackendServices/CyberBackendLibrary/GeoLocalization/GeoIP.cs @@ -57,20 +57,31 @@ public static void Initialize() { DatabaseReader? reader; - if (File.Exists($"{currentdir}/static/GeoIP2-Country.mmdb")) + try { - reader = new DatabaseReader($"{currentdir}/static/GeoIP2-Country.mmdb"); - System.Diagnostics.Debug.WriteLine("[GeoIPUtils] - Loaded GeoIP2-Country.mmdb Database..."); + if (File.Exists($"{currentdir}/static/GeoIP2-Country.mmdb")) + { + reader = new DatabaseReader($"{currentdir}/static/GeoIP2-Country.mmdb"); + System.Diagnostics.Debug.WriteLine("[GeoIPUtils] - Loaded GeoIP2-Country.mmdb Database..."); + } + else if (File.Exists($"{currentdir}/static/GeoLite2-Country.mmdb")) + { + reader = new DatabaseReader($"{currentdir}/static/GeoLite2-Country.mmdb"); + System.Diagnostics.Debug.WriteLine("[GeoIPUtils] - Loaded GeoLite2-Country.mmdb Database..."); + } + else + reader = null; + + _instance = new GeoIP(reader); } - else if (File.Exists($"{currentdir}/static/GeoLite2-Country.mmdb")) + catch (IOException) { - reader = new DatabaseReader($"{currentdir}/static/GeoLite2-Country.mmdb"); - System.Diagnostics.Debug.WriteLine("[GeoIPUtils] - Loaded GeoLite2-Country.mmdb Database..."); + Initialize(); // Try again... + } + catch (Exception e) + { + CustomLogger.LoggerAccessor.LogError($"[GeoIP] - Initialize() - Failed to initialize GeoIP engine (exception: {e})"); } - else - reader = null; - - _instance = new GeoIP(reader); } public static string? GetGeoCodeFromIP(IPAddress IPAddr) diff --git a/BackendServices/CyberBackendLibrary/HTTP/HTTPProcessor.cs b/BackendServices/CyberBackendLibrary/HTTP/HTTPProcessor.cs index 519250373..a852b1b72 100644 --- a/BackendServices/CyberBackendLibrary/HTTP/HTTPProcessor.cs +++ b/BackendServices/CyberBackendLibrary/HTTP/HTTPProcessor.cs @@ -11,11 +11,16 @@ using System.Text; using System.Text.RegularExpressions; using System.Web; +using System.Threading; +using CyberBackendLibrary.Extension; +using Ionic.Exploration; namespace CyberBackendLibrary.HTTP { - public partial class HTTPProcessor + public class HTTPProcessor { + private static object _StackLock = new object(); + public static readonly Dictionary _mimeTypes = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { #region Big freaking list of mime types @@ -662,11 +667,11 @@ public static string ExtractDirtyProxyPath(string referer) { if (string.IsNullOrEmpty(referer)) return string.Empty; -#if NETSTANDARD2_1_OR_GREATER - Match match = new Regex(@"^(.*?http://.*?http://)([^/]+)(.*)$").Match(referer); -#elif NET7_0_OR_GREATER +#if NET7_0_OR_GREATER // Match the input string with the pattern Match match = DirtyProxyRegex().Match(referer); +#else + Match match = new Regex(@"^(.*?http://.*?http://)([^/]+)(.*)$").Match(referer); #endif // Check if the pattern is matched @@ -753,10 +758,10 @@ public static byte[] CompressGzip(byte[] input) using (MemoryStream output = new MemoryStream()) { - using (GZipStream gzipStream = new GZipStream(output, CompressionLevel.Fastest, false)) + using (ParallelGZipOutputStream gzipStream = new ParallelGZipOutputStream(output, Ionic.Zlib.CompressionLevel.BestSpeed, true)) { gzipStream.Write(input, 0, input.Length); - gzipStream.Flush(); + gzipStream.Close(); } byteoutput = output.ToArray(); @@ -830,18 +835,18 @@ public static Stream GzipCompressStream(Stream input, bool LargeChunkMode) if (input.Length > 2147483648) { HugeMemoryStream outMemoryStream = new HugeMemoryStream(); - GZipStream outGStream = new GZipStream(outMemoryStream, CompressionLevel.Fastest, false); - CopyStream(input, outGStream, LargeChunkMode ? 500000 : 4096); - outGStream.Flush(); + ParallelGZipOutputStream outGStream = new ParallelGZipOutputStream(outMemoryStream, Ionic.Zlib.CompressionLevel.BestSpeed, true); + CopyStream(input, outGStream, LargeChunkMode ? 500000 : 4096, false); + outGStream.Close(); outMemoryStream.Position = 0; return outMemoryStream; } else { MemoryStream outMemoryStream = new MemoryStream(); - GZipStream outGStream = new GZipStream(outMemoryStream, CompressionLevel.Fastest, false); - CopyStream(input, outGStream, LargeChunkMode ? 500000 : 4096); - outGStream.Flush(); + ParallelGZipOutputStream outGStream = new ParallelGZipOutputStream(outMemoryStream, Ionic.Zlib.CompressionLevel.BestSpeed, true); + CopyStream(input, outGStream, LargeChunkMode ? 500000 : 4096, false); + outGStream.Close(); outMemoryStream.Position = 0; return outMemoryStream; } @@ -876,15 +881,47 @@ public static Stream InflateStream(Stream input, bool LargeChunkMode) /// The Stream to copy. /// the Steam to copy to. /// the buffersize for the copy. - private static void CopyStream(Stream input, Stream output, int BufferSize) + private static void CopyStream(Stream input, Stream output, int BufferSize, bool flush = true) { - int len = 0; - byte[] buffer = new byte[BufferSize]; - while ((len = input.Read(buffer, 0, BufferSize)) > 0) + if (BufferSize <= 0) + throw new ArgumentOutOfRangeException(nameof(BufferSize), "[HTTPProcessor] - CopyStream() - Buffer size must be greater than zero."); + + bool lockTaken = false; + int bytesRead = 0; + + try + { + if (BufferSize <= 4096) // Make sure buffersize is not outside of tolerated stack space. + Monitor.TryEnter(_StackLock, ref lockTaken); // Attempt to acquire the lock + + if (lockTaken) // Lock is free. + { + Span buffer = stackalloc byte[BufferSize]; // Allocate buffer on the stack. + buffer.Clear(); // Explicit zero initialize, because stack can contains garbage data. + while ((bytesRead = input.Read(buffer)) > 0) + { + output.Write(buffer[..bytesRead]); + } + if (flush) + output.Flush(); + } + else + { + Span buffer = new byte[BufferSize]; + while ((bytesRead = input.Read(buffer)) > 0) + { + output.Write(buffer[..bytesRead]); + } + if (flush) + output.Flush(); + } + } + finally { - output.Write(buffer, 0, len); + // Release the lock if it was acquired + if (lockTaken) + Monitor.Exit(_StackLock); } - output.Flush(); } #if NET7_0_OR_GREATER [GeneratedRegex("^(.*?http://.*?http://)([^/]+)(.*)$")] diff --git a/BackendServices/CyberBackendLibrary/SSL/SSLUtils.cs b/BackendServices/CyberBackendLibrary/SSL/SSLUtils.cs index 8b53465de..d02e52160 100644 --- a/BackendServices/CyberBackendLibrary/SSL/SSLUtils.cs +++ b/BackendServices/CyberBackendLibrary/SSL/SSLUtils.cs @@ -12,6 +12,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using static Org.BouncyCastle.Asn1.Cmp.Challenge; namespace CyberBackendLibrary.SSL { @@ -272,8 +273,11 @@ public static void InitCerts(string certpath, string certPassword, string[]? Dns if (!File.Exists(directoryPath + "/MultiServer_rootca.pem") || !File.Exists(directoryPath + "/MultiServer_rootca_privkey.pem")) RootCACertificate = CreateRootCertificateAuthority(directoryPath, Hashing); else +#if NET6_0_OR_GREATER + RootCACertificate = X509Certificate2.CreateFromPemFile(directoryPath + "/MultiServer_rootca.pem", directoryPath + "/MultiServer_rootca_privkey.pem"); +#else RootCACertificate = LoadPemCertificate(directoryPath + "/MultiServer_rootca.pem", directoryPath + "/MultiServer_rootca_privkey.pem"); - +#endif CreateChainSignedCert(RootCACertificate, Hashing, certpath, certPassword, DnsList); } @@ -321,8 +325,12 @@ public static void WriteObjectToPEM(object obj, string filePath) /// A long. private static long GetRandomInt64(long minValue, long maxValue) { +#if NET6_0_OR_GREATER + return new Random().NextInt64(minValue, maxValue); +#else Random random = new Random(); return (long)(((random.Next() << 32) | random.Next()) * (double)(maxValue - minValue) / 0xFFFFFFFFFFFFFFFF) + minValue; +#endif } /// @@ -340,24 +348,29 @@ private static void CreateCertificatesTextFile(string rootcaSubject, string File private static async Task WaitForFileDeletionAsync(string filePath) { - using FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Path.GetDirectoryName(filePath)); - TaskCompletionSource deletionCompletionSource = new TaskCompletionSource(); + string? directoryPath = Path.GetDirectoryName(filePath); - // Watch for file deletion - fileSystemWatcher.Deleted += (sender, e) => + if (!string.IsNullOrEmpty(directoryPath)) { - if (e.Name == Path.GetFileName(filePath)) - { - // Signal that the file has been deleted - deletionCompletionSource.SetResult(true); - } - }; + using FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(directoryPath); + TaskCompletionSource deletionCompletionSource = new TaskCompletionSource(); - // Enable watching - fileSystemWatcher.EnableRaisingEvents = true; - - // Wait for the file to be deleted or for cancellation - await deletionCompletionSource.Task; + // Watch for file deletion + fileSystemWatcher.Deleted += (sender, e) => + { + if (e.Name == Path.GetFileName(filePath)) + { + // Signal that the file has been deleted + deletionCompletionSource.SetResult(true); + } + }; + + // Enable watching + fileSystemWatcher.EnableRaisingEvents = true; + + // Wait for the file to be deleted or for cancellation + await deletionCompletionSource.Task; + } } } diff --git a/BackendServices/EndianTools/EndianTools.csproj b/BackendServices/EndianTools/EndianTools.csproj index cb43664ab..2515e0321 100644 --- a/BackendServices/EndianTools/EndianTools.csproj +++ b/BackendServices/EndianTools/EndianTools.csproj @@ -1,7 +1,8 @@  - netstandard1.0 + net6.0 + true false diff --git a/BackendServices/FixedSsl/FixedSsl.csproj b/BackendServices/FixedSsl/FixedSsl.csproj index d93a48ddf..d8a28d6ad 100644 --- a/BackendServices/FixedSsl/FixedSsl.csproj +++ b/BackendServices/FixedSsl/FixedSsl.csproj @@ -4,6 +4,7 @@ net6.0 enable enable + true false diff --git a/BackendServices/TechnitiumLibrary.Net.Firewall/TechnitiumLibrary.Net.Firewall.csproj b/BackendServices/TechnitiumLibrary.Net.Firewall/TechnitiumLibrary.Net.Firewall.csproj index f4870553b..8f1cc7600 100644 --- a/BackendServices/TechnitiumLibrary.Net.Firewall/TechnitiumLibrary.Net.Firewall.csproj +++ b/BackendServices/TechnitiumLibrary.Net.Firewall/TechnitiumLibrary.Net.Firewall.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net6.0 Shreyas Zare Technitium Technitium Library @@ -11,6 +11,7 @@ TechnitiumLibrary.Net 5.0 + true false diff --git a/BackendServices/WatsonWebserver.Core/WatsonWebserver.Core.csproj b/BackendServices/WatsonWebserver.Core/WatsonWebserver.Core.csproj index 7750d5695..d04cdaacb 100644 --- a/BackendServices/WatsonWebserver.Core/WatsonWebserver.Core.csproj +++ b/BackendServices/WatsonWebserver.Core/WatsonWebserver.Core.csproj @@ -1,7 +1,7 @@  - netstandard2.1;net6.0 + net6.0 6.1.9 Watson.Core Watson Webserver Core @@ -14,6 +14,7 @@ github web server rest restful http https api async ssl Major update with breaking changes + true false diff --git a/BackendServices/WatsonWebserver.Lite/WatsonWebserver.Lite.csproj b/BackendServices/WatsonWebserver.Lite/WatsonWebserver.Lite.csproj index 6ce1ccc68..627d2056a 100644 --- a/BackendServices/WatsonWebserver.Lite/WatsonWebserver.Lite.csproj +++ b/BackendServices/WatsonWebserver.Lite/WatsonWebserver.Lite.csproj @@ -1,7 +1,7 @@  - netstandard2.1;net6.0 + net6.0 6.1.10 Simple, fast, async C# web server for handling REST requests with SSL support, targeted to .NET Core, .NET Standard, and .NET Framework. Watson.Lite has no dependency on http.sys. Joel Christner @@ -16,6 +16,7 @@ Watson.Lite Watson.Lite Watson Webserver Lite + true false diff --git a/SpecializedServers/Horizon/DME/Models/World.cs b/SpecializedServers/Horizon/DME/Models/World.cs index ca935a0ac..698765f04 100644 --- a/SpecializedServers/Horizon/DME/Models/World.cs +++ b/SpecializedServers/Horizon/DME/Models/World.cs @@ -293,6 +293,12 @@ public void OnEndGameRequest(MediusServerEndGameRequest request) public Task OnPlayerJoined(ClientObject player) { + if (player.RemoteUdpEndpoint == null) + { + LoggerAccessor.LogError($"[World] - OnPlayerJoined - player {player.IP} on ApplicationId {player.ApplicationId} has no UdpEndpoint!"); + return Task.CompletedTask; + } + lock (_Lock) { player.HasJoined = true; @@ -314,28 +320,21 @@ public Task OnPlayerJoined(ClientObject player) { PlayerIndex = (short)player.DmeId, ScertId = (short)player.ScertId, - IP = player.RemoteUdpEndpoint?.Address ?? MediusClass.SERVER_IP + IP = player.RemoteUdpEndpoint.Address }); } _ = Task.Run(() => { foreach (ushort token in clientTokens.Keys) { - try + if (clientTokens.TryGetValue(token, out List? value) && value.Count > 0) { - if (clientTokens.TryGetValue(token, out List? value) && value.Count > 0) + player.EnqueueTcp(new RT_MSG_SERVER_TOKEN_MESSAGE() // We need to actualize client with every owned tokens. { - player.EnqueueTcp(new RT_MSG_SERVER_TOKEN_MESSAGE() // We need to actualize client with every owned tokens. - { - tokenMsgType = RT_TOKEN_MESSAGE_TYPE.RT_TOKEN_SERVER_OWNED, - TokenID = token, - TokenHost = (ushort)value[0], - }); - } - } - catch - { - + tokenMsgType = RT_TOKEN_MESSAGE_TYPE.RT_TOKEN_SERVER_OWNED, + TokenID = token, + TokenHost = (ushort)value[0], + }); } } }); @@ -354,6 +353,12 @@ public Task OnPlayerJoined(ClientObject player) public async Task OnPlayerLeft(ClientObject player) { + if (player.RemoteUdpEndpoint == null) + { + LoggerAccessor.LogError($"[World] - OnPlayerLeft - player {player.IP} on ApplicationId {player.ApplicationId} has no UdpEndpoint!"); + return; + } + player.HasJoined = false; // Plugin @@ -383,7 +388,7 @@ public async Task OnPlayerLeft(ClientObject player) { PlayerIndex = (short)player.DmeId, ScertId = (short)player.ScertId, - IP = player.RemoteUdpEndpoint?.Address ?? MediusClass.SERVER_IP + IP = player.RemoteUdpEndpoint.Address }); } diff --git a/SpecializedServers/Horizon/MEDIUS/Medius/MLS.cs b/SpecializedServers/Horizon/MEDIUS/Medius/MLS.cs index 9cc37f397..fd59532cc 100644 --- a/SpecializedServers/Horizon/MEDIUS/Medius/MLS.cs +++ b/SpecializedServers/Horizon/MEDIUS/Medius/MLS.cs @@ -5505,7 +5505,7 @@ await HorizonServerConfiguration.Database.ClanTransferLeadership(data.ClientObje { gameList[gameList.Length - 1].EndOfList = true; - Thread.Sleep(new Random().Next(2000, 6001)); // We simulate medius fetching delay between 2 and 6 seconds. + Thread.Sleep(new Random().Next(0, 6001)); // We simulate medius fetching delay between 0 and 6 seconds. // Some games expect a delayed response and it's never the same for every clients. // Add to responses diff --git a/SpecializedServers/QuazalServer/RDVServices/Services/PS3SecureConnectionService.cs b/SpecializedServers/QuazalServer/RDVServices/Services/PS3SecureConnectionService.cs index 5709b3648..22d9d018b 100644 --- a/SpecializedServers/QuazalServer/RDVServices/Services/PS3SecureConnectionService.cs +++ b/SpecializedServers/QuazalServer/RDVServices/Services/PS3SecureConnectionService.cs @@ -71,7 +71,7 @@ public RMCResult RegisterEx(ICollection vecMyURLs, AnyData 4 && src[0] == 'T' && src[1] == 'L' && src[2] == 'Z' && src[3] == 'C') { byte[]? DecompressedData = EdgeLZMA.Decompress(src, false); - if (!string.IsNullOrEmpty(key) && DecompressedData != null && DecompressedData.Length > 9 && DataTypesUtils.FindbyteSequence(DecompressedData, new byte[] { 0x74, 0x72, 0x69, 0x70, 0x6c, 0x65, 0x64, 0x65, 0x73 })) - { - byte[] dst = new byte[DecompressedData.Length - 9]; - Array.Copy(DecompressedData, 9, dst, 0, dst.Length); - return FileHelperCryptoClass.DecryptData(dst, FileHelperCryptoClass.GetEncryptionKey(key)); - } + if (!string.IsNullOrEmpty(key) && DecompressedData != null) + return DecryptStaticData(DecompressedData, key); else return DecompressedData; } + else if (!string.IsNullOrEmpty(key)) + return DecryptStaticData(src, key); else - { - if (!string.IsNullOrEmpty(key) && src.Length > 9 && DataTypesUtils.FindbyteSequence(src, new byte[] { 0x74, 0x72, 0x69, 0x70, 0x6c, 0x65, 0x64, 0x65, 0x73 })) - { - byte[] dst = new byte[src.Length - 9]; - Array.Copy(src, 9, dst, 0, dst.Length); - return FileHelperCryptoClass.DecryptData(dst, FileHelperCryptoClass.GetEncryptionKey(key)); - } - else - return src; - } + return src; } catch (Exception ex) { @@ -52,39 +41,24 @@ public class FileHelper if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath)) return null; - try - { - byte[] src = File.ReadAllBytes(filepath); - if (src.Length > 4 && src[0] == 'T' && src[1] == 'L' && src[2] == 'Z' && src[3] == 'C') - { - byte[]? DecompressedData = EdgeLZMA.Decompress(src, false); - if (!string.IsNullOrEmpty(key) && DecompressedData != null && DecompressedData.Length > 9 && DataTypesUtils.FindbyteSequence(DecompressedData, new byte[] { 0x74, 0x72, 0x69, 0x70, 0x6c, 0x65, 0x64, 0x65, 0x73 })) - { - byte[] dst = new byte[DecompressedData.Length - 9]; - Array.Copy(DecompressedData, 9, dst, 0, dst.Length); - return Encoding.UTF8.GetString(FileHelperCryptoClass.DecryptData(dst, FileHelperCryptoClass.GetEncryptionKey(key))); - } - else if (DecompressedData != null) - return Encoding.UTF8.GetString(DecompressedData); - } - else - { - if (!string.IsNullOrEmpty(key) && src.Length > 9 && DataTypesUtils.FindbyteSequence(src, new byte[] { 0x74, 0x72, 0x69, 0x70, 0x6c, 0x65, 0x64, 0x65, 0x73 })) - { - byte[] dst = new byte[src.Length - 9]; - Array.Copy(src, 9, dst, 0, dst.Length); - return Encoding.UTF8.GetString(FileHelperCryptoClass.DecryptData(dst, FileHelperCryptoClass.GetEncryptionKey(key))); - } - else - return Encoding.UTF8.GetString(src); - } - } - catch (Exception ex) + byte[]? Data = ReadAllBytes(filepath, key); + + if (Data == null) + return null; + else + return Encoding.UTF8.GetString(Data); + } + + private static byte[] DecryptStaticData(byte[] src, string key) + { + if (src.Length > 9 && DataTypesUtils.FindBytePattern(src, new byte[] { 0x74, 0x72, 0x69, 0x70, 0x6c, 0x65, 0x64, 0x65, 0x73 }) != -1) { - LoggerAccessor.LogError($"[FileHelper] - ReadAllText errored out with this exception : {ex}"); + byte[] dst = new byte[src.Length - 9]; + Array.Copy(src, 9, dst, 0, dst.Length); + return FileHelperCryptoClass.DecryptData(dst, FileHelperCryptoClass.GetEncryptionKey(key)); } - return null; + return src; } } } diff --git a/SpecializedServers/SSFWServer/FileHelper/FileHelperCryptoClass.cs b/SpecializedServers/SSFWServer/FileHelper/FileHelperCryptoClass.cs index f31c6d5b3..d85dcc186 100644 --- a/SpecializedServers/SSFWServer/FileHelper/FileHelperCryptoClass.cs +++ b/SpecializedServers/SSFWServer/FileHelper/FileHelperCryptoClass.cs @@ -60,7 +60,7 @@ public static byte[] DecryptData(byte[] InData, string encryptionKey) Array.Copy(InData, 0, firstSixBytes, 0, firstSixBytes.Length); - if (DataTypesUtils.FindbyteSequence(firstSixBytes, new byte[] { 0x58, 0x54, 0x4e, 0x44, 0x56, 0x32 })) + if (DataTypesUtils.FindBytePattern(firstSixBytes, new byte[] { 0x58, 0x54, 0x4e, 0x44, 0x56, 0x32 }) != -1) { byte[] xteakey = new byte[16]; diff --git a/SpecializedServers/SSFWServer/SSFWLogin.cs b/SpecializedServers/SSFWServer/SSFWLogin.cs index c92b996d7..9f8da5d21 100644 --- a/SpecializedServers/SSFWServer/SSFWLogin.cs +++ b/SpecializedServers/SSFWServer/SSFWLogin.cs @@ -80,7 +80,7 @@ public SSFWLogin(string XHomeClientVersion, string generalsecret, string homeCli extractedData[i] = 0x48; } - if (DataTypesUtils.FindbyteSequence(bufferwrite, new byte[] { 0x52, 0x50, 0x43, 0x4E })) + if (DataTypesUtils.FindBytePattern(bufferwrite, new byte[] { 0x52, 0x50, 0x43, 0x4E }) != -1) { rpcn = true; LoggerAccessor.LogInfo($"[SSFW] : User {Encoding.ASCII.GetString(extractedData).Replace("H", string.Empty)} logged in and is on RPCN"); diff --git a/SpecializedServers/SVO/Games/MotorStormApocalypse.cs b/SpecializedServers/SVO/Games/MotorStormApocalypse.cs index 93a771118..9857cf1f1 100644 --- a/SpecializedServers/SVO/Games/MotorStormApocalypse.cs +++ b/SpecializedServers/SVO/Games/MotorStormApocalypse.cs @@ -114,7 +114,7 @@ public static async Task MSApocalypse_SVO(HttpListenerRequest request, HttpListe // Convert the modified data to a string psnname = Encoding.ASCII.GetString(extractedData).Replace(" ", string.Empty); - if (DataTypesUtils.FindbyteSequence(buffer, new byte[] { 0x52, 0x50, 0x43, 0x4E })) + if (DataTypesUtils.FindBytePattern(buffer, new byte[] { 0x52, 0x50, 0x43, 0x4E }) != -1) LoggerAccessor.LogInfo($"SVO : User {psnname} logged in and is on RPCN"); else LoggerAccessor.LogInfo($"SVO : User {psnname} logged in and is on PSN"); diff --git a/SpecializedServers/SVO/Games/SocomConfrontation.cs b/SpecializedServers/SVO/Games/SocomConfrontation.cs index 52a2b3597..80c694258 100644 --- a/SpecializedServers/SVO/Games/SocomConfrontation.cs +++ b/SpecializedServers/SVO/Games/SocomConfrontation.cs @@ -275,7 +275,7 @@ public static async Task SocomConfrontation_SVO(HttpListenerRequest request, Htt // Convert the modified data to a string psnname = Encoding.ASCII.GetString(extractedData).Replace(" ", string.Empty); - if (DataTypesUtils.FindbyteSequence(buffer, new byte[] { 0x52, 0x50, 0x43, 0x4E })) + if (DataTypesUtils.FindBytePattern(buffer, new byte[] { 0x52, 0x50, 0x43, 0x4E }) != -1) LoggerAccessor.LogInfo($"SVO : User {psnname} logged in and is on RPCN"); else LoggerAccessor.LogInfo($"SVO : User {psnname} logged in and is on PSN"); diff --git a/SpecializedServers/SVO/SecureGames/Wipeout2048.cs b/SpecializedServers/SVO/SecureGames/Wipeout2048.cs index ad934ce00..47bce4b73 100644 --- a/SpecializedServers/SVO/SecureGames/Wipeout2048.cs +++ b/SpecializedServers/SVO/SecureGames/Wipeout2048.cs @@ -643,7 +643,7 @@ public static async Task Wipeout2048_OTG(HttpContextBase ctx, string absol // Convert the modified data to a string psnname = Encoding.ASCII.GetString(extractedData).Replace(" ", string.Empty); - if (DataTypesUtils.FindbyteSequence(buffer, new byte[] { 0x52, 0x50, 0x43, 0x4E })) + if (DataTypesUtils.FindBytePattern(buffer, new byte[] { 0x52, 0x50, 0x43, 0x4E }) != -1) LoggerAccessor.LogInfo($"OTG_HTTPS : User {psnname} logged in and is on RPCN"); else LoggerAccessor.LogInfo($"OTG_HTTPS : User {psnname} logged in and is on PSN"); diff --git a/WebServers/HTTPSecureServerLite/HttpsProcessor.cs b/WebServers/HTTPSecureServerLite/HttpsProcessor.cs index 8137d68e8..5a7610e7c 100644 --- a/WebServers/HTTPSecureServerLite/HttpsProcessor.cs +++ b/WebServers/HTTPSecureServerLite/HttpsProcessor.cs @@ -663,7 +663,7 @@ private static async Task DefaultRoute(HttpContextBase ctx) extractedData[i] = 0x48; } - if (DataTypesUtils.FindbyteSequence(PSNTicket, new byte[] { 0x52, 0x50, 0x43, 0x4E })) + if (DataTypesUtils.FindBytePattern(PSNTicket, new byte[] { 0x52, 0x50, 0x43, 0x4E }) != -1) LoggerAccessor.LogInfo($"[HERMES] : User {Encoding.ASCII.GetString(extractedData).Replace("H", string.Empty)} logged in and is on RPCN"); else LoggerAccessor.LogInfo($"[HERMES] : {Encoding.ASCII.GetString(extractedData).Replace("H", string.Empty)} logged in and is on PSN"); @@ -1109,7 +1109,7 @@ private static async Task DefaultRoute(HttpContextBase ctx) byte[] VerificationChunck = DataTypesUtils.ReadSmallFileChunck(filePath, 10); foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(VerificationChunck, entry.Value)) + if (DataTypesUtils.FindBytePattern(VerificationChunck, entry.Value) != -1) { ContentType = entry.Key; break; @@ -1339,7 +1339,7 @@ private static async Task DefaultRoute(HttpContextBase ctx) byte[] VerificationChunck = DataTypesUtils.ReadSmallFileChunck(filePath, 10); foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(VerificationChunck, entry.Value)) + if (DataTypesUtils.FindBytePattern(VerificationChunck, entry.Value) != -1) { ContentType = entry.Key; break; @@ -1452,7 +1452,7 @@ private static async Task DefaultRoute(HttpContextBase ctx) byte[] VerificationChunck = DataTypesUtils.ReadSmallFileChunck(filePath, 10); foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(VerificationChunck, entry.Value)) + if (DataTypesUtils.FindBytePattern(VerificationChunck, entry.Value) != -1) { matched = true; response.ContentType = entry.Key; @@ -1510,7 +1510,7 @@ private static async Task DefaultRoute(HttpContextBase ctx) byte[] VerificationChunck = DataTypesUtils.ReadSmallFileChunck(filePath, 10); foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(VerificationChunck, entry.Value)) + if (DataTypesUtils.FindBytePattern(VerificationChunck, entry.Value) != -1) { ContentType = entry.Key; break; diff --git a/WebServers/HTTPSecureServerLite/LocalFileStreamHelper.cs b/WebServers/HTTPSecureServerLite/LocalFileStreamHelper.cs index 454521c4b..c0a9c7d2f 100644 --- a/WebServers/HTTPSecureServerLite/LocalFileStreamHelper.cs +++ b/WebServers/HTTPSecureServerLite/LocalFileStreamHelper.cs @@ -4,6 +4,7 @@ using CyberBackendLibrary.HTTP; using System.IO; using System; +using CyberBackendLibrary.Extension; namespace HTTPSecureServerLite { diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Friend.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Friend.dds new file mode 100644 index 000000000..7bc6a596c Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Friend.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Jackets_Chili_Holotip.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Jackets_Chili_Holotip.dds new file mode 100644 index 000000000..eaa05067c Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Jackets_Chili_Holotip.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Pilot_Jackets_Tank_Holotip.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Pilot_Jackets_Tank_Holotip.dds new file mode 100644 index 000000000..0ba4376a5 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Pilot_Jackets_Tank_Holotip.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Stomp_Boots_resized.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Stomp_Boots_resized.dds new file mode 100644 index 000000000..94998b185 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Stomp_Boots_resized.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Tank_Holotip.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Tank_Holotip.dds new file mode 100644 index 000000000..93204abc0 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Tank_Holotip.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/TestTexture.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/TestTexture.dds new file mode 100644 index 000000000..38bb05bb2 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/TestTexture.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Waiting_Outfits_Orig.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Waiting_Outfits_Orig.dds new file mode 100644 index 000000000..ffd38e6ca Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Waiting_Outfits_Orig.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Waiting_Stompers_Holotip.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Waiting_Stompers_Holotip.dds new file mode 100644 index 000000000..d6f6bc069 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/Holotip_images/Waiting_Stompers_Holotip.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/hub_scene/v1.3/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/hub_scene/v1.3/en-GB.xml new file mode 100644 index 000000000..bbe32e6f4 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/hub_scene/v1.3/en-GB.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/hub_scene/v1.3/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/hub_scene/v1.3/en-US.xml new file mode 100644 index 000000000..bbe32e6f4 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/hub_scene/v1.3/en-US.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/0226B3AC-F98F41E5-BBC1535D-B396BA06.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/0226B3AC-F98F41E5-BBC1535D-B396BA06.dds new file mode 100644 index 000000000..e82aa2d0b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/0226B3AC-F98F41E5-BBC1535D-B396BA06.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/07026ADD-2A174371-8FB907A8-CDDAC5C8.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/07026ADD-2A174371-8FB907A8-CDDAC5C8.dds new file mode 100644 index 000000000..897f60946 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/07026ADD-2A174371-8FB907A8-CDDAC5C8.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/182710D3-34454DBC-91C401E0-91D8769A.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/182710D3-34454DBC-91C401E0-91D8769A.dds new file mode 100644 index 000000000..11236c2fc Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/182710D3-34454DBC-91C401E0-91D8769A.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/19839895-032843AE-94288621-647B8A7E.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/19839895-032843AE-94288621-647B8A7E.dds new file mode 100644 index 000000000..4c7c9dade Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/19839895-032843AE-94288621-647B8A7E.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/1ED0EB25-CE304DA0-A6816FC0-34A1D9FF.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/1ED0EB25-CE304DA0-A6816FC0-34A1D9FF.dds new file mode 100644 index 000000000..6bffd4cec Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/1ED0EB25-CE304DA0-A6816FC0-34A1D9FF.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/1FC0B963-14604E1C-B35BD237-179389C2.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/1FC0B963-14604E1C-B35BD237-179389C2.dds new file mode 100644 index 000000000..a46679f0a Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/1FC0B963-14604E1C-B35BD237-179389C2.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/2273B1D0-B17B484D-BE36CA06-3ABC0D2F.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/2273B1D0-B17B484D-BE36CA06-3ABC0D2F.dds new file mode 100644 index 000000000..d26ab91c0 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/2273B1D0-B17B484D-BE36CA06-3ABC0D2F.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/23A1A0DC-657E418A-B5D07AF4-2904E1E8.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/23A1A0DC-657E418A-B5D07AF4-2904E1E8.dds new file mode 100644 index 000000000..f949cbba9 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/23A1A0DC-657E418A-B5D07AF4-2904E1E8.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/2B55D7F1-DB6F404B-B1DB8F1B-22B31315.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/2B55D7F1-DB6F404B-B1DB8F1B-22B31315.dds new file mode 100644 index 000000000..2c880997a Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/2B55D7F1-DB6F404B-B1DB8F1B-22B31315.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/2E3D987F-572245B4-AA656D06-2D831E71.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/2E3D987F-572245B4-AA656D06-2D831E71.dds new file mode 100644 index 000000000..dbefed8c6 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/2E3D987F-572245B4-AA656D06-2D831E71.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/41689589-0CF24CAF-B4ED1B9C-83F85180.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/41689589-0CF24CAF-B4ED1B9C-83F85180.dds new file mode 100644 index 000000000..608dcf575 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/41689589-0CF24CAF-B4ED1B9C-83F85180.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/50B3156E-F16E4975-A667D711-F6DB8449.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/50B3156E-F16E4975-A667D711-F6DB8449.dds new file mode 100644 index 000000000..da8a9b6ad Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/50B3156E-F16E4975-A667D711-F6DB8449.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/50B4CFD9-9A7B4733-8AD6A8E5-B1C6A5D5.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/50B4CFD9-9A7B4733-8AD6A8E5-B1C6A5D5.dds new file mode 100644 index 000000000..b16999266 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/50B4CFD9-9A7B4733-8AD6A8E5-B1C6A5D5.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/529B43D3-C12944A9-A81DFC3F-FFEAB153.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/529B43D3-C12944A9-A81DFC3F-FFEAB153.dds new file mode 100644 index 000000000..993bca2db Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/529B43D3-C12944A9-A81DFC3F-FFEAB153.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/57CC54AD-8C184550-B070B2B4-F3B4E7B9.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/57CC54AD-8C184550-B070B2B4-F3B4E7B9.dds new file mode 100644 index 000000000..f19c74f6d Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/57CC54AD-8C184550-B070B2B4-F3B4E7B9.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/65216F0D-E320458A-843461B4-BC68539E.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/65216F0D-E320458A-843461B4-BC68539E.dds new file mode 100644 index 000000000..37e459f9d Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/65216F0D-E320458A-843461B4-BC68539E.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/7177E964-933A4B4F-A3925C38-0420AF28.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/7177E964-933A4B4F-A3925C38-0420AF28.dds new file mode 100644 index 000000000..0c25a5588 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/7177E964-933A4B4F-A3925C38-0420AF28.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/7604F70E-E09A4442-AF362742-EEA0A490.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/7604F70E-E09A4442-AF362742-EEA0A490.dds new file mode 100644 index 000000000..bc9138e9c Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/7604F70E-E09A4442-AF362742-EEA0A490.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/86058F37-BA264A53-A1790046-913DBD85.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/86058F37-BA264A53-A1790046-913DBD85.dds new file mode 100644 index 000000000..8df8fe65f Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/86058F37-BA264A53-A1790046-913DBD85.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/8756B179-486C4DCA-8D8C7D1C-70CB264D.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/8756B179-486C4DCA-8D8C7D1C-70CB264D.dds new file mode 100644 index 000000000..d7086b0a1 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/8756B179-486C4DCA-8D8C7D1C-70CB264D.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/8A059AA9-F17A434F-AC4728B2-11BD54E4.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/8A059AA9-F17A434F-AC4728B2-11BD54E4.dds new file mode 100644 index 000000000..8f6c18960 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/8A059AA9-F17A434F-AC4728B2-11BD54E4.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/8E3E22D7-55B9449B-9FB8E168-89F54723.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/8E3E22D7-55B9449B-9FB8E168-89F54723.dds new file mode 100644 index 000000000..087fb15a4 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/8E3E22D7-55B9449B-9FB8E168-89F54723.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/91C41530-659646D5-876F7498-C626DF6E.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/91C41530-659646D5-876F7498-C626DF6E.dds new file mode 100644 index 000000000..d68a250b6 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/91C41530-659646D5-876F7498-C626DF6E.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/96B63FC3-F70448DF-92B3F32F-3C007014.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/96B63FC3-F70448DF-92B3F32F-3C007014.dds new file mode 100644 index 000000000..dfc07e02b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/96B63FC3-F70448DF-92B3F32F-3C007014.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/9F8800AE-8BA04B11-8142FF4C-E4193138.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/9F8800AE-8BA04B11-8142FF4C-E4193138.dds new file mode 100644 index 000000000..2052ecea6 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/9F8800AE-8BA04B11-8142FF4C-E4193138.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/9FA21E1D-AD0F4BE1-82BAE9A4-83D33E1B.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/9FA21E1D-AD0F4BE1-82BAE9A4-83D33E1B.dds new file mode 100644 index 000000000..8ffb453d9 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/9FA21E1D-AD0F4BE1-82BAE9A4-83D33E1B.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/A79F30C1-7C00428B-B95D16D2-D6DD7C09.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/A79F30C1-7C00428B-B95D16D2-D6DD7C09.dds new file mode 100644 index 000000000..5ad31ca04 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/A79F30C1-7C00428B-B95D16D2-D6DD7C09.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/A820375D-7487416C-83978B90-B3FA984E.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/A820375D-7487416C-83978B90-B3FA984E.dds new file mode 100644 index 000000000..db55cdb71 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/A820375D-7487416C-83978B90-B3FA984E.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/B5427567-81C74312-BE9DBE2C-31420466.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/B5427567-81C74312-BE9DBE2C-31420466.dds new file mode 100644 index 000000000..fd528c3f5 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/B5427567-81C74312-BE9DBE2C-31420466.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/B552A480-09FD4BDE-936785AA-98801762.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/B552A480-09FD4BDE-936785AA-98801762.dds new file mode 100644 index 000000000..7b7919243 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/B552A480-09FD4BDE-936785AA-98801762.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C0376DEB-178C45E3-BFB3D989-5F80E6BA.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C0376DEB-178C45E3-BFB3D989-5F80E6BA.dds new file mode 100644 index 000000000..e9ed46fe0 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C0376DEB-178C45E3-BFB3D989-5F80E6BA.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C3592815-BB4646B2-A193145B-C7BECAB7.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C3592815-BB4646B2-A193145B-C7BECAB7.dds new file mode 100644 index 000000000..03364ccee Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C3592815-BB4646B2-A193145B-C7BECAB7.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C48B6327-533B4572-A67959DB-8B122EEA.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C48B6327-533B4572-A67959DB-8B122EEA.dds new file mode 100644 index 000000000..d37214676 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C48B6327-533B4572-A67959DB-8B122EEA.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C8127A28-F71C4EC5-BDE7D12D-D05E7ABA.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C8127A28-F71C4EC5-BDE7D12D-D05E7ABA.dds new file mode 100644 index 000000000..5f9fd3261 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/C8127A28-F71C4EC5-BDE7D12D-D05E7ABA.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/CD4DF4A6-3AA244BF-8D351971-EBDF2A32.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/CD4DF4A6-3AA244BF-8D351971-EBDF2A32.dds new file mode 100644 index 000000000..caec59f8b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/CD4DF4A6-3AA244BF-8D351971-EBDF2A32.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/D52221A0-53794B69-A417BE7E-1F5845F4.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/D52221A0-53794B69-A417BE7E-1F5845F4.dds new file mode 100644 index 000000000..5b575bb91 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/D52221A0-53794B69-A417BE7E-1F5845F4.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/DBDF9E79-2546447C-9ED980F3-C3B8EC1A.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/DBDF9E79-2546447C-9ED980F3-C3B8EC1A.dds new file mode 100644 index 000000000..d9ee173a3 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/DBDF9E79-2546447C-9ED980F3-C3B8EC1A.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/E0EE0D08-4A11411C-BA7DB8C0-DCB7A30E.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/E0EE0D08-4A11411C-BA7DB8C0-DCB7A30E.dds new file mode 100644 index 000000000..6b808d664 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/E0EE0D08-4A11411C-BA7DB8C0-DCB7A30E.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/E29106B1-CC2D479B-92F0E583-AF16DA89.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/E29106B1-CC2D479B-92F0E583-AF16DA89.dds new file mode 100644 index 000000000..d0819dd43 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/E29106B1-CC2D479B-92F0E583-AF16DA89.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/ECD847F4-3C6F46D8-84751724-7118ECBD.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/ECD847F4-3C6F46D8-84751724-7118ECBD.dds new file mode 100644 index 000000000..184413d7c Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/ECD847F4-3C6F46D8-84751724-7118ECBD.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/FB58B0A6-EFB44649-BFCEFBEE-9F042CBA.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/FB58B0A6-EFB44649-BFCEFBEE-9F042CBA.dds new file mode 100644 index 000000000..1fbbf8cb8 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/images/FB58B0A6-EFB44649-BFCEFBEE-9F042CBA.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/v1.5/resource/resource.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/v1.5/resource/resource.xml new file mode 100644 index 000000000..0e8534fac --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/npc/v1.5/resource/resource.xml @@ -0,0 +1,6 @@ + + + 1 + 100 + 25 + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/ObjectiveDefs.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/ObjectiveDefs.xml new file mode 100644 index 000000000..7aa9d636e --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/ObjectiveDefs.xml @@ -0,0 +1,482 @@ + + + + + EVENT + npc + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_sodium_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_sodium_incomplete.dds + false + 1000 + + + EVENT + npc + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_vickie_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_vickie_incomplete.dds + + <_>3DCA3C46-AAE54E72-BCB30EAC-3F58F795 + + false + 1000 + + + EVENT + npc + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_sodium_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_sodium_incomplete.dds + false + 1000 + + + EVENT + npc + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_sodium_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_sodium_incomplete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_sodium_incomplete.dds + false + 1000 + + + EVENT + npc + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_vickie_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_vickie_incomplete.dds + 1 + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + totalKills + false + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + false + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 1 + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + false + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 5 + multiplierLevel + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 6 + multiplierLevel + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 1 + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 1 + 1000 + + + EVENT + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 1 + 1000 + + + COLLECTION + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 25 + totalKills + + <_>2DB00408-A1A34DD2-A90CC1C5-BD3D0762 + <_>6576A366-B43148FA-9092AB60-A43B5104 + + 0 + 1000 + + + COLLECTION + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 100 + totalKills + + <_>E913FC08-D7FB4412-A08793FB-DDC9E47A + <_>81243ABF-C9D6457B-871CF2C4-0FA4A687 + + 25 + 1000 + + + COLLECTION + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 1000 + totalKills + + <_>C212815C-92474496-AEAA4286-4583DA98 + <_>E8396A6C-78C842B0-97A3843A-659C5FC3 + + 100 + 1000 + + + COLLECTION + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 10000 + totalKills + + <_>9ACCC1EB-315F4990-A9D7990D-72B345AE + <_>F8471241-67384755-A249B2D9-FD25EF9D + + 1000 + 1000 + + + COLLECTION + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 50000 + totalKills + + <_>538FED1A-740D46FB-82001B80-9EE88209 + <_>D6E00450-70B447C9-96F49BD6-BB6936FC + + 10000 + 1000 + + + COMM + scorpion_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds + 1111111 + totalKills + + <_>036B47FA-7CBE484C-B4309B77-F20A4CB3 + <_>162DC30D-67F3404D-A76C8350-49415ED8 + + false + 1000 + + + EVENT + desert_quench + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds + false + 1000 + + + EVENT + desert_quench + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds + false + 1000 + + + EVENT + desert_quench + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds + false + 1000 + + + EVENT + vending_machine + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_vending_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_vending_incomplete.dds + false + 1000 + + + COLLECTION + desert_quench + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds + 0 + 5 + totalDrinksServed + 1000 + + <_>F63C2F5E-8D55497D-BC606BEC-0CB3C696 + <_>FF62B544-0B394747-818875A7-2A4F7698 + + + + COLLECTION + desert_quench + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds + 5 + 25 + totalDrinksServed + 1000 + + <_>5EB5B2D0-8870493D-BDC48D0E-119AC360 + <_>E0BB102A-E0454C68-B180E81C-BBFB811F + + + + COLLECTION + desert_quench + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds + 25 + 100 + totalDrinksServed + 1000 + + <_>0D261560-B0E94608-B04F9CA9-5D619683 + <_>EA4957BA-CCA54DC9-A17E0835-1E8F207B + + + + COLLECTION + desert_quench + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds + 100 + 500 + totalDrinksServed + 1000 + + <_>87F3B1F5-5D6B4E31-A42FA18A-AF7AA0F0 + <_>910564B3-6F5D4204-94FBC652-F535AF11 + + + + COLLECTION + desert_quench + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds + 500 + 1000 + totalDrinksServed + 1000 + + <_>2CAB3C68-45294E0C-8FE820E7-611E9C5D + <_>6E7E2581-0F244F28-9DABA308-9B66EDFF + + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + + <_>D5920D88-5D614595-8C31E578-491684D3 + + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + + <_>E6F6DD5A-847B4214-B7F3C17A-3BFFF076 + + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + + <_>7BE0909E-FECD4FDB-A117ADAC-39699691 + + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + + <_>53309DBD-77B946AB-94B97CF7-506B5069 + + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + + EVENT + shooter_game + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds + https://www.outso-srv1.com/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds + false + 1000 + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/ObjectiveOrder.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/ObjectiveOrder.xml new file mode 100644 index 000000000..5872c9dc6 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/ObjectiveOrder.xml @@ -0,0 +1,52 @@ + + + <_>sodium_44 + <_>sodium_14 + <_>sodium_45 + <_>sodium_46 + <_>sodium_66 + <_>sodium_1 + <_>sodium_20 + <_>sodium_22 + <_>sodium_23 + <_>sodium_24 + <_>sodium_25 + <_>sodium_26 + <_>sodium_39 + <_>sodium_40 + <_>sodium_41 + <_>sodium_97 + <_>sodium_100 + <_>sodium_101 + <_>sodium_102 + <_>sodium_103 + <_>sodium_98 + <_>sodium_8 + <_>sodium_9 + <_>sodium_31 + <_>sodium_64 + <_>sodium_150 + <_>sodium_151 + <_>sodium_152 + <_>sodium_153 + <_>sodium_154 + <_>sodium_18 + <_>sodium_11 + <_>sodium_48 + <_>sodium_49 + <_>sodium_12 + <_>sodium_50 + <_>sodium_13 + <_>sodium_19 + <_>sodium_47 + <_>sodium_51 + <_>sodium_81 + <_>sodium_82 + <_>sodium_83 + <_>sodium_84 + <_>sodium_85 + <_>sodium_86 + <_>sodium_10 + <_>sodium_16 + <_>sodium_17 + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/lang/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/lang/en-GB.xml new file mode 100644 index 000000000..83f6002c0 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/lang/en-GB.xml @@ -0,0 +1,346 @@ + + + + Talked to VICKIE + + <_>If you are reading this, you already completed it! + + See, robots aren't scary! + + + Welcome to Sodium One + + <_>Welcome to Sodium One, powered by Destination Home. + + Automatically Rewarded + + + Friendship is magic + + <_>- + + Be invited by a friend to Sodium One + + + For the greater good + + <_>- + + Invite a friend to Sodium One + + + I <![CDATA[ <3 ]]> Vickie! + + <_>- + + Own the vickie statue and a pair of vickie headphones + + + What Did It Ever Do To You? + + <_>- + + Stomp your first robotic scorpion + + + Twinkle Toes + + <_>- + + Stomp 20 robotic scorpions without being stung in a single session. + + + Mmmmm, Poison + + <_>- + + Expose yourself to the scorpion's sting while wearing boots + + + Supersonic Soles + + <_>- + + Stomp 30 robotic scorpions within 60 seconds. + + + Scorpion Dodger + + <_>- + + Achieve a multiplier score of 4. + + + Scorpion Scraper + + <_>- + + Achieve a multiplier score of 5. + + + Scorpion Overlord + + <_>- + + Achieve a multiplier score of 6. + + + Pincer Movement + + <_>- + + Stomp 50 robotic scorpions in a single session + + + Supersonic Soles + + <_>- + + Stomp 200 robotic scorpions in a single session + + + Supersonic Soles + + <_>- + + Stomp 500 robotic scorpions in a single session + + + Scorpion Stomp Newbie + + <_>Stomp scorpions to reach this objective! + + Obtain the level 1 stomper boots + + + Scorpion Stomp Apprentice + + <_>Stomp scorpions to reach this objective! + + Obtain the level 2 stomper boots + + + Scorpion Stomp Master + + <_>Stomp scorpions to reach this objective! + + Obtain the level 3 stomper boots + + + Scorpion Stomp Tycoon + + <_>Stomp scorpions to reach this objective! + + Obtain the level 4 stomper boots + + + Scorpion Stomp Legend + + <_>Stomp scorpions to reach this objective! + + Obtain the level 5 stomper boots + + + 1,111,111 + + <_>- + + Collectively stomp 1,111,111 Scorpions + + + Your orders, my drinks + + <_>- + + Served a drink at scorpio's bar + + + A taste of success + + <_>- + + Had a drink at scorpio's bar + + + Papers, Please + + <_>- + + Entered the VIP area at Scorpio's + + + This gatorade tastes weird! + + <_>- + + Take your first drink of vetoxade + + + Novice Bartender + + <_>- + + Serve 5 Drinks at Scorpio's Bar + + + Apprentice Bartender + + <_>- + + Serve 25 Drinks at Scorpio's Bar + + + Bartender + + <_>- + + Serve 100 Drinks at Scorpio's Bar + + + Senior Bartender + + <_>- + + Serve 500 Drinks at Scorpio's Bar + + + Head Bartender + + <_>- + + Serve 1000 Drinks at Scorpio's Bar + + + Pew Pew Pew + + <_>- + + Play the salt shooter game + + + Rock Muncher + + <_>- + + Collect 250 resources + + + Salt Apprentice + + <_>- + + Complete level 3 + + + Salt Intern + + <_>- + + Complete level 5 + + + Salt Greenhorn + + <_>- + + Complete level 9 + + + Salt Professional + + <_>- + + Complete level 30 + + + Salt Master + + <_>- + + Complete level 40 + + + Lock and Load + + <_>- + + Reach level 50 + + + Worth your salt + + <_>- + + Complete level 50 + + + Salt Legend + + <_>- + + Complete level 51 + + + Joining The Fold + + <_>- + + Obtain the Light Assault Drone ornament + + + Salt Shooter Looter 1 + + <_>- + + Obtain the Sand Stalker ornament + + + Salt Shooter Looter 2 + + <_>- + + Obtain the Sand Skater ornament + + + Salt Shooter Looter 3 + + <_>- + + Obtain the Skimmer Assault Drone ornament + + + Salt Shooter Looter 4 + + <_>- + + Obtain the Heavy LRM Drone ornament + + + Salt Shooter Looter 5 + + <_>- + + Obtain the SodiumOne Mini MKII Hover Tank ornament + + + Salt Trainee + + <_> + + Play a round of the salt trainer + + + Salt Trainee Master + + <_> + + Reach a score of at least 10 in the trainer + + + Salt Trainee Guru + + <_> + + Reach a score of at least 15 in the trainer + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/lang/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/lang/en-US.xml new file mode 100644 index 000000000..83f6002c0 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/lang/en-US.xml @@ -0,0 +1,346 @@ + + + + Talked to VICKIE + + <_>If you are reading this, you already completed it! + + See, robots aren't scary! + + + Welcome to Sodium One + + <_>Welcome to Sodium One, powered by Destination Home. + + Automatically Rewarded + + + Friendship is magic + + <_>- + + Be invited by a friend to Sodium One + + + For the greater good + + <_>- + + Invite a friend to Sodium One + + + I <![CDATA[ <3 ]]> Vickie! + + <_>- + + Own the vickie statue and a pair of vickie headphones + + + What Did It Ever Do To You? + + <_>- + + Stomp your first robotic scorpion + + + Twinkle Toes + + <_>- + + Stomp 20 robotic scorpions without being stung in a single session. + + + Mmmmm, Poison + + <_>- + + Expose yourself to the scorpion's sting while wearing boots + + + Supersonic Soles + + <_>- + + Stomp 30 robotic scorpions within 60 seconds. + + + Scorpion Dodger + + <_>- + + Achieve a multiplier score of 4. + + + Scorpion Scraper + + <_>- + + Achieve a multiplier score of 5. + + + Scorpion Overlord + + <_>- + + Achieve a multiplier score of 6. + + + Pincer Movement + + <_>- + + Stomp 50 robotic scorpions in a single session + + + Supersonic Soles + + <_>- + + Stomp 200 robotic scorpions in a single session + + + Supersonic Soles + + <_>- + + Stomp 500 robotic scorpions in a single session + + + Scorpion Stomp Newbie + + <_>Stomp scorpions to reach this objective! + + Obtain the level 1 stomper boots + + + Scorpion Stomp Apprentice + + <_>Stomp scorpions to reach this objective! + + Obtain the level 2 stomper boots + + + Scorpion Stomp Master + + <_>Stomp scorpions to reach this objective! + + Obtain the level 3 stomper boots + + + Scorpion Stomp Tycoon + + <_>Stomp scorpions to reach this objective! + + Obtain the level 4 stomper boots + + + Scorpion Stomp Legend + + <_>Stomp scorpions to reach this objective! + + Obtain the level 5 stomper boots + + + 1,111,111 + + <_>- + + Collectively stomp 1,111,111 Scorpions + + + Your orders, my drinks + + <_>- + + Served a drink at scorpio's bar + + + A taste of success + + <_>- + + Had a drink at scorpio's bar + + + Papers, Please + + <_>- + + Entered the VIP area at Scorpio's + + + This gatorade tastes weird! + + <_>- + + Take your first drink of vetoxade + + + Novice Bartender + + <_>- + + Serve 5 Drinks at Scorpio's Bar + + + Apprentice Bartender + + <_>- + + Serve 25 Drinks at Scorpio's Bar + + + Bartender + + <_>- + + Serve 100 Drinks at Scorpio's Bar + + + Senior Bartender + + <_>- + + Serve 500 Drinks at Scorpio's Bar + + + Head Bartender + + <_>- + + Serve 1000 Drinks at Scorpio's Bar + + + Pew Pew Pew + + <_>- + + Play the salt shooter game + + + Rock Muncher + + <_>- + + Collect 250 resources + + + Salt Apprentice + + <_>- + + Complete level 3 + + + Salt Intern + + <_>- + + Complete level 5 + + + Salt Greenhorn + + <_>- + + Complete level 9 + + + Salt Professional + + <_>- + + Complete level 30 + + + Salt Master + + <_>- + + Complete level 40 + + + Lock and Load + + <_>- + + Reach level 50 + + + Worth your salt + + <_>- + + Complete level 50 + + + Salt Legend + + <_>- + + Complete level 51 + + + Joining The Fold + + <_>- + + Obtain the Light Assault Drone ornament + + + Salt Shooter Looter 1 + + <_>- + + Obtain the Sand Stalker ornament + + + Salt Shooter Looter 2 + + <_>- + + Obtain the Sand Skater ornament + + + Salt Shooter Looter 3 + + <_>- + + Obtain the Skimmer Assault Drone ornament + + + Salt Shooter Looter 4 + + <_>- + + Obtain the Heavy LRM Drone ornament + + + Salt Shooter Looter 5 + + <_>- + + Obtain the SodiumOne Mini MKII Hover Tank ornament + + + Salt Trainee + + <_> + + Play a round of the salt trainer + + + Salt Trainee Master + + <_> + + Reach a score of at least 10 in the trainer + + + Salt Trainee Guru + + <_> + + Reach a score of at least 15 in the trainer + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/region/SCEA.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/region/SCEA.xml new file mode 100644 index 000000000..33fd390e5 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/region/SCEA.xml @@ -0,0 +1,6 @@ + + + + true + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/region/SCEE.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/region/SCEE.xml new file mode 100644 index 000000000..33fd390e5 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/data/v2.3/region/SCEE.xml @@ -0,0 +1,6 @@ + + + + true + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_bar_incomplete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_bar_incomplete.dds new file mode 100644 index 000000000..a2725f88b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_bar_incomplete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_shooter_complete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_shooter_complete.dds new file mode 100644 index 000000000..bf3f78439 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_shooter_complete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_sodium_complete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_sodium_complete.dds new file mode 100644 index 000000000..bc1eacb7b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_sodium_complete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_sodium_incomplete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_sodium_incomplete.dds new file mode 100644 index 000000000..46e4b3790 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_sodium_incomplete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_stomp_incomplete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_stomp_incomplete.dds new file mode 100644 index 000000000..f5246206b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.6/objective_stomp_incomplete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds new file mode 100644 index 000000000..b38320ae3 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_bar_complete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds new file mode 100644 index 000000000..a2725f88b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_bar_incomplete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_secret_complete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_secret_complete.dds new file mode 100644 index 000000000..57f27cdff Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_secret_complete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds new file mode 100644 index 000000000..bf3f78439 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_shooter_complete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds new file mode 100644 index 000000000..61d88fb74 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_shooter_incomplete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_sodium_complete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_sodium_complete.dds new file mode 100644 index 000000000..bc1eacb7b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_sodium_complete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_sodium_incomplete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_sodium_incomplete.dds new file mode 100644 index 000000000..46e4b3790 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_sodium_incomplete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds new file mode 100644 index 000000000..6d9dfb796 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_stomp_complete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds new file mode 100644 index 000000000..f5246206b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_stomp_incomplete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vending_complete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vending_complete.dds new file mode 100644 index 000000000..cd7177c1b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vending_complete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vending_incomplete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vending_incomplete.dds new file mode 100644 index 000000000..9384504c8 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vending_incomplete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vickie_complete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vickie_complete.dds new file mode 100644 index 000000000..ffc88089a Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vickie_complete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vickie_incomplete.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vickie_incomplete.dds new file mode 100644 index 000000000..f16c5571b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/images/v1.7/objective_vickie_incomplete.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/redirect/sspublic/v1.1/def.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/objectives/redirect/sspublic/v1.1/def.xml new file mode 100644 index 000000000..e69de29bb diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEA/hub_a.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEA/hub_a.dds new file mode 100644 index 000000000..141735e33 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEA/hub_a.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEA/hub_b.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEA/hub_b.dds new file mode 100644 index 000000000..804472adf Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEA/hub_b.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEE/hub_a.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEE/hub_a.dds new file mode 100644 index 000000000..141735e33 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEE/hub_a.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEE/hub_b.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEE/hub_b.dds new file mode 100644 index 000000000..804472adf Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/posters/SCEE/hub_b.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/racer_scene/V3.3/HoloTip_Data.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/racer_scene/V3.3/HoloTip_Data.xml new file mode 100644 index 000000000..428a43671 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/racer_scene/V3.3/HoloTip_Data.xml @@ -0,0 +1,1527 @@ + + + 9.88 + 1.64,0.725,1.3385,1.5 + 1.109,0.216,1.467,0 + 6.68 + -1 + 0.49239 + -10.86,5.9063,-12.785,1 + + HoloBeam + 0.045,0.116,0.3,0.75 + 2.4685 + HoloUnit + + -10.92,5.1705,-14.174,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>Commerce_Point + -7.0003 + 6.2835 + -19.8 + 50.4 + 14.393 + -150.6 + center + 1,1,1,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + 27.3 + + + 9.88 + 1.4421,1.379,1.0167,1.5 + 1.8698,1.1111,0.77085,0 + 6.68 + + <_>AND + <_>NOT + <_>RACER + + 0.46 + 1.1852 + -11.088,5.4876,-11.156,1 + + HoloBeam + 0.045,0.3,0.1015,0.75 + 1.9117 + + -10.959,5.0841,-7.2328,1 + 12 + 1.101,1.048,1.5,1.5 + + <_>Sodium2-ProjectVelocity + <_>Is_downloading + 9.7998 + 5.4219 + -9 + 240.8 + 10.741 + -227.4 + center + 0.44852,1,0.189,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.29715,0.451,0.28377,0.63 + + + <_>Please_wait + 5.4219 + 10.741 + center + 0.44852,1,0.189,1 + + <_>AND + <_>Timer_5sec + + 3 + 0.14 + 15 + 5 + 1280 + 0.29715,0.451,0.28377,0.63 + + 17.3 + + + 1.86 + 2.1521,2.1516,2.1561,1.5 + 0.97805,0.978,1.001,0 + 5.78 + + <_>AND + <_>RACER + + 1 + 1.1852 + -11.054,5.8951,-11.82,1 + + -10.959,6.0178,-7.1202,1 + 12 + 1.101,1.048,1.5,1.5 + true + + <_>blank + 9.7998 + 4.2558 + -9 + 240.8 + 13.85 + -227.4 + center + 1,1,1,1 + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.13426,0.81,0.0243,0.00099999 + 5.1298 + + 3 + 0.14 + 15 + 5 + 0.372,0.506,0.981,0.63 + + 359.9 + + + 1.86 + 2.1521,2.1516,2.1561,1.5 + 0.97805,0.978,1.001,0 + 5.78 + 1 + 1.6039 + -26.604,5.7895,-11.668,1 + + -26.637,5.7903,-10.063,1 + 12 + 1.101,1.048,1.5,1.5 + true + + <_>blank + 9.7998 + 4.2558 + -9 + 240.8 + 13.85 + -227.4 + center + 1,1,1,1 + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.13426,0.81,0.0243,0.00099999 + 5.1298 + + 3 + 0.14 + 15 + 5 + 0.372,0.506,0.981,0.63 + + + + <_>AND + <_>NOT + <_>RACER + + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.025371,0.031,0.024459,0.00099999 + 2.8775 + + + 359.9 + + + 8.44 + 4.1733,2.1193,0.29658,1.5 + 1.5828,1.0705,0.97431,0 + 6.68 + 1 + 0.51386 + -20.942,6.585,-13.92,1 + + HoloBeam + 0.0525,0.35,0.08272,0.63 + 1.2641 + + -25.939,8.4916,-13.73,1 + 59.804 + 1.101,1.048,1.5,1.5 + + <_>MULTIPLAYER + 7.3599 + -19.8 + 22.287 + -150.6 + center + 0.038578,1,0.019,1 + 3 + 0.14 + 1.4238 + 1.4078 + 1280 + 0.13036,0.931,0,0.38 + + 12.4 + + + 1.86 + 2.1521,2.1516,2.1561,1.5 + 0.97805,0.978,1.001,0 + 5.78 + 1 + 1.6039 + -26.442,5.6856,-15.681,1 + + -26.653,5.747,-17.604,1 + 12 + 1.101,1.048,1.5,1.5 + true + + <_>blank + 9.7998 + 4.2558 + -9 + 240.8 + 13.85 + -227.4 + center + 1,1,1,1 + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.13426,0.81,0.0243,0.00099999 + 5.1298 + + 3 + 0.14 + 15 + 5 + 0.372,0.506,0.981,0.63 + + + + <_>AND + <_>NOT + <_>RACER + + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.025371,0.031,0.024459,0.00099999 + 2.8775 + + + 359.9 + + + 1.86 + 2.1521,2.1516,2.1561,1.5 + 0.97805,0.978,1.001,0 + 5.78 + 1 + 1.6039 + -26.376,6.0589,-13.696,1 + + -37.74,6.0749,-13.944,1 + 16.614 + 1.101,1.048,1.5,1.5 + true + + <_>blank + 9.7998 + 4.2558 + -9 + 240.8 + 13.85 + -227.4 + center + 1,1,1,1 + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.13426,0.81,0.0243,0.00099999 + 5.1298 + + 3 + 0.14 + 15 + 5 + 0.372,0.506,0.981,0.63 + + + + <_>AND + <_>NOT + <_>RACER + + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.025371,0.031,0.024459,0.00099999 + 2.8775 + + + 359.9 + + + 1.86 + 2.1521,2.1516,2.1561,1.5 + 0.97805,0.978,1.001,0 + 5.78 + 1 + 1.1852 + 1.2841,6.026,-12.626,1 + + 0.93245,5.9668,-7.0815,1 + 9.4059 + 1.101,1.048,1.5,1.5 + true + + <_>blank + 9.7998 + 4.2558 + -9 + 240.8 + 13.85 + -227.4 + center + 1,1,1,1 + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.13426,0.81,0.0243,0.00099999 + 5.1298 + + 3 + 0.14 + 15 + 5 + 0.372,0.506,0.981,0.63 + + + + <_>AND + <_>NOT + <_>RACER + + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.025371,0.031,0.024459,0.00099999 + 2.8775 + + + 1.7 + + + 9.88 + 1.4481,0.65475,0.53979,1.5 + 1.109,0.216,1.467,0 + 6.68 + -1 + 0.49239 + -26.654,6.3678,-12.477,1 + + HoloBeam + 0.045,0.3,0.1015,0.61 + 1.5032 + HoloUnit + + -26.66,4.9439,-10.297,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>GARAGE + -7.0003 + 9.2436 + -19.8 + 50.4 + 19.416 + -150.6 + center + 0.44,1,0,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + 27.3 + + + 9.88 + 1.4481,0.65475,0.53979,1.5 + 1.109,0.216,1.467,0 + 6.68 + -1 + 0.49239 + -26.64,6.3481,-14.65,1 + + HoloBeam + 0.045,0.3,0.1015,0.61 + 1.5032 + HoloUnit + + -26.64,4.9526,-17.25,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>GARAGE + -7.0003 + 9.2436 + -19.8 + 50.4 + 19.416 + -150.6 + center + 0.44,1,0,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + 27.3 + + + 9.88 + 1.4481,0.65475,0.53979,1.5 + 1.109,0.216,1.467,0 + 6.68 + -1 + 0.49239 + -14.195,12.401,-3.0124,1 + + HoloBeam + 0.045,0.3,0.1015,0.61 + 1.5032 + HoloUnit + + -11.677,10.072,-2.9768,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>GARAGE + -7.0003 + 9.2436 + -19.8 + 50.4 + 19.416 + -150.6 + center + 0.44,1,0,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,1 + + 27.3 + + + 9.88 + 1.4481,0.65475,0.53979,1.5 + 1.109,0.216,1.467,0 + 6.68 + -1 + 0.49239 + -14.08,12.059,3.4644,1 + + HoloBeam + 0.045,0.3,0.1015,0.61 + 1.5032 + HoloUnit + + -11.67,10.066,3.4032,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>GARAGE + -7.0003 + 9.2436 + -19.8 + 50.4 + 19.416 + -150.6 + center + 0.44,1,0,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.35316,0.49128,0.981,1 + + 27.3 + + + 9.88 + 2.0962,0.79739,1.4189,1.5 + 1.4422,2.0545,1.286,0 + 6.68 + -1 + 0.49239 + -19.151,5.2331,16.22,1 + + HoloBeam + 0.0975,0.25133,0.65,0.75 + 2.4685 + HoloUnit + + -19.154,4.9607,19.998,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>Sodium_Hub + -7.0003 + 6.2835 + -19.8 + 50.4 + 14.393 + -150.6 + center + 0.99956,1,0.999,1 + 3 + 0.14 + 15 + 5 + 1280 + 0,0.21584,0.981,0.63 + + 20.7 + + + 9.88 + 1.4481,0.65475,0.53979,1.5 + 1.109,0.216,1.467,0 + 6.68 + + <_>AND + <_>RACER + + -1 + 0.49239 + -35.451,6.1578,-13.929,1 + + HoloBeam + 0.045,0.3,0.1015,0.61 + 1.5032 + HoloUnit + + -37.342,4.9621,-13.938,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>MULTIPLAYER + 5.5997 + 9.2436 + -19.8 + 95.2 + 19.416 + -150.6 + center + 0.44,1,0,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + 27.3 + + + 9.88 + 2.0962,0.79739,1.4189,1.5 + 1.4422,2.0545,1.286,0 + 6.68 + -1 + 0.49239 + -19.103,5.5965,-15.531,1 + + HoloBeam + 0.3,0.045,0.1364,0.75 + 2.4685 + HoloUnit + + -19.13,4.9515,-19.763,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>SodiumOne + -7.0003 + 6.2835 + -19.8 + 50.4 + 14.393 + -150.6 + center + 0.99956,1,0.999,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.981,0,1.684e-05,0.63 + + 20.7 + + + 9.88 + 1.4421,1.379,1.0167,1.5 + 1.8698,1.1111,0.77085,0 + 6.68 + + <_>AND + <_>RACER + + 0.46 + 1.1852 + -11.088,5.4876,-11.156,1 + + HoloBeam + 0.045,0.3,0.1015,0.75 + 1.9117 + + -10.959,5.0841,-7.2328,1 + 12 + 1.101,1.048,1.5,1.5 + + <_>Main_Menu + 9.7998 + 5.4219 + -9 + 240.8 + 10.741 + -227.4 + center + 0.44852,1,0.189,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.29715,0.451,0.28377,0.63 + + 17.3 + + + 19.18 + 1.0729,0.81162,0.66361,1.5 + 1.109,0.216,1.467,0 + 19.26 + -1 + 0.49239 + -3.948,5.4433,-13.751,1 + + HoloBeam + 0.083763,0.15,0,0.75 + 1.5479 + HoloUnit + + -3.9465,5.0941,-14.986,1 + 5.9928 + 1.101,1.048,1.5,1.5 + true + + <_>FastForward1 + -7.0003 + 19.834 + -19.8 + 50.4 + 30 + -150.6 + center + 0.26,1,0,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + + <_>FastForward3 + -7.0003 + 19.834 + -19.8 + 50.4 + 30 + -150.6 + center + 0.98,1,0,1 + + <_>AND + <_>FastForward + + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + 28 + + + 9.88 + 1.7077,0.96661,3.2654,1.5 + 1.239,0.11124,1.3988,0 + 6.68 + 0 + -1 + 0.49239 + -36.08,6.7497,-13.918,1 + + HoloBeam + Holo_Screen1 + 0.045,0.116,0.3,0.75 + 1.6083 + HoloUnit + + -38.982,5.3453,-13.974,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>Session_List + <_>Coming_Soon + -2.8002 + 9.2436 + 12.6 + 375.2 + 19.416 + -275.4 + center + 1280 + + 27 + + + 19.18 + 1.0729,0.81162,0.66361,1.5 + 1.109,0.216,1.467,0 + 19.26 + -1 + 0.49239 + -2.0177,5.4546,-13.661,1 + + HoloBeam + 0.083763,0.15,0,0.75 + 1.5479 + HoloUnit + + -2.0233,5.0825,-14.993,1 + 5.9928 + 1.101,1.048,1.5,1.5 + true + + <_>FastForward1 + -7.0003 + 19.834 + -19.8 + 50.4 + 30 + -150.6 + center + 0.26,1,0,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + + <_>FastForward3 + -7.0003 + 19.834 + -19.8 + 50.4 + 30 + -150.6 + center + 0.98,1,0,1 + + <_>AND + <_>FastForward + + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + 28 + + + 9.88 + 1.4421,1.379,1.0167,1.5 + 1.8698,1.1111,0.77085,0 + 6.68 + + <_>AND + <_>NOT + <_>RACER + + 0.46 + 1.1852 + 0.94435,5.3569,-10.934,1 + + HoloBeam + 0.045,0.3,0.1015,0.75 + 1.9117 + + 0.93407,5.0856,-7.2015,1 + 12 + 1.101,1.048,1.5,1.5 + + <_>Sodium2-ProjectVelocity + <_>Is_downloading + 9.7998 + 5.4219 + -9 + 240.8 + 10.741 + -227.4 + center + 0.44852,1,0.189,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.29715,0.451,0.28377,0.63 + + + <_>Please_wait + 5.4219 + 10.741 + center + 0.44852,1,0.189,1 + + <_>AND + <_>Timer_5sec + + 3 + 0.14 + 15 + 5 + 1280 + 0.29715,0.451,0.28377,0.63 + + 17.3 + + + 9.88 + 1.4421,1.379,1.0167,1.5 + 1.8698,1.1111,0.77085,0 + 6.68 + + <_>AND + <_>RACER + + 0.46 + 1.1852 + 0.94435,5.3569,-10.934,1 + + HoloBeam + 0.045,0.3,0.1015,0.75 + 1.9117 + + 0.93407,5.0856,-7.2015,1 + 12 + 1.101,1.048,1.5,1.5 + + <_>Main_Menu + 9.7998 + 5.4219 + -9 + 240.8 + 10.741 + -227.4 + center + 0.44852,1,0.189,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.29715,0.451,0.28377,0.63 + + 17.3 + + + 9.88 + 1.6378,0.78674,0.53357,1.5 + 1.1027,0.082255,1.37,0 + 6.68 + + <_>AND + <_>NOT + <_>RACER + + -1 + 0.49239 + -35.465,6.172,-13.954,1 + + HoloBeam + 0.045,0.3,0.1015,0.61 + 1.5032 + HoloUnit + + -37.344,4.9582,-13.94,1 + 5.9928 + 1.101,1.048,1.5,1.5 + + <_>MULTIPLAYER + <_>Is_downloading + 30.8 + 9.2436 + -12.6 + 386.4 + 19.416 + -289.8 + center + 0.44,1,0,1 + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + + <_>Please_wait + 22.4 + 9.2436 + -19.8 + 61.6 + 19.416 + -150.6 + center + 0.44,1,0,1 + + <_>AND + <_>Timer_5sec + + 3 + 0.14 + 15 + 5 + 1280 + 0.372,0.506,0.981,0.63 + + 27.3 + + + 1.86 + 2.1521,2.1516,2.1561,1.5 + 0.97805,0.978,1.001,0 + 5.78 + 1 + 1.6039 + -15.05,10.959,-2.8957,1 + + -11.48,10.911,-2.9884,1 + 12 + 1.101,1.048,1.5,1.5 + true + + <_>blank + 9.7998 + 4.2558 + -9 + 240.8 + 13.85 + -227.4 + center + 1,1,1,1 + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.13426,0.81,0.0243,0.00099999 + 5.1298 + + 3 + 0.14 + 15 + 5 + 0.372,0.506,0.981,0.63 + + + + <_>AND + <_>NOT + <_>RACER + + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.025371,0.031,0.024459,0.00099999 + 2.8775 + + + 359.9 + + + 1.86 + 2.1521,2.1516,2.1561,1.5 + 0.97805,0.978,1.001,0 + 5.78 + 1 + 1.6039 + -14.611,10.836,3.4414,1 + + -11.473,10.914,3.3886,1 + 12 + 1.101,1.048,1.5,1.5 + true + + <_>blank + 9.7998 + 4.2558 + -9 + 240.8 + 13.85 + -227.4 + center + 1,1,1,1 + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.13426,0.81,0.0243,0.00099999 + 5.1298 + + 3 + 0.14 + 15 + 5 + 0.372,0.506,0.981,0.63 + + + + <_>AND + <_>NOT + <_>RACER + + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.025371,0.031,0.024459,0.00099999 + 2.8775 + + + 359.9 + + + 1.86 + 2.1521,2.1516,2.1561,1.5 + 0.97805,0.978,1.001,0 + 5.78 + + <_>AND + <_>NOT + <_>RACER + + 1 + 1.1852 + -11.054,5.8951,-11.82,1 + + -10.959,6.0178,-7.1202,1 + 3.2679 + 1.101,1.048,1.5,1.5 + true + + <_>blank + 9.7998 + 4.2558 + -9 + 240.8 + 13.85 + -227.4 + center + 1,1,1,1 + + + 5 + 0.14 + 4.9 + 0.0059994 + + 7.1526e-07 + 2.124 + 0.192 + 1.776 + 1.0196 + pad_1 + 90,0.00018312,270,0 + -0.5592 + 100,-0.0018704,-0.0020564,0 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/TestTexture.dds + 0.025371,0.031,0.024459,0.00099999 + 2.8775 + + 3 + 0.14 + 15 + 5 + 0.372,0.506,0.981,0.63 + + 359.9 + + + 4.44 + 1.2937,1.1002,0.16974,1.5 + 1.0737,1.0507,0.88889,0 + 4.96 + -3.7253e-09 + 0.49239 + 1.3691,6.7721,-14.73,1 + + 0.00055841,0.00099999,0,0.75 + 1.5479 + plain_screen + + 1.505,6.7574,-16.223,1 + 7.919 + 1.9115,1.5636,1.5,1.5 + true + + <_>Key + <_>blank + <_>Friend + <_>Challenger + <_>LocalPlayer + -364 + 4.7644 + 1.8 + 352.8 + 6.08 + -112.2 + left + 0.99926,1,0.999,1 + + -0.33 + 0.046 + -0.08 + 0.328 + Holo_Screen1 + 0.0055075 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/Friend.dds + 1,1,1,1 + 2.9511 + + 3 + 0.14 + 15 + 5 + 0.372,0.506,0.981,0.63 + + 356.4 + + + 9.88 + 1.9,4.7581,1.8954,1.5 + 0.93784,0.089205,1.1725,0 + 6.68 + + <_>AND + <_>RACER + + -0.9 + 1 + 1.1852 + -4.6215,6.0453,-15.081,1 + + HoloBeam + Holo_Screen1 + 0.112,0.045,0.3,0.75 + 2.2142 + HoloUnit + + -4.6262,5.3636,-16.291,1 + 12 + 1.6533,1.9895,1.5,1.5 + + <_>blank + + 13.5 + + + 9.88 + 1.9,4.7581,1.8954,1.5 + 0.93784,0.089205,1.1725,0 + 6.68 + + <_>AND + <_>RACER + + -0.9 + 2.5034 + 1.1852 + -1.3497,5.9852,-15.106,1 + + HoloBeam + Holo_Screen1 + 0.112,0.045,0.3,0.75 + 2.2142 + HoloUnit + + -1.3457,5.3027,-16.397,1 + 12 + 1.6533,1.9895,1.5,1.5 + + <_>blank + + 13.5 + + + 9.88 + 7.6569,14.012,5.9648,1.5 + 0.68946,2.0008,0.24478,0 + 6.68 + 0 + + <_>AND + <_>RACER + + 1 + 3.25 + 1.1852 + -39.914,13.087,-6.6711,1 + + HoloBeam + Holo_Screen1 + 0.112,0.045,0.3,0.75 + 2.2142 + HoloUnit + + -42.961,9.8276,-7.4628,1 + 31.711 + 1.1088,0.35716,0.94029,1.5 + + <_>blank + + 11.072 + + + 9.88 + 3.9799,2.0637,0.8811,1.5 + 1.097,0.19168,1.088,0 + 6.68 + + <_>AND + <_>RACER + + -1 + 1.1852 + -3.0339,4.8931,-14.455,1 + + HoloBeam + 0.045,0.116,0.3,0.75 + 2.4685 + HoloUnit + + -3.0488,5.3611,-16.317,1 + 12 + 1.3725,1.2497,1.5,1.5 + + <_>holoboard_channel_name + -7.0003 + 5.0277 + -19.8 + 50.4 + 13.915 + -150.6 + center + 0.189,0.417,0.86,1 + 2.24 + 0.14 + 15 + 5 + 1280 + 0.372,0.981,0.981,0.35 + + 50.435 + + + 9.88 + 3.9799,2.7532,0.8811,1.5 + 1.097,0.61236,1.088,0 + 6.68 + + <_>AND + <_>RACER + + -0.0041076 + 1.1852 + -33.456,8.4024,-5.038,1 + + HoloBeam + 0.045,0.116,0.3,0.75 + 2.4685 + HoloUnit + + -43.081,9.81,-7.4062,1 + 31.336 + 2.061,2.0736,1.5,1.5 + + <_>holoboard_channel_name + -7.0003 + 5.835 + -19.8 + 50.4 + 16.785 + -150.6 + center + 0.189,0.417,0.86,1 + 2.24 + 0.14 + 15 + 5 + 1280 + 0.372,0.981,0.981,0.35 + + 11.302 + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/racer_scene/V3.3/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/racer_scene/V3.3/en-GB.xml new file mode 100644 index 000000000..c59bc07f3 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/racer_scene/V3.3/en-GB.xml @@ -0,0 +1,526 @@ + + Speed Records + Industrial Sector + Rocky Speedway + Descent + Wasteland Spires + Industrial Sector (Reverse) + Rocky Speedway (Reverse) + Descent (Reverse) + Wasteland Spires (Reverse) + Leaderboards + Sodium Hub + Sodium One + 1x + 3x + Main Menu + Main Menu + Quantity + Continue + Shop + Maximum Thrust + Turning + Track Select + Loading + Buy + Commerce Point + Commerce Point + Acceleration + Speed + Air-Brake Left + Rocket Boosters + Accelerate + Steer + Reverse Camera + Air-Brake Right + Save your vehicle loadout? + Current + Next + Current Level + Next Level + Coming Soon! + Coming Soon! + Purchase + You have reached level %d! + Do you wish to buy %s? + Do you wish to purchase %s? + Turning + Reverse + Taunt + Declare Victory! + Rank + Navigate +
Details
+ Cost Per %d: + Cost: + Commerce Point Item + Description + Garage + Jet Parts Shop + View Replay + REPLAY + Dark Planet (Reverse) + Rocky Speedway + Soar through these ancient and monumental valleys to achieve blistering speeds in your Sodium2 craft! + This track was constructed over the roads that once led in and out of the long abandoned tunnels and refineries of a former mining settlement. + Soar through these ancient and monumental valleys to achieve blistering speeds in your Sodium2 craft! This course takes a reverse route through the track. + Dark Planet + Industrial Sector + This track was constructed over the roads that once led in and out of the long abandoned tunnels and refineries of a former mining settlement. This course takes a reverse route through the track. + Industrial Sector (Reverse) + Rocky Speedway (Reverse) + Rocket Booster + Land Speed Records + Power + Stability + Supersonic in + Max Speed + You have run out of mounted Rocket Boosters. Tweak vehicle? + You have new equipment in your garage. + You have empty booster mounts. + Tweak vehicle before race? + It's on! + Did you confuse your air brakes and the accelerator again? Listen carefully, Sodium2, #track#, bring your game face, class is in session. \n\nThis message was sent by a friend from the game Sodium2 by Lockwood Publishing. Lockwood will not store your Online ID. + Is it a bird?... + Vrooooooooooooooooooooooooooooooooooooooooooooooooooooom!!! Whoosh!! BOOM!! If you’re hearing that, I think my racer just buzzed you on #track#. Sodium2 gauntlet laid down. Do you want to accept? \n\nThis message was sent by a friend from the game Sodium2 by Lockwood Publishing. Lockwood will not store your Online ID. + Victory is mine! Rank: #rank# + Your lap time for #track# has now crumbled under the awesomeness of my skillfully controlled jetcraft! The new time to beat is #time#. Best of luck! You're gonna need it! \n\nThis message was sent by a friend from the game Sodium2 by Lockwood Publishing. Lockwood will not store your Online ID. + Leave feedback in our survey to make your mark on the final design of Sodium2! + Remember to use your air brakes by pressing [L1] or [R1] when going into a corner. Air brakes are incredibly effective in giving you extra turning capability. + Upgrading your vehicle can provide you with explosive performance. Visit the Sodium2 shop to acquire enhanced components, then equip them in the garage. + Time your Rocket Boosters carefully. Finding the perfect spots to let them rip will help you shave much coveted seconds off your best time. + Chasing that perfect racing line will help you gain higher levels of XP for each race. + Want more control into those sharp bends? Upgrade to the %s aerofoils for extreme manoeuverability. + Need that extra burst of acceleration? The %s packs an awesome punch to get you out of tight situations. + Impress your friends with the %s premium paint scheme. This radical HDC design features go-faster everything! + Flight computers provide much needed stability to your Sodium Velocity Racer. Just what you need to counteract the destabilising effects of powerful afterburners. + Remember, you can use rocket boosters to propel yourself out of tight bends! These %s boosters provide a versatile solution to such predicaments. + If you're desperate for that extra injection of speed and acceleration then check out our %s afterburners. Just what you need to gain those precious few seconds over your friends. + To find the perfect racing line you need control to hit the sweet spot on every corner. When you need the surgical touch rather than sledgehammer acceleration a set of %s aerofoils will have your jet racer handling like it's on rails. + Naught to infinity in an eye blink with %s Rocket Boosters, putting the BANG! in explosive acceleration. + They may only see a blur overtaking them, but you can't be a champion if you don't look the part. Look 1000 mph even when you're standing still with the %s premium paint scheme. So hot it burns. + In Project Velocity you need nerves of steel, and to be ice cold under pressure. A Flight Computer's onboard AI is the steady hand you need to keep control on the ragged edge. + Luck favours the prepared mind in Jet racing. Too much torque and they'll be washing you off the wreckage, too much control and they'll think you never left the garage. %s rocket boosters have the versatility you need. + There is no second place, at 1000 mph an eyeblink is the difference between victory or failure. Need an explosion of speed to beat the other guy to the line? %s afterburners, when break neck is the only speed you need. + Show that Sodium Velocity Racer who's boss. %s aerofoils help you maintain control on even the tightest of bends. + Blast ahead of your friends with %s Rocket Boosters. + Beat them in style with the %s premium paint scheme. It's the colour of win! + Afterburners made things a little unstable? Let the flight computer handle it while you concentrate on victory. + Don't get left behind! Use %s boosters to get out of tight spots. + Need to shave seconds off your time? %s afterburners will give you that race-winning extra speed. + Smooth through corners.\nReduce overtaking possibilties.\nProtect your lead. + Instant acceleration.\nGain the advantage.\nWin the race. + Look awesome.\nBe the envy of your friends.\nLook great during replays. + More stability.\nReduce pilot error.\nBecome an expert pilot. + Don't get left behind.\nExplosive acceleration.\nSet impressive record times. + Hold your nerve.\nBreak the sound barrier.\nBecome the leader. + Increased control and handling into corners is only for those who are confident in their reflexes. Are you skilled enough to handle the advantage? + You probably couldn't handle the punchy acceleration of the %s rocket boosters. + Are you one to blend in with the crowd? + Its not really fair on others to buy a flight computer… but who would know? + The safest rocket boosters in Sodium racing. What could possibly go wrong? Nothing. Nothing at all… Nothing. + Can you handle the increased turbulence created by the explosive acceleration of the BONESHAKER rocket boosters? Didn't think so. + Change Mount + Open Mount + Mount + Purchase this item? + Owned + Insufficient funds. + Please Wait + Please Wait + Handy Tip! + Give Feedback! + No Thanks. + Exit Replay + Race Again + Would you like to race again? + Exit Garage + Your loadout has changed.\nSave your new loadout? + Save + Don't Save + Multiplayer mode will be added soon!\n\nCheck out http://www.sodiumone.com regularly for news and updates. + This is the Sodium2 multiplayer access point. + Would you like to proceed to the multiplayer area? + Arcade mode will be added soon!\n\nCheck out http://www.sodiumone.com regularly for news and updates. + Purchase these items? + Congratulations! You have successfully bought this item! + Congratulations! You have successfully bought these items! + Don't Buy + New Level Achieved! + Shop + [Sodium2] Project Velocity + Ultra hi-speed racing game. [#Legal] + en-US + CONGRATULATIONS! + You have earned: + Sodium Credits + Connection to data server lost + Connection to data server established + Communicating with data server + There was a problem connecting to the data server, your progress may not be saved if you choose to continue + [DECLINE] to Exit + [R1] and [L1] Change Player + [ACCEPT] Change Camera + Race + Help & Options + Controls + Exit + FAQ + Settings + Garage + Single Player + Multiplayer (PS3) + Quick Race + Arcade + Real-time + Challenge + Challenge Inbox + Create + Scroll + + Back + Terranova Pass + Industrial Sector + Firmus Canyon + League 1 + League 1 Description + Track 0 Description + Track 1 Description + Track 2 Description + Join + Length (Miles): + Name: + Description: + Difficulty: + Easy + Normal + Hard + Test Commerce + [UP] + [DOWN] + [LEFT] + [RIGHT] + [UP][DOWN] + [LEFTSTICK] + [RIGHTSTICK] + [L1] + [L2] + [L3] + [R1] + [R2] + [R3] + [TRIANGLE] + [ALL_REGION_CROSS] + [SQUARE] + [ALL_REGION_CIRCLE] + [ACCEPT] + [DECLINE] + [SELECT] + [UP][DOWN][LEFT][RIGHT] + [LEFT][RIGHT] + [START] + [Sodium2] Project Velocity + Rocket Booster Mount 1 + Rocket Booster Mount 2 + Fuel + Fuel Additives + Fuel Tank + Afterburner + Engine + Air Brakes + Chassis + Flight Computer + Air Intakes + Paint Scheme + Hover Engines + Stabilisers + Control Surfaces + Aerofoils + Inbox + + Time Remaining + Title + Challenge Title + Status + Name + Challenge Name + Track + Duration + Days + Hours + Minutes + Seconds + Entry Fee + Prize + Credits + Scroll + Select + OK + Cancel + Players + Create Challenge? + Creating Challenge + Please wait + Congratulations! + Do you want to create this challenge? + Your entry fee will be deducted now if you accept. + Failed to connect to server. + Please try again in a moment. + All other players have been invited. + Go to your inbox to view your challenges. + Go to your challenge inbox to view your challenges. + Delete Challenge? + Do you want to cancel this challenge. + You will lose this challenge setup if you accept. + Decline + Accept Challenge? + Did you want to accept this challenge? + Accepting Challenge + You are now part of this challenge. + Good luck! + Challenge Accept Failed + Decline Challenge? + Do you want to decline this challenge? + This challenge will be deleted from your inbox if you accept. + WARNING + Are you sure you want to decline this challenge. + You will not be able to participate if you accept. + Race + Collect Winnings + View Race + You came in %s place. + First + Second + Third + Create Challenge + Mach + Finished + All-Time Best + Daily Best + Kph + Leader + Mph + Min + + ms + Friends + Sec + Name + Details + [ACCEPT] Accept + Please Wait… + Accept + The punishing bends, bridges and tunnels surrounding this mysterious off-world research facility mean that this track is not for the faint of heart. This course takes a reverse route through the track. + The punishing bends, bridges and tunnels surrounding this mysterious off-world research facility mean that this track is not for the faint of heart. + Feedback + Survey + Mount Denied! + %s not currently owned. View in shop? + Welcome + %s not currently owned. View in the Commerce Point? + %s not currently owned. Would you like to purchase it? + Your purchase has been completed. + Thank you. + Well done pilot! In light of your new promotion, you can now purchase the %s %s from the garage! + It's your lucky day rookie! You may now purchase the %s %s from the garage! + Another item has been unlocked! Look out for the %s %s in the garage! + Congratulations, you’ve unlocked the %s %s in the garage! + Another XP level reached! You’ve now unlocked the %s %s in the garage. + Your awesome skills have unlocked the %s %s from the garage. Well done! + In recognition of your hard work, the %s %s has now been unlocked in the garage for you to purchase. + %s Unlocked + %s not currently owned. Would you like to purchase some? + Deselect + Send Taunt + Send Taunts + Taunt Friends + Select Friend + Skip + Close + You cannot mount the %s to your jetcraft as you do not own it. %s + Would you like to buy some %s %s from the Commerce Point? + Would you like to buy the %s %s from the Commerce Point? + Would you like to buy some %s %s with your Sodium Credits? + Would you like to buy the %s %s with your Sodium Credits? + Checkout + Unit of Mass + kg + lbs + Mass + Terms of Service + Download is subject to the PlayStation Network Terms of Service/User Agreement and any specific additional conditions applying to this item. If you do not wish to accept these terms, do not download this item. Download is licensed or sublicensed to you for use solely within PlayStation Home by the purchasing PSN account. Content may not be used by any other account. + Fuel Additives + Fuel Canisters + Rival + Rivals + Key + Friend + Local Player + Challenger + Perfect! + Great! + Good + Almost + Whoops! + Weak Boost + Average Boost + Awesome Boost! + Perfect Boost! + Too Late + Use + Rocket Boosters + Change Player + Change Camera + Race Results + Winner + Move + Create Session + New Session + Level + Discard + Discard Session? + Warning: You will lose your session setup! + Session Name + Please enter a session name. + Create! + Please enter a stake. + I'm Sorry + Please do not enter rude words! + Create Session + Name + Access + Class + Stake + Voting + Session List + Session List + Owner + New + Lobby + Connection + Waiting for players + Vote + Waiting for track votes + Vote Sent! + You have voted for %s. + Please choose a track! + Random + Track Vote + Please vote now! + Track Chosen + Get ready to race on %s! + Voted! + Ready! + Joining Lobby + Unable to join lobby. + Access Denied! + This is a private session, please select another. + This session is full, please select another. + You have exceeded the vehicle class limit for this session, please reconfigure your vehicle in the garage. + Vehicle class ratings about %d stars cannot race in this session, please change your loadout in the garage or select another session. + Max Class + Maximum Class + Your %d star vehicle is too powerful for a %d star session. Please adjust the session or adjust your vehicle in the garage. + Your %d star vehicle is too powerful for this %d star session. Please select another session or adjust your vehicle in the garage. + %s has left the game + %s has joined the game + %s has left the lobby + %s has joined the lobby + Your class %d vehicle is too powerful for a class %d session. Please adjust the session or adjust your vehicle in the garage. + Your class %d vehicle is too powerful for this class %d session. Please select another session or adjust your vehicle in the garage. + This is a class %d session and your vehicle is class %d. Please adjust the session class or modify your vehicle loadout in the garage. + This is a class %d session and your vehicle is class %d. Please select another session or modify your vehicle loadout in the garage. + 1st + 2nd + 3rd + st + nd + rd + Waiting for other players... + Results + Friends + Everyone + Player Left + Played Joined + Jet Part Class: + Item Class: + Vehicle Class: + Press %s to create a session + Press %s to toggle ready on + Press %s to toggle ready off + %s has reached level %d + %s has achieved level %d + %s has been promoted to level %d + %s has unlocked level %d + Congratulations %s for reaching level %d + %s has levelled up and is now level %d + %s is now level %d + Award + Scoreboard + Racing + Racing! + Unable to join this session as a race is in progress. Please try again later or select another session. + Exit Session + Are you sure you want to exit this session? + Update Quantity + Pairs Owned + Open + Item Not Available + You must be level %s to mount this item + You must be level %s to purchase this item. + Server communication problem. + Empty Rocket Booster Mount + Do you wish to continue racing without any rocket boosters? + The garage is not available yet. Come back when you have gained more experience. + Messages Sent + Your friends have just been taunted! + Message Sent + You have just taunted your friend! + Purchase More + This session is for %d star vehicles only. + Would you like to use your last %d star vehicle loadout? + ? + Music + Controller Vibration + Unit of Speed + On + Off + Mph + Kph + Sodium2 is downloading + Timed Out + You have been disconnected from this session due to inactivity. + Boast + Continue? + Please only send messages to friends who will be happy to receive them. Your online ID will be displayed in this message. + Victory! + It's on! + Is it a bird?... + Victory! + Did you confuse your air brakes and the accelerator again? Listen carefully, Sodium2, #track#, bring your game face, class is in session. + Vrooooooooooooooooooooooooooooooooooooooooooooooooooooom!!! Whoosh!! BOOM!! If you’re hearing that, I think my racer just buzzed you on #track#. Sodium2 gauntlet laid down. Do you want to accept? + Your lap time for #track# has now crumbled under the awesomeness of my skillfully controlled jetcraft! The new time to beat is #time#. Best of luck! You're gonna need it! + This message was sent by a friend from the game Sodium2 by Lockwood Publishing. Lockwood will not store your Online ID. + Send Boast + Send Boasts + Boast to Friends + Quick Loadout + Set the loadout of your jetcraft quickly by selecting a class. + Denied! + A class #classNum# loadout cannot be created. #nextSentence# + You do not own any items of this class. Try purchasing a class #classNum# item so this loadout can be generated. + You do not own any items of this class and there are none available for you to purchase. Try increasing your XP level rookie! + #track_name# has downloaded! + #track_name# is currently downloading. #notification# + Please remain in the Sodium 2 space for the download to complete. + A download notification will appear when it is ready. + You cannot access the multiplayer game yet as some tracks are still downloading. + All tracks have downloaded! + #game_name# is now accessible. + This session uses #track_pack_name#, which is currently downloading. Please select another session. #notification# + #player_name# has finished the race in #rank# place! + #player_name# has finished the race! + Congratulations! + You have earned #rewardName#! + You have earned the #rewardName#! +
diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/racer_scene/V3.3/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/racer_scene/V3.3/en-US.xml new file mode 100644 index 000000000..c59bc07f3 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/racer_scene/V3.3/en-US.xml @@ -0,0 +1,526 @@ + + Speed Records + Industrial Sector + Rocky Speedway + Descent + Wasteland Spires + Industrial Sector (Reverse) + Rocky Speedway (Reverse) + Descent (Reverse) + Wasteland Spires (Reverse) + Leaderboards + Sodium Hub + Sodium One + 1x + 3x + Main Menu + Main Menu + Quantity + Continue + Shop + Maximum Thrust + Turning + Track Select + Loading + Buy + Commerce Point + Commerce Point + Acceleration + Speed + Air-Brake Left + Rocket Boosters + Accelerate + Steer + Reverse Camera + Air-Brake Right + Save your vehicle loadout? + Current + Next + Current Level + Next Level + Coming Soon! + Coming Soon! + Purchase + You have reached level %d! + Do you wish to buy %s? + Do you wish to purchase %s? + Turning + Reverse + Taunt + Declare Victory! + Rank + Navigate +
Details
+ Cost Per %d: + Cost: + Commerce Point Item + Description + Garage + Jet Parts Shop + View Replay + REPLAY + Dark Planet (Reverse) + Rocky Speedway + Soar through these ancient and monumental valleys to achieve blistering speeds in your Sodium2 craft! + This track was constructed over the roads that once led in and out of the long abandoned tunnels and refineries of a former mining settlement. + Soar through these ancient and monumental valleys to achieve blistering speeds in your Sodium2 craft! This course takes a reverse route through the track. + Dark Planet + Industrial Sector + This track was constructed over the roads that once led in and out of the long abandoned tunnels and refineries of a former mining settlement. This course takes a reverse route through the track. + Industrial Sector (Reverse) + Rocky Speedway (Reverse) + Rocket Booster + Land Speed Records + Power + Stability + Supersonic in + Max Speed + You have run out of mounted Rocket Boosters. Tweak vehicle? + You have new equipment in your garage. + You have empty booster mounts. + Tweak vehicle before race? + It's on! + Did you confuse your air brakes and the accelerator again? Listen carefully, Sodium2, #track#, bring your game face, class is in session. \n\nThis message was sent by a friend from the game Sodium2 by Lockwood Publishing. Lockwood will not store your Online ID. + Is it a bird?... + Vrooooooooooooooooooooooooooooooooooooooooooooooooooooom!!! Whoosh!! BOOM!! If you’re hearing that, I think my racer just buzzed you on #track#. Sodium2 gauntlet laid down. Do you want to accept? \n\nThis message was sent by a friend from the game Sodium2 by Lockwood Publishing. Lockwood will not store your Online ID. + Victory is mine! Rank: #rank# + Your lap time for #track# has now crumbled under the awesomeness of my skillfully controlled jetcraft! The new time to beat is #time#. Best of luck! You're gonna need it! \n\nThis message was sent by a friend from the game Sodium2 by Lockwood Publishing. Lockwood will not store your Online ID. + Leave feedback in our survey to make your mark on the final design of Sodium2! + Remember to use your air brakes by pressing [L1] or [R1] when going into a corner. Air brakes are incredibly effective in giving you extra turning capability. + Upgrading your vehicle can provide you with explosive performance. Visit the Sodium2 shop to acquire enhanced components, then equip them in the garage. + Time your Rocket Boosters carefully. Finding the perfect spots to let them rip will help you shave much coveted seconds off your best time. + Chasing that perfect racing line will help you gain higher levels of XP for each race. + Want more control into those sharp bends? Upgrade to the %s aerofoils for extreme manoeuverability. + Need that extra burst of acceleration? The %s packs an awesome punch to get you out of tight situations. + Impress your friends with the %s premium paint scheme. This radical HDC design features go-faster everything! + Flight computers provide much needed stability to your Sodium Velocity Racer. Just what you need to counteract the destabilising effects of powerful afterburners. + Remember, you can use rocket boosters to propel yourself out of tight bends! These %s boosters provide a versatile solution to such predicaments. + If you're desperate for that extra injection of speed and acceleration then check out our %s afterburners. Just what you need to gain those precious few seconds over your friends. + To find the perfect racing line you need control to hit the sweet spot on every corner. When you need the surgical touch rather than sledgehammer acceleration a set of %s aerofoils will have your jet racer handling like it's on rails. + Naught to infinity in an eye blink with %s Rocket Boosters, putting the BANG! in explosive acceleration. + They may only see a blur overtaking them, but you can't be a champion if you don't look the part. Look 1000 mph even when you're standing still with the %s premium paint scheme. So hot it burns. + In Project Velocity you need nerves of steel, and to be ice cold under pressure. A Flight Computer's onboard AI is the steady hand you need to keep control on the ragged edge. + Luck favours the prepared mind in Jet racing. Too much torque and they'll be washing you off the wreckage, too much control and they'll think you never left the garage. %s rocket boosters have the versatility you need. + There is no second place, at 1000 mph an eyeblink is the difference between victory or failure. Need an explosion of speed to beat the other guy to the line? %s afterburners, when break neck is the only speed you need. + Show that Sodium Velocity Racer who's boss. %s aerofoils help you maintain control on even the tightest of bends. + Blast ahead of your friends with %s Rocket Boosters. + Beat them in style with the %s premium paint scheme. It's the colour of win! + Afterburners made things a little unstable? Let the flight computer handle it while you concentrate on victory. + Don't get left behind! Use %s boosters to get out of tight spots. + Need to shave seconds off your time? %s afterburners will give you that race-winning extra speed. + Smooth through corners.\nReduce overtaking possibilties.\nProtect your lead. + Instant acceleration.\nGain the advantage.\nWin the race. + Look awesome.\nBe the envy of your friends.\nLook great during replays. + More stability.\nReduce pilot error.\nBecome an expert pilot. + Don't get left behind.\nExplosive acceleration.\nSet impressive record times. + Hold your nerve.\nBreak the sound barrier.\nBecome the leader. + Increased control and handling into corners is only for those who are confident in their reflexes. Are you skilled enough to handle the advantage? + You probably couldn't handle the punchy acceleration of the %s rocket boosters. + Are you one to blend in with the crowd? + Its not really fair on others to buy a flight computer… but who would know? + The safest rocket boosters in Sodium racing. What could possibly go wrong? Nothing. Nothing at all… Nothing. + Can you handle the increased turbulence created by the explosive acceleration of the BONESHAKER rocket boosters? Didn't think so. + Change Mount + Open Mount + Mount + Purchase this item? + Owned + Insufficient funds. + Please Wait + Please Wait + Handy Tip! + Give Feedback! + No Thanks. + Exit Replay + Race Again + Would you like to race again? + Exit Garage + Your loadout has changed.\nSave your new loadout? + Save + Don't Save + Multiplayer mode will be added soon!\n\nCheck out http://www.sodiumone.com regularly for news and updates. + This is the Sodium2 multiplayer access point. + Would you like to proceed to the multiplayer area? + Arcade mode will be added soon!\n\nCheck out http://www.sodiumone.com regularly for news and updates. + Purchase these items? + Congratulations! You have successfully bought this item! + Congratulations! You have successfully bought these items! + Don't Buy + New Level Achieved! + Shop + [Sodium2] Project Velocity + Ultra hi-speed racing game. [#Legal] + en-US + CONGRATULATIONS! + You have earned: + Sodium Credits + Connection to data server lost + Connection to data server established + Communicating with data server + There was a problem connecting to the data server, your progress may not be saved if you choose to continue + [DECLINE] to Exit + [R1] and [L1] Change Player + [ACCEPT] Change Camera + Race + Help & Options + Controls + Exit + FAQ + Settings + Garage + Single Player + Multiplayer (PS3) + Quick Race + Arcade + Real-time + Challenge + Challenge Inbox + Create + Scroll + + Back + Terranova Pass + Industrial Sector + Firmus Canyon + League 1 + League 1 Description + Track 0 Description + Track 1 Description + Track 2 Description + Join + Length (Miles): + Name: + Description: + Difficulty: + Easy + Normal + Hard + Test Commerce + [UP] + [DOWN] + [LEFT] + [RIGHT] + [UP][DOWN] + [LEFTSTICK] + [RIGHTSTICK] + [L1] + [L2] + [L3] + [R1] + [R2] + [R3] + [TRIANGLE] + [ALL_REGION_CROSS] + [SQUARE] + [ALL_REGION_CIRCLE] + [ACCEPT] + [DECLINE] + [SELECT] + [UP][DOWN][LEFT][RIGHT] + [LEFT][RIGHT] + [START] + [Sodium2] Project Velocity + Rocket Booster Mount 1 + Rocket Booster Mount 2 + Fuel + Fuel Additives + Fuel Tank + Afterburner + Engine + Air Brakes + Chassis + Flight Computer + Air Intakes + Paint Scheme + Hover Engines + Stabilisers + Control Surfaces + Aerofoils + Inbox + + Time Remaining + Title + Challenge Title + Status + Name + Challenge Name + Track + Duration + Days + Hours + Minutes + Seconds + Entry Fee + Prize + Credits + Scroll + Select + OK + Cancel + Players + Create Challenge? + Creating Challenge + Please wait + Congratulations! + Do you want to create this challenge? + Your entry fee will be deducted now if you accept. + Failed to connect to server. + Please try again in a moment. + All other players have been invited. + Go to your inbox to view your challenges. + Go to your challenge inbox to view your challenges. + Delete Challenge? + Do you want to cancel this challenge. + You will lose this challenge setup if you accept. + Decline + Accept Challenge? + Did you want to accept this challenge? + Accepting Challenge + You are now part of this challenge. + Good luck! + Challenge Accept Failed + Decline Challenge? + Do you want to decline this challenge? + This challenge will be deleted from your inbox if you accept. + WARNING + Are you sure you want to decline this challenge. + You will not be able to participate if you accept. + Race + Collect Winnings + View Race + You came in %s place. + First + Second + Third + Create Challenge + Mach + Finished + All-Time Best + Daily Best + Kph + Leader + Mph + Min + + ms + Friends + Sec + Name + Details + [ACCEPT] Accept + Please Wait… + Accept + The punishing bends, bridges and tunnels surrounding this mysterious off-world research facility mean that this track is not for the faint of heart. This course takes a reverse route through the track. + The punishing bends, bridges and tunnels surrounding this mysterious off-world research facility mean that this track is not for the faint of heart. + Feedback + Survey + Mount Denied! + %s not currently owned. View in shop? + Welcome + %s not currently owned. View in the Commerce Point? + %s not currently owned. Would you like to purchase it? + Your purchase has been completed. + Thank you. + Well done pilot! In light of your new promotion, you can now purchase the %s %s from the garage! + It's your lucky day rookie! You may now purchase the %s %s from the garage! + Another item has been unlocked! Look out for the %s %s in the garage! + Congratulations, you’ve unlocked the %s %s in the garage! + Another XP level reached! You’ve now unlocked the %s %s in the garage. + Your awesome skills have unlocked the %s %s from the garage. Well done! + In recognition of your hard work, the %s %s has now been unlocked in the garage for you to purchase. + %s Unlocked + %s not currently owned. Would you like to purchase some? + Deselect + Send Taunt + Send Taunts + Taunt Friends + Select Friend + Skip + Close + You cannot mount the %s to your jetcraft as you do not own it. %s + Would you like to buy some %s %s from the Commerce Point? + Would you like to buy the %s %s from the Commerce Point? + Would you like to buy some %s %s with your Sodium Credits? + Would you like to buy the %s %s with your Sodium Credits? + Checkout + Unit of Mass + kg + lbs + Mass + Terms of Service + Download is subject to the PlayStation Network Terms of Service/User Agreement and any specific additional conditions applying to this item. If you do not wish to accept these terms, do not download this item. Download is licensed or sublicensed to you for use solely within PlayStation Home by the purchasing PSN account. Content may not be used by any other account. + Fuel Additives + Fuel Canisters + Rival + Rivals + Key + Friend + Local Player + Challenger + Perfect! + Great! + Good + Almost + Whoops! + Weak Boost + Average Boost + Awesome Boost! + Perfect Boost! + Too Late + Use + Rocket Boosters + Change Player + Change Camera + Race Results + Winner + Move + Create Session + New Session + Level + Discard + Discard Session? + Warning: You will lose your session setup! + Session Name + Please enter a session name. + Create! + Please enter a stake. + I'm Sorry + Please do not enter rude words! + Create Session + Name + Access + Class + Stake + Voting + Session List + Session List + Owner + New + Lobby + Connection + Waiting for players + Vote + Waiting for track votes + Vote Sent! + You have voted for %s. + Please choose a track! + Random + Track Vote + Please vote now! + Track Chosen + Get ready to race on %s! + Voted! + Ready! + Joining Lobby + Unable to join lobby. + Access Denied! + This is a private session, please select another. + This session is full, please select another. + You have exceeded the vehicle class limit for this session, please reconfigure your vehicle in the garage. + Vehicle class ratings about %d stars cannot race in this session, please change your loadout in the garage or select another session. + Max Class + Maximum Class + Your %d star vehicle is too powerful for a %d star session. Please adjust the session or adjust your vehicle in the garage. + Your %d star vehicle is too powerful for this %d star session. Please select another session or adjust your vehicle in the garage. + %s has left the game + %s has joined the game + %s has left the lobby + %s has joined the lobby + Your class %d vehicle is too powerful for a class %d session. Please adjust the session or adjust your vehicle in the garage. + Your class %d vehicle is too powerful for this class %d session. Please select another session or adjust your vehicle in the garage. + This is a class %d session and your vehicle is class %d. Please adjust the session class or modify your vehicle loadout in the garage. + This is a class %d session and your vehicle is class %d. Please select another session or modify your vehicle loadout in the garage. + 1st + 2nd + 3rd + st + nd + rd + Waiting for other players... + Results + Friends + Everyone + Player Left + Played Joined + Jet Part Class: + Item Class: + Vehicle Class: + Press %s to create a session + Press %s to toggle ready on + Press %s to toggle ready off + %s has reached level %d + %s has achieved level %d + %s has been promoted to level %d + %s has unlocked level %d + Congratulations %s for reaching level %d + %s has levelled up and is now level %d + %s is now level %d + Award + Scoreboard + Racing + Racing! + Unable to join this session as a race is in progress. Please try again later or select another session. + Exit Session + Are you sure you want to exit this session? + Update Quantity + Pairs Owned + Open + Item Not Available + You must be level %s to mount this item + You must be level %s to purchase this item. + Server communication problem. + Empty Rocket Booster Mount + Do you wish to continue racing without any rocket boosters? + The garage is not available yet. Come back when you have gained more experience. + Messages Sent + Your friends have just been taunted! + Message Sent + You have just taunted your friend! + Purchase More + This session is for %d star vehicles only. + Would you like to use your last %d star vehicle loadout? + ? + Music + Controller Vibration + Unit of Speed + On + Off + Mph + Kph + Sodium2 is downloading + Timed Out + You have been disconnected from this session due to inactivity. + Boast + Continue? + Please only send messages to friends who will be happy to receive them. Your online ID will be displayed in this message. + Victory! + It's on! + Is it a bird?... + Victory! + Did you confuse your air brakes and the accelerator again? Listen carefully, Sodium2, #track#, bring your game face, class is in session. + Vrooooooooooooooooooooooooooooooooooooooooooooooooooooom!!! Whoosh!! BOOM!! If you’re hearing that, I think my racer just buzzed you on #track#. Sodium2 gauntlet laid down. Do you want to accept? + Your lap time for #track# has now crumbled under the awesomeness of my skillfully controlled jetcraft! The new time to beat is #time#. Best of luck! You're gonna need it! + This message was sent by a friend from the game Sodium2 by Lockwood Publishing. Lockwood will not store your Online ID. + Send Boast + Send Boasts + Boast to Friends + Quick Loadout + Set the loadout of your jetcraft quickly by selecting a class. + Denied! + A class #classNum# loadout cannot be created. #nextSentence# + You do not own any items of this class. Try purchasing a class #classNum# item so this loadout can be generated. + You do not own any items of this class and there are none available for you to purchase. Try increasing your XP level rookie! + #track_name# has downloaded! + #track_name# is currently downloading. #notification# + Please remain in the Sodium 2 space for the download to complete. + A download notification will appear when it is ready. + You cannot access the multiplayer game yet as some tracks are still downloading. + All tracks have downloaded! + #game_name# is now accessible. + This session uses #track_pack_name#, which is currently downloading. Please select another session. #notification# + #player_name# has finished the race in #rank# place! + #player_name# has finished the race! + Congratulations! + You have earned #rewardName#! + You have earned the #rewardName#! +
diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_public_scene/v1.0/HoloTip_Data.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_public_scene/v1.0/HoloTip_Data.xml new file mode 100644 index 000000000..5404ffe12 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_public_scene/v1.0/HoloTip_Data.xml @@ -0,0 +1,514 @@ + + + 1.109,0.216,1.467,0.000 + 1.640,0.725,1.677,1.500 + 12 + 1.101,1.048,1.500,1.500 + 9.88 + + <_>Jacket_Ad_Line1 + <_>Jacket_Ad_Line2 + 5 + 15.666 + 0.14 + 21.6 + + 0.999,1.000,1.000,1.000 + 0.368 + -0.03 + 1.715 + 1.132 + Holo_Screen1 + 1.3681 + 0.090667 + + 1.08 + 1.2 + -0.154 + -0.046 + + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/Jackets_Chili_Holotip.dds + + 0.372,0.506,0.981,0.630 + + <_>AND + <_>Timer_3sec + <_>NOT + <_>SHOOTER + + 1280 + -28 + 15 + center + 375.2 + 3 + 4.3134 + -299.4 + 1.000,1.000,1.000,1.000 + + + <_>Sodium_commerce_point + -150.6 + -19.8 + 1.000,1.000,1.000,1.000 + 0.14 + 0.372,0.506,0.981,0.630 + 1280 + -7.0003 + 6.2835 + 15 + 50.4 + 3 + center + 5 + 14.393 + + + 0.045,0.116,0.300,0.750 + 2.4685 + HoloBeam + HoloUnit + + 1.1852 + 6.68 + 27.3 + -1 + -216.357,6.211,-6.040,0.000 + + <_>AND + <_>NOT + <_>Owns_Pilot_Jacket_Female + <_>NOT + <_>Owns_Pilot_Jacket_Male + + -217.381,3.215,-11.608,1.000 + + + 1.620,1.243,0.345,0.000 + -217.888,4.118,-1.694,1.000 + -221.211,4.802,-2.748,0.000 + 1.384,1.098,1.494,1.500 + 8.56 + + <_>AND + <_>NOT + <_>Owns_MSGL + + 0.74 + + HoloUnit + 2.211 + HoloBeam + 1.000,0.268,0.169,1.000 + + 1.1852 + 2.3 + 12 + + <_>MSGL_Ad_Line4 + <_>MSGL_Ad_Line1 + 4.4328 + -18 + -3.7253e-09 + 6.1144 + 21 + + 0.000,7.410,0.000,0.000 + 6.900,0.080,0.080,0.000 + 1.000,0.653,0.459,1.000 + -0.018 + + 8.5037 + 5.9613 + 1.2934 + 0.58854 + 4.1572 + + 1.0336 + Holo_MSGL + + 0.24 + 0.54 + -5.9605e-08 + -0.0436 + 0.406 + 0.272 + + -0.096001 + 0.298 + 0.291 + + -299.4 + 15 + 296.8 + 3 + 5 + 0.511,0.294,0.137,0.690 + 1.000,1.000,1.000,1.000 + + + <_>LRPE_Ad_Line5 + <_>Available_in_sodium_stores + 5 + -18 + 6.1144 + 0.511,0.234,0.173,0.690 + + <_>AND + <_>NOT + <_>Timer_20sec + <_>NOT + <_>Timer_10sec + + 21 + + 0.000,7.410,0.000,0.000 + 6.900,0.080,0.080,0.000 + 0.830,0.387,0.248,1.000 + -0.018 + + 8.5037 + 5.9613 + 1.2934 + 0.58854 + 4.1572 + + 1.0336 + Holo_MSGL + + 0.24 + 0.54 + -5.9605e-08 + -0.0436 + 0.406 + 0.272 + + -0.096001 + 0.298 + 0.291 + + 4.4328 + 15 + 296.8 + 3 + -299.4 + -3.7253e-09 + 1.000,1.000,1.000,1.000 + + 9.1 + 1.500,2.210,2.146,1.500 + + + 1.620,1.243,0.345,0.000 + -215.075,4.103,-7.307,1.000 + -220.442,5.093,-8.739,0.000 + 1.384,1.098,1.494,1.500 + 8.56 + + <_>AND + <_>NOT + <_>Owns_LRPE + + 0.74 + + HoloUnit + 2.211 + HoloBeam + 0.235,0.169,1.000,1.000 + + 1.1852 + 9.1 + 2.3 + + <_>LRPE_Ad_Line5 + <_>LRPE_Ad_Line1 + -299.4 + -18 + 0.462,0.265,0.511,0.690 + 6.1144 + 21 + + 0.000,7.410,0.000,0.000 + 6.900,0.080,0.080,0.000 + 0.859,0.459,1.000,1.000 + -0.018 + 0.291 + + 8.5037 + 5.9613 + 1.2934 + 0.58854 + 4.1572 + + -0.096001 + + 0.24 + 0.54 + -5.9605e-08 + -0.0436 + 0.406 + 0.272 + + Holo_LRPE + 0.298 + 1.0336 + + 5 + 15 + 296.8 + 3 + 4.4328 + -3.7253e-09 + 1.000,1.000,1.000,1.000 + + + <_>LRPE_Ad_Line5 + <_>Available_in_sodium_stores + 5 + -18 + 6.1144 + 0.462,0.265,0.511,0.690 + + <_>AND + <_>NOT + <_>Timer_20sec + <_>NOT + <_>Timer_10sec + + 21 + + 0.000,7.410,0.000,0.000 + 6.900,0.080,0.080,0.000 + 0.859,0.459,1.000,1.000 + -0.018 + 0.291 + + 8.5037 + 5.9613 + 1.2934 + 0.58854 + 4.1572 + + -0.096001 + + 0.24 + 0.54 + -5.9605e-08 + -0.0436 + 0.406 + 0.272 + + Holo_LRPE + 0.298 + 1.0336 + + 4.4328 + 15 + 296.8 + 3 + -299.4 + -3.7253e-09 + 1.000,1.000,1.000,1.000 + + 12 + 1.500,2.210,2.146,1.500 + + + 25.5 + + <_>Jacket_Ad_Line2 + <_>blank + <_>Available_in_sodium_stores + 0.14 + + <_>AND + <_>Timer_3sec + + + 0.999,1.000,1.000,1.000 + 0.368 + -0.03 + 1.3681 + 1.715 + Holo_Screen1 + 1.132 + 0.090667 + + 1.2 + 1.08 + -0.154 + -0.046 + + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/Jackets_Chili_Holotip.dds + + 3 + 13.035 + -208.2 + 12.6 + 1280 + -2.8003 + 0.372,0.506,0.981,0.630 + 15 + 375.2 + 1.000,1.000,1.000,1.000 + 5 + center + 4.0443 + + 1.072,0.557,0.620,0.000 + 1.101,1.048,1.500,1.500 + 9.88 + 6.68 + 12 + + 2.4685 + HoloBeam + 0.045,0.116,0.300,0.750 + HoloUnit + + 1.1852 + + <_>Jacket_Ad_Line1 + 5 + -150.6 + -12.6 + 5.1174 + 0.14 + 0.372,0.506,0.981,0.630 + 1280 + 18.2 + 1.000,1.000,1.000,1.000 + center + 84 + 3 + + -0.006 + 1.528 + Holo_Screen1 + -0.016 + 0.955 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/Tank_Holotip.dds + + 15 + 13.915 + + + <_>AND + <_>NOT + <_>Owns_Pilot_Jacket_Female + <_>NOT + <_>Owns_Pilot_Jacket_Male + <_>SHOOTER + + -1 + -219.469,3.752,-5.839,0.000 + 2.175,1.477,1.369,1.500 + -216.767,3.932,-4.666,0.000 + + + 1.072,0.557,1.042,0.000 + 2.197,1.477,2.009,1.500 + 1.101,1.048,1.500,1.500 + 9.88 + 6.4001 + -219.469,3.752,-5.839,0.000 + + 0.053,0.117,0.350,0.750 + 2.4685 + HoloBeam + HoloUnit + + 1.1852 + + <_>Sodium_Salt_Shooter_Space + <_>Is_downloading + -198.6 + -3.0518e-05 + 0.960,0.710,0.725,1.000 + 0.176,0.256,0.981,0.670 + 0.14 + 1280 + -2.8003 + 6.2835 + center + 296.8 + 3 + 15 + 5 + 14.393 + + 93.205 + -1 + + <_>AND + <_>NOT + <_>SHOOTER + + 6.68 + -216.974,3.074,-4.774,1.000 + + + 12 + + <_>AND + <_>NOT + <_>Owns_Pilot_Jacket_Female + <_>NOT + <_>Owns_Pilot_Jacket_Male + + 1.109,0.216,1.467,0.000 + 1.101,1.048,1.500,1.500 + 9.88 + 6.68 + 27.3 + + 2.4685 + HoloBeam + 0.045,0.116,0.300,0.750 + HoloUnit + + 1.1852 + -199.277,3.605,-11.425,1.000 + -1 + + <_>Furniture_Issue1 + 5.6556 + -19.8 + -150.6 + 0.14 + 5 + 1280 + -2.8003 + 0.372,0.506,0.981,0.630 + 15 + 408.8 + 3 + 14.632 + center + 1.000,1.000,1.000,1.000 + + + <_>Furniture_Issue2 + 6.4629 + -150.6 + -19.8 + 5 + 0.372,0.506,0.981,0.630 + + <_>AND + <_>Timer_3sec + + 1280 + -2.8003 + 0.14 + center + 408.8 + 3 + 15 + 14.154 + 1.000,1.000,1.000,1.000 + + -202.634,4.412,-22.673,1.000 + 1.640,0.725,1.095,1.500 + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_public_scene/v1.2/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_public_scene/v1.2/en-GB.xml new file mode 100644 index 000000000..00f639324 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_public_scene/v1.2/en-GB.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_public_scene/v1.2/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_public_scene/v1.2/en-US.xml new file mode 100644 index 000000000..00f639324 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_public_scene/v1.2/en-US.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_scene/v1.0/HoloTip_Data.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_scene/v1.0/HoloTip_Data.xml new file mode 100644 index 000000000..5404ffe12 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_scene/v1.0/HoloTip_Data.xml @@ -0,0 +1,514 @@ + + + 1.109,0.216,1.467,0.000 + 1.640,0.725,1.677,1.500 + 12 + 1.101,1.048,1.500,1.500 + 9.88 + + <_>Jacket_Ad_Line1 + <_>Jacket_Ad_Line2 + 5 + 15.666 + 0.14 + 21.6 + + 0.999,1.000,1.000,1.000 + 0.368 + -0.03 + 1.715 + 1.132 + Holo_Screen1 + 1.3681 + 0.090667 + + 1.08 + 1.2 + -0.154 + -0.046 + + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/Jackets_Chili_Holotip.dds + + 0.372,0.506,0.981,0.630 + + <_>AND + <_>Timer_3sec + <_>NOT + <_>SHOOTER + + 1280 + -28 + 15 + center + 375.2 + 3 + 4.3134 + -299.4 + 1.000,1.000,1.000,1.000 + + + <_>Sodium_commerce_point + -150.6 + -19.8 + 1.000,1.000,1.000,1.000 + 0.14 + 0.372,0.506,0.981,0.630 + 1280 + -7.0003 + 6.2835 + 15 + 50.4 + 3 + center + 5 + 14.393 + + + 0.045,0.116,0.300,0.750 + 2.4685 + HoloBeam + HoloUnit + + 1.1852 + 6.68 + 27.3 + -1 + -216.357,6.211,-6.040,0.000 + + <_>AND + <_>NOT + <_>Owns_Pilot_Jacket_Female + <_>NOT + <_>Owns_Pilot_Jacket_Male + + -217.381,3.215,-11.608,1.000 + + + 1.620,1.243,0.345,0.000 + -217.888,4.118,-1.694,1.000 + -221.211,4.802,-2.748,0.000 + 1.384,1.098,1.494,1.500 + 8.56 + + <_>AND + <_>NOT + <_>Owns_MSGL + + 0.74 + + HoloUnit + 2.211 + HoloBeam + 1.000,0.268,0.169,1.000 + + 1.1852 + 2.3 + 12 + + <_>MSGL_Ad_Line4 + <_>MSGL_Ad_Line1 + 4.4328 + -18 + -3.7253e-09 + 6.1144 + 21 + + 0.000,7.410,0.000,0.000 + 6.900,0.080,0.080,0.000 + 1.000,0.653,0.459,1.000 + -0.018 + + 8.5037 + 5.9613 + 1.2934 + 0.58854 + 4.1572 + + 1.0336 + Holo_MSGL + + 0.24 + 0.54 + -5.9605e-08 + -0.0436 + 0.406 + 0.272 + + -0.096001 + 0.298 + 0.291 + + -299.4 + 15 + 296.8 + 3 + 5 + 0.511,0.294,0.137,0.690 + 1.000,1.000,1.000,1.000 + + + <_>LRPE_Ad_Line5 + <_>Available_in_sodium_stores + 5 + -18 + 6.1144 + 0.511,0.234,0.173,0.690 + + <_>AND + <_>NOT + <_>Timer_20sec + <_>NOT + <_>Timer_10sec + + 21 + + 0.000,7.410,0.000,0.000 + 6.900,0.080,0.080,0.000 + 0.830,0.387,0.248,1.000 + -0.018 + + 8.5037 + 5.9613 + 1.2934 + 0.58854 + 4.1572 + + 1.0336 + Holo_MSGL + + 0.24 + 0.54 + -5.9605e-08 + -0.0436 + 0.406 + 0.272 + + -0.096001 + 0.298 + 0.291 + + 4.4328 + 15 + 296.8 + 3 + -299.4 + -3.7253e-09 + 1.000,1.000,1.000,1.000 + + 9.1 + 1.500,2.210,2.146,1.500 + + + 1.620,1.243,0.345,0.000 + -215.075,4.103,-7.307,1.000 + -220.442,5.093,-8.739,0.000 + 1.384,1.098,1.494,1.500 + 8.56 + + <_>AND + <_>NOT + <_>Owns_LRPE + + 0.74 + + HoloUnit + 2.211 + HoloBeam + 0.235,0.169,1.000,1.000 + + 1.1852 + 9.1 + 2.3 + + <_>LRPE_Ad_Line5 + <_>LRPE_Ad_Line1 + -299.4 + -18 + 0.462,0.265,0.511,0.690 + 6.1144 + 21 + + 0.000,7.410,0.000,0.000 + 6.900,0.080,0.080,0.000 + 0.859,0.459,1.000,1.000 + -0.018 + 0.291 + + 8.5037 + 5.9613 + 1.2934 + 0.58854 + 4.1572 + + -0.096001 + + 0.24 + 0.54 + -5.9605e-08 + -0.0436 + 0.406 + 0.272 + + Holo_LRPE + 0.298 + 1.0336 + + 5 + 15 + 296.8 + 3 + 4.4328 + -3.7253e-09 + 1.000,1.000,1.000,1.000 + + + <_>LRPE_Ad_Line5 + <_>Available_in_sodium_stores + 5 + -18 + 6.1144 + 0.462,0.265,0.511,0.690 + + <_>AND + <_>NOT + <_>Timer_20sec + <_>NOT + <_>Timer_10sec + + 21 + + 0.000,7.410,0.000,0.000 + 6.900,0.080,0.080,0.000 + 0.859,0.459,1.000,1.000 + -0.018 + 0.291 + + 8.5037 + 5.9613 + 1.2934 + 0.58854 + 4.1572 + + -0.096001 + + 0.24 + 0.54 + -5.9605e-08 + -0.0436 + 0.406 + 0.272 + + Holo_LRPE + 0.298 + 1.0336 + + 4.4328 + 15 + 296.8 + 3 + -299.4 + -3.7253e-09 + 1.000,1.000,1.000,1.000 + + 12 + 1.500,2.210,2.146,1.500 + + + 25.5 + + <_>Jacket_Ad_Line2 + <_>blank + <_>Available_in_sodium_stores + 0.14 + + <_>AND + <_>Timer_3sec + + + 0.999,1.000,1.000,1.000 + 0.368 + -0.03 + 1.3681 + 1.715 + Holo_Screen1 + 1.132 + 0.090667 + + 1.2 + 1.08 + -0.154 + -0.046 + + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/Jackets_Chili_Holotip.dds + + 3 + 13.035 + -208.2 + 12.6 + 1280 + -2.8003 + 0.372,0.506,0.981,0.630 + 15 + 375.2 + 1.000,1.000,1.000,1.000 + 5 + center + 4.0443 + + 1.072,0.557,0.620,0.000 + 1.101,1.048,1.500,1.500 + 9.88 + 6.68 + 12 + + 2.4685 + HoloBeam + 0.045,0.116,0.300,0.750 + HoloUnit + + 1.1852 + + <_>Jacket_Ad_Line1 + 5 + -150.6 + -12.6 + 5.1174 + 0.14 + 0.372,0.506,0.981,0.630 + 1280 + 18.2 + 1.000,1.000,1.000,1.000 + center + 84 + 3 + + -0.006 + 1.528 + Holo_Screen1 + -0.016 + 0.955 + https://www.outso-srv1.com/webassets/Sodium/Holotip_images/Tank_Holotip.dds + + 15 + 13.915 + + + <_>AND + <_>NOT + <_>Owns_Pilot_Jacket_Female + <_>NOT + <_>Owns_Pilot_Jacket_Male + <_>SHOOTER + + -1 + -219.469,3.752,-5.839,0.000 + 2.175,1.477,1.369,1.500 + -216.767,3.932,-4.666,0.000 + + + 1.072,0.557,1.042,0.000 + 2.197,1.477,2.009,1.500 + 1.101,1.048,1.500,1.500 + 9.88 + 6.4001 + -219.469,3.752,-5.839,0.000 + + 0.053,0.117,0.350,0.750 + 2.4685 + HoloBeam + HoloUnit + + 1.1852 + + <_>Sodium_Salt_Shooter_Space + <_>Is_downloading + -198.6 + -3.0518e-05 + 0.960,0.710,0.725,1.000 + 0.176,0.256,0.981,0.670 + 0.14 + 1280 + -2.8003 + 6.2835 + center + 296.8 + 3 + 15 + 5 + 14.393 + + 93.205 + -1 + + <_>AND + <_>NOT + <_>SHOOTER + + 6.68 + -216.974,3.074,-4.774,1.000 + + + 12 + + <_>AND + <_>NOT + <_>Owns_Pilot_Jacket_Female + <_>NOT + <_>Owns_Pilot_Jacket_Male + + 1.109,0.216,1.467,0.000 + 1.101,1.048,1.500,1.500 + 9.88 + 6.68 + 27.3 + + 2.4685 + HoloBeam + 0.045,0.116,0.300,0.750 + HoloUnit + + 1.1852 + -199.277,3.605,-11.425,1.000 + -1 + + <_>Furniture_Issue1 + 5.6556 + -19.8 + -150.6 + 0.14 + 5 + 1280 + -2.8003 + 0.372,0.506,0.981,0.630 + 15 + 408.8 + 3 + 14.632 + center + 1.000,1.000,1.000,1.000 + + + <_>Furniture_Issue2 + 6.4629 + -150.6 + -19.8 + 5 + 0.372,0.506,0.981,0.630 + + <_>AND + <_>Timer_3sec + + 1280 + -2.8003 + 0.14 + center + 408.8 + 3 + 15 + 14.154 + 1.000,1.000,1.000,1.000 + + -202.634,4.412,-22.673,1.000 + 1.640,0.725,1.095,1.500 + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_scene/v1.1/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_scene/v1.1/en-GB.xml new file mode 100644 index 000000000..42d88bc44 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_scene/v1.1/en-GB.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_scene/v1.1/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_scene/v1.1/en-US.xml new file mode 100644 index 000000000..42d88bc44 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/shooter_scene/v1.1/en-US.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/global/global.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/global/global.xml new file mode 100644 index 000000000..78e290329 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/global/global.xml @@ -0,0 +1,332 @@ + + + + 7500 + 24 + + + 7500 + 25 + + + 12500 + 22 + + + 12500 + 25 + + + 2500 + 5 + + + 2500 + 6 + + + 1000 + + + + + + 12500 + 29 + + + 12500 + 30 + + + 2500 + 8 + + + 2500 + 9 + + + 7500 + 18 + + + 7500 + 20 + + + + + + 25000 + 32 + + + 25000 + 34 + + + 12500 + 22 + + + 12500 + 25 + + + 7500 + 11 + + + 7500 + 12 + + + + + + 7500 + 9 + + + 7500 + 11 + + + 2500 + 4 + + + 2500 + 5 + + + 12500 + 22 + + + 12500 + 25 + + + 1500 + + + + + + 25000 + 32 + + + 25000 + 34 + + + 12500 + 22 + + + 12500 + 25 + + + 7500 + 14 + + + 7500 + 15 + + + 2500 + 3 + + + + + + 2500 + 8 + + + 2500 + 9 + + + 12500 + 29 + + + 12500 + 30 + + + 7500 + 14 + + + 7500 + 15 + + + + + + 7500 + 18 + + + 7500 + 20 + + + 2500 + 8 + + + 2500 + 9 + + + 12500 + 30 + + + 12500 + 32 + + + + + + 1,2 + 500 + 8 + + + 1,2 + 500 + 9 + + + 1,2 + 1000 + 12 + + + 1,2 + 1000 + 13 + + + 1,2 + 1500 + 22 + + + 1,2 + 1500 + 25 + + + + + + 1,2 + 100 + + + 1,2 + 100 + + + 1,2 + 500 + 8 + + + 1,2 + 500 + 9 + + + 1,2 + 1000 + 11 + + + 1,2 + 1000 + 12 + + + 1,2 + 500 + 5 + + + 1,2 + 500 + 6 + + + 1,2 + 100 + + + + + + 10000 + + + 5000 + + + 30000 + + + 15000 + + + 15000 + + + 5000 + + + 30000 + + + 50000 + + + 10000 + + + 5000 + + + 15000 + + + 30000 + + + 5000 + + + 40000 + + + 15000 + + + 40000 + + + 10000 + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/lang/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/lang/en-GB.xml new file mode 100644 index 000000000..fcc37c6f0 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/lang/en-GB.xml @@ -0,0 +1,120 @@ + + + Empty + + + + Steadfast + Steadfast DX + Interceptor + Interceptor DX + Aerobatic + Aerobatic DX + Albatross + + + + Inertia + Inertia DX + Terminal Friction + Terminal Friction DX + Wakebender + Wakebender DX + Friction + + + + Forefront + Forefront DX + Live Wire + Live Wire DX + Ignition + Ignition DX + Boneshaker + + + + Turbine + Turbine DX + Electrostatic + Electrostatic DX + Jetfan + Jetfan DX + Vortex + Vortex DX + + + + Thor + Thor DX + Titan + Titan DX + Apollo + Apollo DX + Thunderhorse DX + Thunderhorse + + + + Synapse + Synapse DX + Vector + Vector DX + Volta + Volta DX + Halide + + + + Composite + Composite DX + NanoFiber + NanoFiber DX + Omniplex + Omniplex DX + Carbon + + + + BioNomic + BioNomic DX + Oxidizer + Oxidizer DX + Igniter + Igniter DX + + + + Pulsar + Pulsar DX + Ride + Ride DX + SSRB + SSRB DX + Touchstone + Touchstone DX + Firecracker DX + Firecracker + + + + Silver + Crimson + Classic Green + Bumble Bee + Salamander + Sonic Camo + Phoenix + Marshmallow + Velocity Racer Green + Animal Magnetism + Fruit Salad + Sodium One Chili Red Edition + Blue Viper + Apple Twist + Union Jackson + Hiromaru Racer + Star Spangled + Season's Greetings + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/lang/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/lang/en-US.xml new file mode 100644 index 000000000..fcc37c6f0 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/lang/en-US.xml @@ -0,0 +1,120 @@ + + + Empty + + + + Steadfast + Steadfast DX + Interceptor + Interceptor DX + Aerobatic + Aerobatic DX + Albatross + + + + Inertia + Inertia DX + Terminal Friction + Terminal Friction DX + Wakebender + Wakebender DX + Friction + + + + Forefront + Forefront DX + Live Wire + Live Wire DX + Ignition + Ignition DX + Boneshaker + + + + Turbine + Turbine DX + Electrostatic + Electrostatic DX + Jetfan + Jetfan DX + Vortex + Vortex DX + + + + Thor + Thor DX + Titan + Titan DX + Apollo + Apollo DX + Thunderhorse DX + Thunderhorse + + + + Synapse + Synapse DX + Vector + Vector DX + Volta + Volta DX + Halide + + + + Composite + Composite DX + NanoFiber + NanoFiber DX + Omniplex + Omniplex DX + Carbon + + + + BioNomic + BioNomic DX + Oxidizer + Oxidizer DX + Igniter + Igniter DX + + + + Pulsar + Pulsar DX + Ride + Ride DX + SSRB + SSRB DX + Touchstone + Touchstone DX + Firecracker DX + Firecracker + + + + Silver + Crimson + Classic Green + Bumble Bee + Salamander + Sonic Camo + Phoenix + Marshmallow + Velocity Racer Green + Animal Magnetism + Fruit Salad + Sodium One Chili Red Edition + Blue Viper + Apple Twist + Union Jackson + Hiromaru Racer + Star Spangled + Season's Greetings + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/region/SCEA.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/region/SCEA.xml new file mode 100644 index 000000000..e69de29bb diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/region/SCEE.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/jetcraft_parts/v3.3/region/SCEE.xml new file mode 100644 index 000000000..e69de29bb diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/scores/v3.3/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/scores/v3.3/en-GB.xml new file mode 100644 index 000000000..fd77351be --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/scores/v3.3/en-GB.xml @@ -0,0 +1,619 @@ + + + + 1 + 0 + Completed race + 15 + 100 + 1 + 2 + 75 + 1 + lerpf( c.rating, 0, 1, 0.3, 1 ) + + + 2 + Single + 2 + Victory! + 40 + 25 + c.single and (c.place == 1) + + + 3 + Single + 1 + Finished second place + 40 + 25 + c.single and (c.place == 2) + + + 4 + Single + 0 + 3rd.. For the cause + 20 + 6 + c.single and (c.place == 3) + + + 5 + Place_Challenge + 3 + Moving up in style + 50 + 10 + c.multi and (c.jatosUsed == 2) and (c.ghosts == 2) and (c.place == 1) and c.rating + + + 6 + Place_Challenge + 2 + Moving up in the world + 50 + 10 + c.multi and (c.ghosts == 2) and (c.place == 1) and c.rating + + + 7 + Place_Challenge + 2 + Standing your ground in style + 50 + 5 + c.multi and (c.ghosts == 2) and (c.place == 2) and c.rating + + + 8 + Place_Challenge + 1 + Standing your ground + 25 + 5 + c.multi and (c.ghosts == 2) and (c.place == 2) and c.rating + + + 9 + RecordTime + 4 + WORLD RECORD LAP TIME! + 250 + 400 + c.time < t.world + + + 10 + RecordTime + 3 + DAILY WORLD RECORD LAP TIME! + 250 + 400 + c.time < t.daily + + + 11 + RecordTime + 2 + FRIEND BOARD LAP TIME RECORD + 100 + 150 + (t.numFriends>0) and (c.time < t.friend) and ((1+c.rating)*0.5) + + + 12 + RecordTime + 1 + Personal best time + 100 + 150 + c.time < t.user and c.rating + + + 13 + RecordSpeed + 4 + WORLD SPEED RECORD! + 150 + 250 + c.speed > s.world + + + 14 + RecordSpeed + 3 + DAILY WORLD SPEED RECORD! + 150 + 250 + c.speed > s.daily + + + 15 + RecordSpeed + 2 + FRIEND BOARD SPEED RECORD + 50 + 100 + (s.numFriends>0) and (c.speed > s.friend) + + + 16 + RecordSpeed + 1 + Personal speed record + 50 + 100 + c.speed > s.user + + + 17 + Style + 2 + Ballistic finish style bonus + 125 + 150 + 15 + 15 + c.jatoFinish and c.noBreaks and c.rating + + + 18 + Style + 1 + Rocket finish bonus + 50 + 100 + 10 + 10 + c.jatoFinish and (c.rating+0.01) + + + 19 + Style + 1 + Untouched airbreaks + 75 + 17 + c.noBreaks and c.rating + + + 20 + Air + 2 + Flying Scotsman + 50 + 100 + 1 + 15 + 10 + lerpf( c.airDist, 7000, 10000, 0, 1 ) + + + 21 + Air + 1 + Air distance bonus + 25 + 50 + 1 + 5 + 5 + lerpf( c.airDist, 2000, 8000, 0, 1 ) + + + 22 + Sonic + 1 + Stayed supersonic + 150 + 32 + (c.boom == 1) and (c.subSonic == 0) and (c.firstBoomDist<2000) + + + 23 + Sonic + 2 + Messing with sound + 0 + 250 + 3 + 0 + 25 + 3 + lerpf( c.boom, 10, 40, 0, 1 ) + + + 24 + Solo + 2 + Rocket Man! + 0 + 200 + 2 + 0 + 20 + 2 + c.solo and ( c.jatosUsed > 1) and (c.ghosts > 1) and (c.rating > 0.3) and c.rating + + + 25 + Solo + 1 + Honing your skills + 0 + 200 + 2 + 0 + 20 + 2 + c.solo and (c.ghosts > 1) and (c.rating > 0.3) and c.rating + + + 26 + Skill + 3 + Ninja skill bonus! + 200 + 300 + 1 + 50 + 30 + 1 + c.onTrack and (c.jatosUsed > 1) and (c.place < 2) and (c.ghosts > 1) and (c.boom == 1) and (c.subSonic == 0) and (c.rating > 0.3) and c.rating + + + 27 + Skill + 2 + Expert skill bonus + 100 + 150 + 1 + 25 + 15 + 1 + c.onTrack and (c.jatosUsed > 0) and (c.place < 2) and (c.ghosts > 0) and (c.rating > 0.3) and c.rating + + + 28 + Skill + 1 + Skill bonus + 50 + 100 + 1 + 12 + 10 + 1 + c.onTrack and (c.jatosUsed > 0) and (c.place < 3) and (c.ghosts > 0) and c.rating + + + 29 + 2 + Finished with a bang + 50 + 150 + 2 + 0 + 15 + 2 + (c.finishBangDist < 1000) and lerpf( c.finishBangDist, 1000, 0, 0, 1 ) + + + 30 + HDC + 4 + HDC world champion + 150 + 1 + (c.hdc > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 31 + HDC + 4 + HDC daily world champion + 75 + 1 + (c.hdc > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 32 + HDC + 4 + HDC golden boy + 50 + 1 + (c.hdc > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 33 + HDC + 3 + HDC Sponsored expert showman + 45 + 1 + (c.hdc > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf( c.finishBang, 1000, 0, 0, 1 ) * c.rating) + + + 34 + HDC + 2 + HDC Sponsored favourite + 35 + 1 + (c.hdc > 4) and (c.rating > 0.3) and c.rating + + + 35 + HDC + 2 + HDC Sponsored showman + 30 + 1 + (c.hdc > 4) and (c.finishBangDist < 1000) and lerpf( c.finishBang, 1000, 0, 0, 1 ) + + + 36 + HDC + 1 + HDC Sponsored + 5 + 1 + (c.hdc > 0) and (c.rating+0.2 * lerpf( c.hdc, 0, 5, 0, 1 )) + + + 37 + RYLEE + 4 + RYLEE world champion + 150 + 1 + (c.rylee > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 38 + RYLEE + 4 + RYLEE daily world champion + 75 + 1 + (c.rylee > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 39 + RYLEE + 4 + RYLEE golden boy + 50 + 1 + (c.rylee > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 40 + RYLEE + 3 + RYLEE Sponsored expert showman + 45 + 1 + (c.rylee > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf(c.finishBang, 1000, 0, 0, 1) * c.rating) + + + 41 + RYLEE + 2 + RYLEE Sponsored favourite + 35 + 1 + (c.rylee > 4) and (c.rating > 0.3) and c.rating + + + 42 + RYLEE + 2 + RYLEE Sponsored showman + 30 + 1 + (c.rylee > 4) and (c.finishBangDist < 1000) and lerpf(c.finishBang, 1000, 0, 0, 1) + + + 43 + RYLEE + 1 + RYLEE Sponsored + 5 + 1 + (c.rylee > 0) and (c.rating+0.2 * lerpf(c.rylee, 0, 5, 0, 1)) + + + 44 + JETBOX + 4 + JETBOX world champion + 150 + 1 + (c.jetbox > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 45 + JETBOX + 4 + JETBOX daily world champion + 75 + 1 + (c.jetbox > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 46 + JETBOX + 4 + JETBOX golden boy + 50 + 1 + (c.jetbox > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 47 + JETBOX + 3 + JETBOX Sponsored expert showman + 45 + 1 + (c.jetbox > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf(c.finishBang, 1000, 0, 0, 1) * c.rating) + + + 48 + JETBOX + 2 + JETBOX Sponsored favourite + 35 + 1 + (c.jetbox > 4) and (c.rating > 0.3) and c.rating + + + 49 + JETBOX + 2 + JETBOX Sponsored showman + 30 + 1 + (c.jetbox > 4) and (c.finishBangDist < 1000) and lerpf(c.finishBang, 1000, 0, 0, 1) + + + 50 + JETBOX + 1 + JETBOX Sponsored + 5 + 1 + (c.jetbox > 0) and (c.rating+0.2 * lerpf(c.jetbox, 0, 5, 0, 1)) + + + 51 + LEXAN + 4 + LEXAN world champion + 150 + 1 + (c.lexan > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 52 + LEXAN + 4 + LEXAN daily world champion + 75 + 1 + (c.lexan > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 53 + LEXAN + 4 + LEXAN golden boy + 50 + 1 + (c.lexan > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 54 + LEXAN + 3 + LEXAN Sponsored expert showman + 45 + 1 + (c.lexan > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf(c.finishBang, 1000, 0, 0, 1) * c.rating) + + + 55 + LEXAN + 2 + LEXAN Sponsored favourite + 35 + 1 + (c.lexan > 4) and (c.rating > 0.3) and c.rating + + + 56 + LEXAN + 2 + LEXAN Sponsored showman + 30 + 1 + (c.lexan > 4) and (c.finishBangDist < 1000) and lerpf(c.finishBang, 1000, 0, 0, 1) + + + 57 + LEXAN + 1 + LEXAN Sponsored + 5 + 1 + (c.lexan > 0) and (c.rating+0.2 * lerpf(c.lexan, 0, 5, 0, 1)) + + + 58 + ProPulse + 4 + ProPulse world champion + 150 + 1 + (c.propulse > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 59 + ProPulse + 4 + ProPulse daily world champion + 75 + 1 + (c.propulse > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 60 + ProPulse + 4 + ProPulse golden boy + 50 + 1 + (c.propulse > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 61 + ProPulse + 3 + ProPulse Sponsored expert showman + 45 + 1 + (c.propulse > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf(c.finishBang, 1000, 0, 0, 1) * c.rating) + + + 62 + ProPulse + 2 + ProPulse Sponsored favourite + 35 + 1 + (c.propulse > 4) and (c.rating > 0.3) and c.rating + + + 63 + ProPulse + 2 + ProPulse Sponsored showman + 30 + 1 + (c.propulse > 4) and (c.finishBangDist < 1000) and lerpf(c.finishBang, 1000, 0, 0, 1) + + + 64 + ProPulse + 1 + ProPulse Sponsored + 5 + 1 + (c.propulse > 0) and (c.rating+0.2 * lerpf(c.propulse, 0, 5, 0, 1)) + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/scores/v3.3/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/scores/v3.3/en-US.xml new file mode 100644 index 000000000..fd77351be --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/scores/v3.3/en-US.xml @@ -0,0 +1,619 @@ + + + + 1 + 0 + Completed race + 15 + 100 + 1 + 2 + 75 + 1 + lerpf( c.rating, 0, 1, 0.3, 1 ) + + + 2 + Single + 2 + Victory! + 40 + 25 + c.single and (c.place == 1) + + + 3 + Single + 1 + Finished second place + 40 + 25 + c.single and (c.place == 2) + + + 4 + Single + 0 + 3rd.. For the cause + 20 + 6 + c.single and (c.place == 3) + + + 5 + Place_Challenge + 3 + Moving up in style + 50 + 10 + c.multi and (c.jatosUsed == 2) and (c.ghosts == 2) and (c.place == 1) and c.rating + + + 6 + Place_Challenge + 2 + Moving up in the world + 50 + 10 + c.multi and (c.ghosts == 2) and (c.place == 1) and c.rating + + + 7 + Place_Challenge + 2 + Standing your ground in style + 50 + 5 + c.multi and (c.ghosts == 2) and (c.place == 2) and c.rating + + + 8 + Place_Challenge + 1 + Standing your ground + 25 + 5 + c.multi and (c.ghosts == 2) and (c.place == 2) and c.rating + + + 9 + RecordTime + 4 + WORLD RECORD LAP TIME! + 250 + 400 + c.time < t.world + + + 10 + RecordTime + 3 + DAILY WORLD RECORD LAP TIME! + 250 + 400 + c.time < t.daily + + + 11 + RecordTime + 2 + FRIEND BOARD LAP TIME RECORD + 100 + 150 + (t.numFriends>0) and (c.time < t.friend) and ((1+c.rating)*0.5) + + + 12 + RecordTime + 1 + Personal best time + 100 + 150 + c.time < t.user and c.rating + + + 13 + RecordSpeed + 4 + WORLD SPEED RECORD! + 150 + 250 + c.speed > s.world + + + 14 + RecordSpeed + 3 + DAILY WORLD SPEED RECORD! + 150 + 250 + c.speed > s.daily + + + 15 + RecordSpeed + 2 + FRIEND BOARD SPEED RECORD + 50 + 100 + (s.numFriends>0) and (c.speed > s.friend) + + + 16 + RecordSpeed + 1 + Personal speed record + 50 + 100 + c.speed > s.user + + + 17 + Style + 2 + Ballistic finish style bonus + 125 + 150 + 15 + 15 + c.jatoFinish and c.noBreaks and c.rating + + + 18 + Style + 1 + Rocket finish bonus + 50 + 100 + 10 + 10 + c.jatoFinish and (c.rating+0.01) + + + 19 + Style + 1 + Untouched airbreaks + 75 + 17 + c.noBreaks and c.rating + + + 20 + Air + 2 + Flying Scotsman + 50 + 100 + 1 + 15 + 10 + lerpf( c.airDist, 7000, 10000, 0, 1 ) + + + 21 + Air + 1 + Air distance bonus + 25 + 50 + 1 + 5 + 5 + lerpf( c.airDist, 2000, 8000, 0, 1 ) + + + 22 + Sonic + 1 + Stayed supersonic + 150 + 32 + (c.boom == 1) and (c.subSonic == 0) and (c.firstBoomDist<2000) + + + 23 + Sonic + 2 + Messing with sound + 0 + 250 + 3 + 0 + 25 + 3 + lerpf( c.boom, 10, 40, 0, 1 ) + + + 24 + Solo + 2 + Rocket Man! + 0 + 200 + 2 + 0 + 20 + 2 + c.solo and ( c.jatosUsed > 1) and (c.ghosts > 1) and (c.rating > 0.3) and c.rating + + + 25 + Solo + 1 + Honing your skills + 0 + 200 + 2 + 0 + 20 + 2 + c.solo and (c.ghosts > 1) and (c.rating > 0.3) and c.rating + + + 26 + Skill + 3 + Ninja skill bonus! + 200 + 300 + 1 + 50 + 30 + 1 + c.onTrack and (c.jatosUsed > 1) and (c.place < 2) and (c.ghosts > 1) and (c.boom == 1) and (c.subSonic == 0) and (c.rating > 0.3) and c.rating + + + 27 + Skill + 2 + Expert skill bonus + 100 + 150 + 1 + 25 + 15 + 1 + c.onTrack and (c.jatosUsed > 0) and (c.place < 2) and (c.ghosts > 0) and (c.rating > 0.3) and c.rating + + + 28 + Skill + 1 + Skill bonus + 50 + 100 + 1 + 12 + 10 + 1 + c.onTrack and (c.jatosUsed > 0) and (c.place < 3) and (c.ghosts > 0) and c.rating + + + 29 + 2 + Finished with a bang + 50 + 150 + 2 + 0 + 15 + 2 + (c.finishBangDist < 1000) and lerpf( c.finishBangDist, 1000, 0, 0, 1 ) + + + 30 + HDC + 4 + HDC world champion + 150 + 1 + (c.hdc > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 31 + HDC + 4 + HDC daily world champion + 75 + 1 + (c.hdc > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 32 + HDC + 4 + HDC golden boy + 50 + 1 + (c.hdc > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 33 + HDC + 3 + HDC Sponsored expert showman + 45 + 1 + (c.hdc > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf( c.finishBang, 1000, 0, 0, 1 ) * c.rating) + + + 34 + HDC + 2 + HDC Sponsored favourite + 35 + 1 + (c.hdc > 4) and (c.rating > 0.3) and c.rating + + + 35 + HDC + 2 + HDC Sponsored showman + 30 + 1 + (c.hdc > 4) and (c.finishBangDist < 1000) and lerpf( c.finishBang, 1000, 0, 0, 1 ) + + + 36 + HDC + 1 + HDC Sponsored + 5 + 1 + (c.hdc > 0) and (c.rating+0.2 * lerpf( c.hdc, 0, 5, 0, 1 )) + + + 37 + RYLEE + 4 + RYLEE world champion + 150 + 1 + (c.rylee > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 38 + RYLEE + 4 + RYLEE daily world champion + 75 + 1 + (c.rylee > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 39 + RYLEE + 4 + RYLEE golden boy + 50 + 1 + (c.rylee > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 40 + RYLEE + 3 + RYLEE Sponsored expert showman + 45 + 1 + (c.rylee > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf(c.finishBang, 1000, 0, 0, 1) * c.rating) + + + 41 + RYLEE + 2 + RYLEE Sponsored favourite + 35 + 1 + (c.rylee > 4) and (c.rating > 0.3) and c.rating + + + 42 + RYLEE + 2 + RYLEE Sponsored showman + 30 + 1 + (c.rylee > 4) and (c.finishBangDist < 1000) and lerpf(c.finishBang, 1000, 0, 0, 1) + + + 43 + RYLEE + 1 + RYLEE Sponsored + 5 + 1 + (c.rylee > 0) and (c.rating+0.2 * lerpf(c.rylee, 0, 5, 0, 1)) + + + 44 + JETBOX + 4 + JETBOX world champion + 150 + 1 + (c.jetbox > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 45 + JETBOX + 4 + JETBOX daily world champion + 75 + 1 + (c.jetbox > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 46 + JETBOX + 4 + JETBOX golden boy + 50 + 1 + (c.jetbox > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 47 + JETBOX + 3 + JETBOX Sponsored expert showman + 45 + 1 + (c.jetbox > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf(c.finishBang, 1000, 0, 0, 1) * c.rating) + + + 48 + JETBOX + 2 + JETBOX Sponsored favourite + 35 + 1 + (c.jetbox > 4) and (c.rating > 0.3) and c.rating + + + 49 + JETBOX + 2 + JETBOX Sponsored showman + 30 + 1 + (c.jetbox > 4) and (c.finishBangDist < 1000) and lerpf(c.finishBang, 1000, 0, 0, 1) + + + 50 + JETBOX + 1 + JETBOX Sponsored + 5 + 1 + (c.jetbox > 0) and (c.rating+0.2 * lerpf(c.jetbox, 0, 5, 0, 1)) + + + 51 + LEXAN + 4 + LEXAN world champion + 150 + 1 + (c.lexan > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 52 + LEXAN + 4 + LEXAN daily world champion + 75 + 1 + (c.lexan > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 53 + LEXAN + 4 + LEXAN golden boy + 50 + 1 + (c.lexan > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 54 + LEXAN + 3 + LEXAN Sponsored expert showman + 45 + 1 + (c.lexan > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf(c.finishBang, 1000, 0, 0, 1) * c.rating) + + + 55 + LEXAN + 2 + LEXAN Sponsored favourite + 35 + 1 + (c.lexan > 4) and (c.rating > 0.3) and c.rating + + + 56 + LEXAN + 2 + LEXAN Sponsored showman + 30 + 1 + (c.lexan > 4) and (c.finishBangDist < 1000) and lerpf(c.finishBang, 1000, 0, 0, 1) + + + 57 + LEXAN + 1 + LEXAN Sponsored + 5 + 1 + (c.lexan > 0) and (c.rating+0.2 * lerpf(c.lexan, 0, 5, 0, 1)) + + + 58 + ProPulse + 4 + ProPulse world champion + 150 + 1 + (c.propulse > 4) and (c.time < t.world) and c.onTrack and (c.rating > 0.3) and c.rating + + + 59 + ProPulse + 4 + ProPulse daily world champion + 75 + 1 + (c.propulse > 4) and (c.time < t.daily) and c.onTrack and (c.rating > 0.3) and c.rating + + + 60 + ProPulse + 4 + ProPulse golden boy + 50 + 1 + (c.propulse > 4) and c.onTrack and (c.rating > 0.3) and c.rating + + + 61 + ProPulse + 3 + ProPulse Sponsored expert showman + 45 + 1 + (c.propulse > 4) and (c.rating > 0.3) and (c.finishBang < 1000) and (lerpf(c.finishBang, 1000, 0, 0, 1) * c.rating) + + + 62 + ProPulse + 2 + ProPulse Sponsored favourite + 35 + 1 + (c.propulse > 4) and (c.rating > 0.3) and c.rating + + + 63 + ProPulse + 2 + ProPulse Sponsored showman + 30 + 1 + (c.propulse > 4) and (c.finishBangDist < 1000) and lerpf(c.finishBang, 1000, 0, 0, 1) + + + 64 + ProPulse + 1 + ProPulse Sponsored + 5 + 1 + (c.propulse > 0) and (c.rating+0.2 * lerpf(c.propulse, 0, 5, 0, 1)) + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/settings/v3.3/global/global.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/settings/v3.3/global/global.xml new file mode 100644 index 000000000..55a05d0b1 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/settings/v3.3/global/global.xml @@ -0,0 +1,5 @@ + + https://www.sodiumhalogen.com/ + true + https://www.sodiumhalogen.com/ + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/settings/v3.3/region/SCEA.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/settings/v3.3/region/SCEA.xml new file mode 100644 index 000000000..e69de29bb diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/settings/v3.3/region/SCEE.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/settings/v3.3/region/SCEE.xml new file mode 100644 index 000000000..e69de29bb diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/global/global.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/global/global.xml new file mode 100644 index 000000000..2caedf984 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/global/global.xml @@ -0,0 +1,82 @@ + + + + + 1 + Industrial sector + This track was constructed over the roads that once led in and out of the long abandoned tunnels and refineries of a former mining settlement. + track_01/map.dds,track_01/preview_01.dds,track_01/preview_02.dds,track_01/preview_03.dds,track_01/preview_04.dds,track_01/thumbnail.dds + track_01/thumbnail.dds + true + + + true + 5 + Industrial sector (reverse) + This track was constructed over the roads that once led in and out of the long abandoned tunnels and refineries of a former mining settlement. + track_01/map_reverse.dds,track_01/preview_01.dds,track_01/preview_02.dds,track_01/preview_03.dds,track_01/preview_04.dds,track_01/thumbnail.dds + track_01/thumbnail.dds + true + + + 2 + Rocky speedway + Soar through these ancient and monumental valleys to achieve blistering speeds in your Sodium2 craft! + track_02/map.dds,track_02/preview_01.dds,track_02/preview_02.dds,track_02/preview_03.dds,track_02/preview_04.dds,track_02/thumbnail.dds + track_02/thumbnail.dds + true + + + true + 6 + Rocky speedway (reverse) + Soar through these ancient and monumental valleys to achieve blistering speeds in your Sodium2 craft! + track_02/map_reverse.dds,track_02/preview_01.dds,track_02/preview_02.dds,track_02/preview_03.dds,track_02/preview_04.dds,track_02/thumbnail.dds + track_02/thumbnail.dds + true + + + 1 + 3 + Wasteland spires + Set within the site of an ethically questionable and borderline illegal mining operation on the exoplanet Iridos, the twists and turns of this track will see you speeding past the abandoned machines and facilities that the long-gone corporations left behind. What’s more, you’ll also be able to prove your worth on the reverse version of this track. + track_03/map.dds,track_03/preview_01.dds,track_03/preview_02.dds,track_03/preview_03.dds,track_03/preview_04.dds,track_03/thumbnail.dds + track_03/thumbnail.dds + true + + + 1 + true + 7 + Wasteland spires (reverse) + Set within the site of an ethically questionable and borderline illegal mining operation on the exoplanet Iridos, the twists and turns of this track will see you speeding past the abandoned machines and facilities that the long-gone corporations left behind. What’s more, you’ll also be able to prove your worth on the reverse version of this track. + track_03/map_reverse.dds,track_03/preview_01.dds,track_03/preview_02.dds,track_03/preview_03.dds,track_03/preview_04.dds,track_03/thumbnail.dds + track_03/thumbnail.dds + true + + + 1 + 4 + Descent + Descent is set within the network of cave left behind by an unregulated iridium mining operation deep below the surface of Sodium exoplanet Iridos. The Velocity Racing League has since claimed this area for the purposes of extreme underground racing. This dark and twisting track provides some serious thrills, and is also available in reverse mode! + track_04/map.dds,track_04/preview_01.dds,track_04/preview_02.dds,track_04/preview_03.dds,track_04/preview_04.dds,track_04/thumbnail.dds + track_04/thumbnail.dds + true + + + 1 + true + 8 + Descent (reverse) + Descent is set within the network of cave left behind by an unregulated iridium mining operation deep below the surface of Sodium exoplanet Iridos. The Velocity Racing League has since claimed this area for the purposes of extreme underground racing. This dark and twisting track provides some serious thrills, and is also available in reverse mode! + track_04/map_reverse.dds,track_04/preview_01.dds,track_04/preview_02.dds,track_04/preview_03.dds,track_04/preview_04.dds,track_04/thumbnail.dds + track_04/thumbnail.dds + true + + + + + + https://scee-home.playstation.net/webassets/Sodium/sodium2/tracks/images/ + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/lang/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/lang/en-GB.xml new file mode 100644 index 000000000..e69de29bb diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/lang/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/lang/en-US.xml new file mode 100644 index 000000000..e69de29bb diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/region/SCEA.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/region/SCEA.xml new file mode 100644 index 000000000..e69de29bb diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/region/SCEE.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/data/v3.3/region/SCEE.xml new file mode 100644 index 000000000..e69de29bb diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/map.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/map.dds new file mode 100644 index 000000000..e45b0084f Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/map.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/map_reverse.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/map_reverse.dds new file mode 100644 index 000000000..77bc15e3a Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/map_reverse.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_01.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_01.dds new file mode 100644 index 000000000..eb7c1b60f Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_01.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_02.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_02.dds new file mode 100644 index 000000000..8606e3d78 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_02.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_03.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_03.dds new file mode 100644 index 000000000..2f5955ab9 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_03.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_04.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_04.dds new file mode 100644 index 000000000..4beb1db2e Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/preview_04.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/thumbnail.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/thumbnail.dds new file mode 100644 index 000000000..e4d9ba677 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_01/thumbnail.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/map.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/map.dds new file mode 100644 index 000000000..634d02958 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/map.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/map_reverse.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/map_reverse.dds new file mode 100644 index 000000000..84ff42a0c Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/map_reverse.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_01.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_01.dds new file mode 100644 index 000000000..cb4e80d60 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_01.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_02.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_02.dds new file mode 100644 index 000000000..6b7d05671 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_02.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_03.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_03.dds new file mode 100644 index 000000000..00a46138a Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_03.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_04.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_04.dds new file mode 100644 index 000000000..fb6ad46c7 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/preview_04.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/thumbnail.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/thumbnail.dds new file mode 100644 index 000000000..d852108af Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_02/thumbnail.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/map.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/map.dds new file mode 100644 index 000000000..f1811fb5b Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/map.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/map_reverse.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/map_reverse.dds new file mode 100644 index 000000000..5abc56a23 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/map_reverse.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_01.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_01.dds new file mode 100644 index 000000000..f6750897e Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_01.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_02.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_02.dds new file mode 100644 index 000000000..2c0cb2811 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_02.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_03.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_03.dds new file mode 100644 index 000000000..b380ae6ce Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_03.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_04.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_04.dds new file mode 100644 index 000000000..e29b3bdfd Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/preview_04.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/thumbnail.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/thumbnail.dds new file mode 100644 index 000000000..0786a8729 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_03/thumbnail.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/map.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/map.dds new file mode 100644 index 000000000..0f6cb1481 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/map.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/map_reverse.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/map_reverse.dds new file mode 100644 index 000000000..4e07978e6 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/map_reverse.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_01.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_01.dds new file mode 100644 index 000000000..2153d0a6d Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_01.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_02.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_02.dds new file mode 100644 index 000000000..821b2a0f7 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_02.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_03.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_03.dds new file mode 100644 index 000000000..dfc04b999 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_03.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_04.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_04.dds new file mode 100644 index 000000000..d11257b14 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/preview_04.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/thumbnail.dds b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/thumbnail.dds new file mode 100644 index 000000000..7e8696cc6 Binary files /dev/null and b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/tracks/images/track_04/thumbnail.dds differ diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/welcome_msg/v3.3/lang/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/welcome_msg/v3.3/lang/en-GB.xml new file mode 100644 index 000000000..8bd368322 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/welcome_msg/v3.3/lang/en-GB.xml @@ -0,0 +1,4 @@ + + Welcome to Sodium 2 for the first time! + Welcome to Sodium 2! + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/welcome_msg/v3.3/lang/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/welcome_msg/v3.3/lang/en-US.xml new file mode 100644 index 000000000..8bd368322 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/welcome_msg/v3.3/lang/en-US.xml @@ -0,0 +1,4 @@ + + Welcome to Sodium 2 for the first time! + Welcome to Sodium 2! + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/global/global.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/global/global.xml new file mode 100644 index 000000000..fed81e789 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/global/global.xml @@ -0,0 +1,9 @@ + + + 50 + 0.25 + 0.5 + 1 + 1 + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/lang/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/lang/en-GB.xml new file mode 100644 index 000000000..754353f18 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/lang/en-GB.xml @@ -0,0 +1,7 @@ + + + + B91BA7FD-EA1B4197-A696B577-FC7D896D + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/lang/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/lang/en-US.xml new file mode 100644 index 000000000..754353f18 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/lang/en-US.xml @@ -0,0 +1,7 @@ + + + + B91BA7FD-EA1B4197-A696B577-FC7D896D + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/region/SCEA.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/region/SCEA.xml new file mode 100644 index 000000000..66d01fcd5 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/region/SCEA.xml @@ -0,0 +1,11 @@ + + + + + + + + B91BA7FD-EA1B4197-A696B577-FC7D896D + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/region/SCEE.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/region/SCEE.xml new file mode 100644 index 000000000..66d01fcd5 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/sodium2/xp/v3.3/region/SCEE.xml @@ -0,0 +1,11 @@ + + + + + + + + B91BA7FD-EA1B4197-A696B577-FC7D896D + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/tips/v3.3/defs.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/tips/v3.3/defs.xml new file mode 100644 index 000000000..933d12682 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/tips/v3.3/defs.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/global.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/global.xml new file mode 100644 index 000000000..74367ff9f --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/global.xml @@ -0,0 +1,8 @@ + + + + + 100 + + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/lang/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/lang/en-GB.xml new file mode 100644 index 000000000..4b04dfda6 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/lang/en-GB.xml @@ -0,0 +1,80 @@ + + + + + Vetoxadia + + <_>Drink Selection System. + + + <_>Ok + <_>Exit + + + + Drink Selection + + <_>Select a drink on the next page. + + + <_>Ok + + + + Drink Error + + <_>Error fetching available drinks. Try again later. + + + <_>Ok + + + + Out Of Stock + + <_>This drink is out of stock + + + <_>Ok + + + + Confirm Selection + + <_>Confirm this drink selection + + + <_>Ok + <_>Exit + + + + Insufficient Funds + + <_>You don't have sufficient funds to purchase this + + + <_>Ok + + + + Drink Ready + + <_>Go pick up your drink! + + + <_>Ok + <_>Exit + + + + Drink Failure + + <_>Error creating your drink. + + + <_>Ok + + + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/lang/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/lang/en-US.xml new file mode 100644 index 000000000..4b04dfda6 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/lang/en-US.xml @@ -0,0 +1,80 @@ + + + + + Vetoxadia + + <_>Drink Selection System. + + + <_>Ok + <_>Exit + + + + Drink Selection + + <_>Select a drink on the next page. + + + <_>Ok + + + + Drink Error + + <_>Error fetching available drinks. Try again later. + + + <_>Ok + + + + Out Of Stock + + <_>This drink is out of stock + + + <_>Ok + + + + Confirm Selection + + <_>Confirm this drink selection + + + <_>Ok + <_>Exit + + + + Insufficient Funds + + <_>You don't have sufficient funds to purchase this + + + <_>Ok + + + + Drink Ready + + <_>Go pick up your drink! + + + <_>Ok + <_>Exit + + + + Drink Failure + + <_>Error creating your drink. + + + <_>Ok + + + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/region/SCEA.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/region/SCEA.xml new file mode 100644 index 000000000..6da8774e5 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/region/SCEA.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/region/SCEE.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/region/SCEE.xml new file mode 100644 index 000000000..6da8774e5 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/vending_machine/v1.1/region/SCEE.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/wallet/v3.3/defs.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/wallet/v3.3/defs.xml new file mode 100644 index 000000000..ced0a5ef8 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/wallet/v3.3/defs.xml @@ -0,0 +1,8 @@ + + + 1 + 255,255,255,255 + 1 + 1 + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/global/global.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/global/global.xml new file mode 100644 index 000000000..cfdf92219 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/global/global.xml @@ -0,0 +1,465 @@ + + + 40 + 6 + 1.7 + 10 + 5 + + + Sodium2 Touchstone DX Rocket Booster Ornament + S2_touchstone_dx.dds + 128 + + + + Sodium2 Trackside Lamp + S2_trackside_lamp.dds + 128 + + + + Sodium Poster + S2_poster_reward.dds + 128 + + + + Sodium Sentry Chair - Yellow + S2_teleport_chair_yellow.dds + 128 + + + + Sodium2 Personal Wind Farm Fan + S2_fan_curved.dds + 128 + + + + Sodium2 Firecracker DX Rocket Booster Ornament + S2_firecracker_dx.dds + 128 + + + + Sodium2 Industrial Counterweight Crane Replica + S2_crane_wirey.dds + 128 + + + + Velocity Racer - Level 10 Accolade + S2_trophy_10.dds + 128 + + + + Sodium2 Turbulence DX Rocket Booster Ornament + S2_turbulence_dx.dds + 128 + + + + Sodium2 Blam! - Graphic Wall Art + S2_grafitti_blam.dds + 128 + + + + Sodium Quintepede Table - Red + S2_teleport_table_red.dds + 128 + + + + Sodium2 Sideline Lamp + S2_trackside_lamp.dds + 128 + + + + Sodium2 Terrapin DX Rocket Booster Ornament + S2_terrapin_dx.dds + 128 + + + + CoLD SToRAGE Head Logo Wall Mount + S2_cs_head_logo.dds + 128 + + + + Velocity Racer - Level 20 Accolade + S2_trophy_20.dds + 128 + + + + Sodium Tripod Table - Red + S2_pillar_table_red.dds + 128 + + + + Sodium2 Industrial Quadrapod Crane Replica + S2_crane_tripod.dds + 128 + + + + Sodium Sentry Chair - Red + S2_teleport_chair_red.dds + 128 + + + + Sodium2 Whooosh! - Graphic Wall Art + S2_grafitti_whoosh.dds + 128 + + + + Sodium2 Industrial Heavy Arm Crane Replica + S2_crane_arm.dds + 128 + + + + Velocity Racer - Level 30 Accolade + S2_trophy_30.dds + 128 + + + + Sodium Tripod Table - Yellow + S2_pillar_table_yellow.dds + 128 + + + + Sodium2 Zoooom! - Graphic Wall Art + S2_grafitti_zoom.dds + 128 + + + + Sodium2 Industrial Buzz Saw Replica + S2_buzzsaw.dds + 128 + + + + Sodium Quintepede Table - Yellow + S2_teleport_table_yellow.dds + 128 + + + + Sodium2 Whizzz! - Graphic Wall Art + S2_grafitti_whizz.dds + 128 + + + + Velocity Racer - Level 40 Accolade + S2_trophy_40.dds + 128 + + + + Sodium 2 Decibel Headphones (Male) + S2_decibel_headphones_male.dds + 128 + + + + Sodium 2 Decibel Headphones (Female) + S2_decibel_headphones_female.dds + 128 + + + + + Sodium2 Legendary Pilot Gloves (Male) + S2_legendary_gloves_male.dds + 128 + + + Sodium2 Legendary Pilot Trousers (Male) + S2_legendary_trouser_male.dds + 128 + + + Sodium2 Legendary Pilot Helmet (Male) + S2_legendary_helmet_male.dds + 128 + + + Sodium2 Legendary Pilot Boots (Male) + S2_legendary_boots_male.dds + 128 + + + Sodium2 Legendary Pilot Body Armor (Male) + S2_legendary_torso_male.dds + 128 + + + Sodium2 Legendary Pilot Visor (Male) + S2_legendary_visor_male.dds + 128 + + + + + Sodium2 Legendary Pilot Gloves (Female) + S2_legendary_gloves_female.dds + 128 + + + Sodium2 Legendary Pilot Trousers (Female) + S2_legendary_trouser_female.dds + 128 + + + Sodium2 Legendary Pilot Helmet (Female) + S2_legendary_helmet_female.dds + 128 + + + Sodium2 Legendary Pilot Boots (Female) + S2_legendary_boots_female.dds + 128 + + + Sodium2 Legendary Pilot Body Armor (Female) + S2_legendary_torso_female.dds + 128 + + + Sodium2 Legendary Pilot Visor (Female) + S2_legendary_visor_female.dds + 128 + + + + + 0,1,0.77,1 + + <_>439A4BAF-91A348BD-ACD0AF34-050AC05A + + + + 0,1,0.77,1 + + <_>EDDFBC3C-4FAD4F7D-8E47934E-6CDA8656 + + + + 0,1,0.77,1 + + <_>8A70C3D2-4BB542FD-B5EE796D-A7F49CD3 + + + + 0,1,0.77,1 + + <_>DEF3FCB2-AC7545B1-AB1A1621-136C462C + + + + 0,1,0.77,1 + + <_>BA911609-2DAA4301-B02E3F9A-E01269FE + + + + 0,1,0.77,1 + + + 0,1,0.77,1 + + <_>F0084246-444D4B83-8995C76C-5921D8F7 + + + + 0,1,0.77,1 + + <_>C217514D-9F444578-8BA0E84B-34355FB0 + + + + 0,1,0.77,1 + + + 1,0.68,0.15,1 + + <_>B91BA7FD-EA1B4197-A696B577-FC7D896D + + + + 1,0.68,0.15,1 + + <_>79131EAD-2F1147A9-811866B1-90B093FD + + + + 1,0.68,0.15,1 + + <_>7083365D-2C1C4080-AC0B0BB9-C71EBF52 + + + + 1,0.68,0.15,1 + + + 1,0.68,0.15,1 + + <_>35C7FC33-25D7450E-81FC5961-892A1033 + + + + 1,0.68,0.15,1 + + + 1,0.68,0.15,1 + + <_>EF0F8BD3-8C4D4B40-93B2556F-EF5E5F88 + + + + 1,0.68,0.15,1 + + <_>438100D8-19414A63-A59A5AF6-1892FD04 + + + + 1,0.68,0.15,1 + + + 1,0.68,0.15,1 + + <_>97DFF09E-EDB24CBE-AB84B4F8-A2A58EDF + + + + 1.0,0.9,0.5,1 + + <_>9A7BA839-BD3D4240-B1C69409-F00DA59A + <_>BEE355D8-6B7D4575-86AC55CD-DBD1B7C5 + <_>C7220CE5-A7D34EC5-B7BB8DF9-CC2A9B36 + + + + 1.0,0.9,0.5,1 + + <_>608EA89E-B15A4C1E-B61433EB-1B01315F + + + + 1.0,0.9,0.5,1 + + + 1.0,0.9,0.5,1 + + <_>083689E2-D22045C1-8E13C10F-73AF2055 + + + + 1.0,0.9,0.5,1 + + + 1.0,0.9,0.5,1 + + <_>72F64727-586C466C-88011156-E5395CCE + + + + 1.0,0.9,0.5,1 + + <_>EE79E6E4-E3AF4FD8-96484D8F-C8022BDF + + + + 1.0,0.9,0.5,1 + + + 1.0,0.9,0.5,1 + + <_>C4A3725F-48784A9D-A7E18AC9-C88D57F0 + + + + 1.0,0.9,0.5,1 + + + 1.0,0.9,0.5,1 + + <_>7309219D-C64A4CD5-9D0B819C-224EF4A0 + + + + 1.0,0.9,0.5,1 + + <_>F0E5D5C6-11684ABC-B81671A0-DE19284B + + + + 1.0,0.9,0.5,1 + + <_>9F1FCC3E-A20F4D98-AC0B1E59-A766E14F + + + + 1.0,0.9,0.5,1 + + + 1.0,0.9,0.5,1 + + + 1.0,0.9,0.5,1 + + <_>507857EB-31574FC7-A9CB233C-7D685908 + + + + 1.0,0.9,0.5,1 + + + 1.0,0.9,0.5,1 + + <_>FC278108-04CA4FE9-8C3500C2-7185EE39 + + + + 1.0,0.9,0.5,1 + + + 1.0,0.9,0.5,1 + + <_>3A767A41-63004ACE-835FFE7D-3449FB7D + + + + 1.0,0.9,0.5,1 + + <_>88737BB3-91F346F6-9A618F9D-1CF4C1FD + <_>9B27B977-F1C34DF1-97BEA5CB-47632FE9 + <_>E091F81B-5D9F4352-AB18EBFD-87320027 + <_>44236601-115B4DE6-821E2137-3D33B2A1 + <_>B6D01A50-B11B4AD6-82A79C09-5E3D6EC7 + <_>9546C97C-C693463C-8A57289B-CDF57000 + <_>0057E076-43E94137-A75878B3-03102ED7 + <_>DC983FC4-426D4EAE-B4C534FE-AE4267B9 + <_>2CBE1B28-FB054809-B62AB297-93009051 + <_>5F387D86-C75B4524-B97AE1D5-0F8833D2 + <_>85A80DF3-91FB4903-93B7E215-327D9E5C + <_>BB7B23B7-C2374764-B47EEFE1-309BB88F + <_>651CD402-B2FC4533-A9D7E531-34E54E23 + + + + + diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/lang/en-GB.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/lang/en-GB.xml new file mode 100644 index 000000000..754353f18 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/lang/en-GB.xml @@ -0,0 +1,7 @@ + + + + B91BA7FD-EA1B4197-A696B577-FC7D896D + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/lang/en-US.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/lang/en-US.xml new file mode 100644 index 000000000..754353f18 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/lang/en-US.xml @@ -0,0 +1,7 @@ + + + + B91BA7FD-EA1B4197-A696B577-FC7D896D + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/region/SCEA.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/region/SCEA.xml new file mode 100644 index 000000000..66d01fcd5 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/region/SCEA.xml @@ -0,0 +1,11 @@ + + + + + + + + B91BA7FD-EA1B4197-A696B577-FC7D896D + + + \ No newline at end of file diff --git a/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/region/SCEE.xml b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/region/SCEE.xml new file mode 100644 index 000000000..66d01fcd5 --- /dev/null +++ b/WebServers/HTTPSecureServerLite/static/wwwroot/webassets/Sodium/xp/v3.3/region/SCEE.xml @@ -0,0 +1,11 @@ + + + + + + + + B91BA7FD-EA1B4197-A696B577-FC7D896D + + + \ No newline at end of file diff --git a/WebServers/HTTPServer/HttpProcessor.cs b/WebServers/HTTPServer/HttpProcessor.cs index c040a6796..b24c6e590 100644 --- a/WebServers/HTTPServer/HttpProcessor.cs +++ b/WebServers/HTTPServer/HttpProcessor.cs @@ -38,6 +38,8 @@ using System.Text.Json.Serialization; using Newtonsoft.Json; using WebAPIService.UBISOFT.gsconnect; +using CyberBackendLibrary.Crypto; +using CyberBackendLibrary.Extension; namespace HTTPServer { @@ -627,7 +629,7 @@ public void HandleClient(TcpClient tcpClient, ushort ListenerPort) extractedData[i] = 0x48; } - if (DataTypesUtils.FindbyteSequence(PSNTicket, new byte[] { 0x52, 0x50, 0x43, 0x4E })) + if (DataTypesUtils.FindBytePattern(PSNTicket, new byte[] { 0x52, 0x50, 0x43, 0x4E }) != -1) LoggerAccessor.LogInfo($"[HERMES] : User {Encoding.ASCII.GetString(extractedData).Replace("H", string.Empty)} logged in and is on RPCN"); else LoggerAccessor.LogInfo($"[HERMES] : {Encoding.ASCII.GetString(extractedData).Replace("H", string.Empty)} logged in and is on PSN"); @@ -961,13 +963,15 @@ public void HandleClient(TcpClient tcpClient, ushort ListenerPort) if (vid != null && vid.Available && vid.VideoStream != null) { using HugeMemoryStream ms = new(vid.VideoStream, HTTPServerConfiguration.BufferSize); + vid.VideoStream.Close(); + vid.VideoStream.Dispose(); + ms.Position = 0; response = new(request.RetrieveHeaderValue("Connection") == "keep-alive") { HttpStatusCode = Models.HttpStatusCode.OK }; response.Headers.Add("Content-Type", vid.ContentType); response.Headers.Add("Content-Length", ms.Length.ToString()); - ms.Flush(); } else response = HttpBuilder.InternalServerError(); @@ -1000,7 +1004,7 @@ public void HandleClient(TcpClient tcpClient, ushort ListenerPort) byte[] VerificationChunck = DataTypesUtils.ReadSmallFileChunck(filePath, 10); foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(VerificationChunck, entry.Value)) + if (DataTypesUtils.FindBytePattern(VerificationChunck, entry.Value) != -1) { ContentType = entry.Key; break; @@ -1103,7 +1107,9 @@ private static void WriteResponse(Stream stream, HttpRequest? request, HttpRespo if (response.ContentStream != null) // Safety. { - string EtagMD5 = ComputeStreamMD5(response.ContentStream); + string EtagMD5 = ComputeStreamChecksum(response.ContentStream); + + response.ContentStream.Position = 0; if (!string.IsNullOrEmpty(request.Method) && request.Method == "OPTIONS") { @@ -1252,7 +1258,7 @@ private static void Handle_LocalFile_Stream(Stream stream, HttpRequest request, byte[] VerificationChunck = DataTypesUtils.ReadSmallFileChunck(local_path, 10); foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(VerificationChunck, entry.Value)) + if (DataTypesUtils.FindBytePattern(VerificationChunck, entry.Value) != -1) { ContentType = entry.Key; break; @@ -1550,7 +1556,7 @@ private static void Handle_LocalFile_Stream(Stream stream, HttpRequest request, byte[] VerificationChunck = DataTypesUtils.ReadSmallFileChunck(local_path, 10); foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(VerificationChunck, entry.Value)) + if (DataTypesUtils.FindBytePattern(VerificationChunck, entry.Value) != -1) { ContentType = entry.Key; break; @@ -1610,7 +1616,7 @@ private static void Handle_LocalFile_Stream(Stream stream, HttpRequest request, { foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(DataTypesUtils.ReadSmallFileChunck(local_path, 10), entry.Value)) + if (DataTypesUtils.FindBytePattern(DataTypesUtils.ReadSmallFileChunck(local_path, 10), entry.Value) != -1) { ContentType = entry.Key; break; @@ -1701,7 +1707,9 @@ private static void Handle_LocalFile_Stream(Stream stream, HttpRequest request, if (response.ContentStream != null) // Safety. { - string EtagMD5 = ComputeStreamMD5(response.ContentStream); + string EtagMD5 = ComputeStreamChecksum(response.ContentStream); + + response.ContentStream.Position = 0; if (request.Headers.TryGetValue("If-None-Match", out string? value1) && value1.Equals(EtagMD5)) { @@ -1964,27 +1972,23 @@ protected virtual HttpRequest AppendRequestOrInputStream(Stream inputStream, Htt } /// - /// Compute the MD5 checksum of a stream. - /// Calcul la somme des contr�les en MD5 d'un stream. + /// Compute the checksum of a stream. + /// Calcul la somme des contr�les d'un stream. /// /// The input stream (must be seekable). /// A string. - private static string ComputeStreamMD5(Stream input) + private static string ComputeStreamChecksum(Stream input) { if (!input.CanSeek) return string.Empty; - // ComputeHash - returns byte array byte[] bytes = MD5.Create().ComputeHash(input); - input.Position = 0; - - // Convert byte array to a string StringBuilder builder = new(); for (int i = 0; i < bytes.Length; i++) builder.Append(bytes[i].ToString("x2")); - return builder.ToString(); + return builder.ToString() + $":{WebCrypto.ProcessSecureCheckum(bytes, input.Length)}"; } #if NET7_0_OR_GREATER @@ -1995,6 +1999,6 @@ private static string ComputeStreamMD5(Stream input) [GeneratedRegex("\\b\\d{3}\\b")] private static partial Regex HttpStatusCodeRegex(); #endif -#endregion + #endregion } } diff --git a/WebServers/HTTPServer/HttpResponseContentStream.cs b/WebServers/HTTPServer/HttpResponseContentStream.cs index 3db3d52a8..fa45f3012 100644 --- a/WebServers/HTTPServer/HttpResponseContentStream.cs +++ b/WebServers/HTTPServer/HttpResponseContentStream.cs @@ -48,10 +48,13 @@ public override void Write(byte[] buffer, int offset, int count) { if (UseChunkedTransfer) { - // Send chunk - inner.Write(Encoding.ASCII.GetBytes((count - offset).ToString("X") + "\r\n").AsSpan()); + byte[] ChunckHeader = Encoding.ASCII.GetBytes((count - offset).ToString("X") + "\r\n"); + byte[] ChunckFooter = Encoding.ASCII.GetBytes("\r\n"); + + // Send chunk + inner.Write(ChunckHeader, 0, ChunckHeader.Length); inner.Write(buffer, offset, count); - inner.Write(Encoding.ASCII.GetBytes("\r\n").AsSpan()); + inner.Write(ChunckFooter, 0, ChunckFooter.Length); } else // Just write the body @@ -67,11 +70,14 @@ public void WriteTerminator(string trailer = "") { if (UseChunkedTransfer) { - // Write terminating chunk if need - try - { - inner.Write(Encoding.ASCII.GetBytes("0\r\n").AsSpan()); - inner.Write(Encoding.ASCII.GetBytes(trailer + "\r\n").AsSpan()); + byte[] TrailerHeader = Encoding.ASCII.GetBytes("0\r\n"); + byte[] TrailerFooter = Encoding.ASCII.GetBytes(trailer + "\r\n"); + + // Write terminating chunk if need + try + { + inner.Write(TrailerHeader, 0, TrailerHeader.Length); + inner.Write(TrailerFooter, 0, TrailerFooter.Length); } catch { /* Sometimes an connection lost may occur here. It's not a reason to worry. */ }; } diff --git a/WebServers/HTTPServer/Models/HttpResponse.cs b/WebServers/HTTPServer/Models/HttpResponse.cs index 0f2b8e5d9..5347cd5aa 100644 --- a/WebServers/HTTPServer/Models/HttpResponse.cs +++ b/WebServers/HTTPServer/Models/HttpResponse.cs @@ -1,5 +1,4 @@ // Copyright (C) 2016 by Barend Erasmus and donated to the public domain -using CyberBackendLibrary.HTTP; using HTTPServer.Extensions; using System; using System.Collections.Generic; @@ -155,7 +154,14 @@ public static HttpResponse Send(Stream? streamtosend, string mimetype = "text/pl if (streamtosend.CanSeek) response.ContentStream = streamtosend; else - response.ContentStream = new HugeMemoryStream(streamtosend, HTTPServerConfiguration.BufferSize); + { + response.ContentStream = new CyberBackendLibrary.Extension.HugeMemoryStream(streamtosend, HTTPServerConfiguration.BufferSize) + { + Position = 0 + }; + streamtosend.Close(); + streamtosend.Dispose(); + } } else response.ContentStream = null; diff --git a/WebServers/HTTPServer/RouteHandlers/FileSystemRouteHandler.cs b/WebServers/HTTPServer/RouteHandlers/FileSystemRouteHandler.cs index de4d93b8a..5cb1d98ed 100644 --- a/WebServers/HTTPServer/RouteHandlers/FileSystemRouteHandler.cs +++ b/WebServers/HTTPServer/RouteHandlers/FileSystemRouteHandler.cs @@ -36,7 +36,7 @@ public static HttpResponse HandleHEAD(HttpRequest request, string absolutepath, byte[] VerificationChunck = DataTypesUtils.ReadSmallFileChunck(local_path, 10); foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(VerificationChunck, entry.Value)) + if (DataTypesUtils.FindBytePattern(VerificationChunck, entry.Value) != -1) { matched = true; response.Headers["Content-Type"] = entry.Key; @@ -68,7 +68,7 @@ private static HttpResponse Handle_LocalFile(HttpRequest request, string local_p byte[] VerificationChunck = DataTypesUtils.ReadSmallFileChunck(local_path, 10); foreach (var entry in HTTPProcessor._PathernDictionary) { - if (DataTypesUtils.FindbyteSequence(VerificationChunck, entry.Value)) + if (DataTypesUtils.FindBytePattern(VerificationChunck, entry.Value) != -1) { ContentType = entry.Key; break; diff --git a/build.bat b/build.bat index f199feec2..941cdc6ec 100644 --- a/build.bat +++ b/build.bat @@ -36,9 +36,9 @@ if exist "~BuildOutput/MultiServer/Debug/net6.0" ( xcopy /E /Y /I "~BuildOutput/MultiServer/Debug/net6.0" "~BuildOutput/MultiServer/Debug" @rmdir /S /Q "~BuildOutput/MultiServer/Debug/net6.0" ) -if exist "~BuildOutput/MultiServer/Debug/net6.0" ( - xcopy /E /Y /I "~BuildOutput/MultiServer/Debug/net6.0" "~BuildOutput/MultiServer/Debug" - @rmdir /S /Q "~BuildOutput/MultiServer/Debug/net6.0" +if exist "~BuildOutput/MultiServer/Release/net6.0" ( + xcopy /E /Y /I "~BuildOutput/MultiServer/Release/net6.0" "~BuildOutput/MultiServer/Release" + @rmdir /S /Q "~BuildOutput/MultiServer/Release/net6.0" ) if exist "~BuildOutput/Nautilus/Debug/net6.0-windows" ( xcopy /E /Y /I "~BuildOutput/Nautilus/Debug/net6.0-windows" "~BuildOutput/Nautilus/Debug"