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

1585 lines
50 KiB
Java

package org.moparscape.msc.gs.phandler.client;
import java.util.List;
import org.apache.mina.common.IoSession;
import org.moparscape.msc.config.Constants.GameServer;
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.MiniEvent;
import org.moparscape.msc.gs.event.ShortEvent;
import org.moparscape.msc.gs.event.WalkToObjectEvent;
import org.moparscape.msc.gs.external.EntityHandler;
import org.moparscape.msc.gs.external.ItemCookingDef;
import org.moparscape.msc.gs.external.ItemCraftingDef;
import org.moparscape.msc.gs.external.ItemSmeltingDef;
import org.moparscape.msc.gs.external.ItemSmithingDef;
import org.moparscape.msc.gs.external.ItemWieldableDef;
import org.moparscape.msc.gs.external.ReqOreDef;
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.MenuHandler;
import org.moparscape.msc.gs.model.Npc;
import org.moparscape.msc.gs.model.Player;
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.quests.Dorics;
import org.moparscape.msc.gs.quest.Quest;
import org.moparscape.msc.gs.quest.QuestAction;
import org.moparscape.msc.gs.states.Action;
import org.moparscape.msc.gs.tools.DataConversions;
import org.moparscape.msc.gs.util.Logger;
public class InvUseOnObject implements PacketHandler {
/**
* World instance
*/
public static final World world = Instance.getWorld();
//f2p
private void handleDoor(final Player player, final ActiveTile tile,
final GameObject object, final int dir, final InvItem item) {
player.setStatus(Action.USING_INVITEM_ON_DOOR);
Instance.getDelayedEventHandler().add(
new WalkToObjectEvent(player, object, false) {
public void arrived() {
owner.resetPath();
if (owner.isBusy()
|| owner.isRanging()
|| !owner.getInventory().contains(item)
|| !tile.hasGameObject()
|| !tile.getGameObject().equals(object)
|| owner.getStatus() != Action.USING_INVITEM_ON_DOOR) {
return;
}
owner.resetAll();
switch (object.getID()) {
case 24: // Web
ItemWieldableDef def = item.getWieldableDef();
if ((def == null || def.getWieldPos() != 4)
&& item.getID() != 13) {
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}//case 177
owner.getActionSender().sendMessage(
"You try to destroy the web");
owner.setBusy(true);
Instance.getDelayedEventHandler().add(
new ShortEvent(owner) {
public void action() {
if (Formulae.cutWeb()) {
owner.getActionSender()
.sendMessage(
"You slice through the web.");
world.unregisterGameObject(object);
world.delayedSpawnObject(
object.getLoc(), 15000);
} else {
owner.getActionSender()
.sendMessage(
"You fail to cut through it.");
}
owner.setBusy(false);
}
});
break;
case 23: // Giant place near barb village
if (!itemId(new int[] { 99 })) {
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
owner.getActionSender().sendMessage(
"You unlock the door and go through it");
doDoor();
if (owner.getY() <= 484) {
owner.teleport(owner.getX(), 485, false);
} else {
owner.teleport(owner.getX(), 484, false);
}
break;
case 60: // Melzars maze
if (!itemId(new int[] { 421 })) {
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
owner.getActionSender().sendMessage(
"You unlock the door and go through it");
doDoor();
if (owner.getX() <= 337) {
owner.teleport(338, owner.getY(), false);
}
break;
default:
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
owner.getActionSender().sendInventory();
}
private void doDoor() {
owner.getActionSender().sendSound("opendoor");
world.registerGameObject(new GameObject(object
.getLocation(), 11, object.getDirection(),
object.getType()));
world.delayedSpawnObject(object.getLoc(), 1000);
}
private boolean itemId(int[] ids) {
return DataConversions.inArray(ids, item.getID());
}
});
}
private void handleObject(final Player player, final ActiveTile tile,
final GameObject object, final InvItem item) {
player.setStatus(Action.USING_INVITEM_ON_OBJECT);
Instance.getDelayedEventHandler().add(
new WalkToObjectEvent(player, object, false) {
public void arrived() {
owner.resetPath();
if (owner.isBusy()
|| owner.isRanging()
|| !owner.getInventory().contains(item)
|| !owner.nextTo(object)
|| !tile.hasGameObject()
|| !tile.getGameObject().equals(object)
|| owner.getStatus() != Action.USING_INVITEM_ON_OBJECT) {
return;
}
owner.resetAll();
String[] options;
if ((object.getID() == Dorics.ANVIL1_ID
&& object.getX() == Dorics.ANVIL1_X && object
.getY() == Dorics.ANVIL1_Y)
|| (object.getID() == Dorics.ANVIL2_ID
&& object.getX() == Dorics.ANVIL2_X && object
.getY() == Dorics.ANVIL2_Y)) {
if (owner.getQuestStage(7) != Quest.COMPLETE) {
Npc npc = World.getWorld().getNpc(
Dorics.DORIC_ID, 323, 327, 487, 492);
if (npc == null) {
player.getActionSender()
.sendMessage(
"You need to complete Doric's quest to use his anvils");
player.setBusy(false);
return;
} else {
owner.informOfNpcMessage(new ChatMessage(
npc, "Oi! Get off my anvil!", owner));
Instance.getWorld()
.getDelayedEventHandler()
.add(new MiniEvent(owner) {
public void action() {
player.getActionSender()
.sendMessage(
"You need to complete Doric's quest to use his anvils");
player.setBusy(false);
return;
}
});
return;
}
} else {
player.setBusy(false);
}
}
World.getQuestManager().handleAction(
QuestAction.ITEM_USED_ON_OBJECT,
new Object[] { item, object }, owner);
int[] range = { 317, 254, 255, 256, 339, 324 };
if (object.getGameObjectDef().name
.equalsIgnoreCase("fire")) {
for (Integer i : range) {
if (item.getID() == i) {
owner.getActionSender().sendMessage(
"You cannot cook this on a fire");
return;
}
}
}
int[] sinks = { 48, 26, 86, 2, 466 };
if (item.getID() == 341) {
for (Integer i : sinks) {
if (i == object.getID()) {
if (owner.getInventory().remove(
new InvItem(item.getID())) > -1) {
owner.getActionSender().sendSound(
"filljug");
owner.getActionSender()
.sendMessage(
"You fill up the bowl with water");
owner.getInventory().add(
new InvItem(342));
owner.getActionSender().sendInventory();
return;
}
}
}
}
if (item.getID() == 132) {
if (object.getID() == 97 || object.getID() == 11
|| object.getID() == 435) {
player.setBusy(true);
player.getActionSender()
.sendMessage(
"You cook the "
+ item.getDef().name
+ " on the "
+ object.getGameObjectDef().name);
player.getInventory().remove(132, 1);
player.getActionSender().sendInventory();
Instance.getDelayedEventHandler().add(
new MiniEvent(owner, 2000) {
public void action() {
player.getActionSender()
.sendMessage(
"You burn the "
+ item.getDef().name);
player.getInventory().add(
new InvItem(134));
player.getActionSender()
.sendInventory();
player.setBusy(false);
}
});
return;
}
}
if (object.getX() == 233 && object.getY() == 180) {
if (item.getID() == 414) {
if (owner.getInventory().remove(
new InvItem(414)) > -1) {
owner.setBusy(true);
owner.getActionSender().sendMessage(
"you open the secret chest..");
Instance.getDelayedEventHandler().add(
new MiniEvent(owner, 1000) {
public void action() {
owner.setBusy(false);
owner.getActionSender()
.sendMessage(
"you find treasure!");
owner.getInventory().add(
new InvItem(158));
owner.getInventory().add(
new InvItem(173));
owner.getInventory().add(
new InvItem(64));
owner.getInventory().add(
new InvItem(42, 2));
owner.getInventory().add(
new InvItem(38, 2));
owner.getInventory()
.add(new InvItem(
41, 10));
owner.getInventory()
.add(new InvItem(
10, 50));
owner.getActionSender()
.sendInventory();
return;
}
});
}
}
}
switch (object.getID()) {
case 52: // hopper
if (item.getID() == 29) {
if (object.containsItem() == 29) {
owner.getActionSender()
.sendMessage(
"There is already grain in the hopper");
return;
}
if (owner.getInventory().remove(item) > -1) {
Bubble bubble = new Bubble(player, 29);
for (Player p : player.getViewArea()
.getPlayersInView()) {
p.informOfBubble(bubble);
}
owner.getActionSender().sendMessage(
"You put the grain in the hopper");
object.containsItem(29);
owner.getActionSender().sendInventory();
}
return;
}
case 282: // Fountain of Heroes
if (!Server.isMembers()) {
owner.getActionSender().sendMessage(
GameServer.P2P_LIMIT_MESSAGE);
return;
}
if (item.getID() == 522) {
owner.getActionSender()
.sendMessage(
"You dip the amulet in the fountain...");
owner.setBusy(true);
Instance.getDelayedEventHandler().add(
new ShortEvent(owner) {
public void action() {
owner.getActionSender()
.sendMessage(
"You feel more power coming from it than before.");
Instance.getDelayedEventHandler()
.add(new ShortEvent(
owner) {
public void action() {
if (owner
.getInventory()
.remove(item) > -1) {
owner.getActionSender()
.sendMessage(
"You can now rub it to teleport.");
owner.getInventory()
.add(new InvItem(
597));
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
}
});
}
});
break;
}
case 2: // Well
case 466: // Well
case 814: // Well
case 48: // Sink
case 26: // Fountain
case 86: // Fountain
case 1130: // Fountain
handleRefill();
break;
case 97: // Fire
case 11:
case 119:
case 274:
case 435:
case 491: // Range
handleCooking((int) Math.ceil(owner.getMaxStat(7) / 10));
break;
case 118:
case 813: // Furnace
if (item.getID() == 172) { // Gold Bar (Crafting)
world.getDelayedEventHandler().add(
new MiniEvent(owner) {
public void action() {
owner.getActionSender()
.sendMessage(
"What would you like to make?");
String[] options = new String[] {
"Ring", "Necklace",
"Amulet" };
owner.setMenuHandler(new MenuHandler(
options) {
public void handleReply(
int option,
String reply) {
if (owner.isBusy()
|| option < 0
|| option > 2) {
return;
}
final int[] moulds = {
293, 295, 294 };
final int[] gems = {
-1, 164, 163,
162, 161, 523 };
String[] options = {
"Gold",
"Sapphire",
"Emerald",
"Ruby",
"Diamond",
"Dragonstone" };
final int craftType = option;
if (owner
.getInventory()
.countId(
moulds[craftType]) < 1) {
owner.getActionSender()
.sendMessage(
"You need a "
+ EntityHandler
.getItemDef(
moulds[craftType])
.getName()
+ " to make a "
+ reply);
return;
}
owner.getActionSender()
.sendMessage(
"What type of "
+ reply
+ " would you like to make?");
owner.setMenuHandler(new MenuHandler(
options) {
public void handleReply(
int option,
String reply) {
if (owner
.isBusy()
|| option < 0
|| option > 5) {
return;
}
if (option != 0
&& owner.getInventory()
.countId(
gems[option]) < 1) {
owner.getActionSender()
.sendMessage(
"You don't have a "
+ reply
+ ".");
return;
}
ItemCraftingDef def = EntityHandler
.getCraftingDef((option * 3)
+ craftType);
if (def == null) {
owner.getActionSender()
.sendMessage(
"Nothing interesting happens.");
return;
}
if (owner
.getCurStat(12) < def
.getReqLevel()) {
owner.getActionSender()
.sendMessage(
"You need at crafting level of "
+ def.getReqLevel()
+ " to make this");
return;
}
if (owner
.getInventory()
.remove(item) > -1
&& (option == 0 || owner
.getInventory()
.remove(gems[option],
1) > -1)) {
showBubble();
InvItem result = new InvItem(
def.getItemID(),
1);
owner.getActionSender()
.sendMessage(
"You make a "
+ result.getDef()
.getName());
owner.getInventory()
.add(result);
owner.incExp(
12,
def.getExp(),
true,
true);
owner.getActionSender()
.sendStat(
12);
owner.getActionSender()
.sendInventory();
}
}
});
owner.getActionSender()
.sendMenu(
options);
}
});
owner.getActionSender()
.sendMenu(options);
}
});
}
if (item.getID() == 384) { // Silver Bar (Crafting)
world.getDelayedEventHandler().add(
new MiniEvent(owner) {
public void action() {
owner.getActionSender()
.sendMessage(
"What would you like to make?");
String[] options = new String[] {
"Holy Symbol of Saradomin",
"UnHoly Symbol of Zamorak" };
owner.setMenuHandler(new MenuHandler(
options) {
public void handleReply(
int option,
String reply) {
if (owner.isBusy()
|| option < 0
|| option > 1) {
return;
}
int[] moulds = { 386,
1026 };
int[] results = { 44,
1027 };
if (owner
.getInventory()
.countId(
moulds[option]) < 1) {
owner.getActionSender()
.sendMessage(
"You need a "
+ EntityHandler
.getItemDef(
moulds[option])
.getName()
+ " to make a "
+ reply);
return;
}
if (owner
.getCurStat(12) < 16) {
owner.getActionSender()
.sendMessage(
"You need a crafting level of 16 to make this");
return;
}
if (owner
.getInventory()
.remove(item) > -1) {
showBubble();
InvItem result = new InvItem(
results[option]);
owner.getActionSender()
.sendMessage(
"You make a "
+ result.getDef()
.getName());
owner.getInventory()
.add(result);
owner.incExp(12,
50, true,
true);
owner.getActionSender()
.sendStat(
12);
owner.getActionSender()
.sendInventory();
}
}
});
owner.getActionSender()
.sendMenu(options);
}
});
} else if (item.getID() == 625) { // Sand (Glass)
if (!Server.isMembers()) {
owner.getActionSender()
.sendMessage(
GameServer.P2P_LIMIT_MESSAGE);
return;
}
if (player.getInventory().countId(624) < 1) {
owner.getActionSender()
.sendMessage(
"You need some soda ash to mix the sand with.");
return;
}
owner.setBusy(true);
showBubble();
owner.getActionSender()
.sendMessage(
"You put the seaweed and the soda ash in the furnace.");
Instance.getDelayedEventHandler().add(
new ShortEvent(owner) {
public void action() {
if (player.getInventory()
.remove(624, 1) > -1
&& player
.getInventory()
.remove(item) > -1) {
owner.getActionSender()
.sendMessage(
"It mixes to make some molten glass");
owner.getInventory()
.add(new InvItem(
623, 1));
owner.incExp(12, 20, true);
owner.getActionSender()
.sendStat(12);
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
}
});
} else {
handleRegularSmelting();
}
break;
case 50:
case 177: // Anvil
int minSmithingLevel = Formulae.minSmithingLevel(item.getID());
if(minSmithingLevel < 0) {
owner.getActionSender().sendMessage("Nothing interesting happens.");
return;
}
if(owner.getInventory().countId(168) < 1) {
owner.getActionSender().sendMessage("You need a hammer to work the metal with.");
return;
}
if(owner.getCurStat(13) < minSmithingLevel) {
owner.getActionSender().sendMessage("You need a smithing level of " + minSmithingLevel + " to use this type of bar");
return;
}
options = new String[]{"Make Weapon", "Make Armour", "Make Missile Heads", "Cancel"};
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if(owner.isBusy()) {
return;
}
String[] options;
switch(option) {
case 0:
owner.getActionSender().sendMessage("Choose a type of weapon to make");
options = new String[]{"Dagger", "Throwing Knife", "Sword", "Axe", "Mace"};
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if(owner.isBusy()) {
return;
}
String[] options;
switch(option) {
case 0:
handleSmithing(item.getID(), 0);
break;
case 1:
if(Server.isMembers()) {
player.getActionSender().sendMessage(GameServer.P2P_LIMIT_MESSAGE);
break;
}
handleSmithing(item.getID(), 1);
break;
case 2:
owner.getActionSender().sendMessage("What sort of sword do you want to make?");
options = new String[]{"Short Sword", "Long Sword (2 bars)", "Scimitar (2 bars)", "2-handed Sword (3 bars)"};
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if(owner.isBusy()) {
return;
}
switch(option) {
case 0:
handleSmithing(item.getID(), 2);
break;
case 1:
handleSmithing(item.getID(), 3);
break;
case 2:
handleSmithing(item.getID(), 4);
break;
case 3:
handleSmithing(item.getID(), 5);
break;
default:
return;
}
}
});
owner.getActionSender().sendMenu(options);
break;
case 3:
owner.getActionSender().sendMessage("What sort of axe do you want to make?");
options = new String[]{"Hatchet", "Pickaxe", "Battle Axe (3 bars)"};
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if(owner.isBusy()) {
return;
}
switch(option) {
case 0:
handleSmithing(item.getID(), 6);
break;
case 1:
handleSmithing(item.getID(), 7);
break;
case 2:
handleSmithing(item.getID(), 8);
break;
default:
return;
}
}
});
owner.getActionSender().sendMenu(options);
break;
case 4:
handleSmithing(item.getID(), 9);
break;
default:
return;
}
}
});
owner.getActionSender().sendMenu(options);
break;
case 1:
owner.getActionSender().sendMessage("Choose a type of armour to make");
options = new String[]{"Helmet", "Shield", "Armour"};
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if(owner.isBusy()) {
return;
}
switch(option) {
case 0:
owner.getActionSender().sendMessage("What sort of helmet do you want to make?");
options = new String[]{"Medium Helmet", "Large Helmet (2 bars)"};
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if(owner.isBusy()) {
return;
}
switch(option) {
case 0:
handleSmithing(item.getID(), 10);
break;
case 1:
handleSmithing(item.getID(), 11);
break;
default:
return;
}
}
});
owner.getActionSender().sendMenu(options);
break;
case 1:
owner.getActionSender().sendMessage("What sort of shield do you want to make?");
options = new String[]{"Square Shield (2 bars)", "Kite Shield (3 bars)"};
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if(owner.isBusy()) {
return;
}
switch(option) {
case 0:
handleSmithing(item.getID(), 12);
break;
case 1:
handleSmithing(item.getID(), 13);
break;
default:
return;
}
}
});
owner.getActionSender().sendMenu(options);
break;
case 2:
owner.getActionSender().sendMessage("What sort of armour do you want to make?");
options = new String[]{"Chain Mail Body (3 bars)", "Plate Mail Body (5 bars)", "Plate Mail Legs (3 bars)", "Plated Skirt (3 bars)"};
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if(owner.isBusy()) {
return;
}
switch(option) {
case 0:
handleSmithing(item.getID(), 14);
break;
case 1:
handleSmithing(item.getID(), 15);
break;
case 2:
handleSmithing(item.getID(), 16);
break;
case 3:
handleSmithing(item.getID(), 17);
break;
default:
return;
}
}
});
owner.getActionSender().sendMenu(options);
break;
default:
return;
}
}
});
owner.getActionSender().sendMenu(options);
break;
case 2:
if(Server.isMembers()) {
player.getActionSender().sendMessage(GameServer.P2P_LIMIT_MESSAGE);
break;
}
options = new String[]{"Make 10 Arrow Heads", "Make 50 Arrow Heads (5 bars)", "Forge Dart Tips", "Cancel"};
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if(owner.isBusy()) {
return;
}
switch(option) {
case 0:
handleSmithing(item.getID(), 18);
break;
case 1:
handleSmithing(item.getID(), 19);
break;
case 2:
handleSmithing(item.getID(), 20);
break;
default:
return;
}
}
});
owner.getActionSender().sendMenu(options);
break;
default:
return;
}
}
});
owner.getActionSender().sendMenu(options);
break;
case 121: // Spinning Wheel
switch (item.getID()) {
case 145: // Wool
handleWoolSpinning();
break;
case 675: // Flax
handleFlaxSpinning();
break;
default:
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
owner.setBusy(true);
showBubble();
owner.getActionSender().sendSound("mechanical");
break;
case 248: // Crystal key chest
if (item.getID() != 525) {
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
if (!Server.isMembers()) {
owner.getActionSender().sendMessage(
GameServer.P2P_LIMIT_MESSAGE);
return;
}
owner.getActionSender().sendMessage(
"You use the key to unlock the chest");
owner.setBusy(true);
showBubble();
Instance.getDelayedEventHandler().add(
new ShortEvent(owner) {
public void action() {
if (owner.getInventory().remove(
item) > -1) {
owner.getInventory().add(
new InvItem(542, 1));
List<InvItem> loot = Formulae
.getKeyChestLoot();
for (InvItem i : loot) {
if (i.getAmount() > 1
&& !i.getDef()
.isStackable()) {
for (int x = 0; x < i
.getAmount(); x++) {
owner.getInventory()
.add(new InvItem(
i.getID(),
1));
}
} else {
if (i.getID() == 518
&& i.getAmount() > 20) {
i = new InvItem(
518,
DataConversions
.random(0,
20) + 1);
}
if (i.getID() == 517
&& i.getAmount() > 20) {
i = new InvItem(
517,
DataConversions
.random(0,
20) + 1);
}
Logger.println("Player: "
+ owner.getUsername()
+ " Got item: "
+ i.getID()
+ " From CHEST ("
+ i.getAmount()
+ ") sys time ("
+ GameEngine
.getTime()
+ ")");
if (i.getAmount() > 4000) {
Logger.println("WARNING!!!! Player: "
+ owner.getUsername()
+ " was about to get "
+ i.getAmount()
+ " of "
+ i.getID()
+ " from the CHEST sys time ("
+ GameEngine
.getTime()
+ ")");
owner.setBusy(false);
owner.getActionSender()
.sendInventory();
return;
}
owner.getInventory()
.add(i);
}
}
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
}
});
break;
case 302: // Sandpit
if (item.getID() != 21) {
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
owner.getActionSender().sendMessage(
"You fill the bucket with sand.");
owner.setBusy(true);
showBubble();
Instance.getDelayedEventHandler().add(
new MiniEvent(owner) {
public void action() {
if (owner.getInventory().remove(
item) > -1) {
owner.getInventory().add(
new InvItem(625, 1));
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
}
});
break;
case 179: // Potters Wheel
if (item.getID() != 243) {
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
owner.getActionSender().sendMessage(
"What would you like to make?");
options = new String[] { "Pot", "Pie Dish", "Bowl",
"Cancel" };
owner.setMenuHandler(new MenuHandler(options) {
public void handleReply(int option, String reply) {
if (owner.isBusy()) {
return;
}
int reqLvl, exp;
InvItem result;
switch (option) {
case 0:
result = new InvItem(279, 1);
reqLvl = 1;
exp = 6;
break;
case 1:
result = new InvItem(278, 1);
reqLvl = 4;
exp = 10;
break;
case 2:
result = new InvItem(340, 1);
reqLvl = 7;
exp = 10;
break;
default:
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
if (owner.getCurStat(12) < reqLvl) {
owner.getActionSender().sendMessage(
"You need a crafting level of "
+ reqLvl
+ " to make this");
return;
}
if (owner.getInventory().remove(item) > -1) {
showBubble();
owner.getActionSender().sendMessage(
"You make a "
+ result.getDef()
.getName());
owner.getInventory().add(result);
owner.incExp(12, exp, true);
owner.getActionSender().sendStat(12);
owner.getActionSender().sendInventory();
}
}
});
owner.getActionSender().sendMenu(options);
break;
case 178: // Potters Oven
int reqLvl,
xp,
resultID;
switch (item.getID()) {
case 279: // Pot
resultID = 135;
reqLvl = 1;
xp = 7;
break;
case 278: // Pie Dish
resultID = 251;
reqLvl = 4;
xp = 15;
break;
case 340: // Bowl
resultID = 341;
reqLvl = 7;
xp = 15;
break;
default:
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
if (owner.getCurStat(12) < reqLvl) {
owner.getActionSender().sendMessage(
"You need a crafting level of "
+ reqLvl + " to make this");
return;
}
final InvItem result = new InvItem(resultID, 1);
final int exp = xp;
final boolean fail = Formulae.crackPot(reqLvl,
owner.getCurStat(12));
showBubble();
owner.getActionSender().sendMessage(
"You place the " + item.getDef().getName()
+ " in the oven");
owner.setBusy(true);
Instance.getDelayedEventHandler().add(
new ShortEvent(owner) {
public void action() {
if (owner.getInventory().remove(
item) > -1) {
if (fail) {
owner.getActionSender()
.sendMessage(
"The "
+ result.getDef()
.getName()
+ " cracks in the oven, you throw it away.");
} else {
owner.getActionSender()
.sendMessage(
"You take out the "
+ result.getDef()
.getName());
owner.getInventory().add(
result);
owner.incExp(12, exp, true);
owner.getActionSender()
.sendStat(12);
}
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
}
});
break;
default:
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
}
private void handleWoolSpinning() {
handleWoolSpinning((int) Math.ceil(owner.getMaxStat(12) / 10));
}
private void handleWoolSpinning(int times) {
final int retries = --times;
owner.getActionSender()
.sendMessage(
"You spin the sheeps wool into a nice ball of wool");
Instance.getDelayedEventHandler().add(
new MiniEvent(owner) {
public void action() {
if (owner.getInventory().remove(item) > -1) {
owner.getInventory().add(
new InvItem(207, 1));
owner.incExp(12, 3, true);
owner.getActionSender()
.sendStat(12);
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
if (retries > 0) {
handleWoolSpinning(retries);
}
}
});
}
private void handleFlaxSpinning() {
handleFlaxSpinning((int) Math.ceil(owner.getMaxStat(12) / 10));
}
private void handleFlaxSpinning(int times) {
final int retries = --times;
if (!Server.isMembers()) {
owner.getActionSender().sendMessage(
GameServer.P2P_LIMIT_MESSAGE);
return;
}
if (owner.getCurStat(12) < 10) {
owner.getActionSender()
.sendMessage(
"You need a crafting level of 10 to spin flax");
return;
}
owner.getActionSender().sendMessage(
"You make the flax into a bow string");
Instance.getDelayedEventHandler().add(
new MiniEvent(owner) {
public void action() {
if (owner.getInventory().remove(item) > -1) {
owner.getInventory().add(
new InvItem(676, 1));
owner.incExp(12, 15, true);
owner.getActionSender()
.sendStat(12);
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
if (retries > 0) {
handleFlaxSpinning(retries);
}
}
});
}
private void handleRegularSmelting() {
handleRegularSmelting((int) Math.ceil(owner
.getMaxStat(13) / 10));
}
private void handleRegularSmelting(int times1) {
final int times = --times1;
ItemSmeltingDef smeltingDef = item.getSmeltingDef();
if (smeltingDef == null) {
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
for (ReqOreDef reqOre : smeltingDef.getReqOres()) {
if (owner.getInventory().countId(reqOre.getId()) < reqOre
.getAmount()) {
if (item.getID() == 151) {
smeltingDef = EntityHandler
.getItemSmeltingDef(9999);
break;
}
owner.getActionSender()
.sendMessage(
"You need "
+ reqOre.getAmount()
+ " "
+ EntityHandler
.getItemDef(
reqOre.getId())
.getName()
+ " to smelt a "
+ item.getDef()
.getName()
+ ".");
return;
}
}
if (owner.getCurStat(13) < smeltingDef.getReqLevel()) {
owner.getActionSender().sendMessage(
"You need a smithing level of "
+ smeltingDef.getReqLevel()
+ " to smelt this.");
return;
}
if (!owner.getInventory().contains(item)) {
return;
}
owner.setBusy(true);
showBubble();
owner.getActionSender().sendMessage(
"You smelt the " + item.getDef().getName()
+ " in the furnace.");
final ItemSmeltingDef def = smeltingDef;
Instance.getDelayedEventHandler().add(
new ShortEvent(owner) {
public void action() {
InvItem bar = new InvItem(def
.getBarId());
if (owner.getInventory().remove(item) > -1) {
for (ReqOreDef reqOre : def
.getReqOres()) {
for (int i = 0; i < reqOre
.getAmount(); i++) {
owner.getInventory()
.remove(new InvItem(
reqOre.getId()));
}
}
if (item.getID() == 151
&& def.getReqOres().length == 0
&& DataConversions.random(
0, 1) == 1) {
owner.getActionSender()
.sendMessage(
"The ore is too impure and unable to be refined.");
} else {
owner.getInventory().add(bar);
owner.getActionSender()
.sendMessage(
"You retrieve a "
+ bar.getDef()
.getName()
+ ".");
owner.incExp(13, def.getExp(),
true);
owner.getActionSender()
.sendStat(13);
}
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
if (times > 0)
handleRegularSmelting(times);
}
});
}
private void handleRefill() {
handleRefill((int) Math.ceil(owner.getMaxStat(15) / 10));
}
private void handleRefill(int times) {
if (!itemId(new int[] { 21, 140, 465 })
&& !itemId(Formulae.potionsUnfinished)
&& !itemId(Formulae.potions1Dose)
&& !itemId(Formulae.potions2Dose)
&& !itemId(Formulae.potions3Dose)) {
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
if (owner.getInventory().remove(item) > -1) {
showBubble();
owner.getActionSender().sendSound("filljug");
switch (item.getID()) {
case 21:
owner.getInventory().add(new InvItem(50));
break;
case 140:
owner.getInventory().add(new InvItem(141));
break;
default:
owner.getInventory().add(new InvItem(464));
break;
}
owner.getActionSender().sendInventory();
if (--times > 0) {
handleRefill(times);
}
}
}
private void handleCooking(int passedvalue) {
final int tries = --passedvalue;
if (item.getID() == 622) { // Seaweed (Glass)
if (!Server.isMembers()) {
owner.getActionSender().sendMessage(
GameServer.P2P_LIMIT_MESSAGE);
return;
}
owner.setBusy(true);
showBubble();
owner.getActionSender().sendSound("cooking");
owner.getActionSender().sendMessage(
"You put the seaweed on the "
+ object.getGameObjectDef()
.getName() + ".");
Instance.getDelayedEventHandler().add(
new ShortEvent(owner) {
public void action() {
if (owner.getInventory().remove(
item) > -1) {
owner.getActionSender()
.sendMessage(
"The seaweed burns to ashes");
owner.getInventory().add(
new InvItem(624, 1));
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
if (tries > 0) {
handleCooking(tries);
}
}
});
} else {
final ItemCookingDef cookingDef = item
.getCookingDef();
if (cookingDef == null) {
owner.getActionSender().sendMessage(
"Nothing interesting happens.");
return;
}
if (owner.getCurStat(7) < cookingDef.getReqLevel()) {
owner.getActionSender().sendMessage(
"You need a cooking level of "
+ cookingDef.getReqLevel()
+ " to cook this.");
return;
}
owner.setBusy(true);
showBubble();
owner.getActionSender().sendSound("cooking");
owner.getActionSender().sendMessage(
"You cook the "
+ item.getDef().getName()
+ " on the "
+ object.getGameObjectDef()
.getName() + ".");
Instance.getDelayedEventHandler().add(
new ShortEvent(owner) {
public void action() {
InvItem cookedFood = new InvItem(
cookingDef.getCookedId());
if (owner.getInventory().remove(
item) > -1) {
if (!Formulae.burnFood(
item.getID(),
owner.getCurStat(7))) {
owner.getInventory().add(
cookedFood);
owner.getActionSender()
.sendMessage(
"The "
+ item.getDef()
.getName()
+ " is now nicely cooked.");
owner.incExp(
7,
cookingDef.getExp(),
true);
owner.getActionSender()
.sendStat(7);
} else {
owner.getInventory()
.add(new InvItem(
cookingDef
.getBurnedId()));
owner.getActionSender()
.sendMessage(
"You accidently burn the "
+ item.getDef()
.getName()
+ ".");
}
owner.getActionSender()
.sendInventory();
}
owner.setBusy(false);
if (tries > 0
&& owner.getInventory()
.contains(item)) {
handleCooking(tries);
}
}
});
}
}
private void handleSmithing(int barID, int toMake) {
ItemSmithingDef def = EntityHandler.getSmithingDef((Formulae.getBarType(barID) * 21) + toMake);
if(def == null) {
owner.getActionSender().sendMessage("Nothing interesting happens.");
return;
}
if(owner.getCurStat(13) < def.getRequiredLevel()) {
owner.getActionSender().sendMessage("You need at smithing level of " + def.getRequiredLevel() + " to make this");
return;
}
if(owner.getInventory().countId(barID) < def.getRequiredBars()) {
owner.getActionSender().sendMessage("You don't have enough bars to make this.");
return;
}
owner.getActionSender().sendSound("anvil");
for(int x = 0;x < def.getRequiredBars();x++) {
owner.getInventory().remove(new InvItem(barID, 1));
}
Bubble bubble = new Bubble(owner, item.getID());
for(Player p : owner.getViewArea().getPlayersInView()) {
p.informOfBubble(bubble);
}
if(EntityHandler.getItemDef(def.getItemID()).isStackable()) {
owner.getActionSender().sendMessage("You hammer the metal into some " + EntityHandler.getItemDef(def.getItemID()).getName());
owner.getInventory().add(new InvItem(def.getItemID(), def.getAmount()));
}
else {
owner.getActionSender().sendMessage("You hammer the metal into a " + EntityHandler.getItemDef(def.getItemID()).getName());
for(int x = 0;x < def.getAmount();x++) {
owner.getInventory().add(new InvItem(def.getItemID(), 1));
}
}
owner.incExp(13, Formulae.getSmithingExp(barID, def.getRequiredBars()), true, true);
owner.getActionSender().sendStat(13);
owner.getActionSender().sendInventory();
}
private boolean itemId(int[] ids) {
return DataConversions.inArray(ids, item.getID());
}
private void showBubble() {
Bubble bubble = new Bubble(owner, item.getID());
for (Player p : owner.getViewArea().getPlayersInView()) {
p.informOfBubble(bubble);
}
}
});
}
public void handlePacket(Packet p, IoSession session) throws Exception {
Player player = (Player) session.getAttachment();
int pID = ((RSCPacket) p).getID();
if (player.isBusy()) {
player.resetPath();// sendSound
return;
}
player.resetAll();
ActiveTile tile = world.getTile(p.readShort(), p.readShort());
if (tile == null) {
player.setSuspiciousPlayer(true);
player.resetPath();
return;
}
GameObject object = tile.getGameObject();
InvItem item;
switch (pID) {
case 36: // Use Item on Door
int dir = p.readByte();
item = player.getInventory().get(p.readShort());
if (object == null || object.getType() == 0 || item == null) { // This
// shoudln't
// happen
player.setSuspiciousPlayer(true);
return;
}
world.addEntryToSnapshots(new Activity(player.getUsername(), player
.getUsername()
+ " used item on door"
+ item.getDef().getName()
+ "("
+ item.getID()
+ ")"
+ " [CMD: "
+ item.getDef().getCommand()
+ "] ON A DOOR ("
+ tile.getX()
+ "/"
+ tile.getY()
+ ") at: "
+ player.getX() + "/" + player.getY()));
handleDoor(player, tile, object, dir, item);
break;
case 94: // Use Item on GameObject
item = player.getInventory().get(p.readShort());
if (object == null || object.getType() == 1 || item == null) { // This
// shoudln't
// happen
player.setSuspiciousPlayer(true);
return;
}
world.addEntryToSnapshots(new Activity(player.getUsername(), player
.getUsername()
+ " used item on GameObject"
+ item.getDef().getName()
+ "("
+ item.getID()
+ ")"
+ " [CMD: "
+ item.getDef().getCommand()
+ "] ON A DOOR ("
+ tile.getX()
+ "/"
+ tile.getY()
+ ") at: "
+ player.getX() + "/" + player.getY()));
handleObject(player, tile, object, item);
break;
}
tile.cleanItself();
}
}