Jump to content

JimiIT92

Members
  • Posts

    866
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by JimiIT92

  1. It depends on the data you want to save, but generally speaking you should use some custom Player Capabilities, attach to the Player and use them to store/retrieve any kind of data you want. You can find how to make them work for 1.20.x in the documentation here: https://docs.minecraftforge.net/en/latest/datastorage/capabilities/
  2. Hi, thank you for your response. Unfortunately it seems like the MissingMappingsEvent is not fired in this scenario. What I did is creating a world with the old biome ID, change the biome ID and then load the world ath the biome location. When the world is loaded I get the errors but the breakpoint inside the event listener is never hit This is how I registered the event listener @Mod.EventBusSubscriber(modid = MineWorld.MOD_ID) public final class MissingMappingEvents { /** * Handle the missing mappings and replace them with a valid one * * @param event {@link MissingMappingsEvent The Missing Mappings Event} */ @SubscribeEvent public static void onMissingMapping(final MissingMappingsEvent event) { if(event.getKey().location().equals(new ResourceLocation("mineworld", "volcanic_peak"))) { //Do Stuff } } } If I set the breakpoint directly on the if statement it never gets hit. I've also tried to add a Sysout before the if statement just to see if something gets logged, but it doesn't, so it looks like the event is never called (at least for biomes). I've tried removing an Item and in that case the breakpoint got hit, so I'm assuming is just the biomes? EDIT: I don't know if it matters but I'm using Terrablender for adding Biomes to the world. You can also see how I'm registering biomes here: https://github.com/JimiIT92/MineWorld/blob/master/src/main/java/org/mineworld/core/MWBiomes.java
  3. Hi everyone I've renamed a Biome Id in my mod, and as such, when I load a pre-existing world, I get this error when teleporting to said biome [Server thread/ERROR] [minecraft/ChunkSerializer]: Recoverable errors when loading section [-9, 0, 159]: (Unknown registry key in ResourceKey[minecraft:root / minecraft:worldgen/biome]: mineworld:volcanic_peak -> using default) -> volcanic peaks identified as plains where volcanic_peak is the old Id and volcanic_peaks is the new one. As such, the pre-generated biome is now identified as plains, causing some unintended behaviors in that biome (like rain and mobs spawning, wich my custom biome overrides). Is there a way to automatically convert the biome Id for old worlds? For example when loading the world or the chunk?
  4. I don't think that's possible easily without accessing the vanilla classes (using an AT and some Mixins). If 1.18 is not a requirement (quick note: 1.18 is no longer supported), you can upgrade to 1.20.x and listen for the BuildCreativeModeTabContentsEvent. In this event you can check when a Creative Tab is being "constructed" (either a Vanilla Tab or a Modded Tab) and decide if you want to do something with it (tipically add an Item to that tab). In your case you could add your Item before the vanilla Apple using the putBefore / putAfter methods. For instance, here I'm adding an Apple before the Bone Meal in the Ingredients Tab @SubscribeEvent public static void onTabBuildContents(final BuildCreativeModeTabContentsEvent event) { final ResourceKey<CreativeModeTab> tab = event.getTabKey(); if(tab.equals(CreativeModeTabs.INGREDIENTS)) { event.getEntries().putBefore(Items.BONE_MEAL.getDefaultInstance(), Items.APPLE.getDefaultInstance(), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); } } And in game, if we open the Ingredients tab, we get this result
  5. I'm assuming you are using the Terrablender API for this (if not please tell me how you added a new biome to the Overworld without that, since it looks like that's the only way šŸ¤£). Anyway you coul always look at how vanilla does declare these Surface Rules, specifically the one for the mountain biomes (I think they are actually defined in the JSON file, but from the code you can get an idea of how these conditions works). One condition I can think would be interesting is the SurfaceRules.VerticalGradientConditionSource condition. Judging from the name you can guess that this is the condition used to create some gradients. For instance, if we look at the Overworld noise settings file (worldgen/noise_settings/overworld.json), this is used to generate the Bedrock layer at the bottom of the World and make it transitioning from Bedrock to Deepslate to not have it flat { "type": "minecraft:condition", "if_true": { "type": "minecraft:vertical_gradient", "false_at_and_above": { "above_bottom": 5 }, "random_name": "minecraft:bedrock_floor", "true_at_and_below": { "above_bottom": 0 } }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:bedrock" } } } And a similar condition is also applied to generate the Deepslate transition from Stone starting from Y level 8 to Y level 0 (notice the "false_at_and_above" and "true_at_and_below" properties) { "type": "minecraft:condition", "if_true": { "type": "minecraft:vertical_gradient", "false_at_and_above": { "absolute": 8 }, "random_name": "minecraft:deepslate", "true_at_and_below": { "absolute": 0 } }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:deepslate", "Properties": { "axis": "y" } } } } So starting from this you can get an idea of how to create smooth transitions between your "biome layers". Now, to generate blocks only at the top 10 blocks of the biome right now I can't think about any vanilla biome that does a similar thing, but maybe looking at how the Badlands or the Snowy Slope biome are constructed may be a good ay to follow
  6. EDIT: NVM, the enchantment ID was wrong and that was causing the issue. Not sure why it doesn't let me delete this post Hi, I'm trying to make a "smelting" enchantment Global Loot Modifier, but for some reason the game could not decode its related JSON file, altough is applying the Loot Modifier to every single loot When I join a world I get this error in the console [01:08:01] [Render thread/WARN] [ne.mi.co.lo.LootModifierManager/]: Could not decode GlobalLootModifier with json id mineworld:enchantments/fiery_touch - error: Not a json array: {"condition":"minecraft:match_tool","predicate":{"enchantments":[{"enchantment":"mineworld:smelting","levels":{"min":1}}]}} The GLM Json file is the following { "type": "mineworld:fiery_touch", "conditions": [ { "condition": "minecraft:match_tool", "predicate": { "enchantments": [ { "enchantment": "mineworld:smelting", "levels": { "min": 1 } } ] } } ] } And this is the LootModifier class package org.mineworld.loot; import com.google.common.base.Suppliers; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.core.RegistryAccess; import net.minecraft.world.Container; import net.minecraft.world.SimpleContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraftforge.common.loot.IGlobalLootModifier; import net.minecraftforge.common.loot.LootModifier; import net.minecraftforge.items.ItemHandlerHelper; import org.jetbrains.annotations.NotNull; import org.mineworld.MineWorld; import java.util.List; import java.util.Optional; import java.util.function.Supplier; import java.util.stream.IntStream; /** * {@link MineWorld MineWorld} loot modifier for smelting a drop from a block */ public final class FieryTouchModifier extends LootModifier { /** * {@link Supplier<Codec> The loot codec supplier} */ public static final Supplier<Codec<FieryTouchModifier>> CODEC = Suppliers.memoize(() -> RecordCodecBuilder.create(inst -> codecStart(inst).apply(inst, FieryTouchModifier::new))); /** * Constructor. Set the {@link LootItemCondition loot id conditions} * * @param lootConditions {@index ILootCondition The conditions that need to be matched before the loot is modified} */ public FieryTouchModifier(final LootItemCondition[] lootConditions) { super(lootConditions); } /** * Add the {@link MWLootItem items} to the loot * * @param loot {@link ObjectArrayList<ItemStack> The current loot} * @param context {@link LootContext The loot context} * @return {@link ObjectArrayList<ItemStack> The modified loot} */ @Override protected @NotNull ObjectArrayList<ItemStack> doApply(final ObjectArrayList<ItemStack> loot, final LootContext context) { if(context.hasParam(LootContextParams.BLOCK_STATE)) { final Level level = context.getLevel(); final RecipeManager recipeManager = level.getRecipeManager(); final RegistryAccess registryAccess = level.registryAccess(); IntStream.range(0, loot.size()).forEach(index -> { final ItemStack drop = loot.get(index); final ItemStack smeltedDrop = tryGetSmeltedDrop(recipeManager, RecipeType.SMELTING, level, registryAccess, drop) .orElse(tryGetSmeltedDrop(recipeManager, RecipeType.SMITHING, level, registryAccess, drop) .orElse(tryGetSmeltedDrop(recipeManager, RecipeType.BLASTING, level, registryAccess, drop) .orElse(tryGetSmeltedDrop(recipeManager, RecipeType.SMOKING, level, registryAccess, drop) .orElse(tryGetSmeltedDrop(recipeManager, RecipeType.CAMPFIRE_COOKING, level, registryAccess, drop) .orElse(ItemStack.EMPTY))))); if(!smeltedDrop.isEmpty()) { loot.set(index, smeltedDrop); } }); } return loot; } /** * Get the {@link Codec loot modifier codec} * * @return {@link #CODEC The loot modifier codec} */ @Override public Codec<? extends IGlobalLootModifier> codec() { return CODEC.get(); } /** * Try to set the smelted drop to the {@link List<ItemStack> block drop list} * * @param recipeManager {@link RecipeManager The recipe manager} * @param recipeType {@link RecipeType The recipe type} * @param level {@link Level The level reference} * @param registryAccess {@link RegistryAccess The registry access} * @param drop {@link ItemStack The dropped item} * @return {@link ItemStack The smelted ItemStack} */ private static <C extends Container, T extends Recipe<C>> Optional<ItemStack> tryGetSmeltedDrop(final RecipeManager recipeManager, final RecipeType<T> recipeType, final Level level, final RegistryAccess registryAccess, final ItemStack drop) { return recipeManager.getRecipeFor(recipeType, (C) new SimpleContainer(drop), level) .map(recipe -> recipe.value().getResultItem(registryAccess)) .filter(itemStack -> !itemStack.isEmpty()) .map(itemStack -> ItemHandlerHelper.copyStackWithSize(itemStack, drop.getCount() * itemStack.getCount())); } } I have another GLM that has some entries as well and doesn't have any issues
  7. Why are you doing this instead of just playing the sound using the level or the player method?
  8. It might just be a misleading log, if you run the command while debugging what's the outcome? I've tried checking the item inside the RightClickBlock event and it works just fine private static final Ingredient FOOD_ITEMS = Ingredient.of(Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS, Items.TORCHFLOWER_SEEDS, Items.PITCHER_POD); @SubscribeEvent public static void onRightClickBlock(final PlayerInteractEvent.RightClickBlock event) { final ItemStack itemStack = event.getItemStack(); LOGGER.info(FOOD_ITEMS.test(itemStack) + ""); } When I right click a block with an Item it checks if is one of the ingredients of FOOD_ITEMS. Clicking with an empty hand (air) logs false, as expected. Tip: please use the "spoiler" tags for long code snippets and don't merge all your classes into one code snippet EDIT: just noticed you are on 1.20.1. Maybe is just a bug with the Forge version? Try update to the latest Forge 1.20.2 and see if it still occurs
  9. 1.12 is no longer supported Please update to a newer supported version (like 1.19 or even better 1.20). If you absolutely need to use 1.12 you can try to ask someone on the discord server
  10. Is the code inside the event event gets called? I believe that event listeners needs to be public static and the Level parameter should be retrieved from the event itself (not sure if you can provide it as a listener parameter, I don't think so tbh)
  11. Because air is good! Jokes aside, how can you tell that your mob is eating air? Like, there's an actual action in game that you can observe? Also show the full entity code, maybe there's something weird going on there as well PS: don't bump posts, someone will eventually show up You should also consider asking questions in the discord server, wherre is more likely that you'll get a quick response
  12. Are the missing textures coming from a mod you're coding? If not you should contact the mod's authors and report this issue to them Strange issue btw, never heard of that
  13. One quick solution I can think of is to slightly light up the structure so regular mobs can't spawn (they only spawn in complete darkness). Another useful way would be to look at some vanilla structures that doesn't spawn mobs other than the one related to that structure, like the new trial chambers in 1.21 (you can look if there's something particular in the structure json file inside a snapshot jar file) or maybe the end cities (where only Shulkers spawns inside, not even Enderman if I remember correctly)
  14. Hi everyone I'm trying to make a custom door and give it a custom sound. In order to do so I've registered the sounds like this private static final DeferredRegister<SoundEvent> SOUNDS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, MineWorld.MOD_ID); ... public static final RegistryObject<SoundEvent> SCULK_DOOR_CLOSE = SOUNDS.register("sculk_door_close", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(MineWorld.MOD_ID, "sculk_door_close"))); public static final RegistryObject<SoundEvent> SCULK_DOOR_OPEN = SOUNDS.register("sculk_door_open", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(MineWorld.MOD_ID, "sculk_door_open"))); call the register method of the Sounds registry as the first thing in my mod initialize method IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); SOUNDS.register(eventBus); Then I create a BlockSetType like this public static final BlockSetType SCULK = BlockSetType.register(new BlockSetType(new ResourceLocation(MineWorld.MOD_ID, "sculk").toString(), true, SoundType.WOOD, SCULK_DOOR_CLOSE.get(), SCULK_DOOR_OPEN.get(), SoundEvents.WOODEN_TRAPDOOR_CLOSE, SoundEvents.WOODEN_TRAPDOOR_OPEN, SoundEvents.WOODEN_PRESSURE_PLATE_CLICK_OFF, SoundEvents.WOODEN_PRESSURE_PLATE_CLICK_ON, SoundEvents.WOODEN_BUTTON_CLICK_OFF, SoundEvents.WOODEN_BUTTON_CLICK_ON); And finally the door block like this private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MineWorld.MOD_ID); ... BLOCKS.register("sculk_door", () -> new DoorBlock(BlockBehaviour.Properties.copy(Blocks.OAK_DOOR), blockSetType)); But when I launch the game I get this error Registry Object not present: mineworld:sculk_door_close Am I doing something wrong? Maybe the BlockSetType registration needs to be done in a different way? I have other BlockSetTypes registered like this that only uses vanilla sounds and they work just fine. You can see an example in my GitHub repo here: https://github.com/JimiIT92/MineWorld/blob/master/src/main/java/org/mineworld/core/MWBlockSetTypes.java
  15. getAllRecipesFor returns a List of RecipeHolder. This mean that for each entry in the list you need to do entry.value to get the actual recipe. Once you have the recipe you can access its ingredients (which usually are called just like that). Do note that CraftingRecipe is an interface an therefore by itself doesn't have any ingredient reference. For that you need to check the actual implementation class of the recipe, like ShapedRecipe
  16. Which version of Forge are you using? I've updated my mod yesterday to 48.0.30 and saw no issues with the ArmorItem constructor
  17. Hi I'm developing a vanilla-based mod, where I add a bunch of new blocks based on vanilla materials. Sometime these variations gets added into the base game, so I have to remove them from the mod to avoid having both items (an example is the lantern or the copper grates that will be added in 1.21). Now, every time this happen the player looses their item in a previously saved world, which is of course not cool. So I was wondering how can I handle those cases, so that when the player loads in a world with a new mod version that doesn't have that item I can somehow transform that into another item (like a vanilla one in this case)?
  18. That's really weird, I've just created a new world both in a dev environment or with a real account, and in both cases the count is incorrect for some reason. By the way I know this will cause mod conflicts, but since there aren't any other ways the only compromise I can think of is to use tags, but I don't know if that will actually work
  19. I'm editing some vanilla advancements to include my mod's features, and I've noticed something strange about the adventuring time advancement (the one where you have to discover all overworld biomes). You can see my edited advancement json file here: https://github.com/JimiIT92/MineWorld/blob/master/src/main/resources/data/minecraft/advancements/adventure/adventuring_time.json What I did is simply add 3 biomes to the criteria and add them into the requirements as well. So the biomes required for the advancement should now be 56 instead of 53. However, in the advancement screen, it keeps saying that I need to discover 53 biomes, instead of 56, which is also strange due to the fact that if I go inside one of the 3 added biomes the counter for the discovered biomes increases, so it recognize that going into that biome will count towards the advancement. I don't know what's causing this, since I did a similar thing to the "a balanced diet" advancement, where I added 2 foods to the requirements and the counter properly says the correct amount (which is 42 instead of vanilla 40, you can find the JSON here). I've also tried to remove both modded biomes and a vanilla biome from the requirements, from which I expected the counter to at least go down by one, but it still says 53 no matter what... So how can I change this counter to display the correct amount of biomes that are required for the advancement? Could it have something to do with how I register the biomes (which I do here)?
  20. That's really unfortunate to hear I've read that here: Which I did right here: I just posted some snippets in case someone would quickly identify what's wrong, without browsing the entire repo šŸ¤·šŸ¼ā€ā™‚ļø Anyway, I guess I'll stick to terrablender since it seems what most mods is using now (event Biomes OƬ Plenty from what I've seen)
  21. I'm struggling on biome generation in 1.19.4. I've tried to add a basic biome, just a regular snowy plain, however I'm struggling to make it spawn inside the overworld. You can find all the implementation I tried here: https://github.com/JimiIT92/MineWorld/blob/master/src/main/java/org/mineworld/core/MWBiomes.java I'll simplify the code here just to avoid an extra long post. So, what I did is create a biome resource key and use the bootstrap method (similar to placed features) to register the key and the biome public static final ResourceKey<Biome> FROZEN_PLAINS = ResourceKey.create(Registries.BIOME, new ResourceLocation(modid, "frozen_plains")); public static void bootstrap(final BootstapContext<Biome> context) { final HolderGetter<PlacedFeature> placedFeatureHolder = context.lookup(Registries.PLACED_FEATURE); final HolderGetter<ConfiguredWorldCarver<?>> carver = context.lookup(Registries.CONFIGURED_CARVER); context.register(FROZEN_PLAINS, BiomeHelper.frozenPlains(placedFeatureHolder, carver)); } The BiomeHelper.frozePlains method is just a method that returns a Biome object, similar to how vanilla creates the plains biome public static Biome frozenPlains(final HolderGetter<PlacedFeature> placedFeatureHolder, final HolderGetter<ConfiguredWorldCarver<?>> carver) { final MobSpawnSettings.Builder mobSpawnSettings = new MobSpawnSettings.Builder(); final BiomeGenerationSettings.Builder biomeGenerationSettings = new BiomeGenerationSettings.Builder(placedFeatureHolder, carver); OverworldBiomes.globalOverworldGeneration(biomeGenerationSettings); mobSpawnSettings.creatureGenerationProbability(0.07F); BiomeDefaultFeatures.snowySpawns(mobSpawnSettings); biomeGenerationSettings.addFeature(GenerationStep.Decoration.SURFACE_STRUCTURES, MiscOverworldPlacements.ICE_SPIKE); biomeGenerationSettings.addFeature(GenerationStep.Decoration.SURFACE_STRUCTURES, MiscOverworldPlacements.ICE_PATCH); BiomeDefaultFeatures.addDefaultOres(biomeGenerationSettings); BiomeDefaultFeatures.addDefaultSoftDisks(biomeGenerationSettings); return new Biome.BiomeBuilder() .hasPrecipitation(false) .temperature(-5.0F) .temperatureAdjustment(Biome.TemperatureModifier.FROZEN) .downfall(0.5F) .specialEffects(new BiomeSpecialEffects.Builder() .waterColor(10468857) .waterFogColor(14079743) .fogColor(14408667) .skyColor(13092807) .foliageColorOverride(16777215) .grassColorOverride(16777215) .ambientParticle(new AmbientParticleSettings(ParticleTypes.SNOWFLAKE, 0.0118093334F)) .ambientMoodSound(AmbientMoodSettings.LEGACY_CAVE_SETTINGS).build() ) .mobSpawnSettings(mobSpawnSettings.build()) .generationSettings(biomeGenerationSettings.build()) .build(); } Then, in the FMLCommonSetupEvent, I add the biome to the overworld biomes using BiomeManager.addBiome (I've also tried addAdditionalOverworldBiomes but got no luck) private void commonSetup(final FMLCommonSetupEvent event) { event.enqueueWork(() -> { BiomeManager.addBiome(BiomeManager.BiomeType.ICY, new BiomeManager.BiomeEntry(FROZEN_PLAINS, 3000)) }); } I'm using a really high weight value for testing. Finally I've added the biome json file inside data/modid/worldgen/biome/frozen_plains.json { "carvers": { "air": [ "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] }, "downfall": 0.5, "has_precipitation": false, "creature_spawn_probability": 0.07, "temperature_modifier": "frozen", "effects": { "mood_sound": { "block_search_extent": 8, "offset": 2.0, "sound": "minecraft:ambient.cave", "tick_delay": 6000 }, "particle": { "options": { "type": "snowflake" }, "probability": 0.0118093334 }, "fog_color": 14408667, "sky_color": 13092807, "water_color": 10468857, "water_fog_color": 14079743, "foliage_color": 16777215, "grass_color": 16777215 }, "features": [ [], [ "minecraft:lake_lava_underground" ], [ "minecraft:amethyst_geode" ], [ "minecraft:monster_room", "minecraft:monster_room_deep" ], [ "minecraft:ice_spike", "minecraft:ice_patch" ], [], [ "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ], [], [ "minecraft:spring_water" ], [ "minecraft:glow_lichen" ], [ "minecraft:freeze_top_layer" ] ], "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 10 }, { "type": "minecraft:polar_bear", "maxCount": 2, "minCount": 1, "weight": 1 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 20 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:stray", "maxCount": 4, "minCount": 4, "weight": 80 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": -5.0 } But, if I launch the game and try to locate the biome, this cannot be found inside the world. However if I generate a single biome world the custom biome generates without any issues. Also if I place a breakpoint inside the bootstrap method I see that it never gets hit, but I dont' understand why since it does for other bootstrap contexts like placed features. So what do I need to make the biome actually generate inside the overworld? Also, since surface builders seems gone, how can I change the terrain generation, so that I can generate something else instead of grass blocks for my surface?
  22. Yeah, but that would work if every item that I need to render in a certain way in the inventory are direct childs of Item. If I have some items that extend another vanilla item class (for example something that extends TridentItem to make some spears) I have to specify that code inside the custom trident item class as well šŸ˜…
  23. Well... that's unfortunate I guess the only way then is to catch the crafting result event and modify the output
×
×
  • Create New...

Important Information

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