Added an ability to register custom item variants, not ending with "#inventory". Should allow grouping multiple item models into 1 blockstate json.

This commit is contained in:
RainWarrior 2015-12-24 06:06:38 +03:00
parent a54b939ea3
commit 097c0c6130
5 changed files with 68 additions and 12 deletions

View file

@ -36,6 +36,24 @@
}
protected List<String> func_177596_a(Item p_177596_1_)
@@ -352,7 +358,7 @@
protected ResourceLocation func_177583_a(String p_177583_1_)
{
- ResourceLocation resourcelocation = new ResourceLocation(p_177583_1_);
+ ResourceLocation resourcelocation = new ResourceLocation(p_177583_1_.replaceAll("#.*", ""));
return new ResourceLocation(resourcelocation.func_110624_b(), "item/" + resourcelocation.func_110623_a());
}
@@ -395,7 +401,7 @@
for (Entry<String, ResourceLocation> entry : this.field_177615_s.entrySet())
{
ResourceLocation resourcelocation = (ResourceLocation)entry.getValue();
- ModelResourceLocation modelresourcelocation1 = new ModelResourceLocation((String)entry.getKey(), "inventory");
+ ModelResourceLocation modelresourcelocation1 = net.minecraftforge.client.model.ModelLoader.getInventoryVariant(entry.getKey());
ModelBlock modelblock1 = (ModelBlock)this.field_177611_h.get(resourcelocation);
if (modelblock1 != null && modelblock1.func_178303_d())
@@ -453,6 +459,11 @@
private IBakedModel func_177578_a(ModelBlock p_177578_1_, ModelRotation p_177578_2_, boolean p_177578_3_)
@ -81,7 +99,7 @@
private void func_177597_h()
{
this.func_177574_i();
@@ -722,4 +738,19 @@
@@ -722,4 +738,35 @@
field_177617_q.field_178317_b = "class generation marker";
field_177616_r.field_178317_b = "block entity marker";
}
@ -90,6 +108,10 @@
+ * FML Start
+ ***********************************************************/
+ private static Map<net.minecraftforge.fml.common.registry.RegistryDelegate<Item>, Set<String>> customVariantNames = Maps.newHashMap();
+ /**
+ * @deprecated use registerItemVariants
+ */
+ @Deprecated
+ public static void addVariantName(Item item, String... names)
+ {
+ if (customVariantNames.containsKey(item.delegate))
@ -97,6 +119,18 @@
+ else
+ customVariantNames.put(item.delegate, Sets.newHashSet(names));
+ }
+
+ public static <T extends ResourceLocation> void registerItemVariants(Item item, T... names)
+ {
+ if (!customVariantNames.containsKey(item.delegate))
+ {
+ customVariantNames.put(item.delegate, Sets.<String>newHashSet());
+ }
+ for(ResourceLocation name : names)
+ {
+ customVariantNames.get(item.delegate).add(name.toString());
+ }
+ }
+ /***********************************************************
+ * FML End
+ ***********************************************************/

View file

@ -188,7 +188,7 @@ public class ModelLoader extends ModelBakery
for(String s : (List<String>)getVariantNames(item))
{
ResourceLocation file = getItemLocation(s);
ModelResourceLocation memory = new ModelResourceLocation(s, "inventory");
ModelResourceLocation memory = getInventoryVariant(s);
IModel model = null;
try
{
@ -216,7 +216,7 @@ public class ModelLoader extends ModelBakery
// empty bucket
for(String s : getVariantNames(Items.bucket))
{
ModelResourceLocation memory = new ModelResourceLocation(s, "inventory");
ModelResourceLocation memory = getInventoryVariant(s);
try
{
IModel model = getModel(new ResourceLocation("forge", "item/bucket"));
@ -247,7 +247,7 @@ public class ModelLoader extends ModelBakery
// milk bucket if no milk fluid is present
for(String s : getVariantNames(Items.milk_bucket))
{
ModelResourceLocation memory = new ModelResourceLocation(s, "inventory");
ModelResourceLocation memory = getInventoryVariant(s);
try
{
IModel model = getModel(new ResourceLocation("forge", "item/bucket_milk"));
@ -267,12 +267,21 @@ public class ModelLoader extends ModelBakery
{
for(String s : getVariantNames(item))
{
ModelResourceLocation memory = new ModelResourceLocation(s, "inventory");
ModelResourceLocation memory = getInventoryVariant(s);
IModel model = stateModels.get(ModelDynBucket.LOCATION);
stateModels.put(memory, model);
}
}
public static ModelResourceLocation getInventoryVariant(String s)
{
if(s.contains("#"))
{
return new ModelResourceLocation(s);
}
return new ModelResourceLocation(s, "inventory");
}
public IModel getModel(ResourceLocation location) throws IOException
{
if(!ModelLoaderRegistry.loaded(location)) loadAnyModel(location);
@ -855,6 +864,9 @@ public class ModelLoader extends ModelBakery
private static final Map<RegistryDelegate<Block>, IStateMapper> customStateMappers = Maps.newHashMap();
/**
* Adds a custom IBlockState -> model variant logic.
*/
public static void setCustomStateMapper(Block block, IStateMapper mapper)
{
customStateMappers.put(block.delegate, mapper);
@ -871,11 +883,20 @@ public class ModelLoader extends ModelBakery
private static final Map<RegistryDelegate<Item>, ItemMeshDefinition> customMeshDefinitions = com.google.common.collect.Maps.newHashMap();
private static final Map<Pair<RegistryDelegate<Item>, Integer>, ModelResourceLocation> customModels = com.google.common.collect.Maps.newHashMap();
/**
* Adds a simple mapping from Item + metadata to the model variant.
* Registers the variant with the ModelBakery too.
*/
public static void setCustomModelResourceLocation(Item item, int metadata, ModelResourceLocation model)
{
customModels.put(Pair.of(item.delegate, metadata), model);
ModelBakery.registerItemVariants(item, model);
}
/**
* Adds generic ItemStack -> model variant logic.
* You still need to manually call ModelBakery.registerItemVariants with all values that meshDefinition can return.
*/
public static void setCustomMeshDefinition(Item item, ItemMeshDefinition meshDefinition)
{
customMeshDefinitions.put(item.delegate, meshDefinition);

View file

@ -55,17 +55,18 @@ public class DynBucketTest
return ModelDynBucket.LOCATION;
}
});
ModelBakery.addVariantName(dynBucket, "forge:dynbucket");
ModelBakery.registerItemVariants(dynBucket, new ResourceLocation("forge", "dynbucket"));
final ModelResourceLocation bottle = new ModelResourceLocation(new ResourceLocation("forge", "dynbottle"), "inventory");
ModelLoader.setCustomMeshDefinition(dynBottle, new ItemMeshDefinition()
{
@Override
public ModelResourceLocation getModelLocation(ItemStack stack)
{
return new ModelResourceLocation(new ResourceLocation("forge", "dynbottle"), "inventory");
return bottle;
}
});
ModelBakery.addVariantName(dynBottle, "forge:dynbottle");
ModelBakery.registerItemVariants(dynBottle, bottle);
}
}

View file

@ -89,7 +89,6 @@ public class ForgeBlockStatesLoaderDebug {
Item customWallItem = Item.getItemFromBlock(blockCustomWall);
ModelLoader.setCustomModelResourceLocation(customWallItem, 0, new ModelResourceLocation(ASSETS + "cobblestone_wall", "inventory"));
ModelLoader.setCustomModelResourceLocation(customWallItem, 1, new ModelResourceLocation(ASSETS + "mossy_cobblestone_wall", "inventory"));
ModelBakery.addVariantName(customWallItem, ASSETS + "cobblestone_wall", ASSETS + "mossy_cobblestone_wall");
}
// this block is never actually used, it's only needed for the error message on load to see the variant it maps to

View file

@ -60,9 +60,10 @@ public class ModelFluidDebug
Item fluid = Item.getItemFromBlock(TestFluidBlock.instance);
Item gas = Item.getItemFromBlock(TestGasBlock.instance);
Item milk = Item.getItemFromBlock(MilkFluidBlock.instance);
ModelBakery.addVariantName(fluid);
ModelBakery.addVariantName(gas);
ModelBakery.addVariantName(milk);
// no need to pass the locations here, since they'll be loaded by the block model logic.
ModelBakery.registerItemVariants(fluid);
ModelBakery.registerItemVariants(gas);
ModelBakery.registerItemVariants(milk);
ModelLoader.setCustomMeshDefinition(fluid, new ItemMeshDefinition()
{
public ModelResourceLocation getModelLocation(ItemStack stack)