Code:
package com.argoury.model.content.skills;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import com.argoury.Constants;
import com.argoury.model.Graphic;
import com.argoury.model.players.Player;
import com.argoury.network.packet.out.SendChatInterfacePacket;
import com.argoury.network.packet.out.SendSkillLevelPacket;
import com.argoury.network.packet.out.SendStringPacket;
/**
* An instance of the players skills
*
* @author Arithium
*
*/
public class Skills {
/**
* Creates an instance of the player
*/
private Player player;
/**
* Constructs the skill class for a player
*
* @param player
* The player to handle the skills
*/
public Skills(Player player) {
this.player = player;
}
/**
* The skill names.
*/
public static final String[] SKILL_NAMES = {
"Attack", "Defence", "Strength", "Constitution", "Ranged", "Prayer", "Magic", "Cooking", "Woodcutting", "Fletching",
"Fishing", "Firemaking", "Crafting", "Smithing", "Mining", "Herblore", "Agility", "Thieving", "Slayer", "Farming",
"Runecraft", "Construction", "Hunter", "Summoning", "Dungeoneering"
};
public static final int ATTACK = 0, DEFENCE = 1, STRENGTH = 2,
HITPOINTS = 3, RANGED = 4, PRAYER = 5, MAGIC = 6, COOKING = 7,
WOODCUTTING = 8, FLETCHING = 9, FISHING = 10, FIREMAKING = 11,
CRAFTING = 12, SMITHING = 13, MINING = 14, HERBLORE = 15,
AGILITY = 16, THIEVING = 17, SLAYER = 18, FARMING = 19,
RUNECRAFTING = 20, SUMMONING = 21, HUNTER = 22, CONSTRUCTION = 23,
DUNGEONEERING = 24;
/**
* The maximum amount of skills
*/
private static final int MAXIMUM_SKILLS = 25;
/**
* The array of the players levels
*/
private int[] playerLevel = new int[MAXIMUM_SKILLS];
/**
* The array of the players experience
*/
private double[] playerXP = new double[MAXIMUM_SKILLS];
/**
* Gets the players level by checking the experience
*
* @param skillExp
* The experience of the skill
* @return The level of the skill
*/
public int getLevelForXP(double skillExp) {
int points = 0;
int output = 0;
if (skillExp > 13034430)
return 99;
for (int lvl = 1; lvl <= 99; lvl++) {
points += Math.floor((double) lvl + 300.0
* Math.pow(2.0, (double) lvl / 7.0));
output = (int) Math.floor(points / 4);
if (output >= skillExp) {
return lvl;
}
}
return 0;
}
/**
* Gets the amount of experience for the level
*
* @param level
* The level to check the amount of experience of
* @return
*/
public int getXPForLevel(int level) {
int points = 0;
int output = 0;
for (int lvl = 1; lvl <= level; lvl++) {
points += Math.floor((double) lvl + 300.0
* Math.pow(2.0, (double) lvl / 7.0));
if (lvl >= level)
return output;
output = (int) Math.floor(points / 4);
}
return 0;
}
public int getExpBonus() {
Calendar calendar = new GregorianCalendar();
int day = calendar.get(Calendar.DAY_OF_WEEK);
if (day == 1 || day == 7) {
return 2;
}
return 1;
}
public boolean addSkillXP(int amount, int skill) {
try {
if (amount + getPlayerExp()[skill] < 0 || getPlayerExp()[skill] > 200000000) {
if (getPlayerExp()[skill] > 200000000) {
getPlayerExp()[skill] = 200000000;
}
return false;
}
amount = ((amount *= Constants.SERVER_EXP_BONUS) * getExpBonus());
int oldLevel = getLevelForXP(getPlayerExp()[skill]);
getPlayerExp()[skill] += amount;
if (oldLevel < getLevelForXP(getPlayerExp()[skill])) {
if (getPlayerLevel()[skill] < player.getSkills().getLevelForXP(getPlayerExp()[skill]) && skill != 3 && skill != 5)
getPlayerLevel()[skill] = player.getSkills().getLevelForXP(getPlayerExp()[skill]);
handleLevelUp(skill);
player.sendGraphic(Graphic.highGraphic(199));
player.getPA().requestUpdates();
}
refreshSkill(skill);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
private static final int[][] REFRESH_DATA = {
{ ATTACK, 4004, 4005, 4044, 4045, 18792, 18790 },
{ DEFENCE, 4008, 4009, 4056, 4057, 18817, 18815 },
{ STRENGTH, 4006, 4007, 4050, 4051, 18798, 18796 },
{ HITPOINTS, 4016, 4017, 18853, 18854, 18859, 18857 },
{ RANGED, 4010, 4011, 4062, 4063, 18822, 18820 },
{ PRAYER, 4012, 4013, 4068, 4069, 18827, 18825 },
{ MAGIC, 4014, 4015, 18832, 18833, 18838, 18836 },
{ COOKING, 4034, 4035, 19042, 19043, 19048, 19046 },
{ WOODCUTTING, 4038, 4039, 19084, 19085, 19090, 19088 },
{ FLETCHING, 4026, 4027, 18958, 18959, 18964, 18962 },
{ FISHING, 4032, 4033, 19021, 19022, 19027, 19025 },
{ FIREMAKING, 4036, 4037, 19063, 19064, 19069, 19067 },
{ CRAFTING, 4024, 4025, 18937, 18938, 18943, 18941 },
{ SMITHING, 4030, 4031, 19422, 19423, 19428, 19426 },
{ MINING, 4028, 4029, 18979, 18980, 18985, 18983 },
{ HERBLORE, 4020, 4021, 18895, 18896, 18901, 18899 },
{ AGILITY, 4018, 4019, 18874, 18875, 18880, 18878 },
{ THIEVING, 4022, 4023, 18916, 18917, 18922, 18920 },
{ SLAYER, 18809, 18810, 19126, 19127, 19132, 19130 },
{ FARMING, 18811, 18812, 19275, 19276, 19281, 19279 },
{ RUNECRAFTING, 18807, 18808, 19105, 19106, 19111, 19109 },
{ SUMMONING, 19178, 19179, 19232, 19233, 19238, 19236 },
{ HUNTER, 19176, 19177, 19211, 19212, 19217, 19215 },
{ CONSTRUCTION, 19174, 19175, 19190, 19191, 19196, 19194 },
{ DUNGEONEERING, 19180, 19181, 19253, 19254, 19259, 19257 }, };
private enum LevelUpData {
ATTACK(0, 6248, 6249, 6247, "Attack"), DEFENCE(1, 6254, 6255, 6253,
"Defence"), STRENGTH(2, 6207, 6208, 6206, "Strength"), HITPOINTS(
3, 6217, 6218, 6216, "Hitpoints"), RANGED(4, 5453, 6114, 4443,
"Ranged"), PRAYER(5, 6243, 6244, 6242, "Prayer"), MAGIC(6,
6212, 6213, 6211, "Magic"), COOKING(7, 6227, 6228, 6226,
"Cooking"), WOODCUTTING(8, 4273, 4274, 4272, "Woodcutting"), FLETCHING(
9, 6232, 6233, 6231, "Fletching"), FISHING(10, 6259, 6260,
6258, "Fishing"), FIREMAKING(11, 4283, 4284, 4282, "Firemaking"), CRAFTING(
12, 6264, 6265, 6263, "Crafting"), SMITHING(13, 6222, 6223,
6221, "Smithing"), MINING(14, 4417, 4418, 4416, "Mining"), HERBLORE(
15, 6238, 6239, 6237, "Herblore"), AGILITY(16, 4278, 4279,
4277, "Agility"), THIEVING(17, 4263, 4264, 4261, "Thieving"), SLAYER(
18, 12123, 12124, 12122, "Slayer"), FARMING(19, -1, -1, -1,
"Farming"), RUNECRAFTING(20, 4268, 4269, 4267, "Runecrafting"), SUMMONING(
21, 4268, 4269, 4267, "Summoning"), HUNTER(22, -1, -1, -1,
"Hunter"), CONSTRUCTION(23, 22602, 22603, 22601, "Construction"), DUNGEONEERING(
24, 12123, 12124, 12122, "Dungeoneering")
;
private int skillId, frame1, frame2, frame3;
private String skillName;
LevelUpData(int skillId, int frame1, int frame2, int frame3, String name) {
this.skillId = skillId;
this.frame1 = frame1;
this.frame2 = frame2;
this.frame3 = frame3;
this.skillName = name;
}
public int getSkillId() {
return skillId;
}
public int getFrame1() {
return frame1;
}
public int getFrame2() {
return frame2;
}
public int getFrame3() {
return frame3;
}
public String getSkillName() {
return skillName;
}
private static Map<Integer, LevelUpData> levelUp = new HashMap<Integer, LevelUpData>();
static {
for (LevelUpData data : values()) {
levelUp.put(data.getSkillId(), data);
}
}
public static LevelUpData forId(int skillId) {
return levelUp.get(skillId);
}
}
public void handleLevelUp(int skillId) {
try {
LevelUpData skill = LevelUpData.forId(skillId);
if (skill == null)
return;
String skillName = skill.getSkillName().toLowerCase();
if (skill.getFrame1() > 0 && skill.getFrame2() > 0 && skill.getFrame3() > 0) {
player.getClient().send(new SendStringPacket("Congratulations, you just advanced a " + skillName + " level.", skill.getFrame1()));
player.getClient().send(new SendStringPacket("Your " + skillName + " is now " + getLevelForXP(getPlayerExp()[skillId]) + ".", skill.getFrame2()));
player.getClient().send(new SendChatInterfacePacket(skill.getFrame3()));
} else {
player.getClient().sendMessage("Congralations, you just advanced a " + skillName + " level.");
player.getClient().sendMessage("Your " + skillName + " is now level " + getLevelForXP(getPlayerExp()[skillId]) + ".");
}
if (skill.skillId < 7 || skill.skillId == 21) {
setCombatLevel();
player.getClient().send(new SendStringPacket("Combat Level: " + player.combatLevel + "", 3983));
}
/*if (skill.skillId > 6 && player.getSkills().getLevelForXP(player.getSkills().getPlayerExp()[skill.skillId]) == 99) {
PlayerHandler.messageAll("<col=255>" + Misc.formatPlayerName(player.playerName) + " has achieved 99 in " + skill.getSkillName() + ".", 0, true);
}*/
player.nextChat = 0;
player.dialogueAction = 0;
} catch (Exception e) {
e.printStackTrace();
}
}
public void refreshSkill(int i) {
try {
/*int frame1 = REFRESH_DATA[i][1];
int frame2 = REFRESH_DATA[i][2];
int frame3 = REFRESH_DATA[i][3];
int frame4 = REFRESH_DATA[i][4];
int frame5 = REFRESH_DATA[i][5];
int frame6 = REFRESH_DATA[i][6];*/
player.getClient().send(new SendSkillLevelPacket(i, getPlayerLevel()[i], getPlayerExp()[i]));
/*player.send(new SendStringPacket("" + getPlayerLevel()[i],
frame1);
player.send(new SendStringPacket(
"" + getLevelForXP(getPlayerExp()[i]), frame2);
player.send(new SendStringPacket("" + getPlayerExp()[i], frame3);
player.send(new SendStringPacket(
"" + getXPForLevel(getLevelForXP(getPlayerExp()[0]) + 1)
+ "", frame4));
player.getPacketSender()
.sendString(
""
+ (getLevelForXP(getPlayerExp()[i]) < 99 ? (getXPForLevel(getLevelForXP(getPlayerExp()[i]) + 1) - getPlayerExp()[i])
: "0"), frame5);
player.send(new SendStringPacket(
"" + getPlayerLevel()[i] + "/"
+ getLevelForXP(getPlayerExp()[i]), frame6));*/
if (REFRESH_DATA[i][0] < 7 || REFRESH_DATA[i][0] == 21) {
player.getClient().send(new SendStringPacket("Combat Level: " + player.combatLevel, 3983));
}
/**
* Sends the prayer amount to the player interface
*/
/*if (i == 5) {
player.send(new SendStringPacket(
"" + playerLevel[5] + "/" + getLevelForXP(playerXP[5])
+ "", 687));
}
player.send(new SendStringPacket(
"Total Lvl: " + getTotalLevel(), 13984));*/
player.getClient().send(new SendStringPacket(""+getPlayerLevel()[PRAYER], 4012));
player.getClient().send(new SendStringPacket(""+getLevelForXP(getPlayerExp()[PRAYER]), 4013));
player.getClient().send(new SendStringPacket(""+getPlayerLevel()[HITPOINTS], 4016));
player.getClient().send(new SendStringPacket(""+getLevelForXP(getPlayerExp()[HITPOINTS]), 4016));
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unused")
private int getTotalLevel() {
int totalLevel = (getLevelForXP(getPlayerExp()[0])
+ getLevelForXP(getPlayerExp()[1])
+ getLevelForXP(getPlayerExp()[2])
+ getLevelForXP(getPlayerExp()[3])
+ getLevelForXP(getPlayerExp()[4])
+ getLevelForXP(getPlayerExp()[5])
+ getLevelForXP(getPlayerExp()[6])
+ getLevelForXP(getPlayerExp()[7])
+ getLevelForXP(getPlayerExp()[8])
+ getLevelForXP(getPlayerExp()[9])
+ getLevelForXP(getPlayerExp()[10])
+ getLevelForXP(getPlayerExp()[11])
+ getLevelForXP(getPlayerExp()[12])
+ getLevelForXP(getPlayerExp()[13])
+ getLevelForXP(getPlayerExp()[14])
+ getLevelForXP(getPlayerExp()[15])
+ getLevelForXP(getPlayerExp()[16])
+ getLevelForXP(getPlayerExp()[17])
+ getLevelForXP(getPlayerExp()[18])
+ getLevelForXP(getPlayerExp()[19])
+ getLevelForXP(getPlayerExp()[20])
+ getLevelForXP(getPlayerExp()[21])
+ getLevelForXP(getPlayerExp()[22])
+ getLevelForXP(getPlayerExp()[23]) + getLevelForXP(getPlayerExp()[24]));
return totalLevel;
}
/**
* Sets the players combat level
* @return
*/
public int setCombatLevel() {
int mag = (int) ((getLevelForXP(getPlayerExp()[6])) * 1.5);
int ran = (int) ((getLevelForXP(getPlayerExp()[4])) * 1.5);
int attstr = (int) ((double) (getLevelForXP(getPlayerExp()[0])) + (double) (getLevelForXP(getPlayerExp()[2])));
player.combatLevel = 0;
if (ran > attstr) {
player.combatLevel = (int) (((getLevelForXP(getPlayerExp()[1])) * 0.25)
+ ((getLevelForXP(getPlayerExp()[3])) * 0.25)
+ ((getLevelForXP(getPlayerExp()[5])) * 0.125) + ((getLevelForXP(getPlayerExp()[4])) * 0.4875));
} else if (mag > attstr) {
player.combatLevel = (int) (((getLevelForXP(getPlayerExp()[1])) * 0.25)
+ ((getLevelForXP(getPlayerExp()[3])) * 0.25)
+ ((getLevelForXP(getPlayerExp()[5])) * 0.125) + ((getLevelForXP(getPlayerExp()[6])) * 0.4875));
} else {
player.combatLevel = (int) (((getLevelForXP(getPlayerExp()[1])) * 0.25)
+ ((getLevelForXP(getPlayerExp()[3])) * 0.25)
+ ((getLevelForXP(getPlayerExp()[5])) * 0.125)
+ ((getLevelForXP(getPlayerExp()[0])) * 0.325) + ((getLevelForXP(getPlayerExp()[2])) * 0.325));
}
return player.combatLevel;
}
/**
* Returns the players levels
*
* @return The level to be returned
*/
public int[] getPlayerLevel() {
return playerLevel;
}
public int get(int i) {
return playerLevel[i];
}
/**
* Returns the players experience
*
* @return The experience to be returned
*/
public double[] getPlayerExp() {
return playerXP;
}
}