This commit is contained in:
Ka0rX 2022-07-28 12:12:04 +02:00
commit 6247bf4fe2
275 changed files with 5907 additions and 4482 deletions

View File

@ -4,6 +4,7 @@
<id>nexus</id> <id>nexus</id>
<username>${env.M2_REPO_USER}</username> <username>${env.M2_REPO_USER}</username>
<password>${env.M2_REPO_PASS}</password> <password>${env.M2_REPO_PASS}</password>
<blocked>false</blocked>
</server> </server>
<server> <server>
<id>lumine</id> <id>lumine</id>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="MavenCustomPomFilePath">
<option name="mavenPomFileUrl" value="file://$MODULE_DIR$/dependency-reduced-pom.xml" />
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$/src/main/java">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
</content>
<content url="file://$MODULE_DIR$/src/main/resources">
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

22
pom.xml
View File

@ -39,6 +39,12 @@
</resources> </resources>
<plugins> <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
</plugin>
<plugin> <plugin>
@ -47,8 +53,8 @@
<version>3.8.1</version> <version>3.8.1</version>
<configuration> <configuration>
<source>9</source> <source>16</source>
<target>9</target> <target>16</target>
<encoding>UTF-8</encoding> <encoding>UTF-8</encoding>
<compilerArgument>-proc:none</compilerArgument> <compilerArgument>-proc:none</compilerArgument>
</configuration> </configuration>
@ -75,6 +81,10 @@
</build> </build>
<repositories> <repositories>
<repository>
<id>phoenix</id>
<url>http://la-grange-evasion.pro.dns-orange.fr:8081/</url>
</repository>
<repository> <repository>
<id>lumine</id> <id>lumine</id>
@ -119,12 +129,6 @@
</dependency> </dependency>
<!-- Extra libs --> <!-- Extra libs -->
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>19.0.0</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>io.papermc</groupId> <groupId>io.papermc</groupId>
@ -143,7 +147,7 @@
<dependency> <dependency>
<groupId>io.lumine</groupId> <groupId>io.lumine</groupId>
<artifactId>MythicLib-dist</artifactId> <artifactId>MythicLib-dist</artifactId>
<version>1.3.1</version> <version> 1.3.4</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>

View File

@ -12,7 +12,6 @@ import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource;
import net.Indyuce.mmocore.api.player.stats.StatType; import net.Indyuce.mmocore.api.player.stats.StatType;
import net.Indyuce.mmocore.api.util.debug.DebugMode; import net.Indyuce.mmocore.api.util.debug.DebugMode;
import net.Indyuce.mmocore.command.*; import net.Indyuce.mmocore.command.*;
import net.Indyuce.mmocore.comp.MMOCoreTargetRestriction;
import net.Indyuce.mmocore.comp.citizens.CitizenInteractEventListener; import net.Indyuce.mmocore.comp.citizens.CitizenInteractEventListener;
import net.Indyuce.mmocore.comp.citizens.CitizensMMOLoader; import net.Indyuce.mmocore.comp.citizens.CitizensMMOLoader;
import net.Indyuce.mmocore.comp.mythicmobs.MythicHook; import net.Indyuce.mmocore.comp.mythicmobs.MythicHook;
@ -241,6 +240,7 @@ public class MMOCore extends LuminePlugin {
} }
// Load party module // Load party module
try { try {
String partyPluginName = UtilityMethods.enumName(getConfig().getString("party-plugin")); String partyPluginName = UtilityMethods.enumName(getConfig().getString("party-plugin"));
@ -252,6 +252,16 @@ public class MMOCore extends LuminePlugin {
partyModule = new MMOCorePartyModule(); partyModule = new MMOCorePartyModule();
} }
// Load guild module
try {
String pluginName = UtilityMethods.enumName(getConfig().getString("guild-plugin"));
GuildModuleType moduleType = GuildModuleType.valueOf(pluginName);
Validate.isTrue(moduleType.isValid(), "Plugin '" + moduleType.name() + "' is not installed");
guildModule = moduleType.provideModule();
} catch (RuntimeException exception) {
getLogger().log(Level.WARNING, "Could not initialize guild module: " + exception.getMessage());
guildModule = new MMOCoreGuildModule();
}
// Skill casting // Skill casting
try { try {
@ -390,7 +400,7 @@ public class MMOCore extends LuminePlugin {
* Called either when the server starts when initializing the manager for * Called either when the server starts when initializing the manager for
* the first time, or when issuing a plugin reload; in that case, stuff * the first time, or when issuing a plugin reload; in that case, stuff
* like listeners must all be cleared before. * like listeners must all be cleared before.
* <p> *
* Also see {@link MMOCoreManager} * Also see {@link MMOCoreManager}
* *
* @param clearBefore True when issuing a plugin reload * @param clearBefore True when issuing a plugin reload
@ -426,7 +436,6 @@ public class MMOCore extends LuminePlugin {
requestManager.initialize(clearBefore); requestManager.initialize(clearBefore);
soundManager.initialize(clearBefore); soundManager.initialize(clearBefore);
configItems.initialize(clearBefore); configItems.initialize(clearBefore);
skillTreeManager.initialize(clearBefore);
if (getConfig().isConfigurationSection("action-bar")) if (getConfig().isConfigurationSection("action-bar"))
actionBarManager.reload(getConfig().getConfigurationSection("action-bar")); actionBarManager.reload(getConfig().getConfigurationSection("action-bar"));
@ -462,7 +471,7 @@ public class MMOCore extends LuminePlugin {
} }
public static void sqlDebug(String s) { public static void sqlDebug(String s) {
if (!MMOCore.plugin.shouldDebugSQL) return; if(!MMOCore.plugin.shouldDebugSQL) return;
MMOCore.plugin.getLogger().warning("- [SQL Debug] " + s); MMOCore.plugin.getLogger().warning("- [SQL Debug] " + s);
} }
} }

View File

@ -5,14 +5,13 @@ import java.io.IOException;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.guild.provided.Guild;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.guild.provided.Guild;
public class ConfigFile { public class ConfigFile {
private final File file; private final File file;
private final String name; private final String name;

View File

@ -6,11 +6,11 @@ import io.lumine.mythic.lib.skill.handler.SkillHandler;
import io.lumine.mythic.lib.skill.result.SkillResult; import io.lumine.mythic.lib.skill.result.SkillResult;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata; import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.party.AbstractParty; import net.Indyuce.mmocore.party.AbstractParty;
import net.Indyuce.mmocore.skill.CastableSkill; import net.Indyuce.mmocore.skill.CastableSkill;
import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.ClassSkill;
import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skill.RegisteredSkill;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;

View File

@ -1,18 +1,17 @@
package net.Indyuce.mmocore.api; package net.Indyuce.mmocore.api;
import java.text.DecimalFormat; import io.lumine.mythic.lib.MythicLib;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerActivity; import net.Indyuce.mmocore.api.player.PlayerActivity;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.player.stats.StatInfo;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.attribute.Attribute; import org.bukkit.attribute.Attribute;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import net.Indyuce.mmocore.MMOCore; import java.text.DecimalFormat;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.stats.StatType;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import io.lumine.mythic.lib.MythicLib;
public class PlayerActionBar extends BukkitRunnable { public class PlayerActionBar extends BukkitRunnable {
boolean initialized = false; boolean initialized = false;
@ -24,7 +23,7 @@ public class PlayerActionBar extends BukkitRunnable {
config = new ActionBarConfig(cfg); config = new ActionBarConfig(cfg);
digit = MythicLib.plugin.getMMOConfig().newDecimalFormat(config.digit); digit = MythicLib.plugin.getMMOConfig().newDecimalFormat(config.digit);
if(!initialized && config.enabled) { if (!initialized && config.enabled) {
runTaskTimer(MMOCore.plugin, 0, config.ticks); runTaskTimer(MMOCore.plugin, 0, config.ticks);
initialized = true; initialized = true;
} }
@ -41,17 +40,17 @@ public class PlayerActionBar extends BukkitRunnable {
data.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(MMOCore.plugin.placeholderParser.parse(data.getPlayer(), data.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(MMOCore.plugin.placeholderParser.parse(data.getPlayer(),
MythicLib.plugin.parseColors((data.getProfess().hasActionBar() ? data.getProfess().getActionBar() : config.format) MythicLib.plugin.parseColors((data.getProfess().hasActionBar() ? data.getProfess().getActionBar() : config.format)
.replace("{health}", digit.format(data.getPlayer().getHealth())) .replace("{health}", digit.format(data.getPlayer().getHealth()))
.replace("{max_health}", "" + StatType.MAX_HEALTH.format(data.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())) .replace("{max_health}", StatInfo.valueOf("MAX_HEALTH").format(data.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()))
.replace("{mana_icon}", data.getProfess().getManaDisplay().getIcon()) .replace("{mana_icon}", data.getProfess().getManaDisplay().getIcon())
.replace("{mana}", digit.format(data.getMana())) .replace("{mana}", digit.format(data.getMana()))
.replace("{max_mana}", "" + StatType.MAX_MANA.format(data.getStats().getStat(StatType.MAX_MANA))) .replace("{max_mana}", StatInfo.valueOf("MAX_MANA").format(data.getStats().getStat("MAX_MANA")))
.replace("{stamina}", digit.format(data.getStamina())) .replace("{stamina}", digit.format(data.getStamina()))
.replace("{max_stamina}", "" + StatType.MAX_STAMINA.format(data.getStats().getStat(StatType.MAX_STAMINA))) .replace("{max_stamina}", StatInfo.valueOf("MAX_STAMINA").format(data.getStats().getStat("MAX_STAMINA")))
.replace("{stellium}", digit.format(data.getStellium())) .replace("{stellium}", digit.format(data.getStellium()))
.replace("{max_stellium}", "" + StatType.MAX_STELLIUM.format(data.getStats().getStat(StatType.MAX_STELLIUM))) .replace("{max_stellium}", StatInfo.valueOf("MAX_STELLIUM").format(data.getStats().getStat("MAX_STELLIUM")))
.replace("{class}", data.getProfess().getName()) .replace("{class}", data.getProfess().getName())
.replace("{xp}", "" + data.getExperience()) .replace("{xp}", MythicLib.plugin.getMMOConfig().decimal.format(data.getExperience()))
.replace("{armor}", "" + StatType.ARMOR.format(data.getPlayer().getAttribute(Attribute.GENERIC_ARMOR).getValue())) .replace("{armor}", StatInfo.valueOf("ARMOR").format(data.getPlayer().getAttribute(Attribute.GENERIC_ARMOR).getValue()))
.replace("{level}", "" + data.getLevel()) .replace("{level}", "" + data.getLevel())
.replace("{name}", data.getPlayer().getDisplayName()))))); .replace("{name}", data.getPlayer().getDisplayName())))));
} }

View File

@ -5,9 +5,9 @@ import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.api.condition.type.BlockCondition; import io.lumine.mythic.lib.api.condition.type.BlockCondition;
import io.lumine.mythic.lib.api.condition.type.MMOCondition; import io.lumine.mythic.lib.api.condition.type.MMOCondition;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import net.Indyuce.mmocore.loot.droptable.DropTable; import net.Indyuce.mmocore.loot.droptable.DropTable;
import net.Indyuce.mmocore.loot.LootBuilder; import net.Indyuce.mmocore.loot.LootBuilder;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -52,7 +52,7 @@ public class BlockInfo {
for (String key : list) for (String key : list)
try { try {
triggers.add(MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(key))); triggers.addAll(MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(key)));
} catch (IllegalArgumentException exception) { } catch (IllegalArgumentException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING, MMOCore.plugin.getLogger().log(Level.WARNING,
"Could not load trigger '" + key + "' from block info '" + block.generateKey() + "': " + exception.getMessage()); "Could not load trigger '" + key + "' from block info '" + block.generateKey() + "': " + exception.getMessage());

View File

@ -2,19 +2,17 @@ package net.Indyuce.mmocore.api.block;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import net.Indyuce.mmocore.api.block.BlockInfo.RegeneratingBlock;
public interface BlockType { public interface BlockType {
/** /**
* Called when placing temporary blocks * Called when placing temporary blocks
*/ */
void place(RegeneratingBlock placed); void place(BlockInfo.RegeneratingBlock placed);
/** /**
* Called when regenerating an older block with block regen * Called when regenerating an older block with block regen
*/ */
void regenerate(RegeneratingBlock regenerating); void regenerate(BlockInfo.RegeneratingBlock regenerating);
/** /**
* Generates a key used to store the BlockInfo instance in the manager map, * Generates a key used to store the BlockInfo instance in the manager map,

View File

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

View File

@ -4,6 +4,7 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -16,7 +17,6 @@ import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; import net.Indyuce.mmocore.util.item.CurrencyItemBuilder;
import io.lumine.mythic.lib.api.util.SmartGive; import io.lumine.mythic.lib.api.util.SmartGive;

View File

@ -2,10 +2,10 @@ package net.Indyuce.mmocore.api.event;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import net.Indyuce.mmocore.experience.EXPSource;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;

View File

@ -4,11 +4,12 @@ import org.bukkit.event.HandlerList;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import org.jetbrains.annotations.Nullable;
public class PlayerLevelUpEvent extends PlayerDataEvent { 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 // If null, this is main level
private final Profession profession; private final Profession profession;
private final int oldLevel, newLevel; private final int oldLevel, newLevel;
@ -36,6 +37,7 @@ public class PlayerLevelUpEvent extends PlayerDataEvent {
return profession != null; return profession != null;
} }
@Nullable
public Profession getProfession() { public Profession getProfession() {
return profession; return profession;
} }

View File

@ -1,5 +1,9 @@
package net.Indyuce.mmocore.api.event; package net.Indyuce.mmocore.api.event;
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.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource;
import net.Indyuce.mmocore.skill.list.Neptune_Gift; import net.Indyuce.mmocore.skill.list.Neptune_Gift;
@ -104,14 +108,14 @@ public class PlayerResourceUpdateEvent extends PlayerDataEvent implements Cancel
/** /**
* Used by quests triggers * Used by quests triggers
* - {@link net.Indyuce.mmocore.api.quest.trigger.ManaTrigger} * - {@link ManaTrigger}
* - {@link net.Indyuce.mmocore.api.quest.trigger.StaminaTrigger} * - {@link StaminaTrigger}
* - {@link net.Indyuce.mmocore.api.quest.trigger.StelliumTrigger} * - {@link StelliumTrigger}
*/ */
TRIGGER, TRIGGER,
/** /**
* When using the resource command {@link net.Indyuce.mmocore.command.rpg.admin.ResourceCommandTreeNode} * When using the resource command {@link ResourceCommandTreeNode}
*/ */
COMMAND, COMMAND,

View File

@ -1,13 +1,16 @@
package net.Indyuce.mmocore.api.load; package net.Indyuce.mmocore.api.load;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.source.*; import net.Indyuce.mmocore.api.ConfigFile;
import net.Indyuce.mmocore.loot.chest.condition.*;
import org.bukkit.configuration.ConfigurationSection;
import net.Indyuce.mmocore.api.block.BlockType; import net.Indyuce.mmocore.api.block.BlockType;
import net.Indyuce.mmocore.api.block.SkullBlockType; import net.Indyuce.mmocore.api.block.SkullBlockType;
import net.Indyuce.mmocore.api.block.VanillaBlockType; import net.Indyuce.mmocore.api.block.VanillaBlockType;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.*;
import net.Indyuce.mmocore.loot.chest.condition.*;
import org.apache.commons.math3.analysis.function.Exp;
import org.bukkit.configuration.ConfigurationSection;
import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem;
import net.Indyuce.mmocore.loot.droptable.dropitem.DropTableDropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.DropTableDropItem;
@ -30,34 +33,53 @@ import net.Indyuce.mmocore.api.quest.trigger.StaminaTrigger;
import net.Indyuce.mmocore.api.quest.trigger.StelliumTrigger; import net.Indyuce.mmocore.api.quest.trigger.StelliumTrigger;
import net.Indyuce.mmocore.api.quest.trigger.Trigger; import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import org.checkerframework.checker.units.qual.C;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
public class DefaultMMOLoader extends MMOLoader { public class DefaultMMOLoader extends MMOLoader {
@Override @Override
public Trigger loadTrigger(MMOLineConfig config) { public List<Trigger> loadTrigger(MMOLineConfig config) {
if (config.getKey().equals("from")) {
String source = config.getString("source");
ConfigFile configFile = new ConfigFile("triggers");
if (!configFile.getConfig().contains(source)) {
MMOCore.plugin.getLogger().log(Level.WARNING, "Couldn't find " + source + " in experience-sources.yml");
return null;
}
List<Trigger> list = new ArrayList<>();
for (String trigger : configFile.getConfig().getStringList(source)) {
list.addAll(loadTrigger(new MMOLineConfig(trigger)));
}
return list;
}
if (config.getKey().equals("message")) if (config.getKey().equals("message"))
return new MessageTrigger(config); return Arrays.asList(new MessageTrigger(config));
if (config.getKey().equals("sound") || config.getKey().equals("playsound")) if (config.getKey().equals("sound") || config.getKey().equals("playsound"))
return new SoundTrigger(config); return Arrays.asList(new SoundTrigger(config));
if (config.getKey().equals("mana")) if (config.getKey().equals("mana"))
return new ManaTrigger(config); return Arrays.asList(new ManaTrigger(config));
if (config.getKey().equals("stamina")) if (config.getKey().equals("stamina"))
return new StaminaTrigger(config); return Arrays.asList(new StaminaTrigger(config));
if (config.getKey().equals("stellium")) if (config.getKey().equals("stellium"))
return new StelliumTrigger(config); return Arrays.asList(new StelliumTrigger(config));
if (config.getKey().equals("command")) if (config.getKey().equals("command"))
return new CommandTrigger(config); return Arrays.asList(new CommandTrigger(config));
if (config.getKey().equals("item") || config.getKey().equals("vanilla")) if (config.getKey().equals("item") || config.getKey().equals("vanilla"))
return new ItemTrigger(config); return Arrays.asList(new ItemTrigger(config));
if (config.getKey().equals("exp") || config.getKey().equals("experience")) if (config.getKey().equals("exp") || config.getKey().equals("experience"))
return new ExperienceTrigger(config); return Arrays.asList(new ExperienceTrigger(config));
return null; return null;
} }
@ -97,77 +119,111 @@ public class DefaultMMOLoader extends MMOLoader {
} }
@Override @Override
public Condition loadCondition(MMOLineConfig config) { public List<Condition> loadCondition(MMOLineConfig config) {
if (config.getKey().equals("from")) {
String source = config.getString("source");
ConfigFile configFile = new ConfigFile("conditions");
if (!configFile.getConfig().contains(source)) {
MMOCore.plugin.getLogger().log(Level.WARNING, "Couldn't find " + source + " in experience-sources.yml");
return null;
}
List<Condition> list = new ArrayList<>();
for (String condition : configFile.getConfig().getStringList(source)) {
list.addAll(loadCondition(new MMOLineConfig(condition)));
}
return list;
}
if (config.getKey().equals("distance")) if (config.getKey().equals("distance"))
return new DistanceCondition(config); return Arrays.asList(new DistanceCondition(config));
if (config.getKey().equals("world")) if (config.getKey().equals("world"))
return new WorldCondition(config); return Arrays.asList(new WorldCondition(config));
if (config.getKey().equals("biome")) if (config.getKey().equals("biome"))
return new BiomeCondition(config); return Arrays.asList(new BiomeCondition(config));
if (config.getKey().equals("level")) if (config.getKey().equals("level"))
return new LevelCondition(config); return Arrays.asList(new LevelCondition(config));
if (config.getKey().equals("permission")) if (config.getKey().equals("permission"))
return new PermissionCondition(config); return Arrays.asList(new PermissionCondition(config));
return null; return null;
} }
@Override @Override
public ExperienceSource<?> loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) { public List<ExperienceSource<?>> loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) {
if (config.getKey().equals("from")) {
String source = config.getString("source");
ConfigFile configFile = new ConfigFile("exp-sources");
if (!configFile.getConfig().contains(source)) {
MMOCore.plugin.getLogger().log(Level.WARNING, "Couldn't find " + source + " in experience-sources.yml");
return null;
}
List<ExperienceSource<?>> list = new ArrayList<>();
for (String expSource : configFile.getConfig().getStringList(source)) {
list.addAll(loadExperienceSource(new MMOLineConfig(expSource), dispenser));
}
return list;
}
if (config.getKey().equals("resource")) if (config.getKey().equals("resource"))
return new ResourceExperienceSource(dispenser, config); return Arrays.asList(new ResourceExperienceSource(dispenser, config));
if (config.getKey().equals("climb")) if (config.getKey().equals("climb"))
return new ClimbExperienceSource(dispenser, config); return Arrays.asList(new ClimbExperienceSource(dispenser, config));
if (config.getKey().equals("eat")) {
return Arrays.asList(new EatExperienceSource(dispenser, config));
}
if (config.getKey().equals("damagedealt")) if (config.getKey().equals("damagedealt"))
return new DamageDealtExperienceSource(dispenser, config); return Arrays.asList(new DamageDealtExperienceSource(dispenser, config));
if (config.getKey().equals("damagetaken")) if (config.getKey().equals("damagetaken"))
return new DamageTakenExperienceSource(dispenser, config); return Arrays.asList(new DamageTakenExperienceSource(dispenser, config));
if (config.getKey().equals("move")) if (config.getKey().equals("move"))
return new MoveExperienceSource(dispenser, config); return Arrays.asList(new MoveExperienceSource(dispenser, config));
if (config.getKey().equals("play")) if (config.getKey().equals("play"))
return new PlayExperienceSource(dispenser, config); return Arrays.asList(new PlayExperienceSource(dispenser, config));
if (config.getKey().equals("projectile")) if (config.getKey().equals("projectile"))
return new ProjectileExperienceSource(dispenser, config); return Arrays.asList(new ProjectileExperienceSource(dispenser, config));
if (config.getKey().equals("ride")) if (config.getKey().equals("ride"))
return new RideExperienceSource(dispenser, config); return Arrays.asList(new RideExperienceSource(dispenser, config));
if (config.getKey().equals("tame")) if (config.getKey().equals("tame"))
return new TameExperienceSource(dispenser, config); return Arrays.asList(new TameExperienceSource(dispenser, config));
if (config.getKey().equals("killmob")) if (config.getKey().equals("killmob"))
return new KillMobExperienceSource(dispenser, config); return Arrays.asList(new KillMobExperienceSource(dispenser, config));
if (config.getKey().equals("mineblock")) if (config.getKey().equals("mineblock"))
return new MineBlockExperienceSource(dispenser, config); return Arrays.asList(new MineBlockExperienceSource(dispenser, config));
if (config.getKey().equals("placeblock")) if (config.getKey().equals("placeblock"))
return new PlaceBlockExperienceSource(dispenser, config); return Arrays.asList(new PlaceBlockExperienceSource(dispenser, config));
if (config.getKey().equals("brewpotion")) if (config.getKey().equals("brewpotion"))
return new BrewPotionExperienceSource(dispenser, config); return Arrays.asList(new BrewPotionExperienceSource(dispenser, config));
if (config.getKey().equals("smeltitem")) if (config.getKey().equals("smeltitem"))
return new SmeltItemExperienceSource(dispenser, config); return Arrays.asList(new SmeltItemExperienceSource(dispenser, config));
if (config.getKey().equals("enchantitem")) if (config.getKey().equals("enchantitem"))
return new EnchantItemExperienceSource(dispenser, config); return Arrays.asList(new EnchantItemExperienceSource(dispenser, config));
if (config.getKey().equals("repairitem")) if (config.getKey().equals("repairitem"))
return new RepairItemExperienceSource(dispenser, config); return Arrays.asList(new RepairItemExperienceSource(dispenser, config));
if (config.getKey().equals("craftitem")) if (config.getKey().equals("craftitem"))
return new CraftItemExperienceSource(dispenser, config); return Arrays.asList(new CraftItemExperienceSource(dispenser, config));
return null; return null;
} }

View File

@ -2,14 +2,16 @@ package net.Indyuce.mmocore.api.load;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.block.BlockType; import net.Indyuce.mmocore.api.block.BlockType;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import net.Indyuce.mmocore.loot.chest.condition.Condition; import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.api.quest.objective.Objective; import net.Indyuce.mmocore.api.quest.objective.Objective;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import java.util.List;
/** /**
* MMOLoader was initially an interface but it is now a * MMOLoader was initially an interface but it is now a
* class so devs do not have to add a new method * class so devs do not have to add a new method
@ -17,11 +19,11 @@ import org.bukkit.configuration.ConfigurationSection;
*/ */
public class MMOLoader { public class MMOLoader {
public Condition loadCondition(MMOLineConfig config) { public List<Condition> loadCondition(MMOLineConfig config) {
return null; return null;
} }
public Trigger loadTrigger(MMOLineConfig config) { public List<Trigger> loadTrigger(MMOLineConfig config) {
return null; return null;
} }
@ -33,7 +35,7 @@ public class MMOLoader {
return null; return null;
} }
public ExperienceSource<?> loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) { public List<ExperienceSource<?>> loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) {
return null; return null;
} }

View File

@ -1,22 +1,14 @@
package net.Indyuce.mmocore.api.player; package net.Indyuce.mmocore.api.player;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.player.MMOPlayerData; import io.lumine.mythic.lib.api.player.MMOPlayerData;
import io.lumine.mythic.lib.player.TemporaryPlayerData; import io.lumine.mythic.lib.player.TemporaryPlayerData;
import io.lumine.mythic.lib.player.cooldown.CooldownMap; import io.lumine.mythic.lib.player.cooldown.CooldownMap;
import io.lumine.mythic.lib.player.modifier.PlayerModifier;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.ConfigMessage;
import net.Indyuce.mmocore.api.SoundEvent; import net.Indyuce.mmocore.api.SoundEvent;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import net.Indyuce.mmocore.player.Unlockable; import net.Indyuce.mmocore.player.Unlockable;
import net.Indyuce.mmocore.tree.IntegerCoordinates; import net.Indyuce.mmocore.waypoint.CostType;
import net.Indyuce.mmocore.tree.NodeState;
import net.Indyuce.mmocore.tree.SkillTreeNode;
import net.Indyuce.mmocore.tree.skilltree.AutomaticSkillTree;
import net.Indyuce.mmocore.tree.skilltree.LinkedSkillTree;
import net.Indyuce.mmocore.tree.skilltree.SkillTree;
import net.Indyuce.mmocore.tree.skilltree.display.DisplayInfo;
import net.Indyuce.mmocore.tree.skilltree.display.Icon;
import net.Indyuce.mmocore.waypoint.Waypoint; import net.Indyuce.mmocore.waypoint.Waypoint;
import net.Indyuce.mmocore.api.event.PlayerExperienceGainEvent; import net.Indyuce.mmocore.api.event.PlayerExperienceGainEvent;
import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent;
@ -47,7 +39,6 @@ import net.Indyuce.mmocore.skill.ClassSkill;
import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skill.RegisteredSkill;
import net.Indyuce.mmocore.skill.cast.SkillCastingHandler; import net.Indyuce.mmocore.skill.cast.SkillCastingHandler;
import net.Indyuce.mmocore.waypoint.WaypointOption; import net.Indyuce.mmocore.waypoint.WaypointOption;
import net.java.truecommons.shed.Link;
import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
@ -62,8 +53,6 @@ import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.*;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
public class PlayerData extends OfflinePlayerData implements Closable, ExperienceTableClaimer { public class PlayerData extends OfflinePlayerData implements Closable, ExperienceTableClaimer {
@ -113,6 +102,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
*/ */
private final Map<String, Integer> tableItemClaims = new HashMap<>(); private final Map<String, Integer> tableItemClaims = new HashMap<>();
// NON-FINAL player data stuff made public to facilitate field change
public int skillGuiDisplayOffset;
public boolean noCooldown; public boolean noCooldown;
public CombatRunnable combat; public CombatRunnable combat;
@ -179,6 +170,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
} catch (NullPointerException exception) { } catch (NullPointerException exception) {
MMOCore.log(Level.SEVERE, "[Userdata] Could not find class " + getProfess().getId() + " while refreshing player data."); MMOCore.log(Level.SEVERE, "[Userdata] Could not find class " + getProfess().getId() + " while refreshing player data.");
} }
int j = 0; int j = 0;
while (j < boundSkills.size()) while (j < boundSkills.size())
try { try {
@ -501,8 +493,11 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
return guild != null; return guild != null;
} }
/**
* @return If the item is unlocked by the player
*/
public boolean hasUnlocked(Unlockable unlockable) { public boolean hasUnlocked(Unlockable unlockable) {
throw new RuntimeException("Not implemented yet"); return unlockedItems.contains(unlockable.getUnlockNamespacedKey());
} }
/** /**
@ -511,7 +506,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
* @return If the item was already unlocked when calling this method * @return If the item was already unlocked when calling this method
*/ */
public boolean unlock(Unlockable unlockable) { public boolean unlock(Unlockable unlockable) {
throw new RuntimeException("Not implemented yet"); return unlockedItems.add(unlockable.getUnlockNamespacedKey());
} }
public void setLevel(int level) { public void setLevel(int level) {
@ -544,7 +539,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public void refreshVanillaExp() { public void refreshVanillaExp() {
if (!isOnline() || !MMOCore.plugin.configManager.overrideVanillaExp) if (!isOnline() || !MMOCore.plugin.configManager.overrideVanillaExp)
return; return;
getPlayer().sendExperienceChange(0.01f);
getPlayer().setLevel(getLevel()); getPlayer().setLevel(getLevel());
getPlayer().setExp(Math.max(0, Math.min(1, (float) experience / (float) getLevelUpExperience()))); getPlayer().setExp(Math.max(0, Math.min(1, (float) experience / (float) getLevelUpExperience())));
} }
@ -718,6 +713,63 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
}.runTaskTimer(MMOCore.plugin, 0, 1); }.runTaskTimer(MMOCore.plugin, 0, 1);
} }
public String toJson() {
//We create the JSON corresponding to player Data
JsonObject jsonObject = new JsonObject();
MMOCore.sqlDebug("Saving data for: '" + getUniqueId() + "'...");
jsonObject.addProperty("class_points", getClassPoints());
jsonObject.addProperty("skill_points", getSkillPoints());
jsonObject.addProperty("attribute_points", getAttributePoints());
jsonObject.addProperty("attribute_realloc_points", getAttributeReallocationPoints());
jsonObject.addProperty("level", getLevel());
jsonObject.addProperty("experience", getExperience());
jsonObject.addProperty("class", getProfess().getId());
jsonObject.addProperty("last_login", getLastLogin());
jsonObject.addProperty("guild", hasGuild() ? getGuild().getId() : null);
jsonObject.addProperty("waypoints", MMOCoreUtils.arrayToJsonString(getWaypoints()));
jsonObject.addProperty("friends", MMOCoreUtils.arrayToJsonString(getFriends().stream().map(UUID::toString).collect(Collectors.toList())));
jsonObject.addProperty("bound_skills", MMOCoreUtils.arrayToJsonString(getBoundSkills().stream().map(skill -> skill.getSkill().getHandler().getId()).collect(Collectors.toList())));
jsonObject.addProperty("skills", MMOCoreUtils.entrySetToJsonString(mapSkillLevels().entrySet()));
jsonObject.addProperty("times_claimed", MMOCoreUtils.entrySetToJsonString(getItemClaims().entrySet()));
jsonObject.addProperty("attributes", getAttributes().toJsonString());
jsonObject.addProperty("professions", getCollectionSkills().toJsonString());
jsonObject.addProperty("quests", getQuestData().toJsonString());
jsonObject.addProperty("class_info", createClassInfoData(this).toString());
return jsonObject.toString();
}
public static JsonObject createClassInfoData(PlayerData data) {
JsonObject json = new JsonObject();
for (String c : data.getSavedClasses()) {
SavedClassInformation info = data.getClassInfo(c);
JsonObject classinfo = new JsonObject();
classinfo.addProperty("level", info.getLevel());
classinfo.addProperty("experience", info.getExperience());
classinfo.addProperty("skill-points", info.getSkillPoints());
classinfo.addProperty("attribute-points", info.getAttributePoints());
classinfo.addProperty("attribute-realloc-points", info.getAttributeReallocationPoints());
JsonObject skillinfo = new JsonObject();
for (String skill : info.getSkillKeys())
skillinfo.addProperty(skill, info.getSkillLevel(skill));
classinfo.add("skill", skillinfo);
JsonObject attributeinfo = new JsonObject();
for (String attribute : info.getAttributeKeys())
attributeinfo.addProperty(attribute, info.getAttributeLevel(attribute));
classinfo.add("attribute", attributeinfo);
json.add(c, classinfo);
}
return json;
}
public boolean hasReachedMaxLevel() { public boolean hasReachedMaxLevel() {
return getProfess().getMaxLevel() > 0 && getLevel() >= getProfess().getMaxLevel(); return getProfess().getMaxLevel() > 0 && getLevel() >= getProfess().getMaxLevel();
} }
@ -742,6 +794,9 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
* @param splitExp Should the exp be split among party members * @param splitExp Should the exp be split among party members
*/ */
public void giveExperience(double value, EXPSource source, @Nullable Location hologramLocation, boolean splitExp) { public void giveExperience(double value, EXPSource source, @Nullable Location hologramLocation, boolean splitExp) {
if (value <= 0)
return;
if (hasReachedMaxLevel()) { if (hasReachedMaxLevel()) {
setExperience(0); setExperience(0);
return; return;
@ -751,14 +806,18 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
value *= 1 + getStats().getStat(StatType.ADDITIONAL_EXPERIENCE) / 100; value *= 1 + getStats().getStat(StatType.ADDITIONAL_EXPERIENCE) / 100;
// Splitting exp through party members // Splitting exp through party members
AbstractParty party = getParty(); AbstractParty party;
if (splitExp && party != null) { if (splitExp && (party = getParty()) != null) {
List<PlayerData> onlineMembers = getParty().getOnlineMembers(); List<PlayerData> onlineMembers = party.getOnlineMembers();
value /= onlineMembers.size(); value /= onlineMembers.size();
for (PlayerData member : onlineMembers) for (PlayerData member : onlineMembers)
member.giveExperience(value, EXPSource.PARTY_SHARING, null, false); if (!equals(member))
member.giveExperience(value, source, null, false);
} }
// Apply buffs AFTER splitting exp
value *= (1 + getStats().getStat("ADDITIONAL_EXPERIENCE") / 100) * MMOCore.plugin.boosterManager.getMultiplier(null);
PlayerExperienceGainEvent event = new PlayerExperienceGainEvent(this, value, source); PlayerExperienceGainEvent event = new PlayerExperienceGainEvent(this, value, source);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) if (event.isCancelled())
@ -766,7 +825,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
// Experience hologram // Experience hologram
if (hologramLocation != null && isOnline()) if (hologramLocation != null && isOnline())
MMOCoreUtils.displayIndicator(hologramLocation, MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", String.valueOf(event.getExperience())).message()); MMOCoreUtils.displayIndicator(hologramLocation, MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", MythicLib.plugin.getMMOConfig().decimal.format(event.getExperience())).message());
experience = Math.max(0, experience + event.getExperience()); experience = Math.max(0, experience + event.getExperience());
@ -781,6 +840,10 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
experience -= needed; experience -= needed;
level = getLevel() + 1; level = getLevel() + 1;
// Apply class experience table
if (getProfess().hasExperienceTable())
getProfess().getExperienceTable().claim(this, level, getProfess());
} }
if (level > oldLevel) { if (level > oldLevel) {
@ -800,6 +863,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
refreshVanillaExp(); refreshVanillaExp();
} }
public double getExperience() { public double getExperience() {
return experience; return experience;
} }
@ -821,7 +886,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public void giveMana(double amount, PlayerResourceUpdateEvent.UpdateReason reason) { public void giveMana(double amount, PlayerResourceUpdateEvent.UpdateReason reason) {
// Avoid calling useless event // Avoid calling useless event
double max = getStats().getStat(StatType.MAX_MANA); double max = getStats().getStat("MAX_MANA");
double newest = Math.max(0, Math.min(mana + amount, max)); double newest = Math.max(0, Math.min(mana + amount, max));
if (mana == newest) if (mana == newest)
return; return;
@ -846,7 +911,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public void giveStamina(double amount, PlayerResourceUpdateEvent.UpdateReason reason) { public void giveStamina(double amount, PlayerResourceUpdateEvent.UpdateReason reason) {
// Avoid calling useless event // Avoid calling useless event
double max = getStats().getStat(StatType.MAX_STAMINA); double max = getStats().getStat("MAX_STAMINA");
double newest = Math.max(0, Math.min(stamina + amount, max)); double newest = Math.max(0, Math.min(stamina + amount, max));
if (stamina == newest) if (stamina == newest)
return; return;
@ -871,7 +936,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public void giveStellium(double amount, PlayerResourceUpdateEvent.UpdateReason reason) { public void giveStellium(double amount, PlayerResourceUpdateEvent.UpdateReason reason) {
// Avoid calling useless event // Avoid calling useless event
double max = getStats().getStat(StatType.MAX_STELLIUM); double max = getStats().getStat("MAX_STELLIUM");
double newest = Math.max(0, Math.min(stellium + amount, max)); double newest = Math.max(0, Math.min(stellium + amount, max));
if (stellium == newest) if (stellium == newest)
return; return;
@ -906,15 +971,15 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
} }
public void setMana(double amount) { public void setMana(double amount) {
mana = Math.max(0, Math.min(amount, getStats().getStat(StatType.MAX_MANA))); mana = Math.max(0, Math.min(amount, getStats().getStat("MAX_MANA")));
} }
public void setStamina(double amount) { public void setStamina(double amount) {
stamina = Math.max(0, Math.min(amount, getStats().getStat(StatType.MAX_STAMINA))); stamina = Math.max(0, Math.min(amount, getStats().getStat("MAX_STAMINA")));
} }
public void setStellium(double amount) { public void setStellium(double amount) {
stellium = Math.max(0, Math.min(amount, getStats().getStat(StatType.MAX_STELLIUM))); stellium = Math.max(0, Math.min(amount, getStats().getStat("MAX_STELLIUM")));
} }
public boolean isFullyLoaded() { public boolean isFullyLoaded() {
@ -947,6 +1012,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
Validate.isTrue(isCasting(), "Player not in casting mode"); Validate.isTrue(isCasting(), "Player not in casting mode");
skillCasting.close(); skillCasting.close();
this.skillCasting = null; this.skillCasting = null;
setLastActivity(PlayerActivity.ACTION_BAR_MESSAGE, 0); // Reset action bar
} }
public void displayActionBar(String message) { public void displayActionBar(String message) {
@ -1099,6 +1165,34 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
combat = new CombatRunnable(this); combat = new CombatRunnable(this);
} }
/**
* @return The savingPlayerData object corresponding to the playerData
*/
public SavingPlayerData getSavingPlayerData() {
return new SavingPlayerData(
getUniqueId(),
getClassPoints(),
getSkillPoints(),
getAttributePoints(),
getAttributeReallocationPoints(),
getLevel(),
getExperience(),
getProfess().getId(),
getLastLogin(),
hasGuild() ? getGuild().getId() : null,
getWaypoints(),
getFriends(),
getBoundSkills().stream().map(skill -> skill.getSkill().getHandler().getId()).toList(),
mapSkillLevels(),
getItemClaims(),
getAttributes().toJsonString(),
getCollectionSkills().toJsonString(),
getQuestData().toJsonString(),
createClassInfoData(this).toString());
}
@Override @Override
public int hashCode() { public int hashCode() {
return mmoData.hashCode(); return mmoData.hashCode();

View File

@ -0,0 +1,42 @@
package net.Indyuce.mmocore.api.player;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes;
import net.Indyuce.mmocore.api.quest.PlayerQuests;
import net.Indyuce.mmocore.experience.PlayerProfessions;
import net.Indyuce.mmocore.skill.ClassSkill;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* Just a container holding the basic playerData information that are needed to save it in a database.
*/
public record SavingPlayerData(
UUID uuid,
int classPoints,
int skillPoints,
int attributePoints,
int attributeReallocationPoints,
int level,
double experience,
String classId,
long lastLogin,
String guildId,
Set<String> waypoints,
List<UUID> friends,
List<String> boundSkills,
Map<String,Integer> skills,
Map<String,Integer> itemClaims,
String attributes,
String collectionsSkills,
String questData,
String classInfoData)
{
}

View File

@ -12,6 +12,7 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.Objects;
public class AttributeModifier extends PlayerModifier { public class AttributeModifier extends PlayerModifier {
private final String attribute; private final String attribute;
@ -74,9 +75,10 @@ public class AttributeModifier extends PlayerModifier {
public AttributeModifier(ConfigObject object) { public AttributeModifier(ConfigObject object) {
super(object.getString("key"), EquipmentSlot.OTHER, ModifierSource.OTHER); super(object.getString("key"), EquipmentSlot.OTHER, ModifierSource.OTHER);
String str = Objects.requireNonNull(object.getString("value"));
type = str.toCharArray()[str.length() - 1] == '%' ? ModifierType.RELATIVE : ModifierType.FLAT;
value = Double.parseDouble(type == ModifierType.RELATIVE ? str.substring(0, str.length() - 1) : str);
this.attribute = object.getString("attribute"); this.attribute = object.getString("attribute");
this.value = object.getDouble("value");
type = object.getBoolean("multiplicative", false) ? ModifierType.RELATIVE : ModifierType.FLAT;
} }
public String getAttribute() { public String getAttribute() {

View File

@ -3,20 +3,30 @@ package net.Indyuce.mmocore.api.player.attribute;
import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.stat.modifier.StatModifier; import io.lumine.mythic.lib.api.stat.modifier.StatModifier;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.droptable.ExperienceTable;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.ExpCurve;
import net.Indyuce.mmocore.experience.ExperienceObject;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet; import java.util.HashSet;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
public class PlayerAttribute { public class PlayerAttribute implements ExperienceObject {
private final String id, name; private final String id, name;
private final int max; private final int max;
private final ExperienceTable expTable;
/** /**
* Used to store stats using StatType, but attributes also need to access * All buffs granted by an attribute. These are normalized and
* non basic MMOCore stats hence the string maps keys * must be multiplied by the player level first
*/ */
private final Set<StatModifier> buffs = new HashSet<>(); private final Set<StatModifier> buffs = new HashSet<>();
@ -35,6 +45,16 @@ public class PlayerAttribute {
} catch (IllegalArgumentException exception) { } catch (IllegalArgumentException exception) {
MMOCore.log(Level.WARNING, "Could not load buff '" + key + "' from attribute '" + id + "': " + exception.getMessage()); MMOCore.log(Level.WARNING, "Could not load buff '" + key + "' from attribute '" + id + "': " + exception.getMessage());
} }
// Load exp table
ExperienceTable expTable = null;
if (config.contains("exp-table"))
try {
expTable = MMOCore.plugin.experience.loadExperienceTable(config.get("exp-table"));
} catch (RuntimeException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load exp table from class '" + id + "': " + exception.getMessage());
}
this.expTable = expTable;
} }
public String getId() { public String getId() {
@ -56,4 +76,36 @@ public class PlayerAttribute {
public Set<StatModifier> getBuffs() { public Set<StatModifier> getBuffs() {
return buffs; return buffs;
} }
@Override
public String getKey() {
return "attribute:" + getId().replace("-", "_");
}
@NotNull
@Override
public ExperienceTable getExperienceTable() {
return Objects.requireNonNull(expTable);
}
@Override
public boolean hasExperienceTable() {
return expTable != null;
}
@Nullable
@Override
public ExpCurve getExpCurve() {
throw new RuntimeException("Attributes don't have experience");
}
@Override
public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, @NotNull EXPSource source) {
throw new RuntimeException("Attributes don't have experience");
}
@Override
public boolean shouldHandle(PlayerData playerData) {
throw new RuntimeException("Attributes don't have experience");
}
} }

View File

@ -159,14 +159,14 @@ public class PlayerAttributes {
return map.get(key); return map.get(key);
} }
public void addModifier(String key, double value) { public AttributeModifier addModifier(String key, double value) {
addModifier(new AttributeModifier(key, id, value, ModifierType.FLAT, EquipmentSlot.OTHER, ModifierSource.OTHER)); return addModifier(new AttributeModifier(key, id, value, ModifierType.FLAT, EquipmentSlot.OTHER, ModifierSource.OTHER));
} }
public void addModifier(AttributeModifier modifier) { public AttributeModifier addModifier(AttributeModifier modifier) {
map.put(modifier.getKey(), modifier); AttributeModifier mod = map.put(modifier.getKey(), modifier);
update(); update();
return mod;
} }
public Set<String> getKeys() { public Set<String> getKeys() {
@ -177,7 +177,7 @@ public class PlayerAttributes {
return map.containsKey(key); return map.containsKey(key);
} }
public void removeModifier(String key) { public AttributeModifier removeModifier(String key) {
AttributeModifier mod = map.remove(key); AttributeModifier mod = map.remove(key);
/* /*
@ -190,12 +190,13 @@ public class PlayerAttributes {
((Closeable) mod).close(); ((Closeable) mod).close();
update(); update();
} }
return mod;
} }
public void update() { public void update() {
PlayerAttribute attribute = MMOCore.plugin.attributeManager.get(id); PlayerAttribute attr = MMOCore.plugin.attributeManager.get(id);
int total = getTotal(); int total = getTotal();
attribute.getBuffs().forEach(buff -> buff.multiply(total).register(data.getMMOPlayerData())); attr.getBuffs().forEach(buff -> buff.multiply(total).register(data.getMMOPlayerData()));
} }
public String getId() { public String getId() {

View File

@ -7,6 +7,12 @@ public enum ClassOption {
*/ */
DEFAULT, DEFAULT,
/**
* When set to true any player has to have the
* mmocore.class.lower_case_name permission to use the class
*/
NEEDS_PERMISSION,
/** /**
* If the class should in the /class GUI * If the class should in the /class GUI
*/ */

View File

@ -8,26 +8,27 @@ import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.api.util.PostLoadObject; import io.lumine.mythic.lib.api.util.PostLoadObject;
import io.lumine.mythic.lib.version.VersionMaterial; import io.lumine.mythic.lib.version.VersionMaterial;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.event.EventTrigger; import net.Indyuce.mmocore.api.player.profess.event.EventTrigger;
import net.Indyuce.mmocore.api.player.profess.resource.ManaDisplayOptions; import net.Indyuce.mmocore.api.player.profess.resource.ManaDisplayOptions;
import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource;
import net.Indyuce.mmocore.api.player.profess.resource.ResourceRegeneration; import net.Indyuce.mmocore.api.player.profess.resource.ResourceRegeneration;
import net.Indyuce.mmocore.api.player.stats.StatType;
import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.api.util.math.formula.LinearValue; import net.Indyuce.mmocore.api.util.math.formula.LinearValue;
import net.Indyuce.mmocore.loot.chest.particle.CastingParticle; import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.ExpCurve; import net.Indyuce.mmocore.experience.ExpCurve;
import net.Indyuce.mmocore.experience.ExperienceObject; import net.Indyuce.mmocore.experience.ExperienceObject;
import net.Indyuce.mmocore.experience.droptable.ExperienceTable; import net.Indyuce.mmocore.experience.droptable.ExperienceTable;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.dispenser.ClassExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.loot.chest.particle.CastingParticle;
import net.Indyuce.mmocore.player.playerclass.ClassTrigger; import net.Indyuce.mmocore.player.playerclass.ClassTrigger;
import net.Indyuce.mmocore.player.playerclass.ClassTriggerType; import net.Indyuce.mmocore.player.playerclass.ClassTriggerType;
import net.Indyuce.mmocore.player.stats.StatInfo;
import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.ClassSkill;
import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skill.RegisteredSkill;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import org.apache.commons.lang.Validate; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Particle; import org.bukkit.Particle;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
@ -51,7 +52,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
private final ExpCurve expCurve; private final ExpCurve expCurve;
private final ExperienceTable expTable; private final ExperienceTable expTable;
private final Map<StatType, LinearValue> stats = new HashMap<>(); private final Map<String, LinearValue> stats = new HashMap<>();
private final Map<String, ClassSkill> skills = new LinkedHashMap<>(); private final Map<String, ClassSkill> skills = new LinkedHashMap<>();
private final List<Subclass> subclasses = new ArrayList<>(); private final List<Subclass> subclasses = new ArrayList<>();
@ -124,7 +125,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
if (config.contains("attributes")) if (config.contains("attributes"))
for (String key : config.getConfigurationSection("attributes").getKeys(false)) for (String key : config.getConfigurationSection("attributes").getKeys(false))
try { try {
stats.put(StatType.valueOf(key.toUpperCase().replace("-", "_")), stats.put(UtilityMethods.enumName(key),
new LinearValue(config.getConfigurationSection("attributes." + key))); new LinearValue(config.getConfigurationSection("attributes." + key)));
} catch (IllegalArgumentException exception) { } catch (IllegalArgumentException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load stat info '" + key + "' from class '" MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load stat info '" + key + "' from class '"
@ -155,11 +156,11 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
"Could not load option '" + key + "' from class '" + key + "': " + exception.getMessage()); "Could not load option '" + key + "' from class '" + key + "': " + exception.getMessage());
} }
if (config.contains("main-exp-sources")) { if (config.contains("main-exp-sources.yml")) {
ExperienceDispenser dispenser = new ClassExperienceDispenser(this); for (String key : config.getStringList("main-exp-sources.yml"))
for (String key : config.getStringList("main-exp-sources"))
try { try {
ExperienceSource<?> source = MMOCore.plugin.loadManager.loadExperienceSource(new MMOLineConfig(key), dispenser); List<ExperienceSource<?>> list = MMOCore.plugin.loadManager.loadExperienceSource(new MMOLineConfig(key), this);
for (ExperienceSource source : list)
MMOCore.plugin.experience.registerSource(source); MMOCore.plugin.experience.registerSource(source);
} catch (IllegalArgumentException exception) { } catch (IllegalArgumentException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load exp source '" + key + "' from class '" MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load exp source '" + key + "' from class '"
@ -187,11 +188,12 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
} }
/** /**
* Used to generate the default Human class if no one is * Used to generate the default Human class if no one is specified
* specified after loading all the player classes. This is * after loading all the player classes.
* a very basic class that will make sure MMOCore can still * <p>
* continue to run without having to stop the server because * This is a very basic class that will make sure MMOCore can still
* some option was not provided * continue to run without having to stop the server because some
* option was not provided.
*/ */
public PlayerClass(String id, String name, Material material) { public PlayerClass(String id, String name, Material material) {
super(null); super(null);
@ -205,7 +207,6 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
expTable = null; expTable = null;
castParticle = new CastingParticle(Particle.SPELL_INSTANT); castParticle = new CastingParticle(Particle.SPELL_INSTANT);
actionBarFormat = ""; actionBarFormat = "";
this.icon = new ItemStack(material); this.icon = new ItemStack(material);
setOption(ClassOption.DISPLAY, false); setOption(ClassOption.DISPLAY, false);
setOption(ClassOption.DEFAULT, false); setOption(ClassOption.DEFAULT, false);
@ -296,7 +297,19 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
} }
public boolean hasOption(ClassOption option) { public boolean hasOption(ClassOption option) {
return options.containsKey(option) ? options.get(option) : option.getDefault(); return options.getOrDefault(option, option.getDefault());
}
@Override
public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) {
hologramLocation = !MMOCore.plugin.getConfig().getBoolean("display-main-class-exp-holograms") ? null
: hologramLocation;
playerData.giveExperience(experience, source, hologramLocation, true);
}
@Override
public boolean shouldHandle(PlayerData playerData) {
return equals(playerData.getProfess());
} }
@Nullable @Nullable
@ -320,16 +333,11 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
return eventTriggers.get(name); return eventTriggers.get(name);
} }
@Deprecated public void setDefaultStatFormula(String type, LinearValue value) {
public void setStat(StatType type, double base, double perLevel) { stats.put(UtilityMethods.enumName(type), value);
setStat(type, new LinearValue(base, perLevel));
} }
public void setStat(StatType type, LinearValue value) { public double calculateStat(String stat, int level) {
stats.put(type, value);
}
public double calculateStat(StatType stat, int level) {
return getStatInfo(stat).calculate(level); return getStatInfo(stat).calculate(level);
} }
@ -363,19 +371,6 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
return getSkill(skill.getHandler().getId()); return getSkill(skill.getHandler().getId());
} }
/**
* Reduces map checkups when skills are being checked on events that are
* commonly called like EntityDamageEvent or regen events.
* <p>
* Examples:
* - {@link net.Indyuce.mmocore.skill.list.Neptune_Gift}
* - {@link net.Indyuce.mmocore.skill.list.Ambers}
*/
public Optional<ClassSkill> findSkill(RegisteredSkill skill) {
ClassSkill found = skills.get(skill.getHandler().getId());
return found == null ? Optional.empty() : Optional.of(found);
}
@Nullable @Nullable
public ClassSkill getSkill(String id) { public ClassSkill getSkill(String id) {
return skills.get(id); return skills.get(id);
@ -385,8 +380,10 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
return skills.values(); return skills.values();
} }
private LinearValue getStatInfo(StatType type) { @NotNull
return stats.containsKey(type) ? stats.get(type) : type.getDefault(); private LinearValue getStatInfo(String stat) {
LinearValue found = stats.get(stat);
return found == null ? StatInfo.valueOf(stat).getDefaultFormula() : found;
} }
@Override @Override
@ -394,6 +391,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
return obj instanceof PlayerClass && ((PlayerClass) obj).id.equals(id); return obj instanceof PlayerClass && ((PlayerClass) obj).id.equals(id);
} }
@Nullable
public String getActionBar() { public String getActionBar() {
return actionBarFormat; return actionBarFormat;
} }

View File

@ -6,15 +6,15 @@ import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
import net.Indyuce.mmocore.manager.data.PlayerDataManager;
import net.Indyuce.mmocore.skill.RegisteredSkill;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
import net.Indyuce.mmocore.skill.RegisteredSkill;
import net.Indyuce.mmocore.manager.data.PlayerDataManager.DefaultPlayerData;
public class SavedClassInformation { public class SavedClassInformation {
private final int level, skillPoints, attributePoints, attributeReallocationPoints; private final int level, skillPoints, attributePoints, attributeReallocationPoints;
@ -60,7 +60,7 @@ public class SavedClassInformation {
player.getAttributes().mapPoints(), player.mapSkillLevels()); player.getAttributes().mapPoints(), player.mapSkillLevels());
} }
public SavedClassInformation(DefaultPlayerData data) { public SavedClassInformation(PlayerDataManager.DefaultPlayerData data) {
this(data.getLevel(), 0, data.getSkillPoints(), data.getAttributePoints(), data.getAttrReallocPoints()); this(data.getLevel(), 0, data.getSkillPoints(), data.getAttributePoints(), data.getAttrReallocPoints());
} }

View File

@ -3,7 +3,6 @@ package net.Indyuce.mmocore.api.player.profess.event;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.quest.trigger.Trigger; import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import net.Indyuce.mmocore.experience.droptable.ExperienceTable;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
@ -26,7 +25,7 @@ public class EventTrigger {
for (String format : list) for (String format : list)
try { try {
triggers.add(MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(format))); triggers.addAll(MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(format)));
} catch (IllegalArgumentException exception) { } catch (IllegalArgumentException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING, MMOCore.plugin.getLogger().log(Level.WARNING,
"Could not load trigger '" + format + "' from event trigger '" + event + "': " + exception.getMessage()); "Could not load trigger '" + format + "' from event trigger '" + event + "': " + exception.getMessage());

View File

@ -2,8 +2,8 @@ package net.Indyuce.mmocore.api.player.profess.event.trigger;
import io.lumine.mythic.lib.api.event.PlayerAttackEvent; import io.lumine.mythic.lib.api.event.PlayerAttackEvent;
import io.lumine.mythic.lib.damage.DamageType; import io.lumine.mythic.lib.damage.DamageType;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;

View File

@ -1,11 +1,11 @@
package net.Indyuce.mmocore.api.player.profess.event.trigger; package net.Indyuce.mmocore.api.player.profess.event.trigger;
import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler;
@Deprecated @Deprecated

View File

@ -1,8 +1,8 @@
package net.Indyuce.mmocore.api.player.profess.event.trigger; package net.Indyuce.mmocore.api.player.profess.event.trigger;
import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;

View File

@ -1,10 +1,10 @@
package net.Indyuce.mmocore.api.player.profess.resource; package net.Indyuce.mmocore.api.player.profess.resource;
import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent; import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent;
import net.Indyuce.mmocore.api.quest.trigger.ManaTrigger;
import net.Indyuce.mmocore.command.rpg.admin.ResourceCommandTreeNode;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.ClassOption; import net.Indyuce.mmocore.api.player.profess.ClassOption;
import net.Indyuce.mmocore.api.player.stats.StatType;
import net.Indyuce.mmocore.api.quest.trigger.ManaTrigger;
import org.bukkit.attribute.Attribute; import org.bukkit.attribute.Attribute;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@ -20,27 +20,27 @@ public enum PlayerResource {
(data, amount) -> data.getPlayer().setHealth(amount)), (data, amount) -> data.getPlayer().setHealth(amount)),
MANA(PlayerData::getMana, MANA(PlayerData::getMana,
data -> data.getStats().getStat(StatType.MAX_MANA), data -> data.getStats().getStat("MAX_MANA"),
(data, amount) -> data.giveMana(amount, PlayerResourceUpdateEvent.UpdateReason.REGENERATION), (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.giveMana(-amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND), (data, amount) -> data.giveMana(-amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND),
(data, amount) -> data.setMana(amount)), (data, amount) -> data.setMana(amount)),
STAMINA(PlayerData::getStamina, STAMINA(PlayerData::getStamina,
data -> data.getStats().getStat(StatType.MAX_STAMINA), data -> data.getStats().getStat("MAX_STAMINA"),
(data, amount) -> data.giveStamina(amount, PlayerResourceUpdateEvent.UpdateReason.REGENERATION), (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.giveStamina(-amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND), (data, amount) -> data.giveStamina(-amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND),
(data, amount) -> data.setStamina(amount)), (data, amount) -> data.setStamina(amount)),
STELLIUM(PlayerData::getStellium, STELLIUM(PlayerData::getStellium,
data -> data.getStats().getStat(StatType.MAX_STELLIUM), data -> data.getStats().getStat("MAX_STELLIUM"),
(data, amount) -> data.giveStellium(amount, PlayerResourceUpdateEvent.UpdateReason.REGENERATION), (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.giveStellium(-amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND), (data, amount) -> data.giveStellium(-amount, PlayerResourceUpdateEvent.UpdateReason.COMMAND),
(data, amount) -> data.setStellium(amount)); (data, amount) -> data.setStellium(amount));
private final StatType regenStat, maxRegenStat; private final String regenStat, maxRegenStat;
private final ClassOption offCombatRegen; private final ClassOption offCombatRegen;
private final Function<PlayerData, Double> current, max; private final Function<PlayerData, Double> current, max;
private final BiConsumer<PlayerData, Double> regen; private final BiConsumer<PlayerData, Double> regen;
@ -54,8 +54,8 @@ public enum PlayerResource {
BiConsumer<PlayerData, Double> give, BiConsumer<PlayerData, Double> give,
BiConsumer<PlayerData, Double> take, BiConsumer<PlayerData, Double> take,
BiConsumer<PlayerData, Double> set) { BiConsumer<PlayerData, Double> set) {
this.regenStat = StatType.valueOf(name() + "_REGENERATION"); this.regenStat = name() + "_REGENERATION";
this.maxRegenStat = StatType.valueOf("MAX_" + name() + "_REGENERATION"); this.maxRegenStat = "MAX_" + name() + "_REGENERATION";
this.offCombatRegen = ClassOption.valueOf("OFF_COMBAT_" + name() + "_REGEN"); this.offCombatRegen = ClassOption.valueOf("OFF_COMBAT_" + name() + "_REGEN");
this.current = current; this.current = current;
this.max = max; this.max = max;
@ -68,14 +68,14 @@ public enum PlayerResource {
/** /**
* @return Stat which corresponds to flat resource regeneration * @return Stat which corresponds to flat resource regeneration
*/ */
public StatType getRegenStat() { public String getRegenStat() {
return regenStat; return regenStat;
} }
/** /**
* @return Stat which corresponds to resource regeneration scaling with the player's max health * @return Stat which corresponds to resource regeneration scaling with the player's max health
*/ */
public StatType getMaxRegenStat() { public String getMaxRegenStat() {
return maxRegenStat; return maxRegenStat;
} }
@ -112,7 +112,7 @@ public enum PlayerResource {
} }
/** /**
* Used by MMOCore admin commands here: {@link net.Indyuce.mmocore.command.rpg.admin.ResourceCommandTreeNode} * Used by MMOCore admin commands here: {@link ResourceCommandTreeNode}
*/ */
public BiConsumer<PlayerData, Double> getConsumer(ManaTrigger.Operation operation) { public BiConsumer<PlayerData, Double> getConsumer(ManaTrigger.Operation operation) {
switch (operation) { switch (operation) {

View File

@ -1,7 +1,7 @@
package net.Indyuce.mmocore.api.player.profess.resource; package net.Indyuce.mmocore.api.player.profess.resource;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.math.formula.LinearValue; import net.Indyuce.mmocore.api.util.math.formula.LinearValue;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;

View File

@ -6,19 +6,16 @@ import io.lumine.mythic.lib.api.stat.StatMap;
import io.lumine.mythic.lib.api.stat.modifier.StatModifier; import io.lumine.mythic.lib.api.stat.modifier.StatModifier;
import io.lumine.mythic.lib.player.modifier.ModifierSource; import io.lumine.mythic.lib.player.modifier.ModifierSource;
import io.lumine.mythic.lib.player.modifier.ModifierType; import io.lumine.mythic.lib.player.modifier.ModifierType;
import net.Indyuce.mmocore.skill.ClassSkill;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.player.stats.StatInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Locale;
public class PlayerStats { public class PlayerStats {
private final PlayerData data; private final PlayerData data;
/** /**
* Utilclass to easily manipulate the MMOLib stat map * Util class to easily manipulate the MMOLib stat map
* *
* @param data Playerdata * @param data Playerdata
*/ */
@ -34,6 +31,7 @@ public class PlayerStats {
return data.getMMOPlayerData().getStatMap(); return data.getMMOPlayerData().getStatMap();
} }
@Deprecated
public StatInstance getInstance(StatType stat) { public StatInstance getInstance(StatType stat) {
return getMap().getInstance(stat.name()); return getMap().getInstance(stat.name());
} }
@ -42,35 +40,26 @@ public class PlayerStats {
return getMap().getInstance(stat); return getMap().getInstance(stat);
} }
/** public double getStat(String stat) {
* Allows for stat type enum to have dynamic professions.
* ID FORMAT: STAT_TYPE_HERE_PROFESSION_HERE
*
* @param type the type of stat
* @param profession the stat's specific permission
* @return instance of found stat
* @author Ehhthan
*/
@NotNull
public StatInstance getInstance(StatType type, @Nullable Profession profession) {
if (profession == null)
return getInstance(type);
else {
String id = (type.name() + '_' + profession.getId()).replace('-', '_').replace(' ', '_').toUpperCase(Locale.ROOT);
return getInstance(id);
}
}
/*
* applies relative attributes on the base stat too
*/
public double getStat(StatType stat) {
return getInstance(stat).getTotal(); return getInstance(stat).getTotal();
} }
public double getBase(StatType stat) { /**
return data.getProfess().calculateStat(stat, * MMOCore base stat value differs from the on in MythicLib.
stat.hasProfession() ? data.getCollectionSkills().getLevel(stat.getProfession()) : data.getLevel()); * <p>
* MythicLib: the base stat value is only defined for stats
* which are based on vanilla player attributes. It corresponds
* to the stat amount any player has with NO attribute modifier whatsoever.
* <p>
* MMOCore: the base stat value corresponds to the stat amount
* the player CLASS grants. It can be similar or equal to the one
* in MMOCore but it really is completely different.
*
* @return MMOCore base stat value
*/
public double getBase(String stat) {
Profession profession = StatInfo.valueOf(stat).profession;
return data.getProfess().calculateStat(stat, profession == null ? data.getLevel() : data.getCollectionSkills().getLevel(profession));
} }
/** /**
@ -81,7 +70,7 @@ public class PlayerStats {
* see {@link PlayerData#update()} for more info * see {@link PlayerData#update()} for more info
*/ */
public synchronized void updateStats() { public synchronized void updateStats() {
for (StatType stat : StatType.values()) { for (StatType stat : StatType.values()) { // TODO fix
StatInstance instance = getMap().getInstance(stat.name()); StatInstance instance = getMap().getInstance(stat.name());
StatInstance.ModifierPacket packet = instance.newPacket(); StatInstance.ModifierPacket packet = instance.newPacket();
@ -89,7 +78,7 @@ public class PlayerStats {
packet.removeIf(str -> str.equals("mmocoreClass")); packet.removeIf(str -> str.equals("mmocoreClass"));
// Add newest one // Add newest one
double total = getBase(stat) - instance.getBase(); double total = getBase(stat.name()) - instance.getBase();
if (total != 0) if (total != 0)
packet.addModifier(new StatModifier("mmocoreClass", stat.name(), total, ModifierType.FLAT, EquipmentSlot.OTHER, ModifierSource.OTHER)); packet.addModifier(new StatModifier("mmocoreClass", stat.name(), total, ModifierType.FLAT, EquipmentSlot.OTHER, ModifierSource.OTHER));

View File

@ -1,14 +1,14 @@
package net.Indyuce.mmocore.api.player.stats; package net.Indyuce.mmocore.api.player.stats;
import io.lumine.mythic.lib.MythicLib;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.ConfigFile;
import net.Indyuce.mmocore.api.util.math.formula.LinearValue; import net.Indyuce.mmocore.api.util.math.formula.LinearValue;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import org.bukkit.configuration.file.FileConfiguration; import net.Indyuce.mmocore.player.stats.StatInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.DecimalFormat; import java.util.Objects;
@Deprecated
public enum StatType { public enum StatType {
// Vanilla stats // Vanilla stats
@ -87,17 +87,17 @@ public enum StatType {
/** /**
* Reduces amount of tugs needed to fish * Reduces amount of tugs needed to fish
*/ */
FISHING_STRENGTH("fishing"), FISHING_STRENGTH,
/** /**
* Chance of instant success when fishing * Chance of instant success when fishing
*/ */
CRITICAL_FISHING_CHANCE("fishing"), CRITICAL_FISHING_CHANCE,
/** /**
* Chance of crit fishing failure * Chance of crit fishing failure
*/ */
CRITICAL_FISHING_FAILURE_CHANCE("fishing"), CRITICAL_FISHING_FAILURE_CHANCE,
/** /**
* Chance of dropping more minerals when mining. * Chance of dropping more minerals when mining.
@ -114,49 +114,35 @@ public enum StatType {
*/ */
LUCK_OF_THE_FIELD; LUCK_OF_THE_FIELD;
private String profession; @Deprecated
private LinearValue defaultInfo;
private DecimalFormat format;
StatType() {
// Completely custom stat
}
@SuppressWarnings("SameParameterValue")
StatType(String profession) {
this.profession = profession;
}
public String getProfession() { public String getProfession() {
return profession; return findProfession().getId();
} }
@Deprecated
@Nullable
public Profession findProfession() { public Profession findProfession() {
return MMOCore.plugin.professionManager.get(profession); return StatInfo.valueOf(name()).profession;
} }
@Deprecated
public boolean hasProfession() { public boolean hasProfession() {
return profession != null; return findProfession() != null;
} }
@Deprecated
@NotNull
public LinearValue getDefault() { public LinearValue getDefault() {
return defaultInfo; return StatInfo.valueOf(name()).getDefaultFormula();
} }
@Deprecated
public boolean matches(Profession profession) { public boolean matches(Profession profession) {
return this.profession != null && this.profession.equals(profession.getId()); return Objects.equals(findProfession(), profession);
} }
@Deprecated
public String format(double value) { public String format(double value) {
return format.format(value); return StatInfo.valueOf(name()).format(value);
}
public static void load() {
FileConfiguration config = new ConfigFile("stats").getConfig();
for (StatType stat : values()) {
stat.defaultInfo = config.contains("default." + stat.name()) ? new LinearValue(config.getConfigurationSection("default." + stat.name())) : new LinearValue(0, 0);
stat.format = MythicLib.plugin.getMMOConfig().newDecimalFormat(config.contains("decimal-format." + stat.name()) ? config.getString("decimal-format." + stat.name()) : "0.#");
}
} }
} }

View File

@ -100,6 +100,7 @@ public class PlayerQuests implements Closable {
} }
} }
if (jo.has("finished")) if (jo.has("finished"))
for (Entry<String, JsonElement> entry : jo.getAsJsonObject("finished").entrySet()) for (Entry<String, JsonElement> entry : jo.getAsJsonObject("finished").entrySet())
finished.put(entry.getKey(), entry.getValue().getAsLong()); finished.put(entry.getKey(), entry.getValue().getAsLong());

View File

@ -1,5 +1,7 @@
package net.Indyuce.mmocore.api.quest.objective; package net.Indyuce.mmocore.api.quest.objective;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@ -11,8 +13,6 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
public class ClickonObjective extends Objective { public class ClickonObjective extends Objective {

View File

@ -1,5 +1,7 @@
package net.Indyuce.mmocore.api.quest.objective; package net.Indyuce.mmocore.api.quest.objective;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@ -10,8 +12,6 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
public class GoToObjective extends Objective { public class GoToObjective extends Objective {

View File

@ -1,13 +1,13 @@
package net.Indyuce.mmocore.api.quest.objective; package net.Indyuce.mmocore.api.quest.objective;
import io.lumine.mythic.lib.api.event.PlayerKillEntityEvent; import io.lumine.mythic.lib.api.event.PlayerKillEntityEvent;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
public class KillMobObjective extends Objective { public class KillMobObjective extends Objective {

View File

@ -1,5 +1,8 @@
package net.Indyuce.mmocore.api.quest.objective; package net.Indyuce.mmocore.api.quest.objective;
import net.Indyuce.mmocore.api.event.CustomBlockMineEvent;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -7,9 +10,6 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
import net.Indyuce.mmocore.api.event.CustomBlockMineEvent;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
public class MineBlockObjective extends Objective { public class MineBlockObjective extends Objective {

View File

@ -30,7 +30,7 @@ public abstract class Objective {
for (String key : config.getStringList("triggers")) for (String key : config.getStringList("triggers"))
try { try {
triggers.add(MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(key))); triggers.addAll(MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(key)));
} catch (IllegalArgumentException exception) { } catch (IllegalArgumentException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING, MMOCore.plugin.getLogger().log(Level.WARNING,
"Could not load trigger '" + key + "' from objective '" + id + "': " + exception.getMessage()); "Could not load trigger '" + key + "' from objective '" + id + "': " + exception.getMessage());

View File

@ -1,12 +1,11 @@
package net.Indyuce.mmocore.api.quest.trigger; package net.Indyuce.mmocore.api.quest.trigger;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.SimpleExperienceObject;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.dispenser.ProfessionExperienceDispenser;
import net.Indyuce.mmocore.experience.dispenser.SimpleExperienceDispenser;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.math.formula.RandomAmount; import net.Indyuce.mmocore.api.util.math.formula.RandomAmount;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
@ -28,9 +27,9 @@ public class ExperienceTrigger extends Trigger {
if (config.contains("profession")) { if (config.contains("profession")) {
String id = config.getString("profession").toLowerCase().replace("_", "-"); String id = config.getString("profession").toLowerCase().replace("_", "-");
Validate.isTrue(MMOCore.plugin.professionManager.has(id), "Could not find profession"); Validate.isTrue(MMOCore.plugin.professionManager.has(id), "Could not find profession");
dispenser = new ProfessionExperienceDispenser(MMOCore.plugin.professionManager.get(id)); dispenser = MMOCore.plugin.professionManager.get(id);
} else } else
dispenser = new SimpleExperienceDispenser(); dispenser = new SimpleExperienceObject();
amount = new RandomAmount(config.getString("amount")); amount = new RandomAmount(config.getString("amount"));
source = config.contains("source") ? EXPSource.valueOf(config.getString("source").toUpperCase()) : EXPSource.QUEST; source = config.contains("source") ? EXPSource.valueOf(config.getString("source").toUpperCase()) : EXPSource.QUEST;
} }

View File

@ -1,9 +1,10 @@
package net.Indyuce.mmocore.api.util; package net.Indyuce.mmocore.api.util;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.hologram.Hologram;
import io.lumine.mythic.lib.version.VersionMaterial; import io.lumine.mythic.lib.version.VersionMaterial;
import io.lumine.mythic.utils.holograms.Hologram;
import io.lumine.mythic.utils.serialize.Position;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@ -104,8 +105,7 @@ public class MMOCoreUtils {
* @param message Message to display * @param message Message to display
*/ */
public static void displayIndicator(Location loc, String message) { public static void displayIndicator(Location loc, String message) {
Hologram holo = Hologram.create(Position.of(loc), Arrays.asList(message)); Hologram holo = Hologram.create(loc, Arrays.asList(message));
holo.spawn();
Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> holo.despawn(), 20); Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> holo.despawn(), 20);
} }
@ -180,6 +180,27 @@ public class MMOCoreUtils {
return result.toString(); return result.toString();
} }
public static Collection<String> jsonArrayToList(String json) {
return new ArrayList<>(Arrays.asList(MythicLib.plugin.getJson().parse(json, String[].class)));
}
public static String arrayToJsonString(Collection<String> array) {
JsonArray object = new JsonArray();
for (String str : array) {
object.add(str);
}
return object.toString();
}
public static String entrySetToJsonString(Set<Map.Entry<String, Integer>> entrySet) {
JsonObject object = new JsonObject();
for (Map.Entry<String, Integer> entry : entrySet) {
object.addProperty(entry.getKey(), entry.getValue());
}
return object.toString();
}
/** /**
* Method to get all entities surrounding a location. This method does not * Method to get all entities surrounding a location. This method does not
* take every entity in the world but rather takes all the entities from the * take every entity in the world but rather takes all the entities from the
@ -236,7 +257,7 @@ public class MMOCoreUtils {
*/ */
public static void decreaseDurability(Player player, EquipmentSlot slot, int damage) { public static void decreaseDurability(Player player, EquipmentSlot slot, int damage) {
ItemStack item = player.getInventory().getItem(slot); ItemStack item = player.getInventory().getItem(slot);
if (!item.hasItemMeta() || !(item.getItemMeta() instanceof Damageable) || item.getItemMeta().isUnbreakable()) if (item == null || item.getType().getMaxDurability() == 0 || !item.hasItemMeta() || !(item.getItemMeta() instanceof Damageable) || item.getItemMeta().isUnbreakable())
return; return;
PlayerItemDamageEvent event = new PlayerItemDamageEvent(player, item, damage); PlayerItemDamageEvent event = new PlayerItemDamageEvent(player, item, damage);

View File

@ -1,10 +1,10 @@
package net.Indyuce.mmocore.api.util.debug; package net.Indyuce.mmocore.api.util.debug;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import net.Indyuce.mmocore.MMOCore;
import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;

View File

@ -1,5 +1,6 @@
package net.Indyuce.mmocore.api.util.input; package net.Indyuce.mmocore.api.util.input;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -11,7 +12,6 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Consumer; import org.bukkit.util.Consumer;
import net.Indyuce.mmocore.MMOCore;
import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.MythicLib;
public class AnvilGUI extends PlayerInput { public class AnvilGUI extends PlayerInput {

View File

@ -1,5 +1,6 @@
package net.Indyuce.mmocore.api.util.input; package net.Indyuce.mmocore.api.util.input;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -8,8 +9,6 @@ import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.util.Consumer; import org.bukkit.util.Consumer;
import net.Indyuce.mmocore.MMOCore;
public class ChatInput extends PlayerInput { public class ChatInput extends PlayerInput {
public ChatInput(Player player, InputType type, Consumer<String> output) { public ChatInput(Player player, InputType type, Consumer<String> output) {
super(player, output); super(player, output);

View File

@ -1,12 +1,11 @@
package net.Indyuce.mmocore.api.util.input; package net.Indyuce.mmocore.api.util.input;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.util.Consumer; import org.bukkit.util.Consumer;
import net.Indyuce.mmocore.MMOCore;
public abstract class PlayerInput implements Listener { public abstract class PlayerInput implements Listener {
private final Player player; private final Player player;
private final Consumer<String> output; private final Consumer<String> output;

View File

@ -110,4 +110,16 @@ public class LinearValue {
return value; return value;
} }
@Override
public String toString() {
return "LinearValue{" +
"base=" + base +
", perLevel=" + perLevel +
", min=" + min +
", max=" + max +
", hasmin=" + hasmin +
", hasmax=" + hasmax +
'}';
}
} }

View File

@ -1,5 +1,7 @@
package net.Indyuce.mmocore.command; package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -7,9 +9,7 @@ import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.manager.InventoryManager;
public class AttributesCommand extends BukkitCommand { public class AttributesCommand extends BukkitCommand {
public AttributesCommand(ConfigurationSection config) { public AttributesCommand(ConfigurationSection config) {

View File

@ -1,5 +1,7 @@
package net.Indyuce.mmocore.command; package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -7,9 +9,7 @@ import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.manager.InventoryManager;
public class ClassCommand extends BukkitCommand { public class ClassCommand extends BukkitCommand {
public ClassCommand(ConfigurationSection config) { public ClassCommand(ConfigurationSection config) {

View File

@ -1,5 +1,6 @@
package net.Indyuce.mmocore.command; package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.gui.eco.DepositMenu;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -7,8 +8,6 @@ import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.gui.eco.DepositMenu;
public class DepositCommand extends BukkitCommand { public class DepositCommand extends BukkitCommand {
public DepositCommand(ConfigurationSection config) { public DepositCommand(ConfigurationSection config) {
super(config.getString("main")); super(config.getString("main"));

View File

@ -2,11 +2,11 @@ package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.MMOCommandEvent; import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.api.player.OfflinePlayerData; import net.Indyuce.mmocore.api.player.OfflinePlayerData;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.social.FriendRequest; import net.Indyuce.mmocore.api.player.social.FriendRequest;
import net.Indyuce.mmocore.api.player.social.Request; import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -2,6 +2,9 @@ package net.Indyuce.mmocore.command;
import java.util.UUID; import java.util.UUID;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
@ -10,12 +13,9 @@ import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
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.PlayerData;
import net.Indyuce.mmocore.api.player.social.Request; import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.guild.provided.GuildInvite; import net.Indyuce.mmocore.guild.provided.GuildInvite;
import net.Indyuce.mmocore.manager.InventoryManager;
public class GuildCommand extends BukkitCommand { public class GuildCommand extends BukkitCommand {

View File

@ -33,6 +33,5 @@ public class MMOCoreCommandTreeRoot extends CommandTreeRoot implements CommandEx
addChild(new BoosterCommandTreeNode(this)); addChild(new BoosterCommandTreeNode(this));
addChild(new WaypointsCommandTreeNode(this)); addChild(new WaypointsCommandTreeNode(this));
addChild(new QuestCommandTreeNode(this)); addChild(new QuestCommandTreeNode(this));
addChild(new WaypointsCommandTreeNode(this));
} }
} }

View File

@ -2,6 +2,9 @@ package net.Indyuce.mmocore.command;
import java.util.UUID; import java.util.UUID;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.manager.InventoryManager;
import net.Indyuce.mmocore.party.provided.MMOCorePartyModule; import net.Indyuce.mmocore.party.provided.MMOCorePartyModule;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -11,12 +14,9 @@ import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
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.PlayerData;
import net.Indyuce.mmocore.party.provided.PartyInvite; import net.Indyuce.mmocore.party.provided.PartyInvite;
import net.Indyuce.mmocore.api.player.social.Request; import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.manager.InventoryManager;
public class PartyCommand extends BukkitCommand { public class PartyCommand extends BukkitCommand {

View File

@ -1,5 +1,7 @@
package net.Indyuce.mmocore.command; package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -7,9 +9,7 @@ import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.manager.InventoryManager;
public class PlayerStatsCommand extends BukkitCommand { public class PlayerStatsCommand extends BukkitCommand {
public PlayerStatsCommand(ConfigurationSection config) { public PlayerStatsCommand(ConfigurationSection config) {

View File

@ -1,14 +1,14 @@
package net.Indyuce.mmocore.command; package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.defaults.BukkitCommand; import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.manager.InventoryManager;
public class QuestsCommand extends BukkitCommand { public class QuestsCommand extends BukkitCommand {
public QuestsCommand(ConfigurationSection config) { public QuestsCommand(ConfigurationSection config) {

View File

@ -1,15 +1,15 @@
package net.Indyuce.mmocore.command; package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.manager.InventoryManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.defaults.BukkitCommand; import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
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.PlayerData;
import net.Indyuce.mmocore.manager.InventoryManager;
public class SkillsCommand extends BukkitCommand { public class SkillsCommand extends BukkitCommand {
public SkillsCommand(ConfigurationSection config) { public SkillsCommand(ConfigurationSection config) {

View File

@ -1,12 +1,12 @@
package net.Indyuce.mmocore.command; package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.defaults.BukkitCommand; import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.api.event.MMOCommandEvent;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.manager.InventoryManager; import net.Indyuce.mmocore.manager.InventoryManager;

View File

@ -1,5 +1,6 @@
package net.Indyuce.mmocore.command; package net.Indyuce.mmocore.command;
import net.Indyuce.mmocore.MMOCore;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -9,7 +10,6 @@ import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.eco.Withdraw; import net.Indyuce.mmocore.api.eco.Withdraw;
public class WithdrawCommand extends BukkitCommand { public class WithdrawCommand extends BukkitCommand {

View File

@ -1,10 +1,9 @@
package net.Indyuce.mmocore.command.rpg; package net.Indyuce.mmocore.command.rpg;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
public class ReloadCommandTreeNode extends CommandTreeNode { public class ReloadCommandTreeNode extends CommandTreeNode {

View File

@ -15,6 +15,7 @@ public class AdminCommandTreeNode extends CommandTreeNode {
addChild(new InfoCommandTreeNode(this)); addChild(new InfoCommandTreeNode(this));
addChild(new ClassCommandTreeNode(this)); addChild(new ClassCommandTreeNode(this));
addChild(new ForceClassCommandTreeNode(this)); addChild(new ForceClassCommandTreeNode(this));
addChild(new TransferDataTreeNode(this));
addChild(new ExperienceCommandTreeNode(this)); addChild(new ExperienceCommandTreeNode(this));
addChild(new LevelCommandTreeNode(this)); addChild(new LevelCommandTreeNode(this));

View File

@ -1,15 +1,15 @@
package net.Indyuce.mmocore.command.rpg.admin; package net.Indyuce.mmocore.command.rpg.admin;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes;
import net.Indyuce.mmocore.command.CommandVerbose; import net.Indyuce.mmocore.command.CommandVerbose;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes.AttributeInstance;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;
@ -61,7 +61,7 @@ public class AttributeCommandTreeNode extends CommandTreeNode {
return CommandResult.FAILURE; return CommandResult.FAILURE;
} }
AttributeInstance instance = PlayerData.get(player).getAttributes().getInstance(attribute); PlayerAttributes.AttributeInstance instance = PlayerData.get(player).getAttributes().getInstance(attribute);
instance.setBase(Math.min(attribute.getMax(), instance.getBase() + c * amount)); instance.setBase(Math.min(attribute.getMax(), instance.getBase() + c * amount));
CommandVerbose.verbose(sender, CommandVerbose.CommandType.ATTRIBUTE, ChatColor.GOLD + player.getName() + ChatColor.YELLOW CommandVerbose.verbose(sender, CommandVerbose.CommandType.ATTRIBUTE, ChatColor.GOLD + player.getName() + ChatColor.YELLOW
+ " now has " + ChatColor.GOLD + instance.getBase() + ChatColor.YELLOW + " " + attribute.getName() + "."); + " now has " + ChatColor.GOLD + instance.getBase() + ChatColor.YELLOW + " " + attribute.getName() + ".");

View File

@ -1,15 +1,15 @@
package net.Indyuce.mmocore.command.rpg.admin; package net.Indyuce.mmocore.command.rpg.admin;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.PlayerChangeClassEvent;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
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.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.api.player.profess.SavedClassInformation; import net.Indyuce.mmocore.api.player.profess.SavedClassInformation;
import net.Indyuce.mmocore.command.CommandVerbose; import net.Indyuce.mmocore.command.CommandVerbose;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;

View File

@ -1,12 +1,13 @@
package net.Indyuce.mmocore.command.rpg.admin; package net.Indyuce.mmocore.command.rpg.admin;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.CommandVerbose; import net.Indyuce.mmocore.command.CommandVerbose;
import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot; import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.PlayerProfessions; import net.Indyuce.mmocore.experience.PlayerProfessions;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
@ -23,9 +24,9 @@ public class ExperienceCommandTreeNode extends CommandTreeNode {
addChild(new ActionCommandTreeNode(this, "set", PlayerData::setExperience, PlayerProfessions::setExperience)); addChild(new ActionCommandTreeNode(this, "set", PlayerData::setExperience, PlayerProfessions::setExperience));
addChild(new ActionCommandTreeNode(this, "give", (data, value) -> data.giveExperience(value, EXPSource.COMMAND), (professions, profession, addChild(new ActionCommandTreeNode(this, "give", (data, value) -> data.giveExperience(value, EXPSource.COMMAND), (professions, profession,
value) -> professions.giveExperience(profession, value, EXPSource.COMMAND, professions.getPlayerData().getPlayer().getLocation()))); value) -> professions.giveExperience(profession, value, EXPSource.COMMAND)));
addChild(new ActionCommandTreeNode(this, "take", (data, value) -> data.giveExperience(-value, EXPSource.COMMAND), (professions, profession, addChild(new ActionCommandTreeNode(this, "take", (data, value) -> data.giveExperience(-value, EXPSource.COMMAND), (professions, profession,
value) -> professions.giveExperience(profession, -value, EXPSource.COMMAND, professions.getPlayerData().getPlayer().getLocation()))); value) -> professions.giveExperience(profession, -value, EXPSource.COMMAND)));
} }
public static class ActionCommandTreeNode extends CommandTreeNode { public static class ActionCommandTreeNode extends CommandTreeNode {
@ -58,8 +59,8 @@ public class ExperienceCommandTreeNode extends CommandTreeNode {
int amount; int amount;
try { try {
amount = Integer.parseInt(args[5]); amount = Integer.parseInt(args[5]);
Validate.isTrue(amount > 0); Validate.isTrue(amount >= 0);
} catch (NumberFormatException exception) { } catch (RuntimeException exception) {
sender.sendMessage(ChatColor.RED + args[5] + " is not a valid number."); sender.sendMessage(ChatColor.RED + args[5] + " is not a valid number.");
return CommandResult.FAILURE; return CommandResult.FAILURE;
} }
@ -68,7 +69,7 @@ public class ExperienceCommandTreeNode extends CommandTreeNode {
if (args[4].equalsIgnoreCase("main")) { if (args[4].equalsIgnoreCase("main")) {
main.accept(data, amount); main.accept(data, amount);
CommandVerbose.verbose(sender, CommandVerbose.CommandType.EXPERIENCE, ChatColor.GOLD + player.getName() + ChatColor.YELLOW CommandVerbose.verbose(sender, CommandVerbose.CommandType.EXPERIENCE, ChatColor.GOLD + player.getName() + ChatColor.YELLOW
+ " now has " + ChatColor.GOLD + data.getExperience() + ChatColor.YELLOW + " EXP."); + " now has " + ChatColor.GOLD + MythicLib.plugin.getMMOConfig().decimal.format(data.getExperience()) + ChatColor.YELLOW + " EXP.");
return CommandResult.SUCCESS; return CommandResult.SUCCESS;
} }

View File

@ -1,14 +1,14 @@
package net.Indyuce.mmocore.command.rpg.admin; package net.Indyuce.mmocore.command.rpg.admin;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.command.CommandVerbose; import net.Indyuce.mmocore.command.CommandVerbose;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;

View File

@ -1,11 +1,12 @@
package net.Indyuce.mmocore.command.rpg.admin; package net.Indyuce.mmocore.command.rpg.admin;
import io.lumine.mythic.lib.MythicLib;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
@ -33,7 +34,7 @@ public class InfoCommandTreeNode extends CommandTreeNode {
sender.sendMessage(ChatColor.YELLOW + "----------------------------------------------------"); sender.sendMessage(ChatColor.YELLOW + "----------------------------------------------------");
sender.sendMessage(ChatColor.YELLOW + "Class: " + ChatColor.GOLD + playerData.getProfess().getName()); sender.sendMessage(ChatColor.YELLOW + "Class: " + ChatColor.GOLD + playerData.getProfess().getName());
sender.sendMessage(ChatColor.YELLOW + "Level: " + ChatColor.GOLD + playerData.getLevel()); sender.sendMessage(ChatColor.YELLOW + "Level: " + ChatColor.GOLD + playerData.getLevel());
sender.sendMessage(ChatColor.YELLOW + "Experience: " + ChatColor.GOLD + playerData.getExperience() + ChatColor.YELLOW + " / " + ChatColor.GOLD sender.sendMessage(ChatColor.YELLOW + "Experience: " + ChatColor.GOLD + MythicLib.plugin.getMMOConfig().decimal.format(playerData.getExperience()) + ChatColor.YELLOW + " / " + ChatColor.GOLD
+ playerData.getLevelUpExperience()); + playerData.getLevelUpExperience());
sender.sendMessage(ChatColor.YELLOW + "Class Points: " + ChatColor.GOLD + playerData.getClassPoints()); sender.sendMessage(ChatColor.YELLOW + "Class Points: " + ChatColor.GOLD + playerData.getClassPoints());
sender.sendMessage(ChatColor.YELLOW + "Quests: " + ChatColor.GOLD + playerData.getQuestData().getFinishedQuests().size() + ChatColor.YELLOW sender.sendMessage(ChatColor.YELLOW + "Quests: " + ChatColor.GOLD + playerData.getQuestData().getFinishedQuests().size() + ChatColor.YELLOW

View File

@ -2,14 +2,14 @@ package net.Indyuce.mmocore.command.rpg.admin;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.command.CommandVerbose; import net.Indyuce.mmocore.command.CommandVerbose;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.PlayerProfessions; import net.Indyuce.mmocore.experience.PlayerProfessions;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;

View File

@ -1,14 +1,14 @@
package net.Indyuce.mmocore.command.rpg.admin; package net.Indyuce.mmocore.command.rpg.admin;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes.AttributeInstance;
import net.Indyuce.mmocore.command.CommandVerbose; import net.Indyuce.mmocore.command.CommandVerbose;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;
@ -171,7 +171,7 @@ public class ResetCommandTreeNode extends CommandTreeNode {
if (args.length > 4 && args[4].equalsIgnoreCase("-reallocate")) { if (args.length > 4 && args[4].equalsIgnoreCase("-reallocate")) {
int points = 0; int points = 0;
for (AttributeInstance ins : data.getAttributes().getInstances()) { for (PlayerAttributes.AttributeInstance ins : data.getAttributes().getInstances()) {
points += ins.getBase(); points += ins.getBase();
ins.setBase(0); ins.setBase(0);
} }

View File

@ -2,9 +2,9 @@ package net.Indyuce.mmocore.command.rpg.admin;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;
import net.Indyuce.mmocore.api.quest.trigger.ManaTrigger;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource;
import net.Indyuce.mmocore.api.quest.trigger.ManaTrigger;
import net.Indyuce.mmocore.command.CommandVerbose; import net.Indyuce.mmocore.command.CommandVerbose;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;

View File

@ -0,0 +1,108 @@
package net.Indyuce.mmocore.command.rpg.admin;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.SavingPlayerData;
import net.Indyuce.mmocore.guild.provided.Guild;
import net.Indyuce.mmocore.manager.data.DataProvider;
import net.Indyuce.mmocore.manager.data.mysql.MySQLDataProvider;
import net.Indyuce.mmocore.manager.data.yaml.YAMLDataProvider;
import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitRunnable;
import java.io.File;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* This command allows to transfer data from your actual storage type
* to the other one which lets the user switch between storage types.
*/
public class TransferDataTreeNode extends CommandTreeNode {
public TransferDataTreeNode(CommandTreeNode parent) {
super(parent, "transferdata");
}
@Override
public CommandResult execute(CommandSender commandSender, String[] strings) {
final List<UUID> playerUUIDs = new ArrayList<>();
if (MMOCore.plugin.dataProvider instanceof YAMLDataProvider) {
File folder = new File(MMOCore.plugin.getDataFolder() + "/userdata");
playerUUIDs.addAll(Arrays.stream(folder.listFiles())
.map(file -> UUID.fromString(file.getName().replace(".yml", "")))
.collect(Collectors.toList()));
} else {
((MySQLDataProvider) MMOCore.plugin.dataProvider).getResult(
"SELECT uuid from mmocore_playerdata", (result) -> {
try {
while (result.next()) {
playerUUIDs.add(UUID.fromString(result.getString("uuid")));
}
} catch (SQLException e) {
e.printStackTrace();
}
});
}
List<SavingPlayerData> savingPlayerDataList = new ArrayList<>();
for (UUID uuid : playerUUIDs) {
MMOCore.plugin.dataProvider.getDataManager().loadSavingPlayerData(uuid, savingPlayerDataList);
}
final DataProvider provider;
if (MMOCore.plugin.dataProvider instanceof YAMLDataProvider) {
provider = new MySQLDataProvider(MMOCore.plugin.getConfig());
((MySQLDataProvider) provider).load();
} else {
provider = new YAMLDataProvider();
}
//5 seconds later we put all this data into the other data storage.
new BukkitRunnable() {
@Override
public void run() {
try {
// Save player data
for (SavingPlayerData data : savingPlayerDataList)
provider.getDataManager().saveData(data);
// Save guild info
for (Guild guild : provider.getGuildManager().getAll())
provider.getGuildManager().save(guild);
} catch (Exception e) {
commandSender.sendMessage("Couldn't transfer properly the data.");
e.printStackTrace();
if (provider != null && provider instanceof MySQLDataProvider) {
((MySQLDataProvider) provider).close();
}
}
}
}.runTaskLater(MMOCore.plugin, 100L);
//We close the connection 10 s later to avoid memory leaks.
new BukkitRunnable() {
@Override
public void run() {
if (provider != null && provider instanceof MySQLDataProvider) {
((MySQLDataProvider) provider).close();
}
}
}.runTaskLater(MMOCore.plugin, 200);
return CommandResult.SUCCESS;
}
}

View File

@ -2,12 +2,12 @@ package net.Indyuce.mmocore.command.rpg.booster;
import java.util.Arrays; import java.util.Arrays;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.ConfigMessage;
import net.Indyuce.mmocore.experience.Booster; import net.Indyuce.mmocore.experience.Booster;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;

View File

@ -1,10 +1,10 @@
package net.Indyuce.mmocore.command.rpg.booster; package net.Indyuce.mmocore.command.rpg.booster;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.Booster; import net.Indyuce.mmocore.experience.Booster;
import net.Indyuce.mmocore.api.util.math.format.DelayFormat; import net.Indyuce.mmocore.api.util.math.format.DelayFormat;
import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.MythicLib;

View File

@ -3,10 +3,10 @@ package net.Indyuce.mmocore.command.rpg.booster;
import java.util.Iterator; import java.util.Iterator;
import java.util.UUID; import java.util.UUID;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.Booster; import net.Indyuce.mmocore.experience.Booster;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;

View File

@ -1,11 +1,11 @@
package net.Indyuce.mmocore.command.rpg.debug; package net.Indyuce.mmocore.command.rpg.debug;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.stat.StatInstance; import io.lumine.mythic.lib.api.stat.StatInstance;
import io.lumine.mythic.lib.api.stat.modifier.StatModifier; import io.lumine.mythic.lib.api.stat.modifier.StatModifier;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.stats.StatType;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -15,10 +15,7 @@ public class StatModifiersCommandTreeNode extends CommandTreeNode {
public StatModifiersCommandTreeNode(CommandTreeNode parent) { public StatModifiersCommandTreeNode(CommandTreeNode parent) {
super(parent, "statmods"); super(parent, "statmods");
addParameter(new Parameter("<stat>", (explorer, list) -> { addParameter(new Parameter("<stat>", (explorer, list) -> list.add("STAT_ID")));
for (StatType stat : StatType.values())
list.add(stat.name());
}));
} }
@Override @Override
@ -32,15 +29,7 @@ public class StatModifiersCommandTreeNode extends CommandTreeNode {
} }
PlayerData data = PlayerData.get((Player) sender); PlayerData data = PlayerData.get((Player) sender);
StatType stat; StatInstance instance = data.getStats().getInstance(UtilityMethods.enumName(args[2]));
try {
stat = StatType.valueOf(args[2].toUpperCase().replace("-", "_").replace(" ", "_"));
} catch (IllegalArgumentException exception) {
sender.sendMessage(ChatColor.RED + "Could not find stat: " + args[2] + ".");
return CommandResult.FAILURE;
}
StatInstance instance = data.getStats().getInstance(stat);
sender.sendMessage("Stat Modifiers (" + instance.getKeys().size() + "):"); sender.sendMessage("Stat Modifiers (" + instance.getKeys().size() + "):");
for (String key : instance.getKeys()) { for (String key : instance.getKeys()) {
StatModifier mod = instance.getModifier(key); StatModifier mod = instance.getModifier(key);

View File

@ -1,23 +1,19 @@
package net.Indyuce.mmocore.command.rpg.debug; package net.Indyuce.mmocore.command.rpg.debug;
import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.player.stats.StatInfo;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.stats.StatType;
import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter;
public class StatValueCommandTreeNode extends CommandTreeNode { public class StatValueCommandTreeNode extends CommandTreeNode {
public StatValueCommandTreeNode(CommandTreeNode parent) { public StatValueCommandTreeNode(CommandTreeNode parent) {
super(parent, "statvalue"); super(parent, "statvalue");
addParameter(new Parameter("<stat>", (explorer, list) -> { addParameter(new Parameter("<stat>", (explorer, list) -> list.add("STAT_ID")));
for (StatType stat : StatType.values())
list.add(stat.name());
}));
addParameter(new Parameter("(formatted)", (explorer, list) -> list.add("true")));
} }
@Override @Override
@ -31,20 +27,9 @@ public class StatValueCommandTreeNode extends CommandTreeNode {
} }
PlayerData data = PlayerData.get((Player) sender); PlayerData data = PlayerData.get((Player) sender);
StatType stat; StatInfo stat = StatInfo.valueOf(UtilityMethods.enumName(args[2]));
try { sender.sendMessage(DebugCommandTreeNode.commandPrefix + "Stat Value (" + ChatColor.BLUE + stat.name + ChatColor.WHITE + "): "
stat = StatType.valueOf(args[2].toUpperCase().replace("-", "_").replace(" ", "_")); + ChatColor.GREEN + data.getStats().getStat(stat.name));
} catch (IllegalArgumentException exception) {
sender.sendMessage(ChatColor.RED + "Could not find stat: " + args[2] + ".");
return CommandResult.FAILURE;
}
if (args.length > 3 && args[3].equals("true"))
sender.sendMessage(DebugCommandTreeNode.commandPrefix + "Stat Value (" + ChatColor.BLUE + stat.name() + ChatColor.WHITE + "): "
+ ChatColor.GREEN + stat.format(data.getStats().getStat(stat)) + ChatColor.WHITE + " *");
else
sender.sendMessage(DebugCommandTreeNode.commandPrefix + "Stat Value (" + ChatColor.BLUE + stat.name() + ChatColor.WHITE + "): "
+ ChatColor.GREEN + data.getStats().getStat(stat));
return CommandResult.SUCCESS; return CommandResult.SUCCESS;
} }

View File

@ -1,12 +1,12 @@
package net.Indyuce.mmocore.command.rpg.quest; package net.Indyuce.mmocore.command.rpg.quest;
import net.Indyuce.mmocore.api.quest.PlayerQuests;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.quest.PlayerQuests;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;

View File

@ -2,8 +2,8 @@ package net.Indyuce.mmocore.command.rpg.quest;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.quest.PlayerQuests; import net.Indyuce.mmocore.api.quest.PlayerQuests;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -1,14 +1,14 @@
package net.Indyuce.mmocore.command.rpg.quest; package net.Indyuce.mmocore.command.rpg.quest;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.quest.PlayerQuests;
import net.Indyuce.mmocore.api.quest.Quest;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.quest.PlayerQuests;
import net.Indyuce.mmocore.api.quest.Quest;
import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot; import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;

View File

@ -0,0 +1,44 @@
package net.Indyuce.mmocore.command.rpg.waypoint;
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 net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.waypoint.Waypoint;
import net.Indyuce.mmocore.util.item.WaypointBookBuilder;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class ItemCommandTreeNode extends CommandTreeNode {
public ItemCommandTreeNode(CommandTreeNode parent) {
super(parent, "item");
addParameter(new Parameter("<waypoint>", (explorer, list) -> MMOCore.plugin.waypointManager.getAll().forEach(way -> list.add(way.getId()))));
addParameter(Parameter.PLAYER);
}
@Override
public CommandResult execute(CommandSender sender, String[] args) {
if (args.length < 4)
return CommandResult.THROW_USAGE;
if (!MMOCore.plugin.waypointManager.has(args[2])) {
sender.sendMessage(ChatColor.RED + "Could not find waypoint " + args[2]);
return CommandResult.FAILURE;
}
Player player = Bukkit.getPlayer(args[3]);
if (player == null) {
sender.sendMessage(ChatColor.RED + "Could not find player " + args[3]);
return CommandResult.FAILURE;
}
Waypoint waypoint = MMOCore.plugin.waypointManager.get(args[2]);
new SmartGive(player).give(new WaypointBookBuilder(waypoint).build());
sender.sendMessage(ChatColor.GOLD + "Gave " + player.getName() + ChatColor.YELLOW + " a waypoint book of " + ChatColor.GOLD + waypoint.getId()
+ ChatColor.YELLOW + ".");
return CommandResult.SUCCESS;
}
}

View File

@ -1,5 +1,6 @@
package net.Indyuce.mmocore.command.rpg.waypoint; package net.Indyuce.mmocore.command.rpg.waypoint;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -27,7 +28,7 @@ public class OpenCommandTreeNode extends CommandTreeNode {
return CommandResult.FAILURE; return CommandResult.FAILURE;
} }
InventoryManager.WAYPOINTS.newInventory(net.Indyuce.mmocore.api.player.PlayerData.get(player)).open(); InventoryManager.WAYPOINTS.newInventory(PlayerData.get(player)).open();
return CommandResult.SUCCESS; return CommandResult.SUCCESS;
} }
} }

View File

@ -1,12 +1,12 @@
package net.Indyuce.mmocore.command.rpg.waypoint; package net.Indyuce.mmocore.command.rpg.waypoint;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.waypoint.Waypoint;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.waypoint.Waypoint;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import io.lumine.mythic.lib.command.api.CommandTreeNode; import io.lumine.mythic.lib.command.api.CommandTreeNode;
import io.lumine.mythic.lib.command.api.Parameter; import io.lumine.mythic.lib.command.api.Parameter;

View File

@ -11,6 +11,7 @@ public class WaypointsCommandTreeNode extends CommandTreeNode {
addChild(new UnlockCommandTreeNode(this)); addChild(new UnlockCommandTreeNode(this));
addChild(new OpenCommandTreeNode(this)); addChild(new OpenCommandTreeNode(this));
addChild(new TeleportCommandTreeNode(this)); addChild(new TeleportCommandTreeNode(this));
addChild(new ItemCommandTreeNode(this));
} }
@Override @Override

View File

@ -1,28 +0,0 @@
package net.Indyuce.mmocore.comp;
import io.lumine.mythic.lib.comp.target.InteractionType;
import io.lumine.mythic.lib.comp.target.TargetRestriction;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.party.AbstractParty;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import java.util.Optional;
public class MMOCoreTargetRestriction implements TargetRestriction {
@Override
public boolean canTarget(Player player, LivingEntity target, InteractionType interaction) {
if (interaction.isOffense() && target instanceof Player && PlayerData.has(target.getUniqueId())) {
PlayerData targetData = PlayerData.get(target.getUniqueId());
// Check for the same party
AbstractParty party = targetData.getParty();
if (party != null && party.hasMember(player))
return false;
}
return true;
}
}

View File

@ -4,11 +4,11 @@ import io.lumine.mythic.bukkit.MythicBukkit;
import io.lumine.mythic.bukkit.events.MythicDropLoadEvent; import io.lumine.mythic.bukkit.events.MythicDropLoadEvent;
import io.lumine.mythic.bukkit.events.MythicReloadedEvent; import io.lumine.mythic.bukkit.events.MythicReloadedEvent;
import io.lumine.mythic.core.skills.placeholders.Placeholder; import io.lumine.mythic.core.skills.placeholders.Placeholder;
import net.Indyuce.mmocore.comp.mythicmobs.load.CurrencyItemDrop;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute;
import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes; import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes;
import net.Indyuce.mmocore.comp.mythicmobs.load.CurrencyItemDrop;
import net.Indyuce.mmocore.comp.mythicmobs.load.GoldPouchDrop; import net.Indyuce.mmocore.comp.mythicmobs.load.GoldPouchDrop;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;

View File

@ -1,22 +1,25 @@
package net.Indyuce.mmocore.comp.mythicmobs; package net.Indyuce.mmocore.comp.mythicmobs;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.comp.mythicmobs.load.*;
import net.Indyuce.mmocore.api.load.MMOLoader; import net.Indyuce.mmocore.api.load.MMOLoader;
import net.Indyuce.mmocore.api.quest.objective.Objective; import net.Indyuce.mmocore.api.quest.objective.Objective;
import net.Indyuce.mmocore.api.quest.trigger.Trigger; import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import net.Indyuce.mmocore.comp.mythicmobs.load.*;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem; import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import java.util.Arrays;
import java.util.List;
public class MythicMobsMMOLoader extends MMOLoader { public class MythicMobsMMOLoader extends MMOLoader {
@Override @Override
public Trigger loadTrigger(MMOLineConfig config) { public List<Trigger> loadTrigger(MMOLineConfig config) {
if (config.getKey().equalsIgnoreCase("mmskill") || config.getKey().equalsIgnoreCase("mythicmobskill")) if (config.getKey().equalsIgnoreCase("mmskill") || config.getKey().equalsIgnoreCase("mythicmobskill"))
return new MythicSkillTrigger(config); return Arrays.asList(new MythicSkillTrigger(config));
return null; return null;
} }
@ -42,12 +45,12 @@ public class MythicMobsMMOLoader extends MMOLoader {
} }
@Override @Override
public ExperienceSource<?> loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) { public List<ExperienceSource<?>> loadExperienceSource(MMOLineConfig config, ExperienceDispenser dispenser) {
if (config.getKey().equalsIgnoreCase("killmythicmob")) if (config.getKey().equalsIgnoreCase("killmythicmob"))
return new KillMythicMobExperienceSource(dispenser, config); return Arrays.asList(new KillMythicMobExperienceSource(dispenser, config));
if (config.getKey().equalsIgnoreCase("killmythicfaction")) if (config.getKey().equalsIgnoreCase("killmythicfaction"))
return new KillMythicFactionExperienceSource(dispenser, config); return Arrays.asList(new KillMythicFactionExperienceSource(dispenser, config));
return null; return null;
} }

View File

@ -1,17 +1,16 @@
package net.Indyuce.mmocore.comp.mythicmobs.load; package net.Indyuce.mmocore.comp.mythicmobs.load;
import io.lumine.mythic.api.adapters.AbstractItemStack;
import io.lumine.mythic.api.config.MythicLineConfig; import io.lumine.mythic.api.config.MythicLineConfig;
import io.lumine.mythic.api.drops.DropMetadata; import io.lumine.mythic.api.drops.DropMetadata;
import io.lumine.mythic.api.drops.IMultiDrop; import io.lumine.mythic.api.drops.IItemDrop;
import io.lumine.mythic.bukkit.adapters.BukkitItemStack; import io.lumine.mythic.bukkit.adapters.BukkitItemStack;
import io.lumine.mythic.core.drops.Drop; import io.lumine.mythic.core.drops.Drop;
import io.lumine.mythic.core.drops.LootBag;
import io.lumine.mythic.core.drops.droppables.ItemDrop;
import net.Indyuce.mmocore.util.item.CurrencyItemBuilder; import net.Indyuce.mmocore.util.item.CurrencyItemBuilder;
import java.util.Random; import java.util.Random;
public class CurrencyItemDrop extends Drop implements IMultiDrop { public class CurrencyItemDrop extends Drop implements IItemDrop {
private final String key; private final String key;
private final int minw; private final int minw;
private final int maxw; private final int maxw;
@ -26,12 +25,9 @@ public class CurrencyItemDrop extends Drop implements IMultiDrop {
maxw = config.getInteger("maxw", 1); maxw = config.getInteger("maxw", 1);
} }
@SuppressWarnings("deprecation")
@Override @Override
public LootBag get(DropMetadata metadata) { public AbstractItemStack getDrop(DropMetadata dropMetadata, double v) {
LootBag loot = new LootBag(metadata); return new BukkitItemStack(new CurrencyItemBuilder(key, random(minw, maxw)).build());
loot.add(new ItemDrop(this.getLine(), this.getConfig(), new BukkitItemStack(new CurrencyItemBuilder(key, random(minw, maxw)).build())));
return loot;
} }
private int random(int a, int b) { private int random(int a, int b) {

View File

@ -1,12 +1,11 @@
package net.Indyuce.mmocore.comp.mythicmobs.load; package net.Indyuce.mmocore.comp.mythicmobs.load;
import io.lumine.mythic.api.adapters.AbstractItemStack;
import io.lumine.mythic.api.config.MythicLineConfig; import io.lumine.mythic.api.config.MythicLineConfig;
import io.lumine.mythic.api.drops.DropMetadata; import io.lumine.mythic.api.drops.DropMetadata;
import io.lumine.mythic.api.drops.IMultiDrop; import io.lumine.mythic.api.drops.IItemDrop;
import io.lumine.mythic.bukkit.adapters.BukkitItemStack; import io.lumine.mythic.bukkit.adapters.BukkitItemStack;
import io.lumine.mythic.core.drops.Drop; import io.lumine.mythic.core.drops.Drop;
import io.lumine.mythic.core.drops.LootBag;
import io.lumine.mythic.core.drops.droppables.ItemDrop;
import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.ItemTag;
import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.item.NBTItem;
import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.MMOCoreUtils;
@ -17,7 +16,7 @@ import org.bukkit.inventory.ItemStack;
import java.util.Random; import java.util.Random;
public class GoldPouchDrop extends Drop implements IMultiDrop { public class GoldPouchDrop extends Drop implements IItemDrop {
private final int min; private final int min;
private final int max; private final int max;
@ -30,10 +29,8 @@ public class GoldPouchDrop extends Drop implements IMultiDrop {
max = config.getInteger("max", 10); max = config.getInteger("max", 10);
} }
@SuppressWarnings("deprecation")
@Override @Override
public LootBag get(DropMetadata metadata) { public AbstractItemStack getDrop(DropMetadata dropMetadata, double v) {
LootBag loot = new LootBag(metadata);
NBTItem nbt = NBTItem.get(new SimpleItemBuilder("MOB_GOLD_POUCH").build()); NBTItem nbt = NBTItem.get(new SimpleItemBuilder("MOB_GOLD_POUCH").build());
ItemStack[] content = new ItemStack[18]; ItemStack[] content = new ItemStack[18];
@ -52,8 +49,7 @@ public class GoldPouchDrop extends Drop implements IMultiDrop {
} }
nbt.addTag(new ItemTag("RpgPouchSize", 18), new ItemTag("RpgPouchMob", true), new ItemTag("RpgPouchInventory", MMOCoreUtils.toBase64(content))); nbt.addTag(new ItemTag("RpgPouchSize", 18), new ItemTag("RpgPouchMob", true), new ItemTag("RpgPouchInventory", MMOCoreUtils.toBase64(content)));
loot.add(new ItemDrop(this.getLine(), this.getConfig(), new BukkitItemStack(nbt.toItem()))); return new BukkitItemStack(nbt.toItem());
return loot;
} }
private ItemStack setAmount(ItemStack item, int amount) { private ItemStack setAmount(ItemStack item, int amount) {

View File

@ -4,6 +4,7 @@ import io.lumine.mythic.bukkit.events.MythicMobDeathEvent;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource; import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
@ -33,7 +34,7 @@ public class KillMythicMobExperienceSource extends SpecificExperienceSource<Stri
PlayerData data = PlayerData.get((Player) event.getKiller()); PlayerData data = PlayerData.get((Player) event.getKiller());
for (KillMythicMobExperienceSource source : getSources()) for (KillMythicMobExperienceSource source : getSources())
if (source.matches(data, event.getMobType().getInternalName())) if (source.matches(data, event.getMobType().getInternalName()))
source.giveExperience(data, 1, event.getEntity().getLocation()); source.giveExperience(data, 1, MMOCoreUtils.getCenterLocation(event.getEntity()));
}, 2); }, 2);
} }
}; };

View File

@ -5,7 +5,6 @@ import io.lumine.mythic.api.mobs.GenericCaster;
import io.lumine.mythic.api.skills.Skill; import io.lumine.mythic.api.skills.Skill;
import io.lumine.mythic.api.skills.SkillCaster; import io.lumine.mythic.api.skills.SkillCaster;
import io.lumine.mythic.api.skills.SkillMetadata; import io.lumine.mythic.api.skills.SkillMetadata;
import io.lumine.mythic.api.skills.SkillTrigger;
import io.lumine.mythic.bukkit.BukkitAdapter; import io.lumine.mythic.bukkit.BukkitAdapter;
import io.lumine.mythic.bukkit.MythicBukkit; import io.lumine.mythic.bukkit.MythicBukkit;
import io.lumine.mythic.core.skills.SkillMetadataImpl; import io.lumine.mythic.core.skills.SkillMetadataImpl;
@ -15,7 +14,6 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.quest.trigger.Trigger; import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Optional; import java.util.Optional;

View File

@ -4,9 +4,9 @@ import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.util.AltChar; import io.lumine.mythic.lib.api.util.AltChar;
import me.clip.placeholderapi.expansion.PlaceholderExpansion; import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.stats.StatType;
import net.Indyuce.mmocore.api.quest.PlayerQuests; import net.Indyuce.mmocore.api.quest.PlayerQuests;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.player.stats.StatInfo;
import net.Indyuce.mmocore.experience.PlayerProfessions; import net.Indyuce.mmocore.experience.PlayerProfessions;
import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.party.AbstractParty; import net.Indyuce.mmocore.party.AbstractParty;
@ -72,11 +72,11 @@ public class RPGPlaceholders extends PlaceholderExpansion {
} }
else if (identifier.equals("health") && player.isOnline()) { else if (identifier.equals("health") && player.isOnline()) {
return StatType.MAX_HEALTH.format(player.getPlayer().getHealth()); return StatInfo.valueOf("MAX_HEALTH").format(player.getPlayer().getHealth());
} }
else if (identifier.equals("max_health") && player.isOnline()) { else if (identifier.equals("max_health") && player.isOnline()) {
return StatType.MAX_HEALTH.format(player.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); return StatInfo.valueOf("MAX_HEALTH").format(player.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue());
} }
else if (identifier.equals("health_bar") && player.isOnline()) { else if (identifier.equals("health_bar") && player.isOnline()) {
@ -128,7 +128,7 @@ public class RPGPlaceholders extends PlaceholderExpansion {
.valueOf(playerData.getCollectionSkills().getLevel(identifier.substring(11).replace(" ", "-").replace("_", "-").toLowerCase())); .valueOf(playerData.getCollectionSkills().getLevel(identifier.substring(11).replace(" ", "-").replace("_", "-").toLowerCase()));
else if (identifier.equals("experience")) else if (identifier.equals("experience"))
return String.valueOf(playerData.getExperience()); return MythicLib.plugin.getMMOConfig().decimal.format(playerData.getExperience());
else if (identifier.equals("next_level")) else if (identifier.equals("next_level"))
return String.valueOf(playerData.getLevelUpExperience()); return String.valueOf(playerData.getLevelUpExperience());
@ -153,7 +153,7 @@ public class RPGPlaceholders extends PlaceholderExpansion {
return MythicLib.plugin.getMMOConfig().decimal.format(playerData.getMana()); return MythicLib.plugin.getMMOConfig().decimal.format(playerData.getMana());
else if (identifier.equals("mana_bar")) { else if (identifier.equals("mana_bar")) {
return playerData.getProfess().getManaDisplay().generateBar(playerData.getMana(), playerData.getStats().getStat(StatType.MAX_MANA)); return playerData.getProfess().getManaDisplay().generateBar(playerData.getMana(), playerData.getStats().getStat("MAX_MANA"));
} }
else if (identifier.startsWith("exp_multiplier_")) { else if (identifier.startsWith("exp_multiplier_")) {
@ -173,7 +173,7 @@ public class RPGPlaceholders extends PlaceholderExpansion {
else if (identifier.equals("stamina_bar")) { else if (identifier.equals("stamina_bar")) {
StringBuilder format = new StringBuilder(); StringBuilder format = new StringBuilder();
double ratio = 20 * playerData.getStamina() / playerData.getStats().getStat(StatType.MAX_STAMINA); double ratio = 20 * playerData.getStamina() / playerData.getStats().getStat("MAX_STAMINA");
for (double j = 1; j < 20; j++) for (double j = 1; j < 20; j++)
format.append(ratio >= j ? MMOCore.plugin.configManager.staminaFull format.append(ratio >= j ? MMOCore.plugin.configManager.staminaFull
: ratio >= j - .5 ? MMOCore.plugin.configManager.staminaHalf : MMOCore.plugin.configManager.staminaEmpty) : ratio >= j - .5 ? MMOCore.plugin.configManager.staminaHalf : MMOCore.plugin.configManager.staminaEmpty)
@ -182,8 +182,8 @@ public class RPGPlaceholders extends PlaceholderExpansion {
} }
else if (identifier.startsWith("stat_")) { else if (identifier.startsWith("stat_")) {
StatType type = StatType.valueOf(identifier.substring(5).toUpperCase()); StatInfo info = StatInfo.valueOf(identifier.substring(5).toUpperCase());
return type == null ? "Invalid Stat" : type.format(playerData.getStats().getStat(type)); return info.format(playerData.getStats().getStat(info.name));
} }
else if (identifier.equals("stellium")) else if (identifier.equals("stellium"))
@ -191,7 +191,7 @@ public class RPGPlaceholders extends PlaceholderExpansion {
else if (identifier.equals("stellium_bar")) { else if (identifier.equals("stellium_bar")) {
StringBuilder format = new StringBuilder(); StringBuilder format = new StringBuilder();
double ratio = 20 * playerData.getStellium() / playerData.getStats().getStat(StatType.MAX_STELLIUM); double ratio = 20 * playerData.getStellium() / playerData.getStats().getStat("MAX_STELLIUM");
for (double j = 1; j < 20; j++) for (double j = 1; j < 20; j++)
format.append(ratio >= j ? ChatColor.BLUE : ratio >= j - .5 ? ChatColor.AQUA : ChatColor.WHITE).append(AltChar.listSquare); format.append(ratio >= j ? ChatColor.BLUE : ratio >= j - .5 ? ChatColor.AQUA : ChatColor.WHITE).append(AltChar.listSquare);
return format.toString(); return format.toString();
@ -226,9 +226,9 @@ public class RPGPlaceholders extends PlaceholderExpansion {
else if (placeholder.equalsIgnoreCase("leader")) else if (placeholder.equalsIgnoreCase("leader"))
return Bukkit.getOfflinePlayer(playerData.getGuild().getOwner()).getName(); return Bukkit.getOfflinePlayer(playerData.getGuild().getOwner()).getName();
else if (placeholder.equalsIgnoreCase("members")) else if (placeholder.equalsIgnoreCase("members"))
return "" + playerData.getGuild().getMembers().count(); return String.valueOf(playerData.getGuild().countMembers());
else if (placeholder.equalsIgnoreCase("online_members")) else if (placeholder.equalsIgnoreCase("online_members"))
return "" + playerData.getGuild().getMembers().countOnline(); return String.valueOf(playerData.getGuild().countOnlineMembers());
} }
return null; return null;

View File

@ -4,13 +4,16 @@ import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.api.load.MMOLoader; import net.Indyuce.mmocore.api.load.MMOLoader;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import java.util.Arrays;
import java.util.List;
public class WorldGuardMMOLoader extends MMOLoader { public class WorldGuardMMOLoader extends MMOLoader {
@Override @Override
public Condition loadCondition(MMOLineConfig config) { public List<Condition> loadCondition(MMOLineConfig config) {
if (config.getKey().equals("region")) if (config.getKey().equals("region"))
return new RegionCondition(config); return Arrays.asList(new RegionCondition(config));
return null; return null;
} }

View File

@ -1,8 +1,8 @@
package net.Indyuce.mmocore.comp.vault; package net.Indyuce.mmocore.comp.vault;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.quest.trigger.Trigger; import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.math.formula.RandomAmount; import net.Indyuce.mmocore.api.util.math.formula.RandomAmount;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;

View File

@ -2,9 +2,9 @@ package net.Indyuce.mmocore.comp.vault;
import java.util.logging.Level; import java.util.logging.Level;
import net.Indyuce.mmocore.MMOCore;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import net.Indyuce.mmocore.MMOCore;
import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.economy.Economy;
public class VaultEconomy { public class VaultEconomy {

View File

@ -1,16 +1,19 @@
package net.Indyuce.mmocore.comp.vault; package net.Indyuce.mmocore.comp.vault;
import net.Indyuce.mmocore.api.load.MMOLoader;
import net.Indyuce.mmocore.api.quest.trigger.Trigger; import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import net.Indyuce.mmocore.api.load.MMOLoader;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import java.util.Arrays;
import java.util.List;
public class VaultMMOLoader extends MMOLoader { public class VaultMMOLoader extends MMOLoader {
@Override @Override
public Trigger loadTrigger(MMOLineConfig config) { public List<Trigger> loadTrigger(MMOLineConfig config) {
if (config.getKey().equalsIgnoreCase("money")) if (config.getKey().equalsIgnoreCase("money"))
return new MoneyTrigger(config); return Arrays.asList(new MoneyTrigger(config));
return null; return null;
} }

View File

@ -1,5 +1,7 @@
package net.Indyuce.mmocore.experience; package net.Indyuce.mmocore.experience;
import net.Indyuce.mmocore.manager.social.BoosterManager;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
@ -14,7 +16,7 @@ public class Booster {
* Length is not final because boosters can stacks. This allows to reduce * Length is not final because boosters can stacks. This allows to reduce
* the amount of boosters displayed in the main player menu * the amount of boosters displayed in the main player menu
* *
* See {@link net.Indyuce.mmocore.manager.social.BoosterManager#register(Booster)} * See {@link BoosterManager#register(Booster)}
*/ */
private long length; private long length;

View File

@ -19,7 +19,10 @@ public enum EXPSource {
/** /**
* When party members share exp * When party members share exp
*
* @deprecated Not used anymore
*/ */
@Deprecated
PARTY_SHARING, PARTY_SHARING,
/** /**

View File

@ -1,16 +1,20 @@
package net.Indyuce.mmocore.experience; package net.Indyuce.mmocore.experience;
import net.Indyuce.mmocore.experience.droptable.ExperienceTable; import net.Indyuce.mmocore.experience.droptable.ExperienceTable;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* Either a profession or a class * General implementation for professions, classes and attributes.
* <p>
* An experience object is a type of object that can level up.
* It has an experience curve and table and can receive EXP
* *
* @author jules * @author jules
*/ */
public interface ExperienceObject { public interface ExperienceObject extends ExperienceDispenser {
String getKey(); String getKey();

View File

@ -4,15 +4,16 @@ import com.google.gson.Gson;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.UtilityMethods;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.ConfigMessage;
import net.Indyuce.mmocore.api.SoundEvent; import net.Indyuce.mmocore.api.SoundEvent;
import net.Indyuce.mmocore.api.event.PlayerExperienceGainEvent; import net.Indyuce.mmocore.api.event.PlayerExperienceGainEvent;
import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.stats.StatType;
import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.loot.chest.particle.SmallParticleEffect; import net.Indyuce.mmocore.loot.chest.particle.SmallParticleEffect;
import net.Indyuce.mmocore.party.AbstractParty;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -22,6 +23,7 @@ import org.bukkit.configuration.ConfigurationSection;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
@ -147,39 +149,49 @@ public class PlayerProfessions {
giveExperience(profession, total, source); giveExperience(profession, total, source);
} }
public void giveExperience(Profession profession, double value, EXPSource source) {
giveExperience(profession, value, source, null);
}
public boolean hasReachedMaxLevel(Profession profession) { public boolean hasReachedMaxLevel(Profession profession) {
return profession.hasMaxLevel() && getLevel(profession) >= profession.getMaxLevel(); return profession.hasMaxLevel() && getLevel(profession) >= profession.getMaxLevel();
} }
public void giveExperience(Profession profession, double value, EXPSource source, @Nullable Location hologramLocation) { public void giveExperience(Profession profession, double value, EXPSource source) {
giveExperience(profession, value, source, null, true);
}
public void giveExperience(Profession profession, double value, EXPSource source, @Nullable Location hologramLocation, boolean splitExp) {
Validate.isTrue(playerData.isOnline(), "Cannot give experience to offline player"); Validate.isTrue(playerData.isOnline(), "Cannot give experience to offline player");
if (value <= 0)
return;
if (hasReachedMaxLevel(profession)) { if (hasReachedMaxLevel(profession)) {
setExperience(profession, 0); setExperience(profession, 0);
return; return;
} }
value = MMOCore.plugin.boosterManager.calculateExp(profession, value); // Splitting exp through party members
AbstractParty party;
if (splitExp && (party = playerData.getParty()) != null && MMOCore.plugin.configManager.splitProfessionExp) {
List<PlayerData> onlineMembers = party.getOnlineMembers();
value /= onlineMembers.size();
for (PlayerData member : onlineMembers)
if (!member.equals(playerData))
member.getCollectionSkills().giveExperience(profession, value, source, null, false);
}
// Adds functionality for additional experience per profession. // Apply buffs AFTER splitting exp
value *= 1 + playerData.getStats().getInstance(StatType.ADDITIONAL_EXPERIENCE, profession).getTotal() / 100; value *= (1 + playerData.getStats().getStat("ADDITIONAL_EXPERIENCE_" + UtilityMethods.enumName(profession.getId())) / 100) * MMOCore.plugin.boosterManager.getMultiplier(profession);
// Display hologram
if (hologramLocation != null)
MMOCoreUtils.displayIndicator(hologramLocation.add(.5, 1.5, .5), MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", "" + value).message());
PlayerExperienceGainEvent event = new PlayerExperienceGainEvent(playerData, profession, value, source); PlayerExperienceGainEvent event = new PlayerExperienceGainEvent(playerData, profession, value, source);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) if (event.isCancelled())
return; return;
// Display hologram
if (hologramLocation != null)
MMOCoreUtils.displayIndicator(hologramLocation.add(.5, 1.5, .5), MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", MythicLib.plugin.getMMOConfig().decimal.format(event.getExperience())).message());
exp.put(profession.getId(), Math.max(0, exp.getOrDefault(profession.getId(), 0.) + event.getExperience())); exp.put(profession.getId(), Math.max(0, exp.getOrDefault(profession.getId(), 0.) + event.getExperience()));
int level, oldLevel = getLevel(profession); int level, oldLevel = getLevel(profession);
double needed,exp; double needed, exp;
/* /*
* Loop for exp overload when leveling up, will continue * Loop for exp overload when leveling up, will continue
@ -197,6 +209,11 @@ public class PlayerProfessions {
this.level.put(profession.getId(), level + 1); this.level.put(profession.getId(), level + 1);
check = true; check = true;
playerData.giveExperience(profession.getExperience().calculate(level), null); playerData.giveExperience(profession.getExperience().calculate(level), null);
// Apply profession experience table
if (profession.hasExperienceTable())
profession.getExperienceTable().claim(playerData, level, profession);
} }
if (check) { if (check) {
@ -206,10 +223,6 @@ public class PlayerProfessions {
.send(playerData.getPlayer()); .send(playerData.getPlayer());
MMOCore.plugin.soundManager.getSound(SoundEvent.LEVEL_UP).playTo(playerData.getPlayer()); MMOCore.plugin.soundManager.getSound(SoundEvent.LEVEL_UP).playTo(playerData.getPlayer());
playerData.getStats().updateStats(); playerData.getStats().updateStats();
// Apply profession experience table
if (profession.hasExperienceTable())
profession.getExperienceTable().claim(playerData, level, profession);
} }
StringBuilder bar = new StringBuilder("" + ChatColor.BOLD); StringBuilder bar = new StringBuilder("" + ChatColor.BOLD);

View File

@ -3,16 +3,19 @@ package net.Indyuce.mmocore.experience;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.api.util.PostLoadObject; import io.lumine.mythic.lib.api.util.PostLoadObject;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.math.formula.LinearValue; import net.Indyuce.mmocore.api.util.math.formula.LinearValue;
import net.Indyuce.mmocore.experience.droptable.ExperienceTable; import net.Indyuce.mmocore.experience.droptable.ExperienceTable;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser; import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.experience.dispenser.ProfessionExperienceDispenser;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.logging.Level; import java.util.logging.Level;
@ -63,17 +66,18 @@ public class Profession extends PostLoadObject implements ExperienceObject {
maxLevel = config.getInt("max-level"); maxLevel = config.getInt("max-level");
if (config.contains("exp-sources")) { if (config.contains("exp-sources"))
ExperienceDispenser dispenser = new ProfessionExperienceDispenser(this);
for (String key : config.getStringList("exp-sources")) for (String key : config.getStringList("exp-sources"))
try { try {
MMOCore.plugin.experience.registerSource(MMOCore.plugin.loadManager.loadExperienceSource(new MMOLineConfig(key), dispenser)); List<ExperienceSource<?>> experienceSourceList=MMOCore.plugin.loadManager.loadExperienceSource(new MMOLineConfig(key), this);
for(ExperienceSource experienceSource: experienceSourceList) {
MMOCore.plugin.experience.registerSource(experienceSource);
}
} catch (IllegalArgumentException exception) { } catch (IllegalArgumentException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING, MMOCore.plugin.getLogger().log(Level.WARNING,
"Could not register exp source '" + key + "' from profession '" + id + "': " + exception.getMessage()); "Could not register exp source '" + key + "' from profession '" + id + "': " + exception.getMessage());
} }
} }
}
@Override @Override
protected void whenPostLoaded(ConfigurationSection configurationSection) { protected void whenPostLoaded(ConfigurationSection configurationSection) {
@ -124,6 +128,18 @@ public class Profession extends PostLoadObject implements ExperienceObject {
return Objects.requireNonNull(expTable, "Profession has no exp table"); return Objects.requireNonNull(expTable, "Profession has no exp table");
} }
@Override
public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) {
hologramLocation = !getOption(Profession.ProfessionOption.EXP_HOLOGRAMS) ? null
: hologramLocation;
playerData.getCollectionSkills().giveExperience(this, experience, EXPSource.SOURCE, hologramLocation, true);
}
@Override
public boolean shouldHandle(PlayerData playerData) {
return true;
}
public static enum ProfessionOption { public static enum ProfessionOption {
/** /**

View File

@ -1,12 +1,12 @@
package net.Indyuce.mmocore.experience.dispenser; package net.Indyuce.mmocore.experience;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.EXPSource; import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import org.bukkit.Location; import org.bukkit.Location;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public class SimpleExperienceDispenser implements ExperienceDispenser { public class SimpleExperienceObject implements ExperienceDispenser {
@Override @Override
public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) { public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) {

View File

@ -1,28 +0,0 @@
package net.Indyuce.mmocore.experience.dispenser;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
import net.Indyuce.mmocore.experience.EXPSource;
import org.bukkit.Location;
import org.jetbrains.annotations.Nullable;
public class ClassExperienceDispenser implements ExperienceDispenser {
private final PlayerClass profess;
public ClassExperienceDispenser(PlayerClass profess) {
this.profess = profess;
}
@Override
public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) {
hologramLocation = !MMOCore.plugin.getConfig().getBoolean("display-main-class-exp-holograms") ? null
: hologramLocation;
playerData.giveExperience(experience, source, hologramLocation, true);
}
@Override
public boolean shouldHandle(PlayerData playerData) {
return playerData.getProfess().equals(profess);
}
}

View File

@ -1,8 +1,9 @@
package net.Indyuce.mmocore.experience.dispenser; package net.Indyuce.mmocore.experience.dispenser;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.experience.EXPSource; import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.ExperienceObject;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.bukkit.Location; import org.bukkit.Location;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -11,16 +12,17 @@ import org.jetbrains.annotations.Nullable;
* Used to differenciate between the main class experience and * Used to differenciate between the main class experience and
* experience given in a specific profession. Also being used to * experience given in a specific profession. Also being used to
* monitor EXP holograms. * monitor EXP holograms.
*
* @deprecated Merged with {@link ExperienceObject}
*/ */
@Deprecated
public interface ExperienceDispenser { public interface ExperienceDispenser {
/** /**
* Called when experience is gained in main class/profession * Called when experience is gained in main class/profession
* *
* @param playerData Player gaining the experience * @param playerData Player gaining the experience
* @param experience Experience gained. Note that it is a double * @param experience Experience gained
* because it gets converted to an integer at
* the very last moment in MMOCore
* @param hologramLocation Location of displayed hologram. When set to null * @param hologramLocation Location of displayed hologram. When set to null
* and if exp holograms are enabled it will take the * and if exp holograms are enabled it will take the
* player's location instead. * player's location instead.

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