RuneHive-Game
Loading...
Searching...
No Matches
SkillManager.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.skill;
2
3import com.runehive.Config;
4import com.runehive.content.WellOfGoodwill;
5import com.runehive.content.achievement.AchievementHandler;
6import com.runehive.content.achievement.AchievementKey;
7import com.runehive.content.event.InteractionEvent;
8import com.runehive.content.lms.LMSGame;
9import com.runehive.content.skill.impl.cooking.Cooking;
10import com.runehive.content.skill.impl.crafting.Crafting;
11import com.runehive.content.skill.impl.farming.Farming;
12import com.runehive.content.skill.impl.firemaking.Firemaking;
13import com.runehive.content.skill.impl.fishing.Fishing;
14import com.runehive.content.skill.impl.fletching.Fletching;
15import com.runehive.content.skill.impl.herblore.Herblore;
16import com.runehive.content.skill.impl.hunter.Hunter;
17import com.runehive.content.skill.impl.mining.Mining;
18import com.runehive.content.skill.impl.prayer.BoneSacrifice;
19import com.runehive.content.skill.impl.runecrafting.Runecraft;
20import com.runehive.content.skill.impl.smithing.Smelting;
21import com.runehive.content.skill.impl.smithing.Smithing;
22import com.runehive.content.skill.impl.thieving.Thieving;
23import com.runehive.content.skill.impl.woodcutting.Woodcutting;
24import com.runehive.game.Graphic;
25import com.runehive.game.UpdatePriority;
26import com.runehive.game.world.World;
27import com.runehive.game.world.entity.EntityType;
28import com.runehive.game.world.entity.mob.Mob;
29import com.runehive.game.world.entity.mob.UpdateFlag;
30import com.runehive.game.world.entity.mob.player.Player;
31import com.runehive.game.world.entity.mob.prayer.Prayer;
32import com.runehive.net.packet.out.*;
33import com.runehive.util.Utility;
34
35import java.util.LinkedList;
36import java.util.List;
37import java.util.function.Function;
38import java.util.stream.IntStream;
39
40/**
41 * Manages all skills related to an mob.
42 *
43 * @author Michael | Chex
44 */
45public class SkillManager {
46
47 /** The mob to manage for. */
48 private final Mob mob;
49
50 /** The experience counter. */
51 public double experienceCounter;
52
53 /** An array of skills that belong to an mob. */
54 private Skill[] skills;
55
56 /** The mob's combat level. */
57 private double combatLevel;
58
59 /** Constructs a new {@code SkillManager} object. */
61 this.mob = mob;
62 this.skills = new Skill[mob.isPlayer() ? Skill.SKILL_COUNT : 7];
63 for (int index = 0; index < skills.length; index++) {
64 boolean hitpoints = mob.isPlayer() && index == 3;
65 skills[index] = hitpoints ? new Skill(index, 10, 1154) : new Skill(index, 1, 0);
66 }
67 if (mob.isPlayer()) {
68 skills[Skill.HUNTER] = new Hunter(1, 0);
69 skills[Skill.COOKING] = new Cooking(1, 0);
70 skills[Skill.HERBLORE] = new Herblore(1, 0);
71 skills[Skill.CRAFTING] = new Crafting(1, 0);
72 skills[Skill.THIEVING] = new Thieving(1, 0);
73 skills[Skill.FLETCHING] = new Fletching(1, 0);
74 skills[Skill.PRAYER] = new BoneSacrifice(1, 0);
75 skills[Skill.FIREMAKING] = new Firemaking(1, 0);
77 skills[Skill.MINING] = new Mining(1, 0);
79 skills[Skill.SMITHING] = new Smithing(1, 0);
80 skills[Skill.FISHING] = new Fishing(1, 0);
81 }
82 }
83
84 /** Calculates the combat level of an mob. */
85 public static double calculateCombat(int attack, int defence, int strength, int hp, int prayer, int ranged, int magic) {
86 int combat = (defence + hp + prayer / 2) * 250;
87 int melee = (attack + strength) * 325;
88 int range = (ranged / 2 + ranged) * 325;
89 int mage = (magic / 2 + magic) * 325;
90 combat += Math.max(Math.max(melee, range), mage);
91 return combat / 1000.0;
92 }
93
94 /** Gets the skill for an id. */
95 public Skill get(int id) {
96 if (id < 0 || id >= skills.length) {
97 throw new IllegalArgumentException("The skill id is out of bounds! id=" + id);
98 }
99 return skills[id];
100 }
101
102 /** Gets the level of a skill. */
103 public int getLevel(int id) {
104 return get(id).getLevel();
105 }
106
107 /** Gets the highest possible level of a skill. */
108 public int getMaxLevel(int id) {
109 return get(id).getMaxLevel();
110 }
111
112 /** Sets the level of a skill. */
113 public void setLevel(int id, int level) {
114 get(id).setLevel(level);
115 refresh(id);
116 }
117
118 /** Sets the max level of a skill. */
119 public void setMaxLevel(int id, int level) {
121 if (mob.isPlayer() && id <= Skill.MAGIC && !mob.getPlayer().quickPrayers.getEnabled().isEmpty()) {
122 List<Prayer> deactivate = new LinkedList<>();
123 for (Prayer prayer : mob.getPlayer().quickPrayers.getEnabled())
124 if (!prayer.canToggle(mob.getPlayer()))
125 deactivate.add(prayer);
126 if (!deactivate.isEmpty())
127 mob.getPlayer().quickPrayers.deactivate(deactivate.toArray(new Prayer[deactivate.size()]));
128 }
129 }
130
131 /** Sets the experience for a skill. */
132 public void setExperience(int id, double experience) {
133 Skill skill = get(id);
134 int level = Skill.getLevelForExperience(experience);
135 skill.setLevel(level);
136 skill.setMaxLevel(level);
137 skill.setExperience(experience);
138 refresh(id);
139 }
140
141 /** Sets the experience for a npc skill. */
142 public void setNpcMaxLevel(int id, int level) {
143 Skill skill = get(id);
144 skill.setLevel(level);
145 skill.setMaxLevel(level);
146 }
147
148 /** Sets the level of a skill. */
149 public void modifyLevel(Function<Integer, Integer> modification, int id, int lowerBound, int upperBound) {
150 Skill skill = get(id);
151 skill.modifyLevel(modification, lowerBound, upperBound);
152 }
153
154 /** Handles regressing the skills. */
155 public void regress(int skill) {
156 Skill s = get(skill);
157 if (s.getLevel() > s.getMaxLevel()) {
158 s.modifyLevel(level -> level - 1, 0, s.getLevel());
159 refresh(skill);
160 } else if (s.getLevel() < s.getMaxLevel()) {
161 s.modifyLevel(level -> level + 1, 0, s.getMaxLevel());
162 refresh(skill);
163 }
164 }
165
166 /** Sets the level of a skill. */
167 public void modifyLevel(Function<Integer, Integer> modification, int id) {
168 Skill skill = get(id);
169 skill.modifyLevel(modification);
170 }
171
172 /** Gets the total level of the mob. */
173 public int getTotalLevel() {
174 int total = 0;
175 for (Skill skill : skills) {
176 total += skill.getMaxLevel();
177 }
178 return total;
179 }
180
181 public long getTotalXp() {
182 long totalXp = 0;
183 for (Skill skill : skills) {
184 totalXp += skill.getExperience();
185 }
186 return totalXp;
187 }
188
189 /** Refreshes all the skills for the mob. */
190 public void refresh() {
191 for (final Skill skill : skills) {
192 refresh(skill.getSkill());
193 }
194 }
195
196 /** Restores a specific skill. */
197 public void restore(int id) {
198 Skill skill = get(id);
199 skill.setLevel(skill.getMaxLevel());
200 refresh(id);
201 }
202
203 /** Restores all the skills. */
204 public void restoreAll() {
205 IntStream.range(0, skills.length).forEach(this::restore);
206 }
207
208 /** Handles a player logging in. */
209 public void login() {
210 Smelting.clearInterfaces(mob.getPlayer());
211 refresh();
213 }
214
215 /** Handles mastering all skills. Only players should access this. */
216 public void master() {
217 for (int index = 0; index < Skill.SKILL_COUNT; index++) {
218 setMaxLevel(index, 99);
219 }
221 mob.updateFlags.add(UpdateFlag.APPEARANCE);
222 mob.getPlayer().send(new SendMessage("You have successfully mastered all skills."));
223 }
224
225 /** Refreshes a skill to a player's client if this class's mob is a player. */
226 public void refresh(int id) {
227 if (mob.isPlayer()) {
228 Skill skill = get(id);
229 mob.getPlayer().send(new SendSkill(skill));
230 }
231 }
232
233 /** Checks if the mob is maxed in all skills. */
234 public boolean isMaxed() {
235 int maxCount = Skill.SKILL_COUNT;
236 int count = 0;
237 for (int index = 0; index < maxCount; index++) {
238 if (getMaxLevel(index) >= 99) {
239 count++;
240 } else {
241 if (index == Skill.HUNTER)
242 count++;
243 if (index == Skill.FARMING)
244 count++;
245 if (index == Skill.CONSTRUCTION)
246 count++;
247 }
248 }
249 return count == maxCount;
250 }
251
252 /** The interactionEvent listener. */
253 public boolean onEvent(InteractionEvent interactionEvent) {
254 if (mob.is(EntityType.PLAYER)) {
255 Player player = (Player) mob;
256 boolean success = false;
257 for (final Skill skill : skills) {
258 success |= skill.onEvent(player, interactionEvent);
259 }
260 return success;
261 }
262 return false;
263 }
264
265 /** Adds experience to a given skill. The skill level will increase if the experience causes the skill to level up. */
266 public void addExperience(int id, double experience) {
267 addExperience(id, experience, true);
268 }
269
270 /** Adds experience to a given skill. The skill level will increase if the experience causes the skill to level up. */
271 public void addExperience(int id, double experience, boolean levelUp) {
272 addExperience(id, experience, levelUp, true);
273 }
274
275 /** Adds experience to a given skill. The skill level will increase if the experience causes the skill to level up. */
276 public void addExperience(int id, double experience, boolean levelUp, boolean counter) {
277 if (!mob.isPlayer() || mob.getPlayer().settings.lockExperience)
278 return;
279 Player player = (Player) mob;
280
281 Skill skill = get(id);
282 double old = skill.getExperience();
283 double modified_experience = experience;
284
285 if(LMSGame.inGameArea(player)) {
286 player.send(new SendExpCounter(skill.getSkill(), (int) modified_experience, counter));
287 return;
288 }
289
290 double bonusXp = 0;
291 switch(id) {
292 case Skill.FARMING:
293 bonusXp = Math.ceil((experience * Farming.getBonus(player)) / 100);
294 break;
295 case Skill.FISHING:
296 bonusXp = Math.ceil((experience * Fishing.getBonus(player)) / 100);
297 break;
298 case Skill.MINING:
299 bonusXp = Math.ceil((experience * Mining.getBonus(player)) / 100);
300 break;
301 case Skill.PRAYER:
302 bonusXp = Math.ceil((experience * Prayer.getBonus(player)) / 100);
303 break;
304 case Skill.FIREMAKING:
305 bonusXp = Math.ceil((experience * Firemaking.getBonus(player)) / 100);
306 break;
307 case Skill.WOODCUTTING:
308 bonusXp = Math.ceil((experience * Woodcutting.getBonus(player)) / 100);
309 break;
310 }
311
312 modified_experience += bonusXp;
313
315 modified_experience *= 2;
316 }
317
318 int maxLevel = Skill.getLevelForExperience(old);
319 SkillData skillData = SkillData.values()[id];
320 boolean combatSkill = skillData.isCombatSkill();
321
322 if (counter) {
323 experienceCounter += modified_experience;
324 }
325
326 player.send(new SendExpCounter(skill.getSkill(), (int) modified_experience, counter));
327
328 int newMax = Skill.getLevelForExperience(skill.addExperience(modified_experience));
329 updateSkill(player, maxLevel, newMax, skill, levelUp, combatSkill);
330
331 if (skill.getExperience() >= 200_000_000) {
333 }
334
335 player.send(new SendSkill(skill));
336 }
337
338 /** Handles updating a skill. */
339 private void updateSkill(Player player, int maxLevel, int newMax, Skill skill, boolean levelUp, boolean combat) {
340 if (maxLevel < 99 && newMax != maxLevel) {
341 skill.setMaxLevel(newMax);
342
343 if (skill.getLevel() <= newMax) {
344 skill.modifyLevel(level -> (newMax - maxLevel) + level);
345 }
346
347 if (levelUp) {
348 if (newMax > 99) {
349 }
350
352 if (newMax == 99 && !combat) {
354 "<col=7B44B3>osroyale: <col=" + player.right.getColor() + ">" + player.getName() + " </col>has just reached level 99 in <col=7B44B3>" + Skill.getName(skill.getSkill()) + "</col> with a prestige of " +player.prestige.totalPrestige + "!");
355 // DiscordPlugin.sendSimpleMessage(player.getName() + " has just reached level 99 in " + Skill.getName(skill.getSkill()) + "!");
356 }
357 } else {
358 player.send(new SendMessage("Congratulations, you have reached " + Utility.getAOrAn(Skill.getName(skill.getSkill())) + " " + Skill.getName(skill.getSkill()) + " level of " + skill.getMaxLevel() + "."));
359 }
360
361 if (SkillData.values()[skill.getSkill()].isCombatSkill()) {
362 updateCombat();
363 }
364
365 if (skill.getMaxLevel() == 99) {
367 }
368
370 }
371 }
372
373 private void showLevelUpInterface(Player player, Skill skill) {
374 SkillData skillData = SkillData.values()[skill.getSkill()];
375 String line1 = "Congratulations! You've just advanced " + Utility.getAOrAn(skillData.toString()) + " " + skillData + " level!";
376 String line2 = "You have reached level " + skill.getMaxLevel() + "!";
377 player.send(new SendString(line1, skillData.getFirstLine()));
378 player.send(new SendString(line2, skillData.getSecondLine()));
379 player.send(new SendChatBoxInterface(skillData.getChatbox()));
380 if(skillData == SkillData.HUNTER) {
381 player.send(new SendMoveComponent(0, 5, 311));
382 player.send(new SendInterfaceConfig(311, 200, 9951));
383 }
384 if(skillData == SkillData.FARMING) {
385 player.send(new SendMoveComponent(0, 30, 311));
386 player.send(new SendInterfaceConfig(311, 200, 5340));
387 }
388 String name = Skill.getName(skill.getSkill());
389 player.send(new SendMessage("Congratulations, you just advanced " + Utility.getAOrAn(name) + " " + name + " level."));
390 player.graphic(new Graphic(199, UpdatePriority.VERY_HIGH));
391 player.dialogueFactory.setActive(true);
392 }
393
394 /** Handles updating the combat level. */
395 private void updateCombat() {
396 int oldLevel = (int) getCombatLevel();
398 int newLevel = (int) getCombatLevel();
399 if (newLevel != oldLevel) {
400 mob.updateFlags.add(UpdateFlag.APPEARANCE);
401 mob.getPlayer().send(new SendMessage("You've reached a combat level of " + newLevel + "."));
402 }
403 }
404
405 /** Sends all skills to this player's client. If the mob created with this object is not a player, no code will be executed. */
406 public void sendSkills() {
407 if (mob.is(EntityType.PLAYER)) {
408 Player player = (Player) mob;
409 for (Skill skill : skills) {
410 player.send(new SendSkill(skill));
411 }
412 }
413 }
414
415 public void resetSkilling() {
416 boolean doingSkill = false;
417 for (Skill skill : skills) {
418 if (skill.isDoingSkill()) {
419 doingSkill = true;
420 skill.setDoingSkill(false);
421 }
422 }
423 if (doingSkill) {
424 mob.resetAnimation();
425 }
426 }
427
428 /** Calculates the combat level of an mob. */
432
433 /** Gets the experience counter value. */
434 public int getExpCounter() {
435 return (int) Math.floor(experienceCounter);
436 }
437
438 /** Gets the mob's combat level. */
439 public int getCombatLevel() {
440 return (int) combatLevel;
441 }
442
443 /** Sets the mob's combat level. */
444 public void setCombatLevel() {
445 this.combatLevel = calculateCombat();
446 }
447
448 /** Gets the skills of the mob. */
449 public Skill[] getSkills() {
450 return skills;
451 }
452
453 /** Sets the skills of the mob. */
454 public void setSkills(Skill[] skills) {
455 this.skills = skills;
456 if (mob.isPlayer()) {
457 this.skills[Skill.HUNTER] = new Hunter(skills[Skill.HUNTER].getLevel(), skills[Skill.HUNTER].getExperience());
458 this.skills[Skill.PRAYER] = new BoneSacrifice(skills[Skill.PRAYER].getLevel(), skills[Skill.PRAYER].getExperience());
459 this.skills[Skill.COOKING] = new Cooking(skills[Skill.COOKING].getLevel(), skills[Skill.COOKING].getExperience());
460 this.skills[Skill.CRAFTING] = new Crafting(skills[Skill.CRAFTING].getLevel(), skills[Skill.CRAFTING].getExperience());
461 this.skills[Skill.THIEVING] = new Thieving(skills[Skill.THIEVING].getLevel(), skills[Skill.THIEVING].getExperience());
462 this.skills[Skill.HERBLORE] = new Herblore(skills[Skill.HERBLORE].getLevel(), skills[Skill.HERBLORE].getExperience());
463 this.skills[Skill.FLETCHING] = new Fletching(skills[Skill.FLETCHING].getLevel(), skills[Skill.FLETCHING].getExperience());
464 this.skills[Skill.FIREMAKING] = new Firemaking(skills[Skill.FIREMAKING].getLevel(), skills[Skill.FIREMAKING].getExperience());
465 this.skills[Skill.RUNECRAFTING] = new Runecraft(skills[Skill.RUNECRAFTING].getLevel(), skills[Skill.RUNECRAFTING].getExperience());
466 this.skills[Skill.MINING] = new Mining(skills[Skill.MINING].getLevel(), skills[Skill.MINING].getExperience());
467 this.skills[Skill.SMITHING] = new Smithing(skills[Skill.SMITHING].getLevel(), skills[Skill.SMITHING].getExperience());
468 this.skills[Skill.WOODCUTTING] = new Woodcutting(skills[Skill.WOODCUTTING].getLevel(), skills[Skill.WOODCUTTING].getExperience());
469 this.skills[Skill.FISHING] = new Fishing(skills[Skill.FISHING].getLevel(), skills[Skill.FISHING].getExperience());
470 }
471 }
472
473 @Override
474 public String toString() {
475 return super.toString();
476 }
477
478}
The class that contains setting-related constants for the server.
Definition Config.java:24
static boolean DOUBLE_EXPERIENCE
Definition Config.java:139
Handles contribution towards the well of goodwill.
static void activate(Player player, AchievementKey achievement)
Activates the achievement for the individual player.
static void set(Player player, AchievementKey achievement, int increase)
static boolean inGameArea(Player player)
Handles checking if the player is in the LMS game area.
Definition LMSGame.java:142
int totalPrestige
The total amount of prestiges.
Definition Prestige.java:32
static double getBonus(Player player)
Definition Farming.java:33
static double getBonus(Player player)
Definition Fishing.java:22
static double getBonus(Player player)
Definition Mining.java:31
Handles sacrificing bones to an altar.
static void clearInterfaces(Player player)
Sends the items on the smelting itemcontainer.
Definition Smelting.java:89
Represents a single graphic that can be used by entities.
Definition Graphic.java:10
Represents the game world.
Definition World.java:46
static void sendMessage(String... messages)
Sends a global message.
Definition World.java:396
Handles the mob class.
Definition Mob.java:66
Optional< Graphic > graphic
Definition Mob.java:91
This class represents a character controlled by a player.
Definition Player.java:125
String getName()
Gets the name of this entity.
Definition Player.java:774
Represents a trainable and usable skill.
Definition Skill.java:18
static final int WOODCUTTING
The woodcutting skill id.
Definition Skill.java:45
static String getName(int skill)
Gets the name for a skill id.
Definition Skill.java:465
static final byte getLevelForExperience(double experience)
Gets the level for a given experience amount.
Definition Skill.java:446
void modifyLevel(Function< Integer, Integer > function)
Modifies the current level with a given function.
Definition Skill.java:281
static final int PRAYER
The prayer skill id.
Definition Skill.java:36
static final int RANGED
The ranged skill id.
Definition Skill.java:33
static final int CRAFTING
The crafting skill id.
Definition Skill.java:57
static final int HERBLORE
The herblore skill id.
Definition Skill.java:66
static final int SMITHING
The smithing skill id.
Definition Skill.java:60
static final int FISHING
The fishing skill id.
Definition Skill.java:51
static final int DEFENCE
The defence skill id.
Definition Skill.java:24
static final int CONSTRUCTION
The construction skill id.
Definition Skill.java:84
static final int SKILL_COUNT
The amount of available skills.
Definition Skill.java:90
int getLevel()
Gets the current skill level.
Definition Skill.java:205
static final int FLETCHING
The fletching skill id.
Definition Skill.java:48
static final int FIREMAKING
The firemaking skill id.
Definition Skill.java:54
static final int MAGIC
The magic skill id.
Definition Skill.java:39
static final int ATTACK
The attack skill id.
Definition Skill.java:21
static final int FARMING
The farming skill id.
Definition Skill.java:78
static final int THIEVING
The thieving skill id.
Definition Skill.java:72
static final int HUNTER
The hunter skill id.
Definition Skill.java:87
static final int STRENGTH
The strength skill id.
Definition Skill.java:27
static final int COOKING
The cooking skill id.
Definition Skill.java:42
static final int getExperienceForLevel(int level)
Gets the experience for a given level.
Definition Skill.java:454
static final int MINING
The mining skill id.
Definition Skill.java:63
int getMaxLevel()
Gets the maximum skill level.
Definition Skill.java:214
static final int HITPOINTS
The hitpoints skill id.
Definition Skill.java:30
static final int RUNECRAFTING
The runecrafting skill id.
Definition Skill.java:81
void updateCombat()
Handles updating the combat level.
void addExperience(int id, double experience)
Adds experience to a given skill.
void modifyLevel(Function< Integer, Integer > modification, int id, int lowerBound, int upperBound)
Sets the level of a skill.
void addExperience(int id, double experience, boolean levelUp)
Adds experience to a given skill.
void master()
Handles mastering all skills.
double experienceCounter
The experience counter.
void restore(int id)
Restores a specific skill.
Skill[] getSkills()
Gets the skills of the mob.
static double calculateCombat(int attack, int defence, int strength, int hp, int prayer, int ranged, int magic)
Calculates the combat level of an mob.
void setMaxLevel(int id, int level)
Sets the max level of a skill.
int getLevel(int id)
Gets the level of a skill.
void setSkills(Skill[] skills)
Sets the skills of the mob.
int getCombatLevel()
Gets the mob's combat level.
int getMaxLevel(int id)
Gets the highest possible level of a skill.
void updateSkill(Player player, int maxLevel, int newMax, Skill skill, boolean levelUp, boolean combat)
Handles updating a skill.
double calculateCombat()
Calculates the combat level of an mob.
void setNpcMaxLevel(int id, int level)
Sets the experience for a npc skill.
void setCombatLevel()
Sets the mob's combat level.
void sendSkills()
Sends all skills to this player's client.
void showLevelUpInterface(Player player, Skill skill)
void addExperience(int id, double experience, boolean levelUp, boolean counter)
Adds experience to a given skill.
void login()
Handles a player logging in.
void refresh()
Refreshes all the skills for the mob.
void setExperience(int id, double experience)
Sets the experience for a skill.
int getTotalLevel()
Gets the total level of the mob.
void modifyLevel(Function< Integer, Integer > modification, int id)
Sets the level of a skill.
boolean isMaxed()
Checks if the mob is maxed in all skills.
boolean onEvent(InteractionEvent interactionEvent)
The interactionEvent listener.
void regress(int skill)
Handles regressing the skills.
SkillManager(Mob mob)
Constructs a new SkillManager object.
void setLevel(int id, int level)
Sets the level of a skill.
void refresh(int id)
Refreshes a skill to a player's client if this class's mob is a player.
Skill[] skills
An array of skills that belong to an mob.
int getExpCounter()
Gets the experience counter value.
Sends experience to the client's experience counter.
The OutgoingPacket that sends a message to a Players chatbox in the client.
Sends a skill to a client.
The OutgoingPacket that sends a string to a Players itemcontainer in the client.
Handles miscellaneous methods.
Definition Utility.java:27
static String getAOrAn(String nextWord)
A or an.
Definition Utility.java:116
Represents different priorities for updating.
static double getBonus(Player player)
Definition Prayer.java:217
The enumerated type whose elements represent data for the skills.
final int getSecondLine()
Gets the second line that level up text will be printed on.
final int getChatbox()
Gets the chatbox itemcontainer displayed on level up.
final int getFirstLine()
Gets the first line that level up text will be printed on.
final boolean isCombatSkill()
Gets if the skill is combat related.