public string[] Generate(PacketDef pkt, ProtocolGenerator g) { var code = ParseComment(pkt.comment); var pn = ParsePacketName(pkt.name); //code += string.Format("[PacketInfo(group = {0}, ID = {1}, early = {2})]\r\npublic class {3} : PacketObject<{3}>\r\n{{\r\n", pkt.group, pkt.id, pkt.earlySend ? "true" : "false", ParsePacketName(pkt.name)); code += string.Format("[PacketInfo(group = {0}, ID = {1})]\r\npublic class {2} : PacketObject<{2}>\r\n{{\r\n", pkt.group, pkt.id, ParsePacketName(pkt.name)); string rc = "", wc = "", dc0 = "", dc1 = "", cc0 = "", cc1 = ""; var fs = pkt.fields; foreach (var f in fs) { code += string.IsNullOrEmpty(f.comment) ? "" : " /// <summary>\r\n /// " + f.comment + "\r\n /// </summary>\r\n"; code += string.Format(" public {0} {1};\r\n", f.custom ? ParsePacketName(f.type) : ParseType(f.type), f.name); rc += string.Format(" {0, -" + (pkt.fl[1] + 2) + "} = p.Read{1}();\r\n", f.name, ParseReadName(f)); wc += " p.Write(" + f.name + ");\r\n"; if (f.custom || f.array) { dc0 += f.custom && f.array ? string.Format(" BackArray({0});\r\n", f.name) : ""; dc1 += string.Format(" {0, -" + (pkt.fl[2] + 2) + "} = null;\r\n", f.name); } if (!f.custom) { cc0 += string.Format(" dst.{0, -" + (pkt.fl[1] + 2) + "} = {0};\r\n", f.name); } else { cc1 += string.Format(" if ({0, -" + (pkt.fl[2] + 1) + "} != null) {0}.CopyTo(ref dst.{0});\r\n", f.name); } } var dc = dc0 + (string.IsNullOrEmpty(dc0) || string.IsNullOrEmpty(dc1) ? "" : "\r\n") + dc1; var cc = cc0 + (string.IsNullOrEmpty(cc0) || string.IsNullOrEmpty(cc1) ? "" : "\r\n") + cc1; if (!string.IsNullOrEmpty(cc)) { cc = "\r\n" + cc; } code += (fs.Length > 0 ? "\r\n" : "") + " private " + pn + "() { }\r\n"; code += string.IsNullOrEmpty(rc) ? "" : "\r\n public override void ReadFromPacket(Packet p)\r\n {\r\n" + rc + " }\r\n"; code += string.IsNullOrEmpty(wc) ? "" : "\r\n public override void WriteToPacket(Packet p)\r\n {\r\n" + wc + " }\r\n"; code += string.IsNullOrEmpty(cc) ? "" : "\r\n public override void CopyTo(ref " + pn + " dst)\r\n {\r\n base.CopyTo(ref dst);\r\n" + cc + " }\r\n"; code += string.IsNullOrEmpty(dc) ? "" : "\r\n public override void Clear()\r\n {\r\n" + dc + " }\r\n"; code += "}\r\n"; return(new string[] { code }); }
private void _ParseFields(PacketDef pkt) { var r = new Regex(@"((?:(?:[u]?int(?:8|16|32|64))|bool|single|double|string" + m_cts + @")(?:\[\])?)\s+(\w{1,30})\s*;(?:(?:\s*\/\*\s?((?!\r?\n).+?)\*\/)|(?:\s*\/\/\s?((?!\r?\n).+)))?"); var match = r.Match(pkt.content); var fields = new List <FieldDef>(); int tl = 0, nl = 0, dl = 0; while (match.Success) { var def = match.Groups[1].Value; var t = def.Replace("[]", ""); var cpkt = GetPacket(0, t); var custom = cpkt != null; var fn = match.Groups[2].Value; if (fields.FindIndex(f => f.name == fn) > -1) { Logger.LogError("Packet field name duplicated. Packet: [group: {0}, id: {1}, name:{2}, filed: {3}]", pkt.group, pkt.id, pkt.name, fn); match = match.NextMatch(); continue; } var comment = !string.IsNullOrEmpty(match.Groups[3].Value) ? match.Groups[3].Value : !string.IsNullOrEmpty(match.Groups[4].Value) ? match.Groups[4].Value : ""; comment = Regex.Replace(comment, @"[\r\n]*", "").TrimStart(' '); var field = new FieldDef(def, fn, comment, custom, cpkt != null ? cpkt.group : 0, cpkt != null ? cpkt.groupName : ""); fields.Add(field); if (def.Length > tl) { tl = def.Length; } if (fn.Length > nl) { nl = fn.Length; } if (fn.Length > dl && (field.custom || field.array)) { dl = fn.Length; } match = match.NextMatch(); } pkt.fl = new int[] { tl, nl, dl }; pkt.fields = fields.ToArray(); }
public string[] Generate(PacketDef pkt, ProtocolGenerator g) { var code = ParseComment(pkt.comment); code += string.Format("message {0}[id={1}{2}]\r\n{{\r\n", pkt.name, pkt.id, string.IsNullOrEmpty(pkt.router) ? "" : ", route=" + pkt.router); var fs = pkt.fields; for (var i = 0; i < fs.Length; ++i) { var f = fs[i]; code += string.Format(" {0} {1,-" + (pkt.fl[0] + 2) + "} {2,-" + (pkt.fl[1] + 2) + "} = " + (string.IsNullOrEmpty(f.comment) ? "{3}" : "{3, -8}// ") + "{4}\r\n", f.array ? "repeated" : "required", f.custom? f.typeName: ParseType(f.type), f.name, (i + 1) + ";", f.comment); } code += "}\r\n"; return(new string[] { code }); }
private void ParsePackets() { m_pkts.Clear(); var r = new Regex(@"((?:\/\*(?:(?!\*\/)(?:\s|.))+\*\/(?:\r?\n)+)|(?:\s*\/{2,}.*(?:\r?\n)+)*)?protocol\s+(\w{1,50})\[(\d+)(?:,\s*(\w+))?(?:,\s*(\w+))?\](?:\r?\n?\{)([^\}]*)\}"); var match = r.Match(m_data); if (!match.Success) { Logger.LogWarning("Could not find any packet definition!"); return; } m_cts = ""; while (match.Success) { var id = Util.Parse <int>(match.Groups[3].Value); var p0 = match.Groups[4].Value; var p1 = match.Groups[5].Value; string route = ""; var earlySend = false; const string mark = "early"; if (!string.IsNullOrEmpty(p0) && !string.IsNullOrEmpty(p1)) { route = p0 == mark ? p1 : p0; earlySend = p0 == mark || p1 == mark; } else if (!string.IsNullOrEmpty(p0)) { if (p0 == mark) { earlySend = true; } else { route = p0; } } else if (!string.IsNullOrEmpty(p1)) { if (p1 == mark) { earlySend = true; } else { route = p1; } } if (string.IsNullOrWhiteSpace(route)) { route = ""; } var pname = match.Groups[2].Value; if (id < 1 || id > ushort.MaxValue) { Logger.LogError("Packt id invalid, packet id must int [1, 65535]. Packet: [group: {0}, id: {1}, name:{2]", group, id, pname); match = match.NextMatch(); continue; } var op = GetPacket(id, pname); if (op != null) { Logger.LogError("Packt name or id duplicated. Old packet: [file: {0}, group: {1}, id: {2}, name:{3}], New packet: [file: {4}, group: {5}, id: {6}, name:{7}]", op.file, op.group, op.id, op.name, file, group, id, pname); match = match.NextMatch(); continue; } var comment = Regex.Replace(Regex.Replace(match.Groups[1].Value, @"(\r?\n)+", "\n"), @"^[\n\s]*(?:\/\*)?((?:.|\s)*?)(?:[\s\n]*\*\/)?[\n\s]*$", "$1", RegexOptions.Multiline); var pkt = new PacketDef(file, pname, group, Util.FirstUpper(name), id, route, earlySend, comment, match.Groups[6].Value, null); m_cts += "|" + pkt.name; m_pkts.Add(pkt); match = match.NextMatch(); } ParseFields(); }
public string[] Generate(PacketDef pkt, ProtocolGenerator g) { var code = ParseComment(pkt.comment).Replace("{", "{{").Replace("}", "}}");; var pn = ParsePacketName(pkt.name); var sp = pn.StartsWith("Sc"); var cpp = sp ? "" : string.Format("void WorldSession::Handle{0}({1} &packet)\r\n{{{{\r\n}}}}\r\n", pn.Replace("Cs", ""), pn); var refs = ""; code += string.Format(" class {0} final : public {1}\r\n {{{{\r\n", pn, sp ? "ServerPacket" : "ClientPacket"); string rc = "", wc = "", dc = ""; var fs = pkt.fields; var nl = pkt.fl[0]; var i = 0; var ct = -1; var custom = false; foreach (var f in fs) { var fieldType = f.custom ? f.array ? "std::vector<" + ParsePacketName(f.typeName, pkt.groupName, f.groupName) + "*>" : ParsePacketName(f.typeName, pkt.groupName, f.groupName) + "*" : ParseType(f.type); if (fieldType.Length > nl) { nl = fieldType.Length; } if (f.custom && f.groupName != pkt.groupName) { var mk = f.groupName + ":" + ParsePacketName(f.typeName); if (!refs.Contains(mk)) { refs += mk + "\r\n"; } } if (!custom && f.custom) { custom = true; } } foreach (var f in fs) { if (i == 0) { code += " public:\r\n"; } var fieldType = f.custom ? f.array ? "std::vector<" + ParsePacketName(f.typeName, pkt.groupName, f.groupName) + "*>" : ParsePacketName(f.typeName, pkt.groupName, f.groupName) + "*" : ParseType(f.type); code += string.Format(" {0,-" + (nl + 4) + "} {1, -" + (pkt.fl[1] + 4) + "}{2}\r\n", fieldType, f.name + ";", string.IsNullOrEmpty(f.comment) ? "" : "// " + f.comment); var t = f.custom ? 1 : 0; if (t == 1 && ct == 0 || ct < 0) { rc += string.Format("{0}{1} ", i == 0 ? " " : ";\r\n ", "w"); wc += string.Format("{0}{1} ", i == 0 ? " " : ";\r\n ", "w"); } ct = t; rc += string.Format(">> {0}{1}{2}", f.custom && !f.array ? "&" : "", f.name, i == fs.Length - 1 ? ";\r\n" : " "); wc += string.Format("<< {0}{1}", f.name, i == fs.Length - 1 ? ";\r\n" : " "); if (f.custom || f.array) { dc += string.Format(" {0}({1});\r\n", f.custom ? f.array ? "VECTOR_DELETE" : "SAFE_DELETE" : "VECTOR_CLEAR", f.name); } ++i; } code += string.Format("{0} public:\r\n {1}() : {2}({3}) {{{{ }}}}\r\n", fs.Length > 0 ? "\r\n" : "", pn, sp ? "ServerPacket" : "ClientPacket", pkt.id); code += string.Format(" {0}{1}\r\n", string.IsNullOrEmpty(dc) ? "" : "~" + pn + "()", string.IsNullOrEmpty(dc) ? "" : custom ? ";\r\n" : "\r\n {{\r\n" + dc.Replace(" ", " ") + " }}\r\n"); code += " void Read(WorldPacket &w) override" + (string.IsNullOrEmpty(rc) ? " {{ }}\r\n\r\n" : "\r\n {{\r\n" + rc + " }}\r\n\r\n"); code += " void Write(WorldPacket &w) const override" + (string.IsNullOrEmpty(wc) ? " {{ }}\r\n" : "\r\n {{\r\n" + wc + " }}\r\n"); des += !custom || string.IsNullOrEmpty(dc) ? "" : pn + "::~" + pn + "()\r\n{\r\n" + dc + "}\r\n\r\n"; code += " }};\r\n"; return(new string[] { code, cpp, refs }); }