├── .gitignore
├── LICENSE
├── Microsoft.Xna.Framework.RuntimeProfile
├── README.md
├── Terraria.csproj
├── Terraria.sln
└── Terraria
├── ChatLine.cs
├── Chest.cs
├── ClientSock.cs
├── Cloud.cs
├── Collision.cs
├── CombatText.cs
├── Dust.cs
├── Gore.cs
├── Item.cs
├── ItemText.cs
├── Lang.cs
├── Lighting.cs
├── Liquid.cs
├── LiquidBuffer.cs
├── Main.cs
├── Map.cs
├── NPC.cs
├── NetMessage.cs
├── Netplay.cs
├── Player.cs
├── Program.cs
├── Projectile.cs
├── Rain.cs
├── Recipe.cs
├── ServerSock.cs
├── Sign.cs
├── Star.cs
├── Steam.cs
├── Tile.cs
├── WorldGen.cs
├── keyBoardInput.cs
└── messageBuffer.cs
/.gitignore:
--------------------------------------------------------------------------------
1 | # Build Folders (you can keep bin if you'd like, to store dlls and pdbs)
2 | [Bb]in/
3 | [Oo]bj/
4 |
5 | # mstest test results
6 | TestResults
7 |
8 | ## Ignore Visual Studio temporary files, build results, and
9 | ## files generated by popular Visual Studio add-ons.
10 |
11 | # User-specific files
12 | *.suo
13 | *.user
14 | *.sln.docstates
15 |
16 | # Build results
17 | [Dd]ebug/
18 | [Rr]elease/
19 | x64/
20 | *_i.c
21 | *_p.c
22 | *.ilk
23 | *.meta
24 | *.obj
25 | *.pch
26 | *.pdb
27 | *.pgc
28 | *.pgd
29 | *.rsp
30 | *.sbr
31 | *.tlb
32 | *.tli
33 | *.tlh
34 | *.tmp
35 | *.log
36 | *.vspscc
37 | *.vssscc
38 | .builds
39 |
40 | # Visual C++ cache files
41 | ipch/
42 | *.aps
43 | *.ncb
44 | *.opensdf
45 | *.sdf
46 |
47 | # Visual Studio profiler
48 | *.psess
49 | *.vsp
50 | *.vspx
51 |
52 | # Guidance Automation Toolkit
53 | *.gpState
54 |
55 | # ReSharper is a .NET coding add-in
56 | _ReSharper*
57 |
58 | # NCrunch
59 | *.ncrunch*
60 | .*crunch*.local.xml
61 |
62 | # Installshield output folder
63 | [Ee]xpress
64 |
65 | # DocProject is a documentation generator add-in
66 | DocProject/buildhelp/
67 | DocProject/Help/*.HxT
68 | DocProject/Help/*.HxC
69 | DocProject/Help/*.hhc
70 | DocProject/Help/*.hhk
71 | DocProject/Help/*.hhp
72 | DocProject/Help/Html2
73 | DocProject/Help/html
74 |
75 | # Click-Once directory
76 | publish
77 |
78 | # Publish Web Output
79 | *.Publish.xml
80 |
81 | # NuGet Packages Directory
82 | packages
83 |
84 | # Windows Azure Build Output
85 | csx
86 | *.build.csdef
87 |
88 | # Windows Store app package directory
89 | AppPackages/
90 |
91 | # Others
92 | [Bb]in
93 | [Oo]bj
94 | sql
95 | TestResults
96 | [Tt]est[Rr]esult*
97 | *.Cache
98 | ClientBin
99 | [Ss]tyle[Cc]op.*
100 | ~$*
101 | *.dbmdl
102 | Generated_Code #added for RIA/Silverlight projects
103 |
104 | # Backup & report files from converting an old project file to a newer
105 | # Visual Studio version. Backup files are not needed, because we have git ;-)
106 | _UpgradeReport_Files/
107 | Backup*/
108 | UpgradeLog*.XML
109 |
110 | # Temp Data
111 | *.orig
112 | *temp.cs
113 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Only for educational use.
--------------------------------------------------------------------------------
/Microsoft.Xna.Framework.RuntimeProfile:
--------------------------------------------------------------------------------
1 | Windows.v4.0.Reach
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Terraria-Source-Code
2 | ====================
3 | Terraria Source Code 1.2.0.3.1
4 |
5 | Only for educational use.
--------------------------------------------------------------------------------
/Terraria.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 916B1896-36A0-41DC-9D70-87D6E8DD2179
5 | Debug
6 | x86
7 | WinExe
8 | Terraria
9 | v4.0
10 | 4
11 |
12 |
13 | x86
14 |
15 |
16 | bin\Debug\
17 | true
18 | full
19 | false
20 |
21 |
22 | bin\Release\
23 | true
24 | pdbonly
25 | true
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/Terraria.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 11.00
3 | # Visual Studio 2010
4 | # SharpDevelop 4.3
5 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Terraria", "Terraria.csproj", "916B1896-36A0-41DC-9D70-87D6E8DD2179"
6 | EndProject
7 | Global
8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
9 | Debug|x86 = Debug|x86
10 | Release|x86 = Release|x86
11 | EndGlobalSection
12 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
13 | 916B1896-36A0-41DC-9D70-87D6E8DD2179.Debug|x86.Build.0 = Debug|x86
14 | 916B1896-36A0-41DC-9D70-87D6E8DD2179.Debug|x86.ActiveCfg = Debug|x86
15 | 916B1896-36A0-41DC-9D70-87D6E8DD2179.Release|x86.Build.0 = Release|x86
16 | 916B1896-36A0-41DC-9D70-87D6E8DD2179.Release|x86.ActiveCfg = Release|x86
17 | EndGlobalSection
18 | EndGlobal
19 |
--------------------------------------------------------------------------------
/Terraria/ChatLine.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | namespace Terraria
4 | {
5 | public class ChatLine
6 | {
7 | public Color color = Color.White;
8 | public int showTime;
9 | public string text = "";
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Terraria/Chest.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | namespace Terraria
4 | {
5 | public class Chest
6 | {
7 | public static int maxItems = 40;
8 | public Item[] item = new Item[Chest.maxItems];
9 | public int x;
10 | public int y;
11 | public object Clone()
12 | {
13 | return base.MemberwiseClone();
14 | }
15 | public static void Unlock(int X, int Y)
16 | {
17 | Main.PlaySound(22, X * 16, Y * 16, 1);
18 | for (int i = X; i <= X + 1; i++)
19 | {
20 | for (int j = Y; j <= Y + 1; j++)
21 | {
22 | if (Main.tile[i, j] == null)
23 | {
24 | Main.tile[i, j] = new Tile();
25 | }
26 | if ((Main.tile[i, j].frameX >= 72 && Main.tile[i, j].frameX <= 106) || (Main.tile[i, j].frameX >= 144 && Main.tile[i, j].frameX <= 178))
27 | {
28 | Tile expr_A3 = Main.tile[i, j];
29 | expr_A3.frameX -= 36;
30 | for (int k = 0; k < 4; k++)
31 | {
32 | Dust.NewDust(new Vector2((float)(i * 16), (float)(j * 16)), 16, 16, 11, 0f, 0f, 0, default(Color), 1f);
33 | }
34 | }
35 | else
36 | {
37 | if (Main.tile[i, j].frameX >= 828 && Main.tile[i, j].frameX <= 990)
38 | {
39 | Tile expr_134 = Main.tile[i, j];
40 | expr_134.frameX -= 180;
41 | for (int l = 0; l < 4; l++)
42 | {
43 | Dust.NewDust(new Vector2((float)(i * 16), (float)(j * 16)), 16, 16, 11, 0f, 0f, 0, default(Color), 1f);
44 | }
45 | }
46 | }
47 | }
48 | }
49 | }
50 | public static int UsingChest(int i)
51 | {
52 | if (Main.chest[i] != null)
53 | {
54 | for (int j = 0; j < 255; j++)
55 | {
56 | if (Main.player[j].active && Main.player[j].chest == i)
57 | {
58 | return j;
59 | }
60 | }
61 | }
62 | return -1;
63 | }
64 | public static int FindChest(int X, int Y)
65 | {
66 | for (int i = 0; i < 1000; i++)
67 | {
68 | if (Main.chest[i] != null && Main.chest[i].x == X && Main.chest[i].y == Y)
69 | {
70 | return i;
71 | }
72 | }
73 | return -1;
74 | }
75 | public static int CreateChest(int X, int Y)
76 | {
77 | for (int i = 0; i < 1000; i++)
78 | {
79 | if (Main.chest[i] != null && Main.chest[i].x == X && Main.chest[i].y == Y)
80 | {
81 | return -1;
82 | }
83 | }
84 | for (int j = 0; j < 1000; j++)
85 | {
86 | if (Main.chest[j] == null)
87 | {
88 | Main.chest[j] = new Chest();
89 | Main.chest[j].x = X;
90 | Main.chest[j].y = Y;
91 | for (int k = 0; k < Chest.maxItems; k++)
92 | {
93 | Main.chest[j].item[k] = new Item();
94 | }
95 | return j;
96 | }
97 | }
98 | return -1;
99 | }
100 | public static bool DestroyChest(int X, int Y)
101 | {
102 | for (int i = 0; i < 1000; i++)
103 | {
104 | if (Main.chest[i] != null && Main.chest[i].x == X && Main.chest[i].y == Y)
105 | {
106 | for (int j = 0; j < Chest.maxItems; j++)
107 | {
108 | if (Main.chest[i].item[j].type > 0 && Main.chest[i].item[j].stack > 0)
109 | {
110 | return false;
111 | }
112 | }
113 | Main.chest[i] = null;
114 | return true;
115 | }
116 | }
117 | return true;
118 | }
119 | public void AddShop(Item newItem)
120 | {
121 | int i = 0;
122 | while (i < 39)
123 | {
124 | if (this.item[i] == null || this.item[i].type == 0)
125 | {
126 | this.item[i] = (Item)newItem.Clone();
127 | this.item[i].buyOnce = true;
128 | if (this.item[i].value <= 0)
129 | {
130 | break;
131 | }
132 | this.item[i].value = this.item[i].value / 5;
133 | if (this.item[i].value < 1)
134 | {
135 | this.item[i].value = 1;
136 | return;
137 | }
138 | break;
139 | }
140 | else
141 | {
142 | i++;
143 | }
144 | }
145 | }
146 | public void SetupShop(int type)
147 | {
148 | for (int i = 0; i < Chest.maxItems; i++)
149 | {
150 | this.item[i] = new Item();
151 | }
152 | int num = 0;
153 | if (type == 1)
154 | {
155 | this.item[num].SetDefaults("Mining Helmet");
156 | num++;
157 | this.item[num].SetDefaults("Piggy Bank");
158 | num++;
159 | this.item[num].SetDefaults("Iron Anvil");
160 | num++;
161 | this.item[num].SetDefaults("Copper Pickaxe");
162 | num++;
163 | this.item[num].SetDefaults("Copper Axe");
164 | num++;
165 | this.item[num].SetDefaults("Torch");
166 | num++;
167 | this.item[num].SetDefaults("Lesser Healing Potion");
168 | num++;
169 | if (Main.player[Main.myPlayer].statManaMax == 200)
170 | {
171 | this.item[num].SetDefaults("Lesser Mana Potion");
172 | num++;
173 | }
174 | this.item[num].SetDefaults("Wooden Arrow");
175 | num++;
176 | this.item[num].SetDefaults("Shuriken");
177 | num++;
178 | this.item[num].SetDefaults("Rope");
179 | num++;
180 | if (Main.player[Main.myPlayer].zoneSnow)
181 | {
182 | this.item[num].SetDefaults(967, false);
183 | num++;
184 | }
185 | if (Main.bloodMoon)
186 | {
187 | this.item[num].SetDefaults("Throwing Knife");
188 | num++;
189 | }
190 | if (!Main.dayTime)
191 | {
192 | this.item[num].SetDefaults("Glowstick");
193 | num++;
194 | }
195 | if (NPC.downedBoss3)
196 | {
197 | this.item[num].SetDefaults("Safe");
198 | num++;
199 | }
200 | if (Main.hardMode)
201 | {
202 | this.item[num].SetDefaults(488, false);
203 | num++;
204 | }
205 | for (int j = 0; j < 58; j++)
206 | {
207 | if (Main.player[Main.myPlayer].inventory[j].type == 930)
208 | {
209 | this.item[num].SetDefaults(931, false);
210 | num++;
211 | this.item[num].SetDefaults(1614, false);
212 | num++;
213 | break;
214 | }
215 | }
216 | if (Main.hardMode)
217 | {
218 | this.item[num].SetDefaults(1348, false);
219 | }
220 | num++;
221 | }
222 | else
223 | {
224 | if (type == 2)
225 | {
226 | this.item[num].SetDefaults("Musket Ball");
227 | num++;
228 | if (Main.bloodMoon || Main.hardMode)
229 | {
230 | this.item[num].SetDefaults("Silver Bullet");
231 | num++;
232 | }
233 | if ((NPC.downedBoss2 && !Main.dayTime) || Main.hardMode)
234 | {
235 | this.item[num].SetDefaults(47, false);
236 | num++;
237 | }
238 | this.item[num].SetDefaults("Flintlock Pistol");
239 | num++;
240 | this.item[num].SetDefaults("Minishark");
241 | num++;
242 | if (!Main.dayTime)
243 | {
244 | this.item[num].SetDefaults(324, false);
245 | num++;
246 | }
247 | if (Main.hardMode)
248 | {
249 | this.item[num].SetDefaults(534, false);
250 | num++;
251 | }
252 | if (Main.hardMode)
253 | {
254 | this.item[num].SetDefaults(1432, false);
255 | num++;
256 | }
257 | if (Main.player[Main.myPlayer].HasItem(1258))
258 | {
259 | this.item[num].SetDefaults(1261, false);
260 | num++;
261 | }
262 | }
263 | else
264 | {
265 | if (type == 3)
266 | {
267 | if (Main.bloodMoon)
268 | {
269 | this.item[num].SetDefaults(67, false);
270 | num++;
271 | this.item[num].SetDefaults(59, false);
272 | num++;
273 | }
274 | else
275 | {
276 | this.item[num].SetDefaults("Purification Powder");
277 | num++;
278 | this.item[num].SetDefaults("Grass Seeds");
279 | num++;
280 | this.item[num].SetDefaults("Sunflower");
281 | num++;
282 | }
283 | this.item[num].SetDefaults("Acorn");
284 | num++;
285 | this.item[num].SetDefaults(114, false);
286 | num++;
287 | this.item[num].SetDefaults(745, false);
288 | num++;
289 | this.item[num].SetDefaults(747, false);
290 | num++;
291 | if (Main.hardMode)
292 | {
293 | this.item[num].SetDefaults(746, false);
294 | }
295 | num++;
296 | if (Main.hardMode)
297 | {
298 | this.item[num].SetDefaults(369, false);
299 | }
300 | num++;
301 | if (Main.shroomTiles > 50)
302 | {
303 | this.item[num].SetDefaults(194, false);
304 | }
305 | num++;
306 | }
307 | else
308 | {
309 | if (type == 4)
310 | {
311 | this.item[num].SetDefaults("Grenade");
312 | num++;
313 | this.item[num].SetDefaults("Bomb");
314 | num++;
315 | this.item[num].SetDefaults("Dynamite");
316 | num++;
317 | if (Main.hardMode)
318 | {
319 | this.item[num].SetDefaults("Hellfire Arrow");
320 | num++;
321 | }
322 | if (Main.hardMode && NPC.downedGolemBoss && NPC.downedPirates)
323 | {
324 | this.item[num].SetDefaults(937, false);
325 | num++;
326 | }
327 | if (Main.hardMode)
328 | {
329 | this.item[num].SetDefaults(1347, false);
330 | num++;
331 | }
332 | }
333 | else
334 | {
335 | if (type == 5)
336 | {
337 | this.item[num].SetDefaults(254, false);
338 | num++;
339 | this.item[num].SetDefaults(981, false);
340 | num++;
341 | if (Main.dayTime)
342 | {
343 | this.item[num].SetDefaults(242, false);
344 | num++;
345 | }
346 | if (Main.moonPhase == 0)
347 | {
348 | this.item[num].SetDefaults(245, false);
349 | num++;
350 | this.item[num].SetDefaults(246, false);
351 | num++;
352 | }
353 | else
354 | {
355 | if (Main.moonPhase == 1)
356 | {
357 | this.item[num].SetDefaults(325, false);
358 | num++;
359 | this.item[num].SetDefaults(326, false);
360 | num++;
361 | }
362 | }
363 | this.item[num].SetDefaults(269, false);
364 | num++;
365 | this.item[num].SetDefaults(270, false);
366 | num++;
367 | this.item[num].SetDefaults(271, false);
368 | num++;
369 | if (NPC.downedClown)
370 | {
371 | this.item[num].SetDefaults(503, false);
372 | num++;
373 | this.item[num].SetDefaults(504, false);
374 | num++;
375 | this.item[num].SetDefaults(505, false);
376 | num++;
377 | }
378 | if (Main.bloodMoon)
379 | {
380 | this.item[num].SetDefaults(322, false);
381 | num++;
382 | }
383 | if (Main.player[Main.myPlayer].zoneSnow)
384 | {
385 | this.item[num].SetDefaults(1429, false);
386 | }
387 | num++;
388 | if (Main.hardMode)
389 | {
390 | if (Main.moonPhase == 2)
391 | {
392 | this.item[num].SetDefaults(869, false);
393 | num++;
394 | }
395 | if (Main.moonPhase == 4)
396 | {
397 | this.item[num].SetDefaults(864, false);
398 | num++;
399 | this.item[num].SetDefaults(865, false);
400 | num++;
401 | }
402 | if (Main.moonPhase == 6)
403 | {
404 | this.item[num].SetDefaults(873, false);
405 | num++;
406 | this.item[num].SetDefaults(874, false);
407 | num++;
408 | this.item[num].SetDefaults(875, false);
409 | num++;
410 | }
411 | }
412 | if (NPC.downedFrost)
413 | {
414 | this.item[num].SetDefaults(1275, false);
415 | num++;
416 | this.item[num].SetDefaults(1276, false);
417 | num++;
418 | }
419 | }
420 | else
421 | {
422 | if (type == 6)
423 | {
424 | this.item[num].SetDefaults(128, false);
425 | num++;
426 | this.item[num].SetDefaults(486, false);
427 | num++;
428 | this.item[num].SetDefaults(398, false);
429 | num++;
430 | this.item[num].SetDefaults(84, false);
431 | num++;
432 | this.item[num].SetDefaults(407, false);
433 | num++;
434 | this.item[num].SetDefaults(161, false);
435 | num++;
436 | }
437 | else
438 | {
439 | if (type == 7)
440 | {
441 | this.item[num].SetDefaults(487, false);
442 | num++;
443 | this.item[num].SetDefaults(496, false);
444 | num++;
445 | this.item[num].SetDefaults(500, false);
446 | num++;
447 | this.item[num].SetDefaults(507, false);
448 | num++;
449 | this.item[num].SetDefaults(508, false);
450 | num++;
451 | this.item[num].SetDefaults(531, false);
452 | num++;
453 | this.item[num].SetDefaults(576, false);
454 | num++;
455 | }
456 | else
457 | {
458 | if (type == 8)
459 | {
460 | this.item[num].SetDefaults(509, false);
461 | num++;
462 | this.item[num].SetDefaults(850, false);
463 | num++;
464 | this.item[num].SetDefaults(851, false);
465 | num++;
466 | this.item[num].SetDefaults(510, false);
467 | num++;
468 | this.item[num].SetDefaults(530, false);
469 | num++;
470 | this.item[num].SetDefaults(513, false);
471 | num++;
472 | this.item[num].SetDefaults(538, false);
473 | num++;
474 | this.item[num].SetDefaults(529, false);
475 | num++;
476 | this.item[num].SetDefaults(541, false);
477 | num++;
478 | this.item[num].SetDefaults(542, false);
479 | num++;
480 | this.item[num].SetDefaults(543, false);
481 | num++;
482 | this.item[num].SetDefaults(852, false);
483 | num++;
484 | this.item[num].SetDefaults(853, false);
485 | num++;
486 | this.item[num].SetDefaults(849, false);
487 | num++;
488 | }
489 | else
490 | {
491 | if (type == 9)
492 | {
493 | this.item[num].SetDefaults(588, false);
494 | num++;
495 | this.item[num].SetDefaults(589, false);
496 | num++;
497 | this.item[num].SetDefaults(590, false);
498 | num++;
499 | this.item[num].SetDefaults(597, false);
500 | num++;
501 | this.item[num].SetDefaults(598, false);
502 | num++;
503 | this.item[num].SetDefaults(596, false);
504 | num++;
505 | }
506 | else
507 | {
508 | if (type == 10)
509 | {
510 | this.item[num].SetDefaults(756, false);
511 | num++;
512 | this.item[num].SetDefaults(787, false);
513 | num++;
514 | this.item[num].SetDefaults(868, false);
515 | num++;
516 | this.item[num].SetDefaults(1551, false);
517 | num++;
518 | this.item[num].SetDefaults(1181, false);
519 | num++;
520 | this.item[num].SetDefaults(783, false);
521 | num++;
522 | }
523 | else
524 | {
525 | if (type == 11)
526 | {
527 | this.item[num].SetDefaults(779, false);
528 | num++;
529 | if (Main.moonPhase >= 4)
530 | {
531 | this.item[num].SetDefaults(748, false);
532 | num++;
533 | }
534 | else
535 | {
536 | this.item[num].SetDefaults(839, false);
537 | num++;
538 | this.item[num].SetDefaults(840, false);
539 | num++;
540 | this.item[num].SetDefaults(841, false);
541 | num++;
542 | }
543 | if (Main.dayTime)
544 | {
545 | this.item[num].SetDefaults(998, false);
546 | num++;
547 | }
548 | else
549 | {
550 | this.item[num].SetDefaults(995, false);
551 | num++;
552 | }
553 | this.item[num].SetDefaults(1263, false);
554 | num++;
555 | if (Main.eclipse || Main.bloodMoon)
556 | {
557 | if (WorldGen.crimson)
558 | {
559 | this.item[num].SetDefaults(784, false);
560 | num++;
561 | }
562 | else
563 | {
564 | this.item[num].SetDefaults(782, false);
565 | num++;
566 | }
567 | }
568 | else
569 | {
570 | if (Main.player[Main.myPlayer].zoneHoly)
571 | {
572 | this.item[num].SetDefaults(781, false);
573 | num++;
574 | }
575 | else
576 | {
577 | this.item[num].SetDefaults(780, false);
578 | num++;
579 | }
580 | }
581 | if (Main.hardMode)
582 | {
583 | this.item[num].SetDefaults(1344, false);
584 | }
585 | num++;
586 | }
587 | else
588 | {
589 | if (type == 12)
590 | {
591 | this.item[num].SetDefaults(1037, false);
592 | num++;
593 | this.item[num].SetDefaults(1120, false);
594 | num++;
595 | }
596 | else
597 | {
598 | if (type == 13)
599 | {
600 | this.item[num].SetDefaults(1000, false);
601 | num++;
602 | this.item[num].SetDefaults(1168, false);
603 | num++;
604 | this.item[num].SetDefaults(1449, false);
605 | num++;
606 | this.item[num].SetDefaults(1345, false);
607 | num++;
608 | this.item[num].SetDefaults(1450, false);
609 | num++;
610 | if (Main.hardMode)
611 | {
612 | this.item[num].SetDefaults(970, false);
613 | num++;
614 | this.item[num].SetDefaults(971, false);
615 | num++;
616 | this.item[num].SetDefaults(972, false);
617 | num++;
618 | this.item[num].SetDefaults(973, false);
619 | num++;
620 | }
621 | }
622 | else
623 | {
624 | if (type == 14)
625 | {
626 | this.item[num].SetDefaults(771, false);
627 | num++;
628 | if (Main.bloodMoon)
629 | {
630 | this.item[num].SetDefaults(772, false);
631 | num++;
632 | }
633 | if (!Main.dayTime || Main.eclipse)
634 | {
635 | this.item[num].SetDefaults(773, false);
636 | num++;
637 | }
638 | if (Main.eclipse)
639 | {
640 | this.item[num].SetDefaults(774, false);
641 | num++;
642 | }
643 | if (Main.hardMode)
644 | {
645 | this.item[num].SetDefaults(760, false);
646 | num++;
647 | }
648 | if (Main.hardMode)
649 | {
650 | this.item[num].SetDefaults(1346, false);
651 | num++;
652 | }
653 | }
654 | else
655 | {
656 | if (type == 15)
657 | {
658 | this.item[num].SetDefaults(1071, false);
659 | num++;
660 | this.item[num].SetDefaults(1072, false);
661 | num++;
662 | this.item[num].SetDefaults(1100, false);
663 | num++;
664 | for (int k = 1073; k <= 1084; k++)
665 | {
666 | this.item[num].SetDefaults(k, false);
667 | num++;
668 | }
669 | this.item[num].SetDefaults(1097, false);
670 | num++;
671 | this.item[num].SetDefaults(1099, false);
672 | num++;
673 | this.item[num].SetDefaults(1098, false);
674 | num++;
675 | this.item[num].SetDefaults(1490, false);
676 | num++;
677 | if (Main.moonPhase <= 1)
678 | {
679 | this.item[num].SetDefaults(1481, false);
680 | num++;
681 | }
682 | else
683 | {
684 | if (Main.moonPhase <= 3)
685 | {
686 | this.item[num].SetDefaults(1482, false);
687 | num++;
688 | }
689 | else
690 | {
691 | if (Main.moonPhase <= 5)
692 | {
693 | this.item[num].SetDefaults(1483, false);
694 | num++;
695 | }
696 | else
697 | {
698 | this.item[num].SetDefaults(1484, false);
699 | num++;
700 | }
701 | }
702 | }
703 | if (Main.player[Main.myPlayer].zoneBlood)
704 | {
705 | this.item[num].SetDefaults(1492, false);
706 | num++;
707 | }
708 | if (Main.player[Main.myPlayer].zoneEvil)
709 | {
710 | this.item[num].SetDefaults(1488, false);
711 | num++;
712 | }
713 | if (Main.player[Main.myPlayer].zoneHoly)
714 | {
715 | this.item[num].SetDefaults(1489, false);
716 | num++;
717 | }
718 | if (Main.player[Main.myPlayer].zoneJungle)
719 | {
720 | this.item[num].SetDefaults(1486, false);
721 | num++;
722 | }
723 | if (Main.player[Main.myPlayer].zoneSnow)
724 | {
725 | this.item[num].SetDefaults(1487, false);
726 | num++;
727 | }
728 | if (Main.sandTiles > 1000)
729 | {
730 | this.item[num].SetDefaults(1491, false);
731 | num++;
732 | }
733 | if (Main.bloodMoon)
734 | {
735 | this.item[num].SetDefaults(1493, false);
736 | num++;
737 | }
738 | if ((double)(Main.player[Main.myPlayer].position.Y / 16f) < Main.worldSurface * 0.34999999403953552)
739 | {
740 | this.item[num].SetDefaults(1485, false);
741 | num++;
742 | }
743 | if ((double)(Main.player[Main.myPlayer].position.Y / 16f) < Main.worldSurface * 0.34999999403953552 && Main.hardMode)
744 | {
745 | this.item[num].SetDefaults(1494, false);
746 | num++;
747 | }
748 | }
749 | else
750 | {
751 | if (type == 16)
752 | {
753 | this.item[num].SetDefaults(1430, false);
754 | num++;
755 | this.item[num].SetDefaults(986, false);
756 | num++;
757 | if (Main.hardMode && NPC.downedPlantBoss)
758 | {
759 | if (Main.player[Main.myPlayer].HasItem(1157))
760 | {
761 | this.item[num].SetDefaults(1159, false);
762 | num++;
763 | this.item[num].SetDefaults(1160, false);
764 | num++;
765 | this.item[num].SetDefaults(1161, false);
766 | num++;
767 | if (!Main.dayTime)
768 | {
769 | this.item[num].SetDefaults(1158, false);
770 | num++;
771 | }
772 | if (Main.player[Main.myPlayer].zoneJungle)
773 | {
774 | this.item[num].SetDefaults(1167, false);
775 | num++;
776 | }
777 | }
778 | this.item[num].SetDefaults(1339, false);
779 | num++;
780 | }
781 | if (Main.hardMode && Main.player[Main.myPlayer].zoneJungle)
782 | {
783 | this.item[num].SetDefaults(1171, false);
784 | num++;
785 | if (!Main.dayTime)
786 | {
787 | this.item[num].SetDefaults(1162, false);
788 | num++;
789 | }
790 | }
791 | if (Main.hardMode && NPC.downedGolemBoss)
792 | {
793 | this.item[num].SetDefaults(909, false);
794 | num++;
795 | this.item[num].SetDefaults(910, false);
796 | num++;
797 | this.item[num].SetDefaults(940, false);
798 | num++;
799 | this.item[num].SetDefaults(941, false);
800 | num++;
801 | this.item[num].SetDefaults(942, false);
802 | num++;
803 | this.item[num].SetDefaults(943, false);
804 | num++;
805 | this.item[num].SetDefaults(944, false);
806 | num++;
807 | this.item[num].SetDefaults(945, false);
808 | num++;
809 | }
810 | if (Main.player[Main.myPlayer].HasItem(1258))
811 | {
812 | this.item[num].SetDefaults(1261, false);
813 | num++;
814 | }
815 | }
816 | else
817 | {
818 | if (type == 17)
819 | {
820 | this.item[num].SetDefaults(928, false);
821 | num++;
822 | this.item[num].SetDefaults(929, false);
823 | num++;
824 | this.item[num].SetDefaults(876, false);
825 | num++;
826 | this.item[num].SetDefaults(877, false);
827 | num++;
828 | this.item[num].SetDefaults(878, false);
829 | num++;
830 | int num2 = (int)((Main.screenPosition.X + (float)(Main.screenWidth / 2)) / 16f);
831 | if ((double)(Main.screenPosition.Y / 16f) < Main.worldSurface + 10.0 && (num2 < 380 || num2 > Main.maxTilesX - 380))
832 | {
833 | this.item[num].SetDefaults(1180, false);
834 | num++;
835 | }
836 | if (Main.hardMode && NPC.downedMechBossAny && NPC.AnyNPCs(208))
837 | {
838 | this.item[num].SetDefaults(1337, false);
839 | num++;
840 | this.item[num].SetDefaults(1338, false);
841 | num++;
842 | }
843 | }
844 | }
845 | }
846 | }
847 | }
848 | }
849 | }
850 | }
851 | }
852 | }
853 | }
854 | }
855 | }
856 | }
857 | }
858 | }
859 | }
860 | if (Main.player[Main.myPlayer].discount)
861 | {
862 | for (int l = 0; l < num; l++)
863 | {
864 | this.item[l].value = (int)((float)this.item[l].value * 0.8f);
865 | }
866 | }
867 | }
868 | }
869 | }
870 |
--------------------------------------------------------------------------------
/Terraria/ClientSock.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Net.Sockets;
3 | namespace Terraria
4 | {
5 | public class ClientSock
6 | {
7 | public TcpClient tcpClient = new TcpClient();
8 | public NetworkStream networkStream;
9 | public string statusText;
10 | public int statusCount;
11 | public int statusMax;
12 | public int timeOut;
13 | public byte[] readBuffer;
14 | public byte[] writeBuffer;
15 | public bool active;
16 | public bool locked;
17 | public int state;
18 | public void ClientWriteCallBack(IAsyncResult ar)
19 | {
20 | NetMessage.buffer[256].spamCount--;
21 | }
22 | public void ClientReadCallBack(IAsyncResult ar)
23 | {
24 | if (!Netplay.disconnect)
25 | {
26 | int num = this.networkStream.EndRead(ar);
27 | if (num == 0)
28 | {
29 | Netplay.disconnect = true;
30 | Main.statusText = "Lost connection";
31 | }
32 | else
33 | {
34 | if (Main.ignoreErrors)
35 | {
36 | try
37 | {
38 | NetMessage.RecieveBytes(this.readBuffer, num, 256);
39 | goto IL_59;
40 | }
41 | catch
42 | {
43 | goto IL_59;
44 | }
45 | }
46 | NetMessage.RecieveBytes(this.readBuffer, num, 256);
47 | }
48 | }
49 | IL_59:
50 | this.locked = false;
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/Terraria/Cloud.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using Microsoft.Xna.Framework.Graphics;
3 | using System;
4 | namespace Terraria
5 | {
6 | public class Cloud
7 | {
8 | public Vector2 position;
9 | public float scale;
10 | public float rotation;
11 | public float rSpeed;
12 | public float sSpeed;
13 | public bool active;
14 | public SpriteEffects spriteDir;
15 | public int type;
16 | public int width;
17 | public int height;
18 | public float Alpha;
19 | public bool kill;
20 | private static Random rand = new Random();
21 | public static void resetClouds()
22 | {
23 | if (Main.dedServ)
24 | {
25 | return;
26 | }
27 | if (Main.cloudLimit < 10)
28 | {
29 | return;
30 | }
31 | Main.windSpeed = Main.windSpeedSet;
32 | for (int i = 0; i < 200; i++)
33 | {
34 | Main.cloud[i].active = false;
35 | }
36 | for (int j = 0; j < Main.numClouds; j++)
37 | {
38 | Cloud.addCloud();
39 | Main.cloud[j].Alpha = 1f;
40 | }
41 | for (int k = 0; k < 200; k++)
42 | {
43 | Main.cloud[k].Alpha = 1f;
44 | }
45 | }
46 | public static void addCloud()
47 | {
48 | if (Main.netMode == 2)
49 | {
50 | return;
51 | }
52 | int num = -1;
53 | for (int i = 0; i < 200; i++)
54 | {
55 | if (!Main.cloud[i].active)
56 | {
57 | num = i;
58 | break;
59 | }
60 | }
61 | if (num >= 0)
62 | {
63 | Main.cloud[num].kill = false;
64 | Main.cloud[num].rSpeed = 0f;
65 | Main.cloud[num].sSpeed = 0f;
66 | Main.cloud[num].scale = (float)Cloud.rand.Next(70, 131) * 0.01f;
67 | Main.cloud[num].rotation = (float)Cloud.rand.Next(-10, 11) * 0.01f;
68 | Main.cloud[num].width = (int)((float)Main.cloudTexture[Main.cloud[num].type].Width * Main.cloud[num].scale);
69 | Main.cloud[num].height = (int)((float)Main.cloudTexture[Main.cloud[num].type].Height * Main.cloud[num].scale);
70 | Main.cloud[num].Alpha = 0f;
71 | Main.cloud[num].spriteDir = SpriteEffects.None;
72 | if (Cloud.rand.Next(2) == 0)
73 | {
74 | Main.cloud[num].spriteDir = SpriteEffects.FlipHorizontally;
75 | }
76 | float num2 = Main.windSpeed;
77 | if (!Main.gameMenu)
78 | {
79 | num2 = Main.windSpeed - Main.player[Main.myPlayer].velocity.X * 0.1f;
80 | }
81 | int num3 = 0;
82 | int num4 = 0;
83 | if (num2 > 0f)
84 | {
85 | num3 -= 200;
86 | }
87 | if (num2 < 0f)
88 | {
89 | num4 += 200;
90 | }
91 | int num5 = 300;
92 | float x = (float)WorldGen.genRand.Next(num3 - num5, Main.screenWidth + num4 + num5);
93 | Main.cloud[num].Alpha = 0f;
94 | Main.cloud[num].position.Y = (float)Cloud.rand.Next((int)((float)(-(float)Main.screenHeight) * 0.25f), (int)((float)Main.screenHeight * 0.25f));
95 | Cloud expr_211_cp_0 = Main.cloud[num];
96 | expr_211_cp_0.position.Y = expr_211_cp_0.position.Y - (float)Cloud.rand.Next((int)((float)Main.screenHeight * 0.15f));
97 | Cloud expr_241_cp_0 = Main.cloud[num];
98 | expr_241_cp_0.position.Y = expr_241_cp_0.position.Y - (float)Cloud.rand.Next((int)((float)Main.screenHeight * 0.15f));
99 | Main.cloud[num].type = Cloud.rand.Next(4);
100 | if (Main.rand == null)
101 | {
102 | Main.rand = new Random();
103 | }
104 | if ((Main.cloudAlpha > 0f && Cloud.rand.Next(4) != 0) || (Main.cloudBGActive >= 1f && Main.rand.Next(2) == 0))
105 | {
106 | Main.cloud[num].type = Cloud.rand.Next(18, 22);
107 | if ((double)Main.cloud[num].scale >= 1.15)
108 | {
109 | Cloud expr_303_cp_0 = Main.cloud[num];
110 | expr_303_cp_0.position.Y = expr_303_cp_0.position.Y - 150f;
111 | }
112 | if (Main.cloud[num].scale >= 1f)
113 | {
114 | Cloud expr_336_cp_0 = Main.cloud[num];
115 | expr_336_cp_0.position.Y = expr_336_cp_0.position.Y - 150f;
116 | }
117 | }
118 | else
119 | {
120 | if (((Main.cloudBGActive <= 0f && Main.cloudAlpha == 0f && Main.cloud[num].scale < 1f && Main.cloud[num].position.Y < (float)(-(float)Main.screenHeight) * 0.2f) || Main.cloud[num].position.Y < (float)(-(float)Main.screenHeight) * 0.2f) && (double)Main.numClouds < 50.0)
121 | {
122 | Main.cloud[num].type = Cloud.rand.Next(9, 14);
123 | }
124 | else
125 | {
126 | if ((((double)Main.cloud[num].scale < 1.15 && Main.cloud[num].position.Y < (float)(-(float)Main.screenHeight) * 0.3f) || ((double)Main.cloud[num].scale < 0.85 && Main.cloud[num].position.Y < (float)Main.screenHeight * 0.15f)) && ((double)Main.numClouds > 70.0 || Main.cloudBGActive >= 1f))
127 | {
128 | Main.cloud[num].type = Cloud.rand.Next(4, 9);
129 | }
130 | else
131 | {
132 | if (Main.cloud[num].position.Y > (float)(-(float)Main.screenHeight) * 0.15f && Cloud.rand.Next(2) == 0 && (double)Main.numClouds > 20.0)
133 | {
134 | Main.cloud[num].type = Cloud.rand.Next(14, 18);
135 | }
136 | }
137 | }
138 | }
139 | if ((double)Main.cloud[num].scale > 1.2)
140 | {
141 | Cloud expr_50A_cp_0 = Main.cloud[num];
142 | expr_50A_cp_0.position.Y = expr_50A_cp_0.position.Y + 100f;
143 | }
144 | if ((double)Main.cloud[num].scale > 1.3)
145 | {
146 | Main.cloud[num].scale = 1.3f;
147 | }
148 | if ((double)Main.cloud[num].scale < 0.7)
149 | {
150 | Main.cloud[num].scale = 0.7f;
151 | }
152 | Main.cloud[num].active = true;
153 | Main.cloud[num].position.X = x;
154 | if (Main.cloud[num].position.X > (float)(Main.screenWidth + 100))
155 | {
156 | Main.cloud[num].Alpha = 1f;
157 | }
158 | if (Main.cloud[num].position.X + (float)Main.cloudTexture[Main.cloud[num].type].Width * Main.cloud[num].scale < -100f)
159 | {
160 | Main.cloud[num].Alpha = 1f;
161 | }
162 | Rectangle rectangle = new Rectangle((int)Main.cloud[num].position.X, (int)Main.cloud[num].position.Y, Main.cloud[num].width, Main.cloud[num].height);
163 | for (int j = 0; j < 200; j++)
164 | {
165 | if (num != j && Main.cloud[j].active)
166 | {
167 | Rectangle value = new Rectangle((int)Main.cloud[j].position.X, (int)Main.cloud[j].position.Y, Main.cloud[j].width, Main.cloud[j].height);
168 | if (rectangle.Intersects(value))
169 | {
170 | Main.cloud[num].active = false;
171 | }
172 | }
173 | }
174 | }
175 | }
176 | public Color cloudColor(Color bgColor)
177 | {
178 | float num = this.scale * this.Alpha;
179 | if (num > 1f)
180 | {
181 | num = 1f;
182 | }
183 | float num2 = (float)((int)((float)bgColor.R * num));
184 | float num3 = (float)((int)((float)bgColor.G * num));
185 | float num4 = (float)((int)((float)bgColor.B * num));
186 | float num5 = (float)((int)((float)bgColor.A * num));
187 | return new Color((int)((byte)num2), (int)((byte)num3), (int)((byte)num4), (int)((byte)num5));
188 | }
189 | public object Clone()
190 | {
191 | return base.MemberwiseClone();
192 | }
193 | public static void UpdateClouds()
194 | {
195 | if (Main.netMode == 2)
196 | {
197 | return;
198 | }
199 | int num = 0;
200 | for (int i = 0; i < 200; i++)
201 | {
202 | if (Main.cloud[i].active)
203 | {
204 | Main.cloud[i].Update();
205 | if (!Main.cloud[i].kill)
206 | {
207 | num++;
208 | }
209 | }
210 | }
211 | for (int j = 0; j < 200; j++)
212 | {
213 | if (Main.cloud[j].active)
214 | {
215 | if (j > 1 && (!Main.cloud[j - 1].active || (double)Main.cloud[j - 1].scale > (double)Main.cloud[j].scale + 0.02))
216 | {
217 | Cloud cloud = (Cloud)Main.cloud[j - 1].Clone();
218 | Main.cloud[j - 1] = (Cloud)Main.cloud[j].Clone();
219 | Main.cloud[j] = cloud;
220 | }
221 | if (j < 199 && (!Main.cloud[j].active || (double)Main.cloud[j + 1].scale < (double)Main.cloud[j].scale - 0.02))
222 | {
223 | Cloud cloud2 = (Cloud)Main.cloud[j + 1].Clone();
224 | Main.cloud[j + 1] = (Cloud)Main.cloud[j].Clone();
225 | Main.cloud[j] = cloud2;
226 | }
227 | }
228 | }
229 | if (num < Main.numClouds)
230 | {
231 | Cloud.addCloud();
232 | return;
233 | }
234 | if (num > Main.numClouds)
235 | {
236 | int num2 = Main.rand.Next(num);
237 | int num3 = 0;
238 | while (Main.cloud[num2].kill && num3 < 100)
239 | {
240 | num3++;
241 | num2 = Main.rand.Next(num);
242 | }
243 | Main.cloud[num2].kill = true;
244 | }
245 | }
246 | public void Update()
247 | {
248 | if (Main.gameMenu)
249 | {
250 | this.position.X = this.position.X + Main.windSpeed * this.scale * 3f;
251 | }
252 | else
253 | {
254 | if (this.scale == 1f)
255 | {
256 | this.scale -= 0.0001f;
257 | }
258 | if ((double)this.scale == 1.15)
259 | {
260 | this.scale -= 0.0001f;
261 | }
262 | float num;
263 | if (this.scale < 1f)
264 | {
265 | num = 0.07f;
266 | float num2 = this.scale + 0.15f;
267 | num2 = (num2 + 1f) / 2f;
268 | num2 *= num2;
269 | num *= num2;
270 | }
271 | else
272 | {
273 | if ((double)this.scale <= 1.15)
274 | {
275 | num = 0.17f;
276 | float num3 = this.scale - 0.075f;
277 | num3 *= num3;
278 | num *= num3;
279 | }
280 | else
281 | {
282 | num = 0.23f;
283 | float num4 = this.scale - 0.15f - 0.075f;
284 | num4 *= num4;
285 | num *= num4;
286 | }
287 | }
288 | this.position.X = this.position.X + Main.windSpeed * num * 5f * (float)Main.dayRate;
289 | float num5 = Main.screenPosition.X - Main.screenLastPosition.X;
290 | this.position.X = this.position.X - num5 * num;
291 | }
292 | float num6 = 600f;
293 | if (!this.kill)
294 | {
295 | if (this.Alpha < 1f)
296 | {
297 | this.Alpha += 0.001f * (float)Main.dayRate;
298 | if (this.Alpha > 1f)
299 | {
300 | this.Alpha = 1f;
301 | }
302 | }
303 | }
304 | else
305 | {
306 | this.Alpha -= 0.001f * (float)Main.dayRate;
307 | if (this.Alpha <= 0f)
308 | {
309 | this.active = false;
310 | }
311 | }
312 | if (this.position.X + (float)Main.cloudTexture[this.type].Width * this.scale < -num6 || this.position.X > (float)Main.screenWidth + num6)
313 | {
314 | this.active = false;
315 | }
316 | this.rSpeed += (float)Cloud.rand.Next(-10, 11) * 2E-05f;
317 | if ((double)this.rSpeed > 0.0002)
318 | {
319 | this.rSpeed = 0.0002f;
320 | }
321 | if ((double)this.rSpeed < -0.0002)
322 | {
323 | this.rSpeed = -0.0002f;
324 | }
325 | if ((double)this.rotation > 0.02)
326 | {
327 | this.rotation = 0.02f;
328 | }
329 | if ((double)this.rotation < -0.02)
330 | {
331 | this.rotation = -0.02f;
332 | }
333 | this.rotation += this.rSpeed;
334 | this.width = (int)((float)Main.cloudTexture[this.type].Width * this.scale);
335 | this.height = (int)((float)Main.cloudTexture[this.type].Height * this.scale);
336 | if (this.type >= 9 && this.type <= 13 && (Main.cloudAlpha > 0f || Main.cloudBGActive >= 1f))
337 | {
338 | this.kill = true;
339 | }
340 | }
341 | }
342 | }
343 |
--------------------------------------------------------------------------------
/Terraria/Collision.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | namespace Terraria
4 | {
5 | public class Collision
6 | {
7 | public static bool honey;
8 | public static bool sloping;
9 | public static bool landMine;
10 | public static bool up;
11 | public static bool down;
12 | public static bool CanHit(Vector2 Position1, int Width1, int Height1, Vector2 Position2, int Width2, int Height2)
13 | {
14 | int num = (int)((Position1.X + (float)(Width1 / 2)) / 16f);
15 | int num2 = (int)((Position1.Y + (float)(Height1 / 2)) / 16f);
16 | int num3 = (int)((Position2.X + (float)(Width2 / 2)) / 16f);
17 | int num4 = (int)((Position2.Y + (float)(Height2 / 2)) / 16f);
18 | bool result;
19 | try
20 | {
21 | while (true)
22 | {
23 | int num5 = Math.Abs(num - num3);
24 | int num6 = Math.Abs(num2 - num4);
25 | if (num == num3 && num2 == num4)
26 | {
27 | break;
28 | }
29 | if (num5 > num6)
30 | {
31 | if (num < num3)
32 | {
33 | num++;
34 | }
35 | else
36 | {
37 | num--;
38 | }
39 | if (Main.tile[num, num2 - 1] == null)
40 | {
41 | Main.tile[num, num2 - 1] = new Tile();
42 | }
43 | if (Main.tile[num, num2 + 1] == null)
44 | {
45 | Main.tile[num, num2 + 1] = new Tile();
46 | }
47 | if (!Main.tile[num, num2 - 1].inActive() && Main.tile[num, num2 - 1].active() && Main.tileSolid[(int)Main.tile[num, num2 - 1].type] && !Main.tileSolidTop[(int)Main.tile[num, num2 - 1].type] && Main.tile[num, num2 - 1].slope() == 0 && !Main.tile[num, num2 - 1].halfBrick() && !Main.tile[num, num2 + 1].inActive() && Main.tile[num, num2 + 1].active() && Main.tileSolid[(int)Main.tile[num, num2 + 1].type] && !Main.tileSolidTop[(int)Main.tile[num, num2 + 1].type] && Main.tile[num, num2 + 1].slope() == 0 && !Main.tile[num, num2 + 1].halfBrick())
48 | {
49 | goto Block_19;
50 | }
51 | }
52 | else
53 | {
54 | if (num2 < num4)
55 | {
56 | num2++;
57 | }
58 | else
59 | {
60 | num2--;
61 | }
62 | if (Main.tile[num - 1, num2] == null)
63 | {
64 | Main.tile[num - 1, num2] = new Tile();
65 | }
66 | if (Main.tile[num + 1, num2] == null)
67 | {
68 | Main.tile[num + 1, num2] = new Tile();
69 | }
70 | if (!Main.tile[num - 1, num2].inActive() && Main.tile[num - 1, num2].active() && Main.tileSolid[(int)Main.tile[num - 1, num2].type] && !Main.tileSolidTop[(int)Main.tile[num - 1, num2].type] && Main.tile[num - 1, num2].slope() == 0 && !Main.tile[num - 1, num2].halfBrick() && !Main.tile[num + 1, num2].inActive() && Main.tile[num + 1, num2].active() && Main.tileSolid[(int)Main.tile[num + 1, num2].type] && !Main.tileSolidTop[(int)Main.tile[num + 1, num2].type] && Main.tile[num + 1, num2].slope() == 0 && !Main.tile[num + 1, num2].halfBrick())
71 | {
72 | goto Block_34;
73 | }
74 | }
75 | if (Main.tile[num, num2] == null)
76 | {
77 | Main.tile[num, num2] = new Tile();
78 | }
79 | if (!Main.tile[num, num2].inActive() && Main.tile[num, num2].active() && Main.tileSolid[(int)Main.tile[num, num2].type] && !Main.tileSolidTop[(int)Main.tile[num, num2].type])
80 | {
81 | goto Block_39;
82 | }
83 | }
84 | result = true;
85 | return result;
86 | Block_19:
87 | result = false;
88 | return result;
89 | Block_34:
90 | result = false;
91 | return result;
92 | Block_39:
93 | result = false;
94 | }
95 | catch
96 | {
97 | result = false;
98 | }
99 | return result;
100 | }
101 | public static bool EmptyTile(int i, int j, bool ignoreTiles = false)
102 | {
103 | Rectangle rectangle = new Rectangle(i * 16, j * 16, 16, 16);
104 | if (Main.tile[i, j].active() && !ignoreTiles)
105 | {
106 | return false;
107 | }
108 | for (int k = 0; k < 255; k++)
109 | {
110 | if (Main.player[k].active && rectangle.Intersects(new Rectangle((int)Main.player[k].position.X, (int)Main.player[k].position.Y, Main.player[k].width, Main.player[k].height)))
111 | {
112 | return false;
113 | }
114 | }
115 | for (int l = 0; l < 200; l++)
116 | {
117 | if (Main.npc[l].active && rectangle.Intersects(new Rectangle((int)Main.npc[l].position.X, (int)Main.npc[l].position.Y, Main.npc[l].width, Main.npc[l].height)))
118 | {
119 | return false;
120 | }
121 | }
122 | return true;
123 | }
124 | public static bool DrownCollision(Vector2 Position, int Width, int Height, float gravDir = -1f)
125 | {
126 | Vector2 vector = new Vector2(Position.X + (float)(Width / 2), Position.Y + (float)(Height / 2));
127 | int num = 10;
128 | int num2 = 12;
129 | if (num > Width)
130 | {
131 | num = Width;
132 | }
133 | if (num2 > Height)
134 | {
135 | num2 = Height;
136 | }
137 | vector = new Vector2(vector.X - (float)(num / 2), Position.Y + -2f);
138 | if (gravDir == -1f)
139 | {
140 | vector.Y += (float)(Height / 2 - 6);
141 | }
142 | int num3 = (int)(Position.X / 16f) - 1;
143 | int num4 = (int)((Position.X + (float)Width) / 16f) + 2;
144 | int num5 = (int)(Position.Y / 16f) - 1;
145 | int num6 = (int)((Position.Y + (float)Height) / 16f) + 2;
146 | if (num3 < 0)
147 | {
148 | num3 = 0;
149 | }
150 | if (num4 > Main.maxTilesX)
151 | {
152 | num4 = Main.maxTilesX;
153 | }
154 | if (num5 < 0)
155 | {
156 | num5 = 0;
157 | }
158 | if (num6 > Main.maxTilesY)
159 | {
160 | num6 = Main.maxTilesY;
161 | }
162 | for (int i = num3; i < num4; i++)
163 | {
164 | for (int j = num5; j < num6; j++)
165 | {
166 | if (Main.tile[i, j] != null && Main.tile[i, j].liquid > 0 && !Main.tile[i, j].lava())
167 | {
168 | Vector2 vector2;
169 | vector2.X = (float)(i * 16);
170 | vector2.Y = (float)(j * 16);
171 | int num7 = 16;
172 | float num8 = (float)(256 - (int)Main.tile[i, j].liquid);
173 | num8 /= 32f;
174 | vector2.Y += num8 * 2f;
175 | num7 -= (int)(num8 * 2f);
176 | if (vector.X + (float)num > vector2.X && vector.X < vector2.X + 16f && vector.Y + (float)num2 > vector2.Y && vector.Y < vector2.Y + (float)num7)
177 | {
178 | return true;
179 | }
180 | }
181 | }
182 | }
183 | return false;
184 | }
185 | public static bool WetCollision(Vector2 Position, int Width, int Height)
186 | {
187 | Collision.honey = false;
188 | Vector2 vector = new Vector2(Position.X + (float)(Width / 2), Position.Y + (float)(Height / 2));
189 | int num = 10;
190 | int num2 = Height / 2;
191 | if (num > Width)
192 | {
193 | num = Width;
194 | }
195 | if (num2 > Height)
196 | {
197 | num2 = Height;
198 | }
199 | vector = new Vector2(vector.X - (float)(num / 2), vector.Y - (float)(num2 / 2));
200 | int num3 = (int)(Position.X / 16f) - 1;
201 | int num4 = (int)((Position.X + (float)Width) / 16f) + 2;
202 | int num5 = (int)(Position.Y / 16f) - 1;
203 | int num6 = (int)((Position.Y + (float)Height) / 16f) + 2;
204 | if (num3 < 0)
205 | {
206 | num3 = 0;
207 | }
208 | if (num4 > Main.maxTilesX)
209 | {
210 | num4 = Main.maxTilesX;
211 | }
212 | if (num5 < 0)
213 | {
214 | num5 = 0;
215 | }
216 | if (num6 > Main.maxTilesY)
217 | {
218 | num6 = Main.maxTilesY;
219 | }
220 | for (int i = num3; i < num4; i++)
221 | {
222 | for (int j = num5; j < num6; j++)
223 | {
224 | if (Main.tile[i, j] != null)
225 | {
226 | if (Main.tile[i, j].liquid > 0)
227 | {
228 | Vector2 vector2;
229 | vector2.X = (float)(i * 16);
230 | vector2.Y = (float)(j * 16);
231 | int num7 = 16;
232 | float num8 = (float)(256 - (int)Main.tile[i, j].liquid);
233 | num8 /= 32f;
234 | vector2.Y += num8 * 2f;
235 | num7 -= (int)(num8 * 2f);
236 | if (vector.X + (float)num > vector2.X && vector.X < vector2.X + 16f && vector.Y + (float)num2 > vector2.Y && vector.Y < vector2.Y + (float)num7)
237 | {
238 | if (Main.tile[i, j].honey())
239 | {
240 | Collision.honey = true;
241 | }
242 | return true;
243 | }
244 | }
245 | else
246 | {
247 | if (Main.tile[i, j].active() && Main.tile[i, j].slope() != 0 && Main.tile[i, j - 1].liquid > 0)
248 | {
249 | Vector2 vector2;
250 | vector2.X = (float)(i * 16);
251 | vector2.Y = (float)(j * 16);
252 | int num9 = 16;
253 | if (vector.X + (float)num > vector2.X && vector.X < vector2.X + 16f && vector.Y + (float)num2 > vector2.Y && vector.Y < vector2.Y + (float)num9)
254 | {
255 | if (Main.tile[i, j - 1].honey())
256 | {
257 | Collision.honey = true;
258 | }
259 | return true;
260 | }
261 | }
262 | }
263 | }
264 | }
265 | }
266 | return false;
267 | }
268 | public static bool LavaCollision(Vector2 Position, int Width, int Height)
269 | {
270 | int num = (int)(Position.X / 16f) - 1;
271 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
272 | int num3 = (int)(Position.Y / 16f) - 1;
273 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
274 | if (num < 0)
275 | {
276 | num = 0;
277 | }
278 | if (num2 > Main.maxTilesX)
279 | {
280 | num2 = Main.maxTilesX;
281 | }
282 | if (num3 < 0)
283 | {
284 | num3 = 0;
285 | }
286 | if (num4 > Main.maxTilesY)
287 | {
288 | num4 = Main.maxTilesY;
289 | }
290 | for (int i = num; i < num2; i++)
291 | {
292 | for (int j = num3; j < num4; j++)
293 | {
294 | if (Main.tile[i, j] != null && Main.tile[i, j].liquid > 0 && Main.tile[i, j].lava())
295 | {
296 | Vector2 vector;
297 | vector.X = (float)(i * 16);
298 | vector.Y = (float)(j * 16);
299 | int num5 = 16;
300 | float num6 = (float)(256 - (int)Main.tile[i, j].liquid);
301 | num6 /= 32f;
302 | vector.Y += num6 * 2f;
303 | num5 -= (int)(num6 * 2f);
304 | if (Position.X + (float)Width > vector.X && Position.X < vector.X + 16f && Position.Y + (float)Height > vector.Y && Position.Y < vector.Y + (float)num5)
305 | {
306 | return true;
307 | }
308 | }
309 | }
310 | }
311 | return false;
312 | }
313 | public static Vector4 WalkDownSlope(Vector2 Position, Vector2 Velocity, int Width, int Height, float gravity = 0f)
314 | {
315 | if (Velocity.Y != gravity)
316 | {
317 | return new Vector4(Position, Velocity.X, Velocity.Y);
318 | }
319 | Vector2 vector = Position;
320 | int num = (int)(vector.X / 16f);
321 | int num2 = (int)((vector.X + (float)Width) / 16f);
322 | int num3 = (int)((Position.Y + (float)Height + 4f) / 16f);
323 | float num4 = (float)((num3 + 3) * 16);
324 | int num5 = 0;
325 | int num6 = 0;
326 | int num7 = 1;
327 | if (Velocity.X < 0f)
328 | {
329 | num7 = 2;
330 | }
331 | for (int i = num; i <= num2; i++)
332 | {
333 | for (int j = num3; j <= num3 + 1; j++)
334 | {
335 | if (Main.tile[i, j] == null)
336 | {
337 | Main.tile[i, j] = new Tile();
338 | }
339 | if (Main.tile[i, j].nactive() && (Main.tileSolid[(int)Main.tile[i, j].type] || Main.tileSolidTop[(int)Main.tile[i, j].type]))
340 | {
341 | int num8 = j * 16;
342 | if (Main.tile[i, j].halfBrick())
343 | {
344 | num8 += 8;
345 | }
346 | Rectangle rectangle = new Rectangle(i * 16, j * 16 - 17, 16, 16);
347 | if (rectangle.Intersects(new Rectangle((int)Position.X, (int)Position.Y, Width, Height)) && (float)num8 <= num4)
348 | {
349 | if (num4 == (float)num8)
350 | {
351 | if (Main.tile[i, j].slope() != 0)
352 | {
353 | if (Main.tile[num5, num6].slope() != 0)
354 | {
355 | if ((int)Main.tile[i, j].slope() == num7)
356 | {
357 | num4 = (float)num8;
358 | num5 = i;
359 | num6 = j;
360 | }
361 | }
362 | else
363 | {
364 | num4 = (float)num8;
365 | num5 = i;
366 | num6 = j;
367 | }
368 | }
369 | }
370 | else
371 | {
372 | num4 = (float)num8;
373 | num5 = i;
374 | num6 = j;
375 | }
376 | }
377 | }
378 | }
379 | }
380 | int num9 = num5;
381 | int num10 = num6;
382 | if (Main.tile[num9, num10] != null && Main.tile[num9, num10].slope() > 0)
383 | {
384 | int num11 = (int)Main.tile[num9, num10].slope();
385 | Vector2 vector2;
386 | vector2.X = (float)(num9 * 16);
387 | vector2.Y = (float)(num10 * 16);
388 | if (num11 == 2)
389 | {
390 | float num12 = vector2.X + 16f - (Position.X + (float)Width);
391 | if (Position.Y + (float)Height >= vector2.Y + num12 && Velocity.X < 0f)
392 | {
393 | Velocity.Y += Math.Abs(Velocity.X);
394 | }
395 | }
396 | else
397 | {
398 | if (num11 == 1)
399 | {
400 | float num12 = Position.X - vector2.X;
401 | if (Position.Y + (float)Height >= vector2.Y + num12 && Velocity.X > 0f)
402 | {
403 | Velocity.Y += Math.Abs(Velocity.X);
404 | }
405 | }
406 | }
407 | }
408 | return new Vector4(Position, Velocity.X, Velocity.Y);
409 | }
410 | public static Vector4 SlopeCollision(Vector2 Position, Vector2 Velocity, int Width, int Height, float gravity = 0f)
411 | {
412 | int num = 0;
413 | float y = Position.Y;
414 | Collision.sloping = false;
415 | Vector2 vector = Position;
416 | Vector2 vector2 = Position;
417 | Vector2 vector3 = Velocity;
418 | int num2 = (int)(Position.X / 16f) - 1;
419 | int num3 = (int)((Position.X + (float)Width) / 16f) + 2;
420 | int num4 = (int)(Position.Y / 16f) - 1;
421 | int num5 = (int)((Position.Y + (float)Height) / 16f) + 2;
422 | if (num2 < 0)
423 | {
424 | num2 = 0;
425 | }
426 | if (num3 > Main.maxTilesX)
427 | {
428 | num3 = Main.maxTilesX;
429 | }
430 | if (num4 < 0)
431 | {
432 | num4 = 0;
433 | }
434 | if (num5 > Main.maxTilesY)
435 | {
436 | num5 = Main.maxTilesY;
437 | }
438 | for (int i = num2; i < num3; i++)
439 | {
440 | for (int j = num4; j < num5; j++)
441 | {
442 | if (Main.tile[i, j] != null && Main.tile[i, j].active() && !Main.tile[i, j].inActive() && (Main.tileSolid[(int)Main.tile[i, j].type] || (Main.tileSolidTop[(int)Main.tile[i, j].type] && Main.tile[i, j].frameY == 0)))
443 | {
444 | Vector2 vector4;
445 | vector4.X = (float)(i * 16);
446 | vector4.Y = (float)(j * 16);
447 | int num6 = 16;
448 | if (Main.tile[i, j].halfBrick())
449 | {
450 | vector4.Y += 8f;
451 | num6 -= 8;
452 | }
453 | if (Position.X + (float)Width > vector4.X && Position.X < vector4.X + 16f && Position.Y + (float)Height > vector4.Y && Position.Y < vector4.Y + (float)num6)
454 | {
455 | bool flag = true;
456 | if (Main.tile[i, j].slope() > 0)
457 | {
458 | if (Main.tile[i, j].slope() == 1 && vector.Y + (float)Height - Math.Abs(Velocity.X) - 1f <= vector4.Y + (float)num6 && vector.X >= vector4.X)
459 | {
460 | flag = true;
461 | }
462 | if (Main.tile[i, j].slope() == 2 && vector.Y + (float)Height - Math.Abs(Velocity.X) - 1f <= vector4.Y + (float)num6 && vector.X + (float)Width <= vector4.X + 16f)
463 | {
464 | flag = true;
465 | }
466 | }
467 | if (flag)
468 | {
469 | if (Width == 18)
470 | {
471 | }
472 | if (Width == 18)
473 | {
474 | }
475 | int num7 = (int)Main.tile[i, j].slope();
476 | vector4.X = (float)(i * 16);
477 | vector4.Y = (float)(j * 16);
478 | if (Position.X + (float)Width > vector4.X && Position.X < vector4.X + 16f && Position.Y + (float)Height > vector4.Y && Position.Y < vector4.Y + 16f)
479 | {
480 | if (num7 == 2)
481 | {
482 | float num8 = vector4.X + 16f - (Position.X + (float)Width);
483 | if (num8 >= 0f)
484 | {
485 | if (Position.Y + (float)Height >= vector4.Y + num8)
486 | {
487 | float num9 = vector4.Y - (vector.Y + (float)Height) + num8;
488 | if (Position.Y + num9 < y)
489 | {
490 | vector2.Y = Position.Y + num9;
491 | y = vector2.Y;
492 | if (vector3.Y > 0f)
493 | {
494 | vector3.Y = 0f;
495 | }
496 | num = num7;
497 | }
498 | }
499 | }
500 | else
501 | {
502 | float num10 = vector4.Y - (float)Height;
503 | if (vector2.Y > num10)
504 | {
505 | vector2.Y = num10;
506 | if (vector3.Y > 0f)
507 | {
508 | vector3.Y = 0f;
509 | }
510 | }
511 | }
512 | }
513 | else
514 | {
515 | if (num7 == 1)
516 | {
517 | float num8 = Position.X - vector4.X;
518 | if (num8 >= 0f)
519 | {
520 | if (Position.Y + (float)Height >= vector4.Y + num8)
521 | {
522 | float num11 = vector4.Y - (vector.Y + (float)Height) + num8;
523 | if (Position.Y + num11 < y)
524 | {
525 | vector2.Y = Position.Y + num11;
526 | y = vector2.Y;
527 | if (vector3.Y > 0f)
528 | {
529 | vector3.Y = 0f;
530 | }
531 | num = num7;
532 | }
533 | }
534 | }
535 | else
536 | {
537 | float num12 = vector4.Y - (float)Height;
538 | if (vector2.Y > num12)
539 | {
540 | vector2.Y = num12;
541 | if (vector3.Y > 0f)
542 | {
543 | vector3.Y = 0f;
544 | }
545 | }
546 | }
547 | }
548 | }
549 | }
550 | }
551 | }
552 | }
553 | }
554 | }
555 | Vector2 position = Position;
556 | Vector2 velocity = vector2 - Position;
557 | Vector2 vector5 = Collision.TileCollision(position, velocity, Width, Height, false, false);
558 | if (vector5.Y > velocity.Y)
559 | {
560 | float num13 = velocity.Y - vector5.Y;
561 | vector2.Y = Position.Y + vector5.Y;
562 | if (num == 1)
563 | {
564 | vector2.X = Position.X - num13;
565 | }
566 | else
567 | {
568 | vector2.X = Position.X + num13;
569 | }
570 | vector3.X = 0f;
571 | vector3.Y = 0f;
572 | Collision.up = false;
573 | }
574 | return new Vector4(vector2, vector3.X, vector3.Y);
575 | }
576 | public static Vector2 noSlopeCollision(Vector2 Position, Vector2 Velocity, int Width, int Height, bool fallThrough = false, bool fall2 = false)
577 | {
578 | Collision.up = false;
579 | Collision.down = false;
580 | Vector2 result = Velocity;
581 | Vector2 vector = Velocity;
582 | Vector2 vector2 = Position + Velocity;
583 | Vector2 vector3 = Position;
584 | int num = (int)(Position.X / 16f) - 1;
585 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
586 | int num3 = (int)(Position.Y / 16f) - 1;
587 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
588 | int num5 = -1;
589 | int num6 = -1;
590 | int num7 = -1;
591 | int num8 = -1;
592 | if (num < 0)
593 | {
594 | num = 0;
595 | }
596 | if (num2 > Main.maxTilesX)
597 | {
598 | num2 = Main.maxTilesX;
599 | }
600 | if (num3 < 0)
601 | {
602 | num3 = 0;
603 | }
604 | if (num4 > Main.maxTilesY)
605 | {
606 | num4 = Main.maxTilesY;
607 | }
608 | float num9 = (float)((num4 + 3) * 16);
609 | for (int i = num; i < num2; i++)
610 | {
611 | for (int j = num3; j < num4; j++)
612 | {
613 | if (Main.tile[i, j] != null && Main.tile[i, j].active() && (Main.tileSolid[(int)Main.tile[i, j].type] || (Main.tileSolidTop[(int)Main.tile[i, j].type] && Main.tile[i, j].frameY == 0)))
614 | {
615 | Vector2 vector4;
616 | vector4.X = (float)(i * 16);
617 | vector4.Y = (float)(j * 16);
618 | int num10 = 16;
619 | if (Main.tile[i, j].halfBrick())
620 | {
621 | vector4.Y += 8f;
622 | num10 -= 8;
623 | }
624 | if (vector2.X + (float)Width > vector4.X && vector2.X < vector4.X + 16f && vector2.Y + (float)Height > vector4.Y && vector2.Y < vector4.Y + (float)num10)
625 | {
626 | if (vector3.Y + (float)Height <= vector4.Y)
627 | {
628 | Collision.down = true;
629 | if ((!Main.tileSolidTop[(int)Main.tile[i, j].type] || !fallThrough || (Velocity.Y > 1f && !fall2)) && num9 > vector4.Y)
630 | {
631 | num7 = i;
632 | num8 = j;
633 | if (num10 < 16)
634 | {
635 | num8++;
636 | }
637 | if (num7 != num5)
638 | {
639 | result.Y = vector4.Y - (vector3.Y + (float)Height);
640 | num9 = vector4.Y;
641 | }
642 | }
643 | }
644 | else
645 | {
646 | if (vector3.X + (float)Width <= vector4.X && !Main.tileSolidTop[(int)Main.tile[i, j].type])
647 | {
648 | num5 = i;
649 | num6 = j;
650 | if (num6 != num8)
651 | {
652 | result.X = vector4.X - (vector3.X + (float)Width);
653 | }
654 | if (num7 == num5)
655 | {
656 | result.Y = vector.Y;
657 | }
658 | }
659 | else
660 | {
661 | if (vector3.X >= vector4.X + 16f && !Main.tileSolidTop[(int)Main.tile[i, j].type])
662 | {
663 | num5 = i;
664 | num6 = j;
665 | if (num6 != num8)
666 | {
667 | result.X = vector4.X + 16f - vector3.X;
668 | }
669 | if (num7 == num5)
670 | {
671 | result.Y = vector.Y;
672 | }
673 | }
674 | else
675 | {
676 | if (vector3.Y >= vector4.Y + (float)num10 && !Main.tileSolidTop[(int)Main.tile[i, j].type])
677 | {
678 | Collision.up = true;
679 | num7 = i;
680 | num8 = j;
681 | result.Y = vector4.Y + (float)num10 - vector3.Y + 0.01f;
682 | if (num8 == num6)
683 | {
684 | result.X = vector.X;
685 | }
686 | }
687 | }
688 | }
689 | }
690 | }
691 | }
692 | }
693 | }
694 | return result;
695 | }
696 | public static Vector2 TileCollision(Vector2 Position, Vector2 Velocity, int Width, int Height, bool fallThrough = false, bool fall2 = false)
697 | {
698 | Collision.up = false;
699 | Collision.down = false;
700 | Vector2 result = Velocity;
701 | Vector2 vector = Velocity;
702 | Vector2 vector2 = Position + Velocity;
703 | Vector2 vector3 = Position;
704 | int num = (int)(Position.X / 16f) - 1;
705 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
706 | int num3 = (int)(Position.Y / 16f) - 1;
707 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
708 | int num5 = -1;
709 | int num6 = -1;
710 | int num7 = -1;
711 | int num8 = -1;
712 | if (num < 0)
713 | {
714 | num = 0;
715 | }
716 | if (num2 > Main.maxTilesX)
717 | {
718 | num2 = Main.maxTilesX;
719 | }
720 | if (num3 < 0)
721 | {
722 | num3 = 0;
723 | }
724 | if (num4 > Main.maxTilesY)
725 | {
726 | num4 = Main.maxTilesY;
727 | }
728 | float num9 = (float)((num4 + 3) * 16);
729 | for (int i = num; i < num2; i++)
730 | {
731 | for (int j = num3; j < num4; j++)
732 | {
733 | if (Main.tile[i, j] != null && Main.tile[i, j].active() && !Main.tile[i, j].inActive() && (Main.tileSolid[(int)Main.tile[i, j].type] || (Main.tileSolidTop[(int)Main.tile[i, j].type] && Main.tile[i, j].frameY == 0)))
734 | {
735 | Vector2 vector4;
736 | vector4.X = (float)(i * 16);
737 | vector4.Y = (float)(j * 16);
738 | int num10 = 16;
739 | if (Main.tile[i, j].halfBrick())
740 | {
741 | vector4.Y += 8f;
742 | num10 -= 8;
743 | }
744 | if (vector2.X + (float)Width > vector4.X && vector2.X < vector4.X + 16f && vector2.Y + (float)Height > vector4.Y && vector2.Y < vector4.Y + (float)num10)
745 | {
746 | bool flag = false;
747 | bool flag2 = false;
748 | if (Main.tile[i, j].slope() > 0)
749 | {
750 | flag = true;
751 | if (Main.tile[i, j].slope() == 1 && vector3.Y + (float)Height - Math.Abs(Velocity.X) <= vector4.Y + (float)num10 && vector3.X >= vector4.X)
752 | {
753 | flag2 = true;
754 | }
755 | if (Main.tile[i, j].slope() == 2 && vector3.Y + (float)Height - Math.Abs(Velocity.X) <= vector4.Y + (float)num10 && vector3.X + (float)Width <= vector4.X + 16f)
756 | {
757 | flag2 = true;
758 | }
759 | }
760 | if (!flag2)
761 | {
762 | if (vector3.Y + (float)Height <= vector4.Y)
763 | {
764 | Collision.down = true;
765 | if ((!Main.tileSolidTop[(int)Main.tile[i, j].type] || !fallThrough || (Velocity.Y > 1f && !fall2)) && num9 > vector4.Y)
766 | {
767 | num7 = i;
768 | num8 = j;
769 | if (num10 < 16)
770 | {
771 | num8++;
772 | }
773 | if (num7 != num5 && !flag)
774 | {
775 | result.Y = vector4.Y - (vector3.Y + (float)Height);
776 | num9 = vector4.Y;
777 | }
778 | }
779 | }
780 | else
781 | {
782 | if (vector3.X + (float)Width <= vector4.X && !Main.tileSolidTop[(int)Main.tile[i, j].type])
783 | {
784 | if (Main.tile[i - 1, j] == null)
785 | {
786 | Main.tile[i - 1, j] = new Tile();
787 | }
788 | if (Main.tile[i - 1, j].slope() != 2)
789 | {
790 | num5 = i;
791 | num6 = j;
792 | if (num6 != num8)
793 | {
794 | result.X = vector4.X - (vector3.X + (float)Width);
795 | }
796 | if (num7 == num5)
797 | {
798 | result.Y = vector.Y;
799 | }
800 | }
801 | }
802 | else
803 | {
804 | if (vector3.X >= vector4.X + 16f && !Main.tileSolidTop[(int)Main.tile[i, j].type])
805 | {
806 | if (Main.tile[i + 1, j] == null)
807 | {
808 | Main.tile[i + 1, j] = new Tile();
809 | }
810 | if (Main.tile[i + 1, j].slope() != 1)
811 | {
812 | num5 = i;
813 | num6 = j;
814 | if (num6 != num8)
815 | {
816 | result.X = vector4.X + 16f - vector3.X;
817 | }
818 | if (num7 == num5)
819 | {
820 | result.Y = vector.Y;
821 | }
822 | }
823 | }
824 | else
825 | {
826 | if (vector3.Y >= vector4.Y + (float)num10 && !Main.tileSolidTop[(int)Main.tile[i, j].type])
827 | {
828 | Collision.up = true;
829 | num7 = i;
830 | num8 = j;
831 | result.Y = vector4.Y + (float)num10 - vector3.Y + 0.01f;
832 | if (num8 == num6)
833 | {
834 | result.X = vector.X;
835 | }
836 | }
837 | }
838 | }
839 | }
840 | }
841 | }
842 | }
843 | }
844 | }
845 | return result;
846 | }
847 | public static bool SolidCollision(Vector2 Position, int Width, int Height)
848 | {
849 | int num = (int)(Position.X / 16f) - 1;
850 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
851 | int num3 = (int)(Position.Y / 16f) - 1;
852 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
853 | if (num < 0)
854 | {
855 | num = 0;
856 | }
857 | if (num2 > Main.maxTilesX)
858 | {
859 | num2 = Main.maxTilesX;
860 | }
861 | if (num3 < 0)
862 | {
863 | num3 = 0;
864 | }
865 | if (num4 > Main.maxTilesY)
866 | {
867 | num4 = Main.maxTilesY;
868 | }
869 | for (int i = num; i < num2; i++)
870 | {
871 | for (int j = num3; j < num4; j++)
872 | {
873 | if (Main.tile[i, j] != null && !Main.tile[i, j].inActive() && Main.tile[i, j].active() && Main.tileSolid[(int)Main.tile[i, j].type] && !Main.tileSolidTop[(int)Main.tile[i, j].type])
874 | {
875 | Vector2 vector;
876 | vector.X = (float)(i * 16);
877 | vector.Y = (float)(j * 16);
878 | int num5 = 16;
879 | if (Main.tile[i, j].halfBrick())
880 | {
881 | vector.Y += 8f;
882 | num5 -= 8;
883 | }
884 | if (Position.X + (float)Width > vector.X && Position.X < vector.X + 16f && Position.Y + (float)Height > vector.Y && Position.Y < vector.Y + (float)num5)
885 | {
886 | return true;
887 | }
888 | }
889 | }
890 | }
891 | return false;
892 | }
893 | public static Vector2 WaterCollision(Vector2 Position, Vector2 Velocity, int Width, int Height, bool fallThrough = false, bool fall2 = false, bool lavaWalk = true)
894 | {
895 | Vector2 result = Velocity;
896 | Vector2 vector = Position + Velocity;
897 | Vector2 vector2 = Position;
898 | int num = (int)(Position.X / 16f) - 1;
899 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
900 | int num3 = (int)(Position.Y / 16f) - 1;
901 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
902 | if (num < 0)
903 | {
904 | num = 0;
905 | }
906 | if (num2 > Main.maxTilesX)
907 | {
908 | num2 = Main.maxTilesX;
909 | }
910 | if (num3 < 0)
911 | {
912 | num3 = 0;
913 | }
914 | if (num4 > Main.maxTilesY)
915 | {
916 | num4 = Main.maxTilesY;
917 | }
918 | for (int i = num; i < num2; i++)
919 | {
920 | for (int j = num3; j < num4; j++)
921 | {
922 | if (Main.tile[i, j] != null && Main.tile[i, j].liquid > 0 && Main.tile[i, j - 1].liquid == 0 && (!Main.tile[i, j].lava() || lavaWalk))
923 | {
924 | int num5 = (int)(Main.tile[i, j].liquid / 32 * 2 + 2);
925 | Vector2 vector3;
926 | vector3.X = (float)(i * 16);
927 | vector3.Y = (float)(j * 16 + 16 - num5);
928 | if (vector.X + (float)Width > vector3.X && vector.X < vector3.X + 16f && vector.Y + (float)Height > vector3.Y && vector.Y < vector3.Y + (float)num5 && vector2.Y + (float)Height <= vector3.Y && !fallThrough)
929 | {
930 | result.Y = vector3.Y - (vector2.Y + (float)Height);
931 | }
932 | }
933 | }
934 | }
935 | return result;
936 | }
937 | public static Vector2 AnyCollision(Vector2 Position, Vector2 Velocity, int Width, int Height)
938 | {
939 | Vector2 result = Velocity;
940 | Vector2 vector = Velocity;
941 | Vector2 vector2 = Position + Velocity;
942 | Vector2 vector3 = Position;
943 | int num = (int)(Position.X / 16f) - 1;
944 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
945 | int num3 = (int)(Position.Y / 16f) - 1;
946 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
947 | int num5 = -1;
948 | int num6 = -1;
949 | int num7 = -1;
950 | int num8 = -1;
951 | if (num < 0)
952 | {
953 | num = 0;
954 | }
955 | if (num2 > Main.maxTilesX)
956 | {
957 | num2 = Main.maxTilesX;
958 | }
959 | if (num3 < 0)
960 | {
961 | num3 = 0;
962 | }
963 | if (num4 > Main.maxTilesY)
964 | {
965 | num4 = Main.maxTilesY;
966 | }
967 | for (int i = num; i < num2; i++)
968 | {
969 | for (int j = num3; j < num4; j++)
970 | {
971 | if (Main.tile[i, j] != null && Main.tile[i, j].active() && !Main.tile[i, j].inActive())
972 | {
973 | Vector2 vector4;
974 | vector4.X = (float)(i * 16);
975 | vector4.Y = (float)(j * 16);
976 | int num9 = 16;
977 | if (Main.tile[i, j].halfBrick())
978 | {
979 | vector4.Y += 8f;
980 | num9 -= 8;
981 | }
982 | if (vector2.X + (float)Width > vector4.X && vector2.X < vector4.X + 16f && vector2.Y + (float)Height > vector4.Y && vector2.Y < vector4.Y + (float)num9)
983 | {
984 | if (vector3.Y + (float)Height <= vector4.Y)
985 | {
986 | num7 = i;
987 | num8 = j;
988 | if (num7 != num5)
989 | {
990 | result.Y = vector4.Y - (vector3.Y + (float)Height);
991 | }
992 | }
993 | else
994 | {
995 | if (vector3.X + (float)Width <= vector4.X && !Main.tileSolidTop[(int)Main.tile[i, j].type])
996 | {
997 | num5 = i;
998 | num6 = j;
999 | if (num6 != num8)
1000 | {
1001 | result.X = vector4.X - (vector3.X + (float)Width);
1002 | }
1003 | if (num7 == num5)
1004 | {
1005 | result.Y = vector.Y;
1006 | }
1007 | }
1008 | else
1009 | {
1010 | if (vector3.X >= vector4.X + 16f && !Main.tileSolidTop[(int)Main.tile[i, j].type])
1011 | {
1012 | num5 = i;
1013 | num6 = j;
1014 | if (num6 != num8)
1015 | {
1016 | result.X = vector4.X + 16f - vector3.X;
1017 | }
1018 | if (num7 == num5)
1019 | {
1020 | result.Y = vector.Y;
1021 | }
1022 | }
1023 | else
1024 | {
1025 | if (vector3.Y >= vector4.Y + (float)num9 && !Main.tileSolidTop[(int)Main.tile[i, j].type])
1026 | {
1027 | num7 = i;
1028 | num8 = j;
1029 | result.Y = vector4.Y + (float)num9 - vector3.Y + 0.01f;
1030 | if (num8 == num6)
1031 | {
1032 | result.X = vector.X + 0.01f;
1033 | }
1034 | }
1035 | }
1036 | }
1037 | }
1038 | }
1039 | }
1040 | }
1041 | }
1042 | return result;
1043 | }
1044 | public static void HitTiles(Vector2 Position, Vector2 Velocity, int Width, int Height)
1045 | {
1046 | Vector2 vector = Position + Velocity;
1047 | int num = (int)(Position.X / 16f) - 1;
1048 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
1049 | int num3 = (int)(Position.Y / 16f) - 1;
1050 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
1051 | if (num < 0)
1052 | {
1053 | num = 0;
1054 | }
1055 | if (num2 > Main.maxTilesX)
1056 | {
1057 | num2 = Main.maxTilesX;
1058 | }
1059 | if (num3 < 0)
1060 | {
1061 | num3 = 0;
1062 | }
1063 | if (num4 > Main.maxTilesY)
1064 | {
1065 | num4 = Main.maxTilesY;
1066 | }
1067 | for (int i = num; i < num2; i++)
1068 | {
1069 | for (int j = num3; j < num4; j++)
1070 | {
1071 | if (Main.tile[i, j] != null && !Main.tile[i, j].inActive() && Main.tile[i, j].active() && (Main.tileSolid[(int)Main.tile[i, j].type] || (Main.tileSolidTop[(int)Main.tile[i, j].type] && Main.tile[i, j].frameY == 0)))
1072 | {
1073 | Vector2 vector2;
1074 | vector2.X = (float)(i * 16);
1075 | vector2.Y = (float)(j * 16);
1076 | int num5 = 16;
1077 | if (Main.tile[i, j].halfBrick())
1078 | {
1079 | vector2.Y += 8f;
1080 | num5 -= 8;
1081 | }
1082 | if (vector.X + (float)Width >= vector2.X && vector.X <= vector2.X + 16f && vector.Y + (float)Height >= vector2.Y && vector.Y <= vector2.Y + (float)num5)
1083 | {
1084 | WorldGen.KillTile(i, j, true, true, false);
1085 | }
1086 | }
1087 | }
1088 | }
1089 | }
1090 | public static Vector2 HurtTiles(Vector2 Position, Vector2 Velocity, int Width, int Height, bool fireImmune = false)
1091 | {
1092 | Vector2 vector = Position;
1093 | int num = (int)(Position.X / 16f) - 1;
1094 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
1095 | int num3 = (int)(Position.Y / 16f) - 1;
1096 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
1097 | if (num < 0)
1098 | {
1099 | num = 0;
1100 | }
1101 | if (num2 > Main.maxTilesX)
1102 | {
1103 | num2 = Main.maxTilesX;
1104 | }
1105 | if (num3 < 0)
1106 | {
1107 | num3 = 0;
1108 | }
1109 | if (num4 > Main.maxTilesY)
1110 | {
1111 | num4 = Main.maxTilesY;
1112 | }
1113 | for (int i = num; i < num2; i++)
1114 | {
1115 | for (int j = num3; j < num4; j++)
1116 | {
1117 | if (Main.tile[i, j] != null && Main.tile[i, j].slope() == 0 && !Main.tile[i, j].inActive() && Main.tile[i, j].active() && (Main.tile[i, j].type == 32 || Main.tile[i, j].type == 37 || Main.tile[i, j].type == 48 || Main.tile[i, j].type == 232 || Main.tile[i, j].type == 53 || Main.tile[i, j].type == 57 || Main.tile[i, j].type == 58 || Main.tile[i, j].type == 69 || Main.tile[i, j].type == 76 || Main.tile[i, j].type == 112 || Main.tile[i, j].type == 116 || Main.tile[i, j].type == 123 || Main.tile[i, j].type == 224 || Main.tile[i, j].type == 234))
1118 | {
1119 | Vector2 vector2;
1120 | vector2.X = (float)(i * 16);
1121 | vector2.Y = (float)(j * 16);
1122 | int num5 = 0;
1123 | int type = (int)Main.tile[i, j].type;
1124 | int num6 = 16;
1125 | if (Main.tile[i, j].halfBrick())
1126 | {
1127 | vector2.Y += 8f;
1128 | num6 -= 8;
1129 | }
1130 | if (type == 32 || type == 69 || type == 80)
1131 | {
1132 | if (vector.X + (float)Width > vector2.X && vector.X < vector2.X + 16f && vector.Y + (float)Height > vector2.Y && (double)vector.Y < (double)(vector2.Y + (float)num6) + 0.01)
1133 | {
1134 | int num7 = 1;
1135 | if (vector.X + (float)(Width / 2) < vector2.X + 8f)
1136 | {
1137 | num7 = -1;
1138 | }
1139 | num5 = 10;
1140 | if (type == 69)
1141 | {
1142 | num5 = 17;
1143 | }
1144 | else
1145 | {
1146 | if (type == 80)
1147 | {
1148 | num5 = 6;
1149 | }
1150 | }
1151 | if (type == 32 || type == 69)
1152 | {
1153 | WorldGen.KillTile(i, j, false, false, false);
1154 | if (Main.netMode == 1 && !Main.tile[i, j].active() && Main.netMode == 1)
1155 | {
1156 | NetMessage.SendData(17, -1, -1, "", 4, (float)i, (float)j, 0f, 0);
1157 | }
1158 | }
1159 | return new Vector2((float)num7, (float)num5);
1160 | }
1161 | }
1162 | else
1163 | {
1164 | if (type == 53 || type == 112 || type == 116 || type == 123 || type == 224 || type == 234)
1165 | {
1166 | if (vector.X + (float)Width - 2f >= vector2.X && vector.X + 2f <= vector2.X + 16f && vector.Y + (float)Height - 2f >= vector2.Y && vector.Y + 2f <= vector2.Y + (float)num6)
1167 | {
1168 | int num8 = 1;
1169 | if (vector.X + (float)(Width / 2) < vector2.X + 8f)
1170 | {
1171 | num8 = -1;
1172 | }
1173 | num5 = 15;
1174 | return new Vector2((float)num8, (float)num5);
1175 | }
1176 | }
1177 | else
1178 | {
1179 | if (vector.X + (float)Width >= vector2.X && vector.X <= vector2.X + 16f && vector.Y + (float)Height >= vector2.Y && (double)vector.Y <= (double)(vector2.Y + (float)num6) + 0.01)
1180 | {
1181 | int num9 = 1;
1182 | if (vector.X + (float)(Width / 2) < vector2.X + 8f)
1183 | {
1184 | num9 = -1;
1185 | }
1186 | if (!fireImmune && (type == 37 || type == 58 || type == 76))
1187 | {
1188 | num5 = 20;
1189 | }
1190 | if (type == 48)
1191 | {
1192 | num5 = 40;
1193 | }
1194 | if (type == 232)
1195 | {
1196 | num5 = 60;
1197 | }
1198 | return new Vector2((float)num9, (float)num5);
1199 | }
1200 | }
1201 | }
1202 | }
1203 | }
1204 | }
1205 | return default(Vector2);
1206 | }
1207 | public static bool SwitchTiles(Vector2 Position, int Width, int Height, Vector2 oldPosition, int objType)
1208 | {
1209 | int num = (int)(Position.X / 16f) - 1;
1210 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
1211 | int num3 = (int)(Position.Y / 16f) - 1;
1212 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
1213 | if (num < 0)
1214 | {
1215 | num = 0;
1216 | }
1217 | if (num2 > Main.maxTilesX)
1218 | {
1219 | num2 = Main.maxTilesX;
1220 | }
1221 | if (num3 < 0)
1222 | {
1223 | num3 = 0;
1224 | }
1225 | if (num4 > Main.maxTilesY)
1226 | {
1227 | num4 = Main.maxTilesY;
1228 | }
1229 | for (int i = num; i < num2; i++)
1230 | {
1231 | for (int j = num3; j < num4; j++)
1232 | {
1233 | if (Main.tile[i, j] != null && Main.tile[i, j].active() && (Main.tile[i, j].type == 135 || Main.tile[i, j].type == 210))
1234 | {
1235 | Vector2 vector;
1236 | vector.X = (float)(i * 16);
1237 | vector.Y = (float)(j * 16 + 12);
1238 | if (Position.X + (float)Width > vector.X && Position.X < vector.X + 16f && Position.Y + (float)Height > vector.Y && (double)Position.Y < (double)vector.Y + 4.01)
1239 | {
1240 | if (Main.tile[i, j].type == 210)
1241 | {
1242 | WorldGen.ExplodeMine(i, j);
1243 | }
1244 | else
1245 | {
1246 | if (oldPosition.X + (float)Width <= vector.X || oldPosition.X >= vector.X + 16f || oldPosition.Y + (float)Height <= vector.Y || (double)oldPosition.Y >= (double)vector.Y + 16.01)
1247 | {
1248 | int num5 = (int)(Main.tile[i, j].frameY / 18);
1249 | bool flag = true;
1250 | if ((num5 == 4 || num5 == 2 || num5 == 3 || num5 == 6) && objType != 1)
1251 | {
1252 | flag = false;
1253 | }
1254 | if (num5 == 5 && objType == 1)
1255 | {
1256 | flag = false;
1257 | }
1258 | if (flag)
1259 | {
1260 | WorldGen.hitSwitch(i, j);
1261 | NetMessage.SendData(59, -1, -1, "", i, (float)j, 0f, 0f, 0);
1262 | return true;
1263 | }
1264 | }
1265 | }
1266 | }
1267 | }
1268 | }
1269 | }
1270 | return false;
1271 | }
1272 | public static Vector2 StickyTiles(Vector2 Position, Vector2 Velocity, int Width, int Height)
1273 | {
1274 | Vector2 vector = Position;
1275 | int num = (int)(Position.X / 16f) - 1;
1276 | int num2 = (int)((Position.X + (float)Width) / 16f) + 2;
1277 | int num3 = (int)(Position.Y / 16f) - 1;
1278 | int num4 = (int)((Position.Y + (float)Height) / 16f) + 2;
1279 | if (num < 0)
1280 | {
1281 | num = 0;
1282 | }
1283 | if (num2 > Main.maxTilesX)
1284 | {
1285 | num2 = Main.maxTilesX;
1286 | }
1287 | if (num3 < 0)
1288 | {
1289 | num3 = 0;
1290 | }
1291 | if (num4 > Main.maxTilesY)
1292 | {
1293 | num4 = Main.maxTilesY;
1294 | }
1295 | for (int i = num; i < num2; i++)
1296 | {
1297 | for (int j = num3; j < num4; j++)
1298 | {
1299 | if (Main.tile[i, j] != null && Main.tile[i, j].active())
1300 | {
1301 | if (Main.tile[i, j].type == 51)
1302 | {
1303 | int num5 = 0;
1304 | Vector2 vector2;
1305 | vector2.X = (float)(i * 16);
1306 | vector2.Y = (float)(j * 16);
1307 | if (vector.X + (float)Width > vector2.X - (float)num5 && vector.X < vector2.X + 16f + (float)num5 && vector.Y + (float)Height > vector2.Y && (double)vector.Y < (double)vector2.Y + 16.01)
1308 | {
1309 | if (Main.tile[i, j].type == 51 && (double)(Math.Abs(Velocity.X) + Math.Abs(Velocity.Y)) > 0.7 && Main.rand.Next(30) == 0)
1310 | {
1311 | Dust.NewDust(new Vector2((float)(i * 16), (float)(j * 16)), 16, 16, 30, 0f, 0f, 0, default(Color), 1f);
1312 | }
1313 | return new Vector2((float)i, (float)j);
1314 | }
1315 | }
1316 | else
1317 | {
1318 | if (Main.tile[i, j].type == 229 && Main.tile[i, j].slope() == 0)
1319 | {
1320 | int num6 = 1;
1321 | Vector2 vector2;
1322 | vector2.X = (float)(i * 16);
1323 | vector2.Y = (float)(j * 16);
1324 | float num7 = 16.01f;
1325 | if (Main.tile[i, j].halfBrick())
1326 | {
1327 | vector2.Y += 8f;
1328 | num7 -= 8f;
1329 | }
1330 | if (vector.X + (float)Width > vector2.X - (float)num6 && vector.X < vector2.X + 16f + (float)num6 && vector.Y + (float)Height > vector2.Y && vector.Y < vector2.Y + num7)
1331 | {
1332 | if (Main.tile[i, j].type == 51 && (double)(Math.Abs(Velocity.X) + Math.Abs(Velocity.Y)) > 0.7 && Main.rand.Next(30) == 0)
1333 | {
1334 | Dust.NewDust(new Vector2((float)(i * 16), (float)(j * 16)), 16, 16, 30, 0f, 0f, 0, default(Color), 1f);
1335 | }
1336 | return new Vector2((float)i, (float)j);
1337 | }
1338 | }
1339 | }
1340 | }
1341 | }
1342 | }
1343 | return new Vector2(-1f, -1f);
1344 | }
1345 | public static bool SolidTiles(int startX, int endX, int startY, int endY)
1346 | {
1347 | if (startX < 0)
1348 | {
1349 | return true;
1350 | }
1351 | if (endX >= Main.maxTilesX)
1352 | {
1353 | return true;
1354 | }
1355 | if (startY < 0)
1356 | {
1357 | return true;
1358 | }
1359 | if (endY >= Main.maxTilesY)
1360 | {
1361 | return true;
1362 | }
1363 | for (int i = startX; i < endX + 1; i++)
1364 | {
1365 | for (int j = startY; j < endY + 1; j++)
1366 | {
1367 | if (Main.tile[i, j] == null)
1368 | {
1369 | return false;
1370 | }
1371 | if (Main.tile[i, j].active() && !Main.tile[i, j].inActive() && Main.tileSolid[(int)Main.tile[i, j].type] && !Main.tileSolidTop[(int)Main.tile[i, j].type])
1372 | {
1373 | return true;
1374 | }
1375 | }
1376 | }
1377 | return false;
1378 | }
1379 | }
1380 | }
1381 |
--------------------------------------------------------------------------------
/Terraria/CombatText.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | namespace Terraria
4 | {
5 | public class CombatText
6 | {
7 | public Vector2 position;
8 | public Vector2 velocity;
9 | public float alpha;
10 | public int alphaDir = 1;
11 | public string text;
12 | public float scale = 1f;
13 | public float rotation;
14 | public Color color;
15 | public bool active;
16 | public int lifeTime;
17 | public bool crit;
18 | public bool dot;
19 | public static void NewText(Rectangle location, Color color, string text, bool Crit = false, bool dot = false)
20 | {
21 | if (Main.netMode == 2)
22 | {
23 | return;
24 | }
25 | int i = 0;
26 | while (i < 100)
27 | {
28 | if (!Main.combatText[i].active)
29 | {
30 | int num = 0;
31 | if (Crit)
32 | {
33 | num = 1;
34 | }
35 | Vector2 vector = Main.fontCombatText[num].MeasureString(text);
36 | Main.combatText[i].alpha = 1f;
37 | Main.combatText[i].alphaDir = -1;
38 | Main.combatText[i].active = true;
39 | Main.combatText[i].scale = 0f;
40 | Main.combatText[i].rotation = 0f;
41 | Main.combatText[i].position.X = (float)location.X + (float)location.Width * 0.5f - vector.X * 0.5f;
42 | Main.combatText[i].position.Y = (float)location.Y + (float)location.Height * 0.25f - vector.Y * 0.5f;
43 | CombatText expr_FB_cp_0 = Main.combatText[i];
44 | expr_FB_cp_0.position.X = expr_FB_cp_0.position.X + (float)Main.rand.Next(-(int)((double)location.Width * 0.5), (int)((double)location.Width * 0.5) + 1);
45 | CombatText expr_147_cp_0 = Main.combatText[i];
46 | expr_147_cp_0.position.Y = expr_147_cp_0.position.Y + (float)Main.rand.Next(-(int)((double)location.Height * 0.5), (int)((double)location.Height * 0.5) + 1);
47 | Main.combatText[i].color = color;
48 | Main.combatText[i].text = text;
49 | Main.combatText[i].velocity.Y = -7f;
50 | if (Main.player[Main.myPlayer].gravDir == -1f)
51 | {
52 | CombatText expr_1DA_cp_0 = Main.combatText[i];
53 | expr_1DA_cp_0.velocity.Y = expr_1DA_cp_0.velocity.Y * -1f;
54 | Main.combatText[i].position.Y = (float)location.Y + (float)location.Height * 0.75f + vector.Y * 0.5f;
55 | }
56 | Main.combatText[i].lifeTime = 60;
57 | Main.combatText[i].crit = Crit;
58 | Main.combatText[i].dot = dot;
59 | if (Crit)
60 | {
61 | Main.combatText[i].text = text;
62 | Main.combatText[i].color = new Color(255, 100, 30, 255);
63 | Main.combatText[i].lifeTime *= 2;
64 | CombatText expr_29C_cp_0 = Main.combatText[i];
65 | expr_29C_cp_0.velocity.Y = expr_29C_cp_0.velocity.Y * 2f;
66 | Main.combatText[i].velocity.X = (float)Main.rand.Next(-25, 26) * 0.05f;
67 | Main.combatText[i].rotation = (float)(Main.combatText[i].lifeTime / 2) * 0.002f;
68 | if (Main.combatText[i].velocity.X < 0f)
69 | {
70 | Main.combatText[i].rotation *= -1f;
71 | }
72 | }
73 | if (dot)
74 | {
75 | Main.combatText[i].velocity.Y = -4f;
76 | Main.combatText[i].lifeTime = 40;
77 | return;
78 | }
79 | break;
80 | }
81 | else
82 | {
83 | i++;
84 | }
85 | }
86 | }
87 | public void Update()
88 | {
89 | if (this.active)
90 | {
91 | this.alpha += (float)this.alphaDir * 0.05f;
92 | if ((double)this.alpha <= 0.6)
93 | {
94 | this.alphaDir = 1;
95 | }
96 | if (this.alpha >= 1f)
97 | {
98 | this.alpha = 1f;
99 | this.alphaDir = -1;
100 | }
101 | if (this.dot)
102 | {
103 | this.velocity.Y = this.velocity.Y + 0.15f;
104 | }
105 | else
106 | {
107 | this.velocity.Y = this.velocity.Y * 0.92f;
108 | if (this.crit)
109 | {
110 | this.velocity.Y = this.velocity.Y * 0.92f;
111 | }
112 | }
113 | this.velocity.X = this.velocity.X * 0.93f;
114 | this.position += this.velocity;
115 | this.lifeTime--;
116 | if (this.lifeTime <= 0)
117 | {
118 | this.scale -= 0.1f;
119 | if ((double)this.scale < 0.1)
120 | {
121 | this.active = false;
122 | }
123 | this.lifeTime = 0;
124 | if (this.crit)
125 | {
126 | this.alphaDir = -1;
127 | this.scale += 0.07f;
128 | return;
129 | }
130 | }
131 | else
132 | {
133 | if (this.crit)
134 | {
135 | if (this.velocity.X < 0f)
136 | {
137 | this.rotation += 0.001f;
138 | }
139 | else
140 | {
141 | this.rotation -= 0.001f;
142 | }
143 | }
144 | if (this.dot)
145 | {
146 | this.scale += 0.5f;
147 | if ((double)this.scale > 0.8)
148 | {
149 | this.scale = 0.8f;
150 | return;
151 | }
152 | }
153 | else
154 | {
155 | if (this.scale < 1f)
156 | {
157 | this.scale += 0.1f;
158 | }
159 | if (this.scale > 1f)
160 | {
161 | this.scale = 1f;
162 | }
163 | }
164 | }
165 | }
166 | }
167 | public static void UpdateCombatText()
168 | {
169 | for (int i = 0; i < 100; i++)
170 | {
171 | if (Main.combatText[i].active)
172 | {
173 | Main.combatText[i].Update();
174 | }
175 | }
176 | }
177 | }
178 | }
179 |
--------------------------------------------------------------------------------
/Terraria/Gore.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | namespace Terraria
4 | {
5 | public class Gore
6 | {
7 | public static int goreTime = 600;
8 | public Vector2 position;
9 | public Vector2 velocity;
10 | public float rotation;
11 | public float scale;
12 | public int alpha;
13 | public int type;
14 | public float light;
15 | public bool active;
16 | public bool sticky = true;
17 | public int timeLeft = Gore.goreTime;
18 | public void Update()
19 | {
20 | if (Main.netMode == 2)
21 | {
22 | return;
23 | }
24 | if (this.active)
25 | {
26 | if (this.type >= 276 && this.type <= 282)
27 | {
28 | this.velocity.X = this.velocity.X * 0.98f;
29 | this.velocity.Y = this.velocity.Y * 0.98f;
30 | if (this.velocity.Y < this.scale)
31 | {
32 | this.velocity.Y = this.velocity.Y + 0.05f;
33 | }
34 | if ((double)this.velocity.Y > 0.1)
35 | {
36 | if (this.velocity.X > 0f)
37 | {
38 | this.rotation += 0.01f;
39 | }
40 | else
41 | {
42 | this.rotation -= 0.01f;
43 | }
44 | }
45 | }
46 | else
47 | {
48 | if (this.type == 11 || this.type == 12 || this.type == 13 || this.type == 61 || this.type == 62 || this.type == 63 || this.type == 99 || this.type == 220 || this.type == 221 || this.type == 222 || (this.type >= 375 && this.type <= 377) || (this.type >= 435 && this.type <= 437))
49 | {
50 | this.velocity.Y = this.velocity.Y * 0.98f;
51 | this.velocity.X = this.velocity.X * 0.98f;
52 | this.scale -= 0.007f;
53 | if ((double)this.scale < 0.1)
54 | {
55 | this.scale = 0.1f;
56 | this.alpha = 255;
57 | }
58 | }
59 | else
60 | {
61 | if (this.type == 16 || this.type == 17)
62 | {
63 | this.velocity.Y = this.velocity.Y * 0.98f;
64 | this.velocity.X = this.velocity.X * 0.98f;
65 | this.scale -= 0.01f;
66 | if ((double)this.scale < 0.1)
67 | {
68 | this.scale = 0.1f;
69 | this.alpha = 255;
70 | }
71 | }
72 | else
73 | {
74 | if (this.type == 331)
75 | {
76 | this.alpha += 5;
77 | this.velocity.Y = this.velocity.Y * 0.95f;
78 | this.velocity.X = this.velocity.X * 0.95f;
79 | this.rotation = this.velocity.X * 0.1f;
80 | }
81 | else
82 | {
83 | if (this.type < 411 || this.type > 430)
84 | {
85 | this.velocity.Y = this.velocity.Y + 0.2f;
86 | }
87 | }
88 | }
89 | }
90 | }
91 | this.rotation += this.velocity.X * 0.1f;
92 | if (this.type >= 411 && this.type <= 430)
93 | {
94 | this.alpha = 50;
95 | this.velocity.X = (this.velocity.X * 50f + Main.windSpeed * 2f + (float)Main.rand.Next(-10, 11) * 0.1f) / 51f;
96 | this.velocity.Y = (this.velocity.Y * 50f + -0.25f + (float)Main.rand.Next(-10, 11) * 0.2f) / 51f;
97 | this.rotation = this.velocity.X * 0.3f;
98 | if (Main.goreLoaded[this.type])
99 | {
100 | Rectangle rectangle = new Rectangle((int)this.position.X, (int)this.position.Y, (int)((float)Main.goreTexture[this.type].Width * this.scale), (int)((float)Main.goreTexture[this.type].Height * this.scale));
101 | for (int i = 0; i < 255; i++)
102 | {
103 | if (Main.player[i].active && !Main.player[i].dead)
104 | {
105 | Rectangle value = new Rectangle((int)Main.player[i].position.X, (int)Main.player[i].position.Y, Main.player[i].width, Main.player[i].height);
106 | if (rectangle.Intersects(value))
107 | {
108 | this.timeLeft = 0;
109 | }
110 | }
111 | }
112 | if (Collision.SolidCollision(this.position, (int)((float)Main.goreTexture[this.type].Width * this.scale), (int)((float)Main.goreTexture[this.type].Height * this.scale)))
113 | {
114 | this.timeLeft = 0;
115 | }
116 | }
117 | if (this.timeLeft > 0)
118 | {
119 | if (Main.rand.Next(2) == 0)
120 | {
121 | this.timeLeft--;
122 | }
123 | if (Main.rand.Next(50) == 0)
124 | {
125 | this.timeLeft -= 5;
126 | }
127 | if (Main.rand.Next(100) == 0)
128 | {
129 | this.timeLeft -= 10;
130 | }
131 | }
132 | else
133 | {
134 | this.alpha = 255;
135 | if (Main.goreLoaded[this.type])
136 | {
137 | float num = (float)Main.goreTexture[this.type].Width * this.scale * 0.8f;
138 | float x = this.position.X;
139 | float y = this.position.Y;
140 | float num2 = (float)Main.goreTexture[this.type].Width * this.scale;
141 | float num3 = (float)Main.goreTexture[this.type].Height * this.scale;
142 | int num4 = 176;
143 | if (this.type >= 416 && this.type <= 420)
144 | {
145 | num4 = 177;
146 | }
147 | if (this.type >= 421 && this.type <= 425)
148 | {
149 | num4 = 178;
150 | }
151 | if (this.type >= 426 && this.type <= 430)
152 | {
153 | num4 = 179;
154 | }
155 | int num5 = 0;
156 | while ((float)num5 < num)
157 | {
158 | int num6 = Dust.NewDust(new Vector2(x, y), (int)num2, (int)num3, num4, 0f, 0f, 0, default(Color), 1f);
159 | Main.dust[num6].noGravity = true;
160 | Main.dust[num6].alpha = 100;
161 | Main.dust[num6].scale = this.scale;
162 | num5++;
163 | }
164 | }
165 | }
166 | }
167 | else
168 | {
169 | if (this.sticky)
170 | {
171 | int num7 = 32;
172 | if (Main.goreLoaded[this.type])
173 | {
174 | num7 = Main.goreTexture[this.type].Width;
175 | if (Main.goreTexture[this.type].Height < num7)
176 | {
177 | num7 = Main.goreTexture[this.type].Height;
178 | }
179 | }
180 | num7 = (int)((float)num7 * 0.9f);
181 | this.velocity = Collision.TileCollision(this.position, this.velocity, (int)((float)num7 * this.scale), (int)((float)num7 * this.scale), false, false);
182 | if (this.velocity.Y == 0f)
183 | {
184 | this.velocity.X = this.velocity.X * 0.97f;
185 | if ((double)this.velocity.X > -0.01 && (double)this.velocity.X < 0.01)
186 | {
187 | this.velocity.X = 0f;
188 | }
189 | }
190 | if (this.timeLeft > 0)
191 | {
192 | this.timeLeft--;
193 | }
194 | else
195 | {
196 | this.alpha++;
197 | }
198 | }
199 | else
200 | {
201 | this.alpha += 2;
202 | }
203 | }
204 | this.position += this.velocity;
205 | if (this.alpha >= 255)
206 | {
207 | this.active = false;
208 | }
209 | if (this.light > 0f)
210 | {
211 | float num8 = this.light * this.scale;
212 | float num9 = this.light * this.scale;
213 | float num10 = this.light * this.scale;
214 | if (this.type == 16)
215 | {
216 | num10 *= 0.3f;
217 | num9 *= 0.8f;
218 | }
219 | else
220 | {
221 | if (this.type == 17)
222 | {
223 | num9 *= 0.6f;
224 | num8 *= 0.3f;
225 | }
226 | }
227 | if (Main.goreLoaded[this.type])
228 | {
229 | Lighting.addLight((int)((this.position.X + (float)Main.goreTexture[this.type].Width * this.scale / 2f) / 16f), (int)((this.position.Y + (float)Main.goreTexture[this.type].Height * this.scale / 2f) / 16f), num8, num9, num10);
230 | return;
231 | }
232 | Lighting.addLight((int)((this.position.X + 32f * this.scale / 2f) / 16f), (int)((this.position.Y + 32f * this.scale / 2f) / 16f), num8, num9, num10);
233 | }
234 | }
235 | }
236 | public static int NewGore(Vector2 Position, Vector2 Velocity, int Type, float Scale = 1f)
237 | {
238 | if (Main.rand == null)
239 | {
240 | Main.rand = new Random();
241 | }
242 | if (Main.netMode == 2)
243 | {
244 | return 0;
245 | }
246 | int num = 500;
247 | for (int i = 0; i < 500; i++)
248 | {
249 | if (!Main.gore[i].active)
250 | {
251 | num = i;
252 | break;
253 | }
254 | }
255 | if (num == 500)
256 | {
257 | return num;
258 | }
259 | Main.gore[num].light = 0f;
260 | Main.gore[num].position = Position;
261 | Main.gore[num].velocity = Velocity;
262 | Gore expr_84_cp_0 = Main.gore[num];
263 | expr_84_cp_0.velocity.Y = expr_84_cp_0.velocity.Y - (float)Main.rand.Next(10, 31) * 0.1f;
264 | Gore expr_B1_cp_0 = Main.gore[num];
265 | expr_B1_cp_0.velocity.X = expr_B1_cp_0.velocity.X + (float)Main.rand.Next(-20, 21) * 0.1f;
266 | Main.gore[num].type = Type;
267 | Main.gore[num].active = true;
268 | Main.gore[num].alpha = 0;
269 | Main.gore[num].rotation = 0f;
270 | Main.gore[num].scale = Scale;
271 | if (Gore.goreTime == 0 || Type == 11 || Type == 12 || Type == 13 || Type == 16 || Type == 17 || Type == 61 || Type == 62 || Type == 63 || Type == 99 || Type == 220 || Type == 221 || Type == 222 || Type == 435 || Type == 436 || Type == 437)
272 | {
273 | Main.gore[num].sticky = false;
274 | }
275 | else
276 | {
277 | if (Type >= 375 && Type <= 377)
278 | {
279 | Main.gore[num].sticky = false;
280 | Main.gore[num].alpha = 100;
281 | }
282 | else
283 | {
284 | Main.gore[num].sticky = true;
285 | Main.gore[num].timeLeft = Gore.goreTime;
286 | }
287 | }
288 | if (Type == 16 || Type == 17)
289 | {
290 | Main.gore[num].alpha = 100;
291 | Main.gore[num].scale = 0.7f;
292 | Main.gore[num].light = 1f;
293 | }
294 | if (Type >= 411 && Type <= 430 && Main.goreLoaded[Type])
295 | {
296 | Main.gore[num].position.X = Position.X - (float)(Main.goreTexture[Type].Width / 2) * Scale;
297 | Main.gore[num].position.Y = Position.Y - (float)Main.goreTexture[Type].Height * Scale;
298 | Gore expr_28F_cp_0 = Main.gore[num];
299 | expr_28F_cp_0.velocity.Y = expr_28F_cp_0.velocity.Y * ((float)Main.rand.Next(90, 150) * 0.01f);
300 | Gore expr_2BF_cp_0 = Main.gore[num];
301 | expr_2BF_cp_0.velocity.X = expr_2BF_cp_0.velocity.X * ((float)Main.rand.Next(40, 90) * 0.01f);
302 | int num2 = Main.rand.Next(4) * 5;
303 | Main.gore[num].type += num2;
304 | Main.gore[num].timeLeft = Main.rand.Next(Gore.goreTime / 2, Gore.goreTime * 2);
305 | }
306 | return num;
307 | }
308 | public Color GetAlpha(Color newColor)
309 | {
310 | float num = (float)(255 - this.alpha) / 255f;
311 | int r;
312 | int g;
313 | int b;
314 | if (this.type == 16 || this.type == 17)
315 | {
316 | r = (int)newColor.R;
317 | g = (int)newColor.G;
318 | b = (int)newColor.B;
319 | }
320 | else
321 | {
322 | if (this.type == 331)
323 | {
324 | return new Color(255, 255, 255, 50);
325 | }
326 | r = (int)((float)newColor.R * num);
327 | g = (int)((float)newColor.G * num);
328 | b = (int)((float)newColor.B * num);
329 | }
330 | int num2 = (int)newColor.A - this.alpha;
331 | if (num2 < 0)
332 | {
333 | num2 = 0;
334 | }
335 | if (num2 > 255)
336 | {
337 | num2 = 255;
338 | }
339 | return new Color(r, g, b, num2);
340 | }
341 | }
342 | }
343 |
--------------------------------------------------------------------------------
/Terraria/ItemText.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | namespace Terraria
4 | {
5 | public class ItemText
6 | {
7 | public Vector2 position;
8 | public Vector2 velocity;
9 | public float alpha;
10 | public int alphaDir = 1;
11 | public string name;
12 | public int stack;
13 | public float scale = 1f;
14 | public float rotation;
15 | public Color color;
16 | public bool active;
17 | public int lifeTime;
18 | public static int activeTime = 60;
19 | public static int numActive;
20 | public static void NewText(Item newItem, int stack)
21 | {
22 | if (!Main.showItemText)
23 | {
24 | return;
25 | }
26 | if (newItem.name == null || !newItem.active)
27 | {
28 | return;
29 | }
30 | if (Main.netMode == 2)
31 | {
32 | return;
33 | }
34 | for (int i = 0; i < 20; i++)
35 | {
36 | if (Main.itemText[i].active && Main.itemText[i].name == newItem.name)
37 | {
38 | string text = string.Concat(new object[]
39 | {
40 | newItem.name,
41 | " (",
42 | Main.itemText[i].stack + stack,
43 | ")"
44 | });
45 | string text2 = newItem.name;
46 | if (Main.itemText[i].stack > 1)
47 | {
48 | object obj = text2;
49 | text2 = string.Concat(new object[]
50 | {
51 | obj,
52 | " (",
53 | Main.itemText[i].stack,
54 | ")"
55 | });
56 | }
57 | Vector2 vector = Main.fontMouseText.MeasureString(text2);
58 | vector = Main.fontMouseText.MeasureString(text);
59 | if (Main.itemText[i].lifeTime < 0)
60 | {
61 | Main.itemText[i].scale = 1f;
62 | }
63 | Main.itemText[i].lifeTime = 60;
64 | Main.itemText[i].stack += stack;
65 | Main.itemText[i].scale = 0f;
66 | Main.itemText[i].rotation = 0f;
67 | Main.itemText[i].position.X = newItem.position.X + (float)newItem.width * 0.5f - vector.X * 0.5f;
68 | Main.itemText[i].position.Y = newItem.position.Y + (float)newItem.height * 0.25f - vector.Y * 0.5f;
69 | Main.itemText[i].velocity.Y = -7f;
70 | return;
71 | }
72 | }
73 | int num = -1;
74 | for (int j = 0; j < 20; j++)
75 | {
76 | if (!Main.itemText[j].active)
77 | {
78 | num = j;
79 | break;
80 | }
81 | }
82 | if (num == -1)
83 | {
84 | double num2 = (double)Main.bottomWorld;
85 | for (int k = 0; k < 20; k++)
86 | {
87 | if (num2 > (double)Main.itemText[k].position.Y)
88 | {
89 | num = k;
90 | num2 = (double)Main.itemText[k].position.Y;
91 | }
92 | }
93 | }
94 | if (num >= 0)
95 | {
96 | string text3 = newItem.AffixName();
97 | if (stack > 1)
98 | {
99 | object obj2 = text3;
100 | text3 = string.Concat(new object[]
101 | {
102 | obj2,
103 | " (",
104 | stack,
105 | ")"
106 | });
107 | }
108 | Vector2 vector2 = Main.fontMouseText.MeasureString(text3);
109 | Main.itemText[num].alpha = 1f;
110 | Main.itemText[num].alphaDir = -1;
111 | Main.itemText[num].active = true;
112 | Main.itemText[num].scale = 0f;
113 | Main.itemText[num].rotation = 0f;
114 | Main.itemText[num].position.X = newItem.position.X + (float)newItem.width * 0.5f - vector2.X * 0.5f;
115 | Main.itemText[num].position.Y = newItem.position.Y + (float)newItem.height * 0.25f - vector2.Y * 0.5f;
116 | Main.itemText[num].color = Color.White;
117 | if (newItem.rare == 1)
118 | {
119 | Main.itemText[num].color = new Color(150, 150, 255);
120 | }
121 | else
122 | {
123 | if (newItem.rare == 2)
124 | {
125 | Main.itemText[num].color = new Color(150, 255, 150);
126 | }
127 | else
128 | {
129 | if (newItem.rare == 3)
130 | {
131 | Main.itemText[num].color = new Color(255, 200, 150);
132 | }
133 | else
134 | {
135 | if (newItem.rare == 4)
136 | {
137 | Main.itemText[num].color = new Color(255, 150, 150);
138 | }
139 | else
140 | {
141 | if (newItem.rare == 5)
142 | {
143 | Main.itemText[num].color = new Color(255, 150, 255);
144 | }
145 | else
146 | {
147 | if (newItem.rare == -1)
148 | {
149 | Main.itemText[num].color = new Color(130, 130, 130);
150 | }
151 | else
152 | {
153 | if (newItem.rare == 6)
154 | {
155 | Main.itemText[num].color = new Color(210, 160, 255);
156 | }
157 | else
158 | {
159 | if (newItem.rare == 7)
160 | {
161 | Main.itemText[num].color = new Color(150, 255, 10);
162 | }
163 | else
164 | {
165 | if (newItem.rare == 8)
166 | {
167 | Main.itemText[num].color = new Color(255, 255, 10);
168 | }
169 | else
170 | {
171 | if (newItem.rare >= 9)
172 | {
173 | Main.itemText[num].color = new Color(5, 200, 255);
174 | }
175 | }
176 | }
177 | }
178 | }
179 | }
180 | }
181 | }
182 | }
183 | }
184 | Main.itemText[num].name = newItem.AffixName();
185 | Main.itemText[num].stack = stack;
186 | Main.itemText[num].velocity.Y = -7f;
187 | Main.itemText[num].lifeTime = 60;
188 | }
189 | }
190 | public void Update(int whoAmI)
191 | {
192 | if (this.active)
193 | {
194 | this.alpha += (float)this.alphaDir * 0.01f;
195 | if ((double)this.alpha <= 0.7)
196 | {
197 | this.alpha = 0.7f;
198 | this.alphaDir = 1;
199 | }
200 | if (this.alpha >= 1f)
201 | {
202 | this.alpha = 1f;
203 | this.alphaDir = -1;
204 | }
205 | bool flag = false;
206 | string text = this.name;
207 | if (this.stack > 1)
208 | {
209 | object obj = text;
210 | text = string.Concat(new object[]
211 | {
212 | obj,
213 | " (",
214 | this.stack,
215 | ")"
216 | });
217 | }
218 | Vector2 value = Main.fontMouseText.MeasureString(text);
219 | value *= this.scale;
220 | value.Y *= 0.8f;
221 | Rectangle rectangle = new Rectangle((int)(this.position.X - value.X / 2f), (int)(this.position.Y - value.Y / 2f), (int)value.X, (int)value.Y);
222 | for (int i = 0; i < 20; i++)
223 | {
224 | if (Main.itemText[i].active && i != whoAmI)
225 | {
226 | string text2 = Main.itemText[i].name;
227 | if (Main.itemText[i].stack > 1)
228 | {
229 | object obj2 = text2;
230 | text2 = string.Concat(new object[]
231 | {
232 | obj2,
233 | " (",
234 | Main.itemText[i].stack,
235 | ")"
236 | });
237 | }
238 | Vector2 value2 = Main.fontMouseText.MeasureString(text2);
239 | value2 *= Main.itemText[i].scale;
240 | value2.Y *= 0.8f;
241 | Rectangle value3 = new Rectangle((int)(Main.itemText[i].position.X - value2.X / 2f), (int)(Main.itemText[i].position.Y - value2.Y / 2f), (int)value2.X, (int)value2.Y);
242 | if (rectangle.Intersects(value3) && (this.position.Y < Main.itemText[i].position.Y || (this.position.Y == Main.itemText[i].position.Y && whoAmI < i)))
243 | {
244 | flag = true;
245 | int num = ItemText.numActive;
246 | if (num > 3)
247 | {
248 | num = 3;
249 | }
250 | Main.itemText[i].lifeTime = ItemText.activeTime + 15 * num;
251 | this.lifeTime = ItemText.activeTime + 15 * num;
252 | }
253 | }
254 | }
255 | if (!flag)
256 | {
257 | this.velocity.Y = this.velocity.Y * 0.86f;
258 | if (this.scale == 1f)
259 | {
260 | this.velocity.Y = this.velocity.Y * 0.4f;
261 | }
262 | }
263 | else
264 | {
265 | if (this.velocity.Y > -6f)
266 | {
267 | this.velocity.Y = this.velocity.Y - 0.2f;
268 | }
269 | else
270 | {
271 | this.velocity.Y = this.velocity.Y * 0.86f;
272 | }
273 | }
274 | this.velocity.X = this.velocity.X * 0.93f;
275 | this.position += this.velocity;
276 | this.lifeTime--;
277 | if (this.lifeTime <= 0)
278 | {
279 | this.scale -= 0.03f;
280 | if ((double)this.scale < 0.1)
281 | {
282 | this.active = false;
283 | }
284 | this.lifeTime = 0;
285 | return;
286 | }
287 | if (this.scale < 1f)
288 | {
289 | this.scale += 0.1f;
290 | }
291 | if (this.scale > 1f)
292 | {
293 | this.scale = 1f;
294 | }
295 | }
296 | }
297 | public static void UpdateItemText()
298 | {
299 | int num = 0;
300 | for (int i = 0; i < 20; i++)
301 | {
302 | if (Main.itemText[i].active)
303 | {
304 | num++;
305 | Main.itemText[i].Update(i);
306 | }
307 | }
308 | ItemText.numActive = num;
309 | }
310 | }
311 | }
312 |
--------------------------------------------------------------------------------
/Terraria/Liquid.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace Terraria
3 | {
4 | public class Liquid
5 | {
6 | public static int skipCount = 0;
7 | public static int stuckCount = 0;
8 | public static int stuckAmount = 0;
9 | public static int cycles = 10;
10 | public static int resLiquid = 5000;
11 | public static int maxLiquid = 5000;
12 | public static int numLiquid;
13 | public static bool stuck = false;
14 | public static bool quickFall = false;
15 | public static bool quickSettle = false;
16 | private static int wetCounter;
17 | public static int panicCounter = 0;
18 | public static bool panicMode = false;
19 | public static int panicY = 0;
20 | public int x;
21 | public int y;
22 | public int kill;
23 | public int delay;
24 | public static double QuickWater(int verbose = 0, int minY = -1, int maxY = -1)
25 | {
26 | int num = 0;
27 | if (minY == -1)
28 | {
29 | minY = 3;
30 | }
31 | if (maxY == -1)
32 | {
33 | maxY = Main.maxTilesY - 3;
34 | }
35 | for (int i = maxY; i >= minY; i--)
36 | {
37 | if (verbose > 0)
38 | {
39 | float num2 = (float)(maxY - i) / (float)(maxY - minY + 1);
40 | num2 /= (float)verbose;
41 | Main.statusText = string.Concat(new object[]
42 | {
43 | Lang.gen[27],
44 | " ",
45 | (int)(num2 * 100f + 1f),
46 | "%"
47 | });
48 | }
49 | else
50 | {
51 | if (verbose < 0)
52 | {
53 | float num3 = (float)(maxY - i) / (float)(maxY - minY + 1);
54 | num3 /= (float)(-(float)verbose);
55 | Main.statusText = string.Concat(new object[]
56 | {
57 | Lang.gen[18],
58 | " ",
59 | (int)(num3 * 100f + 1f),
60 | "%"
61 | });
62 | }
63 | }
64 | for (int j = 0; j < 2; j++)
65 | {
66 | int num4 = 2;
67 | int num5 = Main.maxTilesX - 2;
68 | int num6 = 1;
69 | if (j == 1)
70 | {
71 | num4 = Main.maxTilesX - 2;
72 | num5 = 2;
73 | num6 = -1;
74 | }
75 | for (int num7 = num4; num7 != num5; num7 += num6)
76 | {
77 | if (Main.tile[num7, i].liquid > 0)
78 | {
79 | int num8 = -num6;
80 | bool flag = false;
81 | int num9 = num7;
82 | int num10 = i;
83 | byte b = Main.tile[num7, i].liquidType();
84 | bool flag2 = Main.tile[num7, i].lava();
85 | bool flag3 = Main.tile[num7, i].honey();
86 | byte b2 = Main.tile[num7, i].liquid;
87 | Main.tile[num7, i].liquid = 0;
88 | bool flag4 = true;
89 | int num11 = 0;
90 | while (flag4 && num9 > 3 && num9 < Main.maxTilesX - 3 && num10 < Main.maxTilesY - 3)
91 | {
92 | flag4 = false;
93 | while (Main.tile[num9, num10 + 1].liquid == 0 && num10 < Main.maxTilesY - 5 && (!Main.tile[num9, num10 + 1].nactive() || !Main.tileSolid[(int)Main.tile[num9, num10 + 1].type] || Main.tileSolidTop[(int)Main.tile[num9, num10 + 1].type]))
94 | {
95 | flag = true;
96 | num8 = num6;
97 | num11 = 0;
98 | flag4 = true;
99 | num10++;
100 | if (num10 > WorldGen.waterLine && WorldGen.gen && !flag3)
101 | {
102 | b = 1;
103 | }
104 | }
105 | if (Main.tile[num9, num10 + 1].liquid > 0 && Main.tile[num9, num10 + 1].liquid < 255 && Main.tile[num9, num10 + 1].liquidType() == b)
106 | {
107 | int num12 = (int)(255 - Main.tile[num9, num10 + 1].liquid);
108 | if (num12 > (int)b2)
109 | {
110 | num12 = (int)b2;
111 | }
112 | Tile expr_2D1 = Main.tile[num9, num10 + 1];
113 | expr_2D1.liquid += (byte)num12;
114 | b2 -= (byte)num12;
115 | if (b2 <= 0)
116 | {
117 | num++;
118 | break;
119 | }
120 | }
121 | if (num11 == 0)
122 | {
123 | if (Main.tile[num9 + num8, num10].liquid == 0 && (!Main.tile[num9 + num8, num10].nactive() || !Main.tileSolid[(int)Main.tile[num9 + num8, num10].type] || Main.tileSolidTop[(int)Main.tile[num9 + num8, num10].type]))
124 | {
125 | num11 = num8;
126 | }
127 | else
128 | {
129 | if (Main.tile[num9 - num8, num10].liquid == 0 && (!Main.tile[num9 - num8, num10].nactive() || !Main.tileSolid[(int)Main.tile[num9 - num8, num10].type] || Main.tileSolidTop[(int)Main.tile[num9 - num8, num10].type]))
130 | {
131 | num11 = -num8;
132 | }
133 | }
134 | }
135 | if (num11 != 0 && Main.tile[num9 + num11, num10].liquid == 0 && (!Main.tile[num9 + num11, num10].nactive() || !Main.tileSolid[(int)Main.tile[num9 + num11, num10].type] || Main.tileSolidTop[(int)Main.tile[num9 + num11, num10].type]))
136 | {
137 | flag4 = true;
138 | num9 += num11;
139 | }
140 | if (flag && !flag4)
141 | {
142 | flag = false;
143 | flag4 = true;
144 | num8 = -num6;
145 | num11 = 0;
146 | }
147 | }
148 | if (num7 != num9 && i != num10)
149 | {
150 | num++;
151 | }
152 | Main.tile[num9, num10].liquid = b2;
153 | Main.tile[num9, num10].liquidType((int)b);
154 | if (Main.tile[num9 - 1, num10].liquid > 0 && Main.tile[num9 - 1, num10].lava() != flag2)
155 | {
156 | if (flag2)
157 | {
158 | Liquid.LavaCheck(num9, num10);
159 | }
160 | else
161 | {
162 | Liquid.LavaCheck(num9 - 1, num10);
163 | }
164 | }
165 | else
166 | {
167 | if (Main.tile[num9 + 1, num10].liquid > 0 && Main.tile[num9 + 1, num10].lava() != flag2)
168 | {
169 | if (flag2)
170 | {
171 | Liquid.LavaCheck(num9, num10);
172 | }
173 | else
174 | {
175 | Liquid.LavaCheck(num9 + 1, num10);
176 | }
177 | }
178 | else
179 | {
180 | if (Main.tile[num9, num10 - 1].liquid > 0 && Main.tile[num9, num10 - 1].lava() != flag2)
181 | {
182 | if (flag2)
183 | {
184 | Liquid.LavaCheck(num9, num10);
185 | }
186 | else
187 | {
188 | Liquid.LavaCheck(num9, num10 - 1);
189 | }
190 | }
191 | else
192 | {
193 | if (Main.tile[num9, num10 + 1].liquid > 0 && Main.tile[num9, num10 + 1].lava() != flag2)
194 | {
195 | if (flag2)
196 | {
197 | Liquid.LavaCheck(num9, num10);
198 | }
199 | else
200 | {
201 | Liquid.LavaCheck(num9, num10 + 1);
202 | }
203 | }
204 | }
205 | }
206 | }
207 | if (Main.tile[num9, num10].liquid > 0)
208 | {
209 | if (Main.tile[num9 - 1, num10].liquid > 0 && Main.tile[num9 - 1, num10].honey() != flag3)
210 | {
211 | if (flag3)
212 | {
213 | Liquid.HoneyCheck(num9, num10);
214 | }
215 | else
216 | {
217 | Liquid.HoneyCheck(num9 - 1, num10);
218 | }
219 | }
220 | else
221 | {
222 | if (Main.tile[num9 + 1, num10].liquid > 0 && Main.tile[num9 + 1, num10].honey() != flag3)
223 | {
224 | if (flag3)
225 | {
226 | Liquid.HoneyCheck(num9, num10);
227 | }
228 | else
229 | {
230 | Liquid.HoneyCheck(num9 + 1, num10);
231 | }
232 | }
233 | else
234 | {
235 | if (Main.tile[num9, num10 - 1].liquid > 0 && Main.tile[num9, num10 - 1].honey() != flag3)
236 | {
237 | if (flag3)
238 | {
239 | Liquid.HoneyCheck(num9, num10);
240 | }
241 | else
242 | {
243 | Liquid.HoneyCheck(num9, num10 - 1);
244 | }
245 | }
246 | else
247 | {
248 | if (Main.tile[num9, num10 + 1].liquid > 0 && Main.tile[num9, num10 + 1].honey() != flag3)
249 | {
250 | if (flag3)
251 | {
252 | Liquid.HoneyCheck(num9, num10);
253 | }
254 | else
255 | {
256 | Liquid.HoneyCheck(num9, num10 + 1);
257 | }
258 | }
259 | }
260 | }
261 | }
262 | }
263 | }
264 | }
265 | }
266 | }
267 | return (double)num;
268 | }
269 | public void Update()
270 | {
271 | if (Main.tile[this.x, this.y].nactive() && Main.tileSolid[(int)Main.tile[this.x, this.y].type] && !Main.tileSolidTop[(int)Main.tile[this.x, this.y].type])
272 | {
273 | byte arg_81_0 = Main.tile[this.x, this.y].type;
274 | this.kill = 9;
275 | return;
276 | }
277 | byte liquid = Main.tile[this.x, this.y].liquid;
278 | if (this.y > Main.maxTilesY - 200 && Main.tile[this.x, this.y].liquidType() == 0 && Main.tile[this.x, this.y].liquid > 0)
279 | {
280 | byte b = 2;
281 | if (Main.tile[this.x, this.y].liquid < b)
282 | {
283 | b = Main.tile[this.x, this.y].liquid;
284 | }
285 | Tile expr_150 = Main.tile[this.x, this.y];
286 | expr_150.liquid -= b;
287 | }
288 | if (Main.tile[this.x, this.y].liquid == 0)
289 | {
290 | this.kill = 9;
291 | return;
292 | }
293 | if (Main.tile[this.x, this.y].lava())
294 | {
295 | Liquid.LavaCheck(this.x, this.y);
296 | if (!Liquid.quickFall)
297 | {
298 | if (this.delay < 5)
299 | {
300 | this.delay++;
301 | return;
302 | }
303 | this.delay = 0;
304 | }
305 | }
306 | else
307 | {
308 | if (Main.tile[this.x - 1, this.y].lava())
309 | {
310 | Liquid.AddWater(this.x - 1, this.y);
311 | }
312 | if (Main.tile[this.x + 1, this.y].lava())
313 | {
314 | Liquid.AddWater(this.x + 1, this.y);
315 | }
316 | if (Main.tile[this.x, this.y - 1].lava())
317 | {
318 | Liquid.AddWater(this.x, this.y - 1);
319 | }
320 | if (Main.tile[this.x, this.y + 1].lava())
321 | {
322 | Liquid.AddWater(this.x, this.y + 1);
323 | }
324 | if (Main.tile[this.x, this.y].honey())
325 | {
326 | Liquid.HoneyCheck(this.x, this.y);
327 | if (!Liquid.quickFall)
328 | {
329 | if (this.delay < 10)
330 | {
331 | this.delay++;
332 | return;
333 | }
334 | this.delay = 0;
335 | }
336 | }
337 | else
338 | {
339 | if (Main.tile[this.x - 1, this.y].honey())
340 | {
341 | Liquid.AddWater(this.x - 1, this.y);
342 | }
343 | if (Main.tile[this.x + 1, this.y].honey())
344 | {
345 | Liquid.AddWater(this.x + 1, this.y);
346 | }
347 | if (Main.tile[this.x, this.y - 1].honey())
348 | {
349 | Liquid.AddWater(this.x, this.y - 1);
350 | }
351 | if (Main.tile[this.x, this.y + 1].honey())
352 | {
353 | Liquid.AddWater(this.x, this.y + 1);
354 | }
355 | }
356 | }
357 | if ((!Main.tile[this.x, this.y + 1].nactive() || !Main.tileSolid[(int)Main.tile[this.x, this.y + 1].type] || Main.tileSolidTop[(int)Main.tile[this.x, this.y + 1].type]) && (Main.tile[this.x, this.y + 1].liquid <= 0 || Main.tile[this.x, this.y + 1].liquidType() == Main.tile[this.x, this.y].liquidType()) && Main.tile[this.x, this.y + 1].liquid < 255)
358 | {
359 | float num = (float)(255 - Main.tile[this.x, this.y + 1].liquid);
360 | if (num > (float)Main.tile[this.x, this.y].liquid)
361 | {
362 | num = (float)Main.tile[this.x, this.y].liquid;
363 | }
364 | Tile expr_534 = Main.tile[this.x, this.y];
365 | expr_534.liquid -= (byte)num;
366 | Tile expr_55B = Main.tile[this.x, this.y + 1];
367 | expr_55B.liquid += (byte)num;
368 | Main.tile[this.x, this.y + 1].liquidType((int)Main.tile[this.x, this.y].liquidType());
369 | Liquid.AddWater(this.x, this.y + 1);
370 | Main.tile[this.x, this.y + 1].skipLiquid(true);
371 | Main.tile[this.x, this.y].skipLiquid(true);
372 | if (Main.tile[this.x, this.y].liquid > 250)
373 | {
374 | Main.tile[this.x, this.y].liquid = 255;
375 | }
376 | else
377 | {
378 | Liquid.AddWater(this.x - 1, this.y);
379 | Liquid.AddWater(this.x + 1, this.y);
380 | }
381 | }
382 | if (Main.tile[this.x, this.y].liquid > 0)
383 | {
384 | bool flag = true;
385 | bool flag2 = true;
386 | bool flag3 = true;
387 | bool flag4 = true;
388 | if (Main.tile[this.x - 1, this.y].nactive() && Main.tileSolid[(int)Main.tile[this.x - 1, this.y].type] && !Main.tileSolidTop[(int)Main.tile[this.x - 1, this.y].type])
389 | {
390 | flag = false;
391 | }
392 | else
393 | {
394 | if (Main.tile[this.x - 1, this.y].liquid > 0 && Main.tile[this.x - 1, this.y].liquidType() != Main.tile[this.x, this.y].liquidType())
395 | {
396 | flag = false;
397 | }
398 | else
399 | {
400 | if (Main.tile[this.x - 2, this.y].nactive() && Main.tileSolid[(int)Main.tile[this.x - 2, this.y].type] && !Main.tileSolidTop[(int)Main.tile[this.x - 2, this.y].type])
401 | {
402 | flag3 = false;
403 | }
404 | else
405 | {
406 | if (Main.tile[this.x - 2, this.y].liquid == 0)
407 | {
408 | flag3 = false;
409 | }
410 | else
411 | {
412 | if (Main.tile[this.x - 2, this.y].liquid > 0 && Main.tile[this.x - 2, this.y].liquidType() != Main.tile[this.x, this.y].liquidType())
413 | {
414 | flag3 = false;
415 | }
416 | }
417 | }
418 | }
419 | }
420 | if (Main.tile[this.x + 1, this.y].nactive() && Main.tileSolid[(int)Main.tile[this.x + 1, this.y].type] && !Main.tileSolidTop[(int)Main.tile[this.x + 1, this.y].type])
421 | {
422 | flag2 = false;
423 | }
424 | else
425 | {
426 | if (Main.tile[this.x + 1, this.y].liquid > 0 && Main.tile[this.x + 1, this.y].liquidType() != Main.tile[this.x, this.y].liquidType())
427 | {
428 | flag2 = false;
429 | }
430 | else
431 | {
432 | if (Main.tile[this.x + 2, this.y].nactive() && Main.tileSolid[(int)Main.tile[this.x + 2, this.y].type] && !Main.tileSolidTop[(int)Main.tile[this.x + 2, this.y].type])
433 | {
434 | flag4 = false;
435 | }
436 | else
437 | {
438 | if (Main.tile[this.x + 2, this.y].liquid == 0)
439 | {
440 | flag4 = false;
441 | }
442 | else
443 | {
444 | if (Main.tile[this.x + 2, this.y].liquid > 0 && Main.tile[this.x + 2, this.y].liquidType() != Main.tile[this.x, this.y].liquidType())
445 | {
446 | flag4 = false;
447 | }
448 | }
449 | }
450 | }
451 | }
452 | int num2 = 0;
453 | if (Main.tile[this.x, this.y].liquid < 3)
454 | {
455 | num2 = -1;
456 | }
457 | if (flag && flag2)
458 | {
459 | if (flag3 && flag4)
460 | {
461 | bool flag5 = true;
462 | bool flag6 = true;
463 | if (Main.tile[this.x - 3, this.y].nactive() && Main.tileSolid[(int)Main.tile[this.x - 3, this.y].type] && !Main.tileSolidTop[(int)Main.tile[this.x - 3, this.y].type])
464 | {
465 | flag5 = false;
466 | }
467 | else
468 | {
469 | if (Main.tile[this.x - 3, this.y].liquid == 0)
470 | {
471 | flag5 = false;
472 | }
473 | else
474 | {
475 | if (Main.tile[this.x - 3, this.y].liquidType() != Main.tile[this.x, this.y].liquidType())
476 | {
477 | flag5 = false;
478 | }
479 | }
480 | }
481 | if (Main.tile[this.x + 3, this.y].nactive() && Main.tileSolid[(int)Main.tile[this.x + 3, this.y].type] && !Main.tileSolidTop[(int)Main.tile[this.x + 3, this.y].type])
482 | {
483 | flag6 = false;
484 | }
485 | else
486 | {
487 | if (Main.tile[this.x + 3, this.y].liquid == 0)
488 | {
489 | flag6 = false;
490 | }
491 | else
492 | {
493 | if (Main.tile[this.x + 3, this.y].liquidType() != Main.tile[this.x, this.y].liquidType())
494 | {
495 | flag6 = false;
496 | }
497 | }
498 | }
499 | if (flag5 && flag6)
500 | {
501 | float num = (float)((int)(Main.tile[this.x - 1, this.y].liquid + Main.tile[this.x + 1, this.y].liquid + Main.tile[this.x - 2, this.y].liquid + Main.tile[this.x + 2, this.y].liquid + Main.tile[this.x - 3, this.y].liquid + Main.tile[this.x + 3, this.y].liquid + Main.tile[this.x, this.y].liquid) + num2);
502 | num = (float)Math.Round((double)(num / 7f));
503 | int num3 = 0;
504 | Main.tile[this.x - 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
505 | if (Main.tile[this.x - 1, this.y].liquid != (byte)num)
506 | {
507 | Main.tile[this.x - 1, this.y].liquid = (byte)num;
508 | Liquid.AddWater(this.x - 1, this.y);
509 | }
510 | else
511 | {
512 | num3++;
513 | }
514 | Main.tile[this.x + 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
515 | if (Main.tile[this.x + 1, this.y].liquid != (byte)num)
516 | {
517 | Main.tile[this.x + 1, this.y].liquid = (byte)num;
518 | Liquid.AddWater(this.x + 1, this.y);
519 | }
520 | else
521 | {
522 | num3++;
523 | }
524 | Main.tile[this.x - 2, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
525 | if (Main.tile[this.x - 2, this.y].liquid != (byte)num)
526 | {
527 | Main.tile[this.x - 2, this.y].liquid = (byte)num;
528 | Liquid.AddWater(this.x - 2, this.y);
529 | }
530 | else
531 | {
532 | num3++;
533 | }
534 | Main.tile[this.x + 2, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
535 | if (Main.tile[this.x + 2, this.y].liquid != (byte)num)
536 | {
537 | Main.tile[this.x + 2, this.y].liquid = (byte)num;
538 | Liquid.AddWater(this.x + 2, this.y);
539 | }
540 | else
541 | {
542 | num3++;
543 | }
544 | Main.tile[this.x - 3, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
545 | if (Main.tile[this.x - 3, this.y].liquid != (byte)num)
546 | {
547 | Main.tile[this.x - 3, this.y].liquid = (byte)num;
548 | Liquid.AddWater(this.x - 3, this.y);
549 | }
550 | else
551 | {
552 | num3++;
553 | }
554 | Main.tile[this.x + 3, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
555 | if (Main.tile[this.x + 3, this.y].liquid != (byte)num)
556 | {
557 | Main.tile[this.x + 3, this.y].liquid = (byte)num;
558 | Liquid.AddWater(this.x + 3, this.y);
559 | }
560 | else
561 | {
562 | num3++;
563 | }
564 | if (Main.tile[this.x - 1, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
565 | {
566 | Liquid.AddWater(this.x - 1, this.y);
567 | }
568 | if (Main.tile[this.x + 1, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
569 | {
570 | Liquid.AddWater(this.x + 1, this.y);
571 | }
572 | if (Main.tile[this.x - 2, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
573 | {
574 | Liquid.AddWater(this.x - 2, this.y);
575 | }
576 | if (Main.tile[this.x + 2, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
577 | {
578 | Liquid.AddWater(this.x + 2, this.y);
579 | }
580 | if (Main.tile[this.x - 3, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
581 | {
582 | Liquid.AddWater(this.x - 3, this.y);
583 | }
584 | if (Main.tile[this.x + 3, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
585 | {
586 | Liquid.AddWater(this.x + 3, this.y);
587 | }
588 | if (num3 != 6 || Main.tile[this.x, this.y - 1].liquid <= 0)
589 | {
590 | Main.tile[this.x, this.y].liquid = (byte)num;
591 | }
592 | }
593 | else
594 | {
595 | int num4 = 0;
596 | float num = (float)((int)(Main.tile[this.x - 1, this.y].liquid + Main.tile[this.x + 1, this.y].liquid + Main.tile[this.x - 2, this.y].liquid + Main.tile[this.x + 2, this.y].liquid + Main.tile[this.x, this.y].liquid) + num2);
597 | num = (float)Math.Round((double)(num / 5f));
598 | Main.tile[this.x - 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
599 | if (Main.tile[this.x - 1, this.y].liquid != (byte)num)
600 | {
601 | Main.tile[this.x - 1, this.y].liquid = (byte)num;
602 | Liquid.AddWater(this.x - 1, this.y);
603 | }
604 | else
605 | {
606 | num4++;
607 | }
608 | Main.tile[this.x + 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
609 | if (Main.tile[this.x + 1, this.y].liquid != (byte)num)
610 | {
611 | Main.tile[this.x + 1, this.y].liquid = (byte)num;
612 | Liquid.AddWater(this.x + 1, this.y);
613 | }
614 | else
615 | {
616 | num4++;
617 | }
618 | Main.tile[this.x - 2, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
619 | if (Main.tile[this.x - 2, this.y].liquid != (byte)num)
620 | {
621 | Main.tile[this.x - 2, this.y].liquid = (byte)num;
622 | Liquid.AddWater(this.x - 2, this.y);
623 | }
624 | else
625 | {
626 | num4++;
627 | }
628 | Main.tile[this.x + 2, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
629 | if (Main.tile[this.x + 2, this.y].liquid != (byte)num)
630 | {
631 | Main.tile[this.x + 2, this.y].liquid = (byte)num;
632 | Liquid.AddWater(this.x + 2, this.y);
633 | }
634 | else
635 | {
636 | num4++;
637 | }
638 | if (Main.tile[this.x - 1, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
639 | {
640 | Liquid.AddWater(this.x - 1, this.y);
641 | }
642 | if (Main.tile[this.x + 1, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
643 | {
644 | Liquid.AddWater(this.x + 1, this.y);
645 | }
646 | if (Main.tile[this.x - 2, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
647 | {
648 | Liquid.AddWater(this.x - 2, this.y);
649 | }
650 | if (Main.tile[this.x + 2, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
651 | {
652 | Liquid.AddWater(this.x + 2, this.y);
653 | }
654 | if (num4 != 4 || Main.tile[this.x, this.y - 1].liquid <= 0)
655 | {
656 | Main.tile[this.x, this.y].liquid = (byte)num;
657 | }
658 | }
659 | }
660 | else
661 | {
662 | if (flag3)
663 | {
664 | float num = (float)((int)(Main.tile[this.x - 1, this.y].liquid + Main.tile[this.x + 1, this.y].liquid + Main.tile[this.x - 2, this.y].liquid + Main.tile[this.x, this.y].liquid) + num2);
665 | num = (float)Math.Round((double)(num / 4f) + 0.001);
666 | Main.tile[this.x - 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
667 | if (Main.tile[this.x - 1, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
668 | {
669 | Main.tile[this.x - 1, this.y].liquid = (byte)num;
670 | Liquid.AddWater(this.x - 1, this.y);
671 | }
672 | Main.tile[this.x + 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
673 | if (Main.tile[this.x + 1, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
674 | {
675 | Main.tile[this.x + 1, this.y].liquid = (byte)num;
676 | Liquid.AddWater(this.x + 1, this.y);
677 | }
678 | Main.tile[this.x - 2, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
679 | if (Main.tile[this.x - 2, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
680 | {
681 | Main.tile[this.x - 2, this.y].liquid = (byte)num;
682 | Liquid.AddWater(this.x - 2, this.y);
683 | }
684 | Main.tile[this.x, this.y].liquid = (byte)num;
685 | }
686 | else
687 | {
688 | if (flag4)
689 | {
690 | float num = (float)((int)(Main.tile[this.x - 1, this.y].liquid + Main.tile[this.x + 1, this.y].liquid + Main.tile[this.x + 2, this.y].liquid + Main.tile[this.x, this.y].liquid) + num2);
691 | num = (float)Math.Round((double)(num / 4f) + 0.001);
692 | Main.tile[this.x - 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
693 | if (Main.tile[this.x - 1, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
694 | {
695 | Main.tile[this.x - 1, this.y].liquid = (byte)num;
696 | Liquid.AddWater(this.x - 1, this.y);
697 | }
698 | Main.tile[this.x + 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
699 | if (Main.tile[this.x + 1, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
700 | {
701 | Main.tile[this.x + 1, this.y].liquid = (byte)num;
702 | Liquid.AddWater(this.x + 1, this.y);
703 | }
704 | Main.tile[this.x + 2, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
705 | if (Main.tile[this.x + 2, this.y].liquid != (byte)num || Main.tile[this.x, this.y].liquid != (byte)num)
706 | {
707 | Main.tile[this.x + 2, this.y].liquid = (byte)num;
708 | Liquid.AddWater(this.x + 2, this.y);
709 | }
710 | Main.tile[this.x, this.y].liquid = (byte)num;
711 | }
712 | else
713 | {
714 | float num = (float)((int)(Main.tile[this.x - 1, this.y].liquid + Main.tile[this.x + 1, this.y].liquid + Main.tile[this.x, this.y].liquid) + num2);
715 | num = (float)Math.Round((double)(num / 3f) + 0.001);
716 | Main.tile[this.x - 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
717 | if (Main.tile[this.x - 1, this.y].liquid != (byte)num)
718 | {
719 | Main.tile[this.x - 1, this.y].liquid = (byte)num;
720 | }
721 | if (Main.tile[this.x, this.y].liquid != (byte)num || Main.tile[this.x - 1, this.y].liquid != (byte)num)
722 | {
723 | Liquid.AddWater(this.x - 1, this.y);
724 | }
725 | Main.tile[this.x + 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
726 | if (Main.tile[this.x + 1, this.y].liquid != (byte)num)
727 | {
728 | Main.tile[this.x + 1, this.y].liquid = (byte)num;
729 | }
730 | if (Main.tile[this.x, this.y].liquid != (byte)num || Main.tile[this.x + 1, this.y].liquid != (byte)num)
731 | {
732 | Liquid.AddWater(this.x + 1, this.y);
733 | }
734 | Main.tile[this.x, this.y].liquid = (byte)num;
735 | }
736 | }
737 | }
738 | }
739 | else
740 | {
741 | if (flag)
742 | {
743 | float num = (float)((int)(Main.tile[this.x - 1, this.y].liquid + Main.tile[this.x, this.y].liquid) + num2);
744 | num = (float)Math.Round((double)(num / 2f) + 0.001);
745 | if (Main.tile[this.x - 1, this.y].liquid != (byte)num)
746 | {
747 | Main.tile[this.x - 1, this.y].liquid = (byte)num;
748 | }
749 | Main.tile[this.x - 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
750 | if (Main.tile[this.x, this.y].liquid != (byte)num || Main.tile[this.x - 1, this.y].liquid != (byte)num)
751 | {
752 | Liquid.AddWater(this.x - 1, this.y);
753 | }
754 | Main.tile[this.x, this.y].liquid = (byte)num;
755 | }
756 | else
757 | {
758 | if (flag2)
759 | {
760 | float num = (float)((int)(Main.tile[this.x + 1, this.y].liquid + Main.tile[this.x, this.y].liquid) + num2);
761 | num = (float)Math.Round((double)(num / 2f) + 0.001);
762 | if (Main.tile[this.x + 1, this.y].liquid != (byte)num)
763 | {
764 | Main.tile[this.x + 1, this.y].liquid = (byte)num;
765 | }
766 | Main.tile[this.x + 1, this.y].liquidType((int)Main.tile[this.x, this.y].liquidType());
767 | if (Main.tile[this.x, this.y].liquid != (byte)num || Main.tile[this.x + 1, this.y].liquid != (byte)num)
768 | {
769 | Liquid.AddWater(this.x + 1, this.y);
770 | }
771 | Main.tile[this.x, this.y].liquid = (byte)num;
772 | }
773 | }
774 | }
775 | }
776 | if (Main.tile[this.x, this.y].liquid == liquid)
777 | {
778 | this.kill++;
779 | return;
780 | }
781 | if (Main.tile[this.x, this.y].liquid == 254 && liquid == 255)
782 | {
783 | Main.tile[this.x, this.y].liquid = 255;
784 | this.kill++;
785 | return;
786 | }
787 | Liquid.AddWater(this.x, this.y - 1);
788 | this.kill = 0;
789 | }
790 | public static void StartPanic()
791 | {
792 | if (!Liquid.panicMode)
793 | {
794 | WorldGen.waterLine = Main.maxTilesY;
795 | Liquid.numLiquid = 0;
796 | LiquidBuffer.numLiquidBuffer = 0;
797 | Liquid.panicCounter = 0;
798 | Liquid.panicMode = true;
799 | Liquid.panicY = Main.maxTilesY - 3;
800 | if (Main.dedServ)
801 | {
802 | Console.WriteLine("Forcing water to settle.");
803 | }
804 | }
805 | }
806 | public static void UpdateLiquid()
807 | {
808 | if (Main.netMode == 2)
809 | {
810 | Liquid.cycles = 30;
811 | Liquid.maxLiquid = 5000;
812 | }
813 | if (!WorldGen.gen)
814 | {
815 | if (!Liquid.panicMode)
816 | {
817 | if (Liquid.numLiquid + LiquidBuffer.numLiquidBuffer > 4000)
818 | {
819 | Liquid.panicCounter++;
820 | if (Liquid.panicCounter > 1800 || Liquid.numLiquid + LiquidBuffer.numLiquidBuffer > 13500)
821 | {
822 | Liquid.StartPanic();
823 | }
824 | }
825 | else
826 | {
827 | Liquid.panicCounter = 0;
828 | }
829 | }
830 | if (Liquid.panicMode)
831 | {
832 | int num = 0;
833 | while (Liquid.panicY >= 3 && num < 5)
834 | {
835 | num++;
836 | Liquid.QuickWater(0, Liquid.panicY, Liquid.panicY);
837 | Liquid.panicY--;
838 | if (Liquid.panicY < 3)
839 | {
840 | Console.WriteLine("Water has been settled.");
841 | Liquid.panicCounter = 0;
842 | Liquid.panicMode = false;
843 | if (Main.netMode == 2)
844 | {
845 | for (int i = 0; i < 255; i++)
846 | {
847 | for (int j = 0; j < Main.maxSectionsX; j++)
848 | {
849 | for (int k = 0; k < Main.maxSectionsY; k++)
850 | {
851 | Netplay.serverSock[i].tileSection[j, k] = false;
852 | }
853 | }
854 | }
855 | }
856 | }
857 | }
858 | return;
859 | }
860 | }
861 | if (Liquid.quickSettle || Liquid.numLiquid > 2000)
862 | {
863 | Liquid.quickFall = true;
864 | }
865 | else
866 | {
867 | Liquid.quickFall = false;
868 | }
869 | Liquid.wetCounter++;
870 | int num2 = Liquid.maxLiquid / Liquid.cycles;
871 | int num3 = num2 * (Liquid.wetCounter - 1);
872 | int num4 = num2 * Liquid.wetCounter;
873 | if (Liquid.wetCounter == Liquid.cycles)
874 | {
875 | num4 = Liquid.numLiquid;
876 | }
877 | if (num4 > Liquid.numLiquid)
878 | {
879 | num4 = Liquid.numLiquid;
880 | int arg_197_0 = Main.netMode;
881 | Liquid.wetCounter = Liquid.cycles;
882 | }
883 | if (Liquid.quickFall)
884 | {
885 | for (int l = num3; l < num4; l++)
886 | {
887 | Main.liquid[l].delay = 10;
888 | Main.liquid[l].Update();
889 | Main.tile[Main.liquid[l].x, Main.liquid[l].y].skipLiquid(false);
890 | }
891 | }
892 | else
893 | {
894 | for (int m = num3; m < num4; m++)
895 | {
896 | if (!Main.tile[Main.liquid[m].x, Main.liquid[m].y].skipLiquid())
897 | {
898 | Main.liquid[m].Update();
899 | }
900 | else
901 | {
902 | Main.tile[Main.liquid[m].x, Main.liquid[m].y].skipLiquid(false);
903 | }
904 | }
905 | }
906 | if (Liquid.wetCounter >= Liquid.cycles)
907 | {
908 | Liquid.wetCounter = 0;
909 | for (int n = Liquid.numLiquid - 1; n >= 0; n--)
910 | {
911 | if (Main.liquid[n].kill > 4)
912 | {
913 | Liquid.DelWater(n);
914 | }
915 | }
916 | int num5 = Liquid.maxLiquid - (Liquid.maxLiquid - Liquid.numLiquid);
917 | if (num5 > LiquidBuffer.numLiquidBuffer)
918 | {
919 | num5 = LiquidBuffer.numLiquidBuffer;
920 | }
921 | for (int num6 = 0; num6 < num5; num6++)
922 | {
923 | Main.tile[Main.liquidBuffer[0].x, Main.liquidBuffer[0].y].checkingLiquid(false);
924 | Liquid.AddWater(Main.liquidBuffer[0].x, Main.liquidBuffer[0].y);
925 | LiquidBuffer.DelBuffer(0);
926 | }
927 | if (Liquid.numLiquid > 0 && Liquid.numLiquid > Liquid.stuckAmount - 50 && Liquid.numLiquid < Liquid.stuckAmount + 50)
928 | {
929 | Liquid.stuckCount++;
930 | if (Liquid.stuckCount >= 10000)
931 | {
932 | Liquid.stuck = true;
933 | for (int num7 = Liquid.numLiquid - 1; num7 >= 0; num7--)
934 | {
935 | Liquid.DelWater(num7);
936 | }
937 | Liquid.stuck = false;
938 | Liquid.stuckCount = 0;
939 | return;
940 | }
941 | }
942 | else
943 | {
944 | Liquid.stuckCount = 0;
945 | Liquid.stuckAmount = Liquid.numLiquid;
946 | }
947 | }
948 | }
949 | public static void AddWater(int x, int y)
950 | {
951 | if (Main.tile[x, y].checkingLiquid())
952 | {
953 | return;
954 | }
955 | if (x >= Main.maxTilesX - 5 || y >= Main.maxTilesY - 5)
956 | {
957 | return;
958 | }
959 | if (x < 5 || y < 5)
960 | {
961 | return;
962 | }
963 | if (Main.tile[x, y] == null)
964 | {
965 | return;
966 | }
967 | if (Main.tile[x, y].liquid == 0)
968 | {
969 | return;
970 | }
971 | if (Liquid.numLiquid >= Liquid.maxLiquid - 1)
972 | {
973 | LiquidBuffer.AddBuffer(x, y);
974 | return;
975 | }
976 | Main.tile[x, y].checkingLiquid(true);
977 | Main.liquid[Liquid.numLiquid].kill = 0;
978 | Main.liquid[Liquid.numLiquid].x = x;
979 | Main.liquid[Liquid.numLiquid].y = y;
980 | Main.liquid[Liquid.numLiquid].delay = 0;
981 | Main.tile[x, y].skipLiquid(false);
982 | Liquid.numLiquid++;
983 | if (Main.netMode == 2 && Liquid.numLiquid < Liquid.maxLiquid / 3)
984 | {
985 | NetMessage.sendWater(x, y);
986 | }
987 | if (Main.tile[x, y].active() && (Main.tileWaterDeath[(int)Main.tile[x, y].type] || (Main.tile[x, y].lava() && Main.tileLavaDeath[(int)Main.tile[x, y].type])))
988 | {
989 | if (Main.tile[x, y].type == 4 && Main.tile[x, y].frameY == 176)
990 | {
991 | return;
992 | }
993 | if (Main.tile[x, y].type == 4 && Main.tile[x, y].frameY == 242)
994 | {
995 | return;
996 | }
997 | if (Main.tile[x, y].type == 19 && Main.tile[x, y].frameY == 234)
998 | {
999 | return;
1000 | }
1001 | if (Main.tile[x, y].type == 11 && Main.tile[x, y].frameY >= 1026 && Main.tile[x, y].frameY <= 1078)
1002 | {
1003 | return;
1004 | }
1005 | if (Main.tile[x, y].type == 15 && Main.tile[x, y].frameY >= 640 && Main.tile[x, y].frameY <= 678)
1006 | {
1007 | return;
1008 | }
1009 | if (Main.tile[x, y].type == 14 && Main.tile[x, y].frameX >= 702 && Main.tile[x, y].frameX <= 754)
1010 | {
1011 | return;
1012 | }
1013 | if (Main.tile[x, y].type == 18 && Main.tile[x, y].frameX >= 504 && Main.tile[x, y].frameX <= 538)
1014 | {
1015 | return;
1016 | }
1017 | if (Main.tile[x, y].type == 105 && Main.tile[x, y].frameX >= 1764 && Main.tile[x, y].frameX <= 1798)
1018 | {
1019 | return;
1020 | }
1021 | if (Main.tile[x, y].type == 101 && Main.tile[x, y].frameX >= 216 && Main.tile[x, y].frameX <= 268)
1022 | {
1023 | return;
1024 | }
1025 | if (WorldGen.gen)
1026 | {
1027 | Main.tile[x, y].active(false);
1028 | return;
1029 | }
1030 | WorldGen.KillTile(x, y, false, false, false);
1031 | if (Main.netMode == 2)
1032 | {
1033 | NetMessage.SendData(17, -1, -1, "", 0, (float)x, (float)y, 0f, 0);
1034 | }
1035 | }
1036 | }
1037 | public static void LavaCheck(int x, int y)
1038 | {
1039 | if ((Main.tile[x - 1, y].liquid > 0 && !Main.tile[x - 1, y].lava()) || (Main.tile[x + 1, y].liquid > 0 && !Main.tile[x + 1, y].lava()) || (Main.tile[x, y - 1].liquid > 0 && !Main.tile[x, y - 1].lava()))
1040 | {
1041 | int num = 0;
1042 | int type = 56;
1043 | if (!Main.tile[x - 1, y].lava())
1044 | {
1045 | num += (int)Main.tile[x - 1, y].liquid;
1046 | Main.tile[x - 1, y].liquid = 0;
1047 | }
1048 | if (!Main.tile[x + 1, y].lava())
1049 | {
1050 | num += (int)Main.tile[x + 1, y].liquid;
1051 | Main.tile[x + 1, y].liquid = 0;
1052 | }
1053 | if (!Main.tile[x, y - 1].lava())
1054 | {
1055 | num += (int)Main.tile[x, y - 1].liquid;
1056 | Main.tile[x, y - 1].liquid = 0;
1057 | }
1058 | if (Main.tile[x - 1, y].honey() || Main.tile[x + 1, y].honey() || Main.tile[x, y - 1].honey())
1059 | {
1060 | type = 230;
1061 | }
1062 | if (num >= 32 && !Main.tile[x, y].active())
1063 | {
1064 | Main.tile[x, y].liquid = 0;
1065 | Main.tile[x, y].lava(false);
1066 | WorldGen.PlaceTile(x, y, type, true, true, -1, 0);
1067 | WorldGen.SquareTileFrame(x, y, true);
1068 | if (Main.netMode == 2)
1069 | {
1070 | NetMessage.SendTileSquare(-1, x - 1, y - 1, 3);
1071 | return;
1072 | }
1073 | }
1074 | }
1075 | else
1076 | {
1077 | if (Main.tile[x, y + 1].liquid > 0 && !Main.tile[x, y + 1].lava())
1078 | {
1079 | if (Main.tileCut[(int)Main.tile[x, y + 1].type])
1080 | {
1081 | WorldGen.KillTile(x, y + 1, false, false, false);
1082 | if (Main.netMode == 2)
1083 | {
1084 | NetMessage.SendData(17, -1, -1, "", 0, (float)x, (float)(y + 1), 0f, 0);
1085 | }
1086 | }
1087 | if (!Main.tile[x, y + 1].active())
1088 | {
1089 | if (Main.tile[x, y].liquid < 32)
1090 | {
1091 | Main.tile[x, y].liquid = 0;
1092 | Main.tile[x, y].liquidType(0);
1093 | if (Main.netMode == 2)
1094 | {
1095 | NetMessage.SendTileSquare(-1, x - 1, y, 3);
1096 | return;
1097 | }
1098 | }
1099 | else
1100 | {
1101 | int type2 = 56;
1102 | if (Main.tile[x, y + 1].honey())
1103 | {
1104 | type2 = 230;
1105 | }
1106 | Main.tile[x, y].liquid = 0;
1107 | Main.tile[x, y].lava(false);
1108 | Main.tile[x, y + 1].liquid = 0;
1109 | WorldGen.PlaceTile(x, y + 1, type2, true, true, -1, 0);
1110 | WorldGen.SquareTileFrame(x, y + 1, true);
1111 | if (Main.netMode == 2)
1112 | {
1113 | NetMessage.SendTileSquare(-1, x - 1, y, 3);
1114 | }
1115 | }
1116 | }
1117 | }
1118 | }
1119 | }
1120 | public static void HoneyCheck(int x, int y)
1121 | {
1122 | if ((Main.tile[x - 1, y].liquid > 0 && Main.tile[x - 1, y].liquidType() == 0) || (Main.tile[x + 1, y].liquid > 0 && Main.tile[x + 1, y].liquidType() == 0) || (Main.tile[x, y - 1].liquid > 0 && Main.tile[x, y - 1].liquidType() == 0))
1123 | {
1124 | int num = 0;
1125 | if (Main.tile[x - 1, y].liquidType() == 0)
1126 | {
1127 | num += (int)Main.tile[x - 1, y].liquid;
1128 | Main.tile[x - 1, y].liquid = 0;
1129 | }
1130 | if (Main.tile[x + 1, y].liquidType() == 0)
1131 | {
1132 | num += (int)Main.tile[x + 1, y].liquid;
1133 | Main.tile[x + 1, y].liquid = 0;
1134 | }
1135 | if (Main.tile[x, y - 1].liquidType() == 0)
1136 | {
1137 | num += (int)Main.tile[x, y - 1].liquid;
1138 | Main.tile[x, y - 1].liquid = 0;
1139 | }
1140 | if (num >= 32 && !Main.tile[x, y].active())
1141 | {
1142 | Main.tile[x, y].liquid = 0;
1143 | Main.tile[x, y].liquidType(0);
1144 | WorldGen.PlaceTile(x, y, 229, true, true, -1, 0);
1145 | WorldGen.SquareTileFrame(x, y, true);
1146 | if (Main.netMode == 2)
1147 | {
1148 | NetMessage.SendTileSquare(-1, x - 1, y - 1, 3);
1149 | return;
1150 | }
1151 | }
1152 | }
1153 | else
1154 | {
1155 | if (Main.tile[x, y + 1].liquid > 0 && Main.tile[x, y + 1].liquidType() == 0)
1156 | {
1157 | if (Main.tileCut[(int)Main.tile[x, y + 1].type])
1158 | {
1159 | WorldGen.KillTile(x, y + 1, false, false, false);
1160 | if (Main.netMode == 2)
1161 | {
1162 | NetMessage.SendData(17, -1, -1, "", 0, (float)x, (float)(y + 1), 0f, 0);
1163 | }
1164 | }
1165 | if (!Main.tile[x, y + 1].active())
1166 | {
1167 | if (Main.tile[x, y].liquid < 32)
1168 | {
1169 | Main.tile[x, y].liquid = 0;
1170 | Main.tile[x, y].liquidType(0);
1171 | if (Main.netMode == 2)
1172 | {
1173 | NetMessage.SendTileSquare(-1, x - 1, y, 3);
1174 | return;
1175 | }
1176 | }
1177 | else
1178 | {
1179 | Main.tile[x, y].liquid = 0;
1180 | Main.tile[x, y].liquidType(0);
1181 | Main.tile[x, y + 1].liquid = 0;
1182 | Main.tile[x, y + 1].liquidType(0);
1183 | WorldGen.PlaceTile(x, y + 1, 229, true, true, -1, 0);
1184 | WorldGen.SquareTileFrame(x, y + 1, true);
1185 | if (Main.netMode == 2)
1186 | {
1187 | NetMessage.SendTileSquare(-1, x - 1, y, 3);
1188 | }
1189 | }
1190 | }
1191 | }
1192 | }
1193 | }
1194 | public static void NetAddWater(int x, int y)
1195 | {
1196 | if (x >= Main.maxTilesX - 5 || y >= Main.maxTilesY - 5)
1197 | {
1198 | return;
1199 | }
1200 | if (x < 5 || y < 5)
1201 | {
1202 | return;
1203 | }
1204 | if (Main.tile[x, y] == null)
1205 | {
1206 | return;
1207 | }
1208 | if (Main.tile[x, y].liquid == 0)
1209 | {
1210 | return;
1211 | }
1212 | for (int i = 0; i < Liquid.numLiquid; i++)
1213 | {
1214 | if (Main.liquid[i].x == x && Main.liquid[i].y == y)
1215 | {
1216 | Main.liquid[i].kill = 0;
1217 | Main.tile[x, y].skipLiquid(true);
1218 | return;
1219 | }
1220 | }
1221 | if (Liquid.numLiquid >= Liquid.maxLiquid - 1)
1222 | {
1223 | LiquidBuffer.AddBuffer(x, y);
1224 | return;
1225 | }
1226 | Main.tile[x, y].checkingLiquid(true);
1227 | Main.tile[x, y].skipLiquid(true);
1228 | Main.liquid[Liquid.numLiquid].kill = 0;
1229 | Main.liquid[Liquid.numLiquid].x = x;
1230 | Main.liquid[Liquid.numLiquid].y = y;
1231 | Liquid.numLiquid++;
1232 | int arg_10F_0 = Main.netMode;
1233 | if (Main.tile[x, y].active() && (Main.tileWaterDeath[(int)Main.tile[x, y].type] || (Main.tile[x, y].lava() && Main.tileLavaDeath[(int)Main.tile[x, y].type])))
1234 | {
1235 | WorldGen.KillTile(x, y, false, false, false);
1236 | if (Main.netMode == 2)
1237 | {
1238 | NetMessage.SendData(17, -1, -1, "", 0, (float)x, (float)y, 0f, 0);
1239 | }
1240 | }
1241 | }
1242 | public static void DelWater(int l)
1243 | {
1244 | int num = Main.liquid[l].x;
1245 | int num2 = Main.liquid[l].y;
1246 | byte b = 2;
1247 | if (Main.tile[num, num2].liquid < b)
1248 | {
1249 | Main.tile[num, num2].liquid = 0;
1250 | if (Main.tile[num - 1, num2].liquid < b)
1251 | {
1252 | Main.tile[num - 1, num2].liquid = 0;
1253 | }
1254 | else
1255 | {
1256 | Liquid.AddWater(num - 1, num2);
1257 | }
1258 | if (Main.tile[num + 1, num2].liquid < b)
1259 | {
1260 | Main.tile[num + 1, num2].liquid = 0;
1261 | }
1262 | else
1263 | {
1264 | Liquid.AddWater(num + 1, num2);
1265 | }
1266 | }
1267 | else
1268 | {
1269 | if (Main.tile[num, num2].liquid < 20)
1270 | {
1271 | if ((Main.tile[num - 1, num2].liquid < Main.tile[num, num2].liquid && (!Main.tile[num - 1, num2].nactive() || !Main.tileSolid[(int)Main.tile[num - 1, num2].type] || Main.tileSolidTop[(int)Main.tile[num - 1, num2].type])) || (Main.tile[num + 1, num2].liquid < Main.tile[num, num2].liquid && (!Main.tile[num + 1, num2].nactive() || !Main.tileSolid[(int)Main.tile[num + 1, num2].type] || Main.tileSolidTop[(int)Main.tile[num + 1, num2].type])) || (Main.tile[num, num2 + 1].liquid < 255 && (!Main.tile[num, num2 + 1].nactive() || !Main.tileSolid[(int)Main.tile[num, num2 + 1].type] || Main.tileSolidTop[(int)Main.tile[num, num2 + 1].type])))
1272 | {
1273 | Main.tile[num, num2].liquid = 0;
1274 | }
1275 | }
1276 | else
1277 | {
1278 | if (Main.tile[num, num2 + 1].liquid < 255 && (!Main.tile[num, num2 + 1].nactive() || !Main.tileSolid[(int)Main.tile[num, num2 + 1].type] || Main.tileSolidTop[(int)Main.tile[num, num2 + 1].type]) && !Liquid.stuck)
1279 | {
1280 | Main.liquid[l].kill = 0;
1281 | return;
1282 | }
1283 | }
1284 | }
1285 | if (Main.tile[num, num2].liquid < 250 && Main.tile[num, num2 - 1].liquid > 0)
1286 | {
1287 | Liquid.AddWater(num, num2 - 1);
1288 | }
1289 | if (Main.tile[num, num2].liquid == 0)
1290 | {
1291 | Main.tile[num, num2].liquidType(0);
1292 | }
1293 | else
1294 | {
1295 | if ((Main.tile[num + 1, num2].liquid > 0 && Main.tile[num + 1, num2 + 1].liquid < 250 && !Main.tile[num + 1, num2 + 1].active()) || (Main.tile[num - 1, num2].liquid > 0 && Main.tile[num - 1, num2 + 1].liquid < 250 && !Main.tile[num - 1, num2 + 1].active()))
1296 | {
1297 | Liquid.AddWater(num - 1, num2);
1298 | Liquid.AddWater(num + 1, num2);
1299 | }
1300 | if (Main.tile[num, num2].lava())
1301 | {
1302 | Liquid.LavaCheck(num, num2);
1303 | for (int i = num - 1; i <= num + 1; i++)
1304 | {
1305 | for (int j = num2 - 1; j <= num2 + 1; j++)
1306 | {
1307 | if (Main.tile[i, j].active())
1308 | {
1309 | if (Main.tile[i, j].type == 2 || Main.tile[i, j].type == 23 || Main.tile[i, j].type == 109)
1310 | {
1311 | Main.tile[i, j].type = 0;
1312 | WorldGen.SquareTileFrame(i, j, true);
1313 | if (Main.netMode == 2)
1314 | {
1315 | NetMessage.SendTileSquare(-1, num, num2, 3);
1316 | }
1317 | }
1318 | else
1319 | {
1320 | if (Main.tile[i, j].type == 60 || Main.tile[i, j].type == 70)
1321 | {
1322 | Main.tile[i, j].type = 59;
1323 | WorldGen.SquareTileFrame(i, j, true);
1324 | if (Main.netMode == 2)
1325 | {
1326 | NetMessage.SendTileSquare(-1, num, num2, 3);
1327 | }
1328 | }
1329 | }
1330 | }
1331 | }
1332 | }
1333 | }
1334 | else
1335 | {
1336 | if (Main.tile[num, num2].honey())
1337 | {
1338 | Liquid.HoneyCheck(num, num2);
1339 | }
1340 | }
1341 | }
1342 | if (Main.netMode == 2)
1343 | {
1344 | NetMessage.sendWater(num, num2);
1345 | }
1346 | Liquid.numLiquid--;
1347 | Main.tile[Main.liquid[l].x, Main.liquid[l].y].checkingLiquid(false);
1348 | Main.liquid[l].x = Main.liquid[Liquid.numLiquid].x;
1349 | Main.liquid[l].y = Main.liquid[Liquid.numLiquid].y;
1350 | Main.liquid[l].kill = Main.liquid[Liquid.numLiquid].kill;
1351 | if (Main.tileAlch[(int)Main.tile[num, num2].type])
1352 | {
1353 | WorldGen.CheckAlch(num, num2);
1354 | }
1355 | }
1356 | }
1357 | }
1358 |
--------------------------------------------------------------------------------
/Terraria/LiquidBuffer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace Terraria
3 | {
4 | public class LiquidBuffer
5 | {
6 | public const int maxLiquidBuffer = 10000;
7 | public static int numLiquidBuffer;
8 | public int x;
9 | public int y;
10 | public static void AddBuffer(int x, int y)
11 | {
12 | if (LiquidBuffer.numLiquidBuffer == 9999)
13 | {
14 | return;
15 | }
16 | if (Main.tile[x, y].checkingLiquid())
17 | {
18 | return;
19 | }
20 | Main.tile[x, y].checkingLiquid(true);
21 | Main.liquidBuffer[LiquidBuffer.numLiquidBuffer].x = x;
22 | Main.liquidBuffer[LiquidBuffer.numLiquidBuffer].y = y;
23 | LiquidBuffer.numLiquidBuffer++;
24 | }
25 | public static void DelBuffer(int l)
26 | {
27 | LiquidBuffer.numLiquidBuffer--;
28 | Main.liquidBuffer[l].x = Main.liquidBuffer[LiquidBuffer.numLiquidBuffer].x;
29 | Main.liquidBuffer[l].y = Main.liquidBuffer[LiquidBuffer.numLiquidBuffer].y;
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Terraria/Netplay.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Net;
4 | using System.Net.Sockets;
5 | using System.Threading;
6 | namespace Terraria
7 | {
8 | public class Netplay
9 | {
10 | public const int bufferSize = 1024;
11 | public const int maxConnections = 256;
12 | public static bool stopListen = false;
13 | public static ServerSock[] serverSock = new ServerSock[256];
14 | public static ClientSock clientSock = new ClientSock();
15 | public static TcpListener tcpListener;
16 | public static IPAddress serverListenIP;
17 | public static IPAddress serverIP;
18 | public static int serverPort = 7777;
19 | public static bool disconnect = false;
20 | public static string password = "";
21 | public static string banFile = "banlist.txt";
22 | public static bool spamCheck = false;
23 | public static bool anyClients = false;
24 | public static string portForwardIP;
25 | public static int portForwardPort;
26 | public static bool portForwardOpen;
27 | public static bool uPNP = true;
28 | public static bool ServerUp = false;
29 | public static void openPort()
30 | {
31 | Netplay.portForwardIP = Netplay.LocalIPAddress();
32 | Netplay.portForwardPort = Netplay.serverPort;
33 | }
34 | public static void closePort()
35 | {
36 | }
37 | public static string LocalIPAddress()
38 | {
39 | string result = "";
40 | IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
41 | IPAddress[] addressList = hostEntry.AddressList;
42 | for (int i = 0; i < addressList.Length; i++)
43 | {
44 | IPAddress iPAddress = addressList[i];
45 | if (iPAddress.AddressFamily == AddressFamily.InterNetwork)
46 | {
47 | result = iPAddress.ToString();
48 | break;
49 | }
50 | }
51 | return result;
52 | }
53 | public static void ResetNetDiag()
54 | {
55 | Main.rxMsg = 0;
56 | Main.rxData = 0;
57 | Main.txMsg = 0;
58 | Main.txData = 0;
59 | for (int i = 0; i < Main.maxMsg; i++)
60 | {
61 | Main.rxMsgType[i] = 0;
62 | Main.rxDataType[i] = 0;
63 | Main.txMsgType[i] = 0;
64 | Main.txDataType[i] = 0;
65 | }
66 | }
67 | public static void ResetSections()
68 | {
69 | for (int i = 0; i < 256; i++)
70 | {
71 | for (int j = 0; j < Main.maxSectionsX; j++)
72 | {
73 | for (int k = 0; k < Main.maxSectionsY; k++)
74 | {
75 | Netplay.serverSock[i].tileSection[j, k] = false;
76 | }
77 | }
78 | }
79 | }
80 | public static void AddBan(int plr)
81 | {
82 | string text = Netplay.serverSock[plr].tcpClient.Client.RemoteEndPoint.ToString();
83 | string value = text;
84 | for (int i = 0; i < text.Length; i++)
85 | {
86 | if (text.Substring(i, 1) == ":")
87 | {
88 | value = text.Substring(0, i);
89 | }
90 | }
91 | using (StreamWriter streamWriter = new StreamWriter(Netplay.banFile, true))
92 | {
93 | streamWriter.WriteLine("//" + Main.player[plr].name);
94 | streamWriter.WriteLine(value);
95 | }
96 | }
97 | public static bool CheckBan(string ip)
98 | {
99 | try
100 | {
101 | string b = ip;
102 | for (int i = 0; i < ip.Length; i++)
103 | {
104 | if (ip.Substring(i, 1) == ":")
105 | {
106 | b = ip.Substring(0, i);
107 | }
108 | }
109 | if (File.Exists(Netplay.banFile))
110 | {
111 | using (StreamReader streamReader = new StreamReader(Netplay.banFile))
112 | {
113 | string a;
114 | while ((a = streamReader.ReadLine()) != null)
115 | {
116 | if (a == b)
117 | {
118 | return true;
119 | }
120 | }
121 | }
122 | }
123 | }
124 | catch
125 | {
126 | }
127 | return false;
128 | }
129 | public static void newRecent()
130 | {
131 | for (int i = 0; i < Main.maxMP; i++)
132 | {
133 | if (Main.recentIP[i] == Netplay.serverIP.ToString() && Main.recentPort[i] == Netplay.serverPort)
134 | {
135 | for (int j = i; j < Main.maxMP - 1; j++)
136 | {
137 | Main.recentIP[j] = Main.recentIP[j + 1];
138 | Main.recentPort[j] = Main.recentPort[j + 1];
139 | Main.recentWorld[j] = Main.recentWorld[j + 1];
140 | }
141 | }
142 | }
143 | for (int k = Main.maxMP - 1; k > 0; k--)
144 | {
145 | Main.recentIP[k] = Main.recentIP[k - 1];
146 | Main.recentPort[k] = Main.recentPort[k - 1];
147 | Main.recentWorld[k] = Main.recentWorld[k - 1];
148 | }
149 | Main.recentIP[0] = Netplay.serverIP.ToString();
150 | Main.recentPort[0] = Netplay.serverPort;
151 | Main.recentWorld[0] = Main.worldName;
152 | Main.SaveRecent();
153 | }
154 | public static void ClientLoop(object threadContext)
155 | {
156 | Netplay.ResetNetDiag();
157 | Main.ServerSideCharacter = false;
158 | if (Main.rand == null)
159 | {
160 | Main.rand = new Random((int)DateTime.Now.Ticks);
161 | }
162 | if (WorldGen.genRand == null)
163 | {
164 | WorldGen.genRand = new Random((int)DateTime.Now.Ticks);
165 | }
166 | Main.player[Main.myPlayer].hostile = false;
167 | Main.clientPlayer = (Player)Main.player[Main.myPlayer].clientClone();
168 | for (int i = 0; i < 255; i++)
169 | {
170 | if (i != Main.myPlayer)
171 | {
172 | Main.player[i] = new Player();
173 | }
174 | }
175 | Main.menuMode = 10;
176 | Main.menuMode = 14;
177 | if (!Main.autoPass)
178 | {
179 | Main.statusText = "Connecting to " + Netplay.serverIP;
180 | }
181 | Main.netMode = 1;
182 | Netplay.disconnect = false;
183 | Netplay.clientSock = new ClientSock();
184 | Netplay.clientSock.tcpClient.NoDelay = true;
185 | Netplay.clientSock.readBuffer = new byte[1024];
186 | Netplay.clientSock.writeBuffer = new byte[1024];
187 | bool flag = true;
188 | while (flag)
189 | {
190 | flag = false;
191 | try
192 | {
193 | Netplay.clientSock.tcpClient.Connect(Netplay.serverIP, Netplay.serverPort);
194 | Netplay.clientSock.networkStream = Netplay.clientSock.tcpClient.GetStream();
195 | flag = false;
196 | }
197 | catch
198 | {
199 | if (!Netplay.disconnect && Main.gameMenu)
200 | {
201 | flag = true;
202 | }
203 | }
204 | }
205 | NetMessage.buffer[256].Reset();
206 | int num = -1;
207 | while (!Netplay.disconnect)
208 | {
209 | if (Netplay.clientSock.tcpClient.Connected)
210 | {
211 | if (NetMessage.buffer[256].checkBytes)
212 | {
213 | NetMessage.CheckBytes(256);
214 | }
215 | Netplay.clientSock.active = true;
216 | if (Netplay.clientSock.state == 0)
217 | {
218 | Main.statusText = "Found server";
219 | Netplay.clientSock.state = 1;
220 | NetMessage.SendData(1, -1, -1, "", 0, 0f, 0f, 0f, 0);
221 | }
222 | if (Netplay.clientSock.state == 2 && num != Netplay.clientSock.state)
223 | {
224 | Main.statusText = "Sending player data...";
225 | }
226 | if (Netplay.clientSock.state == 3 && num != Netplay.clientSock.state)
227 | {
228 | Main.statusText = "Requesting world information";
229 | }
230 | if (Netplay.clientSock.state == 4)
231 | {
232 | WorldGen.worldCleared = false;
233 | Netplay.clientSock.state = 5;
234 | if (Main.cloudBGActive >= 1f)
235 | {
236 | Main.cloudBGAlpha = 1f;
237 | }
238 | else
239 | {
240 | Main.cloudBGAlpha = 0f;
241 | }
242 | Main.windSpeed = Main.windSpeedSet;
243 | Cloud.resetClouds();
244 | Main.cloudAlpha = Main.maxRaining;
245 | WorldGen.clearWorld();
246 | if (Main.mapEnabled)
247 | {
248 | Map.loadMap();
249 | }
250 | }
251 | if (Netplay.clientSock.state == 5 && Main.loadMapLock)
252 | {
253 | float num2 = (float)Main.loadMapLastX / (float)Main.maxTilesX;
254 | Main.statusText = string.Concat(new object[]
255 | {
256 | Lang.gen[68],
257 | " ",
258 | (int)(num2 * 100f + 1f),
259 | "%"
260 | });
261 | }
262 | else
263 | {
264 | if (Netplay.clientSock.state == 5 && WorldGen.worldCleared)
265 | {
266 | Netplay.clientSock.state = 6;
267 | Main.player[Main.myPlayer].FindSpawn();
268 | NetMessage.SendData(8, -1, -1, "", Main.player[Main.myPlayer].SpawnX, (float)Main.player[Main.myPlayer].SpawnY, 0f, 0f, 0);
269 | }
270 | }
271 | if (Netplay.clientSock.state == 6 && num != Netplay.clientSock.state)
272 | {
273 | Main.statusText = "Requesting tile data";
274 | }
275 | if (!Netplay.clientSock.locked && !Netplay.disconnect && Netplay.clientSock.networkStream.DataAvailable)
276 | {
277 | Netplay.clientSock.locked = true;
278 | Netplay.clientSock.networkStream.BeginRead(Netplay.clientSock.readBuffer, 0, Netplay.clientSock.readBuffer.Length, new AsyncCallback(Netplay.clientSock.ClientReadCallBack), Netplay.clientSock.networkStream);
279 | }
280 | if (Netplay.clientSock.statusMax > 0 && Netplay.clientSock.statusText != "")
281 | {
282 | if (Netplay.clientSock.statusCount >= Netplay.clientSock.statusMax)
283 | {
284 | Main.statusText = Netplay.clientSock.statusText + ": Complete!";
285 | Netplay.clientSock.statusText = "";
286 | Netplay.clientSock.statusMax = 0;
287 | Netplay.clientSock.statusCount = 0;
288 | }
289 | else
290 | {
291 | Main.statusText = string.Concat(new object[]
292 | {
293 | Netplay.clientSock.statusText,
294 | ": ",
295 | (int)((float)Netplay.clientSock.statusCount / (float)Netplay.clientSock.statusMax * 100f),
296 | "%"
297 | });
298 | }
299 | }
300 | Thread.Sleep(1);
301 | }
302 | else
303 | {
304 | if (Netplay.clientSock.active)
305 | {
306 | Main.statusText = "Lost connection";
307 | Netplay.disconnect = true;
308 | }
309 | }
310 | num = Netplay.clientSock.state;
311 | }
312 | try
313 | {
314 | Netplay.clientSock.networkStream.Close();
315 | Netplay.clientSock.networkStream = Netplay.clientSock.tcpClient.GetStream();
316 | }
317 | catch
318 | {
319 | }
320 | if (!Main.gameMenu)
321 | {
322 | Main.netMode = 0;
323 | Player.SavePlayer(Main.player[Main.myPlayer], Main.playerPathName);
324 | Main.gameMenu = true;
325 | Main.menuMode = 14;
326 | }
327 | NetMessage.buffer[256].Reset();
328 | if (Main.menuMode == 15 && Main.statusText == "Lost connection")
329 | {
330 | Main.menuMode = 14;
331 | }
332 | if (Netplay.clientSock.statusText != "" && Netplay.clientSock.statusText != null)
333 | {
334 | Main.statusText = "Lost connection";
335 | }
336 | Netplay.clientSock.statusCount = 0;
337 | Netplay.clientSock.statusMax = 0;
338 | Netplay.clientSock.statusText = "";
339 | Main.netMode = 0;
340 | }
341 | public static void ServerLoop(object threadContext)
342 | {
343 | Netplay.ResetNetDiag();
344 | if (Main.rand == null)
345 | {
346 | Main.rand = new Random((int)DateTime.Now.Ticks);
347 | }
348 | if (WorldGen.genRand == null)
349 | {
350 | WorldGen.genRand = new Random((int)DateTime.Now.Ticks);
351 | }
352 | Main.myPlayer = 255;
353 | Netplay.serverIP = IPAddress.Any;
354 | Netplay.serverListenIP = Netplay.serverIP;
355 | Main.menuMode = 14;
356 | Main.statusText = "Starting server...";
357 | Main.netMode = 2;
358 | Netplay.disconnect = false;
359 | for (int i = 0; i < 256; i++)
360 | {
361 | Netplay.serverSock[i] = new ServerSock();
362 | Netplay.serverSock[i].Reset();
363 | Netplay.serverSock[i].whoAmI = i;
364 | Netplay.serverSock[i].tcpClient = new TcpClient();
365 | Netplay.serverSock[i].tcpClient.NoDelay = true;
366 | Netplay.serverSock[i].readBuffer = new byte[1024];
367 | Netplay.serverSock[i].writeBuffer = new byte[1024];
368 | }
369 | Netplay.tcpListener = new TcpListener(Netplay.serverListenIP, Netplay.serverPort);
370 | try
371 | {
372 | Netplay.tcpListener.Start();
373 | }
374 | catch (Exception ex)
375 | {
376 | Main.menuMode = 15;
377 | Main.statusText = ex.ToString();
378 | Netplay.disconnect = true;
379 | }
380 | if (!Netplay.disconnect)
381 | {
382 | ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), 1);
383 | Main.statusText = "Server started";
384 | }
385 | if (Netplay.uPNP)
386 | {
387 | try
388 | {
389 | Netplay.openPort();
390 | }
391 | catch
392 | {
393 | }
394 | }
395 | int num = 0;
396 | while (!Netplay.disconnect)
397 | {
398 | if (Netplay.stopListen)
399 | {
400 | int num2 = -1;
401 | for (int j = 0; j < Main.maxNetPlayers; j++)
402 | {
403 | if (!Netplay.serverSock[j].tcpClient.Connected)
404 | {
405 | num2 = j;
406 | break;
407 | }
408 | }
409 | if (num2 >= 0)
410 | {
411 | if (Main.ignoreErrors)
412 | {
413 | try
414 | {
415 | Netplay.tcpListener.Start();
416 | Netplay.stopListen = false;
417 | ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), 1);
418 | goto IL_219;
419 | }
420 | catch
421 | {
422 | goto IL_219;
423 | }
424 | }
425 | Netplay.tcpListener.Start();
426 | Netplay.stopListen = false;
427 | ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), 1);
428 | }
429 | }
430 | IL_219:
431 | int num3 = 0;
432 | for (int k = 0; k < 256; k++)
433 | {
434 | if (NetMessage.buffer[k].checkBytes)
435 | {
436 | NetMessage.CheckBytes(k);
437 | }
438 | if (Netplay.serverSock[k].kill)
439 | {
440 | Netplay.serverSock[k].Reset();
441 | NetMessage.syncPlayers();
442 | }
443 | else
444 | {
445 | if (Netplay.serverSock[k].tcpClient.Connected)
446 | {
447 | if (!Netplay.serverSock[k].active)
448 | {
449 | Netplay.serverSock[k].state = 0;
450 | }
451 | Netplay.serverSock[k].active = true;
452 | num3++;
453 | if (!Netplay.serverSock[k].locked)
454 | {
455 | try
456 | {
457 | Netplay.serverSock[k].networkStream = Netplay.serverSock[k].tcpClient.GetStream();
458 | if (Netplay.serverSock[k].networkStream.DataAvailable)
459 | {
460 | Netplay.serverSock[k].locked = true;
461 | Netplay.serverSock[k].networkStream.BeginRead(Netplay.serverSock[k].readBuffer, 0, Netplay.serverSock[k].readBuffer.Length, new AsyncCallback(Netplay.serverSock[k].ServerReadCallBack), Netplay.serverSock[k].networkStream);
462 | }
463 | }
464 | catch
465 | {
466 | Netplay.serverSock[k].kill = true;
467 | }
468 | }
469 | if (Netplay.serverSock[k].statusMax > 0 && Netplay.serverSock[k].statusText2 != "")
470 | {
471 | if (Netplay.serverSock[k].statusCount >= Netplay.serverSock[k].statusMax)
472 | {
473 | Netplay.serverSock[k].statusText = string.Concat(new object[]
474 | {
475 | "(",
476 | Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
477 | ") ",
478 | Netplay.serverSock[k].name,
479 | " ",
480 | Netplay.serverSock[k].statusText2,
481 | ": Complete!"
482 | });
483 | Netplay.serverSock[k].statusText2 = "";
484 | Netplay.serverSock[k].statusMax = 0;
485 | Netplay.serverSock[k].statusCount = 0;
486 | }
487 | else
488 | {
489 | Netplay.serverSock[k].statusText = string.Concat(new object[]
490 | {
491 | "(",
492 | Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
493 | ") ",
494 | Netplay.serverSock[k].name,
495 | " ",
496 | Netplay.serverSock[k].statusText2,
497 | ": ",
498 | (int)((float)Netplay.serverSock[k].statusCount / (float)Netplay.serverSock[k].statusMax * 100f),
499 | "%"
500 | });
501 | }
502 | }
503 | else
504 | {
505 | if (Netplay.serverSock[k].state == 0)
506 | {
507 | Netplay.serverSock[k].statusText = string.Concat(new object[]
508 | {
509 | "(",
510 | Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
511 | ") ",
512 | Netplay.serverSock[k].name,
513 | " is connecting..."
514 | });
515 | }
516 | else
517 | {
518 | if (Netplay.serverSock[k].state == 1)
519 | {
520 | Netplay.serverSock[k].statusText = string.Concat(new object[]
521 | {
522 | "(",
523 | Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
524 | ") ",
525 | Netplay.serverSock[k].name,
526 | " is sending player data..."
527 | });
528 | }
529 | else
530 | {
531 | if (Netplay.serverSock[k].state == 2)
532 | {
533 | Netplay.serverSock[k].statusText = string.Concat(new object[]
534 | {
535 | "(",
536 | Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
537 | ") ",
538 | Netplay.serverSock[k].name,
539 | " requested world information"
540 | });
541 | }
542 | else
543 | {
544 | if (Netplay.serverSock[k].state != 3 && Netplay.serverSock[k].state == 10)
545 | {
546 | Netplay.serverSock[k].statusText = string.Concat(new object[]
547 | {
548 | "(",
549 | Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
550 | ") ",
551 | Netplay.serverSock[k].name,
552 | " is playing"
553 | });
554 | }
555 | }
556 | }
557 | }
558 | }
559 | }
560 | else
561 | {
562 | if (Netplay.serverSock[k].active)
563 | {
564 | Netplay.serverSock[k].kill = true;
565 | }
566 | else
567 | {
568 | Netplay.serverSock[k].statusText2 = "";
569 | if (k < 255)
570 | {
571 | Main.player[k].active = false;
572 | }
573 | }
574 | }
575 | }
576 | }
577 | num++;
578 | if (num > 10)
579 | {
580 | Thread.Sleep(1);
581 | num = 0;
582 | }
583 | else
584 | {
585 | Thread.Sleep(0);
586 | }
587 | if (!WorldGen.saveLock && !Main.dedServ)
588 | {
589 | if (num3 == 0)
590 | {
591 | Main.statusText = "Waiting for clients...";
592 | }
593 | else
594 | {
595 | Main.statusText = num3 + " clients connected";
596 | }
597 | }
598 | if (num3 == 0)
599 | {
600 | Netplay.anyClients = false;
601 | }
602 | else
603 | {
604 | Netplay.anyClients = true;
605 | }
606 | Netplay.ServerUp = true;
607 | }
608 | Netplay.tcpListener.Stop();
609 | try
610 | {
611 | Netplay.closePort();
612 | }
613 | catch
614 | {
615 | }
616 | for (int l = 0; l < 256; l++)
617 | {
618 | Netplay.serverSock[l].Reset();
619 | }
620 | if (Main.menuMode != 15)
621 | {
622 | Main.netMode = 0;
623 | Main.menuMode = 10;
624 | WorldGen.saveWorld(false);
625 | while (WorldGen.saveLock)
626 | {
627 | }
628 | Main.menuMode = 0;
629 | }
630 | else
631 | {
632 | Main.netMode = 0;
633 | }
634 | Main.myPlayer = 0;
635 | }
636 | public static void ListenForClients(object threadContext)
637 | {
638 | while (!Netplay.disconnect && !Netplay.stopListen)
639 | {
640 | int num = -1;
641 | for (int i = 0; i < Main.maxNetPlayers; i++)
642 | {
643 | if (!Netplay.serverSock[i].tcpClient.Connected)
644 | {
645 | num = i;
646 | break;
647 | }
648 | }
649 | if (num >= 0)
650 | {
651 | try
652 | {
653 | Netplay.serverSock[num].tcpClient = Netplay.tcpListener.AcceptTcpClient();
654 | Netplay.serverSock[num].tcpClient.NoDelay = true;
655 | Console.WriteLine(Netplay.serverSock[num].tcpClient.Client.RemoteEndPoint + " is connecting...");
656 | continue;
657 | }
658 | catch (Exception ex)
659 | {
660 | if (!Netplay.disconnect)
661 | {
662 | Main.menuMode = 15;
663 | Main.statusText = ex.ToString();
664 | Netplay.disconnect = true;
665 | }
666 | continue;
667 | }
668 | }
669 | Netplay.stopListen = true;
670 | Netplay.tcpListener.Stop();
671 | }
672 | }
673 | public static void StartClient()
674 | {
675 | ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ClientLoop), 1);
676 | }
677 | public static void StartServer()
678 | {
679 | ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ServerLoop), 1);
680 | }
681 | public static bool SetIP(string newIP)
682 | {
683 | try
684 | {
685 | Netplay.serverIP = IPAddress.Parse(newIP);
686 | }
687 | catch
688 | {
689 | return false;
690 | }
691 | return true;
692 | }
693 | public static bool SetIP2(string newIP)
694 | {
695 | bool result;
696 | try
697 | {
698 | IPHostEntry hostEntry = Dns.GetHostEntry(newIP);
699 | IPAddress[] addressList = hostEntry.AddressList;
700 | for (int i = 0; i < addressList.Length; i++)
701 | {
702 | if (addressList[i].AddressFamily == AddressFamily.InterNetwork)
703 | {
704 | Netplay.serverIP = addressList[i];
705 | result = true;
706 | return result;
707 | }
708 | }
709 | result = false;
710 | }
711 | catch
712 | {
713 | result = false;
714 | }
715 | return result;
716 | }
717 | public static void Init()
718 | {
719 | for (int i = 0; i < 257; i++)
720 | {
721 | if (i < 256)
722 | {
723 | Netplay.serverSock[i] = new ServerSock();
724 | Netplay.serverSock[i].tcpClient.NoDelay = true;
725 | }
726 | NetMessage.buffer[i] = new messageBuffer();
727 | NetMessage.buffer[i].whoAmI = i;
728 | }
729 | Netplay.clientSock.tcpClient.NoDelay = true;
730 | }
731 | public static int GetSectionX(int x)
732 | {
733 | return x / 200;
734 | }
735 | public static int GetSectionY(int y)
736 | {
737 | return y / 150;
738 | }
739 | }
740 | }
741 |
--------------------------------------------------------------------------------
/Terraria/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Windows.Forms;
4 | namespace Terraria
5 | {
6 | internal static class Program
7 | {
8 | private static void Main(string[] args)
9 | {
10 | using (Main main = new Main())
11 | {
12 | try
13 | {
14 | for (int i = 0; i < args.Length; i++)
15 | {
16 | if (args[i].ToLower() == "-port" || args[i].ToLower() == "-p")
17 | {
18 | i++;
19 | try
20 | {
21 | int serverPort = Convert.ToInt32(args[i]);
22 | Netplay.serverPort = serverPort;
23 | }
24 | catch
25 | {
26 | }
27 | }
28 | if (args[i].ToLower() == "-join" || args[i].ToLower() == "-j")
29 | {
30 | i++;
31 | try
32 | {
33 | main.AutoJoin(args[i]);
34 | }
35 | catch
36 | {
37 | }
38 | }
39 | if (args[i].ToLower() == "-pass" || args[i].ToLower() == "-password")
40 | {
41 | i++;
42 | Netplay.password = args[i];
43 | main.AutoPass();
44 | }
45 | if (args[i].ToLower() == "-host")
46 | {
47 | main.AutoHost();
48 | }
49 | if (args[i].ToLower() == "-loadlib")
50 | {
51 | i++;
52 | string path = args[i];
53 | main.loadLib(path);
54 | }
55 | }
56 | Steam.Init();
57 | if (Steam.SteamInit)
58 | {
59 | main.Run();
60 | }
61 | else
62 | {
63 | MessageBox.Show("Please launch the game from your Steam client.", "Error");
64 | }
65 | }
66 | catch (Exception ex)
67 | {
68 | try
69 | {
70 | using (StreamWriter streamWriter = new StreamWriter("client-crashlog.txt", true))
71 | {
72 | streamWriter.WriteLine(DateTime.Now);
73 | streamWriter.WriteLine(ex);
74 | streamWriter.WriteLine("/n");
75 | }
76 | MessageBox.Show(ex.ToString(), "Terraria: Error");
77 | }
78 | catch
79 | {
80 | }
81 | }
82 | }
83 | }
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/Terraria/Rain.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | namespace Terraria
4 | {
5 | public class Rain
6 | {
7 | public Vector2 position;
8 | public Vector2 velocity;
9 | public float scale;
10 | public int alpha;
11 | public bool active;
12 | public byte type;
13 | public static void MakeRain()
14 | {
15 | if ((double)Main.screenPosition.Y > Main.worldSurface * 16.0)
16 | {
17 | return;
18 | }
19 | if (Main.gameMenu)
20 | {
21 | return;
22 | }
23 | float num = (float)Main.screenWidth / 1920f;
24 | num *= 25f;
25 | num *= 0.25f + 1f * Main.cloudAlpha;
26 | int num2 = 0;
27 | while ((float)num2 < num)
28 | {
29 | int num3 = 600;
30 | if (Main.player[Main.myPlayer].velocity.Y < 0f)
31 | {
32 | num3 += (int)(Math.Abs(Main.player[Main.myPlayer].velocity.Y) * 30f);
33 | }
34 | Vector2 vector;
35 | vector.X = (float)Main.rand.Next((int)Main.screenPosition.X - num3, (int)Main.screenPosition.X + Main.screenWidth + num3);
36 | vector.Y = Main.screenPosition.Y - (float)Main.rand.Next(20, 100);
37 | vector.X -= Main.windSpeed * 15f * 40f;
38 | vector.X += Main.player[Main.myPlayer].velocity.X * 40f;
39 | if (vector.X < 0f)
40 | {
41 | vector.X = 0f;
42 | }
43 | if (vector.X > (float)((Main.maxTilesX - 1) * 16))
44 | {
45 | vector.X = (float)((Main.maxTilesX - 1) * 16);
46 | }
47 | int num4 = (int)vector.X / 16;
48 | int num5 = (int)vector.Y / 16;
49 | if (num4 < 0)
50 | {
51 | num4 = 0;
52 | }
53 | if (num4 > Main.maxTilesX - 1)
54 | {
55 | num4 = Main.maxTilesX - 1;
56 | }
57 | if (Main.gameMenu || (!WorldGen.SolidTile(num4, num5) && Main.tile[num4, num5].wall <= 0))
58 | {
59 | Vector2 vector2 = new Vector2(Main.windSpeed * 12f, 14f);
60 | Rain.NewRain(vector, vector2);
61 | }
62 | num2++;
63 | }
64 | }
65 | public void Update()
66 | {
67 | this.position += this.velocity;
68 | if (Collision.SolidCollision(this.position, 2, 2) || this.position.Y > Main.screenPosition.Y + (float)Main.screenHeight + 100f || Collision.WetCollision(this.position, 2, 2))
69 | {
70 | this.active = false;
71 | if ((float)Main.rand.Next(100) < Main.gfxQuality * 100f)
72 | {
73 | int num = Dust.NewDust(this.position - this.velocity, 2, 2, 154, 0f, 0f, 0, default(Color), 1f);
74 | Dust expr_C3_cp_0 = Main.dust[num];
75 | expr_C3_cp_0.position.X = expr_C3_cp_0.position.X - 2f;
76 | Main.dust[num].alpha = 38;
77 | Main.dust[num].velocity *= 0.1f;
78 | Main.dust[num].velocity += -this.velocity * 0.025f;
79 | Main.dust[num].scale = 0.75f;
80 | }
81 | }
82 | }
83 | public static int NewRain(Vector2 Position, Vector2 Velocity)
84 | {
85 | int num = -1;
86 | int num2 = (int)((float)Main.maxRain * Main.cloudAlpha);
87 | if (num2 > Main.maxRain)
88 | {
89 | num2 = Main.maxRain;
90 | }
91 | float num3 = (1f + Main.gfxQuality) / 2f;
92 | if ((double)num3 < 0.9)
93 | {
94 | num2 = (int)((float)num2 * num3);
95 | }
96 | float num4 = (float)(800 - Main.snowTiles);
97 | if (num4 < 0f)
98 | {
99 | num4 = 0f;
100 | }
101 | num4 /= 800f;
102 | num2 = (int)((float)num2 * num4);
103 | for (int i = 0; i < num2; i++)
104 | {
105 | if (!Main.rain[i].active)
106 | {
107 | num = i;
108 | break;
109 | }
110 | }
111 | if (num == -1)
112 | {
113 | return Main.maxRain;
114 | }
115 | Main.rain[num].active = true;
116 | Main.rain[num].position = Position;
117 | Main.rain[num].scale = 1f + (float)Main.rand.Next(-20, 21) * 0.01f;
118 | Main.rain[num].velocity = Velocity * Main.rain[num].scale;
119 | Main.rain[num].type = (byte)Main.rand.Next(3);
120 | return num;
121 | }
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/Terraria/ServerSock.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | using System.Net.Sockets;
4 | namespace Terraria
5 | {
6 | public class ServerSock
7 | {
8 | public Socket clientSocket;
9 | public NetworkStream networkStream;
10 | public TcpClient tcpClient = new TcpClient();
11 | public int whoAmI;
12 | public string statusText2;
13 | public int statusCount;
14 | public int statusMax;
15 | public bool[,] tileSection = new bool[Main.maxTilesX / 200 + 1, Main.maxTilesY / 150 + 1];
16 | public string statusText = "";
17 | public bool active;
18 | public bool locked;
19 | public bool kill;
20 | public int timeOut;
21 | public bool announced;
22 | public string name = "Anonymous";
23 | public string oldName = "";
24 | public int state;
25 | public float spamProjectile;
26 | public float spamAddBlock;
27 | public float spamDelBlock;
28 | public float spamWater;
29 | public float spamProjectileMax = 100f;
30 | public float spamAddBlockMax = 100f;
31 | public float spamDelBlockMax = 500f;
32 | public float spamWaterMax = 50f;
33 | public byte[] readBuffer;
34 | public byte[] writeBuffer;
35 | public void SpamUpdate()
36 | {
37 | if (!Netplay.spamCheck)
38 | {
39 | this.spamProjectile = 0f;
40 | this.spamDelBlock = 0f;
41 | this.spamAddBlock = 0f;
42 | this.spamWater = 0f;
43 | return;
44 | }
45 | if (this.spamProjectile > this.spamProjectileMax)
46 | {
47 | NetMessage.BootPlayer(this.whoAmI, "Cheating attempt detected: Projectile spam");
48 | }
49 | if (this.spamAddBlock > this.spamAddBlockMax)
50 | {
51 | NetMessage.BootPlayer(this.whoAmI, "Cheating attempt detected: Add tile spam");
52 | }
53 | if (this.spamDelBlock > this.spamDelBlockMax)
54 | {
55 | NetMessage.BootPlayer(this.whoAmI, "Cheating attempt detected: Remove tile spam");
56 | }
57 | if (this.spamWater > this.spamWaterMax)
58 | {
59 | NetMessage.BootPlayer(this.whoAmI, "Cheating attempt detected: Liquid spam");
60 | }
61 | this.spamProjectile -= 0.4f;
62 | if (this.spamProjectile < 0f)
63 | {
64 | this.spamProjectile = 0f;
65 | }
66 | this.spamAddBlock -= 0.3f;
67 | if (this.spamAddBlock < 0f)
68 | {
69 | this.spamAddBlock = 0f;
70 | }
71 | this.spamDelBlock -= 5f;
72 | if (this.spamDelBlock < 0f)
73 | {
74 | this.spamDelBlock = 0f;
75 | }
76 | this.spamWater -= 0.2f;
77 | if (this.spamWater < 0f)
78 | {
79 | this.spamWater = 0f;
80 | }
81 | }
82 | public void SpamClear()
83 | {
84 | this.spamProjectile = 0f;
85 | this.spamAddBlock = 0f;
86 | this.spamDelBlock = 0f;
87 | this.spamWater = 0f;
88 | }
89 | public static void CheckSection(int who, Vector2 position)
90 | {
91 | int sectionX = Netplay.GetSectionX((int)(position.X / 16f));
92 | int sectionY = Netplay.GetSectionY((int)(position.Y / 16f));
93 | int num = 0;
94 | for (int i = sectionX - 1; i < sectionX + 2; i++)
95 | {
96 | for (int j = sectionY - 1; j < sectionY + 2; j++)
97 | {
98 | if (i >= 0 && i < Main.maxSectionsX && j >= 0 && j < Main.maxSectionsY && !Netplay.serverSock[who].tileSection[i, j])
99 | {
100 | num++;
101 | }
102 | }
103 | }
104 | if (num > 0)
105 | {
106 | int num2 = num * 150;
107 | NetMessage.SendData(9, who, -1, "Receiving tile data", num2, 0f, 0f, 0f, 0);
108 | Netplay.serverSock[who].statusText2 = "is receiving tile data";
109 | Netplay.serverSock[who].statusMax += num2;
110 | for (int k = sectionX - 1; k < sectionX + 2; k++)
111 | {
112 | for (int l = sectionY - 1; l < sectionY + 2; l++)
113 | {
114 | if (k >= 0 && k < Main.maxSectionsX && l >= 0 && l < Main.maxSectionsY && !Netplay.serverSock[who].tileSection[k, l])
115 | {
116 | NetMessage.SendSection(who, k, l);
117 | NetMessage.SendData(11, who, -1, "", k, (float)l, (float)k, (float)l, 0);
118 | }
119 | }
120 | }
121 | }
122 | }
123 | public bool SectionRange(int size, int firstX, int firstY)
124 | {
125 | for (int i = 0; i < 4; i++)
126 | {
127 | int num = firstX;
128 | int num2 = firstY;
129 | if (i == 1)
130 | {
131 | num += size;
132 | }
133 | if (i == 2)
134 | {
135 | num2 += size;
136 | }
137 | if (i == 3)
138 | {
139 | num += size;
140 | num2 += size;
141 | }
142 | int sectionX = Netplay.GetSectionX(num);
143 | int sectionY = Netplay.GetSectionY(num2);
144 | if (this.tileSection[sectionX, sectionY])
145 | {
146 | return true;
147 | }
148 | }
149 | return false;
150 | }
151 | public void Reset()
152 | {
153 | for (int i = 0; i < Main.maxSectionsX; i++)
154 | {
155 | for (int j = 0; j < Main.maxSectionsY; j++)
156 | {
157 | this.tileSection[i, j] = false;
158 | }
159 | }
160 | if (this.whoAmI < 255)
161 | {
162 | Main.player[this.whoAmI] = new Player();
163 | }
164 | this.timeOut = 0;
165 | this.statusCount = 0;
166 | this.statusMax = 0;
167 | this.statusText2 = "";
168 | this.statusText = "";
169 | this.name = "Anonymous";
170 | this.state = 0;
171 | this.locked = false;
172 | this.kill = false;
173 | this.SpamClear();
174 | this.active = false;
175 | NetMessage.buffer[this.whoAmI].Reset();
176 | if (this.networkStream != null)
177 | {
178 | this.networkStream.Close();
179 | }
180 | if (this.tcpClient != null)
181 | {
182 | this.tcpClient.Close();
183 | }
184 | }
185 | public void ServerWriteCallBack(IAsyncResult ar)
186 | {
187 | NetMessage.buffer[this.whoAmI].spamCount--;
188 | if (this.statusMax > 0)
189 | {
190 | this.statusCount++;
191 | }
192 | }
193 | public void ServerReadCallBack(IAsyncResult ar)
194 | {
195 | int num = 0;
196 | if (!Netplay.disconnect)
197 | {
198 | try
199 | {
200 | num = this.networkStream.EndRead(ar);
201 | }
202 | catch
203 | {
204 | }
205 | if (num == 0)
206 | {
207 | this.kill = true;
208 | }
209 | else
210 | {
211 | if (Main.ignoreErrors)
212 | {
213 | try
214 | {
215 | NetMessage.RecieveBytes(this.readBuffer, num, this.whoAmI);
216 | goto IL_57;
217 | }
218 | catch
219 | {
220 | goto IL_57;
221 | }
222 | }
223 | NetMessage.RecieveBytes(this.readBuffer, num, this.whoAmI);
224 | }
225 | }
226 | IL_57:
227 | this.locked = false;
228 | }
229 | }
230 | }
231 |
--------------------------------------------------------------------------------
/Terraria/Sign.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace Terraria
3 | {
4 | public class Sign
5 | {
6 | public const int maxSigns = 1000;
7 | public int x;
8 | public int y;
9 | public string text;
10 | public object Clone()
11 | {
12 | return base.MemberwiseClone();
13 | }
14 | public static void KillSign(int x, int y)
15 | {
16 | for (int i = 0; i < 1000; i++)
17 | {
18 | if (Main.sign[i] != null && Main.sign[i].x == x && Main.sign[i].y == y)
19 | {
20 | Main.sign[i] = null;
21 | }
22 | }
23 | }
24 | public static int ReadSign(int i, int j)
25 | {
26 | int k = (int)(Main.tile[i, j].frameX / 18);
27 | int num = (int)(Main.tile[i, j].frameY / 18);
28 | while (k > 1)
29 | {
30 | k -= 2;
31 | }
32 | int num2 = i - k;
33 | int num3 = j - num;
34 | if (Main.tile[num2, num3].type != 55 && Main.tile[num2, num3].type != 85)
35 | {
36 | Sign.KillSign(num2, num3);
37 | return -1;
38 | }
39 | int num4 = -1;
40 | for (int l = 0; l < 1000; l++)
41 | {
42 | if (Main.sign[l] != null && Main.sign[l].x == num2 && Main.sign[l].y == num3)
43 | {
44 | num4 = l;
45 | break;
46 | }
47 | }
48 | if (num4 < 0)
49 | {
50 | for (int m = 0; m < 1000; m++)
51 | {
52 | if (Main.sign[m] == null)
53 | {
54 | num4 = m;
55 | Main.sign[m] = new Sign();
56 | Main.sign[m].x = num2;
57 | Main.sign[m].y = num3;
58 | Main.sign[m].text = "";
59 | break;
60 | }
61 | }
62 | }
63 | return num4;
64 | }
65 | public static void TextSign(int i, string text)
66 | {
67 | if (Main.tile[Main.sign[i].x, Main.sign[i].y] == null || !Main.tile[Main.sign[i].x, Main.sign[i].y].active() || (Main.tile[Main.sign[i].x, Main.sign[i].y].type != 55 && Main.tile[Main.sign[i].x, Main.sign[i].y].type != 85))
68 | {
69 | Main.sign[i] = null;
70 | return;
71 | }
72 | Main.sign[i].text = text;
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/Terraria/Star.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | namespace Terraria
4 | {
5 | public class Star
6 | {
7 | public Vector2 position;
8 | public float scale;
9 | public float rotation;
10 | public int type;
11 | public float twinkle;
12 | public float twinkleSpeed;
13 | public float rotationSpeed;
14 | public static void SpawnStars()
15 | {
16 | Main.numStars = Main.rand.Next(65, 130);
17 | Main.numStars = 130;
18 | for (int i = 0; i < Main.numStars; i++)
19 | {
20 | Main.star[i] = new Star();
21 | Main.star[i].position.X = (float)Main.rand.Next(-12, Main.screenWidth + 1);
22 | Main.star[i].position.Y = (float)Main.rand.Next(-12, Main.screenHeight);
23 | Main.star[i].rotation = (float)Main.rand.Next(628) * 0.01f;
24 | Main.star[i].scale = (float)Main.rand.Next(50, 120) * 0.01f;
25 | Main.star[i].type = Main.rand.Next(0, 5);
26 | Main.star[i].twinkle = (float)Main.rand.Next(101) * 0.01f;
27 | Main.star[i].twinkleSpeed = (float)Main.rand.Next(40, 100) * 0.0001f;
28 | if (Main.rand.Next(2) == 0)
29 | {
30 | Main.star[i].twinkleSpeed *= -1f;
31 | }
32 | Main.star[i].rotationSpeed = (float)Main.rand.Next(10, 40) * 0.0001f;
33 | if (Main.rand.Next(2) == 0)
34 | {
35 | Main.star[i].rotationSpeed *= -1f;
36 | }
37 | }
38 | }
39 | public static void UpdateStars()
40 | {
41 | for (int i = 0; i < Main.numStars; i++)
42 | {
43 | Main.star[i].twinkle += Main.star[i].twinkleSpeed;
44 | if (Main.star[i].twinkle > 1f)
45 | {
46 | Main.star[i].twinkle = 1f;
47 | Main.star[i].twinkleSpeed *= -1f;
48 | }
49 | else
50 | {
51 | if ((double)Main.star[i].twinkle < 0.5)
52 | {
53 | Main.star[i].twinkle = 0.5f;
54 | Main.star[i].twinkleSpeed *= -1f;
55 | }
56 | }
57 | Main.star[i].rotation += Main.star[i].rotationSpeed;
58 | if ((double)Main.star[i].rotation > 6.28)
59 | {
60 | Main.star[i].rotation -= 6.28f;
61 | }
62 | if (Main.star[i].rotation < 0f)
63 | {
64 | Main.star[i].rotation += 6.28f;
65 | }
66 | }
67 | }
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/Terraria/Steam.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.InteropServices;
3 | namespace Terraria
4 | {
5 | public class Steam
6 | {
7 | public static bool SteamInit;
8 | [DllImport("steam_api.dll")]
9 | private static extern bool SteamAPI_Init();
10 | [DllImport("steam_api.dll")]
11 | private static extern bool SteamAPI_Shutdown();
12 | public static void Init()
13 | {
14 | Steam.SteamInit = Steam.SteamAPI_Init();
15 | }
16 | public static void Kill()
17 | {
18 | Steam.SteamAPI_Shutdown();
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Terraria/Tile.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Xna.Framework;
2 | using System;
3 | namespace Terraria
4 | {
5 | public class Tile
6 | {
7 | public byte type;
8 | public byte wall;
9 | public byte liquid;
10 | public byte tileHeader;
11 | public byte tileHeader2;
12 | public byte tileHeader3;
13 | public byte tileHeader4;
14 | public byte tileHeader5;
15 | public short frameX;
16 | public short frameY;
17 | public object Clone()
18 | {
19 | return base.MemberwiseClone();
20 | }
21 | public bool isTheSameAs(Tile compTile)
22 | {
23 | if (compTile == null)
24 | {
25 | return false;
26 | }
27 | if (this.active() != compTile.active())
28 | {
29 | return false;
30 | }
31 | if (this.active())
32 | {
33 | if (this.type != compTile.type)
34 | {
35 | return false;
36 | }
37 | if (Main.tileFrameImportant[(int)this.type])
38 | {
39 | if (this.frameX != compTile.frameX)
40 | {
41 | return false;
42 | }
43 | if (this.frameY != compTile.frameY)
44 | {
45 | return false;
46 | }
47 | }
48 | }
49 | return this.wall == compTile.wall && this.liquid == compTile.liquid && this.lava() == compTile.lava() && this.honey() == compTile.honey() && this.wire() == compTile.wire() && this.wire2() == compTile.wire2() && this.wire3() == compTile.wire3() && this.halfBrick() == compTile.halfBrick() && this.actuator() == compTile.actuator() && this.inActive() == compTile.inActive() && this.wallColor() == compTile.wallColor() && this.color() == compTile.color() && this.slope() == compTile.slope();
50 | }
51 | public byte wallFrameX()
52 | {
53 | byte b = 0;
54 | if ((this.tileHeader4 & 16) == 16)
55 | {
56 | b += 1;
57 | }
58 | if ((this.tileHeader4 & 32) == 32)
59 | {
60 | b += 2;
61 | }
62 | if ((this.tileHeader4 & 64) == 64)
63 | {
64 | b += 4;
65 | }
66 | if ((this.tileHeader4 & 128) == 128)
67 | {
68 | b += 8;
69 | }
70 | return (byte)(b * 18);
71 | }
72 | public void wallFrameX(int wallFrameX)
73 | {
74 | int num = wallFrameX / 18;
75 | if ((num & 1) == 1)
76 | {
77 | this.tileHeader4 |= 16;
78 | }
79 | else
80 | {
81 | this.tileHeader4 = (byte)((int)this.tileHeader4 & -17);
82 | }
83 | if ((num & 2) == 2)
84 | {
85 | this.tileHeader4 |= 32;
86 | }
87 | else
88 | {
89 | this.tileHeader4 = (byte)((int)this.tileHeader4 & -33);
90 | }
91 | if ((num & 4) == 4)
92 | {
93 | this.tileHeader4 |= 64;
94 | }
95 | else
96 | {
97 | this.tileHeader4 = (byte)((int)this.tileHeader4 & -65);
98 | }
99 | if ((num & 8) == 8)
100 | {
101 | this.tileHeader4 |= 128;
102 | return;
103 | }
104 | this.tileHeader4 = (byte)((int)this.tileHeader4 & -129);
105 | }
106 | public byte wallFrameY()
107 | {
108 | byte b = 0;
109 | if ((this.tileHeader5 & 1) == 1)
110 | {
111 | b += 1;
112 | }
113 | if ((this.tileHeader5 & 2) == 2)
114 | {
115 | b += 2;
116 | }
117 | if ((this.tileHeader5 & 4) == 4)
118 | {
119 | b += 4;
120 | }
121 | return (byte)(b * 18);
122 | }
123 | public void wallFrameY(int wallFrameX)
124 | {
125 | int num = wallFrameX / 18;
126 | if ((num & 1) == 1)
127 | {
128 | this.tileHeader5 |= 1;
129 | }
130 | else
131 | {
132 | this.tileHeader5 = (byte)((int)this.tileHeader5 & -2);
133 | }
134 | if ((num & 2) == 2)
135 | {
136 | this.tileHeader5 |= 2;
137 | }
138 | else
139 | {
140 | this.tileHeader5 = (byte)((int)this.tileHeader5 & -3);
141 | }
142 | if ((num & 4) == 4)
143 | {
144 | this.tileHeader5 |= 4;
145 | return;
146 | }
147 | this.tileHeader5 = (byte)((int)this.tileHeader5 & -5);
148 | }
149 | public byte frameNumber()
150 | {
151 | byte b = 0;
152 | if ((this.tileHeader4 & 1) == 1)
153 | {
154 | b += 1;
155 | }
156 | if ((this.tileHeader4 & 2) == 2)
157 | {
158 | b += 2;
159 | }
160 | return b;
161 | }
162 | public void frameNumber(byte frameNumber)
163 | {
164 | if ((frameNumber & 1) == 1)
165 | {
166 | this.tileHeader4 |= 1;
167 | }
168 | else
169 | {
170 | this.tileHeader4 = (byte)((int)this.tileHeader4 & -2);
171 | }
172 | if ((frameNumber & 2) == 2)
173 | {
174 | this.tileHeader4 |= 2;
175 | return;
176 | }
177 | this.tileHeader4 = (byte)((int)this.tileHeader4 & -3);
178 | }
179 | public byte wallFrameNumber()
180 | {
181 | byte b = 0;
182 | if ((this.tileHeader4 & 4) == 4)
183 | {
184 | b += 1;
185 | }
186 | if ((this.tileHeader4 & 8) == 8)
187 | {
188 | b += 2;
189 | }
190 | return b;
191 | }
192 | public void wallFrameNumber(byte wallFrameNumber)
193 | {
194 | if ((wallFrameNumber & 4) == 4)
195 | {
196 | this.tileHeader4 |= 4;
197 | }
198 | else
199 | {
200 | this.tileHeader4 = (byte)((int)this.tileHeader4 & -5);
201 | }
202 | if ((wallFrameNumber & 8) == 8)
203 | {
204 | this.tileHeader4 |= 8;
205 | return;
206 | }
207 | this.tileHeader4 = (byte)((int)this.tileHeader4 & -9);
208 | }
209 | public byte slope()
210 | {
211 | byte b = 0;
212 | if ((this.tileHeader3 & 16) == 16)
213 | {
214 | b += 1;
215 | }
216 | if ((this.tileHeader3 & 32) == 32)
217 | {
218 | b += 2;
219 | }
220 | return b;
221 | }
222 | public void slope(byte slope)
223 | {
224 | if ((slope & 1) == 1)
225 | {
226 | this.tileHeader3 |= 16;
227 | }
228 | else
229 | {
230 | this.tileHeader3 = (byte)((int)this.tileHeader3 & -17);
231 | }
232 | if ((slope & 2) == 2)
233 | {
234 | this.tileHeader3 |= 32;
235 | return;
236 | }
237 | this.tileHeader3 = (byte)((int)this.tileHeader3 & -33);
238 | }
239 | public byte color()
240 | {
241 | byte b = 0;
242 | if ((this.tileHeader2 & 4) == 4)
243 | {
244 | b += 1;
245 | }
246 | if ((this.tileHeader2 & 8) == 8)
247 | {
248 | b += 2;
249 | }
250 | if ((this.tileHeader2 & 16) == 16)
251 | {
252 | b += 4;
253 | }
254 | if ((this.tileHeader2 & 32) == 32)
255 | {
256 | b += 8;
257 | }
258 | if ((this.tileHeader2 & 64) == 64)
259 | {
260 | b += 16;
261 | }
262 | return b;
263 | }
264 | public void color(byte color)
265 | {
266 | if (color > 27)
267 | {
268 | color = 27;
269 | }
270 | if ((color & 1) == 1)
271 | {
272 | this.tileHeader2 |= 4;
273 | }
274 | else
275 | {
276 | this.tileHeader2 = (byte)((int)this.tileHeader2 & -5);
277 | }
278 | if ((color & 2) == 2)
279 | {
280 | this.tileHeader2 |= 8;
281 | }
282 | else
283 | {
284 | this.tileHeader2 = (byte)((int)this.tileHeader2 & -9);
285 | }
286 | if ((color & 4) == 4)
287 | {
288 | this.tileHeader2 |= 16;
289 | }
290 | else
291 | {
292 | this.tileHeader2 = (byte)((int)this.tileHeader2 & -17);
293 | }
294 | if ((color & 8) == 8)
295 | {
296 | this.tileHeader2 |= 32;
297 | }
298 | else
299 | {
300 | this.tileHeader2 = (byte)((int)this.tileHeader2 & -33);
301 | }
302 | if ((color & 16) == 16)
303 | {
304 | this.tileHeader2 |= 64;
305 | return;
306 | }
307 | this.tileHeader2 = (byte)((int)this.tileHeader2 & -65);
308 | }
309 | public byte wallColor()
310 | {
311 | byte b = 0;
312 | if ((this.tileHeader2 & 128) == 128)
313 | {
314 | b += 1;
315 | }
316 | if ((this.tileHeader3 & 1) == 1)
317 | {
318 | b += 2;
319 | }
320 | if ((this.tileHeader3 & 2) == 2)
321 | {
322 | b += 4;
323 | }
324 | if ((this.tileHeader3 & 4) == 4)
325 | {
326 | b += 8;
327 | }
328 | if ((this.tileHeader3 & 8) == 8)
329 | {
330 | b += 16;
331 | }
332 | return b;
333 | }
334 | public void wallColor(byte wallColor)
335 | {
336 | if (wallColor > 27)
337 | {
338 | wallColor = 27;
339 | }
340 | if ((wallColor & 1) == 1)
341 | {
342 | this.tileHeader2 |= 128;
343 | }
344 | else
345 | {
346 | this.tileHeader2 = (byte)((int)this.tileHeader2 & -129);
347 | }
348 | if ((wallColor & 2) == 2)
349 | {
350 | this.tileHeader3 |= 1;
351 | }
352 | else
353 | {
354 | this.tileHeader3 = (byte)((int)this.tileHeader3 & -2);
355 | }
356 | if ((wallColor & 4) == 4)
357 | {
358 | this.tileHeader3 |= 2;
359 | }
360 | else
361 | {
362 | this.tileHeader3 = (byte)((int)this.tileHeader3 & -3);
363 | }
364 | if ((wallColor & 8) == 8)
365 | {
366 | this.tileHeader3 |= 4;
367 | }
368 | else
369 | {
370 | this.tileHeader3 = (byte)((int)this.tileHeader3 & -5);
371 | }
372 | if ((wallColor & 16) == 16)
373 | {
374 | this.tileHeader3 |= 8;
375 | return;
376 | }
377 | this.tileHeader3 = (byte)((int)this.tileHeader3 & -9);
378 | }
379 | public bool lava()
380 | {
381 | return (this.tileHeader & 8) == 8;
382 | }
383 | public void lava(bool lava)
384 | {
385 | if (lava)
386 | {
387 | this.tileHeader |= 8;
388 | this.tileHeader3 = (byte)((int)this.tileHeader3 & -65);
389 | return;
390 | }
391 | this.tileHeader = (byte)((int)this.tileHeader & -9);
392 | }
393 | public bool honey()
394 | {
395 | return (this.tileHeader3 & 64) == 64;
396 | }
397 | public void honey(bool honey)
398 | {
399 | if (honey)
400 | {
401 | this.tileHeader3 |= 64;
402 | this.tileHeader = (byte)((int)this.tileHeader & -9);
403 | return;
404 | }
405 | this.tileHeader3 = (byte)((int)this.tileHeader3 & -65);
406 | }
407 | public void liquidType(int liquidType)
408 | {
409 | if (liquidType == 0)
410 | {
411 | this.honey(false);
412 | this.lava(false);
413 | }
414 | if (liquidType == 1)
415 | {
416 | this.honey(false);
417 | this.lava(true);
418 | }
419 | if (liquidType == 2)
420 | {
421 | this.honey(true);
422 | this.lava(false);
423 | }
424 | }
425 | public byte liquidType()
426 | {
427 | if (this.honey())
428 | {
429 | return 2;
430 | }
431 | if (this.lava())
432 | {
433 | return 1;
434 | }
435 | return 0;
436 | }
437 | public bool checkingLiquid()
438 | {
439 | return (this.tileHeader & 2) == 2;
440 | }
441 | public void checkingLiquid(bool checkingLiquid)
442 | {
443 | if (checkingLiquid)
444 | {
445 | this.tileHeader |= 2;
446 | return;
447 | }
448 | this.tileHeader = (byte)((int)this.tileHeader & -3);
449 | }
450 | public bool skipLiquid()
451 | {
452 | return (this.tileHeader & 4) == 4;
453 | }
454 | public void skipLiquid(bool skipLiquid)
455 | {
456 | if (skipLiquid)
457 | {
458 | this.tileHeader |= 4;
459 | return;
460 | }
461 | this.tileHeader = (byte)((int)this.tileHeader & -5);
462 | }
463 | public bool wire()
464 | {
465 | return (this.tileHeader & 16) == 16;
466 | }
467 | public void wire(bool wire)
468 | {
469 | if (wire)
470 | {
471 | this.tileHeader |= 16;
472 | return;
473 | }
474 | this.tileHeader = (byte)((int)this.tileHeader & -17);
475 | }
476 | public bool halfBrick()
477 | {
478 | return (this.tileHeader & 32) == 32;
479 | }
480 | public void halfBrick(bool halfBrick)
481 | {
482 | if (halfBrick)
483 | {
484 | this.tileHeader |= 32;
485 | return;
486 | }
487 | this.tileHeader = (byte)((int)this.tileHeader & -33);
488 | }
489 | public bool actuator()
490 | {
491 | return (this.tileHeader & 64) == 64;
492 | }
493 | public void actuator(bool actuator)
494 | {
495 | if (actuator)
496 | {
497 | this.tileHeader |= 64;
498 | return;
499 | }
500 | this.tileHeader = (byte)((int)this.tileHeader & -65);
501 | }
502 | public bool nactive()
503 | {
504 | return ((this.tileHeader & 1) != 1 || (this.tileHeader & 128) != 128) && (this.tileHeader & 1) == 1;
505 | }
506 | public bool inActive()
507 | {
508 | return (this.tileHeader & 128) == 128;
509 | }
510 | public void inActive(bool inActive)
511 | {
512 | if (inActive)
513 | {
514 | this.tileHeader |= 128;
515 | return;
516 | }
517 | this.tileHeader = (byte)((int)this.tileHeader & -129);
518 | }
519 | public bool active()
520 | {
521 | return (this.tileHeader & 1) == 1;
522 | }
523 | public void active(bool active)
524 | {
525 | if (active)
526 | {
527 | this.tileHeader |= 1;
528 | return;
529 | }
530 | this.tileHeader = (byte)((int)this.tileHeader & -2);
531 | }
532 | public bool wire2()
533 | {
534 | return (this.tileHeader2 & 1) == 1;
535 | }
536 | public void wire2(bool wire2)
537 | {
538 | if (wire2)
539 | {
540 | this.tileHeader2 |= 1;
541 | return;
542 | }
543 | this.tileHeader2 = (byte)((int)this.tileHeader2 & -2);
544 | }
545 | public bool wire3()
546 | {
547 | return (this.tileHeader2 & 2) == 2;
548 | }
549 | public void wire3(bool wire3)
550 | {
551 | if (wire3)
552 | {
553 | this.tileHeader2 |= 2;
554 | return;
555 | }
556 | this.tileHeader2 = (byte)((int)this.tileHeader2 & -3);
557 | }
558 | public Color actColor(Color oldColor)
559 | {
560 | if (this.inActive())
561 | {
562 | float num = 0.4f;
563 | int r = (int)((byte)(num * (float)oldColor.R));
564 | int g = (int)((byte)(num * (float)oldColor.G));
565 | int b = (int)((byte)(num * (float)oldColor.B));
566 | return new Color(r, g, b, (int)oldColor.A);
567 | }
568 | return oldColor;
569 | }
570 | }
571 | }
572 |
--------------------------------------------------------------------------------
/Terraria/keyBoardInput.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.InteropServices;
3 | using System.Windows.Forms;
4 | namespace Terraria
5 | {
6 | public class keyBoardInput
7 | {
8 | public class inKey : IMessageFilter
9 | {
10 | public bool PreFilterMessage(ref Message m)
11 | {
12 | if (m.Msg == 258)
13 | {
14 | char c = (char)((int)m.WParam);
15 | Console.WriteLine(c);
16 | if (keyBoardInput.newKeyEvent != null)
17 | {
18 | keyBoardInput.newKeyEvent(c);
19 | }
20 | }
21 | else
22 | {
23 | if (m.Msg == 256)
24 | {
25 | IntPtr intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(m));
26 | Marshal.StructureToPtr(m, intPtr, true);
27 | keyBoardInput.TranslateMessage(intPtr);
28 | }
29 | }
30 | return false;
31 | }
32 | }
33 | public static event Action newKeyEvent;
34 | [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
35 | public static extern bool TranslateMessage(IntPtr message);
36 | static keyBoardInput()
37 | {
38 | Application.AddMessageFilter(new keyBoardInput.inKey());
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------