Jump to content

Recommended Posts

Posted

Basically, there are still modders who doesnt follow the standard convention for oredictionary names, registering items/blocks "improperly" causing compatibility issues.

GregTech, since 4.04d (Sep 24th) included a special code to detect those "invalid" entries and suggests fixes for them, although since it is only a particular mod, its range is severely limited, therefore I would like if forge included that feature of GregTech.

Example :

2013-10-19 17:42:23 [iNFO] [sTDERR] WARNING: 'diamondNugget' is an invalid OreDictionary Name. The Name doesn't fit to the Type of Item and/or doesn't follow a proper OreDictionary Convention. If you are the Owner of the Mod who adds this Item, please do the following: 
2013-10-19 17:42:23 [iNFO] [sTDERR] Put the 'Nugget' in the beginning of the Name to get 'nuggetDiamond'
2013-10-19 17:42:23 [iNFO] [sTDERR] Private Prefixes could also be a solution if the first Suggestion doesn't apply. In that case the suggestion for the name is 'Translocator:diamondNugget' don't forget to insert the ':' inbetween the Mod ID and OreDict Name, that is the most important part.
2013-10-19 17:42:23 [iNFO] [sTDERR] If you are not the Owner then report it to the Owner of the Mod, which the Item belongs to.
2013-10-19 17:42:23 [iNFO] [sTDERR] WARNING: 'obsidianRod' is an invalid OreDictionary Name. The Name doesn't fit to the Type of Item and/or doesn't follow a proper OreDictionary Convention. If you are the Owner of the Mod who adds this Item, please do the following: 
2013-10-19 17:42:23 [iNFO] [sTDERR] Put the 'Rod' in the beginning of the Name to get 'rodObsidian'
2013-10-19 17:42:23 [iNFO] [sTDERR] Private Prefixes could also be a solution if the first Suggestion doesn't apply. In that case the suggestion for the name is 'WR-CBE|Core:obsidianRod' don't forget to insert the ':' inbetween the Mod ID and OreDict Name, that is the most important part.
2013-10-19 17:42:23 [iNFO] [sTDERR] If you are not the Owner then report it to the Owner of the Mod, which the Item belongs to.

Posted

[iNFO] [sTDERR] WARNING: 'obsidianRod' is an invalid OreDictionary Name. The Name doesn't fit to the Type of Item and/or doesn't follow a proper OreDictionary Convention. If you are the Owner of the Mod who adds this Item, please do the following:  Put the 'Rod' in the beginning of the Name to get 'rodObsidian'
[sTDERR] If you are not the Owner then report it to the Owner of the Mod, which the Item belongs to. (Not a bug, just a suggestion)

would be shorter and Less spammy.

Posted

This is unnecessary.  There is no good reason to spam users about a non-issue.

Of course there is, to automatically warn modders (via users, because there is no other way) about improperly registered items, that causes incompatibility issues.

 

@Whoever wants to read another drama regarding GT and TiC: Go to GT thread on IC² forum and grab some popcorn.

Posted

I would agree with this being added, so many people don't use the dictionary properly and you get childish people who break other people's code to make there wrongly defined ores work. *Cough* Tinkers. If normal users don't want to see the "spam" then a config option could be added to not show it. Otherwise people should deal with it, and who even watches there console when loading/playing minecraft?

 

If not then something should be added for developers to see when adding to the dictionary to check whether they are using the correct name structure for the item/block/ore they are trying to register simple.

Posted

Are you fucking kidding me? Keep this in the Drecktech/IC^2 forums.  ::)

I didn't even mention TiC here, by the way.

Also, you just raged (ran out of arguments) there and got banned for insulting people.

No further comments are needed.

 

With this suggestion, i'm trying to help the whole modding community, by enforcing the standard convention, so we can have less problems regarding compatibility issues.

Posted

The whole "private prefix" notion is completely contrary to the point of the ore dictionary in the first place (which is to allow mods to specify interchangeable items).  My counter-proposal, therefore would be to print an opt-in list after all of the mods have loaded of the strings registered in the ore dictionary and the number of items registered to those strings.

 

Anyone interested in compatibility would have done research into the strings that were already in use.

Posted

The whole "private prefix" notion is completely contrary to the point of the ore dictionary in the first place (which is to allow mods to specify interchangeable items).  My counter-proposal, therefore would be to print an opt-in list after all of the mods have loaded of the strings registered in the ore dictionary and the number of items registered to those strings.

 

Anyone interested in compatibility would have done research into the strings that were already in use.

The private things are special cases, when the standard can't be applied and then must be registered that way to avoid unintended compatibility (Different items with same or close names). Example : GT gears and BC gears.

A standardization is required because nobody uses all mods at once, so there is kinda no way to get all registered things to be displayed to a modder for compatibility. Not to mention that it would bring extra work if everyone register the same stuff differently. Example "rodIron", "ironRod", and "rodFe" [Fe is the iron element]registered by three different mods for an iron stick (rod shape, 1/2 iron ingot of material).

Posted
A standardization is required because nobody uses all mods at once, so there is kinda no way to get all registered things to be displayed to a modder for compatibility.

 

If the modder cares about compatibility, load all the mods he or she cares to be compatible with and call OreDictionary.getOreNames(), and if they want to go even further, iterate over the string array that it returns to call OreDictionary.getOres(oreName) and get a List of ItemStacks.

Posted

A standardization is required because nobody uses all mods at once, so there is kinda no way to get all registered things to be displayed to a modder for compatibility.

 

If the modder cares about compatibility, load all the mods he or she cares to be compatible with and call OreDictionary.getOreNames(), and if they want to go even further, iterate over the string array that it returns to call OreDictionary.getOres(oreName) and get a List of ItemStacks.

Mod compatibility is meant to be global, not something restricted to certain mods. Guess what forge does, by allowing several different mods to run together, without any problems?

Standardization of oredict names allow cross-mod compatibility between mods even if they don't know the existance of each other, so the end user will never find incompatibility issues of items of the same type if both mods follow the standard.

 

So, this is not something unnecessary and not making mods follow the convention will eventually cause item incompatibility issues between mods, like GT and TiC rods are incompatible because of different oredictnames for same item.

Posted

A standardization is required because nobody uses all mods at once, so there is kinda no way to get all registered things to be displayed to a modder for compatibility.

 

If the modder cares about compatibility, load all the mods he or she cares to be compatible with and call OreDictionary.getOreNames(), and if they want to go even further, iterate over the string array that it returns to call OreDictionary.getOres(oreName) and get a List of ItemStacks.

Mod compatibility is meant to be global, not something restricted to certain mods. Guess what forge does, by allowing several different mods to run together, without any problems?

Standardization of oredict names allow cross-mod compatibility between mods even if they don't know the existance of each other, so the end user will never find incompatibility issues of items of the same type if both mods follow the standard.

 

So, this is not something unnecessary and not making mods follow the convention will eventually cause item incompatibility issues between mods, like GT and TiC rods are incompatible because of different oredictnames for same item.

In the example you list, GregTech chose to not use the names that were already in use.  Also, the code that GT uses specifically ignores a large number of entries that do not follow the guideline, such as bronzeTube, ironTube, obbyTube, leatherSeal, and stoneBowl

 

Bonus fact:  one of the entries in the list of specifically invalid names is in fact appropriate according to the guideline:  woodRod.  According to the guideline: "- For anything wooden, please use "wood", then the type"

Posted

No, Forge doesn't have a standard naming policy, aside from the things that we name. It is up to the modders to agree on the naming policy themselves.

I understand the debate as it sits, however, this is purely a debate between modders, Especially in the manor that GT has decided to go.

The wiki is created by the communitty not us. But ya, the answer is no, unless I get a large group of modders who aproach me with a actual standard they ALL have agreed on.

 

When it comes to the oredict, either you use the names that other people use, or your shit wont be found.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Consider supporting the team on Patreon

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I have followed a tutorial on how to generate ores for my mod though the data files have not been generated despite me running data in my IDE.  I have looked over and compared my code multiple times and the only differences are either with the IDs or with unnecessary code because of what my mod is (The mod is for the End so I don't need the Overworld or Nether ores), my folders are all in the right structure and no warnings are present when ran. I have been trying to figure this out for a few days now so help would be much appreciated. My code -  public class ModBiomeModifiers { public static final ResourceKey<BiomeModifier> ADD_GAZITE_ORE = registerKey("add_gazite_ore"); public static final ResourceKey<BiomeModifier> TRANSCENDINE_GAZITE_ORE = registerKey("add_transcendine_ore"); public static void bootstrap(BootstrapContext<BiomeModifier> context) { var placedFeature = context.lookup(Registries.PLACED_FEATURE); var biomes = context.lookup(Registries.BIOME); context.register(ADD_GAZITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_END), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.GAZITE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); context.register(TRANSCENDINE_GAZITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_END), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.TRANSCENDINE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); } private static ResourceKey<BiomeModifier> registerKey(String name) { return ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(EchoingEnd.MOD_ID, name)); } } The tutorial's code -  public class ModBiomeModifiers { public static final ResourceKey<BiomeModifier> ADD_ALEXANDRITE_ORE = registerKey("add_alexandrite_ore"); public static final ResourceKey<BiomeModifier> ADD_NETHER_ALEXANDRITE_ORE = registerKey("add_nether_alexandrite_ore"); public static final ResourceKey<BiomeModifier> ADD_END_ALEXANDRITE_ORE = registerKey("add_end_alexandrite_ore"); public static void bootstrap(BootstrapContext<BiomeModifier> context) { var placedFeature = context.lookup(Registries.PLACED_FEATURE); var biomes = context.lookup(Registries.BIOME); context.register(ADD_ALEXANDRITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_OVERWORLD), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.ALEXANDRITE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); // Individual Biomes // context.register(ADD_ALEXANDRITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( // HolderSet.direct(biomes.getOrThrow(Biomes.PLAINS), biomes.getOrThrow(Biomes.BAMBOO_JUNGLE)), // HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.ALEXANDRITE_ORE_PLACED_KEY)), // GenerationStep.Decoration.UNDERGROUND_ORES)); context.register(ADD_NETHER_ALEXANDRITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_NETHER), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.NETHER_ALEXANDRITE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); context.register(ADD_END_ALEXANDRITE_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( biomes.getOrThrow(BiomeTags.IS_END), HolderSet.direct(placedFeature.getOrThrow(ModPlacedFeatures.END_ALEXANDRITE_ORE_PLACED_KEY)), GenerationStep.Decoration.UNDERGROUND_ORES)); } private static ResourceKey<BiomeModifier> registerKey(String name) { return ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, name)); } }   ModConfiguredFeatures:   My code -  public class ModConfiguredFeatures { public static final ResourceKey<ConfiguredFeature<?, ?>> GAZITE_ORE_KEY = registerKey("gazite_ore"); public static final ResourceKey<ConfiguredFeature<?, ?>> TRANSCENDINE_ORE_KEY = registerKey("transcendine_ore"); public static void bootstrap(BootstrapContext<ConfiguredFeature<?, ?>> context) { RuleTest endReplaceables = new BlockMatchTest(Blocks.END_STONE); register(context, GAZITE_ORE_KEY, Feature.ORE, new OreConfiguration(endReplaceables, ModBlocks.GAZITE_ORE.get().defaultBlockState(), 4)); register(context, TRANSCENDINE_ORE_KEY, Feature.ORE, new OreConfiguration(endReplaceables, ModBlocks.TRANSCENDINE_ORE.get().defaultBlockState(), 8)); List<OreConfiguration.TargetBlockState> EndOres = List.of( OreConfiguration.target(endReplaceables, ModBlocks.GAZITE_ORE.get().defaultBlockState()), OreConfiguration.target(endReplaceables, ModBlocks.TRANSCENDINE_ORE.get().defaultBlockState())); } public static ResourceKey<ConfiguredFeature<?, ?>> registerKey(String name) { return ResourceKey.create(Registries.CONFIGURED_FEATURE, ResourceLocation.fromNamespaceAndPath(EchoingEnd.MOD_ID, name)); } private static <FC extends FeatureConfiguration, F extends Feature<FC>> void register(BootstrapContext<ConfiguredFeature<?, ?>> context, ResourceKey<ConfiguredFeature<?, ?>> key, F feature, FC configuration) { context.register(key, new ConfiguredFeature<>(feature, configuration)); } }   The tutorial's code - public class ModConfiguredFeatures { public static final ResourceKey<ConfiguredFeature<?, ?>> OVERWORLD_ALEXANDRITE_ORE_KEY = registerKey("alexandrite_ore"); public static final ResourceKey<ConfiguredFeature<?, ?>> NETHER_ALEXANDRITE_ORE_KEY = registerKey("nether_alexandrite_ore"); public static final ResourceKey<ConfiguredFeature<?, ?>> END_ALEXANDRITE_ORE_KEY = registerKey("end_alexandrite_ore"); public static void bootstrap(BootstrapContext<ConfiguredFeature<?, ?>> context) { RuleTest stoneReplaceables = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); RuleTest deepslateReplaceables = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); RuleTest netherrackReplaceables = new BlockMatchTest(Blocks.NETHERRACK); RuleTest endReplaceables = new BlockMatchTest(Blocks.END_STONE); List<OreConfiguration.TargetBlockState> overworldAlexandriteOres = List.of( OreConfiguration.target(stoneReplaceables, ModBlocks.ALEXANDRITE_ORE.get().defaultBlockState()), OreConfiguration.target(deepslateReplaceables, ModBlocks.ALEXANDRITE_DEEPSLATE_ORE.get().defaultBlockState())); register(context, OVERWORLD_ALEXANDRITE_ORE_KEY, Feature.ORE, new OreConfiguration(overworldAlexandriteOres, 9)); register(context, NETHER_ALEXANDRITE_ORE_KEY, Feature.ORE, new OreConfiguration(netherrackReplaceables, ModBlocks.ALEXANDRITE_NETHER_ORE.get().defaultBlockState(), 9)); register(context, END_ALEXANDRITE_ORE_KEY, Feature.ORE, new OreConfiguration(endReplaceables, ModBlocks.ALEXANDRITE_END_ORE.get().defaultBlockState(), 9)); } public static ResourceKey<ConfiguredFeature<?, ?>> registerKey(String name) { return ResourceKey.create(Registries.CONFIGURED_FEATURE, ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, name)); } private static <FC extends FeatureConfiguration, F extends Feature<FC>> void register(BootstrapContext<ConfiguredFeature<?, ?>> context, ResourceKey<ConfiguredFeature<?, ?>> key, F feature, FC configuration) { context.register(key, new ConfiguredFeature<>(feature, configuration)); } }   ModPlacedFeatures:   My code - public class ModPlacedFeatures { public static final ResourceKey<PlacedFeature> GAZITE_ORE_PLACED_KEY = registerKey("gazite_ore_placed"); public static final ResourceKey<PlacedFeature> TRANSCENDINE_ORE_PLACED_KEY = registerKey("transcendine_ore_placed"); public static void bootstrap(BootstrapContext<PlacedFeature> context) { var configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE); register(context, GAZITE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.GAZITE_ORE_KEY), ModOrePlacement.commonOrePlacement(9, HeightRangePlacement.uniform(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(71)))); register(context, TRANSCENDINE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.GAZITE_ORE_KEY), ModOrePlacement.rareOrePlacement(6, HeightRangePlacement.uniform(VerticalAnchor.absolute(-32), VerticalAnchor.absolute(71)))); } private static ResourceKey<PlacedFeature> registerKey(String name) { return ResourceKey.create(Registries.PLACED_FEATURE, ResourceLocation.fromNamespaceAndPath(EchoingEnd.MOD_ID, name)); } private static void register(BootstrapContext<PlacedFeature> context, ResourceKey<PlacedFeature> key, Holder<ConfiguredFeature<?, ?>> configuration, List<PlacementModifier> modifiers) { context.register(key, new PlacedFeature(configuration, List.copyOf(modifiers))); } }   the tutorial's code -  public class ModPlacedFeatures { public static final ResourceKey<PlacedFeature> ALEXANDRITE_ORE_PLACED_KEY = registerKey("alexandrite_ore_placed"); public static final ResourceKey<PlacedFeature> NETHER_ALEXANDRITE_ORE_PLACED_KEY = registerKey("nether_alexandrite_ore_placed"); public static final ResourceKey<PlacedFeature> END_ALEXANDRITE_ORE_PLACED_KEY = registerKey("end_alexandrite_ore_placed"); public static void bootstrap(BootstrapContext<PlacedFeature> context) { var configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE); register(context, ALEXANDRITE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.OVERWORLD_ALEXANDRITE_ORE_KEY), ModOrePlacement.commonOrePlacement(12, HeightRangePlacement.uniform(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(80)))); register(context, NETHER_ALEXANDRITE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.NETHER_ALEXANDRITE_ORE_KEY), ModOrePlacement.commonOrePlacement(12, HeightRangePlacement.uniform(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(80)))); register(context, END_ALEXANDRITE_ORE_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.END_ALEXANDRITE_ORE_KEY), ModOrePlacement.commonOrePlacement(12, HeightRangePlacement.uniform(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(80)))); } private static ResourceKey<PlacedFeature> registerKey(String name) { return ResourceKey.create(Registries.PLACED_FEATURE, ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, name)); } private static void register(BootstrapContext<PlacedFeature> context, ResourceKey<PlacedFeature> key, Holder<ConfiguredFeature<?, ?>> configuration, List<PlacementModifier> modifiers) { context.register(key, new PlacedFeature(configuration, List.copyOf(modifiers))); } }   ModOrePlacement:   My code -  public class ModOrePlacement { public static List<PlacementModifier> orePlacement(PlacementModifier pCountPlacement, PlacementModifier pHeightRange) { return List.of(pCountPlacement, InSquarePlacement.spread(), pHeightRange, BiomeFilter.biome()); } public static List<PlacementModifier> commonOrePlacement(int pCount, PlacementModifier pHeightRange) { return orePlacement(CountPlacement.of(pCount), pHeightRange); } public static List<PlacementModifier> rareOrePlacement(int pChance, PlacementModifier pHeightRange) { return orePlacement(RarityFilter.onAverageOnceEvery(pChance), pHeightRange); } }   The tutorial's code -  public class ModOrePlacement { public static List<PlacementModifier> orePlacement(PlacementModifier pCountPlacement, PlacementModifier pHeightRange) { return List.of(pCountPlacement, InSquarePlacement.spread(), pHeightRange, BiomeFilter.biome()); } public static List<PlacementModifier> commonOrePlacement(int pCount, PlacementModifier pHeightRange) { return orePlacement(CountPlacement.of(pCount), pHeightRange); } public static List<PlacementModifier> rareOrePlacement(int pChance, PlacementModifier pHeightRange) { return orePlacement(RarityFilter.onAverageOnceEvery(pChance), pHeightRange); } }  
    • I'm creating a modpack, and i just discovered that if i try to connect to a server it gives the error: Internal Exception: io.netty.handler.codec.DecoderException: java.lang.negativearraysizeexception -1   The client log:  
    • You just need to run the updated installer like if you were installing a new server. You can overwrite an existing install with a new version.
    • or use this link "https://ibb.co/F8PxyhS"
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.