New options to entirely disable parties & guilds

This commit is contained in:
Jules 2025-03-02 13:50:52 +01:00
parent dcb3db9eca
commit 7a902d0af2
8 changed files with 112 additions and 57 deletions

View File

@ -7,13 +7,19 @@ import io.lumine.mythic.lib.skill.result.SkillResult;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.guild.GuildModule;
import net.Indyuce.mmocore.party.AbstractParty;
import net.Indyuce.mmocore.party.PartyModule;
import net.Indyuce.mmocore.skill.CastableSkill;
import net.Indyuce.mmocore.skill.ClassSkill;
import net.Indyuce.mmocore.skill.RegisteredSkill;
import org.apache.commons.lang.Validate;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
@ -28,7 +34,7 @@ public class MMOCoreAPI {
return PlayerData.get(player);
}
public boolean isInSameParty(Player player1, Player player2) {
public boolean isInSameParty(@NotNull Player player1, @NotNull Player player2) {
AbstractParty party = MMOCore.plugin.partyModule.getParty(PlayerData.get(player1));
return party != null && party.hasMember(player2);
}
@ -112,4 +118,26 @@ public class MMOCoreAPI {
RegisteredSkill registered = Objects.requireNonNull(MMOCore.plugin.skillManager.getSkill(skill.getId()), "Could not find registered skill with such handler");
return new CastableSkill(new ClassSkill(registered, 0, 0), level).cast(triggerMeta);
}
public void setPartyModule(@NotNull PartyModule module) {
Validate.notNull(module, "Party module cannot be null");
// TODO fix once MythicLib has modules well defined
PartyModule current = MMOCore.plugin.partyModule;
if (current != null && current instanceof Listener)
HandlerList.unregisterAll((Listener) MMOCore.plugin.partyModule);
MMOCore.plugin.partyModule = module;
}
public void setGuildModule(@NotNull GuildModule module) {
Validate.notNull(module, "Guild module cannot be null");
// TODO fix once MythicLib has modules well defined
GuildModule current = MMOCore.plugin.guildModule;
if (current != null && current instanceof Listener)
HandlerList.unregisterAll((Listener) current);
MMOCore.plugin.guildModule = module;
}
}

View File

@ -1,9 +1,10 @@
package net.Indyuce.mmocore.guild;
import net.Indyuce.mmocore.guild.compat.KingdomsXGuildModule;
import net.Indyuce.mmocore.guild.compat.GuildsGuildModule;
import net.Indyuce.mmocore.guild.compat.KingdomsXGuildModule;
import net.Indyuce.mmocore.guild.compat.UltimateClansGuildModule;
import net.Indyuce.mmocore.guild.provided.MMOCoreGuildModule;
import net.Indyuce.mmocore.guild.provided.NoneGuildModule;
import org.bukkit.Bukkit;
import javax.inject.Provider;
@ -11,9 +12,10 @@ import javax.inject.Provider;
public enum GuildModuleType {
// Useless since MythicLib already supports FactionBridge
// FACTIONS("Factions", FactionsGuildModule::new),
MMOCORE("MMOCore", MMOCoreGuildModule::new),
NONE("MMOCore", NoneGuildModule::new),
GUILDS("Guilds", GuildsGuildModule::new),
KINGDOMSX("Kingdoms", KingdomsXGuildModule::new),
MMOCORE("MMOCore", MMOCoreGuildModule::new),
ULTIMATE_CLANS("UltimateClans", UltimateClansGuildModule::new),
;

View File

@ -0,0 +1,21 @@
package net.Indyuce.mmocore.guild.provided;
import io.lumine.mythic.lib.comp.interaction.relation.Relationship;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.guild.AbstractGuild;
import net.Indyuce.mmocore.guild.GuildModule;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class NoneGuildModule implements GuildModule {
@Override
public @Nullable AbstractGuild getGuild(PlayerData playerData) {
return null;
}
@Override
public @NotNull Relationship getRelationship(Player player, Player target) {
return Relationship.GUILD_NEUTRAL;
}
}

View File

@ -1,6 +1,7 @@
package net.Indyuce.mmocore.party;
import net.Indyuce.mmocore.party.compat.*;
import net.Indyuce.mmocore.party.provided.NonePartyModule;
import net.Indyuce.mmocore.party.provided.MMOCorePartyModule;
import org.bukkit.Bukkit;
@ -8,6 +9,7 @@ import javax.inject.Provider;
public enum PartyModuleType {
MMOCORE("MMOCore", MMOCorePartyModule::new),
NONE("MMOCore", NonePartyModule::new),
// DUNGEONS("Dungeons", DungeonsPartyModule::new),
DUNGEONSXL("DungeonsXL", DungeonsXLPartyModule::new),
HEROES("Heroes", HeroesPartyModule::new),
@ -39,7 +41,7 @@ public enum PartyModuleType {
}
public boolean isValid() {
return Bukkit.getPluginManager().getPlugin(pluginName) != null;
return pluginName == null || Bukkit.getPluginManager().getPlugin(pluginName) != null;
}
public PartyModule provideModule() {

View File

@ -1,19 +1,27 @@
package net.Indyuce.mmocore.party.provided;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.ConfigMessage;
import net.Indyuce.mmocore.api.event.social.PartyChatEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.party.AbstractParty;
import net.Indyuce.mmocore.party.PartyModule;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import java.util.*;
public class MMOCorePartyModule implements PartyModule {
public class MMOCorePartyModule implements PartyModule, Listener {
protected final Set<Party> parties = new HashSet<>();
protected final Map<UUID, Party> playerParties = new HashMap<>();
public MMOCorePartyModule() {
Bukkit.getPluginManager().registerEvents(new PartyListener(this), MMOCore.plugin);
Bukkit.getPluginManager().registerEvents(this, MMOCore.plugin);
}
@Deprecated
@ -49,4 +57,31 @@ public class MMOCorePartyModule implements PartyModule {
public void setParty(PlayerData playerData, Party party) {
this.playerParties.put(playerData.getUniqueId(), party);
}
@EventHandler(priority = EventPriority.LOW)
public void partyChat(AsyncPlayerChatEvent event) {
if (!event.getMessage().startsWith(MMOCore.plugin.configManager.partyChatPrefix)) return;
PlayerData data = PlayerData.get(event.getPlayer());
Party party = this.getParty(data);
if (party == null) return;
event.setCancelled(true);
// Running it in a delayed task is recommended
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> {
ConfigMessage message = ConfigMessage.fromKey("party-chat", "player", data.getPlayer().getName(), "message",
event.getMessage().substring(MMOCore.plugin.configManager.partyChatPrefix.length()));
PartyChatEvent called = new PartyChatEvent(party, data, message.asLine());
Bukkit.getPluginManager().callEvent(called);
if (!called.isCancelled()) party.getOnlineMembers().forEach(member -> message.send(member.getPlayer()));
});
}
@EventHandler(priority = EventPriority.LOW)
public void leavePartyOnQuit(PlayerQuitEvent event) {
final PlayerData playerData = PlayerData.get(event.getPlayer());
final AbstractParty party = playerData.getParty();
if (party != null) ((Party) party).removeMember(playerData);
}
}

View File

@ -0,0 +1,15 @@
package net.Indyuce.mmocore.party.provided;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.party.AbstractParty;
import net.Indyuce.mmocore.party.PartyModule;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class NonePartyModule implements PartyModule {
@Override
public @Nullable AbstractParty getParty(@NotNull PlayerData playerData) {
return null;
}
}

View File

@ -1,50 +0,0 @@
package net.Indyuce.mmocore.party.provided;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.ConfigMessage;
import net.Indyuce.mmocore.api.event.social.PartyChatEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.party.AbstractParty;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerQuitEvent;
public class PartyListener implements Listener {
private final MMOCorePartyModule module;
public PartyListener(MMOCorePartyModule module) {
this.module = module;
}
@EventHandler(priority = EventPriority.LOW)
public void partyChat(AsyncPlayerChatEvent event) {
if (!event.getMessage().startsWith(MMOCore.plugin.configManager.partyChatPrefix))
return;
PlayerData data = PlayerData.get(event.getPlayer());
Party party = module.getParty(data);
if (party == null)
return;
event.setCancelled(true);
// Running it in a delayed task is recommended
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> {
ConfigMessage message = ConfigMessage.fromKey("party-chat", "player", data.getPlayer().getName(), "message",
event.getMessage().substring(MMOCore.plugin.configManager.partyChatPrefix.length()));
PartyChatEvent called = new PartyChatEvent(party, data, message.asLine());
Bukkit.getPluginManager().callEvent(called);
if (!called.isCancelled()) party.getOnlineMembers().forEach(member -> message.send(member.getPlayer()));
});
}
@EventHandler(priority = EventPriority.LOW)
public void leavePartyOnQuit(PlayerQuitEvent event) {
final PlayerData playerData = PlayerData.get(event.getPlayer());
final AbstractParty party = playerData.getParty();
if (party != null) ((Party) party).removeMember(playerData);
}
}

View File

@ -60,6 +60,7 @@ protect-custom-mine: false
# Choose the plugin handling parties here.
# Supported values (just copy and paste):
# - mmocore (Default built-in party system)
# - none (Used to fully disable parties)
# - dungeonsxl
# - heroes
# - mcmmo
@ -73,7 +74,8 @@ party-plugin: mmocore
# Edit the plugin handling guilds here.
# Supported values (just copy and paste):
# - mmocore
# - mmocore (Default built-in guild system
# - none (Used to fully disable guilds)
# - guilds
# - kingdomsx
# - ultimate_clans