mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-24 05:47:59 +01:00
Reduce butterfly lag. Should help a bit with #50
This commit is contained in:
parent
66255ad61d
commit
ef91ee0146
1 changed files with 30 additions and 35 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue