import org.rscdaemon.server.quest.*; import org.rscdaemon.server.model.*; import org.rscdaemon.server.event.*; /** * Quest: Black Knight's Fortress (v1.0) * Status: INCOMPLETE * Start: 304, 1507 * Stage1: 269, 441 * Items: - * Rewards: - * * @author youKnowWho */ public class BlackKnightFortress extends Quest { private static final int QUEST_POINTS = 1; private static final int NPC_VARZE = 110; private static final int WALL_ID = 22; private static final int WALL_X = 273; private static final int WALL_Y = 435; private static final int GRILL_ID = -1; private static final int GRILL_X = -1; private static final int GRILL_Y = -1; private static final int REQUIRED_QPOINTS = 0; // 13 private static final String[] FIRST_MENU = new String[]{"Well what's the problem?","Well, ah.. good luck with that"}; private static final String[] SECOND_MENU = new String[]{"Secret weapon? That sounds really scary!","I can take care of that"}; private static final String[] THIRD_MENU = new String[]{"Sure, but it'll cost you","No, actually, I lied."}; private static final String[] FOURTH_MENU = new String[]{"I'll get right on it then","Sorry, I can't be bothered"}; /** * Don't load this quest yet it's incomplete */ public boolean loadQuest() { return false; } public void init() { associateNpc(NPC_VARZE); associateObject(WALL_ID, WALL_X, WALL_Y); } public BlackKnightFortress() { } public String getName() { return "Black Knight's Fortress"; } public int getUniqueID() { return 2; } public void handleAction(QuestAction action, Object[] args, final Player player) { int stage = player.getQuestStage(this); if(action == action.TALKED_NPC) { if(!(args[0] instanceof Npc)) return; final Npc npc = (Npc)args[0]; if(npc.getID() != NPC_VARZE) return; player.setBusy(true); npc.blockedBy(player); // handle quest complete chat? if(stage == -1) startQuest(player, npc); else handleTalk(player, npc); } else if(action == action.USED_OBJECT) { if(!(args[0] instanceof GameObject)) return; final GameObject obj = (GameObject)args[0]; if(obj.getID() != WALL_ID && obj.getID() != GRILL_ID) return; player.setBusy(true); if(obj.getID() == WALL_ID) { if(player.getY() < 435 || stage >= 1) { player.getActionSender().sendMessage("You push on the wall..."); player.getActionSender().sendSound("secretdoor"); world.unregisterGameObject(obj); world.delayedSpawnObject(obj.getLoc(), 1000); if(player.getY() < 435) player.teleport(273, 435, false); else player.teleport(273, 434, false); addDelayedMessage("It slides out of the way!", player, 1000); } else player.getActionSender().sendMessage("You see no reason to push on the wall"); } else if(obj.getID() == GRILL_ID) { // listen } player.setBusy(false); } } private void handleTalk(final Player player, final Npc npc) { int stage = player.getQuestStage(this); if(stage >= 1 && stage <= 5) { sendChat("I don't have time to talk right now", npc, player); addDelayedChat("Come back when you've destroyed that weapon!", npc, player); player.setBusy(false); npc.unblock(); } } private void startQuest(final Player player, final Npc npc) { sendChat("Good day to you, " + (player.isMale() ? "sir" : "miss"), npc, player); addSingleEvent(new SingleEvent(player, 2000) { public void action() { sendChat("Hello sir. I've heard rumours that you're going to war with the black knights", player, npc); addSingleEvent(new SingleEvent(player, 4000) { public void action() { sendChat("Is this true?", player, npc); addSingleEvent(new SingleEvent(player, 2000) { public void action() { if(player.getQuestPoints() >= REQUIRED_QPOINTS) // Confirm rumour { sendChat("Who told you that?", npc, player); addSingleEvent(new SingleEvent(player, 2000) { public void action() { sendChat("Oh, it makes no difference. Yes, the rumours are true.", npc, player); addSingleEvent(new SingleEvent(player, 3000) { public void action() { npc.blockedBy(player); player.setBusy(false); player.setMenuHandler(new MenuHandler(FIRST_MENU) { public void handleReply(final int option, final String reply) { npc.blockedBy(player); player.setBusy(true); sendChat(reply + (option == 0 ? " Surely you'll defeat them easily?" : ""), player, npc); addSingleEvent(new SingleEvent(player, 3000) { public void action() { npc.blockedBy(player); switch(option) { case 0: sendChat("Yeah, well.. You're lucky you've earned yourself a good reputation", npc, player); addSingleEvent(new SingleEvent(player, 4000) { public void action() { sendChat("Or I wouldn't tell you.", npc, player); addSingleEvent(new SingleEvent(player, 4000) { public void action() { sendChat("The black knights have a secret weapon, and they say it will destroy us.", npc, player); npc.blockedBy(player); addSingleEvent(new SingleEvent(player, 4000) { public void action() { player.setBusy(false); player.setMenuHandler(new MenuHandler(SECOND_MENU) { public void handleReply(final int option, final String reply) { npc.blockedBy(player); player.setBusy(true); if(option == 1) sendChat("Well it just so happens that I'm an expert in secret weapon thwarting.", player, npc); else sendChat(reply, player, npc); addSingleEvent(new SingleEvent(player, 3000) { public void action() { npc.blockedBy(player); switch(option) { case 0: sendChat("What kind of sissy talk is that? Get out of my sight!", npc, player); player.setBusy(false); npc.unblock(); break; case 1: sendChat("I like your spirit, young warrior!", npc, player); addSingleEvent(new SingleEvent(player, 3000) { public void action() { sendChat("Do you think you could help us?", npc, player); npc.blockedBy(player); addSingleEvent(new SingleEvent(player, 2000) { public void action() { player.setBusy(false); player.setMenuHandler(new MenuHandler(THIRD_MENU) { public void handleReply(final int option, final String reply) { sendChat(reply, player, npc); npc.blockedBy(player); player.setBusy(true); addSingleEvent(new SingleEvent(player, 3000) { public void action() { npc.blockedBy(player); switch(option) { case 0: sendChat("Money won't be a problem, assuming you can do the job.", npc, player); addSingleEvent(new SingleEvent(player, 3000) { public void action() { sendChat("Well then, what do you want me to do?", player, npc); addSingleEvent(new SingleEvent(player, 3000) { public void action() { sendChat("First of all, you'll need to find out what the weapon is... then destroy it!", npc, player); addSingleEvent(new SingleEvent(player, 4500) { public void action() { sendChat("Head north and search the black knight's castle.", npc, player); npc.blockedBy(player); player.setBusy(false); player.setMenuHandler(new MenuHandler(FOURTH_MENU) { public void handleReply(final int option, final String reply) { sendChat(reply, player, npc); player.setBusy(true); npc.blockedBy(player); addSingleEvent(new SingleEvent(player, 3000) { public void action() { npc.blockedBy(player); switch(option) { case 0: player.setBusy(false); npc.unblock(); addDelayedChat("Good luck, " + player.getUsername() + ".", npc, player); player.setQuestStage(getUniqueID(), 1); break; case 1: addDelayedChat("Don't waste my time! Every valuable second, doom draws nearer!", npc, player); default: player.setBusy(false); npc.unblock(); break; } } }); } }); player.getActionSender().sendMenu(FOURTH_MENU); player.setBusy(false); } }); } }); } }); break; case 1: addDelayedChat("Don't waste my time " + player.getUsername() + "!", npc, player); default: player.setBusy(false); npc.unblock(); break; } } }); } }); player.getActionSender().sendMenu(THIRD_MENU); player.setBusy(false); } }); } }); break; default: player.setBusy(false); npc.unblock(); break; } } }); } }); player.getActionSender().sendMenu(SECOND_MENU); player.setBusy(false); } }); } }); } }); break; case 1: sendChat("Um, thanks. I guess...", npc, player); default: player.setBusy(false); npc.unblock(); break; } } }); } }); player.getActionSender().sendMenu(FIRST_MENU); player.setBusy(false); } }); } }); } else // Deny rumour { sendChat("Most certainly not. The Black Knights are no threat to us!", npc, player); player.setBusy(false); npc.unblock(); addDelayedMessage("You need " + REQUIRED_QPOINTS + " quest points before " + npc.getDef().getName() + " will trust you", player); } } }); } }); } }); } }