Incomplete Database migrations.

Probably going to stick with in memory method for now.
This commit is contained in:
James Peters 2021-12-08 19:58:23 +00:00
parent 816a1eb9cc
commit 23d9fae584
26 changed files with 451 additions and 303 deletions

View File

@ -56,25 +56,25 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>5.5.4.Final</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-compiler-plugin</artifactId>-->
<!-- <version>3.8.1</version>-->
<!-- <configuration>-->
<!-- <annotationProcessorPaths>-->
<!-- <path>-->
<!-- <groupId>org.hibernate</groupId>-->
<!-- <artifactId>hibernate-jpamodelgen</artifactId>-->
<!-- <version>5.5.4.Final</version>-->
<!-- </path>-->
<!-- <path>-->
<!-- <groupId>org.projectlombok</groupId>-->
<!-- <artifactId>lombok</artifactId>-->
<!-- <version>1.18.20</version>-->
<!-- </path>-->
<!-- </annotationProcessorPaths>-->
<!-- </configuration>-->
<!-- </plugin>-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>

View File

@ -23,7 +23,7 @@ public class HibernateUtil {
private static Properties hibernateProperties() {
Properties properties = new Properties();
properties.put(Environment.DRIVER, "org.h2.Driver");
properties.put(Environment.URL, "jdbc:h2:file:"+databaseDirectory.getAbsolutePath()+"/db;AUTO_SERVER=TRUE");
properties.put(Environment.URL, "jdbc:h2:file:"+databaseDirectory.getAbsolutePath()+"/data/database");
properties.put(Environment.USER, "sa");
properties.put(Environment.PASS, "sa");
properties.put(Environment.FORMAT_SQL, "true");

View File

@ -40,6 +40,7 @@
<include>net.wesjd:anvilgui*</include>
<include>org.bstats*:*</include>
<include>com.jamesdpeters.minecraft.chests</include>
<include>com.jamesdpeters*:*</include>
</includes>
</artifactSet>
<relocations>

View File

@ -184,7 +184,6 @@
<classifier>jar-with-dependencies</classifier>
</dependency>
</dependencies>
<!--Tell maven how to prepare and build our jar file from our source and dependancies-->

View File

@ -16,8 +16,9 @@ import com.jamesdpeters.minecraft.chests.misc.Permissions;
import com.jamesdpeters.minecraft.chests.misc.ServerType;
import com.jamesdpeters.minecraft.chests.misc.Stats;
import com.jamesdpeters.minecraft.chests.misc.Utils;
import com.jamesdpeters.minecraft.chests.party.PlayerParty;
//import com.jamesdpeters.minecraft.chests.party.PlayerParty;
import com.jamesdpeters.minecraft.chests.party.PlayerPartyStorage;
import com.jamesdpeters.minecraft.chests.party.PlayerParty_OLD;
import com.jamesdpeters.minecraft.chests.serialize.Config;
import com.jamesdpeters.minecraft.chests.serialize.ConfigStorage;
import com.jamesdpeters.minecraft.chests.serialize.LocationInfo;
@ -83,7 +84,7 @@ public class ChestsPlusPlus extends JavaPlugin {
ConfigurationSerialization.registerClass(RecipeSerializable.class, "Recipe");
ConfigurationSerialization.registerClass(LocationInfo.class, "LocationInfo");
ConfigurationSerialization.registerClass(PlayerPartyStorage.class, "PlayerPartyStorage");
ConfigurationSerialization.registerClass(PlayerParty.class, "PlayerParty");
ConfigurationSerialization.registerClass(PlayerParty_OLD.class, "PlayerParty");
}
@ -137,18 +138,6 @@ public class ChestsPlusPlus extends JavaPlugin {
Utils.fixEntities();
DBUtil.init();
var playerDb = DBUtil.PLAYER;
var partyDb = DBUtil.PARTIES;
var test = playerDb.findPlayer(UUID.fromString("e0e93eb6-2ca4-4ac2-803f-684ce0b69b2c"));
getLogger().info("Original parties: "+test.getOwnedParties());
var party = partyDb.findParty(test, "Test Party 2");
party = party == null ? partyDb.createParty(test, "Test Party 2") : party;
getLogger().info("Found party: "+party);
getLogger().info("Players parties: "+test.getOwnedParties());
//Load storages after load.
Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
@ -163,14 +152,32 @@ public class ChestsPlusPlus extends JavaPlugin {
getServer().getPluginManager().registerEvents(new WorldListener(), this);
Config.getStorageTypes().forEach(storageType -> getServer().getPluginManager().registerEvents(storageType, this));
getLogger().info("Chests++ enabled!");
// Test DB
var playerDb = DBUtil.PLAYER;
var partyDb = DBUtil.PARTIES;
var playerFuture = playerDb.findPlayer(UUID.fromString("e0e93eb6-2ca4-4ac2-803f-684ce0b69b2c"));
playerFuture.thenAccept(player -> {
getLogger().info("Found player: "+player.getOfflinePlayer().getName());
getLogger().info("Original Parties: "+player.getOwnedParties());
var partyName = "Test Party Name 2";
var partyOpt = partyDb.findParty(player, partyName).join();
var party = partyOpt.orElseGet(() -> partyDb.createParty(player, partyName).join());
getLogger().info("Found party: "+party);
getLogger().info("Players parties: "+player.getOwnedParties());
});
}, 1);
}
@Override
public void onDisable() {
super.onDisable();
Config.save();
HibernateUtil.close();
super.onDisable();
// //Remove entities that could have been left behind from bad save files/crashes etc.
// Utils.fixEntities();
}

View File

@ -2,10 +2,10 @@ package com.jamesdpeters.minecraft.chests.commands;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.api.ApiSpecific;
import com.jamesdpeters.minecraft.chests.database.DBUtil;
import com.jamesdpeters.minecraft.chests.maventemplates.BuildConstants;
import com.jamesdpeters.minecraft.chests.menus.PartyMenu;
import com.jamesdpeters.minecraft.chests.misc.Utils;
import com.jamesdpeters.minecraft.chests.party.PartyUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
@ -68,6 +68,11 @@ public class ChestsPlusPlusCommand extends ServerCommand {
return true;
case PARTY:
DBUtil.PLAYER.findPlayer(player).thenAccept(p -> {
sender.sendMessage("Found player: "+p.getOfflinePlayer().getName());
DBUtil.PARTIES.createParty(p, "Test Party");
sender.sendMessage(String.valueOf(p.getOwnedParties()));
});
PartyMenu.getMenu(player).getMenu().open(player);
return true;
@ -93,7 +98,7 @@ public class ChestsPlusPlusCommand extends ServerCommand {
try {
switch (OPTIONS.valueOf(args[0].toUpperCase())) {
case PARTY:
return Stream.of("menu", "create", "invite", "delete", "remove-member", "view-invites", "list").filter(s -> s.contains(args[1])).collect(Collectors.toList());
return Stream.of("menu", "create", "invite", "remove", "remove-member", "view-invites", "list").filter(s -> s.contains(args[1])).collect(Collectors.toList());
}
} catch (IllegalArgumentException ignored) {
}
@ -103,8 +108,8 @@ public class ChestsPlusPlusCommand extends ServerCommand {
switch (OPTIONS.valueOf(args[0].toUpperCase())) {
case PARTY: {
String arg = args[1];
if (arg.equals("delete") || arg.equals("invite") || arg.equals("remove-member")) {
List<String> strings = PartyUtils.getPlayerPartyStorage(player).getOwnedPartiesAsStrings();
if (arg.equals("remove") || arg.equals("invite") || arg.equals("remove-member")) {
List<String> strings = DBUtil.PLAYER.findPlayer(player).join().getOwnedPartyStrings();
return Utils.filterList(strings, args[2]);
}
}

View File

@ -3,7 +3,7 @@ package com.jamesdpeters.minecraft.chests.database;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.database.dao.PlayerDatabase;
import com.jamesdpeters.minecraft.chests.database.dao.PlayerPartyDatabase;
import com.jamesdpeters.minecraft.chests.database.entities.Player;
import com.jamesdpeters.minecraft.chests.database.entities.CppPlayer;
import com.jamesdpeters.minecraft.chests.database.entities.PlayerParty;
import com.jamesdpeters.minecraft.database.hibernate.HibernateUtil;
@ -13,7 +13,7 @@ public class DBUtil {
* ALL HIBERNATE ENTITIES
*/
private final static Class<?>[] entities = {
Player.class,
CppPlayer.class,
PlayerParty.class
};

View File

@ -1,9 +1,13 @@
package com.jamesdpeters.minecraft.database.hibernate;
package com.jamesdpeters.minecraft.chests.database.dao;
import com.jamesdpeters.minecraft.chests.misc.BukkitFuture;
import com.jamesdpeters.minecraft.database.hibernate.HibernateUtil;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Future;
import java.util.function.Consumer;
public class Database<T> {
@ -19,6 +23,10 @@ public class Database<T> {
runTransaction(entityManager -> entityManager.persist(object));
}
public Future<Optional<T>> findEntityAsync(Object id) {
return BukkitFuture.supplyAsync(() -> findEntity(id));
}
public Optional<T> findEntity(Object id) {
return Optional.ofNullable(HibernateUtil.getEntityManager().find(clazz, id));
}
@ -55,6 +63,10 @@ public class Database<T> {
HibernateUtil.getEntityManager().refresh(entity);
}
public void remove(T entity) {
HibernateUtil.getEntityManager().remove(entity);
}
public Class<T> clazz() {
return clazz;
}

View File

@ -1,22 +1,23 @@
package com.jamesdpeters.minecraft.chests.database.dao;
import com.jamesdpeters.minecraft.chests.database.entities.Player;
import com.jamesdpeters.minecraft.database.hibernate.Database;
import com.jamesdpeters.minecraft.chests.database.entities.CppPlayer;
import com.jamesdpeters.minecraft.chests.misc.BukkitFuture;
import org.bukkit.OfflinePlayer;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
public class PlayerDatabase extends Database<Player> {
public class PlayerDatabase extends Database<CppPlayer> {
public PlayerDatabase() {
super(Player.class);
super(CppPlayer.class);
}
public Player findPlayer(UUID uuid) {
return findEntity(uuid).orElseGet(() -> new Player(uuid));
public CompletableFuture<CppPlayer> findPlayer(UUID uuid) {
return BukkitFuture.supplyAsync(() -> findEntity(uuid).orElseGet(() -> new CppPlayer(uuid)));
}
public Player findPlayer(OfflinePlayer player) {
public CompletableFuture<CppPlayer> findPlayer(OfflinePlayer player) {
return findPlayer(player.getUniqueId());
}
}

View File

@ -1,9 +1,13 @@
package com.jamesdpeters.minecraft.chests.database.dao;
import com.jamesdpeters.minecraft.chests.database.DBUtil;
import com.jamesdpeters.minecraft.chests.database.entities.Player;
import com.jamesdpeters.minecraft.chests.database.entities.CppPlayer;
import com.jamesdpeters.minecraft.chests.database.entities.PlayerParty;
import com.jamesdpeters.minecraft.database.hibernate.Database;
import com.jamesdpeters.minecraft.chests.misc.BukkitFuture;
import org.bukkit.OfflinePlayer;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
public class PlayerPartyDatabase extends Database<PlayerParty> {
@ -11,26 +15,96 @@ public class PlayerPartyDatabase extends Database<PlayerParty> {
super(PlayerParty.class);
}
public PlayerParty createParty(Player owner, String name) {
PlayerParty playerParty = findParty(owner, name);
public enum PartyResponse {
NO_PARTY_EXISTS,
MEMBER_NOT_PRESENT,
COMPLETE
}
if (playerParty != null)
return playerParty;
public CompletableFuture<PlayerParty> createParty(CppPlayer owner, String name) {
return BukkitFuture.supplyAsync(() -> createPartyOnThread(owner, name));
}
playerParty = new PlayerParty();
playerParty.setOwner(owner);
playerParty.setName(name);
public CompletableFuture<PlayerParty> createParty(OfflinePlayer owner, String name) {
return BukkitFuture.supplyAsync(() -> {
var ownerPlayer = DBUtil.PLAYER.findPlayer(owner).join();
return createPartyOnThread(ownerPlayer, name);
});
}
public CompletableFuture<Boolean> deleteParty(CppPlayer owner, String name) {
return BukkitFuture.supplyAsync(() -> deletePartyOnThread(owner, name));
}
public CompletableFuture<Optional<PlayerParty>> findParty(CppPlayer owner, String name) {
return BukkitFuture.supplyAsync(() -> findPartyOnThread(owner, name));
}
public CompletableFuture<Optional<PlayerParty>> findParty(OfflinePlayer owner, String name) {
return BukkitFuture.supplyAsync(() -> {
var ownerPlayer = DBUtil.PLAYER.findPlayer(owner).join();
return findPartyOnThread(ownerPlayer, name);
});
}
public CompletableFuture<PartyResponse> removePlayerFromParty(OfflinePlayer owner, String partyName, OfflinePlayer playerToRemove) {
return BukkitFuture.supplyAsync(() -> {
var ownerPlayer = DBUtil.PLAYER.findPlayer(owner).join();
var party = ownerPlayer.getParty(partyName);
if (party.isPresent()) {
var p = party.get();
var didRemove = p.removeMember(playerToRemove);
if (didRemove) {
DBUtil.PLAYER.saveEntity(ownerPlayer);
}
return didRemove ? PartyResponse.COMPLETE : PartyResponse.MEMBER_NOT_PRESENT;
}
return PartyResponse.NO_PARTY_EXISTS;
});
}
/* *******************
* MAIN THREAD METHODS
* *******************/
private Optional<PlayerParty> findPartyOnThread(CppPlayer owner, String name) {
var query = getQuery("from PlayerParty where owner.playerUUID = :ownerId and name = :name");
query.setParameter("ownerId", owner.getPlayerUUID());
query.setParameter("name", name);
query.setMaxResults(1);
var results = query.getResultList();
if (results.size() == 1)
return Optional.of(results.get(0));
return Optional.empty();
}
private PlayerParty createPartyOnThread(CppPlayer owner, String name) {
var playerPartyOptional = findPartyOnThread(owner, name);
var playerParty = playerPartyOptional.orElseGet(() -> {
var party = new PlayerParty();
party.setOwner(owner);
party.setName(name);
return party;
});
saveEntity(playerParty);
DBUtil.PLAYER.refresh(owner);
return playerParty;
}
public PlayerParty findParty(Player owner, String name) {
var query = getQuery("from PlayerParty where owner.playerUUID = :ownerId and name = :name");
query.setParameter("ownerId", owner.getPlayerUUID());
query.setParameter("name", name);
return query.getSingleResult();
private boolean deletePartyOnThread(CppPlayer owner, String name) {
var playerPartyOptional = findPartyOnThread(owner, name);
if (playerPartyOptional.isPresent()) {
var playerParty = playerPartyOptional.get();
DBUtil.PARTIES.remove(playerParty);
DBUtil.PLAYER.refresh(owner);
}
return false;
}
public void deleteParty(PlayerParty party) {
DBUtil.PARTIES.remove(party);
DBUtil.PLAYER.refresh(party.getOwner());
}
}

View File

@ -0,0 +1,74 @@
package com.jamesdpeters.minecraft.chests.database.entities;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.Objects.nonNull;
@Entity
@Getter
@ToString
@NoArgsConstructor
@Table(name = "Player")
public class CppPlayer {
public CppPlayer(UUID uuid) {
playerUUID = uuid;
}
@Id
private UUID playerUUID;
@JoinColumn(name = "cpp_player_player_uuid")
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@ToString.Exclude
private Set<PlayerParty> ownedParties = new HashSet<>();
@ManyToMany(mappedBy = "members", cascade = CascadeType.ALL)
@ToString.Exclude
private Set<PlayerParty> playerParties = new HashSet<>();
public OfflinePlayer getOfflinePlayer() {
return Bukkit.getOfflinePlayer(playerUUID);
}
public String getName() {
return getOfflinePlayer().getName();
}
public Optional<PlayerParty> getParty(String partyName) {
return nonNull(playerParties)
? playerParties.stream().filter(playerParty -> playerParty.getName().equals(partyName)).findFirst()
: Optional.empty();
}
public Set<PlayerParty> getAllParties() {
return Stream.concat(ownedParties.stream(), playerParties.stream()).collect(Collectors.toSet());
}
public boolean isMemberOfParty(OfflinePlayer player) {
return playerParties.stream().anyMatch(playerParty -> playerParty.isMember(player));
}
public List<String> getOwnedPartyStrings() {
return ownedParties.stream().map(PlayerParty::getName).collect(Collectors.toList());
}
}

View File

@ -1,40 +0,0 @@
package com.jamesdpeters.minecraft.chests.database.entities;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import java.util.List;
import java.util.UUID;
@Entity
@Getter
@ToString
@NoArgsConstructor
public class Player {
public Player(UUID uuid) {
playerUUID = uuid;
}
@Id
private UUID playerUUID;
@OneToMany(mappedBy = "owner")
@ToString.Exclude
private List<PlayerParty> ownedParties;
@ManyToMany(mappedBy = "members")
@ToString.Exclude
private List<PlayerParty> playerParties;
public OfflinePlayer getOfflinePlayer() {
return Bukkit.getOfflinePlayer(playerUUID);
}
}

View File

@ -4,17 +4,22 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.bukkit.OfflinePlayer;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
@Entity
@Getter
@ -34,10 +39,29 @@ public class PlayerParty {
private String name;
@JoinColumn(nullable = false)
@ManyToOne(optional = false)
private Player owner;
@ManyToOne(cascade = CascadeType.ALL, optional = false)
private CppPlayer owner;
@ManyToMany
@JoinTable(name = "PLAYER_PARTY_CPP_PLAYER",
joinColumns = @JoinColumn(name = "PLAYER_PARTY_ID"),
inverseJoinColumns = @JoinColumn(name = "CPP_PLAYER_ID"))
@ManyToMany(cascade = {CascadeType.ALL})
@ToString.Exclude
private List<Player> members;
private Set<CppPlayer> members = new HashSet<>();
public boolean removeMember(OfflinePlayer player) {
return members.removeIf(p -> p.getPlayerUUID().equals(player.getUniqueId()));
}
public boolean addMember(CppPlayer player) {
return members.add(player);
}
public Set<OfflinePlayer> getBukkitMembers() {
return members.stream().map(CppPlayer::getOfflinePlayer).collect(Collectors.toSet());
}
public boolean isMember(OfflinePlayer player) {
return owner.getOfflinePlayer() == player || members.stream().anyMatch(cppPlayer -> cppPlayer.getOfflinePlayer() == player);
}
}

View File

@ -50,7 +50,7 @@ public class InvitesMenu implements InventoryProvider {
for (PartyInvite invite : PartyUtils.getPartyInvites(player)){
// Pass through click to the menus onPlayerSelect function.
ItemStack inviteBook = ItemBuilder.getInstance(Material.ENCHANTED_BOOK).setName(invite.getParty().getPartyName()).get();
ItemStack inviteBook = ItemBuilder.getInstance(Material.ENCHANTED_BOOK).setName(invite.getParty().getName()).get();
ClickableItem clickableItem = ClickableItem.from(inviteBook, itemClickData -> onPlayerSelect.accept(invite, menu));
itemList.add(clickableItem);
}

View File

@ -21,6 +21,7 @@ import org.bukkit.inventory.ItemStack;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
public class PartyMenu implements InventoryProvider {
@ -137,7 +138,7 @@ public class PartyMenu implements InventoryProvider {
return;
}
TextInputUI.getInput(player, Message.PARTY_ENTER_NAME.getString(), (p, partyName) -> {
boolean result = PartyUtils.createParty(player, partyName);
var result = PartyUtils.createParty(player, partyName).join();
if (result){
player.sendMessage(ChatColor.GREEN+ Message.PARTY_CREATED.getString(ChatColor.WHITE+partyName+ChatColor.GREEN));
getMenu().open(player);
@ -155,8 +156,8 @@ public class PartyMenu implements InventoryProvider {
return;
}
PartySelectorMenu.open(player, getMenu(), PartySelectorMenu.Type.OWNED, (party, menu) -> {
List<OfflinePlayer> inviteablePlayers = Utils.getOnlinePlayersNotInList(party.getMembers());
inviteablePlayers.remove(party.getOwner());
Set<OfflinePlayer> inviteablePlayers = Utils.getOnlinePlayersNotInList(party.getBukkitMembers());
inviteablePlayers.remove(party.getOwner().getOfflinePlayer());
PlayerSelectorMenu.open(player, Message.PARTY_INVITE_PLAYER.getString(), menu, inviteablePlayers, (player1, itemStack) -> itemStack, (playerToInvite, menu2) -> {
PartyUtils.invitePlayer(party, playerToInvite);
getMenu().open(player);
@ -166,7 +167,7 @@ public class PartyMenu implements InventoryProvider {
public void removePlayer(Player player) {
PartySelectorMenu.open(player, getMenu(), PartySelectorMenu.Type.OWNED, (party, menu) -> {
PlayerSelectorMenu.open(player, Message.PARTY_REMOVE_PLAYER.getString(), menu, party.getMembers(), (player1, itemStack) -> itemStack, (selectedPlayer, menu2) -> {
PlayerSelectorMenu.open(player, Message.PARTY_REMOVE_PLAYER.getString(), menu, party.getBukkitMembers(), (player1, itemStack) -> itemStack, (selectedPlayer, menu2) -> {
AcceptDialogMenu.open(player, Message.PARTY_REMOVE_PLAYER_DIALOG.getString(selectedPlayer.getName()), Message.YES.getString(), Message.NO.getString(), aBoolean -> {
if (aBoolean) {
party.removeMember(selectedPlayer);
@ -179,10 +180,10 @@ public class PartyMenu implements InventoryProvider {
public void listParties(Player player) {
PartySelectorMenu.open(player, getMenu(), PartySelectorMenu.Type.ALL, (party, smartInventory) -> {
PlayerSelectorMenu.open(player, Message.PARTY_MEMBERS.getString(party.getPartyName()), smartInventory, party.getAllPlayers(),
PlayerSelectorMenu.open(player, Message.PARTY_MEMBERS.getString(party.getName()), smartInventory, party.getBukkitMembers(),
// Change player head to enchanted if owner.
(offlinePlayer, itemStack) -> {
if (party.getOwner().getUniqueId().equals(offlinePlayer.getUniqueId())) return ItemBuilder.fromInstance(itemStack).addLore(Message.PARTY_OWNER.getString()).get();
if (party.getOwner().getPlayerUUID().equals(offlinePlayer.getUniqueId())) return ItemBuilder.fromInstance(itemStack).addLore(Message.PARTY_OWNER.getString()).get();
return itemStack;
} ,
(playerSelected, smartInventory1) -> {
@ -193,14 +194,14 @@ public class PartyMenu implements InventoryProvider {
public void deleteParty(Player player) {
PartySelectorMenu.open(player, getMenu(), PartySelectorMenu.Type.OWNED, (party, smartInventory) -> {
AcceptDialogMenu.open(player, Message.PARTY_DELETE.getString(party.getPartyName()), Message.YES.getString(), Message.NO.getString(), aBoolean -> {
AcceptDialogMenu.open(player, Message.PARTY_DELETE.getString(party.getName()), Message.YES.getString(), Message.NO.getString(), aBoolean -> {
// If user accepts
if (aBoolean) {
boolean result = PartyUtils.deleteParty(party);
if (result) {
player.sendMessage(ChatColor.GREEN + Message.PARTY_DELETED.getString(ChatColor.WHITE + party.getPartyName() + ChatColor.GREEN));
player.sendMessage(ChatColor.GREEN + Message.PARTY_DELETED.getString(ChatColor.WHITE + party.getName() + ChatColor.GREEN));
} else {
player.sendMessage(ChatColor.RED+Message.PARTY_DOESNT_EXIST.getString(ChatColor.WHITE+party.getPartyName()+ChatColor.RED));
player.sendMessage(ChatColor.RED+Message.PARTY_DOESNT_EXIST.getString(ChatColor.WHITE+party.getName()+ChatColor.RED));
}
// Call deleteParty() to refresh party list.
deleteParty(player);
@ -218,7 +219,7 @@ public class PartyMenu implements InventoryProvider {
return;
}
InvitesMenu.open(player, getMenu(), (invite, smartInventory) -> {
AcceptDialogMenu.open(player, Message.PARTY_JOIN.getString(invite.getParty().getOwner().getName(), invite.getParty().getPartyName()), Message.YES.getString(), Message.NO.getString(), aBoolean -> {
AcceptDialogMenu.open(player, Message.PARTY_JOIN.getString(invite.getParty().getOwner().getName(), invite.getParty().getName()), Message.YES.getString(), Message.NO.getString(), aBoolean -> {
if (aBoolean) {
PartyUtils.acceptInvite(player, invite);
getMenu().open(player);
@ -232,7 +233,7 @@ public class PartyMenu implements InventoryProvider {
public void leaveParty(Player player) {
PartySelectorMenu.open(player, getMenu(), PartySelectorMenu.Type.MEMBER_OF, (party, smartInventory) -> {
AcceptDialogMenu.open(player, Message.PARTY_LEAVE.getString(party.getPartyName()), Message.YES.getString(), Message.NO.getString(), aBoolean -> {
AcceptDialogMenu.open(player, Message.PARTY_LEAVE.getString(party.getName()), Message.YES.getString(), Message.NO.getString(), aBoolean -> {
if (aBoolean) {
party.removeMember(player);
}

View File

@ -1,9 +1,9 @@
package com.jamesdpeters.minecraft.chests.menus;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.database.DBUtil;
import com.jamesdpeters.minecraft.chests.database.entities.PlayerParty;
import com.jamesdpeters.minecraft.chests.misc.ItemBuilder;
import com.jamesdpeters.minecraft.chests.party.PartyUtils;
import com.jamesdpeters.minecraft.chests.party.PlayerParty;
import fr.minuskube.inv.ClickableItem;
import fr.minuskube.inv.SmartInventory;
import fr.minuskube.inv.content.InventoryContents;
@ -16,6 +16,7 @@ import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
public class PartySelectorMenu implements InventoryProvider {
@ -62,7 +63,7 @@ public class PartySelectorMenu implements InventoryProvider {
// Pass through click to the menus onPlayerSelect function.
ItemStack partyBook = ItemBuilder
.getInstance(Material.ENCHANTED_BOOK)
.setName(playerParty.getPartyName())
.setName(playerParty.getName())
.addLore("Owner: "+playerParty.getOwner().getName())
.get();
ClickableItem clickableItem = ClickableItem.from(partyBook, itemClickData -> onPlayerSelect.accept(playerParty, menu));
@ -109,16 +110,12 @@ public class PartySelectorMenu implements InventoryProvider {
return menu;
}
private List<PlayerParty> getParties(OfflinePlayer player) {
switch (type) {
case ALL:
return PartyUtils.getPlayerPartyStorage(player).getAllParties();
case OWNED:
return PartyUtils.getPlayerPartyStorage(player).getOwnedPartiesList();
case MEMBER_OF:
return PartyUtils.getPlayerPartyStorage(player).getPartiesMemberOf();
default:
return new ArrayList<>();
}
private Set<PlayerParty> getParties(OfflinePlayer player) {
var cppPlayer = DBUtil.PLAYER.findPlayer(player).join();
return switch (type) {
case ALL -> cppPlayer.getAllParties();
case OWNED -> cppPlayer.getOwnedParties();
case MEMBER_OF -> cppPlayer.getPlayerParties();
};
}
}

View File

@ -14,6 +14,7 @@ import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
@ -22,7 +23,7 @@ public class PlayerSelectorMenu implements InventoryProvider {
private final SmartInventory menu;
BiConsumer<OfflinePlayer, SmartInventory> onPlayerSelect;
BiFunction<OfflinePlayer, ItemStack, ItemStack> onPlayerHeadCreation;
private List<OfflinePlayer> players;
private Set<OfflinePlayer> players;
private int lastPage; // Store the last page the player was on.
private SmartInventory previousInv;
@ -37,7 +38,7 @@ public class PlayerSelectorMenu implements InventoryProvider {
//menu.setInsertable(true);
}
public static void open(Player player, String title, SmartInventory previousInv, List<OfflinePlayer> players, BiFunction<OfflinePlayer, ItemStack, ItemStack> onPlayerHeadCreation, BiConsumer<OfflinePlayer, SmartInventory> onPlayerSelect) {
public static void open(Player player, String title, SmartInventory previousInv, Set<OfflinePlayer> players, BiFunction<OfflinePlayer, ItemStack, ItemStack> onPlayerHeadCreation, BiConsumer<OfflinePlayer, SmartInventory> onPlayerSelect) {
PlayerSelectorMenu playerSelectorMenu = new PlayerSelectorMenu(title);
playerSelectorMenu.players = players;
playerSelectorMenu.onPlayerHeadCreation = onPlayerHeadCreation;

View File

@ -0,0 +1,19 @@
package com.jamesdpeters.minecraft.chests.misc;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import org.bukkit.Bukkit;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
/**
* CompleteableFuture that runs the {@link #thenAccept(Consumer)} method on the Bukkit main thread.
* @param <T>
*/
public class BukkitFuture<T> extends CompletableFuture<T> {
@Override
public CompletableFuture<Void> thenAccept(Consumer<? super T> action) {
return super.thenAccept(t -> Bukkit.getScheduler().runTask(ChestsPlusPlus.PLUGIN, () -> action.accept(t)));
}
}

View File

@ -37,6 +37,7 @@ import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.stream.Collectors;
@ -338,13 +339,11 @@ public class Utils {
}
}
public static List<OfflinePlayer> getOnlinePlayersNotInList(List<OfflinePlayer> players) {
List<OfflinePlayer> list = new ArrayList<>();
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
if (!players.contains(onlinePlayer)){
list.add(onlinePlayer);
}
}
return list;
public static Set<OfflinePlayer> getOnlinePlayersNotInList(Set<OfflinePlayer> players) {
return Bukkit.getOnlinePlayers()
.stream()
.filter(player -> !players.contains(player))
.collect(Collectors.toSet());
}
}

View File

@ -1,5 +1,7 @@
package com.jamesdpeters.minecraft.chests.party;
import com.jamesdpeters.minecraft.chests.database.entities.CppPlayer;
import com.jamesdpeters.minecraft.chests.database.entities.PlayerParty;
import com.jamesdpeters.minecraft.chests.lang.Message;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
@ -7,26 +9,27 @@ import org.bukkit.entity.Player;
public class PartyInvite {
OfflinePlayer owner, player;
CppPlayer owner, player;
PlayerParty party;
boolean pending;
public PartyInvite(OfflinePlayer owner, OfflinePlayer player, PlayerParty party) {
public PartyInvite(CppPlayer owner, CppPlayer player, PlayerParty party) {
this.owner = owner;
this.player = player;
this.party = party;
}
public void sendInvite() {
Player onlinePlayer = player.getPlayer();
OfflinePlayer offlinePlayer = player.getOfflinePlayer();
Player onlinePlayer = player.getOfflinePlayer().getPlayer();
if(onlinePlayer != null) {
onlinePlayer.sendMessage(ChatColor.GREEN+Message.PARTY_INVITE.getString(ChatColor.WHITE+player.getName()+ChatColor.GREEN, ChatColor.WHITE+party.getPartyName()+ChatColor.GREEN));
onlinePlayer.sendMessage(ChatColor.GREEN+Message.PARTY_INVITE.getString(ChatColor.WHITE+ player.getName()+ChatColor.GREEN, ChatColor.WHITE+party.getName()+ChatColor.GREEN));
String tellraw = "tellraw @p {\"text\":\""+Message.PARTY_ACCEPT_INVITE.getString()+"\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/c++ party view-invites\"}}";
onlinePlayer.performCommand(tellraw);
}
Player onlineOwner = owner.getPlayer();
Player onlineOwner = owner.getOfflinePlayer().getPlayer();
if (onlineOwner != null){
onlineOwner.sendMessage(ChatColor.GREEN+Message.PARTY_INVITE_OWNER.getString(ChatColor.WHITE+player.getName()+ChatColor.GREEN, ChatColor.WHITE+party.getPartyName()+ChatColor.GREEN));
onlineOwner.sendMessage(ChatColor.GREEN+Message.PARTY_INVITE_OWNER.getString(ChatColor.WHITE+ player.getName()+ChatColor.GREEN, ChatColor.WHITE+party.getName()+ChatColor.GREEN));
}
pending = true;
}
@ -34,9 +37,9 @@ public class PartyInvite {
public void acceptInvite(){
if (pending){
party.addMember(player);
Player onlinePlayer = player.getPlayer();
Player onlinePlayer = player.getOfflinePlayer().getPlayer();
if (onlinePlayer != null){
onlinePlayer.sendMessage(ChatColor.GREEN+Message.PARTY_JOINED.getString(ChatColor.WHITE+owner.getName()+ChatColor.GREEN, ChatColor.WHITE+party.getPartyName()+ChatColor.GREEN));
onlinePlayer.sendMessage(ChatColor.GREEN+Message.PARTY_JOINED.getString(ChatColor.WHITE+owner.getName()+ChatColor.GREEN, ChatColor.WHITE+party.getName()+ChatColor.GREEN));
}
pending = false;
}

View File

@ -1,15 +1,18 @@
package com.jamesdpeters.minecraft.chests.party;
import com.jamesdpeters.minecraft.chests.database.DBUtil;
import com.jamesdpeters.minecraft.chests.database.dao.PlayerDatabase;
import com.jamesdpeters.minecraft.chests.database.dao.PlayerPartyDatabase;
import com.jamesdpeters.minecraft.chests.database.entities.PlayerParty;
import com.jamesdpeters.minecraft.chests.lang.Message;
import com.jamesdpeters.minecraft.chests.serialize.Config;
import org.bukkit.ChatColor;
import com.jamesdpeters.minecraft.chests.misc.BukkitFuture;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
public class PartyUtils {
@ -18,7 +21,10 @@ public class PartyUtils {
PARTY_CREATED
}
// Stores party invites sent to this player.
private static final PlayerPartyDatabase partyDb = DBUtil.PARTIES;
private static final PlayerDatabase playerDb = DBUtil.PLAYER;
// Stores party invites sent to this cppPlayer.
// Only stored in memory
private static final HashMap<UUID, List<PartyInvite>> partyInvites = new HashMap<>();
@ -33,24 +39,23 @@ public class PartyUtils {
}
/**
* Invites a player to the owners given party. The last pending invite is overwritten.
* Invites a cppPlayer to the owners given party. The last pending invite is overwritten.
* @param owner
* @param playerToInvite
* @param partyName
*/
public static void invitePlayer(OfflinePlayer owner, OfflinePlayer playerToInvite, String partyName){
PlayerPartyStorage storage = getPlayerPartyStorage(owner);
PlayerParty party = storage.getOwnedParties().get(partyName);
if (party == null){
Player onlineOwner = owner.getPlayer();
if(onlineOwner != null) {
onlineOwner.sendMessage(Message.PARTY_DOESNT_EXIST.getString(partyName));
playerDb.findPlayer(owner).thenAccept(player -> {
var party = player.getParty(partyName);
if (party.isPresent()) {
invitePlayer(party.get(), playerToInvite);
} else {
var onlinePlayer = owner.getPlayer();
if (onlinePlayer != null) {
onlinePlayer.sendMessage(Message.PARTY_DOESNT_EXIST.getString(partyName));
}
}
return;
}
invitePlayer(party, playerToInvite);
});
}
private static void addPlayerInvite(OfflinePlayer player, PartyInvite invite) {
@ -59,28 +64,28 @@ public class PartyUtils {
}
public static void invitePlayer(PlayerParty party, OfflinePlayer playerToInvite) {
PartyInvite invite = new PartyInvite(party.getOwner(), playerToInvite, party);
addPlayerInvite(playerToInvite, invite);
invite.sendInvite();
playerDb.findPlayer(playerToInvite).thenAccept(player -> {
PartyInvite invite = new PartyInvite(party.getOwner(), player, party);
addPlayerInvite(playerToInvite, invite);
invite.sendInvite();
});
}
public static void removePlayer(OfflinePlayer owner, OfflinePlayer playerToRemove, String partyName){
PlayerPartyStorage storage = getPlayerPartyStorage(owner);
PlayerParty party = storage.getOwnedParties().get(partyName);
if (party == null){
Player onlineOwner = owner.getPlayer();
if(onlineOwner != null) {
onlineOwner.sendMessage(Message.PARTY_DOESNT_EXIST.getString(partyName));
}
return;
}
party.removeMember(playerToRemove);
partyDb
.removePlayerFromParty(owner, partyName, playerToRemove)
.thenAccept(partyResponse -> {
var onlinePlayer = owner.getPlayer();
if (onlinePlayer != null) {
if (partyResponse == PlayerPartyDatabase.PartyResponse.NO_PARTY_EXISTS) {
onlinePlayer.sendMessage(Message.PARTY_DOESNT_EXIST.getString(partyName));
}
}
});
}
/**
* Accepts the current pending invite for this player.
* Accepts the current pending invite for this cppPlayer.
* @param player
*/
public static void acceptInvite(OfflinePlayer player, PartyInvite invite){
@ -105,49 +110,19 @@ public class PartyUtils {
* @param partyName
* @return false if party already exists.
*/
public static boolean createParty(OfflinePlayer owner, String partyName){
PlayerPartyStorage storage = getPlayerPartyStorage(owner);
public static CompletableFuture<Boolean> createParty(OfflinePlayer owner, String partyName){
return BukkitFuture.supplyAsync(() -> {
var party = DBUtil.PARTIES.findParty(owner, partyName).join();
if (party.isPresent())
return false;
// Check if party already exists.
if (storage.getOwnedParties().containsKey(partyName)) return false;
storage.getOwnedParties().put(partyName, new PlayerParty(owner, partyName));
return true;
}
public static boolean deleteParty(OfflinePlayer owner, String partyName){
HashMap<String, PlayerPartyStorage> map = Config.getStore().parties;
PlayerPartyStorage storage = map.get(owner.getUniqueId().toString());
if (storage == null) {
storage = new PlayerPartyStorage(owner);
map.put(owner.getUniqueId().toString(), storage);
}
// Check if party already exists.
if (!storage.getOwnedParties().containsKey(partyName)) {
Player onlineOwner = owner.getPlayer();
if (onlineOwner != null) {
onlineOwner.sendMessage(ChatColor.RED + Message.PARTY_DOESNT_EXIST.getString(partyName));
}
return false;
}
// Remove party
storage.getOwnedParties().remove(partyName);
return true;
DBUtil.PARTIES.createParty(owner, partyName);
return true;
});
}
public static boolean deleteParty(PlayerParty party){
return deleteParty(party.getOwner(), party.getPartyName());
}
public static PlayerPartyStorage getPlayerPartyStorage(OfflinePlayer owner) {
HashMap<String, PlayerPartyStorage> map = Config.getStore().parties;
PlayerPartyStorage storage = map.get(owner.getUniqueId().toString());
if (storage == null){
storage = new PlayerPartyStorage(owner);
map.put(owner.getUniqueId().toString(), storage);
}
return storage;
DBUtil.PARTIES.remove(party);
return true;
}
}

View File

@ -1,16 +1,12 @@
package com.jamesdpeters.minecraft.chests.party;
import com.jamesdpeters.minecraft.chests.serialize.Config;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.SerializableAs;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@ -18,7 +14,7 @@ import java.util.UUID;
public class PlayerPartyStorage implements ConfigurationSerializable {
private OfflinePlayer owner;
private HashMap<String, PlayerParty> ownedParties;
private HashMap<String, PlayerParty_OLD> ownedParties;
public PlayerPartyStorage(OfflinePlayer owner){
this.owner = owner;
@ -30,7 +26,7 @@ public class PlayerPartyStorage implements ConfigurationSerializable {
UUID ownerUUID = UUID.fromString((String) map.get("owner"));
owner = Bukkit.getOfflinePlayer(ownerUUID);
ownedParties = (HashMap<String, PlayerParty>) map.get("ownedParties");
ownedParties = (HashMap<String, PlayerParty_OLD>) map.get("ownedParties");
if (ownedParties == null) ownedParties = new HashMap<>();
}
@ -41,68 +37,68 @@ public class PlayerPartyStorage implements ConfigurationSerializable {
map.put("ownedParties", ownedParties);
return map;
}
/**
* Checks the owners parties to see if the given player is a member.
*/
public static boolean doPlayersShareParty(OfflinePlayer owner, OfflinePlayer player){
PlayerPartyStorage storage = Config.getStore().parties.get(owner.getUniqueId().toString());
if (storage != null){
for (PlayerParty ownedParty : storage.ownedParties.values()) {
if (ownedParty.getMembers().contains(player)) return true;
}
}
return false;
}
public OfflinePlayer getOwner() {
return owner;
}
public HashMap<String, PlayerParty> getOwnedParties() {
return ownedParties;
}
public List<PlayerParty> getOwnedPartiesList() {
return new ArrayList<>(ownedParties.values());
}
public Collection<PlayerParty> getOwnedPartiesCollection() {
return ownedParties.values();
}
public List<String> getOwnedPartiesAsStrings(){
List<String> strings = new ArrayList<>();
ownedParties.values().forEach(party -> strings.add(party.getPartyName()));
return strings;
}
/**
* Returns a List of Parties this player is a member of, not including their owned parties.
* @return
*/
public List<PlayerParty> getPartiesMemberOf() {
// Create list containing all owned parties
List<PlayerParty> parties = new ArrayList<>();
Config.getStore().parties.values().forEach(playerPartyStorage -> {
playerPartyStorage.getOwnedPartiesCollection().forEach(party -> {
if (party.isMember(getOwner())) parties.add(party);
});
});
return parties;
}
/**
* Returns ALL parties this player is a member of;.
* @return
*/
public List<PlayerParty> getAllParties() {
// Create list containing all owned parties
List<PlayerParty> parties = getPartiesMemberOf();
parties.addAll(getOwnedPartiesCollection());
return parties;
}
//
// /**
// * Checks the owners parties to see if the given cppPlayer is a member.
// */
// public static boolean doPlayersShareParty(OfflinePlayer owner, OfflinePlayer player){
// PlayerPartyStorage storage = Config.getStore().parties.get(owner.getUniqueId().toString());
// if (storage != null){
// for (PlayerParty_OLD ownedParty : storage.ownedParties.values()) {
// if (ownedParty.getMembers().contains(player)) return true;
// }
// }
// return false;
// }
//
// public OfflinePlayer getOwner() {
// return owner;
// }
//
// public HashMap<String, PlayerParty_OLD> getOwnedParties() {
// return ownedParties;
// }
//
// public List<PlayerParty_OLD> getOwnedPartiesList() {
// return new ArrayList<>(ownedParties.values());
// }
//
// public Collection<PlayerParty_OLD> getOwnedPartiesCollection() {
// return ownedParties.values();
// }
//
// public List<String> getOwnedPartiesAsStrings(){
// List<String> strings = new ArrayList<>();
// ownedParties.values().forEach(party -> strings.add(party.getPartyName()));
// return strings;
// }
//
// /**
// * Returns a List of Parties this cppPlayer is a member of, not including their owned parties.
// * @return
// */
// public List<PlayerParty_OLD> getPartiesMemberOf() {
// // Create list containing all owned parties
// List<PlayerParty_OLD> parties = new ArrayList<>();
//
// Config.getStore().parties.values().forEach(playerPartyStorage -> {
// playerPartyStorage.getOwnedPartiesCollection().forEach(party -> {
// if (party.isMember(getOwner())) parties.add(party);
// });
// });
//
// return parties;
// }
//
// /**
// * Returns ALL parties this cppPlayer is a member of;.
// * @return
// */
// public List<PlayerParty_OLD> getAllParties() {
// // Create list containing all owned parties
// List<PlayerParty_OLD> parties = getPartiesMemberOf();
// parties.addAll(getOwnedPartiesCollection());
//
// return parties;
// }
}

View File

@ -13,7 +13,7 @@ import java.util.Map;
import java.util.UUID;
@SerializableAs("PlayerParty")
public class PlayerParty implements ConfigurationSerializable {
public class PlayerParty_OLD implements ConfigurationSerializable {
private OfflinePlayer owner;
private UUID ownerUUID;
@ -21,7 +21,7 @@ public class PlayerParty implements ConfigurationSerializable {
private List<OfflinePlayer> members;
private ArrayList<String> memberUUIDs;
public PlayerParty(OfflinePlayer owner, String partyName) {
public PlayerParty_OLD(OfflinePlayer owner, String partyName) {
this.owner = owner;
this.ownerUUID = owner.getUniqueId();
this.partyName = partyName;
@ -29,7 +29,7 @@ public class PlayerParty implements ConfigurationSerializable {
}
@SuppressWarnings("unchecked")
public PlayerParty(Map<String, Object> map){
public PlayerParty_OLD(Map<String, Object> map){
ownerUUID = UUID.fromString((String) map.get("owner"));
owner = Bukkit.getOfflinePlayer(ownerUUID);

View File

@ -115,7 +115,7 @@ public class Config {
File legacyFile = getLegacyFile();
if (!legacyFile.exists()) return;
ChestsPlusPlus.PLUGIN.getLogger().info("Found a Legacy config! Converting to new data-format and moving to: /plugins/ChestsPlusPlus/data/storage.yml");
ChestsPlusPlus.PLUGIN.getLogger().info("If you are having issues with data-loss the plugin may not have permissions to delete the legacy file 'chests.yml'");
ChestsPlusPlus.PLUGIN.getLogger().info("If you are having issues with data-loss the plugin may not have permissions to remove the legacy file 'chests.yml'");
try {
Path path = Paths.get(legacyFile.toURI());

View File

@ -2,10 +2,10 @@ package com.jamesdpeters.minecraft.chests.storage.abstracts;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.api.ApiSpecific;
import com.jamesdpeters.minecraft.chests.database.DBUtil;
import com.jamesdpeters.minecraft.chests.misc.Permissions;
import com.jamesdpeters.minecraft.chests.misc.Utils;
import com.jamesdpeters.minecraft.chests.misc.Values;
import com.jamesdpeters.minecraft.chests.party.PlayerPartyStorage;
import com.jamesdpeters.minecraft.chests.serialize.LocationInfo;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@ -352,7 +352,7 @@ public abstract class AbstractStorage implements ConfigurationSerializable {
public boolean hasPermission(OfflinePlayer player) {
if (isPublic) return true;
if (player.getUniqueId().equals(playerUUID)) return true;
if (PlayerPartyStorage.doPlayersShareParty(getOwner(), player)) return true;
if (DBUtil.PLAYER.findPlayer(player).join().isMemberOfParty(player)) return true;
if (members != null) {
for (String uuid : members) {
if (player.getUniqueId().toString().equals(uuid)) return true;

View File

@ -2,10 +2,10 @@ package com.jamesdpeters.minecraft.chests.storage.abstracts;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.database.DBUtil;
import com.jamesdpeters.minecraft.chests.misc.Messages;
import com.jamesdpeters.minecraft.chests.misc.Utils;
import com.jamesdpeters.minecraft.chests.misc.Values;
import com.jamesdpeters.minecraft.chests.party.PartyUtils;
import com.jamesdpeters.minecraft.chests.serialize.Config;
import com.jamesdpeters.minecraft.chests.serialize.ConfigStorage;
import com.jamesdpeters.minecraft.chests.serialize.LocationInfo;
@ -145,7 +145,7 @@ public abstract class StorageType<T extends AbstractStorage> implements Listener
public List<T> getStorageMemberOf(Player player) {
return getMap().entrySet().stream().flatMap(map -> map.getValue().values().stream().filter(storage -> {
if (PartyUtils.getPlayerPartyStorage(storage.getOwner()).getOwnedPartiesCollection().stream().anyMatch(party -> party.isMember(player))) return true; // Uses party to match.
if (DBUtil.PLAYER.findPlayer(player).join().getAllParties().stream().anyMatch(party -> party.isMember(player))) return true; // Uses party to match.
if (storage.isPublic()) return false;
if (storage.getOwner().getUniqueId().equals(player.getUniqueId())) return false;