The giant is one I'm glad isn't implemented. That's an example of something I find to be an awful copy and paste. It's a silly "what if" concept that doesn't fit into such a game.
How are baby zombies any different? In fact, they have more in common with normal zombies than giants; same health, same damage, etc, just faster and (before 1.13) not burning in sunlight.
The arguments that I saw against giants usually referenced their buggy AI (as all mobs were prior to 1.2 and some still used until 1.8; they have no ability to pathfind at all, just run straight towards the player; load up 1.6.4 and stack a couple blocks and spawn a zombie pigmen or enderman and aggro it (these mobs will even aggro if hit in Creative), it will be unable to get around it, likewise, they just run into a hole in the ground).
Aside from that, 50 damage is way too much, even the Ender Dragon only deals 10, heck, even a creeper only deals 49 point-blank (43 in newer versions, 36 in TMCW), usually much less. I reduced this to 10, which is still quite high as far as common mobs go (not that I made them common, they have the lowest spawn chance of any mob).
This shows how I refactored their code, updating them to a proper AI system and fixing various other issues, such as buggy collision detection (the game measures the distance between a player and mob based on their feet position; because of this, if you try to hit them in the head you'll be out of range, another issue is that if their feet are in a different chunk section the game won't even find them since it searches for entities by section):
Vanilla; this just makes a very basic mob (most of their behavior is just the default mob behavior):
package net.minecraft.src;
public class EntityGiantZombie extends EntityMob
{
public EntityGiantZombie(World par1World)
{
super(par1World);
this.yOffset *= 6.0F;
this.setSize(this.width * 6.0F, this.height * 6.0F);
}
protected void applyEntityAttributes()
{
super.applyEntityAttributes();
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setAttribute(100.0D);
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setAttribute(0.5D);
this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setAttribute(50.0D);
}
public float getBlockPathWeight(int par1, int par2, int par3)
{
return this.worldObj.getLightBrightness(par1, par2, par3) - 0.5F;
}
}
TMCW (and World1, minus the husk part, so yes, I've encountered them in my first world, which also has naturally spawning cave spiders and witches):
package net.minecraft.src;
public class EntityGiantZombieTMCW extends EntityMob
{
// Note that Giants use the same variants as zombies
public EntityGiantZombieTMCW(World par1World)
{
super(par1World);
// Updated to use new entity AI
if (!par1World.isRemote)
{
this.tasks.addTask(0, new EntityAISwimming(this));
this.tasks.addTask(2, new EntityAIMeleeAttack(this, 1.0D, EntityAIMeleeAttack.DEFAULT));
this.tasks.addTask(6, new EntityAIWander(this, 1.0D));
this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 16.0F));
this.tasks.addTask(7, new EntityAILookIdle(this));
this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true));
}
this.yOffset *= 6.0F;
// Width is reduced (server-side only) after spawn check to help improve pathfinding and excessive attack reach.
this.setSize(3.0F, 11.8F);
// Increased experience to 20 (default 5) on account of strength and rarity
this.experienceValue = 20;
// Allows giants to scale blocks more effectively
this.stepHeight = 2.0F;
}
protected void entityInit()
{
super.entityInit();
this.getDataWatcher().addObject(12, Byte.valueOf((byte)0));
}
protected void applyEntityAttributes()
{
super.applyEntityAttributes();
// Increased followRange to 32 blocks
this.getEntityAttribute(SharedMonsterAttributes.followRange).setAttribute(32.0D);
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setAttribute(100.0D);
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setAttribute(0.33D);
// Damage reduced to 10 (5 hearts) as the default of 50 is excessive
this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setAttribute(10.0D);
}
protected void dropFewItems(boolean isPlayerKill, int looting)
{
// looting ranges from 0 to 3 for no Looting to Looting III
if (!isPlayerKill || looting < 0) looting = 0;
// Drops 3-6 rotten flesh (up to 12 with Looting III)
int count = this.rand.nextInt(looting * 2 + 4) + 3;
for (int i = 0; i < count; ++i)
{
this.dropItem(ItemIDs.rottenFlesh, 1);
}
// The following items only drop when killed by a player
if (!isPlayerKill) return;
// looting / 10 chance of dropping a diamond; only drops with Looting
if (this.rand.nextFloat() < (float)looting * 0.1F)
{
this.dropItem(ItemIDs.diamond, 1);
}
// Husks drop 1-2 + looting sand (up to 5 with Looting III)
int type = this.getZombieType();
if (EntityZombieTMCW.isHusk(type))
{
if (type == EntityZombieTMCW.WHITE_HUSK)
{
type = BlockSandTMCW.QUARTZ_SAND;
}
else if (type == EntityZombieTMCW.RED_HUSK)
{
type = BlockSandTMCW.RED_SAND;
}
else
{
type = BlockSandTMCW.YELLOW_SAND;
}
count = this.rand.nextInt(looting + 2) + 1;
for (int i = 0; i < count; ++i)
{
this.entityDropItem(new ItemStack(Block.sand, 1, type), 0.0F);
}
}
}
public float getBlockPathWeight(int posX, int posY, int posZ)
{
// Unlike other hostile mobs giants prefer to path to light (e.g. player's bases)
return this.worldObj.getLightBrightness(posX, posY, posZ) - 0.5F;
}
// Note that all code in supers was bypassed
public boolean getCanSpawnHere()
{
// 1/4 chance of a spawn attempt succeeding and only at or above sea level; spawners have no restrictions
if (this.spawnType != SPAWNER && (this.rand.nextInt(4) != 0 || this.blockY() < ChunkProviderTMCW.getSeaLevel())) return false;
return (this.worldObj.difficultySetting > 0 && this.isValidLightLevel() && this.worldObj.checkNoEntityCollision(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox));
}
public void onLivingUpdate()
{
this.setOnFireFromSun(true);
super.onLivingUpdate();
}
protected boolean canBurnInSun()
{
return !this.isHusk();
}
public boolean attackEntityAsMob(Entity par1Entity)
{
boolean var2 = super.attackEntityAsMob(par1Entity);
// Chance of being set on fire or given Hunger varies from 50-100% depending on regional difficulty, reaching 100% sooner
// on higher difficulties (50 hours on Easy, 16.6 on Hard).
if (var2)
{
float chance = this.worldObj.getTensionFactor() * 2.0F + 0.5F;
// Sets player on fire for 3-7 to 5-15 seconds depending on difficulty
if (this.isBurning() && this.rand.nextFloat() < chance)
{
par1Entity.setFire(this.worldObj.difficultySetting * 2 + 1 + (int)(this.worldObj.getTensionFactor() * 5.5F));
}
if (this.isHusk() && par1Entity instanceof EntityPlayer && this.rand.nextFloat() < chance)
{
// Husks give players Hunger for (tensionFactor * 26.67 seconds), up to 13.35-26.65-40 on Easy-Normal-Hard and
// for at least 10 seconds. Note that time is in ticks (20/s); max is 267-533-800
int time = Math.max(200, Math.round(this.worldObj.getTensionFactor() * 533.4F));
((EntityLivingBase)par1Entity).addPotionEffect(new PotionEffect(Potion.hunger.id, time, 0));
}
}
return var2;
}
// Giants are immune to cactus and berry bushes and are not slowed down by prickly pear cactus or cobwebs
public boolean attackEntityFrom(DamageSource par1DamageSource, float par2)
{
return (par1DamageSource != DamageSource.cactus && par1DamageSource != DamageSource.berryBush && super.attackEntityFrom(par1DamageSource, par2));
}
public void setInPricklyPearCactus()
{
this.fallDistance *= 0.75F;
}
public void setInWeb()
{
this.fallDistance *= 0.75F;
}
protected void jump()
{
// Increased from 0.42 so giants can jump 2 blocks (equivalent to Jump Boost II)
this.motionY = 0.62D;
// Jump Boost modifier changed from 0.1 to 0.2 per level for twice the effect
if (this.isPotionActive(Potion.jump))
{
this.motionY += (double)(this.getActivePotionEffect(Potion.jump).getAmplifier() + 1) * 0.2D;
}
// Increases forward speed when jumping (normally applied when sprinting with 0.2 changed to 0.5)
float angle = this.rotationYaw * MathHelper.DEG_TO_RAD;
this.motionX -= (double)(MathHelper.sin(angle) * 0.5F);
this.motionZ += (double)(MathHelper.cos(angle) * 0.5F);
this.isAirBorne = true;
}
protected void fall(float fallDistance)
{
if (this.riddenByEntity != null) this.riddenByEntity.fall(fallDistance);
PotionEffect effect = this.getActivePotionEffect(Potion.jump);
float var3 = effect != null ? (float)(effect.getAmplifier() + 1) : 0.0F;
// Maximum safe fall distance changed from 3 to 6 blocks
int var4 = MathHelper.ceiling_float_int(fallDistance - 6.125F - var3);
if (var4 > 0)
{
this.playSound("damage.fallbig", 1.0F, 1.0F);
// Fall damage per block is halved
this.attackEntityFrom(DamageSource.fall, (float)var4 * 0.5F);
int var5 = this.worldObj.getLoadedBlockId(this.blockX(), this.blockY(-0.2F - this.yOffset), this.blockZ());
if (var5 > 0)
{
StepSound var6 = Block.blocksList[var5].stepSound;
this.playSound(var6.getStepSound(), var6.getVolume() * 0.5F, var6.getPitch() * 0.75F);
}
}
}
public int getMaxSafePointTries()
{
// Increases distance mob is willing to fall when chasing a target to up to 50 blocks when at max health
return (this.getAttackTarget() != null ? Math.max(6, (int)(this.getHealth() * 0.5F)) : 6);
}
protected String getLivingSound()
{
return "mob.zombie.say";
}
protected String getHurtSound()
{
return "mob.zombie.hurt";
}
protected String getDeathSound()
{
return "mob.zombie.death";
}
protected void playStepSound(int par1, int par2, int par3, int par4)
{
this.playSound("mob.zombie.step", 0.15F, 1.0F);
}
public EnumCreatureAttribute getCreatureAttribute()
{
return EnumCreatureAttribute.UNDEAD;
}
protected boolean isAIEnabled()
{
return true;
}
// Increased count to 40 and set width and height to 2.5 and 7.5 so particles are more concentrated
public void createDeathParticles()
{
if (this.worldObj.isRemote)
{
for (int i = 0; i < 40; ++i)
{
this.worldObj.spawnParticle("explode", this.posX + (double)(Random32.nextFloat() * 5.0F - 2.5F), this.posY + (double)(Random32.nextFloat() * 7.5F), this.posZ + (double)(Random32.nextFloat() * 5.0F - 2.5F), (double)Random32.nextGaussian_02(), (double)Random32.nextGaussian_02(), (double)Random32.nextGaussian_02());
}
}
}
public void createSpawnParticles()
{
if (!this.worldObj.isRemote) this.worldObj.addExplosionParticles(40, this.posX, this.posY, this.posZ, 2.5F, 7.5F);
}
// 0 = normal, 2 = husk, 3 = red husk, 4 = white husk (1 is not used, skipped so giants can use same values as zombies, where
// 1 is villager)
public void setZombieType(int par1)
{
this.getDataWatcher().updateObject(12, Byte.valueOf((byte)par1));
}
public byte getZombieType()
{
return this.getDataWatcher().getWatchableObjectByte(12);
}
public boolean isHusk()
{
return EntityZombieTMCW.isHusk(this.getDataWatcher().getWatchableObjectByte(12));
}
public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
{
super.writeEntityToNBT(par1NBTTagCompound);
par1NBTTagCompound.setByte("ZombieType", this.getZombieType());
}
public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
{
super.readEntityFromNBT(par1NBTTagCompound);
this.setZombieType(par1NBTTagCompound.getByte("ZombieType"));
// Ensures that width is properly set when loading from NBT
this.setSize(1.96F, 11.8F);
}
public EntityLivingData onSpawnWithEgg(EntityLivingData par1EntityLivingData)
{
// Knockback resistance ranges from 0.2-0.35-0.5 on Easy-Normal-Hard (80-65-50% of normal knockback)
float resistance = (float)this.worldObj.difficultySetting * 0.15F + 0.05F;
this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).applyModifier(new AttributeModifier("Random spawn bonus", resistance, 0));
int x = this.blockX();
int z = this.blockZ();
this.setZombieType(EntityZombieTMCW.getZombieTypeForBiome(this.worldObj, x, this.blockY(), z, this.worldObj.getBiomeGenForCoords(x, z), true));
// Reduces width to help fix buggy collision detection (spawn check uses full width)
this.setSize(1.96F, 11.8F);
return par1EntityLivingData;
}
// Overrides default method so variants can have their own names
public String getEntityName()
{
if (this.hasCustomNameTag())
{
return this.getCustomNameTag();
}
else if (EntityZombieTMCW.isHusk(this.getZombieType()))
{
return StatCollector.translateToLocal("entity.GiantHusk.name");
}
else
{
return StatCollector.translateToLocal("entity.Giant.name");
}
}
// Halves limb swing speed for a more realistic speed
protected float getLimbSwingFactor()
{
return 0.5F;
}
// Treats Giants as 4 separate points, 0, 3.333, 6.667, 10 blocks above posY to improve collision detection
public double getDistanceSqToTarget(Entity par1Entity)
{
float minDistance = 1000000F;
float dx = (float)(this.posX - par1Entity.posX);
float dy = (float)(this.posY - par1Entity.posY);
float dz = (float)(this.posZ - par1Entity.posZ);
dx = dx * dx + dz * dz;
for (int y = 0; y < 4; ++y)
{
float distance = dx + dy * dy;
if (distance < minDistance) minDistance = distance;
dy += 3.333333F;
}
return (double)minDistance;
}
}
Perhaps most significant is this bit of code:
// looting / 10 chance of dropping a diamond; only drops with Looting
if (this.rand.nextFloat() < (float)looting * 0.1F)
{
this.dropItem(ItemIDs.diamond, 1);
}
Yes, renewable diamonds but you do need Looting to get any (Looting also only works on melee attacks, the fact it works with e.g. arrows is a bug) and they don't spawn that often, and they aren't that valuable anyway (just find or breed a blacksmith and never have to use mined diamonds again, as I do in my first world, TMCW of course has a higher tier but I do still use actual diamonds to make "diamond ender chests", the double chest version of an ender chest, instead of just making them double-sized).
There's a huge difference and I'm a bit surprised you asked that. Just because something goes one way and another thing goes the other in one single aspect doesn't mean they are equally justifiable. The devil is in the details, as the saying goes.
One is a smaller variant that is intended to be a younger version of something, and with some property differences (faster moving speed paired with the smaller size which makes them more difficult to hit, and for a while the immunity of burning in daylight). It fits into the game world. The biggest problem with baby mobs isn't their gameplay design but simply a particular aspect of their visual design; the heads are too small and this is one thing Bedrock gets right.
The other is just "thing, but way bigger" for no sake other than its own. I'd say the fact it never had much if any AI or behavioral development beyond that is a sign of that. It's a very unoriginal "what if" concept and nothing more.
I get the feeling you're approaching this from the standpoint of a coder only. Something was already there, but had non-functional code, so you wanted to fix it. That's your thing, after all. I'm not saying there's anything wrong with that. I'm merely it's simply a poorly designed idea to begin with. The AI or lack of AI isn't the problem with it. So fixing its code or AI doesn't make it a well designed thing. I simply find it to be a very unoriginal and flawed design. Nothing more. Something that is "neat" for concept sake maybe, but not something that is even remotely well designed to be formally implemented.
After a successful Shulker box hunt, I'm in the process of grinding for resources for a friend on my Minecraft 1.19.1 server on Shockbyte, and I hope after this is done and I get the castle I've been wanting to do for ages in survival which a friend volunteered to help me with, sheds some light onto why certain resource farms in the game are so important for builds like ours, we may not be in the majority when it comes to projects like this one, but I think this still matters.
Mojang's obsession with nerfing things has forced our hand into changing worlds, and this time locking the game to block out the updates they would otherwise impose on people, especially bedrock edition, which while there are understandable reasons for it, unfortunately it penalizes players who simply don't have the time nor the desire to adapt to said changes.
I want to clarify to people on this forum, and perhaps show people the work in progress including the numerous chests me and a friend will need to fill up after we've finished grinding items from our resource farms, so we can reach some kind of understanding of each other, as with anything else that means having an opinion on something, not everybody is going to care or agree, I can't change how or what other people think, but what I can do, is show people why this means so much to not only myself but other people I play with on my server.
Even the Fire Resistance potions granting fire immunity, makes building in survival less of an annoyance than it would otherwise be, if players were to take damage from lava as is the case with Armour with fire protection enchantments. If fire immunity were removed, it would mean me and other people would need to clear out large chunks of lava a block at a time while risking death from hostile mobs pushing us in, it may present something interesting for players looking for an unforgiving challenge, but for casual players it's a nuisance and borderlines on unfair if they're not given a choice in the matter as far as the survival vanilla experience goes, players who like building in the Nether in general would face an enormous obstacle outside of their control if they are to contend with the problem without cheats enabled. As of this time, potion nerfs have not yet happened, but if they did happen, while it would not affect players on older versions of the game, it most certainly will on the newer versions of the game. I think some rebalancing decisions should be difficulty level based, or at the very least worlds should have customizations added so players actually get to choose how mechanics in the game affect gameplay to some degree.
I don't see why me and friends I play with or anybody should for that matter, be expected to be treated as if we are on trial for something we didn't do wrong, why are we having to fight Mojang's decisions and coming up with ways to justify our opinions? it makes zero sense. While locking the world version to 1.19.1 for my server did block out the rebalancing decisions for better or worse, it also excludes us from other content of the game, we don't even get Blossom Trees/Wood or Bamboo Rafts, , Pottery, Hanging signs etc and it's all because of a change to other things we, (by "we" I'm referring to my friends) didn't want. We have to take the good with the bad instead of the best of both worlds, so in a way we're still being excluded from what would otherwise be a better game for us all.
Post some pictures of your server/realm/world/whatever? I've always wanted to see what you guys are up to since you're not posting as much anymore.
If you consider changing your mind about 1.20, it's not that bad (and has some decent performance improvements). If you want to avoid the villager trade rebalance, stick to a 1.20 version before that. I'm still on 1.20.1 myself, but not for that reason. You could also consider going to the latest version and crafting netherite stuff and making the trading halls with the trades locked in before updating, but even that would need consideration. It might be a compromise solution though. I recently went for netherite in my hardcore world and it wasn't all that bad. Just do what I did and cheese the bastion remnant, haha. But I admit I'm biased because the cherry trees make it all so worth it, haha. And the new wolves coming in 1.20.5 have me excited. I'll need to go far for those, but... I explore far anyway.
I reached the Radiance Chapter in Astral Sorcery when I upgraded the Celestial Altar to an Iridescent Altar. To support this, I made 2 Celestial Collector Crystals and placed them on the enhanced multiblock structure. This uses a couple different types of marble and 8 buckets of Liquid Starlight to enhance the crystal's power. I have 2 such structures on either side of the altar, about 20 blocks apart. This is important as Collector Crystals will cannibalize starlight from one another if placed closer than 16 blocks. This results in diminishing returns. This can also occur with Spectral Relays as well, though you can place up to 8 within a 16 block area and they will still function properly. There were 8 around the altar, but I removed 2 to allow for a collector crystal. One of these is attuned to Octans, the other to Discidia. I am not sure if a crystal needs to have its attuned constellation be in the sky to function, so I deliberately chose these 2. They have roughly opposite moon phases when they are in the sky, with both being in the sky on the first and last quarter moons.
With both in the sky at midday, the altar is almost full, maybe about 95%. If the attuned constellation needs to be in the sky, this would decrease significantly once that constellation sets.
A few screenshots of my main Astral Sorcery area at Y=150, and my Celestial Crystal/Dynamism Gem farm on the roof of my base, and one of me being attuned to Vicio. This was earlier in my progression in the mod, and the crafting altar and space around it has been upgraded twice since then.
I have also been encountering Forestry butterflies around my base lately. This is from plant several tress from the mod in the area. Now I recall doing this back when playing Direwolf20 1.12.2, and having a lot of butterflies around the base. This time so far all I've seen has been a Postman which I caught using the Scoop, and an Orange Tip, which is currently flying around my base. I'm content to let it do so for now, because it like the other one seems to be staying in the area.
How are baby zombies any different? In fact, they have more in common with normal zombies than giants; same health, same damage, etc, just faster and (before 1.13) not burning in sunlight.
The arguments that I saw against giants usually referenced their buggy AI (as all mobs were prior to 1.2 and some still used until 1.8; they have no ability to pathfind at all, just run straight towards the player; load up 1.6.4 and stack a couple blocks and spawn a zombie pigmen or enderman and aggro it (these mobs will even aggro if hit in Creative), it will be unable to get around it, likewise, they just run into a hole in the ground).
Aside from that, 50 damage is way too much, even the Ender Dragon only deals 10, heck, even a creeper only deals 49 point-blank (43 in newer versions, 36 in TMCW), usually much less. I reduced this to 10, which is still quite high as far as common mobs go (not that I made them common, they have the lowest spawn chance of any mob).
This shows how I refactored their code, updating them to a proper AI system and fixing various other issues, such as buggy collision detection (the game measures the distance between a player and mob based on their feet position; because of this, if you try to hit them in the head you'll be out of range, another issue is that if their feet are in a different chunk section the game won't even find them since it searches for entities by section):
Vanilla; this just makes a very basic mob (most of their behavior is just the default mob behavior):
TMCW (and World1, minus the husk part, so yes, I've encountered them in my first world, which also has naturally spawning cave spiders and witches):
Perhaps most significant is this bit of code:
Yes, renewable diamonds but you do need Looting to get any (Looting also only works on melee attacks, the fact it works with e.g. arrows is a bug) and they don't spawn that often, and they aren't that valuable anyway (just find or breed a blacksmith and never have to use mined diamonds again, as I do in my first world, TMCW of course has a higher tier but I do still use actual diamonds to make "diamond ender chests", the double chest version of an ender chest, instead of just making them double-sized).
TheMasterCaver's First World - possibly the most caved-out world in Minecraft history - includes world download.
TheMasterCaver's World - my own version of Minecraft largely based on my views of how the game should have evolved since 1.6.4.
Why do I still play in 1.6.4?
There's a huge difference and I'm a bit surprised you asked that. Just because something goes one way and another thing goes the other in one single aspect doesn't mean they are equally justifiable. The devil is in the details, as the saying goes.
One is a smaller variant that is intended to be a younger version of something, and with some property differences (faster moving speed paired with the smaller size which makes them more difficult to hit, and for a while the immunity of burning in daylight). It fits into the game world. The biggest problem with baby mobs isn't their gameplay design but simply a particular aspect of their visual design; the heads are too small and this is one thing Bedrock gets right.
The other is just "thing, but way bigger" for no sake other than its own. I'd say the fact it never had much if any AI or behavioral development beyond that is a sign of that. It's a very unoriginal "what if" concept and nothing more.
I get the feeling you're approaching this from the standpoint of a coder only. Something was already there, but had non-functional code, so you wanted to fix it. That's your thing, after all. I'm not saying there's anything wrong with that. I'm merely it's simply a poorly designed idea to begin with. The AI or lack of AI isn't the problem with it. So fixing its code or AI doesn't make it a well designed thing. I simply find it to be a very unoriginal and flawed design. Nothing more. Something that is "neat" for concept sake maybe, but not something that is even remotely well designed to be formally implemented.
After a successful Shulker box hunt, I'm in the process of grinding for resources for a friend on my Minecraft 1.19.1 server on Shockbyte, and I hope after this is done and I get the castle I've been wanting to do for ages in survival which a friend volunteered to help me with, sheds some light onto why certain resource farms in the game are so important for builds like ours, we may not be in the majority when it comes to projects like this one, but I think this still matters.
Mojang's obsession with nerfing things has forced our hand into changing worlds, and this time locking the game to block out the updates they would otherwise impose on people, especially bedrock edition, which while there are understandable reasons for it, unfortunately it penalizes players who simply don't have the time nor the desire to adapt to said changes.
I want to clarify to people on this forum, and perhaps show people the work in progress including the numerous chests me and a friend will need to fill up after we've finished grinding items from our resource farms, so we can reach some kind of understanding of each other, as with anything else that means having an opinion on something, not everybody is going to care or agree, I can't change how or what other people think, but what I can do, is show people why this means so much to not only myself but other people I play with on my server.
Even the Fire Resistance potions granting fire immunity, makes building in survival less of an annoyance than it would otherwise be, if players were to take damage from lava as is the case with Armour with fire protection enchantments. If fire immunity were removed, it would mean me and other people would need to clear out large chunks of lava a block at a time while risking death from hostile mobs pushing us in, it may present something interesting for players looking for an unforgiving challenge, but for casual players it's a nuisance and borderlines on unfair if they're not given a choice in the matter as far as the survival vanilla experience goes, players who like building in the Nether in general would face an enormous obstacle outside of their control if they are to contend with the problem without cheats enabled. As of this time, potion nerfs have not yet happened, but if they did happen, while it would not affect players on older versions of the game, it most certainly will on the newer versions of the game. I think some rebalancing decisions should be difficulty level based, or at the very least worlds should have customizations added so players actually get to choose how mechanics in the game affect gameplay to some degree.
I don't see why me and friends I play with or anybody should for that matter, be expected to be treated as if we are on trial for something we didn't do wrong, why are we having to fight Mojang's decisions and coming up with ways to justify our opinions? it makes zero sense. While locking the world version to 1.19.1 for my server did block out the rebalancing decisions for better or worse, it also excludes us from other content of the game, we don't even get Blossom Trees/Wood or Bamboo Rafts, , Pottery, Hanging signs etc and it's all because of a change to other things we, (by "we" I'm referring to my friends) didn't want. We have to take the good with the bad instead of the best of both worlds, so in a way we're still being excluded from what would otherwise be a better game for us all.
Post some pictures of your server/realm/world/whatever? I've always wanted to see what you guys are up to since you're not posting as much anymore.
If you consider changing your mind about 1.20, it's not that bad (and has some decent performance improvements). If you want to avoid the villager trade rebalance, stick to a 1.20 version before that. I'm still on 1.20.1 myself, but not for that reason. You could also consider going to the latest version and crafting netherite stuff and making the trading halls with the trades locked in before updating, but even that would need consideration. It might be a compromise solution though. I recently went for netherite in my hardcore world and it wasn't all that bad. Just do what I did and cheese the bastion remnant, haha. But I admit I'm biased because the cherry trees make it all so worth it, haha. And the new wolves coming in 1.20.5 have me excited. I'll need to go far for those, but... I explore far anyway.
I reached the Radiance Chapter in Astral Sorcery when I upgraded the Celestial Altar to an Iridescent Altar. To support this, I made 2 Celestial Collector Crystals and placed them on the enhanced multiblock structure. This uses a couple different types of marble and 8 buckets of Liquid Starlight to enhance the crystal's power. I have 2 such structures on either side of the altar, about 20 blocks apart. This is important as Collector Crystals will cannibalize starlight from one another if placed closer than 16 blocks. This results in diminishing returns. This can also occur with Spectral Relays as well, though you can place up to 8 within a 16 block area and they will still function properly. There were 8 around the altar, but I removed 2 to allow for a collector crystal. One of these is attuned to Octans, the other to Discidia. I am not sure if a crystal needs to have its attuned constellation be in the sky to function, so I deliberately chose these 2. They have roughly opposite moon phases when they are in the sky, with both being in the sky on the first and last quarter moons.
With both in the sky at midday, the altar is almost full, maybe about 95%. If the attuned constellation needs to be in the sky, this would decrease significantly once that constellation sets.
A few screenshots of my main Astral Sorcery area at Y=150, and my Celestial Crystal/Dynamism Gem farm on the roof of my base, and one of me being attuned to Vicio. This was earlier in my progression in the mod, and the crafting altar and space around it has been upgraded twice since then.
I have also been encountering Forestry butterflies around my base lately. This is from plant several tress from the mod in the area. Now I recall doing this back when playing Direwolf20 1.12.2, and having a lot of butterflies around the base. This time so far all I've seen has been a Postman which I caught using the Scoop, and an Orange Tip, which is currently flying around my base. I'm content to let it do so for now, because it like the other one seems to be staying in the area.