VillagerTradeLimiter/src/com/pretzel/dev/villagertradelimiter/listeners/VillagerListener.java

109 lines
4.3 KiB
Java

package com.pretzel.dev.villagertradelimiter.listeners;
import com.pretzel.dev.villagertradelimiter.VillagerTradeLimiter;
import com.pretzel.dev.villagertradelimiter.data.Cooldown;
import com.pretzel.dev.villagertradelimiter.data.PlayerData;
import com.pretzel.dev.villagertradelimiter.settings.Settings;
import org.bukkit.entity.Item;
import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.VillagerAcquireTradeEvent;
import org.bukkit.event.entity.VillagerCareerChangeEvent;
import org.bukkit.event.entity.VillagerReplenishTradeEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.MerchantRecipe;
import java.time.Instant;
import java.util.Date;
import java.util.List;
import java.util.UUID;
public class VillagerListener implements Listener {
private final VillagerTradeLimiter instance;
private final Settings settings;
/**
* @param instance The instance of VillagerTradeLimiter.java
* @param settings The settings instance
*/
public VillagerListener(final VillagerTradeLimiter instance, final Settings settings) {
this.instance = instance;
this.settings = settings;
}
/** Handles villager promotions */
@EventHandler
public void onVillagerPromotion(final VillagerAcquireTradeEvent event) {
//Gets the items in the trade
final MerchantRecipe recipe = event.getRecipe();
List<ItemStack> items = recipe.getIngredients();
items.add(recipe.getResult());
//Gets the disabled item list from config
List<String> disabledItems = instance.getCfg().getStringList("DisableItems");
//Checks each item if it should be removed from the trade list
for(ItemStack item : items) {
if(disabledItems.contains(item.getType().name().toLowerCase())) {
event.setCancelled(true);
return;
}
}
}
/** Handles villager profession change **/
@EventHandler
public void onVillagerChangeProfession(final VillagerCareerChangeEvent event) {
//Gets the new profession
final Villager.Profession profession = event.getProfession();
//Gets the disabled profession list from config
List<String> disabledProfessions = instance.getCfg().getStringList("DisableProfessions");
//Changes the new profession to none if disabled in config
if(disabledProfessions.contains(profession.name().toLowerCase())) {
event.setProfession(Villager.Profession.NONE);
}
}
/** Handles villager restocks */
@EventHandler
public void onVillagerRestock(final VillagerReplenishTradeEvent event) {
if(!(event.getEntity() instanceof Villager)) return;
final Villager villager = (Villager)event.getEntity();
if(settings.shouldSkipNPC(villager)) return; //Skips NPCs
//Get the items involved in the restock
final MerchantRecipe recipe = event.getRecipe();
final ItemStack result = recipe.getResult();
ItemStack ingredient1 = recipe.getIngredients().get(0);
ItemStack ingredient2 = recipe.getIngredients().get(1);
final String type = settings.getType(result, ingredient1, ingredient2);
//Get the villager's data container
final UUID uuid = villager.getUniqueId();
final PlayerData villagerData = instance.getPlayerData().get(uuid);
if(villagerData == null) return;
//Get the time of the last trade, restock cooldown setting, and now
final String lastTradeStr = villagerData.getTradingCooldowns().get(type);
if(lastTradeStr == null) return;
String cooldownStr = instance.getCfg().getString("Restock", "0");
cooldownStr = instance.getCfg().getString("Overrides."+type+".Restock", cooldownStr);
final Date now = Date.from(Instant.now());
final Date lastTrade = Cooldown.parseTime(lastTradeStr);
if(lastTrade == null) return;
final long cooldown = Cooldown.parseCooldown(cooldownStr);
//Cancel the event if there is an active restock cooldown, otherwise remove the restock cooldown
if(now.getTime()/1000L >= lastTrade.getTime()/1000L + cooldown) {
villagerData.getTradingCooldowns().remove(type);
} else {
event.setCancelled(true);
}
}
}