Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,34 +1,16 @@
package io.github.mrcomputer1.smileyplayertrader;

import io.github.mrcomputer1.smileyplayertrader.gui.framework.GUIManager;
import io.github.mrcomputer1.smileyplayertrader.util.GeyserUtil;
import io.github.mrcomputer1.smileyplayertrader.util.I18N;
import io.github.mrcomputer1.smileyplayertrader.util.RegionUtil;
import io.github.mrcomputer1.smileyplayertrader.util.item.ItemUtil;
import io.github.mrcomputer1.smileyplayertrader.util.database.statements.StatementHandler;
import io.github.mrcomputer1.smileyplayertrader.util.item.stocklocations.StockLocations;
import io.github.mrcomputer1.smileyplayertrader.util.merchant.MerchantUtil;
import io.github.mrcomputer1.smileyplayertrader.versions.VersionSupport;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.MerchantInventory;

import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.SQLException;

Expand Down Expand Up @@ -93,13 +75,13 @@ public void onEntityTakeDamageByEntity(EntityDamageByEntityEvent e) {
if(SmileyPlayerTrader.getInstance().getConfiguration().getAutoCombatLockEnabled()) {
if (e.getDamager() instanceof Player) {
Player player = (Player) e.getDamager();
if(!RegionUtil.isAllowed(player))
if(!RegionUtil.isAllowedOverall(player))
return;
SmileyPlayerTrader.getInstance().getPlayerConfig().lockPlayer(player);
}
if (e.getEntity() instanceof Player){
Player player = (Player) e.getEntity();
if(!RegionUtil.isAllowed(player))
if(!RegionUtil.isAllowedOverall(player))
return;
SmileyPlayerTrader.getInstance().getPlayerConfig().lockPlayer((Player) e.getEntity());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class PlayerConfig {

Expand All @@ -31,6 +32,7 @@ public Config clone() {
private int LOCK_PERIOD = SmileyPlayerTrader.getInstance().getConfiguration().getAutoCombatLockLength() * 1000;
private Map<String, Config> playerConfigs = new HashMap<>();
private Map<String, Long> playerCombatLock = new HashMap<>();
private Map<UUID, Long> playerTradeCooldown = new HashMap<>();

public void loadPlayer(Player player){
try(ResultSet set = SmileyPlayerTrader.getInstance().getStatementHandler().get(StatementHandler.StatementType.LOAD_PLAYER_CONFIG, player.getUniqueId().toString())) {
Expand Down Expand Up @@ -73,6 +75,7 @@ public Config getMutablePlayer(Player player){
public void unloadPlayer(Player player){
this.playerConfigs.remove(player.getName());
this.playerCombatLock.remove(player.getName());
this.playerTradeCooldown.remove(player.getUniqueId());
}

public void updatePlayer(Player player, Config config){
Expand Down Expand Up @@ -113,4 +116,29 @@ public void releasePlayerLock(Player player){
this.playerCombatLock.remove(player.getName());
}

public boolean isTradeOnCooldown(Player player) {
if (!SmileyPlayerTrader.getInstance().getConfiguration().getCooldownEnabled())
return false;
if (player.hasPermission("smileyplayertrader.bypasscooldown"))
return false;
if (!playerTradeCooldown.containsKey(player.getUniqueId()))
return false;
return playerTradeCooldown.get(player.getUniqueId()) > System.currentTimeMillis();
}

public int getCooldownTimeRemaining(Player player) {
if (!playerTradeCooldown.containsKey(player.getUniqueId()))
return -1;
return (int) ((playerTradeCooldown.get(player.getUniqueId()) - System.currentTimeMillis()) / 1000);
}

public void setTradeCooldown(Player player) {
if (!SmileyPlayerTrader.getInstance().getConfiguration().getCooldownEnabled())
return;
if (player.hasPermission("smileyplayertrader.bypasscooldown"))
return;
playerTradeCooldown.put(player.getUniqueId(),
System.currentTimeMillis() + (SmileyPlayerTrader.getInstance().getConfiguration().getCooldownLength() * 1000L));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,12 @@ public boolean getDisableVaultOfflinePermissionChecking() {
return this.config.getBoolean("disableVaultOfflinePermissionChecking", false);
}

// Start On Trade Complete Commands
public List<String> getOnTradeCompleteCommands() {
return this.config.getStringList("onTradeCompleteCommands");
}
// End On Trade Complete Commands

// Start Auto Combat Lock
public boolean getAutoCombatLockEnabled(){
return this.config.getBoolean("autoCombatLock.enabled", true);
Expand All @@ -336,6 +342,17 @@ public boolean getAutoCombatLockNeverShowNotice(){
}
// End Auto Combat Lock

// Start Cooldown
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean getCooldownEnabled() {
return this.config.getBoolean("cooldown.enabled", false);
}

public int getCooldownLength() {
return this.config.getInt("cooldown.seconds", 10);
}
// End Cooldown

public List<ItemStack> getPriceQuickSelection(){
List<?> priceQuickSelection = SmileyPlayerTrader.getInstance().getConfig().getList("priceQuickSelection", new ArrayList<>());
List<ItemStack> stacks = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import io.github.mrcomputer1.smileyplayertrader.gui.framework.GUIManager;
import io.github.mrcomputer1.smileyplayertrader.util.GeyserUtil;
import io.github.mrcomputer1.smileyplayertrader.util.I18N;
import io.github.mrcomputer1.smileyplayertrader.util.RegionUtil;
import io.github.mrcomputer1.smileyplayertrader.util.TradeEventCommands;
import io.github.mrcomputer1.smileyplayertrader.util.database.statements.StatementHandler;
import io.github.mrcomputer1.smileyplayertrader.util.item.ItemUtil;
import io.github.mrcomputer1.smileyplayertrader.util.item.stocklocations.StockLocations;
Expand Down Expand Up @@ -41,10 +43,14 @@ public void onEntityRightClick(PlayerInteractAtEntityEvent e){

if(SmileyPlayerTrader.getInstance().getConfiguration().getDisableRightClickTrading())
return;
if(e.getRightClicked().hasMetadata("NPC")) // Citizens NPCs seem like players but they have different UUIDs and can't work.
if(e.getRightClicked().hasMetadata("NPC")) // Citizens NPCs seem like players, but they have different UUIDs and can't work.
return;
if(!e.getPlayer().hasPermission("smileyplayertrader.trade"))
return;
if(!e.getPlayer().hasPermission("smileyplayertrader.trade.rightclick"))
return;
if(!RegionUtil.isAllowedRightClick(e.getPlayer()) || !RegionUtil.isAllowedOverall(e.getPlayer()))
return;

PlayerConfig.Config playerConfig = SmileyPlayerTrader.getInstance().getPlayerConfig().getPlayer(e.getPlayer());
if(playerConfig == null) // If playerConfig is null, assume player is offline.
Expand Down Expand Up @@ -196,6 +202,18 @@ private void processItemPurchase(InventoryClickEvent e, MerchantInventory mi, Of
MerchantUtil.thankPurchaser(store, (Player) e.getWhoClicked());
SmileyPlayerTrader.getInstance().getStatementHandler().run(StatementHandler.StatementType.INCREMENT_PURCHASE_COUNT, productId);

// Execute trade commands
TradeEventCommands.executeCommands(
store,
(Player) e.getWhoClicked(),
mi.getSelectedRecipe().getResult(),
mi.getSelectedRecipe().getIngredients().get(0),
mi.getSelectedRecipe().getIngredients().size() >= 2 ? mi.getSelectedRecipe().getIngredients().get(1) : null
);

// Set cooldown (if enabled)
SmileyPlayerTrader.getInstance().getPlayerConfig().setTradeCooldown((Player) e.getWhoClicked());

// If the store player is online, inform them of the purchase.
if (store.isOnline())
store.getPlayer().sendMessage(I18N.translate("&a%0% just purchased %1%!", e.getWhoClicked().getName(), mi.getSelectedRecipe().getResult().getType()));
Expand Down Expand Up @@ -241,6 +259,14 @@ private void onTradeSlotClick(InventoryClickEvent e) {

MerchantInventory mi = (MerchantInventory) e.getInventory();

// Check if on cooldown
if (SmileyPlayerTrader.getInstance().getPlayerConfig().isTradeOnCooldown((Player) e.getWhoClicked())) {
e.setCancelled(true);
GUIManager.sendErrorMessage(e.getWhoClicked(), I18N.translate("&cYou are currently on cooldown for %0% more seconds.",
SmileyPlayerTrader.getInstance().getPlayerConfig().getCooldownTimeRemaining((Player) e.getWhoClicked())));
return;
}

// Get player and ensure player can be traded with.
//noinspection deprecation
OfflinePlayer store = Bukkit.getOfflinePlayer(e.getView().getTitle().replace(I18N.translate("&2Villager Store: "), ""));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.github.mrcomputer1.smileyplayertrader.command;

import io.github.mrcomputer1.smileyplayertrader.util.I18N;
import io.github.mrcomputer1.smileyplayertrader.util.RegionUtil;
import io.github.mrcomputer1.smileyplayertrader.util.merchant.MerchantUtil;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
Expand All @@ -20,6 +21,11 @@ public void onCommand(CommandSender sender, String[] args) {
return;
}

if(!RegionUtil.isAllowedRemote((Player) sender)) {
sender.sendMessage(I18N.translate("&cYou cannot trade here."));
return;
}

if(args.length < 1){
sender.sendMessage(I18N.translate("&cBad Syntax! &f/spt trade <name>"));
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,19 @@ public static void setup() {
impl = new NullRegionImpl();
}

impl.registerFlag();
impl.registerFlags();
}

public static boolean isAllowed(Player player) {
return impl.isAllowed(player);
public static boolean isAllowedOverall(Player player) {
return impl.isAllowedOverall(player);
}

public static boolean isAllowedRightClick(Player player) {
return impl.isAllowedRightClick(player);
}

public static boolean isAllowedRemote(Player player) {
return impl.isAllowedRemote(player);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package io.github.mrcomputer1.smileyplayertrader.util;

import io.github.mrcomputer1.smileyplayertrader.SmileyPlayerTrader;
import io.github.mrcomputer1.smileyplayertrader.versions.VersionSupport;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import java.util.List;

public class TradeEventCommands {

private static void executeCommand(String command, OfflinePlayer merchant, Player customer, ItemStack product, ItemStack cost, ItemStack cost2) {
boolean onlyIfNoCost2 = command.contains("%ONLY_IF_NO_COST2%");
boolean onlyIfCost2 = command.contains("%COST2_TYPE%") || command.contains("%COST2_NAME%") || command.contains("%COST2_AMOUNT%");

if (cost2 == null && onlyIfCost2) // skip command if this command should only run if there is a cost2 and there isn't one.
return;
if (cost2 != null && onlyIfNoCost2) // skip command if this command should only run if there is no cost2 and there is one.
return;

command = command.replace("%MERCHANT%", merchant.getName() == null ? "null" : merchant.getName());
command = command.replace("%CUSTOMER%", customer.getName());
command = command.replace("%PRODUCT_TYPE%", product.getType().name());
String productItemName = VersionSupport.getPreferredItemName(product.getItemMeta());
command = command.replace("%PRODUCT_NAME%", productItemName == null ? product.getType().toString() : productItemName);
command = command.replace("%PRODUCT_AMOUNT%", Integer.toString(product.getAmount()));
command = command.replace("%COST_TYPE%", cost.getType().name());
String costItemName = VersionSupport.getPreferredItemName(cost.getItemMeta());
command = command.replace("%COST_NAME%", cost.getType().name());
command = command.replace("%COST_AMOUNT%", Integer.toString(cost.getAmount()));
command = command.replace("%ONLY_IF_NO_COST2%", "");

if (onlyIfCost2) {
command = command.replace("%COST2_TYPE%", cost2.getType().name());
String cost2ItemName = VersionSupport.getPreferredItemName(cost2.getItemMeta());
command = command.replace("%COST2_NAME%", cost2ItemName == null ? cost2.getType().toString() : cost2ItemName);
command = command.replace("%COST2_AMOUNT%", Integer.toString(cost2.getAmount()));
}

Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
}

public static void executeCommands(OfflinePlayer merchant, Player customer, ItemStack product, ItemStack cost, ItemStack cost2) {
List<String> commands = SmileyPlayerTrader.getInstance().getConfiguration().getOnTradeCompleteCommands();

for (String command : commands) {
executeCommand(command, merchant, customer, product, cost, cost2);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

public interface IRegionImpl {

boolean isAllowed(Player player);
void registerFlag();
boolean isAllowedOverall(Player player);
boolean isAllowedRightClick(Player player);
boolean isAllowedRemote(Player player);
void registerFlags();

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,22 @@
public class NullRegionImpl implements IRegionImpl {

@Override
public boolean isAllowed(Player player) {
public boolean isAllowedOverall(Player player) {
return true;
}

@Override
public void registerFlag() {
public boolean isAllowedRightClick(Player player) {
return true;
}

@Override
public boolean isAllowedRemote(Player player) {
return true;
}

@Override
public void registerFlags() {
}

}
Loading