Reduce butterfly lag. Should help a bit with #50

This commit is contained in:
Sollace 2022-01-26 16:03:01 +01:00
parent 66255ad61d
commit ef91ee0146

View file

@ -4,7 +4,6 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Random; import java.util.Random;
import java.util.function.Predicate;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -37,6 +36,10 @@ import net.minecraft.world.WorldAccess;
public class ButterflyEntity extends AmbientEntity { public class ButterflyEntity extends AmbientEntity {
private static final int MAX_BREEDING_COOLDOWN = 300; private static final int MAX_BREEDING_COOLDOWN = 300;
private static final int MAX_REST_TICKS = 40;
private static final int BREEDING_INTERVAL = 20;
private static final int FLOWER_DETECTION_RANGE = 10;
private static final int FLOWER_UPDATE_INTERVAL = 100;
private static final TrackedData<Boolean> RESTING = DataTracker.registerData(ButterflyEntity.class, TrackedDataHandlerRegistry.BOOLEAN); private static final TrackedData<Boolean> RESTING = DataTracker.registerData(ButterflyEntity.class, TrackedDataHandlerRegistry.BOOLEAN);
private static final TrackedData<Integer> VARIANT = DataTracker.registerData(ButterflyEntity.class, TrackedDataHandlerRegistry.INTEGER); private static final TrackedData<Integer> VARIANT = DataTracker.registerData(ButterflyEntity.class, TrackedDataHandlerRegistry.INTEGER);
@ -172,15 +175,24 @@ public class ButterflyEntity extends AmbientEntity {
visited.entrySet().removeIf(e -> e.getValue() < age - 500); visited.entrySet().removeIf(e -> e.getValue() < age - 500);
if (isResting()) { if (isResting()) {
if (flowerPosition.isPresent() && breed()) { if (!flowerPosition.isPresent()) {
setResting(false);
return; return;
} }
if (world.getBlockState(below).isAir() if (world.getBlockState(below).isAir()
|| !world.getOtherEntities(this, getBoundingBox().expand(7), this::isAggressor).isEmpty() || !world.getOtherEntities(this, getBoundingBox().expand(7), this::isAggressor).isEmpty()
|| (ticksResting++ > 40 || world.random.nextInt(500) == 0) || (ticksResting++ > MAX_REST_TICKS || world.random.nextInt(500) == 0)
|| world.hasRain(below)) { || world.hasRain(below)) {
setResting(false); setResting(false);
return;
}
if (!world.isClient
&& age % BREEDING_INTERVAL == 0
&& world.random.nextInt(200) == 0
&& canBreed()) {
breed();
} }
} else { } else {
ticksResting = 0; ticksResting = 0;
@ -200,28 +212,16 @@ public class ButterflyEntity extends AmbientEntity {
if (random.nextInt(100) == 0 && world.getBlockState(below).isOpaque()) { if (random.nextInt(100) == 0 && world.getBlockState(below).isOpaque()) {
setResting(true); setResting(true);
} }
}
}
if (!world.isClient && age % 20 == 0 && world.random.nextInt(200) == 0) { private boolean canBreed() {
if (!world.getOtherEntities(this, getBoundingBox().expand(20), i -> i.getType() == getType()).isEmpty()) { return age > BREEDING_INTERVAL && breedingCooldown <= 0 && isResting() && world.getOtherEntities(this, getBoundingBox().expand(20), i -> {
breed(); return i instanceof ButterflyEntity && i.getType() == getType() && ((ButterflyEntity)i).isResting();
} }).size() == 1;
}
}
} }
private boolean breed() { private boolean breed() {
int others = 0;
for (Entity i : world.getOtherEntities(this, getBoundingBox().expand(20))) {
if (i.getType() == getType() && others++ > 3) {
setResting(false);
return true;
}
}
if (age < 20 || breedingCooldown > 0) {
return false;
}
breedingCooldown = MAX_BREEDING_COOLDOWN; breedingCooldown = MAX_BREEDING_COOLDOWN;
ButterflyEntity copy = (ButterflyEntity)getType().create(world); ButterflyEntity copy = (ButterflyEntity)getType().create(world);
@ -249,26 +249,21 @@ public class ButterflyEntity extends AmbientEntity {
private Optional<BlockPos> updateFlowerPosition() { private Optional<BlockPos> updateFlowerPosition() {
if (flowerPosition.isPresent()) { if (age > 0 && age % FLOWER_UPDATE_INTERVAL != 0) {
return flowerPosition; return flowerPosition;
} }
if (age % 50 == 0) { flowerPosition = flowerPosition.filter(p -> world.getBlockState(p).isIn(BlockTags.FLOWERS)).or(() -> {
flowerPosition = findFlower(state -> { return BlockPos.streamOutwards(getBlockPos(), FLOWER_DETECTION_RANGE, FLOWER_DETECTION_RANGE, FLOWER_DETECTION_RANGE)
return state.isIn(BlockTags.FLOWERS); .filter(p -> !visited.containsKey(p) && world.getBlockState(p).isIn(BlockTags.FLOWERS))
}); .findFirst()
flowerPosition.ifPresent(p -> { .map(p -> {
visited.put(p, (long)age - 900); visited.put(p, (long)age - 900);
return p;
});
}); });
}
return Optional.empty(); return flowerPosition;
}
private Optional<BlockPos> findFlower(Predicate<BlockState> predicate) {
return BlockPos.streamOutwards(this.getBlockPos(), 10, 10, 10).filter(p -> {
return !visited.containsKey(p) && predicate.test(world.getBlockState(p));
}).findFirst();
} }
private void moveTowards(BlockPos pos) { private void moveTowards(BlockPos pos) {