9
0
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:
XiaoMoMi
2023-09-03 23:39:04 +08:00
parent f7c19a5628
commit 6b5d389559
8 changed files with 85 additions and 92 deletions

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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));
}
}

View File

@@ -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());