Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Awesome_Spider

Forge Modder
  • Posts

    892
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by Awesome_Spider

  1. I would like to, when the player drinks a water bottle, add hydration to an already attached capability on the player. I found an event called LivingEntityUseItemEvent that has a few sub-events. I think the one I want is Finish but I'm not entirely sure. I want the water bottle to be consumed by the player, but I also want to add to the capability when the player is done drinking it. Would this be the right event?

     

    My second question is what is the water bottle called in the Minecraft code? Is it under the potion?

  2. Thanks for pointing that out. Now it isn't rendering.

    protected static BlockRendererDispatcher blockRenderer;
    
        @Override
        public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
            if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
            BlockPos pos = te.getPos();
            IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
            IBlockState state = world.getBlockState(pos);
    
            final IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);
    
            renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);
    
            final List<BakedQuad> quadList = model.getQuads(state, null, 0L);
            final List<BakedQuad> newQuadList = Lists.newArrayList();
    
    
            for(BakedQuad quad : quadList) {
                newQuadList.add(transform(quad, new TRSRTransformation(new Vector3f(0, 0, 0), new Quat4f(-0.49f, 0, 0, -0.87f), new Vector3f(1, 1, 1), new Quat4f(0.49f, 0, 0, 0.87f))));
            }
    
            final IBakedModel newModel = new IBakedModel() {
                @Override
                public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand) {
                    return newQuadList;
                }
    
                @Override
                public boolean isAmbientOcclusion() {
                    return model.isAmbientOcclusion();
                }
    
                @Override
                public boolean isGui3d() {
                    return model.isGui3d();
                }
    
                @Override
                public boolean isBuiltInRenderer() {
                    return model.isBuiltInRenderer();
                }
    
                @Override
                public TextureAtlasSprite getParticleTexture() {
                    return model.getParticleTexture();
                }
    
                @Override
                public ItemCameraTransforms getItemCameraTransforms() {
                    return model.getItemCameraTransforms();
                }
    
                @Override
                public ItemOverrideList getOverrides() {
                    return model.getOverrides();
                }
            };
    
            blockRenderer.getBlockModelRenderer().renderModel(world, newModel, state, pos, renderer, false);
        }
    
        //This method was borrowed from Vazkii's mod called Botania. It was modified to work for a block instead of an item.
        public static BakedQuad transform(BakedQuad quad, final TRSRTransformation transform) {
            UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
            final IVertexConsumer consumer = new VertexTransformer(builder) {
                @Override
                public void put(int element, float... data) {
                    VertexFormatElement formatElement = DefaultVertexFormats.BLOCK.getElement(element);
                    switch(formatElement.getUsage()) {
                        case POSITION: {
                            float[] newData = new float[3];
                            Vector3f vec = new Vector3f(data);
                            transform.getMatrix().transform(vec);
                            vec.get(newData);
                            parent.put(element, newData);
                            break;
                        }
                        default: {
                            parent.put(element, data);
                            break;
                        }
                    }
                }
            };
    
            quad.pipe(consumer);
            return builder.build();
        }

     

    Did I get the Quat4fs right? I haven't really worked with them. I used this to get the numbers for them.

  3. Ok. I tried that and it only renders the top face (unrotated). I'm probably still doing it wrong.

        protected static BlockRendererDispatcher blockRenderer;
    
        public int curStep = 0;
        public int totalSteps = 0;
    
        @Override
        public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
            if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
            BlockPos pos = te.getPos();
            IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
            IBlockState state = world.getBlockState(pos);
    
            final IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);
    
            renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);
    
            final List<BakedQuad> quadList = model.getQuads(state, null, 0L);
    
            for(BakedQuad quad : quadList) {
                transform(quad, new TRSRTransformation(new Vector3f(0, 0, 0), new Quat4f(-0.49f, 0, 0, -0.87f), new Vector3f(1, 1, 1), new Quat4f(0.49f, 0, 0, 0.87f)));
            }
    
            final IBakedModel newModel = new IBakedModel() {
                @Override
                public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand) {
                    return quadList;
                }
    
                @Override
                public boolean isAmbientOcclusion() {
                    return model.isAmbientOcclusion();
                }
    
                @Override
                public boolean isGui3d() {
                    return model.isGui3d();
                }
    
                @Override
                public boolean isBuiltInRenderer() {
                    return model.isBuiltInRenderer();
                }
    
                @Override
                public TextureAtlasSprite getParticleTexture() {
                    return model.getParticleTexture();
                }
    
                @Override
                public ItemCameraTransforms getItemCameraTransforms() {
                    return model.getItemCameraTransforms();
                }
    
                @Override
                public ItemOverrideList getOverrides() {
                    return model.getOverrides();
                }
            };
    
            blockRenderer.getBlockModelRenderer().renderModel(world, newModel, state, pos, renderer, false);
        }
    
        //This method was borrowed from Vazkii's mod called Botania. It was modified to work for a block instead of an item.
        public static BakedQuad transform(BakedQuad quad, final TRSRTransformation transform) {
            UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
            final IVertexConsumer consumer = new VertexTransformer(builder) {
                @Override
                public void put(int element, float... data) {
                    VertexFormatElement formatElement = DefaultVertexFormats.BLOCK.getElement(element);
                    switch(formatElement.getUsage()) {
                        case POSITION: {
                            float[] newData = new float[3];
                            Vector3f vec = new Vector3f(data);
                            transform.getMatrix().transform(vec);
                            vec.get(newData);
                            parent.put(element, newData);
                            break;
                        }
                        default: {
                            parent.put(element, data);
                            break;
                        }
                    }
                }
            };
    
            quad.pipe(consumer);
            return builder.build();
        }

     

    Mind you, I am creating a new instance of the model every rendering tick. Not sure how to get around that.

  4. It's still not working.

    Spoiler
    
    protected static BlockRendererDispatcher blockRenderer;
    
        public int curStep = 0;
        public int totalSteps = 0;
    
        @Override
        public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
            if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
            BlockPos pos = te.getPos();
            IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
            IBlockState state = world.getBlockState(pos);
    
            IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);
    
            renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);
    
            List<BakedQuad> quadList = model.getQuads(state, null, 0L);
    
            for(BakedQuad quad : quadList) {
                transform(quad, new TRSRTransformation(new Vector3f(0, 0, 0), new Quat4f(-0.49f, 0, 0, -0.87f), new Vector3f(1, 1, 1), new Quat4f(0.49f, 0, 0, 0.87f)));
            }
    
            blockRenderer.getBlockModelRenderer().renderModel(world, model, state, pos, renderer, false);
        }
    
        public static BakedQuad transform(BakedQuad quad, final TRSRTransformation transform) {
            UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
            final IVertexConsumer consumer = new VertexTransformer(builder) {
                @Override
                public void put(int element, float... data) {
                    VertexFormatElement formatElement = DefaultVertexFormats.BLOCK.getElement(element);
                    switch(formatElement.getUsage()) {
                        case POSITION: {
                            float[] newData = new float[3];
                            Vector3f vec = new Vector3f(data);
                            transform.getMatrix().transform(vec);
                            vec.get(newData);
                            parent.put(element, newData);
                            break;
                        }
                        default: {
                            parent.put(element, data);
                            break;
                        }
                    }
                }
            };
    
            quad.pipe(consumer);
            return builder.build();
        }

     

     

    10 minutes ago, diesieben07 said:
    • Don't try to modify the model's quads, this is a terrible idea.

    Isn't that what I'm doing? I'm rotating one of the cubes?

  5. Ok, I now have the following code, and it isn't rotating like I wanted it to.

    Spoiler
    
        protected static BlockRendererDispatcher blockRenderer;
    
        @Override
        public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
            if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
            BlockPos pos = te.getPos();
            IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
            IBlockState state = world.getBlockState(pos);
    
            IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);
    
            renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);
    
            BakedQuad bq = model.getQuads(state, null, 0L).get(0);
    
            transform(bq, new TRSRTransformation(new Vector3f(0, 0, 0), new Quat4f(-0.49f, 0, 0, -0.87f), new Vector3f(1, 1, 1), new Quat4f(0.49f, 0, 0, 0.87f)));
    
            model.getQuads(state, null, 0L).set(0, bq);
    
            blockRenderer.getBlockModelRenderer().renderModel(world, model, state, pos, renderer, false);
        }
    
        public static BakedQuad transform(BakedQuad quad, final TRSRTransformation transform) {
            UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
            final IVertexConsumer consumer = new VertexTransformer(builder) {
                @Override
                public void put(int element, float... data) {
                    VertexFormatElement formatElement = DefaultVertexFormats.BLOCK.getElement(element);
                    switch(formatElement.getUsage()) {
                        case POSITION: {
                            float[] newData = new float[3];
                            Vector3f vec = new Vector3f(data);
                            transform.getMatrix().transform(vec);
                            vec.get(newData);
                            parent.put(element, newData);
                            break;
                        }
                        default: {
                            parent.put(element, data);
                            break;
                        }
                    }
                }
            };
    
            quad.pipe(consumer);
            return builder.build();
        }

     

     

  6. I don't completely understand matrices yet, as I am only in grade 12 math currently. I tried it and got this code in my Renderer:

        protected static BlockRendererDispatcher blockRenderer;
    
        @Override
        public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
            if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
            BlockPos pos = te.getPos();
            IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
            IBlockState state = world.getBlockState(pos);
    
            IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);
    
            renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);
    
            BakedQuad bq = model.getQuads(state, null, 0L).get(0);
    
            int[] vertexData = handleXRotation(bq.getVertexData(), 45);
    
            model.getQuads(state, null, 0L).set(0, new BakedQuad(vertexData, bq.getTintIndex(), bq.getFace(), bq.getSprite(), bq.shouldApplyDiffuseLighting(), bq.getFormat()));
    
            blockRenderer.getBlockModelRenderer().renderModel(world, model, state, pos, renderer, false);
        }
    
        public int[] handleXRotation(int[] vertexData, double rot) {
            int vx = vertexData[0];
            int vy = vertexData[1];
    
            vx = (int)((vx * Math.cos(Math.toRadians(rot))) - (vy * Math.sin(Math.toRadians(rot))));
            vy = (int)((vx * Math.sin(Math.toRadians(rot))) + (vy * Math.cos(Math.toRadians(rot))));
    
            vertexData[0] = vx;
            vertexData[1] = vy;
    
            //Next Vertex
            vx = vertexData[8];
            vy = vertexData[9];
    
            vx = (int)((vx * Math.cos(Math.toRadians(rot))) - (vy * Math.sin(Math.toRadians(rot))));
            vy = (int)((vx * Math.sin(Math.toRadians(rot))) + (vy * Math.cos(Math.toRadians(rot))));
    
            vertexData[8] = vx;
            vertexData[9] = vy;
    
            //Next Vertex
            vx = vertexData[14];
            vy = vertexData[15];
    
            vx = (int)((vx * Math.cos(Math.toRadians(-rot))) - (vy * Math.sin(Math.toRadians(-rot))));
            vy = (int)((vx * Math.sin(Math.toRadians(-rot))) + (vy * Math.cos(Math.toRadians(-rot))));
    
            vertexData[14] = vx;
            vertexData[15] = vy;
    
            //Next Vertex
            vx = vertexData[20];
            vy = vertexData[21];
    
            vx = (int)((vx * Math.cos(Math.toRadians(-rot))) - (vy * Math.sin(Math.toRadians(-rot))));
            vy = (int)((vx * Math.sin(Math.toRadians(-rot))) + (vy * Math.cos(Math.toRadians(-rot))));
    
            vertexData[20] = vx;
            vertexData[21] = vy;
    
            return vertexData;
        }

     

    The method handleXRotation only handles the top face so far. I'm probably doing this way wrong, but this what I got. When I test this code the top face disappears.

  7. Does anyone know how I could do this?

     

    PS: Kind of off-topic but these spammers are getting really annoying. So glad the moderators are working on getting it fixed. I translated one of their user names on google translate from Chinese and it meant "Make a Fortune". They are obviously gaining something from this.

  8. Thank you. I now have this basic code for my renderer:

    protected static BlockRendererDispatcher blockRenderer;
    
        @Override
        public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
            if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
            BlockPos pos = te.getPos();
            IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
            IBlockState state = world.getBlockState(pos);
    
            IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);
    
            renderer.setTranslation(x - pos.getX(), y - pos.getY(), z - pos.getZ());
    
            blockRenderer.getBlockModelRenderer().renderModel(world, model, state, pos, renderer, false);
        }

     

    I have tested it by adding an offset to the translation (for testing), and it works. It renders the model I defined in my blockstate file. Now how would I add rotation/change the position of some of the parts of the model?

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.