more structure improvements

This commit is contained in:
xGinko 2023-09-05 16:28:05 +02:00
parent 4306f8ab4e
commit a1b1a3991a
5 changed files with 29 additions and 31 deletions

View File

@ -3,6 +3,7 @@ package me.xginko.villageroptimizer;
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.OptimizationType; import me.xginko.villageroptimizer.enums.OptimizationType;
import me.xginko.villageroptimizer.models.VillagerCache;
import me.xginko.villageroptimizer.models.WrappedVillager; import me.xginko.villageroptimizer.models.WrappedVillager;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -15,6 +16,7 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.entity.memory.MemoryKey; import org.bukkit.entity.memory.MemoryKey;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -38,23 +40,15 @@ public final class VillagerOptimizer extends JavaPlugin {
public void onEnable() { public void onEnable() {
instance = this; instance = this;
logger = getLogger(); logger = getLogger();
villagerCache = new VillagerCache(); villagerCache = new VillagerCache(30);
logger.info("Loading Translations"); logger.info("Loading Translations");
reloadLang(); reloadLang();
logger.info("Loading Config"); logger.info("Loading Config");
reloadConfiguration(); reloadConfiguration();
logger.info("Done."); logger.info("Done.");
} }
@Override public static OptimizationType computeOptimization(@NotNull WrappedVillager wrapped) {
public void onDisable() {
// Plugin shutdown logic
}
public static OptimizationType computeOptimization(WrappedVillager wrapped) {
if (config.enable_nametag_optimization) { if (config.enable_nametag_optimization) {
Component name = wrapped.villager().customName(); Component name = wrapped.villager().customName();
if (name != null && config.nametags.contains(PlainTextComponentSerializer.plainText().serialize(name).toLowerCase())) { if (name != null && config.nametags.contains(PlainTextComponentSerializer.plainText().serialize(name).toLowerCase())) {
@ -79,7 +73,7 @@ public final class VillagerOptimizer extends JavaPlugin {
return wrapped.getOptimizationType(); return wrapped.getOptimizationType();
} }
public static OptimizationType computeOptimization(Villager villager) { public static OptimizationType computeOptimization(@NotNull Villager villager) {
if (config.enable_nametag_optimization) { if (config.enable_nametag_optimization) {
Component name = villager.customName(); Component name = villager.customName();
if (name != null && config.nametags.contains(PlainTextComponentSerializer.plainText().serialize(name).toLowerCase())) { if (name != null && config.nametags.contains(PlainTextComponentSerializer.plainText().serialize(name).toLowerCase())) {
@ -105,7 +99,7 @@ public final class VillagerOptimizer extends JavaPlugin {
} }
public void reloadPlugin() { public void reloadPlugin() {
villagerCache = new VillagerCache(); villagerCache = new VillagerCache(30);
reloadLang(); reloadLang();
reloadConfiguration(); reloadConfiguration();
} }

View File

@ -3,16 +3,16 @@ package me.xginko.villageroptimizer.enums;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
public enum NamespacedKeys { public enum Keys {
OPTIMIZED(VillagerOptimizer.getKey("optimized")), OPTIMIZED(VillagerOptimizer.getKey("optimized")),
COOLDOWN_RESTOCK(VillagerOptimizer.getKey("restock-cooldown")), COOLDOWN_RESTOCK(VillagerOptimizer.getKey("restock-cooldown")),
COOLDOWN_EXPERIENCE(VillagerOptimizer.getKey("experience-cooldown")), COOLDOWN_EXPERIENCE(VillagerOptimizer.getKey("experience-cooldown")),
GAME_TIME(VillagerOptimizer.getKey("game-time")); WORLDTIME(VillagerOptimizer.getKey("world-time"));
private final NamespacedKey key; private final NamespacedKey key;
NamespacedKeys(NamespacedKey key) { Keys(NamespacedKey key) {
this.key = key; this.key = key;
} }

View File

@ -1,8 +1,7 @@
package me.xginko.villageroptimizer; package me.xginko.villageroptimizer.models;
import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.Caffeine;
import me.xginko.villageroptimizer.models.WrappedVillager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -16,8 +15,8 @@ public class VillagerCache {
private final Cache<UUID, WrappedVillager> villagerCache; private final Cache<UUID, WrappedVillager> villagerCache;
protected VillagerCache() { public VillagerCache(long expireAfterWriteSeconds) {
this.villagerCache = Caffeine.newBuilder().expireAfterWrite(Duration.ofSeconds(30)).build(); this.villagerCache = Caffeine.newBuilder().expireAfterWrite(Duration.ofSeconds(expireAfterWriteSeconds)).build();
} }
public @NotNull Collection<WrappedVillager> getAll() { public @NotNull Collection<WrappedVillager> getAll() {
@ -43,6 +42,10 @@ public class VillagerCache {
return add(new WrappedVillager(villager)); return add(new WrappedVillager(villager));
} }
public boolean contains(@NotNull UUID uuid) {
return villagerCache.getIfPresent(uuid) != null;
}
public boolean contains(@NotNull WrappedVillager villager) { public boolean contains(@NotNull WrappedVillager villager) {
return villagerCache.getIfPresent(villager.villager().getUniqueId()) != null; return villagerCache.getIfPresent(villager.villager().getUniqueId()) != null;
} }

View File

@ -1,7 +1,7 @@
package me.xginko.villageroptimizer.models; package me.xginko.villageroptimizer.models;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.enums.NamespacedKeys; import me.xginko.villageroptimizer.enums.Keys;
import me.xginko.villageroptimizer.enums.OptimizationType; import me.xginko.villageroptimizer.enums.OptimizationType;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
@ -14,28 +14,28 @@ public record WrappedVillager(Villager villager) {
} }
public boolean isOptimized() { public boolean isOptimized() {
return villager.getPersistentDataContainer().has(NamespacedKeys.OPTIMIZED.key()); return villager.getPersistentDataContainer().has(Keys.OPTIMIZED.key());
} }
public void setOptimization(OptimizationType type) { public void setOptimization(OptimizationType type) {
if (type.equals(OptimizationType.OFF) && isOptimized()) { if (type.equals(OptimizationType.OFF) && isOptimized()) {
villager.getPersistentDataContainer().remove(NamespacedKeys.OPTIMIZED.key()); villager.getPersistentDataContainer().remove(Keys.OPTIMIZED.key());
} else { } else {
villager.getPersistentDataContainer().set(NamespacedKeys.OPTIMIZED.key(), PersistentDataType.STRING, type.name()); villager.getPersistentDataContainer().set(Keys.OPTIMIZED.key(), PersistentDataType.STRING, type.name());
} }
} }
public OptimizationType getOptimizationType() { public OptimizationType getOptimizationType() {
return isOptimized() ? OptimizationType.valueOf(villager().getPersistentDataContainer().get(NamespacedKeys.OPTIMIZED.key(), PersistentDataType.STRING)) : OptimizationType.OFF; return isOptimized() ? OptimizationType.valueOf(villager().getPersistentDataContainer().get(Keys.OPTIMIZED.key(), PersistentDataType.STRING)) : OptimizationType.OFF;
} }
public void setRestockCooldown(long milliseconds) { public void setRestockCooldown(long milliseconds) {
villager.getPersistentDataContainer().set(NamespacedKeys.COOLDOWN_RESTOCK.key(), PersistentDataType.LONG, System.currentTimeMillis() + milliseconds); villager.getPersistentDataContainer().set(Keys.COOLDOWN_RESTOCK.key(), PersistentDataType.LONG, System.currentTimeMillis() + milliseconds);
} }
public boolean shouldRestock() { public boolean shouldRestock() {
PersistentDataContainer villagerData = villager.getPersistentDataContainer(); PersistentDataContainer villagerData = villager.getPersistentDataContainer();
return villagerData.has(NamespacedKeys.COOLDOWN_RESTOCK.key(), PersistentDataType.LONG) && villagerData.get(NamespacedKeys.COOLDOWN_RESTOCK.key(), PersistentDataType.LONG) <= System.currentTimeMillis(); return villagerData.has(Keys.COOLDOWN_RESTOCK.key(), PersistentDataType.LONG) && villagerData.get(Keys.COOLDOWN_RESTOCK.key(), PersistentDataType.LONG) <= System.currentTimeMillis();
} }
public void restock() { public void restock() {
@ -43,20 +43,20 @@ public record WrappedVillager(Villager villager) {
} }
public void setExpCooldown(long milliseconds) { public void setExpCooldown(long milliseconds) {
villager.getPersistentDataContainer().set(NamespacedKeys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG, System.currentTimeMillis() + milliseconds); villager.getPersistentDataContainer().set(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG, System.currentTimeMillis() + milliseconds);
} }
public boolean isOnExpCooldown() { public boolean isOnExpCooldown() {
PersistentDataContainer villagerData = villager.getPersistentDataContainer(); PersistentDataContainer villagerData = villager.getPersistentDataContainer();
return villagerData.has(NamespacedKeys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG) && villagerData.get(NamespacedKeys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG) <= System.currentTimeMillis(); return villagerData.has(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG) && villagerData.get(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG) <= System.currentTimeMillis();
} }
public void saveWorldTime() { public void saveWorldTime() {
villager.getPersistentDataContainer().set(NamespacedKeys.GAME_TIME.key(), PersistentDataType.LONG, villager.getWorld().getFullTime()); villager.getPersistentDataContainer().set(Keys.WORLDTIME.key(), PersistentDataType.LONG, villager.getWorld().getFullTime());
} }
public long getSavedWorldTime() { public long getSavedWorldTime() {
PersistentDataContainer villagerData = villager.getPersistentDataContainer(); PersistentDataContainer villagerData = villager.getPersistentDataContainer();
return villagerData.has(NamespacedKeys.GAME_TIME.key(), PersistentDataType.LONG) ? villagerData.get(NamespacedKeys.GAME_TIME.key(), PersistentDataType.LONG) : villager.getWorld().getFullTime(); return villagerData.has(Keys.WORLDTIME.key(), PersistentDataType.LONG) ? villagerData.get(Keys.WORLDTIME.key(), PersistentDataType.LONG) : villager.getWorld().getFullTime();
} }
} }

View File

@ -3,6 +3,7 @@ package me.xginko.villageroptimizer.modules;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask; import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
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.models.WrappedVillager;
import me.xginko.villageroptimizer.utils.LogUtils; import me.xginko.villageroptimizer.utils.LogUtils;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World; import org.bukkit.World;
@ -114,6 +115,6 @@ public class ChunkLimit implements VillagerOptimizerModule, Listener {
private int getProfessionPriority(Villager villager) { private int getProfessionPriority(Villager villager) {
Villager.Profession profession = villager.getProfession(); Villager.Profession profession = villager.getProfession();
return removalPriority.contains(profession) ? removalPriority.indexOf(profession) : Integer.MAX_VALUE; return removalPriority.contains(profession) && !WrappedVillager.fromVillager(villager).isOptimized() ? removalPriority.indexOf(profession) : Integer.MAX_VALUE;
} }
} }