@SubscribeEvent public static void onTextureStitch(final TextureStitchEvent.Pre event) { final TextureMap map = event.getMap(); if(map == Minecraft.getMinecraft().getTextureMapBlocks()) { map.setTextureEntry(new AlphaSprite(new ResourceLocation(Reference.MODID, "items/glyphs/glyph_1"))); } } static class AlphaSprite extends TextureAtlasSprite { private AnimationMetadataSection animationMetadata; AlphaSprite(final ResourceLocation name) { super(name.toString()); } @Override public void updateAnimation() { ++this.tickCounter; if(this.tickCounter >= this.animationMetadata.getFrameTimeSingle(this.frameCounter)) { int i = this.animationMetadata.getFrameIndex(this.frameCounter); int j = this.animationMetadata.getFrameCount() == 0 ? this.framesTextureData.size() : this.animationMetadata.getFrameCount(); this.frameCounter = (this.frameCounter + 1) % j; this.tickCounter = 0; int k = this.animationMetadata.getFrameIndex(this.frameCounter); if(i != k && k >= 0 && k < this.framesTextureData.size()) { TextureUtil.uploadTextureMipmap(this.framesTextureData.get(k), this.width, this.height, this.originX, this.originY, false, false); } } else if(this.animationMetadata.isInterpolate()) { this.updateAnimationInterpolated(); } } private void updateAnimationInterpolated() { double d0 = 1.0D - (double)this.tickCounter / (double)this.animationMetadata.getFrameTimeSingle(this.frameCounter); int i = this.animationMetadata.getFrameIndex(this.frameCounter); int j = this.animationMetadata.getFrameCount() == 0 ? this.framesTextureData.size() : this.animationMetadata.getFrameCount(); int k = this.animationMetadata.getFrameIndex((this.frameCounter + 1) % j); if(i != k && k >= 0 && k < this.framesTextureData.size()) { int[][] aint = this.framesTextureData.get(i); int[][] aint1 = this.framesTextureData.get(k); if(this.interpolatedFrameData == null || this.interpolatedFrameData.length != aint.length) { this.interpolatedFrameData = new int[aint.length][]; } for(int l = 0; l < aint.length; ++l) { if(this.interpolatedFrameData[l] == null) { this.interpolatedFrameData[l] = new int[aint[l].length]; } if(l < aint1.length && aint1[l].length == aint[l].length) { for(int i1 = 0; i1 < aint[l].length; ++i1) { int j1 = aint[l][i1]; int k1 = aint1[l][i1]; int a = this.interpolateColor(d0, j1 >> 24 & 255, k1 >> 24 & 255); int r = this.interpolateColor(d0, j1 >> 16 & 255, k1 >> 16 & 255); int g = this.interpolateColor(d0, j1 >> 8 & 255, k1 >> 8 & 255); int b = this.interpolateColor(d0, j1 & 255, k1 & 255); this.interpolatedFrameData[l][i1] = a << 24 | r << 16 | g << 8 | b; } } } TextureUtil.uploadTextureMipmap(this.interpolatedFrameData, this.width, this.height, this.originX, this.originY, false, false); } } private int interpolateColor(double d0, int i1, int i2) { return (int)(d0 * (double)i1 + (1.0D - d0) * (double)i2); } }