Merge branch 'profileswitch'

# Conflicts:
#	MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/skilltree/SkillTreeViewer.java
This commit is contained in:
Jules 2025-10-20 11:42:07 +02:00
commit 9dd82e8aec
270 changed files with 5752 additions and 4680 deletions

View File

@ -113,6 +113,16 @@
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>24.1.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Paper API -->
@ -132,14 +142,15 @@
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>26.0.2-1</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<!-- Extra libs -->
<dependency>
<groupId>io.papermc</groupId>
<artifactId>paperlib</artifactId>
@ -175,7 +186,7 @@
<dependency>
<groupId>fr.phoenixdevt</groupId>
<artifactId>Profile-API</artifactId>
<version>1.1-SNAPSHOT</version>
<version>1.1.1-SNAPSHOT</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
@ -183,7 +194,7 @@
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.9.2</version>
<version>2.11.6</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
@ -362,7 +373,8 @@
<dependency>
<groupId>me.glaremasters</groupId>
<artifactId>Guilds</artifactId>
<version>3.5.6.0</version>
<version>3.5.7.1</version>
<classifier>stripped</classifier>
<scope>provided</scope>
<optional>true</optional>
</dependency>

View File

@ -2,16 +2,17 @@ package net.Indyuce.mmocore;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.data.sql.SQLDataSource;
import io.lumine.mythic.lib.data.SynchronizedDataManager;
import io.lumine.mythic.lib.metrics.bukkit.Metrics;
import io.lumine.mythic.lib.module.MMOPlugin;
import io.lumine.mythic.lib.player.modifier.PlayerModifier;
import io.lumine.mythic.lib.util.MMOPlugin;
import io.lumine.mythic.lib.util.lang3.Validate;
import io.lumine.mythic.lib.version.SpigotPlugin;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.attribute.AttributeModifier;
import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource;
import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.command.ToggleableCommand;
import net.Indyuce.mmocore.command.builtin.mmocore.MMOCoreCommandTreeRoot;
import net.Indyuce.mmocore.comp.citizens.CitizenInteractEventListener;
import net.Indyuce.mmocore.comp.citizens.CitizensMMOLoader;
import net.Indyuce.mmocore.comp.mythicmobs.MythicHook;
@ -37,7 +38,8 @@ import net.Indyuce.mmocore.manager.data.DataProvider;
import net.Indyuce.mmocore.manager.data.GuildDataManager;
import net.Indyuce.mmocore.manager.data.LegacyDataProvider;
import net.Indyuce.mmocore.manager.data.PlayerDataManager;
import net.Indyuce.mmocore.manager.data.sql.SQLDataHandler;
import net.Indyuce.mmocore.manager.data.sql.SQLDatabaseImpl;
import net.Indyuce.mmocore.manager.data.yaml.YAMLDatabaseImpl;
import net.Indyuce.mmocore.manager.profession.*;
import net.Indyuce.mmocore.manager.social.BoosterManager;
import net.Indyuce.mmocore.manager.social.PartyManager;
@ -52,7 +54,6 @@ import net.Indyuce.mmocore.script.mechanic.StaminaMechanic;
import net.Indyuce.mmocore.script.mechanic.StelliumMechanic;
import net.Indyuce.mmocore.skill.cast.SkillCastingMode;
import net.Indyuce.mmocore.skill.trigger.MMOCoreTriggerType;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.event.EventPriority;
@ -151,10 +152,7 @@ public class MMOCore extends MMOPlugin {
getLogger().warning("(Your config version: '" + configVersion + "' | Expected config version: '" + defConfigVersion + "')");
}
if (getConfig().isConfigurationSection("mysql") && getConfig().getBoolean("mysql.enabled")) {
final SQLDataSource dataSource = new SQLDataSource(this);
playerDataManager.setDataHandler(new SQLDataHandler(dataSource));
}
playerDataManager.setupDatabase(SQLDatabaseImpl::new, YAMLDatabaseImpl::new);
if (getConfig().isConfigurationSection("default-playerdata"))
playerDataManager.loadDefaultData(getConfig().getConfigurationSection("default-playerdata"));
@ -192,9 +190,8 @@ public class MMOCore extends MMOPlugin {
for (PlayerData player : PlayerData.getAll())
if (player.isOnline() && !player.getPlayer().isDead())
for (PlayerResource resource : PlayerResource.values()) {
double regenAmount = player.getProfess().getHandler(resource).getRegen(player);
if (regenAmount != 0)
resource.regen(player, regenAmount);
final var regenAmount = player.getProfess().getHandler(resource).getRegen(player);
if (regenAmount != 0) resource.regen(player, regenAmount);
}
}
}.runTaskTimer(MMOCore.plugin, 100, 20);
@ -263,7 +260,7 @@ public class MMOCore extends MMOPlugin {
nativeGuildManager.load();
// Toggleable Commands
ToggleableCommand.register();
ToggleableCommand.loadCommands();
// Register MMOCore command what soever
MMOCoreCommandTreeRoot mmoCoreCommand = new MMOCoreCommandTreeRoot();
@ -348,4 +345,9 @@ public class MMOCore extends MMOPlugin {
public boolean hasEconomy() {
return economy != null && economy.isValid();
}
@Override
public @NotNull SynchronizedDataManager<?, ?> getRawPlayerDataManager() {
return this.playerDataManager;
}
}

View File

@ -1,11 +1,12 @@
package net.Indyuce.mmocore.api;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.message.actionbar.ActionBarPriority;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.apache.commons.lang.Validate;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -162,7 +163,7 @@ public class ConfigMessage {
// Handle special case with player data + action bar
if (playerData != null && playerData.isOnline() && actionbar) {
playerData.displayActionBar(rawMessage, raw);
playerData.getMMOPlayerData().getActionBar().show(ActionBarPriority.NORMAL, rawMessage);
return;
}

View File

@ -6,6 +6,7 @@ import io.lumine.mythic.lib.skill.handler.SkillHandler;
import io.lumine.mythic.lib.skill.result.SkillResult;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.guild.GuildModule;
@ -14,7 +15,6 @@ 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;

View File

@ -4,11 +4,11 @@ import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.api.condition.type.BlockCondition;
import io.lumine.mythic.lib.api.condition.type.MMOCondition;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import net.Indyuce.mmocore.loot.LootBuilder;
import net.Indyuce.mmocore.loot.droptable.DropTable;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;

View File

@ -0,0 +1,86 @@
package net.Indyuce.mmocore.api.block;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.block.BlockInfo.RegeneratingBlock;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.MultipleFacing;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class MushroomBlockType implements BlockType {
private final Set<BlockFace> faces;
private final Material type;
public MushroomBlockType(MMOLineConfig config) {
config.validateKeys("faces", "type");
this.type = UtilityMethods.prettyValueOf(Material::valueOf, config.getString("type"), "No material with ID %s");
var split = config.getString("faces").split("\\,");
faces = new HashSet<>();
for (int j = 0; j < split.length; j++)
faces.add(UtilityMethods.prettyValueOf(BlockFace::valueOf, split[j], "No block face with ID %s"));
}
public MushroomBlockType(@NotNull Block block) {
final var state = (MultipleFacing) block.getBlockData();
this.type = block.getType();
this.faces = state.getAllowedFaces();
}
public Set<BlockFace> getFaces() {
return faces;
}
@Override
public boolean breakRestrictions(@NotNull Block block) {
return true;
}
@Override
public void place(RegeneratingBlock block) {
Location loc = block.getLocation();
block.getLocation().getBlock().setType(type);
var state = (MultipleFacing) loc.getBlock().getBlockData();
for (var face : faces) state.setFace(face, true);
loc.getBlock().setBlockData(state);
}
@Override
public void regenerate(RegeneratingBlock block) {
Location loc = block.getLocation();
loc.getBlock().setType(type);
// Sets the original blocks old data (only when regenerating)
loc.getBlock().setBlockData(block.getBlockData());
}
@Override
public @NotNull String display() {
return "Mushroom{type=" + type.name() + ", faces=[" + this.faces.stream().map(BlockFace::name).reduce((a, b) -> a + ", " + b).orElse("") + "]}";
}
@Override
public String toString() {
return display();
}
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (object == null || getClass() != object.getClass()) return false;
MushroomBlockType that = (MushroomBlockType) object;
return Objects.equals(faces, that.faces) && type == that.type;
}
@Override
public int hashCode() {
return Objects.hash(faces, type);
}
}

View File

@ -0,0 +1,84 @@
package net.Indyuce.mmocore.api.block;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.block.BlockInfo.RegeneratingBlock;
import org.bukkit.Instrument;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Note;
import org.bukkit.block.Block;
import org.bukkit.block.data.type.NoteBlock;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
public class NoteBlockType implements BlockType {
private final Instrument instrument;
private final Note note;
public NoteBlockType(MMOLineConfig config) {
config.validateKeys("note");
instrument = config.contains("instrument")
? UtilityMethods.prettyValueOf(Instrument::valueOf, config.getString("instrument"), "No instrument with ID '%s'")
: Instrument.PIANO;
note = new Note(config.getInt("note"));
}
public NoteBlockType(@NotNull Block block) {
final var state = (NoteBlock) block.getBlockData();
this.instrument = state.getInstrument();
this.note = state.getNote();
}
public Instrument getInstrument() {
return instrument;
}
public Note getNote() {
return note;
}
@Override
public boolean breakRestrictions(@NotNull Block block) {
return true;
}
@Override
public void place(RegeneratingBlock block) {
Location loc = block.getLocation();
block.getLocation().getBlock().setType(Material.NOTE_BLOCK);
NoteBlock state = (NoteBlock) loc.getBlock().getBlockData();
state.setInstrument(instrument);
state.setNote(note);
loc.getBlock().setBlockData(state);
}
@Override
public void regenerate(RegeneratingBlock block) {
Location loc = block.getLocation();
loc.getBlock().setType(Material.NOTE_BLOCK);
// Sets the original blocks old data (only when regenerating)
loc.getBlock().setBlockData(block.getBlockData());
}
@Override
public @NotNull String display() {
return "NoteBlock{instrument=" + instrument.name() + ", note=" + note.getId() + "}";
}
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (object == null || getClass() != object.getClass()) return false;
NoteBlockType that = (NoteBlockType) object;
return instrument == that.instrument && Objects.equals(note, that.note);
}
@Override
public int hashCode() {
return Objects.hash(instrument, note);
}
}

View File

@ -1,8 +1,8 @@
package net.Indyuce.mmocore.api.block;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
public class RegenInfo {

View File

@ -7,6 +7,7 @@ import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
@ -49,7 +50,7 @@ public class SkullBlockType implements BlockType {
}
@Override
public String display() {
public @NotNull String display() {
return "Skull{" + value + "}";
}

View File

@ -1,13 +1,15 @@
package net.Indyuce.mmocore.api.block;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.api.block.BlockInfo.RegeneratingBlock;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.data.Ageable;
import org.bukkit.block.data.BlockData;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
@ -23,7 +25,7 @@ public class VanillaBlockType implements BlockType {
public VanillaBlockType(MMOLineConfig config) {
config.validate("type");
type = Material.valueOf(config.getString("type").toUpperCase().replace("-", "_").replace(" ", "_"));
type = UtilityMethods.prettyValueOf(Material::valueOf, config.getString("type"), "No material with ID %s");
age = config.getInt("age", 0);
Validate.isTrue(age >= 0 && age < 8, "Age must be between 0 and 7");
@ -43,8 +45,8 @@ public class VanillaBlockType implements BlockType {
Location loc = block.getLocation();
block.getLocation().getBlock().setType(type);
BlockData state = block.getLocation().getBlock().getBlockData();
if (age > 0 && state instanceof Ageable) {
BlockData state;
if (age > 0 && (state = block.getLocation().getBlock().getBlockData()) instanceof Ageable) {
((Ageable) state).setAge(age);
loc.getBlock().setBlockData(state);
}
@ -59,7 +61,7 @@ public class VanillaBlockType implements BlockType {
}
@Override
public String display() {
public @NotNull String display() {
return "Vanilla{" + type.name() + "}";
}

View File

@ -1,45 +1,50 @@
package net.Indyuce.mmocore.api.event;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
/**
* @deprecated Use Bukkit event instead
*/
@Deprecated
// TODO move to MythicLib
public class MMOCommandEvent extends PlayerDataEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final String command;
private final String command;
public MMOCommandEvent(PlayerData player, String command) {
super(player);
@Deprecated
public MMOCommandEvent(PlayerData player, String command) {
super(player);
this.command = command;
}
this.command = command;
}
public String getCommand() {
return command;
}
public MMOCommandEvent(PlayerData player, CommandTreeRoot command) {
super(player);
@Override
public HandlerList getHandlers() {
return handlers;
}
this.command = command.getId();
}
public static HandlerList getHandlerList() {
return handlers;
}
public String getCommand() {
return command;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
@Override
public void setCancelled(boolean b) {
cancelled = b;
}
public static HandlerList getHandlerList() {
return handlers;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean b) {
cancelled = b;
}
}

View File

@ -4,44 +4,81 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
public class PlayerChangeClassEvent extends PlayerDataEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private static final HandlerList HANDLERS = new HandlerList();
private final PlayerClass newClass;
private final PlayerClass newClass;
private final Reason reason;
private boolean cancelled = false;
private boolean cancelled = false;
public PlayerChangeClassEvent(PlayerData player, PlayerClass newClass) {
super(player);
@Deprecated
public PlayerChangeClassEvent(PlayerData player, PlayerClass newClass) {
this(player, newClass, Reason.UNKNOWN);
}
this.newClass = newClass;
}
public PlayerChangeClassEvent(PlayerData player, PlayerClass newClass, Reason reason) {
super(player);
public PlayerClass getNewClass() {
return newClass;
}
this.reason = reason;
this.newClass = newClass;
}
public boolean isSubclass() {
return getData().getProfess().getSubclasses().stream().anyMatch(sub -> sub.getProfess().equals(newClass));
}
@NotNull
public Reason getReason() {
return reason;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@NotNull
public PlayerClass getNewClass() {
return newClass;
}
@Override
public void setCancelled(boolean value) {
cancelled = value;
}
public boolean isSubclass() {
return getData().getProfess().getSubclasses().stream().anyMatch(sub -> sub.getProfess().equals(newClass));
}
@Override
public HandlerList getHandlers() {
return handlers;
}
@Override
public boolean isCancelled() {
return cancelled;
}
public static HandlerList getHandlerList() {
return handlers;
}
@Override
public void setCancelled(boolean value) {
cancelled = value;
}
@Override
public HandlerList getHandlers() {
return HANDLERS;
}
public static HandlerList getHandlerList() {
return HANDLERS;
}
public static enum Reason {
/**
* Class is selected (class switch) by an admin command.
*/
COMMAND_SELECT,
/**
* Class is forcefully changed by an admin command.
*/
COMMAND_FORCE,
/**
* When the player changes class using the class change GUI
*/
GUI,
/**
* Not specified by user
*/
UNKNOWN
}
}

View File

@ -5,6 +5,7 @@ import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.Profession;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class PlayerExperienceGainEvent extends PlayerDataEvent implements Cancellable {
@ -17,11 +18,11 @@ public class PlayerExperienceGainEvent extends PlayerDataEvent implements Cancel
private double experience;
private boolean cancelled;
public PlayerExperienceGainEvent(PlayerData player, double experience, EXPSource source) {
public PlayerExperienceGainEvent(@NotNull PlayerData player, double experience, @NotNull EXPSource source) {
this(player, null, experience, source);
}
public PlayerExperienceGainEvent(PlayerData player, @Nullable Profession profession, double experience, EXPSource source) {
public PlayerExperienceGainEvent(@NotNull PlayerData player, @Nullable Profession profession, double experience, @NotNull EXPSource source) {
super(player);
this.profession = profession;
@ -56,16 +57,18 @@ public class PlayerExperienceGainEvent extends PlayerDataEvent implements Cancel
return profession != null;
}
@Nullable
public Profession getProfession() {
return profession;
}
@NotNull
public EXPSource getSource() {
return source;
}
@Override
public HandlerList getHandlers() {
public @NotNull HandlerList getHandlers() {
return handlers;
}

View File

@ -0,0 +1,104 @@
package net.Indyuce.mmocore.api.event;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.Profession;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class PlayerLevelChangeEvent extends PlayerDataEvent {
private final int oldLevel, newLevel;
@Nullable(value = "null if class levels")
private final Profession profession;
private final Reason reason;
private static final HandlerList HANDLERS = new HandlerList();
@Deprecated
public PlayerLevelChangeEvent(PlayerData player, int oldLevel, int newLevel) {
this(player, null, oldLevel, newLevel, Reason.UNKNOWN);
}
@Deprecated
public PlayerLevelChangeEvent(PlayerData player, Profession profession, int oldLevel, int newLevel) {
this(player, profession, oldLevel, newLevel, Reason.UNKNOWN);
}
public PlayerLevelChangeEvent(PlayerData player, @Nullable Profession profession, int oldLevel, int newLevel, Reason reason) {
super(player);
this.profession = profession;
this.oldLevel = oldLevel;
this.newLevel = newLevel;
this.reason = reason;
}
@NotNull
public Reason getReason() {
return reason;
}
public int getNewLevel() {
return newLevel;
}
public int getOldLevel() {
return oldLevel;
}
public boolean hasProfession() {
return profession != null;
}
@Nullable
public Profession getProfession() {
return profession;
}
@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}
public static HandlerList getHandlerList() {
return HANDLERS;
}
public static enum Reason {
/**
* Players level up one of their profession or main class
*/
LEVEL_UP,
/**
* Command to change the player's level
*/
COMMAND,
/**
* Their level is reset using the player data reset command
*/
RESET,
/**
* When a player changes their current class
*/
CHOOSE_CLASS,
/**
* When a player logs in or chooses their profile
*/
CHOOSE_PROFILE,
/**
* Not provided by the user
*/
UNKNOWN,
/**
* Not used internally
*/
OTHER,
}
}

View File

@ -5,48 +5,64 @@ import net.Indyuce.mmocore.experience.Profession;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.Nullable;
/**
* @see PlayerLevelChangeEvent
* @see net.Indyuce.mmocore.api.event.PlayerLevelChangeEvent.Reason#LEVEL_UP
* @deprecated Level up can now be detected through PlayerLevelChangeEvent with a reason of LEVEL_UP.
*/
@Deprecated
public class PlayerLevelUpEvent extends PlayerDataEvent {
private static final HandlerList handlers = new HandlerList();
private static final HandlerList handlers = new HandlerList();
// If null, this is main level
private final Profession profession;
private final int oldLevel, newLevel;
// If null, this is main level
private final Profession profession;
private final int oldLevel, newLevel;
public PlayerLevelUpEvent(PlayerData player, int oldLevel, int newLevel) {
this(player, null, oldLevel, newLevel);
}
/**
* @see PlayerLevelChangeEvent
* @deprecated
*/
@Deprecated
public PlayerLevelUpEvent(PlayerData player, int oldLevel, int newLevel) {
this(player, null, oldLevel, newLevel);
}
public PlayerLevelUpEvent(PlayerData player, Profession profession, int oldLevel, int newLevel) {
super(player);
/**
* @see PlayerLevelChangeEvent
* @deprecated
*/
@Deprecated
public PlayerLevelUpEvent(PlayerData player, Profession profession, int oldLevel, int newLevel) {
super(player);
this.profession = profession;
this.oldLevel = oldLevel;
this.newLevel = newLevel;
}
this.profession = profession;
this.oldLevel = oldLevel;
this.newLevel = newLevel;
}
public int getNewLevel() {
return newLevel;
}
public int getNewLevel() {
return newLevel;
}
public int getOldLevel() {
return oldLevel;
}
public int getOldLevel() {
return oldLevel;
}
public boolean hasProfession() {
return profession != null;
}
public boolean hasProfession() {
return profession != null;
}
@Nullable
public Profession getProfession() {
return profession;
}
@Nullable
public Profession getProfession() {
return profession;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}

View File

@ -5,131 +5,180 @@ import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource;
import net.Indyuce.mmocore.api.quest.trigger.ManaTrigger;
import net.Indyuce.mmocore.api.quest.trigger.StaminaTrigger;
import net.Indyuce.mmocore.api.quest.trigger.StelliumTrigger;
import net.Indyuce.mmocore.command.rpg.admin.ResourceCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.admin.ResourceCommandTreeNode;
import net.Indyuce.mmocore.skill.list.Neptune_Gift;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
public class PlayerResourceUpdateEvent extends PlayerDataEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private static final HandlerList HANDLERS = new HandlerList();
/**
* Type of resource being regenerated, this way
* this event handles all four resources.
*/
private final PlayerResource resource;
private final UpdateReason reason;
/**
* Type of resource being regenerated, this way
* this event handles all four resources.
*/
private final PlayerResource resource;
private final UpdateReason reason;
private final double oldAmount, originalNewAmount;
/**
* Amount of resource regenerated. The whole point of the event is
* being able to modify it, for instance to apply the mana regeneration stat.
*/
private double amount;
/**
* New amount. To obtain the amount of resource regenerated, if REASON
* is REGENERATION, you must subtract oldAmount from newAmount.
*/
private double newAmount;
private boolean cancelled = false;
private boolean cancelled = false;
/**
* Called when a player gains some resource back. This can
* be used to handle stats like health or mana regeneration.
* <p>
* Example use: {@link Neptune_Gift} which is a skill
* that temporarily increases resource regeneration for a short amount of time.
*
* @param playerData Player regenerating
* @param resource Resource being increased
* @param amount Amount being taken away/regenerated
* @param reason The reason why this event was called
*/
public PlayerResourceUpdateEvent(PlayerData playerData, PlayerResource resource, double amount, UpdateReason reason) {
super(playerData);
/**
* Called when a player gains some resource back. This can
* be used to handle stats like health or mana regeneration.
* <p>
* Example use: {@link Neptune_Gift} which is a skill
* that temporarily increases resource regeneration for a short amount of time.
*
* @param playerData Player regenerating
* @param resource Resource being increased
* @param oldAmount The old amount of resource before this event was called. Not modifiable.
* @param newAmount The new amount of resource after this event was called. Modifiable.
* @param reason The reason why this event was called
*/
public PlayerResourceUpdateEvent(@NotNull PlayerData playerData, @NotNull PlayerResource resource, double oldAmount, double newAmount, @NotNull UpdateReason reason) {
super(playerData);
this.resource = resource;
this.amount = amount;
this.reason = reason;
}
this.resource = resource;
this.oldAmount = oldAmount;
this.originalNewAmount = newAmount;
this.newAmount = newAmount;
this.reason = reason;
}
public PlayerResource getResource() {
return resource;
}
@NotNull
public PlayerResource getResource() {
return resource;
}
public double getAmount() {
return amount;
}
@Deprecated
public double getAmount() {
return getDifference();
}
public UpdateReason getReason() {
return reason;
}
public double getDifference() {
return newAmount - oldAmount;
}
/**
* Changes the amount of resource given/taken away
*
* @param amount New amount
*/
public void setAmount(double amount) {
this.amount = amount;
}
public double getNewAmount() {
return newAmount;
}
@Override
public boolean isCancelled() {
return cancelled;
}
public double getOriginalNewAmount() {
return originalNewAmount;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
public double getOldAmount() {
return oldAmount;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
@NotNull
public UpdateReason getReason() {
return reason;
}
public static HandlerList getHandlerList() {
return handlers;
}
/**
* @see #setNewAmount(double)
* @deprecated
*/
@Deprecated
public void setAmount(double amount) {
this.setNewAmount(amount + oldAmount);
}
public enum UpdateReason {
/**
* Sets the new amount of resource after the update.
* Will not be applied if the event is cancelled.
*
* @param newAmount New amount of resource
*/
public void setNewAmount(double newAmount) {
this.newAmount = newAmount;
}
/**
* When resource is being regenerated
*/
REGENERATION,
@Override
public boolean isCancelled() {
return cancelled;
}
/**
* When some resource is gained, or consumed by some skills
*/
SKILL_REGENERATION,
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
/**
* When some resource is gained, or consumed by some skills
*/
SKILL_COST,
@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}
/**
* When consuming stellium to use a waypoint
*/
USE_WAYPOINT,
public static HandlerList getHandlerList() {
return HANDLERS;
}
/**
* Used by quests triggers
* - {@link ManaTrigger}
* - {@link StaminaTrigger}
* - {@link StelliumTrigger}
*/
TRIGGER,
public enum UpdateReason {
/**
* When using the resource command {@link ResourceCommandTreeNode}
*/
COMMAND,
/**
* When resource is being regenerated
*/
REGENERATION,
/**
* Anything else
*/
OTHER;
/**
* When some resource is gained, or consumed by some skills
*/
SKILL_REGENERATION,
public boolean isSkill() {
return this == SKILL_COST || this == SKILL_REGENERATION;
}
}
/**
* When some resource is gained, or consumed by some skills
*/
SKILL_COST,
/**
* When consuming stellium to use a waypoint
*/
USE_WAYPOINT,
/**
* When the player chooses a class and mana from their previous
* game session is restored
*/
CHOOSE_CLASS,
/**
* Used by quests triggers
* - {@link ManaTrigger}
* - {@link StaminaTrigger}
* - {@link StelliumTrigger}
*/
TRIGGER,
/**
* When using the resource command {@link ResourceCommandTreeNode}
*/
COMMAND,
/**
* Reason not provided by user
*/
UNKNOWN,
/**
* Anything else
*/
OTHER;
public boolean isRegeneration() {
return this == REGENERATION || this == SKILL_REGENERATION;
}
public boolean isSkill() {
return this == SKILL_COST || this == SKILL_REGENERATION;
}
}
}

View File

@ -5,32 +5,36 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.guild.provided.Guild;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
public class GuildChatEvent extends PlayerDataEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private final Guild guild;
private boolean cancelled;
@Deprecated
private String message;
private boolean cancelled;
public GuildChatEvent(PlayerData playerData, String message) {
super(playerData);
this.guild = playerData.getGuild();
this.message = message;
}
public void setMessage(String message) {
public void setMessage(@Nullable String message) {
this.message = message;
}
@Deprecated
@Nullable
public String getMessage() {
return message;
}
@NotNull
public Guild getGuild() {
return guild;
}

View File

@ -5,6 +5,10 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.party.provided.Party;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
public class PartyChatEvent extends PlayerDataEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@ -12,23 +16,25 @@ public class PartyChatEvent extends PlayerDataEvent implements Cancellable {
private final Party party;
private boolean cancelled;
private String message;
private String rawMessage;
public PartyChatEvent(Party party, PlayerData playerData, String message) {
public PartyChatEvent(Party party, PlayerData playerData, String rawMessage) {
super(playerData);
this.party = party;
this.message = message;
this.rawMessage = rawMessage;
}
public void setMessage(String message) {
this.message = message;
public void setMessage(@Nullable String rawMessage) {
this.rawMessage = Objects.requireNonNull(rawMessage, "Message cannot be null");
}
@Nullable
public String getMessage() {
return message;
return rawMessage;
}
@NotNull
public Party getParty() {
return party;
}

View File

@ -1,9 +1,7 @@
package net.Indyuce.mmocore.api.load;
import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.block.BlockType;
import net.Indyuce.mmocore.api.block.SkullBlockType;
import net.Indyuce.mmocore.api.block.VanillaBlockType;
import net.Indyuce.mmocore.api.block.*;
import net.Indyuce.mmocore.api.quest.objective.*;
import net.Indyuce.mmocore.api.quest.trigger.*;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
@ -196,8 +194,11 @@ public class DefaultMMOLoader extends MMOLoader {
@Override
public BlockType loadBlockType(MMOLineConfig config) {
if (config.getKey().equalsIgnoreCase("vanilla"))
return new VanillaBlockType(config);
if (config.getKey().equalsIgnoreCase("vanilla")) return new VanillaBlockType(config);
if (config.getKey().equalsIgnoreCase("note")) return new NoteBlockType(config);
if (config.getKey().equalsIgnoreCase("mushroom")) return new MushroomBlockType(config);
if (config.getKey().equalsIgnoreCase("skull") || config.getKey().equals("head") || config.getKey().equals("playerhead"))
return new SkullBlockType(config);

View File

@ -2,13 +2,13 @@ package net.Indyuce.mmocore.api.player.attribute;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.stat.modifier.StatModifier;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.ExpCurve;
import net.Indyuce.mmocore.experience.ExperienceObject;
import net.Indyuce.mmocore.experience.droptable.ExperienceTable;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;

View File

@ -10,9 +10,9 @@ import io.lumine.mythic.lib.player.modifier.ModifierSource;
import io.lumine.mythic.lib.player.modifier.ModifierType;
import io.lumine.mythic.lib.util.Closeable;
import io.lumine.mythic.lib.util.Lazy;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
@ -189,7 +189,7 @@ public class PlayerAttributes {
public AttributeInstance(@NotNull String attributeId) {
this.id = attributeId;
this.enumName = UtilityMethods.enumName(this.id);
this.attribute = Lazy.of(() -> MMOCore.plugin.attributeManager.get(this.id));
this.attribute = Lazy.persistent(() -> MMOCore.plugin.attributeManager.get(this.id));
}
/**

View File

@ -311,10 +311,15 @@ public class PlayerClass implements ExperienceObject, PreloadedObject {
}
@Override
public ExpCurve getExpCurve() {
public @NotNull ExpCurve getExpCurve() {
return expCurve;
}
@NotNull
public Collection<ClassSkill> getSkills() {
return skills.values();
}
@NotNull
public ExperienceTable getExperienceTable() {
@ -423,7 +428,7 @@ public class PlayerClass implements ExperienceObject, PreloadedObject {
return skillSlots;
}
@NotNull
@Nullable
public ClassSkill getSkill(RegisteredSkill skill) {
return getSkill(skill.getHandler().getId());
}
@ -469,11 +474,6 @@ public class PlayerClass implements ExperienceObject, PreloadedObject {
return calculateBaseStat(stat, level, null);
}
@Deprecated
public Collection<ClassSkill> getSkills() {
return skills.values();
}
@Deprecated
public ItemStack getIcon() {
return icon.toItemStack();

View File

@ -2,16 +2,16 @@ package net.Indyuce.mmocore.api.player.profess;
import io.lumine.mythic.lib.gson.JsonElement;
import io.lumine.mythic.lib.gson.JsonObject;
import io.lumine.mythic.lib.version.Attributes;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.PlayerLevelChangeEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.player.ClassDataContainer;
import net.Indyuce.mmocore.skill.RegisteredSkill;
import net.Indyuce.mmocore.skilltree.SkillTreeNode;
import net.Indyuce.mmocore.skilltree.tree.SkillTree;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.HashSet;
@ -119,7 +119,7 @@ public class SavedClassInformation implements ClassDataContainer {
this.skillTreeReallocationPoints = data.getSkillTreeReallocationPoints();
this.skillReallocationPoints = data.getSkillReallocationPoints();
this.experience = data.getExperience();
this.health = data.getHealth();
this.health = data.getLastHealth();
this.mana = data.getMana();
this.stellium = data.getStellium();
this.stamina = data.getStamina();
@ -159,7 +159,7 @@ public class SavedClassInformation implements ClassDataContainer {
}
@Override
public double getHealth() {
public double getLastHealth() {
return health;
}
@ -284,7 +284,7 @@ public class SavedClassInformation implements ClassDataContainer {
* @param profess Target player class
* @param player Player changing class
*/
public void load(PlayerClass profess, PlayerData player) {
public void load(@NotNull PlayerClass profess, @NotNull PlayerData player) {
/*
* Saves current class info inside a SavedClassInformation, only
@ -310,7 +310,7 @@ public class SavedClassInformation implements ClassDataContainer {
* Reads this class info, applies it to the player. set class after
* changing level so the player stats can be calculated based on new level
*/
player.setLevel(level);
player.setLevel(level, PlayerLevelChangeEvent.Reason.CHOOSE_CLASS);
player.setExperience(experience);
player.setSkillPoints(skillPoints);
player.setAttributePoints(attributePoints);
@ -332,21 +332,17 @@ public class SavedClassInformation implements ClassDataContainer {
for (SkillTreeNode node : skillTree.getNodes())
player.setNodeLevel(node, nodeLevels.getOrDefault(node.getFullId(), 0));
skillTree.setupNodeStates(player);
skillTree.resolveStates(player);
}
// Add the values to the times claimed table and claims the corresponding stat triggers.
nodeTimesClaimed.forEach((str, val) -> player.setClaims(str, val));
nodeTimesClaimed.forEach(player::setClaims);
// Unload current class information
player.unloadClassInfo(profess);
// This needs to be done at the end to make sure the MAX_HEALTH/MAX_MANA/... stats are loaded.
player.getPlayer().setHealth(MMOCoreUtils.fixResource(health, player.getPlayer().getAttribute(Attributes.MAX_HEALTH).getValue()));
player.setHealth(health);
player.setMana(mana);
player.setStellium(stellium);
player.setStamina(stamina);
player.loadResources(health, mana, stellium, stamina);
player.applyTemporaryTriggers();
player.getStats().updateStats();
}

View File

@ -1,6 +1,6 @@
package net.Indyuce.mmocore.api.player.profess;
import org.apache.commons.lang.Validate;
import io.lumine.mythic.lib.util.lang3.Validate;
public class Subclass {
private final PlayerClass profess;

View File

@ -1,9 +1,9 @@
package net.Indyuce.mmocore.api.player.profess.event;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import org.apache.commons.lang.Validate;
import java.util.LinkedHashSet;
import java.util.List;

View File

@ -1,6 +1,6 @@
package net.Indyuce.mmocore.api.player.profess.event.trigger;
import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent;
import net.Indyuce.mmocore.api.event.PlayerLevelChangeEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler;
@ -10,32 +10,34 @@ import org.bukkit.event.EventPriority;
@Deprecated
public class LevelUpEventTrigger implements EventTriggerHandler {
@Override
public boolean handles(String event) {
return event.startsWith("level-up");
}
@Override
public boolean handles(String event) {
return event.startsWith("level-up");
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void a(PlayerLevelUpEvent event) {
PlayerData player = event.getData();
PlayerClass profess = player.getProfess();
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void a(PlayerLevelChangeEvent event) {
PlayerData player = event.getData();
PlayerClass profess = player.getProfess();
for(int i = event.getOldLevel(); i < event.getNewLevel(); i++) {
int level = i + 1;
if(event.hasProfession()) {
String prof = event.getProfession().getId().toLowerCase();
processTrigger(player, profess, "level-up-" + prof);
processTrigger(player, profess, "level-up-" + prof + "-" + level);
} else {
processTrigger(player, profess, "level-up");
processTrigger(player, profess, "level-up-" + level);
if(profess.getMaxLevel() == level)
processTrigger(player, profess, "level-up-max");
}
}
}
public void processTrigger(PlayerData player, PlayerClass profess, String trigger) {
if(profess.hasEventTriggers(trigger)) profess.getEventTriggers(trigger).getTriggers().forEach(t -> t.apply(player));
}
if (event.getReason() == PlayerLevelChangeEvent.Reason.LEVEL_UP)
for (int i = event.getOldLevel(); i < event.getNewLevel(); i++) {
int level = i + 1;
if (event.hasProfession()) {
String prof = event.getProfession().getId().toLowerCase();
processTrigger(player, profess, "level-up-" + prof);
processTrigger(player, profess, "level-up-" + prof + "-" + level);
} else {
processTrigger(player, profess, "level-up");
processTrigger(player, profess, "level-up-" + level);
if (profess.getMaxLevel() == level)
processTrigger(player, profess, "level-up-max");
}
}
}
public void processTrigger(PlayerData player, PlayerClass profess, String trigger) {
if (profess.hasEventTriggers(trigger))
profess.getEventTriggers(trigger).getTriggers().forEach(t -> t.apply(player));
}
}

View File

@ -1,6 +1,6 @@
package net.Indyuce.mmocore.api.player.profess.event.trigger;
import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent;
import net.Indyuce.mmocore.api.event.PlayerLevelChangeEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler;
@ -18,31 +18,33 @@ public class MultipleLevelUpEventTrigger implements EventTriggerHandler {
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void a(PlayerLevelUpEvent event) {
public void a(PlayerLevelChangeEvent event) {
PlayerData player = event.getData();
PlayerClass profess = player.getProfess();
for(int i = event.getOldLevel(); i < event.getNewLevel(); i++) {
int level = i + 1;
if (event.getReason() == PlayerLevelChangeEvent.Reason.LEVEL_UP)
for (int i = event.getOldLevel(); i < event.getNewLevel(); i++) {
int level = i + 1;
for (String t : profess.getEventTriggers()){
if (t.startsWith("level-up-multiple")) {
String[] split = t.split("-");
double multiple = Double.parseDouble(split[split.length-1]);
if (level / multiple % 1 == 0) {
DecimalFormat f = new DecimalFormat("#");
if (event.hasProfession()) {
processTrigger(player, profess, "level-up-multiple-" + event.getProfession().getId().toLowerCase() + "-" + f.format(multiple));
} else {
processTrigger(player, profess, "level-up-multiple-" + f.format(multiple));
}
}
}
}
}
for (String t : profess.getEventTriggers()) {
if (t.startsWith("level-up-multiple")) {
String[] split = t.split("-");
double multiple = Double.parseDouble(split[split.length - 1]);
if (level / multiple % 1 == 0) {
DecimalFormat f = new DecimalFormat("#");
if (event.hasProfession()) {
processTrigger(player, profess, "level-up-multiple-" + event.getProfession().getId().toLowerCase() + "-" + f.format(multiple));
} else {
processTrigger(player, profess, "level-up-multiple-" + f.format(multiple));
}
}
}
}
}
}
public void processTrigger(PlayerData player, PlayerClass profess, String trigger) {
if(profess.hasEventTriggers(trigger)) profess.getEventTriggers(trigger).getTriggers().forEach(t -> t.apply(player));
if (profess.hasEventTriggers(trigger))
profess.getEventTriggers(trigger).getTriggers().forEach(t -> t.apply(player));
}
}

View File

@ -2,7 +2,7 @@ package net.Indyuce.mmocore.api.player.profess.resource;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.util.AltChar;
import org.apache.commons.lang.Validate;
import io.lumine.mythic.lib.util.lang3.Validate;
import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;

View File

@ -5,7 +5,7 @@ import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.ClassOption;
import net.Indyuce.mmocore.api.quest.trigger.ManaTrigger;
import net.Indyuce.mmocore.command.rpg.admin.ResourceCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.admin.ResourceCommandTreeNode;
import java.util.function.BiConsumer;
import java.util.function.Function;
@ -24,21 +24,21 @@ public enum PlayerResource {
(data, amount) -> data.giveMana(amount, PlayerResourceUpdateEvent.UpdateReason.REGENERATION),
(data, amount) -> data.giveMana(amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND),
(data, amount) -> data.giveMana(-amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND),
(data, amount) -> data.setMana(amount)),
(data, amount) -> data.setMana(amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND)),
STAMINA(PlayerData::getStamina,
data -> data.getStats().getStat("MAX_STAMINA"),
(data, amount) -> data.giveStamina(amount, PlayerResourceUpdateEvent.UpdateReason.REGENERATION),
(data, amount) -> data.giveStamina(amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND),
(data, amount) -> data.giveStamina(-amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND),
(data, amount) -> data.setStamina(amount)),
(data, amount) -> data.setStamina(amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND)),
STELLIUM(PlayerData::getStellium,
data -> data.getStats().getStat("MAX_STELLIUM"),
(data, amount) -> data.giveStellium(amount, PlayerResourceUpdateEvent.UpdateReason.REGENERATION),
(data, amount) -> data.giveStellium(amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND),
(data, amount) -> data.giveStellium(-amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND),
(data, amount) -> data.setStellium(amount));
(data, amount) -> data.setStellium(amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND));
private final String regenStat, maxRegenStat;
private final ClassOption offCombatRegen;

View File

@ -1,9 +1,9 @@
package net.Indyuce.mmocore.api.player.profess.resource;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.util.formula.FormulaFailsafeException;
import net.Indyuce.mmocore.util.formula.ScalingFormula;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
import java.util.function.BiFunction;

View File

@ -1,8 +1,8 @@
package net.Indyuce.mmocore.api.player.social;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.apache.commons.lang.Validate;
import java.util.UUID;

View File

@ -15,6 +15,7 @@ import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.player.stats.StatInfo;
import net.Indyuce.mmocore.skill.ClassSkill;
// TODO merge with PlayerData? not really needed class
public class PlayerStats {
private final PlayerData data;
@ -67,8 +68,9 @@ public class PlayerStats {
return data.getProfess().calculateBaseStat(stat, profession == null ? data.getLevel() : data.getCollectionSkills().getLevel(profession), data);
}
public void updateStats() {
updateStats(false);
@Deprecated
public void updateStats(boolean ignored) {
this.updateStats();
}
private static final String MODIFIER_KEY = "MMOCoreClass";
@ -77,25 +79,19 @@ public class PlayerStats {
* Used to update MMOCore stat modifiers due to class and send them over to
* MythicLib. Must be ran everytime the player levels up, changes class or
* when the plugin reloads.
* <p>
* Login scripts are a pretty special case of scripts/skills since they are
* not loaded yet when MythicLib triggers them naturally. Therefore, they
* need to be cast as soon as they are loaded into the MMOCore player data.
*
* @param castLoginScripts Should login scripts be cast
*/
public synchronized void updateStats(boolean castLoginScripts) {
public synchronized void updateStats() {
// Update player stats
getMap().bufferUpdates(() -> {
for (String stat : MMOCore.plugin.statManager.getRegistered()) {
final StatInstance instance = getMap().getInstance(stat);
final var instance = getMap().getInstance(stat);
// Remove modifiers due to class
instance.removeIf(MODIFIER_KEY::equals);
// Add newest one
final double total = getBase(instance.getStat()) - instance.getBase();
final double total = getBase(instance.getStat()) - instance.getDefaultBase();
if (total != 0)
instance.registerModifier(new StatModifier(MODIFIER_KEY, instance.getStat(), total, ModifierType.FLAT, EquipmentSlot.OTHER, ModifierSource.OTHER));
}
@ -115,18 +111,5 @@ public class PlayerStats {
skillMap.removeModifiers("MMOCoreClassScript");
for (PassiveSkill script : data.getProfess().getScripts())
if (script.getType() != TriggerType.LOGIN) skillMap.addModifier(script);
// If data hasn't been synchronized yet, cast LOGIN scripts
if (castLoginScripts) {
// Call class login skills
for (ClassSkill skill : data.getProfess().getSkills())
if (skill.getSkill().getTrigger() == TriggerType.LOGIN)
skill.toCastable(data).cast(data.getMMOPlayerData());
// Call class login scripts
for (PassiveSkill skill : data.getProfess().getScripts())
if (skill.getType() == TriggerType.LOGIN) skill.getTriggeredSkill().cast(data.getMMOPlayerData());
}
}
}

View File

@ -32,6 +32,11 @@ public abstract class ObjectiveProgress implements Closeable {
return questProgress;
}
public double getProgress() {
// default to 0, maybe ppl implemented quest objectives
return 0;
}
@Override
public void close() {
if (this instanceof Listener)

View File

@ -6,6 +6,7 @@ import io.lumine.mythic.lib.gson.JsonObject;
import io.lumine.mythic.lib.util.Closeable;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.apache.commons.lang3.Validate;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.boss.BarColor;
@ -24,27 +25,25 @@ import java.util.logging.Level;
public class PlayerQuests implements Closeable {
private final PlayerData playerData;
private final Map<String, Long> finished = new HashMap<>();
@Nullable
private final BossBar bossbar;
private final NamespacedKey bossbarNamespacedKey;
@Nullable
private BossBar bossbar;
private QuestProgress current;
public PlayerQuests(PlayerData playerData) {
this.playerData = playerData;
if (!MMOCore.plugin.configManager.disableQuestBossBar && playerData.isOnline()) {
bossbarNamespacedKey = new NamespacedKey(MMOCore.plugin, "mmocore_quest_progress_" + playerData.getUniqueId().toString());
bossbar = Bukkit.createBossBar(bossbarNamespacedKey, "", BarColor.PURPLE, BarStyle.SEGMENTED_20);
bossbar.addPlayer(playerData.getPlayer());
bossbar.setVisible(false); // Safety
bossbarNamespacedKey = new NamespacedKey(MMOCore.plugin, "quest_progress_" + playerData.getUniqueId());
/*
Bukkit.getScheduler().runTaskTimer(MMOCore.plugin, () -> {
// Bossbar is disabled
} else {
bossbarNamespacedKey = null;
bossbar = null;
}
Bukkit.broadcastMessage("bossbar=" + bossbar);
Bukkit.broadcastMessage("current=" + current);
}, 20, 20);
*/
}
public PlayerQuests load(ConfigurationSection config) {
@ -69,6 +68,8 @@ public class PlayerQuests implements Closeable {
return this;
}
//region DB
public void save(ConfigurationSection config) {
if (current != null) {
config.set("current.id", current.getQuest().getId());
@ -93,7 +94,7 @@ public class PlayerQuests implements Closeable {
for (String key : finished.keySet())
fin.addProperty(key, finished.get(key));
if (finished.size() != 0)
if (!finished.isEmpty())
json.add("finished", fin);
return json.toString();
}
@ -114,6 +115,8 @@ public class PlayerQuests implements Closeable {
finished.put(entry.getKey(), entry.getValue().getAsLong());
}
//endregion DB
public QuestProgress getCurrent() {
return current;
}
@ -135,6 +138,7 @@ public class PlayerQuests implements Closeable {
}
public void finishCurrent() {
Validate.notNull(current, "No ongoing quest");
finished.put(current.getQuest().getId(), System.currentTimeMillis());
start(null);
}
@ -147,35 +151,36 @@ public class PlayerQuests implements Closeable {
return new Date(finished.get(quest.getId()));
}
public void start(Quest quest) {
public void start(@Nullable Quest quest) {
// Close current objective progress if quest is active
closeCurrentQuest();
cancelCurrentQuest();
// Apply newest quest
current = quest == null ? null : quest.generateNewProgress(playerData);
updateBossBar();
}
public void closeCurrentQuest() {
if (current == null)
return;
public void cancelCurrentQuest() {
if (current == null) return;
current.getProgress().close();
current = null;
}
@Deprecated
public void closeCurrentQuest() {
cancelCurrentQuest();
}
@Override
public void close() {
// Remove boss bar
if (bossbar != null) {
bossbar.removeAll();
Bukkit.removeBossBar(bossbarNamespacedKey);
}
if (bossbar != null) deleteBossbar();
// Close current objective progress
closeCurrentQuest();
// Close only progress
if (current != null) current.getProgress().close();
}
public boolean checkCooldownAvailability(Quest quest) {
@ -193,20 +198,50 @@ public class PlayerQuests implements Closeable {
return true;
}
public void updateBossBar() {
//region Bossbar
// Bossbar is disabled
if (bossbar == null)
return;
if (!hasCurrent() || !current.getProgress().getObjective().hasLore()) {
bossbar.setVisible(false);
return;
}
private boolean isBossbarRelevant() {
return !MMOCore.plugin.configManager.disableQuestBossBar
&& current != null
&& current.getQuest().usesBossbar();
}
private void initializeBossbar() {
Validate.isTrue(this.bossbar == null, "Tried to create a new bossbar while one already exists");
this.bossbar = Bukkit.createBossBar(bossbarNamespacedKey, "", BarColor.PURPLE, BarStyle.SEGMENTED_20);
bossbar.addPlayer(playerData.getPlayer());
bossbar.setVisible(true);
}
private void deleteBossbar() {
Validate.notNull(this.bossbar, "Bossbar is null");
bossbar.removeAll();
Bukkit.removeBossBar(bossbarNamespacedKey);
this.bossbar = null;
}
public void updateBossBar() {
final var flag = isBossbarRelevant();
final var enabled = bossbar != null;
// Initialize/remove if needed
if (enabled && !flag) deleteBossbar();
else if (!enabled && flag) initializeBossbar();
// Bossbar
if (bossbar == null) return;
final var bossbarProgress = current.getQuest().isObjectiveBossbar()
// Fine tuned progress
? current.getProgress().getProgress()
// Based on objective number
: (double) current.getObjectiveNumber() / current.getQuest().getObjectives().size();
bossbar.setColor(current.getProgress().getObjective().getBarColor());
bossbar.setTitle(current.getFormattedLore());
bossbar.setProgress((double) current.getObjectiveNumber() / current.getQuest().getObjectives().size());
bossbar.setProgress(bossbarProgress);
}
//endregion
}

View File

@ -3,11 +3,11 @@ package net.Indyuce.mmocore.api.quest;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.PostLoadAction;
import io.lumine.mythic.lib.util.PreloadedObject;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.quest.objective.Objective;
import net.Indyuce.mmocore.experience.Profession;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
@ -20,6 +20,7 @@ public class Quest implements PreloadedObject {
private final List<Objective> objectives = new ArrayList<>();
private final List<String> lore;
private final int mainLevelRestriction;
private final boolean useBossbar, objectiveBossbar;
private final Map<Profession, Integer> levelRestrictions = new HashMap<>();
// Cooldown in millis
@ -40,6 +41,8 @@ public class Quest implements PreloadedObject {
cooldown = (long) (config.contains("delay") ? config.getDouble("delay") * 60 * 60 * 1000 : -1);
name = config.getString("name");
lore = config.getStringList("lore");
objectiveBossbar = config.getBoolean("bossbar.objective", true);
useBossbar = config.getBoolean("bossbar.enabled", true);
mainLevelRestriction = config.getInt("level-req.main");
@ -80,6 +83,14 @@ public class Quest implements PreloadedObject {
return id;
}
public boolean usesBossbar() {
return useBossbar;
}
public boolean isObjectiveBossbar() {
return objectiveBossbar;
}
public String getName() {
return name;
}

View File

@ -8,7 +8,7 @@ public class QuestProgress {
private final Quest quest;
private final PlayerData player;
private int objective;
private int objectiveIndex;
private ObjectiveProgress objectiveProgress;
public QuestProgress(Quest quest, PlayerData player) {
@ -19,7 +19,7 @@ public class QuestProgress {
this.quest = quest;
this.player = player;
this.objective = objective;
this.objectiveIndex = objective;
objectiveProgress = nextObjective().newProgress(this);
}
@ -32,7 +32,7 @@ public class QuestProgress {
}
public int getObjectiveNumber() {
return objective;
return objectiveIndex;
}
public ObjectiveProgress getProgress() {
@ -40,18 +40,19 @@ public class QuestProgress {
}
private Objective nextObjective() {
return quest.getObjectives().get(objective);
return quest.getObjectives().get(objectiveIndex);
}
public void completeObjective() {
objective++;
objectiveIndex++;
objectiveProgress.close();
final ObjectiveProgress finishedObjectiveProgress = objectiveProgress;
final var finishedObjectiveProgress = objectiveProgress;
// Start next objective, or end quest.
if (objective >= quest.getObjectives().size()) player.getQuestData().finishCurrent();
if (objectiveIndex >= quest.getObjectives().size()) player.getQuestData().finishCurrent();
else objectiveProgress = nextObjective().newProgress(this);
// Update bossbar
player.getQuestData().updateBossBar();
/*

View File

@ -1,9 +1,9 @@
package net.Indyuce.mmocore.api.quest.objective;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
@ -31,13 +31,13 @@ public class ClickonObjective extends Objective {
}
@Override
public ObjectiveProgress newProgress(QuestProgress questProgress) {
return new GotoProgress(questProgress, this);
public GotoProgress newProgress(QuestProgress questProgress) {
return new GotoProgress(questProgress);
}
public class GotoProgress extends ObjectiveProgress implements Listener {
public GotoProgress(QuestProgress questProgress, Objective objective) {
super(questProgress, objective);
public GotoProgress(QuestProgress questProgress) {
super(questProgress, ClickonObjective.this);
}
@EventHandler
@ -51,6 +51,11 @@ public class ClickonObjective extends Objective {
getQuestProgress().completeObjective();
}
@Override
public double getProgress() {
return 1d;
}
@Override
public String formatLore(String lore) {
return lore;

View File

@ -1,9 +1,9 @@
package net.Indyuce.mmocore.api.quest.objective;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
@ -29,18 +29,20 @@ public class GoToObjective extends Objective {
}
@Override
public ObjectiveProgress newProgress(QuestProgress questProgress) {
return new GotoProgress(questProgress, this);
public GotoProgress newProgress(QuestProgress questProgress) {
return new GotoProgress(questProgress);
}
public class GotoProgress extends ObjectiveProgress implements Listener {
public GotoProgress(QuestProgress questProgress, Objective objective) {
super(questProgress, objective);
public GotoProgress(QuestProgress questProgress) {
super(questProgress, GoToObjective.this);
}
@EventHandler
public void a(PlayerMoveEvent event) {
if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockY() == event.getTo().getBlockY() && event.getFrom().getBlockZ() == event.getTo().getBlockZ())
if (event.getFrom().getBlockX() == event.getTo().getBlockX()
&& event.getFrom().getBlockY() == event.getTo().getBlockY()
&& event.getFrom().getBlockZ() == event.getTo().getBlockZ())
return;
Player player = event.getPlayer();
@ -50,6 +52,11 @@ public class GoToObjective extends Objective {
}
}
@Override
public double getProgress() {
return 1d;
}
@Override
public String formatLore(String lore) {
return lore;

View File

@ -23,26 +23,32 @@ public class KillMobObjective extends Objective {
}
@Override
public ObjectiveProgress newProgress(QuestProgress questProgress) {
return new KillMobProgress(questProgress, this);
public KillMobProgress newProgress(QuestProgress questProgress) {
return new KillMobProgress(questProgress);
}
public class KillMobProgress extends ObjectiveProgress implements Listener {
private int count;
public KillMobProgress(QuestProgress questProgress, Objective objective) {
super(questProgress, objective);
public KillMobProgress(QuestProgress questProgress) {
super(questProgress, KillMobObjective.this);
}
@EventHandler
public void a(PlayerKillEntityEvent event) {
if(!getPlayer().isOnline()) return;
if (event.getTarget().getType() == type && event.getPlayer().equals(getPlayer().getPlayer())) {
count++;
getQuestProgress().getPlayer().getQuestData().updateBossBar();
if (count >= required)
getQuestProgress().completeObjective();
}
@EventHandler
public void a(PlayerKillEntityEvent event) {
if (!getPlayer().isOnline()) return;
if (event.getTarget().getType() == type && event.getPlayer().equals(getPlayer().getPlayer())) {
count++;
getQuestProgress().getPlayer().getQuestData().updateBossBar();
if (count >= required)
getQuestProgress().completeObjective();
}
}
@Override
public double getProgress() {
return (double) count / required;
}
@Override

View File

@ -54,6 +54,11 @@ public class MineBlockObjective extends Objective {
}
}
@Override
public double getProgress() {
return (double) count / required;
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void b(CustomBlockMineEvent event) {
if(!getQuestProgress().getPlayer().isOnline()) return;

View File

@ -1,11 +1,11 @@
package net.Indyuce.mmocore.api.quest.objective;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import org.apache.commons.lang.Validate;
import org.bukkit.boss.BarColor;
import org.bukkit.configuration.ConfigurationSection;

View File

@ -1,40 +1,37 @@
package net.Indyuce.mmocore.api.quest.trigger;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.math.formula.RandomAmount;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.SimpleExperienceObject;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.NotNull;
import net.Indyuce.mmocore.experience.Profession;
import org.jetbrains.annotations.Nullable;
public class ExperienceTrigger extends Trigger {
@NotNull
private final RandomAmount amount;
@NotNull
private final EXPSource source;
@NotNull
private final ExperienceDispenser dispenser;
@Nullable
private final Profession profession;
public ExperienceTrigger(MMOLineConfig config) {
super(config);
config.validate("amount");
if (config.contains("profession")) {
String id = config.getString("profession").toLowerCase().replace("_", "-");
Validate.isTrue(MMOCore.plugin.professionManager.has(id), "Could not find profession");
dispenser = MMOCore.plugin.professionManager.get(id);
} else
dispenser = new SimpleExperienceObject();
if (config.contains("profession")) {
String id = config.getString("profession").toLowerCase().replace("_", "-");
Validate.isTrue(MMOCore.plugin.professionManager.has(id), "Could not find profession");
profession = MMOCore.plugin.professionManager.get(id);
} else profession = null;
amount = new RandomAmount(config.getString("amount"));
source = config.contains("source") ? EXPSource.valueOf(config.getString("source").toUpperCase()) : EXPSource.QUEST;
}
@Override
public void apply(PlayerData player) {
dispenser.giveExperience(player, amount.calculate(), null, source);
}
if (profession != null) profession.giveExperience(player, amount.calculate(), null, source);
else player.getProfess().giveExperience(player, amount.calculate(), null, source);
}
}

View File

@ -2,9 +2,9 @@ package net.Indyuce.mmocore.api.quest.trigger;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.config.YamlFile;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.apache.commons.lang.Validate;
import java.util.ArrayList;
import java.util.List;

View File

@ -26,7 +26,7 @@ public class ManaTrigger extends Trigger {
// Set mana
else if (operation == Operation.SET)
player.setMana(amount.calculate());
player.setMana(amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
// Take mana
else

View File

@ -5,12 +5,12 @@ import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.player.modifier.ModifierType;
import io.lumine.mythic.lib.player.skillmod.SkillModifier;
import io.lumine.mythic.lib.skill.handler.SkillHandler;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.quest.trigger.api.Removable;
import net.Indyuce.mmocore.api.quest.trigger.api.Temporary;
import net.Indyuce.mmocore.skill.RegisteredSkill;
import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.NotNull;
import java.util.List;

View File

@ -1,27 +1,23 @@
package net.Indyuce.mmocore.api.quest.trigger;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.version.Sounds;
import io.lumine.mythic.lib.message.SoundReader;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.bukkit.Sound;
public class SoundTrigger extends Trigger {
private final Sound sound;
private final float vol, pitch;
private final SoundReader sound;
public SoundTrigger(MMOLineConfig config) {
super(config);
config.validate("sound");
sound = Sounds.fromName(config.getString("sound").toUpperCase().replace("-", "_"));
vol = config.contains("volume") ? (float) config.getDouble("volume") : 1f;
pitch = config.contains("pitch") ? (float) config.getDouble("pitch") : 1f;
sound = new SoundReader(config);
}
@Override
public void apply(PlayerData player) {
if(!player.isOnline()) return;
player.getPlayer().playSound(player.getPlayer().getLocation(), sound, vol, pitch);
sound.play(player.getPlayer());
}
}

View File

@ -7,30 +7,29 @@ import net.Indyuce.mmocore.api.quest.trigger.ManaTrigger.Operation;
import net.Indyuce.mmocore.api.util.math.formula.RandomAmount;
public class StaminaTrigger extends Trigger {
private final RandomAmount amount;
private final Operation operation;
private final RandomAmount amount;
private final Operation operation;
public StaminaTrigger(MMOLineConfig config) {
super(config);
public StaminaTrigger(MMOLineConfig config) {
super(config);
config.validate("amount");
amount = new RandomAmount(config.getString("amount"));
operation = config.contains("operation") ? Operation.valueOf(config.getString("operation").toUpperCase()) : Operation.GIVE;
}
config.validate("amount");
amount = new RandomAmount(config.getString("amount"));
operation = config.contains("operation") ? Operation.valueOf(config.getString("operation").toUpperCase()) : Operation.GIVE;
}
@Override
public void apply(PlayerData player) {
@Override
public void apply(PlayerData player) {
// Give stamina
if (operation == Operation.GIVE)
player.giveStamina(amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
// Give stamina
if (operation == Operation.GIVE)
player.giveStamina(amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
// Set stamina
else if (operation == Operation.SET)
player.setStamina(amount.calculate());
// Set stamina
else if (operation == Operation.SET)
player.setStamina(amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
// Take stamina
else
player.giveStamina(-amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
}
// Take stamina
else player.giveStamina(-amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
}
}

View File

@ -3,10 +3,10 @@ package net.Indyuce.mmocore.api.quest.trigger;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.api.stat.modifier.StatModifier;
import io.lumine.mythic.lib.player.modifier.ModifierType;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.quest.trigger.api.Removable;
import net.Indyuce.mmocore.api.quest.trigger.api.Temporary;
import org.apache.commons.lang.Validate;
public class StatTrigger extends Trigger implements Removable, Temporary {
private final StatModifier modifier;

View File

@ -7,30 +7,29 @@ import net.Indyuce.mmocore.api.quest.trigger.ManaTrigger.Operation;
import net.Indyuce.mmocore.api.util.math.formula.RandomAmount;
public class StelliumTrigger extends Trigger {
private final RandomAmount amount;
private final Operation operation;
private final RandomAmount amount;
private final Operation operation;
public StelliumTrigger(MMOLineConfig config) {
super(config);
public StelliumTrigger(MMOLineConfig config) {
super(config);
config.validate("amount");
amount = new RandomAmount(config.getString("amount"));
operation = config.contains("operation") ? Operation.valueOf(config.getString("operation").toUpperCase()) : Operation.GIVE;
}
config.validate("amount");
amount = new RandomAmount(config.getString("amount"));
operation = config.contains("operation") ? Operation.valueOf(config.getString("operation").toUpperCase()) : Operation.GIVE;
}
@Override
public void apply(PlayerData player) {
@Override
public void apply(PlayerData player) {
// Give stellium
if (operation == Operation.GIVE)
player.giveStellium(amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
// Give stellium
if (operation == Operation.GIVE)
player.giveStellium(amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
// Set stellium
else if (operation == Operation.SET)
player.setStellium(amount.calculate());
// Set stellium
else if (operation == Operation.SET)
player.setStellium(amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
// Take stellium
else
player.giveStellium(-amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
}
// Take stellium
else player.giveStellium(-amount.calculate(), PlayerResourceUpdateEvent.UpdateReason.TRIGGER);
}
}

View File

@ -1,9 +1,9 @@
package net.Indyuce.mmocore.api.quest.trigger;
import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.quest.trigger.api.Removable;
import org.apache.commons.lang.Validate;
public class UnlockSlotTrigger extends Trigger implements Removable {

View File

@ -3,14 +3,17 @@ package net.Indyuce.mmocore.api.util;
import com.google.common.collect.MultimapBuilder;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.gson.JsonArray;
import io.lumine.mythic.lib.gson.JsonObject;
import io.lumine.mythic.lib.hologram.Hologram;
import io.lumine.mythic.lib.util.lang3.Validate;
import io.lumine.mythic.lib.version.Attributes;
import io.lumine.mythic.lib.version.VEnchantment;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.util.Icon;
import org.apache.commons.lang.Validate;
import org.bukkit.*;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
@ -51,6 +54,12 @@ public class MMOCoreUtils {
return player.getName() == null;
}
public static boolean callLegacyCommandEvent(PlayerData playerData, CommandTreeRoot command) {
final var called = new MMOCommandEvent(playerData, command);
Bukkit.getServer().getPluginManager().callEvent(called);
return called.isCancelled();
}
@Deprecated
public static String displayName(ItemStack item) {
return item.hasItemMeta() && item.getItemMeta().hasDisplayName() ? item.getItemMeta().getDisplayName()
@ -62,7 +71,10 @@ public class MMOCoreUtils {
* @param maxStat Maximum value of resource
* @return Clamped resource value. If the provided current value is 0,
* this function will return the maximum resource value.
* @deprecated Not used anymore
* @see UtilityMethods#setHealth(LivingEntity, double)
*/
@Deprecated
public static double fixResource(double current, double maxStat) {
return current == 0 ? maxStat : Math.max(0, Math.min(current, maxStat));
}
@ -125,6 +137,7 @@ public class MMOCoreUtils {
return material == Material.PLAYER_HEAD || material == Material.PLAYER_WALL_HEAD;
}
@Deprecated
public static void addAllItemFlags(@NotNull ItemMeta meta) {
meta.addItemFlags(ItemFlag.values());

View File

@ -1,6 +1,6 @@
package net.Indyuce.mmocore.api.util.math.formula;
import org.apache.commons.lang.Validate;
import io.lumine.mythic.lib.util.lang3.Validate;
import java.util.Random;

View File

@ -0,0 +1,137 @@
package net.Indyuce.mmocore.command;
import io.lumine.mythic.lib.command.argument.Argument;
import io.lumine.mythic.lib.command.argument.ArgumentParseException;
import io.lumine.mythic.lib.command.argument.PermissionException;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.api.quest.Quest;
import net.Indyuce.mmocore.experience.Booster;
import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.skill.RegisteredSkill;
import net.Indyuce.mmocore.skilltree.tree.SkillTree;
import net.Indyuce.mmocore.waypoint.Waypoint;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class Arguments {
public static final Argument<@NotNull PlayerClass> CLASS = new Argument<>("class",
(explorer, list) -> MMOCore.plugin.classManager.getAll().forEach(profess -> list.add(profess.getId())),
(explorer, input) -> {
final var profess = MMOCore.plugin.classManager.get(input.toUpperCase().replace("-", "_"));
if (profess == null) throw new ArgumentParseException("Could not find class with ID '" + input + "'");
return profess;
});
public static final Argument<@NotNull Waypoint> WAYPOINT = new Argument<>("waypoint",
(explorer, list) -> MMOCore.plugin.waypointManager.getAll().forEach(way -> list.add(way.getId())),
(explorer, input) -> {
final var waypoint = MMOCore.plugin.waypointManager.get(input);
if (waypoint == null)
throw new ArgumentParseException("Could not find waypoint with ID '" + input + "'");
return waypoint;
});
public static final Argument<@Nullable String> ACCEPT_OR_DENY_OPTIONAL = Argument.choices("accept/deny", "accept", "deny").withFallback(explorer -> null);
public static final Argument<@NotNull Player> PLAYER_IF_OP = new Argument<>("player",
(explorer, list) -> {
if (!explorer.getSender().hasPermission("mmocore.admin")) return;
Bukkit.getOnlinePlayers().forEach(online -> list.add(online.getName()));
},
(explorer, input) -> {
if (!explorer.getSender().hasPermission("mmocore.admin")) throw new PermissionException();
final var player = Bukkit.getPlayer(input);
Validate.notNull(player, "Could not find player " + input);
return player;
}, explorer -> {
if (explorer.getSender() instanceof Player) return (Player) explorer.getSender();
throw new ArgumentParseException("Please provide a player");
});
public static final Argument<@NotNull PlayerAttribute> ATTRIBUTE = new Argument<>("attribute",
(explorer, list) -> MMOCore.plugin.attributeManager.getAll().forEach(attribute -> list.add(attribute.getId())),
(explorer, input) -> {
final var attribute = MMOCore.plugin.attributeManager.get(input);
if (attribute == null)
throw new ArgumentParseException("Could not find attribute with ID '" + input + "'");
return attribute;
});
public static final Argument<@NotNull RegisteredSkill> SKILL = new Argument<>("skill",
(explorer, list) -> MMOCore.plugin.skillManager.getAll().forEach(skill -> list.add(skill.getHandler().getId().toUpperCase())),
(explorer, input) -> {
final var skill = MMOCore.plugin.skillManager.getSkill(input);
if (skill == null) throw new ArgumentParseException("Could not find skill with ID '" + input + "'");
return skill;
});
public static final Argument<Profession> PROFESSION = new Argument<>("profession/main", (explorer, list) -> {
MMOCore.plugin.professionManager.getAll().forEach(profession -> list.add(profession.getId()));
list.add("main");
}, (explorer, input) -> {
if (input.equalsIgnoreCase("main")) return null;
final var profession = MMOCore.plugin.professionManager.get(input);
if (profession == null) throw new ArgumentParseException("Could not find profession with ID '" + input + "'");
return profession;
});
public static final Argument<Booster> BOOSTER = new Argument<>("booster_id",
(explorer, list) -> MMOCore.plugin.boosterManager.getActive().forEach(booster -> list.add(String.valueOf(booster.getUniqueId()))),
(explorer, input) -> {
try {
final var uuid = java.util.UUID.fromString(input);
for (Booster booster : MMOCore.plugin.boosterManager.getActive())
if (booster.getUniqueId().equals(uuid))
return booster;
throw new ArgumentParseException("Could not find active booster with ID '" + input + "'");
} catch (IllegalArgumentException exception) {
throw new ArgumentParseException("Invalid UUID '" + input + "'");
}
});
public static final Argument<Quest> QUEST = new Argument<>("quest",
(explorer, list) -> MMOCore.plugin.questManager.getAll().forEach(quest -> list.add(quest.getId())),
(explorer, input) -> {
final var quest = MMOCore.plugin.questManager.get(input);
if (quest == null) throw new ArgumentParseException("Could not find quest with ID '" + input + "'");
return quest;
});
public static final Argument<SkillTree> SKILL_TREE = new Argument<>("skill_tree_id",
(explorer, list) -> MMOCore.plugin.skillTreeManager.getAll().forEach(skillTree -> list.add(skillTree.getId())),
(explorer, input) -> {
final var skillTree = MMOCore.plugin.skillTreeManager.get(input);
if (skillTree == null)
throw new ArgumentParseException("Could not find skill tree with ID '" + input + "'");
return skillTree;
});
public static final String SKILL_TREE_GLOBAL_KEY = "global";
public static final Argument<@Nullable SkillTree> SKILL_TREE_OR_GLOBAL = new Argument<>("skill_tree_id",
(explorer, list) -> {
list.add("global");
MMOCore.plugin.skillTreeManager.getAll().forEach(skillTree -> list.add(skillTree.getId()));
},
(explorer, input) -> {
if (input.equalsIgnoreCase(SKILL_TREE_GLOBAL_KEY)) return null;
final var skillTree = MMOCore.plugin.skillTreeManager.get(input);
if (skillTree == null)
throw new ArgumentParseException("Could not find skill tree with ID '" + input + "' and not '" + SKILL_TREE_GLOBAL_KEY + "'");
return skillTree;
});
public static final Argument<@NotNull Integer> INDEX = Argument.AMOUNT_INT
.withKey("index")
.withAutoComplete((explorer, list) -> {
for (int j = 1; j <= 9; j++)
list.add(String.valueOf(j));
});
}

View File

@ -1,35 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class AttributesCommand extends RegisteredCommand {
public AttributesCommand(ConfigurationSection config) {
super(config, ToggleableCommand.ATTRIBUTES);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.attributes"))
return false;
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + "This command is for players only.");
return true;
}
PlayerData data = PlayerData.get((Player) sender);
MMOCommandEvent event = new MMOCommandEvent(data, "attributes");
Bukkit.getServer().getPluginManager().callEvent(event);
if(!event.isCancelled()) InventoryManager.ATTRIBUTE_VIEW.newInventory(data).open();
return true;
}
}

View File

@ -1,40 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class ClassCommand extends RegisteredCommand {
public ClassCommand(ConfigurationSection config) {
super(config, ToggleableCommand.CLASS);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.class-select"))
return false;
Player player = args.length > 0 && sender.hasPermission("mmocore.admin") ? Bukkit.getPlayer(args[0]) : sender instanceof Player ? (Player) sender : null;
if (player == null) {
sender.sendMessage(ChatColor.RED + "Please specify a valid player.");
return true;
}
PlayerData data = PlayerData.get(player);
MMOCommandEvent event = new MMOCommandEvent(data, "class");
Bukkit.getServer().getPluginManager().callEvent(event);
if(event.isCancelled()) return true;
if (data.getProfess().getSubclasses().stream().anyMatch(sub -> sub.getLevel() <= data.getLevel()))
InventoryManager.SUBCLASS_SELECT.newInventory(data).open();
else
InventoryManager.CLASS_SELECT.newInventory(data).open();
return true;
}
}

View File

@ -1,47 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.gui.eco.DepositMenu;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class DepositCommand extends RegisteredCommand {
public DepositCommand(ConfigurationSection config) {
super(config, ToggleableCommand.DEPOSIT);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.currency"))
return false;
Player player = args.length > 0 && sender.hasPermission("mmocore.admin") ? Bukkit.getPlayer(args[0]) : sender instanceof Player ? (Player) sender : null;
if (player == null) {
sender.sendMessage(ChatColor.RED + "Please specify a valid player.");
return true;
}
// if (sender instanceof Player)
// if (!isNearEnderchest(((Player) sender).getLocation())) {
// sender.sendMessage(ConfigMessage.fromKey("stand-near-enderchest"));
// return true;
// }
new DepositMenu(player).open();
return true;
}
// private boolean isNearEnderchest(Location loc) {
// for (int x = -5; x < 6; x++)
// for (int y = -5; y < 6; y++)
// for (int z = -5; z < 6; z++)
// if (loc.clone().add(x, y, z).getBlock().getType() ==
// Material.ENDER_CHEST)
// return true;
// return false;
// }
}

View File

@ -1,74 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.social.FriendRequest;
import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class FriendsCommand extends RegisteredCommand {
public FriendsCommand(ConfigurationSection config) {
super(config, ToggleableCommand.FRIENDS);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.friends"))
return false;
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + "This command is for players only.");
return true;
}
PlayerData data = PlayerData.get((Player) sender);
MMOCommandEvent event = new MMOCommandEvent(data, "friends");
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return true;
if (args.length > 1) {
final @Nullable FriendRequest invite;
if (args.length > 1)
// Search by request ID
try {
final UUID uuid = UUID.fromString(args[1]);
final Request req = MMOCore.plugin.requestManager.getRequest(uuid);
Validate.isTrue(!req.isTimedOut() && req instanceof FriendRequest);
Validate.isTrue(!data.hasFriend(req.getCreator().getUniqueId()));
invite = (FriendRequest) req;
} catch (Exception exception) {
return true;
}
// Search by target player
else
invite = MMOCore.plugin.requestManager.findRequest(data, FriendRequest.class);
// No invite found with given identifier/target player
if (invite == null)
return true;
if (args[0].equalsIgnoreCase("accept"))
invite.accept();
if (args[0].equalsIgnoreCase("deny"))
invite.deny();
return true;
}
InventoryManager.FRIEND_LIST.newInventory(data).open();
return true;
}
}

View File

@ -1,78 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.guild.provided.GuildInvite;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class GuildCommand extends RegisteredCommand {
public GuildCommand(ConfigurationSection config) {
super(config, ToggleableCommand.GUILD);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.guild"))
return false;
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + "This command is for players only.");
return true;
}
PlayerData data = PlayerData.get((OfflinePlayer) sender);
MMOCommandEvent event = new MMOCommandEvent(data, "guild");
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return true;
if (args.length >= 1) {
final @Nullable GuildInvite invite;
if (args.length > 1)
// Search by request ID
try {
final UUID uuid = UUID.fromString(args[1]);
final Request req = MMOCore.plugin.requestManager.getRequest(uuid);
Validate.isTrue(!req.isTimedOut() && req instanceof GuildInvite);
invite = (GuildInvite) req;
Validate.isTrue(MMOCore.plugin.nativeGuildManager.isRegistered(invite.getGuild()));
} catch (Exception exception) {
return true;
}
// Search by target player
else
invite = MMOCore.plugin.requestManager.findRequest(data, GuildInvite.class);
// No invite found with given identifier/target player
if (invite == null)
return true;
if (args[0].equalsIgnoreCase("accept"))
invite.accept();
if (args[0].equalsIgnoreCase("deny"))
invite.deny();
return true;
}
if (data.inGuild())
InventoryManager.GUILD_VIEW.newInventory(data).open();
else
InventoryManager.GUILD_CREATION.newInventory(data).open();
return true;
}
}

View File

@ -1,39 +0,0 @@
package net.Indyuce.mmocore.command;
import io.lumine.mythic.lib.command.api.CommandTreeRoot;
import io.lumine.mythic.lib.command.api.Parameter;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.command.rpg.CastCommandTreeNode;
import net.Indyuce.mmocore.command.rpg.CoinsCommandTreeNode;
import net.Indyuce.mmocore.command.rpg.NoteCommandTreeNode;
import net.Indyuce.mmocore.command.rpg.ReloadCommandTreeNode;
import net.Indyuce.mmocore.command.rpg.admin.AdminCommandTreeNode;
import net.Indyuce.mmocore.command.rpg.booster.BoosterCommandTreeNode;
import net.Indyuce.mmocore.command.rpg.debug.DebugCommandTreeNode;
import net.Indyuce.mmocore.command.rpg.quest.QuestCommandTreeNode;
import net.Indyuce.mmocore.command.rpg.waypoint.WaypointsCommandTreeNode;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.TabCompleter;
public class MMOCoreCommandTreeRoot extends CommandTreeRoot implements CommandExecutor, TabCompleter {
public static final Parameter PROFESSION = new Parameter("<profession/main>", (explorer, list) -> {
MMOCore.plugin.professionManager.getAll().forEach(profession -> list.add(profession.getId()));
list.add("main");
});
public static final Parameter QUEST = new Parameter("<quest>",
(explorer, list) -> MMOCore.plugin.questManager.getAll().forEach(quest -> list.add(quest.getId())));
public MMOCoreCommandTreeRoot() {
super("mmocore", "mmocore.admin");
addChild(new ReloadCommandTreeNode(this));
addChild(new CastCommandTreeNode(this));
addChild(new CoinsCommandTreeNode(this));
addChild(new NoteCommandTreeNode(this));
addChild(new AdminCommandTreeNode(this));
addChild(new DebugCommandTreeNode(this));
addChild(new BoosterCommandTreeNode(this));
addChild(new WaypointsCommandTreeNode(this));
addChild(new QuestCommandTreeNode(this));
}
}

View File

@ -1,82 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.party.provided.MMOCorePartyModule;
import net.Indyuce.mmocore.party.provided.PartyInvite;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class PartyCommand extends RegisteredCommand {
public PartyCommand(ConfigurationSection config) {
super(config, ToggleableCommand.PARTY);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.party"))
return false;
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + "This command is for players only.");
return true;
}
if(!(MMOCore.plugin.partyModule instanceof MMOCorePartyModule)){
sender.sendMessage(ChatColor.RED+"You can't use MMOCore party system as you delegated the party system to another plugin.");
return true;
}
PlayerData data = PlayerData.get((OfflinePlayer) sender);
MMOCommandEvent event = new MMOCommandEvent(data, "party");
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return true;
if (args.length > 0) {
final @Nullable PartyInvite invite;
if (args.length > 1)
// Search by request ID
try {
final Request req = MMOCore.plugin.requestManager.getRequest(UUID.fromString(args[1]));
Validate.isTrue(req instanceof PartyInvite && !req.isTimedOut());
invite = (PartyInvite) req;
Validate.isTrue(((MMOCorePartyModule) MMOCore.plugin.partyModule).isRegistered(invite.getParty()));
} catch (Exception exception) {
return true;
}
// Search by target player
else
invite = MMOCore.plugin.requestManager.findRequest(data, PartyInvite.class);
// No invite found with given identifier/target player
if (invite == null)
return true;
if (args[0].equalsIgnoreCase("accept"))
invite.accept();
else if (args[0].equalsIgnoreCase("deny"))
invite.deny();
return true;
}
if (data.getParty() != null)
InventoryManager.PARTY_VIEW.newInventory(data).open();
else
InventoryManager.PARTY_CREATION.newInventory(data).open();
return true;
}
}

View File

@ -1,34 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class PlayerStatsCommand extends RegisteredCommand {
public PlayerStatsCommand(ConfigurationSection config) {
super(config, ToggleableCommand.PLAYER);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.profile"))
return false;
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + "This command is for players only.");
return true;
}
PlayerData data = PlayerData.get((Player) sender);
MMOCommandEvent event = new MMOCommandEvent(data, "profile");
Bukkit.getServer().getPluginManager().callEvent(event);
if (!event.isCancelled()) InventoryManager.PLAYER_STATS.newInventory(data).open();
return true;
}
}

View File

@ -1,63 +0,0 @@
package net.Indyuce.mmocore.command;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.comp.flags.CustomFlag;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class PvpModeCommand extends RegisteredCommand {
public PvpModeCommand(ConfigurationSection config) {
super(config, ToggleableCommand.PVP_MODE);
}
public static final String COOLDOWN_KEY = "PvpMode";
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + "This command is for players only.");
return false;
}
if (!sender.hasPermission("mmocore.pvpmode")) {
Message.NOT_ENOUGH_PERMS.send((Player) sender);
return false;
}
final PlayerData playerData = PlayerData.get((Player) sender);
// Command cooldown
if (playerData.getCooldownMap().isOnCooldown(COOLDOWN_KEY)) {
var remainingFormatted = MythicLib.plugin.getMMOConfig().decimal.format(playerData.getCooldownMap().getCooldown(COOLDOWN_KEY));
Message.PVP_MODE_COOLDOWN.send((Player) sender, "remaining", remainingFormatted);
return true;
}
playerData.getCombat().setPvpMode(!playerData.getCombat().isInPvpMode());
playerData.getCooldownMap().applyCooldown(COOLDOWN_KEY, playerData.getCombat().isInPvpMode() ? MMOCore.plugin.configManager.pvpModeToggleOnCooldown : MMOCore.plugin.configManager.pvpModeToggleOffCooldown);
// Toggling on when in PVP region
// Give invulnerability for a short time
if (playerData.getCombat().isInPvpMode() &&
MythicLib.plugin.getFlags().isFlagAllowed(playerData.getPlayer(), CustomFlag.PVP_MODE)) {
playerData.getCombat().setInvulnerable(MMOCore.plugin.configManager.pvpModeInvulnerabilityTimeCommand);
var timeFormatted = MythicLib.plugin.getMMOConfig().decimal.format(MMOCore.plugin.configManager.pvpModeInvulnerabilityTimeCommand);
Message.PVP_MODE_TOGGLE_ON_INVULNERABLE.send((Player) sender, "time", timeFormatted);
}
// Just send message otherwise
else {
var currentPvpMode = playerData.getCombat().isInPvpMode();
(currentPvpMode ? Message.PVP_MODE_TOGGLE_ON_SAFE : Message.PVP_MODE_TOGGLE_OFF_SAFE).send((Player) sender);
}
return true;
}
}

View File

@ -1,30 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class QuestsCommand extends RegisteredCommand {
public QuestsCommand(ConfigurationSection config) {
super(config, ToggleableCommand.QUESTS);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.quests"))
return false;
if (sender instanceof Player) {
PlayerData data = PlayerData.get((Player) sender);
MMOCommandEvent event = new MMOCommandEvent(data, "quests");
Bukkit.getServer().getPluginManager().callEvent(event);
if(!event.isCancelled()) InventoryManager.QUEST_LIST.newInventory(data).open();
}
return true;
}
}

View File

@ -1,78 +0,0 @@
package net.Indyuce.mmocore.command;
import io.lumine.mythic.lib.UtilityMethods;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.stream.Collectors;
public class SkillTreesCommand extends RegisteredCommand {
public SkillTreesCommand(ConfigurationSection config) {
super(config, ToggleableCommand.SKILL_TREES);
}
@Override
public boolean execute(@NotNull CommandSender sender, @NotNull String label, String[] args) {
if (!sender.hasPermission("mmocore.skilltrees")) return false;
if (!(sender instanceof Player)) return false;
final Player player = (Player) sender;
PlayerData data = PlayerData.get(player);
MMOCommandEvent event = new MMOCommandEvent(data, "skilltrees");
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled())
return false;
// Default skilltree command
if (args.length == 0) {
if (!MMOCore.plugin.configManager.enableGlobalSkillTreeGUI) {
sender.sendMessage(ChatColor.RED + "Usage: /skilltrees <skilltree_id>");
return false;
}
if (!data.getProfess().getSkillTrees().isEmpty()) {
InventoryManager.TREE_VIEW.newInventory(data).open();
return true;
} else {
Message.NO_SKILL_TREE.send(player);
return false;
}
}
// Specific skilltree command
if (args.length == 1) {
if (!MMOCore.plugin.configManager.enableSpecificSkillTreeGUI) {
sender.sendMessage(ChatColor.RED + "Usage: /skilltrees <skilltree-id>");
return false;
}
if (data.getProfess().getSkillTrees()
.stream()
.filter(skillTree -> UtilityMethods.ymlName(skillTree.getId()).equals(UtilityMethods.ymlName(args[0])))
.collect(Collectors.toList())
.size() != 0) {
InventoryManager.SPECIFIC_TREE_VIEW.get(UtilityMethods.ymlName(args[0])).newInventory(data).open();
return true;
} else {
sender.sendMessage(ChatColor.RED + "Your class does not have a skill tree with id: " + args[0]);
return false;
}
} else {
if (MMOCore.plugin.configManager.enableSpecificSkillTreeGUI)
sender.sendMessage(ChatColor.RED + "Usage: /skilltrees <skilltree-id>");
else
sender.sendMessage(ChatColor.RED + "Usage: /skilltrees");
return false;
}
}
}

View File

@ -1,38 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class SkillsCommand extends RegisteredCommand {
public SkillsCommand(ConfigurationSection config) {
super(config, ToggleableCommand.SKILLS);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.skills")) return false;
if (sender instanceof Player) {
PlayerData data = PlayerData.get((Player) sender);
MMOCommandEvent event = new MMOCommandEvent(data, "skills");
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return true;
if (data.getUnlockedSkills().isEmpty()) {
Message.NO_CLASS_SKILL.send((Player) sender);
return true;
}
InventoryManager.SKILL_LIST.newInventory(data).open();
}
return true;
}
}

View File

@ -0,0 +1,107 @@
package net.Indyuce.mmocore.command;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.util.config.YamlFile;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.command.builtin.*;
import net.Indyuce.mmocore.party.provided.MMOCorePartyModule;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* Commands which can be disabled using commands.yml
*/
public enum ToggleableCommand {
PLAYER("player", "mmocore.profile", "Displays player stats", PlayerStatsCommand::new, "p", "profile"),
ATTRIBUTES("attributes", "mmocore.attributes", "Display and manage attributes", AttributesCommand::new, "att", "stats"),
CLASS("class", "mmocore.class-select", "Select a new class", ClassCommand::new, "c"),
WAYPOINTS("waypoints", "mmocore.waypoints", "Display discovered waypoints", WaypointsCommand::new, "wp"),
QUESTS("quests", "mmocore.quests", "Display available quests", QuestsCommand::new, "q", "journal"),
SKILLS("skills", "mmocore.skills", "Spend skill points to unlock new skills", SkillsCommand::new, "s"),
FRIENDS("friends", "mmocore.friends", "Show online/offline friends", FriendsCommand::new, "f"),
PARTY("party", "mmocore.party", "Invite players in a party to split exp", PartyCommand::new, () -> (MMOCore.plugin.partyModule instanceof MMOCorePartyModule)),
GUILD("guild", "mmocore.guild", "Show players in current guild", GuildCommand::new),
WITHDRAW("withdraw", "mmocore.currency", "Withdraw money into coins and notes", WithdrawCommand::new, () -> MMOCore.plugin.hasEconomy() && MMOCore.plugin.economy.isValid(), "w"),
SKILL_TREES("skilltrees", "mmocore.skilltrees", "Open up the skill tree menu", SkillTreesCommand::new, "st", "trees", "tree"),
DEPOSIT("deposit", "mmocore.currency", "Open the currency deposit menu", DepositCommand::new, "d"),
PVP_MODE("pvpmode", "mmocore.pvpmode", "Toggle on/off PVP mode.", PvpModeCommand::new, "pvp");
private final String mainLabel;
private final String description, permission;
private final Function<ConfigurationSection, CommandTreeRoot> generator;
private final List<String> aliases;
private final Supplier<Boolean> enabled;
ToggleableCommand(@NotNull String mainLabel, @Nullable String permission, @NotNull String description, @NotNull Function<ConfigurationSection, CommandTreeRoot> generator, @NotNull String... aliases) {
this(mainLabel, permission, description, generator, null, aliases);
}
ToggleableCommand(@NotNull String mainLabel, @Nullable String permission, @NotNull String description, @NotNull Function<ConfigurationSection, CommandTreeRoot> generator, @Nullable Supplier<Boolean> enabled, @NotNull String... aliases) {
this.mainLabel = mainLabel;
this.permission = permission;
this.description = description;
this.generator = generator;
this.aliases = Arrays.asList(aliases);
this.enabled = enabled == null ? () -> true : enabled;
}
public String getMainLabel() {
return mainLabel;
}
public String getDescription() {
return description;
}
public String getPermission() {
return permission;
}
public List<String> getAliases() {
return aliases;
}
public String getConfigPath() {
return name().toLowerCase().replace("_", "-");
}
public boolean isEnabled() {
return enabled.get();
}
@Deprecated
public static void register() {
loadCommands();
}
public static void loadCommands() {
// Load default config file
final var config = new YamlFile(MMOCore.plugin, "commands");
if (!config.exists()) {
for (ToggleableCommand cmd : values()) {
final String path = cmd.getConfigPath();
config.getContent().set(path + ".main", cmd.mainLabel);
config.getContent().set(path + ".aliases", cmd.aliases);
config.getContent().set(path + ".description", cmd.description);
config.getContent().set(path + ".permission", cmd.permission);
config.getContent().set(path + ".verbose", "ALL");
}
config.save();
}
// Enable commands individually
final var commandMap = UtilityMethods.getCommandMap();
for (var cmd : values())
if (cmd.enabled.get() && config.getContent().contains(cmd.getConfigPath()))
commandMap.register("mmocore", cmd.generator.apply(config.getContent().getConfigurationSection(cmd.getConfigPath())).toBukkit());
}
}

View File

@ -1,28 +0,0 @@
package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class WaypointsCommand extends RegisteredCommand {
public WaypointsCommand(ConfigurationSection config) {
super(config, ToggleableCommand.WAYPOINTS);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (sender instanceof Player && sender.hasPermission("mmocore.waypoints")) {
PlayerData data = PlayerData.get((Player) sender);
MMOCommandEvent event = new MMOCommandEvent(data, "waypoints");
Bukkit.getServer().getPluginManager().callEvent(event);
if(!event.isCancelled()) InventoryManager.WAYPOINTS.newInventory(data).open();
}
return true;
}
}

View File

@ -1,69 +0,0 @@
package net.Indyuce.mmocore.command;
import io.lumine.mythic.lib.api.player.MMOPlayerData;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.eco.Withdraw;
import net.Indyuce.mmocore.command.api.RegisteredCommand;
import net.Indyuce.mmocore.command.api.ToggleableCommand;
import net.Indyuce.mmocore.player.Message;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
public class WithdrawCommand extends RegisteredCommand {
public WithdrawCommand(ConfigurationSection config) {
super(config, ToggleableCommand.WITHDRAW);
}
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
if (!sender.hasPermission("mmocore.currency"))
return false;
final Player player;
if (args.length >= 2 && sender.hasPermission("mmocore.admin")) player = Bukkit.getPlayer(args[0]);
else if (args.length == 1 && sender.hasPermission("mmocore.admin")) {
Player tryFirstArg = Bukkit.getPlayer(args[0]);
player = tryFirstArg != null ? tryFirstArg : sender instanceof Player ? (Player) sender : null;
} else if (sender instanceof Player) player = (Player) sender;
else player = null;
if (player == null) {
sender.sendMessage(ChatColor.RED + "Please specify a valid player.");
return true;
}
int amount;
try {
if (args.length == 0) amount = 0;
else amount = Integer.parseInt(args[args.length - 1]);
Validate.isTrue(amount >= 0);
} catch (IllegalArgumentException exception) {
if (sender instanceof Player)
Message.WITHDRAW_INVALID_AMOUNT.prepare("arg", args[0]).send((MMOPlayerData) sender);
else sender.sendMessage(ChatColor.RED + "Please specify a valid number.");
return true;
}
Withdraw request = new Withdraw(player);
if (amount == 0) {
request.open();
return true;
}
int left = (int) MMOCore.plugin.economy.getEconomy().getBalance(player) - amount;
if (left < 0) {
Message.WITHDRAW_NOT_ENOUGH_MONEY.send(player, "left", -left);
return true;
}
MMOCore.plugin.economy.getEconomy().withdrawPlayer(player, amount);
request.withdrawAlgorithm(amount);
Message.WITHDRAW_SUCCESS.send(player, "worth", amount);
return true;
}
}

View File

@ -1,70 +0,0 @@
package net.Indyuce.mmocore.command.api;
import io.lumine.mythic.lib.UtilityMethods;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
public class CommandVerbose {
private final Map<CommandType, VerboseValue> values = new HashMap<>();
public void reload(ConfigurationSection config) {
values.clear();
for (CommandType type : CommandType.values())
try {
values.put(type, VerboseValue.valueOf(config.getString(UtilityMethods.ymlName(type.name()), "TRUE").toUpperCase()));
} catch (IllegalArgumentException exception) {
values.put(type, VerboseValue.TRUE);
MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load command verbose action for " + type.name());
}
}
public void handle(CommandSender sender, CommandType type, String verbose) {
switch (values.getOrDefault(type, VerboseValue.FALSE)) {
case FALSE:
return;
case TRUE:
sender.sendMessage(verbose);
break;
case PLAYER:
if (sender instanceof Player)
sender.sendMessage(verbose);
break;
case CONSOLE:
if (sender instanceof ConsoleCommandSender)
sender.sendMessage(verbose);
break;
}
}
public static void verbose(CommandSender sender, CommandType cmd, String verbose) {
MMOCore.plugin.configManager.commandVerbose.handle(sender, cmd, verbose);
}
public enum CommandType {
ATTRIBUTE,
SKILL,
CLASS,
EXPERIENCE,
LEVEL,
NOCD,
POINTS,
SKILL_TREE_POINTS,
RESET,
RESOURCE,
WAYPOINT;
}
private enum VerboseValue {
TRUE,
PLAYER,
CONSOLE,
FALSE
}
}

View File

@ -1,14 +0,0 @@
package net.Indyuce.mmocore.command.api;
import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
public abstract class RegisteredCommand extends BukkitCommand {
public RegisteredCommand(@NotNull ConfigurationSection config, ToggleableCommand command) {
super(config.getString("main"));
setAliases(config.getStringList("aliases"));
setDescription(config.getString("description", command.getDescription()));
}
}

View File

@ -1,111 +0,0 @@
package net.Indyuce.mmocore.command.api;
import io.lumine.mythic.lib.util.config.YamlFile;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.command.*;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandMap;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.logging.Level;
/**
* Commands which can be disabled using commands.yml
*/
public enum ToggleableCommand {
PLAYER("player", "Displays player stats", config -> new PlayerStatsCommand(config), "p", "profile"),
ATTRIBUTES("attributes", "Display and manage attributes", config -> new AttributesCommand(config), "att", "stats"),
CLASS("class", "Select a new class", config -> new ClassCommand(config), "c"),
WAYPOINTS("waypoints", "Display discovered waypoints", config -> new WaypointsCommand(config), "wp"),
QUESTS("quests", "Display available quests", config -> new QuestsCommand(config), "q", "journal"),
SKILLS("skills", "Spend skill points to unlock new skills", config -> new SkillsCommand(config), "s"),
FRIENDS("friends", "Show online/offline friends", config -> new FriendsCommand(config), "f"),
PARTY("party", "Invite players in a party to split exp", config -> new PartyCommand(config)),
GUILD("guild", "Show players in current guild", config -> new GuildCommand(config)),
WITHDRAW("withdraw", "Withdraw money into coins and notes", config -> new WithdrawCommand(config), v -> MMOCore.plugin.hasEconomy() && MMOCore.plugin.economy.isValid(), "w"),
SKILL_TREES("skilltrees", "Open up the skill tree menu", config -> new SkillTreesCommand(config), "st", "trees", "tree"),
DEPOSIT("deposit", "Open the currency deposit menu", config -> new DepositCommand(config), "d"),
PVP_MODE("pvpmode", "Toggle on/off PVP mode.", config -> new PvpModeCommand(config), "pvp");
private final String mainLabel;
private final String description;
private final Function<ConfigurationSection, RegisteredCommand> generator;
private final List<String> aliases;
private final Predicate<Void> enabled;
ToggleableCommand(@NotNull String mainLabel, @NotNull String description, @NotNull Function<ConfigurationSection, RegisteredCommand> generator, @NotNull String... aliases) {
this(mainLabel, description, generator, null, aliases);
}
ToggleableCommand(@NotNull String mainLabel, @NotNull String description, @NotNull Function<ConfigurationSection, RegisteredCommand> generator, @Nullable Predicate<Void> enabled, @NotNull String... aliases) {
this.mainLabel = mainLabel;
this.description = description;
this.generator = generator;
this.aliases = Arrays.asList(aliases);
this.enabled = enabled == null ? v -> true : enabled;
}
public String getMainLabel() {
return mainLabel;
}
public String getDescription() {
return description;
}
public List<String> getAliases() {
return aliases;
}
public String getConfigPath() {
return name().toLowerCase().replace("_", "-");
}
public boolean isEnabled() {
return enabled.test(null);
}
public static void register() {
// Load default config file
if (!new File(MMOCore.plugin.getDataFolder(), "commands.yml").exists()) {
final var config = new YamlFile(MMOCore.plugin, "commands");
for (ToggleableCommand cmd : values()) {
final String path = cmd.getConfigPath();
config.getContent().set(path + ".main", cmd.mainLabel);
config.getContent().set(path + ".aliases", cmd.aliases);
config.getContent().set(path + ".description", cmd.description);
}
config.save();
}
try {
// Find command map
final Field commandMapField = Bukkit.getServer().getClass().getDeclaredField("commandMap");
commandMapField.setAccessible(true);
final CommandMap commandMap = (CommandMap) commandMapField.get(Bukkit.getServer());
// Enable commands individually
final var config = new YamlFile(MMOCore.plugin, "commands").getContent();
for (ToggleableCommand cmd : values())
if (cmd.isEnabled() && config.contains(cmd.getConfigPath()))
commandMap.register("mmocore", cmd.generator.apply(config.getConfigurationSection(cmd.getConfigPath())));
} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING, "Unable to register custom commands:");
exception.printStackTrace();
}
}
}

View File

@ -0,0 +1,35 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class AttributesCommand extends CommandTreeRoot {
private final Argument<Player> argPlayer;
public AttributesCommand(@NotNull ConfigurationSection config) {
super(config);
argPlayer = addArgument(Arguments.PLAYER_IF_OP);
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
final var playerData = PlayerData.get(player);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
InventoryManager.ATTRIBUTE_VIEW.newInventory(playerData).open();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,39 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class ClassCommand extends CommandTreeRoot {
private final Argument<Player> argPlayer;
public ClassCommand(@NotNull ConfigurationSection config) {
super(config);
argPlayer = addArgument(Arguments.PLAYER_IF_OP);
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
final var playerData = PlayerData.get(player);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
// Main class or subclass
if (playerData.getProfess().getSubclasses().stream().anyMatch(sub -> sub.getLevel() <= playerData.getLevel()))
InventoryManager.SUBCLASS_SELECT.newInventory(playerData).open();
else InventoryManager.CLASS_SELECT.newInventory(playerData).open();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,50 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.gui.eco.DepositMenu;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class DepositCommand extends CommandTreeRoot {
private final Argument<Player> argPlayer;
public DepositCommand(@NotNull ConfigurationSection config) {
super(config);
argPlayer = addArgument(Arguments.PLAYER_IF_OP);
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
if (MMOCoreUtils.callLegacyCommandEvent(PlayerData.get(player), this)) return CommandResult.FAILURE;
// if (sender instanceof Player)
// if (!isNearEnderchest(((Player) sender).getLocation())) {
// sender.sendMessage(ConfigMessage.fromKey("stand-near-enderchest"));
// return true;
// }
new DepositMenu(player).open();
return CommandResult.SUCCESS;
}
// private boolean isNearEnderchest(Location loc) {
// for (int x = -5; x < 6; x++)
// for (int y = -5; y < 6; y++)
// for (int z = -5; z < 6; z++)
// if (loc.clone().add(x, y, z).getBlock().getType() ==
// Material.ENDER_CHEST)
// return true;
// return false;
// }
}

View File

@ -0,0 +1,75 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.social.FriendRequest;
import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class FriendsCommand extends CommandTreeRoot {
private final Argument<String> argAction;
public FriendsCommand(ConfigurationSection config) {
super(config);
argAction = addArgument(Arguments.ACCEPT_OR_DENY_OPTIONAL);
setOnlyForPlayers();
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var action = explorer.parse(argAction);
PlayerData playerData = PlayerData.get((Player) sender);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
// Open inventory
if (action == null) {
InventoryManager.FRIEND_LIST.newInventory(playerData).open();
return CommandResult.SUCCESS;
}
final @Nullable FriendRequest invite;
if (args.length > 1)
// Search by request ID
try {
final UUID uuid = UUID.fromString(args[1]);
final Request req = MMOCore.plugin.requestManager.getRequest(uuid);
Validate.isTrue(!req.isTimedOut() && req instanceof FriendRequest);
Validate.isTrue(!playerData.hasFriend(req.getCreator().getUniqueId()));
invite = (FriendRequest) req;
} catch (Exception exception) {
return CommandResult.FAILURE;
}
// Search by target player
else invite = MMOCore.plugin.requestManager.findRequest(playerData, FriendRequest.class);
// No invite found with given identifier/target player
if (invite == null) {
Message.FRIEND_NO_PENDING_INVITE.send(playerData);
return CommandResult.FAILURE;
}
if (args[0].equalsIgnoreCase("accept")) invite.accept();
if (args[0].equalsIgnoreCase("deny")) invite.deny();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,76 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.guild.provided.GuildInvite;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class GuildCommand extends CommandTreeRoot {
private final Argument<String> argAction;
public GuildCommand(ConfigurationSection config) {
super(config);
argAction = addArgument(Arguments.ACCEPT_OR_DENY_OPTIONAL);
setOnlyForPlayers();
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var action = explorer.parse(argAction);
final var playerData = PlayerData.get((Player) sender);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
// Open guild inventory/creation
if (action == null) {
if (playerData.inGuild()) InventoryManager.GUILD_VIEW.newInventory(playerData).open();
else InventoryManager.GUILD_CREATION.newInventory(playerData).open();
return CommandResult.SUCCESS;
}
final @Nullable GuildInvite invite;
if (args.length > 1)
// Search by request ID
try {
final UUID uuid = UUID.fromString(args[1]);
final Request req = MMOCore.plugin.requestManager.getRequest(uuid);
Validate.isTrue(!req.isTimedOut() && req instanceof GuildInvite);
invite = (GuildInvite) req;
Validate.isTrue(MMOCore.plugin.nativeGuildManager.isRegistered(invite.getGuild()));
} catch (Exception exception) {
return CommandResult.FAILURE;
}
// Search by target player
else invite = MMOCore.plugin.requestManager.findRequest(playerData, GuildInvite.class);
// No invite found with given identifier/target player
if (invite == null) {
Message.GUILD_NO_PENDING_INVITE.send(playerData);
return CommandResult.FAILURE;
}
if (args[0].equalsIgnoreCase("accept")) invite.accept();
if (args[0].equalsIgnoreCase("deny")) invite.deny();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,76 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.party.provided.MMOCorePartyModule;
import net.Indyuce.mmocore.party.provided.PartyInvite;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class PartyCommand extends CommandTreeRoot {
private final Argument<String> argAction;
public PartyCommand(ConfigurationSection config) {
super(config);
argAction = addArgument(Arguments.ACCEPT_OR_DENY_OPTIONAL);
setOnlyForPlayers();
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var action = explorer.parse(argAction);
final var playerData = PlayerData.get((Player) sender);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
// Open inventory
if (action == null) {
if (playerData.getParty() != null) InventoryManager.PARTY_VIEW.newInventory(playerData).open();
else InventoryManager.PARTY_CREATION.newInventory(playerData).open();
return CommandResult.SUCCESS;
}
final @Nullable PartyInvite invite;
if (args.length > 1)
// Search by request ID
try {
final Request req = MMOCore.plugin.requestManager.getRequest(UUID.fromString(args[1]));
Validate.isTrue(req instanceof PartyInvite && !req.isTimedOut());
invite = (PartyInvite) req;
Validate.isTrue(((MMOCorePartyModule) MMOCore.plugin.partyModule).isRegistered(invite.getParty()));
} catch (Exception exception) {
return CommandResult.FAILURE;
}
// Search by target player
else invite = MMOCore.plugin.requestManager.findRequest(playerData, PartyInvite.class);
// No invite found with given identifier/target player
if (invite == null) {
Message.PARTY_NO_PENDING_INVITE.send(playerData);
return CommandResult.FAILURE;
}
if (args[0].equalsIgnoreCase("accept")) invite.accept();
else if (args[0].equalsIgnoreCase("deny")) invite.deny();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,35 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class PlayerStatsCommand extends CommandTreeRoot {
private final Argument<Player> argPlayer;
public PlayerStatsCommand(@NotNull ConfigurationSection config) {
super(config);
argPlayer = addArgument(Arguments.PLAYER_IF_OP);
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
final var playerData = PlayerData.get(player);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
InventoryManager.PLAYER_STATS.newInventory(playerData).open();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,62 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import io.lumine.mythic.lib.comp.flags.CustomFlag;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.player.CombatHandler;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class PvpModeCommand extends CommandTreeRoot {
private final Argument<Player> argPlayer;
public PvpModeCommand(ConfigurationSection config) {
super(config);
argPlayer = addArgument(Arguments.PLAYER_IF_OP);
}
@Override
public @NotNull CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
final PlayerData playerData = PlayerData.get(player);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
// Check command cooldown
if (playerData.getCooldownMap().isOnCooldown(CombatHandler.COOLDOWN_KEY)) {
var remainingFormatted = MythicLib.plugin.getMMOConfig().decimal.format(playerData.getCooldownMap().getCooldown(CombatHandler.COOLDOWN_KEY));
Message.PVP_MODE_COOLDOWN.send(playerData, "remaining", remainingFormatted);
return CommandResult.FAILURE;
}
playerData.getCombat().setPvpMode(!playerData.getCombat().isInPvpMode());
playerData.getCooldownMap().applyCooldown(CombatHandler.COOLDOWN_KEY, playerData.getCombat().isInPvpMode() ? MMOCore.plugin.configManager.pvpModeToggleOnCooldown : MMOCore.plugin.configManager.pvpModeToggleOffCooldown);
// Toggling on when in PVP region
// Give invulnerability for a short time
if (playerData.getCombat().isInPvpMode() &&
MythicLib.plugin.getFlags().isFlagAllowed(playerData.getPlayer(), CustomFlag.PVP_MODE)) {
playerData.getCombat().setInvulnerable(MMOCore.plugin.configManager.pvpModeInvulnerabilityTimeCommand);
var timeFormatted = MythicLib.plugin.getMMOConfig().decimal.format(MMOCore.plugin.configManager.pvpModeInvulnerabilityTimeCommand);
Message.PVP_MODE_TOGGLE_ON_INVULNERABLE.send((Player) sender, "time", timeFormatted);
}
// Just send message otherwise
else {
var currentPvpMode = playerData.getCombat().isInPvpMode();
(currentPvpMode ? Message.PVP_MODE_TOGGLE_ON_SAFE : Message.PVP_MODE_TOGGLE_OFF_SAFE).send((Player) sender);
}
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,34 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class QuestsCommand extends CommandTreeRoot {
private final Argument<Player> argPlayer;
public QuestsCommand(ConfigurationSection config) {
super(config);
argPlayer = addArgument(Arguments.PLAYER_IF_OP);
}
@Override
public @NotNull CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
final var playerData = PlayerData.get(player);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
InventoryManager.QUEST_LIST.newInventory(playerData).open();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,58 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.player.Message;
import net.Indyuce.mmocore.skilltree.tree.SkillTree;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class SkillTreesCommand extends CommandTreeRoot {
private final Argument<SkillTree> argType;
public SkillTreesCommand(@NotNull ConfigurationSection config) {
super(config);
argType = addArgument(MMOCore.plugin.configManager.enableGlobalSkillTreeGUI ? Arguments.SKILL_TREE_OR_GLOBAL.withFallback(e -> null) : Arguments.SKILL_TREE);
setOnlyForPlayers();
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var data = PlayerData.get((Player) sender);
if (data.getProfess().getSkillTrees().isEmpty()) {
Message.NO_SKILL_TREE.send(data);
return CommandResult.FAILURE;
}
final @Nullable var opened = explorer.parse(argType); // null == global
if (MMOCoreUtils.callLegacyCommandEvent(data, this)) return CommandResult.FAILURE;
// Global skill tree view
if (opened == null) {
InventoryManager.TREE_VIEW.newInventory(data).open();
return CommandResult.FAILURE;
}
// Specific skill tree view
final var classHas = data.getProfess().getSkillTrees().stream().anyMatch(tree -> tree.getId().equals(opened.getId()));
if (!classHas) {
Message.NO_CLASS_SKILL_TREE.send(data);
return CommandResult.FAILURE;
}
InventoryManager.SPECIFIC_TREE_VIEW.get(UtilityMethods.kebabCase(opened.getId())).newInventory(data).open();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,41 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class SkillsCommand extends CommandTreeRoot {
private final Argument<Player> argPlayer;
public SkillsCommand(@NotNull ConfigurationSection config) {
super(config);
argPlayer = addArgument(Arguments.PLAYER_IF_OP);
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
final var playerData = PlayerData.get(player);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
if (playerData.getUnlockedSkills().isEmpty()) {
Message.NO_CLASS_SKILL.send((Player) sender);
return CommandResult.FAILURE;
}
InventoryManager.SKILL_LIST.newInventory(playerData).open();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,35 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class WaypointsCommand extends CommandTreeRoot {
private final Argument<Player> argPlayer;
public WaypointsCommand(ConfigurationSection config) {
super(config);
argPlayer = addArgument(Arguments.PLAYER_IF_OP);
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
final var playerData = PlayerData.get(player);
if (MMOCoreUtils.callLegacyCommandEvent(playerData, this)) return CommandResult.FAILURE;
InventoryManager.WAYPOINTS.newInventory(playerData).open();
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,48 @@
package net.Indyuce.mmocore.command.builtin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.eco.Withdraw;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class WithdrawCommand extends CommandTreeRoot {
private final Argument<Player> argPlayer;
private final Argument<Integer> argAmount;
public WithdrawCommand(@NotNull ConfigurationSection config) {
super(config);
argPlayer = addArgument(Arguments.PLAYER_IF_OP);
argAmount = addArgument(Argument.AMOUNT_INT.withFallback(explorer -> 0));
}
@Override
@NotNull
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
final var amount = explorer.parse(argAmount);
if (amount == 0) {
new Withdraw(player).open();
return CommandResult.SUCCESS;
}
int left = (int) MMOCore.plugin.economy.getEconomy().getBalance(player) - amount;
if (left < 0) {
Message.WITHDRAW_NOT_ENOUGH_MONEY.send(player, "left", -left);
return CommandResult.FAILURE;
}
MMOCore.plugin.economy.getEconomy().withdrawPlayer(player, amount);
new Withdraw(player).withdrawAlgorithm(amount);
Message.WITHDRAW_SUCCESS.send(player, "worth", amount);
return CommandResult.SUCCESS;
}
}

View File

@ -0,0 +1,49 @@
package net.Indyuce.mmocore.command.builtin.mmocore;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes;
import net.Indyuce.mmocore.command.Arguments;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class AttributeCommandTreeNode extends CommandTreeNode {
public AttributeCommandTreeNode(CommandTreeNode parent) {
super(parent, "attribute");
addChild(new ActionCommandTreeNode(this, "give", 1));
addChild(new ActionCommandTreeNode(this, "take", -1));
}
static class ActionCommandTreeNode extends CommandTreeNode {
private final Argument<Player> argPlayer;
private final Argument<PlayerAttribute> argAttribute;
private final Argument<Integer> argAmount;
private final int c;
public ActionCommandTreeNode(CommandTreeNode parent, String type, int coef) {
super(parent, type);
this.c = coef;
argPlayer = addArgument(Argument.PLAYER);
argAttribute = addArgument(Arguments.ATTRIBUTE);
argAmount = addArgument(Argument.AMOUNT_INT);
}
@Override
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
final var player = explorer.parse(argPlayer);
final var attribute = explorer.parse(argAttribute);
final var amount = explorer.parse(argAmount);
PlayerAttributes.AttributeInstance instance = PlayerData.get(player).getAttributes().getInstance(attribute);
instance.setBase(Math.min(attribute.getMax(), instance.getBase() + c * amount));
return explorer.success("&6" + player.getName() + "&e now has &6" + instance.getBase() + "&e points in " + attribute.getName() + ".");
}
}
}

View File

@ -0,0 +1,14 @@
package net.Indyuce.mmocore.command.builtin.mmocore;
import io.lumine.mythic.lib.command.CommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.cast.FirstCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.cast.SpecificCommandTreeNode;
public class CastCommandTreeNode extends CommandTreeNode {
public CastCommandTreeNode(CommandTreeNode parent) {
super(parent, "cast");
addChild(new FirstCommandTreeNode(this));
addChild(new SpecificCommandTreeNode(this));
}
}

View File

@ -1,8 +1,9 @@
package net.Indyuce.mmocore.command.rpg;
package net.Indyuce.mmocore.command.builtin.mmocore;
import io.lumine.mythic.lib.api.util.SmartGive;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.util.item.CurrencyItemBuilder;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@ -10,17 +11,16 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class CoinsCommandTreeNode extends CommandTreeNode {
public CoinsCommandTreeNode(CommandTreeNode parent) {
super(parent, "coins");
addParameter(Parameter.PLAYER);
addParameter(Parameter.AMOUNT);
addArgument(Argument.PLAYER);
addArgument(Argument.AMOUNT_INT);
}
@Override
public CommandResult execute(CommandSender sender, String[] args) {
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
if (args.length < 3)
return CommandResult.THROW_USAGE;

View File

@ -0,0 +1,31 @@
package net.Indyuce.mmocore.command.builtin.mmocore;
import io.lumine.mythic.lib.command.CommandTreeRoot;
import net.Indyuce.mmocore.command.builtin.mmocore.admin.AdminCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.booster.BoosterCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.clazz.ClassCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.debug.DebugCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.quest.QuestCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.skill.SkillCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.skilltree.SkillTreeCommandNode;
import net.Indyuce.mmocore.command.builtin.mmocore.waypoint.WaypointsCommandTreeNode;
public class MMOCoreCommandTreeRoot extends CommandTreeRoot {
public MMOCoreCommandTreeRoot() {
super("mmocore", "mmocore.admin");
addChild(new ReloadCommandTreeNode(this));
addChild(new CastCommandTreeNode(this));
addChild(new CoinsCommandTreeNode(this));
addChild(new NoteCommandTreeNode(this));
addChild(new SkillTreeCommandNode(this));
addChild(new AdminCommandTreeNode(this));
addChild(new DebugCommandTreeNode(this));
addChild(new BoosterCommandTreeNode(this));
addChild(new WaypointsCommandTreeNode(this));
addChild(new QuestCommandTreeNode(this));
addChild(new SkillCommandTreeNode(this));
addChild(new AttributeCommandTreeNode(this));
addChild(new ClassCommandTreeNode(this));
}
}

View File

@ -1,27 +1,25 @@
package net.Indyuce.mmocore.command.rpg;
package net.Indyuce.mmocore.command.builtin.mmocore;
import io.lumine.mythic.lib.api.util.SmartGive;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.util.item.CurrencyItemBuilder;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Arrays;
public class NoteCommandTreeNode extends CommandTreeNode {
public NoteCommandTreeNode(CommandTreeNode parent) {
super(parent, "note");
addParameter(Parameter.PLAYER);
addParameter(new Parameter("<worth>",
(explorer, list) -> list.addAll(Arrays.asList("10", "20", "30", "40", "50", "60", "70", "80", "90", "100"))));
addArgument(Argument.PLAYER);
addArgument(Argument.AMOUNT_INT.withKey("worth"));
}
@Override
public CommandResult execute(CommandSender sender, String[] args) {
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
if (args.length < 3)
return CommandResult.THROW_USAGE;

View File

@ -1,6 +1,7 @@
package net.Indyuce.mmocore.command.rpg;
package net.Indyuce.mmocore.command.builtin.mmocore;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@ -11,7 +12,7 @@ public class ReloadCommandTreeNode extends CommandTreeNode {
}
@Override
public CommandResult execute(CommandSender sender, String[] args) {
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
sender.sendMessage(ChatColor.YELLOW + "Reloading " + MMOCore.plugin.getName() + " " + MMOCore.plugin.getDescription().getVersion() + "...");
long ms = System.currentTimeMillis();

View File

@ -0,0 +1,60 @@
package net.Indyuce.mmocore.command.builtin.mmocore.admin;
import io.lumine.mythic.lib.command.CommandTreeNode;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource;
import net.Indyuce.mmocore.command.builtin.mmocore.AttributeCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.admin.reset.ResetCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.skill.SkillCommandTreeNode;
import net.Indyuce.mmocore.command.builtin.mmocore.slot.SlotCommandTreeNode;
public class AdminCommandTreeNode extends CommandTreeNode {
public AdminCommandTreeNode(CommandTreeNode parent) {
super(parent, "admin");
addChild(new HideActionBarCommandTreeNode(this));
addChild(new NoCooldownCommandTreeNode(this));
addChild(new ResetCommandTreeNode(this));
addChild(new InfoCommandTreeNode(this));
addChild(new LegacyClassCommandTreeNode(this));
addChild(new LegacyForceClassCommandTreeNode(this));
addChild(new ExportDataTreeNode(this));
addChild(new ExperienceCommandTreeNode(this));
addChild(new LevelCommandTreeNode(this));
addChild(new AttributeCommandTreeNode(this)); // Backwards compatibility
addChild(new SkillCommandTreeNode(this)); // Backwards compatibility
addChild(new SaveDataTreeNode(this));
addChild(new SlotCommandTreeNode(this));
addChild(new PointsCommandTreeNode("skill", this,
PlayerData::setSkillPoints,
PlayerData::giveSkillPoints,
PlayerData::getSkillPoints));
addChild(new PointsCommandTreeNode("class", this,
PlayerData::setClassPoints,
PlayerData::giveClassPoints,
PlayerData::getClassPoints));
addChild(new PointsCommandTreeNode("attribute", this,
PlayerData::setAttributePoints,
PlayerData::giveAttributePoints,
PlayerData::getAttributePoints));
addChild(new PointsCommandTreeNode("attr-realloc", this,
PlayerData::setAttributeReallocationPoints,
PlayerData::giveAttributeReallocationPoints,
PlayerData::getAttributeReallocationPoints));
addChild(new PointsCommandTreeNode("skill-realloc", this,
PlayerData::setSkillReallocationPoints,
PlayerData::giveSkillReallocationPoints,
PlayerData::getSkillReallocationPoints));
addChild(new PointsCommandTreeNode("skill-tree-realloc", this,
PlayerData::setSkillTreeReallocationPoints,
PlayerData::giveSkillTreeReallocationPoints,
PlayerData::getSkillTreeReallocationPoints));
addChild(new SkillTreePointsCommandTreeNode(this,
(playerData, amount, skillTree) -> playerData.setSkillTreePoints(skillTree, amount),
(playerData, amount, skillTree) -> playerData.giveSkillTreePoints(skillTree, amount),
PlayerData::getSkillTreePoints));
for (PlayerResource res : PlayerResource.values())
addChild(new ResourceCommandTreeNode(res.name().toLowerCase(), this, res));
}
}

View File

@ -0,0 +1,85 @@
package net.Indyuce.mmocore.command.builtin.mmocore.admin;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import io.lumine.mythic.lib.util.lang3.Validate;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.PlayerProfessions;
import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.util.TriConsumer;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.function.BiConsumer;
public class ExperienceCommandTreeNode extends CommandTreeNode {
public ExperienceCommandTreeNode(CommandTreeNode parent) {
super(parent, "exp");
addChild(new ActionCommandTreeNode(this, "set", PlayerData::setExperience, PlayerProfessions::setExperience));
addChild(new ActionCommandTreeNode(this, "give", (data, value) -> data.giveExperience(value, EXPSource.COMMAND), (professions, profession,
value) -> professions.giveExperience(profession, value, EXPSource.COMMAND)));
addChild(new ActionCommandTreeNode(this, "take", (data, value) -> data.giveExperience(-value, EXPSource.COMMAND), (professions, profession,
value) -> professions.giveExperience(profession, -value, EXPSource.COMMAND)));
}
public static class ActionCommandTreeNode extends CommandTreeNode {
private final BiConsumer<PlayerData, Long> main;
private final TriConsumer<PlayerProfessions, Profession, Long> profession;
public ActionCommandTreeNode(CommandTreeNode parent, String type, BiConsumer<PlayerData, Long> main,
TriConsumer<PlayerProfessions, Profession, Long> profession) {
super(parent, type);
this.main = main;
this.profession = profession;
addArgument(Argument.PLAYER);
addArgument(Arguments.PROFESSION);
addArgument(Argument.AMOUNT_INT);
}
@Override
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
if (args.length < 6)
return CommandResult.THROW_USAGE;
Player player = Bukkit.getPlayer(args[3]);
if (player == null) {
return explorer.fail("Could not find the player called " + args[3] + ".");
}
long amount;
try {
amount = Long.parseLong(args[5]);
Validate.isTrue(amount >= 0);
} catch (RuntimeException exception) {
return explorer.fail( args[5] + " is not a valid number.");
}
PlayerData data = PlayerData.get(player);
if (args[4].equalsIgnoreCase("main")) {
main.accept(data, amount);
return explorer.success(ChatColor.GOLD + player.getName() + ChatColor.YELLOW
+ " now has " + ChatColor.GOLD + MythicLib.plugin.getMMOConfig().decimal.format(data.getExperience()) + ChatColor.YELLOW + " EXP.");
}
String format = args[4].toLowerCase().replace("_", "-");
if (!MMOCore.plugin.professionManager.has(format)) {
return explorer.fail(format + " is not a valid profession.");
}
Profession profession = MMOCore.plugin.professionManager.get(format);
this.profession.accept(data.getCollectionSkills(), profession, amount);
return explorer.success(ChatColor.GOLD + player.getName() + ChatColor.YELLOW + " now has " + ChatColor.GOLD
+ data.getCollectionSkills().getExperience(profession) + ChatColor.YELLOW + " EXP in " + profession.getName() + ".");
}
}
}

View File

@ -1,11 +1,11 @@
package net.Indyuce.mmocore.command.rpg.admin;
package net.Indyuce.mmocore.command.builtin.mmocore.admin;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.data.DataExport;
import io.lumine.mythic.lib.data.sql.SQLDataSource;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.manager.data.sql.SQLDataHandler;
import net.Indyuce.mmocore.manager.data.yaml.YAMLPlayerDataHandler;
import net.Indyuce.mmocore.manager.data.sql.SQLDatabaseImpl;
import net.Indyuce.mmocore.manager.data.yaml.YAMLDatabaseImpl;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
@ -20,12 +20,12 @@ public class ExportDataTreeNode extends CommandTreeNode {
@Override
@NotNull
public CommandResult execute(CommandSender sender, String[] strings) {
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
// Export YAML to SQL
final boolean result = new DataExport<>(MMOCore.plugin.playerDataManager, sender).start(
() -> new YAMLPlayerDataHandler(MMOCore.plugin),
() -> new SQLDataHandler(new SQLDataSource(MMOCore.plugin)));
YAMLDatabaseImpl::new,
SQLDatabaseImpl::new);
return result ? CommandResult.SUCCESS : CommandResult.FAILURE;
}

View File

@ -1,7 +1,8 @@
package net.Indyuce.mmocore.command.rpg.admin;
package net.Indyuce.mmocore.command.builtin.mmocore.admin;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import io.lumine.mythic.lib.message.actionbar.ActionBarPriority;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.bukkit.Bukkit;
@ -13,12 +14,12 @@ public class HideActionBarCommandTreeNode extends CommandTreeNode {
public HideActionBarCommandTreeNode(CommandTreeNode parent) {
super(parent, "hideab");
addParameter(Parameter.PLAYER);
addParameter(Parameter.AMOUNT);
addArgument(Argument.PLAYER);
addArgument(Argument.DURATION_TICKS);
}
@Override
public CommandResult execute(CommandSender sender, String[] args) {
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
if (args.length < 4)
return CommandResult.THROW_USAGE;

View File

@ -1,8 +1,9 @@
package net.Indyuce.mmocore.command.rpg.admin;
package net.Indyuce.mmocore.command.builtin.mmocore.admin;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.Profession;
@ -15,11 +16,11 @@ public class InfoCommandTreeNode extends CommandTreeNode {
public InfoCommandTreeNode(CommandTreeNode parent) {
super(parent, "info");
addParameter(Parameter.PLAYER);
addArgument(Argument.PLAYER);
}
@Override
public CommandResult execute(CommandSender sender, String[] args) {
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
if (args.length < 3)
return CommandResult.THROW_USAGE;

View File

@ -0,0 +1,55 @@
package net.Indyuce.mmocore.command.builtin.mmocore.admin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.PlayerChangeClassEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.api.player.profess.SavedClassInformation;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.player.Message;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
/**
* @see net.Indyuce.mmocore.command.builtin.mmocore.clazz.ClassCommandTreeNode
* @deprecated
*/
@Deprecated
public class LegacyClassCommandTreeNode extends CommandTreeNode {
private final Argument<Player> argPlayer;
private final Argument<PlayerClass> argClass;
@Deprecated
public LegacyClassCommandTreeNode(CommandTreeNode parent) {
super(parent, "class");
argPlayer = addArgument(Argument.PLAYER);
argClass = addArgument(Arguments.CLASS);
}
@Override
public @NotNull CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
Player player = explorer.parse(argPlayer);
PlayerClass profess = explorer.parse(argClass);
PlayerData data = PlayerData.get(player);
if (data.getProfess().equals(profess)) return CommandResult.SUCCESS;
PlayerChangeClassEvent called = new PlayerChangeClassEvent(data, profess, PlayerChangeClassEvent.Reason.COMMAND_SELECT);
Bukkit.getPluginManager().callEvent(called);
if (called.isCancelled()) return explorer.fail("Bukkit event canceled");
(data.hasSavedClass(profess) ? data.getClassInfo(profess)
: new SavedClassInformation(MMOCore.plugin.playerDataManager.getDefaultData())).load(profess, data);
if (data.isOnline()) {
Message.CLASS_SELECT.send(data, "class", profess.getName());
}
return explorer.success(ChatColor.GOLD + player.getName() + ChatColor.YELLOW + " is now a " + ChatColor.GOLD + profess.getName() + ChatColor.YELLOW + ".");
}
}

View File

@ -0,0 +1,58 @@
package net.Indyuce.mmocore.command.builtin.mmocore.admin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.PlayerChangeClassEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.command.Arguments;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
/**
* @deprecated
* @see net.Indyuce.mmocore.command.builtin.mmocore.clazz.ForceCommandTreeNode
*/
@Deprecated
public class LegacyForceClassCommandTreeNode extends CommandTreeNode {
public LegacyForceClassCommandTreeNode(CommandTreeNode parent) {
super(parent, "force-class");
addArgument(Argument.PLAYER);
addArgument(Arguments.CLASS);
}
@Override
public @NotNull CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
if (args.length < 4)
return CommandResult.THROW_USAGE;
Player player = Bukkit.getPlayer(args[2]);
if (player == null) {
sender.sendMessage(ChatColor.RED + "Could not find the player called " + args[2] + ".");
return CommandResult.FAILURE;
}
String format = args[3].toUpperCase().replace("-", "_");
if (!MMOCore.plugin.classManager.has(format)) {
sender.sendMessage(ChatColor.RED + "Could not find class " + format + ".");
return CommandResult.FAILURE;
}
PlayerClass profess = MMOCore.plugin.classManager.get(format);
PlayerData data = PlayerData.get(player);
final var called = new PlayerChangeClassEvent(data, profess, PlayerChangeClassEvent.Reason.COMMAND_FORCE);
Bukkit.getPluginManager().callEvent(called);
if (called.isCancelled()) return explorer.fail("Bukkit event canceled");
data.setClass(profess);
return explorer.success(ChatColor.GOLD + player.getName()
+ ChatColor.YELLOW + " is now a " + ChatColor.GOLD + profess.getName());
}
}

View File

@ -0,0 +1,89 @@
package net.Indyuce.mmocore.command.builtin.mmocore.admin;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.PlayerLevelChangeEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.Arguments;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.PlayerProfessions;
import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.util.TriConsumer;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.function.BiConsumer;
public class LevelCommandTreeNode extends CommandTreeNode {
public LevelCommandTreeNode(CommandTreeNode parent) {
super(parent, "level");
addChild(new ActionCommandTreeNode(this, "set",
(player, newLevel) -> player.setLevel(newLevel, PlayerLevelChangeEvent.Reason.COMMAND),
(player, profession, amount) -> player.setLevel(profession, amount, PlayerLevelChangeEvent.Reason.COMMAND)));
addChild(new ActionCommandTreeNode(this, "give",
(data, value) -> data.giveLevels(value, EXPSource.COMMAND),
(professions, profession, value) -> professions.giveLevels(profession, value, EXPSource.COMMAND)));
addChild(new ActionCommandTreeNode(this, "take",
(playerData, amount) -> playerData.setLevel(playerData.getLevel() - amount, PlayerLevelChangeEvent.Reason.COMMAND),
(player, profession, amount) -> player.setLevel(profession, player.getLevel(profession) - amount, PlayerLevelChangeEvent.Reason.COMMAND)));
}
public static class ActionCommandTreeNode extends CommandTreeNode {
private final BiConsumer<PlayerData, Integer> main;
private final TriConsumer<PlayerProfessions, Profession, Integer> profession;
public ActionCommandTreeNode(CommandTreeNode parent, String type, BiConsumer<PlayerData, Integer> main,
TriConsumer<PlayerProfessions, Profession, Integer> profession) {
super(parent, type);
this.main = main;
this.profession = profession;
addArgument(Argument.PLAYER);
addArgument(Arguments.PROFESSION);
addArgument(Argument.AMOUNT_INT);
}
@Override
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
if (args.length < 6)
return CommandResult.THROW_USAGE;
Player player = Bukkit.getPlayer(args[3]);
if (player == null) {
sender.sendMessage(ChatColor.RED + "Could not find the player called " + args[3] + ".");
return CommandResult.FAILURE;
}
int amount;
try {
amount = Integer.parseInt(args[5]);
} catch (NumberFormatException exception) {
sender.sendMessage(ChatColor.RED + args[5] + " is not a valid number.");
return CommandResult.FAILURE;
}
PlayerData data = PlayerData.get(player);
if (args[4].equalsIgnoreCase("main")) {
main.accept(data, amount);
return explorer.success(ChatColor.GOLD + player.getName() + "&e is now Lvl &6" + data.getLevel());
}
String format = args[4].toLowerCase().replace("_", "-");
if (!MMOCore.plugin.professionManager.has(format)) {
return explorer.fail(format + " is not a valid profession.");
}
Profession profession = MMOCore.plugin.professionManager.get(format);
this.profession.accept(data.getCollectionSkills(), profession, amount);
return explorer.success(ChatColor.GOLD + player.getName() + ChatColor.YELLOW + " is now Lvl " + ChatColor.GOLD
+ data.getCollectionSkills().getLevel(profession) + ChatColor.YELLOW + " in " + profession.getName());
}
}
}

View File

@ -1,9 +1,9 @@
package net.Indyuce.mmocore.command.rpg.admin;
package net.Indyuce.mmocore.command.builtin.mmocore.admin;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter;
import io.lumine.mythic.lib.command.CommandTreeExplorer;
import io.lumine.mythic.lib.command.CommandTreeNode;
import io.lumine.mythic.lib.command.argument.Argument;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.api.CommandVerbose;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@ -13,11 +13,11 @@ public class NoCooldownCommandTreeNode extends CommandTreeNode {
public NoCooldownCommandTreeNode(CommandTreeNode parent) {
super(parent, "nocd");
addParameter(Parameter.PLAYER);
addArgument(Argument.PLAYER);
}
@Override
public CommandResult execute(CommandSender sender, String[] args) {
public CommandResult execute(CommandTreeExplorer explorer, CommandSender sender, String[] args) {
if (args.length < 3)
return CommandResult.THROW_USAGE;
@ -29,8 +29,6 @@ public class NoCooldownCommandTreeNode extends CommandTreeNode {
PlayerData data = PlayerData.get(player);
data.noCooldown = !data.noCooldown;
CommandVerbose.verbose(sender, CommandVerbose.CommandType.NOCD,
ChatColor.YELLOW + "NoCD " + (data.noCooldown ? "enabled" : "disabled") + " for " + player.getName() + ".");
return CommandResult.SUCCESS;
return explorer.success(ChatColor.YELLOW + "NoCD " + (data.noCooldown ? "enabled" : "disabled") + " for " + player.getName());
}
}

Some files were not shown because too many files have changed in this diff Show More