forked from Upstream/mmocore
Fixed skill buffs temporarily not working on login
This commit is contained in:
parent
93317c3e39
commit
da0e16f1b3
@ -195,8 +195,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
|
|||||||
public void applyTemporaryTriggers() {
|
public void applyTemporaryTriggers() {
|
||||||
|
|
||||||
// Remove all stats and buffs associated to triggers
|
// Remove all stats and buffs associated to triggers
|
||||||
getMMOPlayerData().getStatMap().getInstances().forEach(statInstance -> statInstance.removeIf(Trigger.STAT_MODIFIER_KEY::equals));
|
resetTriggerStats();
|
||||||
getMMOPlayerData().getSkillModifierMap().getInstances().forEach(skillModifierInstance -> skillModifierInstance.removeIf(Trigger.STAT_MODIFIER_KEY::equals));
|
|
||||||
|
|
||||||
// Experience tables from main class
|
// Experience tables from main class
|
||||||
if (getProfess().hasExperienceTable())
|
if (getProfess().hasExperienceTable())
|
||||||
@ -252,15 +251,6 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearSkillTreePoints() {
|
|
||||||
skillTreePoints.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clearNodeTimesClaimed() {
|
|
||||||
final Iterator<String> ite = tableItemClaims.keySet().iterator();
|
|
||||||
while (ite.hasNext()) if (ite.next().startsWith(SkillTreeNode.KEY_PREFIX)) ite.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<Map.Entry<String, Integer>> getNodeLevelsEntrySet() {
|
public Set<Map.Entry<String, Integer>> getNodeLevelsEntrySet() {
|
||||||
HashMap<String, Integer> nodeLevelsString = new HashMap<>();
|
HashMap<String, Integer> nodeLevelsString = new HashMap<>();
|
||||||
for (SkillTreeNode node : nodeLevels.keySet())
|
for (SkillTreeNode node : nodeLevels.keySet())
|
||||||
@ -269,13 +259,8 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void resetTriggerStats() {
|
public void resetTriggerStats() {
|
||||||
for (StatInstance instance : getMMOPlayerData().getStatMap().getInstances()) {
|
getMMOPlayerData().getStatMap().getInstances().forEach(statInstance -> statInstance.removeIf(Trigger.STAT_MODIFIER_KEY::equals));
|
||||||
Iterator<StatModifier> iter = instance.getModifiers().iterator();
|
getMMOPlayerData().getSkillModifierMap().removeModifiers(Trigger.STAT_MODIFIER_KEY);
|
||||||
while (iter.hasNext()) {
|
|
||||||
StatModifier modifier = iter.next();
|
|
||||||
if (modifier.getKey().startsWith(StatTrigger.STAT_MODIFIER_KEY)) iter.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -285,9 +270,19 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
|
|||||||
return mapped;
|
return mapped;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearNodeLevels() {
|
public void clearSkillTrees() {
|
||||||
|
|
||||||
|
// Node levels, states and points spent
|
||||||
nodeLevels.clear();
|
nodeLevels.clear();
|
||||||
|
nodeStates.clear();
|
||||||
pointSpent.clear();
|
pointSpent.clear();
|
||||||
|
|
||||||
|
// Skill tree points
|
||||||
|
skillTreePoints.clear();
|
||||||
|
|
||||||
|
// Clear node claim count
|
||||||
|
final Iterator<String> ite = tableItemClaims.keySet().iterator();
|
||||||
|
while (ite.hasNext()) if (ite.next().startsWith(SkillTreeNode.KEY_PREFIX)) ite.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canIncrementNodeLevel(SkillTreeNode node) {
|
public boolean canIncrementNodeLevel(SkillTreeNode node) {
|
||||||
@ -365,10 +360,6 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
|
|||||||
return new HashMap<>(nodeStates);
|
return new HashMap<>(nodeStates);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearNodeStates() {
|
|
||||||
nodeStates.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Integer> getNodeTimesClaimed() {
|
public Map<String, Integer> getNodeTimesClaimed() {
|
||||||
Map<String, Integer> result = new HashMap<>();
|
Map<String, Integer> result = new HashMap<>();
|
||||||
|
@ -307,10 +307,7 @@ public class SavedClassInformation implements ClassDataContainer {
|
|||||||
player.mapSkillLevels().forEach((skill, level) -> player.resetSkillLevel(skill));
|
player.mapSkillLevels().forEach((skill, level) -> player.resetSkillLevel(skill));
|
||||||
for (PlayerAttribute attribute : MMOCore.plugin.attributeManager.getAll())
|
for (PlayerAttribute attribute : MMOCore.plugin.attributeManager.getAll())
|
||||||
player.getAttributes().getInstance(attribute).setBase(0);
|
player.getAttributes().getInstance(attribute).setBase(0);
|
||||||
player.clearSkillTreePoints();
|
player.clearSkillTrees();
|
||||||
player.clearNodeLevels();
|
|
||||||
player.clearNodeStates();
|
|
||||||
player.clearNodeTimesClaimed();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reads this class info, applies it to the player. set class after
|
* Reads this class info, applies it to the player. set class after
|
||||||
|
@ -10,13 +10,15 @@ import net.Indyuce.mmocore.api.player.PlayerData;
|
|||||||
import net.Indyuce.mmocore.api.quest.trigger.api.Removable;
|
import net.Indyuce.mmocore.api.quest.trigger.api.Removable;
|
||||||
import net.Indyuce.mmocore.api.quest.trigger.api.Temporary;
|
import net.Indyuce.mmocore.api.quest.trigger.api.Temporary;
|
||||||
import net.Indyuce.mmocore.skill.RegisteredSkill;
|
import net.Indyuce.mmocore.skill.RegisteredSkill;
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class SkillModifierTrigger extends Trigger implements Removable, Temporary {
|
public class SkillModifierTrigger extends Trigger implements Removable, Temporary {
|
||||||
private final SkillModifier mod;
|
private SkillModifier mod;
|
||||||
private final double amount;
|
private boolean mutable = true;
|
||||||
|
|
||||||
public SkillModifierTrigger(MMOLineConfig config) {
|
public SkillModifierTrigger(MMOLineConfig config) {
|
||||||
super(config);
|
super(config);
|
||||||
@ -24,16 +26,18 @@ public class SkillModifierTrigger extends Trigger implements Removable, Temporar
|
|||||||
config.validateKeys("modifier");
|
config.validateKeys("modifier");
|
||||||
config.validateKeys("amount");
|
config.validateKeys("amount");
|
||||||
|
|
||||||
amount = config.getDouble("amount");
|
final double amount = config.getDouble("amount");
|
||||||
final String skillModifier = config.getString("modifier");
|
final String parameter = config.getString("modifier");
|
||||||
final String formula = config.getString("formula", "true");
|
final String formula = config.getString("formula", "true");
|
||||||
final ModifierType type = config.contains("type") ? ModifierType.valueOf(UtilityMethods.enumName(config.getString("type"))) : ModifierType.FLAT;
|
final ModifierType type = config.contains("type") ? ModifierType.valueOf(UtilityMethods.enumName(config.getString("type"))) : ModifierType.FLAT;
|
||||||
List<SkillHandler<?>> targetSkills = new ArrayList<>();
|
final List<SkillHandler<?>> targetSkills = MMOCore.plugin.skillManager.getAll().stream().filter(skill -> skill.matchesFormula(formula)).map(RegisteredSkill::getHandler).collect(Collectors.toList());
|
||||||
for (RegisteredSkill skill : MMOCore.plugin.skillManager.getAll())
|
|
||||||
if (skill.matchesFormula(formula))
|
|
||||||
targetSkills.add(skill.getHandler());
|
|
||||||
|
|
||||||
mod = new SkillModifier(Trigger.STAT_MODIFIER_KEY, skillModifier, targetSkills, amount, type);
|
mod = new SkillModifier(Trigger.STAT_MODIFIER_KEY, parameter, targetSkills, amount, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateKey(@NotNull String key) {
|
||||||
|
Validate.isTrue(mutable, "No longer mutable");
|
||||||
|
this.mod = new SkillModifier(key, mod.getParameter(), mod.getSkills(), mod.getValue(), mod.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<SkillHandler<?>> getTargetSkills() {
|
public List<SkillHandler<?>> getTargetSkills() {
|
||||||
@ -55,6 +59,7 @@ public class SkillModifierTrigger extends Trigger implements Removable, Temporar
|
|||||||
* to a dynamically chosen skill handler.
|
* to a dynamically chosen skill handler.
|
||||||
*/
|
*/
|
||||||
public void apply(PlayerData playerData, SkillHandler<?> skill) {
|
public void apply(PlayerData playerData, SkillHandler<?> skill) {
|
||||||
|
mutable = false;
|
||||||
mod.register(playerData.getMMOPlayerData(), skill);
|
mod.register(playerData.getMMOPlayerData(), skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ package net.Indyuce.mmocore.api.util;
|
|||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
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 io.lumine.mythic.lib.hologram.Hologram;
|
import io.lumine.mythic.lib.hologram.Hologram;
|
||||||
import io.lumine.mythic.lib.version.VersionMaterial;
|
import io.lumine.mythic.lib.version.VersionMaterial;
|
||||||
import net.Indyuce.mmocore.MMOCore;
|
import net.Indyuce.mmocore.MMOCore;
|
||||||
@ -48,7 +49,7 @@ public class MMOCoreUtils {
|
|||||||
|
|
||||||
public static String displayName(ItemStack item) {
|
public static String displayName(ItemStack item) {
|
||||||
return item.hasItemMeta() && item.getItemMeta().hasDisplayName() ? item.getItemMeta().getDisplayName()
|
return item.hasItemMeta() && item.getItemMeta().hasDisplayName() ? item.getItemMeta().getDisplayName()
|
||||||
: caseOnWords(item.getType().name().replace("_", " "));
|
: UtilityMethods.caseOnWords(item.getType().name().replace("_", " "));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -61,6 +62,7 @@ public class MMOCoreUtils {
|
|||||||
return current == 0 ? maxStat : Math.max(0, Math.min(current, maxStat));
|
return current == 0 ? maxStat : Math.max(0, Math.min(current, maxStat));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public static String caseOnWords(String s) {
|
public static String caseOnWords(String s) {
|
||||||
StringBuilder builder = new StringBuilder(s);
|
StringBuilder builder = new StringBuilder(s);
|
||||||
boolean isLastSpace = true;
|
boolean isLastSpace = true;
|
||||||
@ -312,4 +314,11 @@ public class MMOCoreUtils {
|
|||||||
public static Location getCenterLocation(Entity entity) {
|
public static Location getCenterLocation(Entity entity) {
|
||||||
return entity.getBoundingBox().getCenter().toLocation(entity.getWorld());
|
return entity.getBoundingBox().getCenter().toLocation(entity.getWorld());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void debug(String message) {
|
||||||
|
message = ChatColor.YELLOW + "Debug> " + ChatColor.WHITE + message;
|
||||||
|
for (Player player : Bukkit.getOnlinePlayers())
|
||||||
|
player.sendMessage(message);
|
||||||
|
Bukkit.getConsoleSender().sendMessage(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package net.Indyuce.mmocore.manager;
|
package net.Indyuce.mmocore.manager;
|
||||||
|
|
||||||
import io.lumine.mythic.lib.MythicLib;
|
import io.lumine.mythic.lib.MythicLib;
|
||||||
|
import io.lumine.mythic.lib.UtilityMethods;
|
||||||
import io.lumine.mythic.lib.skill.handler.SkillHandler;
|
import io.lumine.mythic.lib.skill.handler.SkillHandler;
|
||||||
import net.Indyuce.mmocore.MMOCore;
|
import net.Indyuce.mmocore.MMOCore;
|
||||||
import net.Indyuce.mmocore.api.ConfigFile;
|
import net.Indyuce.mmocore.api.ConfigFile;
|
||||||
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
|
|
||||||
import net.Indyuce.mmocore.skill.RegisteredSkill;
|
import net.Indyuce.mmocore.skill.RegisteredSkill;
|
||||||
import net.Indyuce.mmocore.skill.list.Ambers;
|
import net.Indyuce.mmocore.skill.list.Ambers;
|
||||||
import net.Indyuce.mmocore.skill.list.Neptune_Gift;
|
import net.Indyuce.mmocore.skill.list.Neptune_Gift;
|
||||||
@ -71,7 +71,7 @@ public class SkillManager implements MMOCoreManager {
|
|||||||
// Check if config file exists
|
// Check if config file exists
|
||||||
ConfigFile config = new ConfigFile("/skills", handler.getLowerCaseId());
|
ConfigFile config = new ConfigFile("/skills", handler.getLowerCaseId());
|
||||||
if (!config.exists()) {
|
if (!config.exists()) {
|
||||||
config.getConfig().set("name", MMOCoreUtils.caseOnWords(handler.getId().replace("_", " ").replace("-", " ").toLowerCase()));
|
config.getConfig().set("name", UtilityMethods.caseOnWords(handler.getId().replace("_", " ").replace("-", " ").toLowerCase()));
|
||||||
config.getConfig().set("lore", Arrays.asList("This is the default skill description", "", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"));
|
config.getConfig().set("lore", Arrays.asList("This is the default skill description", "", "&e{cooldown}s Cooldown", "&9Costs {mana} {mana_name}"));
|
||||||
config.getConfig().set("material", "BOOK");
|
config.getConfig().set("material", "BOOK");
|
||||||
for (Object param : handler.getParameters()) {
|
for (Object param : handler.getParameters()) {
|
||||||
|
@ -95,7 +95,7 @@ public class ClassSkill implements CooldownObject, Unlockable {
|
|||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public boolean needsBound() {
|
public boolean needsBound() {
|
||||||
return !isPermanent();
|
return getSkill().getTrigger().isPassive() && !isPermanent();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -171,13 +171,11 @@ public class ClassSkill implements CooldownObject, Unlockable {
|
|||||||
// Calculate placeholders
|
// Calculate placeholders
|
||||||
Placeholders placeholders = new Placeholders();
|
Placeholders placeholders = new Placeholders();
|
||||||
parameters.keySet()
|
parameters.keySet()
|
||||||
.forEach(param -> {
|
.forEach(param -> placeholders.register(param, skill.getDecimalFormat(param).format(data
|
||||||
placeholders.register(param, skill.getDecimalFormat(param).format(data
|
.getMMOPlayerData()
|
||||||
.getMMOPlayerData()
|
.getSkillModifierMap()
|
||||||
.getSkillModifierMap()
|
.calculateValue(skill.getHandler(), parameters.get(param).calculate(x), param)))
|
||||||
.getInstance(skill.getHandler(), param)
|
);
|
||||||
.getTotal(parameters.get(param).calculate(x))));
|
|
||||||
});
|
|
||||||
placeholders.register("mana_name", data.getProfess().getManaDisplay().getName());
|
placeholders.register("mana_name", data.getProfess().getManaDisplay().getName());
|
||||||
placeholders.register("mana_color", data.getProfess().getManaDisplay().getFull().toString());
|
placeholders.register("mana_color", data.getProfess().getManaDisplay().getFull().toString());
|
||||||
|
|
||||||
|
@ -15,8 +15,8 @@ public class BoundSkillInfo implements Closeable {
|
|||||||
private final ClassSkill classSkill;
|
private final ClassSkill classSkill;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PASSIVE skills must be registered inside of MythicLib when
|
* PASSIVE skills must be registered inside MythicLib when
|
||||||
* when bound. When set to null, the skill is not registered.
|
* bound. When set to null, the skill is not registered.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
private final PassiveSkill registered;
|
private final PassiveSkill registered;
|
||||||
|
@ -3,15 +3,18 @@ package net.Indyuce.mmocore.skill.binding;
|
|||||||
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.quest.trigger.Trigger;
|
||||||
import net.Indyuce.mmocore.player.Unlockable;
|
import net.Indyuce.mmocore.player.Unlockable;
|
||||||
import net.Indyuce.mmocore.api.quest.trigger.SkillModifierTrigger;
|
import net.Indyuce.mmocore.api.quest.trigger.SkillModifierTrigger;
|
||||||
import net.Indyuce.mmocore.skill.ClassSkill;
|
import net.Indyuce.mmocore.skill.ClassSkill;
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public class SkillSlot implements Unlockable {
|
public class SkillSlot implements Unlockable {
|
||||||
private final int slot, modelData;
|
private final int slot, modelData;
|
||||||
@ -37,6 +40,8 @@ public class SkillSlot implements Unlockable {
|
|||||||
this.skillModifierTriggers.addAll(skillModifierTriggers);
|
this.skillModifierTriggers.addAll(skillModifierTriggers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final String SKILL_MODIFIER_TRIGGER_KEY = "mmocoreSkillSlot";
|
||||||
|
|
||||||
public SkillSlot(ConfigurationSection section) {
|
public SkillSlot(ConfigurationSection section) {
|
||||||
this.slot = Integer.parseInt(section.getName());
|
this.slot = Integer.parseInt(section.getName());
|
||||||
this.formula = section.contains("formula") ? section.getString("formula") : "true";
|
this.formula = section.contains("formula") ? section.getString("formula") : "true";
|
||||||
@ -46,10 +51,19 @@ public class SkillSlot implements Unlockable {
|
|||||||
this.modelData = section.getInt("model-data", 0);
|
this.modelData = section.getInt("model-data", 0);
|
||||||
this.isUnlockedByDefault = section.getBoolean("unlocked-by-default", true);
|
this.isUnlockedByDefault = section.getBoolean("unlocked-by-default", true);
|
||||||
this.canManuallyBind = section.getBoolean("can-manually-bind", true);
|
this.canManuallyBind = section.getBoolean("can-manually-bind", true);
|
||||||
if (section.contains("skill-buffs"))
|
|
||||||
for (String skillBuff : section.getStringList("skill-buffs"))
|
// Load skill buffs
|
||||||
if (skillBuff.startsWith("skill_buff"))
|
if (section.contains("skill-buffs")) for (String skillBuff : section.getStringList("skill-buffs"))
|
||||||
skillModifierTriggers.add((SkillModifierTrigger) MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(skillBuff)));
|
try {
|
||||||
|
Validate.isTrue(skillBuff.startsWith("skill_buff"), "Must be a skill_buff trigger");
|
||||||
|
final Trigger trigger = MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(skillBuff));
|
||||||
|
Validate.isTrue(trigger instanceof SkillModifierTrigger, "Not a skill_buff trigger");
|
||||||
|
final SkillModifierTrigger mod = (SkillModifierTrigger) trigger;
|
||||||
|
mod.updateKey(SKILL_MODIFIER_TRIGGER_KEY); // Fixes MMOCore issue #967
|
||||||
|
skillModifierTriggers.add(mod);
|
||||||
|
} catch (RuntimeException exception) {
|
||||||
|
MMOCore.plugin.getLogger().log(Level.WARNING, "Could not load skill buff '" + skillBuff + "' from skill slot '" + name + "': " + exception.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getSlot() {
|
public int getSlot() {
|
||||||
|
Loading…
Reference in New Issue
Block a user