├── .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 | --------------------------------------------------------------------------------