From 14243fc39d7e97bc11c0a5803c0bc27575dfef2d Mon Sep 17 00:00:00 2001 From: Zin <62830952+Zintixx@users.noreply.github.com> Date: Sun, 22 Sep 2024 23:57:38 -0700 Subject: [PATCH] Server Item Options --- Maple2.File.Parser/Maple2.File.Parser.csproj | 2 +- Maple2.File.Parser/ServerTableParser.cs | 39 +++++++++++++++++++ .../Xml/Table/Server/ItemOptionProbability.cs | 17 ++++++++ .../Xml/Table/Server/ItemOptionRandom.cs | 25 ++++++++++++ .../Xml/Table/Server/ItemOptionVariation.cs | 25 ++++++++++++ Maple2.File.Tests/ServerTableParserTest.cs | 27 +++++++++++++ 6 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 Maple2.File.Parser/Xml/Table/Server/ItemOptionProbability.cs create mode 100644 Maple2.File.Parser/Xml/Table/Server/ItemOptionRandom.cs create mode 100644 Maple2.File.Parser/Xml/Table/Server/ItemOptionVariation.cs diff --git a/Maple2.File.Parser/Maple2.File.Parser.csproj b/Maple2.File.Parser/Maple2.File.Parser.csproj index e48c7ec..75bde7b 100644 --- a/Maple2.File.Parser/Maple2.File.Parser.csproj +++ b/Maple2.File.Parser/Maple2.File.Parser.csproj @@ -13,7 +13,7 @@ MapleStory2, File, Parser, m2d, xml true - 2.1.30 + 2.1.31 net8.0 README.md enable diff --git a/Maple2.File.Parser/ServerTableParser.cs b/Maple2.File.Parser/ServerTableParser.cs index 86af0f6..5519e48 100644 --- a/Maple2.File.Parser/ServerTableParser.cs +++ b/Maple2.File.Parser/ServerTableParser.cs @@ -45,6 +45,9 @@ public class ServerTableParser { private readonly XmlSerializer enchantOptionSerializer; private readonly XmlSerializer shopMeretSerializer; private readonly XmlSerializer shopMeretCustomSerializer; + private readonly XmlSerializer itemOptionProbabilitySerializer; + private readonly XmlSerializer itemOptionVariationSerializer; + private readonly XmlSerializer itemOptionRandomSerializer; public ServerTableParser(M2dReader xmlReader) { this.xmlReader = xmlReader; @@ -83,6 +86,9 @@ public ServerTableParser(M2dReader xmlReader) { enchantOptionSerializer = new XmlSerializer(typeof(EnchantOptionRoot)); shopMeretSerializer = new XmlSerializer(typeof(ShopMeretRoot)); shopMeretCustomSerializer = new XmlSerializer(typeof(ShopMeretCustomRoot)); + itemOptionProbabilitySerializer = new XmlSerializer(typeof(ItemOptionProbabilityRoot)); + itemOptionVariationSerializer = new XmlSerializer(typeof(ItemOptionVariationRoot)); + itemOptionRandomSerializer = new XmlSerializer(typeof(ItemOptionRandomRoot)); // var seen = new HashSet(); // this.bankTypeSerializer.UnknownAttribute += (sender, args) => { @@ -640,4 +646,37 @@ public ServerTableParser(M2dReader xmlReader) { yield return (shopMeret.id, shopMeret); } } + + public IEnumerable<(string Name, ItemOptionProbability Option)> ParseItemOptionProbability() { + string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/Server/itemOptionProbability.xml"))); + var reader = XmlReader.Create(new StringReader(xml)); + var data = itemOptionProbabilitySerializer.Deserialize(reader) as ItemOptionProbabilityRoot; + Debug.Assert(data != null); + + foreach (ItemOptionProbability option in data.option) { + yield return (option.name, option); + } + } + + public IEnumerable<(int Id, ItemOptionVariation Option)> ParseItemOptionVariation() { + string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/Server/itemOptionVariation.xml"))); + var reader = XmlReader.Create(new StringReader(xml)); + var data = itemOptionVariationSerializer.Deserialize(reader) as ItemOptionVariationRoot; + Debug.Assert(data != null); + + foreach (ItemOptionVariation option in data.option) { + yield return (option.id, option); + } + } + + public IEnumerable<(int Id, ItemOptionRandom Option)> ParseItemOptionRandom() { + string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/Server/ItemOptionRandom.xml"))); + var reader = XmlReader.Create(new StringReader(xml)); + var data = itemOptionRandomSerializer.Deserialize(reader) as ItemOptionRandomRoot; + Debug.Assert(data != null); + + foreach (ItemOptionRandom option in data.option) { + yield return (option.code, option); + } + } } diff --git a/Maple2.File.Parser/Xml/Table/Server/ItemOptionProbability.cs b/Maple2.File.Parser/Xml/Table/Server/ItemOptionProbability.cs new file mode 100644 index 0000000..a239049 --- /dev/null +++ b/Maple2.File.Parser/Xml/Table/Server/ItemOptionProbability.cs @@ -0,0 +1,17 @@ +using System.Xml.Serialization; + +namespace Maple2.File.Parser.Xml.Table.Server; + +// ./data/server/table/Server/itemOptionProbability.xml +[XmlRoot("ms2")] +public class ItemOptionProbabilityRoot { + [XmlElement] public List option; +} + +public partial class ItemOptionProbability { + [XmlAttribute] public string name = string.Empty; + [XmlAttribute] public int weaponProbability; + [XmlAttribute] public int armorProbability; + [XmlAttribute] public int accProbability; + [XmlAttribute] public int petProbability; +} diff --git a/Maple2.File.Parser/Xml/Table/Server/ItemOptionRandom.cs b/Maple2.File.Parser/Xml/Table/Server/ItemOptionRandom.cs new file mode 100644 index 0000000..451e962 --- /dev/null +++ b/Maple2.File.Parser/Xml/Table/Server/ItemOptionRandom.cs @@ -0,0 +1,25 @@ +using System.Xml.Serialization; + +namespace Maple2.File.Parser.Xml.Table.Server; + +// ./data/server/table/Server/itemOptionRandom.xml +[XmlRoot("ms2")] +public class ItemOptionRandomRoot { + [XmlElement] public List option; +} + +public class ItemOptionRandom { + [XmlAttribute] public int code; + [XmlAttribute] public int statGroup; + [XmlAttribute] public int levelGroupID; + [XmlAttribute] public int pickCount; + [XmlAttribute] public bool isRarePickOne; + [XmlAttribute] public int copyID; + [XmlElement] public List v; + + public class ItemOptionStat { + [XmlAttribute] public string name = string.Empty; + [XmlAttribute] public int weight = 1; + [XmlAttribute] public int statID; + } +} diff --git a/Maple2.File.Parser/Xml/Table/Server/ItemOptionVariation.cs b/Maple2.File.Parser/Xml/Table/Server/ItemOptionVariation.cs new file mode 100644 index 0000000..f4d77e9 --- /dev/null +++ b/Maple2.File.Parser/Xml/Table/Server/ItemOptionVariation.cs @@ -0,0 +1,25 @@ +using System.Xml.Serialization; + +namespace Maple2.File.Parser.Xml.Table.Server; + +// ./data/server/table/Server/itemOptionVariation.xml +[XmlRoot("ms2")] +public class ItemOptionVariationRoot { + [XmlElement] public List option; +} + +public class ItemOptionVariation { + [XmlAttribute] public int id; + [XmlAttribute] public int multipleID; + [XmlAttribute] public int groupType; + [XmlAttribute] public string name = string.Empty; + [XmlAttribute] public int levelGroupID; + [XmlAttribute] public int highStat; + [XmlAttribute] public int isRateType; + [XmlElement] public List v; + + public class ItemOptionStat { + [XmlAttribute] public int stat; + [XmlAttribute] public int weight = 1; + } +} diff --git a/Maple2.File.Tests/ServerTableParserTest.cs b/Maple2.File.Tests/ServerTableParserTest.cs index 44febb8..e878b01 100644 --- a/Maple2.File.Tests/ServerTableParserTest.cs +++ b/Maple2.File.Tests/ServerTableParserTest.cs @@ -408,4 +408,31 @@ public void TestMeretShopCustom() { continue; } } + + [TestMethod] + public void TestItemOptionProbability() { + var parser = new ServerTableParser(TestUtils.ServerReader); + + foreach ((_, _) in parser.ParseItemOptionProbability()) { + continue; + } + } + + [TestMethod] + public void TestItemOptionVariation() { + var parser = new ServerTableParser(TestUtils.ServerReader); + + foreach ((_, _) in parser.ParseItemOptionVariation()) { + continue; + } + } + + [TestMethod] + public void TestItemOptionRandom() { + var parser = new ServerTableParser(TestUtils.ServerReader); + + foreach ((_, _) in parser.ParseItemOptionRandom()) { + continue; + } + } }