Skill Unlocking Mechanic.

This commit is contained in:
Ka0rX 2023-03-21 16:49:17 +01:00
parent 37bb719381
commit aaa777267d
3 changed files with 31 additions and 21 deletions

View File

@ -166,11 +166,11 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
MMOCore.log(Level.SEVERE, "[Userdata] Could not find class " + getProfess().getId() + " while refreshing player data."); MMOCore.log(Level.SEVERE, "[Userdata] Could not find class " + getProfess().getId() + " while refreshing player data.");
} }
Iterator<Integer> ite=boundSkills.keySet().iterator(); Iterator<Integer> ite = boundSkills.keySet().iterator();
while (ite.hasNext()) while (ite.hasNext())
try { try {
int slot=ite.next(); int slot = ite.next();
BoundSkillInfo boundSkillInfo=new BoundSkillInfo(boundSkills.get(slot)); BoundSkillInfo boundSkillInfo = new BoundSkillInfo(boundSkills.get(slot));
boundSkills.put(slot, boundSkillInfo); boundSkills.put(slot, boundSkillInfo);
} catch (Exception ignored) { } catch (Exception ignored) {
} }
@ -222,9 +222,9 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
@Override @Override
public Map<Integer, String> mapBoundSkills() { public Map<Integer, String> mapBoundSkills() {
Map<Integer,String> result= new HashMap<>(); Map<Integer, String> result = new HashMap<>();
for(int slot:boundSkills.keySet()) for (int slot : boundSkills.keySet())
result.put(slot,boundSkills.get(slot).getClassSkill().getSkill().getHandler().getId()); result.put(slot, boundSkills.get(slot).getClassSkill().getSkill().getHandler().getId());
return result; return result;
} }
@ -534,20 +534,18 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
/** /**
* @return If the item is unlocked by the player * @return If the item is unlocked by the player
* @deprecated Not used yet * This is used for skills that can be locked & unlocked.
*/ */
@Deprecated
public boolean hasUnlocked(Unlockable unlockable) { public boolean hasUnlocked(Unlockable unlockable) {
return unlockedItems.contains(unlockable.getUnlockNamespacedKey()); return unlockedItems.contains(unlockable.getUnlockNamespacedKey());
} }
/** /**
* Unlocks an item for the player * Unlocks an item for the player. This is mainly used to unlock skills.
* *
* @return If the item was already unlocked when calling this method * @return If the item was already unlocked when calling this method
* @deprecated Not used yet
*/ */
@Deprecated
public boolean unlock(Unlockable unlockable) { public boolean unlock(Unlockable unlockable) {
return unlockedItems.add(unlockable.getUnlockNamespacedKey()); return unlockedItems.add(unlockable.getUnlockNamespacedKey());
} }
@ -1067,7 +1065,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
public void refreshBoundedSkill(String skill) { public void refreshBoundedSkill(String skill) {
boundSkills.values() boundSkills.values()
.stream() .stream()
.filter(skillInfo->skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill)) .filter(skillInfo -> skillInfo.getClassSkill().getSkill().getHandler().getId().equals(skill))
.forEach(BoundSkillInfo::refresh); .forEach(BoundSkillInfo::refresh);
} }
@ -1140,7 +1138,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
} }
public ClassSkill getBoundSkill(int slot) { public ClassSkill getBoundSkill(int slot) {
return boundSkills.containsKey(slot) ? boundSkills.get(slot).getClassSkill():null; return boundSkills.containsKey(slot) ? boundSkills.get(slot).getClassSkill() : null;
} }
@ -1173,7 +1171,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
} }
public void unbindSkill(int slot) { public void unbindSkill(int slot) {
BoundSkillInfo boundSkillInfo=boundSkills.remove(slot); BoundSkillInfo boundSkillInfo = boundSkills.remove(slot);
boundSkillInfo.unbind(); boundSkillInfo.unbind();
} }

View File

@ -323,7 +323,10 @@ public class SkillList extends EditableInventory {
public SkillViewerInventory(PlayerData playerData, EditableInventory editable) { public SkillViewerInventory(PlayerData playerData, EditableInventory editable) {
super(playerData, editable); super(playerData, editable);
skills = new ArrayList<>(playerData.getProfess().getSkills()); skills = playerData.getProfess().getSkills()
.stream()
.filter((classSkill)->playerData.hasUnlocked(classSkill.getSkill()))
.collect(Collectors.toList());
skillSlots = getEditable().getByFunction("skill").getSlots(); skillSlots = getEditable().getByFunction("skill").getSlots();
Validate.notNull(getEditable().getByFunction("slot"), "Your skill GUI config file is out-of-date, please regenerate it."); Validate.notNull(getEditable().getByFunction("slot"), "Your skill GUI config file is out-of-date, please regenerate it.");
slotSlots = getEditable().getByFunction("slot").getSlots(); slotSlots = getEditable().getByFunction("slot").getSlots();

View File

@ -17,6 +17,7 @@ import java.util.*;
public class ClassSkill implements CooldownObject { public class ClassSkill implements CooldownObject {
private final RegisteredSkill skill; private final RegisteredSkill skill;
private final int unlockLevel, maxSkillLevel; private final int unlockLevel, maxSkillLevel;
private final boolean unlockedByDefault;
private final Map<String, LinearValue> modifiers = new HashMap<>(); private final Map<String, LinearValue> modifiers = new HashMap<>();
@Deprecated @Deprecated
@ -32,10 +33,14 @@ public class ClassSkill implements CooldownObject {
* It is also used by the MMOCore API to force players to cast abilities. * It is also used by the MMOCore API to force players to cast abilities.
*/ */
public ClassSkill(RegisteredSkill skill, int unlockLevel, int maxSkillLevel) { public ClassSkill(RegisteredSkill skill, int unlockLevel, int maxSkillLevel) {
this(skill, unlockLevel, maxSkillLevel, true);
}
public ClassSkill(RegisteredSkill skill, int unlockLevel, int maxSkillLevel, boolean unlockedByDefault) {
this.skill = skill; this.skill = skill;
this.unlockLevel = unlockLevel; this.unlockLevel = unlockLevel;
this.maxSkillLevel = maxSkillLevel; this.maxSkillLevel = maxSkillLevel;
this.unlockedByDefault = unlockedByDefault;
for (String mod : skill.getHandler().getModifiers()) for (String mod : skill.getHandler().getModifiers())
this.modifiers.put(mod, skill.getModifierInfo(mod)); this.modifiers.put(mod, skill.getModifierInfo(mod));
} }
@ -44,7 +49,7 @@ public class ClassSkill implements CooldownObject {
this.skill = skill; this.skill = skill;
unlockLevel = config.getInt("level"); unlockLevel = config.getInt("level");
maxSkillLevel = config.getInt("max-level"); maxSkillLevel = config.getInt("max-level");
unlockedByDefault = config.getBoolean("unlocked-by-default", true);
for (String mod : skill.getHandler().getModifiers()) { for (String mod : skill.getHandler().getModifiers()) {
LinearValue defaultValue = skill.getModifierInfo(mod); LinearValue defaultValue = skill.getModifierInfo(mod);
this.modifiers.put(mod, config.isConfigurationSection(mod) ? readLinearValue(defaultValue, config.getConfigurationSection(mod)) : defaultValue); this.modifiers.put(mod, config.isConfigurationSection(mod) ? readLinearValue(defaultValue, config.getConfigurationSection(mod)) : defaultValue);
@ -68,6 +73,10 @@ public class ClassSkill implements CooldownObject {
return maxSkillLevel; return maxSkillLevel;
} }
public boolean isUnlockedByDefault() {
return unlockedByDefault;
}
/** /**
* This method can only override default modifiers and * This method can only override default modifiers and
* will throw an error when trying to define non existing modifiers * will throw an error when trying to define non existing modifiers