mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2025-10-14 21:22:49 +00:00
165 lines
7.4 KiB
C#
165 lines
7.4 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.IO;
|
|||
|
|
|
|||
|
|
namespace MinecraftClient.Protocol.Handlers.PacketPalettes
|
|||
|
|
{
|
|||
|
|
public static class PacketPaletteHelper
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// Generate a code snippet of updated IDs from a modified packet palette (usually when you have updated packet item position)
|
|||
|
|
/// </summary>
|
|||
|
|
/// <example>
|
|||
|
|
/// You have inserted a new packet type with ID 0x02 into the copied new packet palette:
|
|||
|
|
/// { 0x00, PacketTypesIn.SpawnEntity },
|
|||
|
|
/// { 0x01, PacketTypesIn.SpawnExperienceOrb },
|
|||
|
|
/// { 0xFF, PacketTypesIn.IamNewPacket }, // use 0xFF because it has conflict with old packet ID, we will correct the IDs now
|
|||
|
|
/// { 0x02, PacketTypesIn.SpawnWeatherEntity },
|
|||
|
|
/// ...
|
|||
|
|
///
|
|||
|
|
/// Call this method with your new packet palette:
|
|||
|
|
/// UpdatePacketIdByItemPosition(new PacketPaletteXXXX(), "code_snippet.txt");
|
|||
|
|
/// And it will generate a Dictionary format with the Packet IDs corrected for you to copy and paste:
|
|||
|
|
/// { 0x00, PacketTypesIn.SpawnEntity },
|
|||
|
|
/// { 0x01, PacketTypesIn.SpawnExperienceOrb },
|
|||
|
|
/// { 0x02, PacketTypesIn.IamNewPacket },
|
|||
|
|
/// { 0x03, PacketTypesIn.SpawnWeatherEntity },
|
|||
|
|
/// ...
|
|||
|
|
/// </example>
|
|||
|
|
/// <param name="palette"></param>
|
|||
|
|
/// <param name="outputFile"></param>
|
|||
|
|
public static void UpdatePacketIdByItemPosition(PacketTypePalette palette, string outputFile)
|
|||
|
|
{
|
|||
|
|
// I am just too tired to create another full .cs file so... please just copy and paste
|
|||
|
|
List<string> lines = new List<string>();
|
|||
|
|
lines.Add("=== Inbound Packets ===");
|
|||
|
|
int i = 0;
|
|||
|
|
foreach(var t in palette.GetMappingIn())
|
|||
|
|
{
|
|||
|
|
lines.Add(string.Format("{{ 0x{0}, {1} }},", i.ToString("X2"), t.Value));
|
|||
|
|
i++;
|
|||
|
|
}
|
|||
|
|
lines.Add("=== End of Inbound ===");
|
|||
|
|
lines.Add("");
|
|||
|
|
lines.Add("=== Outbound Packets ===");
|
|||
|
|
i = 0;
|
|||
|
|
foreach (var t in palette.GetMappingOut())
|
|||
|
|
{
|
|||
|
|
lines.Add(string.Format("{{ 0x{0}, {1} }},", i.ToString("X2"), t.Value));
|
|||
|
|
i++;
|
|||
|
|
}
|
|||
|
|
lines.Add("=== End of Outbound ===");
|
|||
|
|
|
|||
|
|
File.WriteAllText(outputFile, string.Join("\r\n", lines));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Generate a code snippet of rearranged order of packet types from a modified packet palette (usually when you have updated packet IDs)
|
|||
|
|
/// </summary>
|
|||
|
|
/// <example>
|
|||
|
|
/// You have changed some packet IDs:
|
|||
|
|
/// { 0x00, PacketTypesIn.SpawnEntity },
|
|||
|
|
/// { 0x02, PacketTypesIn.SpawnExperienceOrb }, // ID changed from 0x02 -> 0x01
|
|||
|
|
/// { 0x01, PacketTypesIn.SpawnWeatherEntity }, // ID changed from 0x01 -> 0x02
|
|||
|
|
/// ...
|
|||
|
|
///
|
|||
|
|
/// Call this method with your new packet palette:
|
|||
|
|
/// UpdatePacketPositionToAscending(new PacketPaletteXXXX(), "code_snippet.txt");
|
|||
|
|
/// And it will generate a Dictionary format with the ascending order of Packet IDs for you to copy and paste:
|
|||
|
|
/// { 0x00, PacketTypesIn.SpawnEntity },
|
|||
|
|
/// { 0x01, PacketTypesIn.SpawnWeatherEntity },
|
|||
|
|
/// { 0x02, PacketTypesIn.SpawnExperienceOrb },
|
|||
|
|
/// ...
|
|||
|
|
/// </example>
|
|||
|
|
/// <param name="palette"></param>
|
|||
|
|
/// <param name="outputFile"></param>
|
|||
|
|
public static void UpdatePacketPositionToAscending(PacketTypePalette palette, string outputFile)
|
|||
|
|
{
|
|||
|
|
// I am just too tired to create another full .cs file so... please just copy and paste
|
|||
|
|
List<string> lines = new List<string>();
|
|||
|
|
lines.Add("=== Inbound Packets ===");
|
|||
|
|
for (int i = 0; i < palette.GetMappingIn().Count; i++)
|
|||
|
|
{
|
|||
|
|
lines.Add(string.Format("{{ 0x{0}, {1} }},", i.ToString("X2"), palette.GetMappingIn()[i]));
|
|||
|
|
}
|
|||
|
|
lines.Add("=== End of Inbound ===");
|
|||
|
|
lines.Add("");
|
|||
|
|
lines.Add("=== Outbound Packets ===");
|
|||
|
|
for (int i = 0; i < palette.GetMappingOut().Count; i++)
|
|||
|
|
{
|
|||
|
|
lines.Add(string.Format("{{ 0x{0}, {1} }},", i.ToString("X2"), palette.GetMappingOut()[i]));
|
|||
|
|
}
|
|||
|
|
lines.Add("=== End of Outbound ===");
|
|||
|
|
|
|||
|
|
File.WriteAllText(outputFile, string.Join("\r\n", lines));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Generate PacketPaletteXXX.cs by feeding PacketTypesIn and PacketTypesOut list
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="outputFile">The output file name</param>
|
|||
|
|
/// <param name="namespaceToUse">The namespace to use in the generated class</param>
|
|||
|
|
/// <param name="className">Class name</param>
|
|||
|
|
/// <param name="pIn">List of PacketTypesIn</param>
|
|||
|
|
/// <param name="pOut">List of PacketTypesOut</param>
|
|||
|
|
/// <example>
|
|||
|
|
/// You need to make sure the order of each item are all correct for that MC version
|
|||
|
|
/// Example format:
|
|||
|
|
/// List<PacketTypesIn> pIn = new List<PacketTypesIn>()
|
|||
|
|
/// {
|
|||
|
|
/// PacketTypesIn.SpawnEntity, // packet ID of 0x00
|
|||
|
|
/// PacketTypesIn.SpawnExperienceOrb, // packet ID of 0x01 and so on
|
|||
|
|
/// ...
|
|||
|
|
/// }
|
|||
|
|
/// </example>
|
|||
|
|
public static void GenerateIDsPacketByList(string outputFile, string namespaceToUse, string className, List<PacketTypesIn> pIn, List<PacketTypesOut> pOut)
|
|||
|
|
{
|
|||
|
|
const string TAB = " ";
|
|||
|
|
const string TAB2 = " ";
|
|||
|
|
const string TAB3 = " ";
|
|||
|
|
List<string> lines = new List<string>();
|
|||
|
|
lines.Add("using System;");
|
|||
|
|
lines.Add("using System.Collections.Generic;");
|
|||
|
|
lines.Add("using System.Linq;");
|
|||
|
|
lines.Add("using System.Text;");
|
|||
|
|
lines.Add("");
|
|||
|
|
lines.Add("namespace " + namespaceToUse);
|
|||
|
|
lines.Add("{");
|
|||
|
|
lines.Add(TAB + "public class " + className + " : PacketTypePalette");
|
|||
|
|
lines.Add(TAB + "{");
|
|||
|
|
lines.Add(TAB2 + "private Dictionary<int, PacketTypesIn> typeIn = new Dictionary<int, PacketTypesIn>()");
|
|||
|
|
lines.Add(TAB2 + "{");
|
|||
|
|
for (int i = 0; i < pIn.Count; i++)
|
|||
|
|
{
|
|||
|
|
lines.Add(TAB3 + string.Format("{{ 0x{0}, PacketTypesIn.{1} }},", i.ToString("X2"), pIn[i]));
|
|||
|
|
}
|
|||
|
|
lines.Add(TAB2 + "};");
|
|||
|
|
lines.Add("");
|
|||
|
|
lines.Add(TAB2 + "private Dictionary<int, PacketTypesOut> typeOut = new Dictionary<int, PacketTypesOut>()");
|
|||
|
|
lines.Add(TAB2 + "{");
|
|||
|
|
for (int i = 0; i < pOut.Count; i++)
|
|||
|
|
{
|
|||
|
|
lines.Add(TAB3 + string.Format("{{ 0x{0}, PacketTypesOut.{1} }},", i.ToString("X2"), pOut[i]));
|
|||
|
|
}
|
|||
|
|
lines.Add(TAB2 + "};");
|
|||
|
|
lines.Add("");
|
|||
|
|
lines.Add(TAB2 + "protected override Dictionary<int, PacketTypesIn> GetListIn()");
|
|||
|
|
lines.Add(TAB2 + "{");
|
|||
|
|
lines.Add(TAB3 + "return typeIn;");
|
|||
|
|
lines.Add(TAB2 + "}");
|
|||
|
|
lines.Add("");
|
|||
|
|
lines.Add(TAB2 + "protected override Dictionary<int, PacketTypesOut> GetListOut()");
|
|||
|
|
lines.Add(TAB2 + "{");
|
|||
|
|
lines.Add(TAB3 + "return typeOut;");
|
|||
|
|
lines.Add(TAB2 + "}");
|
|||
|
|
lines.Add(TAB + "}");
|
|||
|
|
lines.Add("}");
|
|||
|
|
lines.Add("");
|
|||
|
|
|
|||
|
|
File.WriteAllText(outputFile, string.Join("\r\n", lines));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|