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); }
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); }
public ItemModelRenderer(ResourcePackItem model, McResourcePack resourcePack) { Model = model; Cache(resourcePack); }