Files
abysmal-isle/Scripts/Services/Expansions/High Seas/Quests/ProfessionFishQuest/PlayerFishingEntry.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

308 lines
9.5 KiB
C#

using System;
using Server;
using Server.Mobiles;
using Server.Items;
using System.Collections.Generic;
using Server.Commands;
using Server.Multis;
namespace Server.Engines.Quests
{
public class PlayerFishingEntry
{
public static void Initialize()
{
CommandSystem.Register("FishMongerStatus", AccessLevel.Player, new CommandEventHandler(FishMongerStatus_OnCommand));
}
private Mobile m_Player;
private double m_Reputation;
private bool m_HasRecievedBritGal;
private Dictionary<int, int> m_HaveFished = new Dictionary<int, int>();
private Dictionary<int, int> m_TimesFished = new Dictionary<int, int>();
public Mobile Player { get { return m_Player; } }
public double Reputation { get { return m_Reputation; } set { m_Reputation = value; } }
public bool HasRecievedBritGal { get { return m_HasRecievedBritGal; } set { m_HasRecievedBritGal = value; } }
public Dictionary<int, int> HaveFished { get { return m_HaveFished; } }
public Dictionary<int, int> TimesFished { get { return m_TimesFished; } }
private static Dictionary<Mobile, PlayerFishingEntry> m_FishingEntries = new Dictionary<Mobile, PlayerFishingEntry>();
public static Dictionary<Mobile, PlayerFishingEntry> FishingEntries { get { return m_FishingEntries; } }
public static readonly double RewardAmount = 15000;
public PlayerFishingEntry(Mobile from)
{
m_Player = from;
m_Reputation = 0.0;
m_FishingEntries.Add(from, this);
m_HasRecievedBritGal = false;
}
public static PlayerFishingEntry GetEntry(Mobile from)
{
return GetEntry(from, false);
}
public static PlayerFishingEntry GetEntry(Mobile from, bool create)
{
if (m_FishingEntries.ContainsKey(from))
return m_FishingEntries[from];
if (create)
{
PlayerFishingEntry entry = new PlayerFishingEntry(from);
return entry;
}
return null;
}
public double GetPointsAwarded(FishQuestObjective obj)
{
double toAward = 0.0;
foreach (KeyValuePair<Type, int[]> kvp in obj.Line)
{
Type type = kvp.Key;
int value = kvp.Value[1];
if (FishQuestHelper.IsShallowWaterFish(type))
toAward += value;
else if (FishQuestHelper.IsCrustacean(type) || FishQuestHelper.IsDeepWaterFish(type))
toAward += value * 2;
else if (FishQuestHelper.IsDungeonFish(type))
toAward += value * 3;
m_Reputation += toAward;
}
return toAward;
}
public void OnAfterReward(double points)
{
if (m_Player == null || m_Player.NetState == null)
return;
if (points <= 100)
m_Player.SendMessage("You have gained a fair amount of reputation with the Fish Mongers.");
else if (points <= 150)
m_Player.SendMessage("You have gained a good amount of reputation with the Fish Mongers.");
else
m_Player.SendMessage("You have gained a large amount of reputation with the Fish Mongers.");
}
public int CalculateLines()
{
int eligibleIndex = FishQuestHelper.GetIndexForSkillLevel(m_Player);
double line2 = 0.0; double line3 = 0.0;
double line4 = 0.0; double line5 = 0.0; double line6 = 0.0;
for (int i = 0; i < eligibleIndex; i++)
{
if (!m_TimesFished.ContainsKey(i))
continue;
int timesDone = Math.Min(6, m_TimesFished[i]);
int toAdd = 100 / eligibleIndex;
switch (timesDone)
{
case 6: goto case 5;
case 5: line6 += toAdd; goto case 4;
case 4: line5 += toAdd; goto case 3;
case 3: line4 += toAdd; goto case 2;
case 2: line3 += toAdd; goto case 1;
case 1: line2 += toAdd; goto case 0;
case 0:
default: break;
}
}
if (Math.Min(85, line6) >= Utility.Random(100))
return 6;
if (Math.Min(85, line5) >= Utility.Random(100))
return 5;
if (Math.Min(85, line4) >= Utility.Random(100))
return 4;
if (Math.Min(85, line3) >= Utility.Random(100))
return 3;
if (Math.Min(85, line2) >= Utility.Random(100))
return 2;
return 1;
}
public void GetRandomFish(ref int index, ref int amount, List<int> chosen)
{
int eligibleIndex = FishQuestHelper.GetIndexForSkillLevel(m_Player);
while(true)
{
index = Utility.Random(eligibleIndex);
if (!chosen.Contains(index))
break;
}
if (m_HaveFished.ContainsKey(index))
amount = m_HaveFished[index];
else
amount = 10;
}
public void OnQuestResign(Type type)
{
int index = FishQuestHelper.GetIndexForType(type);
if (index < 0)
return;
m_Reputation -= 20;
if (m_HaveFished.ContainsKey(index))
{
if (m_HaveFished[index] > 10)
m_HaveFished[index] -= 5;
else
m_HaveFished[index] = 5;
}
else
m_HaveFished.Add(index, 10);
}
public void OnQuestComplete(FishQuestObjective obj)
{
foreach (KeyValuePair<Type, int[]> kvp in obj.Line)
{
Type type = kvp.Key;
int index = FishQuestHelper.GetIndexForType(type);
if (m_HaveFished.ContainsKey(index))
{
if (m_HaveFished[index] >= 20)
m_HaveFished[index] = 10;
else
m_HaveFished[index] += 5;
}
else
m_HaveFished.Add(index, 15);
if (!m_TimesFished.ContainsKey(index))
m_TimesFished[index] = 0;
m_TimesFished[index]++;
}
}
public PlayerFishingEntry(GenericReader reader)
{
int version = reader.ReadInt();
if (version > 0)
m_HasRecievedBritGal = reader.ReadBool();
else
m_HasRecievedBritGal = false;
m_Player = reader.ReadMobile();
m_Reputation = reader.ReadDouble();
int count = reader.ReadInt();
for (int i = 0; i < count; i++)
{
int index = reader.ReadInt();
int finished = reader.ReadInt();
if (index >= 0 && index < FishQuestHelper.Fish.Length)
m_HaveFished.Add(index, finished);
}
count = reader.ReadInt();
for (int i = 0; i < count; i++)
{
int index = reader.ReadInt();
int fished = reader.ReadInt();
if (index >= 0 && index < FishQuestHelper.Fish.Length)
m_TimesFished.Add(index, fished);
}
if(m_Player != null)
m_FishingEntries.Add(m_Player, this);
}
public void Serialize(GenericWriter writer)
{
writer.Write((int)1);
writer.Write(m_HasRecievedBritGal);
writer.Write(m_Player);
writer.Write(m_Reputation);
writer.Write(m_HaveFished.Count);
foreach (KeyValuePair<int, int> kvp in m_HaveFished)
{
writer.Write(kvp.Key);
writer.Write(kvp.Value);
}
writer.Write(m_TimesFished.Count);
foreach (KeyValuePair<int, int> kvp in m_TimesFished)
{
writer.Write(kvp.Key);
writer.Write(kvp.Value);
}
}
public void GetFishMongerReputation(Mobile from)
{
if (from == null)
return;
from.SendMessage("You have earned {0} amount of reputation with the Fish Mongers.", GetStatus());
}
private string GetStatus()
{
double points = m_Reputation;
if (points < 500)
return m_Status[0];
if (points < 1000)
return m_Status[1];
if (points < 5000)
return m_Status[2];
if (points < 15000)
return m_Status[3];
if (points < 50000)
return m_Status[4];
return m_Status[5];
}
private string[] m_Status = new string[]
{
"a small",
"a fair",
"a moderate",
"a tremendous",
"an outstanding",
"an enormous",
};
public static void FishMongerStatus_OnCommand(CommandEventArgs e)
{
PlayerFishingEntry entry = GetEntry(e.Mobile);
if (entry != null)
entry.GetFishMongerReputation(e.Mobile);
else
e.Mobile.SendMessage("You have no reputation with the Fish Mongers.");
}
}
}