public override void PreUpdate() { /* * count++; * if(count >= 100) * { * count = 0; * Main.NewText(Liquid.numLiquid +","+ LiquidBuffer.numLiquidBuffer + "," + LiquidBuffer2.numLiquidBuffer); * } */ if (quickSwitch) { Liquid.cycles = 1; Liquid.panicCounter = 0; while (LiquidBuffer.numLiquidBuffer > 5000 && LiquidBuffer2.numLiquidBuffer != 100000 - 1) { LiquidBuffer2.AddBuffer(Main.liquidBuffer[LiquidBuffer.numLiquidBuffer - 1].x, Main.liquidBuffer[LiquidBuffer.numLiquidBuffer - 1].y); LiquidBuffer.DelBuffer(LiquidBuffer.numLiquidBuffer - 1); } while (LiquidBuffer.numLiquidBuffer < 5000 && LiquidBuffer2.numLiquidBuffer != 0) { //LiquidBuffer.AddBuffer(liquidBuffer2[LiquidBuffer2.numLiquidBuffer].x,liquidBuffer2[LiquidBuffer2.numLiquidBuffer].y); Main.liquidBuffer[LiquidBuffer.numLiquidBuffer].x = liquidBuffer2[LiquidBuffer2.numLiquidBuffer - 1].x; Main.liquidBuffer[LiquidBuffer.numLiquidBuffer].y = liquidBuffer2[LiquidBuffer2.numLiquidBuffer - 1].y; LiquidBuffer.numLiquidBuffer++; LiquidBuffer2.DelBuffer(LiquidBuffer2.numLiquidBuffer - 1); } Liquid.UpdateLiquid(); } }
public override void PreUpdate() { if (quickSwitch) { count++; if (count >= 100) { count = 0; //Main.NewText(Liquid.numLiquid +","+ LiquidBuffer.numLiquidBuffer +","+ Liquid2.numLiquid); } Liquid.cycles = 1; Liquid.panicCounter = 0; Liquid.UpdateLiquid(); while (LiquidBuffer.numLiquidBuffer > 0 && Liquid2.numLiquid != 1000000 - 1) { //Liquid2.AddWater(Main.liquidBuffer[LiquidBuffer.numLiquidBuffer -1].x,Main.liquidBuffer[LiquidBuffer.numLiquidBuffer -1].y); //LiquidBuffer.DelBuffer(LiquidBuffer.numLiquidBuffer -1); Main.tile[Main.liquidBuffer[0].x, Main.liquidBuffer[0].y].checkingLiquid(false); Liquid2.AddWater(Main.liquidBuffer[0].x, Main.liquidBuffer[0].y); LiquidBuffer.DelBuffer(0); } Liquid2.cycles = 1; Liquid2.panicCounter = 0; Liquid2.UpdateLiquid(); } }
public static void SendWater(int x, int y) { if (disableLiquidUpdates) { return; } if (useLiquidUpdateBuffer) { //LiquidUpdateBuffer.QueueUpdate(x, y); LiquidBuffer.AddBuffer(x, y); return; } byte[] bytes = null; for (int i = 0; i < 255; i++) { var slot = Terraria.Netplay.Clients[i] as ServerSlot; if (slot.state >= SlotState.PLAYING && slot.Connected) { int X = x / 200; int Y = y / 150; if (X < (Main.maxTilesX / 200) && Y < (Main.maxTilesY / 150)) { if (Terraria.Netplay.Clients[i].TileSections[X, Y]) { if (bytes == null) { var msg = NewNetMessage.PrepareThreadInstance(); msg.FlowLiquid(x, y); bytes = msg.Output; } slot.Send(bytes); } } else { ProgramLog.Log("Water Index out of Bounds:"); ProgramLog.Log(string.Format("X: {0} Y: {1}, Axis: {2}, {3}", X, Y, Main.maxTilesX, Main.maxTilesY)); } } } }
public unsafe static void AddWater(int x, int y) { if (x >= 5 && y >= 5 && x < Main.maxTilesX - 5 && y < Main.maxTilesY - 5) { fixed(Tile *ptr = &Main.tile[x, y]) { if (ptr->liquid != 0 && ptr->checkingLiquid == 0) { if (numLiquid >= 4095) { LiquidBuffer.AddBuffer(x, y); } else { ptr->checkingLiquid = 64; Main.liquid[numLiquid].Init(x, y); ptr->skipLiquid = 0; numLiquid++; if (Main.netMode == 2 && numLiquid < 1365) { NetMessage.sendWater(x, y); } if (ptr->active != 0) { int type = ptr->type; if ((type != 4 || ptr->frameY != 176) && (Main.tileWaterDeath[type] || (ptr->lava != 0 && Main.tileLavaDeath[type]))) { if (WorldGen.gen) { ptr->active = 0; } else if (WorldGen.KillTile(x, y) && Main.netMode == 2) { NetMessage.CreateMessage5(17, 0, x, y, 0); NetMessage.SendMessage(); } } } } } } } }
public new static void UpdateLiquid() { int netMode = Main.netMode; if (Liquid2.quickSettle || Liquid2.numLiquid > 2000) { Liquid2.quickFall = true; } else { Liquid2.quickFall = false; } Liquid2.wetCounter++; int num7 = Liquid2.maxLiquid / Liquid2.cycles; int num2 = num7 * (Liquid2.wetCounter - 1); int num3 = num7 * Liquid2.wetCounter; if (Liquid2.wetCounter == Liquid2.cycles) { num3 = Liquid2.numLiquid; } if (num3 > Liquid2.numLiquid) { num3 = Liquid2.numLiquid; int netMode2 = Main.netMode; Liquid2.wetCounter = Liquid2.cycles; } if (Liquid2.quickFall) { for (int l = num2; l < num3; l++) { QuickLiquidV2.liquid2[l].delay = 10; QuickLiquidV2.liquid2[l].Update(); Main.tile[QuickLiquidV2.liquid2[l].x, QuickLiquidV2.liquid2[l].y].skipLiquid(false); } } else { for (int m = num2; m < num3; m++) { if (!Main.tile[QuickLiquidV2.liquid2[m].x, QuickLiquidV2.liquid2[m].y].skipLiquid()) { QuickLiquidV2.liquid2[m].Update(); } else { Main.tile[QuickLiquidV2.liquid2[m].x, QuickLiquidV2.liquid2[m].y].skipLiquid(false); } } } if (Liquid2.wetCounter >= Liquid2.cycles) { Liquid2.wetCounter = 0; for (int n = Liquid2.numLiquid - 1; n >= 0; n--) { if (QuickLiquidV2.liquid2[n].kill > 4) { Liquid2.DelWater(n); } } int num4 = Liquid2.maxLiquid - (Liquid2.maxLiquid - Liquid2.numLiquid); if (num4 > LiquidBuffer.numLiquidBuffer) { num4 = LiquidBuffer.numLiquidBuffer; } for (int num5 = 0; num5 < num4; num5++) { Main.tile[Main.liquidBuffer[0].x, Main.liquidBuffer[0].y].checkingLiquid(false); Liquid2.AddWater(Main.liquidBuffer[0].x, Main.liquidBuffer[0].y); LiquidBuffer.DelBuffer(0); } if (Liquid2.numLiquid > 0 && Liquid2.numLiquid > Liquid2.stuckAmount - 50 && Liquid2.numLiquid < Liquid2.stuckAmount + 50) { Liquid2.stuckCount++; if (Liquid2.stuckCount >= 10000) { Liquid2.stuck = true; for (int num6 = Liquid2.numLiquid - 1; num6 >= 0; num6--) { Liquid2.DelWater(num6); } Liquid2.stuck = false; Liquid2.stuckCount = 0; } } else { Liquid2.stuckCount = 0; Liquid2.stuckAmount = Liquid2.numLiquid; } } /* * if (!Terraria.WorldGen.gen && Main.netMode == 2 && Liquid2._netChangeSet.Count > 0) * { * Utils.Swap<HashSet<int>>(ref Liquid2._netChangeSet, ref Liquid2._swapNetChangeSet); * NetManager.Instance.Broadcast(NetLiquid2Module.Serialize(Liquid2._swapNetChangeSet), -1); * Liquid2._swapNetChangeSet.Clear(); * } */ }
public new static void AddWater(int x, int y) { Tile tile = Main.tile[x, y]; if (Main.tile[x, y] == null) { return; } if (tile.checkingLiquid()) { return; } if (x >= Main.maxTilesX - 5 || y >= Main.maxTilesY - 5) { return; } if (x < 5 || y < 5) { return; } if (tile.liquid == 0) { return; } if (Liquid2.numLiquid >= Liquid2.maxLiquid - 1) { LiquidBuffer.AddBuffer(x, y); return; } tile.checkingLiquid(true); QuickLiquidV2.liquid2[Liquid2.numLiquid].kill = 0; QuickLiquidV2.liquid2[Liquid2.numLiquid].x = x; QuickLiquidV2.liquid2[Liquid2.numLiquid].y = y; QuickLiquidV2.liquid2[Liquid2.numLiquid].delay = 0; tile.skipLiquid(false); Liquid2.numLiquid++; if (Main.netMode == 2) { Liquid2.NetSendLiquid(x, y); } if (tile.active() && !Terraria.WorldGen.gen) { bool flag = false; if (tile.lava()) { if (TileObjectData.CheckLavaDeath(tile)) { flag = true; } } else if (TileObjectData.CheckWaterDeath(tile)) { flag = true; } if (flag) { Terraria.WorldGen.KillTile(x, y, false, false, false); if (Main.netMode == 2) { NetMessage.SendData(17, -1, -1, null, 0, (float)x, (float)y, 0f, 0, 0, 0); } } } }