示例#1
0
        public virtual void Deserialize(Player player, string currentPattern)
        {
            // x20%1:0
            // x<weight>%<blockId>:<blockData>,<weight>%<blockId>:<blockData> .. <weight>%<blockId>:<blockData>

            if (currentPattern.StartsWith("x"))
            {
                currentPattern = currentPattern.Remove(0, 1);                                             // remove starting x
            }
            OriginalPattern = currentPattern;

            var patterns = currentPattern.Split(',');

            foreach (var pattern in patterns)
            {
                var blockInfos = pattern.Split(':');

                int  id;
                byte metadata = 0;
                int  weight   = 100;

                var weightedIn = blockInfos[0].Split('%');
                if (weightedIn.Length == 2)
                {
                    if (!int.TryParse(weightedIn[0], out weight))
                    {
                        weight = 100;
                    }
                }

                string binfo = weightedIn[weightedIn.Length - 1];
                if (!int.TryParse(binfo, out id))
                {
                    id = BlockFactory.GetBlockIdByName(binfo);
                }

                if (blockInfos.Length == 2)
                {
                    byte.TryParse(blockInfos[1], out metadata);
                }

                Log.Debug($"Parsed x{weight}%{id}:{metadata}");
                _blockList.Add(new BlockDataEntry()
                {
                    Id       = id,
                    Metadata = metadata,
                    Weight   = weight
                });
            }

            int acc = 0;

            foreach (var entry in _blockList.OrderBy(entry => entry.Weight))
            {
                acc += entry.Weight;
                entry.Accumulated = acc;
            }

            _blockList = _blockList.OrderBy(entry => entry.Accumulated).ToList();
        }
示例#2
0
        public static short GetItemIdByName(string itemName)
        {
            itemName = itemName.ToLowerInvariant();
            itemName = itemName.Replace("_", "");

            if (NameToId.ContainsKey(itemName))
            {
                return(NameToId[itemName]);
            }

            return(BlockFactory.GetBlockIdByName(itemName));
        }
示例#3
0
        public virtual void Deserialize(Player player, string input)
        {
            Level = player.Level;

            // x1:0,air,log:12
            // x<blockId>:<blockData>,<blockId>:<blockData>, .. <blockId>:<blockData>

            // TODO: !, #existing, #region, <, >,

            if (input.StartsWith("x"))
            {
                input = input.Remove(0, 1);                                    // remove starting x
            }
            var patterns = input.Split(',');

            foreach (var pattern in patterns)
            {
                var blockInfos = pattern.Split(':');

                var dataEntry = new BlockDataEntry();

                byte id;

                string binfo = blockInfos[0];
                if (!byte.TryParse(binfo, out id))
                {
                    id = BlockFactory.GetBlockIdByName(binfo);
                }

                dataEntry.Id = id;

                if (blockInfos.Length == 2)
                {
                    byte metadata;

                    byte.TryParse(blockInfos[1], out metadata);
                    dataEntry.Metadata       = metadata;
                    dataEntry.IgnoreMetadata = false;
                }

                _blockList.Add(dataEntry);
            }
        }
示例#4
0
        public void Sphere(Player player, int radiusX, int radiusY = 0, int radiusZ = 0, BlockTypeEnum tileName = null, int tileData = 0, bool filled = true)
        {
            if (tileName == null)
            {
                tileName = new BlockTypeEnum {
                    Value = "stone"
                }
            }
            ;
            if (radiusY == 0)
            {
                radiusY = radiusX;
            }
            if (radiusZ == 0)
            {
                radiusZ = radiusX;
            }

            var id = BlockFactory.GetBlockIdByName(tileName.Value);

            var pattern = new Pattern(id, tileData);

            EditSession.MakeSphere((BlockCoordinates)player.KnownPosition, pattern, radiusX, radiusY, radiusZ, filled);
        }
示例#5
0
        public override void HandleMcpeStartGame(McpeStartGame message)
        {
            Client.EntityId        = message.runtimeEntityId;
            Client.NetworkEntityId = message.entityIdSelf;
            Client.SpawnPoint      = message.spawn;
            Client.CurrentLocation = new PlayerLocation(Client.SpawnPoint, message.rotation.X, message.rotation.X, message.rotation.Y);

            Log.Warn($"Got position from startgame packet: {Client.CurrentLocation}");

            string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt";

            using (FileStream file = File.OpenWrite(fileName))
            {
                Log.Warn($"Writing new blocks to filename:\n{fileName}");

                var legacyIdMap = new Dictionary <string, int>();
                var assembly    = Assembly.GetAssembly(typeof(Block));
                using (Stream stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".legacy_id_map.json"))
                    using (var reader = new StreamReader(stream))
                    {
                        var result = JObject.Parse(reader.ReadToEnd());

                        foreach (var obj in result)
                        {
                            legacyIdMap.Add(obj.Key, (int)obj.Value);
                        }
                    }

                var writer = new IndentedTextWriter(new StreamWriter(file));

                writer.WriteLine($"namespace MiNET.Blocks");
                writer.WriteLine($"{{");
                writer.Indent++;

                var blocks = new List <(int, string)>();

                foreach (IGrouping <string, BlockRecord> blockstate in message.blockPallet.OrderBy(record => record.Name).ThenBy(record => record.Data).GroupBy(record => record.Name))
                {
                    var enumerator = blockstate.GetEnumerator();
                    enumerator.MoveNext();
                    var value = enumerator.Current;
                    if (value == null)
                    {
                        continue;
                    }
                    Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}");
                    int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", ""));

                    if (id == 0 && !value.Name.Contains("air"))
                    {
                        if (legacyIdMap.TryGetValue(value.Name, out id))
                        {
                            value.Id = id;
                        }

                        string blockName = Client.CodeName(value.Name.Replace("minecraft:", ""), true);

                        blocks.Add((value.Id, blockName));

                        writer.WriteLine($"public class {blockName}: Block");
                        writer.WriteLine($"{{");
                        writer.Indent++;

                        writer.WriteLine($"public {blockName}() : base({value.Id})");
                        writer.WriteLine($"{{");
                        writer.Indent++;
                        writer.WriteLine($"Name = \"{value.Name}\";");

                        do
                        {
                            writer.WriteLine($"// runtime id: {enumerator.Current.RuntimeId} 0x{enumerator.Current.RuntimeId:X}, data: {enumerator.Current.Data}");
                        } while (enumerator.MoveNext());

                        writer.Indent--;
                        writer.WriteLine($"}}");

                        writer.Indent--;
                        writer.WriteLine($"}}");
                    }
                }
                writer.Indent--;
                writer.WriteLine($"}}");

                foreach (var block in blocks.OrderBy(tuple => tuple.Item1))
                {
                    writer.WriteLine($"else if (blockId == {block.Item1}) block = new {block.Item2}();");
                }

                writer.Flush();
            }

            //			Log.Debug($@"
            //StartGame:
            //	entityId: {message.entityIdSelf}
            //	runtimeEntityId: {message.runtimeEntityId}
            //	spawn: {message.spawn}
            //	unknown1: {message.unknown1}
            //	dimension: {message.dimension}
            //	generator: {message.generator}
            //	gamemode: {message.gamemode}
            //	difficulty: {message.difficulty}
            //	hasAchievementsDisabled: {message.hasAchievementsDisabled}
            //	dayCycleStopTime: {message.dayCycleStopTime}
            //	eduMode: {message.eduMode}
            //	rainLevel: {message.rainLevel}
            //	lightnigLevel: {message.lightnigLevel}
            //	enableCommands: {message.enableCommands}
            //	isTexturepacksRequired: {message.isTexturepacksRequired}
            //	secret: {message.levelId}
            //	worldName: {message.worldName}
            //");

            LogGamerules(message.gamerules);


            Client.LevelInfo.LevelName = "Default";
            Client.LevelInfo.Version   = 19133;
            Client.LevelInfo.GameType  = message.gamemode;

            //ClientUtils.SaveLevel(_level);

            {
                var packet = McpeRequestChunkRadius.CreateObject();
                Client.ChunkRadius = 5;
                packet.chunkRadius = Client.ChunkRadius;

                Client.SendPacket(packet);
            }
        }
示例#6
0
        public void GenerateClassesForBlocks()
        {
            Dictionary <int, Blockstate> blockstates = new Dictionary <int, Blockstate>();

            var assembly    = Assembly.GetAssembly(typeof(Block));
            var legacyIdMap = new Dictionary <string, int>();

            using (Stream stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".legacy_id_map.json"))
                using (StreamReader reader = new StreamReader(stream))
                {
                    var result = JObject.Parse(reader.ReadToEnd());

                    foreach (var obj in result)
                    {
                        legacyIdMap.Add(obj.Key, (int)obj.Value);
                    }
                }

            using (Stream stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".blockstates.json"))
                using (StreamReader reader = new StreamReader(stream))
                {
                    dynamic jsonBlockstates = JArray.Parse(reader.ReadToEnd());

                    int runtimeId = 0;
                    foreach (var obj in jsonBlockstates)
                    {
                        try
                        {
                            var name = (string)obj.name;
                            if (legacyIdMap.TryGetValue(name, out var id))
                            {
                                blockstates.Add(runtimeId, new Blockstate()
                                {
                                    Id = id, Data = (short)obj.data, Name = (string)obj.name, RuntimeId = runtimeId
                                });
                                runtimeId++;
                            }
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine($"{obj}");
                            throw;
                        }
                    }
                }


            List <(int, string)> blocks = new List <(int, string)>();

            string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt";

            using (FileStream file = File.OpenWrite(fileName))
            {
                Log.Warn($"Writing new blocks to filename:\n{fileName}");

                IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(file));

                writer.WriteLine($"namespace MiNET.Blocks");
                writer.WriteLine($"{{");
                writer.Indent++;


                foreach (IGrouping <string, KeyValuePair <int, Blockstate> > blockstate in blockstates.OrderBy(kvp => kvp.Value.Name).ThenBy(kvp => kvp.Value.Data).GroupBy(kvp => kvp.Value.Name))
                {
                    var enumerator = blockstate.GetEnumerator();
                    enumerator.MoveNext();
                    var value = enumerator.Current.Value;
                    if (value == null)
                    {
                        continue;
                    }
                    Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}");
                    int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", ""));

                    if (id == 0 && !value.Name.Contains("air"))
                    {
                        string blockName = CodeName(value.Name.Replace("minecraft:", ""), true);

                        blocks.Add((value.Id, blockName));

                        writer.WriteLine($"public class {blockName}: Block");
                        writer.WriteLine($"{{");
                        writer.Indent++;

                        writer.WriteLine($"public {blockName}() : base({value.Id})");
                        writer.WriteLine($"{{");
                        writer.Indent++;

                        writer.WriteLine($"Name = \"{value.Name}\";");

                        do
                        {
                            writer.WriteLine($"// runtime id: {enumerator.Current.Value.RuntimeId} 0x{enumerator.Current.Value.RuntimeId:X}, data: {enumerator.Current.Value.Data}");
                        } while (enumerator.MoveNext());

                        writer.Indent--;
                        writer.WriteLine($"}}");

                        writer.Indent--;
                        writer.WriteLine($"}}");
                    }
                }
                writer.Indent--;
                writer.WriteLine($"}}");

                foreach (var block in blocks.OrderBy(tuple => tuple.Item1))
                {
                    writer.WriteLine($"else if (blockId == {block.Item1}) block = new {block.Item2}();");
                }

                writer.Flush();
            }
        }
示例#7
0
        public override void HandleMcpeStartGame(McpeStartGame message)
        {
            Client.EntityId        = message.runtimeEntityId;
            Client.NetworkEntityId = message.entityIdSelf;
            Client.SpawnPoint      = message.spawn;
            Client.CurrentLocation = new PlayerLocation(Client.SpawnPoint, message.unknown1.X, message.unknown1.X, message.unknown1.Y);

            Log.Warn($"Got position from startgame packet: {Client.CurrentLocation}");

            string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt";

            using (FileStream file = File.OpenWrite(fileName))
            {
                Log.Warn($"Writing new blocks to filename:\n{fileName}");

                IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(file));

                writer.WriteLine($"namespace MiNET.Blocks");
                writer.WriteLine($"{{");
                writer.Indent++;

                foreach (IGrouping <string, KeyValuePair <int, Blockstate> > blockstate in message.blockstates.OrderBy(kvp => kvp.Value.Name).ThenBy(kvp => kvp.Value.Data).GroupBy(kvp => kvp.Value.Name))
                {
                    var enumerator = blockstate.GetEnumerator();
                    enumerator.MoveNext();
                    var value = enumerator.Current.Value;
                    if (value == null)
                    {
                        continue;
                    }
                    Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}");
                    int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", ""));

                    if (id == 0 && !value.Name.Contains("air"))
                    {
                        string blockName = Client.CodeName(value.Name.Replace("minecraft:", ""), true);

                        writer.WriteLine($"public class {blockName}: Block");
                        writer.WriteLine($"{{");
                        writer.Indent++;

                        writer.WriteLine($"public {blockName}() : base({value.Id}, {value.RuntimeId})");
                        writer.WriteLine($"{{");
                        writer.Indent++;
                        writer.WriteLine($"Name {{get; set;}} = {value.Name}");

                        do
                        {
                            writer.WriteLine($"// runtime id: {enumerator.Current.Value.RuntimeId} 0x{enumerator.Current.Value.RuntimeId:X}, data: {enumerator.Current.Value.Data}");
                        } while (enumerator.MoveNext());

                        writer.Indent--;
                        writer.WriteLine($"}}");

                        writer.Indent--;
                        writer.WriteLine($"}}");
                    }
                }
                writer.Indent--;
                writer.WriteLine($"}}");
                writer.Flush();
            }

            //			Log.Debug($@"
            //StartGame:
            //	entityId: {message.entityIdSelf}
            //	runtimeEntityId: {message.runtimeEntityId}
            //	spawn: {message.spawn}
            //	unknown1: {message.unknown1}
            //	dimension: {message.dimension}
            //	generator: {message.generator}
            //	gamemode: {message.gamemode}
            //	difficulty: {message.difficulty}
            //	hasAchievementsDisabled: {message.hasAchievementsDisabled}
            //	dayCycleStopTime: {message.dayCycleStopTime}
            //	eduMode: {message.eduMode}
            //	rainLevel: {message.rainLevel}
            //	lightnigLevel: {message.lightnigLevel}
            //	enableCommands: {message.enableCommands}
            //	isTexturepacksRequired: {message.isTexturepacksRequired}
            //	secret: {message.levelId}
            //	worldName: {message.worldName}
            //");

            Client.LevelInfo.LevelName = "Default";
            Client.LevelInfo.Version   = 19133;
            Client.LevelInfo.GameType  = message.gamemode;

            //ClientUtils.SaveLevel(_level);

            {
                var packet = McpeRequestChunkRadius.CreateObject();
                Client.ChunkRadius = 5;
                packet.chunkRadius = Client.ChunkRadius;

                Client.SendPacket(packet);
            }
        }
示例#8
0
        public virtual void Deserialize(Player player, string currentPattern)
        {
            // See documentation: https://worldedit.enginehub.org/en/latest/usage/general/patterns/

            if (currentPattern.StartsWith("x"))
            {
                currentPattern = currentPattern.Remove(0, 1);                                             // remove starting x
            }
            OriginalPattern = currentPattern.Trim();

            var patternsEx = new Regex(@",(?![^\[]*])");

            foreach (string pattern in patternsEx.Split(currentPattern.Trim()))
            {
                Log.Debug($"Matching {pattern}");
                var blockDataEntry = new BlockDataEntry();

                var regex   = new Regex(@"(?<pattern>((?<weight>\d+)%)?((?<blockId>\d+)|(?<blockName>(minecraft:)?\w+)){1}(:(?<meta>\d+))?(\[(?<states>[a-zA-Z0-9_=,]*)])?)*");
                var stateEx = new Regex(@"(?<name>\w+)\=(?<value>\w+)");

                Match match = regex.Match(pattern.Trim());
                if (match.Success)
                {
                    foreach (Group matchGroup in match.Groups)
                    {
                        if (matchGroup.Name == "weight" && matchGroup.Success)
                        {
                            Log.Debug($"Matched weight group {matchGroup.Value}");
                            if (int.TryParse(matchGroup.Value.Trim(), out int weight))
                            {
                                blockDataEntry.Weight = weight;
                            }
                        }
                        else if (matchGroup.Name == "blockName" && matchGroup.Success)
                        {
                            Log.Debug($"Matched blockName group {matchGroup.Value}");
                            blockDataEntry.Id = BlockFactory.GetBlockIdByName(matchGroup.Value.Trim());
                        }
                        if (matchGroup.Name == "blockId" && matchGroup.Success)
                        {
                            Log.Debug($"Matched blockId group {matchGroup.Value}");
                            if (int.TryParse(matchGroup.Value.Trim(), out int id))
                            {
                                blockDataEntry.Id = id;
                            }
                        }
                        else if (matchGroup.Name == "meta" && matchGroup.Success)
                        {
                            Log.Debug($"Matched meta group {matchGroup.Value}");
                            if (byte.TryParse(matchGroup.Value.Trim(), out byte metadata))
                            {
                                blockDataEntry.Metadata       = metadata;
                                blockDataEntry.HasBlockStates = true;
                            }
                        }
                        else if (matchGroup.Name == "states" && matchGroup.Success)
                        {
                            Log.Debug($"Matched states group {matchGroup.Value}");

                            // Parse block states
                            var stateMatches = stateEx.Matches(matchGroup.Value.Trim());
                            {
                                foreach (Match stateMatch in stateMatches)
                                {
                                    Log.Debug($"State:{stateMatch.Value}");
                                    blockDataEntry.BlockStates.Add(new BlockStateEntry()
                                    {
                                        Name  = stateMatch.Groups.Values.First(g => g.Name == "name").Value,
                                        Value = stateMatch.Groups.Values.First(g => g.Name == "value").Value
                                    });
                                    blockDataEntry.HasBlockStates = true;
                                }
                            }
                        }
                    }
                }
                else
                {
                    throw new Exception("Deprecated code used to be here.");
                }

                BlockList.Add(blockDataEntry);
            }

            int acc = 0;

            foreach (var entry in BlockList.OrderBy(entry => entry.Weight))
            {
                acc += entry.Weight;
                entry.Accumulated = acc;
            }

            BlockList = BlockList.OrderBy(entry => entry.Accumulated).ToList();
        }
示例#9
0
        public void Line(Player player, BlockTypeEnum tileName, int tileData = 0, int thickness = 1, bool shell = false)
        {
            var id = BlockFactory.GetBlockIdByName(tileName.Value);

            Line(player, id, tileData, thickness, shell);
        }
示例#10
0
        public void SetBlock(Player player, BlockTypeEnum tileName, int tileData = 0)
        {
            var id = BlockFactory.GetBlockIdByName(tileName.Value);

            Set(player, id, tileData);
        }
示例#11
0
        public void GenerateClassesForBlocks()
        {
            BlockPallet pallet = null;

            var assembly = Assembly.GetAssembly(typeof(Block));

            using (var stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".blockstates.json"))
                using (var reader = new StreamReader(stream))
                {
                    pallet = BlockPallet.FromJson(reader.ReadToEnd());
                }

            List <(int, string)> blocks = new List <(int, string)>();

            string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt";

            using (FileStream file = File.OpenWrite(fileName))
            {
                Log.Warn($"Writing new blocks to filename:\n{fileName}");

                IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(file));

                writer.WriteLine($"namespace MiNET.Blocks");
                writer.WriteLine($"{{");
                writer.Indent++;


                foreach (IGrouping <string, BlockRecord> blockstate in pallet.OrderBy(r => r.Name).ThenBy(r => r.Data).GroupBy(r => r.Name))
                {
                    var enumerator = blockstate.GetEnumerator();
                    enumerator.MoveNext();
                    var value = enumerator.Current;
                    if (value == null)
                    {
                        continue;
                    }
                    Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}");
                    int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", ""));

                    if (id == 0 && !value.Name.Contains("air"))
                    {
                        string blockName = CodeName(value.Name.Replace("minecraft:", ""), true);

                        blocks.Add((value.Id, blockName));

                        writer.WriteLine($"public class {blockName}: Block");
                        writer.WriteLine($"{{");
                        writer.Indent++;

                        writer.WriteLine($"public {blockName}() : base({value.Id})");
                        writer.WriteLine($"{{");
                        writer.Indent++;

                        writer.WriteLine($"Name = \"{value.Name}\";");

                        do
                        {
                            writer.WriteLine($"// runtime id: {enumerator.Current.RuntimeId} 0x{enumerator.Current.RuntimeId:X}, data: {enumerator.Current.Data}");
                        } while (enumerator.MoveNext());

                        writer.Indent--;
                        writer.WriteLine($"}}");

                        writer.Indent--;
                        writer.WriteLine($"}}");
                    }
                }
                writer.Indent--;
                writer.WriteLine($"}}");

                foreach (var block in blocks.OrderBy(tuple => tuple.Item1))
                {
                    writer.WriteLine($"else if (blockId == {block.Item1}) block = new {block.Item2}();");
                }

                writer.Flush();
            }
        }
示例#12
0
        public virtual void Deserialize(Player player, string input)
        {
            Level = player.Level;

            // x1:0,air,log:12
            // x<blockId>:<blockData>,<blockId>:<blockData>, .. <blockId>:<blockData>

            // TODO: !, #existing, #region, <, >,

            if (input.StartsWith("x"))
            {
                input = input.Remove(0, 1);                                    // remove starting x
            }
            OriginalMask = input;

            string[] inputs = input.Split(' ');

            _masks = new MaskEntry[inputs.Length];
            for (int i = 0; i < inputs.Length; i++)
            {
                MaskEntry entry = new MaskEntry();
                _masks[i] = entry;

                string currentPattern = inputs[i];

                if (currentPattern.StartsWith(">"))                 // Only place above certain blocks
                {
                    entry.AboveOnly = true;
                    currentPattern  = currentPattern.Remove(0, 1);       // remove starting x
                }
                else if (currentPattern.StartsWith("<"))                 // Only place below certain blocks
                {
                    entry.BelowOnly = true;
                    currentPattern  = currentPattern.Remove(0, 1);       // remove starting x
                }
                else if (currentPattern.StartsWith("!"))                 // Only place if NOT certain blocks
                {
                    entry.Inverted = true;
                    currentPattern = currentPattern.Remove(0, 1);                     // remove starting x
                }

                var patterns = currentPattern.Split(',');

                foreach (var pattern in patterns)
                {
                    var blockInfos = pattern.Split(':');

                    var dataEntry = new BlockDataEntry();

                    byte id;

                    string binfo = blockInfos[0];
                    if (!byte.TryParse(binfo, out id))
                    {
                        id = BlockFactory.GetBlockIdByName(binfo);
                    }

                    dataEntry.Id = id;

                    if (blockInfos.Length == 2)
                    {
                        byte metadata;

                        byte.TryParse(blockInfos[1], out metadata);
                        dataEntry.Metadata       = metadata;
                        dataEntry.IgnoreMetadata = false;
                    }

                    entry.BlockList.Add(dataEntry);
                }
            }
        }