mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2026-08-15 13:04:36 +00:00
First Version of Structured Components
This commit is contained in:
parent
5a6fd577e5
commit
63b027d84a
11 changed files with 314 additions and 26 deletions
|
|
@ -0,0 +1,12 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Core;
|
||||
|
||||
public abstract class StructuredComponent(DataTypes dataTypes, SubComponentRegistry subComponentRegistry)
|
||||
{
|
||||
protected DataTypes DataTypes { get; private set; } = dataTypes;
|
||||
protected SubComponentRegistry SubComponentRegistry { get; private set; } = subComponentRegistry;
|
||||
|
||||
public abstract void Parse(Queue<byte> data);
|
||||
public abstract Queue<byte> Serialize();
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Core;
|
||||
|
||||
public abstract class StructuredComponentRegistry(SubComponentRegistry subComponentRegistry, DataTypes dataTypes)
|
||||
{
|
||||
private Dictionary<string, Type> ComponentParsers { get; } = new();
|
||||
private Dictionary<int, string> IdToComponent { get; } = new();
|
||||
private Dictionary<string, int> ComponentToId { get; } = new();
|
||||
|
||||
protected void RegisterComponent<T>(int id, string name) where T : StructuredComponent
|
||||
{
|
||||
if (string.IsNullOrEmpty(name) || string.IsNullOrWhiteSpace(name))
|
||||
throw new ArgumentNullException(nameof(name));
|
||||
|
||||
name = name.ToLower();
|
||||
|
||||
if (ComponentParsers.ContainsKey(name) || IdToComponent.ContainsValue(name)
|
||||
|| ComponentToId.ContainsKey(name) || IdToComponent.ContainsKey(id))
|
||||
throw new InvalidOperationException($"A component with name '{name}' or id '{id}' is already registered.");
|
||||
|
||||
ComponentParsers[name] = typeof(T);
|
||||
IdToComponent[id] = name;
|
||||
ComponentToId[name] = id;
|
||||
}
|
||||
|
||||
public StructuredComponent ParseComponent(int id, Queue<byte> data)
|
||||
{
|
||||
if (IdToComponent.TryGetValue(id, out var name))
|
||||
{
|
||||
if (ComponentParsers.TryGetValue(name, out var type))
|
||||
{
|
||||
var component =
|
||||
Activator.CreateInstance(type, dataTypes, subComponentRegistry) as StructuredComponent
|
||||
?? throw new InvalidOperationException($"Could not instantiate a parser for a structured component type {name}");
|
||||
|
||||
component.Parse(data);
|
||||
return component;
|
||||
}
|
||||
}
|
||||
|
||||
throw new Exception($"No parser found for component with ID {id}");
|
||||
}
|
||||
|
||||
public string GetComponentNameById(int id)
|
||||
{
|
||||
if (IdToComponent.TryGetValue(id, out var value))
|
||||
return value;
|
||||
|
||||
throw new Exception($"No component found for ID {id}");
|
||||
}
|
||||
|
||||
public int GetComponentIdByName(string name)
|
||||
{
|
||||
name = name.ToLower();
|
||||
|
||||
if (ComponentToId.TryGetValue(name, out var value))
|
||||
return value;
|
||||
|
||||
throw new Exception($"No ID found for component {name}");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Core;
|
||||
|
||||
public abstract class SubComponent(DataTypes dataTypes)
|
||||
{
|
||||
protected DataTypes DataTypes { get; private set; } = dataTypes;
|
||||
|
||||
public abstract void Parse(Queue<byte> data);
|
||||
public abstract Queue<byte> Serialize();
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Core;
|
||||
|
||||
public abstract class SubComponentRegistry(DataTypes dataTypes)
|
||||
{
|
||||
private readonly Dictionary<string, Type> _subComponentParsers = new();
|
||||
|
||||
protected void RegisterSubComponent<T>(string name) where T : SubComponent
|
||||
{
|
||||
if(_subComponentParsers.TryGetValue(name, out _))
|
||||
throw new Exception($"Sub component {name} already registered!");
|
||||
|
||||
_subComponentParsers.Add(name, typeof(T));
|
||||
}
|
||||
|
||||
public SubComponent ParseSubComponent(string name, Queue<byte> data)
|
||||
{
|
||||
if(!_subComponentParsers.TryGetValue(name, out var subComponentParserType))
|
||||
throw new Exception($"Sub component {name} not registered!");
|
||||
|
||||
var instance= Activator.CreateInstance(subComponentParserType, dataTypes) as SubComponent ??
|
||||
throw new InvalidOperationException($"Could not create instance of a sub component parser type: {subComponentParserType.Name}");
|
||||
|
||||
instance.Parse(data);
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue