diff --git a/Commands/Information/CmdInfo.cs b/Commands/Information/CmdInfo.cs index 087b55f7e..38fe66cb3 100644 --- a/Commands/Information/CmdInfo.cs +++ b/Commands/Information/CmdInfo.cs @@ -55,7 +55,7 @@ namespace MCGalaxy.Commands else upTime += up.Seconds + " seconds"; Player.SendMessage(p, upTime); if (Server.updateTimer.Interval > 1000) Player.SendMessage(p, "This server is currently in &5Low Lag" + Server.DefaultColor + " mode."); - } + } } public override void Help(Player p) { diff --git a/Games/ZombieSurvival/ZombieGame.Game.cs b/Games/ZombieSurvival/ZombieGame.Game.cs index f59d981a8..e898551f3 100644 --- a/Games/ZombieSurvival/ZombieGame.Game.cs +++ b/Games/ZombieSurvival/ZombieGame.Game.cs @@ -24,7 +24,8 @@ namespace MCGalaxy.Games { public override bool HandlesManualChange(Player p, ushort x, ushort y, ushort z, byte action, byte tile, byte b) { - + if (Status == ZombieGameStatus.NotStarted + || (p.level == null || !p.level.name.CaselessEq(CurrentLevelName))) return false; if (CurrentLevel.BuildType == BuildType.NoModify) { p.RevertBlock(x, y, z); return true; } else if (CurrentLevel.BuildType == BuildType.ModifyOnly @@ -65,7 +66,8 @@ namespace MCGalaxy.Games { public override bool HandlesMovement(Player p, ushort x, ushort y, ushort z, byte rotX, byte rotY) { - if (p.level == null || !p.level.name.CaselessEq(CurrentLevelName)) return false; + if (Status == ZombieGameStatus.NotStarted + || (p.level == null || !p.level.name.CaselessEq(CurrentLevelName))) return false; if (!p.referee && noRespawn) { if (p.pos[0] >= x + 70 || p.pos[0] <= x - 70 ) { p.SendPos(0xFF, p.pos[0], p.pos[1], p.pos[2], p.rot[0], p.rot[1]); diff --git a/Levels/BlockQueue.cs b/Levels/BlockQueue.cs index b978624de..c9c46e5a4 100644 --- a/Levels/BlockQueue.cs +++ b/Levels/BlockQueue.cs @@ -24,6 +24,7 @@ namespace MCGalaxy { public static int blockupdates = 250; static System.Timers.Timer blocktimer = new System.Timers.Timer(100); static bool started = false; + static BufferedBlockSender bulkSender = new BufferedBlockSender(null); public static void Start() { blocktimer.Elapsed += delegate { @@ -33,6 +34,7 @@ namespace MCGalaxy { Level[] loaded = LevelInfo.Loaded.Items; foreach (Level l in loaded) ProcessLevelBlocks(l); + bulkSender.level = null; } catch (Exception ex) { Server.ErrorLog(ex); throw; @@ -56,30 +58,35 @@ namespace MCGalaxy { p.level.blockqueue.Add(item); } - static void ProcessLevelBlocks(Level l) { + static void ProcessLevelBlocks(Level lvl) { try { - if (l.blockqueue.Count < 1) return; + if (lvl.blockqueue.Count < 1) return; + bulkSender.level = lvl; int count = blockupdates; - if (l.blockqueue.Count < blockupdates || l.players.Count == 0) - count = l.blockqueue.Count; + if (lvl.blockqueue.Count < blockupdates || lvl.players.Count == 0) + count = lvl.blockqueue.Count; Level.BlockPos bP = default(Level.BlockPos); for (int c = 0; c < count; c++) { - block item = l.blockqueue[c]; + block item = lvl.blockqueue[c]; bP.name = item.p.name; ushort x, y, z; - l.IntToPos(item.index, out x, out y, out z); + lvl.IntToPos(item.index, out x, out y, out z); bP.index = item.index; bP.SetData(item.type, item.extType, item.type == 0); - l.Blockchange(item.p, x, y, z, item.type, item.extType); - l.blockCache.Add(bP); + if (lvl.DoBlockchange(item.p, x, y, z, item.type, item.extType)) { + bulkSender.Add(item.index, item.type, item.extType); + bulkSender.CheckIfSend(false); + lvl.blockCache.Add(bP); + } } - l.blockqueue.RemoveRange(0, count); + bulkSender.CheckIfSend(true); + lvl.blockqueue.RemoveRange(0, count); } catch (Exception e) { Server.s.ErrorCase("error:" + e); - Server.s.Log(String.Format("Block cache failed for map: {0}. {1} lost.", l.name, l.blockqueue.Count)); - l.blockqueue.Clear(); + Server.s.Log(String.Format("Block cache failed for map: {0}. {1} lost.", lvl.name, lvl.blockqueue.Count)); + lvl.blockqueue.Clear(); } } diff --git a/Levels/BufferedBlockSender.cs b/Levels/BufferedBlockSender.cs index f0885279c..c7f14b3cc 100644 --- a/Levels/BufferedBlockSender.cs +++ b/Levels/BufferedBlockSender.cs @@ -24,7 +24,7 @@ namespace MCGalaxy { int[] indices = new int[256]; byte[] types = new byte[256]; int count = 0; - Level level; + public Level level; public BufferedBlockSender(Level level) { this.level = level; diff --git a/Player/Player.cs b/Player/Player.cs index 92a190f2b..b9ed6ec7a 100644 --- a/Player/Player.cs +++ b/Player/Player.cs @@ -951,7 +951,7 @@ Next: continue; internal void RemoveInvalidUndos() { UndoDrawOpEntry[] items = UndoDrawOps.Items; for (int i = 0; i < items.Length; i++) { - if (!items[i].IsValid(p)) + if (!items[i].IsValid(this)) UndoDrawOps.Remove(items[i]); } } diff --git a/Player/Undo/UndoDrawOpEntry.cs b/Player/Undo/UndoDrawOpEntry.cs index 7e1e06153..de0082c3f 100644 --- a/Player/Undo/UndoDrawOpEntry.cs +++ b/Player/Undo/UndoDrawOpEntry.cs @@ -30,12 +30,14 @@ namespace MCGalaxy.Util { public void SetStart(Player p) { StartNode = p.UndoBuffer.Tail; - StartIndex = StartNode.Items.Count; + if (StartNode != null) + StartIndex = StartNode.Items.Count; } public void SetEnd(Player p) { EndNode = p.UndoBuffer.Tail; - EndIndex = EndNode.Items.Count; + if (EndNode != null) + EndIndex = EndNode.Items.Count; } public bool IsValid(Player p) {