From 8711c9ec0fceab1d77ee4b0f1d4a73f8b96febeb Mon Sep 17 00:00:00 2001 From: Jules Date: Tue, 28 Oct 2025 23:06:58 +0100 Subject: [PATCH] Improved compatibility with plugin 'Parties' --- .../mmocore/api/player/PlayerData.java | 2 + .../mmocore/manager/social/PartyManager.java | 2 +- .../Indyuce/mmocore/party/PartyModule.java | 2 +- .../net/Indyuce/mmocore/party/PartyUtils.java | 44 +++++---- .../party/compat/DungeonsXLPartyModule.java | 6 +- .../party/compat/McMMOPartyModule.java | 6 +- .../party/compat/PartiesPartyModule.java | 90 +++++++++++++------ .../Indyuce/mmocore/party/provided/Party.java | 4 +- 8 files changed, 103 insertions(+), 53 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 7337a3e2..b2fa08d9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -38,6 +38,7 @@ import net.Indyuce.mmocore.gui.skilltree.NodeIncrementResult; import net.Indyuce.mmocore.guild.provided.Guild; import net.Indyuce.mmocore.manager.data.OfflinePlayerData; import net.Indyuce.mmocore.party.AbstractParty; +import net.Indyuce.mmocore.party.PartyUtils; import net.Indyuce.mmocore.party.provided.MMOCorePartyModule; import net.Indyuce.mmocore.party.provided.Party; import net.Indyuce.mmocore.player.ClassDataContainer; @@ -217,6 +218,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD this.setupSkillTrees(); this.applyTemporaryTriggers(); this.getStats().updateStats(); + PartyUtils.resolvePartyBonuses(this); // In case buffs not removed on logoff getMMOPlayerData().getProfileSession().addOpenCallback(session -> this.onProfileSessionReady()); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/social/PartyManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/social/PartyManager.java index f7c3cc98..2c32f9b8 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/social/PartyManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/social/PartyManager.java @@ -41,7 +41,7 @@ public class PartyManager implements MMOCoreManager { if (clearBefore) for (PlayerData playerData : PlayerData.getAll()) { AbstractParty party = MMOCore.plugin.partyModule.getParty(playerData); - if (party != null) PartyUtils.updateStatBonuses(playerData, party.countMembers()); + if (party != null) PartyUtils.applyStatBonuses(playerData, party.countMembers()); } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/PartyModule.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/PartyModule.java index 393b3041..cf8ef516 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/PartyModule.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/PartyModule.java @@ -11,7 +11,7 @@ public interface PartyModule { @Deprecated default void applyStatBonuses(PlayerData player, int memberCount) { - PartyUtils.updateStatBonuses(player, memberCount); + PartyUtils.applyStatBonuses(player, memberCount); } @Deprecated diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/PartyUtils.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/PartyUtils.java index aa9459f0..a142cd2a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/PartyUtils.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/PartyUtils.java @@ -10,24 +10,36 @@ import java.util.UUID; public class PartyUtils { @Deprecated - public static void applyStatBonuses(PlayerData playerData, int memberCount) { - updateStatBonuses(playerData, memberCount); + public static void updateStatBonuses(PlayerData playerData, int ignored) { + resolvePartyBonuses(playerData); } - /** - * Applies party stat bonuses to a specific player - */ - public static void updateStatBonuses(@NotNull PlayerData player, int memberCount) { - if (memberCount <= 1) clearStatBonuses(player); + public static void resolvePartyBonuses(@NotNull PlayerData playerData) { + final var party = MMOCore.plugin.partyModule.getParty(playerData); + if (party == null) clearStatBonuses(playerData); + else applyStatBonuses(playerData, party.countMembers()); + } + + public static void applyStatBonuses(@NotNull UUID playerId, int memberCount) { + final var playerData = MMOPlayerData.getOrNull(playerId); + if (playerData != null) applyStatBonuses(playerData, memberCount); + } + + public static void applyStatBonuses(@NotNull PlayerData playerData, int memberCount) { + applyStatBonuses(playerData.getMMOPlayerData(), memberCount); + } + + public static void applyStatBonuses(@NotNull MMOPlayerData playerData, int memberCount) { + if (memberCount < 2) clearStatBonuses(playerData); else for (var buff : MMOCore.plugin.partyManager.getBonuses()) - buff.multiply(memberCount - 1).register(player.getMMOPlayerData()); + buff.multiply(memberCount - 1).register(playerData); } - /** - * Clear party stat bonuses from a player - */ - public static void clearStatBonuses(@NotNull PlayerData player) { - var playerData = player.getMMOPlayerData(); + public static void clearStatBonuses(@NotNull PlayerData playerData) { + clearStatBonuses(playerData.getMMOPlayerData()); + } + + public static void clearStatBonuses(@NotNull MMOPlayerData playerData) { MMOCore.plugin.partyManager.getBonuses().forEach(buff -> buff.unregister(playerData)); } @@ -46,9 +58,7 @@ public class PartyUtils { * @param playerUuid UUID of player supposedly offline */ public static void clearStatBonuses(@NotNull UUID playerUuid) { - if (MMOPlayerData.has(playerUuid)) { - var playerData = MMOPlayerData.get(playerUuid); - MMOCore.plugin.partyManager.getBonuses().forEach(buff -> buff.unregister(playerData)); - } + final var playerData = MMOPlayerData.getOrNull(playerUuid); + if (playerData != null) clearStatBonuses(playerData); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/DungeonsXLPartyModule.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/DungeonsXLPartyModule.java index e863f425..5d2ab4ca 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/DungeonsXLPartyModule.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/DungeonsXLPartyModule.java @@ -35,9 +35,9 @@ public class DungeonsXLPartyModule implements PartyModule, Listener { public void onPlayerJoin(GroupPlayerJoinEvent event) { //We add 1 because this returns the members of the group excluding the player that just joined. int membersSize = event.getGroup().getMembers().size() + 1; - PartyUtils.updateStatBonuses(PlayerData.get(event.getPlayer().getPlayer()), membersSize); + PartyUtils.applyStatBonuses(PlayerData.get(event.getPlayer().getPlayer()), membersSize); event.getGroup().getMembers().getOnlinePlayers() - .forEach(p -> PartyUtils.updateStatBonuses(PlayerData.get(p), membersSize)); + .forEach(p -> PartyUtils.applyStatBonuses(PlayerData.get(p), membersSize)); } @EventHandler @@ -48,7 +48,7 @@ public class DungeonsXLPartyModule implements PartyModule, Listener { PartyUtils.clearStatBonuses(event.getPlayer().getUniqueId()); event.getGroup().getMembers().getOnlinePlayers() - .forEach(p -> PartyUtils.updateStatBonuses(PlayerData.get(p), membersSize)); + .forEach(p -> PartyUtils.applyStatBonuses(PlayerData.get(p), membersSize)); } @EventHandler diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/McMMOPartyModule.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/McMMOPartyModule.java index 313fabdb..9a2ce536 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/McMMOPartyModule.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/McMMOPartyModule.java @@ -44,8 +44,8 @@ public class McMMOPartyModule implements PartyModule, Listener { int membersSize = party.getMembers().size(); if(membersSize!=1 || party.getOnlineMembers().get(0)!=event.getPlayer()) { party.getOnlineMembers() - .forEach(p -> PartyUtils.updateStatBonuses(PlayerData.get(p), membersSize+1)); - PartyUtils.updateStatBonuses(PlayerData.get(event.getPlayer()), membersSize+1); + .forEach(p -> PartyUtils.applyStatBonuses(PlayerData.get(p), membersSize+1)); + PartyUtils.applyStatBonuses(PlayerData.get(event.getPlayer()), membersSize+1); } } } @@ -56,7 +56,7 @@ public class McMMOPartyModule implements PartyModule, Listener { //This is the size of the party before the player leaves=> we decrement it by 1. int membersSize = party.getMembers().size() - 1; party.getOnlineMembers() - .forEach(p -> PartyUtils.updateStatBonuses(PlayerData.get(p), membersSize)); + .forEach(p -> PartyUtils.applyStatBonuses(PlayerData.get(p), membersSize)); // Try to clear stat bonuses from player leaving PartyUtils.clearStatBonuses(event.getPlayer().getUniqueId()); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/PartiesPartyModule.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/PartiesPartyModule.java index c3de3ff6..2fe961a2 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/PartiesPartyModule.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/compat/PartiesPartyModule.java @@ -1,11 +1,13 @@ package net.Indyuce.mmocore.party.compat; import com.alessiodp.parties.api.Parties; +import com.alessiodp.parties.api.events.bukkit.party.BukkitPartiesPartyPostCreateEvent; +import com.alessiodp.parties.api.events.bukkit.party.BukkitPartiesPartyPostDeleteEvent; import com.alessiodp.parties.api.events.bukkit.player.BukkitPartiesPlayerPostJoinEvent; -import com.alessiodp.parties.api.events.bukkit.player.BukkitPartiesPlayerPreLeaveEvent; -import com.alessiodp.parties.api.interfaces.PartiesAPI; +import com.alessiodp.parties.api.events.bukkit.player.BukkitPartiesPlayerPostLeaveEvent; import com.alessiodp.parties.api.interfaces.Party; import com.alessiodp.parties.api.interfaces.PartyPlayer; +import io.lumine.mythic.lib.util.Tasks; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.party.AbstractParty; @@ -15,6 +17,7 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -29,46 +32,81 @@ public class PartiesPartyModule implements PartyModule, Listener { @Nullable @Override public AbstractParty getParty(PlayerData playerData) { - PartiesAPI api = Parties.getApi(); - PartyPlayer partyPlayer = api.getPartyPlayer(playerData.getUniqueId()); - Party party = api.getParty(partyPlayer.getPartyId()); - return party == null ? null : new CustomParty(party); + final var api = Parties.getApi(); + final var partyPlayer = api.getPartyPlayer(playerData.getUniqueId()); + final var partyId = partyPlayer.getPartyId(); + if (partyId == null) return null; + + Party party = api.getParty(partyId); + return party == null ? null : new PartyImpl(party); } @EventHandler - public void onPlayerJoin(BukkitPartiesPlayerPostJoinEvent event) { - // !!! async event !!! - Bukkit.getScheduler().runTask(MMOCore.plugin, () -> { - final var memberCount = event.getParty().getMembers().size(); - event.getParty().getOnlineMembers().forEach(member -> { - final var playerData = PlayerData.get(member.getPlayerUUID()); - PartyUtils.updateStatBonuses(playerData, memberCount); - }); + public void onPartyCreate(BukkitPartiesPartyPostCreateEvent event) { + + // Should be one but you never know + final var memberCount = event.getParty().getMembers().size(); + + // !! async event !! + Tasks.runSync(MMOCore.plugin, () -> { + + // Apply stats to online members + applyToMembers(event.getParty(), memberCount); }); } @EventHandler - public void onPlayerLeave(BukkitPartiesPlayerPreLeaveEvent event) { + public void onPartyDelete(BukkitPartiesPartyPostDeleteEvent event) { - // Subtract one since event happens before the player leaves - var memberCount = event.getParty().getMembers().size() - 1; + // !! async event !! + Tasks.runSync(MMOCore.plugin, () -> { - // Try to clear stat bonuses from leaving player - PartyUtils.clearStatBonuses(event.getPartyPlayer().getPlayerUUID()); - - // Update stats for online members - event.getParty().getOnlineMembers().forEach(p -> PartyUtils.updateStatBonuses(PlayerData.get(p.getPlayerUUID()), memberCount)); + // Clear bonuses from online members + event.getParty().getOnlineMembers().forEach(member -> PartyUtils.clearStatBonuses(member.getPlayerUUID())); + }); } - private static class CustomParty implements AbstractParty { + @EventHandler + public void onPlayerJoin(BukkitPartiesPlayerPostJoinEvent event) { + final var newMemberCount = event.getParty().getMembers().size(); + + // !!! async event !!! + Tasks.runSync(MMOCore.plugin, () -> { + + // Apply stats to online members, including new member + applyToMembers(event.getParty(), newMemberCount); + }); + } + + @EventHandler + public void onPlayerLeave(BukkitPartiesPlayerPostLeaveEvent event) { + final var newMemberCount = event.getParty().getMembers().size(); + + // !!! async event !!! + Tasks.runSync(MMOCore.plugin, () -> { + + // Try to clear stat bonuses from leaving player + // Might be offline when leaving + PartyUtils.clearStatBonuses(event.getPartyPlayer().getPlayerUUID()); + + // Update stats for online members + applyToMembers(event.getParty(), newMemberCount); + }); + } + + private void applyToMembers(Party party, int memberCount) { + party.getOnlineMembers().forEach(member -> PartyUtils.applyStatBonuses(member.getPlayerUUID(), memberCount)); + } + + static class PartyImpl implements AbstractParty { private final Party party; - public CustomParty(Party party) { + public PartyImpl(Party party) { this.party = party; } @Override - public boolean hasMember(Player player) { + public boolean hasMember(@NotNull Player player) { for (PartyPlayer member : party.getOnlineMembers()) if (member.getPlayerUUID().equals(player.getUniqueId())) return true; @@ -77,7 +115,7 @@ public class PartiesPartyModule implements PartyModule, Listener { @Override public List getOnlineMembers() { - List list = new ArrayList<>(); + final var list = new ArrayList(party.getOnlineMembers().size()); for (PartyPlayer member : party.getOnlineMembers()) list.add(PlayerData.get(member.getPlayerUUID())); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/provided/Party.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/provided/Party.java index 70c9962a..1a425e86 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/provided/Party.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/party/provided/Party.java @@ -109,7 +109,7 @@ public class Party implements AbstractParty { module.setParty(data, null); PartyUtils.clearStatBonuses(data); - members.forEach(member -> PartyUtils.updateStatBonuses(member, members.size())); + members.forEach(member -> PartyUtils.applyStatBonuses(member, members.size())); updateOpenInventories(); // Disband the party if no member left @@ -132,7 +132,7 @@ public class Party implements AbstractParty { module.setParty(data, this); members.add(data); - members.forEach(member -> PartyUtils.updateStatBonuses(member, members.size())); + members.forEach(member -> PartyUtils.applyStatBonuses(member, members.size())); updateOpenInventories(); }