package net.scapeemulator.game.content.worldobjects;
import net.scapeemulator.game.dispatcher.object.ObjectDispatcher;
import net.scapeemulator.game.dispatcher.object.ObjectHandler;
import net.scapeemulator.game.model.Option;
import net.scapeemulator.game.model.World;
import net.scapeemulator.game.model.mob.Animation;
import net.scapeemulator.game.model.object.GroundObjectList.GroundObject;
import net.scapeemulator.game.model.player.Item;
import net.scapeemulator.game.model.player.Player;
import net.scapeemulator.game.model.player.action.ReachObjectAction;
import net.scapeemulator.game.task.Task;
import net.scapeemulator.game.util.HandlerContext;
/**
* @author David Insley
*/
public class Crops {
private static final int RESPAWN_TICKS = 50; // 30 seconds
private static final Animation PICK_ANIMATION = new Animation(827);
enum Crop {
ONION(1957, 3366, 5538, 8584),
CABBAGE(1965, 1161, 8535, 8536, 8537, 8538, 8539, 8540, 8541, 8542, 8543, 22301),
POTATO(1942, 312, 8562, 9408),
WHEAT(1947, 313, 5583, 5584, 5585, 15506, 15507, 15508);
private final int[] objectIds;
private final int itemId;
private Crop(int itemId, int... objectIds) {
this.objectIds = objectIds;
this.itemId = itemId;
}
static Crop forObjectId(int objectId) {
for (Crop crop : values()) {
for (int objectIdC : crop.objectIds) {
if (objectIdC == objectId) {
return crop;
}
}
}
return null;
}
int getItemId() {
return itemId;
}
}
public static void init() {
ObjectDispatcher.getInstance().bind(new CropObjectHandler());
}
private static class CropObjectHandler extends ObjectHandler {
public CropObjectHandler() {
super(Option.TWO);
}
@Override
public void handle(Player player, final GroundObject object, String optionName, HandlerContext context) {
Crop crop = Crop.forObjectId(object.getId());
if (crop == null) {
return;
}
context.stop();
player.startAction(new PickCropAction(player, object, crop));
}
}
private static class PickCropAction extends ReachObjectAction {
private final GroundObject obj;
private final Crop crop;
private boolean started;
PickCropAction(Player player, GroundObject obj, Crop crop) {
super(1, true, player, obj, 1, true);
this.obj = obj;
this.crop = crop;
}
public void executeAction() {
if (!started) {
mob.setActionsBlocked(true);
mob.getWalkingQueue().addFirstStep(obj.getPosition());
mob.playAnimation(PICK_ANIMATION);
started = true;
} else {
mob.setActionsBlocked(false);
Item remaining = mob.getInventory().add(new Item(crop.getItemId()));
if (remaining == null) {
obj.hide();
World.getWorld().getTaskScheduler().schedule(new Task(RESPAWN_TICKS, false) {
@Override
public void execute() {
obj.reveal();
stop();
}
});
}
stop();
}
}
@Override
public void stop() {
mob.setActionsBlocked(false);
}
}
}