finalize workstation optimization
This commit is contained in:
parent
bd884e307e
commit
fe943f6666
@ -4,7 +4,7 @@ import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
|
|||||||
import me.xginko.villageroptimizer.VillagerOptimizer;
|
import me.xginko.villageroptimizer.VillagerOptimizer;
|
||||||
import me.xginko.villageroptimizer.VillagerCache;
|
import me.xginko.villageroptimizer.VillagerCache;
|
||||||
import me.xginko.villageroptimizer.config.Config;
|
import me.xginko.villageroptimizer.config.Config;
|
||||||
import me.xginko.villageroptimizer.utils.LogUtils;
|
import me.xginko.villageroptimizer.utils.LogUtil;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
@ -66,7 +66,7 @@ public class VillagerChunkLimit implements VillagerOptimizerModule, Listener {
|
|||||||
Villager.Profession profession = Villager.Profession.valueOf(configuredProfession);
|
Villager.Profession profession = Villager.Profession.valueOf(configuredProfession);
|
||||||
this.removalPriority.add(profession);
|
this.removalPriority.add(profession);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
LogUtils.moduleLog(Level.WARNING, "villager-chunk-limit",
|
LogUtil.moduleLog(Level.WARNING, "villager-chunk-limit",
|
||||||
"Villager profession '"+configuredProfession+"' not recognized. Make sure you're using the correct profession enums.");
|
"Villager profession '"+configuredProfession+"' not recognized. Make sure you're using the correct profession enums.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -130,7 +130,7 @@ public class VillagerChunkLimit implements VillagerOptimizerModule, Listener {
|
|||||||
for (int i = 0; i < amount_over_the_limit; i++) {
|
for (int i = 0; i < amount_over_the_limit; i++) {
|
||||||
Villager villager = villagers_in_chunk.get(i);
|
Villager villager = villagers_in_chunk.get(i);
|
||||||
villager.remove();
|
villager.remove();
|
||||||
if (logIsEnabled) LogUtils.moduleLog(Level.INFO, "villager-chunk-limit",
|
if (logIsEnabled) LogUtil.moduleLog(Level.INFO, "villager-chunk-limit",
|
||||||
"Removed villager of profession type '"+villager.getProfession()+"' at "+villager.getLocation());
|
"Removed villager of profession type '"+villager.getProfession()+"' at "+villager.getLocation());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import me.xginko.villageroptimizer.VillagerCache;
|
|||||||
import me.xginko.villageroptimizer.config.Config;
|
import me.xginko.villageroptimizer.config.Config;
|
||||||
import me.xginko.villageroptimizer.WrappedVillager;
|
import me.xginko.villageroptimizer.WrappedVillager;
|
||||||
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
||||||
import me.xginko.villageroptimizer.utils.CommonUtils;
|
import me.xginko.villageroptimizer.utils.CommonUtil;
|
||||||
import net.kyori.adventure.text.TextReplacementConfig;
|
import net.kyori.adventure.text.TextReplacementConfig;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.entity.Villager;
|
import org.bukkit.entity.Villager;
|
||||||
@ -79,7 +79,7 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener {
|
|||||||
} else {
|
} else {
|
||||||
if (shouldNotify) {
|
if (shouldNotify) {
|
||||||
Player player = (Player) event.getPlayer();
|
Player player = (Player) event.getPlayer();
|
||||||
final String timeLeft = CommonUtils.formatTime(wVillager.getLevelCooldownMillis(cooldown));
|
final String timeLeft = CommonUtil.formatTime(wVillager.getLevelCooldownMillis(cooldown));
|
||||||
VillagerOptimizer.getLang(player.locale()).villager_leveling_up.forEach(line -> player.sendMessage(line
|
VillagerOptimizer.getLang(player.locale()).villager_leveling_up.forEach(line -> player.sendMessage(line
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build())
|
||||||
));
|
));
|
||||||
|
@ -6,7 +6,7 @@ import me.xginko.villageroptimizer.config.Config;
|
|||||||
import me.xginko.villageroptimizer.enums.Permissions;
|
import me.xginko.villageroptimizer.enums.Permissions;
|
||||||
import me.xginko.villageroptimizer.WrappedVillager;
|
import me.xginko.villageroptimizer.WrappedVillager;
|
||||||
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
||||||
import me.xginko.villageroptimizer.utils.CommonUtils;
|
import me.xginko.villageroptimizer.utils.CommonUtil;
|
||||||
import net.kyori.adventure.text.TextReplacementConfig;
|
import net.kyori.adventure.text.TextReplacementConfig;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -69,7 +69,7 @@ public class RestockTrades implements VillagerOptimizerModule, Listener {
|
|||||||
wVillager.restock();
|
wVillager.restock();
|
||||||
wVillager.saveRestockTime();
|
wVillager.saveRestockTime();
|
||||||
if (notifyPlayer) {
|
if (notifyPlayer) {
|
||||||
final String timeLeft = CommonUtils.formatTime(wVillager.getRestockCooldownMillis(restock_delay_millis));
|
final String timeLeft = CommonUtil.formatTime(wVillager.getRestockCooldownMillis(restock_delay_millis));
|
||||||
VillagerOptimizer.getLang(player.locale()).trades_restocked.forEach(line -> player.sendMessage(line
|
VillagerOptimizer.getLang(player.locale()).trades_restocked.forEach(line -> player.sendMessage(line
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build()))
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build()))
|
||||||
);
|
);
|
||||||
|
@ -7,8 +7,8 @@ import me.xginko.villageroptimizer.config.Config;
|
|||||||
import me.xginko.villageroptimizer.enums.OptimizationType;
|
import me.xginko.villageroptimizer.enums.OptimizationType;
|
||||||
import me.xginko.villageroptimizer.enums.Permissions;
|
import me.xginko.villageroptimizer.enums.Permissions;
|
||||||
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
||||||
import me.xginko.villageroptimizer.utils.CommonUtils;
|
import me.xginko.villageroptimizer.utils.CommonUtil;
|
||||||
import me.xginko.villageroptimizer.utils.LogUtils;
|
import me.xginko.villageroptimizer.utils.LogUtil;
|
||||||
import net.kyori.adventure.text.TextReplacementConfig;
|
import net.kyori.adventure.text.TextReplacementConfig;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -51,7 +51,7 @@ public class OptimizeByBlock implements VillagerOptimizerModule, Listener {
|
|||||||
Material disableBlock = Material.valueOf(configuredMaterial);
|
Material disableBlock = Material.valueOf(configuredMaterial);
|
||||||
this.blocks_that_disable.add(disableBlock);
|
this.blocks_that_disable.add(disableBlock);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
LogUtils.materialNotRecognized("block-optimization", configuredMaterial);
|
LogUtil.materialNotRecognized("block-optimization", configuredMaterial);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.cooldown = config.getInt("optimization-methods.block-optimization.optimize-cooldown-seconds", 600, """
|
this.cooldown = config.getInt("optimization-methods.block-optimization.optimize-cooldown-seconds", 600, """
|
||||||
@ -81,7 +81,7 @@ public class OptimizeByBlock implements VillagerOptimizerModule, Listener {
|
|||||||
return VillagerOptimizer.getConfiguration().getBoolean("optimization-methods.block-optimization.enable", false);
|
return VillagerOptimizer.getConfiguration().getBoolean("optimization-methods.block-optimization.enable", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
private void onBlockPlace(BlockPlaceEvent event) {
|
private void onBlockPlace(BlockPlaceEvent event) {
|
||||||
Block placed = event.getBlock();
|
Block placed = event.getBlock();
|
||||||
if (!blocks_that_disable.contains(placed.getType())) return;
|
if (!blocks_that_disable.contains(placed.getType())) return;
|
||||||
@ -119,7 +119,7 @@ public class OptimizeByBlock implements VillagerOptimizerModule, Listener {
|
|||||||
final String villagerType = closestOptimizableVillager.villager().getProfession().toString().toLowerCase();
|
final String villagerType = closestOptimizableVillager.villager().getProfession().toString().toLowerCase();
|
||||||
final String placedType = placed.getType().toString().toLowerCase();
|
final String placedType = placed.getType().toString().toLowerCase();
|
||||||
VillagerOptimizer.getLang(player.locale()).block_optimize_success.forEach(line -> player.sendMessage(line
|
VillagerOptimizer.getLang(player.locale()).block_optimize_success.forEach(line -> player.sendMessage(line
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%villagertype%").replacement(villagerType).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%vil_profession%").replacement(villagerType).build())
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%blocktype%").replacement(placedType).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%blocktype%").replacement(placedType).build())
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -128,14 +128,14 @@ public class OptimizeByBlock implements VillagerOptimizerModule, Listener {
|
|||||||
} else {
|
} else {
|
||||||
closestOptimizableVillager.villager().shakeHead();
|
closestOptimizableVillager.villager().shakeHead();
|
||||||
if (shouldNotifyPlayer) {
|
if (shouldNotifyPlayer) {
|
||||||
final String timeLeft = CommonUtils.formatTime(closestOptimizableVillager.getOptimizeCooldownMillis(cooldown));
|
final String timeLeft = CommonUtil.formatTime(closestOptimizableVillager.getOptimizeCooldownMillis(cooldown));
|
||||||
VillagerOptimizer.getLang(player.locale()).block_on_optimize_cooldown.forEach(line -> player.sendMessage(line
|
VillagerOptimizer.getLang(player.locale()).block_on_optimize_cooldown.forEach(line -> player.sendMessage(line
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build())));
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
private void onBlockBreak(BlockBreakEvent event) {
|
private void onBlockBreak(BlockBreakEvent event) {
|
||||||
Block broken = event.getBlock();
|
Block broken = event.getBlock();
|
||||||
if (!blocks_that_disable.contains(broken.getType())) return;
|
if (!blocks_that_disable.contains(broken.getType())) return;
|
||||||
@ -169,11 +169,11 @@ public class OptimizeByBlock implements VillagerOptimizerModule, Listener {
|
|||||||
final String villagerType = closestOptimizedVillager.villager().getProfession().toString().toLowerCase();
|
final String villagerType = closestOptimizedVillager.villager().getProfession().toString().toLowerCase();
|
||||||
final String brokenType = broken.getType().toString().toLowerCase();
|
final String brokenType = broken.getType().toString().toLowerCase();
|
||||||
VillagerOptimizer.getLang(player.locale()).block_unoptimize_success.forEach(line -> player.sendMessage(line
|
VillagerOptimizer.getLang(player.locale()).block_unoptimize_success.forEach(line -> player.sendMessage(line
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%villagertype%").replacement(villagerType).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%vil_profession%").replacement(villagerType).build())
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%blocktype%").replacement(brokenType).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%blocktype%").replacement(brokenType).build())
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if (shouldLog)
|
if (shouldLog)
|
||||||
VillagerOptimizer.getLog().info("Villager unoptimized because no longer standing on optimization block at "+closestOptimizedVillager.villager().getLocation());
|
VillagerOptimizer.getLog().info("Villager unoptimized because nearby optimization block broken at: "+closestOptimizedVillager.villager().getLocation());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ import me.xginko.villageroptimizer.enums.OptimizationType;
|
|||||||
import me.xginko.villageroptimizer.enums.Permissions;
|
import me.xginko.villageroptimizer.enums.Permissions;
|
||||||
import me.xginko.villageroptimizer.WrappedVillager;
|
import me.xginko.villageroptimizer.WrappedVillager;
|
||||||
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
||||||
import me.xginko.villageroptimizer.utils.CommonUtils;
|
import me.xginko.villageroptimizer.utils.CommonUtil;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.TextReplacementConfig;
|
import net.kyori.adventure.text.TextReplacementConfig;
|
||||||
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
||||||
@ -98,7 +98,7 @@ public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
wVillager.villager().shakeHead();
|
wVillager.villager().shakeHead();
|
||||||
if (shouldNotifyPlayer) {
|
if (shouldNotifyPlayer) {
|
||||||
final String time = CommonUtils.formatTime(wVillager.getOptimizeCooldownMillis(cooldown));
|
final String time = CommonUtil.formatTime(wVillager.getOptimizeCooldownMillis(cooldown));
|
||||||
VillagerOptimizer.getLang(player.locale()).nametag_on_optimize_cooldown.forEach(line -> player.sendMessage(line
|
VillagerOptimizer.getLang(player.locale()).nametag_on_optimize_cooldown.forEach(line -> player.sendMessage(line
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(time).build())));
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(time).build())));
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
package me.xginko.villageroptimizer.modules.optimizations;
|
package me.xginko.villageroptimizer.modules.optimizations;
|
||||||
|
|
||||||
import me.xginko.villageroptimizer.VillagerOptimizer;
|
|
||||||
import me.xginko.villageroptimizer.VillagerCache;
|
import me.xginko.villageroptimizer.VillagerCache;
|
||||||
|
import me.xginko.villageroptimizer.VillagerOptimizer;
|
||||||
|
import me.xginko.villageroptimizer.WrappedVillager;
|
||||||
import me.xginko.villageroptimizer.config.Config;
|
import me.xginko.villageroptimizer.config.Config;
|
||||||
import me.xginko.villageroptimizer.enums.OptimizationType;
|
import me.xginko.villageroptimizer.enums.OptimizationType;
|
||||||
import me.xginko.villageroptimizer.enums.Permissions;
|
import me.xginko.villageroptimizer.enums.Permissions;
|
||||||
import me.xginko.villageroptimizer.WrappedVillager;
|
|
||||||
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
|
||||||
import me.xginko.villageroptimizer.utils.CommonUtils;
|
import me.xginko.villageroptimizer.utils.CommonUtil;
|
||||||
import me.xginko.villageroptimizer.utils.LogUtils;
|
import me.xginko.villageroptimizer.utils.LogUtil;
|
||||||
import net.kyori.adventure.text.TextReplacementConfig;
|
import net.kyori.adventure.text.TextReplacementConfig;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -28,9 +28,6 @@ import java.util.HashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class OptimizeByWorkstation implements VillagerOptimizerModule, Listener {
|
public class OptimizeByWorkstation implements VillagerOptimizerModule, Listener {
|
||||||
/*
|
|
||||||
* TODO: Make placed workstation villager profession related.
|
|
||||||
* */
|
|
||||||
|
|
||||||
private final VillagerCache villagerCache;
|
private final VillagerCache villagerCache;
|
||||||
private final HashSet<Material> workstations_that_disable = new HashSet<>(14);
|
private final HashSet<Material> workstations_that_disable = new HashSet<>(14);
|
||||||
@ -54,7 +51,7 @@ public class OptimizeByWorkstation implements VillagerOptimizerModule, Listener
|
|||||||
Material disableBlock = Material.valueOf(configuredMaterial);
|
Material disableBlock = Material.valueOf(configuredMaterial);
|
||||||
this.workstations_that_disable.add(disableBlock);
|
this.workstations_that_disable.add(disableBlock);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
LogUtils.materialNotRecognized("workstation-optimization", configuredMaterial);
|
LogUtil.materialNotRecognized("workstation-optimization", configuredMaterial);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.search_radius = config.getDouble("optimization-methods.workstation-optimization.search-radius-in-blocks", 2.0, """
|
this.search_radius = config.getDouble("optimization-methods.workstation-optimization.search-radius-in-blocks", 2.0, """
|
||||||
@ -87,19 +84,22 @@ public class OptimizeByWorkstation implements VillagerOptimizerModule, Listener
|
|||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
private void onBlockPlace(BlockPlaceEvent event) {
|
private void onBlockPlace(BlockPlaceEvent event) {
|
||||||
Block placed = event.getBlock();
|
Block placed = event.getBlock();
|
||||||
if (!workstations_that_disable.contains(placed.getType())) return;
|
final Material placedType = placed.getType();
|
||||||
|
if (!workstations_that_disable.contains(placedType)) return;
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
if (!player.hasPermission(Permissions.Optimize.WORKSTATION.get())) return;
|
if (!player.hasPermission(Permissions.Optimize.WORKSTATION.get())) return;
|
||||||
|
Villager.Profession workstationProfession = getWorkstationProfession(placedType);
|
||||||
|
if (workstationProfession.equals(Villager.Profession.NONE)) return;
|
||||||
|
|
||||||
final Location workstationLoc = placed.getLocation();
|
final Location workstationLoc = placed.getLocation();
|
||||||
WrappedVillager closestOptimizableVillager = null;
|
WrappedVillager closestOptimizableVillager = null;
|
||||||
double closestDistance = Double.MAX_VALUE;
|
double closestDistance = Double.MAX_VALUE;
|
||||||
|
|
||||||
|
|
||||||
for (Entity entity : workstationLoc.getNearbyEntities(search_radius, search_radius, search_radius)) {
|
for (Entity entity : workstationLoc.getNearbyEntities(search_radius, search_radius, search_radius)) {
|
||||||
if (!entity.getType().equals(EntityType.VILLAGER)) continue;
|
if (!entity.getType().equals(EntityType.VILLAGER)) continue;
|
||||||
Villager villager = (Villager) entity;
|
Villager villager = (Villager) entity;
|
||||||
final Villager.Profession profession = villager.getProfession();
|
if (!villager.getProfession().equals(workstationProfession)) continue;
|
||||||
if (profession.equals(Villager.Profession.NONE) || profession.equals(Villager.Profession.NITWIT)) continue;
|
|
||||||
|
|
||||||
WrappedVillager wVillager = villagerCache.getOrAdd(villager);
|
WrappedVillager wVillager = villagerCache.getOrAdd(villager);
|
||||||
final double distance = entity.getLocation().distance(workstationLoc);
|
final double distance = entity.getLocation().distance(workstationLoc);
|
||||||
@ -122,16 +122,16 @@ public class OptimizeByWorkstation implements VillagerOptimizerModule, Listener
|
|||||||
final String villagerType = closestOptimizableVillager.villager().getProfession().toString().toLowerCase();
|
final String villagerType = closestOptimizableVillager.villager().getProfession().toString().toLowerCase();
|
||||||
final String workstation = placed.getType().toString().toLowerCase();
|
final String workstation = placed.getType().toString().toLowerCase();
|
||||||
VillagerOptimizer.getLang(player.locale()).workstation_optimize_success.forEach(line -> player.sendMessage(line
|
VillagerOptimizer.getLang(player.locale()).workstation_optimize_success.forEach(line -> player.sendMessage(line
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%villagertype%").replacement(villagerType).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%vil_profession%").replacement(villagerType).build())
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%workstation%").replacement(workstation).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%workstation%").replacement(workstation).build())
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if (shouldLog)
|
if (shouldLog)
|
||||||
VillagerOptimizer.getLog().info(event.getPlayer().getName() + " optimized a villager using workstation: '" + placed.getType().toString().toLowerCase() + "'");
|
VillagerOptimizer.getLog().info(player.getName() + " optimized a villager using workstation: '" + placed.getType().toString().toLowerCase() + "'");
|
||||||
} else {
|
} else {
|
||||||
closestOptimizableVillager.villager().shakeHead();
|
closestOptimizableVillager.villager().shakeHead();
|
||||||
if (shouldNotifyPlayer) {
|
if (shouldNotifyPlayer) {
|
||||||
final String timeLeft = CommonUtils.formatTime(closestOptimizableVillager.getOptimizeCooldownMillis(cooldown));
|
final String timeLeft = CommonUtil.formatTime(closestOptimizableVillager.getOptimizeCooldownMillis(cooldown));
|
||||||
VillagerOptimizer.getLang(player.locale()).nametag_on_optimize_cooldown.forEach(line -> player.sendMessage(line
|
VillagerOptimizer.getLang(player.locale()).nametag_on_optimize_cooldown.forEach(line -> player.sendMessage(line
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build())
|
||||||
));
|
));
|
||||||
@ -142,9 +142,12 @@ public class OptimizeByWorkstation implements VillagerOptimizerModule, Listener
|
|||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
private void onBlockBreak(BlockBreakEvent event) {
|
private void onBlockBreak(BlockBreakEvent event) {
|
||||||
Block placed = event.getBlock();
|
Block placed = event.getBlock();
|
||||||
if (!workstations_that_disable.contains(placed.getType())) return;
|
final Material brokenType = placed.getType();
|
||||||
|
if (!workstations_that_disable.contains(brokenType)) return;
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
if (!player.hasPermission(Permissions.Optimize.WORKSTATION.get())) return;
|
if (!player.hasPermission(Permissions.Optimize.WORKSTATION.get())) return;
|
||||||
|
Villager.Profession workstationProfession = getWorkstationProfession(brokenType);
|
||||||
|
if (workstationProfession.equals(Villager.Profession.NONE)) return;
|
||||||
|
|
||||||
final Location workstationLoc = placed.getLocation();
|
final Location workstationLoc = placed.getLocation();
|
||||||
WrappedVillager closestOptimizedVillager = null;
|
WrappedVillager closestOptimizedVillager = null;
|
||||||
@ -153,6 +156,7 @@ public class OptimizeByWorkstation implements VillagerOptimizerModule, Listener
|
|||||||
for (Entity entity : workstationLoc.getNearbyEntities(search_radius, search_radius, search_radius)) {
|
for (Entity entity : workstationLoc.getNearbyEntities(search_radius, search_radius, search_radius)) {
|
||||||
if (!entity.getType().equals(EntityType.VILLAGER)) continue;
|
if (!entity.getType().equals(EntityType.VILLAGER)) continue;
|
||||||
Villager villager = (Villager) entity;
|
Villager villager = (Villager) entity;
|
||||||
|
if (!villager.getProfession().equals(workstationProfession)) continue;
|
||||||
|
|
||||||
WrappedVillager wVillager = villagerCache.getOrAdd(villager);
|
WrappedVillager wVillager = villagerCache.getOrAdd(villager);
|
||||||
final double distance = entity.getLocation().distance(workstationLoc);
|
final double distance = entity.getLocation().distance(workstationLoc);
|
||||||
@ -160,24 +164,44 @@ public class OptimizeByWorkstation implements VillagerOptimizerModule, Listener
|
|||||||
if (distance < closestDistance) {
|
if (distance < closestDistance) {
|
||||||
final OptimizationType type = wVillager.getOptimizationType();
|
final OptimizationType type = wVillager.getOptimizationType();
|
||||||
if (type.equals(OptimizationType.WORKSTATION) || type.equals(OptimizationType.COMMAND)) {
|
if (type.equals(OptimizationType.WORKSTATION) || type.equals(OptimizationType.COMMAND)) {
|
||||||
|
|
||||||
closestOptimizedVillager = wVillager;
|
closestOptimizedVillager = wVillager;
|
||||||
closestDistance = distance;
|
closestDistance = distance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (closestOptimizedVillager != null) {
|
if (closestOptimizedVillager == null) return;
|
||||||
|
|
||||||
closestOptimizedVillager.setOptimization(OptimizationType.NONE);
|
closestOptimizedVillager.setOptimization(OptimizationType.NONE);
|
||||||
if (shouldNotifyPlayer) {
|
if (shouldNotifyPlayer) {
|
||||||
final String villagerType = closestOptimizedVillager.villager().getProfession().toString().toLowerCase();
|
final String villagerType = closestOptimizedVillager.villager().getProfession().toString().toLowerCase();
|
||||||
final String workstation = placed.getType().toString().toLowerCase();
|
final String workstation = placed.getType().toString().toLowerCase();
|
||||||
VillagerOptimizer.getLang(player.locale()).workstation_unoptimize_success.forEach(line -> player.sendMessage(line
|
VillagerOptimizer.getLang(player.locale()).workstation_unoptimize_success.forEach(line -> player.sendMessage(line
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%villagertype%").replacement(villagerType).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%vil_profession%").replacement(villagerType).build())
|
||||||
.replaceText(TextReplacementConfig.builder().matchLiteral("%workstation%").replacement(workstation).build())
|
.replaceText(TextReplacementConfig.builder().matchLiteral("%workstation%").replacement(workstation).build())
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if (shouldLog)
|
if (shouldLog)
|
||||||
VillagerOptimizer.getLog().info(event.getPlayer().getName() + " unoptimized a villager by breaking workstation: '" + placed.getType().toString().toLowerCase() + "'");
|
VillagerOptimizer.getLog().info(player.getName() + " unoptimized a villager by breaking workstation: '" + placed.getType().toString().toLowerCase() + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Villager.Profession getWorkstationProfession(Material workstation) {
|
||||||
|
return switch (workstation) {
|
||||||
|
case BARREL -> Villager.Profession.FISHERMAN;
|
||||||
|
case CARTOGRAPHY_TABLE -> Villager.Profession.CARTOGRAPHER;
|
||||||
|
case SMOKER -> Villager.Profession.BUTCHER;
|
||||||
|
case SMITHING_TABLE -> Villager.Profession.TOOLSMITH;
|
||||||
|
case GRINDSTONE -> Villager.Profession.WEAPONSMITH;
|
||||||
|
case BLAST_FURNACE -> Villager.Profession.ARMORER;
|
||||||
|
case CAULDRON -> Villager.Profession.LEATHERWORKER;
|
||||||
|
case BREWING_STAND -> Villager.Profession.CLERIC;
|
||||||
|
case COMPOSTER -> Villager.Profession.FARMER;
|
||||||
|
case FLETCHING_TABLE -> Villager.Profession.FLETCHER;
|
||||||
|
case LOOM -> Villager.Profession.SHEPHERD;
|
||||||
|
case LECTERN -> Villager.Profession.LIBRARIAN;
|
||||||
|
case STONECUTTER -> Villager.Profession.MASON;
|
||||||
|
default -> Villager.Profession.NONE;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
package me.xginko.villageroptimizer.utils;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
|
import static java.lang.String.format;
|
||||||
|
|
||||||
|
public class CommonUtil {
|
||||||
|
|
||||||
|
public static @NotNull String formatTime(final long millis) {
|
||||||
|
Duration duration = Duration.ofMillis(millis);
|
||||||
|
final int seconds = duration.toSecondsPart();
|
||||||
|
final int minutes = duration.toMinutesPart();
|
||||||
|
final int hours = duration.toHoursPart();
|
||||||
|
|
||||||
|
if (hours > 0) {
|
||||||
|
return format("%02dh %02dm %02ds", hours, minutes, seconds);
|
||||||
|
} else if (minutes > 0) {
|
||||||
|
return format("%02dm %02ds", minutes, seconds);
|
||||||
|
} else {
|
||||||
|
return format("%02ds", seconds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,44 +0,0 @@
|
|||||||
package me.xginko.villageroptimizer.utils;
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Villager;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.time.Duration;
|
|
||||||
|
|
||||||
import static java.lang.String.format;
|
|
||||||
|
|
||||||
public class CommonUtils {
|
|
||||||
|
|
||||||
public static @NotNull String formatTime(final long millis) {
|
|
||||||
Duration duration = Duration.ofMillis(millis);
|
|
||||||
final int seconds = duration.toSecondsPart();
|
|
||||||
final int minutes = duration.toMinutesPart();
|
|
||||||
final int hours = duration.toHoursPart();
|
|
||||||
|
|
||||||
if (hours > 0) {
|
|
||||||
return format("%02dh %02dm %02ds", hours, minutes, seconds);
|
|
||||||
} else {
|
|
||||||
return minutes > 0 ? format("%02dm %02ds", minutes, seconds) : format("%02ds", seconds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static @NotNull Villager.Profession getWorkstationProfession(@NotNull final Material workstation) {
|
|
||||||
return switch (workstation) {
|
|
||||||
case BARREL -> Villager.Profession.FISHERMAN;
|
|
||||||
case CARTOGRAPHY_TABLE -> Villager.Profession.CARTOGRAPHER;
|
|
||||||
case SMOKER -> Villager.Profession.BUTCHER;
|
|
||||||
case SMITHING_TABLE -> Villager.Profession.TOOLSMITH;
|
|
||||||
case GRINDSTONE -> Villager.Profession.WEAPONSMITH;
|
|
||||||
case BLAST_FURNACE -> Villager.Profession.ARMORER;
|
|
||||||
case CAULDRON -> Villager.Profession.LEATHERWORKER;
|
|
||||||
case BREWING_STAND -> Villager.Profession.CLERIC;
|
|
||||||
case COMPOSTER -> Villager.Profession.FARMER;
|
|
||||||
case FLETCHING_TABLE -> Villager.Profession.FLETCHER;
|
|
||||||
case LOOM -> Villager.Profession.SHEPHERD;
|
|
||||||
case LECTERN -> Villager.Profession.LIBRARIAN;
|
|
||||||
case STONECUTTER -> Villager.Profession.MASON;
|
|
||||||
default -> Villager.Profession.NONE;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,7 +4,7 @@ import me.xginko.villageroptimizer.VillagerOptimizer;
|
|||||||
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public class LogUtils {
|
public class LogUtil {
|
||||||
|
|
||||||
public static void moduleLog(Level logLevel, String path, String logMessage) {
|
public static void moduleLog(Level logLevel, String path, String logMessage) {
|
||||||
VillagerOptimizer.getLog().log(logLevel, "(" + path + ") " + logMessage);
|
VillagerOptimizer.getLog().log(logLevel, "(" + path + ") " + logMessage);
|
@ -15,14 +15,14 @@ messages:
|
|||||||
- "<green>Successfully unoptimized villager by using a nametag."
|
- "<green>Successfully unoptimized villager by using a nametag."
|
||||||
block:
|
block:
|
||||||
optimize-success:
|
optimize-success:
|
||||||
- "<green>%villagertype% villager successfully optimized using block %blocktype%."
|
- "<green>%vil_profession% villager successfully optimized using block %blocktype%."
|
||||||
optimize-on-cooldown:
|
optimize-on-cooldown:
|
||||||
- "<gray>You need to wait %time% until you can optimize this villager again."
|
- "<gray>You need to wait %time% until you can optimize this villager again."
|
||||||
unoptimize-success:
|
unoptimize-success:
|
||||||
- "<green>Successfully unoptimized %villagertype% villager by removing %blocktype%."
|
- "<green>Successfully unoptimized %vil_profession% villager by removing %blocktype%."
|
||||||
workstation:
|
workstation:
|
||||||
optimize-success:
|
optimize-success:
|
||||||
- "<green>%villagertype% villager successfully optimized using workstation block %blocktype%."
|
- "<green>%vil_profession% villager successfully optimized using workstation block %blocktype%."
|
||||||
optimize-on-cooldown:
|
optimize-on-cooldown:
|
||||||
- "<gray>You need to wait %time% until you can optimize this villager again."
|
- "<gray>You need to wait %time% until you can optimize this villager again."
|
||||||
unoptimize-success:
|
unoptimize-success:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user