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() {
|
||||
|
||||
// Remove all stats and buffs associated to triggers
|
||||
getMMOPlayerData().getStatMap().getInstances().forEach(statInstance -> statInstance.removeIf(Trigger.STAT_MODIFIER_KEY::equals));
|
||||
getMMOPlayerData().getSkillModifierMap().getInstances().forEach(skillModifierInstance -> skillModifierInstance.removeIf(Trigger.STAT_MODIFIER_KEY::equals));
|
||||
resetTriggerStats();
|
||||
|
||||
// Experience tables from main class
|
||||
if (getProfess().hasExperienceTable())
|
||||
@ -252,15 +251,6 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
|
||||
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() {
|
||||
HashMap<String, Integer> nodeLevelsString = new HashMap<>();
|
||||
for (SkillTreeNode node : nodeLevels.keySet())
|
||||
@ -269,13 +259,8 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
|
||||
}
|
||||
|
||||
public void resetTriggerStats() {
|
||||
for (StatInstance instance : getMMOPlayerData().getStatMap().getInstances()) {
|
||||
Iterator<StatModifier> iter = instance.getModifiers().iterator();
|
||||
while (iter.hasNext()) {
|
||||
StatModifier modifier = iter.next();
|
||||
if (modifier.getKey().startsWith(StatTrigger.STAT_MODIFIER_KEY)) iter.remove();
|
||||
}
|
||||
}
|
||||
getMMOPlayerData().getStatMap().getInstances().forEach(statInstance -> statInstance.removeIf(Trigger.STAT_MODIFIER_KEY::equals));
|
||||
getMMOPlayerData().getSkillModifierMap().removeModifiers(Trigger.STAT_MODIFIER_KEY);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -285,9 +270,19 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
|
||||
return mapped;
|
||||
}
|
||||
|
||||
public void clearNodeLevels() {
|
||||
public void clearSkillTrees() {
|
||||
|
||||
// Node levels, states and points spent
|
||||
nodeLevels.clear();
|
||||
nodeStates.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) {
|
||||
@ -365,10 +360,6 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
|
||||
return new HashMap<>(nodeStates);
|
||||
}
|
||||
|
||||
public void clearNodeStates() {
|
||||
nodeStates.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Integer> getNodeTimesClaimed() {
|
||||
Map<String, Integer> result = new HashMap<>();
|
||||
|
@ -307,10 +307,7 @@ public class SavedClassInformation implements ClassDataContainer {
|
||||
player.mapSkillLevels().forEach((skill, level) -> player.resetSkillLevel(skill));
|
||||
for (PlayerAttribute attribute : MMOCore.plugin.attributeManager.getAll())
|
||||
player.getAttributes().getInstance(attribute).setBase(0);
|
||||
player.clearSkillTreePoints();
|
||||
player.clearNodeLevels();
|
||||
player.clearNodeStates();
|
||||
player.clearNodeTimesClaimed();
|
||||
player.clearSkillTrees();
|
||||
|
||||
/*
|
||||
* 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.Temporary;
|
||||
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.stream.Collectors;
|
||||
|
||||
public class SkillModifierTrigger extends Trigger implements Removable, Temporary {
|
||||
private final SkillModifier mod;
|
||||
private final double amount;
|
||||
private SkillModifier mod;
|
||||
private boolean mutable = true;
|
||||
|
||||
public SkillModifierTrigger(MMOLineConfig config) {
|
||||
super(config);
|
||||
@ -24,16 +26,18 @@ public class SkillModifierTrigger extends Trigger implements Removable, Temporar
|
||||
config.validateKeys("modifier");
|
||||
config.validateKeys("amount");
|
||||
|
||||
amount = config.getDouble("amount");
|
||||
final String skillModifier = config.getString("modifier");
|
||||
final double amount = config.getDouble("amount");
|
||||
final String parameter = config.getString("modifier");
|
||||
final String formula = config.getString("formula", "true");
|
||||
final ModifierType type = config.contains("type") ? ModifierType.valueOf(UtilityMethods.enumName(config.getString("type"))) : ModifierType.FLAT;
|
||||
List<SkillHandler<?>> targetSkills = new ArrayList<>();
|
||||
for (RegisteredSkill skill : MMOCore.plugin.skillManager.getAll())
|
||||
if (skill.matchesFormula(formula))
|
||||
targetSkills.add(skill.getHandler());
|
||||
final List<SkillHandler<?>> targetSkills = MMOCore.plugin.skillManager.getAll().stream().filter(skill -> skill.matchesFormula(formula)).map(RegisteredSkill::getHandler).collect(Collectors.toList());
|
||||
|
||||
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() {
|
||||
@ -55,6 +59,7 @@ public class SkillModifierTrigger extends Trigger implements Removable, Temporar
|
||||
* to a dynamically chosen skill handler.
|
||||
*/
|
||||
public void apply(PlayerData playerData, SkillHandler<?> skill) {
|
||||
mutable = false;
|
||||
mod.register(playerData.getMMOPlayerData(), skill);
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,7 @@ 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.UtilityMethods;
|
||||
import io.lumine.mythic.lib.hologram.Hologram;
|
||||
import io.lumine.mythic.lib.version.VersionMaterial;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
@ -48,7 +49,7 @@ public class MMOCoreUtils {
|
||||
|
||||
public static String displayName(ItemStack item) {
|
||||
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));
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static String caseOnWords(String s) {
|
||||
StringBuilder builder = new StringBuilder(s);
|
||||
boolean isLastSpace = true;
|
||||
@ -312,4 +314,11 @@ public class MMOCoreUtils {
|
||||
public static Location getCenterLocation(Entity entity) {
|
||||
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;
|
||||
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import io.lumine.mythic.lib.UtilityMethods;
|
||||
import io.lumine.mythic.lib.skill.handler.SkillHandler;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.ConfigFile;
|
||||
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
|
||||
import net.Indyuce.mmocore.skill.RegisteredSkill;
|
||||
import net.Indyuce.mmocore.skill.list.Ambers;
|
||||
import net.Indyuce.mmocore.skill.list.Neptune_Gift;
|
||||
@ -71,7 +71,7 @@ public class SkillManager implements MMOCoreManager {
|
||||
// Check if config file exists
|
||||
ConfigFile config = new ConfigFile("/skills", handler.getLowerCaseId());
|
||||
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("material", "BOOK");
|
||||
for (Object param : handler.getParameters()) {
|
||||
|
@ -95,7 +95,7 @@ public class ClassSkill implements CooldownObject, Unlockable {
|
||||
|
||||
@Deprecated
|
||||
public boolean needsBound() {
|
||||
return !isPermanent();
|
||||
return getSkill().getTrigger().isPassive() && !isPermanent();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -171,13 +171,11 @@ public class ClassSkill implements CooldownObject, Unlockable {
|
||||
// Calculate placeholders
|
||||
Placeholders placeholders = new Placeholders();
|
||||
parameters.keySet()
|
||||
.forEach(param -> {
|
||||
placeholders.register(param, skill.getDecimalFormat(param).format(data
|
||||
.getMMOPlayerData()
|
||||
.getSkillModifierMap()
|
||||
.getInstance(skill.getHandler(), param)
|
||||
.getTotal(parameters.get(param).calculate(x))));
|
||||
});
|
||||
.forEach(param -> placeholders.register(param, skill.getDecimalFormat(param).format(data
|
||||
.getMMOPlayerData()
|
||||
.getSkillModifierMap()
|
||||
.calculateValue(skill.getHandler(), parameters.get(param).calculate(x), param)))
|
||||
);
|
||||
placeholders.register("mana_name", data.getProfess().getManaDisplay().getName());
|
||||
placeholders.register("mana_color", data.getProfess().getManaDisplay().getFull().toString());
|
||||
|
||||
|
@ -15,8 +15,8 @@ public class BoundSkillInfo implements Closeable {
|
||||
private final ClassSkill classSkill;
|
||||
|
||||
/**
|
||||
* PASSIVE skills must be registered inside of MythicLib when
|
||||
* when bound. When set to null, the skill is not registered.
|
||||
* PASSIVE skills must be registered inside MythicLib when
|
||||
* bound. When set to null, the skill is not registered.
|
||||
*/
|
||||
@Nullable
|
||||
private final PassiveSkill registered;
|
||||
|
@ -3,15 +3,18 @@ package net.Indyuce.mmocore.skill.binding;
|
||||
import io.lumine.mythic.lib.api.MMOLineConfig;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
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.api.quest.trigger.SkillModifierTrigger;
|
||||
import net.Indyuce.mmocore.skill.ClassSkill;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class SkillSlot implements Unlockable {
|
||||
private final int slot, modelData;
|
||||
@ -37,6 +40,8 @@ public class SkillSlot implements Unlockable {
|
||||
this.skillModifierTriggers.addAll(skillModifierTriggers);
|
||||
}
|
||||
|
||||
public static final String SKILL_MODIFIER_TRIGGER_KEY = "mmocoreSkillSlot";
|
||||
|
||||
public SkillSlot(ConfigurationSection section) {
|
||||
this.slot = Integer.parseInt(section.getName());
|
||||
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.isUnlockedByDefault = section.getBoolean("unlocked-by-default", true);
|
||||
this.canManuallyBind = section.getBoolean("can-manually-bind", true);
|
||||
if (section.contains("skill-buffs"))
|
||||
for (String skillBuff : section.getStringList("skill-buffs"))
|
||||
if (skillBuff.startsWith("skill_buff"))
|
||||
skillModifierTriggers.add((SkillModifierTrigger) MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(skillBuff)));
|
||||
|
||||
// Load skill buffs
|
||||
if (section.contains("skill-buffs")) for (String skillBuff : section.getStringList("skill-buffs"))
|
||||
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() {
|
||||
|
Loading…
Reference in New Issue
Block a user