schedule check for folia 1.20.4+

This commit is contained in:
xGinko 2024-07-08 15:21:10 +02:00
parent 2fec1bcbd4
commit 65322c6caa

View File

@ -133,58 +133,60 @@ public class VillagerChunkLimit extends VillagerOptimizerModule implements Runna
} }
private void manageVillagerCount(@NotNull Chunk chunk) { private void manageVillagerCount(@NotNull Chunk chunk) {
// Collect all optimized and unoptimized villagers in that chunk scheduling.regionSpecificScheduler(chunk.getWorld(), chunk.getX(), chunk.getZ()).run(() -> {
List<Villager> optimized_villagers = new ArrayList<>(); // Collect all optimized and unoptimized villagers in that chunk
List<Villager> not_optimized_villagers = new ArrayList<>(); List<Villager> optimized_villagers = new ArrayList<>();
List<Villager> not_optimized_villagers = new ArrayList<>();
for (Entity entity : chunk.getEntities()) { for (Entity entity : chunk.getEntities()) {
if (entity.getType() != XEntityType.VILLAGER.get()) continue; if (entity.getType() != XEntityType.VILLAGER.get()) continue;
Villager villager = (Villager) entity; Villager villager = (Villager) entity;
if (villagerCache.createIfAbsent(villager).isOptimized()) { if (villagerCache.createIfAbsent(villager).isOptimized()) {
optimized_villagers.add(villager); optimized_villagers.add(villager);
} else { } else {
not_optimized_villagers.add(villager); not_optimized_villagers.add(villager);
}
} }
}
// Check if there are more unoptimized villagers in that chunk than allowed // Check if there are more unoptimized villagers in that chunk than allowed
final int not_optimized_villagers_too_many = not_optimized_villagers.size() - non_optimized_max_per_chunk; final int not_optimized_villagers_too_many = not_optimized_villagers.size() - non_optimized_max_per_chunk;
if (not_optimized_villagers_too_many > 0) { if (not_optimized_villagers_too_many > 0) {
// Sort villagers by profession priority // Sort villagers by profession priority
not_optimized_villagers.sort(Comparator.comparingInt(villager -> { not_optimized_villagers.sort(Comparator.comparingInt(villager -> {
final Villager.Profession profession = villager.getProfession(); final Villager.Profession profession = villager.getProfession();
return non_optimized_removal_priority.contains(profession) ? non_optimized_removal_priority.indexOf(profession) : Integer.MAX_VALUE; return non_optimized_removal_priority.contains(profession) ? non_optimized_removal_priority.indexOf(profession) : Integer.MAX_VALUE;
})); }));
// Remove prioritized villagers that are too many // Remove prioritized villagers that are too many
for (int i = 0; i < not_optimized_villagers_too_many; i++) { for (int i = 0; i < not_optimized_villagers_too_many; i++) {
Villager villager = not_optimized_villagers.get(i); Villager villager = not_optimized_villagers.get(i);
scheduling.entitySpecificScheduler(villager).run(kill -> { scheduling.entitySpecificScheduler(villager).run(kill -> {
villager.remove(); villager.remove();
if (log_enabled) info("Removed unoptimized villager with profession '" + if (log_enabled) info("Removed unoptimized villager with profession '" +
Util.formatEnum(villager.getProfession()) + "' at " + LocationUtil.toString(villager.getLocation())); Util.formatEnum(villager.getProfession()) + "' at " + LocationUtil.toString(villager.getLocation()));
}, null); }, null);
}
} }
}
// Check if there are more optimized villagers in that chunk than allowed // Check if there are more optimized villagers in that chunk than allowed
final int optimized_villagers_too_many = optimized_villagers.size() - optimized_max_per_chunk; final int optimized_villagers_too_many = optimized_villagers.size() - optimized_max_per_chunk;
if (optimized_villagers_too_many > 0) { if (optimized_villagers_too_many > 0) {
// Sort villagers by profession priority // Sort villagers by profession priority
optimized_villagers.sort(Comparator.comparingInt(villager -> { optimized_villagers.sort(Comparator.comparingInt(villager -> {
final Villager.Profession profession = villager.getProfession(); final Villager.Profession profession = villager.getProfession();
return optimized_removal_priority.contains(profession) ? optimized_removal_priority.indexOf(profession) : Integer.MAX_VALUE; return optimized_removal_priority.contains(profession) ? optimized_removal_priority.indexOf(profession) : Integer.MAX_VALUE;
})); }));
// Remove prioritized villagers that are too many // Remove prioritized villagers that are too many
for (int i = 0; i < optimized_villagers_too_many; i++) { for (int i = 0; i < optimized_villagers_too_many; i++) {
Villager villager = optimized_villagers.get(i); Villager villager = optimized_villagers.get(i);
scheduling.entitySpecificScheduler(villager).run(kill -> { scheduling.entitySpecificScheduler(villager).run(kill -> {
villager.remove(); villager.remove();
if (log_enabled) info("Removed unoptimized villager with profession '" + if (log_enabled) info("Removed unoptimized villager with profession '" +
Util.formatEnum(villager.getProfession()) + "' at " + LocationUtil.toString(villager.getLocation())); Util.formatEnum(villager.getProfession()) + "' at " + LocationUtil.toString(villager.getLocation()));
}, null); }, null);
}
} }
} });
} }
} }