Skip to content

Commit e93ddfa

Browse files
committed
Pawns will keep working when hungry, but will do slower
1 parent f4d2285 commit e93ddfa

File tree

15 files changed

+132
-75
lines changed

15 files changed

+132
-75
lines changed

src/core/java/net/remmintan/mods/minefortress/core/interfaces/resources/IServerResourceManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
import net.remmintan.mods.minefortress.core.dtos.ItemInfo;
66
import net.remmintan.mods.minefortress.core.interfaces.server.IServerManager;
77
import net.remmintan.mods.minefortress.core.interfaces.server.ISyncableServerManager;
8+
import org.jetbrains.annotations.NotNull;
89

910
import java.util.List;
11+
import java.util.Optional;
1012
import java.util.UUID;
1113

1214
public interface IServerResourceManager extends IResourceManager, IServerManager, ISyncableServerManager {
@@ -23,4 +25,9 @@ public interface IServerResourceManager extends IResourceManager, IServerManager
2325

2426
List<ItemStack> getAllItems();
2527

28+
boolean hasEatableItem();
29+
30+
@NotNull
31+
Optional<ItemStack> getEatableItem();
32+
2633
}

src/main/java/org/minefortress/entity/Colonist.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ protected void initDataTracker() {
9999
this.dataTracker.startTracking(HAS_TASK, false);
100100
}
101101

102+
public float getAdjustedMovementSpeed() {
103+
final var currentFoodLevel = getCurrentFoodLevel();
104+
if (currentFoodLevel < 10)
105+
return Colonist.SLOW_MOVEMENT_SPEED;
106+
else
107+
return Colonist.FAST_MOVEMENT_SPEED;
108+
}
109+
102110
public IBaritone getBaritone() {
103111
return baritone;
104112
}

src/main/java/org/minefortress/entity/ai/MovementHelper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class MovementHelper(private val colonist: Colonist) {
5454
@JvmOverloads
5555
fun goTo(
5656
goal: BlockPos,
57-
speed: Float = Colonist.FAST_MOVEMENT_SPEED,
57+
speed: Float = colonist.adjustedMovementSpeed,
5858
reachDistance: Double = Colonist.WORK_REACH_DISTANCE.toDouble()
5959
) {
6060
if (this.goal != null && this.goal == goal) {

src/main/java/org/minefortress/entity/ai/goal/AbstractFortressGoal.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44
import net.minecraft.server.world.ServerWorld;
55
import net.minecraft.world.World;
66
import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.controls.IEatControl;
7+
import net.remmintan.mods.minefortress.core.interfaces.resources.IServerResourceManager;
8+
import net.remmintan.mods.minefortress.core.interfaces.server.IServerManagersProvider;
9+
import net.remmintan.mods.minefortress.core.utils.ServerModUtils;
710
import org.minefortress.entity.Colonist;
11+
import org.minefortress.events.HungryPawnStartsWorkingCallback;
812

913
import java.util.EnumSet;
1014

@@ -21,8 +25,18 @@ protected AbstractFortressGoal(Colonist colonist) {
2125
}
2226
}
2327

24-
protected boolean isHungry() {
25-
return colonist.getEatControl().map(IEatControl::isHungry).orElse(false);
28+
protected boolean wantAndCanEatSomeFood() {
29+
final var hungry = colonist.getEatControl().map(IEatControl::isHungry).orElse(false);
30+
final var hasSomeFoodToIt = ServerModUtils.getManagersProvider(colonist.getServer(), colonist.getFortressPos())
31+
.map(IServerManagersProvider::getResourceManager)
32+
.map(IServerResourceManager::hasEatableItem)
33+
.orElse(false);
34+
35+
if (hungry && !hasSomeFoodToIt) {
36+
HungryPawnStartsWorkingCallback.EVENT.invoker().hungryPawnStartsWorking(colonist, colonist.getCurrentFoodLevel());
37+
}
38+
39+
return hungry && hasSomeFoodToIt;
2640
}
2741

2842

src/main/java/org/minefortress/entity/ai/goal/ColonistExecuteTaskGoal.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ public ColonistExecuteTaskGoal(Colonist colonist) {
2525
@Override
2626
public boolean canStart() {
2727
final var hasTask = getTaskControl().hasTask();
28-
final var notStarving = !super.isHungry();
29-
return hasTask && notStarving;
28+
return hasTask && !wantAndCanEatSomeFood();
3029
}
3130

3231

@@ -65,7 +64,7 @@ public void tick() {
6564

6665
if (getMovementHelper().getGoal() == null) {
6766
var distance = getTaskControl().taskIsOfType(CutTreesTask.class) ? 6f : Colonist.WORK_REACH_DISTANCE;
68-
getMovementHelper().goTo(goal.getPos(), Colonist.FAST_MOVEMENT_SPEED, distance);
67+
getMovementHelper().goTo(goal.getPos(), colonist.getAdjustedMovementSpeed(), distance);
6968
}
7069

7170
if (getMovementHelper().hasReachedGoal()) {
@@ -86,7 +85,7 @@ public void tick() {
8685

8786
@Override
8887
public boolean shouldContinue() {
89-
return getTaskControl().hasTask() && !super.isHungry();
88+
return getTaskControl().hasTask() && !super.wantAndCanEatSomeFood();
9089
}
9190

9291
@Override
@@ -123,7 +122,7 @@ private void moveToNextBlock() {
123122
if (goal == null) {
124123
return;
125124
}
126-
getMovementHelper().goTo(goal.getPos(), Colonist.FAST_MOVEMENT_SPEED);
125+
getMovementHelper().goTo(goal.getPos());
127126
colonist.setGoal(goal);
128127
}
129128
private ITaskControl getTaskControl() {

src/main/java/org/minefortress/entity/ai/goal/DailyProfessionTasksGoal.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.minefortress.entity.ai.goal;
22

3-
import org.minefortress.entity.Colonist;
43
import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.controls.ITaskControl;
4+
import org.minefortress.entity.Colonist;
55
import org.minefortress.entity.ai.professions.*;
66

77
import java.util.Map;
@@ -28,7 +28,7 @@ public DailyProfessionTasksGoal(Colonist colonist) {
2828

2929
@Override
3030
public boolean canStart() {
31-
if(this.isHungry()) return false;
31+
if (this.wantAndCanEatSomeFood()) return false;
3232
final ITaskControl taskControl = getTaskControl();
3333
if(taskControl.hasTask()) return false;
3434
final String professionId = colonist.getProfessionId();
@@ -60,7 +60,7 @@ public void tick() {
6060

6161
@Override
6262
public boolean shouldContinue() {
63-
return !isHungry()
63+
return !wantAndCanEatSomeFood()
6464
&& this.currentTask != null
6565
&& this.currentTask.shouldContinue(colonist)
6666
&& !getTaskControl().hasTask();
@@ -74,7 +74,7 @@ public void stop() {
7474

7575
@Override
7676
public boolean canStop() {
77-
return this.isHungry();
77+
return this.wantAndCanEatSomeFood();
7878
}
7979

8080
private ITaskControl getTaskControl() {
Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package org.minefortress.entity.ai.goal;
22

3-
import com.mojang.datafixers.util.Pair;
43
import net.minecraft.entity.ai.goal.Goal;
5-
import net.minecraft.entity.effect.StatusEffectCategory;
6-
import net.minecraft.entity.effect.StatusEffectInstance;
7-
import net.minecraft.item.ItemStack;
84
import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.IFortressAwareEntity;
95
import net.remmintan.mods.minefortress.core.interfaces.entities.pawns.controls.IEatControl;
106
import net.remmintan.mods.minefortress.core.interfaces.resources.IServerResourceManager;
@@ -13,7 +9,6 @@
139
import org.jetbrains.annotations.NotNull;
1410
import org.minefortress.entity.HungryEntity;
1511

16-
import java.util.Comparator;
1712
import java.util.Optional;
1813

1914
public class EatGoal extends Goal {
@@ -25,13 +20,13 @@ public EatGoal(HungryEntity entity) {
2520

2621
@Override
2722
public boolean canStart() {
28-
return getEatControl().isHungry() && getEatableItem().isPresent();
23+
return getEatControl().isHungry() && getResourceManager().flatMap(IServerResourceManager::getEatableItem).isPresent();
2924
}
3025

3126
@Override
3227
public void start() {
3328
getResourceManager().ifPresent(it ->
34-
getEatableItem().ifPresent(st -> {
29+
it.getEatableItem().ifPresent(st -> {
3530
it.increaseItemAmount(st.getItem(), -1);
3631
getEatControl().eatFood(st.getItem());
3732
})
@@ -55,40 +50,6 @@ private IEatControl getEatControl() {
5550
return entity.getEatControl().orElseThrow();
5651
}
5752

58-
@NotNull
59-
private Optional<ItemStack> getEatableItem() {
60-
return getResourceManager()
61-
.flatMap(it -> it
62-
.getAllItems()
63-
.stream()
64-
.filter(EatGoal::isEatable)
65-
.max(
66-
Comparator.comparingDouble(stack ->
67-
{
68-
final var foodComponent = stack.getItem().getFoodComponent();
69-
//noinspection DataFlowIssue
70-
return foodComponent.getHunger() * foodComponent.getSaturationModifier() * 2.0f;
71-
}
72-
)
73-
)
74-
);
75-
}
76-
77-
private static boolean isEatable(ItemStack stack) {
78-
if(stack.isEmpty() || !stack.getItem().isFood())
79-
return false;
8053

81-
final var foodComponent = stack.getItem().getFoodComponent();
82-
final var statusEffects = foodComponent.getStatusEffects();
83-
if(statusEffects.isEmpty())
84-
return true;
85-
86-
for (Pair<StatusEffectInstance, Float> statusEffect : statusEffects) {
87-
if(statusEffect.getFirst().getEffectType().getCategory() == StatusEffectCategory.HARMFUL)
88-
return false;
89-
}
90-
91-
return true;
92-
}
9354

9455
}

src/main/java/org/minefortress/entity/ai/goal/PawnExecuteAreaBasedTaskGoal.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class PawnExecuteAreaBasedTaskGoal(colonist: Colonist) : AbstractFortressGoal(co
77

88

99
override fun canStart(): Boolean {
10-
return colonist.areaBasedTaskControl.hasMoreBlocks() && !isHungry
10+
return colonist.areaBasedTaskControl.hasMoreBlocks() && !wantAndCanEatSomeFood()
1111
}
1212

1313
override fun start() {

src/main/java/org/minefortress/entity/ai/professions/FarmerDailyTask.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ public void tick(Colonist colonist) {
5555
if(!this.iterator.hasNext()) return;
5656
this.goal = this.iterator.next();
5757
} while(goalAlreadyInCorrectState(colonist));
58-
movementHelper.goTo(goal.pos().up(), Colonist.FAST_MOVEMENT_SPEED);
58+
movementHelper.goTo(goal.pos().up());
5959
}
6060
if (this.goal != null && movementHelper.getGoal() == null) {
61-
movementHelper.goTo(goal.pos().up(), Colonist.FAST_MOVEMENT_SPEED);
61+
movementHelper.goTo(goal.pos().up());
6262
}
6363

6464
if (movementHelper.hasReachedGoal() && colonist.getPlaceControl().isDone() && colonist.getDigControl().isDone()) {
@@ -102,7 +102,7 @@ private void doFarmCrops(Colonist colonist) {
102102
final var blockItem = seedsOpt.get();
103103
final var bsTaskBlockInfo = new BlockStateTaskBlockInfo(blockItem, aboveBlockPos, blockItem.getBlock().getDefaultState());
104104
colonist.setGoal(bsTaskBlockInfo);
105-
movementHelper.goTo(aboveBlockPos, Colonist.FAST_MOVEMENT_SPEED);
105+
movementHelper.goTo(aboveBlockPos);
106106
} else {
107107
this.goal = null;
108108
}

src/main/java/org/minefortress/entity/ai/professions/FisherDailyTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public void tick(Colonist colonist) {
5555
final var movementHelper = colonist.getMovementHelper();
5656
final var earthPos = goal.getEarthPos();
5757
if (!earthPos.equals(movementHelper.getGoal()))
58-
movementHelper.goTo(earthPos, Colonist.FAST_MOVEMENT_SPEED);
58+
movementHelper.goTo(earthPos);
5959

6060
if (movementHelper.hasReachedGoal()) {
6161
colonist.putItemInHand(Items.FISHING_ROD);

0 commit comments

Comments
 (0)