forked from Upstream/mmocore
Passive Skill Bounding System (data saving, GUI modification, Passive Skill Map modification when binding/unbinding)
This commit is contained in:
parent
ce292019d6
commit
9abe1fd929
@ -3,6 +3,7 @@ package net.Indyuce.mmocore.api.player;
|
|||||||
import io.lumine.mythic.lib.MythicLib;
|
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.cooldown.CooldownMap;
|
import io.lumine.mythic.lib.player.cooldown.CooldownMap;
|
||||||
|
import io.lumine.mythic.lib.player.skill.PassiveSkill;
|
||||||
import net.Indyuce.mmocore.party.provided.Party;
|
import net.Indyuce.mmocore.party.provided.Party;
|
||||||
import net.Indyuce.mmocore.MMOCore;
|
import net.Indyuce.mmocore.MMOCore;
|
||||||
import net.Indyuce.mmocore.api.ConfigMessage;
|
import net.Indyuce.mmocore.api.ConfigMessage;
|
||||||
@ -79,14 +80,13 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
|
|||||||
private Guild guild;
|
private Guild guild;
|
||||||
private SkillCastingHandler skillCasting;
|
private SkillCastingHandler skillCasting;
|
||||||
private SkillTree cachedSkillTree;
|
private SkillTree cachedSkillTree;
|
||||||
|
|
||||||
private final PlayerQuests questData;
|
private final PlayerQuests questData;
|
||||||
private final PlayerStats playerStats;
|
private final PlayerStats playerStats;
|
||||||
private final List<UUID> friends = new ArrayList<>();
|
private final List<UUID> friends = new ArrayList<>();
|
||||||
private final Set<String> waypoints = new HashSet<>();
|
private final Set<String> waypoints = new HashSet<>();
|
||||||
private final Map<String, Integer> skills = new HashMap<>();
|
private final Map<String, Integer> skills = new HashMap<>();
|
||||||
private final List<ClassSkill> boundSkills = new ArrayList<>();
|
private final List<ClassSkill> boundSkills = new ArrayList<>();
|
||||||
private final List<ClassSkill> boundPassiveSkills = new ArrayList<>();
|
private final List<PassiveSkill> boundPassiveSkills = new ArrayList<>();
|
||||||
private final PlayerProfessions collectSkills = new PlayerProfessions(this);
|
private final PlayerProfessions collectSkills = new PlayerProfessions(this);
|
||||||
private final PlayerAttributes attributes = new PlayerAttributes(this);
|
private final PlayerAttributes attributes = new PlayerAttributes(this);
|
||||||
private final Map<String, SavedClassInformation> classSlots = new HashMap<>();
|
private final Map<String, SavedClassInformation> classSlots = new HashMap<>();
|
||||||
@ -1050,35 +1050,36 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
|
|||||||
return slot >= boundSkills.size() ? null : boundSkills.get(slot);
|
return slot >= boundSkills.size() ? null : boundSkills.get(slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBoundPassiveSkill(int slot, ClassSkill skill) {
|
public void setBoundPassiveSkill(int slot, PassiveSkill skill) {
|
||||||
Validate.notNull(skill, "Skill cannot be null");
|
Validate.notNull(skill, "Skill cannot be null");
|
||||||
if (boundPassiveSkills.size() < getProfess().getMaxBoundSkills())
|
if (boundPassiveSkills.size() < getProfess().getMaxBoundActiveSkills())
|
||||||
boundPassiveSkills.add(skill);
|
boundPassiveSkills.add(skill);
|
||||||
else
|
else
|
||||||
boundPassiveSkills.set(slot, skill);
|
boundPassiveSkills.set(slot, skill);
|
||||||
boundPassiveSkills.get(slot).toPassive(this).register(getMMOPlayerData());
|
boundPassiveSkills.get(slot).register(getMMOPlayerData());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasPassiveSkillBound(int slot) {
|
public boolean hasPassiveSkillBound(int slot) {
|
||||||
return slot < boundPassiveSkills.size();
|
return slot < boundPassiveSkills.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClassSkill getBoundPassiveSkill(int slot) {
|
public PassiveSkill getBoundPassiveSkill(int slot) {
|
||||||
return slot >= boundPassiveSkills.size() ? null : boundPassiveSkills.get(slot);
|
return slot >= boundPassiveSkills.size() ? null : boundPassiveSkills.get(slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addPassiveBoundSkill(ClassSkill skill) {
|
public void addPassiveBoundSkill(PassiveSkill skill) {
|
||||||
boundPassiveSkills.add(skill);
|
boundPassiveSkills.add(skill);
|
||||||
skill.toPassive(this).register(getMMOPlayerData());
|
skill.register(getMMOPlayerData());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBoundSkill(int slot, ClassSkill skill) {
|
public void setBoundSkill(int slot, ClassSkill skill) {
|
||||||
|
|
||||||
Validate.notNull(skill, "Skill cannot be null");
|
Validate.notNull(skill, "Skill cannot be null");
|
||||||
if (boundSkills.size() < getProfess().getMaxBoundSkills())
|
if (boundSkills.size() < getProfess().getMaxBoundActiveSkills())
|
||||||
boundSkills.add(skill);
|
boundSkills.add(skill);
|
||||||
else
|
else
|
||||||
boundSkills.set(slot, skill);
|
boundSkills.set(slot, skill);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unbindSkill(int slot) {
|
public void unbindSkill(int slot) {
|
||||||
@ -1086,7 +1087,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void unbindPassiveSkill(int slot) {
|
public void unbindPassiveSkill(int slot) {
|
||||||
boundPassiveSkills.get(slot).toPassive(this).unregister(getMMOPlayerData());
|
PassiveSkill skill = boundPassiveSkills.get(slot);
|
||||||
|
skill.unregister(getMMOPlayerData());
|
||||||
boundPassiveSkills.remove(slot);
|
boundPassiveSkills.remove(slot);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1095,7 +1097,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
|
|||||||
return boundSkills;
|
return boundSkills;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ClassSkill> getBoundPassiveSkills() {
|
public List<PassiveSkill> getBoundPassiveSkills() {
|
||||||
return boundPassiveSkills;
|
return boundPassiveSkills;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private final CastingParticle castParticle;
|
private final CastingParticle castParticle;
|
||||||
|
|
||||||
private final int maxBoundSkills, maxBoundPassiveSkills;
|
private final int maxBoundActiveSkills, maxBoundPassiveSkills;
|
||||||
private final List<PassiveSkill> classScripts = new LinkedList();
|
private final List<PassiveSkill> classScripts = new LinkedList();
|
||||||
private final Map<String, 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<>();
|
||||||
@ -123,8 +123,8 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
|
|||||||
? MMOCore.plugin.experience.getCurveOrThrow(
|
? MMOCore.plugin.experience.getCurveOrThrow(
|
||||||
config.get("exp-curve").toString().toLowerCase().replace("_", "-").replace(" ", "-"))
|
config.get("exp-curve").toString().toLowerCase().replace("_", "-").replace(" ", "-"))
|
||||||
: ExpCurve.DEFAULT;
|
: ExpCurve.DEFAULT;
|
||||||
maxBoundSkills = config.getInt("max-bound-skills", 6);
|
maxBoundActiveSkills = config.getInt("max-bound-active-skills", MMOCore.plugin.configManager.maxBoundActiveSkills);
|
||||||
maxBoundPassiveSkills = config.getInt("max-bound-passive-skills", 3);
|
maxBoundPassiveSkills = config.getInt("max-bound-passive-skills", MMOCore.plugin.configManager.maxBoundPassiveSkills);
|
||||||
ExperienceTable expTable = null;
|
ExperienceTable expTable = null;
|
||||||
if (config.contains("exp-table"))
|
if (config.contains("exp-table"))
|
||||||
try {
|
try {
|
||||||
@ -259,7 +259,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
|
|||||||
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);
|
||||||
maxBoundSkills = 6;
|
maxBoundActiveSkills = 6;
|
||||||
maxBoundPassiveSkills=3;
|
maxBoundPassiveSkills=3;
|
||||||
for (PlayerResource resource : PlayerResource.values())
|
for (PlayerResource resource : PlayerResource.values())
|
||||||
resourceHandlers.put(resource, new ResourceRegeneration(resource));
|
resourceHandlers.put(resource, new ResourceRegeneration(resource));
|
||||||
@ -316,8 +316,8 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
|
|||||||
return expCurve;
|
return expCurve;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxBoundSkills() {
|
public int getMaxBoundActiveSkills() {
|
||||||
return maxBoundSkills;
|
return maxBoundActiveSkills;
|
||||||
}
|
}
|
||||||
public int getMaxBoundPassiveSkills() {
|
public int getMaxBoundPassiveSkills() {
|
||||||
return maxBoundPassiveSkills;
|
return maxBoundPassiveSkills;
|
||||||
|
@ -96,11 +96,8 @@ public class PlayerStats {
|
|||||||
*
|
*
|
||||||
* This updates the player's PASSIVE skills
|
* This updates the player's PASSIVE skills
|
||||||
*/
|
*/
|
||||||
|
|
||||||
final PassiveSkillMap skillMap = data.getMMOPlayerData().getPassiveSkillMap();
|
final PassiveSkillMap skillMap = data.getMMOPlayerData().getPassiveSkillMap();
|
||||||
skillMap.removeModifiers("MMOCorePassiveSkill");
|
|
||||||
for (ClassSkill skill : data.getProfess().getSkills())
|
|
||||||
if (skill.getSkill().getTrigger().isPassive())
|
|
||||||
skillMap.addModifier(skill.toPassive(data));
|
|
||||||
|
|
||||||
// This updates the player's class SCRIPTS
|
// This updates the player's class SCRIPTS
|
||||||
skillMap.removeModifiers("MMOCoreClassScript");
|
skillMap.removeModifiers("MMOCoreClassScript");
|
||||||
|
@ -64,7 +64,7 @@ public class SkillList extends EditableInventory {
|
|||||||
return new SlotItem(config) {
|
return new SlotItem(config) {
|
||||||
@Override
|
@Override
|
||||||
public ItemStack display(SkillViewerInventory inv, int n) {
|
public ItemStack display(SkillViewerInventory inv, int n) {
|
||||||
if (n >= inv.getPlayerData().getProfess().getMaxBoundSkills()) {
|
if (n >= inv.getPlayerData().getProfess().getMaxBoundActiveSkills()) {
|
||||||
return new ItemStack(Material.AIR);
|
return new ItemStack(Material.AIR);
|
||||||
}
|
}
|
||||||
ItemStack item = super.display(inv, n);
|
ItemStack item = super.display(inv, n);
|
||||||
@ -115,7 +115,9 @@ public class SkillList extends EditableInventory {
|
|||||||
public Placeholders getPlaceholders(SkillViewerInventory inv, int n) {
|
public Placeholders getPlaceholders(SkillViewerInventory inv, int n) {
|
||||||
Placeholders holders= super.getPlaceholders(inv, n);
|
Placeholders holders= super.getPlaceholders(inv, n);
|
||||||
String none = MythicLib.plugin.parseColors(config.getString("no-skill"));
|
String none = MythicLib.plugin.parseColors(config.getString("no-skill"));
|
||||||
RegisteredSkill skill = inv.getPlayerData().hasPassiveSkillBound(n) ? inv.getPlayerData().getBoundPassiveSkill(n).getSkill() : null;
|
RegisteredSkill skill = inv.getPlayerData().hasPassiveSkillBound(n) ?
|
||||||
|
MMOCore.plugin.skillManager.getSkill(inv.getPlayerData().getBoundPassiveSkill(n).getTriggeredSkill().getHandler().getId())
|
||||||
|
: null;
|
||||||
holders.register("skill", skill == null ? none : skill.getName());
|
holders.register("skill", skill == null ? none : skill.getName());
|
||||||
return holders;
|
return holders;
|
||||||
}
|
}
|
||||||
@ -453,7 +455,7 @@ public class SkillList extends EditableInventory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 2);
|
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 2);
|
||||||
playerData.setBoundPassiveSkill(index, selected);
|
playerData.setBoundPassiveSkill(index, selected.toPassive(playerData));
|
||||||
open();
|
open();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -27,10 +27,11 @@ public class ConfigManager {
|
|||||||
public ChatColor staminaFull, staminaHalf, staminaEmpty;
|
public ChatColor staminaFull, staminaHalf, staminaEmpty;
|
||||||
public long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown;
|
public long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown;
|
||||||
public double lootChestsChanceWeight, fishingDropsChanceWeight;
|
public double lootChestsChanceWeight, fishingDropsChanceWeight;
|
||||||
public int maxPartyLevelDifference,maxBoundSkills,waypointWarpTime;
|
public int maxPartyLevelDifference,maxBoundActiveSkills,maxBoundPassiveSkills,waypointWarpTime;
|
||||||
|
|
||||||
private final FileConfiguration messages;
|
private final FileConfiguration messages;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the instance must be created after the other managers since all it does
|
* the instance must be created after the other managers since all it does
|
||||||
* is to update them based on the config except for the classes which are
|
* is to update them based on the config except for the classes which are
|
||||||
@ -118,7 +119,8 @@ public class ConfigManager {
|
|||||||
canCreativeCast = MMOCore.plugin.getConfig().getBoolean("can-creative-cast");
|
canCreativeCast = MMOCore.plugin.getConfig().getBoolean("can-creative-cast");
|
||||||
cobbleGeneratorXP = MMOCore.plugin.getConfig().getBoolean("should-cobblestone-generators-give-exp");
|
cobbleGeneratorXP = MMOCore.plugin.getConfig().getBoolean("should-cobblestone-generators-give-exp");
|
||||||
saveDefaultClassInfo = MMOCore.plugin.getConfig().getBoolean("save-default-class-info");
|
saveDefaultClassInfo = MMOCore.plugin.getConfig().getBoolean("save-default-class-info");
|
||||||
maxBoundSkills = MMOCore.plugin.getConfig().getInt("max-bound-skills", 6);
|
maxBoundActiveSkills = MMOCore.plugin.getConfig().getInt("max-bound-active-skills", 6);
|
||||||
|
maxBoundPassiveSkills = MMOCore.plugin.getConfig().getInt("max-bound-passive-skills", 3);
|
||||||
overrideVanillaExp = MMOCore.plugin.getConfig().getBoolean("override-vanilla-exp");
|
overrideVanillaExp = MMOCore.plugin.getConfig().getBoolean("override-vanilla-exp");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager {
|
|||||||
if (data.getProfess().hasSkill(id)) {
|
if (data.getProfess().hasSkill(id)) {
|
||||||
ClassSkill skill = data.getProfess().getSkill(id);
|
ClassSkill skill = data.getProfess().getSkill(id);
|
||||||
if (skill.getSkill().getTrigger().isPassive())
|
if (skill.getSkill().getTrigger().isPassive())
|
||||||
data.addPassiveBoundSkill(skill);
|
data.addPassiveBoundSkill(skill.toPassive(data));
|
||||||
else
|
else
|
||||||
data.getBoundSkills().add(skill);
|
data.getBoundSkills().add(skill);
|
||||||
}
|
}
|
||||||
@ -200,7 +200,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager {
|
|||||||
sql.updateJSONArray("friends", data.getFriends().stream().map(UUID::toString).collect(Collectors.toList()));
|
sql.updateJSONArray("friends", data.getFriends().stream().map(UUID::toString).collect(Collectors.toList()));
|
||||||
List<String> boundSkills = new ArrayList<>();
|
List<String> boundSkills = new ArrayList<>();
|
||||||
data.getBoundSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId()));
|
data.getBoundSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId()));
|
||||||
data.getBoundPassiveSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId()));
|
data.getBoundPassiveSkills().forEach(skill -> boundSkills.add(skill.getTriggeredSkill().getHandler().getId()));
|
||||||
sql.updateJSONArray("bound_skills", boundSkills);
|
sql.updateJSONArray("bound_skills", boundSkills);
|
||||||
|
|
||||||
sql.updateJSONObject("skills", data.mapSkillLevels().entrySet());
|
sql.updateJSONObject("skills", data.mapSkillLevels().entrySet());
|
||||||
|
@ -71,7 +71,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager {
|
|||||||
if (data.getProfess().hasSkill(id)) {
|
if (data.getProfess().hasSkill(id)) {
|
||||||
ClassSkill skill = data.getProfess().getSkill(id);
|
ClassSkill skill = data.getProfess().getSkill(id);
|
||||||
if (skill.getSkill().getTrigger().isPassive())
|
if (skill.getSkill().getTrigger().isPassive())
|
||||||
data.addPassiveBoundSkill(skill);
|
data.addPassiveBoundSkill(skill.toPassive(data));
|
||||||
else
|
else
|
||||||
data.getBoundSkills().add(skill);
|
data.getBoundSkills().add(skill);
|
||||||
|
|
||||||
@ -152,7 +152,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager {
|
|||||||
|
|
||||||
List<String> boundSkills = new ArrayList<>();
|
List<String> boundSkills = new ArrayList<>();
|
||||||
data.getBoundSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId()));
|
data.getBoundSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId()));
|
||||||
data.getBoundPassiveSkills().forEach(skill -> boundSkills.add(skill.getSkill().getHandler().getId()));
|
data.getBoundPassiveSkills().forEach(skill -> boundSkills.add(skill.getTriggeredSkill().getHandler().getId()));
|
||||||
config.set("bound-skills", boundSkills);
|
config.set("bound-skills", boundSkills);
|
||||||
|
|
||||||
config.set("attribute", null);
|
config.set("attribute", null);
|
||||||
|
@ -125,6 +125,11 @@ public class ClassSkill implements CooldownObject {
|
|||||||
return new CastableSkill(this, caster.getSkillLevel(getSkill()));
|
return new CastableSkill(this, caster.getSkillLevel(getSkill()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Be careful, this method creates a new UUID each time it is called. Need to be remembered when trying to unregister passive skill
|
||||||
|
* from PassiveSkillMap.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
public PassiveSkill toPassive(PlayerData caster) {
|
public PassiveSkill toPassive(PlayerData caster) {
|
||||||
Validate.isTrue(skill.getTrigger().isPassive(), "Skill is active");
|
Validate.isTrue(skill.getTrigger().isPassive(), "Skill is active");
|
||||||
return new PassiveSkill("MMOCorePassiveSkill", toCastable(caster), EquipmentSlot.OTHER, ModifierSource.OTHER);
|
return new PassiveSkill("MMOCorePassiveSkill", toCastable(caster), EquipmentSlot.OTHER, ModifierSource.OTHER);
|
||||||
|
@ -185,6 +185,11 @@ death-exp-loss:
|
|||||||
# Percentage of current EXP you lose when dying.
|
# Percentage of current EXP you lose when dying.
|
||||||
percent: 30
|
percent: 30
|
||||||
|
|
||||||
|
#Default max bound active and passive skills.
|
||||||
|
#These value can be modified for each class in the class yml.
|
||||||
|
max-bound-active-skills: 6
|
||||||
|
max-bound-passive-skills: 3
|
||||||
|
|
||||||
# Fun extra RPG feature that switches the player's hotbar with
|
# Fun extra RPG feature that switches the player's hotbar with
|
||||||
# the 9 lower row items of his inventory. This allows the player
|
# the 9 lower row items of his inventory. This allows the player
|
||||||
# to have two different item sets or quickly have access to pots
|
# to have two different item sets or quickly have access to pots
|
||||||
|
Loading…
Reference in New Issue
Block a user