private static BlockModel ResolveModel(ResourceManager resources, McResourcePack resourcePack, BlockState state) { string name = state.Name; if (string.IsNullOrWhiteSpace(name)) { Log.Warn($"State name is null!"); return(null); } if (name.Contains("water")) { return(new LiquidBlockModel() { // IsFlowing = false, IsLava = false, // Level = state.GetTypedValue(Water.LEVEL) }); } if (name.Contains("lava")) { return(new LiquidBlockModel() { // IsFlowing = false, IsLava = true, // Level = state.GetTypedValue(Water.LEVEL) });; } BlockStateResource blockStateResource; if (resourcePack.BlockStates.TryGetValue(name, out blockStateResource)) { if (blockStateResource != null && blockStateResource.Parts != null && blockStateResource.Parts.Length > 0 && blockStateResource.Parts.All(x => x.Apply.All(b => b.Model != null))) { var models = MultiPartModels.GetModels(state, blockStateResource); state.MultiPartHelper = blockStateResource; state.IsMultiPart = true; state.AppliedModels = models.Select(x => x.ModelName).ToArray(); return(new ResourcePackBlockModel(resources, models)); } if (blockStateResource?.Variants == null || blockStateResource.Variants.Count == 0) { return(null); } if (blockStateResource.Variants.Count == 1) { var v = blockStateResource.Variants.FirstOrDefault(); if (v.Value == null) { return(null); } var models = v.Value.Where(x => x.Model?.Elements != null && x.Model.Elements.Length > 0).ToArray(); if (models.Length == 0) { return(null); } return(new ResourcePackBlockModel(resources, models, v.Value.ToArray().Length > 1)); } BlockStateVariant blockStateVariant = null; var data = state.ToDictionary(); // data.Remove("waterlogged"); int closestMatch = 0; KeyValuePair <string, BlockStateVariant> closest = default(KeyValuePair <string, BlockStateVariant>); foreach (var v in blockStateResource.Variants) { int matches = 0; var variantBlockState = Blocks.State.BlockState.FromString(v.Key); foreach (var kv in data) { if (variantBlockState.TryGetValue(kv.Key, out string vValue)) { if (vValue.Equals(kv.Value, StringComparison.InvariantCultureIgnoreCase)) { matches++; } else { break; } } else { break; } } if (matches > closestMatch) { closestMatch = matches; closest = v; if (matches == data.Count) { break; } } } blockStateVariant = closest.Value; if (blockStateVariant == null) { var a = blockStateResource.Variants.FirstOrDefault(); blockStateVariant = a.Value; } var asArray = blockStateVariant.ToArray(); if (asArray.Length == 0 || asArray.Any(x => x.Model?.Elements == null || x.Model.Elements.Length == 0)) { return(null); } return(new ResourcePackBlockModel(resources, asArray, asArray.Length > 1)); } return(null); }