Jump to content

Connected Textures - Missing Resource Manager [1.11.2] [SOLVED]


Recommended Posts

Posted (edited)

I have been trying to create a machine which has connected textures. I believe the best way to achieve this is to use forge's extended blockstate. I based my code off https://github.com/TheGreyGhost/MinecraftByExample/tree/1-10-2final/src/main/java/minecraftbyexample/mbe05_block_dynamic_block_model2 .

Currently I have it so that my block has two IBakedModels it uses. A core which holds the core image and the border. I plan on adding the border to a side where there is no block touching. Unfortunately, while trying to do this, forge gives me an error saying I am missing a texture which I know I have. Currently I'm just trying to use a custom model loader to render my core model, nothing else to get started.

 

Console Log:

2017-02-28 18:43:45,713 WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
2017-02-28 18:43:45,715 WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
[18:43:45] [main/INFO] [GradleStart]: Extra: []
[18:43:45] [main/INFO] [GradleStart]: Running with arguments: [--userProperties, {}, --assetsDir, C:/Users/Callum/.gradle/caches/minecraft/assets, --assetIndex, 1.11, --accessToken{REDACTED}, --version, 1.11.2, --tweakClass, net.minecraftforge.fml.common.launcher.FMLTweaker, --tweakClass, net.minecraftforge.gradle.tweakers.CoremodTweaker]
[18:43:45] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
[18:43:46] [main/INFO] [LaunchWrapper]: Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
[18:43:46] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.CoremodTweaker
[18:43:46] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLTweaker
[18:43:46] [main/INFO] [FML]: Forge Mod Loader version 13.20.0.2232 for Minecraft 1.11.2 loading
[18:43:46] [main/INFO] [FML]: Java is Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_121, running on Windows 10:amd64:10.0, installed at C:\Program Files\Java\jre1.8.0_121
[18:43:46] [main/INFO] [FML]: Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation
[18:43:46] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.CoremodTweaker
[18:43:46] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.fml.relauncher.FMLCorePlugin
[18:43:46] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.classloading.FMLForgePlugin
[18:43:46] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[18:43:46] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
[18:43:46] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
[18:43:46] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[18:43:46] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[18:43:46] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
[18:43:46] [main/ERROR] [FML]: The binary patch set is missing. Either you are in a development environment, or things are not going to work!
[18:43:49] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing
[18:43:49] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
[18:43:49] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
[18:43:51] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
[18:43:51] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.TerminalTweaker
[18:43:51] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.TerminalTweaker
[18:43:51] [main/INFO] [LaunchWrapper]: Launching wrapped minecraft {net.minecraft.client.main.Main}
2017-02-28 18:43:52,483 WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
2017-02-28 18:43:52,576 WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
2017-02-28 18:43:52,580 WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
[18:43:53] [Client thread/INFO]: Setting user: Player104
[18:44:02] [Client thread/WARN]: Skipping bad option: lastServer:
[18:44:02] [Client thread/INFO]: LWJGL Version: 2.9.4
[18:44:04] [Client thread/INFO]: [STDOUT]: ---- Minecraft Crash Report ----
// Hey, that tickles! Hehehe!

Time: 2/28/17 6:44 PM
Description: Loading screen debug info

This is just a prompt for computer specs to be printed. THIS IS NOT A ERROR


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- System Details --
Details:
	Minecraft Version: 1.11.2
	Operating System: Windows 10 (amd64) version 10.0
	Java Version: 1.8.0_121, Oracle Corporation
	Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
	Memory: 8368539992 bytes (7980 MB) / 8555069440 bytes (8158 MB) up to 8555069440 bytes (8158 MB)
	JVM Flags: 3 total; -Xincgc -Xmx8192M -Xms8192M
	IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
	FML: 
	Loaded coremods (and transformers): 
	GL info: ' Vendor: 'ATI Technologies Inc.' Version: '4.5.13464 Compatibility Profile Context 21.19.384.0' Renderer: 'AMD Radeon(TM) R7 Graphics'
[18:44:04] [Client thread/INFO] [FML]: MinecraftForge v13.20.0.2232 Initialized
[18:44:04] [Client thread/INFO] [FML]: Replaced 232 ore recipes
[18:44:05] [Client thread/INFO] [FML]: Found 0 mods from the command line. Injecting into mod discoverer
[18:44:05] [Client thread/INFO] [FML]: Searching C:\Users\Callum\Coding\Minecraft\Minecraft Mods\IndustrialTech1.11.2\run\mods for mods
[18:44:08] [Client thread/INFO] [FML]: Forge Mod Loader has identified 5 mods to load
[18:44:08] [Client thread/INFO] [FML]: Attempting connection with missing mods [minecraft, mcp, FML, forge, industrialtech] at CLIENT
[18:44:08] [Client thread/INFO] [FML]: Attempting connection with missing mods [minecraft, mcp, FML, forge, industrialtech] at SERVER
[18:44:10] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Industrial Tech
[18:44:10] [Client thread/INFO] [FML]: Processing ObjectHolder annotations
[18:44:10] [Client thread/INFO] [FML]: Found 444 ObjectHolder annotations
[18:44:10] [Client thread/INFO] [FML]: Identifying ItemStackHolder annotations
[18:44:10] [Client thread/INFO] [FML]: Found 0 ItemStackHolder annotations
[18:44:10] [Client thread/INFO] [FML]: Applying holder lookups
[18:44:10] [Client thread/INFO] [FML]: Holder lookups applied
[18:44:10] [Client thread/INFO] [FML]: Applying holder lookups
[18:44:10] [Client thread/INFO] [FML]: Holder lookups applied
[18:44:10] [Client thread/INFO] [FML]: Applying holder lookups
[18:44:10] [Client thread/INFO] [FML]: Holder lookups applied
[18:44:10] [Client thread/INFO] [FML]: Configured a dormant chunk cache size of 0
[18:44:10] [Forge Version Check/INFO] [ForgeVersionCheck]: [forge] Starting version check at http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json
[18:44:10] [Client thread/INFO] [FML]: Applying holder lookups
[18:44:10] [Client thread/INFO] [FML]: Holder lookups applied
[18:44:10] [Client thread/INFO] [FML]: Injecting itemstacks
[18:44:10] [Client thread/INFO] [FML]: Itemstack injection complete
[18:44:11] [Forge Version Check/INFO] [ForgeVersionCheck]: [forge] Found status: OUTDATED Target: 13.20.0.2252
[18:44:20] [Sound Library Loader/INFO]: Starting up SoundSystem...
[18:44:20] [Thread-8/INFO]: Initializing LWJGL OpenAL
[18:44:20] [Thread-8/INFO]: (The LWJGL binding of OpenAL.  For more information, see http://www.lwjgl.org)
[18:44:20] [Thread-8/INFO]: OpenAL initialized.
[18:44:20] [Sound Library Loader/INFO]: Sound engine started
[18:44:29] [Client thread/INFO] [FML]: Max texture size: 16384
[18:44:29] [Client thread/INFO]: Created: 16x16 textures-atlas
[18:44:31] [Client thread/INFO] [FML]: Injecting itemstacks
[18:44:31] [Client thread/INFO] [FML]: Itemstack injection complete
[18:44:31] [Client thread/INFO] [FML]: Forge Mod Loader has successfully loaded 5 mods
[18:44:31] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Industrial Tech
[18:44:38] [Client thread/INFO]: SoundSystem shutting down...
[18:44:38] [Client thread/WARN]: Author: Paul Lamb, www.paulscode.com
[18:44:38] [Sound Library Loader/INFO]: Starting up SoundSystem...
[18:44:38] [Thread-10/INFO]: Initializing LWJGL OpenAL
[18:44:38] [Thread-10/INFO]: (The LWJGL binding of OpenAL.  For more information, see http://www.lwjgl.org)
[18:44:38] [Thread-10/INFO]: OpenAL initialized.
[18:44:39] [Sound Library Loader/INFO]: Sound engine started
[18:44:47] [Client thread/INFO] [FML]: Max texture size: 16384
[18:44:47] [Client thread/INFO]: Created: 512x512 textures-atlas
[18:44:49] [Client thread/WARN]: Skipping bad option: lastServer:
[18:44:49] [Client thread/ERROR] [TEXTURE ERRORS]: +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[18:44:49] [Client thread/ERROR] [TEXTURE ERRORS]: The following texture errors were found.
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]: ==================================================
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]:   DOMAIN indstrialtech
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]: --------------------------------------------------
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]:   domain indstrialtech is missing 1 texture
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]:     domain indstrialtech is missing a resource manager - it is probably a side-effect of automatic texture processing
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]: -------------------------
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]:     The missing resources for domain indstrialtech are:
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]:       textures/blocks/machine_core.png
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]: -------------------------
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]:     No other errors exist for domain indstrialtech
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]: ==================================================
[18:44:50] [Client thread/ERROR] [TEXTURE ERRORS]: +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[18:44:51] [Realms Notification Availability checker #1/INFO]: Could not authorize you against Realms server: Invalid session id

 

Here is my code:

ClientProxy:

package cjminecraft.industrialtech.proxy;

import cjminecraft.industrialtech.Reference;
import cjminecraft.industrialtech.client.model.IndustrialTechModelLoader;
import cjminecraft.industrialtech.init.ModBlocks;
import cjminecraft.industrialtech.init.ModItems;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.StateMapperBase;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.model.ModelLoaderRegistry;

public class ClientProxy extends CommonProxy {
	
	@Override
	public void preInit() {
		ModBlocks.registerRenders();
		ModBlocks.registerStateMappers();
		ModBlocks.registerModelVariants();
		ModItems.registerRenders();
		ModItems.registerModelVariants();
		ModelLoaderRegistry.registerLoader(new IndustrialTechModelLoader());
	}
	
	@Override
	public void init() {
		
	}
	
	@Override
	public void postInit() {
		
	}

}

ModBlocks:

package cjminecraft.industrialtech.init;

import cjminecraft.industrialtech.Reference;
import cjminecraft.industrialtech.blocks.BlockMachine;
import cjminecraft.industrialtech.blocks.BlockMachineFrame;
import cjminecraft.industrialtech.blocks.item.ItemBlockMeta;
import cjminecraft.industrialtech.utils.Utils;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelBakery;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;

public class ModBlocks {
	
	public static BlockMachine machineFrame;
	
	public static void init() {
		machineFrame = new BlockMachineFrame("machine_frame");
	}
	
	public static void register() {
		Utils.registerBlock(machineFrame, new ItemBlockMeta(machineFrame));
	}
	
	public static void registerRenders() {
		for(BlockMachine.MachineTier tier : BlockMachine.MachineTier.values()) {
			Utils.registerRender(machineFrame, tier.ordinal(), "machine_frame_" + tier.getName());
		}
	}
	
	public static void registerModelVariants() {
		ModelBakery.registerItemVariants(Item.getItemFromBlock(machineFrame), new ResourceLocation(Reference.MODID, "machine_frame_basic"), new ResourceLocation(Reference.MODID, "machine_frame_intermediate"), new ResourceLocation(Reference.MODID, "machine_frame_advanced"));
	}
	
	public static void registerStateMappers() {
		machineFrame.registerStateMapper();
	}

}

BlockMachine:

package cjminecraft.industrialtech.blocks;

import cjminecraft.industrialtech.Reference;
import cjminecraft.industrialtech.blocks.item.IMetaBlockName;
import cjminecraft.industrialtech.init.ModItems;
import cjminecraft.industrialtech.utils.IndustrialTechBlock;
import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.StateMapperBase;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumHand;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.common.property.Properties;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public abstract class BlockMachine extends IndustrialTechBlock implements ITileEntityProvider, IMetaBlockName {

	public static final PropertyEnum TIER = PropertyEnum.create("tier", BlockMachine.MachineTier.class);

	public static final IUnlistedProperty<Boolean> LINK_UP = new Properties.PropertyAdapter<Boolean>(
			PropertyBool.create("link_up"));
	public static final IUnlistedProperty<Boolean> LINK_DOWN = new Properties.PropertyAdapter<Boolean>(
			PropertyBool.create("link_down"));
	public static final IUnlistedProperty<Boolean> LINK_WEST = new Properties.PropertyAdapter<Boolean>(
			PropertyBool.create("link_west"));
	public static final IUnlistedProperty<Boolean> LINK_EAST = new Properties.PropertyAdapter<Boolean>(
			PropertyBool.create("link_east"));
	public static final IUnlistedProperty<Boolean> LINK_NORTH = new Properties.PropertyAdapter<Boolean>(
			PropertyBool.create("link_north"));
	public static final IUnlistedProperty<Boolean> LINK_SOUTH = new Properties.PropertyAdapter<Boolean>(
			PropertyBool.create("link_south"));

	public BlockMachine(String unlocalizedName) {
		super(Material.IRON, unlocalizedName);
		this.setHardness(3);
		this.setResistance(20);
		this.isBlockContainer = true;
		this.setDefaultState(this.blockState.getBaseState().withProperty(TIER, BlockMachine.MachineTier.BASIC));
	}
	
	@SideOnly(Side.CLIENT)
	public void registerStateMapper() {
		StateMapperBase mapper = new StateMapperBase() {
			
			@Override
			protected ModelResourceLocation getModelResourceLocation(IBlockState state) {
				return new ModelResourceLocation(Reference.MODID + ":" + getUnlocalizedName().substring(5), "normal");
			}
		};
		ModelLoader.setCustomStateMapper(this, mapper);
	}

	@Override
	public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) {
		if (state instanceof IExtendedBlockState) {
			IExtendedBlockState retval = (IExtendedBlockState) state;
			return retval.withProperty(LINK_UP, canConnectTo(state, world, pos.up()))
					.withProperty(LINK_DOWN, canConnectTo(state, world, pos.down()))
					.withProperty(LINK_EAST, canConnectTo(state, world, pos.east()))
					.withProperty(LINK_WEST, canConnectTo(state, world, pos.west()))
					.withProperty(LINK_NORTH, canConnectTo(state, world, pos.north()))
					.withProperty(LINK_SOUTH, canConnectTo(state, world, pos.south()));
		}
		return state;
	}

	public boolean canConnectTo(IBlockState blockState, IBlockAccess world, BlockPos pos) {
		IBlockState state = world.getBlockState(pos);
		if(state.getBlock() instanceof BlockMachine)
			return state.getValue(TIER) == blockState.getValue(TIER);
		return false;
	}

	@Override
	public EnumBlockRenderType getRenderType(IBlockState state) {
		return EnumBlockRenderType.MODEL;
	}

	@Override
	public void getSubBlocks(Item item, CreativeTabs tab, NonNullList<ItemStack> list) {
		for (BlockMachine.MachineTier tier : BlockMachine.MachineTier.values()) {
			list.add(new ItemStack(item, 1, tier.ordinal()));
		}
	}

	@Override
	protected BlockStateContainer createBlockState() {
		IProperty[] listedProperties = new IProperty[] { TIER };
		IUnlistedProperty[] unlistedProperties = new IUnlistedProperty[] { LINK_UP, LINK_DOWN, LINK_EAST, LINK_WEST,
				LINK_NORTH, LINK_SOUTH };
		return new ExtendedBlockState(this, listedProperties, unlistedProperties);
	}

	@Override
	public IBlockState getStateFromMeta(int meta) {
		BlockMachine.MachineTier tier = BlockMachine.MachineTier.fromMeta(meta);
		return this.getDefaultState().withProperty(TIER, tier);
	}

	@Override
	public int getMetaFromState(IBlockState state) {
		BlockMachine.MachineTier tier = (BlockMachine.MachineTier) state.getValue(TIER);
		return tier.ordinal();
	}

	@Override
	public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos,
			EntityPlayer player) {
		return new ItemStack(Item.getItemFromBlock(this), 1, getMetaFromState(state));
	}

	@Override
	public int damageDropped(IBlockState state) {
		return getMetaFromState(state);
	}

	@Override
	public String getSpecialName(ItemStack stack) {
		return BlockMachine.MachineTier.fromMeta(stack.getItemDamage()).getName();
	}

	public void updateMachineTier(World world, EntityPlayer player, EnumHand hand, BlockPos pos, ItemStack stack) {
		if (stack.getItem() == ModItems.chip) {
			BlockMachine.MachineTier newTier = BlockMachine.MachineTier.fromMeta(stack.getItemDamage());
			BlockMachine.MachineTier currentType = (BlockMachine.MachineTier) world.getBlockState(pos).getValue(TIER);
			IBlockState newState = world.getBlockState(pos).withProperty(TIER, newTier);
			if (newTier.ordinal() > currentType.ordinal()) {
				world.setBlockState(pos, newState, 2);
				ItemStack newStack = stack.copy();
				newStack.shrink(1);
				player.setHeldItem(hand, newStack);
				if (player.getHeldItem(hand).getCount() <= 0)
					player.setHeldItem(hand, ItemStack.EMPTY);
			}
		}
	}

	public static enum MachineTier implements IStringSerializable {
		BASIC("basic"), INTERMEDIATE("intermediate"), ADVANCED("advanced");

		private String name;

		private MachineTier(String name) {
			this.name = name;
		}

		@Override
		public String getName() {
			return this.name;
		}

		@Override
		public String toString() {
			return getName();
		}

		public static MachineTier fromMeta(int meta) {
			return values()[meta % values().length];
		}
	}

}

IndustrialTechModelLoader:

package cjminecraft.industrialtech.client.model;

import cjminecraft.industrialtech.Reference;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.ICustomModelLoader;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.model.ModelLoaderRegistry;

public class IndustrialTechModelLoader implements ICustomModelLoader {

	public final String SMART_MODEL_RESOURCE_LOCATION = "models/block/smartmodel/";

	private IResourceManager resourceManager;
	
	@Override
	public void onResourceManagerReload(IResourceManager resourceManager) {
		this.resourceManager = resourceManager;
	}

	@Override
	public boolean accepts(ResourceLocation resourceLocation) {
		return resourceLocation.getResourceDomain().equals(Reference.MODID)
				&& resourceLocation.getResourcePath().startsWith(SMART_MODEL_RESOURCE_LOCATION);
	}

	@Override
	public IModel loadModel(ResourceLocation resourceLocation) throws Exception {
		String resourcePath = resourceLocation.getResourcePath();
		if(!resourcePath.startsWith(SMART_MODEL_RESOURCE_LOCATION))
			assert false : "loadModel expected " + SMART_MODEL_RESOURCE_LOCATION + " but found " + resourcePath;
		String modelName = resourcePath.substring(SMART_MODEL_RESOURCE_LOCATION.length());
		
		if(modelName.contains("machine"))
			return new MachineModel();
		else
			return ModelLoaderRegistry.getMissingModel();
	}

}

MachineModel:

package cjminecraft.industrialtech.client.model;

import java.util.Collection;

import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;

import cjminecraft.industrialtech.IndustrialTech;
import cjminecraft.industrialtech.Reference;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.common.model.IModelState;

public class MachineModel implements IModel {
	
	public static final ResourceLocation TEXTURE_SHEET = new ResourceLocation(Reference.MODID, "blocks/machine_core");
	
	public static final ModelResourceLocation MODEL_CORE = new ModelResourceLocation(Reference.MODID + ":machine_core");
	public static final ModelResourceLocation MODEL_BORDER = new ModelResourceLocation(Reference.MODID + ":machine_border");

	@Override
	public Collection<ResourceLocation> getDependencies() {
		return ImmutableList.copyOf(new ResourceLocation[] { MODEL_CORE, MODEL_BORDER });
	}
	
	@Override
	public Collection<ResourceLocation> getTextures() {
		return ImmutableList.copyOf(new ResourceLocation[] { TEXTURE_SHEET });
	}
	
	@Override
	public IBakedModel bake(IModelState state, VertexFormat format,
			Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) {
		try {
	        IModel subComponent = ModelLoaderRegistry.getModel(MODEL_CORE);
	        IBakedModel bakedModelCore = subComponent.bake(state, format, bakedTextureGetter);

	        subComponent = ModelLoaderRegistry.getModel(MODEL_BORDER);
	        IBakedModel bakedModelBorder = subComponent.bake(state, format, bakedTextureGetter);

	        return new MachineCompositeModel(bakedModelCore, bakedModelBorder);
	      } catch (Exception exception) {
	        return ModelLoaderRegistry.getMissingModel().bake(state, format, bakedTextureGetter);
	      }
	}
	
	@Override
	public IModelState getDefaultState() {
		return null;
	}
	
}

MachineCompositeModel:

package cjminecraft.industrialtech.client.model;

import java.util.LinkedList;
import java.util.List;

import javax.vecmath.Matrix4f;

import org.apache.commons.lang3.tuple.Pair;

import cjminecraft.industrialtech.IndustrialTech;
import cjminecraft.industrialtech.Reference;
import cjminecraft.industrialtech.blocks.BlockMachine;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.block.model.ItemOverrideList;
import net.minecraft.client.renderer.block.model.ItemTransformVec3f;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.client.model.IPerspectiveAwareModel;
import net.minecraftforge.common.model.TRSRTransformation;
import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty;

public class MachineCompositeModel implements IPerspectiveAwareModel {

	private IBakedModel modelCore;
	private IBakedModel modelBorder;

	public MachineCompositeModel(IBakedModel modelCore, IBakedModel modelBorder) {
		this.modelCore = modelCore;
		this.modelBorder = modelBorder;
	}

	@Override
	public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand) {
		List<BakedQuad> quadsList = new LinkedList<BakedQuad>();
		quadsList.addAll(modelCore.getQuads(state, side, rand));
		if (!(state instanceof IExtendedBlockState))
			return quadsList;
		IExtendedBlockState extendedBlockState = (IExtendedBlockState) state;
		return quadsList;
	}

	@Override
	public boolean isAmbientOcclusion() {
		return modelCore.isAmbientOcclusion();
	}

	@Override
	public boolean isGui3d() {
		return modelCore.isGui3d();
	}

	@Override
	public boolean isBuiltInRenderer() {
		return modelCore.isBuiltInRenderer();
	}

	@Override
	public TextureAtlasSprite getParticleTexture() {
		return Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(Reference.MODID + ":blocks/machine_core");
	}

	@Override
	public ItemCameraTransforms getItemCameraTransforms() {
		return modelCore.getItemCameraTransforms();
	}

	@Override
	public ItemOverrideList getOverrides() {
		return null;
	}

	@Override
	public Pair<? extends IBakedModel, Matrix4f> handlePerspective(TransformType cameraTransformType) {
		if (modelCore instanceof IPerspectiveAwareModel) {
			Matrix4f matrix4f = ((IPerspectiveAwareModel) modelCore).handlePerspective(cameraTransformType).getRight();
			return Pair.of(this, matrix4f);
		} else {
			ItemCameraTransforms itemCameraTransforms = modelCore.getItemCameraTransforms();
			ItemTransformVec3f itemTransformVec3f = itemCameraTransforms.getTransform(cameraTransformType);
			TRSRTransformation tr = new TRSRTransformation(itemTransformVec3f);
			Matrix4f mat = null;
			if (tr != null) {
				mat = tr.getMatrix();
			}

			return Pair.of(this, mat);
		}
	}

	private boolean isLinkPresent(IExtendedBlockState iExtendedBlockState, IUnlistedProperty<Boolean> whichLink) {
		Boolean link = iExtendedBlockState.getValue(whichLink);
		if (link == null) {
			return false;
		}
		return link;
	}

}

Blockstates are attached!

 

Thanks in advance!

machine_frame.json

machine_core.json

machine_border.json

Edited by CJMinecraft
  • 2 months later...
Posted

I am hoping CJ that you can answer my question. I am VERY new to the whole models, block states, and json files thing, but I am wondering how I can make or created connected textures like glass without the use of forge, mcpatcher, or optifine? I know there is a way of doing it as I just watched a video on it here. Please let me know how this is done as I want to learn how to do it for myself without having to rely to heavily on someone to do it for me or a mod to do it instead.

 

Posted

The texture errors mention a domain (mod id) called "indstrialtech" but from looking at the package names in the classes you posted i guess that your mod id is actually "industrialtech". That means that you spelled a texture resource location wrong somewhere.

  • 3 weeks later...
Posted

So the way I managed to fix this was actually relatively simple. I'm now using the Chisel CTM and I've posted a video about this here. This also works with optifine, currently I've found no way of achieving this without Chisel but I'm still looking into it, the video is here:

 

Posted

Yes CJ I know you can do it with CTM, Optifine,McPatcher, and forge, but I know there is a way of doing it without using those mods as in the video I linked above. I have the models json files that will create each facing block as well as the blockstates file that references the models (or at least I think I have it right). The only problem I run into is that it doesn't actually use the different models when placing the glass blocks next to each other like it would IF it were a ctm.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.