From 1d863cdefcbaf8a8059ef5658b6affe29f477b0e Mon Sep 17 00:00:00 2001 From: Ben Staddon Date: Thu, 17 May 2018 06:52:32 +0100 Subject: [PATCH] Check name prefix used for tile entity registrations (#4681) --- .../fml/common/registry/GameRegistry.java | 8 ++++++++ .../minecraftforge/registries/GameData.java | 19 +++++++++++++++++++ .../registries/IForgeRegistryEntry.java | 17 +---------------- .../rendering/FastTESRTransparentTest.java | 2 +- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/minecraftforge/fml/common/registry/GameRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/GameRegistry.java index dcf20ee11..6028091ad 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/GameRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/GameRegistry.java @@ -226,11 +226,19 @@ public class GameRegistry FurnaceRecipes.instance().addSmeltingRecipe(input, output, xp); } + @Deprecated //TODO: Remove in 1.13, Use ResourceLocation version. public static void registerTileEntity(Class tileEntityClass, String key) { + // As return is ignored for compatibility, always check namespace + GameData.checkPrefix(new ResourceLocation(key).toString()); TileEntity.register(key, tileEntityClass); } + public static void registerTileEntity(Class tileEntityClass, ResourceLocation key) + { + registerTileEntity(tileEntityClass, key.toString()); + } + /** * @deprecated set your item's {@link Item#getItemBurnTime(ItemStack)} or subscribe to {@link FurnaceFuelBurnTimeEvent} instead. */ diff --git a/src/main/java/net/minecraftforge/registries/GameData.java b/src/main/java/net/minecraftforge/registries/GameData.java index 51e84723b..e9d7de8d9 100644 --- a/src/main/java/net/minecraftforge/registries/GameData.java +++ b/src/main/java/net/minecraftforge/registries/GameData.java @@ -51,8 +51,11 @@ import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent.MissingMappings; import net.minecraftforge.fml.common.EnhancedRuntimeException; import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.FMLContainer; import net.minecraftforge.fml.common.FMLLog; +import net.minecraftforge.fml.common.InjectedModContainer; import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.fml.common.StartupQuery; import net.minecraftforge.fml.common.ZipperUtil; import net.minecraftforge.fml.common.registry.EntityEntry; @@ -69,6 +72,7 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Predicate; @@ -756,6 +760,21 @@ public class GameData */ } + public static ResourceLocation checkPrefix(String name) + { + int index = name.lastIndexOf(':'); + String oldPrefix = index == -1 ? "" : name.substring(0, index).toLowerCase(Locale.ROOT); + name = index == -1 ? name : name.substring(index + 1); + ModContainer mc = Loader.instance().activeModContainer(); + String prefix = mc == null || (mc instanceof InjectedModContainer && ((InjectedModContainer)mc).wrappedContainer instanceof FMLContainer) ? "minecraft" : mc.getModId().toLowerCase(Locale.ROOT); + if (!oldPrefix.equals(prefix) && oldPrefix.length() > 0) + { + FMLLog.log.warn("Potentially Dangerous alternative prefix `{}` for name `{}`, expected `{}`. This could be a intended override, but in most cases indicates a broken mod.", oldPrefix, name, prefix); + prefix = oldPrefix; + } + return new ResourceLocation(prefix, name); + } + private static Field regName; private static void forceRegistryName(IForgeRegistryEntry entry, ResourceLocation name) { diff --git a/src/main/java/net/minecraftforge/registries/IForgeRegistryEntry.java b/src/main/java/net/minecraftforge/registries/IForgeRegistryEntry.java index 6e7063d02..87817475c 100644 --- a/src/main/java/net/minecraftforge/registries/IForgeRegistryEntry.java +++ b/src/main/java/net/minecraftforge/registries/IForgeRegistryEntry.java @@ -22,11 +22,6 @@ package net.minecraftforge.registries; import com.google.common.reflect.TypeToken; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.FMLContainer; -import net.minecraftforge.fml.common.FMLLog; -import net.minecraftforge.fml.common.InjectedModContainer; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; import javax.annotation.Nullable; @@ -75,17 +70,7 @@ public interface IForgeRegistryEntry if (getRegistryName() != null) throw new IllegalStateException("Attempted to set registry name with existing registry name! New: " + name + " Old: " + getRegistryName()); - int index = name.lastIndexOf(':'); - String oldPrefix = index == -1 ? "" : name.substring(0, index).toLowerCase(); - name = index == -1 ? name : name.substring(index + 1); - ModContainer mc = Loader.instance().activeModContainer(); - String prefix = mc == null || (mc instanceof InjectedModContainer && ((InjectedModContainer)mc).wrappedContainer instanceof FMLContainer) ? "minecraft" : mc.getModId().toLowerCase(); - if (!oldPrefix.equals(prefix) && oldPrefix.length() > 0) - { - FMLLog.log.info("Potentially Dangerous alternative prefix `{}` for name `{}`, expected `{}`. This could be a intended override, but in most cases indicates a broken mod.", oldPrefix, name, prefix); - prefix = oldPrefix; - } - this.registryName = new ResourceLocation(prefix, name); + this.registryName = GameData.checkPrefix(name); return (T)this; } diff --git a/src/test/java/net/minecraftforge/debug/client/rendering/FastTESRTransparentTest.java b/src/test/java/net/minecraftforge/debug/client/rendering/FastTESRTransparentTest.java index 1dbd148de..1fcaa44cc 100644 --- a/src/test/java/net/minecraftforge/debug/client/rendering/FastTESRTransparentTest.java +++ b/src/test/java/net/minecraftforge/debug/client/rendering/FastTESRTransparentTest.java @@ -251,7 +251,7 @@ public class FastTESRTransparentTest @EventHandler public void preInit(FMLPreInitializationEvent evt) { - GameRegistry.registerTileEntity(TransparentFastTE.class, "fast-tesr-te"); + GameRegistry.registerTileEntity(TransparentFastTE.class, MODID + ":fast-tesr-te"); } @EventBusSubscriber(value = Side.CLIENT, modid = MODID)