mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2026-08-15 13:04:36 +00:00
- Add AttributeSubComponent121 that uses ResourceLocation(string) instead of UUID+Name, matching the 1.21 attribute modifier wire format change. Register it in SubComponentRegistry121 via new ReplaceSubComponent method. - Add ProjectilePower packet handler: reads 1 double (accelerationPower) for 1.21+, or 3 doubles (xPower/yPower/zPower) for 1.20.6. - Add CustomReportDetails and ServerLinks packet handlers in both Play and Configuration phases, consuming all fields to prevent byte offset errors on 1.21 servers. Made-with: Cursor
40 lines
No EOL
1.6 KiB
C#
40 lines
No EOL
1.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
|
|
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));
|
|
}
|
|
|
|
protected void ReplaceSubComponent<T>(string name) where T : SubComponent
|
|
{
|
|
_subComponentParsers[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, this) as SubComponent ??
|
|
throw new InvalidOperationException($"Could not create instance of a sub component parser type: {subComponentParserType.Name}");
|
|
|
|
var parseMethod = instance.GetType().GetMethod("Parse", BindingFlags.Instance | BindingFlags.NonPublic);
|
|
|
|
if (parseMethod == null)
|
|
throw new InvalidOperationException($"Sub component parser type {subComponentParserType.Name} does not have a Parse method.");
|
|
|
|
parseMethod.Invoke(instance, new object[] { data });
|
|
return instance;
|
|
}
|
|
} |