-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathUpdateReader.cs
114 lines (93 loc) · 3.68 KB
/
UpdateReader.cs
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System.Collections.Generic;
using System.IO;
using System.Text;
using eveUtility;
namespace eveDestiny
{
public class UpdateReader
{
public Header Header { get; private set; }
public List<Ball> Balls { get; private set; }
public void Read(Stream str)
{
ReadHeader(str);
Balls = new List<Ball>(5);
while (str.Position < str.Length)
Balls.Add(ReadBallFromStream(str));
}
private static Ball ReadBallFromStream(Stream str)
{
var ret = new Ball {Header = str.ReadStruct<BallHeader>()};
if (ret.Header.Mode != BallMode.Rigid)
ret.ExtraHeader = str.ReadStruct<ExtraBallHeader>();
if (ret.Header.Flags.HasFlag(BallFlag.IsFree))
ret.Data = str.ReadStruct<BallData>();
var reader = new BinaryReader(str);
ret.FormationId = reader.ReadByte();
switch (ret.Header.Mode)
{
case BallMode.Follow:
case BallMode.Orbit:
ret.FollowState = str.ReadStruct<FollowState>();
break;
case BallMode.Formation:
ret.FormationState = str.ReadStruct<FormationState>();
break;
case BallMode.Troll:
ret.TrollState = str.ReadStruct<TrollState>();
break;
case BallMode.Missile:
ret.MissileState = str.ReadStruct<MissileState>();
break;
case BallMode.Goto:
ret.GotoState = str.ReadStruct<GotoState>();
break;
case BallMode.Warp:
ret.WarpState = str.ReadStruct<WarpState>();
break;
case BallMode.Mushroom:
ret.MushroomState = str.ReadStruct<MushroomState>();
break;
case BallMode.Stop:
case BallMode.Field:
case BallMode.Rigid:
// no extra data for these
break;
}
if (ret.Header.Flags.HasFlag(BallFlag.HasMiniBalls))
ret.MiniBalls = ReadMiniBalls(reader);
// Crucible:
// no more names in destiny data
// most of them were invalid anyway, and slimitems have the name, so sensible change for CCP
//ret.Name = ReadString(reader);
return ret;
}
private static string ReadString(BinaryReader reader)
{
byte nameWords = reader.ReadByte();
if (nameWords > 0)
{
var rawName = reader.ReadBytes(nameWords * 2);
return Encoding.Unicode.GetString(rawName);
}
return null;
}
private void ReadHeader(Stream str)
{
Header = str.ReadStruct<Header>();
if (Header.PacketType != 0 && Header.PacketType != 1)
throw new InvalidDataException("Unknown packet type; expected 0 or 1, got " + Header.PacketType);
}
private static MiniBall[] ReadMiniBalls(BinaryReader reader)
{
int extraCount = reader.ReadInt16();
var ret = new MiniBall[extraCount];
if (extraCount > 0)
{
for (int i = 0; i < extraCount; i++)
ret[i] = reader.ReadStruct<MiniBall>();
}
return ret;
}
}
}