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

185 lines
4.9 KiB
C#

using System;
using Server;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using Server.Mobiles;
namespace Server.Items
{
public static class EnchantedHotItem
{
public static string FilePath = Path.Combine("Saves/Misc", "EnchantedHotItem.bin");
public static void Configure()
{
EventSink.WorldSave += OnSave;
EventSink.WorldLoad += OnLoad;
}
public static void OnSave(WorldSaveEventArgs e)
{
Persistence.Serialize(
FilePath,
writer =>
{
writer.Write(1);
});
}
public static void OnLoad()
{
Persistence.Deserialize(
FilePath,
reader =>
{
int version = reader.ReadInt();
if (version == 0)
{
int count = reader.ReadInt();
for (int i = 0; i < count; i++)
{
Item item = reader.ReadItem();
Container c = reader.ReadItem() as Container;
if (item != null && c != null)
{
item.AttachSocket(new EnchantedHotItemSocket(c));
}
}
}
});
}
public static Point3D[] ChestLocs =
{
new Point3D(5703, 664, 0), new Point3D(5703, 663, 0), new Point3D(5703, 662, 0), new Point3D(5703, 661, 0),
new Point3D(5707, 659, 0), new Point3D(5708, 659, 0), new Point3D(5709, 659, 0)
};
public static void SpawnChests(Map map)
{
IPooledEnumerable eable = map.GetItemsInRange(new Point3D(5707, 662, 0), 15);
foreach (Item item in eable)
{
if (item is MetalGoldenChest)
{
item.Delete();
}
}
eable.Free();
for (int i = 0; i < ChestLocs.Length; i++)
{
var chest = new HotItemChest(i <= 3 ? 3648 : 3649);
chest.MoveToWorld(ChestLocs[i], map);
chest.SpawnLoot();
}
}
}
public class HotItemChest : LockableContainer
{
public HotItemChest(int itemID)
: base(itemID)
{
Movable = false;
RequiredSkill = 92;
LockLevel = RequiredSkill - Utility.Random(1, 10);
MaxLockLevel = RequiredSkill;
LiftOverride = true;
Locked = true;
}
public void SpawnLoot()
{
List<Item> list = new List<Item>(Items);
foreach (var item in list)
item.Delete();
ColUtility.Free(list);
int toSpawn = Utility.RandomMinMax(2, 4);
for (int i = 0; i < toSpawn; i++)
{
Item item;
if (i == 0)
{
item = Loot.RandomScroll(0, Loot.RegularScrollTypes.Length, SpellbookType.Regular);
}
else
{
item = Loot.RandomArmorOrShieldOrWeaponOrJewelry(false, false, true);
if (item is BaseWeapon && 0.01 > Utility.RandomDouble())
{
((BaseWeapon)item).ExtendedWeaponAttributes.AssassinHoned = 1;
}
int min = 400;
int max = 1400;
RunicReforging.GenerateRandomItem(item, 0, min, max, this.Map);
item.Hue = 1258;
item.AttachSocket(new EnchantedHotItemSocket(this));
//EnchantedHotItem.AddItem(item, this);
}
DropItem(item);
}
}
public override void LockPick(Mobile from)
{
base.LockPick(from);
Timer.DelayCall(TimeSpan.FromMinutes(10), () =>
{
Visible = false;
Visible = true;
Locked = true;
SpawnLoot();
});
}
public HotItemChest(Serial serial)
: base(serial)
{
}
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 (!Locked)
{
Timer.DelayCall(TimeSpan.FromMinutes(5), () =>
{
Locked = true;
});
}
}
}
}