Client LuaCsForBarotrauma
BarotraumaClient/ClientSource/LuaCs/LuaCsNetworking.cs
2 using System.Collections.Generic;
3 
4 namespace Barotrauma
5 {
6  partial class LuaCsNetworking
7  {
8  private Dictionary<ushort, Queue<IReadMessage>> receiveQueue = new Dictionary<ushort, Queue<IReadMessage>>();
9 
10  public void SendSyncMessage()
11  {
12  if (GameMain.Client == null) { return; }
13 
14  WriteOnlyMessage message = new WriteOnlyMessage();
15  message.WriteByte((byte)ClientPacketHeader.LUA_NET_MESSAGE);
16  message.WriteByte((byte)LuaCsClientToServer.RequestAllIds);
17  GameMain.Client.ClientPeer.Send(message, DeliveryMethod.Reliable);
18  }
19 
20  public void NetMessageReceived(IReadMessage netMessage, ServerPacketHeader header, Client client = null)
21  {
22  if (header != ServerPacketHeader.LUA_NET_MESSAGE)
23  {
24  GameMain.LuaCs.Hook.Call("netMessageReceived", netMessage, header, client);
25  return;
26  }
27 
28  LuaCsServerToClient luaCsHeader = (LuaCsServerToClient)netMessage.ReadByte();
29 
30  switch (luaCsHeader)
31  {
32  case LuaCsServerToClient.NetMessageString:
33  HandleNetMessageString(netMessage);
34  break;
35 
36  case LuaCsServerToClient.NetMessageId:
37  HandleNetMessageId(netMessage);
38  break;
39 
40  case LuaCsServerToClient.ReceiveIds:
41  ReadIds(netMessage);
42  break;
43  }
44  }
45 
46  public IWriteMessage Start(string netMessageName)
47  {
48  var message = new WriteOnlyMessage();
49 
50  message.WriteByte((byte)ClientPacketHeader.LUA_NET_MESSAGE);
51 
52  if (stringToId.ContainsKey(netMessageName))
53  {
54  message.WriteByte((byte)LuaCsClientToServer.NetMessageId);
55  message.WriteUInt16(stringToId[netMessageName]);
56  }
57  else
58  {
59  message.WriteByte((byte)LuaCsClientToServer.NetMessageString);
60  message.WriteString(netMessageName);
61  }
62 
63  return message;
64  }
65 
66  public void Receive(string netMessageName, LuaCsAction callback)
67  {
68  RequestId(netMessageName);
69 
70  netReceives[netMessageName] = callback;
71  }
72 
73  public void RequestId(string netMessageName)
74  {
75  if (stringToId.ContainsKey(netMessageName)) { return; }
76 
77  if (GameMain.Client == null) { return; }
78 
79  WriteOnlyMessage message = new WriteOnlyMessage();
80  message.WriteByte((byte)ClientPacketHeader.LUA_NET_MESSAGE);
81  message.WriteByte((byte)LuaCsClientToServer.RequestSingleId);
82 
83  message.WriteString(netMessageName);
84 
85  Send(message, DeliveryMethod.Reliable);
86  }
87 
88  public void Send(IWriteMessage netMessage, DeliveryMethod deliveryMethod = DeliveryMethod.Reliable)
89  {
90  GameMain.Client.ClientPeer.Send(netMessage, deliveryMethod);
91  }
92 
93  private void HandleNetMessageId(IReadMessage netMessage, Client client = null)
94  {
95  ushort id = netMessage.ReadUInt16();
96 
97  if (idToString.ContainsKey(id))
98  {
99  string name = idToString[id];
100 
101  HandleNetMessage(netMessage, name, client);
102  }
103  else
104  {
105  if (!receiveQueue.ContainsKey(id)) { receiveQueue[id] = new Queue<IReadMessage>(); }
106  receiveQueue[id].Enqueue(netMessage);
107 
108  if (GameSettings.CurrentConfig.VerboseLogging)
109  {
110  LuaCsLogger.LogMessage($"Received NetMessage with unknown id {id} from server, storing in queue in case we receive the id later.");
111  }
112  }
113  }
114 
115  private void ReadIds(IReadMessage netMessage)
116  {
117  ushort size = netMessage.ReadUInt16();
118 
119  for (int i = 0; i < size; i++)
120  {
121  ushort id = netMessage.ReadUInt16();
122  string name = netMessage.ReadString();
123 
124  idToString[id] = name;
125  stringToId[name] = id;
126 
127  if (!receiveQueue.ContainsKey(id))
128  {
129  continue;
130  }
131 
132  while (receiveQueue[id].TryDequeue(out var queueMessage))
133  {
134  if (netReceives.ContainsKey(name))
135  {
136  netReceives[name](queueMessage, null);
137  }
138  }
139  }
140  }
141  }
142 
143 }
static GameClient Client
Definition: GameMain.cs:188
static LuaCsSetup LuaCs
Definition: GameMain.cs:26
object Call(string name, params object[] args)
void Send(IWriteMessage netMessage, DeliveryMethod deliveryMethod=DeliveryMethod.Reliable)
void NetMessageReceived(IReadMessage netMessage, ServerPacketHeader header, Client client=null)
void Receive(string netMessageName, LuaCsAction callback)
delegate void LuaCsAction(params object[] args)