Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

nik7

Members
  • Joined

  • Last visited

Everything posted by nik7

  1. No problem, so I don't have to use TESR anymore, but the new system?
  2. I don't understand how to use that class, are there any examples, or tutorial to look at?
  3. Sorry, but I don't understand how to do it, and how to use with WorldRenderer
  4. Is this the class you're referring to? package net.minecraftforge.client.model; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.resources.IResourceManager; import net.minecraft.client.resources.model.IBakedModel; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.*; import org.apache.commons.lang3.tuple.Pair; import javax.vecmath.Matrix4f; import javax.vecmath.Quat4f; import java.io.IOException; import java.util.Collection; import java.util.Map; import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; public class ModelDynBucket implements IModel, IModelCustomData, IRetexturableModel { public static final ModelResourceLocation LOCATION = new ModelResourceLocation(new ResourceLocation("forge", "dynbucket"), "inventory"); // minimal Z offset to prevent depth-fighting private static final float NORTH_Z_BASE = 7.496f / 16f; private static final float SOUTH_Z_BASE = 8.504f / 16f; private static final float NORTH_Z_FLUID = 7.498f / 16f; private static final float SOUTH_Z_FLUID = 8.502f / 16f; public static final IModel MODEL = new ModelDynBucket(); protected final ResourceLocation baseLocation; protected final ResourceLocation liquidLocation; protected final ResourceLocation coverLocation; protected final Fluid fluid; protected final boolean flipGas; public ModelDynBucket() { this(null, null, null, null, false); } public ModelDynBucket(ResourceLocation baseLocation, ResourceLocation liquidLocation, ResourceLocation coverLocation, Fluid fluid, boolean flipGas) { this.baseLocation = baseLocation; this.liquidLocation = liquidLocation; this.coverLocation = coverLocation; this.fluid = fluid; this.flipGas = flipGas; } @Override public Collection<ResourceLocation> getDependencies() { return ImmutableList.of(); } @Override public Collection<ResourceLocation> getTextures() { ImmutableSet.Builder<ResourceLocation> builder = ImmutableSet.builder(); if (baseLocation != null) builder.add(baseLocation); if (liquidLocation != null) builder.add(liquidLocation); if (coverLocation != null) builder.add(coverLocation); return builder.build(); } @Override public IFlexibleBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { ImmutableMap<TransformType, TRSRTransformation> transformMap = IPerspectiveAwareModel.MapWrapper.getTransforms(state); // if the fluid is a gas wi manipulate the initial state to be rotated 180? to turn it upside down if (flipGas && fluid != null && fluid.isGaseous()) { state = new ModelStateComposition(state, TRSRTransformation.blockCenterToCorner(new TRSRTransformation(null, new Quat4f(0, 0, 1, 0), null, null))); } TRSRTransformation transform = state.apply(Optional.<IModelPart>absent()).or(TRSRTransformation.identity()); TextureAtlasSprite fluidSprite = null; ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder(); if(fluid != null) { fluidSprite = bakedTextureGetter.apply(fluid.getStill()); } if (baseLocation != null) { // build base (insidest) IFlexibleBakedModel model = (new ItemLayerModel(ImmutableList.of(baseLocation))).bake(state, format, bakedTextureGetter); builder.addAll(model.getGeneralQuads()); } if (liquidLocation != null && fluidSprite != null) { TextureAtlasSprite liquid = bakedTextureGetter.apply(liquidLocation); // build liquid layer (inside) builder.addAll(ItemTextureQuadConverter.convertTexture(format, transform, liquid, fluidSprite, NORTH_Z_FLUID, EnumFacing.NORTH, fluid.getColor())); builder.addAll(ItemTextureQuadConverter.convertTexture(format, transform, liquid, fluidSprite, SOUTH_Z_FLUID, EnumFacing.SOUTH, fluid.getColor())); } if (coverLocation != null) { // cover (the actual item around the other two) TextureAtlasSprite base = bakedTextureGetter.apply(coverLocation); builder.add(ItemTextureQuadConverter.genQuad(format, transform, 0, 0, 16, 16, NORTH_Z_BASE, base, EnumFacing.NORTH, 0xffffffff)); builder.add(ItemTextureQuadConverter.genQuad(format, transform, 0, 0, 16, 16, SOUTH_Z_BASE, base, EnumFacing.SOUTH, 0xffffffff)); } return new BakedDynBucket(this, builder.build(), fluidSprite, format, Maps.immutableEnumMap(transformMap), Maps.<String, IFlexibleBakedModel>newHashMap()); } @Override public IModelState getDefaultState() { return TRSRTransformation.identity(); } /** * Sets the liquid in the model. * fluid - Name of the fluid in the FluidRegistry * flipGas - If "true" the model will be flipped upside down if the liquid is a gas. If "false" it wont * <p/> * If the fluid can't be found, water is used */ @Override public IModel process(ImmutableMap<String, String> customData) { String fluidName = customData.get("fluid"); Fluid fluid = FluidRegistry.getFluid(fluidName); if (fluid == null) fluid = this.fluid; boolean flip = flipGas; if (customData.containsKey("flipGas")) { String flipStr = customData.get("flipGas"); if (flipStr.equals("true")) flip = true; else if (flipStr.equals("false")) flip = false; else throw new IllegalArgumentException(String.format("DynBucket custom data \"flipGas\" must have value \'true\' or \'false\' (was \'%s\')", flipStr)); } // create new model with correct liquid return new ModelDynBucket(baseLocation, liquidLocation, coverLocation, fluid, flip); } /** * Allows to use different textures for the model. * There are 3 layers: * base - The empty bucket/container * fluid - A texture representing the liquid portion. Non-transparent = liquid * cover - An overlay that's put over the liquid (optional) * <p/> * If no liquid is given a hardcoded variant for the bucket is used. */ @Override public IModel retexture(ImmutableMap<String, String> textures) { ResourceLocation base = baseLocation; ResourceLocation liquid = liquidLocation; ResourceLocation cover = coverLocation; if (textures.containsKey("base")) base = new ResourceLocation(textures.get("base")); if (textures.containsKey("fluid")) liquid = new ResourceLocation(textures.get("fluid")); if (textures.containsKey("cover")) cover = new ResourceLocation(textures.get("cover")); return new ModelDynBucket(base, liquid, cover, fluid, flipGas); } public enum LoaderDynBucket implements ICustomModelLoader { instance; @Override public boolean accepts(ResourceLocation modelLocation) { return modelLocation.getResourceDomain().equals("forge") && modelLocation.getResourcePath().contains("forgebucket"); } @Override public IModel loadModel(ResourceLocation modelLocation) throws IOException { return MODEL; } @Override public void onResourceManagerReload(IResourceManager resourceManager) { // no need to clear cache since we create a new model instance } } // the dynamic bucket is based on the empty bucket protected static class BakedDynBucket extends ItemLayerModel.BakedModel implements ISmartItemModel, IPerspectiveAwareModel { private final ModelDynBucket parent; private final Map<String, IFlexibleBakedModel> cache; // contains all the baked models since they'll never change private final ImmutableMap<TransformType, TRSRTransformation> transforms; public BakedDynBucket(ModelDynBucket parent, ImmutableList<BakedQuad> quads, TextureAtlasSprite particle, VertexFormat format, ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> transforms, Map<String, IFlexibleBakedModel> cache) { super(quads, particle, format); this.parent = parent; this.transforms = transforms; this.cache = cache; } @Override public IBakedModel handleItemState(ItemStack stack) { FluidStack fluidStack = FluidContainerRegistry.getFluidForFilledItem(stack); if (fluidStack == null) { if (stack.getItem() instanceof IFluidContainerItem) { fluidStack = ((IFluidContainerItem) stack.getItem()).getFluid(stack); } } // not a fluid item apparently if (fluidStack == null) { // empty bucket return this; } Fluid fluid = fluidStack.getFluid(); String name = fluid.getName(); if (!cache.containsKey(name)) { IModel model = parent.process(ImmutableMap.of("fluid", name)); Function<ResourceLocation, TextureAtlasSprite> textureGetter; textureGetter = new Function<ResourceLocation, TextureAtlasSprite>() { public TextureAtlasSprite apply(ResourceLocation location) { return Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(location.toString()); } }; IFlexibleBakedModel bakedModel = model.bake(new SimpleModelState(transforms), this.getFormat(), textureGetter); cache.put(name, bakedModel); return bakedModel; } return cache.get(name); } @Override public Pair<? extends IFlexibleBakedModel, Matrix4f> handlePerspective(TransformType cameraTransformType) { return IPerspectiveAwareModel.MapWrapper.handlePerspective(this, transforms, cameraTransformType); } } }
  5. I'll try! Thanks
  6. I start porting my mod from 1.7.10 to 1.8.9, but I can't figure how to render fluid inside a tank. These are the links to my source code: https://github.com/nik7007/UpgradeCraft/blob/1.8.9/src/main/java/com/nik7/upgcraft/util/RenderHelper.java https://github.com/nik7007/UpgradeCraft/blob/1.8.9/src/main/java/com/nik7/upgcraft/client/render/tileentity/TileEntityRendererTank.java Can someone help me please? Thanks
  7. I've already done a block that can hold fluid, and its model with some transparent parts, and it renders. Now I would like to render the fluid inside the tank, based on its percentage, but I have not idea how I can do that. I looked for guides, but I didn't find any. Can anyone please tell me how can I do that?
  8. Ok! I managed to fix it! thanks!!!!
  9. Thanks! But I plan to do other tanks similar to this by changing only the capacity.
  10. Hi, I'm trying to create a FluidTank, but the entity attached to it gives me Instantiation Exception. This, however, does not cause any null exception, everything seems to work fine. The problem is when I save the world and then I return, the liquid in the tank has gone. Can anyone help me please? [09:49:55] [server thread/INFO]: Preparing start region for level 0 [09:49:56] [server thread/WARN]: Skipping BlockEntity with id upgcraft:LiquidTankEntity java.lang.InstantiationException: com.nik7.upgcraft.tileentities.UpgCtileentityTank at java.lang.Class.newInstance(Class.java:359) at net.minecraft.tileentity.TileEntity.createAndLoadEntity(TileEntity.java:127) at net.minecraft.world.chunk.storage.AnvilChunkLoader.readChunkFromNBT(AnvilChunkLoader.java:447) at net.minecraft.world.chunk.storage.AnvilChunkLoader.checkedReadChunkFromNBT(AnvilChunkLoader.java:108) at net.minecraft.world.chunk.storage.AnvilChunkLoader.loadChunk(AnvilChunkLoader.java:88) at net.minecraft.world.gen.ChunkProviderServer.safeLoadChunk(ChunkProviderServer.java:186) at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:126) at net.minecraft.server.MinecraftServer.initialWorldChunkLoad(MinecraftServer.java:307) at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:79) at net.minecraft.server.integrated.IntegratedServer.startServer(IntegratedServer.java:96) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:442) at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:746) [09:49:56] [Netty Client IO #1/INFO] [FML]: Server protocol version 1 [09:49:56] [Netty IO #3/INFO] [FML]: Client protocol version 1 [09:49:56] [Netty IO #3/INFO] [FML]: Client attempting to join with 4 mods : [email protected],[email protected],[email protected],upgcraft@alpha [09:49:56] [Netty IO #3/INFO] [FML]: Attempting connection with missing mods [] at CLIENT [09:49:56] [Netty Client IO #1/INFO] [FML]: Attempting connection with missing mods [] at SERVER [09:49:56] [server thread/INFO] [FML]: [server thread] Server side modded connection established [09:49:56] [server thread/INFO]: ForgeDevName[local:E:60c5c8f3] logged in with entity id 1740 at (164.66336789764048, 64.0, 226.39858469262242) [09:49:56] [server thread/INFO]: ForgeDevName joined the game [09:49:56] [Client thread/INFO] [FML]: [Client thread] Client side modded connection established My github here: https://github.com/nik7007/UpgradeCraft

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.