Rewrote fruit cutting plugin as listener
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
package content.global.handlers.item.withitem
|
||||
|
||||
import core.api.*
|
||||
import core.game.dialogue.DialogueFile
|
||||
import core.game.interaction.IntType
|
||||
import core.game.interaction.InteractionListener
|
||||
import core.game.node.item.Item
|
||||
import core.game.world.update.flag.context.Animation
|
||||
import core.tools.START_DIALOGUE
|
||||
import org.rs09.consts.Items
|
||||
|
||||
class FruitCuttingListener : InteractionListener {
|
||||
val anim = Animation(1192) // TODO Add fruit cutting animation to ConstLib
|
||||
|
||||
enum class Fruit(val fruit: Int, val chunk: Int, val slice: Item) {
|
||||
PINEAPPLE(Items.PINEAPPLE_2114, Items.PINEAPPLE_CHUNKS_2116, Item(Items.PINEAPPLE_RING_2118, 4)),
|
||||
BANANA(Items.BANANA_1963, -1, Item(Items.SLICED_BANANA_3162)),
|
||||
LEMON(Items.LEMON_2102, Items.LEMON_CHUNKS_2104, Item(Items.LEMON_SLICES_2106)),
|
||||
LIME(Items.LIME_2120, Items.LIME_CHUNKS_2122, Item(Items.LIME_SLICES_2124)),
|
||||
ORANGE(Items.ORANGE_2108, Items.ORANGE_CHUNKS_2110, Item(Items.ORANGE_SLICES_2112));
|
||||
|
||||
companion object {
|
||||
val productOfChunk = values().associate { it.fruit to it.chunk }
|
||||
val productOfSlice = values().associate { it.fruit to it.slice }
|
||||
val cutable = intArrayOf(PINEAPPLE.fruit, BANANA.fruit, LEMON.fruit, LIME.fruit, ORANGE.fruit)
|
||||
|
||||
fun forChunkId(id: Int) : Int {
|
||||
return productOfChunk[id]!!
|
||||
}
|
||||
|
||||
fun forSliceId(id: Int) : Item {
|
||||
return productOfSlice[id]!!
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun defineListeners() {
|
||||
onUseWith(IntType.ITEM, Fruit.cutable, Items.KNIFE_946) { player, used, _ ->
|
||||
openDialogue(
|
||||
player,
|
||||
FruitCuttingDialogue(used.id, Fruit.forChunkId(used.id), Fruit.forSliceId(used.id))
|
||||
)
|
||||
return@onUseWith true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class FruitCuttingDialogue(val fruit: Int, val chunk: Int, val slice: Item) : DialogueFile() {
|
||||
val anim = Animation(1192)
|
||||
override fun handle(componentID: Int, buttonID: Int) {
|
||||
when(stage) {
|
||||
START_DIALOGUE -> {
|
||||
if(chunk == -1) {
|
||||
if(removeItem(player!!, fruit) && addItem(player!!, slice.id)) {
|
||||
animate(player!!, anim, true)
|
||||
sendMessage(player!!, "You deftly chop the ${getItemName(fruit).lowercase()} into slices.")
|
||||
}
|
||||
} else {
|
||||
setInterfaceText(player!!, "Would you like to...", 140, 4)
|
||||
sendItemOnInterface(player!!, 140, 6, chunk, 1)
|
||||
sendItemOnInterface(player!!, 140, 5, slice.id, 1)
|
||||
setInterfaceText(player!!, "Slice the ${getItemName(fruit).lowercase()}", 140, 2)
|
||||
setInterfaceText(player!!, "Dice the ${getItemName(fruit).lowercase()}", 140, 3)
|
||||
openInterface(player!!, 140)
|
||||
when(buttonID) {
|
||||
1 -> {
|
||||
closeInterface(player!!)
|
||||
if(removeItem(player!!, fruit) && addItem(player!!, slice.id, slice.amount)) {
|
||||
animate(player!!, anim, true)
|
||||
sendMessage(player!!, "You cut the ${getItemName(fruit).lowercase()} into slices.")
|
||||
}
|
||||
}
|
||||
2 -> {
|
||||
closeInterface(player!!)
|
||||
if(removeItem(player!!, fruit) && addItem(player!!, chunk)) {
|
||||
animate(player!!, anim, true)
|
||||
sendMessage(player!!, "You cut the ${getItemName(fruit).lowercase()} into chunks.")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,273 +0,0 @@
|
||||
package content.global.handlers.item.withitem;
|
||||
|
||||
import static core.api.ContentAPIKt.*;
|
||||
import core.game.component.Component;
|
||||
import core.plugin.Initializable;
|
||||
import kotlin.Unit;
|
||||
import org.rs09.consts.Items;
|
||||
import core.game.dialogue.DialoguePlugin;
|
||||
import core.game.interaction.NodeUsageEvent;
|
||||
import core.game.interaction.UseWithHandler;
|
||||
import core.game.node.entity.player.Player;
|
||||
import core.game.node.entity.player.link.RunScript;
|
||||
import core.game.node.item.Item;
|
||||
import core.game.world.update.flag.context.Animation;
|
||||
import core.plugin.Plugin;
|
||||
|
||||
/**
|
||||
* Represents the fruit cutting plugin.
|
||||
* @author 'Vexia
|
||||
* @version 1.0
|
||||
*/
|
||||
@Initializable
|
||||
public final class FruitCuttingPlugin extends UseWithHandler {
|
||||
|
||||
/**
|
||||
* Represents the cutting banana animation.
|
||||
*/
|
||||
private static final Animation ANIMATION = new Animation(1192);
|
||||
|
||||
/**
|
||||
* Constructs a new {@code FruitCuttingPlugin} {@code Object}.
|
||||
*/
|
||||
public FruitCuttingPlugin() {
|
||||
super(946);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Plugin<Object> newInstance(Object arg) throws Throwable {
|
||||
for (Fruit fruit : Fruit.values()) {
|
||||
addHandler(fruit.getBase().getId(), ITEM_TYPE, this);
|
||||
}
|
||||
new FruitCuttingDialogue().init();
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handle(NodeUsageEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
final Fruit fruit = Fruit.forBase(event.getUsedItem());
|
||||
if (fruit == Fruit.BANANA || fruit == Fruit.LEMON) {
|
||||
if (player.getInventory().remove(fruit.getBase())) {
|
||||
player.lock(2);
|
||||
player.animate(ANIMATION);
|
||||
player.getInventory().add(fruit.getSliced());
|
||||
player.getPacketDispatch().sendMessage("You deftly chop the "+ fruit.name().toLowerCase() + " into slices.");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
player.getDialogueInterpreter().open(31237434, fruit);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents the a fruit to cut.
|
||||
* @author 'Vexia
|
||||
* @date 30/11/2013
|
||||
*/
|
||||
public enum Fruit {
|
||||
PINEAPPLE(new Item(2114), new Item(2116), new Item(2118, 4)),
|
||||
BANANA(new Item(1963), null, new Item(3162)),
|
||||
LEMON(new Item(2102), new Item(Items.LEMON_CHUNKS_2104), new Item(2106)),
|
||||
LIME(new Item(Items.LIME_2120),new Item(Items.LIME_CHUNKS_2122), new Item(Items.LIME_SLICES_2124)),
|
||||
ORANGE(new Item(2108), new Item(2110), new Item(2112));
|
||||
|
||||
/**
|
||||
* Constructs a new {@code FruitCuttingPlugin.java} {@code Object}.
|
||||
* @param base the base item.
|
||||
* @param diced the diced item.
|
||||
* @param sliced the sliced item.
|
||||
*/
|
||||
Fruit(Item base, Item diced, Item sliced) {
|
||||
this.base = base;
|
||||
this.diced = diced;
|
||||
this.sliced = sliced;
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents the base item.
|
||||
*/
|
||||
private final Item base;
|
||||
|
||||
/**
|
||||
* Represents the diced item.
|
||||
*/
|
||||
private final Item diced;
|
||||
|
||||
/**
|
||||
* Represents the sliced item.
|
||||
*/
|
||||
private final Item sliced;
|
||||
|
||||
/**
|
||||
* Gets the base.
|
||||
* @return The base.
|
||||
*/
|
||||
public Item getBase() {
|
||||
return base;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the diced.
|
||||
* @return The diced.
|
||||
*/
|
||||
public Item getDiced() {
|
||||
return diced;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the sliced.
|
||||
* @return The sliced.
|
||||
*/
|
||||
public Item getSliced() {
|
||||
return sliced;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used to get the fruit for the base item.
|
||||
* @param item the item.
|
||||
* @return the fruit.
|
||||
*/
|
||||
public static Fruit forBase(final Item item) {
|
||||
for (Fruit fruit : values()) {
|
||||
if (fruit.getBase().getId() == item.getId()) {
|
||||
return fruit;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents the dialogue plugin used to cut fruit.
|
||||
* @author 'Vexia
|
||||
* @version 1.0
|
||||
*/
|
||||
public static final class FruitCuttingDialogue extends DialoguePlugin {
|
||||
|
||||
/**
|
||||
* Represents the component interface.
|
||||
*/
|
||||
private static final Component COMPONENT = new Component(140);
|
||||
|
||||
/**
|
||||
* Represents the fruit.
|
||||
*/
|
||||
private Fruit fruit;
|
||||
|
||||
/**
|
||||
* Represents the fruit to cut.
|
||||
*/
|
||||
private Item item;
|
||||
|
||||
/**
|
||||
* Represents if its a sliced cut.
|
||||
*/
|
||||
private boolean slice;
|
||||
|
||||
/**
|
||||
* Constructs a new {@code FruitCuttingDialogue} {@code Object}.
|
||||
*/
|
||||
public FruitCuttingDialogue() {
|
||||
/**
|
||||
* empty.
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new {@code FruitCuttingDialogue} {@code Object}.
|
||||
* @param player the player.
|
||||
*/
|
||||
public FruitCuttingDialogue(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DialoguePlugin newInstance(Player player) {
|
||||
return new FruitCuttingDialogue(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean open(Object... args) {
|
||||
fruit = ((Fruit) args[0]);
|
||||
player.getPacketDispatch().sendString("Would you like to...", 140, 4);
|
||||
player.getPacketDispatch().sendItemOnInterface(fruit.getSliced().getId(), 1, 140, 5);
|
||||
player.getPacketDispatch().sendItemOnInterface(fruit.getDiced().getId(), 1, 140, 6);
|
||||
player.getPacketDispatch().sendString("Slice the " + fruit.getBase().getName().toLowerCase() + ".", 140, 2);
|
||||
player.getPacketDispatch().sendString("Dice the " + fruit.getBase().getName().toLowerCase() + ".", 140, 3);
|
||||
player.getInterfaceManager().openChatbox(COMPONENT);
|
||||
stage = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handle(int interfaceId, int buttonId) {
|
||||
switch (stage) {
|
||||
case 0:
|
||||
player.getInterfaceManager().openChatbox(309);
|
||||
player.getPacketDispatch().sendItemZoomOnInterface(1, 160, 309, 2);
|
||||
slice = buttonId == 2 ? false : true;
|
||||
item = buttonId == 2 ? fruit.getDiced() : fruit.getSliced();
|
||||
player.getPacketDispatch().sendString("<br><br><br><br>" + item.getName(), 309, 6);
|
||||
player.getPacketDispatch().sendItemZoomOnInterface(item.getId(), 175, 309, 2);
|
||||
stage = 1;
|
||||
break;
|
||||
case 1:
|
||||
int amount = 0;
|
||||
switch (buttonId) {
|
||||
case 6:
|
||||
amount = 1;
|
||||
break;
|
||||
case 5:
|
||||
amount = 5;
|
||||
break;
|
||||
case 4:
|
||||
sendInputDialogue(player, false, "Enter the amount:", (value) -> {
|
||||
String s = value.toString();
|
||||
s = s.replace("k","000");
|
||||
s = s.replace("K","000");
|
||||
int val = Integer.parseInt(s);
|
||||
cut(player, val, slice);
|
||||
return Unit.INSTANCE;
|
||||
});
|
||||
return true;
|
||||
case 3:
|
||||
amount = player.getInventory().getAmount(fruit.getBase());
|
||||
break;
|
||||
}
|
||||
cut(player, amount, slice);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIds() {
|
||||
return new int[] { 31237434 };
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used to cut a fruit.
|
||||
* @param player the player.
|
||||
* @param amount the amount.
|
||||
* @param slice if its sliced.
|
||||
*/
|
||||
private final void cut(final Player player, int amount, boolean slice) {
|
||||
if (amount > player.getInventory().getAmount(fruit.getBase())) {
|
||||
amount = player.getInventory().getAmount(fruit.getBase());
|
||||
}
|
||||
end();
|
||||
final Item remove = new Item(fruit.getBase().getId(), amount);
|
||||
if (!player.getInventory().containsItem(remove)) {
|
||||
return;
|
||||
}
|
||||
if (player.getInventory().remove(remove)) {
|
||||
player.getPacketDispatch().sendMessage("You cut the " + fruit.name().toLowerCase() + " into " + (slice ? fruit == Fruit.PINEAPPLE ? "rings" : "slices" : "chunks") + ".");
|
||||
for (int i = 0; i < amount; i++) {
|
||||
player.getInventory().add(slice ? fruit.getSliced() : fruit.getDiced());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user