From 0f5972ad81b7ba409ac0c737f149ece28870e898 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 7 Sep 2016 08:46:50 +1000 Subject: [PATCH 1/3] Use item number instead of page number, to match fCraft. --- util/MultiPageOutput.cs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/util/MultiPageOutput.cs b/util/MultiPageOutput.cs index b3f3b474b..99dd5f638 100644 --- a/util/MultiPageOutput.cs +++ b/util/MultiPageOutput.cs @@ -36,27 +36,25 @@ namespace MCGalaxy { OutputItems(p, items, 0, items.Count, lines, formatter); Player.Message(p, "Showing {0} 1-{1} (out of {1})", type, items.Count); } else if (!int.TryParse(modifier, out page)) { - Player.Message(p, "Page must be either \"all\" or an integer."); + Player.Message(p, "Input must be either \"all\" or an integer."); } else { OutputPage(p, items, formatter, cmd, type, page, lines); } } static void OutputPage(Player p, IList items, Func formatter, - string cmd, string type, int page, bool lines) { + string cmd, string type, int start, bool lines) { int perPage = lines ? 10 : 30; - int total = items.Count, maxPage = total / perPage; - page = Utils.Clamp(page - 1, 0, maxPage); // want page numbers to start at 1 + start = Utils.Clamp(start - 1, 0, items.Count - 1); // want item numbers to start at 1 + int end = Math.Min(start + perPage, items.Count); + OutputItems(p, items, start, end, lines, formatter); - int entriesEnd = Math.Min((page + 1) * perPage, total); - OutputItems(p, items, page * perPage, entriesEnd, lines, formatter); - - if (page < maxPage) { + if (end < items.Count) { Player.Message(p, "Showing {0} {1}-{2} (out of {3}) Next: %T/{4} {5}", - type, page * perPage + 1, entriesEnd, total, cmd, page + 2); + type, start + 1, end, items.Count, cmd, start + 1 + perPage); } else { Player.Message(p, "Showing {0} {1}-{2} (out of {3})", - type, page * perPage + 1, entriesEnd, total); + type, start + 1, end, items.Count); } } From 98235757861d7c90c7cc5ad3d0f175ec96323488 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 7 Sep 2016 12:32:36 +1000 Subject: [PATCH 2/3] Use better message for when level isn't buildable/deletable and you are using a client that does not support BlockPermissions. --- Player/Player.Handlers.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Player/Player.Handlers.cs b/Player/Player.Handlers.cs index 7096de728..449ac4445 100644 --- a/Player/Player.Handlers.cs +++ b/Player/Player.Handlers.cs @@ -251,10 +251,10 @@ namespace MCGalaxy { RawHeldBlock = block; if ((action == 0 || block == 0) && !level.Deletable) { - SendMessage("You cannot currently delete blocks in this level."); + SendMessage("Deleting blocks is disabled in this level."); RevertBlock(x, y, z); return; } else if (action == 1 && !level.Buildable) { - SendMessage("You cannot currently place blocks in this level."); + SendMessage("Placing blocks is disabled in this level."); RevertBlock(x, y, z); return; } From bf99339d38373fcd9e649498fcaa0e375986d05c Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 7 Sep 2016 18:06:52 +1000 Subject: [PATCH 3/3] Avoid ColorTranslator, use our own hex parsing function. --- Chat/Colors.cs | 31 +++++++++++++++++++++++++++++++ Commands/CPE/CmdCustomColors.cs | 9 +++------ Commands/CPE/CmdEnvironment.cs | 10 +++++----- Levels/LevelEnv.cs | 23 ++++++----------------- Network/Packet.CPE.cs | 17 +++++++++++++++++ Network/Player.Networking.cs | 14 -------------- Player/Player.CPE.cs | 14 +++++++++----- 7 files changed, 71 insertions(+), 47 deletions(-) diff --git a/Chat/Colors.cs b/Chat/Colors.cs index ec1f93ca4..dc4dd4497 100644 --- a/Chat/Colors.cs +++ b/Chat/Colors.cs @@ -264,6 +264,37 @@ namespace MCGalaxy { ExtColors[col.Code] = col; } } + + public static CustomColor ParseHex(string hex) { + if (hex.Length > 0 && hex[0] == '#') hex = hex.Remove(0, 1); + if (hex.Length != 3 && hex.Length != 6) + throw new ArgumentException("hex must be either 3 or 6 chars long"); + + CustomColor c = default(CustomColor); + int R, G, B; + if (hex.Length == 6) { + R = (Hex(hex[0]) << 4) | Hex(hex[1]); + G = (Hex(hex[2]) << 4) | Hex(hex[3]); + B = (Hex(hex[4]) << 4) | Hex(hex[5]); + } else { + R = Hex(hex[0]); R |= (R << 4); + G = Hex(hex[1]); G |= (G << 4); + B = Hex(hex[2]); B |= (B << 4); + } + + c.R = (byte)R; c.G = (byte)G; c.B = (byte)B; c.A = 255; + return c; + } + + static int Hex(char value) { + if (value >= '0' && value <= '9') + return (int)(value - '0'); + if (value >= 'a' && value <= 'f') + return (int)(value - 'a') + 10; + if (value >= 'A' && value <= 'F') + return (int)(value - 'A') + 10; + throw new ArgumentException("Non hex char: " + value); + } } public struct CustomColor { diff --git a/Commands/CPE/CmdCustomColors.cs b/Commands/CPE/CmdCustomColors.cs index cb6473ad7..2225cbccc 100644 --- a/Commands/CPE/CmdCustomColors.cs +++ b/Commands/CPE/CmdCustomColors.cs @@ -73,11 +73,8 @@ namespace MCGalaxy.Commands.CPE { if (!CheckName(p, args[2]) || !CheckFallback(p, args[3], out fallback) || !Utils.CheckHex(p, ref args[4])) return; - CustomColor col = default(CustomColor); - col.Code = code; col.Fallback = fallback; col.A = 255; - col.Name = args[2]; - Color rgb = ColorTranslator.FromHtml("#" + args[4]); - col.R = rgb.R; col.G = rgb.G; col.B = rgb.B; + CustomColor col = Colors.ParseHex(args[4]); + col.Code = code; col.Fallback = fallback; col.Name = args[2]; Colors.AddExtColor(col); Player.Message(p, "Successfully added a custom color."); } @@ -149,7 +146,7 @@ namespace MCGalaxy.Commands.CPE { case "hex": case "color": if (!Utils.CheckHex(p, ref args[3])) return; - Color rgb = ColorTranslator.FromHtml("#" + args[3]); + CustomColor rgb = Colors.ParseHex(args[3]); col.R = rgb.R; col.G = rgb.G; col.B = rgb.B; break; default: diff --git a/Commands/CPE/CmdEnvironment.cs b/Commands/CPE/CmdEnvironment.cs index 0c5a776c6..2925d8e56 100644 --- a/Commands/CPE/CmdEnvironment.cs +++ b/Commands/CPE/CmdEnvironment.cs @@ -161,15 +161,15 @@ namespace MCGalaxy.Commands { } if (preset == null) { SendPresetsMessage(p); return false; } - LevelEnv.SendEnvColorPackets(p, 0, preset.Sky); + LevelEnv.UpdateEnvColor(p, 0, preset.Sky); p.level.SkyColor = preset.Sky; - LevelEnv.SendEnvColorPackets(p, 1, preset.Clouds); + LevelEnv.UpdateEnvColor(p, 1, preset.Clouds); p.level.CloudColor = preset.Clouds; - LevelEnv.SendEnvColorPackets(p, 2, preset.Fog); + LevelEnv.UpdateEnvColor(p, 2, preset.Fog); p.level.FogColor = preset.Fog; - LevelEnv.SendEnvColorPackets(p, 3, preset.Shadow); + LevelEnv.UpdateEnvColor(p, 3, preset.Shadow); p.level.ShadowColor = preset.Shadow; - LevelEnv.SendEnvColorPackets(p, 4, preset.Sun); + LevelEnv.UpdateEnvColor(p, 4, preset.Sun); p.level.LightColor = preset.Sun; Level.SaveSettings(p.level); diff --git a/Levels/LevelEnv.cs b/Levels/LevelEnv.cs index c972c1cf2..a37b98380 100644 --- a/Levels/LevelEnv.cs +++ b/Levels/LevelEnv.cs @@ -86,11 +86,11 @@ namespace MCGalaxy { Player.Message(p, "Reset {0} color for {1} %Sto normal", envTypeName, p.level.name); target = ""; } else { - if (!Utils.CheckHex(p, ref value)) return; + if (!Utils.CheckHex(p, ref value)) return; Player.Message(p, "Set {0} color for {1} %Sto #{2}", envTypeName, p.level.name, value); target = value; } - SendEnvColorPackets(p, envType, value); + UpdateEnvColor(p, envType, value); } static bool CheckBlock(Player p, string value, string variable, ref int modify) { @@ -105,7 +105,7 @@ namespace MCGalaxy { block == Block.mushroom || block == Block.redmushroom || block == Block.rope || block == Block.fire) { Player.Message(p, "Env: Cannot use {0} for {1}.", block, variable); } else { - modify = block == Block.custom_block ? extBlock : (byte)block; + modify = block == Block.custom_block ? extBlock : (byte)block; Player.Message(p, "Set {0} for {1} %Sto {2}", variable, p.level.name, modify); return true; } @@ -161,22 +161,11 @@ namespace MCGalaxy { } } - internal static void SendEnvColorPackets(Player p, byte envType, string value) { + internal static void UpdateEnvColor(Player p, byte type, string hex) { Player[] players = PlayerInfo.Online.Items; foreach (Player pl in players) { - if (pl.level == p.level) - SendEnvColorPacket(pl, envType, value); - } - } - - static void SendEnvColorPacket(Player p, byte envType, string value) { - if (p.HasCpeExt(CpeExt.EnvColors)) { - try { - System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#" + value.ToUpper()); - p.SendEnvColor(envType, col.R, col.G, col.B); - } catch { - p.SendEnvColor(envType, -1, -1, -1); - } + if (pl.level != p.level || !pl.HasCpeExt(CpeExt.EnvColors)) continue; + pl.SendEnvColor(type, hex); } } } diff --git a/Network/Packet.CPE.cs b/Network/Packet.CPE.cs index 042e8500f..33293ee16 100644 --- a/Network/Packet.CPE.cs +++ b/Network/Packet.CPE.cs @@ -62,6 +62,16 @@ namespace MCGalaxy { return buffer; } + public static byte[] MakeEnvColor(byte type, short r, short g, short b) { + byte[] buffer = new byte[8]; + buffer[0] = Opcode.CpeEnvColors; + buffer[1] = type; + NetUtils.WriteI16(r, buffer, 2); + NetUtils.WriteI16(g, buffer, 4); + NetUtils.WriteI16(b, buffer, 6); + return buffer; + } + public static byte[] MakeMakeSelection(byte id, string label, Vec3U16 p1, Vec3U16 p2, short r, short g, short b, short opacity ) { byte[] buffer = new byte[86]; @@ -83,6 +93,13 @@ namespace MCGalaxy { return buffer; } + public static byte[] MakeDeleteSelection(byte id) { + byte[] buffer = new byte[2]; + buffer[0] = Opcode.CpeMakeSelection; + buffer[1] = id; + return buffer; + } + public static byte[] MakeHackControl(bool canFly, bool canNoclip, bool canSpeed, bool canRespawn, bool can3rdPerson, short maxJumpHeight) { diff --git a/Network/Player.Networking.cs b/Network/Player.Networking.cs index abb57e9db..9dbf04381 100644 --- a/Network/Player.Networking.cs +++ b/Network/Player.Networking.cs @@ -522,20 +522,6 @@ namespace MCGalaxy { Send(buffer); } - public void SendEnvColor( byte type, short r, short g, short b ) { - byte[] buffer = new byte[8]; - buffer[0] = Opcode.CpeEnvColors; - buffer[1] = type; - NetUtils.WriteI16(r, buffer, 2); - NetUtils.WriteI16(g, buffer, 4); - NetUtils.WriteI16(b, buffer, 6); - Send(buffer); - } - - public void SendDeleteSelection( byte id ) { - SendRaw(Opcode.CpeRemoveSelection, id); - } - public void SendSetBlockPermission( byte type, bool canplace, bool candelete ) { byte[] buffer = new byte[4]; buffer[0] = Opcode.CpeSetBlockPermission; diff --git a/Player/Player.CPE.cs b/Player/Player.CPE.cs index e8ad2f491..cff588543 100644 --- a/Player/Player.CPE.cs +++ b/Player/Player.CPE.cs @@ -203,12 +203,16 @@ namespace MCGalaxy { SendEnvColor(4, level.LightColor); } - void SendEnvColor(byte type, string src) { + public void SendEnvColor(byte type, string hex) { + if (String.IsNullOrEmpty(hex)) { + Send(Packet.MakeEnvColor(type, -1, -1, -1)); return; + } + try { - Color col = System.Drawing.ColorTranslator.FromHtml("#" + src.ToUpper()); - SendEnvColor(type, col.R, col.G, col.B); - } catch { - SendEnvColor(type, -1, -1, -1); + CustomColor c = Colors.ParseHex(hex); + Send(Packet.MakeEnvColor(type, c.R, c.G, c.B)); + } catch (Exception ex) { + Send(Packet.MakeEnvColor(type, -1, -1, -1)); } }