From 97b336a89a032c8e903f3daedc25ea3eae1e8c24 Mon Sep 17 00:00:00 2001 From: MattN-L Date: Mon, 1 Apr 2024 02:22:45 -0400 Subject: [PATCH] Updated and split entity json data --- .../Additional-Popups/EntityForms/AddEntry.cs | 50 +- PCK-Studio/Forms/Editor/BehaviourEditor.cs | 59 +-- PCK-Studio/Forms/Editor/MaterialsEditor.cs | 41 +- PCK-Studio/Internal/Json/Entities.cs | 30 ++ PCK-Studio/Internal/Json/EntityInfo.cs | 24 + PCK-Studio/PckStudio.csproj | 6 +- PCK-Studio/Properties/Resources.Designer.cs | 126 ++++- PCK-Studio/Properties/Resources.resx | 12 +- PCK-Studio/Resources/atlases/entities.png | Bin 49985 -> 50311 bytes .../atlases/entityBehavioursData.json | 489 ++++++++++++++++++ PCK-Studio/Resources/atlases/entityData.json | 369 ------------- .../atlases/entityMaterialsData.json | 485 +++++++++++++++++ .../Resources/atlases/entityModelsData.json | 485 +++++++++++++++++ 13 files changed, 1684 insertions(+), 492 deletions(-) create mode 100644 PCK-Studio/Internal/Json/Entities.cs create mode 100644 PCK-Studio/Internal/Json/EntityInfo.cs create mode 100644 PCK-Studio/Resources/atlases/entityBehavioursData.json delete mode 100644 PCK-Studio/Resources/atlases/entityData.json create mode 100644 PCK-Studio/Resources/atlases/entityMaterialsData.json create mode 100644 PCK-Studio/Resources/atlases/entityModelsData.json diff --git a/PCK-Studio/Forms/Additional-Popups/EntityForms/AddEntry.cs b/PCK-Studio/Forms/Additional-Popups/EntityForms/AddEntry.cs index 213adb23..afc01e9e 100644 --- a/PCK-Studio/Forms/Additional-Popups/EntityForms/AddEntry.cs +++ b/PCK-Studio/Forms/Additional-Popups/EntityForms/AddEntry.cs @@ -3,14 +3,13 @@ using System.Collections.Generic; using System.Windows.Forms; using MetroFramework.Forms; using Newtonsoft.Json.Linq; +using PckStudio.Internal.Json; namespace PckStudio.Forms.Additional_Popups.EntityForms { public partial class AddEntry : MetroForm { string selectedEntity = ""; - - private static JObject EntityJSONData = JObject.Parse(Properties.Resources.entityData); public string SelectedEntity => selectedEntity; List treeViewEntityCache = new List(); @@ -24,37 +23,31 @@ namespace PckStudio.Forms.Additional_Popups.EntityForms entities.Images.AddRange(entityImages); treeViewEntity.ImageList = entities; - try + var entityInfos = dataType switch { - int i = 0; + "models" => Entities.ModelInfos, + "materials" => Entities.MaterialInfos, + "behaviours" => Entities.BehaviourInfos, + _ => null, + }; - if (EntityJSONData[dataType] != null) + int i = 0; + + foreach(var entity in entityInfos) + { + TreeNode entityNode = new TreeNode(entity.DisplayName) { - foreach (JObject content in EntityJSONData[dataType].Children()) - { - foreach (JProperty prop in content.Properties()) - { - if (!string.IsNullOrEmpty((string)prop.Value)) - { - TreeNode entityNode = new TreeNode((string)prop.Value) - { - Tag = prop.Name, - ImageIndex = i, - SelectedImageIndex = i, - }; - treeViewEntity.Nodes.Add(entityNode); - treeViewEntityCache.Add(entityNode); - } - i++; - } - } + Tag = entity.InternalName, + ImageIndex = i, + SelectedImageIndex = i, + }; + i++; + if (!String.IsNullOrEmpty(entity.InternalName)) + { + treeViewEntity.Nodes.Add(entityNode); + treeViewEntityCache.Add(entityNode); } } - catch (Newtonsoft.Json.JsonException j_ex) - { - MessageBox.Show(this, j_ex.Message, "Error"); - return; - } treeViewEntity.Sort(); } @@ -64,7 +57,6 @@ namespace PckStudio.Forms.Additional_Popups.EntityForms if (e.Node.Tag is string entityData) { selectedEntity = entityData; - Console.WriteLine(selectedEntity); } } diff --git a/PCK-Studio/Forms/Editor/BehaviourEditor.cs b/PCK-Studio/Forms/Editor/BehaviourEditor.cs index 26b32916..057de695 100644 --- a/PCK-Studio/Forms/Editor/BehaviourEditor.cs +++ b/PCK-Studio/Forms/Editor/BehaviourEditor.cs @@ -14,6 +14,7 @@ using OMI.Formats.Pck; using PckStudio.Properties; using PckStudio.Internal; using PckStudio.Extensions; +using PckStudio.Internal.Json; namespace PckStudio.Forms.Editor { @@ -23,7 +24,7 @@ namespace PckStudio.Forms.Editor private readonly PckFileData _file; BehaviourFile behaviourFile; - private readonly JObject EntityJSONData = JObject.Parse(Properties.Resources.entityData); + private readonly List BehaviourData = Entities.BehaviourInfos; void SetUpTree() { @@ -33,18 +34,10 @@ namespace PckStudio.Forms.Editor { TreeNode EntryNode = new TreeNode(entry.name); - foreach (JObject content in EntityJSONData["behaviours"].Children()) - { - var prop = content.Properties().FirstOrDefault(prop => prop.Name == entry.name); - if (prop is JProperty) - { - EntryNode.Text = (string)prop.Value; - EntryNode.ImageIndex = EntityJSONData["behaviours"].Children().ToList().IndexOf(content); - EntryNode.SelectedImageIndex = EntryNode.ImageIndex; - break; - } - } - + var behaviour = BehaviourData.Find(b => b.InternalName == entry.name); + EntryNode.Text = behaviour.DisplayName; + EntryNode.ImageIndex = BehaviourData.IndexOf(behaviour); + EntryNode.SelectedImageIndex = EntryNode.ImageIndex; EntryNode.Tag = entry; foreach (var posOverride in entry.overrides) @@ -83,10 +76,9 @@ namespace PckStudio.Forms.Editor private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { - if (e.Node is null) return; + if (treeView1.SelectedNode is null) return; - bool isValidOverride = e.Node.Tag is BehaviourFile.RiderPositionOverride.PositionOverride && - treeView1.SelectedNode != null; + bool isValidOverride = treeView1.SelectedNode.Tag is BehaviourFile.RiderPositionOverride.PositionOverride; MobIsTamedCheckbox.Enabled = isValidOverride; MobHasSaddleCheckbox.Enabled = isValidOverride; xUpDown.Enabled = isValidOverride; @@ -97,7 +89,7 @@ namespace PckStudio.Forms.Editor if (isValidOverride) { - var posOverride = e.Node.Tag as BehaviourFile.RiderPositionOverride.PositionOverride; + var posOverride = treeView1.SelectedNode.Tag as BehaviourFile.RiderPositionOverride.PositionOverride; MobIsTamedCheckbox.Checked = posOverride.EntityIsTamed; MobHasSaddleCheckbox.Checked = posOverride.EntityHasSaddle; xUpDown.Value = (decimal)posOverride.x; @@ -172,17 +164,11 @@ namespace PckStudio.Forms.Editor entry.name = diag.SelectedEntity; treeView1.SelectedNode.Tag = entry; - foreach (JObject content in EntityJSONData["behaviours"].Children()) - { - var prop = content.Properties().FirstOrDefault(prop => prop.Name == entry.name); - if (prop is JProperty) - { - treeView1.SelectedNode.Text = (string)prop.Value; - treeView1.SelectedNode.ImageIndex = EntityJSONData["behaviours"].Children().ToList().IndexOf(content); - treeView1.SelectedNode.SelectedImageIndex = treeView1.SelectedNode.ImageIndex; - break; - } - } + var behaviour = BehaviourData.Find(b => b.InternalName == entry.name); + + treeView1.SelectedNode.Text = behaviour.DisplayName; + treeView1.SelectedNode.ImageIndex = BehaviourData.IndexOf(behaviour); + treeView1.SelectedNode.SelectedImageIndex = treeView1.SelectedNode.ImageIndex; } } @@ -225,17 +211,12 @@ namespace PckStudio.Forms.Editor TreeNode NewOverrideNode = new TreeNode(NewOverride.name); NewOverrideNode.Tag = NewOverride; - foreach (JObject content in EntityJSONData["behaviours"].Children()) - { - var prop = content.Properties().FirstOrDefault(prop => prop.Name == NewOverride.name); - if (prop is JProperty) - { - NewOverrideNode.Text = (string)prop.Value; - NewOverrideNode.ImageIndex = EntityJSONData["behaviours"].Children().ToList().IndexOf(content); - NewOverrideNode.SelectedImageIndex = NewOverrideNode.ImageIndex; - break; - } - } + + var behaviour = BehaviourData.Find(b => b.InternalName == NewOverride.name); + NewOverrideNode.Text = behaviour.DisplayName; + NewOverrideNode.ImageIndex = BehaviourData.IndexOf(behaviour); + NewOverrideNode.SelectedImageIndex = NewOverrideNode.ImageIndex; + treeView1.Nodes.Add(NewOverrideNode); treeView1.SelectedNode = NewOverrideNode; diff --git a/PCK-Studio/Forms/Editor/MaterialsEditor.cs b/PCK-Studio/Forms/Editor/MaterialsEditor.cs index 90af5a71..75fbd5eb 100644 --- a/PCK-Studio/Forms/Editor/MaterialsEditor.cs +++ b/PCK-Studio/Forms/Editor/MaterialsEditor.cs @@ -12,6 +12,7 @@ using OMI.Formats.Material; using OMI.Workers.Material; using PckStudio.Internal; using PckStudio.Extensions; +using PckStudio.Internal.Json; namespace PckStudio.Forms.Editor { @@ -21,7 +22,7 @@ namespace PckStudio.Forms.Editor private readonly PckFileData _file; MaterialContainer materialFile; - private readonly JObject EntityJSONData = JObject.Parse(Properties.Resources.entityData); + private readonly List MaterialData = Entities.BehaviourInfos; private bool showInvalidEntries; @@ -36,23 +37,15 @@ namespace PckStudio.Forms.Editor { TreeNode EntryNode = new TreeNode(entry.Name); - EntryNode.ImageIndex = -1; - - foreach (JObject content in EntityJSONData["materials"].Children()) - { - var prop = content.Properties().FirstOrDefault(prop => prop.Name == entry.Name); - if (prop is JProperty) - { - EntryNode.Text = (string)prop.Value; - EntryNode.ImageIndex = EntityJSONData["materials"].Children().ToList().IndexOf(content); - break; - } + var material = MaterialData.Find(m => m.InternalName == entry.Name); + if(material != null) + { + EntryNode.Text = material.DisplayName; + EntryNode.ImageIndex = MaterialData.IndexOf(material); + EntryNode.Tag = entry; } - - EntryNode.Tag = entry; - // check for invalid material entry - if (EntryNode.ImageIndex == -1) + else { EntryNode.ImageIndex = 127; // icon for invalid entry EntryNode.Text += " (Invalid)"; @@ -164,17 +157,11 @@ namespace PckStudio.Forms.Editor TreeNode NewEntryNode = new TreeNode(NewEntry.Name); NewEntryNode.Tag = NewEntry; - foreach (JObject content in EntityJSONData["materials"].Children()) - { - var prop = content.Properties().FirstOrDefault(prop => prop.Name == NewEntry.Name); - if (prop is JProperty) - { - NewEntryNode.Text = (string)prop.Value; - NewEntryNode.ImageIndex = EntityJSONData["materials"].Children().ToList().IndexOf(content); - NewEntryNode.SelectedImageIndex = NewEntryNode.ImageIndex; - break; - } - } + + var material = MaterialData.Find(m => m.InternalName == NewEntry.Name); + NewEntryNode.Text = material.DisplayName; + NewEntryNode.ImageIndex = MaterialData.IndexOf(material); + NewEntryNode.SelectedImageIndex = NewEntryNode.ImageIndex; treeView1.Nodes.Add(NewEntryNode); } } diff --git a/PCK-Studio/Internal/Json/Entities.cs b/PCK-Studio/Internal/Json/Entities.cs new file mode 100644 index 00000000..a0729112 --- /dev/null +++ b/PCK-Studio/Internal/Json/Entities.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Newtonsoft.Json; +using PckStudio.Extensions; +using PckStudio.Properties; + +namespace PckStudio.Internal.Json +{ + internal class JsonEntities + { + [JsonProperty("entries")] + public List Entries { get; set; } + } + + internal static class Entities + { + private static JsonEntities _jsonModelData, _jsonMaterialData, _jsonBehaviourData; + internal static JsonEntities JsonModelData => _jsonModelData ??= JsonConvert.DeserializeObject(Resources.entityModelsData); + internal static JsonEntities JsonMaterialData => _jsonMaterialData ??= JsonConvert.DeserializeObject(Resources.entityMaterialsData); + internal static JsonEntities JsonBehaviourData => _jsonBehaviourData ??= JsonConvert.DeserializeObject(Resources.entityBehavioursData); + internal static List ModelInfos => JsonModelData.Entries; + internal static List MaterialInfos => JsonMaterialData.Entries; + internal static List BehaviourInfos => JsonBehaviourData.Entries; + } +} diff --git a/PCK-Studio/Internal/Json/EntityInfo.cs b/PCK-Studio/Internal/Json/EntityInfo.cs new file mode 100644 index 00000000..9c72c388 --- /dev/null +++ b/PCK-Studio/Internal/Json/EntityInfo.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace PckStudio.Internal.Json +{ + internal class EntityInfo + { + [JsonProperty("displayName")] + public string DisplayName { get; set; } + + [JsonProperty("internalName")] + public string InternalName { get; set; } + + public EntityInfo(string displayName, string internalName) + { + DisplayName = displayName; + InternalName = internalName; + } + } +} diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index dbb02640..ff19b0a0 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -142,6 +142,8 @@ + + @@ -602,7 +604,9 @@ - + + + diff --git a/PCK-Studio/Properties/Resources.Designer.cs b/PCK-Studio/Properties/Resources.Designer.cs index 7ecd697d..a4b2a0c7 100644 --- a/PCK-Studio/Properties/Resources.Designer.cs +++ b/PCK-Studio/Properties/Resources.Designer.cs @@ -339,32 +339,110 @@ namespace PckStudio.Properties { /// /// Looks up a localized string similar to { /// "COMMENT": "Entity data research by NessieHax (Miku-666) and MattNL", - /// "models": [ - /// { "": "" }, - /// { "": "" }, - /// { "": "" }, - /// { "bat": "Bat" }, - /// { "blaze": "Blaze" }, - /// { "boat": "Boat" }, - /// { "cat": "Cat (PS4 EXCLUSIVE)" }, - /// { "": "" }, - /// { "": "" }, - /// { "chicken": "Chicken" }, - /// { "cod": "Cod" }, - /// { "": "" }, - /// { "cow": "Cow" }, - /// { "creeper": "Creeper" }, - /// { "dolphin": "Dolphin" }, - /// { "": "" }, - /// { "": "" }, - /// { "zombie.drowned": "Drowned" }, - /// { "": "" }, - /// { "": "" }, - /// [rest of string was truncated]";. + /// "entries": [ + /// { + /// "internalName": "area_effect_cloud", + /// "displayName": "Area Effect Cloud / Particle" + /// }, + /// { + /// "internalName": "armor_stand", + /// "displayName": "Armor Stand" + /// }, + /// { + /// "internalName": "arrow", + /// "displayName": "Arrow" + /// }, + /// { + /// "internalName": "bat", + /// "displayName": "Bat" + /// }, + /// { + /// "internalName": "blaze", + /// "displayName": "Blaze" + /// }, + /// { + /// "internalName": "boat", + /// "display [rest of string was truncated]";. /// - public static string entityData { + public static string entityBehavioursData { get { - return ResourceManager.GetString("entityData", resourceCulture); + return ResourceManager.GetString("entityBehavioursData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT": "Entity data research by NessieHax (Miku-666) and MattNL", + /// "entries": [ + /// { + /// "internalName": "", + /// "displayName": "" + /// }, + /// { + /// "internalName": "", + /// "displayName": "" + /// }, + /// { + /// "internalName": "", + /// "displayName": "" + /// }, + /// { + /// "internalName": "bat", + /// "displayName": "Bat" + /// }, + /// { + /// "internalName": "blaze_head", + /// "displayName": "Blaze" + /// }, + /// { + /// "internalName": "", + /// "displayName": "" + /// }, + /// { + /// "internalName": "cat", + /// "displayName": "Cat [PS4 [rest of string was truncated]";. + /// + public static string entityMaterialsData { + get { + return ResourceManager.GetString("entityMaterialsData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT": "Entity data research by NessieHax (Miku-666) and MattNL", + /// "entries": [ + /// { + /// "internalName": "", + /// "displayName": "" + /// }, + /// { + /// "internalName": "", + /// "displayName": "" + /// }, + /// { + /// "internalName": "", + /// "displayName": "" + /// }, + /// { + /// "internalName": "bat", + /// "displayName": "Bat" + /// }, + /// { + /// "internalName": "blaze", + /// "displayName": "Blaze" + /// }, + /// { + /// "internalName": "boat", + /// "displayName": "Boat" + /// }, + /// { + /// "internalName": "cat", + /// "displayName": "Cat [ [rest of string was truncated]";. + /// + public static string entityModelsData { + get { + return ResourceManager.GetString("entityModelsData", resourceCulture); } } diff --git a/PCK-Studio/Properties/Resources.resx b/PCK-Studio/Properties/Resources.resx index e642016c..0f00925e 100644 --- a/PCK-Studio/Properties/Resources.resx +++ b/PCK-Studio/Properties/Resources.resx @@ -277,9 +277,6 @@ ..\Resources\atlases\entities.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\entityData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - ..\Resources\icons\file_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -376,4 +373,13 @@ ..\Resources\external\trello.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\atlases\entityBehavioursData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\atlases\entityMaterialsData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\atlases\entityModelsData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + \ No newline at end of file diff --git a/PCK-Studio/Resources/atlases/entities.png b/PCK-Studio/Resources/atlases/entities.png index 46881de8483a3d436834c4f878fbddfc2e9cc96f..3286d23f9fc29f2575a90f93f2d76a615c7c6d78 100644 GIT binary patch delta 10562 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 delta 10219 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