Jump to content

[Solved] - [1.15.X] Disable Vanilla Ore Gen or Change the FillerBlockType


Recommended Posts

Posted (edited)

Gday everyone,

 

I'm new to Modding, and still learning. I encountered an issue and not 100% sure how to address it, so I thought I would come here and seek help from the community.

Part of my mod tackles Ore Generation based on a pre-set world strata, and I would like to either disable the Vanilla Ore generation completely and then re-add it under my mod, preferably, or change the FillerBlockType from NATURAL STONE to just regular STONE block.

Most of the things I found here, and on other sites seems to be addressing older versions of Forge, and I couldn't wrap my head around the methods used .. again, completely new to Modding :)

 

Would it be possible to access/override the addOres() from DefaultBiomeFeatures , or disable it completely?

 

A basic code snippet on how to achieve this, or any input on the matter would be much appreciated.

Thanks in advance,

 

Edited by Ridanis
  • Ridanis changed the title to [1.15.X] Disable Vanilla Ore Gen or Change the FillerBlockType
Posted

To remove features from a Biome you have to use  yourBiome.getFeatures(DecorationStageYouWantToAccess).remove(configuredFeatureToRemove)

Just insert there the values you need. To expand the FillerBlockType Enum with your custom filler block types just use the FillerBlockType#create function, so you will be able to generate ores replacing every block you want, including modded ones.

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted

I did add STONE as a FillerBlockType through the .create(), but the Vanilla Ores are still generating on all NATURAL_STONES and this is what I'm trying to either disable, or override. 

Furthermore, how can I remove the Decoration feature (which I believe is UNDERGROUND_ORES) without effecting other methods using it such as addSedimentDisks() and addStoneVariants()? 

 

public static OreFeatureConfig.FillerBlockType STONE = OreFeatureConfig.FillerBlockType.create("STONE", "stone", new BlockMatcher(Blocks.STONE));
Posted
8 minutes ago, Beethoven92 said:

To remove features from a Biome you have to use  yourBiome.getFeatures(DecorationStageYouWantToAccess).remove(configuredFeatureToRemove)

Just insert there the values you need. To expand the FillerBlockType Enum with your custom filler block types just use the FillerBlockType#create function, so you will be able to generate ores replacing every block you want, including modded ones.

Re-reading this, I think I understand what you mean.

So, I'll need to loop through all the biomes, get the Decoration UNDERGROUND_ORES and remove Feature ORES, and then loop again through the biomes, adding my own Ores. Is my understanding correct here?

Posted

UNDERGROUND_ORES is the decoration stage you want to access, you are not going to remove the decoration stage, but rather a particular feature which generates during that stage, which in your case is the OreFeature. For example, look at how this simple mod overrides the vanilla swamp trees to add in their own custom ones, you can do the same with ores: https://www.curseforge.com/minecraft/mc-mods/swamp-expansion

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted
Just now, Ridanis said:

Re-reading this, I think I understand what you mean.

So, I'll need to loop through all the biomes, get the Decoration UNDERGROUND_ORES and remove Feature ORES, and then loop again through the biomes, adding my own Ores. Is my understanding correct here?

Yeah, thats how you do that

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted

Okay, that worked much better than what I was trying to do.

However, that also removed the Stone Variation as for some reason that is flagged as ORES.

Looking into a way to skip over those, and just remove the ORE Blocks.

Posted

My bad! I completely forgot that those also generate during the UNDERGROUND_ORE stage. Then no more one-step lazy code, you have to loop through the features in the Decoration.UNDERGROUND_ORES stage. From every feature you need to retrieve its corresponding Block, and check for the ores you want to replace, COAL_ORE, IRON_ORE etc...so you can leave the stone variants "ores" intact. Hope i explained that clearly enough 🤔

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted

Yes, thank you. That is what I was doing actually before checking this whole .clear() lazy code usage. 

However, like I said, I might actually go this route as it will allow me to have control over the stone variant generation as this mod is based around TerraForged strata with Quark and Create world blocks.

Your assistance on this matter has been appreciated greatly. Thanks :)

Posted (edited)

Will do.

 

Will also post my current code snippet just in case someone had to do the same. If anyone have any question on how these are generating, please don't hesitate to let me know.

 

for (Biome biome : ForgeRegistries.BIOMES) {

      biome.getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).clear();

      // Sediment Disks
      genSedimentDisks(biome, Blocks.SAND.getDefaultState(), 7, 2, Lists.newArrayList(Blocks.DIRT.getDefaultState(), Blocks.GRASS_BLOCK.getDefaultState()), 3);
      genSedimentDisks(biome, Blocks.CLAY.getDefaultState(), 4, 1, Lists.newArrayList(Blocks.DIRT.getDefaultState(), Blocks.CLAY.getDefaultState()), 1);
      genSedimentDisks(biome, Blocks.GRAVEL.getDefaultState(), 6, 2, Lists.newArrayList(Blocks.DIRT.getDefaultState(), Blocks.GRASS_BLOCK.getDefaultState()), 1);

      /*if (biome == Biomes.SWAMP || biome == Biomes.SWAMP_HILLS) {
        genSedimentDisks(biome, Blocks.CLAY.getDefaultState(), 4, 1, Lists.newArrayList(Blocks.DIRT.getDefaultState(), Blocks.CLAY.getDefaultState()), 1);
      }*/

      // Stone Variant
      genStoneVariant(biome, 10, 0, 0, 256, STONE, Blocks.DIRT.getDefaultState(), 33);
      genStoneVariant(biome, 8, 0, 0, 256, STONE, Blocks.GRAVEL.getDefaultState(), 33);
      genStoneVariant(biome, 10, 0, 0, 80, STONE, Blocks.GRANITE.getDefaultState(), 33);
      genStoneVariant(biome, 10, 0, 0, 80, STONE, Blocks.DIORITE.getDefaultState(), 33);
      genStoneVariant(biome, 10, 0, 0, 80, STONE, Blocks.ANDESITE.getDefaultState(), 33);

      // Ores
      genOre(biome, 20, 0, 0, 128, STONE, Blocks.COAL_ORE.getDefaultState(), 17);
      genOre(biome, 20, 0, 0, 64, STONE, Blocks.IRON_ORE.getDefaultState(), 9);
      genOre(biome, 2, 0, 0, 32, STONE, Blocks.GOLD_ORE.getDefaultState(), 9);
      genOre(biome, 1, 0, 0, 16, STONE, Blocks.DIAMOND_ORE.getDefaultState(), 8);
      genOre(biome, 1, 0, 0, 16, STONE, Blocks.EMERALD_ORE.getDefaultState(), 4);
      genOre(biome, 2, 0, 0, 16, STONE, Blocks.LAPIS_ORE.getDefaultState(), 7);
      genOre(biome, 8, 0, 0, 16, STONE, Blocks.REDSTONE_ORE.getDefaultState(), 8);
      genOre(biome, 20, 45, 0, 60, STONE, BlockHandler.ORE_COPPER.get().getDefaultState(), 7);
      genOre(biome, 8, 50, 0, 70, STONE, BlockHandler.ORE_ALUMINUM.get().getDefaultState(), 3);
      genOre(biome, 8, 30, 0, 38, STONE, BlockHandler.ORE_SILVER.get().getDefaultState(), 4);
      genOre(biome, 8, 32, 0, 40, STONE, BlockHandler.ORE_LEAD.get().getDefaultState(), 3);
      genOre(biome, 8, 25, 0, 40, STONE, BlockHandler.ORE_NICKEL.get().getDefaultState(), 3);
      genOre(biome, 4, 5, 0, 20, STONE, BlockHandler.ORE_URANIUM.get().getDefaultState(), 3);
      genOre(biome, 20, 20, 0, 45, STONE, BlockHandler.ORE_OSMIUM.get().getDefaultState(), 6);
      genOre(biome, 20, 40, 0, 55, STONE, BlockHandler.ORE_TIN.get().getDefaultState(), 6);
      genOre(biome, 8, 35, 0, 50, STONE, BlockHandler.ORE_ZINC.get().getDefaultState(), 4);
}

 

Edited by Ridanis
Posted

Damn it, yea that didn't work. It seems I have no other option but to loop through and remove. Doing a .clear() won't work as the mod integration with Create and Quark is not playing nice with this. 

Let's see if I can figure out how to create that loop iteration and removal.

Posted

Okay, I'm struggling to figure out how to loop through the UNDERGROUND_ORES and only remove the Vanilla Ores. Any help here would be much appreciated. 

Posted
@Mod.EventBusSubscriber(modid = Reference.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class WorldGenHandler {

  // Vanilla Fillers
  public static OreFeatureConfig.FillerBlockType ANDESITE = OreFeatureConfig.FillerBlockType.create("ANDESITE", "andesite", new BlockMatcher(Blocks.ANDESITE));
  public static OreFeatureConfig.FillerBlockType STONE = OreFeatureConfig.FillerBlockType.create("STONE", "stone", new BlockMatcher(Blocks.STONE));

  private static OreFeatureConfig.FillerBlockType CREATE_GABBRO = null;
  private static OreFeatureConfig.FillerBlockType CREATE_LIMESTONE = null;
  private static OreFeatureConfig.FillerBlockType CREATE_SCORIA = null;

  @ObjectHolder("create:gabbro")
  public static final Block blockCreateGabbro = null;

  @ObjectHolder("create:limestone")
  public static final Block blockCreateLimestone = null;

  @ObjectHolder("create:natural_scoria")
  public static final Block blockCreateScoria = null;

  @SubscribeEvent
  public static void generateWorld(FMLLoadCompleteEvent event) {

    if (blockCreateGabbro != null) {
      CREATE_GABBRO = OreFeatureConfig.FillerBlockType.create("GABBRO", "gabbro", new BlockMatcher(blockCreateGabbro.getBlock()));
    }
    if (blockCreateLimestone != null) {
      CREATE_LIMESTONE = OreFeatureConfig.FillerBlockType.create("LIMESTONE", "limestone", new BlockMatcher(blockCreateLimestone.getBlock()));
    }
    if (blockCreateScoria != null) {
      CREATE_SCORIA = OreFeatureConfig.FillerBlockType.create("SCORIA", "scoria", new BlockMatcher(blockCreateScoria.getBlock()));
    }

    for (Biome biome : ForgeRegistries.BIOMES) {

      biome.getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).remove(Feature.ORE.withConfiguration(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE, Blocks.COAL_ORE.getDefaultState(), 17)));


      //biome.getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).clear();

      // Sediment Disks
      /*genSedimentDisks(biome, Blocks.SAND.getDefaultState(), 7, 2, Lists.newArrayList(Blocks.DIRT.getDefaultState(), Blocks.GRASS_BLOCK.getDefaultState()), 3);
      genSedimentDisks(biome, Blocks.CLAY.getDefaultState(), 4, 1, Lists.newArrayList(Blocks.DIRT.getDefaultState(), Blocks.CLAY.getDefaultState()), 1);
      genSedimentDisks(biome, Blocks.GRAVEL.getDefaultState(), 6, 2, Lists.newArrayList(Blocks.DIRT.getDefaultState(), Blocks.GRASS_BLOCK.getDefaultState()), 1);

      /*if (biome == Biomes.SWAMP || biome == Biomes.SWAMP_HILLS) {
        genSedimentDisks(biome, Blocks.CLAY.getDefaultState(), 4, 1, Lists.newArrayList(Blocks.DIRT.getDefaultState(), Blocks.CLAY.getDefaultState()), 1);
      }*/

      // Stone Variant
      /*genStoneVariant(biome, 10, 0, 0, 256, STONE, Blocks.DIRT.getDefaultState(), 33);
      genStoneVariant(biome, 8, 0, 0, 256, STONE, Blocks.GRAVEL.getDefaultState(), 33);
      genStoneVariant(biome, 10, 0, 0, 80, STONE, Blocks.GRANITE.getDefaultState(), 33);
      genStoneVariant(biome, 10, 0, 0, 80, STONE, Blocks.DIORITE.getDefaultState(), 33);
      genStoneVariant(biome, 10, 0, 0, 80, STONE, Blocks.ANDESITE.getDefaultState(), 33);*/

      // For custom biome gen, use: if (biome == Biomes.DESERT) {genOre ...}
      // Furthermore, you can use if (biome.getCategory() == Biome.Category.NETHER) {genOre ...} to generate these ores in the Nether, or THEEND for The End
      genOre(biome, 20, 0, 0, 128, STONE, Blocks.COAL_ORE.getDefaultState(), 17);
      genOre(biome, 20, 0, 0, 64, STONE, Blocks.IRON_ORE.getDefaultState(), 9);
      genOre(biome, 2, 0, 0, 32, STONE, Blocks.GOLD_ORE.getDefaultState(), 9);
      genOre(biome, 1, 0, 0, 16, STONE, Blocks.DIAMOND_ORE.getDefaultState(), 8);
      genOre(biome, 1, 0, 0, 16, STONE, Blocks.EMERALD_ORE.getDefaultState(), 4);
      genOre(biome, 2, 0, 0, 16, STONE, Blocks.LAPIS_ORE.getDefaultState(), 7);
      genOre(biome, 8, 0, 0, 16, STONE, Blocks.REDSTONE_ORE.getDefaultState(), 8);
      genOre(biome, 20, 45, 0, 60, STONE, BlockHandler.ORE_COPPER.get().getDefaultState(), 7);
      genOre(biome, 8, 50, 0, 70, STONE, BlockHandler.ORE_ALUMINUM.get().getDefaultState(), 3);
      genOre(biome, 8, 30, 0, 38, STONE, BlockHandler.ORE_SILVER.get().getDefaultState(), 4);
      genOre(biome, 8, 32, 0, 40, STONE, BlockHandler.ORE_LEAD.get().getDefaultState(), 3);
      genOre(biome, 8, 25, 0, 40, STONE, BlockHandler.ORE_NICKEL.get().getDefaultState(), 3);
      genOre(biome, 4, 5, 0, 20, STONE, BlockHandler.ORE_URANIUM.get().getDefaultState(), 3);
      genOre(biome, 20, 20, 0, 45, STONE, BlockHandler.ORE_OSMIUM.get().getDefaultState(), 6);
      genOre(biome, 20, 40, 0, 55, STONE, BlockHandler.ORE_TIN.get().getDefaultState(), 6);
      genOre(biome, 8, 35, 0, 50, STONE, BlockHandler.ORE_ZINC.get().getDefaultState(), 4);

      // Strata Ores - Andesite
      genOre(biome, 20, 0, 0, 128, ANDESITE, BlockHandler.ORE_COAL_ANDESITE.get().getDefaultState(), 17);
      genOre(biome, 20, 0, 0, 64, ANDESITE, BlockHandler.ORE_IRON_ANDESITE.get().getDefaultState(), 9);
      genOre(biome, 2, 0, 0, 32, ANDESITE, BlockHandler.ORE_GOLD_ANDESITE.get().getDefaultState(), 9);
      genOre(biome, 1, 0, 0, 16, ANDESITE, BlockHandler.ORE_DIAMOND_ANDESITE.get().getDefaultState(), 8);
      genOre(biome, 1, 0, 0, 16, ANDESITE, BlockHandler.ORE_EMERALD_ANDESITE.get().getDefaultState(), 4);
      genOre(biome, 2, 0, 0, 16, ANDESITE, BlockHandler.ORE_LAPIS_ANDESITE.get().getDefaultState(), 7);
      genOre(biome, 8, 0, 0, 16, ANDESITE, BlockHandler.ORE_REDSTONE_ANDESITE.get().getDefaultState(), 8);
      genOre(biome, 20, 45, 0, 60, ANDESITE, BlockHandler.ORE_COPPER_ANDESITE.get().getDefaultState(), 7);
      genOre(biome, 8, 50, 0, 70, ANDESITE, BlockHandler.ORE_ALUMINUM_ANDESITE.get().getDefaultState(), 3);
      genOre(biome, 8, 30, 0, 38, ANDESITE, BlockHandler.ORE_SILVER_ANDESITE.get().getDefaultState(), 4);
      genOre(biome, 8, 32, 0, 40, ANDESITE, BlockHandler.ORE_LEAD_ANDESITE.get().getDefaultState(), 3);
      genOre(biome, 8, 25, 0, 40, ANDESITE, BlockHandler.ORE_NICKEL_ANDESITE.get().getDefaultState(), 3);
      genOre(biome, 4, 5, 0, 20, ANDESITE, BlockHandler.ORE_URANIUM_ANDESITE.get().getDefaultState(), 3);
      genOre(biome, 20, 20, 0, 45, ANDESITE, BlockHandler.ORE_OSMIUM_ANDESITE.get().getDefaultState(), 6);
      genOre(biome, 20, 40, 0, 55, ANDESITE, BlockHandler.ORE_TIN_ANDESITE.get().getDefaultState(), 6);
      genOre(biome, 8, 35, 0, 50, ANDESITE, BlockHandler.ORE_ZINC_ANDESITE.get().getDefaultState(), 4);

      if(blockCreateGabbro != null) {
        // Strata Ores - Gabbro
        genOre(biome, 20, 0, 0, 128, CREATE_GABBRO, BlockHandler.ORE_COAL_GABBRO.get().getDefaultState(), 17);
        genOre(biome, 20, 0, 0, 64, CREATE_GABBRO, BlockHandler.ORE_IRON_GABBRO.get().getDefaultState(), 9);
        genOre(biome, 2, 0, 0, 32, CREATE_GABBRO, BlockHandler.ORE_GOLD_GABBRO.get().getDefaultState(), 9);
        genOre(biome, 1, 0, 0, 16, CREATE_GABBRO, BlockHandler.ORE_DIAMOND_GABBRO.get().getDefaultState(), 8);
        genOre(biome, 1, 0, 0, 16, CREATE_GABBRO, BlockHandler.ORE_EMERALD_GABBRO.get().getDefaultState(), 4);
        genOre(biome, 2, 0, 0, 16, CREATE_GABBRO, BlockHandler.ORE_LAPIS_GABBRO.get().getDefaultState(), 7);
        genOre(biome, 8, 0, 0, 16, CREATE_GABBRO, BlockHandler.ORE_REDSTONE_GABBRO.get().getDefaultState(), 8);
        genOre(biome, 20, 45, 0, 60, CREATE_GABBRO, BlockHandler.ORE_COPPER_GABBRO.get().getDefaultState(), 7);
        genOre(biome, 8, 50, 0, 70, CREATE_GABBRO, BlockHandler.ORE_ALUMINUM_GABBRO.get().getDefaultState(), 3);
        genOre(biome, 8, 30, 0, 38, CREATE_GABBRO, BlockHandler.ORE_SILVER_GABBRO.get().getDefaultState(), 4);
        genOre(biome, 8, 32, 0, 40, CREATE_GABBRO, BlockHandler.ORE_LEAD_GABBRO.get().getDefaultState(), 3);
        genOre(biome, 8, 25, 0, 40, CREATE_GABBRO, BlockHandler.ORE_NICKEL_GABBRO.get().getDefaultState(), 3);
        genOre(biome, 4, 5, 0, 20, CREATE_GABBRO, BlockHandler.ORE_URANIUM_GABBRO.get().getDefaultState(), 3);
        genOre(biome, 20, 20, 0, 45, CREATE_GABBRO, BlockHandler.ORE_OSMIUM_GABBRO.get().getDefaultState(), 6);
        genOre(biome, 20, 40, 0, 55, CREATE_GABBRO, BlockHandler.ORE_TIN_GABBRO.get().getDefaultState(), 6);
        genOre(biome, 8, 35, 0, 50, CREATE_GABBRO, BlockHandler.ORE_ZINC_GABBRO.get().getDefaultState(), 4);
      }
      if(blockCreateLimestone != null) {
        // Strata Ores - Limestone
        genOre(biome, 20, 0, 0, 128, CREATE_LIMESTONE, BlockHandler.ORE_COAL_C_LIMESTONE.get().getDefaultState(), 17);
        genOre(biome, 20, 0, 0, 64, CREATE_LIMESTONE, BlockHandler.ORE_IRON_C_LIMESTONE.get().getDefaultState(), 9);
        genOre(biome, 2, 0, 0, 32, CREATE_LIMESTONE, BlockHandler.ORE_GOLD_C_LIMESTONE.get().getDefaultState(), 9);
        genOre(biome, 1, 0, 0, 16, CREATE_LIMESTONE, BlockHandler.ORE_DIAMOND_C_LIMESTONE.get().getDefaultState(), 8);
        genOre(biome, 1, 0, 0, 16, CREATE_LIMESTONE, BlockHandler.ORE_EMERALD_C_LIMESTONE.get().getDefaultState(), 4);
        genOre(biome, 2, 0, 0, 16, CREATE_LIMESTONE, BlockHandler.ORE_LAPIS_C_LIMESTONE.get().getDefaultState(), 7);
        genOre(biome, 8, 0, 0, 16, CREATE_LIMESTONE, BlockHandler.ORE_REDSTONE_C_LIMESTONE.get().getDefaultState(), 8);
        genOre(biome, 20, 45, 0, 60, CREATE_LIMESTONE, BlockHandler.ORE_COPPER_C_LIMESTONE.get().getDefaultState(), 7);
        genOre(biome, 8, 50, 0, 70, CREATE_LIMESTONE, BlockHandler.ORE_ALUMINUM_C_LIMESTONE.get().getDefaultState(), 3);
        genOre(biome, 8, 30, 0, 38, CREATE_LIMESTONE, BlockHandler.ORE_SILVER_C_LIMESTONE.get().getDefaultState(), 4);
        genOre(biome, 8, 32, 0, 40, CREATE_LIMESTONE, BlockHandler.ORE_LEAD_C_LIMESTONE.get().getDefaultState(), 3);
        genOre(biome, 8, 25, 0, 40, CREATE_LIMESTONE, BlockHandler.ORE_NICKEL_C_LIMESTONE.get().getDefaultState(), 3);
        genOre(biome, 4, 5, 0, 20, CREATE_LIMESTONE, BlockHandler.ORE_URANIUM_C_LIMESTONE.get().getDefaultState(), 3);
        genOre(biome, 20, 20, 0, 45, CREATE_LIMESTONE, BlockHandler.ORE_OSMIUM_C_LIMESTONE.get().getDefaultState(), 6);
        genOre(biome, 20, 40, 0, 55, CREATE_LIMESTONE, BlockHandler.ORE_TIN_C_LIMESTONE.get().getDefaultState(), 6);
        genOre(biome, 8, 35, 0, 50, CREATE_LIMESTONE, BlockHandler.ORE_ZINC_C_LIMESTONE.get().getDefaultState(), 4);
      }
      if(blockCreateScoria != null) {
        // Strata Ores - Scoria
        genOre(biome, 20, 0, 0, 128, CREATE_SCORIA, BlockHandler.ORE_COAL_SCORIA.get().getDefaultState(), 17);
        genOre(biome, 20, 0, 0, 64, CREATE_SCORIA, BlockHandler.ORE_IRON_SCORIA.get().getDefaultState(), 9);
        genOre(biome, 2, 0, 0, 32, CREATE_SCORIA, BlockHandler.ORE_GOLD_SCORIA.get().getDefaultState(), 9);
        genOre(biome, 1, 0, 0, 16, CREATE_SCORIA, BlockHandler.ORE_DIAMOND_SCORIA.get().getDefaultState(), 8);
        genOre(biome, 1, 0, 0, 16, CREATE_SCORIA, BlockHandler.ORE_EMERALD_SCORIA.get().getDefaultState(), 4);
        genOre(biome, 2, 0, 0, 16, CREATE_SCORIA, BlockHandler.ORE_LAPIS_SCORIA.get().getDefaultState(), 7);
        genOre(biome, 8, 0, 0, 16, CREATE_SCORIA, BlockHandler.ORE_REDSTONE_SCORIA.get().getDefaultState(), 8);
        genOre(biome, 20, 45, 0, 60, CREATE_SCORIA, BlockHandler.ORE_COPPER_SCORIA.get().getDefaultState(), 7);
        genOre(biome, 8, 50, 0, 70, CREATE_SCORIA, BlockHandler.ORE_ALUMINUM_SCORIA.get().getDefaultState(), 3);
        genOre(biome, 8, 30, 0, 38, CREATE_SCORIA, BlockHandler.ORE_SILVER_SCORIA.get().getDefaultState(), 4);
        genOre(biome, 8, 32, 0, 40, CREATE_SCORIA, BlockHandler.ORE_LEAD_SCORIA.get().getDefaultState(), 3);
        genOre(biome, 8, 25, 0, 40, CREATE_SCORIA, BlockHandler.ORE_NICKEL_SCORIA.get().getDefaultState(), 3);
        genOre(biome, 4, 5, 0, 20, CREATE_SCORIA, BlockHandler.ORE_URANIUM_SCORIA.get().getDefaultState(), 3);
        genOre(biome, 20, 20, 0, 45, CREATE_SCORIA, BlockHandler.ORE_OSMIUM_SCORIA.get().getDefaultState(), 6);
        genOre(biome, 20, 40, 0, 55, CREATE_SCORIA, BlockHandler.ORE_TIN_SCORIA.get().getDefaultState(), 6);
        genOre(biome, 8, 35, 0, 50, CREATE_SCORIA, BlockHandler.ORE_ZINC_SCORIA.get().getDefaultState(), 4);
      }
    }
  }

  private static void genOre(Biome biome, int count, int bottomOffset, int topOffset, int max, OreFeatureConfig.FillerBlockType filler, BlockState defaultBlockstate, int size) {
    CountRangeConfig range = new CountRangeConfig(count, bottomOffset, topOffset, max);
    OreFeatureConfig feature = new OreFeatureConfig(filler, defaultBlockstate, size);

    ConfiguredPlacement config = Placement.COUNT_RANGE.configure(range);

    biome.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Feature.ORE.withConfiguration(feature).withPlacement(config));
  }

  public static void genSedimentDisks(Biome biome, BlockState state, int radiusIn, int ySizeIn, List<BlockState> targetsIn, int count) {
    SphereReplaceConfig sphere = new SphereReplaceConfig(state, radiusIn, ySizeIn, targetsIn);
    FrequencyConfig frequency = new FrequencyConfig(count);

    ConfiguredPlacement config = Placement.COUNT_TOP_SOLID.configure(frequency);

    biome.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Feature.DISK.withConfiguration(sphere).withPlacement(config));
  }

  private static void genStoneVariant(Biome biome, int count, int bottomOffset, int topOffset, int max, OreFeatureConfig.FillerBlockType filler, BlockState defaultBlockstate, int size) {
    CountRangeConfig range = new CountRangeConfig(count, bottomOffset, topOffset, max);
    OreFeatureConfig feature = new OreFeatureConfig(filler, defaultBlockstate, size);

    ConfiguredPlacement config = Placement.COUNT_RANGE.configure(range);

    biome.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Feature.ORE.withConfiguration(feature).withPlacement(config));
  }
}

At the moment, I'm trying with this 

biome.getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).remove(Feature.ORE.withConfiguration(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE, Blocks.COAL_ORE.getDefaultState(), 17)));

but needless to say, that has failed. 

 

I also found this topic: 

which seems to be close to what I need, but I just couldn't figure out the solution code, or how to use it.

List<ConfiguredFeature> features = new ArrayList<ConfiguredFeature>();

            for (ConfiguredFeature<?> f : biome.getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES)) {
                if (((DecoratedFeatureConfig)f.config).feature.feature instanceof OreFeature) {
                    if (((OreFeatureConfig)((DecoratedFeatureConfig)f.config).feature.config).state.getBlock() == Blocks.IRON_ORE) {
                        features.add(f);
                    }
                }
            }

            biome.getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).removeAll(features);

Whenever I tried that, I kept getting an error on the <?> 'Wrong number of type argument'

Posted

That is awesome. Thanks for the tip. It seems to be working now.

public static void overrideFeatures(Biome biome){
    List<ConfiguredFeature> features = new ArrayList<ConfiguredFeature>();

    for (ConfiguredFeature<?,?> f : biome.getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES)) {
      if (((DecoratedFeatureConfig)f.config).feature.feature instanceof OreFeature) {
        if (((OreFeatureConfig)((DecoratedFeatureConfig)f.config).feature.config).state.getBlock() == Blocks.COAL_ORE) {
          features.add(f);
        }
        if (((OreFeatureConfig)((DecoratedFeatureConfig)f.config).feature.config).state.getBlock() == Blocks.IRON_ORE) {
          features.add(f);
        }
        if (((OreFeatureConfig)((DecoratedFeatureConfig)f.config).feature.config).state.getBlock() == Blocks.GOLD_ORE) {
          features.add(f);
        }
        if (((OreFeatureConfig)((DecoratedFeatureConfig)f.config).feature.config).state.getBlock() == Blocks.DIAMOND_ORE) {
          features.add(f);
        }
        if (((OreFeatureConfig)((DecoratedFeatureConfig)f.config).feature.config).state.getBlock() == Blocks.EMERALD_ORE) {
          features.add(f);
        }
        if (((OreFeatureConfig)((DecoratedFeatureConfig)f.config).feature.config).state.getBlock() == Blocks.LAPIS_ORE) {
          features.add(f);
        }
        if (((OreFeatureConfig)((DecoratedFeatureConfig)f.config).feature.config).state.getBlock() == Blocks.REDSTONE_ORE) {
          features.add(f);
        }
      }
    }
    biome.getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).removeAll(features);
  }

 

and I just called it within the Loops itself.

for (Biome biome : ForgeRegistries.BIOMES) {
  overrideFeatures(biome);

 

and here are the fruits of this labor. Still far from finished, but it's a start. Thanks for the help man.

unknown.png?width=1052&height=567

Posted

Looks great! Just watch out for the emerald ore though, i did a bit of a research myself and with the above method, emeralds appear to be still be generating in the world. This is because the feature responsible for placing emeralds in the world does not belong to OreFeature, but to ReplaceBlockFeature. Also do you mind about infested stone blocks (the silverfish block)? If you look at DefaultBiomeFeatures class you will see that they are generated in a different decoration stage, so if you want to remove those you will need to check also that decoration stage.

  • Thanks 1

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted

Oh completely forgot about that. Thanks for reminding me. Will add them to the feature removal method to make sure they don't generate unless I push them through my mod. Working on the other types of Strata Ores now. Let's hope removing the vanilla ores and then pushing them through my mod with FillerBlockType Stone will stop them from spawning on the incorrect block. I think the issue is that all these strata blocks have the Stone forge tag, so the game is treating them as Stone.

If that continues to be the case, then I will have to remove the stone tag from them, and maybe give them a new tag.

Posted (edited)

But alas, all this work seems to be not sufficient enough. No sure if it is a mod loading priority, but the Vanilla Stone ores are spawning on other types of strata stones. I fear that it could be due to the fact that these other stone types have the forge Stone tag. Is there a way I can forge my custom FillerBlockType to select ONLY the Vanilla stone, disregarding other blocks with the same tag? At first I thought it could be due to mod loading priority, but the fact that I can see all the new ores I'm generating means my mod should have been initiated after TerraForged, or is my understanding in this matter incorrect? This is how I'm currently using Stone as a FillerBlockType.

 

public static OreFeatureConfig.FillerBlockType STONE = OreFeatureConfig.FillerBlockType.create("STONE", "stone", new BlockMatcher(Blocks.STONE));

 

Edited by Ridanis
Posted

I am not sure i got what your problem is right, so..from what i understood you have now your custom ores correctly generating inside Quark and TerraForged blocks, which is what you want right? But you are also having vanilla stone ores generating inside the modded blocks, is this right? Maybe a screenshot where i can see what is happening would help

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted

That is exactly what is happening. The Vanilla Ores which have been removed and then re-added through my mod are generating on a non-Vanilla Stone Types such as those added by Create mod and Quark mod.

kMytE2d.pngdtGXSSO.jpg

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • We are your trusted partner in discovering the best coupon codes and offers from top e-commerce platforms across Western countries, including the USA, Canada, and Europe. Our mission is simple: to help you save big while shopping for your favorite products. In this article, we’ll explore “Temu Coupon Code [acs670886]” showcasing unbeatable savings opportunities tailored just for you. Whether you're a savvy shopper looking for exclusive deals or a first-time buyer seeking maximum discounts, we have you covered. Together, we’ll make every shopping spree a budget-friendly adventure! Use the exclusive code “acs670886” to access maximum benefits in the USA, Canada, and European nations. Whether you're shopping for yourself or gifting others, this code guarantees unparalleled savings. Make the most of the Temu coupon $100 off and Temu $100 off coupon code today. It's time to enjoy exceptional deals and turn your shopping spree into a budget-friendly experience. What Is The Coupon Code For Temu $100 Off? Both new and existing customers can reap incredible benefits with our Temu coupon $100 off on the Temu app and website. Use the $100 off Temu coupon and enjoy unparalleled savings. acs670886: Flat $100 off your total purchase. acs670886: Access a $100 coupon pack for multiple uses. acs670886: Enjoy $100 off as a new customer. acs670886: Extra $100 promo code benefits for existing customers. acs670886: Exclusive $100 coupon for users in the USA/Canada. Temu Coupon Code $100 Off For New Users In 2025 New users can get unmatched savings with the Temu coupon $100 off and Temu coupon code $100 off. Use our exclusive code to unlock these amazing benefits: acs670886: Flat $100 discount for first-time shoppers. acs670886: A $100 coupon bundle for new customers. acs670886: Up to $100 off for multiple uses. acs670886: Free shipping to 68 countries worldwide. acs670886: An additional 30% off on your first purchase. acs670886: Also Flat 30% off on selected items. How To Redeem The Temu Coupon $100 Off For New Customers? Follow these steps to use the Temu $100 coupon and Temu 30% off coupon code for new users: Visit the Temu website or download the app. Add items to your cart and proceed to checkout. Enter the coupon code “acs670886” in the promo field. Click “Apply” to see the discount. Complete the payment and enjoy your savings. Temu Coupon $100 Off For Existing Customers Existing users can also benefit from our Temu $100 coupon codes for existing users and Temu coupon $100 off for existing customers free shipping. Use “acs670886” to unlock these perks: acs670886: Extra $100 discount for loyal Temu users. acs670886: A $100 coupon bundle for multiple purchases. acs670886: Free gift with express shipping across the USA/Canada. acs670886: Additional 30% off on top of existing discounts. acs670886: Free shipping to 68 countries. acs670886: Flat 30% off on select purchases. How To Use The Temu Coupon Code $100 Off For Existing Customers? Follow these steps to use the Temu coupon code $100 off and Temu coupon $100 off code: Log in to your Temu account. Select items and add them to your cart. Enter the coupon code “acs670886” at checkout. Apply the code and confirm the discount. Proceed with payment and enjoy exclusive offers. Latest Temu Coupon $100 Off First Order First-time shoppers can enjoy maximum benefits with the Temu coupon code $100 off first order, Temu coupon code first order, and Temu coupon code $100 off first time user. Use the “acs670886” code to unlock these offers: acs670886: Flat $100 off on your first order. acs670886: A $100 Temu coupon pack for first-time buyers. acs670886: Up to $100 off for multiple uses. acs670886: Free shipping to 68 countries. acs670886: Additional 30% discount for first-time purchases. acs670886: Flat 30% off on selected items. How To Find The Temu Coupon Code $100 Off? Discover verified Temu coupon $100 off and Temu coupon $100 off Reddit deals by subscribing to the Temu newsletter. Check Temu’s social media pages for the latest promos or visit trusted coupon websites for regularly updated offers. Is Temu $100 Off Coupon Legit? Yes, the Temu $100 Off Coupon Legit and Temu $100 off coupon legit. Our code “acs670886” is tested, verified, and works globally. Use it confidently for discounts on both first and recurring orders. How Does Temu $100 Off Coupon Work? The Temu coupon code $100 off first-time user and Temu coupon codes $100 off offer instant savings. Enter the code at checkout to reduce your bill by $100 or more, ensuring great value on every purchase. How To Earn Temu $100 Coupons As A New Customer? Unlock the Temu coupon code $100 off and $100 off Temu coupon code by signing up for Temu’s rewards program. Earn additional discounts through referrals and promotional activities. What Are The Advantages Of Using The Temu Coupon $100 Off? Temu coupon code $100 off: Save $100 on your first order. Temu coupon code $100 off: Access a $100 bundle for multiple uses. Temu coupon code $100 off: Flat 30% off for selected items. Up to 30% off on trending items. Additional 30% off for existing customers. Up to 30% off on selected items. Free gift for new users. Free shipping to 68 countries. Temu $100 Discount Code And Free Gift For New And Existing Customers Take advantage of the Temu $100 off coupon code and $100 off Temu coupon code. Use “acs670886” to unlock: acs670886: $100 off on the first order. acs670886: Extra 30% discount on any item. acs670886: Flat 30% off on select purchases. acs670886: Free gift for new users. acs670886: Up to 30% off on select items. acs670886: Free shipping to 68 countries. Pros And Cons Of Using The Temu Coupon Code $100 Off This Month Pros: Flat $100 discount for new and existing users. Additional 30% off on top of discounts. Flat 30% off for specific items. Free shipping to 68 countries. No minimum purchase required. Valid globally. Cons: Limited to specific regions for maximum benefits. Some items may be excluded from the offer. Terms And Conditions Of Using The Temu Coupon $100 Off In 2025 Temu coupon code $100 off free shipping: No minimum purchase required. Latest Temu coupon code $100 off: Valid worldwide. Use “acs670886” anytime, as it has no expiration date. Applicable to both new and existing customers. Free shipping to 68 countries. What Is The Temu Coupon Code 30% Off? Both new and existing customers can get amazing benefits if they use our Temu coupon 30% off on the Temu app and website. With this offer, shoppers can enjoy significant savings and exclusive perks. Here are the details of the benefits you can unlock: acs670886: Flat 30% discount for new users, making your shopping experience more affordable. acs670886: A 30% discount for existing users to save on every purchase. acs670886: Access a $100 coupon pack for multiple uses, ensuring continued savings. acs670886: Enjoy a $100 flat discount for new customers, reducing your first order cost significantly. acs670886: Extra $100 off promo code for existing customers in the USA and Canada, making every purchase worthwhile. Temu Coupon Code 30% Off For New Users New users can get the highest benefits if they use our Temu coupon 30% off on the Temu app. This exclusive code allows first-time shoppers to enjoy unmatched savings. Here’s what you can expect: acs670886: Flat 30% discount for new users to kickstart your shopping journey. acs670886: A $100 coupon bundle for new customers to maximize savings. acs670886: Up to $100 coupon bundle for multiple uses, extending your benefits. acs670886: Free shipping to 68 countries, ensuring a hassle-free shopping experience. acs670886: Extra 30% off on any purchase for first-time users, making your first order even more affordable. How To Redeem The Temu 30% Off Coupon Code For New Customers? Using the Temu 30% off coupon code is simple and straightforward. Follow these steps to redeem your Temu 30% off coupon code as a new customer: Visit the Temu website or download the Temu app. Sign up for a new account. Add your desired items to the shopping cart. Enter the coupon code “acs670886” in the promo code field. Click "Apply" to activate the discount. Complete the checkout process to enjoy your savings. Temu Coupon Code 30% Off For Existing Users Existing users can also get exclusive benefits when they use our Temu 30% off coupon code on the Temu app. Here’s how you can maximize your savings: acs670886: 30% extra discount for loyal Temu users, helping you save on every purchase. acs670886: A $100 coupon bundle for multiple purchases, making your savings stretch further. acs670886: Free gift with express shipping across the USA and Canada, adding more value to your orders. acs670886: Extra 30% off on top of the existing discount, ensuring unmatched savings. acs670886: Free shipping to 68 countries, making your shopping experience seamless. How To Use The Temu Coupon Code 30% Off For Existing Customers? Redeeming your Temu coupon code 30% off as an existing user is easy. Follow these steps to unlock your benefits with the Temu discount code for existing users: Log in to your Temu account. Browse and select your favorite items. Add the items to your cart. Enter the coupon code “acs670886” during checkout. Click "Apply" to activate the discount. Complete your purchase and enjoy the exclusive offers. How To Find The Temu Coupon Code 30% Off? To find the Temu 30% off coupon code first order and latest Temu coupons 30% off, follow these tips: Sign up for the Temu newsletter to receive verified and tested coupons directly in your inbox. Visit Temu’s social media pages regularly for the latest promotions and updates. Check trusted coupon websites to find the most recent and working Temu coupon codes. Use The Latest Temu Coupon Code $100 Off Don’t miss out on incredible savings with the Temu coupon code $100 off. Shop smart and make every dollar count. With the Temu coupon $100 off, you’re guaranteed a rewarding shopping experience. Start saving today!
    • In this article, we’ll dive into the “Temu Coupon Code [acs670886],” highlighting incredible savings opportunities designed just for you. Whether you're a seasoned bargain hunter searching for exclusive deals or a first-time shopper aiming for the best discounts, we’ve got you covered. Let’s transform every shopping experience into a budget-friendly journey! Use the exclusive code “acs670886” to unlock maximum savings in the USA, Canada, and European countries. Whether you're treating yourself or shopping for gifts, this code ensures unbeatable discounts. Don’t miss out on the Temu 70% off coupon and the Temu 70% off coupon code today. It’s time to embrace incredible deals and make your shopping spree both enjoyable and affordable! What Is The Coupon Code For Temu 70% Off? Both new and existing customers can reap incredible benefits with our Temu coupon 70% off on the Temu app and website. Use the 70% off Temu coupon and enjoy unparalleled savings. acs670886: Flat 70% off your total purchase. acs670886: Access a 70% coupon pack for multiple uses. acs670886: Enjoy 70% off as a new customer. acs670886: Extra 70% promo code benefits for existing customers. acs670886: Exclusive 70% coupon for users in the USA/Canada. Temu Coupon Code 70% Off For New Users In 2025 New users can get unmatched savings with the Temu coupon 70% off and Temu coupon code 70% off. Use our exclusive code to unlock these amazing benefits: acs670886: Flat 70% discount for first-time shoppers. acs670886: A 70% coupon bundle for new customers. acs670886: Up to 70% off for multiple uses. acs670886: Free shipping to 68 countries worldwide. acs670886: An additional 70% off on your first purchase. acs670886: Also Flat 70% off on selected items. How To Redeem The Temu Coupon 70% Off For New Customers? Follow these steps to use the Temu 70% coupon and Temu 70% off coupon code for new users: Visit the Temu website or download the app. Add items to your cart and proceed to checkout. Enter the coupon code “acs670886” in the promo field. Click “Apply” to see the discount. Complete the payment and enjoy your savings. Temu Coupon 70% Off For Existing Customers Existing users can also benefit from our Temu 70% coupon codes for existing users and Temu coupon 70% off for existing customers free shipping. Use “acs670886” to unlock these perks: acs670886: Extra 70% discount for loyal Temu users. acs670886: A 70% coupon bundle for multiple purchases. acs670886: Free gift with express shipping across the USA/Canada. acs670886: Additional 70% off on top of existing discounts. acs670886: Free shipping to 68 countries. acs670886: Flat 70% off on select purchases. How To Use The Temu Coupon Code 70% Off For Existing Customers? Follow these steps to use the Temu coupon code 70% off and Temu coupon 70% off code: Log in to your Temu account. Select items and add them to your cart. Enter the coupon code “acs670886” at checkout. Apply the code and confirm the discount. Proceed with payment and enjoy exclusive offers. Latest Temu Coupon 70% Off First Order First-time shoppers can enjoy maximum benefits with the Temu coupon code 70% off first order, Temu coupon code first order, and Temu coupon code 70% off first time user. Use the “acs670886” code to unlock these offers: acs670886: Flat 70% off on your first order. acs670886: A 70% Temu coupon pack for first-time buyers. acs670886: Up to 70% off for multiple uses. acs670886: Free shipping to 68 countries. acs670886: Additional 70% discount for first-time purchases. acs670886: Flat 70% off on selected items. How To Find The Temu Coupon Code 70% Off? Discover verified Temu coupon 70% off and Temu coupon 70% off Reddit deals by subscribing to the Temu newsletter. Check Temu’s social media pages for the latest promos or visit trusted coupon websites for regularly updated offers. Is Temu 70% Off Coupon Legit? Yes, the Temu 70% Off Coupon Legit and Temu 70% off coupon legit. Our code “acs670886” is tested, verified, and works globally. Use it confidently for discounts on both first and recurring orders. How Does Temu 70% Off Coupon Work? The Temu coupon code 70% off first-time user and Temu coupon codes 70% off offer instant savings. Enter the code at checkout to reduce your bill by 70% or more, ensuring great value on every purchase. How To Earn Temu 70% Coupons As A New Customer? Unlock the Temu coupon code 70% off and 70% off Temu coupon code by signing up for Temu’s rewards program. Earn additional discounts through referrals and promotional activities. What Are The Advantages Of Using The Temu Coupon 70% Off? Save 70% on your first order. Access a 70% bundle for multiple uses. Flat 70% off for selected items. Up to 70% off on trending items. Additional 70% off for existing customers. Up to 70% off on selected items. Free gift for new users. Free shipping to 68 countries. Temu 70% Discount Code And Free Gift For New And Existing Customers Take advantage of the Temu 70% off coupon code and 70% off Temu coupon code. Use “acs670886” to unlock: acs670886: 70% off on the first order. acs670886: Extra 70% discount on any item. acs670886: Flat 70% off on select purchases. acs670886: Free gift for new users. acs670886: Up to 70% off on select items. acs670886: Free shipping to 68 countries. Pros And Cons Of Using The Temu Coupon Code 70% Off This Month Pros: Flat 70% discount for new and existing users. Additional 70% off on top of discounts. Flat 70% off for specific items. Free shipping to 68 countries. No minimum purchase required. Valid globally. Cons: Limited to specific regions for maximum benefits. Some items may be excluded from the offer. Terms And Conditions Of Using The Temu Coupon 70% Off In 2025 Temu coupon code 70% off free shipping: No minimum purchase required. Latest Temu coupon code 70% off: Valid worldwide. Use “acs670886” anytime, as it has no expiration date. Applicable to both new and existing customers. Free shipping to 68 countries. Use The Latest Temu Coupon Code 70% Off Don’t miss out on incredible savings with the Temu coupon code 70% off. Shop smart and make every dollar count. With the Temu coupon 70% off, you’re guaranteed a rewarding shopping experience. Start saving today!
    • Hello everyone new here how are you all?
    • I haven't tested it but under https://minecraft.wiki/w/Items_model_definition it says now:   So I guess the resource location must have changed with 1.24.4, which means you need to move your models/item/ to the new source. But as I said I haven't tested this so it also may be that this wont work. Nevertheless give it a try      EDIT (important) So now I tested it and found out how it works   Let the model files (e.g. the .json from blockbench) within "assets/<your_mod_id>/models/item" In addition to that do the following: Every model you added will need a new file under "assets/<your_mod_id>/items" That file is also a JSON and looks like this: { "model": { "type": "minecraft:model", "model": "your_mod_id:item/custom_item" } } - "type" can be minecraft:model, minecraft:composite, minecraft:condition, minecraft:select, minecraft:range_dispatch, minecraft:empty, minecraft:bundle/selected_item or minecraft:special. (In most cases you would need minecraft:model) - "model" is the path to your actual model for this item. For example the value above would point to "assets/your_mod_id/models/item/custom_item"
    • On version 1.20.1 there is a build with the AE2 mod, and when opening the reference book for this mod inside Minecraft, it just freezes and closes
  • Topics

×
×
  • Create New...

Important Information

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