Jump to content

Forge 41.1 Minecraft 1.19


Recommended Posts

Forge Version: 41.1.0
Minecraft Version: 1.19


Hello everyone, this is the first Recommended Build for 1.19. Sorry for the delay we were planning on doing this the original day Mojang released 1.19.1, but for various reason that's been delayed so instead of waiting on Mojang we're making a 1.19.0 RB.
Major thing to note about this release is that we had a major overhaul of our rendering related code. You can read more about it, and how to automate a large chunk of your update here. Also did a pass of class and method renames, you can find a list here. Minor note is the removal of GlobalLootModifierSerializer in favor of Codecs.


  • IForgeRegistryEntry is now removed, in favor of Delegates/Holders. Now that Mojang uses registries on Interface types and anonymous classes. 
  • Registry events will now be fired in the order that vanilla populates its own registries. With all custom registries happening afterwards in alphabetical order. This should address any vanilla code that is not delegate aware. Custom registry types should be delegate aware.
  • New 'displayTest' option in mods.toml, allowing a simple way to use basic one sided multi-player modlist tests.
  • New 'feature' system allowing mods to demand certain features are available in the loading system. Such as `java_version` or `glsl_version`
  • New Fluid API overhaul allowing better physics for custom fluid types.
  • New Biome Modifiers to allow modification of features and spawns.
  • New JarInJar dependency management system.
  • Changed ConfigValue#get() to throw an exception if called before config loaded.
    This prevents silent issues where a mod gets the value of the setting before configs are loaded.
  • ConfigValue's now implement Supplier, to make it easier to pass around to generic functions.
  • New ToolAction for using fishing rods.
  • Added ItemHandler capability to chest boats
  • Implemented full support for IPv6
  • Implemented caching for resource packs, should speed up loading and runtime performance when getting resource lists.
  • Changed custom packet processing onto the network thread to give modders more control over off-thread activities.
  • New hooks to allow enchantment and potions to control their creative tab, as well as the 'foil' overlays.
  • New hook allowing blocks more control over how they look in the Map item.
  • Added RenderLevelStageEvent to replace RenderLevelLastEvent
  • Added config option to disable DFU client side optimizations, should speed up client loading process.
  • Added User-Agent header to requests made by the update checker.
    Format: Java-http-client/<Java version> MinecraftForge/<ForgeVer> <ModId>/<ModVersion>
  • Added API for tab list header/footer
  • Added hook to allow modification of lightmap via Dimension special effects
  • Added hook/loader to allow faces of an "elements" model to be made emissive


  • Fixed various event methods missing proper nullability annotations.
  • Fixed SlotItemHandler not using ItemHandler in initialize.
  • Fixed wrong arguments passed to PlayLevelSoundEvent.AtEntity
  • Fixed Lighting pipeline ignoring the overlay coords from the block renderer
  • Fixed experimental confirmation screen showing in some cases where it shouldn't.
  • Fixed mods' worldgen data not being loaded when creating new singleplayer worlds.
  • Fixed Reach Distance / Attack Range being clamped at 6.0
  • Fixed EnumArgument using toString() instead of name() for suggestions, causing some enums to suggest invalid values.
  • Fixed some native libraries not loading correctly, should address M1 Mac issues.
  • Fixed issue loading audio device settings during initial startup.
  • Fixed ticking chunk tickets from forge's chunk manager not causing chunks to fully tick
  • Fixed MC-105317 Structure blocks do not rotate entities correctly when loading
  • Fixed ITransformationServices not loading from the classpath during dev time.
  • Fixed some custom items rendering the damage bar twice in villager UIs.
  • Fixed data generators related to doors.
  • Fixed shulker boxes allowing input of items, that return false for Item#canFitInsideContainerItems, through hoppers
  • Fixed BufferBuilder.putBulkData(ByteBuffer) not setting positions correctly.
  • Fixed mob block breaking AI not working correctly when chunk 0,0 is unloaded.
  • Fixed renderBreakingTexture not using the target's model data
  • Fixed Global Loot Modifiers not using Dispatch Codec
  • Fixed Sugar Cane not firing CropGrowEvent.Post
  • Fixed crossbows not firing ArrowLooseEvent
  • Fixed modded blocks ability to override sticking to vanilla sticky blocks
  • Fixed invalid channel names sent from the server causing the network thread to error.
  • Thanks 1

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

Link to comment
Share on other sites

This topic is now closed to further replies.


  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • This is now replaced in the latest version, under Advanced Settings. Not available under the registry anymore.
    • You have to set the java path in your start script
    • i tried that and i got rid of java to install the new one but it still says i have the old one and i cant get the new one because of the old one  
    • I created a boss for Minecraft and when is it called «An unexpected error occurred while trying to run this command» "net.minecraft.world.entity.ai.attributes.attribute instance.m_22100_ (double)" because the return value "net.minecraft.world.entity.monster.zombie.m_21051_(net.minecraft.world.entity.ai.attributes.attribute)" is null. I don't fully understand what the error is. But it seems to be related to attributes. Please help me figure it out   Here is the boss class itself: package org.mymod.afraid; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.phys.Vec3; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.entity.projectile.SmallFireball; import org.jetbrains.annotations.NotNull; public class AfraidBoss extends Zombie { private static final int MAX_HEALTH = 1000; private static final double ATTACK_DAMAGE = 10.0D; private static final double FOLLOW_RANGE = 50.0D; private static final double ATTACK_KNOCKBACK = 1.0D; private static final double MOVEMENT_SPEED = 0.25D; private static final int TELEPORT_RADIUS = 20; private static final int FIREBALL_COOLDOWN = 100; // 5 seconds (20 ticks per second) private static final int FIREBALL_COUNT = 3; private int fireballCooldown = 0; private int fireDashCooldown = 0; public AfraidBoss(EntityType<? extends Zombie> type, Level level) { super(type, level); this.setHealth(MAX_HEALTH); this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.DIAMOND_SWORD)); this.setItemSlot(EquipmentSlot.OFFHAND, new ItemStack(Items.DIAMOND_SWORD)); } @Override protected void registerGoals() { this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true)); this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 1.0, (float) TELEPORT_RADIUS)); this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 1.0)); this.goalSelector.addGoal(5, new HurtByTargetGoal(this)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); } @Override public void aiStep() { super.aiStep(); if (this.getTarget() instanceof Player) { Player player = (Player) this.getTarget(); double distanceToPlayer = this.distanceToSqr(player); // Fire Dash ability if (distanceToPlayer <= TELEPORT_RADIUS * TELEPORT_RADIUS && fireDashCooldown == 0) { this.fireDash(player); fireDashCooldown = 200; // Cooldown for fire dash (10 seconds) } // Fireball attack if (fireballCooldown == 0) { this.shootFireballs(player); fireballCooldown = FIREBALL_COOLDOWN; // Cooldown for fireball attack (5 seconds) } // Decrement cooldowns if (fireDashCooldown > 0) { fireDashCooldown--; } if (fireballCooldown > 0) { fireballCooldown--; } } } private void fireDash(Player player) { Vec3 direction = player.position().subtract(this.position()).normalize(); Vec3 newPos = this.position().add(direction.scale(10)); this.teleportTo(newPos.x, newPos.y, newPos.z); this.createFireTrail(newPos); player.hurt(DamageSource.mobAttack(this), 20.0F); // Damage the player } private void createFireTrail(Vec3 position) { for (int x = -2; x <= 2; x++) { for (int z = -2; z <= 2; z++) { BlockPos firePos = new BlockPos(position.x + x, position.y, position.z + z); this.level.setBlock(firePos, Blocks.FIRE.defaultBlockState(), 11); } } } private void shootFireballs(Player player) { Vec3 direction = player.position().subtract(this.position()).normalize(); for (int i = 0; i < FIREBALL_COUNT; i++) { SmallFireball fireball = new SmallFireball(this.level, this, direction.x, direction.y, direction.z); fireball.setPos(this.getX() + direction.x, this.getY() + direction.y, this.getZ() + direction.z); this.level.addFreshEntity(fireball); } } public static AttributeSupplier.Builder createAttributes() { return Zombie.createMobAttributes() .add(Attributes.MAX_HEALTH, MAX_HEALTH) .add(Attributes.ATTACK_DAMAGE, ATTACK_DAMAGE) .add(Attributes.FOLLOW_RANGE, FOLLOW_RANGE) .add(Attributes.ATTACK_KNOCKBACK, ATTACK_KNOCKBACK) .add(Attributes.MOVEMENT_SPEED, MOVEMENT_SPEED); } @Override public boolean hurt(@NotNull DamageSource source, float amount) { boolean flag = super.hurt(source, amount); if (flag && source.getEntity() instanceof Player) { Player player = (Player) source.getEntity(); if (this.random.nextInt(10) == 0) { this.teleportAndAttack(player); } } return flag; } private void teleportAndAttack(Player player) { Vec3 randomPos = player.position().add((this.random.nextDouble() - 0.5) * 4, 0, (this.random.nextDouble() - 0.5) * 4); if (this.randomTeleport(randomPos.x, randomPos.y, randomPos.z, true)) { player.hurt(DamageSource.mobAttack(this), 10.0F); // Damage the player } } }  
  • Topics

  • Create New...

Important Information

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