More cleaning up

This commit is contained in:
Jules 2023-04-10 16:12:57 +02:00
parent b694cf8cf4
commit 9b2c972ca4
23 changed files with 640 additions and 672 deletions

View File

@ -88,6 +88,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
private int level, classPoints, skillPoints, attributePoints, attributeReallocationPoints, skillTreeReallocationPoints, skillReallocationPoints;
private double experience;
private double mana, stamina, stellium;
/**
* Health is stored in playerData because when saving the playerData we can't access the player health anymore as the payer is Offline.
*/
@ -97,6 +98,11 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
private final PlayerQuests questData;
private final PlayerStats playerStats;
private final List<UUID> friends = new ArrayList<>();
/**
* @deprecated Use {@link #hasUnlocked(Unlockable)} instead
*/
@Deprecated
private final Set<String> waypoints = new HashSet<>();
private final Map<String, Integer> skills = new HashMap<>();
private final Map<Integer, BoundSkillInfo> boundSkills = new HashMap<>();
@ -147,11 +153,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
this.mmoData = mmoData;
questData = new PlayerQuests(this);
playerStats = new PlayerStats(this);
}
/**
* Update all references after /mmocore reload so there can be garbage
* collection with old plugin objects like class or skill instances.
@ -171,18 +174,16 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
}
Iterator<Integer> ite = boundSkills.keySet().iterator();
while (ite.hasNext())
try {
int slot = ite.next();
BoundSkillInfo boundSkillInfo = new BoundSkillInfo(boundSkills.get(slot));
boundSkills.put(slot, boundSkillInfo);
} catch (Exception ignored) {
}
while (ite.hasNext()) try {
int slot = ite.next();
BoundSkillInfo boundSkillInfo = new BoundSkillInfo(boundSkills.get(slot));
boundSkills.put(slot, boundSkillInfo);
} catch (Exception ignored) {
}
for (SkillTree skillTree : getProfess().getSkillTrees())
for (SkillTreeNode node : skillTree.getNodes())
if (!nodeLevels.containsKey(node))
nodeLevels.put(node, 0);
if (!nodeLevels.containsKey(node)) nodeLevels.put(node, 0);
setupSkillTree();
}
@ -237,9 +238,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public void clearNodeTimesClaimed() {
final Iterator<String> ite = tableItemClaims.keySet().iterator();
while (ite.hasNext())
if (ite.next().startsWith(SkillTreeNode.KEY_PREFIX))
ite.remove();
while (ite.hasNext()) if (ite.next().startsWith(SkillTreeNode.KEY_PREFIX)) ite.remove();
}
public Set<Map.Entry<String, Integer>> getNodeLevelsEntrySet() {
@ -254,8 +253,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
Iterator<StatModifier> iter = instance.getModifiers().iterator();
while (iter.hasNext()) {
StatModifier modifier = iter.next();
if (modifier.getKey().startsWith(StatTrigger.TRIGGER_PREFIX))
iter.remove();
if (modifier.getKey().startsWith(StatTrigger.TRIGGER_PREFIX)) iter.remove();
}
}
}
@ -272,8 +270,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public boolean canIncrementNodeLevel(SkillTreeNode node) {
NodeStatus nodeStatus = nodeStates.get(node);
//Check the State of the node
if (nodeStatus != NodeStatus.UNLOCKED && nodeStatus != NodeStatus.UNLOCKABLE)
return false;
if (nodeStatus != NodeStatus.UNLOCKED && nodeStatus != NodeStatus.UNLOCKABLE) return false;
return getNodeLevel(node) < node.getMaxLevel() && (skillTreePoints.getOrDefault(node.getTree().getId(), 0) + skillTreePoints.getOrDefault("global", 0) >= node.getSkillTreePointsConsumed());
}
@ -284,20 +281,18 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
*/
public void incrementNodeLevel(SkillTreeNode node) {
setNodeLevel(node, getNodeLevel(node) + 1);
//Claims the nodes experience table.
// Claims the nodes experience table.
node.getExperienceTable().claim(this, getNodeLevel(node), node);
if (nodeStates.get(node) == NodeStatus.UNLOCKABLE)
setNodeState(node, NodeStatus.UNLOCKED);
if (nodeStates.get(node) == NodeStatus.UNLOCKABLE) setNodeState(node, NodeStatus.UNLOCKED);
int pointToWithdraw = node.getSkillTreePointsConsumed();
if (skillTreePoints.get(node.getTree().getId()) > 0) {
int pointWithdrawn = Math.min(pointToWithdraw, skillTreePoints.get(node.getTree().getId()));
withdrawSkillTreePoints(node.getTree().getId(), pointWithdrawn);
pointToWithdraw -= pointWithdrawn;
}
if (pointToWithdraw > 0)
withdrawSkillTreePoints("global", pointToWithdraw);
//We unload the nodeStates map (for the skill tree) and reload it completely
if (pointToWithdraw > 0) withdrawSkillTreePoints("global", pointToWithdraw);
// We unload the nodeStates map (for the skill tree) and reload it completely
for (SkillTreeNode node1 : node.getTree().getNodes())
nodeStates.remove(node1);
node.getTree().setupNodeStates(this);
@ -321,8 +316,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
DisplayInfo displayInfo = new DisplayInfo(nodeStates.get(node), node.getSize());
return skillTree.getIcon(displayInfo);
}
if (skillTree.isPath(coordinates))
return skillTree.getIcon(DisplayInfo.pathInfo);
if (skillTree.isPath(coordinates)) return skillTree.getIcon(DisplayInfo.pathInfo);
return null;
}
@ -377,8 +371,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public Map<String, Integer> getNodeTimesClaimed() {
Map<String, Integer> result = new HashMap<>();
tableItemClaims.forEach((str, val) -> {
if (str.startsWith(SkillTreeNode.KEY_PREFIX))
result.put(str, val);
if (str.startsWith(SkillTreeNode.KEY_PREFIX)) result.put(str, val);
});
return result;
}
@ -386,19 +379,9 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
/**
* @return If the item is unlocked by the player
* This is used for skills that can be locked & unlocked.
* <p>
* Looks at the real value and thus remove the plugin identifier
*/
public boolean hasUnlocked(Unlockable unlockable) {
return hasUnlocked(unlockable.getUnlockNamespacedKey());
}
public boolean hasUnlocked(String unlockNamespacedKey) {
return unlockedItems
.stream()
.filter(key -> key.equals(unlockNamespacedKey))
.collect(Collectors.toList()).size() != 0;
return unlockable.isUnlockedByDefault() || unlockedItems.contains(unlockable.getUnlockNamespacedKey());
}
/**
@ -407,6 +390,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
* @return If the item was locked when calling this method.
*/
public boolean unlock(Unlockable unlockable) {
Validate.isTrue(!unlockable.isUnlockedByDefault(), "Cannot unlock an item unlocked by default");
final boolean wasLocked = unlockedItems.add(unlockable.getUnlockNamespacedKey());
// Call the event synchronously
if (wasLocked)
@ -421,6 +405,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
* @return If the item was unlocked when calling this method.
*/
public boolean lock(Unlockable unlockable) {
Validate.isTrue(!unlockable.isUnlockedByDefault(), "Cannot lock an item unlocked by default");
boolean wasUnlocked = unlockedItems.remove(unlockable.getUnlockNamespacedKey());
if (wasUnlocked)
//Calls the event synchronously
@ -449,8 +434,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
// Remove from party if it is MMO Party Module
if (MMOCore.plugin.partyModule instanceof MMOCorePartyModule) {
AbstractParty party = getParty();
if (party != null && party instanceof Party)
((Party) party).removeMember(this);
if (party != null && party instanceof Party) ((Party) party).removeMember(this);
}
// Close combat handler
@ -460,8 +444,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
questData.close();
// Stop skill casting
if (isCasting())
leaveSkillCasting();
if (isCasting()) leaveSkillCasting();
}
public MMOPlayerData getMMOPlayerData() {
@ -536,12 +519,12 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
skillReallocationPoints += value;
}
public int countSkillPointsWhenReallocate() {
public int countSkillPointsSpent() {
int sum = 0;
for (ClassSkill skill : getProfess().getSkills()) {
//0 if the skill is level 1(just unlocked) or 0 locked.
for (ClassSkill skill : getProfess().getSkills())
// 0 if the skill is level 1 (just unlocked) or 0 locked
sum += Math.max(0, getSkillLevel(skill.getSkill()) - 1);
}
return sum;
}
@ -612,16 +595,14 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public void giveLevels(int value, EXPSource source) {
int total = 0;
while (value-- > 0)
total += getProfess().getExpCurve().getExperience(getLevel() + value + 1);
while (value-- > 0) total += getProfess().getExpCurve().getExperience(getLevel() + value + 1);
giveExperience(total, source);
}
public void setExperience(double value) {
experience = Math.max(0, value);
if (isOnline())
refreshVanillaExp();
if (isOnline()) refreshVanillaExp();
}
/**
@ -629,8 +610,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
* This updates the exp bar to display the player class level and exp.
*/
public void refreshVanillaExp() {
if (!MMOCore.plugin.configManager.overrideVanillaExp)
return;
if (!MMOCore.plugin.configManager.overrideVanillaExp) return;
getPlayer().sendExperienceChange(0.01f);
getPlayer().setLevel(getLevel());
@ -716,19 +696,16 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
}
public void heal(double heal, PlayerResourceUpdateEvent.UpdateReason reason) {
if (!isOnline())
return;
if (!isOnline()) return;
// Avoid calling an useless event
double max = getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue();
double newest = Math.max(0, Math.min(getPlayer().getHealth() + heal, max));
if (getPlayer().getHealth() == newest)
return;
if (getPlayer().getHealth() == newest) return;
PlayerResourceUpdateEvent event = new PlayerResourceUpdateEvent(this, PlayerResource.HEALTH, heal, reason);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled())
return;
if (event.isCancelled()) return;
// Use updated amount from event
getPlayer().setHealth(Math.max(0, Math.min(getPlayer().getHealth() + event.getAmount(), max)));
@ -757,13 +734,11 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
}
public void sendFriendRequest(PlayerData target) {
if (!isOnline() || !target.isOnline())
return;
if (!isOnline() || !target.isOnline()) return;
setLastActivity(PlayerActivity.FRIEND_REQUEST);
FriendRequest request = new FriendRequest(this, target);
new ConfigMessage("friend-request").addPlaceholders("player", getPlayer().getName(), "uuid", request.getUniqueId().toString())
.sendAsJSon(target.getPlayer());
new ConfigMessage("friend-request").addPlaceholders("player", getPlayer().getName(), "uuid", request.getUniqueId().toString()).sendAsJSon(target.getPlayer());
MMOCore.plugin.requestManager.registerRequest(request);
}
@ -791,9 +766,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
int t;
public void run() {
if (!isOnline() || getPlayer().getLocation().getBlockX() != x
|| getPlayer().getLocation().getBlockY() != y
|| getPlayer().getLocation().getBlockZ() != z) {
if (!isOnline() || getPlayer().getLocation().getBlockX() != x || getPlayer().getLocation().getBlockY() != y || getPlayer().getLocation().getBlockZ() != z) {
MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_CANCELLED).playTo(getPlayer());
MMOCore.plugin.configManager.getSimpleMessage("warping-canceled").send(getPlayer());
giveStellium(cost, PlayerResourceUpdateEvent.UpdateReason.USE_WAYPOINT);
@ -813,11 +786,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
MMOCore.plugin.soundManager.getSound(SoundEvent.WARP_CHARGE).playTo(getPlayer(), 1, (float) (.5 + t * 1.5 / warpTime));
final double r = Math.sin((double) t / warpTime * Math.PI);
for (double j = 0; j < Math.PI * 2; j += Math.PI / 4)
getPlayer().getLocation().getWorld().spawnParticle(Particle.REDSTONE, getPlayer().getLocation().add(
Math.cos((double) 5 * t / warpTime + j) * r,
(double) 2 * t / warpTime,
Math.sin((double) 5 * t / warpTime + j) * r),
1, new Particle.DustOptions(Color.PURPLE, 1.25f));
getPlayer().getLocation().getWorld().spawnParticle(Particle.REDSTONE, getPlayer().getLocation().add(Math.cos((double) 5 * t / warpTime + j) * r, (double) 2 * t / warpTime, Math.sin((double) 5 * t / warpTime + j) * r), 1, new Particle.DustOptions(Color.PURPLE, 1.25f));
}
}.runTaskTimer(MMOCore.plugin, 0, 1);
}
@ -854,14 +823,13 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
// Splitting exp through party members
final AbstractParty party;
if (splitExp && (party = getParty()) != null && MMOCore.plugin.configManager.splitMainExp) {
final List<PlayerData> nearbyMembers = party.getOnlineMembers().stream()
.filter(pd -> {
if (equals(pd) || pd.hasReachedMaxLevel() || Math.abs(pd.getLevel() - getLevel()) > MMOCore.plugin.configManager.maxPartyLevelDifference)
return false;
final List<PlayerData> nearbyMembers = party.getOnlineMembers().stream().filter(pd -> {
if (equals(pd) || pd.hasReachedMaxLevel() || Math.abs(pd.getLevel() - getLevel()) > MMOCore.plugin.configManager.maxPartyLevelDifference)
return false;
final double maxDis = MMOCore.plugin.configManager.partyMaxExpSplitRange;
return maxDis <= 0 || (pd.getPlayer().getWorld().equals(getPlayer().getWorld()) && pd.getPlayer().getLocation().distanceSquared(getPlayer().getLocation()) < maxDis * maxDis);
}).collect(Collectors.toList());
final double maxDis = MMOCore.plugin.configManager.partyMaxExpSplitRange;
return maxDis <= 0 || (pd.getPlayer().getWorld().equals(getPlayer().getWorld()) && pd.getPlayer().getLocation().distanceSquared(getPlayer().getLocation()) < maxDis * maxDis);
}).collect(Collectors.toList());
value /= (nearbyMembers.size() + 1);
for (PlayerData member : nearbyMembers)
member.giveExperience(value, source, null, false);
@ -878,8 +846,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
PlayerExperienceGainEvent event = new PlayerExperienceGainEvent(this, value, source);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled())
return;
if (event.isCancelled()) return;
// Experience hologram
if (hologramLocation != null && isOnline())
@ -900,8 +867,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
level = getLevel() + 1;
// Apply class experience table
if (getProfess().hasExperienceTable())
getProfess().getExperienceTable().claim(this, level, getProfess());
if (getProfess().hasExperienceTable()) getProfess().getExperienceTable().claim(this, level, getProfess());
}
if (level > oldLevel) {
@ -940,13 +906,11 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
// Avoid calling useless event
double max = getStats().getStat("MAX_MANA");
double newest = Math.max(0, Math.min(mana + amount, max));
if (mana == newest)
return;
if (mana == newest) return;
PlayerResourceUpdateEvent event = new PlayerResourceUpdateEvent(this, PlayerResource.MANA, amount, reason);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled())
return;
if (event.isCancelled()) return;
// Use updated amount from Bukkit event
mana = Math.max(0, Math.min(mana + event.getAmount(), max));
@ -965,13 +929,11 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
// Avoid calling useless event
double max = getStats().getStat("MAX_STAMINA");
double newest = Math.max(0, Math.min(stamina + amount, max));
if (stamina == newest)
return;
if (stamina == newest) return;
PlayerResourceUpdateEvent event = new PlayerResourceUpdateEvent(this, PlayerResource.STAMINA, amount, reason);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled())
return;
if (event.isCancelled()) return;
// Use updated amount from Bukkit event
stamina = Math.max(0, Math.min(stamina + event.getAmount(), max));
@ -990,13 +952,11 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
// Avoid calling useless event
double max = getStats().getStat("MAX_STELLIUM");
double newest = Math.max(0, Math.min(stellium + amount, max));
if (stellium == newest)
return;
if (stellium == newest) return;
PlayerResourceUpdateEvent event = new PlayerResourceUpdateEvent(this, PlayerResource.STELLIUM, amount, reason);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled())
return;
if (event.isCancelled()) return;
// Use updated amount from Bukkit event
stellium = Math.max(0, Math.min(stellium + event.getAmount(), max));
@ -1113,10 +1073,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
}
public void refreshBoundedSkill(String skill) {
boundSkills.values()
.stream()
.filter(skillInfo -> skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill))
.forEach(BoundSkillInfo::refresh);
boundSkills.values().stream().filter(skillInfo -> skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill)).forEach(BoundSkillInfo::refresh);
}
@Deprecated
@ -1175,34 +1132,10 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
// Clear old skills
for (Iterator<BoundSkillInfo> iterator = boundSkills.values().iterator(); iterator.hasNext(); )
if (!getProfess().hasSkill(iterator.next().getClassSkill().getSkill()))
iterator.remove();
if (!getProfess().hasSkill(iterator.next().getClassSkill().getSkill())) iterator.remove();
// Update stats
if (isOnline())
getStats().updateStats();
if (profess != null) {
// Loads the classUnlockedSkills
profess.getSkills()
.stream()
.filter(ClassSkill::isUnlockedByDefault)
.forEach(skill -> unlock(skill.getSkill()));
// Loads the classUnlockedSkills
profess.getSkills()
.stream()
.filter(ClassSkill::isUnlockedByDefault)
.forEach(skill -> unlock(skill.getSkill()));
// Loads the classUnlockedSlots
profess.getSlots()
.stream()
.filter(SkillSlot::isUnlockedByDefault)
.forEach(this::unlock);
}
if (isOnline()) getStats().updateStats();
}
public boolean hasSkillBound(int slot) {
@ -1213,7 +1146,6 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
return boundSkills.containsKey(slot) ? boundSkills.get(slot).getClassSkill() : null;
}
@Deprecated
public void setBoundSkill(int slot, ClassSkill skill) {
bindSkill(slot, skill);
@ -1230,8 +1162,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
Validate.notNull(skill, "Skill cannot be null");
//Unbinds the previous skill (Important for passive skills.
String skillId = skill.getSkill().getHandler().getId();
if (boundSkills.containsKey(slot))
boundSkills.get(slot).unbind();
if (boundSkills.containsKey(slot)) boundSkills.get(slot).unbind();
if (slot >= 0) {
//We apply the skill buffs associated with the slot to the skill.
for (SkillModifierTrigger skillBuffTrigger : profess.getSkillSlot(slot).getSkillBuffTriggers())
@ -1251,8 +1182,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public void unbindSkill(int slot) {
// We remove the skill buffs associated with the slot from the skill that is .
profess.getSkillSlot(slot).getSkillBuffTriggers().forEach(skillBuffTrigger ->
skillBuffTrigger.remove(this, boundSkills.get(slot).getClassSkill().getSkill().getHandler()));
profess.getSkillSlot(slot).getSkillBuffTriggers().forEach(skillBuffTrigger -> skillBuffTrigger.remove(this, boundSkills.get(slot).getClassSkill().getSkill().getHandler()));
BoundSkillInfo boundSkillInfo = boundSkills.remove(slot);
boundSkillInfo.unbind();
@ -1282,8 +1212,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
@Deprecated
public boolean canChooseSubclass() {
for (Subclass subclass : getProfess().getSubclasses())
if (getLevel() >= subclass.getLevel())
return true;
if (getLevel() >= subclass.getLevel()) return true;
return false;
}

View File

@ -35,7 +35,6 @@ import net.Indyuce.mmocore.skill.cast.ComboMap;
import net.Indyuce.mmocore.experience.ExperienceObject;
import net.Indyuce.mmocore.skilltree.tree.SkillTree;
import net.md_5.bungee.api.ChatColor;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Particle;
@ -185,8 +184,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
}
// Skill slots
Validate.isTrue(config.isConfigurationSection("skill-slots"), "You must define the skills-slots for class " + id);
for (int i = 1; i < MMOCore.plugin.configManager.maxSlots + 1; i++) {
for (int i = 1; i < MMOCore.plugin.configManager.maxSkillSlots + 1; i++) {
if (config.contains("skill-slots." + i))
skillSlots.put(i, new SkillSlot(config.getConfigurationSection("skill-slots." + i)));
else
@ -448,6 +446,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject {
return skillSlots.values();
}
@NotNull
public ClassSkill getSkill(RegisteredSkill skill) {
return getSkill(skill.getHandler().getId());
}

View File

@ -4,8 +4,10 @@ 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.api.Removable;
import net.Indyuce.mmocore.skill.ClassSkill;
import net.Indyuce.mmocore.skill.RegisteredSkill;
import javax.annotation.Nullable;
import java.util.Objects;
public class UnlockSkillTrigger extends Trigger implements Removable {
@ -13,17 +15,22 @@ public class UnlockSkillTrigger extends Trigger implements Removable {
public UnlockSkillTrigger(MMOLineConfig config) {
super(config);
config.validateKeys("skill");
skill = Objects.requireNonNull(MMOCore.plugin.skillManager.getSkill(config.getString("skill")));
}
@Override
public void apply(PlayerData player) {
player.unlock(skill);
public void apply(PlayerData playerData) {
final @Nullable ClassSkill found = playerData.getProfess().getSkill(skill);
if (found != null)
playerData.unlock(found);
}
@Override
public void remove(PlayerData playerData) {
playerData.lock(skill);
final @Nullable ClassSkill found = playerData.getProfess().getSkill(skill);
if (found != null)
playerData.lock(found);
}
}

View File

@ -15,19 +15,19 @@ public class UnlockSlotTrigger extends Trigger implements Removable {
super(config);
config.validateKeys("slot");
slot = Integer.parseInt("slot");
Validate.isTrue(slot > 0 && slot <= MMOCore.plugin.configManager.maxSlots, "The slot should be between 1 and " + MMOCore.plugin.configManager.maxSlots);
Validate.isTrue(slot > 0 && slot <= MMOCore.plugin.configManager.maxSkillSlots, "The slot should be between 1 and " + MMOCore.plugin.configManager.maxSkillSlots);
}
@Override
public void apply(PlayerData player) {
SkillSlot skillSlot = player.getProfess().getSkillSlot(slot);
final SkillSlot skillSlot = player.getProfess().getSkillSlot(slot);
if (!player.hasUnlocked(skillSlot))
player.unlock(skillSlot);
}
@Override
public void remove(PlayerData player) {
SkillSlot skillSlot = player.getProfess().getSkillSlot(slot);
final SkillSlot skillSlot = player.getProfess().getSkillSlot(slot);
if (player.hasUnlocked(skillSlot))
player.lock(skillSlot);
}

View File

@ -112,18 +112,18 @@ public class SkillCommandTreeNode extends CommandTreeNode {
return CommandResult.FAILURE;
}
if (lock) {
if (!playerData.hasUnlocked(skill.getSkill())) {
if (!playerData.hasUnlocked(skill)) {
CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.RED + "The skill " + skill.getSkill().getName() + " is already locked" + " for " + player.getName());
return CommandResult.SUCCESS;
}
playerData.lock(skill.getSkill());
playerData.lock(skill);
} else {
if (playerData.hasUnlocked(skill.getSkill())) {
if (playerData.hasUnlocked(skill)) {
CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.RED + "The skill " + skill.getSkill().getName() + " is already unlocked" + " for " + player.getName());
return CommandResult.SUCCESS;
}
playerData.unlock(skill.getSkill());
playerData.unlock(skill);
}
CommandVerbose.verbose(sender, CommandVerbose.CommandType.SKILL, ChatColor.GOLD + "The skill " + skill.getSkill().getName() + " is now " + (lock ? "locked" : "unlocked" + " for " + player.getName()));
return CommandResult.SUCCESS;

View File

@ -58,7 +58,7 @@ public class SkillList extends EditableInventory {
Placeholders holders = new Placeholders();
holders.register("skill_points", inv.getPlayerData().getSkillPoints());
holders.register("points", inv.getPlayerData().getSkillReallocationPoints());
holders.register("total", inv.getPlayerData().countSkillPointsWhenReallocate());
holders.register("total", inv.getPlayerData().countSkillPointsSpent());
return holders;
}
};
@ -75,6 +75,7 @@ public class SkillList extends EditableInventory {
return inv.page > 0;
}
};
if (function.equals("next")) {
return new SimplePlaceholderItem<SkillViewerInventory>(config) {
@ -159,10 +160,10 @@ public class SkillList extends EditableInventory {
@Override
public ItemStack display(SkillViewerInventory inv, int n) {
if (!inv.getPlayerData().hasUnlocked("slot:" + (n+1))) {
final SkillSlot skillSlot = inv.getPlayerData().getProfess().getSkillSlot(n + 1);
if (!inv.getPlayerData().hasUnlocked(skillSlot))
return new ItemStack(Material.AIR);
}
SkillSlot skillSlot = inv.getPlayerData().getProfess().getSkillSlot(n + 1);
ItemStack item = super.display(inv, n);
if (!inv.getPlayerData().hasSkillBound(n + 1)) {
//If there is an item filled in the slot config it shows it, else shows the default item.
@ -180,7 +181,6 @@ public class SkillList extends EditableInventory {
meta.setCustomModelData(customModelData);
}
item.setItemMeta(meta);
}
return item;
@ -209,8 +209,6 @@ public class SkillList extends EditableInventory {
}
}
;
public class SkillItem extends InventoryItem<SkillViewerInventory> {
public SkillItem(ConfigurationSection config) {
super(Material.BARRIER, config);
@ -284,7 +282,6 @@ public class SkillList extends EditableInventory {
shiftCost = 1;
}
}
}
@Override
@ -315,7 +312,7 @@ public class SkillList extends EditableInventory {
super(playerData, editable);
skills = playerData.getProfess().getSkills()
.stream()
.filter((classSkill) -> playerData.hasUnlocked(classSkill.getSkill()))
.filter((classSkill) -> playerData.hasUnlocked(classSkill))
.sorted(Comparator.comparingInt(ClassSkill::getUnlockLevel))
.collect(Collectors.toList());
skillSlots = getEditable().getByFunction("skill").getSlots();
@ -347,7 +344,7 @@ public class SkillList extends EditableInventory {
}
if (item.getFunction().equals("reallocation")) {
int spent = getPlayerData().countSkillPointsWhenReallocate();
int spent = getPlayerData().countSkillPointsSpent();
if (spent < 1) {
MMOCore.plugin.configManager.getSimpleMessage("no-skill-points-spent").send(player);
@ -361,10 +358,9 @@ public class SkillList extends EditableInventory {
return;
}
for (ClassSkill skill : playerData.getProfess().getSkills()) {
for (ClassSkill skill : playerData.getProfess().getSkills())
playerData.setSkillLevel(skill.getSkill(), 1);
}
playerData.giveSkillPoints(spent);
playerData.setSkillReallocationPoints(playerData.getSkillReallocationPoints() - 1);
MMOCore.plugin.configManager.getSimpleMessage("skill-points-reallocated", "points", "" + playerData.getSkillPoints()).send(player);
@ -386,9 +382,7 @@ public class SkillList extends EditableInventory {
return;
}
/*
* binding or unbinding skills.
*/
// Binding or unbinding skills.
if (item.getFunction().equals("slot")) {
int index = slotSlots.indexOf(context.getSlot()) + 1;
SkillSlot skillSlot = playerData.getProfess().getSkillSlot(index);
@ -398,6 +392,7 @@ public class SkillList extends EditableInventory {
selected=playerData.getBoundSkill(index);
return;
}
// unbind if there is a current spell.
if (context.getClickType() == ClickType.RIGHT) {
if (!playerData.hasSkillBound(index)) {
@ -405,7 +400,7 @@ public class SkillList extends EditableInventory {
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2);
return;
}
if(!playerData.getProfess().getSkillSlot(index).canManuallyBind()){
if (!playerData.getProfess().getSkillSlot(index).canManuallyBind()) {
MMOCore.plugin.configManager.getSimpleMessage("cant-manually-bind").send(player);
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2);
return;
@ -417,34 +412,30 @@ public class SkillList extends EditableInventory {
}
if (!playerData.hasSkillUnlocked(selected)) {
MMOCore.plugin.configManager.getSimpleMessage("not-unlocked-skill").send(player);
MMOCore.plugin.configManager.getSimpleMessage("skill-level-not-met").send(player);
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2);
return;
}
if (!skillSlot.canManuallyBind()){
if (!skillSlot.canManuallyBind()) {
MMOCore.plugin.configManager.getSimpleMessage("cant-manually-bind").send(player);
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2);
return;
}
if (!skillSlot.acceptsSkill(selected)){
if (!skillSlot.acceptsSkill(selected)) {
MMOCore.plugin.configManager.getSimpleMessage("not-compatible-skill").send(player);
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 2);
return;
}
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 2);
playerData.bindSkill(index, selected);
open();
return;
}
/*
* upgrading a player skill
*/
// Upgrading a player skill
if (item.getFunction().equals("upgrade")) {
int shiftCost = ((UpgradeItem) item).shiftCost;

View File

@ -34,7 +34,7 @@ public class ConfigManager {
public long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown;
public double lootChestsChanceWeight, dropItemsChanceWeight, fishingDropsChanceWeight, partyMaxExpSplitRange, pvpModeToggleOnCooldown, pvpModeToggleOffCooldown, pvpModeCombatCooldown,
pvpModeCombatTimeout, pvpModeInvulnerabilityTimeRegionChange, pvpModeInvulnerabilityTimeCommand, pvpModeRegionEnterCooldown, pvpModeRegionLeaveCooldown;
public int maxPartyLevelDifference, maxSlots, minCombatLevel, maxCombatLevelDifference;
public int maxPartyLevelDifference, maxSkillSlots, minCombatLevel, maxCombatLevelDifference;
public final List<EntityDamageEvent.DamageCause> combatLogDamageCauses = new ArrayList<>();
private final FileConfiguration messages;
@ -157,7 +157,7 @@ public class ConfigManager {
canCreativeCast = MMOCore.plugin.getConfig().getBoolean("can-creative-cast");
cobbleGeneratorXP = MMOCore.plugin.getConfig().getBoolean("should-cobblestone-generators-give-exp");
saveDefaultClassInfo = MMOCore.plugin.getConfig().getBoolean("save-default-class-info");
maxSlots = MMOCore.plugin.getConfig().getInt("max-slots");
maxSkillSlots = MMOCore.plugin.getConfig().getInt("max-skill-slots");
overrideVanillaExp = MMOCore.plugin.getConfig().getBoolean("override-vanilla-exp");
}
@ -181,11 +181,11 @@ public class ConfigManager {
}
public void loadDefaultFile(String path, String name) {
String newPath ="";
if(!path.isEmpty()){
String newPath = "";
if (!path.isEmpty()) {
String[] subpaths = path.split("/");
for (String subpath : subpaths) {
newPath+="/"+subpath;
newPath += "/" + subpath;
File folder = new File(MMOCore.plugin.getDataFolder() + (newPath));
if (!folder.exists()) folder.mkdir();
}
@ -193,7 +193,6 @@ public class ConfigManager {
File file = new File(MMOCore.plugin.getDataFolder() + (newPath), name);
if (!file.exists()) try {
MMOCore.log("default/" + (path.isEmpty() ? "" : path + "/") + name);
Files.copy(MMOCore.plugin.getResource("default/" + (path.isEmpty() ? "" : path + "/") + name), file.getAbsoluteFile().toPath());
} catch (IOException e) {
e.printStackTrace();

View File

@ -33,7 +33,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager {
public void loadData(PlayerData data) {
FileConfiguration config = new ConfigFile(data.getUniqueId()).getConfig();
//Reset stats linked to triggers.
// Reset stats linked to triggers.
data.resetTriggerStats();
data.setClassPoints(config.getInt("class-points", getDefaultData().getClassPoints()));
@ -70,8 +70,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager {
data.bindSkill(Integer.parseInt(key), skill);
}
for (
String key : MMOCore.plugin.skillTreeManager.getAll().
for (String key : MMOCore.plugin.skillTreeManager.getAll().
stream().
map(skillTree -> skillTree.getId()).
toList()) {
@ -79,7 +78,6 @@ public class YAMLPlayerDataManager extends PlayerDataManager {
}
data.setSkillTreePoints("global", config.getInt("skill-tree-points.global", 0));
if (config.contains("times-claimed"))
for (String key : config.getConfigurationSection("times-claimed").getKeys(false)) {
ConfigurationSection section = config.getConfigurationSection("times-claimed." + key);
@ -193,7 +191,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager {
info.getNodeKeys().forEach(node -> config.set("class-info." + key + ".node-levels." + node, info.getNodeLevel(node)));
info.getSkillTreePointsKeys().forEach(skillTreeId -> config.set("class-info." + key + ".skill-tree-points." + skillTreeId, info.getAttributeLevel(skillTreeId)));
info.getBoundSkills().forEach((slot, skill) -> config.set("class-info." + key + ".bound-skills." + slot, skill));
config.set("class-info." + key + ".unlocked-items", info.getUnlockedItems());
config.set("class-info." + key + ".unlocked-items", new ArrayList<>(info.getUnlockedItems()));
}
file.save();

View File

@ -20,6 +20,8 @@ public interface Unlockable {
*/
String getUnlockNamespacedKey();
boolean isUnlockedByDefault();
void whenLocked(PlayerData playerData);
void whenUnlocked(PlayerData playerData);

View File

@ -9,12 +9,14 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.math.formula.IntegerLinearValue;
import net.Indyuce.mmocore.api.util.math.formula.LinearValue;
import net.Indyuce.mmocore.gui.api.item.Placeholders;
import net.Indyuce.mmocore.player.Unlockable;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import java.util.*;
public class ClassSkill implements CooldownObject {
public class ClassSkill implements CooldownObject, Unlockable {
private final RegisteredSkill skill;
private final int unlockLevel, maxSkillLevel;
private final boolean unlockedByDefault;
@ -56,6 +58,7 @@ public class ClassSkill implements CooldownObject {
}
}
@NotNull
public RegisteredSkill getSkill() {
return skill;
}
@ -72,10 +75,29 @@ public class ClassSkill implements CooldownObject {
return maxSkillLevel;
}
@Override
public boolean isUnlockedByDefault() {
return unlockedByDefault;
}
@Override
public String getUnlockNamespacedKey() {
return "skill:" + skill.getHandler().getId().toLowerCase();
}
@Override
public void whenLocked(PlayerData playerData) {
playerData.mapBoundSkills().forEach((slot, skill) -> {
if (skill.equals(getUnlockNamespacedKey().split(":")[1]))
playerData.unbindSkill(slot);
});
}
@Override
public void whenUnlocked(PlayerData playerData) {
}
/**
* This method can only override default modifiers and
* will throw an error when trying to define non existing modifiers

View File

@ -5,8 +5,6 @@ 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.trigger.TriggerType;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.player.Unlockable;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.api.util.math.formula.IntegerLinearValue;
import net.Indyuce.mmocore.api.util.math.formula.LinearValue;
@ -17,7 +15,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.*;
public class RegisteredSkill implements Unlockable {
public class RegisteredSkill {
private final SkillHandler<?> handler;
private final String name;
private final Map<String, LinearValue> defaultModifiers = new HashMap<>();
@ -65,24 +63,6 @@ public class RegisteredSkill implements Unlockable {
this.categories = new ArrayList<>();
}
@Override
public String getUnlockNamespacedKey() {
return "skill:" + handler.getId().toLowerCase();
}
@Override
public void whenLocked(PlayerData playerData) {
playerData.mapBoundSkills().forEach((slot, skill) -> {
if (skill.equals(getUnlockNamespacedKey().split(":")[1]))
playerData.unbindSkill(slot);
});
}
@Override
public void whenUnlocked(PlayerData playerData) {
}
public SkillHandler<?> getHandler() {
return handler;
}

View File

@ -9,6 +9,7 @@ import net.Indyuce.mmocore.skill.ClassSkill;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
@ -19,12 +20,10 @@ public class SkillSlot implements Unlockable {
private final List<String> lore;
private final boolean isUnlockedByDefault;
private final boolean canManuallyBind;
private final List<SkillModifierTrigger> skillBuffTriggers;
private Material item;
private final List<SkillModifierTrigger> skillBuffTriggers = new ArrayList<>();
private final Material item;
public SkillSlot(int slot, int modelData, String formula, String name, List<String> lore, boolean isUnlockedByDefault, boolean canManuallyBind, List<SkillModifierTrigger> skillBuffTriggers) {
this.slot = slot;
@ -32,9 +31,10 @@ public class SkillSlot implements Unlockable {
this.formula = formula;
this.name = name;
this.lore = lore;
this.item = null;
this.canManuallyBind = canManuallyBind;
this.isUnlockedByDefault = isUnlockedByDefault;
this.skillBuffTriggers = skillBuffTriggers;
this.skillBuffTriggers.addAll(skillBuffTriggers);
}
public SkillSlot(ConfigurationSection section) {
@ -42,12 +42,10 @@ public class SkillSlot implements Unlockable {
this.formula = section.contains("formula") ? section.getString("formula") : "true";
this.name = section.getString("name");
this.lore = section.getStringList("lore");
if (section.contains("item"))
this.item = Material.valueOf(section.getString("item"));
this.item = section.contains("item") ? Material.valueOf(section.getString("item")) : null;
this.modelData = section.getInt("model-data", 0);
isUnlockedByDefault = section.getBoolean("unlocked-by-default", true);
canManuallyBind = section.getBoolean("can-manually-bind", true);
skillBuffTriggers = new ArrayList<>();
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"))
@ -66,6 +64,7 @@ public class SkillSlot implements Unlockable {
return lore;
}
@Nullable
public Material getItem() {
return item;
}

View File

@ -39,21 +39,21 @@ public abstract class SkillCastingHandler extends BukkitRunnable implements List
@Override
public void run() {
if (!caster.isOnline() || caster.getPlayer().isDead())
if (!caster.isOnline() || caster.getPlayer().isDead()) {
caster.leaveSkillCasting();
else {
// Apply casting particles
if (caster.getProfess().getCastParticle() != null)
for (int k = 0; k < 2; k++) {
double a = (double) j++ / 5;
caster.getProfess().getCastParticle()
.display(caster.getPlayer().getLocation().add(Math.cos(a), 1 + Math.sin(a / 3) / 1.3, Math.sin(a)));
}
// Apply casting mode-specific effects
onTick();
return;
}
// Apply casting particles
if (caster.getProfess().getCastParticle() != null)
for (int k = 0; k < 2; k++) {
double a = (double) j++ / 5;
caster.getProfess().getCastParticle()
.display(caster.getPlayer().getLocation().add(Math.cos(a), 1 + Math.sin(a / 3) / 1.3, Math.sin(a)));
}
// Apply casting mode-specific effects
onTick();
}
public abstract void onTick();

View File

@ -70,9 +70,8 @@ public class SkillTreeNode implements ExperienceObject {
throw new RuntimeException("You must only specifiy integers in lores.");
}
String expTableId = config.getString("experience-table");
Validate.notNull(expTableId, "You must specify an exp table for " + getFullId() + ".");
this.experienceTable = MMOCore.plugin.experience.getTableOrThrow(expTableId);
Validate.isTrue(config.contains("experience-table"), "You must specify an exp table");
this.experienceTable = MMOCore.plugin.experience.loadExperienceTable(config.get("experience-table"));
maxLevel = config.contains("max-level") ? config.getInt("max-level") : 1;
maxChildren = config.contains("max-children") ? config.getInt("max-children") : 1;
@ -121,7 +120,6 @@ public class SkillTreeNode implements ExperienceObject {
return softParents.containsKey(parent) || strongParents.containsKey(parent);
}
public int getMaxLevel() {
return maxLevel;
}

View File

@ -70,7 +70,6 @@ public class Waypoint extends PostLoadObject implements Unlockable {
}
}
@Override
protected void whenPostLoaded(@NotNull ConfigurationSection config) {
@ -213,6 +212,11 @@ public class Waypoint extends PostLoadObject implements Unlockable {
return "waypoint:" + getId();
}
@Override
public boolean isUnlockedByDefault() {
return hasOption(WaypointOption.DEFAULT);
}
@Override
public void whenLocked(PlayerData playerData) {

View File

@ -197,8 +197,8 @@ death-exp-loss:
# Percentage of current EXP you lose when dying.
percent: 30
#Maximum number of slot. This means that you can't unlock a slot greater than max-slots. (The slot count starts at 1 & end at max-slots).
max-slots: 8
# Maximum number of skill slots. This means that you cannot unlock more than X skill slots.
max-skill-slots: 8
#If you want players to bound their passive skills.
#If false, all the passive skills unlocked will be active

View File

@ -1,4 +1,11 @@
# Experience tables are separated into multiple items.
example_exp_table:
# Every item is fully independent and has its own chance
# of dropping every time a player passes a level! When an
# item drops, all its triggers are called.
first_table_item:
# This item will drop every 3 level ups
@ -7,13 +14,13 @@ example_exp_table:
# This item has a 80% chance to drop every 3 level ups
chance: 80
# Every successive fail in claiming the item will reduce
# the risk of failing future claims by X%. With a 80%
# fail reduction rate, chances become:
# Every successive drop failure the item will reduce the
# future risk by X%. With a 80% failure reduction rate,
# risks become:
# - 80%
# - 96%
# - 99.2%
# - 99.84%
# - 96% (almost guaranteed)
# - 99.2% (almost guaranteed+)
# - 99.84% (almost guaranteed++)
# so on forever..
#
# This is better than just increasing the claim chance by a
@ -21,10 +28,13 @@ example_exp_table:
# just becomes/surpasses 100% at some point.
fail-reduction: 80
# What happens when that item is claimed
# What happens when that item is claimed. Does it give exp?
# Does it perform a command, unlocks a skill? etc
# You can find the list of available triggers on the wiki
triggers:
- 'exp{amount=20}'
# This is a second item, fully independent of the previous one.
second_table_item:
period: 2
triggers:
@ -53,284 +63,3 @@ second_exp_table:
triggers:
- 'exp{amount=100}'
### Skill Tree
## MANA_REGENERATION
skilltree_mana_regeneration1:
mana_regeneration:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=1;type="FLAT"}'
skilltree_mana_regeneration2:
mana_regeneration:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=2;type="FLAT"}'
## HEALTH_REGENERATION
skilltree_health_regeneration1:
health_regeneration:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=1;type="FLAT"}'
skilltree_health_regeneration2:
health_regeneration:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=2;type="FLAT"}'
## COOLDOWN_REDUCTION
skilltree_cooldown_reduction5:
cooldown_reduction:
triggers:
- 'stat{stat="COOLDOWN_REDUCTION";amount=5;type="FLAT"}'
skilltree_cooldown_reduction10:
cooldown_reduction:
triggers:
- 'stat{stat="COOLDOWN_REDUCTION";amount=10;type="FLAT"}'
skilltree_cooldown_reduction15:
cooldown_reduction:
triggers:
- 'stat{stat="COOLDOWN_REDUCTION";amount=15;type="FLAT"}'
## CRITICAL_STRIKE_CHANCE
skilltree_critical_strike_chance1:
critical_strike_chance:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=1;type="FLAT"}'
skilltree_critical_strike_chance2:
critical_strike_chance:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=2;type="FLAT"}'
skilltree_critical_strike_chance3:
critical_strike_chance:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=3;type="FLAT"}'
skilltree_critical_strike_chance5:
critical_strike_chance:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=5;type="FLAT"}'
## WEAPON_DAMAGE
skilltree_weapon_damage1:
weapon_damage:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=1;type="FLAT"}'
skilltree_weapon_damage2:
weapon_damage:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=2;type="FLAT"}'
skilltree_weapon_damage4:
weapon_damage:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=4;type="FLAT"}'
## DAMAGE_REDUCTION
skilltree_damage_reduction1:
weapon_damage:
triggers:
- 'stat{stat="DAMAGE_REDUCTION";amount=1;type="FLAT"}'
skilltree_damage_reduction2:
weapon_damage:
triggers:
- 'stat{stat="DAMAGE_REDUCTION";amount=2;type="FLAT"}'
## LIFESTEAL
skilltree_lifesteal1:
lifesteal:
triggers:
- 'stat{stat="LIFESTEAL";amount=1;type="FLAT"}'
skilltree_lifesteal2:
lifesteal:
triggers:
- 'stat{stat="LIFESTEAL";amount=2;type="FLAT"}'
skilltree_lifesteal3:
lifesteal:
triggers:
- 'stat{stat="LIFESTEAL";amount=3;type="FLAT"}'
## MAX_HEALTH
skilltree_max_health1:
max_health:
triggers:
- 'stat{stat="MAX_HEALTH";amount=1;type="FLAT"}'
skilltree_max_health2:
max_health:
triggers:
- 'stat{stat="MAX_HEALTH";amount=2;type="FLAT"}'
skilltree_max_health4:
max_health:
triggers:
- 'stat{stat="MAX_HEALTH";amount=4;type="FLAT"}'
skilltree_max_health5:
max_health:
triggers:
- 'stat{stat="MAX_HEALTH";amount=5;type="FLAT"}'
## MAGIC_DAMAGE
skilltree_magic_damage1:
magic_damage:
triggers:
- 'stat{stat="MAGIC_DAMAGE";amount=1;type="FLAT"}'
skilltree_magic_damage2:
magic_damage:
triggers:
- 'stat{stat="MAGIC_DAMAGE";amount=2;type="FLAT"}'
skilltree_magic_damage3:
magic_damage:
triggers:
- 'stat{stat="MAGIC_DAMAGE";amount=3;type="FLAT"}'
## ATTACK_SPEED
skilltree_attack_speed5:
attack_speed:
triggers:
- 'stat{stat="ATTACK_SPEED";amount=5;type="RELATIVE"}'
skilltree_attack_speed10:
attack_speed:
triggers:
- 'stat{stat="ATTACK_SPEED";amount=10;type="RELATIVE"}'
skilltree_attack_speed15:
attack_speed:
triggers:
- 'stat{stat="ATTACK_SPEED";amount=15;type="RELATIVE"}'
## PHYSICAL_DAMAGE_REDUCTION
skilltree_physical_damage_reduction5:
physical_damage_reduction:
triggers:
- 'stat{stat="PHYSICAL_DAMAGE_REDUCTION";amount=5;type="FLAT"}'
skilltree_physical_damage_reduction10:
physical_damage_reduction:
triggers:
- 'stat{stat="PHYSICAL_DAMAGE_REDUCTION";amount=10;type="FLAT"}'
skilltree_physical_damage_reduction15:
physical_damage_reduction:
triggers:
- 'stat{stat="PHYSICAL_DAMAGE_REDUCTION";amount=15;type="FLAT"}'
## PARRY_RATING
skilltree_parry_rating5:
parry_rating:
triggers:
- 'stat{stat="PARRY_RATING";amount=5;type="FLAT"}'
skilltree_parry_rating10:
parry_ratingn:
triggers:
- 'stat{stat="PARRY_RATING";amount=10;type="FLAT"}'
## KNOCKBACK_RESISTANCE
skilltree_knockback_resistance5:
knockback_resistance:
triggers:
- 'stat{stat="KNOCKBACK_RESISTANCE";amount=0.05;type="FLAT"}'
skilltree_knockback_resistance10:
knockback_resistance:
triggers:
- 'stat{stat="KNOCKBACK_RESISTANCE";amount=0.1;type="FLAT"}'
## DODGE_RATING
skilltree_dodge_rating2:
dodge_rating:
triggers:
- 'stat{stat="DODGE_RATING";amount=2;type="FLAT"}'
skilltree_dodge_rating3:
dodge_rating:
triggers:
- 'stat{stat="DODGE_RATING";amount=3;type="FLAT"}'
skilltree_dodge_rating5:
dodge_rating:
triggers:
- 'stat{stat="DODGE_RATING";amount=100;type="FLAT"}'
## SKILL_DAMAGE
skilltree_skill_damage5:
skill_damage:
triggers:
- 'stat{stat="SKILL_DAMAGE";amount=5;type="FLAT"}'
skilltree_skill_damage10:
skill_damage:
triggers:
- 'stat{stat="SKILL_DAMAGE";amount=10;type="FLAT"}'
## SPELL_VAMPIRISM
skilltree_spell_vampirism2:
spell_vampirism:
triggers:
- 'stat{stat="SPELL_VAMPIRISM";amount=2;type="FLAT"}'
skilltree_spell_vampirism6:
spell_vampirism:
triggers:
- 'stat{stat="SPELL_VAMPIRISM";amount=6;type="FLAT"}'
## ADDITIONAL_EXPERIENCE
skilltree_additional_experience2:
additional_experience:
triggers:
- 'stat{stat="ADDITIONAL_EXPERIENCE";amount=2;type="FLAT"}'
skilltree_additional_experience3:
additional_experience:
triggers:
- 'stat{stat="ADDITIONAL_EXPERIENCE";amount=3;type="FLAT"}'
skilltree_additional_experience5:
additional_experience:
triggers:
- 'stat{stat="ADDITIONAL_EXPERIENCE";amount=5;type="FLAT"}'
## MAGIC_DAMAGE_REDUCTION
skilltree_magic_damage_reduction5:
magic_damage_reduction:
triggers:
- 'stat{stat="MAGIC_DAMAGE_REDUCTION";amount=5;type="FLAT"}'
skilltree_magic_damage_reduction10:
magic_damage_reduction:
triggers:
- 'stat{stat="MAGIC_DAMAGE_REDUCTION";amount=10;type="FLAT"}'
## SKILL_CRITICAL_STRIKE_CHANCE
skilltree_skill_critical_strike_chance5:
skill_critical_strike_chance:
triggers:
- 'stat{stat="SKILL_CRITICAL_STRIKE_CHANCE";amount=5;type="FLAT"}'
skilltree_skill_critical_strike_chance10:
skill_critical_strike_chance:
triggers:
- 'stat{stat="SKILL_CRITICAL_STRIKE_CHANCE";amount=10;type="FLAT"}'
skilltree_skill_critical_strike_chance15:
skill_critical_strike_chance:
triggers:
- 'stat{stat="SKILL_CRITICAL_STRIKE_CHANCE";amount=15;type="FLAT"}'
## ARROW_VELOCITY
skilltree_arrow_velocity10:
arrow_velocity:
triggers:
- 'stat{stat="ARROW_VELOCITY";amount=10;type="RELATIVE"}'
skilltree_arrow_velocity15:
arrow_velocity:
triggers:
- 'stat{stat="ARROW_VELOCITY";amount=15;type="RELATIVE"}'
skilltree_arrow_velocity25:
arrow_velocity:
triggers:
- 'stat{stat="ARROW_VELOCITY";amount=25;type="RELATIVE"}'
## MOVEMENT_SPEED
skilltree_movement_speed2:
movement_speed:
triggers:
- 'stat{stat="MOVEMENT_SPEED";amount=10;type="RELATIVE"}'
skilltree_movement_speed6:
movement_speed:
triggers:
- 'stat{stat="MOVEMENT_SPEED";amount=10;type="RELATIVE"}'
## PROJECTILE_DAMAGE
skilltree_projectile_damage2:
projectile_damage:
triggers:
- 'stat{stat="PROJECTILE_DAMAGE";amount=10;type="FLAT"}'
skilltree_projectile_damage6:
projectile_damage:
triggers:
- 'stat{stat="PROJECTILE_DAMAGE";amount=6;type="FLAT"}'

View File

@ -200,7 +200,7 @@ no-class-skill: '&cYour class has no skill.'
not-enough-skill-points: '&cYou need one skill point.'
not-enough-skill-points-shift: '&cYou need {shift_points} skill points.'
upgrade-skill: '&eYour &6{skill} &eis now Level &6{level}&e!'
not-unlocked-skill: '&cYou have not unlocked that skill yet.'
skill-level-not-met: '&cYou cannot use this skill yet.'
no-skill-bound: '&cYou don''t have any skill bound to this slot.'
not-compatible-skill: '&cThe selected skill is not compatible with this slot.'
cant-manually-bind: "&cYou can't manually bind/unbind a skill to this slot."

View File

@ -16,12 +16,15 @@ nodes:
is-root: true
size: 1
point-consumed: 1
experience-table: skilltree_cooldown_reduction5
experience-table:
first_table_item:
triggers:
- 'stat{stat="COOLDOWN_REDUCTION";amount=5;type="FLAT"}'
lores:
0:
- "&eReduces cooldowns of item and player skills (5%)"
- "&eReduces item/class skill cooldowns (5%)"
1:
- "&eReduces cooldowns of item and player skills (5%)"
- "&eReduces item/class skill cooldowns (5%)"
@ -30,30 +33,36 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_cooldown_reduction10
experience-table:
first_table_item:
triggers:
- 'stat{stat="COOLDOWN_REDUCTION";amount=10;type="FLAT"}'
coordinates:
x: -2
y: -2
lores:
0:
- "&eReduces cooldowns of item and player skills (10%)"
- "&eReduces item/class skill cooldowns (10%)"
1:
- "&eReduces cooldowns of item and player skills (10%)"
- "&eReduces item/class skill cooldowns (20%)"
a3:
name: 'Cooldown Reduction'
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_cooldown_reduction15
experience-table:
first_table_item:
triggers:
- 'stat{stat="COOLDOWN_REDUCTION";amount=15;type="FLAT"}'
coordinates:
x: -1
y: -2
lores:
0:
- "&eReduces cooldowns of item and player skills (15%)"
- "&eReduces item/class skill cooldowns (15%)"
1:
- "&eReduces cooldowns of item and player skills (15%)"
- "&eReduces item/class skill cooldowns (30%)"
### B
@ -62,7 +71,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_critical_strike_chance1
experience-table:
first_table_item:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=1;type="FLAT"}'
coordinates:
x: 0
y: -2
@ -70,14 +82,17 @@ nodes:
0:
- "&eCritical Strikes deal more damage in % chance"
1:
- "&eCritical Strikes deal more damage in +%2 chance"
- "&eCritical Strikes deal more damage in +%1 chance"
b2:
name: 'Critical Strike Chance'
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_critical_strike_chance2
experience-table:
first_table_item:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=2;type="FLAT"}'
coordinates:
x: 0
y: -1
@ -92,7 +107,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 2
experience-table: skilltree_critical_strike_chance3
experience-table:
first_table_item:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=3;type="FLAT"}'
coordinates:
x: 0
y: 0
@ -109,7 +127,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_lifesteal1
experience-table:
first_table_item:
triggers:
- 'stat{stat="LIFESTEAL";amount=1;type="FLAT"}'
coordinates:
x: -1
y: 0
@ -124,7 +145,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_lifesteal2
experience-table:
first_table_item:
triggers:
- 'stat{stat="LIFESTEAL";amount=2;type="FLAT"}'
coordinates:
x: -2
y: 0
@ -139,7 +163,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_lifesteal2
experience-table:
first_table_item:
triggers:
- 'stat{stat="LIFESTEAL";amount=3;type="FLAT"}'
coordinates:
x: -3
y: 0
@ -156,7 +183,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_damage_reduction1
experience-table:
first_table_item:
triggers:
- 'stat{stat="DAMAGE_REDUCTION";amount=1;type="FLAT"}'
coordinates:
x: 0
y: 1
@ -171,7 +201,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 2
experience-table: skilltree_damage_reduction2
experience-table:
first_table_item:
triggers:
- 'stat{stat="DAMAGE_REDUCTION";amount=2;type="FLAT"}'
coordinates:
x: 0
y: 2
@ -186,7 +219,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_damage_reduction2
experience-table:
first_table_item:
triggers:
- 'stat{stat="DAMAGE_REDUCTION";amount=2;type="FLAT"}'
coordinates:
x: -1
y: 2
@ -203,7 +239,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_health_regeneration1
experience-table:
first_table_item:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=1;type="FLAT"}'
coordinates:
x: -2
y: 2
@ -218,7 +257,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_health_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=2;type="FLAT"}'
coordinates:
x: -3
y: 2
@ -233,7 +275,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_health_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=2;type="FLAT"}'
coordinates:
x: -3
y: 1
@ -250,7 +295,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_mana_regeneration1
experience-table:
first_table_item:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=1;type="FLAT"}'
coordinates:
x: 1
y: 2
@ -265,7 +313,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_mana_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=2;type="FLAT"}'
coordinates:
x: 2
y: 2
@ -280,7 +331,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_mana_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=2;type="FLAT"}'
coordinates:
x: 3
y: 2
@ -297,7 +351,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_magic_damage1
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAGIC_DAMAGE";amount=1;type="FLAT"}'
coordinates:
x: 3
y: 1
@ -312,7 +369,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_magic_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAGIC_DAMAGE";amount=2;type="FLAT"}'
coordinates:
x: 4
y: 1
@ -327,7 +387,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_magic_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAGIC_DAMAGE";amount=2;type="FLAT"}'
coordinates:
x: 4
y: 0
@ -344,7 +407,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_max_health2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAX_HEALTH";amount=2;type="RELATIVE"}'
coordinates:
x: 4
y: -1
@ -359,7 +425,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_max_health4
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAX_HEALTH";amount=4;type="RELATIVE"}'
coordinates:
x: 4
y: -2
@ -374,7 +443,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_max_health4
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAX_HEALTH";amount=4;type="RELATIVE"}'
coordinates:
x: 3
y: -2
@ -391,7 +463,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_weapon_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=2;type="FLAT"}'
coordinates:
x: 2
y: -2
@ -406,7 +481,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_weapon_damage4
experience-table:
first_table_item:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=4;type="FLAT"}'
coordinates:
x: 2
y: -1
@ -421,7 +499,10 @@ nodes:
size: 1
point-consumed: 1
max-children: 1
experience-table: skilltree_weapon_damage4
experience-table:
first_table_item:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=4;type="FLAT"}'
coordinates:
x: 2
y: 0
@ -432,8 +513,6 @@ nodes:
- "&eAdditional on-hit weapon damage in +%4"
paths:
path1:
x: 2

View File

@ -19,7 +19,10 @@ nodes:
is-root: true
size: 1
point-consumed: 1
experience-table: skilltree_mana_regeneration1
experience-table:
first_table_item:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=1;type="FLAT"}'
lores:
0:
- "&eMana regen in pts/sec +1"
@ -38,8 +41,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_mana_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=2;type="FLAT"}'
lores:
0:
- "&eMana regen in pts/sec +2"
@ -58,8 +63,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_mana_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=2;type="FLAT"}'
lores:
0:
- "&eMana regen in pts/sec +2"
@ -77,8 +84,10 @@ nodes:
is-root: true
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_health_regeneration1
experience-table:
first_table_item:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=1;type="FLAT"}'
lores:
0:
- "&eHealth regen in pts/sec +1"
@ -98,8 +107,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_health_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=2;type="FLAT"}'
lores:
0:
- "&eHealth regen in pts/sec +2"
@ -119,8 +130,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_health_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=2;type="FLAT"}'
lores:
0:
- "&eHealth regen in pts/sec +2"
@ -138,8 +151,10 @@ nodes:
is-root: true
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_cooldown_reduction5
experience-table:
first_table_item:
triggers:
- 'stat{stat="COOLDOWN_REDUCTION";amount=5;type="FLAT"}'
lores:
0:
- "&eReduces cooldowns of item and player skills (5%)"
@ -159,8 +174,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_cooldown_reduction10
experience-table:
first_table_item:
triggers:
- 'stat{stat="COOLDOWN_REDUCTION";amount=10;type="FLAT"}'
lores:
0:
- "&eReduces cooldowns of item and player skills (10%)"
@ -180,8 +197,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_cooldown_reduction15
experience-table:
first_table_item:
triggers:
- 'stat{stat="COOLDOWN_REDUCTION";amount=15;type="FLAT"}'
lores:
0:
- "&eReduces cooldowns of item and player skills (15%)"
@ -204,8 +223,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_critical_strike_chance1
experience-table:
first_table_item:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=2;type="FLAT"}'
lores:
0:
- "&eCritical Strikes deal more damage in +%2 chance"
@ -225,8 +246,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_critical_strike_chance2
experience-table:
first_table_item:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=3;type="FLAT"}'
lores:
0:
- "&eCritical Strikes deal more damage in % chance"
@ -246,8 +269,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_critical_strike_chance5
experience-table:
first_table_item:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=5;type="FLAT"}'
lores:
0:
- "&eCritical Strikes deal more damage in % chance"
@ -269,8 +294,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_damage_reduction1
experience-table:
first_table_item:
triggers:
- 'stat{stat="DAMAGE_REDUCTION";amount=1;type="FLAT"}'
lores:
0:
- "&eReduces damage from any source in %."
@ -290,8 +317,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_damage_reduction2
experience-table:
first_table_item:
triggers:
- 'stat{stat="DAMAGE_REDUCTION";amount=2;type="FLAT"}'
lores:
0:
- "&eReduces damage from any source in %."
@ -311,8 +340,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_damage_reduction2
experience-table:
first_table_item:
triggers:
- 'stat{stat="DAMAGE_REDUCTION";amount=2;type="FLAT"}'
lores:
0:
- "&eReduces damage from any source in %."
@ -333,8 +364,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_weapon_damage1
experience-table:
first_table_item:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=1;type="FLAT"}'
lores:
0:
- "&eAdditional on-hit weapon damage in +%1."
@ -354,8 +387,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_weapon_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=2;type="FLAT"}'
lores:
0:
- "&eAdditional on-hit weapon damage in +%2."
@ -375,8 +410,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_weapon_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=2;type="FLAT"}'
lores:
0:
- "&eAdditional on-hit weapon damage in +%2."
@ -398,8 +435,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_lifesteal3
experience-table:
first_table_item:
triggers:
- 'stat{stat="LIFESTEAL";amount=3;type="FLAT"}'
lores:
0:
- "&ePercentage of damage you gain back as health when inflicting weapon damage."
@ -420,8 +459,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_max_health5
experience-table:
first_table_item:
triggers:
- 'stat{stat="LIFESTEAL";amount=5;type="FLAT"}'
lores:
0:
- "&eAdditional amount of health in +%5"
@ -441,8 +482,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
point-consumed: 1
experience-table: skilltree_magic_damage3
experience-table:
first_table_item:
triggers:
- 'stat{stat="LIFESTEAL";amount=3;type="FLAT"}'
lores:
0:
- "&eAdditional magic skill damage in +%3"

View File

@ -19,7 +19,10 @@ nodes:
is-root: true
size: 1
point-consumed: 1
experience-table: skilltree_mana_regeneration1
experience-table:
first_table_item:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=1;type="FLAT"}'
lores:
0:
- "&eMana regen in pts/sec +1"
@ -38,7 +41,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_mana_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=2;type="FLAT"}'
lores:
0:
- "&eMana regen in pts/sec +2"
@ -57,7 +63,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_mana_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MANA_REGENERATION";amount=2;type="FLAT"}'
lores:
0:
- "&eMana regen in pts/sec +2"
@ -79,7 +88,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_skill_damage5
experience-table:
first_table_item:
triggers:
- 'stat{stat="SKILL_DAMAGE";amount=5;type="FLAT"}'
lores:
0:
- "&eAdditional ability damage in +%5"
@ -98,7 +110,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_skill_damage5
experience-table:
first_table_item:
triggers:
- 'stat{stat="SKILL_DAMAGE";amount=5;type="FLAT"}'
lores:
0:
- "&eAdditional ability damage in +%5"
@ -117,7 +132,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_skill_damage10
experience-table:
first_table_item:
triggers:
- 'stat{stat="SKILL_DAMAGE";amount=10;type="FLAT"}'
lores:
0:
- "&eAdditional ability damage in +%10"
@ -139,7 +157,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_spell_vampirism2
experience-table:
first_table_item:
triggers:
- 'stat{stat="SPELL_VAMPIRISM";amount=2;type="FLAT"}'
lores:
0:
- "&ePercentage of damage you gain back as health when inflicting skill damage +%2"
@ -158,7 +179,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_spell_vampirism2
experience-table:
first_table_item:
triggers:
- 'stat{stat="SPELL_VAMPIRISM";amount=2;type="FLAT"}'
lores:
0:
- "&ePercentage of damage you gain back as health when inflicting skill damage +%2"
@ -177,7 +201,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_spell_vampirism6
experience-table:
first_table_item:
triggers:
- 'stat{stat="SPELL_VAMPIRISM";amount=6;type="FLAT"}'
lores:
0:
- "&ePercentage of damage you gain back as health when inflicting skill damage +%6"
@ -199,7 +226,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_additional_experience2
experience-table:
first_table_item:
triggers:
- 'stat{stat="ADDITIONAL_EXPERIENCE";amount=2;type="FLAT"}'
lores:
0:
- "&eAdditional MMOCore main class experience +%2"
@ -218,7 +248,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_additional_experience3
experience-table:
first_table_item:
triggers:
- 'stat{stat="ADDITIONAL_EXPERIENCE";amount=3;type="FLAT"}'
lores:
0:
- "&eAdditional MMOCore main class experience +%3"
@ -237,7 +270,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_additional_experience5
experience-table:
first_table_item:
triggers:
- 'stat{stat="ADDITIONAL_EXPERIENCE";amount=5;type="FLAT"}'
lores:
0:
- "&eAdditional MMOCore main class experience +%5"
@ -259,7 +295,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_magic_damage_reduction5
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAGIC_DAMAGE_REDUCTION";amount=5;type="FLAT"}'
lores:
0:
- "&eReduce magic damage dealt by potions %5"
@ -278,7 +317,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_magic_damage_reduction5
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAGIC_DAMAGE_REDUCTION";amount=5;type="FLAT"}'
lores:
0:
- "&eReduce magic damage dealt by potions %5"
@ -297,7 +339,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_magic_damage_reduction10
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAGIC_DAMAGE_REDUCTION";amount=10;type="FLAT"}'
lores:
0:
- "&eReduce magic damage dealt by potions %10"
@ -319,7 +364,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_skill_critical_strike_chance5
experience-table:
first_table_item:
triggers:
- 'stat{stat="SKILL_CRITICAL_STRIKE_CHANCE";amount=5;type="FLAT"}'
lores:
0:
- "&eIncreases the chance of dealing skill crits +%5"
@ -338,7 +386,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_skill_critical_strike_chance10
experience-table:
first_table_item:
triggers:
- 'stat{stat="SKILL_CRITICAL_STRIKE_CHANCE";amount=10;type="FLAT"}'
lores:
0:
- "&eIncreases the chance of dealing skill crits +%10"
@ -357,7 +408,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_skill_critical_strike_chance15
experience-table:
first_table_item:
triggers:
- 'stat{stat="SKILL_CRITICAL_STRIKE_CHANCE";amount=15;type="FLAT"}'
lores:
0:
- "&eIncreases the chance of dealing skill crits +%15"
@ -379,7 +433,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_magic_damage1
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAGIC_DAMAGE";amount=1;type="FLAT"}'
lores:
0:
- "&eAdditional magic skill damage in +%1"
@ -398,7 +455,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_magic_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAGIC_DAMAGE";amount=2;type="FLAT"}'
lores:
0:
- "&eAdditional magic skill damage in +%2"
@ -417,7 +477,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_magic_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MAGIC_DAMAGE";amount=2;type="FLAT"}'
lores:
0:
- "&eAdditional magic skill damage in +%2"

View File

@ -19,7 +19,10 @@ nodes:
is-root: true
size: 1
point-consumed: 1
experience-table: skilltree_additional_experience2
experience-table:
first_table_item:
triggers:
- 'stat{stat="ADDITIONAL_EXPERIENCE";amount=2;type="FLAT"}'
lores:
0:
- "&eAdditional MMOCore main class experience +%2"
@ -38,7 +41,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_additional_experience3
experience-table:
first_table_item:
triggers:
- 'stat{stat="ADDITIONAL_EXPERIENCE";amount=3;type="FLAT"}'
lores:
0:
- "&eAdditional MMOCore main class experience +%3"
@ -57,7 +63,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_additional_experience5
experience-table:
first_table_item:
triggers:
- 'stat{stat="ADDITIONAL_EXPERIENCE";amount=5;type="FLAT"}'
lores:
0:
- "&eAdditional MMOCore main class experience +%5"
@ -79,7 +88,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_arrow_velocity10
experience-table:
first_table_item:
triggers:
- 'stat{stat="ARROW_VELOCITY";amount=10;type="RELATIVE"}'
lores:
0:
- "&eDetermines how far your weapon can shoot +%10"
@ -98,7 +110,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_arrow_velocity15
experience-table:
first_table_item:
triggers:
- 'stat{stat="ARROW_VELOCITY";amount=15;type="RELATIVE"}'
lores:
0:
- "&eDetermines how far your weapon can shoot +%15"
@ -117,7 +132,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_arrow_velocity25
experience-table:
first_table_item:
triggers:
- 'stat{stat="ARROW_VELOCITY";amount=25;type="RELATIVE"}'
lores:
0:
- "&eDetermines how far your weapon can shoot +%25"
@ -139,7 +157,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_lifesteal1
experience-table:
first_table_item:
triggers:
- 'stat{stat="LIFESTEAL";amount=2;type="FLAT"}'
lores:
0:
- "&ePercentage of damage you gain back as health when inflicting weapon damage +%1"
@ -158,7 +179,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_lifesteal2
experience-table:
first_table_item:
triggers:
- 'stat{stat="LIFESTEAL";amount=2;type="FLAT"}'
lores:
0:
- "&ePercentage of damage you gain back as health when inflicting weapon damage +%2"
@ -177,7 +201,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_lifesteal2
experience-table:
first_table_item:
triggers:
- 'stat{stat="LIFESTEAL";amount=2;type="FLAT"}'
lores:
0:
- "&ePercentage of damage you gain back as health when inflicting weapon damage +%2"
@ -199,7 +226,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_knockback_resistance5
experience-table:
first_table_item:
triggers:
- 'stat{stat="KNOCKBACK_RESISTANCE";amount=5;type="FLAT"}'
lores:
0:
- "&eThe chance of you to block the knockback +%5"
@ -218,7 +248,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_knockback_resistance5
experience-table:
first_table_item:
triggers:
- 'stat{stat="KNOCKBACK_RESISTANCE";amount=5;type="FLAT"}'
lores:
0:
- "&eThe chance of you to block the knockback +%5"
@ -237,7 +270,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_knockback_resistance10
experience-table:
first_table_item:
triggers:
- 'stat{stat="KNOCKBACK_RESISTANCE";amount=5;type="FLAT"}'
lores:
0:
- "&eThe chance of you to block the knockback +%5"
@ -259,7 +295,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_critical_strike_chance2
experience-table:
first_table_item:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=2;type="FLAT"}'
lores:
0:
- "&eCritical Strikes deal more damage in +%2 chance"
@ -278,7 +317,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_critical_strike_chance3
experience-table:
first_table_item:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=3;type="FLAT"}'
lores:
0:
- "&eCritical Strikes deal more damage in +%3 chance"
@ -297,7 +339,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_critical_strike_chance5
experience-table:
first_table_item:
triggers:
- 'stat{stat="CRITICAL_STRIKE_CHANCE";amount=5;type="FLAT"}'
lores:
0:
- "&eCritical Strikes deal more damage in +%5 chance"
@ -319,7 +364,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_movement_speed2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MOVEMENT_SPEED";amount=2;type="RELATIVE"}'
lores:
0:
- "&eMovement Speed increase walk speed. +%2"
@ -338,7 +386,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_movement_speed2
experience-table:
first_table_item:
triggers:
- 'stat{stat="MOVEMENT_SPEED";amount=2;type="RELATIVE"}'
lores:
0:
- "&eMovement Speed increase walk speed. +%2"
@ -357,7 +408,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_movement_speed6
experience-table:
first_table_item:
triggers:
- 'stat{stat="MOVEMENT_SPEED";amount=6;type="RELATIVE"}'
lores:
0:
- "&eMovement Speed increase walk speed. +%6"
@ -379,7 +433,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_projectile_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="PROJECTILE_DAMAGE";amount=2;type="RELATIVE"}'
lores:
0:
- "&eAdditional skill/weapon projectile damage +%2"
@ -398,7 +455,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_projectile_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="PROJECTILE_DAMAGE";amount=2;type="RELATIVE"}'
lores:
0:
- "&eAdditional skill/weapon projectile damage +%2"
@ -417,7 +477,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_projectile_damage6
experience-table:
first_table_item:
triggers:
- 'stat{stat="PROJECTILE_DAMAGE";amount=6;type="RELATIVE"}'
lores:
0:
- "&eAdditional skill/weapon projectile damage +%6"

View File

@ -19,7 +19,10 @@ nodes:
is-root: true
size: 1
point-consumed: 1
experience-table: skilltree_attack_speed5
experience-table:
first_table_item:
triggers:
- 'stat{stat="ATTACK_SPEED";amount=5;type="RELATIVE"}'
lores:
0:
- "&eThe speed at which your weapon strikes. +%5"
@ -38,7 +41,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_attack_speed10
experience-table:
first_table_item:
triggers:
- 'stat{stat="ATTACK_SPEED";amount=10;type="RELATIVE"}'
lores:
0:
- "&eThe speed at which your weapon strikes. +%10"
@ -57,7 +63,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_attack_speed15
experience-table:
first_table_item:
triggers:
- 'stat{stat="ATTACK_SPEED";amount=15;type="RELATIVE"}'
lores:
0:
- "&eThe speed at which your weapon strikes. +%15"
@ -79,12 +88,15 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_health_regeneration1
experience-table:
first_table_item:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=1;type="FLAT"}'
lores:
0:
- "&eCCC"
- "&eIncreases health regeneration by 1%"
1:
- "&eCCC"
- "&eIncreases health regeneration by 1%"
b2:
name: 'Health Regeneration'
coordinates:
@ -98,12 +110,15 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_health_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=1;type="FLAT"}'
lores:
0:
- "&eCCC"
- "&eIncreases health regeneration by 1%"
1:
- "&eCCC"
- "&eIncreases health regeneration by 1%"
b3:
name: 'Health Regeneration'
coordinates:
@ -117,12 +132,15 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_health_regeneration2
experience-table:
first_table_item:
triggers:
- 'stat{stat="HEALTH_REGENERATION";amount=2;type="FLAT"}'
lores:
0:
- "&eCCC"
- "&eIncreases health regeneration by 2%"
1:
- "&eCCC"
- "&eIncreases health regeneration by 2%"
## C
@ -139,7 +157,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_physical_damage_reduction5
experience-table:
first_table_item:
triggers:
- 'stat{stat="PHYSICAL_DAMAGE_REDUCTION";amount=5;type="FLAT"}'
lores:
0:
- "&eReduces physical damage In -%5"
@ -158,7 +179,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_physical_damage_reduction10
experience-table:
first_table_item:
triggers:
- 'stat{stat="PHYSICAL_DAMAGE_REDUCTION";amount=10;type="FLAT"}'
lores:
0:
- "&eReduces physical damage In -%10"
@ -177,7 +201,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_physical_damage_reduction15
experience-table:
first_table_item:
triggers:
- 'stat{stat="PHYSICAL_DAMAGE_REDUCTION";amount=15;type="FLAT"}'
lores:
0:
- "&eReduces physical damage In -%15"
@ -199,7 +226,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_parry_rating5
experience-table:
first_table_item:
triggers:
- 'stat{stat="PARRY_RATING";amount=5;type="FLAT"}'
lores:
0:
- "&eThe chance to parry an attack. Parrying negates the damage and knocks the attacker back +%5"
@ -218,7 +248,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_parry_rating5
experience-table:
first_table_item:
triggers:
- 'stat{stat="PARRY_RATING";amount=5;type="FLAT"}'
lores:
0:
- "&eThe chance to parry an attack. Parrying negates the damage and knocks the attacker back +%5"
@ -237,7 +270,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_parry_rating10
experience-table:
first_table_item:
triggers:
- 'stat{stat="PARRY_RATING";amount=5;type="FLAT"}'
lores:
0:
- "&eThe chance to parry an attack. Parrying negates the damage and knocks the attacker back +%10"
@ -259,7 +295,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_knockback_resistance5
experience-table:
first_table_item:
triggers:
- 'stat{stat="KNOCKBACK_RESISTANCE";amount=5;type="FLAT"}'
lores:
0:
- "&eThe chance of you to block the knockback +%5"
@ -278,7 +317,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_knockback_resistance5
experience-table:
first_table_item:
triggers:
- 'stat{stat="KNOCKBACK_RESISTANCE";amount=5;type="FLAT"}'
lores:
0:
- "&eThe chance of you to block the knockback +%5"
@ -297,7 +339,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_knockback_resistance10
experience-table:
first_table_item:
triggers:
- 'stat{stat="KNOCKBACK_RESISTANCE";amount=10;type="FLAT"}'
lores:
0:
- "&eThe chance of you to block the knockback +%10"
@ -319,7 +364,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_dodge_rating2
experience-table:
first_table_item:
triggers:
- 'stat{stat="DODGE_RATING";amount=2;type="FLAT"}'
lores:
0:
- "&eThe change to dodge an attack. Dodging completely negates the attack damage. +%2"
@ -338,7 +386,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_dodge_rating3
experience-table:
first_table_item:
triggers:
- 'stat{stat="DODGE_RATING";amount=3;type="FLAT"}'
lores:
0:
- "&eThe change to dodge an attack. Dodging completely negates the attack damage. +%3"
@ -357,7 +408,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_dodge_rating5
experience-table:
first_table_item:
triggers:
- 'stat{stat="DODGE_RATING";amount=5;type="FLAT"}'
lores:
0:
- "&eThe change to dodge an attack. Dodging completely negates the attack damage. +%5"
@ -379,7 +433,10 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_weapon_damage1
experience-table:
first_table_item:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=1;type="FLAT"}'
lores:
0:
- "&eAdditional on-hit weapon damage in +%1."
@ -398,12 +455,15 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_weapon_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=2;type="FLAT"}'
lores:
0:
- "&eAdditional on-hit weapon damage in +%1."
- "&eAdditional on-hit weapon damage in +%2."
1:
- "&eAdditional on-hit weapon damage in +%1."
- "&eAdditional on-hit weapon damage in +%2."
g3:
name: 'Weapon Damage'
coordinates:
@ -417,12 +477,15 @@ nodes:
max-level: 1
size: 1
point-consumed: 1
experience-table: skilltree_weapon_damage2
experience-table:
first_table_item:
triggers:
- 'stat{stat="WEAPON_DAMAGE";amount=2;type="FLAT"}'
lores:
0:
- "&eAdditional on-hit weapon damage in +%1."
- "&eAdditional on-hit weapon damage in +%2."
1:
- "&eAdditional on-hit weapon damage in +%1."
- "&eAdditional on-hit weapon damage in +%2."