MoparClassic/GameServer/src/org/moparscape/msc/gs/phandler/client/ObjectAction.java

1044 lines
35 KiB
Java

package org.moparscape.msc.gs.phandler.client;
import java.util.ArrayList;
import org.apache.mina.common.IoSession;
import org.moparscape.msc.config.Config;
import org.moparscape.msc.config.Formulae;
import org.moparscape.msc.gs.Instance;
import org.moparscape.msc.gs.Server;
import org.moparscape.msc.gs.connection.Packet;
import org.moparscape.msc.gs.connection.RSCPacket;
import org.moparscape.msc.gs.core.GameEngine;
import org.moparscape.msc.gs.event.DelayedEvent;
import org.moparscape.msc.gs.event.MiniEvent;
import org.moparscape.msc.gs.event.ShortEvent;
import org.moparscape.msc.gs.event.SingleEvent;
import org.moparscape.msc.gs.event.WalkToObjectEvent;
import org.moparscape.msc.gs.external.AgilityCourseDef;
import org.moparscape.msc.gs.external.AgilityDef;
import org.moparscape.msc.gs.external.EntityHandler;
import org.moparscape.msc.gs.external.GameObjectDef;
import org.moparscape.msc.gs.external.ObjectFishDef;
import org.moparscape.msc.gs.external.ObjectFishingDef;
import org.moparscape.msc.gs.external.ObjectWoodcuttingDef;
import org.moparscape.msc.gs.model.ActiveTile;
import org.moparscape.msc.gs.model.Bubble;
import org.moparscape.msc.gs.model.ChatMessage;
import org.moparscape.msc.gs.model.GameObject;
import org.moparscape.msc.gs.model.InvItem;
import org.moparscape.msc.gs.model.Item;
import org.moparscape.msc.gs.model.MenuHandler;
import org.moparscape.msc.gs.model.Npc;
import org.moparscape.msc.gs.model.Path;
import org.moparscape.msc.gs.model.Player;
import org.moparscape.msc.gs.model.Point;
import org.moparscape.msc.gs.model.World;
import org.moparscape.msc.gs.model.snapshot.Activity;
import org.moparscape.msc.gs.phandler.PacketHandler;
import org.moparscape.msc.gs.plugins.extras.Thieving;
import org.moparscape.msc.gs.states.Action;
import org.moparscape.msc.gs.tools.DataConversions;
import org.moparscape.msc.gs.util.Logger;
public class ObjectAction implements PacketHandler {
/**
* World instance
*/
public static final World world = Instance.getWorld();
public void handlePacket(Packet p, IoSession session) {
Player player = (Player) session.getAttachment();
int pID = ((RSCPacket) p).getID();
if (player.isBusy()) {
if (player.getStatus() != Action.AGILITYING)
player.resetPath();
return;
}// f2p
player.resetAll();
ActiveTile t = world.getTile(p.readShort(), p.readShort());
final GameObject object = t.getGameObject();
final int click = pID == 51 ? 0 : 1;
player.click = click;
if (object == null) {
t.cleanItself();
player.setSuspiciousPlayer(true);
return;
}
world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " clicked on a object (" + object.getID() + ") at: " + player.getX() + "/" + player.getY() + "|" + object.getX() + "/" + object.getY()));
//long newtime = p.readLong(); // reads the timestamp *Removing for now as causing an NPE - KO9
/*
if (newtime == 0) {
if (player.sessionFlags < 4) {
Logging.debug("[Anti-Bot] " + player.getUsername() + " is using a 3rd party client [B&]");
player.sessionFlags++;
}
} else {// dummy
if (player.lastPacketTime == -1)
player.lastPacketTime = newtime;
else {
if (newtime <= player.lastPacketTime && (System.currentTimeMillis() / 1000) > player.lastPacketRecTime) {
Logging.debug("[Anti-Bot] " + player.getUsername() + " tried to send a recorded packet, WPE.");
player.destroy(false);
} else {
player.lastPacketTime = newtime;
player.lastPacketRecTime = System.currentTimeMillis() / 1000;
}
}
}*/
if (object.getID() == 198 && object.getX() == 251 && object.getY() == 468) { // Prayer
// Guild
// Ladder
if (player.getMaxStat(5) < 31) {
player.getActionSender().sendMessage("You need 31 Prayer to get up here");
return;
} else {
// player.teleport(251, 1411, false);
}
}// 621
if(object.getID() == 982 && player.withinRange(object.getLocation(), 2)) {
player.getActionSender().sendMessage("You slide down the rocks");
player.teleport(579, 3357, false);
return;
}
if (object.getX() == 243 && object.getY() == 178)
return;
if (object.getX() == 59 && object.getY() == 573)
return;
if (object.getX() == 196 && object.getY() == 3266 && !Server.isMembers())
return;
player.setStatus(Action.USING_OBJECT);
Instance.getDelayedEventHandler().add(new WalkToObjectEvent(player, object, false) {
public void arrived() {
try {
if (owner.getStatus() != Action.AGILITYING)
owner.resetPath();
GameObjectDef def = object.getGameObjectDef();
if (owner.isBusy() || owner.isRanging() || !owner.nextTo(object) || def == null || owner.getStatus() != Action.USING_OBJECT) {
return;
}
world.addEntryToSnapshots(new Activity(owner.getUsername(), owner.getUsername() + " used an Object (" + object.getID() + ") @ " + object.getX() + ", " + object.getY()));
owner.resetAll();
if (object.getX() == 621 && object.getY() == 596 && Config.f2pWildy) {
owner.getActionSender().sendMessage("Currently disabled!1!");
return;
}
String command = (click == 0 ? def.getCommand1() : def.getCommand2()).toLowerCase();
// Logging.debug(object.getID() + " " +
// command);
if(object.getID() == 487 && GameEngine.getTime() - owner.getLastMoved() < 10000) { owner.getActionSender().sendMessage("You must stand still for 10 seconds before using this"); return; }
Point telePoint = EntityHandler.getObjectTelePoint(object.getLocation(), command);
if (telePoint != null) {
owner.teleport(telePoint.getX(), telePoint.getY(), false);
return;
}
if (world.getQuestManager().handleObject(object, owner, click == 1))
return;
if (Instance.getPluginHandler().handleObjectAction(object, command, owner))
return;
else if (object.getID() == 198 && object.getX() == 251 && object.getY() == 468) {
if (owner.getMaxStat(5) < 31) {
owner.setBusy(true);
Npc abbot = world.getNpc(174, 249, 252, 458, 468);
if (abbot != null) {
owner.informOfNpcMessage(new ChatMessage(abbot, "Hello only people with high prayer are allowed in here", owner));
} else {
return;
}
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
owner.setBusy(false);
owner.getActionSender().sendMessage("You need a prayer level of 31 to enter");
}
});
return;
} else {
// owner.teleport(251, 1411, false);
}
}
Logger.println("Command: " + command);
if(command.equalsIgnoreCase("talk to") && object.getID() == 391) {
final String[] options = { "Yes please!", "No thanks I prefer to walk!" };
owner.getActionSender().sendMessage("Would you like to be teleported to edgeville for 1000gp?");
owner.getActionSender().sendMessage("We'll take the money from your bank account!");
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(final int option, final String reply) {
if (option < 0 && option > options.length)
return;
if (option == 0) {
if(owner.getBank().countId(10) < 1000) {
owner.getActionSender().sendMessage("It looks like you don't have enough money in your bank!");
owner.setBusy(false);
return;
}
if(owner.getBank().remove(10, 1000) == -1) {
owner.getActionSender().sendMessage("It looks like you don't have enough money in your bank!");
owner.setBusy(false);
return;
}
owner.setBusy(true);
owner.getActionSender().sendMessage("The tree is looking for a fellow spirit tree!");
handleMovement(owner, 0, Formulae.dray2edge);
}
}
public void handleMovement(Player p, final int i, final ArrayList<Point> path) {
Instance.getDelayedEventHandler().add(new MiniEvent(p,Formulae.Rand(4500, 5500)) {
@Override
public void action() {
if(i >= path.size()) {
owner.setBusy(false);
owner.getActionSender().sendMessage("You've arrived!");
return;
}
owner.teleport(path.get(i).getX(), path.get(i).getY(), true);
owner.getActionSender().sendMessage("The tree is looking for another spirit tree to throw you into!");
handleMovement(owner, (i+1), path);
}
});
}
});
owner.getActionSender().sendMenu(options);
}
});
return;
}
if (command.equals("search") && def.name.equals("cupboard")) {
owner.getActionSender().sendMessage("You search the " + def.name + "...");
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
if (object.getX() == 216 && object.getY() == 1562) {
owner.getActionSender().sendMessage("You find Garlic!");
owner.getInventory().add(new InvItem(218));
owner.getActionSender().sendInventory();
} else {
owner.getActionSender().sendMessage("You find nothing");
}
return;
}
});
}// create a
else if (object.getID() == 52 || object.getID() == 173 && object.containsItem() == 29) // hopper
{
owner.getActionSender().sendMessage("You operate the hopper..");
Instance.getDelayedEventHandler().add(new org.moparscape.msc.gs.event.MiniEvent(owner, 1000) {
public void action() {
owner.getActionSender().sendMessage("The grain slides down the chute");
}
});
// Konijn/xEnt == TEAM WORK BIATCH.
if (object.getX() == 179 && object.getY() == 2371) {
world.registerItem(new Item(23, 179, 481, 1, owner));
} else {
world.registerItem(new Item(23, 166, 599, 1, owner));
}
object.containsItem(-1);
} else if (object.getID() == 223 && object.getX() == 274 && object.getY() == 566) { // Mining
// Guild
// Ladder
if (owner.getCurStat(14) < 60) {
owner.setBusy(true);
Npc dwarf = world.getNpc(191, 272, 277, 563, 567);
if (dwarf != null) {
owner.informOfNpcMessage(new ChatMessage(dwarf, "Hello only the top miners are allowed in here", owner));
}
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
owner.setBusy(false);
owner.getActionSender().sendMessage("You need a mining level of 66 to enter");
}
});
} else {
owner.teleport(274, 3397, false);
}
} else if (command.equals("climb-up") || command.equals("climb up") || command.equals("go up")) {
int[] coords = coordModifier(owner, true);
owner.teleport(coords[0], coords[1], false);
} else if (command.equals("climb-down") || command.equals("climb down") || command.equals("go down")) {
int[] coords = coordModifier(owner, false);
owner.teleport(coords[0], coords[1], false);
} else if (command.equals("steal from")) {
if (!Server.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
if (object == null) {
return;
}
if (owner.getSpam()) {
return;
} else {
owner.setSpam(true);
Thieving thiev = new Thieving(owner, object);
thiev.thieveStall();
}
} else if (command.equals("search for traps")) {
if (!Server.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
if (object == null) {
return;
}
if (owner.getSpam()) {
return;
} else {
owner.setSpam(true);
Thieving thiev = new Thieving(owner, object);
thiev.thieveChest();
}
} else if (command.equals("rest")) {
owner.getActionSender().sendMessage("You rest on the bed");
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
// owner.setFatigue(0);
// owner.getActionSender().sendFatigue();
owner.getActionSender().sendEnterSleep();
}
});
} else if (command.equals("hit")) {
owner.setBusy(true);
owner.getActionSender().sendMessage("You attempt to hit the Dummy");
Instance.getDelayedEventHandler().add(new MiniEvent(owner, 3500) {
public void action() {
owner.setBusy(false);
int lvl = owner.getCurStat(0);
if (lvl > 7 || owner.getMaxStat(0) >= 40) {
owner.getActionSender().sendMessage("There is only so much you can learn from hitting a Dummy");
return;
}
owner.getActionSender().sendMessage("You hit the Dummy");
owner.incExp(0, 5, false);
owner.getActionSender().sendStat(0);
}
});
return;
} else if (command.equalsIgnoreCase("approach")) {
owner.getActionSender().sendMessage("You start to approach the tree");
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
int damage = owner.getCurStat(3) / 10;
owner.getActionSender().sendMessage("The tree lashes out at you.");
owner.setLastDamage(damage);
owner.setCurStat(3, owner.getCurStat(3) - damage);
ArrayList<Player> playersToInform = new ArrayList<Player>();
playersToInform.addAll(owner.getViewArea().getPlayersInView());
owner.getActionSender().sendStat(3);
for (Player p : playersToInform) {
p.informOfModifiedHits(owner);
}
}
});
} else if (command.equals("open") && object.getGameObjectDef().name.equals("Chest")) {
if (object == null) {
return;
}
if (owner.getSpam())
return;
Thieving lock = new Thieving(owner, object);
boolean cont = false;
for (int i = 0; i < lock.Chests.length; i++) {
if (object.getID() == lock.Chests[i][0]) {
if (!World.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
owner.setSpam(true);
lock.openThievedChest();
break;
}
}
return;
}
else if (command.equals("close") || command.equals("open")) {
switch (object.getID()) {
case 18:
replaceGameObject(17, true);
return;
case 17:
replaceGameObject(18, false);
return;
case 58:
replaceGameObject(57, false);
return;
case 57:
replaceGameObject(58, true);
return;
case 63:
replaceGameObject(64, false);
return;
case 64:
replaceGameObject(63, true);
return;
case 79:
replaceGameObject(78, false);
return;
case 78:
replaceGameObject(79, true);
return;
case 60:
replaceGameObject(59, true);
return;
case 59:
replaceGameObject(60, false);
return;
case 137: // Members Gate (Doriks)
if (object.getX() != 341 || object.getY() != 487) {
return;
}
if (!World.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
doGate();
if (owner.getX() <= 341) {
owner.teleport(342, 487, false);
} else {
owner.teleport(341, 487, false);
}
break;
case 138: // Members Gate (Crafting Guild)
if (object.getX() != 343 || object.getY() != 581) {
return;
}
if (!World.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
doGate();
if (owner.getY() <= 580) {
owner.teleport(343, 581, false);
} else {
owner.teleport(343, 580, false);
}
break;
case 180: // Al-Kharid Gate
if (object.getX() != 92 || object.getY() != 649) {
return;
}
doGate();
if (owner.getX() <= 91) {
owner.teleport(92, 649, false);
} else {
owner.teleport(91, 649, false);
}
break;
case 254: // Karamja Gate
if (object.getX() != 434 || object.getY() != 682) {
return;
}
if (!World.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
doGate();
if (owner.getX() <= 434) {
owner.teleport(435, 682, false);
} else {
owner.teleport(434, 682, false);
}
break;
case 563: // King Lanthlas Gate
if (object.getX() != 660 || object.getY() != 551) {
return;
}
doGate();
if (owner.getY() <= 551) {
owner.teleport(660, 552, false);
} else {
owner.teleport(660, 551, false);
}
break;
case 626: // Gnome Stronghold Gate
if (object.getX() != 703 || object.getY() != 531) {
return;
}
doGate();
if (owner.getY() <= 531) {
owner.teleport(703, 532, false);
} else {
owner.teleport(703, 531, false);
}
break;
case 305: // Edgeville Members Gate
if (object.getX() != 196 || object.getY() != 3266) {
return;
}
if (!World.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
doGate();
if (owner.getY() <= 3265) {
owner.teleport(196, 3266, false);
} else {
owner.teleport(196, 3265, false);
}
break;
case 1089: // Dig Site Gate
if (object.getX() != 59 || object.getY() != 573) {
return;
}
if (!World.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
doGate();
if (owner.getX() <= 58) {
owner.teleport(59, 573, false);
} else {
owner.teleport(58, 573, false);
}
break;
case 356: // Woodcutting Guild Gate
if (object.getX() != 560 || object.getY() != 472) {
return;
}
if (owner.getY() <= 472) {
doGate();
owner.teleport(560, 473, false);
} else {
if (owner.getCurStat(8) < 70) {
owner.setBusy(true);
Npc mcgrubor = world.getNpc(255, 556, 564, 473, 476);
if (mcgrubor != null) {
owner.informOfNpcMessage(new ChatMessage(mcgrubor, "Hello only the top woodcutters are allowed in here", owner));
}
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
owner.setBusy(false);
owner.getActionSender().sendMessage("You need a woodcutting level of 70 to enter");
}
});
} else {
doGate();
owner.teleport(560, 472, false);
}
}
break;
case 142: // Black Knight Big Door
owner.getActionSender().sendMessage("The doors are locked");
break;
case 93: // Red dragon gate
if (object.getX() != 140 || object.getY() != 180) {
return;
}
if (!World.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
doGate();
if (owner.getY() <= 180) {
owner.teleport(140, 181, false);
} else {
owner.teleport(140, 180, false);
}
break;
case 508: // Lesser demon gate
if (object.getX() != 285 || object.getY() != 185) {
return;
}
doGate();
if (owner.getX() <= 284) {
owner.teleport(285, 185, false);
} else {
owner.teleport(284, 185, false);
}
break;
case 319: // Lava Maze Gate
if (object.getX() != 243 || object.getY() != 178) {
return;
}
doGate();
if (owner.getY() <= 178) {
owner.teleport(243, 179, false);
} else {
owner.teleport(243, 178, false);
}
break;
case 712: // Shilo inside gate
if (object.getX() != 394 || object.getY() != 851) {
return;
}
owner.teleport(383, 851, false);
break;
case 611: // Shilo outside gate
if (object.getX() != 388 || object.getY() != 851) {
return;
}
owner.teleport(394, 851, false);
break;
case 1079: // Legends guild gate
if (object.getX() != 512 || object.getY() != 550) {
return;
}
if (owner.getY() <= 550) {
doGate();
owner.teleport(513, 551, false);
} else {
if(owner.getSkillTotal() < 1150) { owner.getActionSender().sendMessage("You need a skill total of 1150 or more to enter"); return; }
doGate();
owner.teleport(513, 550, false);
}
break;
default:
owner.getActionSender().sendMessage("Nothing interesting happens.");
return;
}
} else if (command.equals("pick") || command.equals("pick banana")) {
switch (object.getID()) {
case 72: // Wheat
owner.getActionSender().sendMessage("You get some grain");
owner.getInventory().add(new InvItem(29, 1));
break;
case 191: // Potatos
owner.getActionSender().sendMessage("You pick a potato");
owner.getInventory().add(new InvItem(348, 1));
break;
case 313: // Flax
handleFlaxPickup();
break;
case 183: // Banana
owner.getActionSender().sendMessage("You pull a banana off the tree");
owner.getInventory().add(new InvItem(249, 1));
break;
default:
owner.getActionSender().sendMessage("Nothing interesting happens.");
return;
}
owner.getActionSender().sendInventory();
owner.getActionSender().sendSound("potato");
owner.setBusy(true);
Instance.getDelayedEventHandler().add(new SingleEvent(owner, 200) {
public void action() {
owner.setBusy(false);
}
});
} else if (command.equals("lure") || command.equals("bait") || command.equals("net") || command.equals("harpoon") || command.equals("cage")) {
owner.setSkillLoops(0);
handleFishing(click);
} else if (command.equals("chop")) {
handleWoodcutting(click);
} else if (command.equals("recharge at")) {
owner.getActionSender().sendMessage("You recharge at the altar.");
owner.getActionSender().sendSound("recharge");
int maxPray = object.getID() == 200 ? owner.getMaxStat(5) + 2 : owner.getMaxStat(5);
if (owner.getCurStat(5) < maxPray) {
owner.setCurStat(5, maxPray);
}
owner.getActionSender().sendStat(5);
} else if (command.equals("board")) {
owner.getActionSender().sendMessage("You must talk to the owner about this.");
} else if (EntityHandler.getAgilityDef(object.getID()) != null) {
handleAgility(object);
} else {
switch (object.getID()) {
case 613: // Shilo cart
if (object.getX() != 384 || object.getY() != 851) {
return;
}
owner.setBusy(true);
owner.getActionSender().sendMessage("You search for a way over the cart");
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
owner.getActionSender().sendMessage("You climb across");
if (owner.getX() <= 383) {
owner.teleport(386, 851, false);
} else {
owner.teleport(383, 851, false);
}
owner.setBusy(false);
}
});
break;
case 643: // Gnome tree stone
if (object.getX() != 416 || object.getY() != 161) {
return;
}// getCurStat(14
owner.setBusy(true);
owner.getActionSender().sendMessage("You twist the stone tile to one side");
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
owner.getActionSender().sendMessage("It reveals a ladder, you climb down");
owner.teleport(703, 3284, false);
owner.setBusy(false);
}
});
break;
case 638: // First roots in gnome cave
if (object.getX() != 701 || object.getY() != 3280) {
return;
}
// door
owner.setBusy(true);
owner.getActionSender().sendMessage("You push the roots");
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
owner.getActionSender().sendMessage("They wrap around you and drag you forwards");
owner.teleport(701, 3278, false);
owner.setBusy(false);
}
});
case 639: // Second roots in gnome cave
if (object.getX() != 701 || object.getY() != 3279) {
return;
}
owner.setBusy(true);
owner.getActionSender().sendMessage("You push the roots");
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
owner.getActionSender().sendMessage("They wrap around you and drag you forwards");
owner.teleport(701, 3281, false);
owner.setBusy(false);
}
});
break;
default:
owner.getActionSender().sendMessage("Nothing interesting happens.");
return;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void handleFlaxPickup() {
handleFlaxPickup((int)Math.ceil(owner.getMaxStat(12) / 10));
}
private void handleFlaxPickup(int times) {
if (!World.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
owner.getActionSender().sendMessage("You uproot a flax plant");
owner.getInventory().add(new InvItem(675, 1));
if(--times > 0) {
handleFlaxPickup(times);
}
}
private int[] coordModifier(Player player, boolean up) {
if (object.getGameObjectDef().getHeight() <= 1) {
return new int[] { player.getX(), Formulae.getNewY(player.getY(), up) };
}
int[] coords = { object.getX(), Formulae.getNewY(object.getY(), up) };
switch (object.getDirection()) {
case 0:
coords[1] -= (up ? -object.getGameObjectDef().getHeight() : 1);
break;
case 2:
coords[0] -= (up ? -object.getGameObjectDef().getHeight() : 1);
break;
case 4:
coords[1] += (up ? -1 : object.getGameObjectDef().getHeight());
break;
case 6:
coords[0] += (up ? -1 : object.getGameObjectDef().getHeight());
break;
}
return coords;
}
private void doGate() {
owner.getActionSender().sendSound("opendoor");
world.registerGameObject(new GameObject(object.getLocation(), 181, object.getDirection(), object.getType()));
world.delayedSpawnObject(object.getLoc(), 1000);
}
private void handleAgility(final GameObject object) {
if (!World.isMembers()) {
owner.getActionSender().sendMessage("This feature is only avaliable on a members server");
return;
}
final AgilityDef def = EntityHandler.getAgilityDef(object.getID());
if (owner.getCurStat(16) < def.getReqLevel()) {
owner.getActionSender().sendMessage("You need an agility level of " + def.getReqLevel() + " to try this obstacle");
return;
}
owner.setBusy(true);
owner.setStatus(Action.AGILITYING);
owner.getActionSender().sendMessage(def.getMessage());
if (Formulae.getHeight(def.getY()) == Formulae.getHeight(def.getToY()))
owner.setPath(new Path(def.getX(), def.getY(), def.getToX(), def.getToY(), true));
else
owner.teleport(def.getToX(), def.getToY(), false);
Instance.getDelayedEventHandler().add(new DelayedEvent(owner, 100) {
private boolean testedFail = false;
public void run() {
if (def.canFail() && !testedFail) {
if (owner.getX() >= ((def.getToX() + def.getX()) / 2) && owner.getY() >= ((def.getToY() + def.getY()) / 2)) // half
// way
// accross
// the
// obstacle
{
int damage = Formulae.failObstacle(owner, def.getReqLevel());
if (damage != -1) {
owner.getActionSender().sendMessage("You slip off the obstacle!");
owner.teleport(def.getFailX(), def.getFailY(), false);
owner.setBusy(false);
owner.setStatus(Action.IDLE);
owner.setLastDamage(damage);
int newHp = owner.getHits() - damage;
owner.setHits(newHp);
java.util.ArrayList<Player> playersToInform = new java.util.ArrayList<Player>();
playersToInform.addAll(owner.getViewArea().getPlayersInView());
for (Player p : playersToInform)
p.informOfModifiedHits(owner);
stop();
}
testedFail = true;
}
}
if (owner.getX() == def.getToX() && owner.getY() == def.getToY()) {
owner.getActionSender().sendMessage("You successfully make it to the other side of the obstacle");
owner.setBusy(false);
owner.setStatus(Action.IDLE);
owner.incExp(16, def.getExp(), true);
owner.getActionSender().sendStat(16);
AgilityCourseDef course = EntityHandler.getAgilityCourseDef(object.getID());
if (owner.getAgilityCourseDef() != null) // We're
// currently
// doing
// a
// course
{
course = owner.getAgilityCourseDef();
if (def.getOrder() == (owner.getCurrentCourseObject() + 1)) // We've
// used
// the
// next
// object
// in
// the
// sequence
{
if (object.getID() == course.getEndID() && object.getX() == course.getEndX() && object.getY() == course.getEndY()) // We've
// finished
// the
// course
{
owner.getActionSender().sendMessage("You have completed the " + course.getName() + " obstacle course!");
owner.incExp(16, course.getExp(), true);
owner.setAgilityCourseDef(null);
owner.setCurrentCourseObject(-1);
} else
owner.setCurrentCourseObject(def.getOrder()); // Continue
// the
// sequence
} else {
owner.setAgilityCourseDef(null); // We've
// broken
// the
// sequence,
// end
// the
// course
owner.setCurrentCourseObject(-1);
}
} else // We're not doing a course,
// so check if this object
// is the start of a new
// course
{
if (course != null) // It is, so
// we start
// a new
// agility
// course
{
owner.setAgilityCourseDef(course);
owner.setCurrentCourseObject(def.getOrder());
}
}
owner.getActionSender().sendStat(16);
stop();
}
}
});
}
private void handleFishing(final int click) {
int retries = (int)Math.ceil(owner.getMaxStat(10) / 10);
handleFishing(click,retries);
}
private void handleFishing(final int click, int passvalue) {
final int tries = --passvalue;
final ObjectFishingDef def = EntityHandler.getObjectFishingDef(object.getID(), click);
if (owner.isBusy()) {
return;
}
if (!owner.withinRange(object, 1))
return;
if (def == null) { // This shouldn't happen
return;
}
if (owner.getCurStat(10) < def.getReqLevel()) {
owner.getActionSender().sendMessage("You need a fishing level of " + def.getReqLevel() + " to fish here.");
return;
}
int netId = def.getNetId();
if (owner.getInventory().countId(netId) <= 0) {
owner.getActionSender().sendMessage("You need a " + EntityHandler.getItemDef(netId).getName() + " to catch these fish.");
return;
}
final int baitId = def.getBaitId();
if (baitId >= 0) {
if (owner.getInventory().countId(baitId) <= 0) {
owner.getActionSender().sendMessage("You don't have any " + EntityHandler.getItemDef(baitId).getName() + " left.");
return;
}
}
owner.setBusy(true);
owner.getActionSender().sendSound("fish");
Bubble bubble = new Bubble(owner, netId);
for (Player p : owner.getViewArea().getPlayersInView()) {
p.informOfBubble(bubble);
}
owner.getActionSender().sendMessage("You attempt to catch some fish");
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
ObjectFishDef def = Formulae.getFish(object.getID(), owner.getCurStat(10), click);
final int fishes = owner.getSkillLoops();
if (def != null) {
if (baitId >= 0) {
int idx = owner.getInventory().getLastIndexById(baitId);
InvItem bait = owner.getInventory().get(idx);
int newCount = bait.getAmount() - 1;
if (newCount <= 0) {
owner.getInventory().remove(idx);
} else {
bait.setAmount(newCount);
}
}
InvItem fish = new InvItem(def.getId());
owner.getInventory().add(fish);
owner.getActionSender().sendMessage("You catch a " + fish.getDef().getName() + ".");
owner.getActionSender().sendInventory();
owner.incExp(10, def.getExp(), true);
owner.getActionSender().sendStat(10);
} else {
owner.getActionSender().sendMessage("You fail to catch anything.");
}
owner.setBusy(false);
if(tries > 0) {
handleFishing(click,tries);
}
}
});
}
private void handleWoodcutting(final int click) {
int retries = (int)Math.ceil(owner.getMaxStat(8) / 10);
handleWoodcutting(click,retries);
}
private void handleWoodcutting(final int click, int passedvalue) {
final int tries = --passedvalue;
final ObjectWoodcuttingDef def = EntityHandler.getObjectWoodcuttingDef(object.getID());
if (owner.isBusy()) {
return;
}
if (!owner.withinRange(object, 2))
return;
if (def == null) { // This shoudln't happen
return;
}
if (owner.getCurStat(8) < def.getReqLevel()) {
owner.getActionSender().sendMessage("You need a woodcutting level of " + def.getReqLevel() + " to axe this tree.");
return;
}
int axeId = -1;
for (int a : Formulae.woodcuttingAxeIDs) {
if (owner.getInventory().countId(a) > 0) {
axeId = a;
break;
}
}
if (axeId < 0) {
owner.getActionSender().sendMessage("You need an axe to chop this tree down.");
return;
}
owner.setBusy(true);
Bubble bubble = new Bubble(owner, axeId);
for (Player p : owner.getViewArea().getPlayersInView()) {
p.informOfBubble(bubble);
}
owner.getActionSender().sendMessage("You swing your " + EntityHandler.getItemDef(axeId).getName() + " at the tree...");
final int axeID = axeId;
Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
public void action() {
if (Formulae.getLog(def, owner.getCurStat(8), axeID)) {
InvItem log = new InvItem(def.getLogId());
owner.getInventory().add(log);
owner.getActionSender().sendMessage("You get some wood.");
owner.getActionSender().sendInventory();
owner.incExp(8, def.getExp(), true);
owner.getActionSender().sendStat(8);
if (DataConversions.random(1, 100) <= def.getFell()) {
world.registerGameObject(new GameObject(object.getLocation(), 4, object.getDirection(), object.getType()));
world.delayedSpawnObject(object.getLoc(), def.getRespawnTime() * 1000);
owner.setBusy(false);
}
else {
owner.setBusy(false);
if(tries > 0) {
handleWoodcutting(click,tries);
}
}
} else {
owner.getActionSender().sendMessage("You slip and fail to hit the tree.");
owner.setBusy(false);
if(tries > 0) {
handleWoodcutting(click,tries);
}
}
}
});
}
private void replaceGameObject(int newID, boolean open) {
world.registerGameObject(new GameObject(object.getLocation(), newID, object.getDirection(), object.getType()));
owner.getActionSender().sendSound(open ? "opendoor" : "closedoor");
}
});
}
}