diff --git a/patches/minecraft/net/minecraft/advancements/critereon/ItemPredicate.java.patch b/patches/minecraft/net/minecraft/advancements/critereon/ItemPredicate.java.patch index d16a9b79c1..4d2c9e92b3 100644 --- a/patches/minecraft/net/minecraft/advancements/critereon/ItemPredicate.java.patch +++ b/patches/minecraft/net/minecraft/advancements/critereon/ItemPredicate.java.patch @@ -1,6 +1,6 @@ --- ../src-base/minecraft/net/minecraft/advancements/critereon/ItemPredicate.java +++ ../src-work/minecraft/net/minecraft/advancements/critereon/ItemPredicate.java -@@ -104,6 +104,7 @@ +@@ -104,6 +104,13 @@ if (p_192492_0_ != null && !p_192492_0_.isJsonNull()) { JsonObject jsonobject = JsonUtils.func_151210_l(p_192492_0_, "item"); diff --git a/patches/minecraft/net/minecraft/stats/RecipeBookServer.java.patch b/patches/minecraft/net/minecraft/stats/RecipeBookServer.java.patch new file mode 100644 index 0000000000..f795cc5e41 --- /dev/null +++ b/patches/minecraft/net/minecraft/stats/RecipeBookServer.java.patch @@ -0,0 +1,19 @@ +--- ../src-base/minecraft/net/minecraft/stats/RecipeBookServer.java ++++ ../src-work/minecraft/net/minecraft/stats/RecipeBookServer.java +@@ -55,7 +55,7 @@ + + private void func_194081_a(SPacketRecipeBook.State p_194081_1_, EntityPlayerMP p_194081_2_, List p_194081_3_) + { +- p_194081_2_.field_71135_a.func_147359_a(new SPacketRecipeBook(p_194081_1_, p_194081_3_, Collections.emptyList(), this.field_192818_b, this.field_192819_c)); ++ net.minecraftforge.common.ForgeHooks.sendRecipeBook(p_194081_2_.field_71135_a, p_194081_1_, p_194081_3_, Collections.emptyList(), this.field_192818_b, this.field_192819_c); + } + + public NBTTagCompound func_192824_e() +@@ -147,6 +147,6 @@ + + public void func_192826_c(EntityPlayerMP p_192826_1_) + { +- p_192826_1_.field_71135_a.func_147359_a(new SPacketRecipeBook(SPacketRecipeBook.State.INIT, this.func_194079_d(), this.func_194080_e(), this.field_192818_b, this.field_192819_c)); ++ net.minecraftforge.common.ForgeHooks.sendRecipeBook(p_192826_1_.field_71135_a, SPacketRecipeBook.State.INIT, this.func_194079_d(), this.func_194080_e(), this.field_192818_b, this.field_192819_c); + } + } diff --git a/src/main/java/net/minecraftforge/common/ForgeHooks.java b/src/main/java/net/minecraftforge/common/ForgeHooks.java index bd10bd0666..6c81e94c0b 100644 --- a/src/main/java/net/minecraftforge/common/ForgeHooks.java +++ b/src/main/java/net/minecraftforge/common/ForgeHooks.java @@ -33,6 +33,7 @@ import java.util.Random; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import com.google.common.collect.Lists; import com.google.common.collect.Queues; @@ -68,10 +69,13 @@ import net.minecraft.item.ItemBucket; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.Packet; import net.minecraft.network.play.server.SPacketBlockChange; +import net.minecraft.network.play.server.SPacketRecipeBook; +import net.minecraft.network.play.server.SPacketRecipeBook.State; import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityNote; @@ -131,7 +135,12 @@ import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.LoaderState; import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; +import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.ConnectionType; import net.minecraftforge.fml.relauncher.ReflectionHelper; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryManager; + import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -1337,4 +1346,22 @@ public class ForgeHooks true, true ); } + + public static void sendRecipeBook(NetHandlerPlayServer connection, State state, List recipes, List display, boolean isGuiOpen, boolean isFilteringCraftable) + { + NetworkDispatcher disp = NetworkDispatcher.get(connection.getNetworkManager()); + //Not sure how it could ever be null, but screw it lets protect against it. Could Error the client but we dont care if they are asking for this stuff in the wrong state! + ConnectionType type = disp == null || disp.getConnectionType() == null ? ConnectionType.MODDED : disp.getConnectionType(); + if (type == ConnectionType.VANILLA) + { + IForgeRegistry vanilla = RegistryManager.VANILLA.getRegistry(IRecipe.class); + if (recipes.size() > 0) + recipes = recipes.stream().filter(e -> vanilla.containsValue(e)).collect(Collectors.toList()); + if (display.size() > 0) + display = display.stream().filter(e -> vanilla.containsValue(e)).collect(Collectors.toList()); + } + + if (recipes.size() > 0 || display.size() > 0) + connection.sendPacket(new SPacketRecipeBook(state, recipes, display, isGuiOpen, isFilteringCraftable)); + } } diff --git a/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java b/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java index 173a05f7e0..950cf5ec16 100644 --- a/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java +++ b/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java @@ -83,7 +83,7 @@ public class AutomaticEventSubscriber FMLLog.log.debug("Injected @EventBusSubscriber class {}", targ.getClassName()); } } - catch (Exception e) + catch (Throwable e) { FMLLog.log.error("An error occurred trying to load an EventBusSubscriber {} for modid {}", mod.getModId(), e); throw new LoaderException(e); diff --git a/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeClientState.java b/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeClientState.java index f65bf1c06c..0e0f4001c4 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeClientState.java +++ b/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeClientState.java @@ -145,8 +145,8 @@ enum FMLHandshakeClientState implements IHandshakeState if (!locallyMissing.isEmpty()) { NetworkDispatcher dispatcher = ctx.channel().attr(NetworkDispatcher.FML_DISPATCHER).get(); - dispatcher.rejectHandshake("Fatally missing blocks and items"); - FMLLog.log.fatal("Failed to connect to server: there are {} missing blocks and items", locallyMissing.size()); + dispatcher.rejectHandshake("Fatally missing registry entries"); + FMLLog.log.fatal("Failed to connect to server: there are {} missing registry items", locallyMissing.size()); locallyMissing.asMap().forEach((key, value) -> FMLLog.log.debug("Missing {} Entries: {}", key, value)); return ERROR; } diff --git a/src/main/java/net/minecraftforge/fml/common/network/handshake/NetworkDispatcher.java b/src/main/java/net/minecraftforge/fml/common/network/handshake/NetworkDispatcher.java index 7297d39c07..13d7cfe42e 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/handshake/NetworkDispatcher.java +++ b/src/main/java/net/minecraftforge/fml/common/network/handshake/NetworkDispatcher.java @@ -68,8 +68,6 @@ import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.registries.ForgeRegistry; -import org.apache.logging.log4j.Level; - // TODO build test suites to validate the behaviour of this stuff and make it less annoyingly magical public class NetworkDispatcher extends SimpleChannelInboundHandler> implements ChannelOutboundHandler { private static boolean DEBUG_HANDSHAKE = Boolean.parseBoolean(System.getProperty("fml.debugNetworkHandshake", "false")); @@ -77,7 +75,7 @@ public class NetworkDispatcher extends SimpleChannelInboundHandler> im OPENING, AWAITING_HANDSHAKE, HANDSHAKING, HANDSHAKECOMPLETE, FINALIZING, CONNECTED } - private static enum ConnectionType { + public static enum ConnectionType { MODDED, BUKKIT, VANILLA } @@ -667,4 +665,9 @@ public class NetworkDispatcher extends SimpleChannelInboundHandler> im return this.data_buf; } } + + public ConnectionType getConnectionType() + { + return this.connectionType; + } } diff --git a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java index 65abab012e..7af663afa1 100644 --- a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java +++ b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java @@ -65,6 +65,7 @@ public class ForgeRegistry> implements IForgeRe private final CreateCallback create; private final AddCallback add; private final ClearCallback clear; + private final MissingFactory missing; private final BitSet availabilityMap; private final Set dummies = Sets.newHashSet(); private final Set blocked = Sets.newHashSet(); @@ -80,7 +81,7 @@ public class ForgeRegistry> implements IForgeRe private V defaultValue = null; boolean isFrozen = false; - ForgeRegistry(Class superType, ResourceLocation defaultKey, int min, int max, @Nullable CreateCallback create, @Nullable AddCallback add, @Nullable ClearCallback clear, RegistryManager stage, boolean allowOverrides, boolean isModifiable, @Nullable DummyFactory dummyFactory) + ForgeRegistry(Class superType, ResourceLocation defaultKey, int min, int max, @Nullable CreateCallback create, @Nullable AddCallback add, @Nullable ClearCallback clear, RegistryManager stage, boolean allowOverrides, boolean isModifiable, @Nullable DummyFactory dummyFactory, @Nullable MissingFactory missing) { this.stage = stage; this.superType = superType; @@ -91,6 +92,7 @@ public class ForgeRegistry> implements IForgeRe this.create = create; this.add = add; this.clear = clear; + this.missing = missing; this.isDelegated = IForgeRegistryEntry.Impl.class.isAssignableFrom(superType); //TODO: Make this IDelegatedRegistryEntry? this.allowOverrides = allowOverrides; this.isModifiable = isModifiable; @@ -251,7 +253,7 @@ public class ForgeRegistry> implements IForgeRe ForgeRegistry copy(RegistryManager stage) { - return new ForgeRegistry(superType, defaultKey, min, max, create, add, clear, stage, allowOverrides, isModifiable, dummyFactory); + return new ForgeRegistry(superType, defaultKey, min, max, create, add, clear, stage, allowOverrides, isModifiable, dummyFactory, missing); } int add(int id, V value) @@ -756,7 +758,7 @@ public class ForgeRegistry> implements IForgeRe return new MissingMappings(name, this, lst); } - void processMissingEvent(ResourceLocation name, ForgeRegistry pool, List> mappings, Map missing, Map remaps, Collection defaulted, Collection failed) + void processMissingEvent(ResourceLocation name, ForgeRegistry pool, List> mappings, Map missing, Map remaps, Collection defaulted, Collection failed, boolean injectNetworkDummies) { FMLLog.log.debug("Processing missing event for {}:", name); int ignored = 0; @@ -791,7 +793,11 @@ public class ForgeRegistry> implements IForgeRe // block item missing, warn as requested and block the id if (action == MissingMappings.Action.DEFAULT) { - defaulted.add(remap.key); + V m = this.missing == null ? null : this.missing.createMissing(remap.key, injectNetworkDummies); + if (m == null) + defaulted.add(remap.key); + else + this.add(remap.id, m, remap.key.getResourceDomain()); } else if (action == MissingMappings.Action.IGNORE) { diff --git a/src/main/java/net/minecraftforge/registries/GameData.java b/src/main/java/net/minecraftforge/registries/GameData.java index 5562582e9c..29bbff79cc 100644 --- a/src/main/java/net/minecraftforge/registries/GameData.java +++ b/src/main/java/net/minecraftforge/registries/GameData.java @@ -30,8 +30,11 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; +import net.minecraft.init.Items; +import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionType; @@ -40,6 +43,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; import net.minecraft.util.registry.RegistryNamespaced; import net.minecraft.util.registry.RegistryNamespacedDefaultedByKey; +import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegistryEvent; @@ -128,7 +132,7 @@ public class GameData makeRegistry(SOUNDEVENTS, SoundEvent.class, MAX_SOUND_ID).create(); makeRegistry(POTIONTYPES, PotionType.class, MAX_POTIONTYPE_ID, new ResourceLocation("empty")).create(); makeRegistry(ENCHANTMENTS, Enchantment.class, MAX_ENCHANTMENT_ID).create(); - makeRegistry(RECIPES, IRecipe.class, MAX_RECIPE_ID).disableSaving().allowModification().create(); + makeRegistry(RECIPES, IRecipe.class, MAX_RECIPE_ID).disableSaving().allowModification().addCallback(RecipeCallbacks.INSTANCE).create(); makeRegistry(PROFESSIONS, VillagerProfession.class, MAX_PROFESSION_ID).create(); entityRegistry = (ForgeRegistry)makeRegistry(ENTITIES, EntityEntry.class, MAX_ENTITY_ID).addCallback(EntityCallbacks.INSTANCE).create(); } @@ -276,7 +280,6 @@ public class GameData private static class BlockCallbacks implements IForgeRegistry.AddCallback, IForgeRegistry.ClearCallback, IForgeRegistry.CreateCallback, IForgeRegistry.DummyFactory { static final BlockCallbacks INSTANCE = new BlockCallbacks(); - Field regName; @SuppressWarnings("deprecation") @Override @@ -349,31 +352,8 @@ public class GameData @Override public Block createDummy(ResourceLocation key) { - if (regName == null) - { - try - { - regName = IForgeRegistryEntry.Impl.class.getDeclaredField("registryName"); - regName.setAccessible(true); - } - catch (NoSuchFieldException | SecurityException e) - { - FMLLog.log.error("Could not get `registryName` field from IForgeRegistryEntry.Impl"); - FMLLog.log.throwing(Level.ERROR, e); - throw new RuntimeException(e); - } - } Block ret = new BlockDummyAir().setUnlocalizedName("air"); - try - { - regName.set(ret, key); - } - catch (IllegalArgumentException | IllegalAccessException e) - { - FMLLog.log.error("Could not set `registryName` field in IForgeRegistryEntry.Impl to `{}`", key.toString()); - FMLLog.log.throwing(Level.ERROR, e); - throw new RuntimeException(e); - } + GameData.forceRegistryName(ret, key); return ret; } private static class BlockDummyAir extends BlockAir //A named class so DummyBlockReplacementTest can detect if its a dummy @@ -414,6 +394,35 @@ public class GameData } } + private static class RecipeCallbacks implements IForgeRegistry.MissingFactory + { + static final RecipeCallbacks INSTANCE = new RecipeCallbacks(); + + @Override + public IRecipe createMissing(ResourceLocation key, boolean isNetwork) + { + return isNetwork ? new DummyRecipe().setRegistryName(key) : null; + } + private static class DummyRecipe implements IRecipe + { + private static ItemStack result = new ItemStack(Items.DIAMOND, 64); + private ResourceLocation name; + + @Override + public IRecipe setRegistryName(ResourceLocation name) { + this.name = name; + return this; + } + @Override public ResourceLocation getRegistryName() { return name; } + @Override public Class getRegistryType() { return IRecipe.class; } + @Override public boolean matches(InventoryCrafting inv, World worldIn) { return false; } //dirt? + @Override public ItemStack getCraftingResult(InventoryCrafting inv) { return result; } + @Override public boolean canFit(int width, int height) { return false; } + @Override public ItemStack getRecipeOutput() { return result; } + @Override public boolean isHidden() { return true; } + } + } + private static ForgeRegistry entityRegistry; public static ForgeRegistry getEntityRegistry() { return entityRegistry; } @@ -559,16 +568,12 @@ public class GameData if (!lst.isEmpty()) { FMLLog.log.error("Unidentified mapping from registry {}", name); - lst.forEach(map -> { - FMLLog.log.error(" {}: {}", map.key, map.id); - if (!isLocalWorld) - defaulted.put(name, map.key); - }); + lst.forEach(map -> FMLLog.log.error(" {}: {}", map.key, map.id)); } event.getAllMappings().stream().filter(e -> e.getAction() == MissingMappings.Action.FAIL).forEach(fail -> failed.put(name, fail.key)); final Class clazz = RegistryManager.ACTIVE.getSuperType(name); - processMissing(clazz, name, STAGING, event, m.getValue(), remaps.get(name), defaulted.get(name), failed.get(name)); + processMissing(clazz, name, STAGING, event, m.getValue(), remaps.get(name), defaulted.get(name), failed.get(name), !isLocalWorld); }); if (!defaulted.isEmpty() && !isLocalWorld) @@ -679,12 +684,12 @@ public class GameData //Another bouncer for generic reasons @SuppressWarnings("unchecked") - private static > void processMissing(Class clazz, ResourceLocation name, RegistryManager STAGING, MissingMappings e, Map missing, Map remaps, Collection defaulted, Collection failed) + private static > void processMissing(Class clazz, ResourceLocation name, RegistryManager STAGING, MissingMappings e, Map missing, Map remaps, Collection defaulted, Collection failed, boolean injectNetworkDummies) { List> mappings = ((MissingMappings)e).getAllMappings(); ForgeRegistry active = RegistryManager.ACTIVE.getRegistry(name); ForgeRegistry staging = STAGING.getRegistry(name); - staging.processMissingEvent(name, active, mappings, missing, remaps, defaulted, failed); + staging.processMissingEvent(name, active, mappings, missing, remaps, defaulted, failed, injectNetworkDummies); } private static > void loadFrozenDataToStagingRegistry(RegistryManager STAGING, ResourceLocation name, Map remaps, Class clazz) @@ -742,4 +747,34 @@ public class GameData }); */ } + + private static Field regName; + private static void forceRegistryName(IForgeRegistryEntry entry, ResourceLocation name) + { + if (regName == null) + { + try + { + regName = IForgeRegistryEntry.Impl.class.getDeclaredField("registryName"); + regName.setAccessible(true); + } + catch (NoSuchFieldException | SecurityException e) + { + FMLLog.log.error("Could not get `registryName` field from IForgeRegistryEntry.Impl"); + FMLLog.log.throwing(Level.ERROR, e); + throw new RuntimeException(e); + } + } + try + { + regName.set(entry, name); + } + catch (IllegalArgumentException | IllegalAccessException e) + { + FMLLog.log.error("Could not set `registryName` field in IForgeRegistryEntry.Impl to `{}`", name.toString()); + FMLLog.log.throwing(Level.ERROR, e); + throw new RuntimeException(e); + } + + } } diff --git a/src/main/java/net/minecraftforge/registries/IForgeRegistry.java b/src/main/java/net/minecraftforge/registries/IForgeRegistry.java index 313fbd4701..13ebab6b38 100644 --- a/src/main/java/net/minecraftforge/registries/IForgeRegistry.java +++ b/src/main/java/net/minecraftforge/registries/IForgeRegistry.java @@ -94,4 +94,12 @@ public interface IForgeRegistry> extends Iterab { V createDummy(ResourceLocation key); } + + /** + * + */ + interface MissingFactory> + { + V createMissing(ResourceLocation key, boolean isNetwork); + } } diff --git a/src/main/java/net/minecraftforge/registries/RegistryBuilder.java b/src/main/java/net/minecraftforge/registries/RegistryBuilder.java index c9a9062669..667c27f98d 100644 --- a/src/main/java/net/minecraftforge/registries/RegistryBuilder.java +++ b/src/main/java/net/minecraftforge/registries/RegistryBuilder.java @@ -42,6 +42,7 @@ public class RegistryBuilder> private boolean allowOverrides = true; private boolean allowModifications = false; private DummyFactory dummyFactory; + private MissingFactory missingFactory; public RegistryBuilder setName(ResourceLocation name) { @@ -84,6 +85,8 @@ public class RegistryBuilder> this.add((CreateCallback)inst); if (inst instanceof DummyFactory) this.set((DummyFactory)inst); + if (inst instanceof MissingFactory) + this.set((MissingFactory)inst); return this; } @@ -111,6 +114,12 @@ public class RegistryBuilder> return this; } + public RegistryBuilder set(MissingFactory missing) + { + this.missingFactory = missing; + return this; + } + public RegistryBuilder disableSaving() { this.saveToDisc = false; @@ -132,7 +141,7 @@ public class RegistryBuilder> public IForgeRegistry create() { return RegistryManager.ACTIVE.createRegistry(registryName, registryType, optionalDefaultKey, minId, maxId, - getAdd(), getClear(), getCreate(), saveToDisc, allowOverrides, allowModifications, dummyFactory); + getAdd(), getClear(), getCreate(), saveToDisc, allowOverrides, allowModifications, dummyFactory, missingFactory); } @Nullable diff --git a/src/main/java/net/minecraftforge/registries/RegistryManager.java b/src/main/java/net/minecraftforge/registries/RegistryManager.java index 0fc891eef5..a06ddeb700 100644 --- a/src/main/java/net/minecraftforge/registries/RegistryManager.java +++ b/src/main/java/net/minecraftforge/registries/RegistryManager.java @@ -76,7 +76,7 @@ public class RegistryManager > ForgeRegistry createRegistry(ResourceLocation name, Class type, ResourceLocation defaultKey, int min, int max, @Nullable AddCallback add, @Nullable ClearCallback clear, @Nullable CreateCallback create, - boolean persisted, boolean allowOverrides, boolean isModifiable, @Nullable DummyFactory dummyFactory) + boolean persisted, boolean allowOverrides, boolean isModifiable, @Nullable DummyFactory dummyFactory, @Nullable MissingFactory missing) { Set> parents = Sets.newHashSet(); findSuperTypes(type, parents); @@ -87,7 +87,7 @@ public class RegistryManager FMLLog.log.error("Found existing registry of type {} named {}, you cannot create a new registry ({}) with type {}, as {} has a parent of that type", foundType, superTypes.get(foundType), name, type, type); throw new IllegalArgumentException("Duplicate registry parent type found - you can only have one registry for a particular super type"); } - ForgeRegistry reg = new ForgeRegistry(type, defaultKey, min, max, create, add, clear, this, allowOverrides, isModifiable, dummyFactory); + ForgeRegistry reg = new ForgeRegistry(type, defaultKey, min, max, create, add, clear, this, allowOverrides, isModifiable, dummyFactory, missing); registries.put(name, reg); superTypes.put(type, name); if (persisted) diff --git a/src/test/java/net/minecraftforge/debug/BlockstateRetextureTest.java b/src/test/java/net/minecraftforge/debug/BlockstateRetextureTest.java index f26a490d31..7d761541d6 100644 --- a/src/test/java/net/minecraftforge/debug/BlockstateRetextureTest.java +++ b/src/test/java/net/minecraftforge/debug/BlockstateRetextureTest.java @@ -17,7 +17,7 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.relauncher.Side; -@Mod(modid = BlockstateRetextureTest.MODID, name = "BlockstateRetextureTest", version = BlockstateRetextureTest.VERSION, acceptableRemoteVersions = "*") +@Mod(modid = BlockstateRetextureTest.MODID, name = "BlockstateRetextureTest", version = BlockstateRetextureTest.VERSION, acceptableRemoteVersions = "*", clientSideOnly = true) public class BlockstateRetextureTest { public static final String MODID = "forge_blockstate_retexture_test"; diff --git a/src/test/java/net/minecraftforge/debug/GuiContainerEventTest.java b/src/test/java/net/minecraftforge/debug/GuiContainerEventTest.java index 06555ecf14..d2e9007ff5 100644 --- a/src/test/java/net/minecraftforge/debug/GuiContainerEventTest.java +++ b/src/test/java/net/minecraftforge/debug/GuiContainerEventTest.java @@ -28,8 +28,9 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.GameRegistry.ObjectHolder; +import net.minecraftforge.fml.relauncher.Side; -@EventBusSubscriber +@EventBusSubscriber(Side.CLIENT) @Mod (modid = "guicontainereventtest", name = "GuiContainer Event Tests!", version = "1.0", acceptableRemoteVersions = "*") public class GuiContainerEventTest { diff --git a/src/test/java/net/minecraftforge/debug/RecipeTestMod.java b/src/test/java/net/minecraftforge/debug/RecipeTestMod.java index 7e46090544..e620dc2aee 100644 --- a/src/test/java/net/minecraftforge/debug/RecipeTestMod.java +++ b/src/test/java/net/minecraftforge/debug/RecipeTestMod.java @@ -11,6 +11,8 @@ import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.FMLLaunchHandler; +import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.oredict.ShapedOreRecipe; @Mod(modid = "recipetest", version = "1.0", acceptableRemoteVersions = "*") @@ -30,10 +32,13 @@ public class RecipeTestMod recipe1.setRegistryName(location1); event.getRegistry().register(recipe1); - ResourceLocation location2 = new ResourceLocation("recipetest", "stone"); - CraftingHelper.ShapedPrimer primer1 = CraftingHelper.parseShaped("SSS", 'S', new ItemStack(Blocks.IRON_BLOCK)); - ShapedRecipes recipe2 = new ShapedRecipes(location2.getResourcePath(), primer1.width, primer1.height, primer1.input, new ItemStack(Blocks.GOLD_BLOCK)); - recipe2.setRegistryName(location2); - event.getRegistry().register(recipe2); + if (FMLLaunchHandler.side() == Side.SERVER) + { + ResourceLocation location2 = new ResourceLocation("recipetest", "stone"); + CraftingHelper.ShapedPrimer primer1 = CraftingHelper.parseShaped("SSS", 'S', new ItemStack(Blocks.IRON_BLOCK)); + ShapedRecipes recipe2 = new ShapedRecipes(location2.getResourcePath(), primer1.width, primer1.height, primer1.input, new ItemStack(Blocks.GOLD_BLOCK)); + recipe2.setRegistryName(location2); + event.getRegistry().register(recipe2); + } } }