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;
+ }
+ }
}