Improved compatibility with plugin 'Parties'

This commit is contained in:
Jules 2025-10-28 23:06:58 +01:00
parent c484b4cf4d
commit 8711c9ec0f
8 changed files with 103 additions and 53 deletions

View File

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

View File

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

View File

@ -11,7 +11,7 @@ public interface PartyModule {
@Deprecated
default void applyStatBonuses(PlayerData player, int memberCount) {
PartyUtils.updateStatBonuses(player, memberCount);
PartyUtils.applyStatBonuses(player, memberCount);
}
@Deprecated

View File

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

View File

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

View File

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

View File

@ -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 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 onPartyDelete(BukkitPartiesPartyPostDeleteEvent event) {
// !! async event !!
Tasks.runSync(MMOCore.plugin, () -> {
// Clear bonuses from online members
event.getParty().getOnlineMembers().forEach(member -> PartyUtils.clearStatBonuses(member.getPlayerUUID()));
});
}
@EventHandler
public void onPlayerJoin(BukkitPartiesPlayerPostJoinEvent event) {
final var newMemberCount = event.getParty().getMembers().size();
// !!! 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);
});
Tasks.runSync(MMOCore.plugin, () -> {
// Apply stats to online members, including new member
applyToMembers(event.getParty(), newMemberCount);
});
}
@EventHandler
public void onPlayerLeave(BukkitPartiesPlayerPreLeaveEvent event) {
public void onPlayerLeave(BukkitPartiesPlayerPostLeaveEvent event) {
final var newMemberCount = event.getParty().getMembers().size();
// 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
// Might be offline when leaving
PartyUtils.clearStatBonuses(event.getPartyPlayer().getPlayerUUID());
// Update stats for online members
event.getParty().getOnlineMembers().forEach(p -> PartyUtils.updateStatBonuses(PlayerData.get(p.getPlayerUUID()), memberCount));
applyToMembers(event.getParty(), newMemberCount);
});
}
private static class CustomParty implements AbstractParty {
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<PlayerData> getOnlineMembers() {
List<PlayerData> list = new ArrayList<>();
final var list = new ArrayList<PlayerData>(party.getOnlineMembers().size());
for (PartyPlayer member : party.getOnlineMembers())
list.add(PlayerData.get(member.getPlayerUUID()));

View File

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