From 4dea688ca291351daa249121a8065b8aba3895bf Mon Sep 17 00:00:00 2001 From: Anon Date: Wed, 11 Sep 2024 20:58:24 +0200 Subject: [PATCH] Added more structured components --- MinecraftClient/Inventory/BookPage.cs | 3 + .../Inventory/SuspiciousStewEffect.cs | 3 + ...1206.cs => PotionContentsComponent1206.cs} | 2 +- .../SuspiciousStewEffectsComponent1206.cs | 39 +++++++++ .../WritableBlookContentComponent1206.cs | 56 ++++++++++++ .../WrittenBlookContentComponent1206.cs | 86 +++++++++++++++++++ .../StructuredComponentsRegistry1206.cs | 6 +- 7 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 MinecraftClient/Inventory/BookPage.cs create mode 100644 MinecraftClient/Inventory/SuspiciousStewEffect.cs rename MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/{PotionContentsComponentComponent1206.cs => PotionContentsComponent1206.cs} (93%) create mode 100644 MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/SuspiciousStewEffectsComponent1206.cs create mode 100644 MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WritableBlookContentComponent1206.cs create mode 100644 MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WrittenBlookContentComponent1206.cs diff --git a/MinecraftClient/Inventory/BookPage.cs b/MinecraftClient/Inventory/BookPage.cs new file mode 100644 index 00000000..c7ec7e44 --- /dev/null +++ b/MinecraftClient/Inventory/BookPage.cs @@ -0,0 +1,3 @@ +namespace MinecraftClient.Inventory; + +public record BookPage(string RawContent, bool HasFilteredContent, string? FilteredContent); \ No newline at end of file diff --git a/MinecraftClient/Inventory/SuspiciousStewEffect.cs b/MinecraftClient/Inventory/SuspiciousStewEffect.cs new file mode 100644 index 00000000..7b1b5553 --- /dev/null +++ b/MinecraftClient/Inventory/SuspiciousStewEffect.cs @@ -0,0 +1,3 @@ +namespace MinecraftClient.Inventory; + +public record SuspiciousStewEffect(int TypeId, int Duration); \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotionContentsComponentComponent1206.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotionContentsComponent1206.cs similarity index 93% rename from MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotionContentsComponentComponent1206.cs rename to MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotionContentsComponent1206.cs index e8a28d65..cf86da9b 100644 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotionContentsComponentComponent1206.cs +++ b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/PotionContentsComponent1206.cs @@ -7,7 +7,7 @@ using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; -public class PotionContentsComponentComponent1206(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) +public class PotionContentsComponent1206(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) { public int PotiononId { get; set; } diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/SuspiciousStewEffectsComponent1206.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/SuspiciousStewEffectsComponent1206.cs new file mode 100644 index 00000000..00e74b80 --- /dev/null +++ b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/SuspiciousStewEffectsComponent1206.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using MinecraftClient.Inventory; +using MinecraftClient.Inventory.ItemPalettes; +using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; + +namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; + +public class SuspiciousStewEffectsComponent1206(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) + : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) +{ + public int NumberOfEffects { get; set; } + public List Effects { get; set; } = new(); + + public override void Parse(Queue data) + { + NumberOfEffects = dataTypes.ReadNextVarInt(data); + + for (var i = 0; i < NumberOfEffects; i++) + Effects.Add(new SuspiciousStewEffect(dataTypes.ReadNextVarInt(data), dataTypes.ReadNextVarInt(data))); + } + + public override Queue Serialize() + { + var data = new List(); + data.AddRange(DataTypes.GetVarInt(NumberOfEffects)); + + if (NumberOfEffects != Effects.Count) + throw new InvalidOperationException("Can not serialize SuspiciousStewEffectsComponent1206 because umberOfEffects != Effects.Count!"); + + foreach (var effect in Effects) + { + data.AddRange(DataTypes.GetVarInt(effect.TypeId)); + data.AddRange(DataTypes.GetVarInt(effect.Duration)); + } + return new Queue(data); + } +} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WritableBlookContentComponent1206.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WritableBlookContentComponent1206.cs new file mode 100644 index 00000000..4e32ef37 --- /dev/null +++ b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WritableBlookContentComponent1206.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using MinecraftClient.Inventory; +using MinecraftClient.Inventory.ItemPalettes; +using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; + +namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; + +public class WritableBlookContentComponent1206(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) +{ + public int NumberOfPages { get; set; } + public List Pages { get; set; } = []; + + public override void Parse(Queue data) + { + NumberOfPages = dataTypes.ReadNextVarInt(data); + + for (var i = 0; i < NumberOfPages; i++) + { + var rawContent = dataTypes.ReadNextString(data); + var hasFilteredContent = dataTypes.ReadNextBool(data); + var filteredContent = null as string; + + if(hasFilteredContent) + filteredContent = dataTypes.ReadNextString(data); + + Pages.Add(new BookPage(rawContent, hasFilteredContent, filteredContent)); + } + } + + public override Queue Serialize() + { + var data = new List(); + + data.AddRange(DataTypes.GetVarInt(NumberOfPages)); + + if (NumberOfPages != Pages.Count) + throw new InvalidOperationException("Can not setialize WritableBlookContentComponent1206 because NumberOfPages != Pages.Count!"); + + foreach (var page in Pages) + { + data.AddRange(DataTypes.GetString(page.RawContent)); + data.AddRange(DataTypes.GetBool(page.HasFilteredContent)); + + if (page.HasFilteredContent) + { + if(page.FilteredContent is null) + throw new InvalidOperationException("Can not setialize WritableBlookContentComponent1206 because page.HasFilteredContent = true, but FilteredContent is null!"); + + data.AddRange(DataTypes.GetString(page.FilteredContent)); + } + } + + return new Queue(data); + } +} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WrittenBlookContentComponent1206.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WrittenBlookContentComponent1206.cs new file mode 100644 index 00000000..8bc2f060 --- /dev/null +++ b/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/1_20_6/WrittenBlookContentComponent1206.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using MinecraftClient.Inventory; +using MinecraftClient.Inventory.ItemPalettes; +using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; +using MinecraftClient.Protocol.Message; + +namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; + +public class WrittenBlookContentComponent1206(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) +{ + public string RawTitle { get; set; } = null!; + public bool HasFilteredTitle { get; set; } + public string? FilteredTitle { get; set; } + public string Author { get; set; } = null!; + public int Generation { get; set; } + public int NumberOfPages { get; set; } + public List Pages { get; set; } = []; + public bool Resolved { get; set; } + + public override void Parse(Queue data) + { + RawTitle = ChatParser.ParseText(dataTypes.ReadNextString(data)); + HasFilteredTitle = dataTypes.ReadNextBool(data); + + if (HasFilteredTitle) + FilteredTitle = dataTypes.ReadNextString(data); + + Author = dataTypes.ReadNextString(data); + Generation = dataTypes.ReadNextVarInt(data); + NumberOfPages = dataTypes.ReadNextVarInt(data); + + for (var i = 0; i < NumberOfPages; i++) + { + var rawContent = ChatParser.ParseText(dataTypes.ReadNextString(data)); + var hasFilteredContent = dataTypes.ReadNextBool(data); + var filteredContent = null as string; + + if(hasFilteredContent) + filteredContent = dataTypes.ReadNextString(data); + + Pages.Add(new BookPage(rawContent, hasFilteredContent, filteredContent)); + } + + Resolved = dataTypes.ReadNextBool(data); + } + + public override Queue Serialize() + { + var data = new List(); + + data.AddRange(DataTypes.GetString(RawTitle)); + data.AddRange(DataTypes.GetBool(HasFilteredTitle)); + + if (HasFilteredTitle) + { + if(FilteredTitle is null) + throw new InvalidOperationException("Can not setialize WrittenBlookContentComponent1206 because HasFilteredTitle is true but FilteredTitle is null!"); + + data.AddRange(DataTypes.GetString(FilteredTitle)); + } + + data.AddRange(DataTypes.GetString(Author)); + data.AddRange(DataTypes.GetVarInt(Generation)); + data.AddRange(DataTypes.GetVarInt(NumberOfPages)); + + if (NumberOfPages != Pages.Count) + throw new InvalidOperationException("Can not setialize WrittenBlookContentComponent1206 because NumberOfPages != Pages.Count!"); + + foreach (var page in Pages) + { + data.AddRange(DataTypes.GetString(page.RawContent)); + data.AddRange(DataTypes.GetBool(page.HasFilteredContent)); + + if (page.HasFilteredContent) + { + if(page.FilteredContent is null) + throw new InvalidOperationException("Can not setialize WrittenBlookContentComponent1206 because page.HasFilteredContent = true, but FilteredContent is null!"); + + data.AddRange(DataTypes.GetString(page.FilteredContent)); + } + } + data.AddRange(DataTypes.GetBool(Resolved)); + return new Queue(data); + } +} \ No newline at end of file diff --git a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1206.cs b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1206.cs index 586f8870..12c61695 100644 --- a/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1206.cs +++ b/MinecraftClient/Protocol/Handlers/StructuredComponents/Registries/StructuredComponentsRegistry1206.cs @@ -40,7 +40,9 @@ public class StructuredComponentsRegistry1206 : StructuredComponentRegistry RegisterComponent(28, "minecraft:map_post_processing"); RegisterComponent(29, "minecraft:charged_projectiles"); RegisterComponent(30, "minecraft:bundle_contents"); - RegisterComponent(31, "minecraft:potion_contents"); - + RegisterComponent(31, "minecraft:potion_contents"); + RegisterComponent(32, "minecraft:suspicious_stew_effects"); + RegisterComponent(33, "minecraft:writable_book_content"); + RegisterComponent(34, "minecraft:written_book_content"); } } \ No newline at end of file