mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2024-11-25 12:15:12 +01:00
Fix team management and ranks
This commit is contained in:
parent
56481ac6d0
commit
37b43b6cc1
@ -13,6 +13,7 @@ import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
@ -1016,8 +1017,9 @@ public class Island implements DataObject, MetaDataAble {
|
||||
* @param playerUUID - uuid of player
|
||||
*/
|
||||
public void removeMember(UUID playerUUID) {
|
||||
BentoBox.getInstance().logDebug("removeMember - island ");
|
||||
if (members.remove(playerUUID) != null) {
|
||||
BentoBox.getInstance().logDebug("removeMember");
|
||||
BentoBox.getInstance().logDebug("removeMember done");
|
||||
setChanged();
|
||||
}
|
||||
}
|
||||
@ -1237,20 +1239,34 @@ public class Island implements DataObject, MetaDataAble {
|
||||
* @param rank rank value
|
||||
* @since 1.1
|
||||
*/
|
||||
public void setRank(@Nullable UUID uuid, int rank) {
|
||||
public void setRank(@Nullable UUID uuid, int newRank) {
|
||||
// Early return if the UUID is null, to avoid unnecessary processing.
|
||||
if (uuid == null) {
|
||||
return; // Defensive code
|
||||
return;
|
||||
}
|
||||
members.compute(uuid, (key, value) -> {
|
||||
if (value == null || !value.equals(rank)) {
|
||||
setChanged(); // Call setChanged only if the value is updated.
|
||||
BentoBox.getInstance().logDebug("Set rank for " + uuid + " to " + rank);
|
||||
return rank;
|
||||
|
||||
// Use an AtomicBoolean to track if the member's rank has been changed.
|
||||
AtomicBoolean isRankChanged = new AtomicBoolean(false);
|
||||
|
||||
// Attempt to update the member's rank, if necessary.
|
||||
members.compute(uuid, (key, existingRank) -> {
|
||||
// If the member does not exist or their rank is different, update the rank.
|
||||
if (existingRank == null || existingRank != newRank) {
|
||||
isRankChanged.set(true);
|
||||
return newRank; // Update the rank.
|
||||
}
|
||||
return value;
|
||||
// No change needed; return the existing rank.
|
||||
return existingRank;
|
||||
});
|
||||
|
||||
// If the rank was changed, notify the change and log the update.
|
||||
if (isRankChanged.get()) {
|
||||
setChanged(); // Notify that a change has occurred.
|
||||
BentoBox.getInstance().logDebug("Set rank for UUID " + uuid + " to " + newRank);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param ranks the ranks to set
|
||||
*/
|
||||
@ -2060,8 +2076,9 @@ public class Island implements DataObject, MetaDataAble {
|
||||
* @param userID user UUID
|
||||
*/
|
||||
public void removePrimary(UUID userID) {
|
||||
BentoBox.getInstance().logDebug("Removing primary ");
|
||||
if (getPrimaries().remove(userID)) {
|
||||
BentoBox.getInstance().logDebug("removePrimary");
|
||||
BentoBox.getInstance().logDebug("removePrimary done");
|
||||
setChanged();
|
||||
}
|
||||
}
|
||||
@ -2127,9 +2144,6 @@ public class Island implements DataObject, MetaDataAble {
|
||||
return Objects.hash(uniqueId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Islands are equal if they have the same uniqueId
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
@ -2142,4 +2156,5 @@ public class Island implements DataObject, MetaDataAble {
|
||||
return Objects.equals(uniqueId, other.uniqueId);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -508,7 +508,6 @@ public class IslandsManager {
|
||||
if (island.getOwner() == null) {
|
||||
// No owner, no rank settings
|
||||
island.setMaxMembers(null);
|
||||
BentoBox.getInstance().logDebug("getMaxMembers no owner, no rank settings");
|
||||
updateIsland(island);
|
||||
return 0;
|
||||
}
|
||||
@ -533,7 +532,6 @@ public class IslandsManager {
|
||||
Integer change = islandMax == worldDefault ? null : islandMax;
|
||||
if (island.getMaxMembers().get(rank) != change) {
|
||||
island.setMaxMembers(rank, change);
|
||||
BentoBox.getInstance().logDebug("getMaxMembers");
|
||||
updateIsland(island);
|
||||
}
|
||||
return islandMax;
|
||||
@ -576,7 +574,6 @@ public class IslandsManager {
|
||||
Integer change = islandMax == plugin.getIWM().getMaxHomes(island.getWorld()) ? null : islandMax;
|
||||
if (island.getMaxHomes() != change) {
|
||||
island.setMaxHomes(change);
|
||||
BentoBox.getInstance().logDebug("getMaxHomes");
|
||||
updateIsland(island);
|
||||
}
|
||||
return islandMax;
|
||||
@ -768,7 +765,6 @@ public class IslandsManager {
|
||||
public boolean setHomeLocation(@Nullable Island island, Location location, String name) {
|
||||
if (island != null && (island.getHome(name) == null || !island.getHome(name).equals(location))) {
|
||||
island.addHome(name, location);
|
||||
BentoBox.getInstance().logDebug("setHomeLocation");
|
||||
updateIsland(island);
|
||||
return true;
|
||||
}
|
||||
|
@ -56,24 +56,51 @@ public class IslandCache {
|
||||
|
||||
/**
|
||||
* Replace the island we have with this one
|
||||
* @param island island
|
||||
* @param newIsland island
|
||||
*/
|
||||
public void updateIsland(@NonNull Island island) {
|
||||
if (islandsByLocation.put(island.getCenter(), island) == null) {
|
||||
BentoBox.getInstance().logDebug("islandsByLocation failed to update");
|
||||
public void updateIsland(@NonNull Island newIsland) {
|
||||
// Get the old island
|
||||
Island oldIsland = islandsById.get(newIsland.getUniqueId());
|
||||
Set<UUID> newMembers = newIsland.getMembers().keySet();
|
||||
if (oldIsland != null) {
|
||||
Set<UUID> oldMembers = oldIsland.getMembers().keySet();
|
||||
// Remove any members who are not in the new island
|
||||
for (UUID oldMember : oldMembers) {
|
||||
if (!newMembers.contains(oldMember)) {
|
||||
BentoBox.getInstance().logDebug("Removing a member from the team " + oldMember);
|
||||
// Member has been removed - remove island
|
||||
if (islandsByUUID.computeIfAbsent(oldMember, k -> new HashSet<>()).remove(oldIsland)) {
|
||||
BentoBox.getInstance().logDebug("removed");
|
||||
} else {
|
||||
BentoBox.getInstance().logDebug("not removed!");
|
||||
}
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (islandsById.put(island.getUniqueId(), island) == null) {
|
||||
// Update the members with the new island object
|
||||
BentoBox.getInstance().logDebug("Updating island. New members are:");
|
||||
newMembers.forEach(BentoBox.getInstance()::logDebug);
|
||||
for (UUID newMember : newMembers) {
|
||||
Set<Island> set = islandsByUUID.computeIfAbsent(newMember, k -> new HashSet<>());
|
||||
if (set.remove(oldIsland)) {
|
||||
BentoBox.getInstance().logDebug("removed old island for " + newMember);
|
||||
} else {
|
||||
BentoBox.getInstance().logDebug("Did not remove old island for " + newMember);
|
||||
}
|
||||
set.add(newIsland);
|
||||
BentoBox.getInstance().logDebug("Added island to set");
|
||||
islandsByUUID.put(newMember, set);
|
||||
}
|
||||
|
||||
if (islandsByLocation.put(newIsland.getCenter(), newIsland) == null) {
|
||||
BentoBox.getInstance().logDebug("islandsByLocation failed to update");
|
||||
|
||||
}
|
||||
if (islandsById.put(newIsland.getUniqueId(), newIsland) == null) {
|
||||
BentoBox.getInstance().logDebug("islandsById failed to update");
|
||||
}
|
||||
|
||||
// Only add islands to this map if they are owned
|
||||
if (island.getOwner() != null) {
|
||||
Set<Island> set = islandsByUUID.computeIfAbsent(island.getOwner(), k -> new HashSet<>());
|
||||
if (!set.remove(island)) {
|
||||
BentoBox.getInstance().logDebug("islandsByUUID failed to remove");
|
||||
}
|
||||
set.add(island);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -192,17 +219,22 @@ public class IslandCache {
|
||||
@Nullable
|
||||
public Island get(@NonNull World world, @NonNull UUID uuid) {
|
||||
List<Island> islands = getIslands(world, uuid);
|
||||
BentoBox.getInstance().logDebug("Getting islands for " + uuid + " and there are " + islands.size());
|
||||
if (islands.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
for (Island island : islands) {
|
||||
if (island.isPrimary(uuid)) {
|
||||
BentoBox.getInstance().logDebug("Primary island found");
|
||||
island.getMembers().keySet().forEach(BentoBox.getInstance()::logDebug);
|
||||
return island;
|
||||
}
|
||||
}
|
||||
BentoBox.getInstance().logDebug("No Primary island set");
|
||||
// If there is no primary set, then set one - it doesn't matter which.
|
||||
Island result = islands.iterator().next();
|
||||
result.setPrimary(uuid);
|
||||
result.getMembers().keySet().forEach(BentoBox.getInstance()::logDebug);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -347,6 +379,7 @@ public class IslandCache {
|
||||
* @param uuid uuid of member to remove
|
||||
*/
|
||||
public void removePlayer(@NonNull Island island, @NonNull UUID uuid) {
|
||||
BentoBox.getInstance().logDebug("Removing the player " + uuid);
|
||||
Set<Island> islandSet = islandsByUUID.get(uuid);
|
||||
if (islandSet != null) {
|
||||
islandSet.remove(island);
|
||||
|
Loading…
Reference in New Issue
Block a user