Posted February 28, 20178 yr 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 March 8, 20178 yr by CJMinecraft
February 28, 20178 yr Hi CJ, is this for your tutorial series? Edited February 28, 20178 yr by Villfuk02
February 28, 20178 yr Author Yes hopefully when I can figure this out. I really want connected textures
May 31, 20178 yr 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.
June 1, 20178 yr 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.
June 16, 20178 yr Author 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:
June 16, 20178 yr 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.