mirror of
https://gitlab.com/phoenix-dvpmt/mmocore.git
synced 2025-11-18 06:24:17 +01:00
Improved compatibility with plugin 'Parties'
This commit is contained in:
parent
c484b4cf4d
commit
8711c9ec0f
@ -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());
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,7 +11,7 @@ public interface PartyModule {
|
||||
|
||||
@Deprecated
|
||||
default void applyStatBonuses(PlayerData player, int memberCount) {
|
||||
PartyUtils.updateStatBonuses(player, memberCount);
|
||||
PartyUtils.applyStatBonuses(player, memberCount);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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()));
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user