RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
SkillManager.java
1package com.osroyale.game.world.entity.skill;
2
3import com.osroyale.Config;
4import com.osroyale.content.WellOfGoodwill;
5import com.osroyale.content.achievement.AchievementHandler;
6import com.osroyale.content.achievement.AchievementKey;
7import com.osroyale.content.event.InteractionEvent;
8import com.osroyale.content.lms.LMSGame;
9import com.osroyale.content.skill.impl.cooking.Cooking;
10import com.osroyale.content.skill.impl.crafting.Crafting;
11import com.osroyale.content.skill.impl.farming.Farming;
12import com.osroyale.content.skill.impl.firemaking.Firemaking;
13import com.osroyale.content.skill.impl.fishing.Fishing;
14import com.osroyale.content.skill.impl.fletching.Fletching;
15import com.osroyale.content.skill.impl.herblore.Herblore;
16import com.osroyale.content.skill.impl.hunter.Hunter;
17import com.osroyale.content.skill.impl.mining.Mining;
18import com.osroyale.content.skill.impl.prayer.BoneSacrifice;
19import com.osroyale.content.skill.impl.runecrafting.Runecraft;
20import com.osroyale.content.skill.impl.smithing.Smelting;
21import com.osroyale.content.skill.impl.smithing.Smithing;
22import com.osroyale.content.skill.impl.thieving.Thieving;
23import com.osroyale.content.skill.impl.woodcutting.Woodcutting;
24import com.osroyale.game.Graphic;
25import com.osroyale.game.UpdatePriority;
26import com.osroyale.game.world.World;
27import com.osroyale.game.world.entity.EntityType;
28import com.osroyale.game.world.entity.mob.Mob;
29import com.osroyale.game.world.entity.mob.UpdateFlag;
30import com.osroyale.game.world.entity.mob.player.Player;
31import com.osroyale.game.world.entity.mob.prayer.Prayer;
32import com.osroyale.net.discord.DiscordPlugin;
33import com.osroyale.net.packet.out.*;
34import com.osroyale.util.Utility;
35
36import java.util.LinkedList;
37import java.util.List;
38import java.util.function.Function;
39import java.util.stream.IntStream;
40
82
83public class SkillManager {
84
86 private final Mob mob;
87
89 public double experienceCounter;
90
92 private Skill[] skills;
93
95 private double combatLevel;
96
98 public SkillManager(Mob mob) {
99 this.mob = mob;
100 this.skills = new Skill[mob.isPlayer() ? Skill.SKILL_COUNT : 7];
101 for (int index = 0; index < skills.length; index++) {
102 boolean hitpoints = mob.isPlayer() && index == 3;
103 skills[index] = hitpoints ? new Skill(index, 10, 1154) : new Skill(index, 1, 0);
104 }
105 if (mob.isPlayer()) {
106 skills[Skill.HUNTER] = new Hunter(1, 0);
107 skills[Skill.COOKING] = new Cooking(1, 0);
108 skills[Skill.HERBLORE] = new Herblore(1, 0);
109 skills[Skill.CRAFTING] = new Crafting(1, 0);
110 skills[Skill.THIEVING] = new Thieving(1, 0);
111 skills[Skill.FLETCHING] = new Fletching(1, 0);
112 skills[Skill.PRAYER] = new BoneSacrifice(1, 0);
113 skills[Skill.FIREMAKING] = new Firemaking(1, 0);
114 skills[Skill.RUNECRAFTING] = new Runecraft(1, 0);
115 skills[Skill.MINING] = new Mining(1, 0);
116 skills[Skill.WOODCUTTING] = new Woodcutting(1, 0);
117 skills[Skill.SMITHING] = new Smithing(1, 0);
118 skills[Skill.FISHING] = new Fishing(1, 0);
119 }
120 }
121
123 public static double calculateCombat(int attack, int defence, int strength, int hp, int prayer, int ranged, int magic) {
124 int combat = (defence + hp + prayer / 2) * 250;
125 int melee = (attack + strength) * 325;
126 int range = (ranged / 2 + ranged) * 325;
127 int mage = (magic / 2 + magic) * 325;
128 combat += Math.max(Math.max(melee, range), mage);
129 return combat / 1000.0;
130 }
131
133 public Skill get(int id) {
134 if (id < 0 || id >= skills.length) {
135 throw new IllegalArgumentException("The skill id is out of bounds! id=" + id);
136 }
137 return skills[id];
138 }
139
141 public int getLevel(int id) {
142 return get(id).getLevel();
143 }
144
146 public int getMaxLevel(int id) {
147 return get(id).getMaxLevel();
148 }
149
151 public void setLevel(int id, int level) {
152 get(id).setLevel(level);
153 refresh(id);
154 }
155
157 public void setMaxLevel(int id, int level) {
159 if (mob.isPlayer() && id <= Skill.MAGIC && !mob.getPlayer().quickPrayers.getEnabled().isEmpty()) {
160 List<Prayer> deactivate = new LinkedList<>();
161 for (Prayer prayer : mob.getPlayer().quickPrayers.getEnabled())
162 if (!prayer.canToggle(mob.getPlayer()))
163 deactivate.add(prayer);
164 if (!deactivate.isEmpty())
165 mob.getPlayer().quickPrayers.deactivate(deactivate.toArray(new Prayer[deactivate.size()]));
166 }
167 }
168
170 public void setExperience(int id, double experience) {
171 Skill skill = get(id);
172 int level = Skill.getLevelForExperience(experience);
173 skill.setLevel(level);
174 skill.setMaxLevel(level);
175 skill.setExperience(experience);
176 refresh(id);
177 }
178
180 public void setNpcMaxLevel(int id, int level) {
181 Skill skill = get(id);
182 skill.setLevel(level);
183 skill.setMaxLevel(level);
184 }
185
187 public void modifyLevel(Function<Integer, Integer> modification, int id, int lowerBound, int upperBound) {
188 Skill skill = get(id);
189 skill.modifyLevel(modification, lowerBound, upperBound);
190 }
191
193 public void regress(int skill) {
194 Skill s = get(skill);
195 if (s.getLevel() > s.getMaxLevel()) {
196 s.modifyLevel(level -> level - 1, 0, s.getLevel());
197 refresh(skill);
198 } else if (s.getLevel() < s.getMaxLevel()) {
199 s.modifyLevel(level -> level + 1, 0, s.getMaxLevel());
200 refresh(skill);
201 }
202 }
203
205 public void modifyLevel(Function<Integer, Integer> modification, int id) {
206 Skill skill = get(id);
207 skill.modifyLevel(modification);
208 }
209
211 public int getTotalLevel() {
212 int total = 0;
213 for (Skill skill : skills) {
214 total += skill.getMaxLevel();
215 }
216 return total;
217 }
218
219 public long getTotalXp() {
220 long totalXp = 0;
221 for (Skill skill : skills) {
222 totalXp += skill.getExperience();
223 }
224 return totalXp;
225 }
226
228 public void refresh() {
229 for (final Skill skill : skills) {
230 refresh(skill.getSkill());
231 }
232 }
233
235 public void restore(int id) {
236 Skill skill = get(id);
237 skill.setLevel(skill.getMaxLevel());
238 refresh(id);
239 }
240
242 public void restoreAll() {
243 IntStream.range(0, skills.length).forEach(this::restore);
244 }
245
247 public void login() {
248 Smelting.clearInterfaces(mob.getPlayer());
249 refresh();
251 }
252
254 public void master() {
255 for (int index = 0; index < Skill.SKILL_COUNT; index++) {
256 setMaxLevel(index, 99);
257 }
259 mob.updateFlags.add(UpdateFlag.APPEARANCE);
260 mob.getPlayer().send(new SendMessage("You have successfully mastered all skills."));
261 }
262
264 public void refresh(int id) {
265 if (mob.isPlayer()) {
266 Skill skill = get(id);
267 mob.getPlayer().send(new SendSkill(skill));
268 }
269 }
270
272 public boolean isMaxed() {
273 int maxCount = Skill.SKILL_COUNT;
274 int count = 0;
275 for (int index = 0; index < maxCount; index++) {
276 if (getMaxLevel(index) >= 99) {
277 count++;
278 } else {
279 if (index == Skill.HUNTER)
280 count++;
281 if (index == Skill.FARMING)
282 count++;
283 if (index == Skill.CONSTRUCTION)
284 count++;
285 }
286 }
287 return count == maxCount;
288 }
289
291 public boolean onEvent(InteractionEvent interactionEvent) {
292 if (mob.is(EntityType.PLAYER)) {
293 Player player = (Player) mob;
294 boolean success = false;
295 for (final Skill skill : skills) {
296 success |= skill.onEvent(player, interactionEvent);
297 }
298 return success;
299 }
300 return false;
301 }
302
304 public void addExperience(int id, double experience) {
305 addExperience(id, experience, true);
306 }
307
309 public void addExperience(int id, double experience, boolean levelUp) {
310 addExperience(id, experience, levelUp, true);
311 }
312
314 public void addExperience(int id, double experience, boolean levelUp, boolean counter) {
315 if (!mob.isPlayer() || mob.getPlayer().settings.lockExperience)
316 return;
317 Player player = (Player) mob;
318
319 Skill skill = get(id);
320 double old = skill.getExperience();
321 double modified_experience = experience;
322
323 if(LMSGame.inGameArea(player)) {
324 player.send(new SendExpCounter(skill.getSkill(), (int) modified_experience, counter));
325 return;
326 }
327
328 double bonusXp = 0;
329 switch(id) {
330 case Skill.FARMING:
331 bonusXp = Math.ceil((experience * Farming.getBonus(player)) / 100);
332 break;
333 case Skill.FISHING:
334 bonusXp = Math.ceil((experience * Fishing.getBonus(player)) / 100);
335 break;
336 case Skill.MINING:
337 bonusXp = Math.ceil((experience * Mining.getBonus(player)) / 100);
338 break;
339 case Skill.PRAYER:
340 bonusXp = Math.ceil((experience * Prayer.getBonus(player)) / 100);
341 break;
342 case Skill.FIREMAKING:
343 bonusXp = Math.ceil((experience * Firemaking.getBonus(player)) / 100);
344 break;
345 case Skill.WOODCUTTING:
346 bonusXp = Math.ceil((experience * Woodcutting.getBonus(player)) / 100);
347 break;
348 }
349
350 modified_experience += bonusXp;
351
352 if (Config.DOUBLE_EXPERIENCE || WellOfGoodwill.isActive()) {
353 modified_experience *= 2;
354 }
355
356 int maxLevel = Skill.getLevelForExperience(old);
357 SkillData skillData = SkillData.values()[id];
358 boolean combatSkill = skillData.isCombatSkill();
359
360 if (counter) {
361 experienceCounter += modified_experience;
362 }
363
364 player.send(new SendExpCounter(skill.getSkill(), (int) modified_experience, counter));
365
366 int newMax = Skill.getLevelForExperience(skill.addExperience(modified_experience));
367 updateSkill(player, maxLevel, newMax, skill, levelUp, combatSkill);
368
369 if (skill.getExperience() >= 200_000_000) {
370 AchievementHandler.activate(player, AchievementKey.EXPERIENCE_MASTERY, 1);
371 }
372
373 player.send(new SendSkill(skill));
374 }
375
377 private void updateSkill(Player player, int maxLevel, int newMax, Skill skill, boolean levelUp, boolean combat) {
378 if (maxLevel < 99 && newMax != maxLevel) {
379 skill.setMaxLevel(newMax);
380
381 if (skill.getLevel() <= newMax) {
382 skill.modifyLevel(level -> (newMax - maxLevel) + level);
383 }
384
385 if (levelUp) {
386 if (newMax > 99) {
387 }
388
389 showLevelUpInterface(player, skill);
390 if (newMax == 99 && !combat) {
392 "<col=7B44B3>Tarnish: <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 + "!");
393 DiscordPlugin.sendSimpleMessage(player.getName() + " has just reached level 99 in " + Skill.getName(skill.getSkill()) + "!");
394 }
395 } else {
396 player.send(new SendMessage("Congratulations, you have reached " + Utility.getAOrAn(Skill.getName(skill.getSkill())) + " " + Skill.getName(skill.getSkill()) + " level of " + skill.getMaxLevel() + "."));
397 }
398
399 if (SkillData.values()[skill.getSkill()].isCombatSkill()) {
400 updateCombat();
401 }
402
403 if (skill.getMaxLevel() == 99) {
404 AchievementHandler.activate(player, AchievementKey.SKILL_MASTERY, 1);
405 }
406
407 AchievementHandler.set(player, AchievementKey.TOTAL_LEVEL, getTotalLevel());
408 }
409 }
410
411 private void showLevelUpInterface(Player player, Skill skill) {
412 SkillData skillData = SkillData.values()[skill.getSkill()];
413 String line1 = "Congratulations! You've just advanced " + Utility.getAOrAn(skillData.toString()) + " " + skillData + " level!";
414 String line2 = "You have reached level " + skill.getMaxLevel() + "!";
415 player.send(new SendString(line1, skillData.getFirstLine()));
416 player.send(new SendString(line2, skillData.getSecondLine()));
417 player.send(new SendChatBoxInterface(skillData.getChatbox()));
418 if(skillData == SkillData.HUNTER) {
419 player.send(new SendMoveComponent(0, 5, 311));
420 player.send(new SendInterfaceConfig(311, 200, 9951));
421 }
422 if(skillData == SkillData.FARMING) {
423 player.send(new SendMoveComponent(0, 30, 311));
424 player.send(new SendInterfaceConfig(311, 200, 5340));
425 }
426 String name = Skill.getName(skill.getSkill());
427 player.send(new SendMessage("Congratulations, you just advanced " + Utility.getAOrAn(name) + " " + name + " level."));
428 player.graphic(new Graphic(199, UpdatePriority.VERY_HIGH));
429 player.dialogueFactory.setActive(true);
430 }
431
433 private void updateCombat() {
434 int oldLevel = (int) getCombatLevel();
436 int newLevel = (int) getCombatLevel();
437 if (newLevel != oldLevel) {
438 mob.updateFlags.add(UpdateFlag.APPEARANCE);
439 mob.getPlayer().send(new SendMessage("You've reached a combat level of " + newLevel + "."));
440 }
441 }
442
444 public void sendSkills() {
445 if (mob.is(EntityType.PLAYER)) {
446 Player player = (Player) mob;
447 for (Skill skill : skills) {
448 player.send(new SendSkill(skill));
449 }
450 }
451 }
452
453 public void resetSkilling() {
454 boolean doingSkill = false;
455 for (Skill skill : skills) {
456 if (skill.isDoingSkill()) {
457 doingSkill = true;
458 skill.setDoingSkill(false);
459 }
460 }
461 if (doingSkill) {
462 mob.resetAnimation();
463 }
464 }
465
467 private double calculateCombat() {
469 }
470
472 public int getExpCounter() {
473 return (int) Math.floor(experienceCounter);
474 }
475
477 public int getCombatLevel() {
478 return (int) combatLevel;
479 }
480
482 public void setCombatLevel() {
483 this.combatLevel = calculateCombat();
484 }
485
487 public Skill[] getSkills() {
488 return skills;
489 }
490
492 public void setSkills(Skill[] skills) {
493 this.skills = skills;
494 if (mob.isPlayer()) {
495 this.skills[Skill.HUNTER] = new Hunter(skills[Skill.HUNTER].getLevel(), skills[Skill.HUNTER].getExperience());
496 this.skills[Skill.PRAYER] = new BoneSacrifice(skills[Skill.PRAYER].getLevel(), skills[Skill.PRAYER].getExperience());
497 this.skills[Skill.COOKING] = new Cooking(skills[Skill.COOKING].getLevel(), skills[Skill.COOKING].getExperience());
498 this.skills[Skill.CRAFTING] = new Crafting(skills[Skill.CRAFTING].getLevel(), skills[Skill.CRAFTING].getExperience());
499 this.skills[Skill.THIEVING] = new Thieving(skills[Skill.THIEVING].getLevel(), skills[Skill.THIEVING].getExperience());
500 this.skills[Skill.HERBLORE] = new Herblore(skills[Skill.HERBLORE].getLevel(), skills[Skill.HERBLORE].getExperience());
501 this.skills[Skill.FLETCHING] = new Fletching(skills[Skill.FLETCHING].getLevel(), skills[Skill.FLETCHING].getExperience());
502 this.skills[Skill.FIREMAKING] = new Firemaking(skills[Skill.FIREMAKING].getLevel(), skills[Skill.FIREMAKING].getExperience());
503 this.skills[Skill.RUNECRAFTING] = new Runecraft(skills[Skill.RUNECRAFTING].getLevel(), skills[Skill.RUNECRAFTING].getExperience());
504 this.skills[Skill.MINING] = new Mining(skills[Skill.MINING].getLevel(), skills[Skill.MINING].getExperience());
505 this.skills[Skill.SMITHING] = new Smithing(skills[Skill.SMITHING].getLevel(), skills[Skill.SMITHING].getExperience());
506 this.skills[Skill.WOODCUTTING] = new Woodcutting(skills[Skill.WOODCUTTING].getLevel(), skills[Skill.WOODCUTTING].getExperience());
507 this.skills[Skill.FISHING] = new Fishing(skills[Skill.FISHING].getLevel(), skills[Skill.FISHING].getExperience());
508 }
509 }
510
511 @Override
512 public String toString() {
513 return super.toString();
514 }
515
516}
static void activate(Player player, AchievementKey achievement)
static boolean inGameArea(Player player)
Definition LMSGame.java:179
static void sendMessage(String... messages)
Definition World.java:433
static String getName(int skill)
Definition Skill.java:502
static final int getExperienceForLevel(int level)
Definition Skill.java:491
void modifyLevel(Function< Integer, Integer > function)
Definition Skill.java:318
static final byte getLevelForExperience(double experience)
Definition Skill.java:483
void addExperience(int id, double experience)
void addExperience(int id, double experience, boolean levelUp)
void setExperience(int id, double experience)
void modifyLevel(Function< Integer, Integer > modification, int id)
static double calculateCombat(int attack, int defence, int strength, int hp, int prayer, int ranged, int magic)
void modifyLevel(Function< Integer, Integer > modification, int id, int lowerBound, int upperBound)
void addExperience(int id, double experience, boolean levelUp, boolean counter)
boolean onEvent(InteractionEvent interactionEvent)
static String getAOrAn(String nextWord)
Definition Utility.java:153