import msc.gs.Instance; import msc.gs.event.SingleEvent; import msc.gs.Instance; import msc.gs.model.InvItem; import msc.gs.Instance; import msc.gs.model.MenuHandler; import msc.gs.Instance; import msc.gs.model.Npc; import msc.gs.Instance; import msc.gs.model.Player; import msc.gs.Instance; import msc.gs.quest.Quest; import msc.gs.Instance; import msc.gs.quest.QuestAction; /** * Quest: Sheep Shearer (v1.0) Status: COMPLETE Start: Fred the farmer (id 77), * 159, 619 Items: 207x20 Reward: 1 quest point, 60 gold, Crafting 350 xp * * @author Konijn */ public class SheepShearer extends Quest { private final int FRED_ID = 77; private final int ITEM_WOOL = 207; private final int REWARD_XP = 350; private final int REWARD_GP = 330; private final String[] FIRST_MENU = new String[] { "Sure, what do I need to do?", "No thanks, I'm good." }; private final String[] SECOND_MENU = new String[] { "Sorry, I don't like the sound of that.", "I'd be happy to help." }; public void init() { associateNpc(FRED_ID); } public SheepShearer() { } public String getName() { return "Sheep Shearer"; } public int getUniqueID() { return 1; } public void handleAction(QuestAction action, Object[] args, final Player player) { int stage = player.getQuestStage(this); if (stage == -1) // Quest hasn't been started { if (action == action.TALKED_NPC) { if (!(args[0] instanceof Npc)) return; final Npc npc = (Npc) args[0]; if (npc.getID() != FRED_ID) return; player.setBusy(true); npc.blockedBy(player); sendChat("Hi there, traveller. Care to make some money?", npc, player); addSingleEvent(new SingleEvent(player, 2000) { public void action() { player.setBusy(false); player.setMenuHandler(new MenuHandler(FIRST_MENU) { public void handleReply(final int option, final String reply) { player.setBusy(true); switch (option) { case 1: player.setBusy(false); npc.unblock(); sendChat("No thanks, I'm good.", player, npc); break; case 0: sendChat("Sure, what do I need to do?", player, npc); addSingleEvent(new SingleEvent(player, 2000) { public void action() { sendChat( "If you collect 20 balls of wool for me, I'll pay you 500 coins.", npc, player); addSingleEvent(new SingleEvent( player, 2000) { public void action() { sendChat( "Maybe I'll teach you a thing or two about crafting, too.", npc, player); addSingleEvent(new SingleEvent( player, 2000) { public void action() { sendChat( "I'm afraid you'll have to find your own shears, but the sheep are outside.", npc, player); addSingleEvent(new SingleEvent( player, 2000) { public void action() { player .setBusy(false); player .setMenuHandler(new MenuHandler( SECOND_MENU) { public void handleReply( final int option, final String reply) { player .setBusy(true); switch (option) { case 1: sendChat( "I'd be happy to help.", player, npc); addSingleEvent(new SingleEvent( player, 2000) { public void action() { sendChat( "Great! Come back and see me when you're done.", npc, player); addSingleEvent(new SingleEvent( player, 2000) { public void action() { player .setQuestStage( getUniqueID(), 1); player .setBusy(false); npc .unblock(); } }); } }); break; case 0: sendChat( "Sorry, I don't like the sound of that.", player, npc); addSingleEvent(new SingleEvent( player, 2000) { public void action() { sendChat( "Suit yourself. Come and see me if you change your mind.", npc, player); player .setBusy(false); npc .unblock(); } }); break; default: player .setBusy(false); npc .unblock(); break; } } }); owner .getActionSender() .sendMenu( SECOND_MENU); } }); } }); } }); } }); break; default: player.setBusy(false); npc.unblock(); break; } } }); owner.getActionSender().sendMenu(FIRST_MENU); } }); } else return; } else if (stage == 1) { if (action == action.TALKED_NPC) { if (!(args[0] instanceof Npc)) return; final Npc npc = (Npc) args[0]; if (npc.getID() != FRED_ID) return; player.setBusy(true); npc.blockedBy(player); sendChat("Ahh, you've returned! Do you have my wool?", npc, player); addSingleEvent(new SingleEvent(player, 2000) { public void action() { player.setBusy(false); player.setMenuHandler(new MenuHandler(new String[] { "I'm afraid not.", "Yes, I do." }) { public void handleReply(final int option, final String reply) { player.setBusy(true); sendChat(reply, player, npc); if (option == 0) { addSingleEvent(new SingleEvent(player, 2000) { public void action() { sendChat( "Well, come and see me when you do. The offer still stands", npc, player); player.setBusy(false); npc.unblock(); } }); } else if (option == 1) { addSingleEvent(new SingleEvent(player, 2000) { public void action() { // check items if (player.getInventory() .hasItemId(ITEM_WOOL) && player.getInventory() .countId(ITEM_WOOL) >= 20) { finishQuest(player, npc); } else { sendChat( "Um, no you don't. Get back to me when you do. The reward still stands!", npc, player); player.setBusy(false); npc.unblock(); } } }); } } }); owner.getActionSender() .sendMenu( new String[] { "I'm afraid not.", "Yes, I do." }); } }); } } else if (stage == 0) { if (action == action.TALKED_NPC) { if (!(args[0] instanceof Npc)) return; final Npc npc = (Npc) args[0]; if (npc.getID() != FRED_ID) return; player.setBusy(true); npc.blockedBy(player); sendChat("Hello " + player.getUsername() + "!", npc, player); player.setBusy(false); npc.unblock(); } } } private void finishQuest(final Player player, final Npc npc) { sendChat("Thank you very much! As promised, here's your reward.", npc, player); addSingleEvent(new SingleEvent(player, 2000) { public void action() { player.incExp(12, REWARD_XP, false); player.getActionSender().sendStat(12); player.setQuestStage(getUniqueID(), Quest.COMPLETE); for (int i = 0; i < 20; i++) player.getInventory().remove(ITEM_WOOL, 1); player.getInventory().add(new InvItem(10, REWARD_GP)); player.getActionSender().sendInventory(); player.incQuestPoints(1); player.setBusy(false); npc.unblock(); } }); } }