package net.scapeemulator.game.model.player.skills;
import net.scapeemulator.game.model.player.interfaces.ComponentListener;
import net.scapeemulator.game.model.player.interfaces.InterfaceSet.Component;
import net.scapeemulator.game.model.player.Item;
import net.scapeemulator.game.model.player.Player;
import net.scapeemulator.game.model.player.ScriptInputListener;
import net.scapeemulator.game.msg.impl.inter.InterfaceItemMessage;
/**
* @author David Insley
*/
public class MakeItemInterface {
private static final int COOK_ITEM_INTERFACE = 307;
private static final int MAKE_ITEM_INTERFACE = 309; // 1 5 X ALL
private static final int CHOOSE_ITEM_INTERFACE_OFFSET = 301; // 1 5 10 X
public static abstract class MakeItemInterfaceListener {
/**
* Alerts that the 'make all' option was selected for the recipe.
*/
public abstract void makeAllSelected();
/**
* Alerts that one of the constant amount options or the make-x option was selected for the recipes. If the make-x option was selected, it has
* already been queried and the amount given is what was input.
*/
public abstract void makeAmountSelected(int amount);
/**
* Alerts that the make item interface was cancelled.
*/
public abstract void cancelled();
}
public static abstract class ChooseItemInterfaceListener<T extends SkillRecipe> {
/**
* Alerts that one of the constant amount options or the make-x option was selected for one of the recipes. If the make-x option was selected,
* it has already been queried and the amount given is what was input.
*
* @param selected the recipe that was selected
*/
public abstract void makeAmountSelected(T selected, int amount);
/**
* Alerts that the make item interface was cancelled.
*/
public abstract void cancelled();
}
public static class ChooseItemInterfaceListenerAdapter<T extends SkillRecipe> extends ChooseItemInterfaceListener<T> {
@Override
public void makeAmountSelected(T selected, int amount) {
}
@Override
public void cancelled() {
}
}
public static void showMakeItemInterface(Player player, MakeItemInterfaceListener listener, Item item, boolean cook) {
int interfaceId = cook ? COOK_ITEM_INTERFACE : MAKE_ITEM_INTERFACE;
player.send(new InterfaceItemMessage(interfaceId, 2, 150, item.getId()));
player.setInterfaceText(interfaceId, 6, "<br><br><br><br><br>" + item.getDefinition().getName());
player.getInterfaceSet().openChatbox(interfaceId);
player.getInterfaceSet().getChatbox().setListener(new SingleItemComponentListener(player, listener));
}
public static <T extends SkillRecipe> void showChooseItemInterface(Player player, ChooseItemInterfaceListener<T> listener, T[] options) {
if (options.length == 1) {
MakeItemInterfaceListener newListener = new MakeItemInterfaceListener() {
@Override
public void makeAllSelected() {
listener.makeAmountSelected(options[0], 1000);
}
@Override
public void makeAmountSelected(int amount) {
listener.makeAmountSelected(options[0], amount);
}
@Override
public void cancelled() {
listener.cancelled();
}
};
showMakeItemInterface(player, newListener, options[0].getProduct(), false);
return;
}
int id = CHOOSE_ITEM_INTERFACE_OFFSET + options.length;
for (int i = 0; i < options.length; i++) {
player.send(new InterfaceItemMessage(id, i + 2, 200, options[i].getProduct().getId()));
int string_index = 7 + (4 * i) + options.length - 2;
player.setInterfaceText(id, string_index, "<br><br><br><br><br>" + options[i].getProduct().getDefinition().getName());
}
player.getInterfaceSet().openChatbox(id, new ChooseItemComponentListener<T>(player, options, listener));
}
private static class ChooseItemComponentListener<T extends SkillRecipe> extends ComponentListener {
private final Player player;
private final T[] recipes;
private final ChooseItemInterfaceListener<T> listener;
private ChooseItemComponentListener(Player player, T[] recipes, ChooseItemInterfaceListener<T> listener) {
this.player = player;
this.recipes = recipes;
this.listener = listener;
}
@Override
public void inputPressed(Component component, int componentId, int dynamicId) {
player.getInterfaceSet().getChatbox().removeListener();
player.getInterfaceSet().getChatbox().reset();
int recipeIndex = componentId / 4;
if (recipeIndex < 0 || recipeIndex >= recipes.length) {
listener.cancelled();
return;
}
T selected = recipes[recipeIndex];
int option = 3 - ((componentId - 3) % 4);
switch (option) {
case 0:
listener.makeAmountSelected(selected, 1);
break;
case 1:
listener.makeAmountSelected(selected, 5);
break;
case 2:
listener.makeAmountSelected(selected, 10);
break;
case 3:
player.getScriptInput().showIntegerScriptInput("Enter amount:", new ScriptInputListener() {
@Override
public void intInputReceived(int value) {
listener.makeAmountSelected(selected, value);
}
@Override
public void usernameInputReceived(long value) {
listener.cancelled();
}
});
break;
}
}
@Override
public void componentClosed(Component component) {
listener.cancelled();
}
@Override
public boolean componentChanged(Component component, int oldId) {
listener.cancelled();
return false;
}
}
private static class SingleItemComponentListener extends ComponentListener {
private final Player player;
private final MakeItemInterfaceListener listener;
private SingleItemComponentListener(Player player, MakeItemInterfaceListener listener) {
this.player = player;
this.listener = listener;
}
@Override
public void inputPressed(Component component, int componentId, int dynamicId) {
player.getInterfaceSet().getChatbox().removeListener();
player.getInterfaceSet().getChatbox().reset();
int option = 3 - ((componentId - 3) % 4);
switch (option) {
case 0:
listener.makeAmountSelected(1);
break;
case 1:
listener.makeAmountSelected(5);
break;
case 2:
player.getScriptInput().showIntegerScriptInput("Enter amount:", new ScriptInputListener() {
@Override
public void intInputReceived(int value) {
listener.makeAmountSelected(value);
}
@Override
public void usernameInputReceived(long value) {
listener.cancelled();
}
});
break;
case 3:
listener.makeAllSelected();
break;
}
}
@Override
public void componentClosed(Component component) {
listener.cancelled();
}
@Override
public boolean componentChanged(Component component, int oldId) {
listener.cancelled();
return false;
}
}
}