Added parsing players from the network stream
This commit is contained in:
parent
f1406501c6
commit
f0c7980e9f
@ -27,6 +27,8 @@ namespace RBG_Server
|
|||||||
/// This limit can be changed at any time
|
/// This limit can be changed at any time
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ConcurrentDictionary<string, CachedByteArray> ImageCollection { get; } = new();
|
public ConcurrentDictionary<string, CachedByteArray> ImageCollection { get; } = new();
|
||||||
|
|
||||||
|
public List<Player> Players { get; } = new List<Player>();
|
||||||
public List<string> ImageList { get; } = new();
|
public List<string> ImageList { get; } = new();
|
||||||
public string BoardName { get; set; }
|
public string BoardName { get; set; }
|
||||||
|
|
||||||
@ -95,20 +97,47 @@ namespace RBG_Server
|
|||||||
// Response data
|
// Response data
|
||||||
stateResponse = await GetResponse(stateStream, GetInt32(stateResponse)); // Get the full response data
|
stateResponse = await GetResponse(stateStream, GetInt32(stateResponse)); // Get the full response data
|
||||||
// Board state data
|
// Board state data
|
||||||
ColumnCount = GetInt32(stateResponse[..4]);
|
int playerID = GetInt32(stateResponse[..4]);
|
||||||
RowCount = GetInt32(stateResponse[4..8]);
|
ColumnCount = GetInt32(stateResponse[..8]);
|
||||||
ColumnZoomStart = GetInt32(stateResponse[8..12]);
|
RowCount = GetInt32(stateResponse[8..12]);
|
||||||
RowZoomStart = GetInt32(stateResponse[12..16]);
|
ColumnZoomStart = GetInt32(stateResponse[12..16]);
|
||||||
ColumnZoomSpan = GetInt32(stateResponse[16..20]);
|
RowZoomStart = GetInt32(stateResponse[16..20]);
|
||||||
RowZoomSpan = GetInt32(stateResponse[20..24]);
|
ColumnZoomSpan = GetInt32(stateResponse[20..24]);
|
||||||
StartingColumn = GetInt32(stateResponse[24..28]);
|
RowZoomSpan = GetInt32(stateResponse[24..28]);
|
||||||
StartingRow = GetInt32(stateResponse[28..32]);
|
StartingColumn = GetInt32(stateResponse[28..32]);
|
||||||
|
StartingRow = GetInt32(stateResponse[32..36]);
|
||||||
// Basic board data loaded; fetch players
|
// Basic board data loaded; fetch players
|
||||||
buffer = new byte[] { 1, 0, 0, 0, 2};
|
buffer = new byte[] { 1, 0, 0, 0, 2};
|
||||||
stateStream.Write(buffer, 0, buffer.Length);
|
stateStream.Write(buffer, 0, buffer.Length);
|
||||||
stateResponse = await GetResponse(stateStream, 4);
|
stateResponse = await GetResponse(stateStream, 4);
|
||||||
stateResponse = await GetResponse(stateStream, GetInt32(stateResponse));
|
stateResponse = await GetResponse(stateStream, GetInt32(stateResponse));
|
||||||
// state response contains a player list
|
// state response contains a player list;
|
||||||
|
// Player ID (Int32)
|
||||||
|
// Player Name (null-terminated string)
|
||||||
|
// Player Sprite (null-terminated string)
|
||||||
|
// Player Column (Int32)
|
||||||
|
// Player Row (Int32)
|
||||||
|
int start = 0;
|
||||||
|
while (start < stateResponse.Length)
|
||||||
|
{
|
||||||
|
int pos = start + 4;
|
||||||
|
int responsePlayerID = GetInt32(stateResponse[start..pos]);
|
||||||
|
start = pos;
|
||||||
|
while (stateResponse[pos++] != 0); // skip the bytes that aren't null
|
||||||
|
string responsePlayerName = Encoding.UTF8.GetString(stateResponse[start..pos]);
|
||||||
|
start = pos;
|
||||||
|
while (stateResponse[pos++] != 0); // skip the bytes that aren't null
|
||||||
|
string responsePlayerSprite = Encoding.UTF8.GetString(stateResponse[start..pos]);
|
||||||
|
start = pos;
|
||||||
|
pos += 4;
|
||||||
|
int playerColumn = GetInt32(stateResponse[start..pos]);
|
||||||
|
start = pos;
|
||||||
|
pos += 4;
|
||||||
|
int playerRow = GetInt32(stateResponse[start..pos]);
|
||||||
|
start = pos;
|
||||||
|
Player player = new Player(responsePlayerName, responsePlayerSprite, playerRow, playerColumn);
|
||||||
|
Players.Add(player);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@ -122,19 +151,14 @@ namespace RBG_Server
|
|||||||
|
|
||||||
dataResponse = await GetResponse(dataStream, GetInt32(dataResponse));
|
dataResponse = await GetResponse(dataStream, GetInt32(dataResponse));
|
||||||
List<byte> data = new List<byte>();
|
List<byte> data = new List<byte>();
|
||||||
for (int i = 0; i < dataResponse.Length; i++)
|
int start = 0;
|
||||||
|
while (start < dataResponse.Length)
|
||||||
{
|
{
|
||||||
if (dataResponse[i] != 0)
|
int pos = start;
|
||||||
{
|
while (dataResponse[pos++] != 0);
|
||||||
data.Add(dataResponse[i]);
|
ImageList.Add(Encoding.UTF8.GetString(dataResponse[start..pos]));
|
||||||
|
start = pos;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
ImageList.Add(Encoding.UTF8.GetString(data.ToArray()));
|
|
||||||
data.Clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load all low-resolution images
|
// Load all low-resolution images
|
||||||
foreach (string item in ImageList)
|
foreach (string item in ImageList)
|
||||||
{
|
{
|
||||||
@ -150,6 +174,7 @@ namespace RBG_Server
|
|||||||
dataResponse = await GetResponse(dataStream);
|
dataResponse = await GetResponse(dataStream);
|
||||||
dataResponse = await GetResponse(dataStream, GetInt32(dataResponse));
|
dataResponse = await GetResponse(dataStream, GetInt32(dataResponse));
|
||||||
ImageCollection.TryAdd(item + "_mip_low", (CachedByteArray)dataResponse);
|
ImageCollection.TryAdd(item + "_mip_low", (CachedByteArray)dataResponse);
|
||||||
|
|
||||||
}
|
}
|
||||||
// At this point, the minimal amount of work required by the data thread has been done (load all thumbs)
|
// At this point, the minimal amount of work required by the data thread has been done (load all thumbs)
|
||||||
// When an asset is needed from here, queue a load
|
// When an asset is needed from here, queue a load
|
||||||
@ -190,13 +215,12 @@ namespace RBG_Server
|
|||||||
if (stream.CanRead)
|
if (stream.CanRead)
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[targetLength];
|
byte[] buffer = new byte[targetLength];
|
||||||
StringBuilder myCompleteMessage = new StringBuilder();
|
|
||||||
int numberOfBytesRead = 0;
|
int numberOfBytesRead = 0;
|
||||||
|
|
||||||
// Incoming message may be larger than the buffer size.
|
// Incoming message may be larger than the buffer size.
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
numberOfBytesRead += await stream.ReadAsync(buffer, numberOfBytesRead, targetLength - numberOfBytesRead);
|
numberOfBytesRead += await stream.ReadAsync(buffer.AsMemory(numberOfBytesRead, targetLength - numberOfBytesRead));
|
||||||
}
|
}
|
||||||
while (numberOfBytesRead < targetLength);
|
while (numberOfBytesRead < targetLength);
|
||||||
return buffer;
|
return buffer;
|
||||||
|
@ -33,6 +33,8 @@ namespace RBG_Server
|
|||||||
public int Column { get; set; }
|
public int Column { get; set; }
|
||||||
public long LastTime { get; set; } = DateTime.Now.Ticks;
|
public long LastTime { get; set; } = DateTime.Now.Ticks;
|
||||||
public bool Connected { get; private set; }
|
public bool Connected { get; private set; }
|
||||||
|
|
||||||
|
public string Sprite { get; private set; }
|
||||||
public byte[] UnhandledBuffer { get; set; }
|
public byte[] UnhandledBuffer { get; set; }
|
||||||
|
|
||||||
public Image PlayerSprite { get; set; } = new();
|
public Image PlayerSprite { get; set; } = new();
|
||||||
@ -52,9 +54,10 @@ namespace RBG_Server
|
|||||||
|
|
||||||
// public Image sprite; // Sprite is now set as the implementation of this class
|
// public Image sprite; // Sprite is now set as the implementation of this class
|
||||||
|
|
||||||
public Player(string name, int row, int column) : base() // Call the base constructor at the same time; inits a Grid()
|
public Player(string name, string sprite, int row, int column) : base() // Call the base constructor at the same time; inits a Grid()
|
||||||
{
|
{
|
||||||
PlayerName = name;
|
PlayerName = name;
|
||||||
|
Sprite = sprite;
|
||||||
Row = row;
|
Row = row;
|
||||||
Column = column;
|
Column = column;
|
||||||
LastTime = DateTime.Now.Ticks;
|
LastTime = DateTime.Now.Ticks;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user