Skip to content

Instantly share code, notes, and snippets.

@alice-cash
Created July 30, 2020 07:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alice-cash/99fe16e5960bbaaf3b8f7b0ecc995e3f to your computer and use it in GitHub Desktop.
Save alice-cash/99fe16e5960bbaaf3b8f7b0ecc995e3f to your computer and use it in GitHub Desktop.
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
dynamic Data = JValue.Parse(File.ReadAllText("read.json"));
foreach (var State in new string[] { "handshaking", "login", "status", "play" })
foreach (var Direction in new string[] { "toClient", "toServer" })
foreach (var Packet in Data[State][Direction]["types"]["packet"][1][0]["type"][1]["mappings"])
{
var packetID = Packet.Name;
var packetName = "packet_" + Packet.Value;
var myState = char.ToUpper(State[0]) + State.Substring(1);
var Namespace = "SLUM.lib.Client.Protocol.Netty." + myState + "State." + (Direction == "toClient" ? "ClientBound" : "ServerBound");
var ClassName = SetCamelCase(packetName);
var FilePath = Namespace.Replace('.', '/');
var FileName = FilePath + "/" + ClassName + ".cs";
Directory.CreateDirectory(FilePath);
StringBuilder stringBuilder = new StringBuilder();
WriteLine("using System;", stringBuilder);
WriteLine("using SLUM.lib.Data.DataTypes;", stringBuilder);
WriteLine("namespace " + Namespace, stringBuilder);
WriteLine("{", stringBuilder);
WriteLine(" public struct " + ClassName + " : IPacket", stringBuilder);
WriteLine(" {", stringBuilder);
WriteLine(" public static int PacketID => " + packetID + ";", stringBuilder);
WriteLine(" public int GetPacketID => PacketID;", stringBuilder);
WriteLine(" public bool PacketGood { get; set; }", stringBuilder);
WriteLine(" public int PacketLength { get; set; }", stringBuilder);
int i = 0;
foreach (var field in Data[State][Direction]["types"][packetName][1])
{
var FieldName = field["name"].Value;
string fieldType = "";
if (field["type"].Type.ToString() == "String")
fieldType = GetType(field["type"].Value);
if (field["type"].Type.ToString() == "Array")
fieldType = GetType(field["type"][0].Value);
WriteLine(" [PacketField(" + i + ", Types." + fieldType + ")]", stringBuilder);
WriteLine(" public " + fieldType + " " + FieldName + " { get; set; }", stringBuilder);
i++;
}
WriteLine(" }", stringBuilder);
WriteLine("}", stringBuilder);
File.WriteAllText(FileName, stringBuilder.ToString());
}
Console.ReadKey();
}
static void WriteLine(string line, StringBuilder sb)
{
sb.Append(line + "\n");
}
static string SetCamelCase(string text)
{
text = text.Substring("packet_".Length);
string returnval = char.ToUpper(text[0]).ToString();
text = text.Substring(1);
while(text.IndexOf('_') > 0)
{
returnval += text.Substring(0, text.IndexOf('_'));
text = char.ToUpper(text[text.IndexOf('_')+1]) + text.Substring(text.IndexOf('_')+2);
}
//returnval += char.ToUpper(text[0]).ToString() + text.Substring(1);
returnval += text;
return returnval;
}
static string GetType(string type)
{
if (type == "varint") return "VarInt";
if (type == "optvarint") return "VarInt";
if (type == "pstring") return "VarString";
if (type == "u16") return "UInt16";
if (type == "u8") return "Byte";
if (type == "i8") return "SByte";
if (type == "i32") return "Int32";
if (type == "i64") return "Int64";
if (type == "buffer") return "ByteArray";
if (type == "bool") return "Boolean";
if (type == "f32") return "Float";
if (type == "f64") return "Double";
if (type == "UUID") return "UUID";
if (type == "option") return "ERROR";
if (type == "entityMetadataLoop") return "ERROR";
if (type == "topBitSetTerminatedArray") return "ERROR";
if (type == "bitfield") return "ERROR";
if (type == "container") return "ERROR";
if (type == "switch") return "ERROR";
if (type == "void") return "ERROR";
if (type == "array") return "ERROR";
if (type == "restBuffer") return "ERROR";
if (type == "nbt") return "ERROR";
if (type == "optionalNbt") return "ERROR";
if (type == "string") return "VarString";
if (type == "slot") return "ERROR";
if (type == "particle") return "ERROR";
if (type == "ingredient") return "ERROR";
if (type == "position") return "ERROR";
if (type == "entityMetadataItem") return "ERROR";
if (type == "entityMetadata") return "ERROR";
return "ERROR_x2";
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment