Beispiel #1
0
        private ResourcePackItem ProcessItem(ResourcePackItem model, ref Dictionary <string, ResourcePackItem> models)
        {
            string key = $"{model.Namespace}:{model.Name}";

            if (!string.IsNullOrWhiteSpace(model.ParentName) && !model.ParentName.Equals(model.Name, StringComparison.InvariantCultureIgnoreCase))
            {
                if (!model.ParentName.StartsWith("builtin/", StringComparison.InvariantCultureIgnoreCase))
                {
                    string parentKey = $"{model.Namespace}:{model.ParentName}";

                    ResourcePackItem parent;
                    if (!_itemModels.TryGetValue(parentKey, out parent))
                    {
                        if (models.TryGetValue(parentKey, out parent))
                        {
                            parent = ProcessItem(parent, ref models);
                        }
                    }

                    if (parent != null)
                    {
                        model.Parent = parent;

                        if (model.Elements.Length == 0 && parent.Elements.Length > 0)
                        {
                            model.Elements = (BlockModelElement[])parent.Elements.Clone();
                        }

                        foreach (var kvp in parent.Textures)
                        {
                            if (!model.Textures.ContainsKey(kvp.Key))
                            {
                                model.Textures.Add(kvp.Key, kvp.Value);
                            }
                        }

                        foreach (var kvp in parent.Display)
                        {
                            if (!model.Display.ContainsKey(kvp.Key))
                            {
                                model.Display.Add(kvp.Key, kvp.Value);
                            }
                        }
                    }
                }
            }

            _itemModels.Add(key, model);

            return(model);
        }
Beispiel #2
0
        public static void Init(IRegistryManager registryManager, ResourceManager resources, McResourcePack resourcePack, IProgressReceiver progressReceiver = null)
        {
            ResourceManager = resources;
            ResourcePack    = resourcePack;

            var otherRaw = ResourceManager.ReadStringResource("Alex.Resources.items3.json");

            SecItemEntries = JsonConvert.DeserializeObject <SecondItemEntry[]>(otherRaw);

            var raw = ResourceManager.ReadStringResource("Alex.Resources.items2.json");

            ItemEntries = JsonConvert.DeserializeObject <ItemEntry[]>(raw);


            var ii     = resources.Registries.Items.Entries;
            var blocks = resources.Registries.Blocks.Entries;

            LoadModels();

            ConcurrentDictionary <ResourceLocation, Func <Item> > items = new ConcurrentDictionary <ResourceLocation, Func <Item> >();

            // for(int i = 0; i < blocks.Count; i++)
            int done = 0;

            Parallel.ForEach(
                blocks, e =>
            {
                try
                {
                    var entry = e;
                    progressReceiver?.UpdateProgress(done, blocks.Count, $"Processing block items...", entry.Key);

                    Item item;

                    /*if (blockRegistry.TryGet(entry.Key, out var blockState))
                     * {
                     *      item = new ItemBlock(blockState.Value);
                     * }*/
                    var bs = BlockFactory.GetBlockState(entry.Key);

                    if (!(bs.Block is Air))
                    {
                        item = new ItemBlock(bs);
                        //  Log.Info($"Registered block item: {entry.Key}");
                    }
                    else
                    {
                        return;
                    }

                    var minetItem = MiNET.Items.ItemFactory.GetItem(entry.Key.Replace("minecraft:", ""));

                    if (minetItem != null)
                    {
                        if (Enum.TryParse <ItemType>(minetItem.ItemType.ToString(), out ItemType t))
                        {
                            item.ItemType = t;
                        }

                        SetItemMaterial(item, minetItem.ItemMaterial);
                        // item.Material = minetItem.ItemMaterial;

                        item.Meta = minetItem.Metadata;
                        item.Id   = minetItem.Id;
                    }

                    item.Name        = entry.Key;
                    item.DisplayName = entry.Key;

                    var data = ItemEntries.FirstOrDefault(
                        x => x.name.Equals(entry.Key.Substring(10), StringComparison.InvariantCultureIgnoreCase));

                    if (data != null)
                    {
                        item.MaxStackSize = data.stackSize;
                        item.DisplayName  = data.displayName;
                    }

                    string ns   = ResourceLocation.DefaultNamespace;
                    string path = entry.Key;

                    if (entry.Key.Contains(':'))
                    {
                        var index = entry.Key.IndexOf(':');
                        ns        = entry.Key.Substring(0, index);
                        path      = entry.Key.Substring(index + 1);
                    }

                    var key = new ResourceLocation(ns, $"block/{path}");

                    ResourcePackModelBase model = null;

                    if (!(ResourcePack.ItemModels.TryGetValue(key, out model)) &&
                        !(ResourcePack.BlockModels.TryGetValue(key, out model)))
                    {
                        foreach (var it in ResourcePack.ItemModels)
                        {
                            if (it.Key.Path.Equals(key.Path, StringComparison.InvariantCultureIgnoreCase))
                            {
                                model = it.Value;

                                break;
                            }
                        }
                    }

                    if (model == null)
                    {
                        Log.Debug($"Missing item render definition for block {entry.Key}, using default.");
                        model = new ResourcePackItem()
                        {
                            Display = _defaultDisplayElements
                        };
                    }

                    item.Renderer = new ItemBlockModelRenderer(bs, model, resources);
                    item.Renderer.Cache(resourcePack);

                    items.TryAdd(entry.Key, () => { return(item.Clone()); });
                }
                finally
                {
                    done++;
                }
            });

            for (int i = 0; i < ii.Count; i++)
            {
                var entry = ii.ElementAt(i);
                progressReceiver?.UpdateProgress(i, ii.Count, $"Processing items...", entry.Key);

                Item item;

                /*if (blockRegistry.TryGet(entry.Key, out var blockState))
                 * {
                 *      item = new ItemBlock(blockState.Value);
                 * }*/
                /*   if (blocks.ContainsKey(entry.Key) && blockRegistry.TryGet(entry.Key, out var registryEntry))
                 * {
                 *         item = new ItemBlock(registryEntry.Value);
                 * }
                 * else
                 * {*/
                item = new Item();
                // }

                var minetItem = MiNET.Items.ItemFactory.GetItem(entry.Key.Replace("minecraft:", ""));
                if (minetItem != null)
                {
                    if (Enum.TryParse <ItemType>(minetItem.ItemType.ToString(), out ItemType t))
                    {
                        item.ItemType = t;
                    }

                    SetItemMaterial(item, minetItem.ItemMaterial);

                    // item.Material = minetItem.ItemMaterial;
                    item.Meta = minetItem.Metadata;
                    item.Id   = minetItem.Id;
                }

                item.Name        = entry.Key;
                item.DisplayName = entry.Key;

                var data = ItemEntries.FirstOrDefault(x =>
                                                      x.name.Equals(entry.Key.Substring(10), StringComparison.InvariantCultureIgnoreCase));
                if (data != null)
                {
                    item.MaxStackSize = data.stackSize;
                    item.DisplayName  = data.displayName;
                }

                string ns   = ResourceLocation.DefaultNamespace;
                string path = entry.Key;
                if (entry.Key.Contains(':'))
                {
                    var index = entry.Key.IndexOf(':');
                    ns   = entry.Key.Substring(0, index);
                    path = entry.Key.Substring(index + 1);
                }

                var key = new ResourceLocation(ns, $"item/{path}");

                foreach (var it in ResourcePack.ItemModels)
                {
                    if (it.Key.Path.Equals(key.Path, StringComparison.InvariantCultureIgnoreCase))
                    {
                        //Log.Info($"Model found: {entry.Key} = {it.Key}");
                        ItemModelRenderer renderer;
                        if (ItemRenderers.TryGetValue(it.Key, out renderer))
                        {
                        }
                        else if (ItemRenderers.TryGetValue(key, out renderer))

                        {
                        }

                        if (renderer != null)
                        {
                            //Log.Debug($"Found renderer for {entry.Key}, textures: {it.Value.Textures.Count}");
                            item.Renderer = renderer;
                            break;
                        }
                    }
                }

                if (item.Renderer == null)
                {
                    Log.Warn($"Could not find item model renderer for: {key.ToString()}");
                }

                items.TryAdd(key, () => { return(item.Clone()); });
            }

            Items = new ReadOnlyDictionary <ResourceLocation, Func <Item> >(items);
        }
Beispiel #3
0
 public ItemModelRenderer(ResourcePackItem model, McResourcePack resourcePack)
 {
     Model = model;
     Cache(resourcePack);
 }