Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
NetMessage.cs
Go to the documentation of this file.
1using System;
2using System.IO;
3using Ionic.Zlib;
5using Microsoft.Xna.Framework.Graphics.PackedVector;
6using Terraria.Chat;
11using Terraria.ID;
13using Terraria.Social;
14
15namespace Terraria;
16
17public class NetMessage
18{
19 public struct NetSoundInfo
20 {
22
23 public ushort soundIndex;
24
25 public int style;
26
27 public float volume;
28
29 public float pitchOffset;
30
31 public NetSoundInfo(Vector2 position, ushort soundIndex, int style = -1, float volume = -1f, float pitchOffset = -1f)
32 {
33 this.position = position;
34 this.soundIndex = soundIndex;
35 this.style = style;
36 this.volume = volume;
37 this.pitchOffset = pitchOffset;
38 }
39
41 {
42 writer.WriteVector2(position);
43 writer.Write(soundIndex);
44 BitsByte bitsByte = new BitsByte(style != -1, volume != -1f, pitchOffset != -1f);
45 writer.Write(bitsByte);
46 if (bitsByte[0])
47 {
48 writer.Write(style);
49 }
50 if (bitsByte[1])
51 {
52 writer.Write(volume);
53 }
54 if (bitsByte[2])
55 {
56 writer.Write(pitchOffset);
57 }
58 }
59 }
60
61 public static MessageBuffer[] buffer = new MessageBuffer[257];
62
63 private static short[] _compressChestList = new short[8000];
64
65 private static short[] _compressSignList = new short[1000];
66
67 private static short[] _compressEntities = new short[1000];
68
70
72
74
75 public static bool TrySendData(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)
76 {
77 try
78 {
79 SendData(msgType, remoteClient, ignoreClient, text, number, number2, number3, number4, number5, number6, number7);
80 }
81 catch (Exception)
82 {
83 return false;
84 }
85 return true;
86 }
87
88 public 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)
89 {
90 if (Main.netMode == 0)
91 {
92 return;
93 }
94 if (msgType == 21 && (Main.item[number].shimmerTime > 0f || Main.item[number].shimmered))
95 {
96 msgType = 145;
97 }
98 int num = 256;
99 if (text == null)
100 {
102 }
103 if (Main.netMode == 2 && remoteClient >= 0)
104 {
105 num = remoteClient;
106 }
107 lock (buffer[num])
108 {
109 BinaryWriter writer = buffer[num].writer;
110 if (writer == null)
111 {
112 buffer[num].ResetWriter();
113 writer = buffer[num].writer;
114 }
115 writer.BaseStream.Position = 0L;
116 long position = writer.BaseStream.Position;
117 writer.BaseStream.Position += 2L;
118 writer.Write((byte)msgType);
119 switch (msgType)
120 {
121 case 1:
122 writer.Write("Terraria" + 279);
123 break;
124 case 2:
125 text.Serialize(writer);
126 if (Main.dedServ)
127 {
128 Console.WriteLine(Language.GetTextValue("CLI.ClientWasBooted", Netplay.Clients[num].Socket.GetRemoteAddress().ToString(), text));
129 }
130 break;
131 case 3:
132 writer.Write((byte)remoteClient);
133 writer.Write(value: false);
134 break;
135 case 4:
136 {
137 Player player4 = Main.player[number];
138 writer.Write((byte)number);
139 writer.Write((byte)player4.skinVariant);
140 writer.Write((byte)player4.hair);
141 writer.Write(player4.name);
142 writer.Write(player4.hairDye);
144 writer.Write(player4.hideMisc);
145 writer.WriteRGB(player4.hairColor);
146 writer.WriteRGB(player4.skinColor);
147 writer.WriteRGB(player4.eyeColor);
148 writer.WriteRGB(player4.shirtColor);
149 writer.WriteRGB(player4.underShirtColor);
150 writer.WriteRGB(player4.pantsColor);
151 writer.WriteRGB(player4.shoeColor);
152 BitsByte bitsByte16 = (byte)0;
153 if (player4.difficulty == 1)
154 {
155 bitsByte16[0] = true;
156 }
157 else if (player4.difficulty == 2)
158 {
159 bitsByte16[1] = true;
160 }
161 else if (player4.difficulty == 3)
162 {
163 bitsByte16[3] = true;
164 }
165 bitsByte16[2] = player4.extraAccessory;
166 writer.Write(bitsByte16);
167 BitsByte bitsByte17 = (byte)0;
168 bitsByte17[0] = player4.UsingBiomeTorches;
169 bitsByte17[1] = player4.happyFunTorchTime;
170 bitsByte17[2] = player4.unlockedBiomeTorches;
171 bitsByte17[3] = player4.unlockedSuperCart;
172 bitsByte17[4] = player4.enabledSuperCart;
173 writer.Write(bitsByte17);
174 BitsByte bitsByte18 = (byte)0;
175 bitsByte18[0] = player4.usedAegisCrystal;
176 bitsByte18[1] = player4.usedAegisFruit;
177 bitsByte18[2] = player4.usedArcaneCrystal;
178 bitsByte18[3] = player4.usedGalaxyPearl;
179 bitsByte18[4] = player4.usedGummyWorm;
180 bitsByte18[5] = player4.usedAmbrosia;
181 bitsByte18[6] = player4.ateArtisanBread;
182 writer.Write(bitsByte18);
183 break;
184 }
185 case 5:
186 {
187 writer.Write((byte)number);
188 writer.Write((short)number2);
189 Player player5 = Main.player[number];
190 Item item6 = null;
191 int num11 = 0;
192 int num12 = 0;
193 item6 = ((number2 >= (float)PlayerItemSlotID.Loadout3_Dye_0) ? player5.Loadouts[2].Dye[(int)number2 - PlayerItemSlotID.Loadout3_Dye_0] : ((number2 >= (float)PlayerItemSlotID.Loadout3_Armor_0) ? player5.Loadouts[2].Armor[(int)number2 - PlayerItemSlotID.Loadout3_Armor_0] : ((number2 >= (float)PlayerItemSlotID.Loadout2_Dye_0) ? player5.Loadouts[1].Dye[(int)number2 - PlayerItemSlotID.Loadout2_Dye_0] : ((number2 >= (float)PlayerItemSlotID.Loadout2_Armor_0) ? player5.Loadouts[1].Armor[(int)number2 - PlayerItemSlotID.Loadout2_Armor_0] : ((number2 >= (float)PlayerItemSlotID.Loadout1_Dye_0) ? player5.Loadouts[0].Dye[(int)number2 - PlayerItemSlotID.Loadout1_Dye_0] : ((number2 >= (float)PlayerItemSlotID.Loadout1_Armor_0) ? player5.Loadouts[0].Armor[(int)number2 - PlayerItemSlotID.Loadout1_Armor_0] : ((number2 >= (float)PlayerItemSlotID.Bank4_0) ? player5.bank4.item[(int)number2 - PlayerItemSlotID.Bank4_0] : ((number2 >= (float)PlayerItemSlotID.Bank3_0) ? player5.bank3.item[(int)number2 - PlayerItemSlotID.Bank3_0] : ((number2 >= (float)PlayerItemSlotID.TrashItem) ? player5.trashItem : ((number2 >= (float)PlayerItemSlotID.Bank2_0) ? player5.bank2.item[(int)number2 - PlayerItemSlotID.Bank2_0] : ((number2 >= (float)PlayerItemSlotID.Bank1_0) ? player5.bank.item[(int)number2 - PlayerItemSlotID.Bank1_0] : ((number2 >= (float)PlayerItemSlotID.MiscDye0) ? player5.miscDyes[(int)number2 - PlayerItemSlotID.MiscDye0] : ((number2 >= (float)PlayerItemSlotID.Misc0) ? player5.miscEquips[(int)number2 - PlayerItemSlotID.Misc0] : ((number2 >= (float)PlayerItemSlotID.Dye0) ? player5.dye[(int)number2 - PlayerItemSlotID.Dye0] : ((!(number2 >= (float)PlayerItemSlotID.Armor0)) ? player5.inventory[(int)number2 - PlayerItemSlotID.Inventory0] : player5.armor[(int)number2 - PlayerItemSlotID.Armor0])))))))))))))));
194 if (item6.Name == "" || item6.stack == 0 || item6.type == 0)
195 {
196 item6.SetDefaults(0, noMatCheck: true);
197 }
198 num11 = item6.stack;
199 num12 = item6.netID;
200 if (num11 < 0)
201 {
202 num11 = 0;
203 }
204 writer.Write((short)num11);
205 writer.Write((byte)number3);
206 writer.Write((short)num12);
207 break;
208 }
209 case 7:
210 {
211 writer.Write((int)Main.time);
212 BitsByte bitsByte5 = (byte)0;
213 bitsByte5[0] = Main.dayTime;
214 bitsByte5[1] = Main.bloodMoon;
215 bitsByte5[2] = Main.eclipse;
216 writer.Write(bitsByte5);
217 writer.Write((byte)Main.moonPhase);
218 writer.Write((short)Main.maxTilesX);
219 writer.Write((short)Main.maxTilesY);
220 writer.Write((short)Main.spawnTileX);
221 writer.Write((short)Main.spawnTileY);
222 writer.Write((short)Main.worldSurface);
223 writer.Write((short)Main.rockLayer);
224 writer.Write(Main.worldID);
225 writer.Write(Main.worldName);
226 writer.Write((byte)Main.GameMode);
227 writer.Write(Main.ActiveWorldFileData.UniqueId.ToByteArray());
228 writer.Write(Main.ActiveWorldFileData.WorldGeneratorVersion);
229 writer.Write((byte)Main.moonType);
230 writer.Write((byte)WorldGen.treeBG1);
231 writer.Write((byte)WorldGen.treeBG2);
232 writer.Write((byte)WorldGen.treeBG3);
233 writer.Write((byte)WorldGen.treeBG4);
234 writer.Write((byte)WorldGen.corruptBG);
235 writer.Write((byte)WorldGen.jungleBG);
236 writer.Write((byte)WorldGen.snowBG);
237 writer.Write((byte)WorldGen.hallowBG);
238 writer.Write((byte)WorldGen.crimsonBG);
239 writer.Write((byte)WorldGen.desertBG);
240 writer.Write((byte)WorldGen.oceanBG);
241 writer.Write((byte)WorldGen.mushroomBG);
242 writer.Write((byte)WorldGen.underworldBG);
243 writer.Write((byte)Main.iceBackStyle);
244 writer.Write((byte)Main.jungleBackStyle);
245 writer.Write((byte)Main.hellBackStyle);
247 writer.Write((byte)Main.numClouds);
248 for (int n = 0; n < 3; n++)
249 {
250 writer.Write(Main.treeX[n]);
251 }
252 for (int num8 = 0; num8 < 4; num8++)
253 {
254 writer.Write((byte)Main.treeStyle[num8]);
255 }
256 for (int num9 = 0; num9 < 3; num9++)
257 {
258 writer.Write(Main.caveBackX[num9]);
259 }
260 for (int num10 = 0; num10 < 4; num10++)
261 {
262 writer.Write((byte)Main.caveBackStyle[num10]);
263 }
264 WorldGen.TreeTops.SyncSend(writer);
265 if (!Main.raining)
266 {
267 Main.maxRaining = 0f;
268 }
269 writer.Write(Main.maxRaining);
270 BitsByte bitsByte6 = (byte)0;
271 bitsByte6[0] = WorldGen.shadowOrbSmashed;
272 bitsByte6[1] = NPC.downedBoss1;
273 bitsByte6[2] = NPC.downedBoss2;
274 bitsByte6[3] = NPC.downedBoss3;
275 bitsByte6[4] = Main.hardMode;
276 bitsByte6[5] = NPC.downedClown;
277 bitsByte6[7] = NPC.downedPlantBoss;
278 writer.Write(bitsByte6);
279 BitsByte bitsByte7 = (byte)0;
280 bitsByte7[0] = NPC.downedMechBoss1;
281 bitsByte7[1] = NPC.downedMechBoss2;
282 bitsByte7[2] = NPC.downedMechBoss3;
283 bitsByte7[3] = NPC.downedMechBossAny;
284 bitsByte7[4] = Main.cloudBGActive >= 1f;
285 bitsByte7[5] = WorldGen.crimson;
286 bitsByte7[6] = Main.pumpkinMoon;
287 bitsByte7[7] = Main.snowMoon;
288 writer.Write(bitsByte7);
289 BitsByte bitsByte8 = (byte)0;
290 bitsByte8[1] = Main.fastForwardTimeToDawn;
291 bitsByte8[2] = Main.slimeRain;
292 bitsByte8[3] = NPC.downedSlimeKing;
293 bitsByte8[4] = NPC.downedQueenBee;
294 bitsByte8[5] = NPC.downedFishron;
295 bitsByte8[6] = NPC.downedMartians;
296 bitsByte8[7] = NPC.downedAncientCultist;
297 writer.Write(bitsByte8);
298 BitsByte bitsByte9 = (byte)0;
299 bitsByte9[0] = NPC.downedMoonlord;
300 bitsByte9[1] = NPC.downedHalloweenKing;
301 bitsByte9[2] = NPC.downedHalloweenTree;
302 bitsByte9[3] = NPC.downedChristmasIceQueen;
303 bitsByte9[4] = NPC.downedChristmasSantank;
304 bitsByte9[5] = NPC.downedChristmasTree;
305 bitsByte9[6] = NPC.downedGolemBoss;
306 bitsByte9[7] = BirthdayParty.PartyIsUp;
307 writer.Write(bitsByte9);
308 BitsByte bitsByte10 = (byte)0;
309 bitsByte10[0] = NPC.downedPirates;
310 bitsByte10[1] = NPC.downedFrost;
311 bitsByte10[2] = NPC.downedGoblins;
312 bitsByte10[3] = Sandstorm.Happening;
313 bitsByte10[4] = DD2Event.Ongoing;
314 bitsByte10[5] = DD2Event.DownedInvasionT1;
315 bitsByte10[6] = DD2Event.DownedInvasionT2;
316 bitsByte10[7] = DD2Event.DownedInvasionT3;
317 writer.Write(bitsByte10);
318 BitsByte bitsByte11 = (byte)0;
319 bitsByte11[0] = NPC.combatBookWasUsed;
320 bitsByte11[1] = LanternNight.LanternsUp;
321 bitsByte11[2] = NPC.downedTowerSolar;
322 bitsByte11[3] = NPC.downedTowerVortex;
323 bitsByte11[4] = NPC.downedTowerNebula;
324 bitsByte11[5] = NPC.downedTowerStardust;
325 bitsByte11[6] = Main.forceHalloweenForToday;
326 bitsByte11[7] = Main.forceXMasForToday;
327 writer.Write(bitsByte11);
328 BitsByte bitsByte12 = (byte)0;
329 bitsByte12[0] = NPC.boughtCat;
330 bitsByte12[1] = NPC.boughtDog;
331 bitsByte12[2] = NPC.boughtBunny;
332 bitsByte12[3] = NPC.freeCake;
333 bitsByte12[4] = Main.drunkWorld;
334 bitsByte12[5] = NPC.downedEmpressOfLight;
335 bitsByte12[6] = NPC.downedQueenSlime;
336 bitsByte12[7] = Main.getGoodWorld;
337 writer.Write(bitsByte12);
338 BitsByte bitsByte13 = (byte)0;
339 bitsByte13[0] = Main.tenthAnniversaryWorld;
340 bitsByte13[1] = Main.dontStarveWorld;
341 bitsByte13[2] = NPC.downedDeerclops;
342 bitsByte13[3] = Main.notTheBeesWorld;
343 bitsByte13[4] = Main.remixWorld;
344 bitsByte13[5] = NPC.unlockedSlimeBlueSpawn;
345 bitsByte13[6] = NPC.combatBookVolumeTwoWasUsed;
346 bitsByte13[7] = NPC.peddlersSatchelWasUsed;
347 writer.Write(bitsByte13);
348 BitsByte bitsByte14 = (byte)0;
349 bitsByte14[0] = NPC.unlockedSlimeGreenSpawn;
350 bitsByte14[1] = NPC.unlockedSlimeOldSpawn;
351 bitsByte14[2] = NPC.unlockedSlimePurpleSpawn;
352 bitsByte14[3] = NPC.unlockedSlimeRainbowSpawn;
353 bitsByte14[4] = NPC.unlockedSlimeRedSpawn;
354 bitsByte14[5] = NPC.unlockedSlimeYellowSpawn;
355 bitsByte14[6] = NPC.unlockedSlimeCopperSpawn;
356 bitsByte14[7] = Main.fastForwardTimeToDusk;
357 writer.Write(bitsByte14);
358 BitsByte bitsByte15 = (byte)0;
359 bitsByte15[0] = Main.noTrapsWorld;
360 bitsByte15[1] = Main.zenithWorld;
361 bitsByte15[2] = NPC.unlockedTruffleSpawn;
362 writer.Write(bitsByte15);
363 writer.Write((byte)Main.sundialCooldown);
364 writer.Write((byte)Main.moondialCooldown);
365 writer.Write((short)WorldGen.SavedOreTiers.Copper);
366 writer.Write((short)WorldGen.SavedOreTiers.Iron);
367 writer.Write((short)WorldGen.SavedOreTiers.Silver);
368 writer.Write((short)WorldGen.SavedOreTiers.Gold);
369 writer.Write((short)WorldGen.SavedOreTiers.Cobalt);
370 writer.Write((short)WorldGen.SavedOreTiers.Mythril);
372 writer.Write((sbyte)Main.invasionType);
373 if (SocialAPI.Network != null)
374 {
375 writer.Write(SocialAPI.Network.GetLobbyId());
376 }
377 else
378 {
379 writer.Write(0uL);
380 }
382 break;
383 }
384 case 8:
385 writer.Write(number);
386 writer.Write((int)number2);
387 break;
388 case 9:
389 {
390 writer.Write(number);
391 text.Serialize(writer);
392 BitsByte bitsByte22 = (byte)number2;
393 writer.Write(bitsByte22);
394 break;
395 }
396 case 10:
397 CompressTileBlock(number, (int)number2, (short)number3, (short)number4, writer.BaseStream);
398 break;
399 case 11:
400 writer.Write((short)number);
401 writer.Write((short)number2);
402 writer.Write((short)number3);
403 writer.Write((short)number4);
404 break;
405 case 12:
406 {
407 Player player6 = Main.player[number];
408 writer.Write((byte)number);
409 writer.Write((short)player6.SpawnX);
410 writer.Write((short)player6.SpawnY);
411 writer.Write(player6.respawnTimer);
412 writer.Write((short)player6.numberOfDeathsPVE);
413 writer.Write((short)player6.numberOfDeathsPVP);
414 writer.Write((byte)number2);
415 break;
416 }
417 case 13:
418 {
419 Player player7 = Main.player[number];
420 writer.Write((byte)number);
421 BitsByte bitsByte25 = (byte)0;
422 bitsByte25[0] = player7.controlUp;
423 bitsByte25[1] = player7.controlDown;
424 bitsByte25[2] = player7.controlLeft;
425 bitsByte25[3] = player7.controlRight;
426 bitsByte25[4] = player7.controlJump;
427 bitsByte25[5] = player7.controlUseItem;
428 bitsByte25[6] = player7.direction == 1;
429 writer.Write(bitsByte25);
430 BitsByte bitsByte26 = (byte)0;
431 bitsByte26[0] = player7.pulley;
432 bitsByte26[1] = player7.pulley && player7.pulleyDir == 2;
433 bitsByte26[2] = player7.velocity != Vector2.Zero;
434 bitsByte26[3] = player7.vortexStealthActive;
435 bitsByte26[4] = player7.gravDir == 1f;
436 bitsByte26[5] = player7.shieldRaised;
437 bitsByte26[6] = player7.ghost;
438 writer.Write(bitsByte26);
439 BitsByte bitsByte27 = (byte)0;
440 bitsByte27[0] = player7.tryKeepingHoveringUp;
441 bitsByte27[1] = player7.IsVoidVaultEnabled;
442 bitsByte27[2] = player7.sitting.isSitting;
443 bitsByte27[3] = player7.downedDD2EventAnyDifficulty;
444 bitsByte27[4] = player7.isPettingAnimal;
445 bitsByte27[5] = player7.isTheAnimalBeingPetSmall;
446 bitsByte27[6] = player7.PotionOfReturnOriginalUsePosition.HasValue;
447 bitsByte27[7] = player7.tryKeepingHoveringDown;
448 writer.Write(bitsByte27);
449 BitsByte bitsByte28 = (byte)0;
450 bitsByte28[0] = player7.sleeping.isSleeping;
451 bitsByte28[1] = player7.autoReuseAllWeapons;
452 bitsByte28[2] = player7.controlDownHold;
453 bitsByte28[3] = player7.isOperatingAnotherEntity;
454 bitsByte28[4] = player7.controlUseTile;
455 writer.Write(bitsByte28);
456 writer.Write((byte)player7.selectedItem);
457 writer.WriteVector2(player7.position);
458 if (bitsByte26[2])
459 {
460 writer.WriteVector2(player7.velocity);
461 }
462 if (bitsByte27[6])
463 {
464 writer.WriteVector2(player7.PotionOfReturnOriginalUsePosition.Value);
465 writer.WriteVector2(player7.PotionOfReturnHomePosition.Value);
466 }
467 break;
468 }
469 case 14:
470 writer.Write((byte)number);
471 writer.Write((byte)number2);
472 break;
473 case 16:
474 writer.Write((byte)number);
475 writer.Write((short)Main.player[number].statLife);
476 writer.Write((short)Main.player[number].statLifeMax);
477 break;
478 case 17:
479 writer.Write((byte)number);
480 writer.Write((short)number2);
481 writer.Write((short)number3);
482 writer.Write((short)number4);
483 writer.Write((byte)number5);
484 break;
485 case 18:
486 writer.Write((byte)(Main.dayTime ? 1u : 0u));
487 writer.Write((int)Main.time);
488 writer.Write(Main.sunModY);
489 writer.Write(Main.moonModY);
490 break;
491 case 19:
492 writer.Write((byte)number);
493 writer.Write((short)number2);
494 writer.Write((short)number3);
495 writer.Write((number4 == 1f) ? ((byte)1) : ((byte)0));
496 break;
497 case 20:
498 {
499 int num13 = number;
500 int num14 = (int)number2;
501 int num15 = (int)number3;
502 if (num15 < 0)
503 {
504 num15 = 0;
505 }
506 int num16 = (int)number4;
507 if (num16 < 0)
508 {
509 num16 = 0;
510 }
511 if (num13 < num15)
512 {
513 num13 = num15;
514 }
515 if (num13 >= Main.maxTilesX + num15)
516 {
517 num13 = Main.maxTilesX - num15 - 1;
518 }
519 if (num14 < num16)
520 {
521 num14 = num16;
522 }
523 if (num14 >= Main.maxTilesY + num16)
524 {
525 num14 = Main.maxTilesY - num16 - 1;
526 }
527 writer.Write((short)num13);
528 writer.Write((short)num14);
529 writer.Write((byte)num15);
530 writer.Write((byte)num16);
531 writer.Write((byte)number5);
532 for (int num17 = num13; num17 < num13 + num15; num17++)
533 {
534 for (int num18 = num14; num18 < num14 + num16; num18++)
535 {
536 BitsByte bitsByte19 = (byte)0;
537 BitsByte bitsByte20 = (byte)0;
538 BitsByte bitsByte21 = (byte)0;
539 byte b3 = 0;
540 byte b4 = 0;
541 Tile tile2 = Main.tile[num17, num18];
542 bitsByte19[0] = tile2.active();
543 bitsByte19[2] = tile2.wall > 0;
544 bitsByte19[3] = tile2.liquid > 0 && Main.netMode == 2;
545 bitsByte19[4] = tile2.wire();
546 bitsByte19[5] = tile2.halfBrick();
547 bitsByte19[6] = tile2.actuator();
548 bitsByte19[7] = tile2.inActive();
549 bitsByte20[0] = tile2.wire2();
550 bitsByte20[1] = tile2.wire3();
551 if (tile2.active() && tile2.color() > 0)
552 {
553 bitsByte20[2] = true;
554 b3 = tile2.color();
555 }
556 if (tile2.wall > 0 && tile2.wallColor() > 0)
557 {
558 bitsByte20[3] = true;
559 b4 = tile2.wallColor();
560 }
561 bitsByte20 = (byte)((byte)bitsByte20 + (byte)(tile2.slope() << 4));
562 bitsByte20[7] = tile2.wire4();
563 bitsByte21[0] = tile2.fullbrightBlock();
564 bitsByte21[1] = tile2.fullbrightWall();
565 bitsByte21[2] = tile2.invisibleBlock();
566 bitsByte21[3] = tile2.invisibleWall();
567 writer.Write(bitsByte19);
568 writer.Write(bitsByte20);
569 writer.Write(bitsByte21);
570 if (b3 > 0)
571 {
572 writer.Write(b3);
573 }
574 if (b4 > 0)
575 {
576 writer.Write(b4);
577 }
578 if (tile2.active())
579 {
580 writer.Write(tile2.type);
581 if (Main.tileFrameImportant[tile2.type])
582 {
583 writer.Write(tile2.frameX);
584 writer.Write(tile2.frameY);
585 }
586 }
587 if (tile2.wall > 0)
588 {
589 writer.Write(tile2.wall);
590 }
591 if (tile2.liquid > 0 && Main.netMode == 2)
592 {
593 writer.Write(tile2.liquid);
594 writer.Write(tile2.liquidType());
595 }
596 }
597 }
598 break;
599 }
600 case 21:
601 case 90:
602 case 145:
603 case 148:
604 {
605 Item item3 = Main.item[number];
606 writer.Write((short)number);
607 writer.WriteVector2(item3.position);
608 writer.WriteVector2(item3.velocity);
609 writer.Write((short)item3.stack);
610 writer.Write(item3.prefix);
611 writer.Write((byte)number2);
612 short value2 = 0;
613 if (item3.active && item3.stack > 0)
614 {
615 value2 = (short)item3.netID;
616 }
617 writer.Write(value2);
618 if (msgType == 145)
619 {
620 writer.Write(item3.shimmered);
621 writer.Write(item3.shimmerTime);
622 }
623 if (msgType == 148)
624 {
626 }
627 break;
628 }
629 case 22:
630 writer.Write((short)number);
631 writer.Write((byte)Main.item[number].playerIndexTheItemIsReservedFor);
632 break;
633 case 23:
634 {
635 NPC nPC2 = Main.npc[number];
636 writer.Write((short)number);
637 writer.WriteVector2(nPC2.position);
638 writer.WriteVector2(nPC2.velocity);
639 writer.Write((ushort)nPC2.target);
640 int num4 = nPC2.life;
641 if (!nPC2.active)
642 {
643 num4 = 0;
644 }
645 if (!nPC2.active || nPC2.life <= 0)
646 {
647 nPC2.netSkip = 0;
648 }
649 short value3 = (short)nPC2.netID;
650 bool[] array = new bool[4];
651 BitsByte bitsByte3 = (byte)0;
652 bitsByte3[0] = nPC2.direction > 0;
653 bitsByte3[1] = nPC2.directionY > 0;
654 bitsByte3[2] = (array[0] = nPC2.ai[0] != 0f);
655 bitsByte3[3] = (array[1] = nPC2.ai[1] != 0f);
656 bitsByte3[4] = (array[2] = nPC2.ai[2] != 0f);
657 bitsByte3[5] = (array[3] = nPC2.ai[3] != 0f);
658 bitsByte3[6] = nPC2.spriteDirection > 0;
659 bitsByte3[7] = num4 == nPC2.lifeMax;
660 writer.Write(bitsByte3);
661 BitsByte bitsByte4 = (byte)0;
662 bitsByte4[0] = nPC2.statsAreScaledForThisManyPlayers > 1;
663 bitsByte4[1] = nPC2.SpawnedFromStatue;
664 bitsByte4[2] = nPC2.strengthMultiplier != 1f;
665 writer.Write(bitsByte4);
666 for (int m = 0; m < NPC.maxAI; m++)
667 {
668 if (array[m])
669 {
670 writer.Write(nPC2.ai[m]);
671 }
672 }
673 writer.Write(value3);
674 if (bitsByte4[0])
675 {
677 }
678 if (bitsByte4[2])
679 {
680 writer.Write(nPC2.strengthMultiplier);
681 }
682 if (!bitsByte3[7])
683 {
684 byte b2 = 1;
685 if (nPC2.lifeMax > 32767)
686 {
687 b2 = 4;
688 }
689 else if (nPC2.lifeMax > 127)
690 {
691 b2 = 2;
692 }
693 writer.Write(b2);
694 switch (b2)
695 {
696 case 2:
697 writer.Write((short)num4);
698 break;
699 case 4:
700 writer.Write(num4);
701 break;
702 default:
703 writer.Write((sbyte)num4);
704 break;
705 }
706 }
707 if (nPC2.type >= 0 && nPC2.type < NPCID.Count && Main.npcCatchable[nPC2.type])
708 {
709 writer.Write((byte)nPC2.releaseOwner);
710 }
711 break;
712 }
713 case 24:
714 writer.Write((short)number);
715 writer.Write((byte)number2);
716 break;
717 case 107:
718 writer.Write((byte)number2);
719 writer.Write((byte)number3);
720 writer.Write((byte)number4);
721 text.Serialize(writer);
722 writer.Write((short)number5);
723 break;
724 case 27:
725 {
726 Projectile projectile = Main.projectile[number];
727 writer.Write((short)projectile.identity);
728 writer.WriteVector2(projectile.position);
729 writer.WriteVector2(projectile.velocity);
730 writer.Write((byte)projectile.owner);
731 writer.Write((short)projectile.type);
732 BitsByte bitsByte23 = (byte)0;
733 BitsByte bitsByte24 = (byte)0;
734 bitsByte23[0] = projectile.ai[0] != 0f;
735 bitsByte23[1] = projectile.ai[1] != 0f;
736 bitsByte24[0] = projectile.ai[2] != 0f;
737 if (projectile.bannerIdToRespondTo != 0)
738 {
739 bitsByte23[3] = true;
740 }
741 if (projectile.damage != 0)
742 {
743 bitsByte23[4] = true;
744 }
745 if (projectile.knockBack != 0f)
746 {
747 bitsByte23[5] = true;
748 }
749 if (projectile.type > 0 && projectile.type < ProjectileID.Count && ProjectileID.Sets.NeedsUUID[projectile.type])
750 {
751 bitsByte23[7] = true;
752 }
753 if (projectile.originalDamage != 0)
754 {
755 bitsByte23[6] = true;
756 }
757 if ((byte)bitsByte24 != 0)
758 {
759 bitsByte23[2] = true;
760 }
761 writer.Write(bitsByte23);
762 if (bitsByte23[2])
763 {
764 writer.Write(bitsByte24);
765 }
766 if (bitsByte23[0])
767 {
768 writer.Write(projectile.ai[0]);
769 }
770 if (bitsByte23[1])
771 {
772 writer.Write(projectile.ai[1]);
773 }
774 if (bitsByte23[3])
775 {
776 writer.Write((ushort)projectile.bannerIdToRespondTo);
777 }
778 if (bitsByte23[4])
779 {
780 writer.Write((short)projectile.damage);
781 }
782 if (bitsByte23[5])
783 {
784 writer.Write(projectile.knockBack);
785 }
786 if (bitsByte23[6])
787 {
788 writer.Write((short)projectile.originalDamage);
789 }
790 if (bitsByte23[7])
791 {
792 writer.Write((short)projectile.projUUID);
793 }
794 if (bitsByte24[0])
795 {
796 writer.Write(projectile.ai[2]);
797 }
798 break;
799 }
800 case 28:
801 writer.Write((short)number);
802 writer.Write((short)number2);
803 writer.Write(number3);
804 writer.Write((byte)(number4 + 1f));
805 writer.Write((byte)number5);
806 break;
807 case 29:
808 writer.Write((short)number);
809 writer.Write((byte)number2);
810 break;
811 case 30:
812 writer.Write((byte)number);
813 writer.Write(Main.player[number].hostile);
814 break;
815 case 31:
816 writer.Write((short)number);
817 writer.Write((short)number2);
818 break;
819 case 32:
820 {
821 Item item7 = Main.chest[number].item[(byte)number2];
822 writer.Write((short)number);
823 writer.Write((byte)number2);
824 short value4 = (short)item7.netID;
825 if (item7.Name == null)
826 {
827 value4 = 0;
828 }
829 writer.Write((short)item7.stack);
830 writer.Write(item7.prefix);
831 writer.Write(value4);
832 break;
833 }
834 case 33:
835 {
836 int num5 = 0;
837 int num6 = 0;
838 int num7 = 0;
839 string text2 = null;
840 if (number > -1)
841 {
842 num5 = Main.chest[number].x;
843 num6 = Main.chest[number].y;
844 }
845 if (number2 == 1f)
846 {
847 string text3 = text.ToString();
848 num7 = (byte)text3.Length;
849 if (num7 == 0 || num7 > 20)
850 {
851 num7 = 255;
852 }
853 else
854 {
855 text2 = text3;
856 }
857 }
858 writer.Write((short)number);
859 writer.Write((short)num5);
860 writer.Write((short)num6);
861 writer.Write((byte)num7);
862 if (text2 != null)
863 {
864 writer.Write(text2);
865 }
866 break;
867 }
868 case 34:
869 writer.Write((byte)number);
870 writer.Write((short)number2);
871 writer.Write((short)number3);
872 writer.Write((short)number4);
873 if (Main.netMode == 2)
874 {
875 Netplay.GetSectionX((int)number2);
876 Netplay.GetSectionY((int)number3);
877 writer.Write((short)number5);
878 }
879 else
880 {
881 writer.Write((short)0);
882 }
883 break;
884 case 35:
885 writer.Write((byte)number);
886 writer.Write((short)number2);
887 break;
888 case 36:
889 {
890 Player player3 = Main.player[number];
891 writer.Write((byte)number);
892 writer.Write(player3.zone1);
893 writer.Write(player3.zone2);
894 writer.Write(player3.zone3);
895 writer.Write(player3.zone4);
896 writer.Write(player3.zone5);
897 break;
898 }
899 case 38:
901 break;
902 case 39:
903 writer.Write((short)number);
904 break;
905 case 40:
906 writer.Write((byte)number);
907 writer.Write((short)Main.player[number].talkNPC);
908 break;
909 case 41:
910 writer.Write((byte)number);
911 writer.Write(Main.player[number].itemRotation);
912 writer.Write((short)Main.player[number].itemAnimation);
913 break;
914 case 42:
915 writer.Write((byte)number);
916 writer.Write((short)Main.player[number].statMana);
917 writer.Write((short)Main.player[number].statManaMax);
918 break;
919 case 43:
920 writer.Write((byte)number);
921 writer.Write((short)number2);
922 break;
923 case 45:
924 writer.Write((byte)number);
925 writer.Write((byte)Main.player[number].team);
926 break;
927 case 46:
928 writer.Write((short)number);
929 writer.Write((short)number2);
930 break;
931 case 47:
932 writer.Write((short)number);
933 writer.Write((short)Main.sign[number].x);
934 writer.Write((short)Main.sign[number].y);
935 writer.Write(Main.sign[number].text);
936 writer.Write((byte)number2);
937 writer.Write((byte)number3);
938 break;
939 case 48:
940 {
941 Tile tile = Main.tile[number, (int)number2];
942 writer.Write((short)number);
943 writer.Write((short)number2);
944 writer.Write(tile.liquid);
945 writer.Write(tile.liquidType());
946 break;
947 }
948 case 50:
949 {
950 writer.Write((byte)number);
951 for (int l = 0; l < Player.maxBuffs; l++)
952 {
953 writer.Write((ushort)Main.player[number].buffType[l]);
954 }
955 break;
956 }
957 case 51:
958 writer.Write((byte)number);
959 writer.Write((byte)number2);
960 break;
961 case 52:
962 writer.Write((byte)number2);
963 writer.Write((short)number3);
964 writer.Write((short)number4);
965 break;
966 case 53:
967 writer.Write((short)number);
968 writer.Write((ushort)number2);
969 writer.Write((short)number3);
970 break;
971 case 54:
972 {
973 writer.Write((short)number);
974 for (int k = 0; k < NPC.maxBuffs; k++)
975 {
976 writer.Write((ushort)Main.npc[number].buffType[k]);
977 writer.Write((short)Main.npc[number].buffTime[k]);
978 }
979 break;
980 }
981 case 55:
982 writer.Write((byte)number);
983 writer.Write((ushort)number2);
984 writer.Write((int)number3);
985 break;
986 case 56:
987 writer.Write((short)number);
988 if (Main.netMode == 2)
989 {
990 string givenName = Main.npc[number].GivenName;
991 writer.Write(givenName);
992 writer.Write(Main.npc[number].townNpcVariationIndex);
993 }
994 break;
995 case 57:
996 writer.Write(WorldGen.tGood);
997 writer.Write(WorldGen.tEvil);
998 writer.Write(WorldGen.tBlood);
999 break;
1000 case 58:
1001 writer.Write((byte)number);
1002 writer.Write(number2);
1003 break;
1004 case 59:
1005 writer.Write((short)number);
1006 writer.Write((short)number2);
1007 break;
1008 case 60:
1009 writer.Write((short)number);
1010 writer.Write((short)number2);
1011 writer.Write((short)number3);
1012 writer.Write((byte)number4);
1013 break;
1014 case 61:
1015 writer.Write((short)number);
1016 writer.Write((short)number2);
1017 break;
1018 case 62:
1019 writer.Write((byte)number);
1020 writer.Write((byte)number2);
1021 break;
1022 case 63:
1023 case 64:
1024 writer.Write((short)number);
1025 writer.Write((short)number2);
1026 writer.Write((byte)number3);
1027 writer.Write((byte)number4);
1028 break;
1029 case 65:
1030 {
1031 BitsByte bitsByte29 = (byte)0;
1032 bitsByte29[0] = (number & 1) == 1;
1033 bitsByte29[1] = (number & 2) == 2;
1034 bitsByte29[2] = number6 == 1;
1035 bitsByte29[3] = number7 != 0;
1036 writer.Write(bitsByte29);
1037 writer.Write((short)number2);
1038 writer.Write(number3);
1039 writer.Write(number4);
1040 writer.Write((byte)number5);
1041 if (bitsByte29[3])
1042 {
1043 writer.Write(number7);
1044 }
1045 break;
1046 }
1047 case 66:
1048 writer.Write((byte)number);
1049 writer.Write((short)number2);
1050 break;
1051 case 68:
1052 writer.Write(Main.clientUUID);
1053 break;
1054 case 69:
1055 Netplay.GetSectionX((int)number2);
1056 Netplay.GetSectionY((int)number3);
1057 writer.Write((short)number);
1058 writer.Write((short)number2);
1059 writer.Write((short)number3);
1060 writer.Write(Main.chest[(short)number].name);
1061 break;
1062 case 70:
1063 writer.Write((short)number);
1064 writer.Write((byte)number2);
1065 break;
1066 case 71:
1067 writer.Write(number);
1068 writer.Write((int)number2);
1069 writer.Write((short)number3);
1070 writer.Write((byte)number4);
1071 break;
1072 case 72:
1073 {
1074 for (int num20 = 0; num20 < 40; num20++)
1075 {
1076 writer.Write((short)Main.travelShop[num20]);
1077 }
1078 break;
1079 }
1080 case 73:
1081 writer.Write((byte)number);
1082 break;
1083 case 74:
1084 {
1085 writer.Write((byte)Main.anglerQuest);
1086 bool value7 = Main.anglerWhoFinishedToday.Contains(text.ToString());
1087 writer.Write(value7);
1088 break;
1089 }
1090 case 76:
1091 writer.Write((byte)number);
1092 writer.Write(Main.player[number].anglerQuestsFinished);
1093 writer.Write(Main.player[number].golferScoreAccumulated);
1094 break;
1095 case 77:
1096 writer.Write((short)number);
1097 writer.Write((ushort)number2);
1098 writer.Write((short)number3);
1099 writer.Write((short)number4);
1100 break;
1101 case 78:
1102 writer.Write(number);
1103 writer.Write((int)number2);
1104 writer.Write((sbyte)number3);
1105 writer.Write((sbyte)number4);
1106 break;
1107 case 79:
1108 writer.Write((short)number);
1109 writer.Write((short)number2);
1110 writer.Write((short)number3);
1111 writer.Write((short)number4);
1112 writer.Write((byte)number5);
1113 writer.Write((sbyte)number6);
1114 writer.Write(number7 == 1);
1115 break;
1116 case 80:
1117 writer.Write((byte)number);
1118 writer.Write((short)number2);
1119 break;
1120 case 81:
1121 {
1122 writer.Write(number2);
1123 writer.Write(number3);
1124 Color c2 = default(Color);
1125 c2.PackedValue = (uint)number;
1126 writer.WriteRGB(c2);
1127 writer.Write((int)number4);
1128 break;
1129 }
1130 case 119:
1131 {
1132 writer.Write(number2);
1133 writer.Write(number3);
1134 Color c = default(Color);
1135 c.PackedValue = (uint)number;
1136 writer.WriteRGB(c);
1137 text.Serialize(writer);
1138 break;
1139 }
1140 case 83:
1141 {
1142 int num19 = number;
1143 if (num19 < 0 && num19 >= 290)
1144 {
1145 num19 = 1;
1146 }
1147 int value6 = NPC.killCount[num19];
1148 writer.Write((short)num19);
1149 writer.Write(value6);
1150 break;
1151 }
1152 case 84:
1153 {
1154 byte b5 = (byte)number;
1155 float stealth = Main.player[b5].stealth;
1156 writer.Write(b5);
1157 writer.Write(stealth);
1158 break;
1159 }
1160 case 85:
1161 {
1162 short value5 = (short)number;
1163 writer.Write(value5);
1164 break;
1165 }
1166 case 86:
1167 {
1168 writer.Write(number);
1169 bool flag3 = TileEntity.ByID.ContainsKey(number);
1170 writer.Write(flag3);
1171 if (flag3)
1172 {
1173 TileEntity.Write(writer, TileEntity.ByID[number], networkSend: true);
1174 }
1175 break;
1176 }
1177 case 87:
1178 writer.Write((short)number);
1179 writer.Write((short)number2);
1180 writer.Write((byte)number3);
1181 break;
1182 case 88:
1183 {
1184 BitsByte bitsByte = (byte)number2;
1185 BitsByte bitsByte2 = (byte)number3;
1186 writer.Write((short)number);
1187 writer.Write(bitsByte);
1188 Item item5 = Main.item[number];
1189 if (bitsByte[0])
1190 {
1191 writer.Write(item5.color.PackedValue);
1192 }
1193 if (bitsByte[1])
1194 {
1195 writer.Write((ushort)item5.damage);
1196 }
1197 if (bitsByte[2])
1198 {
1199 writer.Write(item5.knockBack);
1200 }
1201 if (bitsByte[3])
1202 {
1203 writer.Write((ushort)item5.useAnimation);
1204 }
1205 if (bitsByte[4])
1206 {
1207 writer.Write((ushort)item5.useTime);
1208 }
1209 if (bitsByte[5])
1210 {
1211 writer.Write((short)item5.shoot);
1212 }
1213 if (bitsByte[6])
1214 {
1215 writer.Write(item5.shootSpeed);
1216 }
1217 if (bitsByte[7])
1218 {
1219 writer.Write(bitsByte2);
1220 if (bitsByte2[0])
1221 {
1222 writer.Write((ushort)item5.width);
1223 }
1224 if (bitsByte2[1])
1225 {
1226 writer.Write((ushort)item5.height);
1227 }
1228 if (bitsByte2[2])
1229 {
1230 writer.Write(item5.scale);
1231 }
1232 if (bitsByte2[3])
1233 {
1234 writer.Write((short)item5.ammo);
1235 }
1236 if (bitsByte2[4])
1237 {
1238 writer.Write((short)item5.useAmmo);
1239 }
1240 if (bitsByte2[5])
1241 {
1242 writer.Write(item5.notAmmo);
1243 }
1244 }
1245 break;
1246 }
1247 case 89:
1248 {
1249 writer.Write((short)number);
1250 writer.Write((short)number2);
1251 Item item4 = Main.player[(int)number4].inventory[(int)number3];
1252 writer.Write((short)item4.netID);
1253 writer.Write(item4.prefix);
1254 writer.Write((short)number5);
1255 break;
1256 }
1257 case 91:
1258 writer.Write(number);
1259 writer.Write((byte)number2);
1260 if (number2 != 255f)
1261 {
1262 writer.Write((ushort)number3);
1263 writer.Write((ushort)number4);
1264 writer.Write((byte)number5);
1265 if (number5 < 0)
1266 {
1267 writer.Write((short)number6);
1268 }
1269 }
1270 break;
1271 case 92:
1272 writer.Write((short)number);
1273 writer.Write((int)number2);
1274 writer.Write(number3);
1275 writer.Write(number4);
1276 break;
1277 case 95:
1278 writer.Write((ushort)number);
1279 writer.Write((byte)number2);
1280 break;
1281 case 96:
1282 {
1283 writer.Write((byte)number);
1284 Player player2 = Main.player[number];
1285 writer.Write((short)number4);
1286 writer.Write(number2);
1287 writer.Write(number3);
1288 writer.WriteVector2(player2.velocity);
1289 break;
1290 }
1291 case 97:
1292 writer.Write((short)number);
1293 break;
1294 case 98:
1295 writer.Write((short)number);
1296 break;
1297 case 99:
1298 writer.Write((byte)number);
1299 writer.WriteVector2(Main.player[number].MinionRestTargetPoint);
1300 break;
1301 case 115:
1302 writer.Write((byte)number);
1303 writer.Write((short)Main.player[number].MinionAttackTargetNPC);
1304 break;
1305 case 100:
1306 {
1307 writer.Write((ushort)number);
1308 NPC nPC = Main.npc[number];
1309 writer.Write((short)number4);
1310 writer.Write(number2);
1311 writer.Write(number3);
1312 writer.WriteVector2(nPC.velocity);
1313 break;
1314 }
1315 case 101:
1316 writer.Write((ushort)NPC.ShieldStrengthTowerSolar);
1317 writer.Write((ushort)NPC.ShieldStrengthTowerVortex);
1318 writer.Write((ushort)NPC.ShieldStrengthTowerNebula);
1319 writer.Write((ushort)NPC.ShieldStrengthTowerStardust);
1320 break;
1321 case 102:
1322 writer.Write((byte)number);
1323 writer.Write((ushort)number2);
1324 writer.Write(number3);
1325 writer.Write(number4);
1326 break;
1327 case 103:
1330 break;
1331 case 104:
1332 writer.Write((byte)number);
1333 writer.Write((short)number2);
1334 writer.Write(((short)number3 < 0) ? 0f : number3);
1335 writer.Write((byte)number4);
1336 writer.Write(number5);
1337 writer.Write((byte)number6);
1338 break;
1339 case 105:
1340 writer.Write((short)number);
1341 writer.Write((short)number2);
1342 writer.Write(number3 == 1f);
1343 break;
1344 case 106:
1345 writer.Write(new HalfVector2(number, number2).PackedValue);
1346 break;
1347 case 108:
1348 writer.Write((short)number);
1349 writer.Write(number2);
1350 writer.Write((short)number3);
1351 writer.Write((short)number4);
1352 writer.Write((short)number5);
1353 writer.Write((short)number6);
1354 writer.Write((byte)number7);
1355 break;
1356 case 109:
1357 writer.Write((short)number);
1358 writer.Write((short)number2);
1359 writer.Write((short)number3);
1360 writer.Write((short)number4);
1361 writer.Write((byte)number5);
1362 break;
1363 case 110:
1364 writer.Write((short)number);
1365 writer.Write((short)number2);
1366 writer.Write((byte)number3);
1367 break;
1368 case 112:
1369 writer.Write((byte)number);
1370 writer.Write((int)number2);
1371 writer.Write((int)number3);
1372 writer.Write((byte)number4);
1373 writer.Write((short)number5);
1374 break;
1375 case 113:
1376 writer.Write((short)number);
1377 writer.Write((short)number2);
1378 break;
1379 case 116:
1380 writer.Write(number);
1381 break;
1382 case 117:
1383 writer.Write((byte)number);
1384 _currentPlayerDeathReason.WriteSelfTo(writer);
1385 writer.Write((short)number2);
1386 writer.Write((byte)(number3 + 1f));
1387 writer.Write((byte)number4);
1388 writer.Write((sbyte)number5);
1389 break;
1390 case 118:
1391 writer.Write((byte)number);
1392 _currentPlayerDeathReason.WriteSelfTo(writer);
1393 writer.Write((short)number2);
1394 writer.Write((byte)(number3 + 1f));
1395 writer.Write((byte)number4);
1396 break;
1397 case 120:
1398 writer.Write((byte)number);
1399 writer.Write((byte)number2);
1400 break;
1401 case 121:
1402 {
1403 int num3 = (int)number3;
1404 bool flag2 = number4 == 1f;
1405 if (flag2)
1406 {
1407 num3 += 8;
1408 }
1409 writer.Write((byte)number);
1410 writer.Write((int)number2);
1411 writer.Write((byte)num3);
1412 if (TileEntity.ByID[(int)number2] is TEDisplayDoll tEDisplayDoll)
1413 {
1414 tEDisplayDoll.WriteItem((int)number3, writer, flag2);
1415 break;
1416 }
1417 writer.Write(0);
1418 writer.Write((byte)0);
1419 break;
1420 }
1421 case 122:
1422 writer.Write(number);
1423 writer.Write((byte)number2);
1424 break;
1425 case 123:
1426 {
1427 writer.Write((short)number);
1428 writer.Write((short)number2);
1429 Item item2 = Main.player[(int)number4].inventory[(int)number3];
1430 writer.Write((short)item2.netID);
1431 writer.Write(item2.prefix);
1432 writer.Write((short)number5);
1433 break;
1434 }
1435 case 124:
1436 {
1437 int num2 = (int)number3;
1438 bool flag = number4 == 1f;
1439 if (flag)
1440 {
1441 num2 += 2;
1442 }
1443 writer.Write((byte)number);
1444 writer.Write((int)number2);
1445 writer.Write((byte)num2);
1446 if (TileEntity.ByID[(int)number2] is TEHatRack tEHatRack)
1447 {
1448 tEHatRack.WriteItem((int)number3, writer, flag);
1449 break;
1450 }
1451 writer.Write(0);
1452 writer.Write((byte)0);
1453 break;
1454 }
1455 case 125:
1456 writer.Write((byte)number);
1457 writer.Write((short)number2);
1458 writer.Write((short)number3);
1459 writer.Write((byte)number4);
1460 break;
1461 case 126:
1462 _currentRevengeMarker.WriteSelfTo(writer);
1463 break;
1464 case 127:
1465 writer.Write(number);
1466 break;
1467 case 128:
1468 writer.Write((byte)number);
1469 writer.Write((ushort)number5);
1470 writer.Write((ushort)number6);
1471 writer.Write((ushort)number2);
1472 writer.Write((ushort)number3);
1473 break;
1474 case 130:
1475 writer.Write((ushort)number);
1476 writer.Write((ushort)number2);
1477 writer.Write((short)number3);
1478 break;
1479 case 131:
1480 {
1481 writer.Write((ushort)number);
1482 writer.Write((byte)number2);
1483 byte b = (byte)number2;
1484 if (b == 1)
1485 {
1486 writer.Write((int)number3);
1487 writer.Write((short)number4);
1488 }
1489 break;
1490 }
1491 case 132:
1492 _currentNetSoundInfo.WriteSelfTo(writer);
1493 break;
1494 case 133:
1495 {
1496 writer.Write((short)number);
1497 writer.Write((short)number2);
1498 Item item = Main.player[(int)number4].inventory[(int)number3];
1499 writer.Write((short)item.netID);
1500 writer.Write(item.prefix);
1501 writer.Write((short)number5);
1502 break;
1503 }
1504 case 134:
1505 {
1506 writer.Write((byte)number);
1507 Player player = Main.player[number];
1508 writer.Write(player.ladyBugLuckTimeLeft);
1509 writer.Write(player.torchLuck);
1510 writer.Write(player.luckPotion);
1511 writer.Write(player.HasGardenGnomeNearby);
1512 writer.Write(player.equipmentBasedLuckBonus);
1513 writer.Write(player.coinLuck);
1514 break;
1515 }
1516 case 135:
1517 writer.Write((byte)number);
1518 break;
1519 case 136:
1520 {
1521 for (int i = 0; i < 2; i++)
1522 {
1523 for (int j = 0; j < 3; j++)
1524 {
1525 writer.Write((ushort)NPC.cavernMonsterType[i, j]);
1526 }
1527 }
1528 break;
1529 }
1530 case 137:
1531 writer.Write((short)number);
1532 writer.Write((ushort)number2);
1533 break;
1534 case 139:
1535 {
1536 writer.Write((byte)number);
1537 bool value = number2 == 1f;
1538 writer.Write(value);
1539 break;
1540 }
1541 case 140:
1542 writer.Write((byte)number);
1543 writer.Write((int)number2);
1544 break;
1545 case 141:
1546 writer.Write((byte)number);
1547 writer.Write((byte)number2);
1548 writer.Write(number3);
1549 writer.Write(number4);
1550 writer.Write(number5);
1551 writer.Write(number6);
1552 break;
1553 case 142:
1554 {
1555 writer.Write((byte)number);
1556 Player obj = Main.player[number];
1557 obj.piggyBankProjTracker.Write(writer);
1558 obj.voidLensChest.Write(writer);
1559 break;
1560 }
1561 case 146:
1562 writer.Write((byte)number);
1563 switch (number)
1564 {
1565 case 0:
1566 writer.WriteVector2(new Vector2((int)number2, (int)number3));
1567 break;
1568 case 1:
1569 writer.WriteVector2(new Vector2((int)number2, (int)number3));
1570 writer.Write((int)number4);
1571 break;
1572 case 2:
1573 writer.Write((int)number2);
1574 break;
1575 }
1576 break;
1577 case 147:
1578 writer.Write((byte)number);
1579 writer.Write((byte)number2);
1580 WriteAccessoryVisibility(writer, Main.player[number].hideVisibleAccessory);
1581 break;
1582 }
1583 int num21 = (int)writer.BaseStream.Position;
1584 if (num21 > 65535)
1585 {
1586 throw new Exception("Maximum packet length exceeded. id: " + msgType + " length: " + num21);
1587 }
1588 writer.BaseStream.Position = position;
1589 writer.Write((ushort)num21);
1590 writer.BaseStream.Position = num21;
1591 if (Main.netMode == 1)
1592 {
1593 if (Netplay.Connection.Socket.IsConnected())
1594 {
1595 try
1596 {
1597 buffer[num].spamCount++;
1598 Main.ActiveNetDiagnosticsUI.CountSentMessage(msgType, num21);
1599 Netplay.Connection.Socket.AsyncSend(buffer[num].writeBuffer, 0, num21, Netplay.Connection.ClientWriteCallBack);
1600 }
1601 catch
1602 {
1603 }
1604 }
1605 }
1606 else if (remoteClient == -1)
1607 {
1608 switch (msgType)
1609 {
1610 case 34:
1611 case 69:
1612 {
1613 for (int num23 = 0; num23 < 256; num23++)
1614 {
1615 if (num23 != ignoreClient && buffer[num23].broadcast && Netplay.Clients[num23].IsConnected())
1616 {
1617 try
1618 {
1619 buffer[num23].spamCount++;
1620 Main.ActiveNetDiagnosticsUI.CountSentMessage(msgType, num21);
1621 Netplay.Clients[num23].Socket.AsyncSend(buffer[num].writeBuffer, 0, num21, Netplay.Clients[num23].ServerWriteCallBack);
1622 }
1623 catch
1624 {
1625 }
1626 }
1627 }
1628 break;
1629 }
1630 case 20:
1631 {
1632 for (int num27 = 0; num27 < 256; num27++)
1633 {
1634 if (num27 != ignoreClient && buffer[num27].broadcast && Netplay.Clients[num27].IsConnected() && Netplay.Clients[num27].SectionRange((int)Math.Max(number3, number4), number, (int)number2))
1635 {
1636 try
1637 {
1638 buffer[num27].spamCount++;
1639 Main.ActiveNetDiagnosticsUI.CountSentMessage(msgType, num21);
1640 Netplay.Clients[num27].Socket.AsyncSend(buffer[num].writeBuffer, 0, num21, Netplay.Clients[num27].ServerWriteCallBack);
1641 }
1642 catch
1643 {
1644 }
1645 }
1646 }
1647 break;
1648 }
1649 case 23:
1650 {
1651 NPC nPC4 = Main.npc[number];
1652 for (int num28 = 0; num28 < 256; num28++)
1653 {
1654 if (num28 == ignoreClient || !buffer[num28].broadcast || !Netplay.Clients[num28].IsConnected())
1655 {
1656 continue;
1657 }
1658 bool flag6 = false;
1659 if (nPC4.boss || nPC4.netAlways || nPC4.townNPC || !nPC4.active)
1660 {
1661 flag6 = true;
1662 }
1663 else if (nPC4.netSkip <= 0)
1664 {
1665 Rectangle rect5 = Main.player[num28].getRect();
1666 Rectangle rect6 = nPC4.getRect();
1667 rect6.X -= 2500;
1668 rect6.Y -= 2500;
1669 rect6.Width += 5000;
1670 rect6.Height += 5000;
1671 if (rect5.Intersects(rect6))
1672 {
1673 flag6 = true;
1674 }
1675 }
1676 else
1677 {
1678 flag6 = true;
1679 }
1680 if (flag6)
1681 {
1682 try
1683 {
1684 buffer[num28].spamCount++;
1685 Main.ActiveNetDiagnosticsUI.CountSentMessage(msgType, num21);
1686 Netplay.Clients[num28].Socket.AsyncSend(buffer[num].writeBuffer, 0, num21, Netplay.Clients[num28].ServerWriteCallBack);
1687 }
1688 catch
1689 {
1690 }
1691 }
1692 }
1693 nPC4.netSkip++;
1694 if (nPC4.netSkip > 4)
1695 {
1696 nPC4.netSkip = 0;
1697 }
1698 break;
1699 }
1700 case 28:
1701 {
1702 NPC nPC3 = Main.npc[number];
1703 for (int num25 = 0; num25 < 256; num25++)
1704 {
1705 if (num25 == ignoreClient || !buffer[num25].broadcast || !Netplay.Clients[num25].IsConnected())
1706 {
1707 continue;
1708 }
1709 bool flag5 = false;
1710 if (nPC3.life <= 0)
1711 {
1712 flag5 = true;
1713 }
1714 else
1715 {
1716 Rectangle rect3 = Main.player[num25].getRect();
1717 Rectangle rect4 = nPC3.getRect();
1718 rect4.X -= 3000;
1719 rect4.Y -= 3000;
1720 rect4.Width += 6000;
1721 rect4.Height += 6000;
1722 if (rect3.Intersects(rect4))
1723 {
1724 flag5 = true;
1725 }
1726 }
1727 if (flag5)
1728 {
1729 try
1730 {
1731 buffer[num25].spamCount++;
1732 Main.ActiveNetDiagnosticsUI.CountSentMessage(msgType, num21);
1733 Netplay.Clients[num25].Socket.AsyncSend(buffer[num].writeBuffer, 0, num21, Netplay.Clients[num25].ServerWriteCallBack);
1734 }
1735 catch
1736 {
1737 }
1738 }
1739 }
1740 break;
1741 }
1742 case 13:
1743 {
1744 for (int num26 = 0; num26 < 256; num26++)
1745 {
1746 if (num26 != ignoreClient && buffer[num26].broadcast && Netplay.Clients[num26].IsConnected())
1747 {
1748 try
1749 {
1750 buffer[num26].spamCount++;
1751 Main.ActiveNetDiagnosticsUI.CountSentMessage(msgType, num21);
1752 Netplay.Clients[num26].Socket.AsyncSend(buffer[num].writeBuffer, 0, num21, Netplay.Clients[num26].ServerWriteCallBack);
1753 }
1754 catch
1755 {
1756 }
1757 }
1758 }
1759 Main.player[number].netSkip++;
1760 if (Main.player[number].netSkip > 2)
1761 {
1762 Main.player[number].netSkip = 0;
1763 }
1764 break;
1765 }
1766 case 27:
1767 {
1768 Projectile projectile2 = Main.projectile[number];
1769 for (int num24 = 0; num24 < 256; num24++)
1770 {
1771 if (num24 == ignoreClient || !buffer[num24].broadcast || !Netplay.Clients[num24].IsConnected())
1772 {
1773 continue;
1774 }
1775 bool flag4 = false;
1776 if (projectile2.type == 12 || Main.projPet[projectile2.type] || projectile2.aiStyle == 11 || projectile2.netImportant)
1777 {
1778 flag4 = true;
1779 }
1780 else
1781 {
1782 Rectangle rect = Main.player[num24].getRect();
1783 Rectangle rect2 = projectile2.getRect();
1784 rect2.X -= 5000;
1785 rect2.Y -= 5000;
1786 rect2.Width += 10000;
1787 rect2.Height += 10000;
1788 if (rect.Intersects(rect2))
1789 {
1790 flag4 = true;
1791 }
1792 }
1793 if (flag4)
1794 {
1795 try
1796 {
1797 buffer[num24].spamCount++;
1798 Main.ActiveNetDiagnosticsUI.CountSentMessage(msgType, num21);
1799 Netplay.Clients[num24].Socket.AsyncSend(buffer[num].writeBuffer, 0, num21, Netplay.Clients[num24].ServerWriteCallBack);
1800 }
1801 catch
1802 {
1803 }
1804 }
1805 }
1806 break;
1807 }
1808 default:
1809 {
1810 for (int num22 = 0; num22 < 256; num22++)
1811 {
1812 if (num22 != ignoreClient && (buffer[num22].broadcast || (Netplay.Clients[num22].State >= 3 && msgType == 10)) && Netplay.Clients[num22].IsConnected())
1813 {
1814 try
1815 {
1816 buffer[num22].spamCount++;
1817 Main.ActiveNetDiagnosticsUI.CountSentMessage(msgType, num21);
1818 Netplay.Clients[num22].Socket.AsyncSend(buffer[num].writeBuffer, 0, num21, Netplay.Clients[num22].ServerWriteCallBack);
1819 }
1820 catch
1821 {
1822 }
1823 }
1824 }
1825 break;
1826 }
1827 }
1828 }
1829 else if (Netplay.Clients[remoteClient].IsConnected())
1830 {
1831 try
1832 {
1833 buffer[remoteClient].spamCount++;
1834 Main.ActiveNetDiagnosticsUI.CountSentMessage(msgType, num21);
1835 Netplay.Clients[remoteClient].Socket.AsyncSend(buffer[num].writeBuffer, 0, num21, Netplay.Clients[remoteClient].ServerWriteCallBack);
1836 }
1837 catch
1838 {
1839 }
1840 }
1841 if (Main.verboseNetplay)
1842 {
1843 for (int num29 = 0; num29 < num21; num29++)
1844 {
1845 }
1846 for (int num30 = 0; num30 < num21; num30++)
1847 {
1848 _ = buffer[num].writeBuffer[num30];
1849 }
1850 }
1851 buffer[num].writeLocked = false;
1852 if (msgType == 2 && Main.netMode == 2)
1853 {
1854 Netplay.Clients[num].PendingTermination = true;
1855 Netplay.Clients[num].PendingTerminationApproved = true;
1856 }
1857 }
1858 }
1859
1860 private static void WriteAccessoryVisibility(BinaryWriter writer, bool[] hideVisibleAccessory)
1861 {
1862 ushort num = 0;
1863 for (int i = 0; i < hideVisibleAccessory.Length; i++)
1864 {
1865 if (hideVisibleAccessory[i])
1866 {
1867 num |= (ushort)(1 << i);
1868 }
1869 }
1870 writer.Write(num);
1871 }
1872
1873 public static void CompressTileBlock(int xStart, int yStart, short width, short height, Stream stream)
1874 {
1875 //IL_0004: Unknown result type (might be due to invalid IL or missing references)
1876 //IL_000a: Expected O, but got Unknown
1877 DeflateStream val = new DeflateStream(stream, (CompressionMode)0, true);
1878 try
1879 {
1880 BinaryWriter binaryWriter = new BinaryWriter((Stream)(object)val);
1881 binaryWriter.Write(xStart);
1882 binaryWriter.Write(yStart);
1883 binaryWriter.Write(width);
1884 binaryWriter.Write(height);
1885 CompressTileBlock_Inner(binaryWriter, xStart, yStart, width, height);
1886 }
1887 finally
1888 {
1889 ((IDisposable)val)?.Dispose();
1890 }
1891 }
1892
1893 public static void CompressTileBlock_Inner(BinaryWriter writer, int xStart, int yStart, int width, int height)
1894 {
1895 short num = 0;
1896 short num2 = 0;
1897 short num3 = 0;
1898 short num4 = 0;
1899 int num5 = 0;
1900 int num6 = 0;
1901 byte b = 0;
1902 byte[] array = new byte[16];
1903 Tile tile = null;
1904 for (int i = yStart; i < yStart + height; i++)
1905 {
1906 for (int j = xStart; j < xStart + width; j++)
1907 {
1908 Tile tile2 = Main.tile[j, i];
1909 if (tile2.isTheSameAs(tile) && TileID.Sets.AllowsSaveCompressionBatching[tile2.type])
1910 {
1911 num4++;
1912 continue;
1913 }
1914 if (tile != null)
1915 {
1916 if (num4 > 0)
1917 {
1918 array[num5] = (byte)((uint)num4 & 0xFFu);
1919 num5++;
1920 if (num4 > 255)
1921 {
1922 b = (byte)(b | 0x80u);
1923 array[num5] = (byte)((num4 & 0xFF00) >> 8);
1924 num5++;
1925 }
1926 else
1927 {
1928 b = (byte)(b | 0x40u);
1929 }
1930 }
1931 array[num6] = b;
1932 writer.Write(array, num6, num5 - num6);
1933 num4 = 0;
1934 }
1935 num5 = 4;
1936 byte b3;
1937 byte b2;
1938 byte b4;
1939 b = (b4 = (b3 = (b2 = 0)));
1940 if (tile2.active())
1941 {
1942 b = (byte)(b | 2u);
1943 array[num5] = (byte)tile2.type;
1944 num5++;
1945 if (tile2.type > 255)
1946 {
1947 array[num5] = (byte)(tile2.type >> 8);
1948 num5++;
1949 b = (byte)(b | 0x20u);
1950 }
1951 if (TileID.Sets.BasicChest[tile2.type] && tile2.frameX % 36 == 0 && tile2.frameY % 36 == 0)
1952 {
1953 short num7 = (short)Chest.FindChest(j, i);
1954 if (num7 != -1)
1955 {
1956 _compressChestList[num] = num7;
1957 num++;
1958 }
1959 }
1960 if (tile2.type == 88 && tile2.frameX % 54 == 0 && tile2.frameY % 36 == 0)
1961 {
1962 short num8 = (short)Chest.FindChest(j, i);
1963 if (num8 != -1)
1964 {
1965 _compressChestList[num] = num8;
1966 num++;
1967 }
1968 }
1969 if (tile2.type == 85 && tile2.frameX % 36 == 0 && tile2.frameY % 36 == 0)
1970 {
1971 short num9 = (short)Sign.ReadSign(j, i);
1972 if (num9 != -1)
1973 {
1974 _compressSignList[num2++] = num9;
1975 }
1976 }
1977 if (tile2.type == 55 && tile2.frameX % 36 == 0 && tile2.frameY % 36 == 0)
1978 {
1979 short num10 = (short)Sign.ReadSign(j, i);
1980 if (num10 != -1)
1981 {
1982 _compressSignList[num2++] = num10;
1983 }
1984 }
1985 if (tile2.type == 425 && tile2.frameX % 36 == 0 && tile2.frameY % 36 == 0)
1986 {
1987 short num11 = (short)Sign.ReadSign(j, i);
1988 if (num11 != -1)
1989 {
1990 _compressSignList[num2++] = num11;
1991 }
1992 }
1993 if (tile2.type == 573 && tile2.frameX % 36 == 0 && tile2.frameY % 36 == 0)
1994 {
1995 short num12 = (short)Sign.ReadSign(j, i);
1996 if (num12 != -1)
1997 {
1998 _compressSignList[num2++] = num12;
1999 }
2000 }
2001 if (tile2.type == 378 && tile2.frameX % 36 == 0 && tile2.frameY == 0)
2002 {
2003 int num13 = TETrainingDummy.Find(j, i);
2004 if (num13 != -1)
2005 {
2006 _compressEntities[num3++] = (short)num13;
2007 }
2008 }
2009 if (tile2.type == 395 && tile2.frameX % 36 == 0 && tile2.frameY == 0)
2010 {
2011 int num14 = TEItemFrame.Find(j, i);
2012 if (num14 != -1)
2013 {
2014 _compressEntities[num3++] = (short)num14;
2015 }
2016 }
2017 if (tile2.type == 520 && tile2.frameX % 18 == 0 && tile2.frameY == 0)
2018 {
2019 int num15 = TEFoodPlatter.Find(j, i);
2020 if (num15 != -1)
2021 {
2022 _compressEntities[num3++] = (short)num15;
2023 }
2024 }
2025 if (tile2.type == 471 && tile2.frameX % 54 == 0 && tile2.frameY == 0)
2026 {
2027 int num16 = TEWeaponsRack.Find(j, i);
2028 if (num16 != -1)
2029 {
2030 _compressEntities[num3++] = (short)num16;
2031 }
2032 }
2033 if (tile2.type == 470 && tile2.frameX % 36 == 0 && tile2.frameY == 0)
2034 {
2035 int num17 = TEDisplayDoll.Find(j, i);
2036 if (num17 != -1)
2037 {
2038 _compressEntities[num3++] = (short)num17;
2039 }
2040 }
2041 if (tile2.type == 475 && tile2.frameX % 54 == 0 && tile2.frameY == 0)
2042 {
2043 int num18 = TEHatRack.Find(j, i);
2044 if (num18 != -1)
2045 {
2046 _compressEntities[num3++] = (short)num18;
2047 }
2048 }
2049 if (tile2.type == 597 && tile2.frameX % 54 == 0 && tile2.frameY % 72 == 0)
2050 {
2051 int num19 = TETeleportationPylon.Find(j, i);
2052 if (num19 != -1)
2053 {
2054 _compressEntities[num3++] = (short)num19;
2055 }
2056 }
2057 if (Main.tileFrameImportant[tile2.type])
2058 {
2059 array[num5] = (byte)((uint)tile2.frameX & 0xFFu);
2060 num5++;
2061 array[num5] = (byte)((tile2.frameX & 0xFF00) >> 8);
2062 num5++;
2063 array[num5] = (byte)((uint)tile2.frameY & 0xFFu);
2064 num5++;
2065 array[num5] = (byte)((tile2.frameY & 0xFF00) >> 8);
2066 num5++;
2067 }
2068 if (tile2.color() != 0)
2069 {
2070 b3 = (byte)(b3 | 8u);
2071 array[num5] = tile2.color();
2072 num5++;
2073 }
2074 }
2075 if (tile2.wall != 0)
2076 {
2077 b = (byte)(b | 4u);
2078 array[num5] = (byte)tile2.wall;
2079 num5++;
2080 if (tile2.wallColor() != 0)
2081 {
2082 b3 = (byte)(b3 | 0x10u);
2083 array[num5] = tile2.wallColor();
2084 num5++;
2085 }
2086 }
2087 if (tile2.liquid != 0)
2088 {
2089 if (!tile2.shimmer())
2090 {
2091 b = (tile2.lava() ? ((byte)(b | 0x10u)) : ((!tile2.honey()) ? ((byte)(b | 8u)) : ((byte)(b | 0x18u))));
2092 }
2093 else
2094 {
2095 b3 = (byte)(b3 | 0x80u);
2096 b = (byte)(b | 8u);
2097 }
2098 array[num5] = tile2.liquid;
2099 num5++;
2100 }
2101 if (tile2.wire())
2102 {
2103 b4 = (byte)(b4 | 2u);
2104 }
2105 if (tile2.wire2())
2106 {
2107 b4 = (byte)(b4 | 4u);
2108 }
2109 if (tile2.wire3())
2110 {
2111 b4 = (byte)(b4 | 8u);
2112 }
2113 int num20 = (tile2.halfBrick() ? 16 : ((tile2.slope() != 0) ? (tile2.slope() + 1 << 4) : 0));
2114 b4 |= (byte)num20;
2115 if (tile2.actuator())
2116 {
2117 b3 = (byte)(b3 | 2u);
2118 }
2119 if (tile2.inActive())
2120 {
2121 b3 = (byte)(b3 | 4u);
2122 }
2123 if (tile2.wire4())
2124 {
2125 b3 = (byte)(b3 | 0x20u);
2126 }
2127 if (tile2.wall > 255)
2128 {
2129 array[num5] = (byte)(tile2.wall >> 8);
2130 num5++;
2131 b3 = (byte)(b3 | 0x40u);
2132 }
2133 if (tile2.invisibleBlock())
2134 {
2135 b2 = (byte)(b2 | 2u);
2136 }
2137 if (tile2.invisibleWall())
2138 {
2139 b2 = (byte)(b2 | 4u);
2140 }
2141 if (tile2.fullbrightBlock())
2142 {
2143 b2 = (byte)(b2 | 8u);
2144 }
2145 if (tile2.fullbrightWall())
2146 {
2147 b2 = (byte)(b2 | 0x10u);
2148 }
2149 num6 = 3;
2150 if (b2 != 0)
2151 {
2152 b3 = (byte)(b3 | 1u);
2153 array[num6] = b2;
2154 num6--;
2155 }
2156 if (b3 != 0)
2157 {
2158 b4 = (byte)(b4 | 1u);
2159 array[num6] = b3;
2160 num6--;
2161 }
2162 if (b4 != 0)
2163 {
2164 b = (byte)(b | 1u);
2165 array[num6] = b4;
2166 num6--;
2167 }
2168 tile = tile2;
2169 }
2170 }
2171 if (num4 > 0)
2172 {
2173 array[num5] = (byte)((uint)num4 & 0xFFu);
2174 num5++;
2175 if (num4 > 255)
2176 {
2177 b = (byte)(b | 0x80u);
2178 array[num5] = (byte)((num4 & 0xFF00) >> 8);
2179 num5++;
2180 }
2181 else
2182 {
2183 b = (byte)(b | 0x40u);
2184 }
2185 }
2186 array[num6] = b;
2187 writer.Write(array, num6, num5 - num6);
2188 writer.Write(num);
2189 for (int k = 0; k < num; k++)
2190 {
2191 Chest chest = Main.chest[_compressChestList[k]];
2192 writer.Write(_compressChestList[k]);
2193 writer.Write((short)chest.x);
2194 writer.Write((short)chest.y);
2195 writer.Write(chest.name);
2196 }
2197 writer.Write(num2);
2198 for (int l = 0; l < num2; l++)
2199 {
2200 Sign sign = Main.sign[_compressSignList[l]];
2201 writer.Write(_compressSignList[l]);
2202 writer.Write((short)sign.x);
2203 writer.Write((short)sign.y);
2204 writer.Write(sign.text);
2205 }
2206 writer.Write(num3);
2207 for (int m = 0; m < num3; m++)
2208 {
2210 }
2211 }
2212
2214 {
2215 //IL_0003: Unknown result type (might be due to invalid IL or missing references)
2216 //IL_0009: Expected O, but got Unknown
2217 DeflateStream val = new DeflateStream(stream, (CompressionMode)1, true);
2218 try
2219 {
2220 BinaryReader binaryReader = new BinaryReader((Stream)(object)val);
2221 DecompressTileBlock_Inner(binaryReader, binaryReader.ReadInt32(), binaryReader.ReadInt32(), binaryReader.ReadInt16(), binaryReader.ReadInt16());
2222 }
2223 finally
2224 {
2225 ((IDisposable)val)?.Dispose();
2226 }
2227 }
2228
2229 public static void DecompressTileBlock_Inner(BinaryReader reader, int xStart, int yStart, int width, int height)
2230 {
2231 Tile tile = null;
2232 int num = 0;
2233 for (int i = yStart; i < yStart + height; i++)
2234 {
2235 for (int j = xStart; j < xStart + width; j++)
2236 {
2237 if (num != 0)
2238 {
2239 num--;
2240 if (Main.tile[j, i] == null)
2241 {
2242 Main.tile[j, i] = new Tile(tile);
2243 }
2244 else
2245 {
2246 Main.tile[j, i].CopyFrom(tile);
2247 }
2248 continue;
2249 }
2250 byte b2;
2251 byte b;
2252 byte b3 = (b2 = (b = 0));
2253 tile = Main.tile[j, i];
2254 if (tile == null)
2255 {
2256 tile = new Tile();
2257 Main.tile[j, i] = tile;
2258 }
2259 else
2260 {
2261 tile.ClearEverything();
2262 }
2263 byte b4 = reader.ReadByte();
2264 bool flag = false;
2265 if ((b4 & 1) == 1)
2266 {
2267 flag = true;
2268 b3 = reader.ReadByte();
2269 }
2270 bool flag2 = false;
2271 if (flag && (b3 & 1) == 1)
2272 {
2273 flag2 = true;
2274 b2 = reader.ReadByte();
2275 }
2276 if (flag2 && (b2 & 1) == 1)
2277 {
2278 b = reader.ReadByte();
2279 }
2280 bool flag3 = tile.active();
2281 byte b5;
2282 if ((b4 & 2) == 2)
2283 {
2284 tile.active(active: true);
2285 ushort type = tile.type;
2286 int num2;
2287 if ((b4 & 0x20) == 32)
2288 {
2289 b5 = reader.ReadByte();
2290 num2 = reader.ReadByte();
2291 num2 = (num2 << 8) | b5;
2292 }
2293 else
2294 {
2295 num2 = reader.ReadByte();
2296 }
2297 tile.type = (ushort)num2;
2298 if (Main.tileFrameImportant[num2])
2299 {
2300 tile.frameX = reader.ReadInt16();
2301 tile.frameY = reader.ReadInt16();
2302 }
2303 else if (!flag3 || tile.type != type)
2304 {
2305 tile.frameX = -1;
2306 tile.frameY = -1;
2307 }
2308 if ((b2 & 8) == 8)
2309 {
2310 tile.color(reader.ReadByte());
2311 }
2312 }
2313 if ((b4 & 4) == 4)
2314 {
2315 tile.wall = reader.ReadByte();
2316 if ((b2 & 0x10) == 16)
2317 {
2318 tile.wallColor(reader.ReadByte());
2319 }
2320 }
2321 b5 = (byte)((b4 & 0x18) >> 3);
2322 if (b5 != 0)
2323 {
2324 tile.liquid = reader.ReadByte();
2325 if ((b2 & 0x80) == 128)
2326 {
2327 tile.shimmer(shimmer: true);
2328 }
2329 else if (b5 > 1)
2330 {
2331 if (b5 == 2)
2332 {
2333 tile.lava(lava: true);
2334 }
2335 else
2336 {
2337 tile.honey(honey: true);
2338 }
2339 }
2340 }
2341 if (b3 > 1)
2342 {
2343 if ((b3 & 2) == 2)
2344 {
2345 tile.wire(wire: true);
2346 }
2347 if ((b3 & 4) == 4)
2348 {
2349 tile.wire2(wire2: true);
2350 }
2351 if ((b3 & 8) == 8)
2352 {
2353 tile.wire3(wire3: true);
2354 }
2355 b5 = (byte)((b3 & 0x70) >> 4);
2356 if (b5 != 0 && Main.tileSolid[tile.type])
2357 {
2358 if (b5 == 1)
2359 {
2360 tile.halfBrick(halfBrick: true);
2361 }
2362 else
2363 {
2364 tile.slope((byte)(b5 - 1));
2365 }
2366 }
2367 }
2368 if (b2 > 1)
2369 {
2370 if ((b2 & 2) == 2)
2371 {
2372 tile.actuator(actuator: true);
2373 }
2374 if ((b2 & 4) == 4)
2375 {
2376 tile.inActive(inActive: true);
2377 }
2378 if ((b2 & 0x20) == 32)
2379 {
2380 tile.wire4(wire4: true);
2381 }
2382 if ((b2 & 0x40) == 64)
2383 {
2384 b5 = reader.ReadByte();
2385 tile.wall = (ushort)((b5 << 8) | tile.wall);
2386 }
2387 }
2388 if (b > 1)
2389 {
2390 if ((b & 2) == 2)
2391 {
2392 tile.invisibleBlock(invisibleBlock: true);
2393 }
2394 if ((b & 4) == 4)
2395 {
2396 tile.invisibleWall(invisibleWall: true);
2397 }
2398 if ((b & 8) == 8)
2399 {
2400 tile.fullbrightBlock(fullbrightBlock: true);
2401 }
2402 if ((b & 0x10) == 16)
2403 {
2404 tile.fullbrightWall(fullbrightWall: true);
2405 }
2406 }
2407 num = (byte)((b4 & 0xC0) >> 6) switch
2408 {
2409 0 => 0,
2410 1 => reader.ReadByte(),
2411 _ => reader.ReadInt16(),
2412 };
2413 }
2414 }
2415 short num3 = reader.ReadInt16();
2416 for (int k = 0; k < num3; k++)
2417 {
2418 short num4 = reader.ReadInt16();
2419 short x = reader.ReadInt16();
2420 short y = reader.ReadInt16();
2421 string name = reader.ReadString();
2422 if (num4 >= 0 && num4 < 8000)
2423 {
2424 if (Main.chest[num4] == null)
2425 {
2426 Main.chest[num4] = new Chest();
2427 }
2428 Main.chest[num4].name = name;
2429 Main.chest[num4].x = x;
2430 Main.chest[num4].y = y;
2431 }
2432 }
2433 num3 = reader.ReadInt16();
2434 for (int l = 0; l < num3; l++)
2435 {
2436 short num5 = reader.ReadInt16();
2437 short x2 = reader.ReadInt16();
2438 short y2 = reader.ReadInt16();
2439 string text = reader.ReadString();
2440 if (num5 >= 0 && num5 < 1000)
2441 {
2442 if (Main.sign[num5] == null)
2443 {
2444 Main.sign[num5] = new Sign();
2445 }
2446 Main.sign[num5].text = text;
2447 Main.sign[num5].x = x2;
2448 Main.sign[num5].y = y2;
2449 }
2450 }
2451 num3 = reader.ReadInt16();
2452 for (int m = 0; m < num3; m++)
2453 {
2454 TileEntity tileEntity = TileEntity.Read(reader);
2455 TileEntity.ByID[tileEntity.ID] = tileEntity;
2456 TileEntity.ByPosition[tileEntity.Position] = tileEntity;
2457 }
2458 Main.sectionManager.SetTilesLoaded(xStart, yStart, xStart + width - 1, yStart + height - 1);
2459 }
2460
2461 public static void ReceiveBytes(byte[] bytes, int streamLength, int i = 256)
2462 {
2463 lock (buffer[i])
2464 {
2465 try
2466 {
2467 Buffer.BlockCopy(bytes, 0, buffer[i].readBuffer, buffer[i].totalData, streamLength);
2468 buffer[i].totalData += streamLength;
2469 buffer[i].checkBytes = true;
2470 }
2471 catch
2472 {
2473 if (Main.netMode == 1)
2474 {
2475 Main.menuMode = 15;
2476 Main.statusText = Language.GetTextValue("Error.BadHeaderBufferOverflow");
2477 Netplay.Disconnect = true;
2478 }
2479 else
2480 {
2481 Netplay.Clients[i].PendingTermination = true;
2482 }
2483 }
2484 }
2485 }
2486
2487 public static void CheckBytes(int bufferIndex = 256)
2488 {
2489 lock (buffer[bufferIndex])
2490 {
2491 if (Main.dedServ && Netplay.Clients[bufferIndex].PendingTermination)
2492 {
2493 Netplay.Clients[bufferIndex].PendingTerminationApproved = true;
2494 buffer[bufferIndex].checkBytes = false;
2495 return;
2496 }
2497 int num = 0;
2498 int num2 = buffer[bufferIndex].totalData;
2499 try
2500 {
2501 while (num2 >= 2)
2502 {
2503 int num3 = BitConverter.ToUInt16(buffer[bufferIndex].readBuffer, num);
2504 if (num2 >= num3)
2505 {
2506 long position = buffer[bufferIndex].reader.BaseStream.Position;
2507 buffer[bufferIndex].GetData(num + 2, num3 - 2, out var _);
2508 if (Main.dedServ && Netplay.Clients[bufferIndex].PendingTermination)
2509 {
2510 Netplay.Clients[bufferIndex].PendingTerminationApproved = true;
2511 buffer[bufferIndex].checkBytes = false;
2512 break;
2513 }
2514 buffer[bufferIndex].reader.BaseStream.Position = position + num3;
2515 num2 -= num3;
2516 num += num3;
2517 continue;
2518 }
2519 break;
2520 }
2521 }
2522 catch (Exception)
2523 {
2524 if (Main.dedServ && num < buffer.Length - 100)
2525 {
2526 Console.WriteLine(Language.GetTextValue("Error.NetMessageError", buffer[num + 2]));
2527 }
2528 num2 = 0;
2529 num = 0;
2530 }
2531 if (num2 != buffer[bufferIndex].totalData)
2532 {
2533 for (int i = 0; i < num2; i++)
2534 {
2535 buffer[bufferIndex].readBuffer[i] = buffer[bufferIndex].readBuffer[i + num];
2536 }
2537 buffer[bufferIndex].totalData = num2;
2538 }
2539 buffer[bufferIndex].checkBytes = false;
2540 }
2541 }
2542
2543 public static void BootPlayer(int plr, NetworkText msg)
2544 {
2545 SendData(2, plr, -1, msg);
2546 }
2547
2548 public static void SendObjectPlacement(int whoAmi, int x, int y, int type, int style, int alternative, int random, int direction)
2549 {
2550 int remoteClient;
2551 int ignoreClient;
2552 if (Main.netMode == 2)
2553 {
2554 remoteClient = -1;
2555 ignoreClient = whoAmi;
2556 }
2557 else
2558 {
2559 remoteClient = whoAmi;
2560 ignoreClient = -1;
2561 }
2562 SendData(79, remoteClient, ignoreClient, null, x, y, type, style, alternative, random, direction);
2563 }
2564
2565 public static void SendTemporaryAnimation(int whoAmi, int animationType, int tileType, int xCoord, int yCoord)
2566 {
2567 if (Main.netMode == 2)
2568 {
2569 SendData(77, whoAmi, -1, null, animationType, tileType, xCoord, yCoord);
2570 }
2571 }
2572
2573 public static void SendPlayerHurt(int playerTargetIndex, PlayerDeathReason reason, int damage, int direction, bool critical, bool pvp, int hitContext, int remoteClient = -1, int ignoreClient = -1)
2574 {
2576 BitsByte bitsByte = (byte)0;
2577 bitsByte[0] = critical;
2578 bitsByte[1] = pvp;
2579 SendData(117, remoteClient, ignoreClient, null, playerTargetIndex, damage, direction, (int)(byte)bitsByte, hitContext);
2580 }
2581
2582 public static void SendPlayerDeath(int playerTargetIndex, PlayerDeathReason reason, int damage, int direction, bool pvp, int remoteClient = -1, int ignoreClient = -1)
2583 {
2585 BitsByte bitsByte = (byte)0;
2586 bitsByte[0] = pvp;
2587 SendData(118, remoteClient, ignoreClient, null, playerTargetIndex, damage, direction, (int)(byte)bitsByte);
2588 }
2589
2590 public static void PlayNetSound(NetSoundInfo info, int remoteClient = -1, int ignoreClient = -1)
2591 {
2593 SendData(132, remoteClient, ignoreClient);
2594 }
2595
2596 public static void SendCoinLossRevengeMarker(CoinLossRevengeSystem.RevengeMarker marker, int remoteClient = -1, int ignoreClient = -1)
2597 {
2598 _currentRevengeMarker = marker;
2599 SendData(126, remoteClient, ignoreClient);
2600 }
2601
2602 public static void SendTileSquare(int whoAmi, int tileX, int tileY, int xSize, int ySize, TileChangeType changeType = TileChangeType.None)
2603 {
2604 SendData(20, whoAmi, -1, null, tileX, tileY, xSize, ySize, (int)changeType);
2605 WorldGen.RangeFrame(tileX, tileY, xSize, ySize);
2606 }
2607
2608 public static void SendTileSquare(int whoAmi, int tileX, int tileY, int centeredSquareSize, TileChangeType changeType = TileChangeType.None)
2609 {
2610 int num = (centeredSquareSize - 1) / 2;
2611 SendTileSquare(whoAmi, tileX - num, tileY - num, centeredSquareSize, centeredSquareSize, changeType);
2612 }
2613
2614 public static void SendTileSquare(int whoAmi, int tileX, int tileY, TileChangeType changeType = TileChangeType.None)
2615 {
2616 int num = 1;
2617 int num2 = (num - 1) / 2;
2618 SendTileSquare(whoAmi, tileX - num2, tileY - num2, num, num, changeType);
2619 }
2620
2621 public static void SendTravelShop(int remoteClient)
2622 {
2623 if (Main.netMode == 2)
2624 {
2625 SendData(72, remoteClient);
2626 }
2627 }
2628
2629 public static void SendAnglerQuest(int remoteClient)
2630 {
2631 if (Main.netMode != 2)
2632 {
2633 return;
2634 }
2635 if (remoteClient == -1)
2636 {
2637 for (int i = 0; i < 255; i++)
2638 {
2639 if (Netplay.Clients[i].State == 10)
2640 {
2642 }
2643 }
2644 }
2645 else if (Netplay.Clients[remoteClient].State == 10)
2646 {
2647 SendData(74, remoteClient, -1, NetworkText.FromLiteral(Main.player[remoteClient].name), Main.anglerQuest);
2648 }
2649 }
2650
2651 public static void SendSection(int whoAmi, int sectionX, int sectionY)
2652 {
2653 if (Main.netMode != 2)
2654 {
2655 return;
2656 }
2657 try
2658 {
2659 if (sectionX < 0 || sectionY < 0 || sectionX >= Main.maxSectionsX || sectionY >= Main.maxSectionsY || Netplay.Clients[whoAmi].TileSections[sectionX, sectionY])
2660 {
2661 return;
2662 }
2663 Netplay.Clients[whoAmi].TileSections[sectionX, sectionY] = true;
2664 int number = sectionX * 200;
2665 int num = sectionY * 150;
2666 int num2 = 150;
2667 for (int i = num; i < num + 150; i += num2)
2668 {
2669 SendData(10, whoAmi, -1, null, number, i, 200f, num2);
2670 }
2671 for (int j = 0; j < 200; j++)
2672 {
2673 if (Main.npc[j].active && Main.npc[j].townNPC)
2674 {
2675 int sectionX2 = Netplay.GetSectionX((int)(Main.npc[j].position.X / 16f));
2676 int sectionY2 = Netplay.GetSectionY((int)(Main.npc[j].position.Y / 16f));
2677 if (sectionX2 == sectionX && sectionY2 == sectionY)
2678 {
2679 SendData(23, whoAmi, -1, null, j);
2680 }
2681 }
2682 }
2683 }
2684 catch
2685 {
2686 }
2687 }
2688
2689 public static void greetPlayer(int plr)
2690 {
2691 if (Main.motd == "")
2692 {
2693 ChatHelper.SendChatMessageToClient(NetworkText.FromFormattable("{0} {1}!", Lang.mp[18].ToNetworkText(), Main.worldName), new Color(255, 240, 20), plr);
2694 }
2695 else
2696 {
2698 }
2699 string text = "";
2700 for (int i = 0; i < 255; i++)
2701 {
2702 if (Main.player[i].active)
2703 {
2704 text = ((!(text == "")) ? (text + ", " + Main.player[i].name) : (text + Main.player[i].name));
2705 }
2706 }
2707 ChatHelper.SendChatMessageToClient(NetworkText.FromKey("Game.JoinGreeting", text), new Color(255, 240, 20), plr);
2708 }
2709
2710 public static void sendWater(int x, int y)
2711 {
2712 if (Main.netMode == 1)
2713 {
2714 SendData(48, -1, -1, null, x, y);
2715 return;
2716 }
2717 for (int i = 0; i < 256; i++)
2718 {
2719 if ((buffer[i].broadcast || Netplay.Clients[i].State >= 3) && Netplay.Clients[i].IsConnected())
2720 {
2721 int num = x / 200;
2722 int num2 = y / 150;
2723 if (Netplay.Clients[i].TileSections[num, num2])
2724 {
2725 SendData(48, i, -1, null, x, y);
2726 }
2727 }
2728 }
2729 }
2730
2731 public static void SyncDisconnectedPlayer(int plr)
2732 {
2733 SyncOnePlayer(plr, -1, plr);
2735 }
2736
2737 public static void SyncConnectedPlayer(int plr)
2738 {
2739 SyncOnePlayer(plr, -1, plr);
2740 for (int i = 0; i < 255; i++)
2741 {
2742 if (plr != i && Main.player[i].active)
2743 {
2744 SyncOnePlayer(i, plr, -1);
2745 }
2746 }
2748 SendAnglerQuest(plr);
2750 NPC.RevengeManager.SendAllMarkersToPlayer(plr);
2752 }
2753
2754 private static void SendNPCHousesAndTravelShop(int plr)
2755 {
2756 bool flag = false;
2757 for (int i = 0; i < 200; i++)
2758 {
2759 NPC nPC = Main.npc[i];
2760 if (!nPC.active)
2761 {
2762 continue;
2763 }
2764 bool flag2 = nPC.townNPC && NPC.TypeToDefaultHeadIndex(nPC.type) > 0;
2765 if (nPC.aiStyle == 7)
2766 {
2767 flag2 = true;
2768 }
2769 if (flag2)
2770 {
2771 if (!flag && nPC.type == 368)
2772 {
2773 flag = true;
2774 }
2775 byte householdStatus = WorldGen.TownManager.GetHouseholdStatus(nPC);
2776 SendData(60, plr, -1, null, i, nPC.homeTileX, nPC.homeTileY, (int)householdStatus);
2777 }
2778 }
2779 if (flag)
2780 {
2781 SendTravelShop(plr);
2782 }
2783 }
2784
2785 private static void EnsureLocalPlayerIsPresent()
2786 {
2787 if (!Main.autoShutdown)
2788 {
2789 return;
2790 }
2791 bool flag = false;
2792 for (int i = 0; i < 255; i++)
2793 {
2795 {
2796 flag = true;
2797 break;
2798 }
2799 }
2800 if (!flag)
2801 {
2802 Console.WriteLine(Language.GetTextValue("Net.ServerAutoShutdown"));
2803 Netplay.Disconnect = true;
2804 }
2805 }
2806
2807 public static bool DoesPlayerSlotCountAsAHost(int plr)
2808 {
2809 if (Netplay.Clients[plr].State == 10)
2810 {
2811 return Netplay.Clients[plr].Socket.GetRemoteAddress().IsLocalHost();
2812 }
2813 return false;
2814 }
2815
2816 private static void SyncOnePlayer(int plr, int toWho, int fromWho)
2817 {
2818 int num = 0;
2819 if (Main.player[plr].active)
2820 {
2821 num = 1;
2822 }
2823 if (Netplay.Clients[plr].State == 10)
2824 {
2825 SendData(14, toWho, fromWho, null, plr, num);
2826 SendData(4, toWho, fromWho, null, plr);
2827 SendData(13, toWho, fromWho, null, plr);
2828 if (Main.player[plr].statLife <= 0)
2829 {
2830 SendData(135, toWho, fromWho, null, plr);
2831 }
2832 SendData(16, toWho, fromWho, null, plr);
2833 SendData(30, toWho, fromWho, null, plr);
2834 SendData(45, toWho, fromWho, null, plr);
2835 SendData(42, toWho, fromWho, null, plr);
2836 SendData(50, toWho, fromWho, null, plr);
2837 SendData(80, toWho, fromWho, null, plr, Main.player[plr].chest);
2838 SendData(142, toWho, fromWho, null, plr);
2839 SendData(147, toWho, fromWho, null, plr, Main.player[plr].CurrentLoadoutIndex);
2840 for (int i = 0; i < 59; i++)
2841 {
2842 SendData(5, toWho, fromWho, null, plr, PlayerItemSlotID.Inventory0 + i, (int)Main.player[plr].inventory[i].prefix);
2843 }
2844 for (int j = 0; j < Main.player[plr].armor.Length; j++)
2845 {
2846 SendData(5, toWho, fromWho, null, plr, PlayerItemSlotID.Armor0 + j, (int)Main.player[plr].armor[j].prefix);
2847 }
2848 for (int k = 0; k < Main.player[plr].dye.Length; k++)
2849 {
2850 SendData(5, toWho, fromWho, null, plr, PlayerItemSlotID.Dye0 + k, (int)Main.player[plr].dye[k].prefix);
2851 }
2852 SyncOnePlayer_ItemArray(plr, toWho, fromWho, Main.player[plr].miscEquips, PlayerItemSlotID.Misc0);
2853 SyncOnePlayer_ItemArray(plr, toWho, fromWho, Main.player[plr].miscDyes, PlayerItemSlotID.MiscDye0);
2854 SyncOnePlayer_ItemArray(plr, toWho, fromWho, Main.player[plr].Loadouts[0].Armor, PlayerItemSlotID.Loadout1_Armor_0);
2855 SyncOnePlayer_ItemArray(plr, toWho, fromWho, Main.player[plr].Loadouts[0].Dye, PlayerItemSlotID.Loadout1_Dye_0);
2856 SyncOnePlayer_ItemArray(plr, toWho, fromWho, Main.player[plr].Loadouts[1].Armor, PlayerItemSlotID.Loadout2_Armor_0);
2857 SyncOnePlayer_ItemArray(plr, toWho, fromWho, Main.player[plr].Loadouts[1].Dye, PlayerItemSlotID.Loadout2_Dye_0);
2858 SyncOnePlayer_ItemArray(plr, toWho, fromWho, Main.player[plr].Loadouts[2].Armor, PlayerItemSlotID.Loadout3_Armor_0);
2859 SyncOnePlayer_ItemArray(plr, toWho, fromWho, Main.player[plr].Loadouts[2].Dye, PlayerItemSlotID.Loadout3_Dye_0);
2860 if (!Netplay.Clients[plr].IsAnnouncementCompleted)
2861 {
2862 Netplay.Clients[plr].IsAnnouncementCompleted = true;
2863 ChatHelper.BroadcastChatMessage(NetworkText.FromKey(Lang.mp[19].Key, Main.player[plr].name), new Color(255, 240, 20), plr);
2864 if (Main.dedServ)
2865 {
2866 Console.WriteLine(Lang.mp[19].Format(Main.player[plr].name));
2867 }
2868 }
2869 return;
2870 }
2871 num = 0;
2872 SendData(14, -1, plr, null, plr, num);
2873 if (Netplay.Clients[plr].IsAnnouncementCompleted)
2874 {
2875 Netplay.Clients[plr].IsAnnouncementCompleted = false;
2876 ChatHelper.BroadcastChatMessage(NetworkText.FromKey(Lang.mp[20].Key, Netplay.Clients[plr].Name), new Color(255, 240, 20), plr);
2877 if (Main.dedServ)
2878 {
2879 Console.WriteLine(Lang.mp[20].Format(Netplay.Clients[plr].Name));
2880 }
2881 Netplay.Clients[plr].Name = "Anonymous";
2882 }
2884 }
2885
2886 private static void SyncOnePlayer_ItemArray(int plr, int toWho, int fromWho, Item[] arr, int slot)
2887 {
2888 for (int i = 0; i < arr.Length; i++)
2889 {
2890 SendData(5, toWho, fromWho, null, plr, slot + i, (int)arr[i].prefix);
2891 }
2892 }
2893}
static float Clamp(float value, float min, float max)
Definition MathHelper.cs:46
static ushort ToUInt16(byte[] value, int startIndex)
static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count)
Definition Buffer.cs:102
static void WriteLine()
Definition Console.cs:733
virtual byte ReadByte()
virtual string ReadString()
virtual int ReadInt32()
virtual short ReadInt16()
virtual void Write(bool value)
static byte Max(byte val1, byte val2)
Definition Math.cs:738
static void SendChatMessageToClient(NetworkText text, Color color, int playerId)
Definition ChatHelper.cs:28
static void BroadcastChatMessage(NetworkText text, Color color, int excludedPlayer=-1)
Definition ChatHelper.cs:46
Item[] item
Definition Chest.cs:41
string name
Definition Chest.cs:49
static int FindChest(int X, int Y)
Definition Chest.cs:546
static Dictionary< int, TileEntity > ByID
Definition TileEntity.cs:18
static Dictionary< Point16, TileEntity > ByPosition
Definition TileEntity.cs:20
static void Write(BinaryWriter writer, TileEntity ent, bool networkSend=false)
Definition TileEntity.cs:80
static TileEntity Read(BinaryReader reader, bool networkSend=false)
Definition TileEntity.cs:86
Vector2 velocity
Definition Entity.cs:16
Vector2 position
Definition Entity.cs:14
static void SendCreditsRollRemainingTimeToPlayer(int playerIndex)
static readonly short Count
Definition NPCID.cs:11744
static readonly int Loadout1_Armor_0
static readonly int Loadout3_Dye_0
static readonly int Loadout2_Dye_0
static readonly int Loadout1_Dye_0
static readonly int Loadout3_Armor_0
static readonly int Loadout2_Armor_0
static readonly int TrashItem
static readonly int Inventory0
static readonly short Count
static bool[] AllowsSaveCompressionBatching
Definition TileID.cs:87
static bool[] BasicChest
Definition TileID.cs:223
float knockBack
Definition Item.cs:169
int useAnimation
Definition Item.cs:145
int stack
Definition Item.cs:149
int useAmmo
Definition Item.cs:243
int shoot
Definition Item.cs:235
float scale
Definition Item.cs:189
int damage
Definition Item.cs:167
float shootSpeed
Definition Item.cs:237
int timeLeftInWhichTheItemCannotBeTakenByEnemies
Definition Item.cs:131
string Name
Definition Item.cs:326
int netID
Definition Item.cs:291
float shimmerTime
Definition Item.cs:324
int useTime
Definition Item.cs:147
bool shimmered
Definition Item.cs:322
void SetDefaults(int Type=0)
Definition Item.cs:47332
byte prefix
Definition Item.cs:295
Color color
Definition Item.cs:183
bool notAmmo
Definition Item.cs:241
static LocalizedText[] mp
Definition Lang.cs:34
static string GetTextValue(string key)
Definition Language.cs:15
static NetworkText FromFormattable(string text, params object[] substitutions)
static readonly NetworkText Empty
static NetworkText FromLiteral(string text)
static NetworkText FromKey(string key, params object[] substitutions)
static int maxSectionsY
Definition Main.cs:1124
static bool raining
Definition Main.cs:1310
static double time
Definition Main.cs:1284
static bool verboseNetplay
Definition Main.cs:562
static bool slimeRain
Definition Main.cs:1166
static int maxSectionsX
Definition Main.cs:1122
static int maxTilesY
Definition Main.cs:1116
static bool autoShutdown
Definition Main.cs:2277
static int spawnTileY
Definition Main.cs:1811
static float windSpeedTarget
Definition Main.cs:1362
static bool[] npcCatchable
Definition Main.cs:1655
static bool forceXMasForToday
Definition Main.cs:690
static Chest[] chest
Definition Main.cs:1699
static WorldFileData ActiveWorldFileData
Definition Main.cs:1946
static int[] travelShop
Definition Main.cs:1843
static string motd
Definition Main.cs:1916
static bool[] projPet
Definition Main.cs:1328
static Item[] item
Definition Main.cs:1681
static double worldSurface
Definition Main.cs:1272
static int numClouds
Definition Main.cs:1356
static bool forceHalloweenForToday
Definition Main.cs:692
static int[] treeX
Definition Main.cs:668
static int netMode
Definition Main.cs:2095
static double rockLayer
Definition Main.cs:1274
static bool dayTime
Definition Main.cs:1282
static bool dedServ
Definition Main.cs:1226
static short moonModY
Definition Main.cs:1292
static string clientUUID
Definition Main.cs:399
static int[] caveBackStyle
Definition Main.cs:674
static bool bloodMoon
Definition Main.cs:1296
static bool zenithWorld
Definition Main.cs:353
static WorldSections sectionManager
Definition Main.cs:395
static int moonPhase
Definition Main.cs:1288
static string worldName
Definition Main.cs:1260
static int maxTilesX
Definition Main.cs:1114
static int GameMode
Definition Main.cs:2685
static bool getGoodWorld
Definition Main.cs:341
static bool[] tileSolid
Definition Main.cs:1471
static List< string > anglerWhoFinishedToday
Definition Main.cs:1845
static Tile[,] tile
Definition Main.cs:1675
static int hellBackStyle
Definition Main.cs:678
static int spawnTileX
Definition Main.cs:1809
static int moondialCooldown
Definition Main.cs:2287
static bool fastForwardTimeToDawn
Definition Main.cs:2281
static int jungleBackStyle
Definition Main.cs:680
static bool eclipse
Definition Main.cs:1312
static Projectile[] projectile
Definition Main.cs:1691
static int invasionType
Definition Main.cs:1970
static int moonType
Definition Main.cs:1397
static bool notTheBeesWorld
Definition Main.cs:347
static int worldID
Definition Main.cs:1262
static NPC[] npc
Definition Main.cs:1685
static bool noTrapsWorld
Definition Main.cs:351
static bool dontStarveWorld
Definition Main.cs:345
static float maxRaining
Definition Main.cs:1304
static bool tenthAnniversaryWorld
Definition Main.cs:343
static int[] treeStyle
Definition Main.cs:670
static int sundialCooldown
Definition Main.cs:2283
static short sunModY
Definition Main.cs:1290
static bool drunkWorld
Definition Main.cs:339
static int iceBackStyle
Definition Main.cs:676
static bool snowMoon
Definition Main.cs:1300
static bool pumpkinMoon
Definition Main.cs:1298
static bool[] tileFrameImportant
Definition Main.cs:1495
static int[] caveBackX
Definition Main.cs:672
static bool hardMode
Definition Main.cs:1022
static Sign[] sign
Definition Main.cs:1701
static INetDiagnosticsUI ActiveNetDiagnosticsUI
Definition Main.cs:2789
static Player[] player
Definition Main.cs:1803
static int anglerQuest
Definition Main.cs:1849
static bool fastForwardTimeToDusk
Definition Main.cs:2285
static bool remixWorld
Definition Main.cs:349
bool boss
Definition NPC.cs:515
static bool downedChristmasSantank
Definition NPC.cs:379
bool netAlways
Definition NPC.cs:171
static bool downedTowerSolar
Definition NPC.cs:385
static int TypeToDefaultHeadIndex(int type)
Definition NPC.cs:1651
static CoinLossRevengeSystem RevengeManager
Definition NPC.cs:439
static bool downedFrost
Definition NPC.cs:357
static bool boughtCat
Definition NPC.cs:301
static bool unlockedSlimeRainbowSpawn
Definition NPC.cs:315
static bool unlockedSlimeGreenSpawn
Definition NPC.cs:309
static bool downedTowerVortex
Definition NPC.cs:387
static bool downedMechBoss2
Definition NPC.cs:425
static bool downedFishron
Definition NPC.cs:369
static bool unlockedSlimePurpleSpawn
Definition NPC.cs:313
static int ShieldStrengthTowerNebula
Definition NPC.cs:403
static bool downedBoss2
Definition NPC.cs:347
static readonly int maxBuffs
Definition NPC.cs:211
static int ShieldStrengthTowerSolar
Definition NPC.cs:399
int lifeMax
Definition NPC.cs:479
int aiStyle
Definition NPC.cs:453
static int[] killCount
Definition NPC.cs:71
Rectangle getRect()
Definition NPC.cs:86847
static bool unlockedSlimeBlueSpawn
Definition NPC.cs:307
static bool downedMechBossAny
Definition NPC.cs:421
static bool downedEmpressOfLight
Definition NPC.cs:393
static int[,] cavernMonsterType
Definition NPC.cs:579
static bool downedHalloweenKing
Definition NPC.cs:373
static bool boughtDog
Definition NPC.cs:303
static int MaxMoonLordCountdown
Definition NPC.cs:53
static bool downedBoss1
Definition NPC.cs:345
static bool downedSlimeKing
Definition NPC.cs:353
float[] ai
Definition NPC.cs:447
bool SpawnedFromStatue
Definition NPC.cs:85
static bool unlockedTruffleSpawn
Definition NPC.cs:331
static bool combatBookWasUsed
Definition NPC.cs:339
float strengthMultiplier
Definition NPC.cs:535
static bool downedTowerStardust
Definition NPC.cs:391
int homeTileX
Definition NPC.cs:543
static bool unlockedSlimeRedSpawn
Definition NPC.cs:317
static bool downedMechBoss3
Definition NPC.cs:427
static int ShieldStrengthTowerStardust
Definition NPC.cs:405
static bool downedPirates
Definition NPC.cs:359
static int ShieldStrengthTowerVortex
Definition NPC.cs:401
static bool downedMoonlord
Definition NPC.cs:383
static bool freeCake
Definition NPC.cs:119
int type
Definition NPC.cs:445
static int maxAI
Definition NPC.cs:65
static bool downedQueenBee
Definition NPC.cs:351
static bool downedHalloweenTree
Definition NPC.cs:371
static bool downedChristmasTree
Definition NPC.cs:377
static bool unlockedSlimeOldSpawn
Definition NPC.cs:311
static bool downedGoblins
Definition NPC.cs:355
static bool downedClown
Definition NPC.cs:361
static bool peddlersSatchelWasUsed
Definition NPC.cs:343
static int MoonLordCountdown
Definition NPC.cs:51
int netID
Definition NPC.cs:531
static bool combatBookVolumeTwoWasUsed
Definition NPC.cs:341
static bool downedGolemBoss
Definition NPC.cs:365
static bool downedMartians
Definition NPC.cs:367
static bool boughtBunny
Definition NPC.cs:305
static bool downedChristmasIceQueen
Definition NPC.cs:375
static bool downedAncientCultist
Definition NPC.cs:381
static bool downedBoss3
Definition NPC.cs:349
short releaseOwner
Definition NPC.cs:107
int life
Definition NPC.cs:477
static bool unlockedSlimeYellowSpawn
Definition NPC.cs:319
static bool downedPlantBoss
Definition NPC.cs:363
static bool downedMechBoss1
Definition NPC.cs:423
static bool downedDeerclops
Definition NPC.cs:397
int statsAreScaledForThisManyPlayers
Definition NPC.cs:533
int target
Definition NPC.cs:459
static bool unlockedSlimeCopperSpawn
Definition NPC.cs:321
int netSkip
Definition NPC.cs:169
bool townNPC
Definition NPC.cs:537
static bool downedTowerNebula
Definition NPC.cs:389
static bool downedQueenSlime
Definition NPC.cs:395
int homeTileY
Definition NPC.cs:545
static NetSoundInfo _currentNetSoundInfo
Definition NetMessage.cs:71
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 SendPlayerHurt(int playerTargetIndex, PlayerDeathReason reason, int damage, int direction, bool critical, bool pvp, int hitContext, int remoteClient=-1, int ignoreClient=-1)
static short[] _compressSignList
Definition NetMessage.cs:65
static void ReceiveBytes(byte[] bytes, int streamLength, int i=256)
static void CheckBytes(int bufferIndex=256)
static PlayerDeathReason _currentPlayerDeathReason
Definition NetMessage.cs:69
static void SendAnglerQuest(int remoteClient)
static void greetPlayer(int plr)
static void DecompressTileBlock_Inner(BinaryReader reader, int xStart, int yStart, int width, int height)
static void WriteAccessoryVisibility(BinaryWriter writer, bool[] hideVisibleAccessory)
static bool TrySendData(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:75
static void SendNPCHousesAndTravelShop(int plr)
static bool DoesPlayerSlotCountAsAHost(int plr)
static void SendTileSquare(int whoAmi, int tileX, int tileY, int xSize, int ySize, TileChangeType changeType=TileChangeType.None)
static void PlayNetSound(NetSoundInfo info, int remoteClient=-1, int ignoreClient=-1)
static void CompressTileBlock(int xStart, int yStart, short width, short height, Stream stream)
static MessageBuffer[] buffer
Definition NetMessage.cs:61
static void SendTileSquare(int whoAmi, int tileX, int tileY, int centeredSquareSize, TileChangeType changeType=TileChangeType.None)
static short[] _compressChestList
Definition NetMessage.cs:63
static void SendTravelShop(int remoteClient)
static CoinLossRevengeSystem.RevengeMarker _currentRevengeMarker
Definition NetMessage.cs:73
static void BootPlayer(int plr, NetworkText msg)
static void SendTemporaryAnimation(int whoAmi, int animationType, int tileType, int xCoord, int yCoord)
static void DecompressTileBlock(Stream stream)
static void SyncDisconnectedPlayer(int plr)
static void SendPlayerDeath(int playerTargetIndex, PlayerDeathReason reason, int damage, int direction, bool pvp, int remoteClient=-1, int ignoreClient=-1)
static void SyncOnePlayer(int plr, int toWho, int fromWho)
static void SyncOnePlayer_ItemArray(int plr, int toWho, int fromWho, Item[] arr, int slot)
static void SendObjectPlacement(int whoAmi, int x, int y, int type, int style, int alternative, int random, int direction)
static void SendSection(int whoAmi, int sectionX, int sectionY)
static void SendTileSquare(int whoAmi, int tileX, int tileY, TileChangeType changeType=TileChangeType.None)
static void sendWater(int x, int y)
static void CompressTileBlock_Inner(BinaryWriter writer, int xStart, int yStart, int width, int height)
static void SendCoinLossRevengeMarker(CoinLossRevengeSystem.RevengeMarker marker, int remoteClient=-1, int ignoreClient=-1)
static void SyncConnectedPlayer(int plr)
static void EnsureLocalPlayerIsPresent()
static short[] _compressEntities
Definition NetMessage.cs:67
static RemoteClient[] Clients
Definition Netplay.cs:37
static int GetSectionX(int x)
Definition Netplay.cs:774
static int GetSectionY(int y)
Definition Netplay.cs:779
static string ServerPassword
Definition Netplay.cs:35
static RemoteServer Connection
Definition Netplay.cs:39
static void PlayerDisconnect(int playerIndex)
Definition Player.cs:308
bool controlRight
Definition Player.cs:1383
bool controlDownHold
Definition Player.cs:1449
string name
Definition Player.cs:621
bool IsVoidVaultEnabled
Definition Player.cs:3376
Color hairColor
Definition Player.cs:2133
PlayerSleepingHelper sleeping
Definition Player.cs:2465
Vector2? PotionOfReturnHomePosition
Definition Player.cs:2065
bool downedDD2EventAnyDifficulty
Definition Player.cs:1549
bool tryKeepingHoveringDown
Definition Player.cs:1457
static readonly int maxBuffs
Definition Player.cs:1191
bool unlockedBiomeTorches
Definition Player.cs:1663
BitsByte zone5
Definition Player.cs:1057
PlayerSittingHelper sitting
Definition Player.cs:2463
Vector2? PotionOfReturnOriginalUsePosition
Definition Player.cs:2063
Color underShirtColor
Definition Player.cs:2141
int numberOfDeathsPVE
Definition Player.cs:629
bool happyFunTorchTime
Definition Player.cs:2625
BitsByte zone1
Definition Player.cs:1049
Color shirtColor
Definition Player.cs:2139
bool usedGummyWorm
Definition Player.cs:653
bool usedArcaneCrystal
Definition Player.cs:649
BitsByte hideMisc
Definition Player.cs:1369
bool vortexStealthActive
Definition Player.cs:2411
EquipmentLoadout[] Loadouts
Definition Player.cs:2721
BitsByte zone4
Definition Player.cs:1055
Item[] miscEquips
Definition Player.cs:1171
Color skinColor
Definition Player.cs:2135
bool UsingBiomeTorches
Definition Player.cs:3426
Color pantsColor
Definition Player.cs:2143
bool isPettingAnimal
Definition Player.cs:2459
bool tryKeepingHoveringUp
Definition Player.cs:1459
bool usedAegisFruit
Definition Player.cs:647
bool usedAmbrosia
Definition Player.cs:655
bool extraAccessory
Definition Player.cs:659
bool[] hideVisibleAccessory
Definition Player.cs:1367
bool autoReuseAllWeapons
Definition Player.cs:1453
Item[] miscDyes
Definition Player.cs:1173
bool unlockedSuperCart
Definition Player.cs:1667
bool isOperatingAnotherEntity
Definition Player.cs:1451
float equipmentBasedLuckBonus
Definition Player.cs:2339
int numberOfDeathsPVP
Definition Player.cs:631
BitsByte zone3
Definition Player.cs:1053
bool usedGalaxyPearl
Definition Player.cs:651
bool isTheAnimalBeingPetSmall
Definition Player.cs:2461
bool enabledSuperCart
Definition Player.cs:1669
BitsByte zone2
Definition Player.cs:1051
bool ateArtisanBread
Definition Player.cs:1665
Color shoeColor
Definition Player.cs:2145
bool HasGardenGnomeNearby
Definition Player.cs:1691
byte luckPotion
Definition Player.cs:895
Item[] inventory
Definition Player.cs:1257
bool controlUseTile
Definition Player.cs:1393
bool controlUseItem
Definition Player.cs:1391
float torchLuck
Definition Player.cs:2621
bool usedAegisCrystal
Definition Player.cs:645
int ladyBugLuckTimeLeft
Definition Player.cs:2643
bool shieldRaised
Definition Player.cs:2673
int y
Definition Sign.cs:9
string text
Definition Sign.cs:11
static int ReadSign(int i, int j, bool CreateIfMissing=true)
Definition Sign.cs:24
int x
Definition Sign.cs:7
static Terraria.Social.Base.NetSocialModule Network
Definition SocialAPI.cs:20
byte color()
Definition Tile.cs:555
bool wire4()
Definition Tile.cs:413
bool wire3()
Definition Tile.cs:633
void liquidType(int liquidType)
Definition Tile.cs:233
bool fullbrightWall()
Definition Tile.cs:694
bool invisibleWall()
Definition Tile.cs:521
byte liquid
Definition Tile.cs:12
bool inActive()
Definition Tile.cs:582
bool fullbrightBlock()
Definition Tile.cs:538
short frameY
Definition Tile.cs:24
ushort type
Definition Tile.cs:8
short frameX
Definition Tile.cs:22
bool invisibleBlock()
Definition Tile.cs:504
bool active()
Definition Tile.cs:565
void ClearEverything()
Definition Tile.cs:138
byte slope()
Definition Tile.cs:684
bool honey()
Definition Tile.cs:379
bool lava()
Definition Tile.cs:362
bool shimmer()
Definition Tile.cs:396
ushort wall
Definition Tile.cs:10
bool wire2()
Definition Tile.cs:616
byte wallColor()
Definition Tile.cs:352
bool actuator()
Definition Tile.cs:667
bool wire()
Definition Tile.cs:599
bool halfBrick()
Definition Tile.cs:650
bool isTheSameAs(Tile compTile)
Definition Tile.cs:172
static int hallowBG
Definition WorldGen.cs:914
static int mushroomBG
Definition WorldGen.cs:922
static int jungleBG
Definition WorldGen.cs:910
static int treeBG2
Definition WorldGen.cs:902
static int treeBG3
Definition WorldGen.cs:904
static TownRoomManager TownManager
Definition WorldGen.cs:892
static int treeBG4
Definition WorldGen.cs:906
static byte tBlood
Definition WorldGen.cs:954
static int underworldBG
Definition WorldGen.cs:924
static TreeTopsInfo TreeTops
Definition WorldGen.cs:1178
static int corruptBG
Definition WorldGen.cs:908
static void RangeFrame(int startX, int startY, int endX, int endY)
static bool crimson
Definition WorldGen.cs:932
static int desertBG
Definition WorldGen.cs:918
static int crimsonBG
Definition WorldGen.cs:916
static int treeBG1
Definition WorldGen.cs:900
static byte tEvil
Definition WorldGen.cs:952
static int snowBG
Definition WorldGen.cs:912
static int oceanBG
Definition WorldGen.cs:920
static byte tGood
Definition WorldGen.cs:956
static bool shadowOrbSmashed
Definition WorldGen.cs:974
bool Intersects(Rectangle value)
Definition Rectangle.cs:129
NetSoundInfo(Vector2 position, ushort soundIndex, int style=-1, float volume=-1f, float pitchOffset=-1f)
Definition NetMessage.cs:31
void WriteSelfTo(BinaryWriter writer)
Definition NetMessage.cs:40