Files
abysmal-isle/Scripts/Services/Expansions/High Seas/Quests/ProfessionalBountyQuest/ProfessionalBountyQuest.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

383 lines
12 KiB
C#

using Server;
using System;
using Server.Mobiles;
using Server.Items;
using Server.Multis;
using System.Collections.Generic;
using Server.Engines.PartySystem;
using Server.Gumps;
namespace Server.Engines.Quests
{
public class ProfessionalBountyQuest : BaseQuest
{
public override object Title { get { return 1116708; } }
public override object Description { get { return 1116709; } }
public override object Refuse { get { return 1116713; } }
public override object Uncomplete { get { return 1116714; } }
public override object Complete { get { return 1116715; } }
private BaseGalleon m_Galleon;
private BindingPole m_Pole;
private BindingRope m_Rope;
private Mobile m_Captain;
private List<Mobile> m_Helpers = new List<Mobile>();
public BaseGalleon Galleon { get { return m_Galleon; } }
public BindingPole Pole { get { return m_Pole; } }
public BindingRope Rope { get { return m_Rope; } }
public Mobile Captain { get { return m_Captain; } set { m_Captain = value; } }
public ProfessionalBountyQuest()
{
AddObjective(new BountyQuestObjective());
}
public ProfessionalBountyQuest(BaseGalleon galleon)
{
m_Galleon = galleon;
AddObjective(new BountyQuestObjective());
AddReward(new BaseReward(1116712)); //The gold listed on the bulletin board and a special reward from the officer if captured alive.
}
public override void OnAccept()
{
base.OnAccept();
AddPole();
if(Owner != null)
{
m_Rope = new BindingRope(this);
Owner.AddToBackpack(m_Rope);
}
}
public void OnBound(BaseCreature captain)
{
if (Owner != null)
{
m_Captain = captain;
CompileHelpersList(captain);
foreach (BaseObjective obj in Objectives)
{
if (obj is BountyQuestObjective)
{
((BountyQuestObjective)obj).Captured = true;
((BountyQuestObjective)obj).CapturedCaptain = captain;
}
}
}
}
public void OnPirateDeath(BaseCreature captain)
{
m_Captain = captain;
CompileHelpersList(captain);
foreach (BaseObjective obj in Objectives)
{
if (obj is BountyQuestObjective)
{
((BountyQuestObjective)obj).Captured = false;
((BountyQuestObjective)obj).CapturedCaptain = null;
}
}
}
private void CompileHelpersList(BaseCreature pirate)
{
if (Owner == null)
return;
Party p = Party.Get(Owner);
List<DamageStore> rights = pirate.GetLootingRights();
IPooledEnumerable eable = pirate.GetMobilesInRange(19);
foreach (Mobile mob in eable)
{
if (mob == Owner || !(mob is PlayerMobile))
continue;
Party mobParty = Party.Get(mob);
//Add party memebers regardless of looting rights
if (p != null && mobParty != null && p == mobParty)
{
m_Helpers.Add(mob);
continue;
}
// add those with looting rights
for (int i = rights.Count - 1; i >= 0; --i)
{
DamageStore ds = rights[i];
if (ds.m_HasRight && ds.m_Mobile == mob)
{
m_Helpers.Add(ds.m_Mobile);
break;
}
}
}
eable.Free();
}
public void AddPole()
{
if(m_Galleon == null)
return;
int dist = m_Galleon.CaptiveOffset;
int xOffset = 0;
int yOffset = 0;
m_Pole = new BindingPole(this);
switch (m_Galleon.Facing)
{
case Direction.North:
xOffset = 0;
yOffset = dist * -1;
break;
case Direction.South:
xOffset = 0;
yOffset = dist * 1;
break;
case Direction.East:
yOffset = 0;
xOffset = dist * 1;
break;
case Direction.West:
xOffset = dist * -1;
yOffset = 0;
break;
}
m_Pole.MoveToWorld(new Point3D(m_Galleon.X + xOffset, m_Galleon.Y + yOffset, m_Galleon.ZSurface), m_Galleon.Map);
m_Galleon.AddFixture(m_Pole);
}
public override void GiveRewards()
{
bool captured = false;
foreach(BaseObjective obj in Objectives)
{
if(obj is BountyQuestObjective && ((BountyQuestObjective)obj).Captured)
{
BountyQuestObjective o = (BountyQuestObjective)obj;
captured = true;
if (o.CapturedCaptain != null && o.CapturedCaptain is PirateCaptain)
{
PirateCaptain p = o.CapturedCaptain as PirateCaptain;
p.Quest = null;
}
o.CapturedCaptain = null;
o.Captured = false;
break;
}
}
if (Owner == null)
return;
m_Helpers.Add(Owner);
int totalAward = 7523;
if(m_Captain != null && BountyQuestSpawner.Bounties.ContainsKey(m_Captain))
totalAward = BountyQuestSpawner.Bounties[m_Captain];
int eachAward = totalAward;
if(m_Helpers.Count > 1)
eachAward = totalAward / m_Helpers.Count;
foreach(Mobile mob in m_Helpers)
{
if(mob.NetState != null || mob == Owner)
{
mob.AddToBackpack(new Gold(eachAward));
if (captured)
{
Item reward = Loot.Construct(m_CapturedRewards[Utility.Random(m_CapturedRewards.Length)]);
if (reward != null)
{
if (reward is RuinedShipPlans)
mob.SendLocalizedMessage(1149838); //Here is something special! It's a salvaged set of orc ship plans. Parts of it are unreadable, but if you could get another copy you might be able to fill in some of the missing parts...
else
mob.SendLocalizedMessage(1149840); //Here is some special cannon ammunition. It's imported!
if (reward is HeavyFlameCannonball || reward is LightFlameCannonball || reward is HeavyFrostCannonball || reward is LightFrostCannonball)
reward.Amount = Utility.RandomMinMax(5, 10);
mob.AddToBackpack(reward);
}
}
mob.SendLocalizedMessage(1149825, String.Format("{0}\t{1}", totalAward, eachAward)); //Here's your share of the ~1_val~ reward money, you get ~2_val~ gold. You've earned it!
}
else
{
foreach (Mobile mobile in m_Helpers)
{
if (mobile != mob && mobile.NetState != null)
mobile.SendLocalizedMessage(1149837, String.Format("{0}\t{1}\t{2}", eachAward, mob.Name, Owner.Name)); //~1_val~ gold is for ~2_val~, I can't find them so I'm giving this to Captain ~3_val~.
}
Owner.AddToBackpack(new Gold(eachAward));
}
}
if(m_Captain != null && m_Captain.Alive)
m_Captain.Delete();
base.GiveRewards();
}
public override void RemoveQuest( bool removeChain )
{
base.RemoveQuest(removeChain);
if (m_Rope != null && !m_Rope.Deleted)
{
m_Rope.Quest = null;
m_Rope.Delete();
}
if (m_Pole != null && !m_Pole.Deleted)
{
m_Pole.Quest = null;
m_Pole.Delete();
}
if (m_Galleon != null)
m_Galleon.CapturedCaptain = 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, 330, 16, Title, BaseQuestGump.DarkGreen, false, false);
g.AddHtmlLocalized(98, 140, 312, 16, 1049073, 0x2710, false, false); // Objective:
g.AddHtmlLocalized(98, 156, 312, 16, 1072208, 0x2710, false, false); // All of the following
int offset = 172;
g.AddHtmlLocalized(98, offset, 312, 16, 1116710, 0x2710, false, false); // Capture or kill a pirate listed on the bulletin board.
offset += 16;
g.AddHtmlLocalized(98, offset, 312, 32, 1116711, 0x15F90, false, false); //Return to the officer with the pirate or a death certificate for your reward.
offset += 32;
g.AddHtmlLocalized(98, offset, 312, 32, 1116712, 0x15F90, false, false); //The gold listed on the bulletin board and a special reward from the officer if captured alive.
return true;
}
private Type[] m_CapturedRewards = new Type[]
{
typeof(RuinedShipPlans), typeof(RuinedShipPlans),
typeof(LightFlameCannonball), typeof(HeavyFlameCannonball),
typeof(LightFrostCannonball), typeof(HeavyFrostCannonball),
typeof(LightFlameCannonball), typeof(HeavyFlameCannonball),
typeof(LightFrostCannonball), typeof(HeavyFrostCannonball),
/*typeof(HeavyScatterShot), typeof(LightScatterShot),
typeof(HeavyHotShot), typeof(LightHotShot),
typeof(HeavyFragShot), typeof(LightFragShot)*/
};
public override void Serialize( GenericWriter writer )
{
base.Serialize(writer);
writer.WriteEncodedInt( (int) 0 ); // version
writer.Write(m_Pole);
writer.Write(m_Rope);
writer.Write(m_Captain);
writer.Write(m_Galleon);
writer.Write(m_Helpers.Count);
foreach (Mobile mob in m_Helpers)
writer.Write(mob);
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
m_Pole = reader.ReadItem() as BindingPole;
m_Rope = reader.ReadItem() as BindingRope;
m_Captain = reader.ReadMobile();
m_Galleon = reader.ReadItem() as BaseGalleon;
int count = reader.ReadInt();
for (int i = 0; i < count; i++)
{
Mobile mob = reader.ReadMobile();
if (mob != null)
m_Helpers.Add(mob);
}
if(m_Rope != null)
m_Rope.Quest = this;
if (m_Pole != null)
m_Pole.Quest = this;
else
AddPole();
AddReward(new BaseReward(1116712)); //The gold listed on the bulletin board and a special reward from the officer if captured alive.
}
public bool HasQuest(PlayerMobile pm)
{
if (pm.Quests == null)
return false;
for(int i = 0; i < pm.Quests.Count; i++)
{
BaseQuest quest = pm.Quests[i];
if(quest.Quester == this)
{
for(int j = 0; j < quest.Objectives.Count; j++)
{
if(quest.Objectives[j].Update(pm))
quest.Objectives[j].Complete();
}
if(quest.Completed)
{
quest.OnCompleted();
pm.SendGump( new MondainQuestGump( quest, MondainQuestGump.Section.Complete, false, true ) );
}
else
{
pm.SendGump( new MondainQuestGump( quest, MondainQuestGump.Section.InProgress, false ) );
quest.InProgress();
}
return true;
}
}
return false;
}
}
}