Files
abysmal-isle/Scripts/Services/Seasonal Events/ForsakenFoes/Mobile/MiningCooperativeMerchant.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

234 lines
7.8 KiB
C#

using System;
using Server.Items;
using System.Collections.Generic;
using Server.Mobiles;
using Server.Gumps;
using Server.Network;
using System.IO;
using System.Linq;
namespace Server.Engines.Quests
{
public class CooperativeArray
{
public string Account { get; set; }
public int Purchase { get; set; }
}
public class MiningCooperative
{
public static string FilePath = Path.Combine("Saves/Misc", "MiningCooperative.bin");
private static List<CooperativeArray> PurchaseList = new List<CooperativeArray>();
public static void Configure()
{
EventSink.WorldSave += OnSave;
EventSink.WorldLoad += OnLoad;
}
public static void AddPurchase(Mobile from, int amount)
{
string acc = from.Account.ToString();
if (CheckList(from))
{
PurchaseList.Find(x => x.Account == acc).Purchase += amount;
}
else
{
PurchaseList.Add(new CooperativeArray { Account = from.Account.ToString(), Purchase = amount });
}
}
public static bool CheckList(Mobile from)
{
string acc = from.Account.ToString();
return PurchaseList.Any(x => x.Account == acc);
}
public static int PurchaseAmount(Mobile from)
{
int amount = 0;
if (CheckList(from))
{
amount = PurchaseList.FirstOrDefault(x => x.Account == from.Account.ToString()).Purchase;
}
return amount;
}
public static void DefragTables()
{
PurchaseList = new List<CooperativeArray>();
}
public static void OnSave(WorldSaveEventArgs e)
{
Persistence.Serialize(
FilePath,
writer =>
{
writer.Write((int)0);
writer.Write(PurchaseList.Count);
PurchaseList.ForEach(s =>
{
writer.Write(s.Account);
writer.Write((int)s.Purchase);
});
});
}
public static void OnLoad()
{
Persistence.Deserialize(
FilePath,
reader =>
{
int version = reader.ReadInt();
int count = reader.ReadInt();
for (int i = count; i > 0; i--)
{
string acc = reader.ReadString();
int purchase = reader.ReadInt();
if (acc != null)
{
PurchaseList.Add(new CooperativeArray { Account = acc, Purchase = purchase });
}
}
});
}
}
public class MiningCooperativeMerchant : BaseVendor
{
protected readonly List<SBInfo> m_SBInfos = new List<SBInfo>();
protected override List<SBInfo> SBInfos { get { return m_SBInfos; } }
public override bool IsActiveVendor { get { return false; } }
public override bool IsInvulnerable { get { return true; } }
public int MaxAmount { get { return 5000; } }
public int Price { get { return 112; } }
public int Quantity { get { return 500; } }
public static MiningCooperativeMerchant InstanceTram { get; set; }
public static MiningCooperativeMerchant InstanceFel { get; set; }
public override void InitSBInfo()
{
}
[Constructable]
public MiningCooperativeMerchant()
: base("the Mining Cooperative Merchant")
{
}
public MiningCooperativeMerchant(Serial serial)
: base(serial)
{
}
public override void InitOutfit()
{
AddItem(new FancyShirt(0x3E4));
AddItem(new LongPants(0x192));
AddItem(new Pickaxe());
AddItem(new ThighBoots(0x283));
}
public override void OnDoubleClick(Mobile from)
{
from.CloseGump(typeof(MiningCooperativeGump));
from.SendGump(new MiningCooperativeGump(this, from));
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
if (Map == Map.Trammel)
{
InstanceTram = this;
}
if (Map == Map.Felucca)
{
InstanceFel = this;
}
}
public class MiningCooperativeGump : Gump
{
private readonly MiningCooperativeMerchant Vendor;
public MiningCooperativeGump(MiningCooperativeMerchant vendor, Mobile from)
: base(100, 100)
{
Vendor = vendor;
AddPage(0);
int available = vendor.MaxAmount - MiningCooperative.PurchaseAmount(from);
AddBackground(0, 0, 310, 350, 0x6DB);
AddImage(54, 0, 0x6E4);
AddHtmlLocalized(10, 10, 290, 18, 1114513, "#1154040", 0x0, false, false); // <DIV ALIGN=CENTER>~1_TOKEN~</DIV>
AddItem(20, 80, 0xA3E8);
AddHtmlLocalized(120, 73, 180, 18, 1159190, 0x43FF, false, false); // Ethereal Sand
AddHtmlLocalized(120, 100, 180, 18, 1159191, vendor.Price.ToString(), 0x43FF, false, false); // GP: ~1_VALUE~
AddItem(20, 140, 0x14F0);
AddHtmlLocalized(120, 143, 180, 18, 1159193, string.Format("{0}@{1}", vendor.Quantity, vendor.Quantity*vendor.Price), 0x5FF0, false, false); // x~1_QUANT~ GP: ~2_COST~
AddHtmlLocalized(25, 203, 275, 18, 1159192, string.Format("{0}@{1}", available, vendor.MaxAmount), 0x7FF0, false, false); // Available For Purchase: ~1_PART~ / ~2_WHOLE~
AddHtmlLocalized(20, 243, 160, 72, 1159194, string.Format("{0}@#1159190@{1}", vendor.Quantity, vendor.Quantity * vendor.Price), 0x7FFF, false, false); // Purchase a Commodity Deed filled with ~1_QUANT~ ~2_NAME~ for ~3_COST~ GP?
AddButton(220, 260, 0x81C, 0x81B, 1, GumpButtonType.Reply, 0);
}
public override void OnResponse(NetState sender, RelayInfo info)
{
Mobile from = sender.Mobile;
int available = Vendor.MaxAmount - MiningCooperative.PurchaseAmount(from);
int payment = Vendor.Quantity * Vendor.Price;
if (info.ButtonID == 1)
{
if (available > 0)
{
if (Banker.Withdraw(from, payment, true))
{
CommodityDeed deed = new CommodityDeed();
deed.SetCommodity(new EtherealSand(Vendor.Quantity));
from.AddToBackpack(deed);
MiningCooperative.AddPurchase(from, Vendor.Quantity);
from.SendGump(new MiningCooperativeGump(Vendor, from));
}
else
{
Vendor.Say(500192); // Begging thy pardon, but thou canst not afford that.
}
}
else
{
Vendor.Say(1159195); // Begging thy pardon, but your family has purchased the maximum amount of that commodity. I cannot sell you more until a new shipment arrives!
}
}
}
}
}
}