protected static void PlayerUseSlot(DOLEvent e, object sender, EventArgs args) { GamePlayer player = (GamePlayer)sender; GodelevasNeed quest = (GodelevasNeed)player.IsDoingQuest(typeof(GodelevasNeed)); if (quest == null) { return; } if (quest.Step == 1) { UseSlotEventArgs uArgs = (UseSlotEventArgs)args; InventoryItem item = player.Inventory.GetItem((eInventorySlot)uArgs.Slot); if (item != null && item.Id_nb == woodenBucket.Id_nb) { if (player.IsWithinRadius(cotswoldVillageBridge, 500)) { SendSystemMessage(player, "You use the wooden bucket and scoop up some fresh river water."); ReplaceItem(player, woodenBucket, fullWoodenBucket); quest.Step = 2; } else { SendSystemMessage(player, "You can't scoop up some river water here."); } } } }
protected static void PlayerLeftWorld(DOLEvent e, object sender, EventArgs args) { GamePlayer player = sender as GamePlayer; if (player == null) { return; } GodelevasNeed quest = player.IsDoingQuest(typeof(GodelevasNeed)) as GodelevasNeed; if (quest != null) { GameEventMgr.RemoveHandler(player, GamePlayerEvent.UseSlot, new DOLEventHandler(PlayerUseSlot)); GameEventMgr.RemoveHandler(player, GamePlayerEvent.Quit, new DOLEventHandler(PlayerLeftWorld)); } }
/* This is our callback hook that will be called when the player clicks * on any button in the quest offer dialog. We check if he accepts or * declines here... */ private static void CheckPlayerAbortQuest(GamePlayer player, byte response) { GodelevasNeed quest = player.IsDoingQuest(typeof(GodelevasNeed)) as GodelevasNeed; if (quest == null) { return; } if (response == 0x00) { SendSystemMessage(player, "Good, now go out there and finish your work!"); } else { SendSystemMessage(player, "Aborting Quest " + questTitle + ". You can start over again if you want."); quest.AbortQuest(); } }
/* This is the method we declared as callback for the hooks we set to * NPC. It will be called whenever a player right clicks on NPC * or when he whispers something to him. */ protected static void TalkToGodelevaDowden(DOLEvent e, object sender, EventArgs args) { // We get the player from the event arguments and check if he qualifies GamePlayer player = ((SourceEventArgs)args).Source as GamePlayer; if (player == null) { return; } if (godelevaDowden.CanGiveQuest(typeof(GodelevasNeed), player) <= 0) { return; } // We also check if the player is already doing the quest GodelevasNeed quest = player.IsDoingQuest(typeof(GodelevasNeed)) as GodelevasNeed; godelevaDowden.TurnTo(player); // Did the player rightclick on NPC? if (e == GameObjectEvent.Interact) { if (quest == null) { // Player is not doing the quest... godelevaDowden.SayTo(player, "Hello there friend. I can't say I've seen you around here. Of course, I'm usually so busy, I don't get a chance to chat with the locals like I used to. Say, you're not [looking] for something to do, are you?"); return; } else { if (quest.Step == 2) { godelevaDowden.SayTo(player, "Do you have the full bucket for me, " + player.Name + "?"); } return; } } // The player whispered to NPC (clicked on the text inside the []) else if (e == GameLivingEvent.WhisperReceive) { WhisperReceiveEventArgs wArgs = (WhisperReceiveEventArgs)args; if (quest == null) { // Do some small talk :) switch (wArgs.Text) { case "looking": godelevaDowden.SayTo(player, "Oh yes! I have met someone who is very interesting. I think about him all the time when we are apart, which is often. His name is Elvar Tambor, and he is a weapons merchant in Prydwen Keep. We [met] about six months ago."); break; case "met": godelevaDowden.SayTo(player, "Great, because I have something that I need done. I need to get some fresh water to clean my floors with, but I simply don't have time to run to the water to get some. Will you [fetch] some for me?"); break; // If the player offered his help, we send the quest dialog now! case "fetch": player.Out.SendQuestSubscribeCommand(godelevaDowden, QuestMgr.GetIDForQuestType(typeof(GodelevasNeed)), "Will you take the bucket down to the river and retrieve some water for Godeleva? [Level " + player.Level + "]"); break; } } else { switch (wArgs.Text) { case "abort": player.Out.SendCustomDialog("Do you really want to abort this quest, \nall items gained during quest will be lost?", new CustomDialogResponse(CheckPlayerAbortQuest)); break; } } } }