Code:
package AbyssalScape.rs2.content.skills;
import AbyssalScape.Server;
import AbyssalScape.core.event.CycleEvent;
import AbyssalScape.core.event.CycleEventContainer;
import AbyssalScape.core.event.CycleEventHandler;
import AbyssalScape.rs2.objects.Objects;
import AbyssalScape.rs2.players.Player;
import AbyssalScape.rs2.players.PlayerAssistant;
import AbyssalScape.util.Misc;
public class Woodcutting {
//variables
private Player p;
//axe id, level req, anim, strength
private static final int[][] AXES = {
{1351, 1, 879, 1}, //bronze axe
{1349, 1, 877, 2}, //iron axe
{1353, 6, 875, 3}, //steel axe
{1361, 6, 873, 4}, //black axe
{1355, 21, 871, 5}, //mithril axe
{1357, 31, 869, 6}, //adamant axe
{1359, 41, 867, 7}, //rune axe
{6739, 61, 2846, 10} //dragon axe
}; //end of axes
//tree id, stump id, level req, xp given, log id, respawn time, tree strength, max amount of logs
private static final int[][] TREES = {
{1276, 1342, 1, 25, 1511, 30, 4, 1}, //Tree
{1278, 1342, 1, 25, 1511, 30, 4, 1}, //Tree
{1286, 1342, 1, 25, 1511, 30, 4, 1}, //Dead Tree
{1383, 1342, 1, 25, 1511, 30, 4, 1}, //Dead Tree
{1281, 1356, 15, 38, 1521, 45, 15, 5}, //Oak
{1308, 7399, 30, 68, 1519, 50, 35, 15}, //Willow
{5552, 7399, 30, 68, 1519, 50, 35, 15}, //Willow
{5551, 7399, 30, 68, 1519, 50, 35, 15}, //Willow
{5553, 7399, 30, 68, 1519, 50, 35, 15}, //Willow
{1307, 1343, 45, 100, 1517, 65, 50, 20}, //Maple
{1309, 7402, 60, 175, 1515, 100, 70, 28}, //Yew
{1306, 7401, 75, 250, 1513, 200, 85, 28} //Magic
}; //end of trees
//constructors
public Woodcutting(Player p) {
this.p = p;
}
//getters and setters
//methods
public void startWoodcutting(final int treeId, final int treeX, final int treeY) {
p.turnPlayerTo(treeX, treeY); //turn the player so they are facing the tree
if (p.ed.getBoolean("isSkilling") == true) {
return;
}
short treeIndex = 0; //the index in which the tree we are cutting sits
for (short i = 0; i < TREES.length; i++) {
if (treeId == TREES[i][0]) {
treeIndex = i;
break;
}
} //end of for loop
if (!(p.playerLevel[8] >= TREES[treeIndex][2])) { //check if they have the proper level
p.sendMessage("You need atleast a woodcutting level of " + TREES[treeIndex][2] + "to cut this tree.");
return;
} //end of level check
boolean canCutTree = false;
short axeIndex = 0;
for (short i = 0; i < AXES.length; i++) {
if (p.getItems().playerHasItem(AXES[i][0]) || p.playerEquipment[p.playerWeapon] == AXES[i][0] && p.playerLevel[8] >= AXES[i][1]) {
axeIndex = i;
canCutTree = true;
} //end of if statement
} //end of for loop
if (!canCutTree) {
p.sendMessage("You need a Woodcutting axe which you need a Woodcutting level to use.");
return;
} //end of checking if they have an axe they can use
if (p.getItems().freeSlots() < 1) {
p.sendMessage("You do not have enough inventory slots to do that.");
return;
} //end of checking if the player has an inventory slot open
p.startAnimation(AXES[axeIndex][2]);
final short treeSpot = treeIndex;
final short axeSpot = axeIndex;
p.sendMessage("You swing your axe at the tree.");
p.ed.put("isSkilling", true); //add the boolean isSkilling to the extra data
CycleEventHandler.getSingleton().addEvent(1, p, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
if (p.ed.getBoolean("isSkilling") == true) { //need to check here if the tree is still avaible
p.startAnimation(AXES[axeSpot][2]);
int logsToGive = (TREES[treeSpot][7] == 1 ? 1 : Misc.random(TREES[treeSpot][7]));
int xp = TREES[treeSpot][3];
if (p.playerEquipment[p.playerHat] == 10941) {
xp = (int)(xp * 1.004);
}
if (p.playerEquipment[p.playerFeet] == 10933) {
xp = (int)(xp * 1.002);
}
if (p.playerEquipment[p.playerChest] == 10939) {
xp = (int)(xp * 1.008);
}
if (p.playerEquipment[p.playerLegs] == 10940) {
xp = (int)(xp * 1.006);
}
if (p.getItems().freeSlots() < 1) {
p.sendMessage("You have ran out of inventory slots.");
container.stop();
} //end of checking if the player has an inventory slot open
if (Misc.random(100) == 25 && p.membership)
giveBirdsNest();
p.getItems().addItem(TREES[treeSpot][4], 1);
p.sendMessage("You cut some logs.");
PlayerAssistant.addSkillXP(p, xp, 8);
logsToGive--;
if (logsToGive == 0) {
createStump(p, TREES[treeSpot][1], TREES[treeSpot][0], treeX, treeY, Misc.random(TREES[treeSpot][5] + 3));
container.stop();
}
} else {
container.stop();
}
}
@Override
public void stop() {
p.startAnimation(65535);
PlayerAssistant.removeAllWindows(p);
p.ed.remove("isSkilling");
}
}, getTimer(treeIndex, axeIndex, p.playerLevel[8]));
} //end of startWoodcutting
private static void createStump(final Player p, final int stumpId, final int objId, final int objX, final int objY, int ticks) {
Server.objectHandler.createAnObject(p, stumpId, objX, objY);
CycleEventHandler.getSingleton().addEvent(p, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
Server.objectHandler.createAnObject(p, objId, objX, objY);
container.stop();
}
@Override
public void stop() {
// Whatever you want it to do when the event stops
}
}, ticks);
}
private int getTimer(int tree, int axe, int level) {
double timer = (int)((TREES[tree][6] * 2) + 20 + Misc.random(20))-((AXES[axe][3] * (AXES[axe][3] * 0.75)) + level);
if (timer < 3.0) {
return 3;
} else {
return (int)timer;
}
}
private void giveBirdsNest() { //need to finish this method
p.sendMessage("@red@A bird's nest falls from the tree!");
//when a player receives a birds nest
}
} //end of class