Iron golem calm anger options

This commit is contained in:
William Blake Galbreath
2025-01-11 18:52:28 -08:00
committed by granny
parent b40d56f9be
commit 68b70c0446
4 changed files with 113 additions and 145 deletions

View File

@@ -0,0 +1,18 @@
--- a/net/minecraft/world/entity/animal/IronGolem.java
+++ b/net/minecraft/world/entity/animal/IronGolem.java
@@ -63,6 +_,7 @@
@Override
protected void registerGoals() {
+ if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options
this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true));
this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9, 32.0F));
this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6, false));
@@ -266,6 +_,7 @@
float f = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F;
this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, f);
itemInHand.consume(1, player);
+ if (this.level().purpurConfig.ironGolemHealCalm && isAngry() && getHealth() == getMaxHealth()) stopBeingAngry(); // Purpur - Iron golem calm anger options
return InteractionResult.SUCCESS;
}
}

View File

@@ -1434,6 +1434,8 @@ public class PurpurWorldConfig {
public double ironGolemMaxHealth = 100.0D;
public double ironGolemScale = 1.0D;
public boolean ironGolemTakeDamageFromWater = false;
public boolean ironGolemPoppyCalm = false;
public boolean ironGolemHealCalm = false;
private void ironGolemSettings() {
ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable);
ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater);
@@ -1447,6 +1449,8 @@ public class PurpurWorldConfig {
ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth);
ironGolemScale = Mth.clamp(getDouble("mobs.iron_golem.attributes.scale", ironGolemScale), 0.0625D, 16.0D);
ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater);
ironGolemPoppyCalm = getBoolean("mobs.iron_golem.poppy-calms-anger", ironGolemPoppyCalm);
ironGolemHealCalm = getBoolean("mobs.iron_golem.healing-calms-anger", ironGolemHealCalm);
}
public boolean llamaRidable = false;

View File

@@ -0,0 +1,91 @@
package org.purpurmc.purpur.entity.ai;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.ai.goal.Goal;
import net.minecraft.world.entity.animal.IronGolem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Blocks;
import java.util.EnumSet;
import java.util.UUID;
public class ReceiveFlower extends Goal {
private final IronGolem irongolem;
private ServerPlayer target;
private int cooldown;
public ReceiveFlower(IronGolem entity) {
this.irongolem = entity;
setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK));
}
@Override
public boolean canUse() {
if (this.irongolem.getOfferFlowerTick() > 0) {
return false;
}
if (!this.irongolem.isAngry()) {
return false;
}
UUID uuid = this.irongolem.getPersistentAngerTarget();
if (uuid == null) {
return false;
}
Entity target = ((ServerLevel) this.irongolem.level()).getEntity(uuid);
if (!(target instanceof ServerPlayer player)) {
return false;
}
InteractionHand hand = getPoppyHand(player);
if (hand == null) {
return false;
}
removeFlower(player, hand);
this.target = player;
return true;
}
@Override
public boolean canContinueToUse() {
return this.cooldown > 0;
}
@Override
public void start() {
this.cooldown = 100;
this.irongolem.stopBeingAngry();
this.irongolem.offerFlower(true);
}
@Override
public void stop() {
this.irongolem.offerFlower(false);
this.target = null;
}
@Override
public void tick() {
this.irongolem.getLookControl().setLookAt(this.target, 30.0F, 30.0F);
--this.cooldown;
}
private InteractionHand getPoppyHand(ServerPlayer player) {
if (isPoppy(player.getMainHandItem())) {
return InteractionHand.MAIN_HAND;
}
if (isPoppy(player.getOffhandItem())) {
return InteractionHand.OFF_HAND;
}
return null;
}
private void removeFlower(ServerPlayer player, InteractionHand hand) {
player.setItemInHand(hand, ItemStack.EMPTY);
}
private boolean isPoppy(ItemStack item) {
return item.getItem() == Blocks.POPPY.asItem();
}
}