From 7808958cbc161ee98a6c76f9d0bb8221049e6989 Mon Sep 17 00:00:00 2001 From: Justin Aquadro Date: Mon, 7 Sep 2015 16:57:13 -0400 Subject: [PATCH] Fix rare race-related crash in SSP --- build.gradle | 2 +- .../minecraft/gardencore/GardenCore.java | 3 ++- .../gardencore/block/BlockGardenProxy.java | 9 ++++----- .../gardencore/core/ClientProxy.java | 13 ++++++++++-- .../gardencore/core/CommonProxy.java | 20 ++++++++++++++++++- .../gardencore/core/ServerProxy.java | 16 +++++++++++++++ .../minecraft/gardenstuff/GardenStuff.java | 1 + .../gardenstuff/block/BlockLantern.java | 2 -- .../gardenstuff/core/ClientProxy.java | 11 ++++++++++ .../gardenstuff/core/CommonProxy.java | 20 ++++++++++++++++++- .../gardenstuff/core/ServerProxy.java | 16 +++++++++++++++ .../gardenstuff/renderer/LanternRenderer.java | 9 ++++++--- 12 files changed, 106 insertions(+), 16 deletions(-) create mode 100644 src/com/jaquadro/minecraft/gardencore/core/ServerProxy.java create mode 100644 src/com/jaquadro/minecraft/gardenstuff/core/ServerProxy.java diff --git a/build.gradle b/build.gradle index 98a7ab0..a68e367 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ repositories { apply plugin: 'forge' -version = "1.7.10-1.6.5" +version = "1.7.10-1.6.6" group= "com.jaquadro.gardenstuff" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "GardenStuff" diff --git a/src/com/jaquadro/minecraft/gardencore/GardenCore.java b/src/com/jaquadro/minecraft/gardencore/GardenCore.java index 5ebdbb1..4eda97d 100644 --- a/src/com/jaquadro/minecraft/gardencore/GardenCore.java +++ b/src/com/jaquadro/minecraft/gardencore/GardenCore.java @@ -33,7 +33,7 @@ public class GardenCore @Mod.Instance(MOD_ID) public static GardenCore instance; - @SidedProxy(clientSide = SOURCE_PATH + "core.ClientProxy", serverSide = SOURCE_PATH + "core.CommonProxy") + @SidedProxy(clientSide = SOURCE_PATH + "core.ClientProxy", serverSide = SOURCE_PATH + "core.ServerProxy") public static CommonProxy proxy; @Mod.EventHandler @@ -57,6 +57,7 @@ public void init (FMLInitializationEvent event) { @Mod.EventHandler public void postInit (FMLPostInitializationEvent event) { + proxy.postInit(); integration.postInit(); recipes.init(); diff --git a/src/com/jaquadro/minecraft/gardencore/block/BlockGardenProxy.java b/src/com/jaquadro/minecraft/gardencore/block/BlockGardenProxy.java index c825974..b336b07 100644 --- a/src/com/jaquadro/minecraft/gardencore/block/BlockGardenProxy.java +++ b/src/com/jaquadro/minecraft/gardencore/block/BlockGardenProxy.java @@ -40,7 +40,6 @@ public class BlockGardenProxy extends Block implements IPlantProxy // Scratch State private boolean applyingBonemeal; - private BindingStack binding = new BindingStack(); // Reentrant Flags private int reeLightValue; @@ -83,11 +82,11 @@ public void bindSlot (World world, int x, int y, int z, TileEntityGarden te, int if (getPlantBlock(te, slot) != null) data = getPlantData(te, slot); - binding.bind(world, x, y, z, slot, data); + GardenCore.proxy.getBindingStack(this).bind(world, x, y, z, slot, data); } public void unbindSlot (World world, int x, int y, int z, TileEntityGarden te) { - binding.unbind(world, x, y, z); + GardenCore.proxy.getBindingStack(this).unbind(world, x, y, z); } @Override @@ -524,7 +523,7 @@ public void randomDisplayTick (World world, int x, int y, int z, Random random) @SideOnly(Side.CLIENT) @Override public int colorMultiplier (IBlockAccess blockAccess, int x, int y, int z) { - int slot = binding.getSlot(); + int slot = GardenCore.proxy.getBindingStack(this).getSlot(); TileEntityGarden te = getGardenEntity(blockAccess, x, y, z); if (te == null || slot == -1) return super.colorMultiplier(blockAccess, x, y, z); @@ -544,7 +543,7 @@ public int colorMultiplier (IBlockAccess blockAccess, int x, int y, int z) { @SideOnly(Side.CLIENT) @Override public IIcon getIcon (IBlockAccess blockAccess, int x, int y, int z, int side) { - int slot = binding.getSlot(); + int slot = GardenCore.proxy.getBindingStack(this).getSlot(); TileEntityGarden te = getGardenEntity(blockAccess, x, y, z); if (te == null || slot == -1) return super.getIcon(blockAccess, x, y, z, side); diff --git a/src/com/jaquadro/minecraft/gardencore/core/ClientProxy.java b/src/com/jaquadro/minecraft/gardencore/core/ClientProxy.java index 852a6c1..f967664 100644 --- a/src/com/jaquadro/minecraft/gardencore/core/ClientProxy.java +++ b/src/com/jaquadro/minecraft/gardencore/core/ClientProxy.java @@ -1,10 +1,12 @@ package com.jaquadro.minecraft.gardencore.core; import com.jaquadro.minecraft.gardencore.client.renderer.*; +import com.jaquadro.minecraft.gardencore.util.BindingStack; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import cpw.mods.fml.client.registry.RenderingRegistry; -import net.minecraft.item.Item; -import net.minecraftforge.client.MinecraftForgeClient; + +import java.util.HashMap; +import java.util.Map; public class ClientProxy extends CommonProxy { @@ -18,6 +20,8 @@ public class ClientProxy extends CommonProxy public static ISimpleBlockRenderingHandler smallFireRenderer; public static ISimpleBlockRenderingHandler compostBinRenderer; + private Map bindingStacks = new HashMap(); + @Override public void registerRenderers () { @@ -33,4 +37,9 @@ public void registerRenderers () RenderingRegistry.registerBlockHandler(smallFireRenderID, smallFireRenderer); RenderingRegistry.registerBlockHandler(compostBinRenderID, compostBinRenderer); } + + @Override + protected Map getBindingRegistry () { + return bindingStacks; + } } diff --git a/src/com/jaquadro/minecraft/gardencore/core/CommonProxy.java b/src/com/jaquadro/minecraft/gardencore/core/CommonProxy.java index 2bf9209..8a5553d 100644 --- a/src/com/jaquadro/minecraft/gardencore/core/CommonProxy.java +++ b/src/com/jaquadro/minecraft/gardencore/core/CommonProxy.java @@ -1,8 +1,26 @@ package com.jaquadro.minecraft.gardencore.core; -public class CommonProxy +import com.jaquadro.minecraft.gardencore.util.BindingStack; + +import java.util.Map; + +public abstract class CommonProxy { public void registerRenderers () { } + + public void postInit () { + registerBindingStack(ModBlocks.gardenProxy); + } + + protected abstract Map getBindingRegistry (); + + public void registerBindingStack (Object object) { + getBindingRegistry().put(object, new BindingStack()); + } + + public BindingStack getBindingStack (Object object) { + return getBindingRegistry().get(object); + } } diff --git a/src/com/jaquadro/minecraft/gardencore/core/ServerProxy.java b/src/com/jaquadro/minecraft/gardencore/core/ServerProxy.java new file mode 100644 index 0000000..f6a3ff5 --- /dev/null +++ b/src/com/jaquadro/minecraft/gardencore/core/ServerProxy.java @@ -0,0 +1,16 @@ +package com.jaquadro.minecraft.gardencore.core; + +import com.jaquadro.minecraft.gardencore.util.BindingStack; + +import java.util.HashMap; +import java.util.Map; + +public class ServerProxy extends CommonProxy +{ + private Map bindingStacks = new HashMap(); + + @Override + protected Map getBindingRegistry () { + return bindingStacks; + } +} diff --git a/src/com/jaquadro/minecraft/gardenstuff/GardenStuff.java b/src/com/jaquadro/minecraft/gardenstuff/GardenStuff.java index 09a66e6..6cd6f2f 100644 --- a/src/com/jaquadro/minecraft/gardenstuff/GardenStuff.java +++ b/src/com/jaquadro/minecraft/gardenstuff/GardenStuff.java @@ -44,6 +44,7 @@ public void init (FMLInitializationEvent event) { @Mod.EventHandler public void postInit (FMLPostInitializationEvent event) { + proxy.postInit(); recipes.init(); integration.postInit(); } diff --git a/src/com/jaquadro/minecraft/gardenstuff/block/BlockLantern.java b/src/com/jaquadro/minecraft/gardenstuff/block/BlockLantern.java index 9dc48b8..0697339 100644 --- a/src/com/jaquadro/minecraft/gardenstuff/block/BlockLantern.java +++ b/src/com/jaquadro/minecraft/gardenstuff/block/BlockLantern.java @@ -56,8 +56,6 @@ public class BlockLantern extends BlockContainer implements IInfusionStabiliser @SideOnly(Side.CLIENT) private IIcon iconCandle; - public BindingStack binding = new BindingStack(); - public BlockLantern (String blockName) { super(Material.iron); diff --git a/src/com/jaquadro/minecraft/gardenstuff/core/ClientProxy.java b/src/com/jaquadro/minecraft/gardenstuff/core/ClientProxy.java index 405b5da..7944dd3 100644 --- a/src/com/jaquadro/minecraft/gardenstuff/core/ClientProxy.java +++ b/src/com/jaquadro/minecraft/gardenstuff/core/ClientProxy.java @@ -1,11 +1,15 @@ package com.jaquadro.minecraft.gardenstuff.core; +import com.jaquadro.minecraft.gardencore.util.BindingStack; import com.jaquadro.minecraft.gardenstuff.renderer.*; import com.jaquadro.minecraft.gardenstuff.renderer.item.LanternItemRenderer; import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.item.Item; import net.minecraftforge.client.MinecraftForgeClient; +import java.util.HashMap; +import java.util.Map; + public class ClientProxy extends CommonProxy { public static int heavyChainRenderID; @@ -16,6 +20,8 @@ public class ClientProxy extends CommonProxy public static LanternRenderer lanternRenderer; + private Map bindingStacks = new HashMap(); + @Override public void registerRenderers () { heavyChainRenderID = RenderingRegistry.getNextAvailableRenderId(); @@ -34,4 +40,9 @@ public void registerRenderers () { MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.lantern), new LanternItemRenderer()); } + + @Override + protected Map getBindingRegistry () { + return bindingStacks; + } } diff --git a/src/com/jaquadro/minecraft/gardenstuff/core/CommonProxy.java b/src/com/jaquadro/minecraft/gardenstuff/core/CommonProxy.java index b8bfcbd..eef4863 100644 --- a/src/com/jaquadro/minecraft/gardenstuff/core/CommonProxy.java +++ b/src/com/jaquadro/minecraft/gardenstuff/core/CommonProxy.java @@ -1,7 +1,25 @@ package com.jaquadro.minecraft.gardenstuff.core; -public class CommonProxy +import com.jaquadro.minecraft.gardencore.util.BindingStack; + +import java.util.Map; + +public abstract class CommonProxy { public void registerRenderers () { } + + public void postInit () { + registerBindingStack(ModBlocks.lantern); + } + + protected abstract Map getBindingRegistry (); + + public void registerBindingStack (Object object) { + getBindingRegistry().put(object, new BindingStack()); + } + + public BindingStack getBindingStack (Object object) { + return getBindingRegistry().get(object); + } } \ No newline at end of file diff --git a/src/com/jaquadro/minecraft/gardenstuff/core/ServerProxy.java b/src/com/jaquadro/minecraft/gardenstuff/core/ServerProxy.java new file mode 100644 index 0000000..3505744 --- /dev/null +++ b/src/com/jaquadro/minecraft/gardenstuff/core/ServerProxy.java @@ -0,0 +1,16 @@ +package com.jaquadro.minecraft.gardenstuff.core; + +import com.jaquadro.minecraft.gardencore.util.BindingStack; + +import java.util.HashMap; +import java.util.Map; + +public class ServerProxy extends CommonProxy +{ + private Map bindingStacks = new HashMap(); + + @Override + protected Map getBindingRegistry () { + return bindingStacks; + } +} diff --git a/src/com/jaquadro/minecraft/gardenstuff/renderer/LanternRenderer.java b/src/com/jaquadro/minecraft/gardenstuff/renderer/LanternRenderer.java index d6cf012..0bdfbf1 100644 --- a/src/com/jaquadro/minecraft/gardenstuff/renderer/LanternRenderer.java +++ b/src/com/jaquadro/minecraft/gardenstuff/renderer/LanternRenderer.java @@ -5,7 +5,9 @@ import com.jaquadro.minecraft.gardenapi.api.connect.IAttachable; import com.jaquadro.minecraft.gardenapi.internal.Api; import com.jaquadro.minecraft.gardenapi.api.connect.IChainSingleAttachable; +import com.jaquadro.minecraft.gardencore.util.BindingStack; import com.jaquadro.minecraft.gardencore.util.RenderHelper; +import com.jaquadro.minecraft.gardenstuff.GardenStuff; import com.jaquadro.minecraft.gardenstuff.block.BlockLantern; import com.jaquadro.minecraft.gardenstuff.block.tile.TileEntityLantern; import com.jaquadro.minecraft.gardenstuff.core.ClientProxy; @@ -53,8 +55,9 @@ private boolean renderWorldBlock (IBlockAccess world, int x, int y, int z, Block TileEntityLantern tile = block.getTileEntity(world, x, y, z); if (tile != null) { - block.binding.setDefaultMeta(world.getBlockMetadata(x, y, z)); - block.binding.bind(tile.getWorldObj(), x, y, z, 0, tile.getLightSourceMeta()); + BindingStack binding = GardenStuff.proxy.getBindingStack(block); + binding.setDefaultMeta(world.getBlockMetadata(x, y, z)); + binding.bind(tile.getWorldObj(), x, y, z, 0, tile.getLightSourceMeta()); Tessellator.instance.addTranslation(0, .001f, 0); if (tile.getLightSource() != null) { @@ -64,7 +67,7 @@ private boolean renderWorldBlock (IBlockAccess world, int x, int y, int z, Block } Tessellator.instance.addTranslation(0, -.001f, 0); - block.binding.unbind(tile.getWorldObj(), x, y, z); + binding.unbind(tile.getWorldObj(), x, y, z); } renderChain(world, renderer, block, x, y, z);