private void ExecutePickBlocks(BedrockTraceHandler caller)
        {
            var client = caller.Client;
            int count  = 500;
            int yStart = 100;
            int x      = 0;
            int z      = 0;


            string fileName = Path.GetTempPath() + "pick_items_" + Guid.NewGuid() + ".json";
            var    writer   = File.AppendText(fileName);

            var jsonSerializerSettings = new JsonSerializerSettings
            {
                PreserveReferencesHandling = PreserveReferencesHandling.None,
                Formatting = Formatting.None,
            };

            jsonSerializerSettings.Converters.Add(new NbtIntConverter());
            jsonSerializerSettings.Converters.Add(new NbtStringConverter());

            //BlockPalette palette = client.BlockPalette;
            BlockPalette palette = BlockFactory.BlockPalette;             // only if we have updated it

            _resetEventPlayerHotbar.Reset();

            for (int id = 0; id < count; id++)
            {
                try
                {
                    {
                        var request = new McpeCommandRequest();
                        request.command     = $"/tp TheGrey {x} {150} {z}";
                        request.unknownUuid = new UUID(Guid.NewGuid().ToString());
                        client.SendPacket(request);
                    }

                    var block = BlockFactory.GetBlockById(id);
                    if (block.GetType() == typeof(Block))
                    {
                        continue;
                    }

                    if (block is Cocoa)
                    {
                        continue;                         // crashes on meta=15
                    }
                    int y = yStart;
                    for (int meta = 0; meta <= 15; meta++)
                    {
                        var blockstate = palette.FirstOrDefault(b => b.Id == id && b.Data == meta);
                        if (blockstate == null)
                        {
                            continue;
                        }
                        blockstate.ItemInstance = null;                         // reset to nothing

                        string name = blockstate.Name.Replace("minecraft:", "");
                        if (name == "double_plant" || name == "air" || name.StartsWith("element"))
                        {
                            break;
                        }

                        var pick = McpeBlockPickRequest.CreateObject();
                        pick.x = x;
                        pick.y = y;
                        pick.z = z;
                        client.SendPacket(pick);

                        //Thread.Sleep(100);
                        if (!_resetEventPlayerHotbar.WaitOne(300))
                        {
                            Log.Error($"No picked item for {id}, {meta}, {name}");
                            _lastSelectedItem = new ItemAir();
                            continue;
                            //break;
                        }

                        // Investigate last selected item. This should be the one we picked
                        Item item;
                        lock (_lastSelectedItem)
                        {
                            item = _lastSelectedItem;
                            _lastSelectedItem = new ItemAir();
                        }
                        Log.Warn($"For {id}, {meta} we picked {item}");
                        blockstate.ItemInstance = new ItemPickInstance()
                        {
                            Id       = item.Id,
                            Metadata = item.Metadata,
                            WantNbt  = item.ExtraData != null
                        };
                        string result = JsonConvert.SerializeObject(blockstate, jsonSerializerSettings);
                        writer.WriteLine($"{item}; {result}");
                        writer.Flush();

                        if (blockstate.States.Count == 0)
                        {
                            break;
                        }

                        y += 2;
                    }
                }
                finally
                {
                    x += 2;
                }
            }

            writer.Close();

            WritePaletteToJson(palette);
            Log.Warn("Finished!");
        }
Example #2
0
 public void HandleMcpeBlockPickRequest(McpeBlockPickRequest message)
 {
 }
 public void HandleMcpeBlockPickRequest(McpeBlockPickRequest message)
 {
     WritePackage(message);
 }