diff --git a/patches.mcp/minecraft/net/minecraft/block/Block.java.patch b/patches.mcp/minecraft/net/minecraft/block/Block.java.patch index 921d8e7bdc..9234bf198f 100644 --- a/patches.mcp/minecraft/net/minecraft/block/Block.java.patch +++ b/patches.mcp/minecraft/net/minecraft/block/Block.java.patch @@ -1267,7 +1267,7 @@ + * Queries if this block should render in a given layer. + * ISmartBlockModel can use MinecraftForgeClient.getRenderLayer to alter their model based on layer + */ -+ public boolean canRenderInLayer(EnumWorldBlockLayer layer) ++ public boolean canRenderInLayer(BlockRenderLayer layer) + { + return getBlockLayer() == layer; + } diff --git a/patches.mcp/minecraft/net/minecraft/client/renderer/BlockRendererDispatcher.java.patch b/patches.mcp/minecraft/net/minecraft/client/renderer/BlockRendererDispatcher.java.patch new file mode 100644 index 0000000000..b5feb11544 --- /dev/null +++ b/patches.mcp/minecraft/net/minecraft/client/renderer/BlockRendererDispatcher.java.patch @@ -0,0 +1,31 @@ +--- ../src-base/minecraft/net/minecraft/client/renderer/BlockRendererDispatcher.java ++++ ../src-work/minecraft/net/minecraft/client/renderer/BlockRendererDispatcher.java +@@ -29,7 +29,7 @@ + public BlockRendererDispatcher(BlockModelShapes p_i46577_1_, BlockColors p_i46577_2_) + { + this.blockModelShapes = p_i46577_1_; +- this.blockModelRenderer = new BlockModelRenderer(p_i46577_2_); ++ this.blockModelRenderer = new net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer(p_i46577_2_); + this.fluidRenderer = new BlockFluidRenderer(p_i46577_2_); + } + +@@ -44,7 +44,7 @@ + { + state = state.func_185899_b(blockAccess, pos); + IBakedModel ibakedmodel = this.blockModelShapes.getModelForState(state); +- IBakedModel ibakedmodel1 = (new SimpleBakedModel.Builder(state, ibakedmodel, texture, pos)).makeBakedModel(); ++ IBakedModel ibakedmodel1 = net.minecraftforge.client.ForgeHooksClient.getDamageModel(ibakedmodel, texture, state, blockAccess, pos); + this.blockModelRenderer.renderModel(blockAccess, ibakedmodel1, state, pos, Tessellator.getInstance().getWorldRenderer(), true); + } + } +@@ -76,7 +76,9 @@ + switch (enumblockrendertype) + { + case MODEL: +- return this.blockModelRenderer.renderModel(blockAccess, this.func_184389_a(state), state, pos, worldRendererIn, true); ++ IBakedModel model = this.func_184389_a(state); ++ state = state.getBlock().getExtendedState(state, blockAccess, pos); ++ return this.blockModelRenderer.renderModel(blockAccess, model, state, pos, worldRendererIn, true); + case ENTITYBLOCK_ANIMATED: + return false; + case LIQUID: diff --git a/patches.mcp/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.java.patch b/patches.mcp/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.java.patch index db8cbd4b78..2ac9eee595 100644 --- a/patches.mcp/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.java.patch +++ b/patches.mcp/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.java.patch @@ -7,14 +7,22 @@ - if (!this.mc.thePlayer.getActivePotionEffects().isEmpty()) + boolean hasVisibleEffect = false; + for(PotionEffect potioneffect : this.mc.thePlayer.getActivePotionEffects()) { -+ Potion potion = Potion.potionTypes[potioneffect.getPotionID()]; ++ Potion potion = potioneffect.func_188419_a(); + if(potion.shouldRender(potioneffect)) { hasVisibleEffect = true; break; } + } + if (!this.mc.thePlayer.getActivePotionEffects().isEmpty() && hasVisibleEffect) { this.guiLeft = 160 + (this.width - this.xSize - 200) / 2; this.hasActivePotionEffects = true; -@@ -81,6 +86,8 @@ +@@ -71,6 +76,7 @@ + for (PotionEffect potioneffect : Ordering.natural().sortedCopy(collection)) + { + Potion potion = potioneffect.func_188419_a(); ++ if(!potion.shouldRender(potioneffect)) continue; + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(inventoryBackground); + this.drawTexturedModalRect(i, j, 0, 166, 140, 32); +@@ -81,6 +87,8 @@ this.drawTexturedModalRect(i + 6, j + 7, 0 + i1 % 8 * 18, 198 + i1 / 8 * 18, 18, 18); } diff --git a/patches.mcp/minecraft/net/minecraft/client/renderer/ItemRenderer.java.patch b/patches.mcp/minecraft/net/minecraft/client/renderer/ItemRenderer.java.patch index 208eda40c1..e5bce5664f 100644 --- a/patches.mcp/minecraft/net/minecraft/client/renderer/ItemRenderer.java.patch +++ b/patches.mcp/minecraft/net/minecraft/client/renderer/ItemRenderer.java.patch @@ -1,5 +1,14 @@ --- ../src-base/minecraft/net/minecraft/client/renderer/ItemRenderer.java +++ ../src-work/minecraft/net/minecraft/client/renderer/ItemRenderer.java +@@ -360,7 +360,7 @@ + this.func_187456_a(p_187457_7_, p_187457_5_, enumhandside); + } + } +- else if (p_187457_6_.getItem() == Items.filled_map) ++ else if (p_187457_6_.getItem() instanceof net.minecraft.item.ItemMap) + { + if (flag && this.field_187468_e == null) + { @@ -444,6 +444,7 @@ if (this.mc.thePlayer.isEntityInsideOpaqueBlock()) { @@ -8,7 +17,21 @@ EntityPlayer entityplayer = this.mc.thePlayer; for (int i = 0; i < 8; ++i) -@@ -470,11 +471,13 @@ +@@ -457,11 +458,13 @@ + if (iblockstate1.getBlock().isVisuallyOpaque()) + { + iblockstate = iblockstate1; ++ overlayPos = blockpos; + } + } + + if (iblockstate.func_185901_i() != EnumBlockRenderType.INVISIBLE) + { ++ if (!net.minecraftforge.event.ForgeEventFactory.renderBlockOverlay(mc.thePlayer, partialTicks, net.minecraftforge.client.event.RenderBlockOverlayEvent.OverlayType.BLOCK, iblockstate, overlayPos)) + this.func_178108_a(partialTicks, this.mc.getBlockRendererDispatcher().getBlockModelShapes().getTexture(iblockstate)); + } + } +@@ -470,11 +473,13 @@ { if (this.mc.thePlayer.isInsideOfMaterial(Material.water)) { @@ -22,3 +45,14 @@ this.renderFireInFirstPerson(partialTicks); } } +@@ -596,8 +601,8 @@ + else + { + float f = entityplayersp.func_184825_o(1.0F); +- this.field_187469_f += MathHelper.clamp_float((Objects.equal(this.field_187467_d, itemstack) ? f * f * f : 0.0F) - this.field_187469_f, -0.4F, 0.4F); +- this.field_187471_h += MathHelper.clamp_float((float)(Objects.equal(this.field_187468_e, itemstack1) ? 1 : 0) - this.field_187471_h, -0.4F, 0.4F); ++ this.field_187469_f += MathHelper.clamp_float((net.minecraftforge.client.ForgeHooksClient.shouldCauseReequipAnimation(this.field_187467_d, itemstack) ? f * f * f : 0.0F) - this.field_187469_f, -0.4F, 0.4F); ++ this.field_187471_h += MathHelper.clamp_float((float)(net.minecraftforge.client.ForgeHooksClient.shouldCauseReequipAnimation(this.field_187468_e, itemstack1) ? 1 : 0) - this.field_187471_h, -0.4F, 0.4F); + } + + if (this.field_187469_f < 0.1F) diff --git a/rejects/minecraft/net/minecraft/client/renderer/WorldRenderer.java.patch.rej b/patches.mcp/minecraft/net/minecraft/client/renderer/VertexBuffer.java.patch similarity index 82% rename from rejects/minecraft/net/minecraft/client/renderer/WorldRenderer.java.patch.rej rename to patches.mcp/minecraft/net/minecraft/client/renderer/VertexBuffer.java.patch index 4c835fe91b..4e7a3a8c47 100644 --- a/rejects/minecraft/net/minecraft/client/renderer/WorldRenderer.java.patch.rej +++ b/patches.mcp/minecraft/net/minecraft/client/renderer/VertexBuffer.java.patch @@ -1,4 +1,6 @@ -++++ REJECTED PATCH 1 +--- ../src-base/minecraft/net/minecraft/client/renderer/VertexBuffer.java ++++ ../src-work/minecraft/net/minecraft/client/renderer/VertexBuffer.java +@@ -510,15 +510,15 @@ break; case USHORT: case SHORT: @@ -20,22 +22,13 @@ } this.nextVertexFormatIndex(); -++++ END PATCH -++++ REJECTED PATCH 2 +@@ -609,4 +609,9 @@ + return this.stateVertexFormat; } } - -+ public void checkAndGrow() -+ { -+ this.growBuffer(vertexFormat.getNextOffset()/* / 4 * 4 */); -+ } + + public boolean isColorDisabled() + { -+ return noColor; ++ return noColor; + } -+ - @SideOnly(Side.CLIENT) - public class State - { -++++ END PATCH + } diff --git a/patches.mcp/minecraft/net/minecraft/client/renderer/WorldVertexBufferUploader.java.patch b/patches.mcp/minecraft/net/minecraft/client/renderer/WorldVertexBufferUploader.java.patch new file mode 100644 index 0000000000..8d2a98861d --- /dev/null +++ b/patches.mcp/minecraft/net/minecraft/client/renderer/WorldVertexBufferUploader.java.patch @@ -0,0 +1,57 @@ +--- ../src-base/minecraft/net/minecraft/client/renderer/WorldVertexBufferUploader.java ++++ ../src-work/minecraft/net/minecraft/client/renderer/WorldVertexBufferUploader.java +@@ -28,26 +28,8 @@ + int l = vertexformatelement.getIndex(); + bytebuffer.position(vertexformat.func_181720_d(j)); + +- switch (vertexformatelement$enumusage) +- { +- case POSITION: +- GlStateManager.func_187427_b(vertexformatelement.getElementCount(), k, i, bytebuffer); +- GlStateManager.func_187410_q(32884); +- break; +- case UV: +- OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit + l); +- GlStateManager.func_187404_a(vertexformatelement.getElementCount(), k, i, bytebuffer); +- GlStateManager.func_187410_q(32888); +- OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit); +- break; +- case COLOR: +- GlStateManager.func_187400_c(vertexformatelement.getElementCount(), k, i, bytebuffer); +- GlStateManager.func_187410_q(32886); +- break; +- case NORMAL: +- GlStateManager.func_187446_a(k, i, bytebuffer); +- GlStateManager.func_187410_q(32885); +- } ++ // moved to VertexFormatElement.preDraw ++ vertexformatelement.getUsage().preDraw(vertexformat, j, i, bytebuffer); + } + + GlStateManager.func_187439_f(p_181679_1_.getDrawMode(), 0, p_181679_1_.getVertexCount()); +@@ -59,23 +41,8 @@ + VertexFormatElement.EnumUsage vertexformatelement$enumusage1 = vertexformatelement1.getUsage(); + int k1 = vertexformatelement1.getIndex(); + +- switch (vertexformatelement$enumusage1) +- { +- case POSITION: +- GlStateManager.func_187429_p(32884); +- break; +- case UV: +- OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit + k1); +- GlStateManager.func_187429_p(32888); +- OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit); +- break; +- case COLOR: +- GlStateManager.func_187429_p(32886); +- GlStateManager.resetColor(); +- break; +- case NORMAL: +- GlStateManager.func_187429_p(32885); +- } ++ // moved to VertexFormatElement.postDraw ++ vertexformatelement1.getUsage().postDraw(vertexformat, i1, i, bytebuffer); + } + } + diff --git a/patches.mcp/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch b/patches.mcp/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch index 33082d5943..5d8e6284be 100644 --- a/patches.mcp/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch +++ b/patches.mcp/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch @@ -20,7 +20,18 @@ { TileEntity tileentity = iblockaccess.getTileEntity(new BlockPos(blockpos$mutableblockpos)); TileEntitySpecialRenderer tileentityspecialrenderer = TileEntityRendererDispatcher.instance.getSpecialRenderer(tileentity); -@@ -191,6 +193,7 @@ +@@ -176,7 +178,9 @@ + } + } + +- BlockRenderLayer blockrenderlayer1 = block.getBlockLayer(); ++ for(BlockRenderLayer blockrenderlayer1 : BlockRenderLayer.values()) { ++ if(!block.canRenderInLayer(blockrenderlayer1)) continue; ++ net.minecraftforge.client.ForgeHooksClient.setRenderLayer(blockrenderlayer1); + int j = blockrenderlayer1.ordinal(); + + if (block.getDefaultState().func_185901_i() != EnumBlockRenderType.INVISIBLE) +@@ -191,6 +195,7 @@ aboolean[j] |= blockrendererdispatcher.renderBlock(iblockstate, blockpos$mutableblockpos, iblockaccess, vertexbuffer); } @@ -28,7 +39,7 @@ } for (BlockRenderLayer blockrenderlayer : BlockRenderLayer.values()) -@@ -413,6 +416,26 @@ +@@ -413,6 +418,26 @@ return this.needsUpdate && this.field_188284_q; } diff --git a/patches.mcp/minecraft/net/minecraft/client/renderer/texture/TextureMap.java.patch b/patches.mcp/minecraft/net/minecraft/client/renderer/texture/TextureMap.java.patch index e0a4f35e60..25c12062ea 100644 --- a/patches.mcp/minecraft/net/minecraft/client/renderer/texture/TextureMap.java.patch +++ b/patches.mcp/minecraft/net/minecraft/client/renderer/texture/TextureMap.java.patch @@ -40,11 +40,62 @@ } private void initMissingImage() -@@ -139,9 +152,13 @@ +@@ -88,12 +101,26 @@ + int j = Integer.MAX_VALUE; + int k = 1 << this.mipmapLevels; + ++ net.minecraftforge.client.ForgeHooksClient.onTextureStitchedPre(this); ++ net.minecraftforge.fml.common.FMLLog.info("Max texture size: %d", i); ++ net.minecraftforge.fml.common.ProgressManager.ProgressBar bar = net.minecraftforge.fml.common.ProgressManager.push("Texture stitching", skipFirst ? 0 : this.mapRegisteredSprites.size()); ++ ++ if(!skipFirst) + for (Entry entry : this.mapRegisteredSprites.entrySet()) + { + TextureAtlasSprite textureatlassprite = (TextureAtlasSprite)entry.getValue(); + ResourceLocation resourcelocation = this.func_184396_a(textureatlassprite); ++ bar.step(resourcelocation.getResourcePath()); + IResource iresource = null; + ++ if (textureatlassprite.hasCustomLoader(resourceManager, resourcelocation)) ++ { ++ if (textureatlassprite.load(resourceManager, resourcelocation)) ++ { ++ continue; ++ } ++ } ++ else + try + { + PngSizeInfo pngsizeinfo = PngSizeInfo.func_188532_a(resourceManager.getResource(resourcelocation)); +@@ -103,12 +130,14 @@ + } + catch (RuntimeException runtimeexception) + { +- logger.error((String)("Unable to parse metadata from " + resourcelocation), (Throwable)runtimeexception); ++ //logger.error((String)("Unable to parse metadata from " + resourcelocation), (Throwable)runtimeexception); ++ net.minecraftforge.fml.client.FMLClientHandler.instance().trackBrokenTexture(resourcelocation, runtimeexception.getMessage()); + continue; + } + catch (IOException ioexception) + { +- logger.error((String)("Using missing texture, unable to load " + resourcelocation), (Throwable)ioexception); ++ //logger.error((String)("Using missing texture, unable to load " + resourcelocation), (Throwable)ioexception); ++ net.minecraftforge.fml.client.FMLClientHandler.instance().trackMissingTexture(resourcelocation); + continue; + } + finally +@@ -128,6 +157,7 @@ + stitcher.addSprite(textureatlassprite); + } + ++ net.minecraftforge.fml.common.ProgressManager.pop(bar); + int l = Math.min(j, k); + int i1 = MathHelper.calculateLogBaseTwo(l); + +@@ -139,9 +169,12 @@ this.missingImage.generateMipmaps(this.mipmapLevels); stitcher.addSprite(this.missingImage); -+ net.minecraftforge.fml.common.ProgressManager.pop(bar); + skipFirst = false; + bar = net.minecraftforge.fml.common.ProgressManager.push("Texture creation", 3); @@ -54,9 +105,21 @@ stitcher.doStitch(); } catch (StitcherException stitcherexception) -@@ -253,6 +270,13 @@ - crashreportcategory.addCrashSection("Mipmap levels", Integer.valueOf(this.mipmapLevels)); - throw new ReportedException(crashreport); +@@ -150,9 +183,11 @@ + } + + logger.info("Created: {}x{} {}-atlas", new Object[] {Integer.valueOf(stitcher.getCurrentWidth()), Integer.valueOf(stitcher.getCurrentHeight()), this.basePath}); ++ bar.step("Allocating GL texture"); + TextureUtil.allocateTextureImpl(this.getGlTextureId(), this.mipmapLevels, stitcher.getCurrentWidth(), stitcher.getCurrentHeight()); + Map map = Maps.newHashMap(this.mapRegisteredSprites); + ++ bar.step("Uploading GL texture"); + for (TextureAtlasSprite textureatlassprite1 : stitcher.getStichSlots()) + { + if (textureatlassprite1 == this.missingImage || this.func_184397_a(resourceManager, textureatlassprite1)) +@@ -185,6 +220,13 @@ + { + textureatlassprite2.copyFrom(this.missingImage); } + + net.minecraftforge.client.ForgeHooksClient.onTextureStitchedPost(this); @@ -67,8 +130,8 @@ + net.minecraftforge.fml.common.ProgressManager.pop(bar); } - private ResourceLocation func_184396_a(TextureAtlasSprite p_184396_1_) -@@ -317,4 +341,37 @@ + private boolean func_184397_a(IResourceManager p_184397_1_, final TextureAtlasSprite p_184397_2_) +@@ -317,4 +359,37 @@ { return this.missingImage; } diff --git a/patches.mcp/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.java.patch b/patches.mcp/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.java.patch index 0f22cecab2..d84e76f4e9 100644 --- a/patches.mcp/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.java.patch +++ b/patches.mcp/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.java.patch @@ -1,6 +1,21 @@ --- ../src-base/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.java +++ ../src-work/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.java -@@ -129,6 +129,11 @@ +@@ -106,11 +106,14 @@ + { + if (tileentityIn.getDistanceSq(this.entityX, this.entityY, this.entityZ) < tileentityIn.getMaxRenderDistanceSquared()) + { ++ if(!tileentityIn.hasFastRenderer()) ++ { + int i = this.worldObj.getCombinedLight(tileentityIn.getPos(), 0); + int j = i % 65536; + int k = i / 65536; + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)j, (float)k); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); ++ } + BlockPos blockpos = tileentityIn.getPos(); + this.renderTileEntityAt(tileentityIn, (double)blockpos.getX() - staticPlayerX, (double)blockpos.getY() - staticPlayerY, (double)blockpos.getZ() - staticPlayerZ, partialTicks, destroyStage); + } +@@ -129,6 +132,11 @@ { try { @@ -12,7 +27,7 @@ tileentityspecialrenderer.renderTileEntityAt(tileEntityIn, x, y, z, partialTicks, destroyStage); } catch (Throwable throwable) -@@ -155,4 +160,49 @@ +@@ -155,4 +163,49 @@ { return this.fontRenderer; } diff --git a/rejects/minecraft/net/minecraft/client/renderer/BlockModelRenderer.java.patch.rej b/rejects/minecraft/net/minecraft/client/renderer/BlockModelRenderer.java.patch.rej deleted file mode 100644 index 21f015f76a..0000000000 --- a/rejects/minecraft/net/minecraft/client/renderer/BlockModelRenderer.java.patch.rej +++ /dev/null @@ -1,23 +0,0 @@ -++++ REJECTED PATCH 1 - @SideOnly(Side.CLIENT) - public static enum EnumNeighborInfo - { -- DOWN(new EnumFacing[]{EnumFacing.WEST, EnumFacing.EAST, EnumFacing.NORTH, EnumFacing.SOUTH}, 0.5F, false, new BlockModelRenderer.Orientation[0], new BlockModelRenderer.Orientation[0], new BlockModelRenderer.Orientation[0], new BlockModelRenderer.Orientation[0]), -- UP(new EnumFacing[]{EnumFacing.EAST, EnumFacing.WEST, EnumFacing.NORTH, EnumFacing.SOUTH}, 1.0F, false, new BlockModelRenderer.Orientation[0], new BlockModelRenderer.Orientation[0], new BlockModelRenderer.Orientation[0], new BlockModelRenderer.Orientation[0]), -+ // -- Forge Patch to Fix Top/Bottom Lighting Interpolation -- -+ // Forge PR - https://github.com/MinecraftForge/MinecraftForge/pull/1892 -+ // Mojang Bug - https://bugs.mojang.com/browse/MC-80148 -+ DOWN( new EnumFacing[]{ EnumFacing.WEST, EnumFacing.EAST, EnumFacing.NORTH, EnumFacing.SOUTH }, 0.5F, true, -+ new Orientation[]{ Orientation.FLIP_WEST, Orientation.SOUTH, Orientation.FLIP_WEST, Orientation.FLIP_SOUTH, Orientation.WEST, Orientation.FLIP_SOUTH, Orientation.WEST, Orientation.SOUTH }, -+ new Orientation[]{ Orientation.FLIP_WEST, Orientation.NORTH, Orientation.FLIP_WEST, Orientation.FLIP_NORTH, Orientation.WEST, Orientation.FLIP_NORTH, Orientation.WEST, Orientation.NORTH }, -+ new Orientation[]{ Orientation.FLIP_EAST, Orientation.NORTH, Orientation.FLIP_EAST, Orientation.FLIP_NORTH, Orientation.EAST, Orientation.FLIP_NORTH, Orientation.EAST, Orientation.NORTH }, -+ new Orientation[]{ Orientation.FLIP_EAST, Orientation.SOUTH, Orientation.FLIP_EAST, Orientation.FLIP_SOUTH, Orientation.EAST, Orientation.FLIP_SOUTH, Orientation.EAST, Orientation.SOUTH } ), -+ UP( new EnumFacing[]{ EnumFacing.EAST, EnumFacing.WEST, EnumFacing.NORTH, EnumFacing.SOUTH }, 1.0F, true, -+ new Orientation[]{ Orientation.EAST, Orientation.SOUTH, Orientation.EAST, Orientation.FLIP_SOUTH, Orientation.FLIP_EAST, Orientation.FLIP_SOUTH, Orientation.FLIP_EAST, Orientation.SOUTH }, -+ new Orientation[]{ Orientation.EAST, Orientation.NORTH, Orientation.EAST, Orientation.FLIP_NORTH, Orientation.FLIP_EAST, Orientation.FLIP_NORTH, Orientation.FLIP_EAST, Orientation.NORTH }, -+ new Orientation[]{ Orientation.WEST, Orientation.NORTH, Orientation.WEST, Orientation.FLIP_NORTH, Orientation.FLIP_WEST, Orientation.FLIP_NORTH, Orientation.FLIP_WEST, Orientation.NORTH }, -+ new Orientation[]{ Orientation.WEST, Orientation.SOUTH, Orientation.WEST, Orientation.FLIP_SOUTH, Orientation.FLIP_WEST, Orientation.FLIP_SOUTH, Orientation.FLIP_WEST, Orientation.SOUTH } ), - NORTH(new EnumFacing[]{EnumFacing.UP, EnumFacing.DOWN, EnumFacing.EAST, EnumFacing.WEST}, 0.8F, true, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.FLIP_WEST, BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.WEST, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.WEST, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.FLIP_WEST}, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.FLIP_EAST, BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.EAST, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.EAST, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.FLIP_EAST}, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.FLIP_EAST, BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.EAST, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.EAST, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.FLIP_EAST}, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.FLIP_WEST, BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.WEST, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.WEST, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.FLIP_WEST}), - SOUTH(new EnumFacing[]{EnumFacing.WEST, EnumFacing.EAST, EnumFacing.DOWN, EnumFacing.UP}, 0.8F, true, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.FLIP_WEST, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.FLIP_WEST, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.WEST, BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.WEST}, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.FLIP_WEST, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.FLIP_WEST, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.WEST, BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.WEST}, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.FLIP_EAST, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.FLIP_EAST, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.EAST, BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.EAST}, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.FLIP_EAST, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.FLIP_EAST, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.EAST, BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.EAST}), - WEST(new EnumFacing[]{EnumFacing.UP, EnumFacing.DOWN, EnumFacing.NORTH, EnumFacing.SOUTH}, 0.6F, true, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.SOUTH, BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.FLIP_SOUTH, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.FLIP_SOUTH, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.SOUTH}, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.NORTH, BlockModelRenderer.Orientation.UP, BlockModelRenderer.Orientation.FLIP_NORTH, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.FLIP_NORTH, BlockModelRenderer.Orientation.FLIP_UP, BlockModelRenderer.Orientation.NORTH}, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.NORTH, BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.FLIP_NORTH, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.FLIP_NORTH, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.NORTH}, new BlockModelRenderer.Orientation[]{BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.SOUTH, BlockModelRenderer.Orientation.DOWN, BlockModelRenderer.Orientation.FLIP_SOUTH, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.FLIP_SOUTH, BlockModelRenderer.Orientation.FLIP_DOWN, BlockModelRenderer.Orientation.SOUTH}), -++++ END PATCH diff --git a/rejects/minecraft/net/minecraft/client/renderer/BlockRendererDispatcher.java.patch.rej b/rejects/minecraft/net/minecraft/client/renderer/BlockRendererDispatcher.java.patch.rej deleted file mode 100644 index 5c6e047afc..0000000000 --- a/rejects/minecraft/net/minecraft/client/renderer/BlockRendererDispatcher.java.patch.rej +++ /dev/null @@ -1,50 +0,0 @@ -++++ REJECTED PATCH 1 - { - private BlockModelShapes blockModelShapes; - private final GameSettings gameSettings; -- private final BlockModelRenderer blockModelRenderer = new BlockModelRenderer(); -+ private final BlockModelRenderer blockModelRenderer = new net.minecraftforge.client.model.pipeline.ForgeBlockModelRenderer(); - private final ChestRenderer chestRenderer = new ChestRenderer(); - private final BlockFluidRenderer fluidRenderer = new BlockFluidRenderer(); - -++++ END PATCH -++++ REJECTED PATCH 2 - { - state = block.getActualState(state, blockAccess, pos); - IBakedModel ibakedmodel = this.blockModelShapes.getModelForState(state); -+ -+ if(ibakedmodel instanceof net.minecraftforge.client.model.ISmartBlockModel) -+ { -+ IBlockState extendedState = block.getExtendedState(state, blockAccess, pos); -+ for ( net.minecraft.util.EnumWorldBlockLayer layer : net.minecraft.util.EnumWorldBlockLayer.values() ) -+ { -+ if ( block.canRenderInLayer( layer ) ) -+ { -+ net.minecraftforge.client.ForgeHooksClient.setRenderLayer(layer); -+ -+ IBakedModel targetLayer = ((net.minecraftforge.client.model.ISmartBlockModel)ibakedmodel).handleBlockState(extendedState); -+ IBakedModel damageModel = (new SimpleBakedModel.Builder(targetLayer, texture)).makeBakedModel(); -+ this.blockModelRenderer.renderModel(blockAccess, damageModel, state, pos, Tessellator.getInstance().getWorldRenderer()); -+ } -+ } -+ return; -+ } -+ - IBakedModel ibakedmodel1 = (new SimpleBakedModel.Builder(ibakedmodel, texture)).makeBakedModel(); - this.blockModelRenderer.renderModel(blockAccess, ibakedmodel1, state, pos, Tessellator.getInstance().getWorldRenderer()); - } -++++ END PATCH -++++ REJECTED PATCH 3 - ibakedmodel = ((WeightedBakedModel)ibakedmodel).getAlternativeModel(MathHelper.getPositionRandom(pos)); - } - -+ if(ibakedmodel instanceof net.minecraftforge.client.model.ISmartBlockModel) -+ { -+ IBlockState extendedState = block.getExtendedState(state, worldIn, pos); -+ ibakedmodel = ((net.minecraftforge.client.model.ISmartBlockModel)ibakedmodel).handleBlockState(extendedState); -+ } -+ - return ibakedmodel; - } - -++++ END PATCH diff --git a/rejects/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.java.patch.rej b/rejects/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.java.patch.rej deleted file mode 100644 index c919cc702e..0000000000 --- a/rejects/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.java.patch.rej +++ /dev/null @@ -1,9 +0,0 @@ -++++ REJECTED PATCH 2 - for (PotionEffect potioneffect : this.mc.thePlayer.getActivePotionEffects()) - { - Potion potion = Potion.potionTypes[potioneffect.getPotionID()]; -+ if(!potion.shouldRender(potioneffect)) continue; - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(inventoryBackground); - this.drawTexturedModalRect(i, j, 0, 166, 140, 32); -++++ END PATCH diff --git a/rejects/minecraft/net/minecraft/client/renderer/ItemRenderer.java.patch.rej b/rejects/minecraft/net/minecraft/client/renderer/ItemRenderer.java.patch.rej deleted file mode 100644 index d321fc02f6..0000000000 --- a/rejects/minecraft/net/minecraft/client/renderer/ItemRenderer.java.patch.rej +++ /dev/null @@ -1,39 +0,0 @@ -++++ REJECTED PATCH 1 - - if (this.itemToRender != null) - { -- if (this.itemToRender.getItem() == Items.filled_map) -+ if (this.itemToRender.getItem() instanceof net.minecraft.item.ItemMap) - { - this.renderItemMap(abstractclientplayer, f2, f, f1); - } -++++ END PATCH -++++ REJECTED PATCH 3 - if (iblockstate1.getBlock().isVisuallyOpaque()) - { - iblockstate = iblockstate1; -+ overlayPos = blockpos; - } - } - - if (iblockstate.getBlock().getRenderType() != -1) - { -+ if (!net.minecraftforge.event.ForgeEventFactory.renderBlockOverlay(mc.thePlayer, partialTicks, net.minecraftforge.client.event.RenderBlockOverlayEvent.OverlayType.BLOCK, iblockstate, overlayPos)) - this.func_178108_a(partialTicks, this.mc.getBlockRendererDispatcher().getBlockModelShapes().getTexture(iblockstate)); - } - } -++++ END PATCH -++++ REJECTED PATCH 5 - { - if (!this.itemToRender.getIsItemStackEqual(itemstack)) - { -+ if (!this.itemToRender.getItem().shouldCauseReequipAnimation(this.itemToRender, itemstack, equippedItemSlot != entityplayer.inventory.currentItem)) -+ { -+ this.itemToRender = itemstack; -+ this.equippedItemSlot = entityplayer.inventory.currentItem; -+ return; -+ } - flag = true; - } - } -++++ END PATCH diff --git a/rejects/minecraft/net/minecraft/client/renderer/WorldVertexBufferUploader.java.patch.rej b/rejects/minecraft/net/minecraft/client/renderer/WorldVertexBufferUploader.java.patch.rej deleted file mode 100644 index 1aadf25404..0000000000 --- a/rejects/minecraft/net/minecraft/client/renderer/WorldVertexBufferUploader.java.patch.rej +++ /dev/null @@ -1,66 +0,0 @@ -++++ REJECTED PATCH 1 - - for (int j = 0; j < list.size(); ++j) - { -+ // moved to VertexFormatElement.preDraw - VertexFormatElement vertexformatelement = (VertexFormatElement)list.get(j); -- VertexFormatElement.EnumUsage vertexformatelement$enumusage = vertexformatelement.getUsage(); -- int k = vertexformatelement.getType().getGlConstant(); -- int l = vertexformatelement.getIndex(); -- bytebuffer.position(vertexformat.func_181720_d(j)); -- -- switch (vertexformatelement$enumusage) -- { -- case POSITION: -- GL11.glVertexPointer(vertexformatelement.getElementCount(), k, i, bytebuffer); -- GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY); -- break; -- case UV: -- OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit + l); -- GL11.glTexCoordPointer(vertexformatelement.getElementCount(), k, i, bytebuffer); -- GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); -- OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit); -- break; -- case COLOR: -- GL11.glColorPointer(vertexformatelement.getElementCount(), k, i, bytebuffer); -- GL11.glEnableClientState(GL11.GL_COLOR_ARRAY); -- break; -- case NORMAL: -- GL11.glNormalPointer(k, i, bytebuffer); -- GL11.glEnableClientState(GL11.GL_NORMAL_ARRAY); -- } -+ vertexformatelement.getUsage().preDraw(vertexformat, j, i, bytebuffer); - } - - GL11.glDrawArrays(p_181679_1_.getDrawMode(), 0, p_181679_1_.getVertexCount()); -++++ END PATCH -++++ REJECTED PATCH 2 - for (int j1 = list.size(); i1 < j1; ++i1) - { - VertexFormatElement vertexformatelement1 = (VertexFormatElement)list.get(i1); -- VertexFormatElement.EnumUsage vertexformatelement$enumusage1 = vertexformatelement1.getUsage(); -- int k1 = vertexformatelement1.getIndex(); -- -- switch (vertexformatelement$enumusage1) -- { -- case POSITION: -- GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY); -- break; -- case UV: -- OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit + k1); -- GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); -- OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit); -- break; -- case COLOR: -- GL11.glDisableClientState(GL11.GL_COLOR_ARRAY); -- GlStateManager.resetColor(); -- break; -- case NORMAL: -- GL11.glDisableClientState(GL11.GL_NORMAL_ARRAY); -- } -+ // moved to VertexFormatElement.postDraw -+ vertexformatelement1.getUsage().postDraw(vertexformat, i1, i, bytebuffer); - } - } - -++++ END PATCH diff --git a/rejects/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch.rej b/rejects/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch.rej deleted file mode 100644 index 18d3267450..0000000000 --- a/rejects/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.java.patch.rej +++ /dev/null @@ -1,12 +0,0 @@ -++++ REJECTED PATCH 3 - } - } - -- EnumWorldBlockLayer enumworldblocklayer1 = block.getBlockLayer(); -+ for(EnumWorldBlockLayer enumworldblocklayer1 : EnumWorldBlockLayer.values()) { -+ if(!block.canRenderInLayer(enumworldblocklayer1)) continue; -+ net.minecraftforge.client.ForgeHooksClient.setRenderLayer(enumworldblocklayer1); - int j = enumworldblocklayer1.ordinal(); - - if (block.getRenderType() != -1) -++++ END PATCH diff --git a/rejects/minecraft/net/minecraft/client/renderer/texture/TextureMap.java.patch.rej b/rejects/minecraft/net/minecraft/client/renderer/texture/TextureMap.java.patch.rej index 25b88228c7..b48a3f0884 100644 --- a/rejects/minecraft/net/minecraft/client/renderer/texture/TextureMap.java.patch.rej +++ b/rejects/minecraft/net/minecraft/client/renderer/texture/TextureMap.java.patch.rej @@ -1,60 +1,3 @@ -++++ REJECTED PATCH 4 - int j = Integer.MAX_VALUE; - int k = 1 << this.mipmapLevels; - -+ net.minecraftforge.client.ForgeHooksClient.onTextureStitchedPre(this); -+ net.minecraftforge.fml.common.FMLLog.info("Max texture size: %d", i); -+ net.minecraftforge.fml.common.ProgressManager.ProgressBar bar = net.minecraftforge.fml.common.ProgressManager.push("Texture stitching", skipFirst ? 0 : this.mapRegisteredSprites.size()); -+ -+ if(!skipFirst) - for (Entry entry : this.mapRegisteredSprites.entrySet()) - { - TextureAtlasSprite textureatlassprite = (TextureAtlasSprite)entry.getValue(); - ResourceLocation resourcelocation = new ResourceLocation(textureatlassprite.getIconName()); - ResourceLocation resourcelocation1 = this.completeResourceLocation(resourcelocation, 0); -+ bar.step(resourcelocation1.getResourcePath()); - -+ if (textureatlassprite.hasCustomLoader(resourceManager, resourcelocation)) -+ { -+ if (!textureatlassprite.load(resourceManager, resourcelocation)) -+ { -+ j = Math.min(j, Math.min(textureatlassprite.getIconWidth(), textureatlassprite.getIconHeight())); -+ stitcher.addSprite(textureatlassprite); -+ } -+ continue; -+ } -+ - try - { - IResource iresource = resourceManager.getResource(resourcelocation1); -++++ END PATCH -++++ REJECTED PATCH 5 - } - catch (RuntimeException runtimeexception) - { -- logger.error((String)("Unable to parse metadata from " + resourcelocation1), (Throwable)runtimeexception); -+ //logger.error((String)("Unable to parse metadata from " + resourcelocation1), (Throwable)runtimeexception); -+ net.minecraftforge.fml.client.FMLClientHandler.instance().trackBrokenTexture(resourcelocation1, runtimeexception.getMessage()); - continue; - } - catch (IOException ioexception1) - { -- logger.error((String)("Using missing texture, unable to load " + resourcelocation1), (Throwable)ioexception1); -+ //logger.error((String)("Using missing texture, unable to load " + resourcelocation1), (Throwable)ioexception1); -+ net.minecraftforge.fml.client.FMLClientHandler.instance().trackMissingTexture(resourcelocation1); - continue; - } - -++++ END PATCH -++++ REJECTED PATCH 6 - stitcher.addSprite(textureatlassprite); - } - -+ net.minecraftforge.fml.common.ProgressManager.pop(bar); - int j1 = Math.min(j, k); - int k1 = MathHelper.calculateLogBaseTwo(j1); - -++++ END PATCH ++++ REJECTED PATCH 7 this.mipmapLevels = k1; } @@ -68,16 +11,3 @@ { textureatlassprite1.generateMipmaps(this.mipmapLevels); ++++ END PATCH -++++ REJECTED PATCH 9 - } - - logger.info("Created: {}x{} {}-atlas", new Object[] {Integer.valueOf(stitcher.getCurrentWidth()), Integer.valueOf(stitcher.getCurrentHeight()), this.basePath}); -+ bar.step("Allocating GL texture"); - TextureUtil.allocateTextureImpl(this.getGlTextureId(), this.mipmapLevels, stitcher.getCurrentWidth(), stitcher.getCurrentHeight()); - Map map = Maps.newHashMap(this.mapRegisteredSprites); - -+ bar.step("Uploading GL texture"); - for (TextureAtlasSprite textureatlassprite2 : stitcher.getStichSlots()) - { - String s = textureatlassprite2.getIconName(); -++++ END PATCH diff --git a/rejects/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.java.patch.rej b/rejects/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.java.patch.rej deleted file mode 100644 index 4cd0abd615..0000000000 --- a/rejects/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.java.patch.rej +++ /dev/null @@ -1,16 +0,0 @@ -++++ REJECTED PATCH 1 - { - if (tileentityIn.getDistanceSq(this.entityX, this.entityY, this.entityZ) < tileentityIn.getMaxRenderDistanceSquared()) - { -+ if(!tileentityIn.hasFastRenderer()) -+ { - int i = this.worldObj.getCombinedLight(tileentityIn.getPos(), 0); - int j = i % 65536; - int k = i / 65536; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)j / 1.0F, (float)k / 1.0F); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); -+ } - BlockPos blockpos = tileentityIn.getPos(); - this.renderTileEntityAt(tileentityIn, (double)blockpos.getX() - staticPlayerX, (double)blockpos.getY() - staticPlayerY, (double)blockpos.getZ() - staticPlayerZ, partialTicks, destroyStage); - } -++++ END PATCH diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index 9c32496f81..a806b6ff79 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -26,6 +26,7 @@ import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderGlobal; +import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; @@ -34,6 +35,8 @@ import net.minecraft.client.renderer.block.model.ModelBakery; import net.minecraft.client.renderer.block.model.ModelManager; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelRotation; +import net.minecraft.client.renderer.block.model.SimpleBakedModel; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -83,6 +86,7 @@ import net.minecraftforge.fml.common.FMLLog; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.BufferUtils; +import com.google.common.base.Objects; import com.google.common.base.Optional; import com.google.common.collect.Maps; @@ -594,4 +598,21 @@ public class ForgeHooksClient } } } + + public static IBakedModel getDamageModel(IBakedModel ibakedmodel, TextureAtlasSprite texture, IBlockState state, IBlockAccess world, BlockPos pos) + { + // TODO custom damage models + // state = state.block.getExtendedState(state, world, pos); + return (new SimpleBakedModel.Builder(state, ibakedmodel, texture, pos)).makeBakedModel(); + } + + public static boolean shouldCauseReequipAnimation(ItemStack from, ItemStack to) + { + if(!Objects.equal(from, to) || from == null) + { + return false; + } + // FIXME: 3rd argument? + return from.getItem().shouldCauseReequipAnimation(from, to); + } }