2.18.3 -> moved main auction lists over to concurrent hashmaps instead.

This commit is contained in:
Kiran Hart 2021-07-06 12:58:23 -04:00
parent efaf934499
commit d12b1ece28
10 changed files with 67 additions and 49 deletions

View File

@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>ca.tweetzy</groupId>
<artifactId>auctionhouse</artifactId>
<version>2.18.2</version>
<version>2.18.3</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

View File

@ -35,7 +35,7 @@ public class AuctionPlayer {
}
public List<AuctionItem> getItems(boolean getExpired) {
return AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().stream().filter(item -> item.getOwner().equals(this.player.getUniqueId()) && !AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().contains(item) && item.isExpired() == getExpired).collect(Collectors.toList());
return AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().values().stream().filter(item -> item.getOwner().equals(this.player.getUniqueId()) && !AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().contains(item) && item.isExpired() == getExpired).collect(Collectors.toList());
}
public void resetFilter() {

View File

@ -2,19 +2,15 @@ package ca.tweetzy.auctionhouse.commands;
import ca.tweetzy.auctionhouse.AuctionHouse;
import ca.tweetzy.auctionhouse.api.AuctionAPI;
import ca.tweetzy.auctionhouse.auction.AuctionItem;
import ca.tweetzy.auctionhouse.helpers.MaterialCategorizer;
import ca.tweetzy.auctionhouse.settings.Settings;
import ca.tweetzy.core.commands.AbstractCommand;
import ca.tweetzy.core.compatibility.XMaterial;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.inventory.ItemStack;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
/**
* The current file has been created by Kiran Hart
@ -34,15 +30,19 @@ public class CommandAdmin extends AbstractCommand {
switch (args[0].toLowerCase()) {
case "endall":
AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().forEach(item -> item.setExpired(true));
for (UUID id : AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().keySet()) {
AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().get(id).setExpired(true);
}
AuctionHouse.getInstance().getLocale().getMessage("general.endedallauctions").sendPrefixedMessage(sender);
break;
case "relistall":
int relistTime = args.length == 1 ? Settings.DEFAULT_AUCTION_TIME.getInt() : Integer.parseInt(args[1]);
AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().stream().filter(AuctionItem::isExpired).forEach(item -> {
item.setRemainingTime(relistTime);
item.setExpired(false);
});
for (UUID id : AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().keySet()) {
if (AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().get(id).isExpired()) {
AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().get(id).setRemainingTime(relistTime);
AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().get(id).setExpired(false);
}
}
AuctionHouse.getInstance().getLocale().getMessage("general.relisteditems").sendPrefixedMessage(sender);
break;
case "cleanunknownusers":
@ -54,11 +54,12 @@ public class CommandAdmin extends AbstractCommand {
AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().clear();
case "clean":
// Don't tell ppl that this exists
AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().forEach(item -> {
if (AuctionAPI.getInstance().deserializeItem(item.getRawItem()) == null || XMaterial.isAir(XMaterial.matchXMaterial(AuctionAPI.getInstance().deserializeItem(item.getRawItem())))) {
AuctionHouse.getInstance().getAuctionItemManager().sendToGarbage(item);
for (UUID id : AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().keySet()) {
ItemStack deserialize = AuctionAPI.getInstance().deserializeItem(AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().get(id).getRawItem());
if (deserialize == null || XMaterial.isAir(XMaterial.matchXMaterial(deserialize))) {
AuctionHouse.getInstance().getAuctionItemManager().sendToGarbage(AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().get(id));
}
});
}
break;
}

View File

@ -23,11 +23,10 @@ public class CommandStatus extends AbstractCommand {
@Override
protected ReturnType runCommand(CommandSender sender, String... args) {
AuctionHouse.newChain().async(() -> {
List<AuctionItem> items = AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems();
int totalItems = items.size();
int activeItems = (int) items.stream().filter(item -> !item.isExpired()).count();
int expiredItems = (int) items.stream().filter(AuctionItem::isExpired).count();
int totalItems = AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().size();
int activeItems = (int) AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().values().stream().filter(item -> !item.isExpired()).count();
int expiredItems = (int) AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().values().stream().filter(AuctionItem::isExpired).count();
int totalTransactions = AuctionHouse.getInstance().getTransactionManager().getTransactions().size();
sender.sendMessage(TextUtils.formatText("&eAuction House Statistics"));

View File

@ -9,6 +9,7 @@ import ca.tweetzy.core.commands.AbstractCommand;
import ca.tweetzy.core.utils.TextUtils;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@ -45,7 +46,7 @@ public class CommandUpload extends AbstractCommand {
AuctionHouse.getInstance().getData().set("transactions", null);
AuctionHouse.getInstance().getData().save();
AuctionHouse.getInstance().getDataManager().saveItems(AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems(), true);
AuctionHouse.getInstance().getDataManager().saveItems(new ArrayList<>(AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().values()), true);
AuctionHouse.getInstance().getDataManager().saveTransactions(AuctionHouse.getInstance().getTransactionManager().getTransactions(), true);
AuctionHouse.getInstance().getLocale().newMessage(TextUtils.formatText("&aLoaded file items/transactions and saved them to the database.")).sendPrefixedMessage(sender);

View File

@ -69,7 +69,17 @@ public class GUIAuctionHouse extends Gui {
private void drawItems() {
AuctionHouse.newChain().asyncFirst(() -> {
this.items = new ArrayList<>(AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems()).stream().filter(item -> !item.isExpired() && item.getRemainingTime() >= 1 && !AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().contains(item)).collect(Collectors.toList());
// this.items = new ArrayList<>(AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems()).stream().filter(item -> !item.isExpired() && item.getRemainingTime() >= 1 && !AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().contains(item)).collect(Collectors.toList());
this.items = new ArrayList<>();
for (Map.Entry<UUID, AuctionItem> entry : AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().entrySet()) {
AuctionItem auctionItem = entry.getValue();
if (!auctionItem.isExpired() && auctionItem.getRemainingTime() >= 1 && !AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().containsKey(auctionItem.getKey())) {
this.items.add(auctionItem);
}
}
if (this.searchPhrase != null && this.searchPhrase.length() != 0) {
this.items = this.items.stream().filter(item -> checkSearchCriteria(this.searchPhrase, item)).collect(Collectors.toList());
}

View File

@ -84,7 +84,8 @@ public class GUIConfirmPurchase extends Gui {
// Re-select the item to ensure that it's available
try {
// if the item is in the garbage then just don't continue
if (AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().stream().anyMatch(items -> items.getKey().equals(this.auctionItem.getKey()))) return;
if (AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().containsKey(this.auctionItem.getKey()))
return;
AuctionItem located = AuctionHouse.getInstance().getAuctionItemManager().getItem(this.auctionItem.getKey());
preItemChecks(e, located);
@ -138,6 +139,7 @@ public class GUIConfirmPurchase extends Gui {
AuctionHouse.getInstance().getTransactionManager().removeAllRelatedPlayers(auctionItem.getKey());
player.closeInventory();
});
e.gui.close();
} catch (ItemNotFoundException exception) {
AuctionHouse.getInstance().getLogger().info("Tried to purchase item that was bought, or does not exist");
}

View File

@ -8,6 +8,7 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
@ -19,35 +20,34 @@ import java.util.stream.Collectors;
public class AuctionItemManager {
private final ArrayList<AuctionItem> auctionItems = new ArrayList<>();
private final Set<AuctionItem> garbageBin = new HashSet<>();
private final ConcurrentHashMap<UUID, AuctionItem> auctionItems = new ConcurrentHashMap<>();
private final ConcurrentHashMap<UUID, AuctionItem> garbageBin = new ConcurrentHashMap<>();
public void addItem(AuctionItem auctionItem) {
if (auctionItem == null) return;
this.auctionItems.add(auctionItem);
this.auctionItems.put(auctionItem.getKey(), auctionItem);
}
public void sendToGarbage(AuctionItem auctionItem) {
if (auctionItem == null) return;
this.garbageBin.add(auctionItem);
this.garbageBin.put(auctionItem.getKey(), auctionItem);
}
public void removeUnknownOwnerItems() {
List<UUID> knownOfflinePlayers = Arrays.stream(Bukkit.getOfflinePlayers()).map(OfflinePlayer::getUniqueId).collect(Collectors.toList());
this.auctionItems.removeIf(item -> !knownOfflinePlayers.contains(item.getOwner()));
this.auctionItems.keySet().removeIf(id -> !knownOfflinePlayers.contains(id));
}
public AuctionItem getItem(UUID uuid) {
return this.auctionItems.stream().filter(item -> item.getKey().equals(uuid)).findFirst().orElse(null);
return this.auctionItems.getOrDefault(uuid, null);
}
public List<AuctionItem> getAuctionItems() {
public ConcurrentHashMap<UUID, AuctionItem> getAuctionItems() {
return this.auctionItems;
}
public Set<AuctionItem> getGarbageBin() {
return garbageBin;
public ConcurrentHashMap<UUID, AuctionItem> getGarbageBin() {
return this.garbageBin;
}
public void loadItems(boolean useDatabase) {
@ -67,9 +67,9 @@ public class AuctionItemManager {
public void saveItems(boolean useDatabase, boolean async) {
if (useDatabase) {
AuctionHouse.getInstance().getDataManager().saveItems(getAuctionItems(), async);
AuctionHouse.getInstance().getDataManager().saveItems(new ArrayList<>(this.getAuctionItems().values()), async);
} else {
this.adjustItemsInFile(this.getAuctionItems());
this.adjustItemsInFile(new ArrayList<>(this.getAuctionItems().values()));
}
}

View File

@ -6,6 +6,7 @@ import lombok.Getter;
import org.bukkit.inventory.ItemStack;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* The current file has been created by Kiran Hart
@ -17,14 +18,13 @@ import java.util.*;
@Getter
public class AuctionPlayerManager {
private final ArrayList<AuctionPlayer> auctionPlayers = new ArrayList<>();
private final ConcurrentHashMap<UUID, AuctionPlayer> auctionPlayers = new ConcurrentHashMap<>();
private final HashMap<UUID, ItemStack> sellHolding = new HashMap<>();
private final HashMap<UUID, Long> cooldowns = new HashMap<>();
public void addPlayer(AuctionPlayer auctionPlayer) {
if (auctionPlayer == null) return;
if (this.auctionPlayers.stream().anyMatch(player -> player.getPlayer().getUniqueId().equals(auctionPlayer.getPlayer().getUniqueId()))) return;
this.auctionPlayers.add(auctionPlayer);
this.auctionPlayers.put(auctionPlayer.getPlayer().getUniqueId(), auctionPlayer);
}
public void addItemToSellHolding(UUID uuid, ItemStack itemStack) {
@ -37,15 +37,15 @@ public class AuctionPlayerManager {
}
public void removePlayer(UUID uuid) {
this.auctionPlayers.removeIf(player -> player.getPlayer().getUniqueId().equals(uuid));
this.auctionPlayers.remove(uuid);
}
public AuctionPlayer getPlayer(UUID uuid) {
return this.auctionPlayers.stream().filter(item -> item.getPlayer().getUniqueId().equals(uuid)).findFirst().orElse(null);
return this.auctionPlayers.getOrDefault(uuid, null);
}
public List<AuctionPlayer> getAuctionPlayers() {
return Collections.unmodifiableList(auctionPlayers);
public ConcurrentHashMap<UUID, AuctionPlayer> getAuctionPlayers() {
return this.auctionPlayers;
}
public void addCooldown(UUID uuid) {

View File

@ -13,6 +13,9 @@ import org.bukkit.OfflinePlayer;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* The current file has been created by Kiran Hart
@ -36,14 +39,15 @@ public class TickAuctionsTask extends BukkitRunnable {
@Override
public void run() {
// check if the auction stack even has items
Iterator<AuctionItem> auctionItemIterator = AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().listIterator();
Set<Map.Entry<UUID, AuctionItem>> entrySet = AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems().entrySet();
Iterator<Map.Entry<UUID, AuctionItem>> auctionItemIterator = entrySet.iterator();
while (auctionItemIterator.hasNext()) {
AuctionItem auctionItem = auctionItemIterator.next();
Map.Entry<UUID, AuctionItem> entry = auctionItemIterator.next();
AuctionItem auctionItem = entry.getValue();
if (AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().contains(auctionItem)) {
AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().remove(auctionItem);
if (AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().containsKey(auctionItem.getKey())) {
AuctionHouse.getInstance().getAuctionItemManager().getGarbageBin().remove(auctionItem.getKey());
auctionItemIterator.remove();
continue;
}
@ -83,6 +87,7 @@ public class TickAuctionsTask extends BukkitRunnable {
}
if (auctionWinner.isOnline()) {
assert auctionWinner.getPlayer() != null;
AuctionHouse.getInstance().getLocale().getMessage("auction.bidwon")
.processPlaceholder("item", WordUtils.capitalizeFully(AuctionAPI.getInstance().deserializeItem(auctionItem.getRawItem()).getType().name().replace("_", " ")))
.processPlaceholder("amount", AuctionAPI.getInstance().deserializeItem(auctionItem.getRawItem()).getAmount())