Fixed skill buffs temporarily not working on login

This commit is contained in:
Jules 2024-05-24 16:27:00 -07:00
parent 93317c3e39
commit da0e16f1b3
8 changed files with 68 additions and 54 deletions

View File

@ -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<>();

View File

@ -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

View File

@ -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);
} }

View File

@ -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);
}
} }

View File

@ -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()) {

View File

@ -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());

View File

@ -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;

View File

@ -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() {