Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
RemoteClient.cs
Go to the documentation of this file.
1using System;
5
6namespace Terraria;
7
8public class RemoteClient
9{
11
12 public int Id;
13
14 public string Name = "Anonymous";
15
16 public bool IsActive;
17
18 public bool PendingTermination;
19
21
23
24 public int State;
25
26 public int TimeOutTimer;
27
28 public string StatusText = "";
29
30 public string StatusText2;
31
32 public int StatusCount;
33
34 public int StatusMax;
35
36 public bool[,] TileSections = new bool[Main.maxTilesX / 200 + 1, Main.maxTilesY / 150 + 1];
37
38 public byte[] ReadBuffer;
39
40 public float SpamProjectile;
41
42 public float SpamAddBlock;
43
44 public float SpamDeleteBlock;
45
46 public float SpamWater;
47
48 public float SpamProjectileMax = 100f;
49
50 public float SpamAddBlockMax = 100f;
51
52 public float SpamDeleteBlockMax = 500f;
53
54 public float SpamWaterMax = 50f;
55
56 private volatile bool _isReading;
57
58 public bool IsConnected()
59 {
60 if (Socket != null)
61 {
62 return Socket.IsConnected();
63 }
64 return false;
65 }
66
67 public void SpamUpdate()
68 {
69 if (!Netplay.SpamCheck)
70 {
71 SpamProjectile = 0f;
72 SpamDeleteBlock = 0f;
73 SpamAddBlock = 0f;
74 SpamWater = 0f;
75 return;
76 }
78 {
79 NetMessage.BootPlayer(Id, NetworkText.FromKey("Net.CheatingProjectileSpam"));
80 }
82 {
83 NetMessage.BootPlayer(Id, NetworkText.FromKey("Net.CheatingTileSpam"));
84 }
86 {
87 NetMessage.BootPlayer(Id, NetworkText.FromKey("Net.CheatingTileRemovalSpam"));
88 }
90 {
91 NetMessage.BootPlayer(Id, NetworkText.FromKey("Net.CheatingLiquidSpam"));
92 }
93 SpamProjectile -= 0.4f;
94 if (SpamProjectile < 0f)
95 {
96 SpamProjectile = 0f;
97 }
98 SpamAddBlock -= 0.3f;
99 if (SpamAddBlock < 0f)
100 {
101 SpamAddBlock = 0f;
102 }
103 SpamDeleteBlock -= 5f;
104 if (SpamDeleteBlock < 0f)
105 {
106 SpamDeleteBlock = 0f;
107 }
108 SpamWater -= 0.2f;
109 if (SpamWater < 0f)
110 {
111 SpamWater = 0f;
112 }
113 }
114
115 public void SpamClear()
116 {
117 SpamProjectile = 0f;
118 SpamAddBlock = 0f;
119 SpamDeleteBlock = 0f;
120 SpamWater = 0f;
121 }
122
123 public static void CheckSection(int playerIndex, Vector2 position, int fluff = 1)
124 {
125 int sectionX = Netplay.GetSectionX((int)(position.X / 16f));
126 int sectionY = Netplay.GetSectionY((int)(position.Y / 16f));
127 int num = 0;
128 for (int i = sectionX - fluff; i < sectionX + fluff + 1; i++)
129 {
130 for (int j = sectionY - fluff; j < sectionY + fluff + 1; j++)
131 {
132 if (i >= 0 && i < Main.maxSectionsX && j >= 0 && j < Main.maxSectionsY && !Netplay.Clients[playerIndex].TileSections[i, j])
133 {
134 num++;
135 }
136 }
137 }
138 if (num <= 0)
139 {
140 return;
141 }
142 int num2 = num;
143 NetMessage.SendData(9, playerIndex, -1, Lang.inter[44].ToNetworkText(), num2);
144 Netplay.Clients[playerIndex].StatusText2 = Language.GetTextValue("Net.IsReceivingTileData");
145 Netplay.Clients[playerIndex].StatusMax += num2;
146 for (int k = sectionX - fluff; k < sectionX + fluff + 1; k++)
147 {
148 for (int l = sectionY - fluff; l < sectionY + fluff + 1; l++)
149 {
150 NetMessage.SendSection(playerIndex, k, l);
151 }
152 }
153 }
154
155 public bool SectionRange(int size, int firstX, int firstY)
156 {
157 for (int i = 0; i < 4; i++)
158 {
159 int num = firstX;
160 int num2 = firstY;
161 if (i == 1)
162 {
163 num += size;
164 }
165 if (i == 2)
166 {
167 num2 += size;
168 }
169 if (i == 3)
170 {
171 num += size;
172 num2 += size;
173 }
174 int sectionX = Netplay.GetSectionX(num);
175 int sectionY = Netplay.GetSectionY(num2);
176 if (TileSections[sectionX, sectionY])
177 {
178 return true;
179 }
180 }
181 return false;
182 }
183
184 public void ResetSections()
185 {
186 for (int i = 0; i < Main.maxSectionsX; i++)
187 {
188 for (int j = 0; j < Main.maxSectionsY; j++)
189 {
190 TileSections[i, j] = false;
191 }
192 }
193 }
194
195 public void Reset()
196 {
198 if (Id < 255)
199 {
200 Main.player[Id] = new Player();
201 }
202 TimeOutTimer = 0;
203 StatusCount = 0;
204 StatusMax = 0;
205 StatusText2 = "";
206 StatusText = "";
207 State = 0;
208 _isReading = false;
209 PendingTermination = false;
211 SpamClear();
212 IsActive = false;
213 NetMessage.buffer[Id].Reset();
214 if (Socket != null)
215 {
216 Socket.Close();
217 }
218 }
219
220 public void ServerWriteCallBack(object state)
221 {
222 NetMessage.buffer[Id].spamCount--;
223 if (StatusMax > 0)
224 {
225 StatusCount++;
226 }
227 }
228
229 public void Update()
230 {
231 if (!IsActive)
232 {
233 State = 0;
234 IsActive = true;
235 }
236 TryRead();
238 }
239
240 private void TryRead()
241 {
242 if (_isReading)
243 {
244 return;
245 }
246 try
247 {
249 {
250 _isReading = true;
252 }
253 }
254 catch
255 {
256 PendingTermination = true;
257 }
258 }
259
260 private void ServerReadCallBack(object state, int length)
261 {
262 if (!Netplay.Disconnect)
263 {
264 if (length == 0)
265 {
266 PendingTermination = true;
267 }
268 else
269 {
270 try
271 {
273 }
274 catch
275 {
276 if (!Main.ignoreErrors)
277 {
278 throw;
279 }
280 }
281 }
282 }
283 _isReading = false;
284 }
285
286 private void UpdateStatusText()
287 {
288 if (StatusMax > 0 && StatusText2 != "")
289 {
290 if (StatusCount >= StatusMax)
291 {
292 StatusText = Language.GetTextValue("Net.ClientStatusComplete", Socket.GetRemoteAddress(), Name, StatusText2);
293 StatusText2 = "";
294 StatusMax = 0;
295 StatusCount = 0;
296 return;
297 }
298 StatusText = string.Concat("(", Socket.GetRemoteAddress(), ") ", Name, " ", StatusText2, ": ", (int)((float)StatusCount / (float)StatusMax * 100f), "%");
299 }
300 else if (State == 0)
301 {
302 StatusText = Language.GetTextValue("Net.ClientConnecting", $"({Socket.GetRemoteAddress()}) {Name}");
303 }
304 else if (State == 1)
305 {
306 StatusText = Language.GetTextValue("Net.ClientSendingData", Socket.GetRemoteAddress(), Name);
307 }
308 else if (State == 2)
309 {
310 StatusText = Language.GetTextValue("Net.ClientRequestedWorldInfo", Socket.GetRemoteAddress(), Name);
311 }
312 else if (State != 3 && State == 10)
313 {
314 try
315 {
316 StatusText = Language.GetTextValue("Net.ClientPlaying", Socket.GetRemoteAddress(), Name);
317 }
318 catch (Exception)
319 {
320 PendingTermination = true;
321 }
322 }
323 }
324}
static LocalizedText[] inter
Definition Lang.cs:28
static string GetTextValue(string key)
Definition Language.cs:15
static NetworkText FromKey(string key, params object[] substitutions)
static int maxSectionsY
Definition Main.cs:1124
static int maxSectionsX
Definition Main.cs:1122
static bool ignoreErrors
Definition Main.cs:742
static Player[] player
Definition Main.cs:1803
static void SendData(int msgType, int remoteClient=-1, int ignoreClient=-1, NetworkText text=null, int number=0, float number2=0f, float number3=0f, float number4=0f, int number5=0, int number6=0, int number7=0)
Definition NetMessage.cs:88
static void ReceiveBytes(byte[] bytes, int streamLength, int i=256)
static MessageBuffer[] buffer
Definition NetMessage.cs:61
static void BootPlayer(int plr, NetworkText msg)
static void SendSection(int whoAmi, int sectionX, int sectionY)
static bool Disconnect
Definition Netplay.cs:55
static RemoteClient[] Clients
Definition Netplay.cs:37
static bool SpamCheck
Definition Netplay.cs:57
static int GetSectionX(int x)
Definition Netplay.cs:774
static int GetSectionY(int y)
Definition Netplay.cs:779
void ServerWriteCallBack(object state)
static void CheckSection(int playerIndex, Vector2 position, int fluff=1)
void ServerReadCallBack(object state, int length)
volatile bool _isReading
bool SectionRange(int size, int firstX, int firstY)
void AsyncReceive(byte[] data, int offset, int size, SocketReceiveCallback callback, object state=null)
RemoteAddress GetRemoteAddress()