Files
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

241 lines
8.8 KiB
C#

using System;
using Server;
using Server.Mobiles;
using Server.Targeting;
using System.Collections.Generic;
using Server.Engines.HuntsmasterChallenge;
namespace Server.Items
{
public class HuntingPermit : Item
{
private static List<HuntingPermit> m_Permits = new List<HuntingPermit>();
public static List<HuntingPermit> Permits { get { return m_Permits; } }
private Mobile m_Owner;
private bool m_ProducedTrophy;
private bool m_HasSubmitted;
private HuntingKillEntry m_KillEntry;
[CommandProperty(AccessLevel.GameMaster)]
public Mobile Owner { get { return m_Owner; } set { m_Owner = value; } }
[CommandProperty(AccessLevel.GameMaster)]
public bool ProducedTrophy { get { return m_ProducedTrophy; } set { m_ProducedTrophy = value; } }
[CommandProperty(AccessLevel.GameMaster)]
public HuntingKillEntry KillEntry { get { return m_KillEntry; } set { m_KillEntry = value; } }
[CommandProperty(AccessLevel.GameMaster)]
public bool HasDocumentedKill { get { return m_KillEntry != null; } }
[CommandProperty(AccessLevel.GameMaster)]
public bool CanUseTaxidermyOn { get { return HasDocumentedKill && m_KillEntry.KillIndex < HuntingTrophyInfo.Infos.Count && !m_ProducedTrophy; } }
[CommandProperty(AccessLevel.GameMaster)]
public bool HasSubmitted
{
get { return m_HasSubmitted; }
set
{
m_HasSubmitted = value;
if(m_HasSubmitted && m_Permits.Contains(this))
m_Permits.Remove(this);
}
}
public override int LabelNumber { get { return 1155704; } } // Hunting Permit
[Constructable]
public HuntingPermit(Mobile from)
: base(5360)
{
m_Owner = from;
m_Permits.Add(this);
}
public override void OnDoubleClick(Mobile from)
{
if (from.Backpack != null && IsChildOf(from.Backpack))
{
if (!HasDocumentedKill)
{
from.Target = new InternalTarget(this);
MessageHelper.SendLocalizedMessageTo(this, from, 1155705, 0x45); // Target the kill you wish to document
}
else
from.SendLocalizedMessage(1155712); // This hunting permit has already documented a kill.
}
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (m_KillEntry == null || m_KillEntry.KillIndex < 0 || m_KillEntry.KillIndex >= HuntingTrophyInfo.Infos.Count)
return;
HuntingTrophyInfo info = HuntingTrophyInfo.Infos[m_KillEntry.KillIndex];
if (m_Owner != null)
list.Add(1155708, m_Owner.Name); // Hunter: ~1_NAME~
if (m_KillEntry.DateKilled != DateTime.MinValue)
list.Add(1155709, m_KillEntry.DateKilled.ToShortDateString()); // Date of Kill: ~1_DATE~
if (m_KillEntry.Location != null)
list.Add(1061114, m_KillEntry.Location); // Location: ~1_val~
list.Add(1155718, info.Species.ToString());
if (info.MeasuredBy == MeasuredBy.Length)
list.Add(1155711, m_KillEntry.Measurement.ToString()); // Length: ~1_VAL~
else if (info.MeasuredBy == MeasuredBy.Wingspan)
list.Add(1155710, m_KillEntry.Measurement.ToString()); // Wingspan: ~1_VAL~
else
list.Add(1072789, m_KillEntry.Measurement.ToString()); // Weight: ~1_WEIGHT~
}
private class InternalTarget : Target
{
private HuntingPermit m_Permit;
public InternalTarget(HuntingPermit Permit)
: base(-1, false, TargetFlags.None)
{
m_Permit = Permit;
}
protected override void OnTarget(Mobile from, object targeted)
{
if (targeted is Corpse)
{
Corpse c = targeted as Corpse;
if (!from.InRange(c.Location, 3))
from.SendLocalizedMessage(500446); // That is too far away.
if (c.VisitedByTaxidermist)
from.SendLocalizedMessage(1042596); // That corpse seems to have been visited by a taxidermist already.
else if (!m_Permit.IsChildOf(from.Backpack))
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
else if (c.Owner == null)
from.SendLocalizedMessage(1155706); // That is not a valid kill.
else if (!IsOnlyAttacker(from, c.Owner))
from.SendLocalizedMessage(1155707); // You cannot document someone else's kill.
else
{
Type t = c.Owner.GetType();
if (t == typeof(RagingGrizzlyBear)) // Bandaid Fix, we'll keep this until others arise
t = typeof(GrizzlyBear);
for (int i = 0; i < HuntingTrophyInfo.Infos.Count; i++)
{
HuntingTrophyInfo info = HuntingTrophyInfo.Infos[i];
if (t == info.CreatureType)
{
int v = 0;
if (HuntingSystem.Instance != null && HuntingSystem.Instance.IsPrimeHunt(from, c.Location))
{
v = Utility.RandomMinMax(0, 100);
}
else
{
v = Utility.RandomMinMax(0, 10000);
v = (int)Math.Sqrt(v);
v = 100 - v;
}
int measurement = info.MinMeasurement + (int)((double)(info.MaxMeasurement - info.MinMeasurement) * (double)((double)v / 100.0));
m_Permit.KillEntry = new HuntingKillEntry(m_Permit.Owner, measurement, DateTime.Now, i, WorldLocationInfo.GetLocationString(c.Location, c.Map));
c.VisitedByTaxidermist = true;
from.PlaySound(0x249);
from.PrivateOverheadMessage(Server.Network.MessageType.Regular, 0x45, 1155713, from.NetState); // *You document your kill on the permit*
m_Permit.InvalidateProperties();
return;
}
}
from.SendLocalizedMessage(1155706); // That is not a valid kill.
}
}
}
private bool IsOnlyAttacker(Mobile from, Mobile creature)
{
BaseCreature bc = creature as BaseCreature;
if (bc != null)
{
List<DamageStore> rights = bc.GetLootingRights();
return rights.Count > 0 && rights[0].m_Mobile == from && rights[0].m_Damage >= bc.HitsMax;
}
return false;
}
}
public override void Delete()
{
base.Delete();
if (m_Permits.Contains(this))
m_Permits.Remove(this);
}
public static bool HasPermit(Mobile from)
{
foreach (HuntingPermit permit in m_Permits)
{
if (permit.Owner == from)
return true;
}
return false;
}
public HuntingPermit(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
writer.Write(m_Owner);
writer.Write(m_ProducedTrophy);
writer.Write(m_HasSubmitted);
if (m_KillEntry != null)
{
writer.Write((int)1);
m_KillEntry.Serialize(writer);
}
else
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
m_Owner = reader.ReadMobile();
m_ProducedTrophy = reader.ReadBool();
m_HasSubmitted = reader.ReadBool();
if (reader.ReadInt() == 1)
m_KillEntry = new HuntingKillEntry(reader);
if (m_Owner != null && !m_HasSubmitted)
m_Permits.Add(this);
}
}
}