mirror of
https://github.com/Xiao-MoMi/Custom-Fishing.git
synced 2026-01-04 15:41:35 +00:00
optimized-market
This commit is contained in:
@@ -8,11 +8,10 @@ import dev.jorel.commandapi.arguments.TextArgument;
|
||||
import net.momirealms.customfishing.adventure.AdventureManagerImpl;
|
||||
import net.momirealms.customfishing.api.CustomFishingPlugin;
|
||||
import net.momirealms.customfishing.api.common.Key;
|
||||
import net.momirealms.customfishing.api.util.LogUtils;
|
||||
import net.momirealms.customfishing.mechanic.item.ItemManagerImpl;
|
||||
import net.momirealms.customfishing.setting.Locale;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
@@ -55,7 +54,7 @@ public class ItemCommand {
|
||||
int amount = (int) args.getOrDefault("amount", 1);
|
||||
ItemStack item = CustomFishingPlugin.get().getItemManager().build(player, namespace, id);
|
||||
if (item != null) {
|
||||
int actual = giveCertainAmountOfItem(player, item, amount);
|
||||
int actual = ItemManagerImpl.giveCertainAmountOfItem(player, item, amount);
|
||||
AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, Locale.MSG_Get_Item.replace("{item}", id).replace("{amount}", String.valueOf(actual)));
|
||||
} else {
|
||||
AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, Locale.MSG_Item_Not_Exists);
|
||||
@@ -75,7 +74,7 @@ public class ItemCommand {
|
||||
ItemStack item = CustomFishingPlugin.get().getItemManager().build(players.stream().findAny().get(), namespace, id);
|
||||
if (item != null) {
|
||||
for (Player player : players) {
|
||||
int actual = giveCertainAmountOfItem(player, item, amount);
|
||||
int actual = ItemManagerImpl.giveCertainAmountOfItem(player, item, amount);
|
||||
AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_Give_Item.replace("{item}", id).replace("{amount}", String.valueOf(actual)).replace("{player}", player.getName()));
|
||||
}
|
||||
} else {
|
||||
@@ -83,68 +82,4 @@ public class ItemCommand {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private int giveCertainAmountOfItem(Player player, ItemStack itemStack, int amount) {
|
||||
PlayerInventory inventory = player.getInventory();
|
||||
String metaStr = itemStack.getItemMeta().getAsString();
|
||||
int maxStackSize = itemStack.getMaxStackSize();
|
||||
|
||||
if (amount > maxStackSize * 100) {
|
||||
LogUtils.warn("Detected too many items spawning. Lowering the amount to " + (maxStackSize * 100));
|
||||
amount = maxStackSize * 100;
|
||||
}
|
||||
|
||||
int actualAmount = amount;
|
||||
|
||||
for (ItemStack other : inventory.getStorageContents()) {
|
||||
if (other != null) {
|
||||
if (other.getType() == itemStack.getType() && other.getItemMeta().getAsString().equals(metaStr)) {
|
||||
if (other.getAmount() < maxStackSize) {
|
||||
int delta = maxStackSize - other.getAmount();
|
||||
if (amount > delta) {
|
||||
other.setAmount(maxStackSize);
|
||||
amount -= delta;
|
||||
} else {
|
||||
other.setAmount(amount + other.getAmount());
|
||||
return actualAmount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (amount > 0) {
|
||||
for (ItemStack other : inventory.getStorageContents()) {
|
||||
if (other == null) {
|
||||
if (amount > maxStackSize) {
|
||||
amount -= maxStackSize;
|
||||
ItemStack cloned = itemStack.clone();
|
||||
cloned.setAmount(maxStackSize);
|
||||
inventory.addItem(cloned);
|
||||
} else {
|
||||
ItemStack cloned = itemStack.clone();
|
||||
cloned.setAmount(amount);
|
||||
inventory.addItem(cloned);
|
||||
return actualAmount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (amount > 0) {
|
||||
for (int i = 0; i < amount / maxStackSize; i++) {
|
||||
ItemStack cloned = itemStack.clone();
|
||||
cloned.setAmount(maxStackSize);
|
||||
player.getWorld().dropItem(player.getLocation(), cloned);
|
||||
}
|
||||
int left = amount % maxStackSize;
|
||||
if (left != 0) {
|
||||
ItemStack cloned = itemStack.clone();
|
||||
cloned.setAmount(left);
|
||||
player.getWorld().dropItem(player.getLocation(), cloned);
|
||||
}
|
||||
}
|
||||
|
||||
return actualAmount;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,12 +21,13 @@ import org.bukkit.block.data.type.NoteBlock;
|
||||
import org.bukkit.block.data.type.TurtleEgg;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.*;
|
||||
import org.bukkit.entity.Ageable;
|
||||
import org.bukkit.entity.FallingBlock;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
||||
import org.bukkit.event.entity.ItemSpawnEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
import org.bukkit.util.Vector;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -552,4 +553,68 @@ public class ItemManagerImpl implements ItemManager {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
public static int giveCertainAmountOfItem(Player player, ItemStack itemStack, int amount) {
|
||||
PlayerInventory inventory = player.getInventory();
|
||||
String metaStr = itemStack.getItemMeta().getAsString();
|
||||
int maxStackSize = itemStack.getMaxStackSize();
|
||||
|
||||
if (amount > maxStackSize * 100) {
|
||||
LogUtils.warn("Detected too many items spawning. Lowering the amount to " + (maxStackSize * 100));
|
||||
amount = maxStackSize * 100;
|
||||
}
|
||||
|
||||
int actualAmount = amount;
|
||||
|
||||
for (ItemStack other : inventory.getStorageContents()) {
|
||||
if (other != null) {
|
||||
if (other.getType() == itemStack.getType() && other.getItemMeta().getAsString().equals(metaStr)) {
|
||||
if (other.getAmount() < maxStackSize) {
|
||||
int delta = maxStackSize - other.getAmount();
|
||||
if (amount > delta) {
|
||||
other.setAmount(maxStackSize);
|
||||
amount -= delta;
|
||||
} else {
|
||||
other.setAmount(amount + other.getAmount());
|
||||
return actualAmount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (amount > 0) {
|
||||
for (ItemStack other : inventory.getStorageContents()) {
|
||||
if (other == null) {
|
||||
if (amount > maxStackSize) {
|
||||
amount -= maxStackSize;
|
||||
ItemStack cloned = itemStack.clone();
|
||||
cloned.setAmount(maxStackSize);
|
||||
inventory.addItem(cloned);
|
||||
} else {
|
||||
ItemStack cloned = itemStack.clone();
|
||||
cloned.setAmount(amount);
|
||||
inventory.addItem(cloned);
|
||||
return actualAmount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (amount > 0) {
|
||||
for (int i = 0; i < amount / maxStackSize; i++) {
|
||||
ItemStack cloned = itemStack.clone();
|
||||
cloned.setAmount(maxStackSize);
|
||||
player.getWorld().dropItem(player.getLocation(), cloned);
|
||||
}
|
||||
int left = amount % maxStackSize;
|
||||
if (left != 0) {
|
||||
ItemStack cloned = itemStack.clone();
|
||||
cloned.setAmount(left);
|
||||
player.getWorld().dropItem(player.getLocation(), cloned);
|
||||
}
|
||||
}
|
||||
|
||||
return actualAmount;
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import net.momirealms.customfishing.api.data.EarningData;
|
||||
import net.momirealms.customfishing.api.mechanic.market.MarketGUIHolder;
|
||||
import net.momirealms.customfishing.api.util.InventoryUtils;
|
||||
import net.momirealms.customfishing.api.util.LogUtils;
|
||||
import net.momirealms.customfishing.mechanic.item.ItemManagerImpl;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
@@ -41,12 +42,13 @@ public class MarketGUI {
|
||||
private void init() {
|
||||
int line = 0;
|
||||
for (String content : manager.getLayout()) {
|
||||
if (content.length() != 9) {
|
||||
LogUtils.warn("Please make sure that GUI layout has 9 elements in each row");
|
||||
return;
|
||||
}
|
||||
for (int index = 0; index < 9; index++) {
|
||||
char symbol = content.charAt(index);
|
||||
char symbol;
|
||||
if (index < content.length()) {
|
||||
symbol = content.charAt(index);
|
||||
} else {
|
||||
symbol = ' ';
|
||||
}
|
||||
MarketGUIElement element = itemsCharMap.get(symbol);
|
||||
if (element != null) {
|
||||
element.addSlot(index + line * 9);
|
||||
@@ -178,7 +180,7 @@ public class MarketGUI {
|
||||
for (int slot : itemElement.getSlots()) {
|
||||
ItemStack itemStack = inventory.getItem(slot);
|
||||
if (itemStack != null && itemStack.getType() != Material.AIR) {
|
||||
owner.getInventory().addItem(itemStack);
|
||||
ItemManagerImpl.giveCertainAmountOfItem(owner, itemStack, itemStack.getAmount());
|
||||
inventory.setItem(slot, new ItemStack(Material.AIR));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
package net.momirealms.customfishing.mechanic.market;
|
||||
|
||||
import com.willfp.eco.core.map.MutableListMap;
|
||||
import de.tr7zw.changeme.nbtapi.NBTItem;
|
||||
import net.momirealms.customfishing.api.CustomFishingPlugin;
|
||||
import net.momirealms.customfishing.api.data.EarningData;
|
||||
import net.momirealms.customfishing.api.data.InventoryData;
|
||||
import net.momirealms.customfishing.api.data.user.OnlineUser;
|
||||
import net.momirealms.customfishing.api.manager.MarketManager;
|
||||
import net.momirealms.customfishing.api.mechanic.action.Action;
|
||||
@@ -23,7 +21,10 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.*;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.event.inventory.InventoryDragEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@@ -149,7 +150,7 @@ public class MarketManagerImpl implements MarketManager, Listener {
|
||||
if (event.isCancelled())
|
||||
return;
|
||||
Inventory inventory = event.getInventory();
|
||||
if (!(inventory.getHolder() instanceof MarketGUIHolder holder))
|
||||
if (!(inventory.getHolder() instanceof MarketGUIHolder))
|
||||
return;
|
||||
Player player = (Player) event.getWhoClicked();
|
||||
MarketGUI gui = marketGUIMap.get(player.getUniqueId());
|
||||
@@ -182,7 +183,7 @@ public class MarketManagerImpl implements MarketManager, Listener {
|
||||
if (clickedInv == null)
|
||||
return;
|
||||
Player player = (Player) event.getWhoClicked();
|
||||
if (!(event.getInventory().getHolder() instanceof MarketGUIHolder holder))
|
||||
if (!(event.getInventory().getHolder() instanceof MarketGUIHolder))
|
||||
return;
|
||||
|
||||
MarketGUI gui = marketGUIMap.get(player.getUniqueId());
|
||||
|
||||
Reference in New Issue
Block a user