using Server.Gumps;
using Server.Items;
using Server.Mobiles;
using Server.Multis;
using System;
using System.Collections.Generic;
namespace Server.Engines.Quests
{
public class ProfessionalFisherQuest : BaseQuest
{
private object m_Title;
public override object Title => m_Title; //Professional Fisher Quest - Floating Emporium
public override object Description => 1116508; /*This quest is part of a category of quests where you catch uncommon fish and use your ship to deliver them to ports
* to gain rewards and better fishing orders.
Successful completion of this quest increases your standing with
* the fishmonger guild and unlocks bigger orders and greater rewards. Destroying the crate will forfeit the order and
* hurt your standing with the fishmonger guild.
You must have the High Seas booster pack to do this quest.
*
***NOTICE: You will not be able to dry dock your ship while you are on this quest. Destroying the crate in
* your hull will cancel the quest and re-enable dry docking.***
-----
Greetings sailor,
* I see ye have a fine ship, might ye be looking for work?
I have some orders for some particular fish that needs
* catchin' an' deliverin' and I be lookin' for some business partners. If ye will agree to fill this order an' deliver
* it fer me, I will reward ye with a rare prize as payment. What say ye?*/
public override object Refuse => 1116511; //As you wish. If'n ye change yer mind you know where to find me.
public override object Uncomplete => 1116512; //Aye, partner, how goes the fishin? Me customer be waitin' fer ye and won't be payin' either of us till ye deliver.
public override object Complete => 1116513; /*Ahoy, sailor! These be a fine batch o' fish and I'll be glad to pay the price. I will forwarded the money owed to
* the fishmonger who brokered this business with me compliments.
Fer ye I have a rare gift from the Order of
* the Dragonfish that ye can't buy with gold. Let me jes' tuck it in yer backpack here... There you go! Use it
* wisely and it can make ye wealthy!
If ye are interested in gettin more fishin' business from me, I have some
* orders of me own to fill and ship. Jes' let me know.*/
private FishMonger m_TurnIn;
private BaseBoat m_Boat;
private ShippingCrate m_Crate;
public FishMonger TurnIn { get { return m_TurnIn; } set { m_TurnIn = value; } }
public BaseBoat Boat { get { return m_Boat; } set { m_Boat = value; } }
public ShippingCrate Crate { get { return m_Crate; } set { m_Crate = value; } }
public ProfessionalFisherQuest()
{
AddObjective(new FishQuestObjective());
}
public ProfessionalFisherQuest(Mobile from, FishMonger monger, FishMonger quester, BaseBoat boat)
{
PlayerFishingEntry entry = PlayerFishingEntry.GetEntry(from, true);
int lines;
if (boat.IsClassicBoat)
lines = 1;
else
lines = entry.CalculateLines();
m_TurnIn = monger;
m_Boat = boat;
int index = 0;
int amount = 10;
Type type = null;
List hasChosen = new List();
Dictionary types = new Dictionary();
for (int i = 0; i < lines; i++)
{
entry.GetRandomFish(ref index, ref amount, hasChosen);
hasChosen.Add(index);
type = FishQuestHelper.GetTypeFromIndex(index);
if (amount < 5) amount = 5;
if (amount > 20) amount = 20;
types[type] = amount;
}
AddObjective(new FishQuestObjective(types));
AddReward(new BaseReward(1116510)); //A rare reward from the Order of the Dragonfish.
hasChosen.Clear();
m_Title = GetTitle(quester);
}
public override void OnAccept()
{
if (m_Boat == null)
{
RemoveQuest(false);
return;
}
m_Crate = new ShippingCrate(this);
if (m_Boat is BaseGalleon)
((BaseGalleon)m_Boat).GalleonHold.DropItem(m_Crate);
else
m_Boat.Hold.DropItem(m_Crate);
base.OnAccept();
}
private int GetTitle(Mobile monger)
{
Region reg = monger.Region;
if (reg == null || reg.Name == null)
return 1116507;
if (reg.Name == "Sea Market")
return 1116507; //Professional Fisher Quest - Floating Emporium
if (reg.Name == "Britain")
return 1116728; //Professional Fisher Quest - Britain
if (reg.Name == "Trinsic")
return 1116730; //Professional Fisher Quest - Trinsic
if (reg.Name == "Moonglow")
return 1116731; //Professional Fisher Quest - Moonglow
if (reg.Name == "Skara Brae")
return 1116732; //Professional Fisher Quest - Skara Brae
if (reg.Name == "Vesper")
return 1116733; //Professional Fisher Quest - Vesper
if (reg.Name == "Jhelom" || reg.Name == "Jhelom Islands")
return 1116734; //Professional Fisher Quest - Jhelom
if (reg.Name == "Papua")
return 1116735; //Professional Fisher Quest - Papua
return 1116507;
}
public override void OnResign(bool resignChain)
{
if (Owner != null)
{
PlayerFishingEntry entry = PlayerFishingEntry.GetEntry(Owner);
if (entry != null)
{
FishQuestObjective obj = GetObjective();
if (obj != null)
{
foreach (KeyValuePair kvp in obj.Line)
entry.OnQuestResign(kvp.Key);
}
}
}
if (m_Crate != null)
{
m_Crate.Quest = null;
m_Crate.Delete();
}
base.OnResign(resignChain);
}
public override void GiveRewards()
{
if (Owner != null)
{
PlayerFishingEntry entry = PlayerFishingEntry.GetEntry(Owner);
if (entry != null)
{
double pointsAwarded = 0;
FishQuestObjective obj = GetObjective();
if (obj != null)
{
pointsAwarded += entry.GetPointsAwarded(obj);
entry.OnQuestComplete(obj);
}
FishQuestHelper.GiveRewards(Owner, entry, pointsAwarded);
}
}
DeleteQuestItems();
base.GiveRewards();
}
public void DeleteQuestItems()
{
if (m_Crate == null)
return;
Container hold = null;
if (m_Crate.RootParent is Container)
hold = (Container)m_Crate.RootParent;
//Deletes quest reqeust
FishQuestObjective obj = GetObjective();
if (obj != null)
{
foreach (KeyValuePair kvp in obj.Line)
m_Crate.ConsumeTotal(kvp.Key, kvp.Value[1]);
}
//then moves any extras to the hold
if (hold != null)
{
foreach (Item item in new List- (m_Crate.Items))
hold.DropItem(item);
}
if (m_Crate != null)
m_Crate.Delete();
}
public FishQuestObjective GetObjective()
{
if (Objectives.Count > 0)
return Objectives[0] as FishQuestObjective;
return null;
}
public override bool RenderObjective(MondainQuestGump g, bool offer)
{
if (offer)
g.AddHtmlLocalized(130, 45, 270, 16, 1049010, 0xFFFFFF, false, false); // Quest Offer
else
g.AddHtmlLocalized(130, 45, 270, 16, 1046026, 0xFFFFFF, false, false); // Quest Log
g.AddButton(130, 430, 0x2EEF, 0x2EF1, (int)Buttons.PreviousPage, GumpButtonType.Reply, 0);
g.AddButton(275, 430, 0x2EE9, 0x2EEB, (int)Buttons.NextPage, GumpButtonType.Reply, 0);
g.AddHtmlObject(160, 70, 200, 40, Title, BaseQuestGump.DarkGreen, false, false);
g.AddHtmlLocalized(98, 140, 312, 16, 1049073, 0x2710, false, false); // Objective:
g.AddHtmlLocalized(98, 160, 312, 16, 1116509, 0x15F90, false, false); //Fill the crate on your ship with the correct fish.
g.AddHtmlLocalized(98, 176, 312, 16, 1116518, 0x15F90, false, false); //Speak with the fishmonger at the port of delivery.
return true;
}
public override bool RenderDescription(MondainQuestGump g, bool offer)
{
if (offer)
g.AddHtmlLocalized(130, 45, 270, 16, 1049010, 0xFFFFFF, false, false); // Quest Offer
else
g.AddHtmlLocalized(130, 45, 270, 16, 1046026, 0xFFFFFF, false, false); // Quest Log
if (offer)
{
g.AddButton(95, 455, 0x2EE0, 0x2EE2, (int)Buttons.AcceptQuest, GumpButtonType.Reply, 0);
g.AddButton(313, 455, 0x2EF2, 0x2EF4, (int)Buttons.RefuseQuest, GumpButtonType.Reply, 0);
}
else
{
g.AddButton(95, 455, 0x2EF5, 0x2EF7, (int)Buttons.ResignQuest, GumpButtonType.Reply, 0);
g.AddButton(313, 455, 0x2EEC, 0x2EEE, (int)Buttons.CloseQuest, GumpButtonType.Reply, 0);
}
g.AddButton(275, 430, 0x2EE9, 0x2EEB, (int)Buttons.NextPage, GumpButtonType.Reply, 0);
g.AddHtmlObject(160, 70, 200, 40, Title, BaseQuestGump.DarkGreen, false, false);
g.AddHtmlLocalized(98, 140, 312, 16, 1072202, 0x2710, false, false); // Description
g.AddHtmlObject(98, 156, 312, 240, Description, BaseQuestGump.LightGreen, false, true);
return true;
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
writer.Write(m_TurnIn);
writer.Write(m_Boat);
writer.Write(m_Crate);
if (m_Title is string)
{
writer.Write(0);
writer.Write((string)m_Title);
}
else
{
writer.Write(1);
writer.Write((int)m_Title);
}
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
m_TurnIn = reader.ReadMobile() as FishMonger;
m_Boat = reader.ReadItem() as BaseBoat;
m_Crate = reader.ReadItem() as ShippingCrate;
if (m_Crate != null)
m_Crate.AddQuest(this);
switch (reader.ReadInt())
{
case 0:
m_Title = reader.ReadString();
break;
case 1:
m_Title = reader.ReadInt();
break;
}
AddReward(new BaseReward(1116510)); //A rare reward from the Order of the Dragonfish.
}
}
}