Skip to content

Commit

Permalink
Added the option for physical currency
Browse files Browse the repository at this point in the history
  • Loading branch information
Reldeam committed Feb 1, 2022
1 parent 0e07616 commit 74eb1a3
Show file tree
Hide file tree
Showing 9 changed files with 174 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public class CustomVillagerTrades extends JavaPlugin implements PluginConfig {
private boolean isVanillaTradesAllowed = false;
private boolean isDuplicateTradesAllowed = false;
private boolean isEconomyEnabled = false;
private boolean isCurrencyPhysical = false;
private Material toolMaterial;
private Material currencyMaterial;
private String currencyPrefix;
Expand Down Expand Up @@ -104,6 +105,7 @@ public void onEnable() {
isDuplicateTradesAllowed = getConfig().getBoolean("allowDuplicateTrades");
isVanillaTradesAllowed = !getConfig().getBoolean("disableVanillaTrades");
isEconomyEnabled = getConfig().getBoolean("enableEconomy");
isCurrencyPhysical = getConfig().getBoolean("enablePhysicalCurrency");
toolMaterial = Material.getMaterial(getConfig().getString("tool"));
currencyMaterial = Material.getMaterial(getConfig().getString("currencyItem"));
currencyPrefix = getConfig().getString("currencyPrefix");
Expand Down Expand Up @@ -305,6 +307,11 @@ public String getCurrencySuffix() {
return this.currencySuffix;
}

@Override
public boolean isCurrencyPhysical() {
return isCurrencyPhysical;
}




Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public interface PluginConfig {
public boolean isDuplicateTradesAllowed();
public boolean isVanillaTradesAllowed();
public boolean isEconomyEnabled();
public boolean isCurrencyPhysical();
public Material getToolMaterial();

public Material getCurrencyMaterial();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package online.meinkraft.customvillagertrades.listener;

import org.bukkit.ChatColor;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
Expand Down Expand Up @@ -31,60 +32,127 @@ public void onInventoryClickEvent(InventoryClickEvent event) {
// clicked outside inventory
if(event.getClickedInventory() == null) return;

// economy (money) related logic
if(event.getClickedInventory().getType() == InventoryType.MERCHANT) {
// economy (money) related logic for handling money
if(plugin.isEconomyEnabled()) {

MerchantInventory inventory = (MerchantInventory) event.getClickedInventory();
ItemStack item = inventory.getItem(event.getRawSlot());
InventoryType inventoryType = event.getClickedInventory().getType();

// stop player from clicking money in merchant inventories
if(item != null) {
ItemMeta itemMeta = item.getItemMeta();
if(itemMeta != null) {

PersistentDataContainer itemData = itemMeta.getPersistentDataContainer();
Double money = itemData.get(
NamespacedKey.fromString("money", plugin),
PersistentDataType.DOUBLE
// check for clicking money ingredients in a merchant inventory
if(inventoryType == InventoryType.MERCHANT) {

MerchantInventory inventory = (MerchantInventory) event.getClickedInventory();
ItemStack item = inventory.getItem(event.getRawSlot());

// stop player from clicking money in merchant inventories
if(isItemMoney(item) && !plugin.isCurrencyPhysical()) {

// add result amount to player balance
if(event.getSlotType() == InventoryType.SlotType.RESULT) {

Player player = (Player) event.getWhoClicked();

plugin.getServer().getScheduler().runTask(
plugin,
new RemoveMoneyFromInventoryTask(
plugin,
player.getInventory(),
player
)
);

if(money != null) {

// add result amount to player balance
if(event.getSlotType() == InventoryType.SlotType.RESULT) {

Player player = (Player) event.getWhoClicked();

if(event.getClick() == ClickType.SHIFT_LEFT) {
plugin.getServer().getScheduler().runTask(
plugin,
new RemoveMoneyFromInventoryTask(
plugin,
player.getInventory(),
player
)
);
}
else {
plugin.getServer().getScheduler().runTask(
plugin,
new RemoveMoneyFromHandTask(
plugin,
player
)
);
}
}
else {
event.setCancelled(true);
}
}
}

plugin.getServer().getScheduler().runTask(
plugin,
new RemoveMoneyFromHandTask(
plugin,
player
)
);

}
else {
event.setCancelled(true);
}

}

}

// if money somehow gets into a players inventory, then we need to
// remove it when they click on it if its not physical
else if(inventoryType == InventoryType.PLAYER) {

Player player = (Player) event.getWhoClicked();
ItemStack item = event.getCurrentItem();

Double money = getMoney(item);

if(money != null) {

if(!plugin.isCurrencyPhysical()) {
event.setCancelled(true);

plugin.getServer().getScheduler().runTask(
plugin,
new RemoveMoneyFromInventoryTask(
plugin,
player.getInventory(),
player
)
);
}
else if(event.getClick() == ClickType.DROP) {

event.setCancelled(true);
event.getView().setItem(event.getRawSlot(), null);

double totalAmount = money * item.getAmount();
plugin.getEconomy().depositPlayer(player, totalAmount);
player.sendMessage(
ChatColor.GREEN +
"Deposited " +
plugin.getEconomy().format(totalAmount) +
" into your account"
);

}

}

}
}

}

}
private boolean isItemMoney(ItemStack item) {

if(item == null) return false;
ItemMeta itemMeta = item.getItemMeta();
if(itemMeta == null) return false;

PersistentDataContainer itemData = itemMeta.getPersistentDataContainer();
Double money = itemData.get(
NamespacedKey.fromString("money", plugin),
PersistentDataType.DOUBLE
);

return money != null;

}

private Double getMoney(ItemStack item) {

if(item == null) return null;
ItemMeta itemMeta = item.getItemMeta();
if(itemMeta == null) return null;

PersistentDataContainer itemData = itemMeta.getPersistentDataContainer();
Double money = itemData.get(
NamespacedKey.fromString("money", plugin),
PersistentDataType.DOUBLE
);

return money;

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,13 @@ public InventoryCloseListener(CustomVillagerTrades plugin) {
@EventHandler
public void onInventoryCloseEvent(InventoryCloseEvent event) {

if(event.getView().getTopInventory().getType() == InventoryType.MERCHANT) {
InventoryType inventoryType = event.getView().getTopInventory().getType();

// check for money if currency isn't physical
if(
inventoryType == InventoryType.MERCHANT &&
!plugin.isCurrencyPhysical()
) {

MerchantInventory merchantInventory = (MerchantInventory) event.getView().getTopInventory();
// delete result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,15 +108,16 @@ public void onTradeSelectEvent(TradeSelectEvent event) {
}

// prevent money getting into players inventories
plugin.getServer().getScheduler().runTask(
plugin,
new RemoveMoneyFromInventoryTask(
if(!plugin.isCurrencyPhysical()) {
plugin.getServer().getScheduler().runTask(
plugin,
event.getView().getBottomInventory(),
player
)
);

new RemoveMoneyFromInventoryTask(
plugin,
event.getView().getBottomInventory(),
player
)
);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;

import net.md_5.bungee.api.ChatColor;
import online.meinkraft.customvillagertrades.CustomVillagerTrades;

public class RemoveMoneyFromHandTask implements Runnable {
Expand Down Expand Up @@ -51,7 +52,14 @@ private boolean depositMoney(ItemStack item) {
if(money != null) {

if(plugin.isEconomyEnabled() && player != null) {
plugin.getEconomy().depositPlayer(player, money * item.getAmount());
double totalAmount = money * item.getAmount();
plugin.getEconomy().depositPlayer(player, totalAmount);
player.sendMessage(
ChatColor.GREEN +
"Deposited " +
plugin.getEconomy().format(totalAmount) +
" into your account"
);
}

return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;

import net.md_5.bungee.api.ChatColor;
import online.meinkraft.customvillagertrades.CustomVillagerTrades;

public class RemoveMoneyFromInventoryTask implements Runnable {
Expand Down Expand Up @@ -59,7 +60,14 @@ private boolean depositMoney(ItemStack item) {
if(money != null) {

if(plugin.isEconomyEnabled() && player != null) {
plugin.getEconomy().depositPlayer(player, money * item.getAmount());
double totalAmount = money * item.getAmount();
plugin.getEconomy().depositPlayer(player, totalAmount);
player.sendMessage(
ChatColor.GREEN +
"Deposited " +
plugin.getEconomy().format(totalAmount) +
" into your account"
);
}

return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.bukkit.enchantments.EnchantmentWrapper;
import org.bukkit.entity.Villager;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
Expand Down Expand Up @@ -233,14 +234,23 @@ static public ItemStack toItemStack(CustomVillagerTrades plugin, Map<?, ?> map)
}

ItemStack itemStack = new ItemStack(plugin.getCurrencyMaterial());

// Make item look shiny
itemStack.addUnsafeEnchantment(Enchantment.VANISHING_CURSE, 1);

ItemMeta itemMeta = itemStack.getItemMeta();
PersistentDataContainer data = itemMeta.getPersistentDataContainer();

data.set(new NamespacedKey(plugin, "money"), PersistentDataType.DOUBLE, amount);
itemMeta.setDisplayName(
plugin.getCurrencyPrefix() +
String.format("%,.2f", amount) +
plugin.getCurrencySuffix()
);

// Hide the enchantment details
itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);

itemStack.setItemMeta(itemMeta);
return itemStack;

Expand Down
9 changes: 7 additions & 2 deletions src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,16 @@ tool: CLOCK
# trade
enableEconomy: false

# This will allow players to pick up and carry the money generated in the
# trading windows. They can press the DROP key while hovering over their
# money in their inventory at any time to deposit it into their account
enablePhysicalCurrency: false

# The item that will represent a trade involving your Vault Economy as an
# ingredient or as a result
currencyItem: PAPER

# The strings that goes before and after on the cost on a money item:
# "<currencyPrefix><amount><currencySuffix>"
currencyPrefix: '$'
currencySuffix: ''
currencyPrefix: "$"
currencySuffix: ""

0 comments on commit 74eb1a3

Please sign in to comment.