improve 1.21 compatibility

This commit is contained in:
xGinko 2024-07-02 22:41:35 +02:00
parent 8f6fe7fa07
commit ef8b6c884a
18 changed files with 106 additions and 65 deletions

10
pom.xml
View File

@ -65,6 +65,10 @@
<pattern>org.reflections</pattern> <pattern>org.reflections</pattern>
<shadedPattern>me.xginko.villageroptimizer.libs.reflections</shadedPattern> <shadedPattern>me.xginko.villageroptimizer.libs.reflections</shadedPattern>
</relocation> </relocation>
<relocation>
<pattern>com.cryptomorin.xseries</pattern>
<shadedPattern>me.xginko.villageroptimizer.libs.xseries</shadedPattern>
</relocation>
</relocations> </relocations>
<filters> <filters>
<filter> <filter>
@ -169,5 +173,11 @@
<artifactId>FoliaLib</artifactId> <artifactId>FoliaLib</artifactId>
<version>0.3.4</version> <version>0.3.4</version>
</dependency> </dependency>
<!-- Cross-Version Support -->
<dependency>
<groupId>com.github.cryptomorin</groupId>
<artifactId>XSeries</artifactId>
<version>11.2.0</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -4,6 +4,7 @@ import com.tcoded.folialib.FoliaLib;
import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand; import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand;
import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.config.Config;
import me.xginko.villageroptimizer.config.LanguageCache; import me.xginko.villageroptimizer.config.LanguageCache;
import me.xginko.villageroptimizer.enums.Permissions;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import me.xginko.villageroptimizer.utils.Util; import me.xginko.villageroptimizer.utils.Util;
import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.platform.bukkit.BukkitAudiences;
@ -73,6 +74,7 @@ public final class VillagerOptimizer extends JavaPlugin {
.color(NamedTextColor.GRAY)).append(Component.text("").style(Util.PL_STYLE))); .color(NamedTextColor.GRAY)).append(Component.text("").style(Util.PL_STYLE)));
logger.info(Component.text("│ │").style(Util.PL_STYLE)); logger.info(Component.text("│ │").style(Util.PL_STYLE));
logger.info(Component.text("│ │").style(Util.PL_STYLE)); logger.info(Component.text("│ │").style(Util.PL_STYLE));
Permissions.registerAll();
logger.info(Component.text("") logger.info(Component.text("")
.style(Util.PL_STYLE).append(Component.text(" ➤ Loading Config...").style(Util.PL_STYLE)) .style(Util.PL_STYLE).append(Component.text(" ➤ Loading Config...").style(Util.PL_STYLE))

View File

@ -1,5 +1,6 @@
package me.xginko.villageroptimizer.enums; package me.xginko.villageroptimizer.enums;
import org.bukkit.Bukkit;
import org.bukkit.permissions.Permission; import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault; import org.bukkit.permissions.PermissionDefault;
@ -71,4 +72,24 @@ public final class Permissions {
return permission; return permission;
} }
} }
public static void registerAll() {
for (Bypass perm : Bypass.values()) {
try {
Bukkit.getPluginManager().addPermission(perm.get());
} catch (IllegalArgumentException ignored) {}
}
for (Commands perm : Commands.values()) {
try {
Bukkit.getPluginManager().addPermission(perm.get());
} catch (IllegalArgumentException ignored) {}
}
for (Optimize perm : Optimize.values()) {
try {
Bukkit.getPluginManager().addPermission(perm.get());
} catch (IllegalArgumentException ignored) {}
}
}
} }

View File

@ -1,12 +1,12 @@
package me.xginko.villageroptimizer.modules; package me.xginko.villageroptimizer.modules;
import com.cryptomorin.xseries.XEntityType;
import com.tcoded.folialib.wrapper.task.WrappedTask; import com.tcoded.folialib.wrapper.task.WrappedTask;
import me.xginko.villageroptimizer.utils.LocationUtil; import me.xginko.villageroptimizer.utils.LocationUtil;
import me.xginko.villageroptimizer.utils.Util; import me.xginko.villageroptimizer.utils.Util;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -120,14 +120,14 @@ public class VillagerChunkLimit extends VillagerOptimizerModule implements Runna
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onCreatureSpawn(CreatureSpawnEvent event) { private void onCreatureSpawn(CreatureSpawnEvent event) {
if (event.getEntityType() == EntityType.VILLAGER) { if (event.getEntityType() == XEntityType.VILLAGER.get()) {
manageVillagerCount(event.getEntity().getChunk()); manageVillagerCount(event.getEntity().getChunk());
} }
} }
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
private void onInteract(PlayerInteractEntityEvent event) { private void onInteract(PlayerInteractEntityEvent event) {
if (event.getRightClicked().getType() == EntityType.VILLAGER) { if (event.getRightClicked().getType() == XEntityType.VILLAGER.get()) {
manageVillagerCount(event.getRightClicked().getChunk()); manageVillagerCount(event.getRightClicked().getChunk());
} }
} }
@ -138,7 +138,7 @@ public class VillagerChunkLimit extends VillagerOptimizerModule implements Runna
List<Villager> not_optimized_villagers = new ArrayList<>(); List<Villager> not_optimized_villagers = new ArrayList<>();
for (Entity entity : chunk.getEntities()) { for (Entity entity : chunk.getEntities()) {
if (entity.getType() != EntityType.VILLAGER) continue; if (entity.getType() != XEntityType.VILLAGER.get()) continue;
Villager villager = (Villager) entity; Villager villager = (Villager) entity;

View File

@ -1,10 +1,10 @@
package me.xginko.villageroptimizer.modules.gameplay; package me.xginko.villageroptimizer.modules.gameplay;
import com.cryptomorin.xseries.XEntityType;
import com.cryptomorin.xseries.XMaterial;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import me.xginko.villageroptimizer.utils.LocationUtil; import me.xginko.villageroptimizer.utils.LocationUtil;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -46,10 +46,10 @@ public class EnableLeashingVillagers extends VillagerOptimizerModule implements
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onLeash(PlayerInteractEntityEvent event) { private void onLeash(PlayerInteractEntityEvent event) {
if (!event.getRightClicked().getType().equals(EntityType.VILLAGER)) return; if (event.getRightClicked().getType() != XEntityType.VILLAGER.get()) return;
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final ItemStack handItem = player.getInventory().getItem(event.getHand()); final ItemStack handItem = player.getInventory().getItem(event.getHand());
if (handItem == null || !handItem.getType().equals(Material.LEAD)) return; if (handItem == null || handItem.getType() != XMaterial.LEAD.parseMaterial()) return;
final Villager villager = (Villager) event.getRightClicked(); final Villager villager = (Villager) event.getRightClicked();
if (villager.isLeashed()) return; if (villager.isLeashed()) return;

View File

@ -1,8 +1,8 @@
package me.xginko.villageroptimizer.modules.gameplay; package me.xginko.villageroptimizer.modules.gameplay;
import com.cryptomorin.xseries.XEntityType;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import me.xginko.villageroptimizer.wrapper.WrappedVillager; import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -36,8 +36,8 @@ public class FixOptimisationAfterCure extends VillagerOptimizerModule implements
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onTransform(EntityTransformEvent event) { private void onTransform(EntityTransformEvent event) {
if ( if (
event.getTransformReason().equals(EntityTransformEvent.TransformReason.CURED) event.getTransformReason() == EntityTransformEvent.TransformReason.CURED
&& event.getTransformedEntity().getType().equals(EntityType.VILLAGER) && event.getTransformedEntity().getType() == XEntityType.VILLAGER.get()
) { ) {
Villager villager = (Villager) event.getTransformedEntity(); Villager villager = (Villager) event.getTransformedEntity();
scheduler.runAtEntityLater(villager, () -> { scheduler.runAtEntityLater(villager, () -> {

View File

@ -1,5 +1,6 @@
package me.xginko.villageroptimizer.modules.gameplay; package me.xginko.villageroptimizer.modules.gameplay;
import com.cryptomorin.xseries.XPotion;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.config.Config;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
@ -16,13 +17,15 @@ import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.inventory.InventoryType;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.time.Duration; import java.time.Duration;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class LevelOptimizedProfession extends VillagerOptimizerModule implements Listener { public class LevelOptimizedProfession extends VillagerOptimizerModule implements Listener {
private static final PotionEffect SUPER_SLOWNESS = new PotionEffect(
XPotion.SLOWNESS.getPotionEffectType(), 120, 120, false, false);
private final boolean notify_player; private final boolean notify_player;
private final long cooldown_millis; private final long cooldown_millis;
@ -58,7 +61,7 @@ public class LevelOptimizedProfession extends VillagerOptimizerModule implements
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onTradeScreenClose(InventoryCloseEvent event) { private void onTradeScreenClose(InventoryCloseEvent event) {
if ( if (
event.getInventory().getType().equals(InventoryType.MERCHANT) event.getInventory().getType() == InventoryType.MERCHANT
&& event.getInventory().getHolder() instanceof Villager && event.getInventory().getHolder() instanceof Villager
) { ) {
final Villager villager = (Villager) event.getInventory().getHolder(); final Villager villager = (Villager) event.getInventory().getHolder();
@ -69,7 +72,7 @@ public class LevelOptimizedProfession extends VillagerOptimizerModule implements
if (wVillager.calculateLevel() <= villager.getVillagerLevel()) return; if (wVillager.calculateLevel() <= villager.getVillagerLevel()) return;
scheduler.runAtEntity(villager, enableAI -> { scheduler.runAtEntity(villager, enableAI -> {
villager.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 120, 120, false, false)); villager.addPotionEffect(SUPER_SLOWNESS);
villager.setAware(true); villager.setAware(true);
scheduler.runAtEntityLater(villager, disableAI -> { scheduler.runAtEntityLater(villager, disableAI -> {
villager.setAware(false); villager.setAware(false);

View File

@ -1,7 +1,7 @@
package me.xginko.villageroptimizer.modules.gameplay; package me.xginko.villageroptimizer.modules.gameplay;
import com.cryptomorin.xseries.XEntityType;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -37,7 +37,7 @@ public class MakeVillagersSpawnAdult extends VillagerOptimizerModule implements
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onVillagerSpawn(CreatureSpawnEvent event) { private void onVillagerSpawn(CreatureSpawnEvent event) {
if (event.getEntityType().equals(EntityType.VILLAGER)) { if (event.getEntityType() == XEntityType.VILLAGER.get()) {
final Villager villager = (Villager) event.getEntity(); final Villager villager = (Villager) event.getEntity();
if (!villager.isAdult()) villager.setAdult(); if (!villager.isAdult()) villager.setAdult();
} }

View File

@ -1,8 +1,8 @@
package me.xginko.villageroptimizer.modules.gameplay; package me.xginko.villageroptimizer.modules.gameplay;
import com.cryptomorin.xseries.XEntityType;
import com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent; import com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -64,7 +64,7 @@ public class PreventOptimizedDamage extends VillagerOptimizerModule implements L
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onDamageByEntity(EntityDamageEvent event) { private void onDamageByEntity(EntityDamageEvent event) {
if ( if (
event.getEntityType().equals(EntityType.VILLAGER) event.getEntityType() == XEntityType.VILLAGER.get()
&& damage_causes_to_cancel.contains(event.getCause()) && damage_causes_to_cancel.contains(event.getCause())
&& villagerCache.createIfAbsent((Villager) event.getEntity()).isOptimized() && villagerCache.createIfAbsent((Villager) event.getEntity()).isOptimized()
) { ) {
@ -76,7 +76,7 @@ public class PreventOptimizedDamage extends VillagerOptimizerModule implements L
private void onKnockbackByEntity(EntityKnockbackByEntityEvent event) { private void onKnockbackByEntity(EntityKnockbackByEntityEvent event) {
if ( if (
cancel_knockback cancel_knockback
&& event.getEntityType().equals(EntityType.VILLAGER) && event.getEntityType() == XEntityType.VILLAGER.get()
&& villagerCache.createIfAbsent((Villager) event.getEntity()).isOptimized() && villagerCache.createIfAbsent((Villager) event.getEntity()).isOptimized()
) { ) {
event.setCancelled(true); event.setCancelled(true);

View File

@ -1,9 +1,9 @@
package me.xginko.villageroptimizer.modules.gameplay; package me.xginko.villageroptimizer.modules.gameplay;
import com.cryptomorin.xseries.XEntityType;
import com.destroystokyo.paper.event.entity.EntityPathfindEvent; import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Mob; import org.bukkit.entity.Mob;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -41,7 +41,7 @@ public class PreventOptimizedTargeting extends VillagerOptimizerModule implement
final Entity target = event.getTarget(); final Entity target = event.getTarget();
if ( if (
target != null target != null
&& target.getType().equals(EntityType.VILLAGER) && target.getType() == XEntityType.VILLAGER.get()
&& villagerCache.createIfAbsent((Villager) target).isOptimized() && villagerCache.createIfAbsent((Villager) target).isOptimized()
) { ) {
event.setTarget(null); event.setTarget(null);
@ -54,7 +54,7 @@ public class PreventOptimizedTargeting extends VillagerOptimizerModule implement
final Entity target = event.getTargetEntity(); final Entity target = event.getTargetEntity();
if ( if (
target != null target != null
&& target.getType().equals(EntityType.VILLAGER) && target.getType() == XEntityType.VILLAGER.get()
&& villagerCache.createIfAbsent((Villager) target).isOptimized() && villagerCache.createIfAbsent((Villager) target).isOptimized()
) { ) {
event.setCancelled(true); event.setCancelled(true);
@ -64,7 +64,7 @@ public class PreventOptimizedTargeting extends VillagerOptimizerModule implement
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onEntityAttackVillager(EntityDamageByEntityEvent event) { private void onEntityAttackVillager(EntityDamageByEntityEvent event) {
if ( if (
event.getEntityType().equals(EntityType.VILLAGER) event.getEntityType() == XEntityType.VILLAGER.get()
&& event.getDamager() instanceof Mob && event.getDamager() instanceof Mob
&& villagerCache.createIfAbsent((Villager) event.getEntity()).isOptimized() && villagerCache.createIfAbsent((Villager) event.getEntity()).isOptimized()
) { ) {

View File

@ -45,7 +45,7 @@ public class PreventUnoptimizedTrading extends VillagerOptimizerModule implement
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onTradeOpen(TradeSelectEvent event) { private void onTradeOpen(TradeSelectEvent event) {
if (!event.getInventory().getType().equals(InventoryType.MERCHANT)) return; if (event.getInventory().getType() != InventoryType.MERCHANT) return;
if (event.getWhoClicked().hasPermission(Permissions.Bypass.TRADE_PREVENTION.get())) return; if (event.getWhoClicked().hasPermission(Permissions.Bypass.TRADE_PREVENTION.get())) return;
if (!(event.getInventory().getHolder() instanceof Villager)) return; if (!(event.getInventory().getHolder() instanceof Villager)) return;
if (villagerCache.createIfAbsent((Villager) event.getInventory().getHolder()).isOptimized()) return; if (villagerCache.createIfAbsent((Villager) event.getInventory().getHolder()).isOptimized()) return;
@ -60,7 +60,7 @@ public class PreventUnoptimizedTrading extends VillagerOptimizerModule implement
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onInventoryClick(InventoryClickEvent event) { private void onInventoryClick(InventoryClickEvent event) {
if (!event.getInventory().getType().equals(InventoryType.MERCHANT)) return; if (event.getInventory().getType() != InventoryType.MERCHANT) return;
if (event.getWhoClicked().hasPermission(Permissions.Bypass.TRADE_PREVENTION.get())) return; if (event.getWhoClicked().hasPermission(Permissions.Bypass.TRADE_PREVENTION.get())) return;
if (!(event.getInventory().getHolder() instanceof Villager)) return; if (!(event.getInventory().getHolder() instanceof Villager)) return;
if (villagerCache.createIfAbsent((Villager) event.getInventory().getHolder()).isOptimized()) return; if (villagerCache.createIfAbsent((Villager) event.getInventory().getHolder()).isOptimized()) return;

View File

@ -1,5 +1,6 @@
package me.xginko.villageroptimizer.modules.gameplay; package me.xginko.villageroptimizer.modules.gameplay;
import com.cryptomorin.xseries.XEntityType;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.enums.Permissions; import me.xginko.villageroptimizer.enums.Permissions;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
@ -8,7 +9,6 @@ import me.xginko.villageroptimizer.utils.LocationUtil;
import me.xginko.villageroptimizer.utils.Util; import me.xginko.villageroptimizer.utils.Util;
import me.xginko.villageroptimizer.wrapper.WrappedVillager; import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import net.kyori.adventure.text.TextReplacementConfig; import net.kyori.adventure.text.TextReplacementConfig;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -53,30 +53,29 @@ public class RestockOptimizedTrades extends VillagerOptimizerModule implements L
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onInteract(PlayerInteractEntityEvent event) { private void onInteract(PlayerInteractEntityEvent event) {
if (!event.getRightClicked().getType().equals(EntityType.VILLAGER)) return; if (event.getRightClicked().getType() != XEntityType.VILLAGER.get()) return;
final WrappedVillager wVillager = villagerCache.createIfAbsent((Villager) event.getRightClicked()); final WrappedVillager wVillager = villagerCache.createIfAbsent((Villager) event.getRightClicked());
if (!wVillager.isOptimized()) return; if (!wVillager.isOptimized()) return;
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final boolean player_bypassing = player.hasPermission(Permissions.Bypass.RESTOCK_COOLDOWN.get()); final boolean player_bypassing = player.hasPermission(Permissions.Bypass.RESTOCK_COOLDOWN.get());
if (!wVillager.canRestock(restock_delay_millis) && !player_bypassing) return;
if (wVillager.canRestock(restock_delay_millis) || player_bypassing) { wVillager.restock();
wVillager.restock(); wVillager.saveRestockTime();
wVillager.saveRestockTime();
if (notify_player && !player_bypassing) { if (notify_player && !player_bypassing) {
final TextReplacementConfig timeLeft = TextReplacementConfig.builder() final TextReplacementConfig timeLeft = TextReplacementConfig.builder()
.matchLiteral("%time%") .matchLiteral("%time%")
.replacement(Util.formatDuration(Duration.ofMillis(wVillager.getRestockCooldownMillis(restock_delay_millis)))) .replacement(Util.formatDuration(Duration.ofMillis(wVillager.getRestockCooldownMillis(restock_delay_millis))))
.build(); .build();
VillagerOptimizer.getLang(player.locale()).trades_restocked VillagerOptimizer.getLang(player.locale()).trades_restocked
.forEach(line -> KyoriUtil.sendMessage(player, line.replaceText(timeLeft))); .forEach(line -> KyoriUtil.sendMessage(player, line.replaceText(timeLeft)));
} }
if (log_enabled) { if (log_enabled) {
info("Restocked optimized villager at " + LocationUtil.toString(wVillager.villager().getLocation())); info("Restocked optimized villager at " + LocationUtil.toString(wVillager.villager().getLocation()));
}
} }
} }
} }

View File

@ -34,7 +34,7 @@ public class UnoptimizeOnJobLoose extends VillagerOptimizerModule implements Lis
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onJobReset(VillagerCareerChangeEvent event) { private void onJobReset(VillagerCareerChangeEvent event) {
if (!event.getReason().equals(VillagerCareerChangeEvent.ChangeReason.LOSING_JOB)) return; if (event.getReason() != VillagerCareerChangeEvent.ChangeReason.LOSING_JOB) return;
final WrappedVillager wrappedVillager = villagerCache.createIfAbsent(event.getEntity()); final WrappedVillager wrappedVillager = villagerCache.createIfAbsent(event.getEntity());
if (wrappedVillager.isOptimized()) { if (wrappedVillager.isOptimized()) {
wrappedVillager.setOptimizationType(OptimizationType.NONE); wrappedVillager.setOptimizationType(OptimizationType.NONE);

View File

@ -1,5 +1,6 @@
package me.xginko.villageroptimizer.modules.optimization; package me.xginko.villageroptimizer.modules.optimization;
import com.cryptomorin.xseries.XMaterial;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.enums.OptimizationType; import me.xginko.villageroptimizer.enums.OptimizationType;
import me.xginko.villageroptimizer.enums.Permissions; import me.xginko.villageroptimizer.enums.Permissions;
@ -24,12 +25,13 @@ import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import java.time.Duration; import java.time.Duration;
import java.util.Arrays;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
public class OptimizeByBlock extends VillagerOptimizerModule implements Listener { public class OptimizeByBlock extends VillagerOptimizerModule implements Listener {
@ -43,9 +45,12 @@ public class OptimizeByBlock extends VillagerOptimizerModule implements Listener
config.master().addComment(configPath + ".enable", config.master().addComment(configPath + ".enable",
"When enabled, the closest villager standing near a configured block being placed will be optimized.\n" + "When enabled, the closest villager standing near a configured block being placed will be optimized.\n" +
"If a configured block is broken nearby, the closest villager will become unoptimized again."); "If a configured block is broken nearby, the closest villager will become unoptimized again.");
this.blocks_that_disable = config.getList(configPath + ".materials", Arrays.asList( List<String> defaults = Stream.of(XMaterial.LAPIS_BLOCK, XMaterial.GLOWSTONE, XMaterial.IRON_BLOCK)
"LAPIS_BLOCK", "GLOWSTONE", "IRON_BLOCK" .filter(XMaterial::isSupported)
), "Values here need to be valid bukkit Material enums for your server version.") .map(Enum::name)
.collect(Collectors.toList());
this.blocks_that_disable = config.getList(configPath + ".materials", defaults,
"Values here need to be valid bukkit Material enums for your server version.")
.stream() .stream()
.map(configuredMaterial -> { .map(configuredMaterial -> {
try { try {

View File

@ -1,5 +1,7 @@
package me.xginko.villageroptimizer.modules.optimization; package me.xginko.villageroptimizer.modules.optimization;
import com.cryptomorin.xseries.XEntityType;
import com.cryptomorin.xseries.XMaterial;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.enums.OptimizationType; import me.xginko.villageroptimizer.enums.OptimizationType;
import me.xginko.villageroptimizer.enums.Permissions; import me.xginko.villageroptimizer.enums.Permissions;
@ -12,8 +14,6 @@ import me.xginko.villageroptimizer.utils.Util;
import me.xginko.villageroptimizer.wrapper.WrappedVillager; import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import net.kyori.adventure.text.TextReplacementConfig; import net.kyori.adventure.text.TextReplacementConfig;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -74,12 +74,12 @@ public class OptimizeByNametag extends VillagerOptimizerModule implements Listen
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onPlayerInteractEntity(PlayerInteractEntityEvent event) { private void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
if (!event.getRightClicked().getType().equals(EntityType.VILLAGER)) return; if (event.getRightClicked().getType() != XEntityType.VILLAGER.get()) return;
final Player player = event.getPlayer(); final Player player = event.getPlayer();
if (!player.hasPermission(Permissions.Optimize.NAMETAG.get())) return; if (!player.hasPermission(Permissions.Optimize.NAMETAG.get())) return;
final ItemStack usedItem = player.getInventory().getItem(event.getHand()); final ItemStack usedItem = player.getInventory().getItem(event.getHand());
if (usedItem != null && !usedItem.getType().equals(Material.NAME_TAG)) return; if (usedItem != null && usedItem.getType() != XMaterial.NAME_TAG.parseMaterial()) return;
if (!usedItem.hasItemMeta()) return; if (!usedItem.hasItemMeta()) return;
final ItemMeta meta = usedItem.getItemMeta(); final ItemMeta meta = usedItem.getItemMeta();
if (!meta.hasDisplayName()) return; if (!meta.hasDisplayName()) return;

View File

@ -1,5 +1,6 @@
package me.xginko.villageroptimizer.utils; package me.xginko.villageroptimizer.utils;
import com.cryptomorin.xseries.XMaterial;
import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.format.TextDecoration;
@ -25,19 +26,19 @@ public class Util {
PL_COLOR = TextColor.color(102,255,230); PL_COLOR = TextColor.color(102,255,230);
PL_STYLE = Style.style(PL_COLOR, TextDecoration.BOLD); PL_STYLE = Style.style(PL_COLOR, TextDecoration.BOLD);
PROFESSION_MAP = new EnumMap<>(Material.class); PROFESSION_MAP = new EnumMap<>(Material.class);
PROFESSION_MAP.put(Material.LOOM, Villager.Profession.SHEPHERD); PROFESSION_MAP.put(XMaterial.LOOM.parseMaterial(), Villager.Profession.SHEPHERD);
PROFESSION_MAP.put(Material.BARREL, Villager.Profession.FISHERMAN); PROFESSION_MAP.put(XMaterial.BARREL.parseMaterial(), Villager.Profession.FISHERMAN);
PROFESSION_MAP.put(Material.SMOKER, Villager.Profession.BUTCHER); PROFESSION_MAP.put(XMaterial.SMOKER.parseMaterial(), Villager.Profession.BUTCHER);
PROFESSION_MAP.put(Material.LECTERN, Villager.Profession.LIBRARIAN); PROFESSION_MAP.put(XMaterial.LECTERN.parseMaterial(), Villager.Profession.LIBRARIAN);
PROFESSION_MAP.put(Material.CAULDRON, Villager.Profession.LEATHERWORKER); PROFESSION_MAP.put(XMaterial.CAULDRON.parseMaterial(), Villager.Profession.LEATHERWORKER);
PROFESSION_MAP.put(Material.COMPOSTER, Villager.Profession.FARMER); PROFESSION_MAP.put(XMaterial.COMPOSTER.parseMaterial(), Villager.Profession.FARMER);
PROFESSION_MAP.put(Material.GRINDSTONE, Villager.Profession.WEAPONSMITH); PROFESSION_MAP.put(XMaterial.GRINDSTONE.parseMaterial(), Villager.Profession.WEAPONSMITH);
PROFESSION_MAP.put(Material.STONECUTTER, Villager.Profession.MASON); PROFESSION_MAP.put(XMaterial.STONECUTTER.parseMaterial(), Villager.Profession.MASON);
PROFESSION_MAP.put(Material.BREWING_STAND, Villager.Profession.CLERIC); PROFESSION_MAP.put(XMaterial.BREWING_STAND.parseMaterial(), Villager.Profession.CLERIC);
PROFESSION_MAP.put(Material.BLAST_FURNACE, Villager.Profession.ARMORER); PROFESSION_MAP.put(XMaterial.BLAST_FURNACE.parseMaterial(), Villager.Profession.ARMORER);
PROFESSION_MAP.put(Material.SMITHING_TABLE, Villager.Profession.TOOLSMITH); PROFESSION_MAP.put(XMaterial.SMITHING_TABLE.parseMaterial(), Villager.Profession.TOOLSMITH);
PROFESSION_MAP.put(Material.FLETCHING_TABLE, Villager.Profession.FLETCHER); PROFESSION_MAP.put(XMaterial.FLETCHING_TABLE.parseMaterial(), Villager.Profession.FLETCHER);
PROFESSION_MAP.put(Material.CARTOGRAPHY_TABLE, Villager.Profession.CARTOGRAPHER); PROFESSION_MAP.put(XMaterial.CARTOGRAPHY_TABLE.parseMaterial(), Villager.Profession.CARTOGRAPHER);
try { try {
Chunk.class.getMethod("isEntitiesLoaded"); Chunk.class.getMethod("isEntitiesLoaded");
canUseIsEntitiesLoaded = true; canUseIsEntitiesLoaded = true;

View File

@ -73,7 +73,7 @@ public class AVLVillagerDataHandlerImpl implements VillagerDataHandler {
// End repeating task once logic is finished // End repeating task once logic is finished
setOptimization.cancel(); setOptimization.cancel();
}, 0L, 1L, TimeUnit.SECONDS); }, 1L, 1L, TimeUnit.SECONDS);
} }
@Override @Override

View File

@ -53,7 +53,7 @@ public class MainVillagerDataHandlerImpl implements VillagerDataHandler {
// End repeating task once logic is finished // End repeating task once logic is finished
setOptimization.cancel(); setOptimization.cancel();
}, 0L, 1L, TimeUnit.SECONDS); }, 1L, 1L, TimeUnit.SECONDS);
} }
@Override @Override