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

1399 lines
42 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();
//mining
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.setClick(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));
}//champ
//600
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 60 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);
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);
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");
}
});
}
}