Jump to content

Forge 39.1 Minecraft 1.18.1


LexManos

Recommended Posts

Forge Version: 39.1.0
Minecraft Version: 1.18

Downloads:

However, as this is the start of a new version, it is recommended that you check the Downloads Page and use the latest version to receive any bug fixes.

Intro:

1.18 (38.0.x) is bundled in with this release because it was only out for a very short time.
It's been a long time coming - with 1.18.2 dangling over our heads for a while we prolonged the RB, but it's here, and it's stable. Not much API has been added, we spent a lot of time refactoring and slimming unused API.
Additionally, we used this time to transition to a new build server, so our capacity to make new builds of Forge has greatly increased.

Changelog:

New:

  • Add Client-sided Commands
  • Add renderable API to allow easier rendering of OBJ and other custom models
  • The vanilla Gametest framework is now integrated with Forge
  • The character "-" is no longer allowed in modids.
  • VanillaGameEvent was added to allow for globally listening to vanilla GameEvents
  • GameEvents for shears and elytras were added
  • Items can hide parts of their tooltips by default
  • StructureFeatures can be added to tags
  • MobEffects can be added to tags
  • Added the ability to get a Codec for a ForgeRegistry
  • Add ShieldBlockEvent
  • Add RenderArmEvent
  • Added server ping data compression - solves some situations where servers are wrongly marked as incompatible
  • Allow dimension JSONs to specify that the dimension should use the overworld's seed

Fixes:

  • Log4J security mitigations for every version released, past present and future
  • Fixed double registry injection when loading single player worlds
  • Fixed RegistryObject not working if created after registry events are fired
  • Missing or unsupported dependencies are now logged, in case they cause a crash before we can show a screen
  • Creating config files also creates parent directories if they do not already exist, as they used to
  • Fixed particles being fullbright for a few frames when first spawning
  • Fixed TerrainParticle rendering black under certain conditions
  • Fixed comparison of custom ParticleRenderTypes leading to broken particle effects
  • Fixed clients being unable to deserialize tags for custom registries
  • Fixed being unable to fetch blockstate in BucketPickup#getPickupSound (for multipley-logged blocks)
  • Fixed custom climbable blocks not sending a death message
  • Fixed modded tools not working on glow lichen
  • Fixed issues when multiple mods declare the same optional tag
  • Fixed `MinecraftLocator` not respecting non-`MOD` FML Mod Types
  • Fixed server side release of custom payload packet buffers
  • Fixed ScreenEvent accepting null screens
  • Fixed getPickupSound not being implemented on ForgeFlowingFluid
  • Fixed LivingExperienceDropEvent not firing, expecially for dragons
  • Fixed String.format calls not having a Locale parameter
  • Fixed LivingDropsEvent not having all drops for foxes
  • Fixed Mob Spawner logic with CustomSpawnRules
  • Fixed regressions for onAddedTo/RemovedFromWorld and related events

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

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • My name is SARAH GOLDFISH, and I'm the CEO of a once-thriving tech startup. Today, I want to share a deeply personal story about how Tropical Delight Recovery saved my business and, quite possibly, my life. In the summer of 2023, my company was at its peak. We had just secured a major partnership, our products were flying off the shelves, and our future looked brighter than ever. However, in the midst of this success, I made a decision that nearly led to our downfall.  Like many others, I was drawn to the world of cryptocurrency. The promise of quick and significant returns was enticing, and I saw it as an opportunity to further bolster our financial standing. After some research, I invested a substantial amount of the company’s funds into a new and seemingly promising cryptocurrency. At first, it seemed like a great move. The value of our investment soared, and I was hailed as a visionary. But as quickly as our fortunes rose, they plummeted. The cryptocurrency market is notoriously volatile, and within weeks, the value of our investment tanked. What I had failed to see was that the currency was part of a sophisticated scam. The entire platform vanished overnight, and with it, our hard-earned money. The impact was immediate and devastating. Our financial cushion was obliterated, and we found ourselves unable to meet payroll or fulfill orders. Our partners began to lose faith, and the media caught wind of our predicament, amplifying our troubles. I was overwhelmed with guilt and fear. I had not only jeopardized the company but also the livelihoods of my employees. Despair set in, and I couldn't see a way out. In my darkest hour, a friend recommended Tropical Delight Recovery. Skeptical and with little hope, I reached out to them. From the first contact, their team was professional, understanding, and, most importantly, optimistic about our chances of recovery. They assured me that they had dealt with similar cases and had a strong track record of retrieving lost funds from fraudulent schemes. Tropical Delight Recovery took swift action. They meticulously traced the fraudulent transactions and employed their extensive network and legal expertise to go after the perpetrators. Their process was transparent, and they kept me informed at every step. It was a complex and arduous journey, but their determination never wavered. Weeks turned into months, and just when I was starting to lose hope, Tropical Delight Recovery delivered a miracle. They managed to recover a significant portion of our lost funds. The relief I felt was indescribable. This wasn't just about the money; it was about the restoration of hope and the possibility of a future for my company. With the recovered funds, we were able to stabilize our finances, reassure our partners, and regain the trust of our employees. It wasn't an instant fix, but it gave us the lifeline we needed to rebuild. Slowly but surely, we started to turn things around. Today, our company is back on track, stronger and more resilient than ever. I owe a debt of gratitude to Tropical Delight Recovery. They didn't just save my company; they saved me from a path of despair and hopelessness. Their professionalism, expertise, and unwavering commitment to their clients make them a beacon of hope for anyone caught in the web of financial fraud. If you find yourself in a situation like mine, don't hesitate to reach out to Tropical Delight Recovery. They are more than a recovery company; they are life-savers. You can reach out to them via: Email: tropicaldelightrecoveryhacker @ out look . Com.
Signal: + 16 14568 3873
Telegram: @ tropical delightrecovery hacker Website: h. t. t ps : // dev-tropicaldelightrecovery pantheonsite   .io
    • 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  
    • Я создал босса для Майнкрафт и когда он вызывается «Произошла непредвиденная ошибка при попытке выполнить эту команду» и в описании «Не удается вызвать ошибку "net.minecraft.world.entity.ai.attributes.attribute instance.m_22100_ (double)", потому что возвращаемое значение "net.minecraft.world.entity.monster.zombie.m_21051_ (net.minecraft.world.entity.ai.attributes.attribute)" имеет значение null. Я не до конца понимаю, в чем ошибка. Но, похоже, это связано с атрибутами. Помогите пожалуйста разобраться   Вот сам класс босса: 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.