Overwrite

Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
Unstable Kitsune
2023-11-28 23:20:26 -05:00
parent 3cd54811de
commit b918192e4e
11608 changed files with 2644205 additions and 47 deletions

View File

@@ -0,0 +1,62 @@
using System;
using Server.Mobiles;
using Server;
namespace Server.Items
{
[TypeAlias("drNO.ThieveItems.BalmOfProtection")]
public class BalmOfProtection : BaseBalmOrLotion
{
public static double HandleDamage(PlayerMobile pm, double damage)
{
if (IsUnderThieveConsumableEffect(pm,ThieveConsumableEffect.BalmOfProtectionEffect))
{
int rnd = 50 + Utility.Random(51);
damage = damage- (damage * (rnd / 100.0));
return damage;
}
else
{
return damage;
}
}
public override int LabelNumber { get { return 1094943; } } // Balm of Protection
[Constructable]
public BalmOfProtection()
: base(0x1C18)
{
m_EffectType = ThieveConsumableEffect.BalmOfProtectionEffect;
Hue = 0x499;
}
protected override void ApplyEffect(PlayerMobile pm)
{
base.ApplyEffect(pm);
pm.SendLocalizedMessage(1095143); // You apply the ointment and suddenly feel less vulnerable!
}
public BalmOfProtection(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();
}
}
}

View File

@@ -0,0 +1,48 @@
using System;
using Server.Mobiles;
using Server;
namespace Server.Items
{
[TypeAlias("drNO.ThieveItems.BalmOfStrength")]
public class BalmOfStrength : BaseBalmOrLotion
{
public override int LabelNumber { get { return 1094940; } } // Balm of Strength
[Constructable]
public BalmOfStrength()
: base(0xEFB)
{
m_EffectType = ThieveConsumableEffect.BalmOfStrengthEffect;
}
protected override void ApplyEffect(PlayerMobile pm)
{
pm.AddStatMod(new StatMod(StatType.Str, "Balm", 10, m_EffectDuration));
pm.SendLocalizedMessage(1095136); //You apply the balm and suddenly feel stronger!
base.ApplyEffect(pm);
}
public BalmOfStrength(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();
}
}
}

View File

@@ -0,0 +1,46 @@
using System;
using Server;
using Server.Mobiles;
namespace Server.Items
{
[TypeAlias("drNO.ThieveItems.BalmOfSwiftness")]
public class BalmOfSwiftness : BaseBalmOrLotion
{
public override int LabelNumber { get { return 1094942; } } // Balm of Swiftness
[Constructable]
public BalmOfSwiftness()
: base(0x1848)
{
m_EffectType = ThieveConsumableEffect.BalmOfSwiftnessEffect;
}
protected override void ApplyEffect(PlayerMobile pm)
{
pm.AddStatMod(new StatMod(StatType.Dex, "Balm", 10, m_EffectDuration));
pm.SendLocalizedMessage(1095138);//You apply the balm and suddenly feel more agile!
base.ApplyEffect(pm);
}
public BalmOfSwiftness(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();
}
}
}

View File

@@ -0,0 +1,46 @@
using System;
using Server;
using Server.Mobiles;
namespace Server.Items
{
[TypeAlias("drNO.ThieveItems.BalmOfWisdom")]
public class BalmOfWisdom : BaseBalmOrLotion
{
public override int LabelNumber { get { return 1094941; } } // Balm of Wisdom
[Constructable]
public BalmOfWisdom()
: base(0x1847)
{
m_EffectType = ThieveConsumableEffect.BalmOfWisdomEffect;
}
protected override void ApplyEffect(PlayerMobile pm)
{
pm.AddStatMod(new StatMod(StatType.Int, "Balm", 10, m_EffectDuration));
pm.SendLocalizedMessage(1095137);//You apply the balm and suddenly feel wiser!
base.ApplyEffect(pm);
}
public BalmOfWisdom(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();
}
}
}

View File

@@ -0,0 +1,111 @@
using System;
using Server.Gumps;
using Server.Mobiles;
using Server.Network;
namespace Server.Items
{
[TypeAlias("drNO.ThieveItems.GemOfSalvation")]
public class GemOfSalvation : Item
{
public override int LabelNumber { get { return 1094939; } } // Gem of Salvation
[Constructable]
public GemOfSalvation()
: base(0x1F13)
{
Hue = 286;
LootType = LootType.Blessed;
}
public static void Initialize()
{
EventSink.PlayerDeath += new PlayerDeathEventHandler(PlayerDeath);
}
public static void PlayerDeath(PlayerDeathEventArgs args)
{
PlayerMobile pm = (PlayerMobile)args.Mobile;
if (pm != null && pm.Backpack != null)
{
GemOfSalvation gem = pm.Backpack.FindItemByType<GemOfSalvation>();
if (gem != null)
{
Timer.DelayCall(TimeSpan.FromSeconds(2), () =>
{
if (DateTime.UtcNow < pm.NextGemOfSalvationUse)
{
TimeSpan left = pm.NextGemOfSalvationUse - DateTime.UtcNow;
if (left >= TimeSpan.FromMinutes(1.0))
pm.SendLocalizedMessage(1095131, ((left.Hours * 60) + left.Minutes).ToString()); // Your spirit lacks cohesion. You must wait ~1_minutes~ minutes before invoking the power of a Gem of Salvation.
else
pm.SendLocalizedMessage(1095130, left.Seconds.ToString()); // Your spirit lacks cohesion. You must wait ~1_seconds~ seconds before invoking the power of a Gem of Salvation.
}
else
{
pm.CloseGump(typeof(ResurrectGump));
pm.SendGump(new GemResurrectGump(pm, gem));
}
});
}
}
}
public GemOfSalvation(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();
}
}
public class GemResurrectGump : ResurrectGump
{
private GemOfSalvation m_Gem;
private PlayerMobile m_Mobile;
public GemResurrectGump(PlayerMobile pm, GemOfSalvation gem)
: base(pm, ResurrectMessage.GemOfSalvation)
{
m_Gem = gem;
m_Mobile = pm;
}
public override void OnResponse(NetState state, RelayInfo info)
{
m_Mobile.CloseGump(typeof(ResurrectGump));
if (info.ButtonID == 1 && !m_Gem.Deleted && m_Gem.IsChildOf(m_Mobile.Backpack))
{
if (m_Mobile.Map == null || !m_Mobile.Map.CanFit(m_Mobile.Location, 16, false, false))
{
m_Mobile.SendLocalizedMessage(502391); // Thou can not be resurrected there!
return;
}
m_Mobile.PlaySound(0x214);
m_Mobile.Resurrect();
m_Mobile.SendLocalizedMessage(1095132); // The gem infuses you with its power and is destroyed in the process.
m_Gem.Delete();
m_Mobile.NextGemOfSalvationUse = DateTime.UtcNow + TimeSpan.FromHours(6);
}
}
}
}

View File

@@ -0,0 +1,64 @@
using System;
using Server.Mobiles;
using Server;
namespace Server.Items
{
[TypeAlias("drNO.ThieveItems.LifeShieldLotion")]
public class LifeShieldLotion : BaseBalmOrLotion
{
public override int LabelNumber { get { return 1094945; } } // Life Shield Lotion
[Constructable]
public LifeShieldLotion()
: base(0xEFC)
{
m_EffectType = ThieveConsumableEffect.LifeShieldLotionEffect;
}
public override void OnDoubleClick(Mobile from)
{
OnUse((PlayerMobile)from);
}
protected override void ApplyEffect(PlayerMobile pm)
{
base.ApplyEffect(pm);
pm.SendMessage("You applied Life Shield Lotion");
}
public static double HandleLifeDrain(PlayerMobile pm, double damage)
{
if (IsUnderThieveConsumableEffect(pm, ThieveConsumableEffect.LifeShieldLotionEffect))
{
int rnd = 50 + Utility.Random(50);
int dmgMod = (int)(damage * (rnd / 100.0));
damage = damage - dmgMod;
return damage;
}
else
{
return damage;
}
}
public LifeShieldLotion(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();
}
}
}

View File

@@ -0,0 +1,117 @@
using System;
using System.Collections.Generic;
using Server;
using Server.Mobiles;
namespace Server.Items
{
[TypeAlias("drNO.ThieveItems.ManaDraught")]
public class ManaDraught : Item
{
private static Dictionary<PlayerMobile, DateTime> DaughtUsageList = new Dictionary<PlayerMobile, DateTime>();
private static TimeSpan Cooldown = TimeSpan.FromMinutes(10);
public override int LabelNumber { get { return 1094938; } } // Mana Draught
[Constructable]
public ManaDraught()
: base(0xFFB)
{
Hue = 0x48A;
Weight = 1.0;
}
public static void DoCleanup()
{
List<PlayerMobile> toRemove = new List<PlayerMobile>();
foreach (PlayerMobile pm in DaughtUsageList.Keys)
{
if (DaughtUsageList[pm] < DateTime.Now + Cooldown)
{
toRemove.Add(pm);
}
}
foreach (PlayerMobile pm in toRemove)
{
DaughtUsageList.Remove(pm);
}
toRemove.Clear();
}
private bool CheckUse(PlayerMobile pm)
{
if (DaughtUsageList.ContainsKey(pm))
{
if (DaughtUsageList[pm] + Cooldown >= DateTime.Now)
return false;
else
return true;
}
else
{
return true;
}
}
private void OnUsed(PlayerMobile by)
{
if (CheckUse(by))
{
DoHeal(by);
}
else
{
by.SendLocalizedMessage(1079263, ((int)((DaughtUsageList[by] + Cooldown)-DateTime.Now).TotalSeconds).ToString());
}
}
private void DoHeal(PlayerMobile pm)
{
int toHeal = Utility.RandomMinMax(25, 40);
int diff = pm.ManaMax - pm.Mana;
if (diff == 0)
{
pm.SendLocalizedMessage(1095127); //You are already at full mana
return;
}
toHeal = Math.Min(toHeal, diff);
pm.Mana += toHeal;
this.Consume();
if (!DaughtUsageList.ContainsKey(pm))
{
DaughtUsageList.Add(pm, DateTime.Now);
}
else
{
DaughtUsageList[pm] = DateTime.Now;
}
pm.SendLocalizedMessage(1095128);//The sour draught instantly restores some of your mana!
}
public ManaDraught(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();
}
}
}

View File

@@ -0,0 +1,130 @@
using System;
using System.Collections.Generic;
using Server;
using Server.Mobiles;
namespace Server.Items
{
[TypeAlias("drNO.ThieveItems.SeedOflife")]
public class SeedOfLife : Item
{
private static Dictionary<PlayerMobile, DateTime> SeedUsageList = new Dictionary<PlayerMobile, DateTime>();
private static TimeSpan Cooldown = TimeSpan.FromMinutes(10);
public static void Initialize()
{
EventSink.AfterWorldSave += CheckCleanup;
}
public override int LabelNumber { get { return 1094937; } } // seed of life
[Constructable]
public SeedOfLife()
: base(0x1727)
{
Hue = 0x491;
Weight = 1.0;
Stackable = true;
}
public static void CheckCleanup(AfterWorldSaveEventArgs e)
{
DoCleanup();
ManaDraught.DoCleanup();
}
public static void DoCleanup()
{
List<PlayerMobile> toRemove = new List<PlayerMobile>();
foreach (PlayerMobile pm in SeedUsageList.Keys)
{
if (SeedUsageList[pm] < DateTime.Now + Cooldown)
{
toRemove.Add(pm);
}
}
foreach (PlayerMobile pm in toRemove)
{
SeedUsageList.Remove(pm);
}
toRemove.Clear();
}
private bool CheckUse(PlayerMobile pm)
{
if (SeedUsageList.ContainsKey(pm))
{
if (SeedUsageList[pm] + Cooldown >= DateTime.Now)
return false;
else
return true;
}
else
{
return true;
}
}
private void OnUsed(PlayerMobile by)
{
if (CheckUse(by))
{
DoHeal(by);
}
else
{
by.SendLocalizedMessage(1079263,((int)(((SeedUsageList[by] + Cooldown)-DateTime.Now).TotalSeconds)).ToString());
}
}
private void DoHeal(PlayerMobile pm)
{
int toHeal = Utility.RandomMinMax(25, 40);
int diff = pm.HitsMax - pm.Hits;
if (diff == 0)
{
pm.SendLocalizedMessage(1049547); //You are already at full health
return;
}
toHeal = Math.Min(toHeal, diff);
pm.Hits += toHeal;
this.Consume();
if (!SeedUsageList.ContainsKey(pm))
{
SeedUsageList.Add(pm, DateTime.Now);
}
else
{
SeedUsageList[pm] = DateTime.Now;
}
pm.SendLocalizedMessage(1095126);//The bitter seed instantly restores some of your health!
}
public SeedOfLife(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();
}
}
}

View File

@@ -0,0 +1,46 @@
using System;
using Server;
namespace Server.Items
{
public class SmugglersLantern : Lantern
{
public override int LabelNumber { get { return 1071521; } } // Smuggler's Lantern
[Constructable]
public SmugglersLantern()
{
Hue = Utility.RandomMinMax(192, 291);
}
public override bool AllowEquipedCast(Mobile from)
{
return true;
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1079766); // Spell Channeling
}
public SmugglersLantern(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();
}
}
}

View File

@@ -0,0 +1,81 @@
using System;
using Server;
namespace Server.Items
{
public class SmugglersToolBox : Item
{
private int _UsesRemaining;
[CommandProperty(AccessLevel.GameMaster)]
public int UsesRemaining { get { return _UsesRemaining; } set { _UsesRemaining = value; InvalidateProperties(); } }
public DateTime NextRecharge { get; set; }
public override int LabelNumber { get { return 1071520; } } // Smuggler's Tool Box
[Constructable]
public SmugglersToolBox()
: base(0x1EB6)
{
Hue = 953;
UsesRemaining = 10;
NextRecharge = DateTime.UtcNow;
}
public override void OnDoubleClick(Mobile m)
{
if (IsChildOf(m.Backpack) && _UsesRemaining > 0)
{
var lockpick = new Lockpick(Utility.RandomMinMax(5, 12));
if (m.Backpack == null || !m.Backpack.TryDropItem(m, lockpick, false))
{
m.SendLocalizedMessage(1077971); // Make room in your backpack first!
lockpick.Delete();
}
else
{
m.SendLocalizedMessage(1071526); // You take some lockpicks from the tool box.
UsesRemaining--;
}
}
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1060584, _UsesRemaining.ToString());
}
public SmugglersToolBox(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(_UsesRemaining);
writer.Write(NextRecharge);
if (NextRecharge < DateTime.UtcNow)
{
UsesRemaining = Math.Min(20, UsesRemaining + 1);
NextRecharge = DateTime.UtcNow + TimeSpan.FromHours(24);
}
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
_UsesRemaining = reader.ReadInt();
NextRecharge = reader.ReadDateTime();
}
}
}

View File

@@ -0,0 +1,48 @@
using System;
using Server.Mobiles;
using Server;
namespace Server.Items
{
[TypeAlias("drNO.ThieveItems.StoneSkinLotion")]
public class StoneSkinLotion : BaseBalmOrLotion
{
protected override void ApplyEffect(PlayerMobile pm)
{
pm.AddResistanceMod(new ResistanceMod(ResistanceType.Cold, -5));
pm.AddResistanceMod(new ResistanceMod(ResistanceType.Fire, -5));
pm.AddResistanceMod(new ResistanceMod(ResistanceType.Physical, 30));
base.ApplyEffect(pm);
}
public override int LabelNumber { get { return 1094944; } } // Stone Skin Lotion
[Constructable]
public StoneSkinLotion()
: base(0xEFD)
{
m_EffectType = ThieveConsumableEffect.StoneSkinLotionEffect;
}
public StoneSkinLotion(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();
}
}
}