diff --git a/src/main/java/net/minecraft/item/crafting/FurnaceRecipes.java b/src/main/java/net/minecraft/item/crafting/FurnaceRecipes.java index a9e92a5..347866f 100644 --- a/src/main/java/net/minecraft/item/crafting/FurnaceRecipes.java +++ b/src/main/java/net/minecraft/item/crafting/FurnaceRecipes.java @@ -17,8 +17,8 @@ public class FurnaceRecipes { private static final FurnaceRecipes smeltingBase = new FurnaceRecipes(); - private Map smeltingList = new ItemStackHashMap(false); - private Map experienceList = new HashMap(); + private Map smeltingList = new ItemStackHashMap<>(); + private Map experienceList = new ItemStackHashMap<>(); private static final String __OBFID = "CL_00000085"; public static FurnaceRecipes smelting() @@ -115,7 +115,9 @@ { float ret = p_151398_1_.getItem().getSmeltingExperience(p_151398_1_); if (ret != -1) return ret; - + Float f = (Float)experienceList.get(p_151398_1_);//It's ItemStackHashMap + return f == null ? 0.0F : f; + /* Iterator iterator = this.experienceList.entrySet().iterator(); Entry entry; @@ -131,10 +133,6 @@ while (!this.func_151397_a(p_151398_1_, (ItemStack)entry.getKey())); return ((Float)entry.getValue()).floatValue(); - } - - public void remap() - { - ((ItemStackHashMap)smeltingList).remap(); + */ } } \ No newline at end of file diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index 96c0ed6..9780f31 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -257,9 +257,15 @@ @Subscribe public void remap(FMLModIdMappingEvent e) { - MinecraftForge.EVENT_BUS.post(new ForgeModIdMappingEvent(e)); - FurnaceRecipes.smelting().remap(); - recipeCache.clearCache(); + try + { + MinecraftForge.EVENT_BUS.post(new ForgeModIdMappingEvent(e)); + recipeCache.clearCache(); + } + catch (Throwable t) + { + controller.errorOccurred(this, t); + } } @NetworkCheckHandler diff --git a/src/main/java/org/ultramine/server/internal/UMEventHandler.java b/src/main/java/org/ultramine/server/internal/UMEventHandler.java index ce2e9ab..f12db2c 100644 --- a/src/main/java/org/ultramine/server/internal/UMEventHandler.java +++ b/src/main/java/org/ultramine/server/internal/UMEventHandler.java @@ -9,6 +9,7 @@ import org.ultramine.server.UltramineServerConfig.ToolsConf.AutoDebugInfoConf; import org.ultramine.server.chunk.ChunkProfiler; import org.ultramine.server.data.player.PlayerCoreData; +import org.ultramine.server.event.ForgeModIdMappingEvent; import org.ultramine.server.util.BasicTypeFormatter; import org.ultramine.server.util.BasicTypeParser; import org.ultramine.server.util.WarpLocation; @@ -334,4 +335,10 @@ { ((EntityPlayerMP)e.player).getData().core().onLogin(); } + + @SubscribeEvent + public void onForgeModIdMapping(ForgeModIdMappingEvent e) + { + UMInternalRegistry.onRemap(); + } } diff --git a/src/main/java/org/ultramine/server/internal/UMInternalRegistry.java b/src/main/java/org/ultramine/server/internal/UMInternalRegistry.java new file mode 100644 index 0000000..b6eadf8 --- /dev/null +++ b/src/main/java/org/ultramine/server/internal/UMInternalRegistry.java @@ -0,0 +1,37 @@ +package org.ultramine.server.internal; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + +public class UMInternalRegistry +{ + private static final List> remapHandlers = new ArrayList<>(); + + public static void registerRemapHandler(IRemapHandler handler) + { + clearRemapHandlers(); + remapHandlers.add(new WeakReference<>(handler)); + } + + private static void clearRemapHandlers() + { + remapHandlers.removeIf(ref -> ref.get() == null); + } + + static void onRemap() + { + clearRemapHandlers(); + for(WeakReference ref : remapHandlers) + { + IRemapHandler handler = ref.get(); + if(handler != null) + handler.remap(); + } + } + + public interface IRemapHandler + { + void remap(); + } +} diff --git a/src/main/java/org/ultramine/server/tools/ItemBlocker.java b/src/main/java/org/ultramine/server/tools/ItemBlocker.java index 913312b..4a1a198 100644 --- a/src/main/java/org/ultramine/server/tools/ItemBlocker.java +++ b/src/main/java/org/ultramine/server/tools/ItemBlocker.java @@ -13,6 +13,7 @@ import org.ultramine.server.tools.ItemBlocker.ItemBlockerSettings.BlockingSettings; import org.ultramine.server.tools.ItemBlocker.ItemBlockerSettings.BlockingWorldList; import org.ultramine.server.util.BasicTypeParser; +import org.ultramine.server.util.ItemStackHashMap; import org.ultramine.server.util.YamlConfigProvider; import cpw.mods.fml.common.FMLCommonHandler; @@ -157,18 +158,9 @@ return stack == null ? null : getBlockingSettings(dim, Item.getIdFromItem(stack.getItem()), stack.getItemDamage()); } - public void remap() - { - for(PerWorldBlocker ws : map.valueCollection()) - { - ws.remap(); - } - } - private class PerWorldBlocker { - private final Map itemMap = new HashMap(); - private final TIntObjectMap fastMap = new TIntObjectHashMap(); + private final ItemStackHashMap itemMap = new ItemStackHashMap<>(); public PerWorldBlocker(List list) { @@ -181,25 +173,11 @@ private void addBlocking(ItemStack type, BlockingSettings set) { itemMap.put(type, set); - fastMap.put((Item.getIdFromItem(type.getItem()) << 16) | (type.getItemDamage() & 0xFFFF), set); - } - - public void remap() - { - for(Entry ent : itemMap.entrySet()) - { - ItemStack input = ent.getKey(); - fastMap.put((Item.getIdFromItem(input.getItem()) << 16) | (input.getItemDamage() & 0xFFFF), ent.getValue()); - } } public BlockingSettings getBlockingSettings(int id, int data) { - int idPart = id << 16; - BlockingSettings ret = fastMap.get(idPart | (data & 0xFFFF)); - if(ret == null) - ret = fastMap.get(idPart | Short.MAX_VALUE); - return ret; + return itemMap.get(id, data); } } diff --git a/src/main/java/org/ultramine/server/util/ItemStackHashMap.java b/src/main/java/org/ultramine/server/util/ItemStackHashMap.java index 690fea0..534764f 100644 --- a/src/main/java/org/ultramine/server/util/ItemStackHashMap.java +++ b/src/main/java/org/ultramine/server/util/ItemStackHashMap.java @@ -14,8 +14,9 @@ import net.minecraftforge.common.MinecraftForge; import net.openhft.koloboke.collect.map.IntObjMap; import net.openhft.koloboke.collect.map.hash.HashIntObjMaps; +import org.ultramine.server.internal.UMInternalRegistry; -public class ItemStackHashMap implements Map +public class ItemStackHashMap implements Map, UMInternalRegistry.IRemapHandler { private final Map map = new TreeMap(ItemStackComparator.INSTANCE); private final IntObjMap fastMap = HashIntObjMaps.newMutableMap(); @@ -29,7 +30,7 @@ public ItemStackHashMap(boolean register) { if(register) - MinecraftForge.EVENT_BUS.register(this); + UMInternalRegistry.registerRemapHandler(this); } public void remap() @@ -39,17 +40,6 @@ putToFastMap(ent.getKey(), ent.getValue()); } - @SubscribeEvent - public void onForgeModIdMapping(ForgeModIdMappingEvent e) - { - remap(); - } - - public void unregister() - { - MinecraftForge.EVENT_BUS.unregister(this); - } - private V putToFastMap(ItemStack key, V value) { if(key.getItemDamage() == 32767) diff --git a/src/main/java/org/ultramine/server/util/ItemStackHashSet.java b/src/main/java/org/ultramine/server/util/ItemStackHashSet.java index fb1c649..4e0919c 100644 --- a/src/main/java/org/ultramine/server/util/ItemStackHashSet.java +++ b/src/main/java/org/ultramine/server/util/ItemStackHashSet.java @@ -15,8 +15,9 @@ import net.minecraftforge.common.MinecraftForge; import net.openhft.koloboke.collect.set.IntSet; import net.openhft.koloboke.collect.set.hash.HashIntSets; +import org.ultramine.server.internal.UMInternalRegistry; -public class ItemStackHashSet implements Set +public class ItemStackHashSet implements Set, UMInternalRegistry.IRemapHandler { private final List list = new ArrayList(); private final IntSet fastSet = HashIntSets.newMutableSet(); @@ -30,7 +31,7 @@ public ItemStackHashSet(boolean register) { if(register) - MinecraftForge.EVENT_BUS.register(this); + UMInternalRegistry.registerRemapHandler(this); } public void remap() @@ -40,17 +41,6 @@ addToFastMap(is); } - @SubscribeEvent - public void onForgeModIdMapping(ForgeModIdMappingEvent e) - { - remap(); - } - - public void unregister() - { - MinecraftForge.EVENT_BUS.unregister(this); - } - private boolean addToFastMap(ItemStack is) { if(is.getItemDamage() == 32767)