From 2a1915458056940b02f6b29416a2f2949b20a4cf Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 5 Feb 2018 16:27:35 +1100 Subject: [PATCH] And fix all the compile errors. Now comes the fun part of testing everything. --- GUI/PropertyWindow/PropertyWindow.Blocks.cs | 9 ++- MCGalaxy/Blocks/Behaviour/PlaceBehaviour.cs | 3 +- MCGalaxy/Blocks/Block.Convert.cs | 10 ++- MCGalaxy/Blocks/Block.cs | 17 ++--- MCGalaxy/Blocks/BlockDefinitions.cs | 31 ++++---- MCGalaxy/Blocks/BlockPerms.cs | 15 ++-- MCGalaxy/Blocks/BlockProperties.cs | 3 +- MCGalaxy/Blocks/DefaultSet.cs | 5 +- .../Blocks/Physics/ActivateablePhysics.cs | 11 +-- MCGalaxy/Blocks/Physics/AirPhysics.cs | 3 +- MCGalaxy/Blocks/Physics/FireworkPhysics.cs | 2 +- MCGalaxy/Blocks/Physics/OtherPhysics.cs | 10 +-- MCGalaxy/Commands/CPE/CustomBlockCommand.cs | 26 +++---- MCGalaxy/Commands/CommandParser.cs | 4 +- MCGalaxy/Commands/Fun/CTF/CmdCtf.cs | 5 +- MCGalaxy/Commands/Fun/CmdLavaSurvival.cs | 2 +- MCGalaxy/Commands/Fun/CmdTeam.cs | 4 +- MCGalaxy/Commands/Fun/WeaponCmd.cs | 2 +- MCGalaxy/Commands/Information/CmdAbout.cs | 3 +- MCGalaxy/Commands/Information/CmdSearch.cs | 2 +- .../Commands/Maintenance/CmdBlockSpeed.cs | 14 ++-- .../Commands/Maintenance/CmdPlayerEdit.cs | 2 +- MCGalaxy/Commands/Moderation/CmdHide.cs | 4 +- MCGalaxy/Commands/Moderation/CmdReport.cs | 6 +- MCGalaxy/Commands/Moderation/ZoneCmds.cs | 8 +-- MCGalaxy/Commands/World/CmdBlockProperties.cs | 46 ++++++------ MCGalaxy/Commands/World/CmdImport.cs | 8 +-- MCGalaxy/Commands/World/CmdRestore.cs | 4 +- MCGalaxy/Commands/building/CmdPalette.cs | 26 ++----- MCGalaxy/Commands/building/CmdPaste.cs | 6 +- .../Commands/building/CmdRestartPhysics.cs | 7 +- MCGalaxy/Commands/building/CmdSpin.cs | 4 +- MCGalaxy/CorePlugin/ConnectingHandler.cs | 2 +- MCGalaxy/Database/PlayerDB.cs | 2 +- MCGalaxy/Drawing/DrawOps/DrawOpPerformer.cs | 12 ++-- MCGalaxy/Drawing/Image/IPaletteMatcher.cs | 21 +++--- MCGalaxy/Drawing/Image/ImagePalette.cs | 18 +++-- MCGalaxy/Drawing/Image/ImagePrintDrawOp.cs | 12 ++-- MCGalaxy/Generator/Foliage/AshTree.cs | 3 +- MCGalaxy/Generator/Foliage/Tree.cs | 5 +- MCGalaxy/Generator/RealisticMapGen.cs | 2 +- MCGalaxy/Generator/fCraft/MapGenerator.cs | 12 ++-- MCGalaxy/Levels/BlockQueue.cs | 21 +++--- MCGalaxy/Levels/Level.Blocks.cs | 70 +++++++++---------- MCGalaxy/Levels/Level.cs | 8 ++- MCGalaxy/Levels/LevelEnv.cs | 5 +- MCGalaxy/Network/Player.Networking.cs | 9 +-- MCGalaxy/Network/Utils/BufferedBlockSender.cs | 11 ++- MCGalaxy/Network/Utils/LevelChunkStream.cs | 6 +- MCGalaxy/Player/Player.CPE.cs | 1 + MCGalaxy/Player/Player.Handlers.cs | 14 ++-- MCGalaxy/Player/Player.cs | 7 +- MCGalaxy/Server/Server.Init.cs | 2 +- MCGalaxy/Server/Tasks/UpgradeTasks.cs | 4 -- 54 files changed, 285 insertions(+), 264 deletions(-) diff --git a/GUI/PropertyWindow/PropertyWindow.Blocks.cs b/GUI/PropertyWindow/PropertyWindow.Blocks.cs index ad1a877c9..f7daec42b 100644 --- a/GUI/PropertyWindow/PropertyWindow.Blocks.cs +++ b/GUI/PropertyWindow/PropertyWindow.Blocks.cs @@ -55,12 +55,11 @@ namespace MCGalaxy.Gui { if (!blockPropsChanged[i].Changed) continue; Block.Props[i] = blockPropsChanged[i]; } + foreach (BlockPerms perms in blockPermsChanged) { - BlockPerms.List[perms.Block] = perms; - if (perms.Block < Block.CpeCount) { - BlockPerms.ResendAllBlockPermissions(); - } + BlockPerms.List[perms.ID] = perms; } + BlockPerms.ResendAllBlockPermissions(); BlockProps.Save("core", Block.Props, Block.CorePropsLock, null); BlockPerms.Save(); @@ -79,7 +78,7 @@ namespace MCGalaxy.Gui { void blk_list_SelectedIndexChanged(object sender, EventArgs e) { blockID = Block.Byte(blk_list.SelectedItem.ToString()); blockPermsOrig = BlockPerms.List[blockID]; - blockPerms = blockPermsChanged.Find(p => p.Block == blockID); + blockPerms = blockPermsChanged.Find(p => p.ID == blockID); BlockInitSpecificArrays(); blockSupressEvents = true; diff --git a/MCGalaxy/Blocks/Behaviour/PlaceBehaviour.cs b/MCGalaxy/Blocks/Behaviour/PlaceBehaviour.cs index 6a7e61da6..88f21f014 100644 --- a/MCGalaxy/Blocks/Behaviour/PlaceBehaviour.cs +++ b/MCGalaxy/Blocks/Behaviour/PlaceBehaviour.cs @@ -18,6 +18,7 @@ using MCGalaxy.Blocks.Physics; using System; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy.Blocks { @@ -66,7 +67,7 @@ namespace MCGalaxy.Blocks { } // Use red wool to detonate c4 - ushort held = p.BlockBindings[p.RawHeldBlock.RawID]; + BlockID held = p.BlockBindings[(BlockRaw)p.RawHeldBlock]; if (held == Block.Red) { Player.Message(p, "Placed detonator block, delete it to detonate."); C4Det(p, Block.C4Detonator, x, y, z); return; diff --git a/MCGalaxy/Blocks/Block.Convert.cs b/MCGalaxy/Blocks/Block.Convert.cs index 0f39ad99c..0551b66bc 100644 --- a/MCGalaxy/Blocks/Block.Convert.cs +++ b/MCGalaxy/Blocks/Block.Convert.cs @@ -38,11 +38,15 @@ namespace MCGalaxy { } public static string GetName(Player p, BlockID block) { - if (!Player.IsSuper(p)) return p.level.BlockName(block); - if (block < Block.Extended) return coreNames[block]; + BlockDefinition def; + if (!Player.IsSuper(p) && !IsPhysicsType(block)) { + def = p.level.GetBlockDef(block); + if (def != null) return def.Name.Replace(" ", ""); + } + if (block < Block.Extended) return coreNames[block]; BlockRaw raw = (BlockRaw)block; - BlockDefinition def = BlockDefinition.GlobalDefs[raw]; + def = BlockDefinition.GlobalDefs[raw]; return def != null ? def.Name.Replace(" ", "") : raw.ToString(); } diff --git a/MCGalaxy/Blocks/Block.cs b/MCGalaxy/Blocks/Block.cs index d4fb0d530..08ec83792 100644 --- a/MCGalaxy/Blocks/Block.cs +++ b/MCGalaxy/Blocks/Block.cs @@ -86,12 +86,6 @@ namespace MCGalaxy { return false; } - public static bool BuildIn(byte block) { - if (block == Op_Water || block == Op_Lava || Props[block].IsPortal || Props[block].IsMessageBlock) return false; - block = Convert(block); - return block >= Water && block <= StillLava; - } - public static bool LightPass(BlockID block) { switch (Convert(block)) { case Air: @@ -108,8 +102,7 @@ namespace MCGalaxy { return false; } - public static bool NeedRestart(byte block) - { + public static bool NeedRestart(BlockID block) { switch (block) { case Train: @@ -187,8 +180,16 @@ namespace MCGalaxy { return (BlockID)(raw | (extended ? Block.Extended : Block.Air)); } + public static BlockID MapOldRaw(BlockID raw) { + return IsPhysicsType(raw) ? ((BlockID)(Block.Extended | raw)) : raw; + } + public static bool IsPhysicsType(BlockID block) { return block >= Block.CpeCount && block < Block.Extended; } + + public static bool VisuallyEquals(BlockID a, BlockID b) { + return Block.Convert(a) == Block.Convert(b); + } } } diff --git a/MCGalaxy/Blocks/BlockDefinitions.cs b/MCGalaxy/Blocks/BlockDefinitions.cs index c08472aa4..79e7bb5fe 100644 --- a/MCGalaxy/Blocks/BlockDefinitions.cs +++ b/MCGalaxy/Blocks/BlockDefinitions.cs @@ -20,6 +20,8 @@ using System.IO; using MCGalaxy.Blocks; using MCGalaxy.Network; using Newtonsoft.Json; +using BlockID_ = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy { public sealed class BlockDefinition { @@ -145,20 +147,21 @@ namespace MCGalaxy { public static void UpdateGlobalBlockProps() { for (int i = 0; i < GlobalProps.Length; i++) { - ushort block = Block.FromRaw((byte)i); + BlockID_ block = Block.FromRaw((byte)i); GlobalProps[i] = BlockProps.MakeDefault(); GlobalProps[i] = DefaultProps(block); } BlockProps.Load("global", GlobalProps, GlobalPropsLock, false); } - internal static BlockProps DefaultProps(ushort block) { + internal static BlockProps DefaultProps(BlockID_ block) { + BlockRaw raw = (BlockRaw)block; if (Block.IsPhysicsType(block)) { return Block.Props[block]; - } else if (!block.IsCustomType && GlobalDefs[block.RawID] == null) { - return Block.Props[block.RawID]; + } else if (block < Block.Extended && GlobalDefs[raw] == null) { + return Block.Props[raw]; } else { - return GlobalProps[block.RawID]; + return GlobalProps[raw]; } } @@ -168,16 +171,16 @@ namespace MCGalaxy { for (int i = 0; i < lvl.CustomBlockDefs.Length; i++) { if (lvl.CustomBlockDefs[i] != oldGlobalDefs[i]) continue; - ushort block = Block.FromRaw((byte)i); + BlockID_ block = Block.FromRaw((byte)i); lvl.Props[block] = DefaultProps(block); - lvl.UpdateCustomBlock(block.RawID, GlobalDefs[i]); + lvl.UpdateCustomBlock((BlockRaw)block, GlobalDefs[i]); } } } public static void Add(BlockDefinition def, BlockDefinition[] defs, Level level) { - byte raw = def.BlockID; + BlockRaw raw = def.BlockID; bool global = defs == GlobalDefs; if (global) UpdateGlobalCustom(raw, def); @@ -199,7 +202,7 @@ namespace MCGalaxy { } public static void Remove(BlockDefinition def, BlockDefinition[] defs, Level level) { - byte raw = def.BlockID; + BlockRaw raw = def.BlockID; bool global = defs == GlobalDefs; if (global) UpdateGlobalCustom(raw, null); @@ -232,7 +235,7 @@ namespace MCGalaxy { } } - static void UpdateGlobalCustom(byte raw, BlockDefinition def) { + static void UpdateGlobalCustom(BlockRaw raw, BlockDefinition def) { Level[] loaded = LevelInfo.Loaded.Items; foreach (Level lvl in loaded) { if (lvl.CustomBlockDefs[raw] != GlobalDefs[raw]) continue; @@ -249,8 +252,8 @@ namespace MCGalaxy { return def.BlockID; } - byte id; - if (!byte.TryParse(msg, out id) || defs[id] == null) return -1; + BlockRaw id; + if (!BlockRaw.TryParse(msg, out id) || defs[id] == null) return -1; return id; } @@ -293,14 +296,14 @@ namespace MCGalaxy { } } - public static void UpdateFallback(bool global, byte block, Level level) { + public static void UpdateFallback(bool global, BlockRaw raw, Level level) { Player[] players = PlayerInfo.Online.Items; foreach (Player pl in players) { if (!global && pl.level != level) continue; if (pl.hasBlockDefs) continue; // if custom block is replacing core block, need to always reload for fallback - if (block >= Block.CpeCount && !pl.level.MayHaveCustomBlocks) continue; + if (raw >= Block.CpeCount && !pl.level.MayHaveCustomBlocks) continue; LevelActions.ReloadMap(pl, pl, false); } diff --git a/MCGalaxy/Blocks/BlockPerms.cs b/MCGalaxy/Blocks/BlockPerms.cs index 3d93c538f..36d6a5184 100644 --- a/MCGalaxy/Blocks/BlockPerms.cs +++ b/MCGalaxy/Blocks/BlockPerms.cs @@ -106,9 +106,9 @@ namespace MCGalaxy.Blocks { w.WriteLine(""); foreach (BlockPerms perms in list) { - if (Block.Undefined(perms.Block)) continue; + if (Block.Undefined(perms.ID)) continue; - string line = perms.Block + " : " + (int)perms.MinRank + " : " + string line = perms.ID + " : " + (int)perms.MinRank + " : " + CommandPerms.JoinPerms(perms.Disallowed) + " : " + CommandPerms.JoinPerms(perms.Allowed); w.WriteLine(line); } @@ -140,8 +140,8 @@ namespace MCGalaxy.Blocks { // Format is - Name/ID : Lowest : Disallow : Allow line.Replace(" ", "").FixedSplit(args, ':'); - ushort block; - if (!ushort.TryParse(args[0], out block)) { + BlockID block; + if (!BlockID.TryParse(args[0], out block)) { block = Block.Byte(args[0]); } if (block == Block.Invalid) continue; @@ -163,10 +163,11 @@ namespace MCGalaxy.Blocks { } static void SetDefaultPerms() { - for (int i = 0; i < Block.Count; i++) { + BlockProps defProps = BlockProps.MakeDefault(); + for (int i = 0; i < Block.ExtendedCount; i++) { BlockPerms perms = new BlockPerms(); - perms.Block = (byte)i; - BlockProps props = Block.Props[i]; + perms.ID = (BlockID)i; + BlockProps props = i < Block.Count ? Block.Props[i] : defProps; if (i == Block.Invalid) { perms.MinRank = LevelPermission.Admin; diff --git a/MCGalaxy/Blocks/BlockProperties.cs b/MCGalaxy/Blocks/BlockProperties.cs index bc683761c..6b1ac80ff 100644 --- a/MCGalaxy/Blocks/BlockProperties.cs +++ b/MCGalaxy/Blocks/BlockProperties.cs @@ -164,7 +164,8 @@ namespace MCGalaxy.Blocks { scope[idx].AnimalAI = (AnimalAI)ai; } if (parts.Length > 11) { - byte.TryParse(parts[11], out scope[idx].StackBlock); // TODO: this is raw ID, need to fixup + BlockID.TryParse(parts[11], out scope[idx].StackBlock); + scope[idx].StackBlock = Block.MapOldRaw(scope[idx].StackBlock); } if (parts.Length > 12) { bool.TryParse(parts[12], out scope[idx].OPBlock); diff --git a/MCGalaxy/Blocks/DefaultSet.cs b/MCGalaxy/Blocks/DefaultSet.cs index 06deb7f30..8e69f1a8c 100644 --- a/MCGalaxy/Blocks/DefaultSet.cs +++ b/MCGalaxy/Blocks/DefaultSet.cs @@ -18,6 +18,7 @@ using System; using System.Text; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy.Blocks { @@ -27,7 +28,7 @@ namespace MCGalaxy.Blocks { /// Constructs a custom block, with the default properties of the given classic/CPE block. public static BlockDefinition MakeCustomBlock(BlockID b) { BlockDefinition def = new BlockDefinition(); - def.BlockID = b; + def.BlockID = (BlockRaw)b; def.Name = Name(b); def.CollideType = Collide(b); def.Speed = 1; @@ -47,7 +48,7 @@ namespace MCGalaxy.Blocks { def.FogDensity = FogDensity(b); ColorDesc fog = FogColor(b); def.FogR = fog.R; def.FogG = fog.G; def.FogB = fog.B; - def.FallBack = b; + def.FallBack = (BlockRaw)b; def.MaxX = 16; def.MaxZ = Height(b); def.MaxY = 16; def.Version2 = true; diff --git a/MCGalaxy/Blocks/Physics/ActivateablePhysics.cs b/MCGalaxy/Blocks/Physics/ActivateablePhysics.cs index 1cdb9222c..87d853ff2 100644 --- a/MCGalaxy/Blocks/Physics/ActivateablePhysics.cs +++ b/MCGalaxy/Blocks/Physics/ActivateablePhysics.cs @@ -17,6 +17,7 @@ */ using System; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy.Blocks.Physics { public static class ActivateablePhysics { @@ -84,9 +85,9 @@ namespace MCGalaxy.Blocks.Physics { internal static PhysicsArgs GetDoorArgs(BlockID block, out byte physForm) { PhysicsArgs args = default(PhysicsArgs); args.Type1 = PhysicsArgs.Wait; args.Value1 = 16 - 1; - args.Type2 = PhysicsArgs.Revert; args.Value2 = block.RawID; + args.Type2 = PhysicsArgs.Revert; args.Value2 = (BlockRaw)block; args.Door = true; - args.ExtBlock = block.BlockID == Block.custom_block; + args.ExtBlock = block >= Block.Extended; physForm = Block.Door_Log_air; // air if (block == Block.Door_Air || block == Block.Door_AirActivatable) { @@ -102,9 +103,9 @@ namespace MCGalaxy.Blocks.Physics { internal static PhysicsArgs GetTDoorArgs(BlockID block) { PhysicsArgs args = default(PhysicsArgs); args.Type1 = PhysicsArgs.Wait; args.Value1 = 16; - args.Type2 = PhysicsArgs.Revert; args.Value2 = block.RawID; + args.Type2 = PhysicsArgs.Revert; args.Value2 = (BlockRaw)block; args.Door = true; - args.ExtBlock = block.BlockID == Block.custom_block; + args.ExtBlock = block >= Block.Extended; return args; } @@ -121,7 +122,7 @@ namespace MCGalaxy.Blocks.Physics { internal static void CheckAt(Level lvl, int index) { if (index == -1) return; byte block = lvl.blocks[index]; - byte convBlock = Block.Convert(block); + BlockID convBlock = Block.Convert(block); if (convBlock == Block.Water || convBlock == Block.Lava || (block >= Block.Red && block <= Block.White)) { lvl.AddCheck(index); return; diff --git a/MCGalaxy/Blocks/Physics/AirPhysics.cs b/MCGalaxy/Blocks/Physics/AirPhysics.cs index 126cf97b8..9192d9766 100644 --- a/MCGalaxy/Blocks/Physics/AirPhysics.cs +++ b/MCGalaxy/Blocks/Physics/AirPhysics.cs @@ -16,6 +16,7 @@ permissions and limitations under the Licenses. */ using System; +using BlockID = System.UInt16; namespace MCGalaxy.Blocks.Physics { @@ -71,7 +72,7 @@ namespace MCGalaxy.Blocks.Physics { static void FloodAir(Level lvl, int index, byte block) { if (index == -1) return; - byte curBlock = Block.Convert(lvl.blocks[index]); + BlockID curBlock = Block.Convert(lvl.blocks[index]); if (curBlock == Block.Water || curBlock == Block.Lava) lvl.AddUpdate(index, block); } diff --git a/MCGalaxy/Blocks/Physics/FireworkPhysics.cs b/MCGalaxy/Blocks/Physics/FireworkPhysics.cs index 7c7342c26..4e8b89519 100644 --- a/MCGalaxy/Blocks/Physics/FireworkPhysics.cs +++ b/MCGalaxy/Blocks/Physics/FireworkPhysics.cs @@ -67,7 +67,7 @@ namespace MCGalaxy.Blocks.Physics { for (int zz = z - (size + 1); zz <= z + (size + 1); ++zz) for (int xx = x - (size + 1); xx <= x + (size + 1); ++xx) { - if (lvl.IsAirAt((ushort)xx, (ushort)yy, (ushort)zz, out index) && rand.Next(1, 40) < 2) { + if (lvl.IsAirAt((ushort)xx, (ushort)yy, (ushort)zz, out index) && rand.Next(1, 40) < 2) { PhysicsArgs args = default(PhysicsArgs); args.Type1 = PhysicsArgs.Drop; args.Value1 = 100; args.Type2 = PhysicsArgs.Dissipate; args.Value2 = 25; diff --git a/MCGalaxy/Blocks/Physics/OtherPhysics.cs b/MCGalaxy/Blocks/Physics/OtherPhysics.cs index 7e0ee3653..1eb70f0b2 100644 --- a/MCGalaxy/Blocks/Physics/OtherPhysics.cs +++ b/MCGalaxy/Blocks/Physics/OtherPhysics.cs @@ -69,13 +69,15 @@ namespace MCGalaxy.Blocks.Physics { } public static void DoFloatwood(Level lvl, ref Check C) { - int index = lvl.IntOffset(C.b, 0, -1, 0); - if (lvl.GetTile(index) == Block.Air) { + ushort x, y, z; + lvl.IntToPos(C.b, out x, out y, out z); + int index; + + if (lvl.GetBlock(x, (ushort)(y - 1), z, out index) == Block.Air) { lvl.AddUpdate(C.b, Block.Air); lvl.AddUpdate(index, Block.FloatWood); } else { - index = lvl.IntOffset(C.b, 0, 1, 0); - byte above = lvl.GetTile(index); + BlockID above = lvl.GetBlock(x, (ushort)(y + 1), z, out index); if (above == Block.StillWater || Block.Convert(above) == Block.Water) { lvl.AddUpdate(C.b, lvl.blocks[index]); lvl.AddUpdate(index, Block.FloatWood); diff --git a/MCGalaxy/Commands/CPE/CustomBlockCommand.cs b/MCGalaxy/Commands/CPE/CustomBlockCommand.cs index 6a3f508d9..5bbdc252c 100644 --- a/MCGalaxy/Commands/CPE/CustomBlockCommand.cs +++ b/MCGalaxy/Commands/CPE/CustomBlockCommand.cs @@ -135,7 +135,7 @@ namespace MCGalaxy.Commands.CPE { if (!CheckBlock(p, parts[1], out block)) return; BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs; - BlockDefinition def = defs[block.RawID]; + BlockDefinition def = defs[(BlockRaw)block]; if (!ExistsInScope(def, block, global)) { MessageNoBlock(p, block, global, cmd); return; } Player.Message(p, "About {0} ({1})", def.Name, def.BlockID); @@ -193,7 +193,7 @@ namespace MCGalaxy.Commands.CPE { if (!CheckBlock(p, parts[1], out block)) return; BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs; - BlockDefinition def = defs[block.RawID]; + BlockDefinition def = defs[(BlockRaw)block]; if (!ExistsInScope(def, block, global)) { MessageNoBlock(p, block, global, cmd); return; } RemoveBlockProps(global, block, p); @@ -202,7 +202,7 @@ namespace MCGalaxy.Commands.CPE { string scope = global ? "global" : "level"; Player.Message(p, "Removed " + scope + " custom block " + def.Name + "(" + def.BlockID + ")"); - BlockDefinition globalDef = BlockDefinition.GlobalDefs[block.RawID]; + BlockDefinition globalDef = BlockDefinition.GlobalDefs[(BlockRaw)block]; if (!global && globalDef != null) BlockDefinition.Add(globalDef, defs, p.level); } @@ -313,8 +313,10 @@ namespace MCGalaxy.Commands.CPE { BlockID block; if (!CheckBlock(p, parts[1], out block)) return; + BlockRaw raw = (BlockRaw)block; + BlockDefinition[] defs = global ? BlockDefinition.GlobalDefs : p.level.CustomBlockDefs; - BlockDefinition def = defs[block.RawID], globalDef = BlockDefinition.GlobalDefs[block.RawID]; + BlockDefinition def = defs[raw], globalDef = BlockDefinition.GlobalDefs[raw]; if (def == null && block < Block.CpeCount) { def = DefaultSet.MakeCustomBlock(block); @@ -418,7 +420,7 @@ namespace MCGalaxy.Commands.CPE { if (fallback == Block.Invalid) return; changedFallback = true; - value = Block.Name(fallback); + value = Block.GetName(p, fallback); def.FallBack = fallback; break; case "order": @@ -462,7 +464,7 @@ namespace MCGalaxy.Commands.CPE { } return false; } - def.BlockID = block.RawID; + def.BlockID = (BlockRaw)block; } string scope = global ? "global" : "level"; @@ -474,7 +476,7 @@ namespace MCGalaxy.Commands.CPE { return true; } - static byte GetFallback(Player p, string value) { + static BlockRaw GetFallback(Player p, string value) { BlockID block; if (!CommandParser.GetBlock(p, value, out block)) return Block.Invalid; @@ -486,7 +488,7 @@ namespace MCGalaxy.Commands.CPE { Player.Message(p, "&cPhysics block cannot be used as fallback blocks."); return Block.Invalid; } - return block.BlockID; + return (BlockRaw)block; } @@ -508,13 +510,13 @@ namespace MCGalaxy.Commands.CPE { static void MessageNoBlock(Player p, BlockID block, bool global, string cmd) { string scope = global ? "global" : "level"; - Player.Message(p, "&cThere is no {1} custom block with the id \"{0}\".", block.RawID, scope); + Player.Message(p, "&cThere is no {1} custom block with the id \"{0}\".", (BlockRaw)block, scope); Player.Message(p, "Type \"%T{0} list\" %Sto see a list of {1} custom blocks.", cmd, scope); } static void MessageAlreadyBlock(Player p, BlockID block, bool global, string cmd) { string scope = global ? "global" : "level"; - Player.Message(p, "&cThere is already a {1} custom block with the id \"{0}\".", block.RawID, scope); + Player.Message(p, "&cThere is already a {1} custom block with the id \"{0}\".", (BlockRaw)block, scope); Player.Message(p, "Type \"%T{0} list\" %Sto see a list of {1} custom blocks.", cmd, scope); } @@ -558,7 +560,7 @@ namespace MCGalaxy.Commands.CPE { return; } - BlockRaw raw = (BlockRaw)block; + BlockRaw raw = (BlockRaw)block; BlockDefinition.GlobalProps[raw] = props; Level[] loaded = LevelInfo.Loaded.Items; @@ -616,7 +618,7 @@ namespace MCGalaxy.Commands.CPE { } static bool ExistsInScope(BlockDefinition def, BlockID block, bool global) { - return def != null && (global ? true : def != BlockDefinition.GlobalDefs[block.RawID]); + return def != null && (global ? true : def != BlockDefinition.GlobalDefs[(BlockRaw)block]); } diff --git a/MCGalaxy/Commands/CommandParser.cs b/MCGalaxy/Commands/CommandParser.cs index 7cd5c5c67..d72137dd2 100644 --- a/MCGalaxy/Commands/CommandParser.cs +++ b/MCGalaxy/Commands/CommandParser.cs @@ -106,8 +106,8 @@ namespace MCGalaxy.Commands { } if (value < min || value > max) { - Player.Message(p, "{0} must be between {1} and {2}", argName, - min.ToString("F4"), max.ToString("F4")); + Player.Message(p, "{0} must be between {1} and {2}", argName, + min.ToString("F4"), max.ToString("F4")); return false; } result = value; return true; diff --git a/MCGalaxy/Commands/Fun/CTF/CmdCtf.cs b/MCGalaxy/Commands/Fun/CTF/CmdCtf.cs index 078ed8ea0..bc98bc011 100644 --- a/MCGalaxy/Commands/Fun/CTF/CmdCtf.cs +++ b/MCGalaxy/Commands/Fun/CTF/CmdCtf.cs @@ -21,6 +21,7 @@ using System.IO; using MCGalaxy.Games; using MCGalaxy.Maths; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy.Commands.Fun { public sealed class CmdCTF : Command { @@ -148,7 +149,7 @@ namespace MCGalaxy.Commands.Fun { block = p.level.GetBlock((ushort)P.X, (ushort)P.Y, (ushort)P.Z); if (block == Block.Air) block = Block.Blue; - cfg.BlueFlagBlock = block.RawID; + cfg.BlueFlagBlock = (BlockRaw)block; Player.Message(p, "Set flag block of blue team to {0}", Block.GetName(p, block)); UpdateConfig(p, cfg); @@ -163,7 +164,7 @@ namespace MCGalaxy.Commands.Fun { block = p.level.GetBlock((ushort)P.X, (ushort)P.Y, (ushort)P.Z); if (block == Block.Air) block = Block.Red; - cfg.RedFlagBlock = block.RawID; + cfg.RedFlagBlock = (BlockRaw)block; Player.Message(p, "Set flag block of red team to {0}", Block.GetName(p, block)); UpdateConfig(p, cfg); diff --git a/MCGalaxy/Commands/Fun/CmdLavaSurvival.cs b/MCGalaxy/Commands/Fun/CmdLavaSurvival.cs index 5aabc8d1e..755040c3b 100644 --- a/MCGalaxy/Commands/Fun/CmdLavaSurvival.cs +++ b/MCGalaxy/Commands/Fun/CmdLavaSurvival.cs @@ -174,7 +174,7 @@ namespace MCGalaxy.Commands.Fun { return; } - string opt = args[2], value = args.Length > 3 ? args[3] : ""; + string opt = args[2], value = args.Length > 3 ? args[3] : ""; TimeSpan span = default(TimeSpan); if (opt.CaselessEq("sendafkmain")) { Server.lava.sendAfkMain = !Server.lava.sendAfkMain; diff --git a/MCGalaxy/Commands/Fun/CmdTeam.cs b/MCGalaxy/Commands/Fun/CmdTeam.cs index 268e48ebc..665ee4783 100644 --- a/MCGalaxy/Commands/Fun/CmdTeam.cs +++ b/MCGalaxy/Commands/Fun/CmdTeam.cs @@ -200,9 +200,9 @@ namespace MCGalaxy.Commands.Fun { } void HandleList(Player p, string[] args) { - string modifier = args.Length > 1 ? args[1] : ""; + string modifier = args.Length > 1 ? args[1] : ""; MultiPageOutput.Output(p, Team.Teams, team => team.Color + team.Name, - "team list", "teams", modifier, false); + "team list", "teams", modifier, false); } public override void Help(Player p) { diff --git a/MCGalaxy/Commands/Fun/WeaponCmd.cs b/MCGalaxy/Commands/Fun/WeaponCmd.cs index 1daac0055..03c4cbb8c 100644 --- a/MCGalaxy/Commands/Fun/WeaponCmd.cs +++ b/MCGalaxy/Commands/Fun/WeaponCmd.cs @@ -191,7 +191,7 @@ namespace MCGalaxy.Commands.Fun { if (ending == WeaponType.Destroy) { bool fireKills = block != Block.Air && p.level.Props[block].LavaKills; - if ((!fireKills && !Block.NeedRestart(block.BlockID)) && block != Block.Glass) { + if ((!fireKills && !Block.NeedRestart(block)) && block != Block.Glass) { return true; } } else if (p.level.physics >= 3) { diff --git a/MCGalaxy/Commands/Information/CmdAbout.cs b/MCGalaxy/Commands/Information/CmdAbout.cs index c1327ee28..17b99cae7 100644 --- a/MCGalaxy/Commands/Information/CmdAbout.cs +++ b/MCGalaxy/Commands/Information/CmdAbout.cs @@ -22,6 +22,7 @@ using MCGalaxy.DB; using MCGalaxy.Maths; using MCGalaxy.SQL; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy.Commands.Info { public sealed class CmdAbout : Command { @@ -65,7 +66,7 @@ namespace MCGalaxy.Commands.Info { string blockName = Block.GetName(p, block); Player.Message(p, "Block ({0}, {1}, {2}): &f{3} = {4}%S.", - x, y, z, block.RawID, blockName); + x, y, z, (BlockRaw)block, blockName); if (HasExtraPerm(p, 1)) { BlockDBChange.OutputMessageBlock(p, block, x, y, z); diff --git a/MCGalaxy/Commands/Information/CmdSearch.cs b/MCGalaxy/Commands/Information/CmdSearch.cs index 15e6985c0..291861547 100644 --- a/MCGalaxy/Commands/Information/CmdSearch.cs +++ b/MCGalaxy/Commands/Information/CmdSearch.cs @@ -59,7 +59,7 @@ namespace MCGalaxy.Commands.Info { if (!Player.IsSuper(p)) { for (int id = Block.CpeCount; id < Block.Count; id++) { if (p.level.CustomBlockDefs[id] == null) continue; - blocks.Add(new ushort(Block.custom_block, (byte)id)); + blocks.Add((BlockID)(Block.Extended | id)); } } diff --git a/MCGalaxy/Commands/Maintenance/CmdBlockSpeed.cs b/MCGalaxy/Commands/Maintenance/CmdBlockSpeed.cs index 02236c394..cfaf26f05 100644 --- a/MCGalaxy/Commands/Maintenance/CmdBlockSpeed.cs +++ b/MCGalaxy/Commands/Maintenance/CmdBlockSpeed.cs @@ -42,13 +42,13 @@ namespace MCGalaxy.Commands.Maintenance { if (cmd == "bs") { if (!CommandParser.GetInt(p, args[1], "Blocks per interval", ref value, 0)) return; - BlockQueue.blockupdates = value; - Player.Message(p, "Blocks per interval is now {0}.", BlockQueue.blockupdates); + BlockQueue.UpdatesPerTick = value; + Player.Message(p, "Blocks per interval is now {0}.", BlockQueue.UpdatesPerTick); } else if (cmd == "ts") { if (!CommandParser.GetInt(p, args[1], "Block interval", ref value, 50)) return; - BlockQueue.time = value; - Player.Message(p, "Block interval is now {0}.", BlockQueue.time); + BlockQueue.Interval = value; + Player.Message(p, "Block interval is now {0}.", BlockQueue.Interval); } else if (cmd == "net") { if (!CommandParser.GetInt(p, args[1], "value", ref value, 2, 1000)) return; @@ -68,12 +68,12 @@ namespace MCGalaxy.Commands.Maintenance { } static void Set(int updates, int time) { - BlockQueue.blockupdates = updates; - BlockQueue.time = time; + BlockQueue.UpdatesPerTick = updates; + BlockQueue.Interval = time; } static void SendEstimation(Player p) { - int updates = BlockQueue.blockupdates, time = BlockQueue.time, count = PlayerInfo.Online.Count; + int updates = BlockQueue.UpdatesPerTick, time = BlockQueue.Interval, count = PlayerInfo.Online.Count; Player.Message(p, "{0} blocks every {1} milliseconds = {2} blocks per second.", updates, time, updates * (1000 / time)); Player.Message(p, "Using ~{0}KB/s times {1} player(s) = ~{2}KB/s", (updates * (1000 / time) * 8) / 1000, count, count * ((updates * (1000 / time) * 8) / 1000)); } diff --git a/MCGalaxy/Commands/Maintenance/CmdPlayerEdit.cs b/MCGalaxy/Commands/Maintenance/CmdPlayerEdit.cs index 25441dd8c..53a4fca9c 100644 --- a/MCGalaxy/Commands/Maintenance/CmdPlayerEdit.cs +++ b/MCGalaxy/Commands/Maintenance/CmdPlayerEdit.cs @@ -90,7 +90,7 @@ namespace MCGalaxy.Commands.Maintenance { v => who.TimesBeenKicked = v, UpdateDB); } else if (opt == "messages") { SetInteger(p, args, PlayerData.ColumnMessages, 16777215, who, - v => who.TotalMessagesSent = v, UpdateDB); + v => who.TotalMessagesSent = v, UpdateDB); } else if (opt == "timespent") { SetTimespan(p, args, PlayerData.ColumnTimeSpent, who, v => who.TotalTime = v); } else if (opt == "color") { diff --git a/MCGalaxy/Commands/Moderation/CmdHide.cs b/MCGalaxy/Commands/Moderation/CmdHide.cs index 78afe114f..48844132c 100644 --- a/MCGalaxy/Commands/Moderation/CmdHide.cs +++ b/MCGalaxy/Commands/Moderation/CmdHide.cs @@ -53,9 +53,9 @@ namespace MCGalaxy.Commands.Moderation { } if (p.hidden) { - if (announceToOps && !p.otherRankHidden) { + if (announceToOps && !p.otherRankHidden) { Chat.MessageOps("To Ops -" + p.ColoredName + "%S- is now &finvisible%S."); - } + } string discMsg = PlayerDB.GetLogoutMessage(p); Chat.MessageGlobal(p, "&c- " + p.FullName + " %S" + discMsg, false); diff --git a/MCGalaxy/Commands/Moderation/CmdReport.cs b/MCGalaxy/Commands/Moderation/CmdReport.cs index c03b9137b..1144206cb 100644 --- a/MCGalaxy/Commands/Moderation/CmdReport.cs +++ b/MCGalaxy/Commands/Moderation/CmdReport.cs @@ -59,7 +59,7 @@ namespace MCGalaxy.Commands.Moderation { if (!CheckExtraPerm(p, 1)) return; string[] users = Directory.GetFiles("extra/reported", "*.txt"); for (int i = 0; i < users.Length; i++) { - users[i] = Path.GetFileNameWithoutExtension(users[i]); + users[i] = Path.GetFileNameWithoutExtension(users[i]); } if (users.Length > 0) { @@ -141,13 +141,13 @@ namespace MCGalaxy.Commands.Moderation { List reports = new List(); if (File.Exists("extra/reported/" + target + ".txt")) { - reports = new List(File.ReadAllLines("extra/reported/" + target + ".txt")); + reports = new List(File.ReadAllLines("extra/reported/" + target + ".txt")); } if (reports.Count >= 5) { LevelPermission checkRank = CommandExtraPerms.Find(name, 1).MinRank; Player.Message(p, "{0} &calready has 5 pending reports! Please wait until an {1}%c+ has reviewed these reports first!", - PlayerInfo.GetColoredName(p, target), Group.GetColoredName(checkRank)); + PlayerInfo.GetColoredName(p, target), Group.GetColoredName(checkRank)); return; } diff --git a/MCGalaxy/Commands/Moderation/ZoneCmds.cs b/MCGalaxy/Commands/Moderation/ZoneCmds.cs index 7ac435a18..fdcf04398 100644 --- a/MCGalaxy/Commands/Moderation/ZoneCmds.cs +++ b/MCGalaxy/Commands/Moderation/ZoneCmds.cs @@ -138,10 +138,10 @@ namespace MCGalaxy.Commands.Moderation { } void OnChangedZone(Zone zone) { - Player[] players = PlayerInfo.Online.Items; - foreach (Player pl in players) { - if (pl.ZoneIn == zone) pl.OnChangedZone(); - } + Player[] players = PlayerInfo.Online.Items; + foreach (Player pl in players) { + if (pl.ZoneIn == zone) pl.OnChangedZone(); + } } public override void Help(Player p) { diff --git a/MCGalaxy/Commands/World/CmdBlockProperties.cs b/MCGalaxy/Commands/World/CmdBlockProperties.cs index 3f4975851..2468678a6 100644 --- a/MCGalaxy/Commands/World/CmdBlockProperties.cs +++ b/MCGalaxy/Commands/World/CmdBlockProperties.cs @@ -18,6 +18,7 @@ using System; using MCGalaxy.Blocks; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy.Commands.World { public sealed class CmdBlockProperties : Command { @@ -92,7 +93,7 @@ namespace MCGalaxy.Commands.World { } static int GetIndex(BlockProps[] scope, BlockID block) { - return scope == BlockDefinition.GlobalProps ? block.RawID : block; + return scope == BlockDefinition.GlobalProps ? (BlockRaw)block : block; } @@ -139,18 +140,15 @@ namespace MCGalaxy.Commands.World { } - static void Toggle(Player p, BlockProps[] scope, BlockID block, - string type, ref bool on) { + static void Toggle(Player p, BlockProps[] scope, BlockID block, string type, ref bool on) { on = !on; Level lvl = Player.IsSuper(p) ? null : p.level; - Player.Message(p, "Block {0} is {1}: {2}", - BlockName(scope, lvl, block), - type, on ? "&aYes" : "&cNo"); + Player.Message(p, "Block {0} is {1}: {2}", + BlockName(scope, lvl, block), type, on ? "&aYes" : "&cNo"); OnPropsChanged(scope, lvl, block); } - static void SetEnum(Player p, BlockProps[] scope, BlockID block, - int i, string msg) { + static void SetEnum(Player p, BlockProps[] scope, BlockID block, int i, string msg) { Level lvl = Player.IsSuper(p) ? null : p.level; AnimalAI ai = AnimalAI.None; if (!CommandParser.GetEnum(p, msg, "Animal AI", ref ai)) return; @@ -161,8 +159,7 @@ namespace MCGalaxy.Commands.World { OnPropsChanged(scope, lvl, block); } - static void SetDeathMessage(Player p, BlockProps[] scope, BlockID block, - int i, string msg) { + static void SetDeathMessage(Player p, BlockProps[] scope, BlockID block, int i, string msg) { scope[i].DeathMessage = msg; Level lvl = Player.IsSuper(p) ? null : p.level; @@ -176,8 +173,7 @@ namespace MCGalaxy.Commands.World { OnPropsChanged(scope, lvl, block); } - static void SetStackId(Player p, BlockProps[] scope, BlockID block, - int i, string msg) { + static void SetStackId(Player p, BlockProps[] scope, BlockID block, int i, string msg) { Level lvl = Player.IsSuper(p) ? null : p.level; BlockID stackBlock; @@ -191,10 +187,8 @@ namespace MCGalaxy.Commands.World { if (stackBlock == Block.Air) { Player.Message(p, "Removed stack block for {0}", BlockName(scope, lvl, block)); } else { - string stackBlockName = Player.IsSuper(p) ? - BlockName(scope, lvl, stackBlock) : p.level.BlockName(stackBlock); Player.Message(p, "Stack block for {0} set to: {1}", - BlockName(scope, lvl, block), stackBlockName); + BlockName(scope, lvl, block), Block.GetName(p, stackBlock)); } OnPropsChanged(scope, lvl, block); } @@ -218,12 +212,14 @@ namespace MCGalaxy.Commands.World { } static void OnPropsChanged(BlockProps[] scope, Level level, BlockID block) { - scope[GetIndex(scope, block)].Changed = true; + scope[GetIndex(scope, block)].Changed = true; + BlockRaw raw = (BlockRaw)block; + if (scope == Block.Props) { BlockProps.Save("core", scope, Block.CorePropsLock, null); Level[] loaded = LevelInfo.Loaded.Items; - if (!block.IsPhysicsType) { - BlockDefinition.GlobalProps[block.RawID] = BlockDefinition.DefaultProps(block); + if (!Block.IsPhysicsType(block)) { + BlockDefinition.GlobalProps[raw] = BlockDefinition.DefaultProps(block); } foreach (Level lvl in loaded) { @@ -236,7 +232,6 @@ namespace MCGalaxy.Commands.World { Level[] loaded = LevelInfo.Loaded.Items; BlockProps.Save("global", scope, BlockDefinition.GlobalPropsLock, null); - byte raw = block.RawID; foreach (Level lvl in loaded) { if (lvl.CustomBlockDefs[raw] != BlockDefinition.GlobalDefs[raw]) continue; if (lvl.HasCustomProps(block)) continue; @@ -250,20 +245,19 @@ namespace MCGalaxy.Commands.World { } } - static bool SelectLevel(Level lvl, int i) { - return lvl.HasCustomProps((ushort)i); - } + static bool SelectLevel(Level lvl, int i) { return lvl.HasCustomProps((BlockID)i); } static string BlockName(BlockProps[] scope, Level lvl, BlockID block) { - if (scope == Block.Props) return Block.Name(block.RawID); + BlockRaw raw = (BlockRaw)block; + if (scope == Block.Props) return Block.Name(raw); BlockDefinition def = null; if (scope == BlockDefinition.GlobalProps) { - def = BlockDefinition.GlobalDefs[block.RawID]; + def = BlockDefinition.GlobalDefs[raw]; } else { - def = lvl.CustomBlockDefs[block.RawID]; + def = lvl.CustomBlockDefs[raw]; } - return def == null ? block.RawID.ToString() : def.Name.Replace(" ", ""); + return def == null ? raw.ToString() : def.Name.Replace(" ", ""); } diff --git a/MCGalaxy/Commands/World/CmdImport.cs b/MCGalaxy/Commands/World/CmdImport.cs index 327ce5472..4cf504ce6 100644 --- a/MCGalaxy/Commands/World/CmdImport.cs +++ b/MCGalaxy/Commands/World/CmdImport.cs @@ -45,10 +45,10 @@ namespace MCGalaxy.Commands.World { } void Import(Player p, string path, string name, IMapImporter importer) { - if (LevelInfo.MapExists(name)) { - Player.Message(p, "&cMap {0} already exists. Try renaming the file to something else before importing.", name); - return; - } + if (LevelInfo.MapExists(name)) { + Player.Message(p, "&cMap {0} already exists. Try renaming the file to something else before importing.", name); + return; + } try { Level lvl = importer.Read(path + importer.Extension, name, true); try { diff --git a/MCGalaxy/Commands/World/CmdRestore.cs b/MCGalaxy/Commands/World/CmdRestore.cs index 7fc43bf9d..ff25daeb8 100644 --- a/MCGalaxy/Commands/World/CmdRestore.cs +++ b/MCGalaxy/Commands/World/CmdRestore.cs @@ -74,11 +74,11 @@ namespace MCGalaxy.Commands.World { static void OutputBackups(Player p) { string backupPath = LevelInfo.BackupBasePath(p.level.name); - if (!Directory.Exists(backupPath)) { + if (!Directory.Exists(backupPath)) { Player.Message(p, p.level.ColoredName + " %Shas no backups yet."); return; } - string[] dirs = Directory.GetDirectories(backupPath); + string[] dirs = Directory.GetDirectories(backupPath); Player.Message(p, p.level.ColoredName + " %Shas &b" + dirs.Length + " %Sbackups."); int count = 0; StringBuilder custom = new StringBuilder(); diff --git a/MCGalaxy/Commands/building/CmdPalette.cs b/MCGalaxy/Commands/building/CmdPalette.cs index afd21c146..5ced4a12a 100644 --- a/MCGalaxy/Commands/building/CmdPalette.cs +++ b/MCGalaxy/Commands/building/CmdPalette.cs @@ -80,8 +80,8 @@ namespace MCGalaxy.Commands.Building { Player.Message(p, "Palette {0} does not exist.", args[1]); return; } - byte block = GetBlock(p, args[2]); - if (block == Block.Invalid) return; + BlockID block; + if (!CommandParser.GetBlock(p, args[2], out block)) return; ColorDesc rgb = default(ColorDesc); if (!CommandParser.GetHex(p, args[3], ref rgb)) return; @@ -108,13 +108,13 @@ namespace MCGalaxy.Commands.Building { Player.Message(p, "Palette {0} does not exist.", args[1]); return; } - byte block = GetBlock(p, args[2]); - if (block == Block.Invalid) return; + BlockID block; + if (!CommandParser.GetBlock(p, args[2], out block)) return; RemoveEntry(p, palette, block); } - static void RemoveEntry(Player p, ImagePalette palette, byte block) { + static void RemoveEntry(Player p, ImagePalette palette, BlockID block) { PaletteEntry[] entries = palette.Entries; if (entries == null) { Player.Message(p, "Block not found in entries of palette {0}", palette.Name); @@ -122,7 +122,7 @@ namespace MCGalaxy.Commands.Building { List newEntries = new List(); foreach (PaletteEntry entry in entries) { - if (entry.Raw == block) continue; + if (entry.Block == block) continue; newEntries.Add(entry); } @@ -134,17 +134,6 @@ namespace MCGalaxy.Commands.Building { palette.Save(); Player.Message(p, "Removed block from entries of palette {0}", palette.Name); } - - static byte GetBlock(Player p, string name) { - BlockID block; - if (!CommandParser.GetBlock(p, name, out block)) return Block.Invalid; - - if (Block.IsPhysicsType(block)) { - Player.Message(p, "Physics blocks may not be used for palettes."); return Block.Invalid; - } - - return block.RawID; - } void HandleEntries(Player p, string[] args) { if (args.Length < 2 || args.Length > 3) { Help(p); return; } @@ -160,8 +149,7 @@ namespace MCGalaxy.Commands.Building { } static string FormatEntry(PaletteEntry e, Player p) { - BlockID block = Block.FromRaw(e.Raw); - return Block.GetName(p, block) + " - " + Utils.Hex(e.R, e.G, e.B); + return Block.GetName(p, e.Block) + " - " + Utils.Hex(e.R, e.G, e.B); } public override void Help(Player p) { diff --git a/MCGalaxy/Commands/building/CmdPaste.cs b/MCGalaxy/Commands/building/CmdPaste.cs index 447ebf1c4..72aefb70a 100644 --- a/MCGalaxy/Commands/building/CmdPaste.cs +++ b/MCGalaxy/Commands/building/CmdPaste.cs @@ -35,8 +35,8 @@ namespace MCGalaxy.Commands.Building { public override void Use(Player p, string message) { if (p.CurrentCopySlot >= p.CopySlots.Count || p.CopySlots[p.CurrentCopySlot] == null) { - Player.Message(p, "You haven't copied anything yet"); return; - } + Player.Message(p, "You haven't copied anything yet"); return; + } BrushArgs args = new BrushArgs(p, message, Block.Air); Brush brush = BrushFactory.Find("paste").Construct(args); @@ -47,7 +47,7 @@ namespace MCGalaxy.Commands.Building { } bool DoPaste(Player p, Vec3S32[] m, object state, ushort block) { - CopyState cState = p.CopySlots[p.CurrentCopySlot]; + CopyState cState = p.CopySlots[p.CurrentCopySlot]; m[0] += cState.Offset; PasteDrawOp op = new PasteDrawOp(); diff --git a/MCGalaxy/Commands/building/CmdRestartPhysics.cs b/MCGalaxy/Commands/building/CmdRestartPhysics.cs index 581e0a331..3cb8cf355 100644 --- a/MCGalaxy/Commands/building/CmdRestartPhysics.cs +++ b/MCGalaxy/Commands/building/CmdRestartPhysics.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using MCGalaxy.Blocks.Physics; using MCGalaxy.Maths; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy.Commands.Building { public sealed class CmdRestartPhysics : Command { @@ -66,11 +67,11 @@ namespace MCGalaxy.Commands.Building { bool Parse(Player p, string name, string arg, ref byte type, ref byte value, ref bool isExt) { if (name == "revert") { - ushort block; + BlockID block; if (!CommandParser.GetBlock(p, arg, out block)) return false; - type = PhysicsArgs.Revert; value = block.RawID; - isExt = block.BlockID == Block.custom_block; + type = PhysicsArgs.Revert; value = (BlockRaw)block; + isExt = block >= Block.Extended; return true; } diff --git a/MCGalaxy/Commands/building/CmdSpin.cs b/MCGalaxy/Commands/building/CmdSpin.cs index de6305e3b..324954897 100644 --- a/MCGalaxy/Commands/building/CmdSpin.cs +++ b/MCGalaxy/Commands/building/CmdSpin.cs @@ -32,8 +32,8 @@ namespace MCGalaxy.Commands.Building { public override void Use(Player p, string message) { if (message.Length == 0) message = "y"; if (p.CurrentCopySlot >= p.CopySlots.Count || p.CopySlots[p.CurrentCopySlot] == null) { - Player.Message(p, "You haven't copied anything yet"); return; - } + Player.Message(p, "You haven't copied anything yet"); return; + } CopyState cState = p.CopySlots[p.CurrentCopySlot]; string opt = message.ToLower(); diff --git a/MCGalaxy/CorePlugin/ConnectingHandler.cs b/MCGalaxy/CorePlugin/ConnectingHandler.cs index 399d4ac60..191eb5c0c 100644 --- a/MCGalaxy/CorePlugin/ConnectingHandler.cs +++ b/MCGalaxy/CorePlugin/ConnectingHandler.cs @@ -166,7 +166,7 @@ namespace MCGalaxy.Core { p.Kick(null, ServerConfig.DefaultBanMessage, true); return false; } - + if (group.Permission == LevelPermission.Banned) { string banner, reason, prevRank; DateTime time; diff --git a/MCGalaxy/Database/PlayerDB.cs b/MCGalaxy/Database/PlayerDB.cs index 440076775..6598ace16 100644 --- a/MCGalaxy/Database/PlayerDB.cs +++ b/MCGalaxy/Database/PlayerDB.cs @@ -21,7 +21,7 @@ using System.IO; namespace MCGalaxy.DB { - /// Stores per-player persistent data. + /// Stores per-player persistent data. public static class PlayerDB { public static string LoginPath(string name) { diff --git a/MCGalaxy/Drawing/DrawOps/DrawOpPerformer.cs b/MCGalaxy/Drawing/DrawOps/DrawOpPerformer.cs index 5fc633efa..2afb22245 100644 --- a/MCGalaxy/Drawing/DrawOps/DrawOpPerformer.cs +++ b/MCGalaxy/Drawing/DrawOps/DrawOpPerformer.cs @@ -24,6 +24,7 @@ using MCGalaxy.Drawing.Ops; using MCGalaxy.Network; using MCGalaxy.Undo; using MCGalaxy.Maths; +using BlockRaw = System.Byte; namespace MCGalaxy.Drawing { internal struct PendingDrawOp { @@ -174,14 +175,13 @@ namespace MCGalaxy.Drawing.Ops { if (old == b.Block || !lvl.CheckAffectPermissions(p, b.X, b.Y, b.Z, old, b.Block)) return; // Set the block (inlined) - lvl.blocks[index] = b.Block.BlockID; + lvl.blocks[index] = b.Block >= Block.Extended ? Block.custom_block : (BlockRaw)b.Block; lvl.Changed = true; - if (old.BlockID == Block.custom_block && b.Block.BlockID != Block.custom_block) { + if (b.Block >= Block.Extended) { + lvl.SetExtTileNoCheck(b.X, b.Y, b.Z, (BlockRaw)b.Block); + } else if (old >= Block.Extended) { lvl.RevertExtTileNoCheck(b.X, b.Y, b.Z); } - if (b.Block.BlockID == Block.custom_block) { - lvl.SetExtTileNoCheck(b.X, b.Y, b.Z, b.Block.ExtID); - } if (p != null) { lvl.BlockDB.Cache.Add(p, b.X, b.Y, b.Z, op.Flags, old, b.Block); @@ -197,7 +197,7 @@ namespace MCGalaxy.Drawing.Ops { lock (lvl.queueLock) lvl.blockqueue.Clear(); } else if (op.TotalModified < reloadThreshold) { - if (!old.VisuallyEquals(b.Block)) BlockQueue.Addblock(p, index, b.Block); + if (!Block.VisuallyEquals(old, b.Block)) BlockQueue.Add(p, index, b.Block); if (lvl.physics > 0) { if (old == Block.Sponge && b.Block != Block.Sponge) diff --git a/MCGalaxy/Drawing/Image/IPaletteMatcher.cs b/MCGalaxy/Drawing/Image/IPaletteMatcher.cs index 2c31ba7d2..de5fe4538 100644 --- a/MCGalaxy/Drawing/Image/IPaletteMatcher.cs +++ b/MCGalaxy/Drawing/Image/IPaletteMatcher.cs @@ -17,13 +17,14 @@ */ using System; using System.Drawing; +using BlockID = System.UInt16; namespace MCGalaxy.Drawing { public interface IPaletteMatcher { void SetPalette(PaletteEntry[] front, PaletteEntry[] back); - byte BestMatch(byte R, byte G, byte B); - byte BestMatch(byte R, byte G, byte B, out bool backLayer); + BlockID BestMatch(byte R, byte G, byte B); + BlockID BestMatch(byte R, byte G, byte B, out bool backLayer); } public sealed class RgbPaletteMatcher : IPaletteMatcher { @@ -33,19 +34,19 @@ namespace MCGalaxy.Drawing { this.front = front; this.back = back; } - public byte BestMatch(byte R, byte G, byte B) { + public BlockID BestMatch(byte R, byte G, byte B) { int pos; MinDist(R, G, B, front, out pos); - return front[pos].Raw; + return front[pos].Block; } - public byte BestMatch(byte R, byte G, byte B, out bool backLayer) { + public BlockID BestMatch(byte R, byte G, byte B, out bool backLayer) { int frontPos, backPos; int frontDist = MinDist(R, G, B, front, out frontPos); int backDist = MinDist(R, G, B, back, out backPos); backLayer = backDist < frontDist; - return backLayer ? back[backPos].Raw : front[frontPos].Raw; + return backLayer ? back[backPos].Block : front[frontPos].Block; } @@ -73,7 +74,7 @@ namespace MCGalaxy.Drawing { this.palette[i] = RgbToLab(front[i]); } - public byte BestMatch(byte R, byte G, byte B) { + public BlockID BestMatch(byte R, byte G, byte B) { double minDist = int.MaxValue; int pos = 0; LabColor col = RgbToLab(R, G, B); @@ -89,7 +90,7 @@ namespace MCGalaxy.Drawing { return palette[pos].Block; } - public byte BestMatch(byte R, byte G, byte B, out bool backLayer) { + public BlockID BestMatch(byte R, byte G, byte B, out bool backLayer) { backLayer = false; return BestMatch(R, G, B); } @@ -97,12 +98,12 @@ namespace MCGalaxy.Drawing { struct LabColor { public double L, A, B; - public byte Block; + public BlockID Block; } LabColor RgbToLab(PaletteEntry cur) { LabColor lab = RgbToLab(cur.R, cur.G, cur.B); - lab.Block = cur.Raw; + lab.Block = cur.Block; return lab; } diff --git a/MCGalaxy/Drawing/Image/ImagePalette.cs b/MCGalaxy/Drawing/Image/ImagePalette.cs index 799127ed5..f745ade17 100644 --- a/MCGalaxy/Drawing/Image/ImagePalette.cs +++ b/MCGalaxy/Drawing/Image/ImagePalette.cs @@ -17,6 +17,7 @@ */ using System.Collections.Generic; using System.IO; +using BlockID = System.UInt16; namespace MCGalaxy.Drawing { @@ -76,8 +77,12 @@ namespace MCGalaxy.Drawing { } static PaletteEntry ParseEntry(string[] parts) { - byte r = byte.Parse(parts[1]), g = byte.Parse(parts[2]); - byte b = byte.Parse(parts[3]), block = byte.Parse(parts[0]); + BlockID block = BlockID.Parse(parts[0]); + block = Block.MapOldRaw(block); + + byte r = byte.Parse(parts[1]); + byte g = byte.Parse(parts[2]); + byte b = byte.Parse(parts[3]); return new PaletteEntry(r, g, b, block); } @@ -88,7 +93,7 @@ namespace MCGalaxy.Drawing { if (Entries == null) return; foreach (PaletteEntry e in Entries) - w.WriteLine(e.Raw + ":" + e.R + ":" + e.G + ":" + e.B); + w.WriteLine(e.Block + ":" + e.R + ":" + e.G + ":" + e.B); } } @@ -150,10 +155,11 @@ namespace MCGalaxy.Drawing { } public struct PaletteEntry { - public byte R, G, B, Raw; + public byte R, G, B; + public BlockID Block; - public PaletteEntry(byte r, byte g, byte b, byte block) { - R = r; G = g; B = b; Raw = block; + public PaletteEntry(byte r, byte g, byte b, BlockID block) { + R = r; G = g; B = b; Block = block; } } } diff --git a/MCGalaxy/Drawing/Image/ImagePrintDrawOp.cs b/MCGalaxy/Drawing/Image/ImagePrintDrawOp.cs index fdeb66b8c..bf365c56c 100644 --- a/MCGalaxy/Drawing/Image/ImagePrintDrawOp.cs +++ b/MCGalaxy/Drawing/Image/ImagePrintDrawOp.cs @@ -21,6 +21,7 @@ using System.IO; using Draw = System.Drawing; using MCGalaxy.Drawing.Brushes; using MCGalaxy.Maths; +using BlockID = System.UInt16; namespace MCGalaxy.Drawing.Ops { @@ -85,8 +86,7 @@ namespace MCGalaxy.Drawing.Ops { for (int i = 0; i < Palette.Entries.Length; i++) { PaletteEntry entry = Palette.Entries[i]; - ushort block = Block.FromRaw(entry.Raw); - BlockDefinition def = Level.GetBlockDef(block); + BlockDefinition def = Level.GetBlockDef(entry.Block); if (def != null && def.FullBright) { front[i] = Multiply(entry, Colors.ParseHex("FFFFFF")); @@ -117,18 +117,18 @@ namespace MCGalaxy.Drawing.Ops { ushort z = (ushort)(Origin.Z + dx.Z * xx + dy.Z * yy); if (P.A < 20) { output(Place(x, y, z, Block.Air)); continue; } - byte raw = 0; + BlockID block; if (!DualLayer) { - raw = selector.BestMatch(P.R, P.G, P.B); + block = selector.BestMatch(P.R, P.G, P.B); } else { bool backLayer; - raw = selector.BestMatch(P.R, P.G, P.B, out backLayer); + block = selector.BestMatch(P.R, P.G, P.B, out backLayer); if (backLayer) { x = (ushort)(x + adj.X); z = (ushort)(z + adj.Z); } } - output(Place(x, y, z, Block.FromRaw(raw))); + output(Place(x, y, z, block)); } } diff --git a/MCGalaxy/Generator/Foliage/AshTree.cs b/MCGalaxy/Generator/Foliage/AshTree.cs index 581c49e1b..204d48b30 100644 --- a/MCGalaxy/Generator/Foliage/AshTree.cs +++ b/MCGalaxy/Generator/Foliage/AshTree.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using MCGalaxy.Drawing.Brushes; using MCGalaxy.Drawing.Ops; using MCGalaxy.Maths; +using BlockRaw = System.Byte; namespace MCGalaxy.Generator.Foliage { public sealed class AshTree : Tree { @@ -68,7 +69,7 @@ namespace MCGalaxy.Generator.Foliage { DrawOp op = new EllipsoidDrawOp(); Brush brush = new RandomBrush(new ushort[] { Block.Leaves }); op.SetMarks(marks); - op.Perform(marks, brush, b => output(b.X, b.Y, b.Z, b.Block.BlockID)); + op.Perform(marks, brush, b => output(b.X, b.Y, b.Z, (BlockRaw)b.Block)); Vec3S32 p1 = new Vec3S32(x, y + branchStart, z); Vec3S32 p2 = new Vec3S32(x + dx, y + branchMax, z + dz); diff --git a/MCGalaxy/Generator/Foliage/Tree.cs b/MCGalaxy/Generator/Foliage/Tree.cs index e64789944..bedb1bf20 100644 --- a/MCGalaxy/Generator/Foliage/Tree.cs +++ b/MCGalaxy/Generator/Foliage/Tree.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; using MCGalaxy.Drawing.Brushes; +using BlockID = System.UInt16; namespace MCGalaxy.Generator.Foliage { @@ -55,8 +56,8 @@ namespace MCGalaxy.Generator.Foliage { for (int dz = -size; dz <= size; ++dz) for (int dx = -size; dx <= size; ++dx) { - byte tile = lvl.GetTile((ushort)(x + dx), (ushort)(y + dy), (ushort)(z + dz)); - if (tile == Block.Log || tile == Block.Green) return true; + BlockID block = lvl.GetBlock((ushort)(x + dx), (ushort)(y + dy), (ushort)(z + dz)); + if (block == Block.Log || block == Block.Green) return true; } return false; } diff --git a/MCGalaxy/Generator/RealisticMapGen.cs b/MCGalaxy/Generator/RealisticMapGen.cs index 41ea7406d..e22dd8a41 100644 --- a/MCGalaxy/Generator/RealisticMapGen.cs +++ b/MCGalaxy/Generator/RealisticMapGen.cs @@ -134,7 +134,7 @@ namespace MCGalaxy.Generator { if (genParams.GenTrees && overlay[index] < 0.65f && overlay2[index] < treeDens) { if (Lvl.IsAirAt(x, (ushort)(y + 1), z)) { - if (Lvl.GetTile(x, y, z) == Block.Grass || genParams.UseCactus) { + if (Lvl.GetBlock(x, y, z) == Block.Grass || genParams.UseCactus) { if (rand.Next(13) == 0 && !Tree.TreeCheck(Lvl, x, y, z, treeDist)) { Tree tree = null; if (genParams.UseCactus) tree = new CactusTree(); diff --git a/MCGalaxy/Generator/fCraft/MapGenerator.cs b/MCGalaxy/Generator/fCraft/MapGenerator.cs index b94616a08..9dcd217d7 100644 --- a/MCGalaxy/Generator/fCraft/MapGenerator.cs +++ b/MCGalaxy/Generator/fCraft/MapGenerator.cs @@ -1,6 +1,7 @@ // Part of fCraft | Copyright 2009-2015 Matvei Stefarov | BSD-3 | See LICENSE.txt using System; using MCGalaxy.Commands; +using BlockID = System.UInt16; namespace MCGalaxy.Generator { @@ -286,7 +287,7 @@ namespace MCGalaxy.Generator { for( int z = 0; z < map.Length; z++ ) for( int y = args.WaterLevel; y <= args.WaterLevel + args.BeachHeight; y++ ) { - if( map.GetTile( (ushort)x, (ushort)y, (ushort)z ) != bGroundSurface ) continue; + if( map.GetBlock( (ushort)x, (ushort)y, (ushort)z ) != bGroundSurface ) continue; bool found = false; for( int dx = -args.BeachExtent; !found && dx <= args.BeachExtent; dx++ ) for( int dz = -args.BeachExtent; !found && dz <= args.BeachExtent; dz++ ) @@ -296,7 +297,7 @@ namespace MCGalaxy.Generator { int xx = x + dx, yy = y + dy, zz = z + dz; if( xx < 0 || xx >= map.Width || yy < 0 || yy >= map.Height || zz < 0 || zz >= map.Length ) continue; - byte block = map.GetTile( (ushort)xx, (ushort)yy, (ushort)zz ); + BlockID block = map.GetBlock( (ushort)xx, (ushort)yy, (ushort)zz ); if( block == bWater || block == bWaterSurface ) { found = true; break; @@ -305,7 +306,7 @@ namespace MCGalaxy.Generator { if( found ) { map.SetTile( (ushort)x, (ushort)y, (ushort)z, bSeaFloor ); - if( y > 0 && map.GetTile( (ushort)x, (ushort)(y - 1), (ushort)z ) == bGround ) { + if( y > 0 && map.GetBlock( (ushort)x, (ushort)(y - 1), (ushort)z ) == bGround ) { map.SetTile( (ushort)x, (ushort)(y - 1), (ushort)z, bSeaFloor ); } } @@ -332,7 +333,7 @@ namespace MCGalaxy.Generator { if( nx < 0 || nx >= map.Width || nz < 0 || nz >= map.Length ) continue; int ny = shadows[nx, nz]; - if( (map.GetTile( (ushort)nx, (ushort)ny, (ushort)nz ) == bGroundSurface) && slopemap[nx, nz] < .5 ) { + if( (map.GetBlock( (ushort)nx, (ushort)ny, (ushort)nz ) == bGroundSurface) && slopemap[nx, nz] < .5 ) { // Pick a random height for the tree between Min and Max, // discarding this tree if it would breach the top of the map int nh; @@ -354,8 +355,9 @@ namespace MCGalaxy.Generator { if( rn.NextDouble() > odds && Math.Abs( dx ) == Math.Abs( dz ) && Math.Abs( dx ) == radius ) continue; // By default only replace an existing block if its air - if( map.GetTile( (ushort)(nx + dx), (ushort)(ny + nh + i), (ushort)(nz + dz) ) == Block.Air ) + if( map.GetBlock( (ushort)(nx + dx), (ushort)(ny + nh + i), (ushort)(nz + dz) ) == Block.Air ) { map.SetTile( (ushort)(nx + dx), (ushort)(ny + nh + i), (ushort)(nz + dz), Block.Leaves ); + } } } } diff --git a/MCGalaxy/Levels/BlockQueue.cs b/MCGalaxy/Levels/BlockQueue.cs index 074a6953d..28096bfb8 100644 --- a/MCGalaxy/Levels/BlockQueue.cs +++ b/MCGalaxy/Levels/BlockQueue.cs @@ -24,9 +24,10 @@ namespace MCGalaxy { public static class BlockQueue { - public static int time = 100; - public static int blockupdates = 750; + public static int Interval = 100; + public static int UpdatesPerTick = 750; static BufferedBlockSender bulkSender = new BufferedBlockSender(); + public const int BlockMask = 0x1FF; public static void Loop(SchedulerTask task) { Level[] loaded = LevelInfo.Loaded.Items; @@ -36,10 +37,10 @@ namespace MCGalaxy { } bulkSender.level = null; - task.Delay = TimeSpan.FromMilliseconds(time); + task.Delay = TimeSpan.FromMilliseconds(Interval); } - public static void Addblock(Player p, int index, BlockID block) { + public static void Add(Player p, int index, BlockID block) { if (index == -1) return; // Bit packing format // 32-63: index @@ -48,8 +49,7 @@ namespace MCGalaxy { // 0-7: raw type ulong flags = (ulong)index << 32; flags |= (ulong)p.SessionID << 9; - flags |= (block.BlockID == Block.custom_block ? 0x100UL : 0x000UL); - flags |= (block.BlockID == Block.custom_block ? block.ExtID : block.BlockID); + flags |= (ulong)block & BlockMask; lock (p.level.queueLock) p.level.blockqueue.Add(flags); @@ -61,16 +61,15 @@ namespace MCGalaxy { if (!lvl.HasPlayers()) { lvl.blockqueue.Clear(); return; } bulkSender.level = lvl; - int count = blockupdates; - if (lvl.blockqueue.Count < blockupdates) + int count = UpdatesPerTick; + if (lvl.blockqueue.Count < UpdatesPerTick) count = lvl.blockqueue.Count; for (int i = 0; i < count; i++) { ulong flags = lvl.blockqueue[i]; int index = (int)(flags >> 32); - byte block = (flags & 0x100) != 0 ? Block.custom_block : (byte)flags; - byte extBlock = (flags & 0x100) != 0 ? (byte)flags : Block.Air; - bulkSender.Add(index, block, extBlock); + BlockID block = (BlockID)(flags & BlockMask); + bulkSender.Add(index, block); } bulkSender.Send(true); lvl.blockqueue.RemoveRange(0, count); diff --git a/MCGalaxy/Levels/Level.Blocks.cs b/MCGalaxy/Levels/Level.Blocks.cs index 3194a5802..241af6c3f 100644 --- a/MCGalaxy/Levels/Level.Blocks.cs +++ b/MCGalaxy/Levels/Level.Blocks.cs @@ -23,6 +23,7 @@ using MCGalaxy.DB; using MCGalaxy.Games; using MCGalaxy.Maths; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy { @@ -41,12 +42,6 @@ namespace MCGalaxy { } } - public byte GetTile(ushort x, ushort y, ushort z) { - int index = PosToInt(x, y, z); - if (index < 0 || blocks == null) return Block.Invalid; - return blocks[index]; - } - /// Gets the block at the given coordinates. /// Block.Invalid if coordinates outside map. public BlockID GetBlock(ushort x, ushort y, ushort z) { @@ -80,7 +75,10 @@ namespace MCGalaxy { public byte GetTile(int b) { ushort x = 0, y = 0, z = 0; IntToPos(b, out x, out y, out z); - return GetTile(x, y, z); + + int index = PosToInt(x, y, z); + if (index < 0 || blocks == null) return Block.Invalid; + return blocks[index]; } public byte GetExtTile(ushort x, ushort y, ushort z) { @@ -189,8 +187,14 @@ namespace MCGalaxy { return access == AccessResult.Whitelisted || access == AccessResult.Allowed; } + internal bool BuildIn(BlockID block) { + if (block == Block.Op_Water || block == Block.Op_Lava || Props[block].IsPortal || Props[block].IsMessageBlock) return false; + block = Block.Convert(block); + return block >= Block.Water && block <= Block.StillLava; + } + public bool CheckAffectPermissions(Player p, ushort x, ushort y, ushort z, BlockID old, BlockID block) { - if (!p.group.Blocks[old] && !Block.AllowBreak(old.BlockID) && !Block.BuildIn(old.BlockID)) return false; + if (!p.group.Blocks[old] && !Block.AllowBreak(old) && !BuildIn(old)) return false; if (p.PlayingTntWars && !CheckTNTWarsChange(p, x, y, z, ref block)) return false; Zone[] zones = Zones.Items; if (zones.Length == 0) return CheckRank(p); @@ -261,20 +265,22 @@ namespace MCGalaxy { else p.TotalPlaced++; errorLocation = "Setting tile"; - SetTile(x, y, z, block.BlockID); - if (old.BlockID == Block.custom_block && block.BlockID != Block.custom_block) + BlockRaw raw = block >= Block.Extended ? Block.custom_block : (BlockRaw)block; + SetTile(x, y, z, raw); + if (block >= Block.Extended) { + SetExtTileNoCheck(x, y, z, (BlockRaw)block); + } else if (old >= Block.Extended) { RevertExtTileNoCheck(x, y, z); - if (block.BlockID == Block.custom_block) - SetExtTileNoCheck(x, y, z, block.ExtID); + } errorLocation = "Adding physics"; - if (p.PlayingTntWars && block.BlockID == Block.TNT_Small) AddTntCheck(PosToInt(x, y, z), p); + if (p.PlayingTntWars && block == Block.TNT_Small) AddTntCheck(PosToInt(x, y, z), p); if (physics > 0 && ActivatesPhysics(block)) AddCheck(PosToInt(x, y, z)); Changed = true; backedup = false; - return old.VisuallyEquals(block) ? 1 : 2; + return Block.VisuallyEquals(old, block) ? 1 : 2; } catch (Exception e) { Logger.LogError(e); Chat.MessageOps(p.name + " triggered a non-fatal error on " + ColoredName + ", %Sat location: " + errorLocation); @@ -311,9 +317,8 @@ namespace MCGalaxy { internal bool DoPhysicsBlockchange(int b, BlockID block, bool overRide = false, PhysicsArgs data = default(PhysicsArgs), bool addUndo = true) { if (blocks == null || b < 0 || b >= blocks.Length) return false; - ushort old; - old.BlockID = blocks[b]; - old.ExtID = old.BlockID == Block.custom_block ? GetExtTile(b) : Block.Air; + BlockID old = blocks[b]; + old = old != Block.custom_block ? old : (BlockID)(Block.Extended | GetExtTile(b)); try { @@ -321,10 +326,10 @@ namespace MCGalaxy { if (Props[old].OPBlock || (Props[block].OPBlock && data.Raw != 0)) return false; } - if (old == Block.Sponge && physics > 0 && block != Block.Sponge) { + if (old == Block.Sponge && physics > 0 && block != Block.Sponge) { OtherPhysics.DoSpongeRemoved(this, b, false); } - if (old == Block.LavaSponge && physics > 0 && block != Block.LavaSponge) { + if (old == Block.LavaSponge && physics > 0 && block != Block.LavaSponge) { OtherPhysics.DoSpongeRemoved(this, b, true); } @@ -343,24 +348,25 @@ namespace MCGalaxy { currentUndo++; } - blocks[b] = block.BlockID; + blocks[b] = block >= Block.Extended ? Block.custom_block : (BlockRaw)block; Changed = true; - if (block.BlockID == Block.custom_block) { + if (block >= Block.Extended) { ushort x, y, z; IntToPos(b, out x, out y, out z); - SetExtTileNoCheck(x, y, z, block.ExtID); - } else if (old.BlockID == Block.custom_block) { + SetExtTileNoCheck(x, y, z, (BlockRaw)block); + } else if (old >= Block.Extended) { ushort x, y, z; IntToPos(b, out x, out y, out z); RevertExtTileNoCheck(x, y, z); } - if (physics > 0 && (ActivatesPhysics(block) || data.Raw != 0)) + if (physics > 0 && (ActivatesPhysics(block) || data.Raw != 0)) { AddCheck(b, false, data); + } // Save bandwidth sending identical looking blocks, like air/op_air changes. - return !old.VisuallyEquals(block); + return !Block.VisuallyEquals(old, block); } catch { - blocks[b] = block.BlockID; + blocks[b] = block >= Block.Extended ? Block.custom_block : (BlockRaw)block; return false; } } @@ -403,12 +409,12 @@ namespace MCGalaxy { if (type == 1) return; // not different visually int index = PosToInt(x, y, z); - if (buffered) BlockQueue.Addblock(p, index, block); + if (buffered) BlockQueue.Add(p, index, block); else Player.GlobalBlockchange(this, x, y, z, block); } public BlockDefinition GetBlockDef(BlockID block) { - if (block.BlockID == Block.custom_block) return CustomBlockDefs[block.ExtID]; + if (block >= Block.Extended) return CustomBlockDefs[(BlockRaw)block]; if (block == Block.Air) return null; if (block >= Block.CpeCount) { @@ -418,14 +424,6 @@ namespace MCGalaxy { } } - public string BlockName(BlockID block) { - if (block.IsPhysicsType) return Block.Name(block); - BlockDefinition def = GetBlockDef(block); - if (def != null) return def.Name.Replace(" ", ""); - - return block.BlockID != Block.custom_block ? Block.Name(block) : block.ExtID.ToString(); - } - public byte CollideType(BlockID block) { BlockDefinition def = GetBlockDef(block); byte collide = def != null ? def.CollideType : MCGalaxy.Blocks.CollideType.Solid; diff --git a/MCGalaxy/Levels/Level.cs b/MCGalaxy/Levels/Level.cs index de43123df..cd1ba2c0c 100644 --- a/MCGalaxy/Levels/Level.cs +++ b/MCGalaxy/Levels/Level.cs @@ -29,6 +29,7 @@ using MCGalaxy.Generator; using MCGalaxy.Levels.IO; using MCGalaxy.Util; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy { public enum LevelPermission { @@ -445,12 +446,13 @@ namespace MCGalaxy { internal bool HasCustomProps(BlockID block) { if (Block.IsPhysicsType(block)) return false; - return CustomBlockDefs[block.RawID] != BlockDefinition.GlobalDefs[block.RawID]; + BlockRaw raw = (BlockRaw)block; + return CustomBlockDefs[raw] != BlockDefinition.GlobalDefs[raw]; } void LoadCoreProps() { for (int i = 0; i < Props.Length; i++) { - BlockID block = (BlockID)i; + BlockID block = (BlockID)i; if (!HasCustomProps(block)) { Props[i] = BlockDefinition.DefaultProps(block); } else { @@ -466,7 +468,7 @@ namespace MCGalaxy { public void UpdateBlockHandlers() { for (int i = 0; i < Props.Length; i++) { - UpdateBlockHandler((ushort)i); + UpdateBlockHandler((ushort)i); } } diff --git a/MCGalaxy/Levels/LevelEnv.cs b/MCGalaxy/Levels/LevelEnv.cs index d086dd2f9..b4abf35f2 100644 --- a/MCGalaxy/Levels/LevelEnv.cs +++ b/MCGalaxy/Levels/LevelEnv.cs @@ -21,6 +21,7 @@ using MCGalaxy.Commands.Building; using MCGalaxy.Network; using MCGalaxy.Blocks; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy { public static class LevelEnv { @@ -114,7 +115,7 @@ namespace MCGalaxy { } - static bool CheckBlock(Player p, string value, string variable, ref byte modify) { + static bool CheckBlock(Player p, string value, string variable, ref BlockRaw modify) { BlockID block; if (!CommandParser.GetBlock(p, value, out block)) return false; @@ -123,7 +124,7 @@ namespace MCGalaxy { } string name = Block.GetName(p, block); - modify = block.RawID; + modify = (BlockRaw)block; Player.Message(p, "Set {0} for {1} %Sto {2}", variable, p.level.ColoredName, name); return true; } diff --git a/MCGalaxy/Network/Player.Networking.cs b/MCGalaxy/Network/Player.Networking.cs index 406df8955..50eaacf45 100644 --- a/MCGalaxy/Network/Player.Networking.cs +++ b/MCGalaxy/Network/Player.Networking.cs @@ -21,6 +21,7 @@ using MCGalaxy.Events; using MCGalaxy.Events.PlayerEvents; using MCGalaxy.Network; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy { public partial class Player : IDisposable { @@ -262,11 +263,11 @@ namespace MCGalaxy { NetUtils.WriteU16(y, buffer, 3); NetUtils.WriteU16(z, buffer, 5); - byte raw; - if (block.BlockID == Block.custom_block) { - raw = hasBlockDefs ? block.ExtID : level.RawFallback(block.ExtID); + BlockRaw raw; + if (block >= Block.Extended) { + raw = hasBlockDefs ? (BlockRaw)block : level.RawFallback((BlockRaw)block); } else { - raw = Block.Convert(block.BlockID); + raw = (BlockRaw)Block.Convert(block); } if (!hasCustomBlocks) raw = Block.ConvertCPE(raw); // client doesn't support CPE diff --git a/MCGalaxy/Network/Utils/BufferedBlockSender.cs b/MCGalaxy/Network/Utils/BufferedBlockSender.cs index caaaa26e6..04495283f 100644 --- a/MCGalaxy/Network/Utils/BufferedBlockSender.cs +++ b/MCGalaxy/Network/Utils/BufferedBlockSender.cs @@ -17,6 +17,7 @@ */ using System; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy.Network { /// Combines block changes and sends them as either a single CPE BulkBlockUpdate packet, @@ -45,9 +46,13 @@ namespace MCGalaxy.Network { /// number of buffered block changes has reached the limit. /// Whether block change packets were actually sent. public bool Add(int index, BlockID block) { - indices[count] = index; - if (block == Block.custom_block) types[count] = extBlock; - else types[count] = Block.Convert(block); + indices[count] = index; + if (Block.IsPhysicsType(block)) { + types[count] = (BlockRaw)Block.Convert(block); + } else { + types[count] = (BlockRaw)block; + } + count++; return Send(false); } diff --git a/MCGalaxy/Network/Utils/LevelChunkStream.cs b/MCGalaxy/Network/Utils/LevelChunkStream.cs index 3c322dda5..70d281125 100644 --- a/MCGalaxy/Network/Utils/LevelChunkStream.cs +++ b/MCGalaxy/Network/Utils/LevelChunkStream.cs @@ -90,8 +90,10 @@ namespace MCGalaxy.Network { // Store on stack instead of performing function call for every block in map byte* conv = stackalloc byte[Block.Count]; byte* convCPE = stackalloc byte[Block.Count]; - for (int i = 0; i < 256; i++) - conv[i] = Block.Convert((byte)i); + for (int i = 0; i < 256; i++) { + conv[i] = (byte)Block.Convert((byte)i); + if (conv[i] > Block.CpeCount) conv[i] = Block.Orange; + } // Convert custom blocks (that overwrote core blocks) to their fallbacks if (!p.hasBlockDefs) { diff --git a/MCGalaxy/Player/Player.CPE.cs b/MCGalaxy/Player/Player.CPE.cs index 38887163f..9fbe7d588 100644 --- a/MCGalaxy/Player/Player.CPE.cs +++ b/MCGalaxy/Player/Player.CPE.cs @@ -19,6 +19,7 @@ using System; using System.Collections.Generic; using MCGalaxy.Blocks; using MCGalaxy.Network; +using BlockID = System.UInt16; namespace MCGalaxy { public partial class Player { diff --git a/MCGalaxy/Player/Player.Handlers.cs b/MCGalaxy/Player/Player.Handlers.cs index 5ff5cd893..c5fb4df7c 100644 --- a/MCGalaxy/Player/Player.Handlers.cs +++ b/MCGalaxy/Player/Player.Handlers.cs @@ -28,6 +28,7 @@ using MCGalaxy.Network; using MCGalaxy.SQL; using MCGalaxy.Util; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy { public partial class Player : IDisposable { @@ -109,7 +110,7 @@ namespace MCGalaxy { } BlockID held = block; - block = BlockBindings[block.RawID]; + if (!Block.IsPhysicsType(block)) block = BlockBindings[(BlockRaw)block]; if (!CheckManualChange(old, block, deletingBlock)) { RevertBlock(x, y, z); return; } @@ -118,7 +119,7 @@ namespace MCGalaxy { //Ignores updating blocks that are the same and revert block back only to the player BlockID newB = deletingBlock ? Block.Air : block; if (old == newB) { - if (painting || !old.VisuallyEquals(held)) RevertBlock(x, y, z); + if (painting || !Block.VisuallyEquals(old, held)) RevertBlock(x, y, z); return; } @@ -133,7 +134,7 @@ namespace MCGalaxy { } internal bool CheckManualChange(BlockID old, BlockID block, bool deleteMode) { - if (!BlockPerms.UsableBy(this, old) && !Block.BuildIn(old.BlockID) && !Block.AllowBreak(old.BlockID)) { + if (!BlockPerms.UsableBy(this, old) && !level.BuildIn(old) && !Block.AllowBreak(old)) { string action = deleteMode ? "delete" : "replace"; BlockPerms.List[old].MessageCannotUse(this, action); return false; @@ -294,9 +295,10 @@ namespace MCGalaxy { RevertBlock(x, y, z); return; } - if (held.BlockID == Block.custom_block) { - if (!hasBlockDefs || level.CustomBlockDefs[held.ExtID] == null) { - SendMessage("Invalid block type: " + held.ExtID); + if (held >= Block.Extended) { + BlockRaw raw = (BlockRaw)held; + if (!hasBlockDefs || level.CustomBlockDefs[raw] == null) { + SendMessage("Invalid block type: " + raw); RevertBlock(x, y, z); return; } } diff --git a/MCGalaxy/Player/Player.cs b/MCGalaxy/Player/Player.cs index 5deb78a68..87384d8c5 100644 --- a/MCGalaxy/Player/Player.cs +++ b/MCGalaxy/Player/Player.cs @@ -28,6 +28,7 @@ using MCGalaxy.Network; using MCGalaxy.Tasks; using MCGalaxy.Maths; using BlockID = System.UInt16; +using BlockRaw = System.Byte; namespace MCGalaxy { public class ChatMessage { @@ -90,9 +91,9 @@ namespace MCGalaxy { return Rank >= target.Rank; } - public ushort GetHeldBlock() { + public BlockID GetHeldBlock() { if (ModeBlock != Block.Air) return ModeBlock; - return BlockBindings[RawHeldBlock.RawID]; + return BlockBindings[(BlockRaw)RawHeldBlock]; } public void SetPrefix() { @@ -471,7 +472,7 @@ namespace MCGalaxy { SelectionHandler callback = selCallback; ClearSelection(); - if (!block.IsPhysicsType) block = p.BlockBindings[block.RawID]; + if (!Block.IsPhysicsType(block)) block = p.BlockBindings[(BlockRaw)block]; bool canRepeat = callback(this, selMarks, state, block); if (canRepeat && staticCommands) { diff --git a/MCGalaxy/Server/Server.Init.cs b/MCGalaxy/Server/Server.Init.cs index 956fed561..f3d504437 100644 --- a/MCGalaxy/Server/Server.Init.cs +++ b/MCGalaxy/Server/Server.Init.cs @@ -131,7 +131,7 @@ namespace MCGalaxy { InitZombieSurvival(); InitLavaSurvival(); MainScheduler.QueueRepeat(BlockQueue.Loop, null, - TimeSpan.FromMilliseconds(BlockQueue.time)); + TimeSpan.FromMilliseconds(BlockQueue.Interval)); Critical.QueueRepeat(ServerTasks.LocationChecks, null, TimeSpan.FromMilliseconds(20)); diff --git a/MCGalaxy/Server/Tasks/UpgradeTasks.cs b/MCGalaxy/Server/Tasks/UpgradeTasks.cs index 69818381f..ab439080f 100644 --- a/MCGalaxy/Server/Tasks/UpgradeTasks.cs +++ b/MCGalaxy/Server/Tasks/UpgradeTasks.cs @@ -267,9 +267,5 @@ namespace MCGalaxy.Tasks { bulk.Commit(); } } - - internal static void UpgradeZones(SchedulerTask task) { - - } } } \ No newline at end of file