From 912a02247666b1d3632cb946f5fa412ba594597c Mon Sep 17 00:00:00 2001 From: Spirtix Date: Mon, 11 Sep 2023 18:51:34 +0200 Subject: [PATCH] patch baby dragon exploit --- .../SetPositionVariablesHandler.cs | 3 +- .../SetUserVariablesHandler.cs | 8 +++ src/Core/Utils.cs | 23 +++++++++ src/Data/PlayerData.cs | 51 ++++++++++++++++++- 4 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 src/Core/Utils.cs diff --git a/src/CommandHandlers/SetPositionVariablesHandler.cs b/src/CommandHandlers/SetPositionVariablesHandler.cs index cbc3d50..13ddd7c 100644 --- a/src/CommandHandlers/SetPositionVariablesHandler.cs +++ b/src/CommandHandlers/SetPositionVariablesHandler.cs @@ -18,7 +18,8 @@ class SetPositionVariablesHandler : ICommandHandler { this.client = client; spvData = receivedObject; UpdatePositionVariables(); - SendSPVCommand(); + if (Utils.VariablesValid(client)) + SendSPVCommand(); } private void UpdatePositionVariables() { diff --git a/src/CommandHandlers/SetUserVariablesHandler.cs b/src/CommandHandlers/SetUserVariablesHandler.cs index 3a858f0..9317954 100644 --- a/src/CommandHandlers/SetUserVariablesHandler.cs +++ b/src/CommandHandlers/SetUserVariablesHandler.cs @@ -45,6 +45,10 @@ class SetUserVariablesHandler : ICommandHandler { client.PlayerData.J = suvData.Get("J"); client.PlayerData.Bu = suvData.Get("BU"); client.PlayerData.Fp = suvData.Get("FP"); + + if (!Utils.VariablesValid(client)) + return; + Console.WriteLine($"SUV {client.Room.Name} IID: {client.ClientID}"); client.Room.AddClient(client); UpdatePlayersInRoom(); @@ -78,6 +82,10 @@ class SetUserVariablesHandler : ICommandHandler { data2.Add("L", client.PlayerData.L); vl.Add(NetworkArray.StringParam("L", client.PlayerData.L)); } + + if (!Utils.VariablesValid(client)) + return; + data.Add("vl", vl); NetworkPacket packet = NetworkObject.WrapObject(0, 12, data).Serialize(); diff --git a/src/Core/Utils.cs b/src/Core/Utils.cs new file mode 100644 index 0000000..b97739f --- /dev/null +++ b/src/Core/Utils.cs @@ -0,0 +1,23 @@ +using sodoffmmo.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace sodoffmmo.Core; +internal static class Utils { + public static bool VariablesValid(Client client) { + if (client.PlayerData.Fp != "" && (client.PlayerData.Mbf & 8) == 8 + && (client.PlayerData.GeometryType == PetGeometryType.Default && client.PlayerData.PetAge < PetAge.Adult + || client.PlayerData.GeometryType == PetGeometryType.NightLight && client.PlayerData.PetAge < PetAge.Teen + || client.PlayerData.GeometryType == PetGeometryType.Terror && client.PlayerData.PetAge < PetAge.Titan)) { + NetworkObject obj = new NetworkObject(); + obj.Add("dr", (byte)1); + client.Send(NetworkObject.WrapObject(0, 1005, obj).Serialize()); + client.SheduleDisconnect(); + return false; + } + return true; + } +} diff --git a/src/Data/PlayerData.cs b/src/Data/PlayerData.cs index 80f62e0..96d61f5 100644 --- a/src/Data/PlayerData.cs +++ b/src/Data/PlayerData.cs @@ -6,7 +6,6 @@ public class PlayerData { public double R1 { get; set; } public double R2 { get; set; } public double R3 { get; set; } - public string Fp { get; set; } = ""; public double Mx { get; set; } = 6; public string Udt { get; set; } = ""; public double P1 { get; set; } @@ -27,6 +26,42 @@ public class PlayerData { public string M { get; set; } = "False"; public string L { get; set; } = ""; public string UNToken { get; set; } = ""; + public PetGeometryType GeometryType { get; set; } = PetGeometryType.Default; + public PetAge PetAge { get; set; } = PetAge.Adult; + public string Fp { + get { + return fp; + } + set { + fp = value; + string[] array = fp.Split('*'); + Dictionary keyValPairs = new(); + foreach (string str in array) { + string[] keyValPair = str.Split('$'); + if (keyValPair.Length == 2) + keyValPairs[keyValPair[0]] = keyValPair[1]; + } + GeometryType = PetGeometryType.Default; + PetAge = PetAge.Adult; + if (keyValPairs.TryGetValue("G", out string geometry)) { + if (geometry.ToLower().Contains("nightlight")) + GeometryType = PetGeometryType.NightLight; + else if (geometry.ToLower().Contains("terribleterror")) + GeometryType = PetGeometryType.Terror; + } + if (keyValPairs.TryGetValue("A", out string age)) { + switch (age) { + case "E": PetAge = PetAge.EggInHand; break; + case "B": PetAge = PetAge.Baby; break; + case "C": PetAge = PetAge.Child; break; + case "T": PetAge = PetAge.Teen; break; + case "A": PetAge = PetAge.Adult; break; + case "Ti": PetAge = PetAge.Titan; break; + } + } + } + } + private string fp = ""; public NetworkArray GetNetworkData(int clientID) { NetworkArray arr = new(); @@ -64,3 +99,17 @@ public class PlayerData { return arr; } } + +public enum PetGeometryType { + Default, + NightLight, + Terror +} +public enum PetAge { + EggInHand = 0, + Baby = 1, + Child = 2, + Teen = 3, + Adult = 4, + Titan = 5 +}