지난글(Packet Generator [2])에 이어서 개발을 진행한다.
💻 코드
실행에 필요한 구성 만들기
자동화 코드는 대부분 갖춰졌기 때문에 실행하기 위해서 나머지 필요한 부분을 넣어준다.
( 라이브러리, PacketID 추가 )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// {0} 패킷 이름/번호 목록
// {1} 패킷 목록
public static string fileFormat =
@"using ServerCore;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
public enum PacketID
{
{0}
}
{1}
";
추가된 Format 내용 Main에 적용하기
Main
에서PacketFormat
에 추가한 내용을 추가한다.ParsePacket
에는packetEnums
에 넣을 코드를 추가한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Program
{
static ushort packetId;
static string packetEnums;
static void Main(string[] args)
{
using (XmlReader r = XmlReader.Create("PDL.xml", settings))
{
// {0} 패킷 이름/번호 목록
// {1} 패킷 목록
string fileText = string.Format(PacketFormat.fileFormat, packetEnums, genPackets);
File.WriteAllText("GenPackets.cs", fileText);
}
}
public static void ParsePacket(XmlReader r)
{
Tuple<string, string, string> t = ParseMembers(r);
genPackets += string.Format(PacketFormat.packetFormat, packetName, t.Item1, t.Item2, t.Item3);
// Enum 패킷 아이디에 넣을 코드 (띄어쓰기 + 탭)
packetEnums += string.Format(PacketFormat.packetEnumFormat, packetName, ++packetId) + Environment.NewLine + "\t";
}
}
Byte 자동화 추가
Byte Format
코드를 추가한다.
1
2
3
4
5
6
7
8
9
10
11
// {0} 변수 이름
// {1} 변수 형식
public static string readByteFormat =
@"this.{0} = ({1})segment.Array[segment.Offset + count];
count += sizeof({1});";
// {0} 변수 이름
// {1} 변수 형식
public static string writeByteFormat =
@"segment.Array[segment.Offset + count] = (byte)this.{0};
count += sizeof({1});";
ParseMember
에 있는 switch
에 적용해준다.
1
2
3
4
5
6
7
8
9
switch (memberType)
{
case "byte":
case "sbyte":
memberCode += string.Format(PacketFormat.memberFormat, memberType, memberName);
readCode += string.Format(PacketFormat.readByteFormat, memberName, memberType);
writeCode += string.Format(PacketFormat.writeByteFormat, memberName, memberType);
break;
}
강의에서 테스트를 한 결과 이중 리스트도 원활하게 자동화되는 것을 알 수 있었다.
대신 struct를 class로 바꿔줘야 한다.