fix: Codegens potions and fixes a few minor bugs (#1347)

This commit is contained in:
Kamron Batman 2023-02-24 18:06:59 -08:00 • committed by GitHub
parent 42bcf3c95a
commit 8c4aaeeda6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
76 changed files with 1644 additions and 2095 deletions

View file

@ -1,33 +1,16 @@
using System; using System;
using ModernUO.Serialization;
namespace Server.Items namespace Server.Items;
{
public class AgilityPotion : BaseAgilityPotion [SerializationGenerator(0, false)]
public partial class AgilityPotion : BaseAgilityPotion
{ {
[Constructible] [Constructible]
public AgilityPotion() : base(PotionEffect.Agility) public AgilityPotion() : base(PotionEffect.Agility)
{ {
} }
public AgilityPotion(Serial serial) : base(serial)
{
}
public override int DexOffset => 10; public override int DexOffset => 10;
public override TimeSpan Duration => TimeSpan.FromMinutes(2.0); public override TimeSpan Duration => TimeSpan.FromMinutes(2.0);
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,36 +1,20 @@
using System; using System;
using ModernUO.Serialization;
using Server.Engines.ConPVP; using Server.Engines.ConPVP;
using Server.Spells; using Server.Spells;
namespace Server.Items namespace Server.Items;
{
public abstract class BaseAgilityPotion : BasePotion [SerializationGenerator(0, false)]
public abstract partial class BaseAgilityPotion : BasePotion
{ {
public BaseAgilityPotion(PotionEffect effect) : base(0xF08, effect) public BaseAgilityPotion(PotionEffect effect) : base(0xF08, effect)
{ {
} }
public BaseAgilityPotion(Serial serial) : base(serial)
{
}
public abstract int DexOffset { get; } public abstract int DexOffset { get; }
public abstract TimeSpan Duration { get; } public abstract TimeSpan Duration { get; }
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public bool DoAgility(Mobile from) public bool DoAgility(Mobile from)
{ {
// TODO: Verify scaled; is it offset, duration, or both? // TODO: Verify scaled; is it offset, duration, or both?
@ -58,4 +42,3 @@ namespace Server.Items
} }
} }
} }
}

View file

@ -1,33 +1,16 @@
using System; using System;
using ModernUO.Serialization;
namespace Server.Items namespace Server.Items;
{
public class GreaterAgilityPotion : BaseAgilityPotion [SerializationGenerator(0, false)]
public partial class GreaterAgilityPotion : BaseAgilityPotion
{ {
[Constructible] [Constructible]
public GreaterAgilityPotion() : base(PotionEffect.AgilityGreater) public GreaterAgilityPotion() : base(PotionEffect.AgilityGreater)
{ {
} }
public GreaterAgilityPotion(Serial serial) : base(serial)
{
}
public override int DexOffset => 20; public override int DexOffset => 20;
public override TimeSpan Duration => TimeSpan.FromMinutes(2.0); public override TimeSpan Duration => TimeSpan.FromMinutes(2.0);
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,10 +1,11 @@
using System; using System;
using ModernUO.Serialization;
using Server.Engines.ConPVP; using Server.Engines.ConPVP;
using Server.Engines.Craft; using Server.Engines.Craft;
using Server.Utilities; using Server.Utilities;
namespace Server.Items namespace Server.Items;
{
public enum PotionEffect public enum PotionEffect
{ {
Nightsight, Nightsight,
@ -38,33 +39,22 @@ namespace Server.Items
Darkglow Darkglow
} }
public abstract class BasePotion : Item, ICraftable, ICommodity [SerializationGenerator(2, false)]
public abstract partial class BasePotion : Item, ICraftable, ICommodity
{ {
private PotionEffect m_PotionEffect; [InvalidateProperties]
[SerializableField(0)]
private PotionEffect _potionEffect;
public BasePotion(int itemID, PotionEffect effect) : base(itemID) public BasePotion(int itemID, PotionEffect effect) : base(itemID)
{ {
m_PotionEffect = effect; _potionEffect = effect;
Stackable = Core.ML; Stackable = Core.ML;
Weight = 1.0; Weight = 1.0;
} }
public BasePotion(Serial serial) : base(serial) public override int LabelNumber => 1041314 + (int)_potionEffect;
{
}
public PotionEffect PotionEffect
{
get => m_PotionEffect;
set
{
m_PotionEffect = value;
InvalidateProperties();
}
}
public override int LabelNumber => 1041314 + (int)m_PotionEffect;
public virtual bool RequireFreeHand => true; public virtual bool RequireFreeHand => true;
@ -99,10 +89,6 @@ namespace Server.Items
{ {
var keg = kegs[i]; var keg = kegs[i];
// Should never happen
// if (keg == null)
// continue;
if (keg.Held is <= 0 or >= 100) if (keg.Held is <= 0 or >= 100)
{ {
continue; continue;
@ -151,10 +137,18 @@ namespace Server.Items
return; return;
} }
if (from.InRange(GetWorldLocation(), 1)) if (!from.InRange(GetWorldLocation(), 1))
{ {
if (!RequireFreeHand || HasFreeHand(from)) from.SendLocalizedMessage(502138); // That is too far away for you to use
return;
}
if (RequireFreeHand && !HasFreeHand(from))
{ {
from.SendLocalizedMessage(502172); // You must have a free hand to drink a potion.
return;
}
if (this is BaseExplosionPotion && Amount > 1) if (this is BaseExplosionPotion && Amount > 1)
{ {
var pot = GetType().CreateInstance<BaseExplosionPotion>(); var pot = GetType().CreateInstance<BaseExplosionPotion>();
@ -177,46 +171,10 @@ namespace Server.Items
Drink(from); Drink(from);
} }
} }
else
{
from.SendLocalizedMessage(502172); // You must have a free hand to drink a potion.
}
}
else
{
from.SendLocalizedMessage(502138); // That is too far away for you to use
}
}
public override void Serialize(IGenericWriter writer) private void Deserialize(IGenericReader reader, int version)
{ {
base.Serialize(writer); _potionEffect = (PotionEffect)reader.ReadInt();
writer.Write(1); // version
writer.Write((int)m_PotionEffect);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
switch (version)
{
case 1:
case 0:
{
m_PotionEffect = (PotionEffect)reader.ReadInt();
break;
}
}
if (version == 0)
{
Stackable = Core.ML;
}
} }
public abstract void Drink(Mobile from); public abstract void Drink(Mobile from);
@ -275,18 +233,9 @@ namespace Server.Items
return v * scalar; return v * scalar;
} }
public static int Scale(Mobile m, int v) public static int Scale(Mobile m, int v) => !Core.AOS ? v : AOS.Scale(v, 100 + EnhancePotions(m));
{
if (!Core.AOS)
{
return v;
}
return AOS.Scale(v, 100 + EnhancePotions(m));
}
public override bool StackWith(Mobile from, Item dropped, bool playSound) => public override bool StackWith(Mobile from, Item dropped, bool playSound) =>
dropped is BasePotion potion && potion.m_PotionEffect == m_PotionEffect && dropped is BasePotion potion && potion._potionEffect == _potionEffect &&
base.StackWith(from, potion, playSound); base.StackWith(from, potion, playSound);
} }
}

View file

@ -1,21 +1,19 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using ModernUO.Serialization;
using Server.Spells; using Server.Spells;
using Server.Targeting; using Server.Targeting;
namespace Server.Items namespace Server.Items;
{
public abstract class BaseConflagrationPotion : BasePotion [SerializationGenerator(0, false)]
public abstract partial class BaseConflagrationPotion : BasePotion
{ {
private static readonly Dictionary<Mobile, TimerExecutionToken> m_Delay = new(); private static readonly Dictionary<Mobile, TimerExecutionToken> m_Delay = new();
private readonly List<Mobile> m_Users = new(); private readonly List<Mobile> m_Users = new();
public BaseConflagrationPotion(PotionEffect effect) : base(0xF06, effect) => Hue = 0x489; public BaseConflagrationPotion(PotionEffect effect) : base(0xF06, effect) => Hue = 0x489;
public BaseConflagrationPotion(Serial serial) : base(serial)
{
}
public abstract int MinDamage { get; } public abstract int MinDamage { get; }
public abstract int MaxDamage { get; } public abstract int MaxDamage { get; }
@ -33,10 +31,8 @@ namespace Server.Items
if (delay > 0) if (delay > 0)
{ {
from.SendLocalizedMessage( // You cannot use that for another ~1_NUM~ ~2_TIMEUNITS~
1072529, from.SendLocalizedMessage(1072529, $"{delay}\t{(delay > 1 ? "seconds." : "second.")}");
$"{delay}\t{(delay > 1 ? "seconds." : "second.")}"
); // You cannot use that for another ~1_NUM~ ~2_TIMEUNITS~
return; return;
} }
@ -55,20 +51,6 @@ namespace Server.Items
from.Target = new ThrowTarget(this); from.Target = new ThrowTarget(this);
} }
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public virtual void Explode(Mobile from, Point3D loc, Map map) public virtual void Explode(Mobile from, Point3D loc, Map map)
{ {
if (Deleted || map == null) if (Deleted || map == null)
@ -174,12 +156,22 @@ namespace Server.Items
} }
} }
public class InternalItem : Item [SerializationGenerator(0, false)]
public partial class InternalItem : Item
{ {
private DateTime m_End; [SerializableField(0, setter: "private")]
private int m_MaxDamage; private Mobile _from;
private int m_MinDamage;
private Timer m_Timer; [SerializableField(1, getter: "private", setter: "private")]
private DateTime _end;
[SerializableField(2, getter: "private", setter: "private")]
private int _minDamage;
[SerializableField(3, getter: "private", setter: "private")]
private int _maxDamage;
private Timer _timer;
public InternalItem(Mobile from, Point3D loc, Map map, int min, int max) : base(0x398C) public InternalItem(Mobile from, Point3D loc, Map map, int min, int max) : base(0x398C)
{ {
@ -189,39 +181,34 @@ namespace Server.Items
MoveToWorld(loc, map); MoveToWorld(loc, map);
From = from; From = from;
m_End = Core.Now + TimeSpan.FromSeconds(10); _end = Core.Now + TimeSpan.FromSeconds(10);
SetDamage(min, max); SetDamage(min, max);
m_Timer = new InternalTimer(this, m_End); _timer = new InternalTimer(this, _end);
m_Timer.Start(); _timer.Start();
} }
public InternalItem(Serial serial) : base(serial)
{
}
public Mobile From { get; private set; }
public override bool BlocksFit => true; public override bool BlocksFit => true;
public override void OnAfterDelete() public override void OnAfterDelete()
{ {
base.OnAfterDelete(); base.OnAfterDelete();
m_Timer?.Stop(); _timer?.Stop();
} }
public int GetDamage() => Utility.RandomMinMax(m_MinDamage, m_MaxDamage); public int GetDamage() => Utility.RandomMinMax(_minDamage, _maxDamage);
private void SetDamage(int min, int max) private void SetDamage(int min, int max)
{ {
/* new way to apply alchemy bonus according to Stratics' calculator. /**
this gives a mean to values 25, 50, 75 and 100. Stratics' calculator is outdated. * new way to apply alchemy bonus according to Stratics' calculator.
Those goals will give 2 to alchemy bonus. It's not really OSI-like but it's an approximation. */ * this gives a mean to values 25, 50, 75 and 100. Stratics' calculator is outdated.
* Those goals will give 2 to alchemy bonus. It's not really OSI-like but it's an approximation.
m_MinDamage = min; */
m_MaxDamage = max; _minDamage = min;
_maxDamage = max;
if (From == null) if (From == null)
{ {
@ -231,35 +218,15 @@ namespace Server.Items
var alchemySkill = From.Skills.Alchemy.Fixed; var alchemySkill = From.Skills.Alchemy.Fixed;
var alchemyBonus = alchemySkill / 125 + alchemySkill / 250; var alchemyBonus = alchemySkill / 125 + alchemySkill / 250;
m_MinDamage = Scale(From, m_MinDamage + alchemyBonus); _minDamage = Scale(From, _minDamage + alchemyBonus);
m_MaxDamage = Scale(From, m_MaxDamage + alchemyBonus); _maxDamage = Scale(From, _maxDamage + alchemyBonus);
} }
public override void Serialize(IGenericWriter writer) [AfterDeserialization]
private void AfterDeserialization()
{ {
base.Serialize(writer); _timer = new InternalTimer(this, _end);
_timer.Start();
writer.Write(0); // version
writer.Write(From);
writer.Write(m_End);
writer.Write(m_MinDamage);
writer.Write(m_MaxDamage);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
From = reader.ReadEntity<Mobile>();
m_End = reader.ReadDateTime();
m_MinDamage = reader.ReadInt();
m_MaxDamage = reader.ReadInt();
m_Timer = new InternalTimer(this, m_End);
m_Timer.Start();
} }
public override bool OnMoveOver(Mobile m) public override bool OnMoveOver(Mobile m)
@ -278,44 +245,44 @@ namespace Server.Items
private class InternalTimer : Timer private class InternalTimer : Timer
{ {
private readonly DateTime m_End; private readonly DateTime _end;
private readonly InternalItem m_Item; private readonly InternalItem _item;
public InternalTimer(InternalItem item, DateTime end) : base(TimeSpan.Zero, TimeSpan.FromSeconds(1.0)) public InternalTimer(InternalItem item, DateTime end) : base(TimeSpan.Zero, TimeSpan.FromSeconds(1.0))
{ {
m_Item = item; _item = item;
m_End = end; _end = end;
} }
protected override void OnTick() protected override void OnTick()
{ {
if (m_Item.Deleted) if (_item.Deleted)
{ {
return; return;
} }
if (Core.Now > m_End) if (Core.Now > _end)
{ {
m_Item.Delete(); _item.Delete();
Stop(); Stop();
return; return;
} }
var from = m_Item.From; var from = _item.From;
if (m_Item.Map == null || from == null) if (_item.Map == null || from == null)
{ {
return; return;
} }
foreach (var m in m_Item.GetMobilesInRange(0)) foreach (var m in _item.GetMobilesInRange(0))
{ {
if (m.Z + 16 > m_Item.Z && m_Item.Z + 12 > m.Z && (!Core.AOS || m != from) && if (m.Z + 16 > _item.Z && _item.Z + 12 > m.Z && (!Core.AOS || m != from) &&
SpellHelper.ValidIndirectTarget(from, m) && from.CanBeHarmful(m, false)) SpellHelper.ValidIndirectTarget(from, m) && from.CanBeHarmful(m, false))
{ {
from.DoHarmful(m); from.DoHarmful(m);
AOS.Damage(m, from, m_Item.GetDamage(), 0, 100, 0, 0, 0); AOS.Damage(m, from, _item.GetDamage(), 0, 100, 0, 0, 0);
m.PlaySound(0x208); m.PlaySound(0x208);
} }
} }
@ -323,4 +290,3 @@ namespace Server.Items
} }
} }
} }
}

View file

@ -1,33 +1,17 @@
namespace Server.Items using ModernUO.Serialization;
{
public class ConflagrationPotion : BaseConflagrationPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class ConflagrationPotion : BaseConflagrationPotion
{ {
[Constructible] [Constructible]
public ConflagrationPotion() : base(PotionEffect.Conflagration) public ConflagrationPotion() : base(PotionEffect.Conflagration)
{ {
} }
public ConflagrationPotion(Serial serial) : base(serial)
{
}
public override int MinDamage => 2; public override int MinDamage => 2;
public override int MaxDamage => 4; public override int MaxDamage => 4;
public override int LabelNumber => 1072095; // a Conflagration potion public override int LabelNumber => 1072095; // a Conflagration potion
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,33 +1,17 @@
namespace Server.Items using ModernUO.Serialization;
{
public class GreaterConflagrationPotion : BaseConflagrationPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class GreaterConflagrationPotion : BaseConflagrationPotion
{ {
[Constructible] [Constructible]
public GreaterConflagrationPotion() : base(PotionEffect.ConflagrationGreater) public GreaterConflagrationPotion() : base(PotionEffect.ConflagrationGreater)
{ {
} }
public GreaterConflagrationPotion(Serial serial) : base(serial)
{
}
public override int MinDamage => 4; public override int MinDamage => 4;
public override int MaxDamage => 8; public override int MaxDamage => 8;
public override int LabelNumber => 1072098; // a Greater Conflagration potion public override int LabelNumber => 1072098; // a Greater Conflagration potion
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,23 +1,21 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using ModernUO.Serialization;
using Server.Misc; using Server.Misc;
using Server.Mobiles; using Server.Mobiles;
using Server.Spells; using Server.Spells;
using Server.Targeting; using Server.Targeting;
namespace Server.Items namespace Server.Items;
[SerializationGenerator(0, false)]
public abstract partial class BaseConfusionBlastPotion : BasePotion
{ {
public abstract class BaseConfusionBlastPotion : BasePotion private static readonly Dictionary<Mobile, TimerExecutionToken> _delay = new();
{ private HashSet<Mobile> _users;
private static readonly Dictionary<Mobile, TimerExecutionToken> m_Delay = new();
private readonly List<Mobile> m_Users = new();
public BaseConfusionBlastPotion(PotionEffect effect) : base(0xF06, effect) => Hue = 0x48D; public BaseConfusionBlastPotion(PotionEffect effect) : base(0xF06, effect) => Hue = 0x48D;
public BaseConfusionBlastPotion(Serial serial) : base(serial)
{
}
public abstract int Radius { get; } public abstract int Radius { get; }
public override bool RequireFreeHand => false; public override bool RequireFreeHand => false;
@ -34,10 +32,8 @@ namespace Server.Items
if (delay > 0) if (delay > 0)
{ {
from.SendLocalizedMessage( // You cannot use that for another ~1_NUM~ ~2_TIMEUNITS~
1072529, from.SendLocalizedMessage(1072529, $"{delay}\t{(delay > 1 ? "seconds." : "second.")}");
$"{delay}\t{(delay > 1 ? "seconds." : "second.")}"
); // You cannot use that for another ~1_NUM~ ~2_TIMEUNITS~
return; return;
} }
@ -48,28 +44,12 @@ namespace Server.Items
from.RevealingAction(); from.RevealingAction();
if (!m_Users.Contains(from)) _users ??= new HashSet<Mobile>();
{ _users.Add(from);
m_Users.Add(from);
}
from.Target = new ThrowTarget(this); from.Target = new ThrowTarget(this);
} }
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public virtual void Explode(Mobile from, Point3D loc, Map map) public virtual void Explode(Mobile from, Point3D loc, Map map)
{ {
if (Deleted || map == null) if (Deleted || map == null)
@ -79,15 +59,20 @@ namespace Server.Items
Consume(); Consume();
// Check if any other players are using this potion if (_users != null)
for (var i = 0; i < m_Users.Count; i++)
{ {
if (m_Users[i].Target is ThrowTarget targ && targ.Potion == this) // Check if any other players are using this potion
foreach (var user in _users)
{
if ((user.Target as ThrowTarget)?.Potion == this)
{ {
Target.Cancel(from); Target.Cancel(from);
} }
} }
_users.Clear();
}
// Effects // Effects
Effects.PlaySound(loc, map, 0x207); Effects.PlaySound(loc, map, 0x207);
@ -124,16 +109,16 @@ namespace Server.Items
public static void AddDelay(Mobile m) public static void AddDelay(Mobile m)
{ {
m_Delay.TryGetValue(m, out var timer); _delay.TryGetValue(m, out var timer);
timer.Cancel(); timer.Cancel();
Timer.StartTimer(TimeSpan.FromSeconds(60), () => EndDelay(m), out timer); Timer.StartTimer(TimeSpan.FromSeconds(60), () => EndDelay(m), out timer);
m_Delay[m] = timer; _delay[m] = timer;
} }
public static int GetDelay(Mobile m) public static int GetDelay(Mobile m)
{ {
if (m_Delay.TryGetValue(m, out var timer) && timer.Next > Core.Now) if (_delay.TryGetValue(m, out var timer) && timer.Next > Core.Now)
{ {
return (int)(timer.Next - Core.Now).TotalSeconds; return (int)(timer.Next - Core.Now).TotalSeconds;
} }
@ -143,7 +128,7 @@ namespace Server.Items
public static void EndDelay(Mobile m) public static void EndDelay(Mobile m)
{ {
if (m_Delay.Remove(m, out var timer)) if (_delay.Remove(m, out var timer))
{ {
timer.Cancel(); timer.Cancel();
} }
@ -192,4 +177,3 @@ namespace Server.Items
} }
} }
} }
}

View file

@ -1,32 +1,16 @@
namespace Server.Items using ModernUO.Serialization;
{
public class ConfusionBlastPotion : BaseConfusionBlastPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class ConfusionBlastPotion : BaseConfusionBlastPotion
{ {
[Constructible] [Constructible]
public ConfusionBlastPotion() : base(PotionEffect.ConfusionBlast) public ConfusionBlastPotion() : base(PotionEffect.ConfusionBlast)
{ {
} }
public ConfusionBlastPotion(Serial serial) : base(serial)
{
}
public override int Radius => 5; public override int Radius => 5;
public override int LabelNumber => 1072105; // a Confusion Blast potion public override int LabelNumber => 1072105; // a Confusion Blast potion
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,32 +1,16 @@
namespace Server.Items using ModernUO.Serialization;
{
public class GreaterConfusionBlastPotion : BaseConfusionBlastPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class GreaterConfusionBlastPotion : BaseConfusionBlastPotion
{ {
[Constructible] [Constructible]
public GreaterConfusionBlastPotion() : base(PotionEffect.ConfusionBlastGreater) public GreaterConfusionBlastPotion() : base(PotionEffect.ConfusionBlastGreater)
{ {
} }
public GreaterConfusionBlastPotion(Serial serial) : base(serial)
{
}
public override int Radius => 7; public override int Radius => 7;
public override int LabelNumber => 1072108; // a Greater Confusion Blast potion public override int LabelNumber => 1072108; // a Greater Confusion Blast potion
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,9 +1,10 @@
using ModernUO.Serialization;
using Server.Engines.ConPVP; using Server.Engines.ConPVP;
using Server.Spells; using Server.Spells;
using Server.Spells.Necromancy; using Server.Spells.Necromancy;
namespace Server.Items namespace Server.Items;
{
public class CureLevelInfo public class CureLevelInfo
{ {
public CureLevelInfo(Poison poison, double chance) public CureLevelInfo(Poison poison, double chance)
@ -17,32 +18,15 @@ namespace Server.Items
public double Chance { get; } public double Chance { get; }
} }
public abstract class BaseCurePotion : BasePotion [SerializationGenerator(0, false)]
public abstract partial class BaseCurePotion : BasePotion
{ {
public BaseCurePotion(PotionEffect effect) : base(0xF07, effect) public BaseCurePotion(PotionEffect effect) : base(0xF07, effect)
{ {
} }
public BaseCurePotion(Serial serial) : base(serial)
{
}
public abstract CureLevelInfo[] LevelInfo { get; } public abstract CureLevelInfo[] LevelInfo { get; }
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public void DoCure(Mobile from) public void DoCure(Mobile from)
{ {
var cure = false; var cure = false;
@ -99,4 +83,3 @@ namespace Server.Items
} }
} }
} }
}

View file

@ -1,8 +1,11 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class CurePotion : BaseCurePotion
{ {
public class CurePotion : BaseCurePotion private static readonly CureLevelInfo[] _oldLevelInfo =
{
private static readonly CureLevelInfo[] m_OldLevelInfo =
{ {
new(Poison.Lesser, 1.00), // 100% chance to cure lesser poison new(Poison.Lesser, 1.00), // 100% chance to cure lesser poison
new(Poison.Regular, 0.75), // 75% chance to cure regular poison new(Poison.Regular, 0.75), // 75% chance to cure regular poison
@ -10,7 +13,7 @@ namespace Server.Items
new(Poison.Deadly, 0.15) // 15% chance to cure deadly poison new(Poison.Deadly, 0.15) // 15% chance to cure deadly poison
}; };
private static readonly CureLevelInfo[] m_AosLevelInfo = private static readonly CureLevelInfo[] _aosLevelInfo =
{ {
new(Poison.Lesser, 1.00), new(Poison.Lesser, 1.00),
new(Poison.Regular, 0.95), new(Poison.Regular, 0.95),
@ -24,24 +27,5 @@ namespace Server.Items
{ {
} }
public CurePotion(Serial serial) : base(serial) public override CureLevelInfo[] LevelInfo => Core.AOS ? _aosLevelInfo : _oldLevelInfo;
{
}
public override CureLevelInfo[] LevelInfo => Core.AOS ? m_AosLevelInfo : m_OldLevelInfo;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,5 +1,5 @@
namespace Server.Items namespace Server.Items;
{
public class GreaterCurePotion : BaseCurePotion public class GreaterCurePotion : BaseCurePotion
{ {
private static readonly CureLevelInfo[] m_OldLevelInfo = private static readonly CureLevelInfo[] m_OldLevelInfo =
@ -45,4 +45,3 @@ namespace Server.Items
var version = reader.ReadInt(); var version = reader.ReadInt();
} }
} }
}

View file

@ -1,15 +1,18 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class LesserCurePotion : BaseCurePotion
{ {
public class LesserCurePotion : BaseCurePotion private static readonly CureLevelInfo[] _oldLevelInfo =
{
private static readonly CureLevelInfo[] m_OldLevelInfo =
{ {
new(Poison.Lesser, 0.75), // 75% chance to cure lesser poison new(Poison.Lesser, 0.75), // 75% chance to cure lesser poison
new(Poison.Regular, 0.50), // 50% chance to cure regular poison new(Poison.Regular, 0.50), // 50% chance to cure regular poison
new(Poison.Greater, 0.15) // 15% chance to cure greater poison new(Poison.Greater, 0.15) // 15% chance to cure greater poison
}; };
private static readonly CureLevelInfo[] m_AosLevelInfo = private static readonly CureLevelInfo[] _aosLevelInfo =
{ {
new(Poison.Lesser, 0.75), new(Poison.Lesser, 0.75),
new(Poison.Regular, 0.50), new(Poison.Regular, 0.50),
@ -21,24 +24,5 @@ namespace Server.Items
{ {
} }
public LesserCurePotion(Serial serial) : base(serial) public override CureLevelInfo[] LevelInfo => Core.AOS ? _aosLevelInfo : _oldLevelInfo;
{
}
public override CureLevelInfo[] LevelInfo => Core.AOS ? m_AosLevelInfo : m_OldLevelInfo;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,33 +0,0 @@
namespace Server.Items
{
public class DarkglowPotion : BasePoisonPotion
{
[Constructible]
public DarkglowPotion() : base(PotionEffect.Darkglow) => Hue = 0x96;
public DarkglowPotion(Serial serial) : base(serial)
{
}
public override Poison Poison => Poison.Greater; /* MUST be restored when prerequisites are done */
public override double MinPoisoningSkill => 95.0;
public override double MaxPoisoningSkill => 100.0;
public override int LabelNumber => 1072849; // Darkglow Poison
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
}

View file

@ -1,13 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using ModernUO.Serialization;
using Server.Collections; using Server.Collections;
using Server.Network;
using Server.Spells; using Server.Spells;
using Server.Targeting; using Server.Targeting;
namespace Server.Items namespace Server.Items;
{
public abstract class BaseExplosionPotion : BasePotion [SerializationGenerator(0, false)]
public abstract partial class BaseExplosionPotion : BasePotion
{ {
private const int ExplosionRange = 2; // How long is the blast radius? private const int ExplosionRange = 2; // How long is the blast radius?
@ -21,10 +22,6 @@ namespace Server.Items
{ {
} }
public BaseExplosionPotion(Serial serial) : base(serial)
{
}
public abstract int MinDamage { get; } public abstract int MinDamage { get; }
public abstract int MaxDamage { get; } public abstract int MaxDamage { get; }
@ -32,20 +29,6 @@ namespace Server.Items
private HashSet<Mobile> _users; private HashSet<Mobile> _users;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public virtual IEntity FindParent(Mobile from) public virtual IEntity FindParent(Mobile from)
{ {
if (HeldBy?.Holding == this) if (HeldBy?.Holding == this)
@ -132,15 +115,18 @@ namespace Server.Items
Consume(); Consume();
if (_users != null)
{
foreach (var user in _users) foreach (var user in _users)
{ {
if (user.Target is ThrowTarget targ && targ.Potion == this) if ((user.Target as ThrowTarget)?.Potion == this)
{ {
Target.Cancel(user); Target.Cancel(user);
} }
} }
_users.Clear(); _users.Clear();
}
if (map == null) if (map == null)
{ {
@ -335,4 +321,3 @@ namespace Server.Items
} }
} }
} }
}

View file

@ -1,31 +1,15 @@
namespace Server.Items using ModernUO.Serialization;
{
public class ExplosionPotion : BaseExplosionPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class ExplosionPotion : BaseExplosionPotion
{ {
[Constructible] [Constructible]
public ExplosionPotion() : base(PotionEffect.Explosion) public ExplosionPotion() : base(PotionEffect.Explosion)
{ {
} }
public ExplosionPotion(Serial serial) : base(serial)
{
}
public override int MinDamage => 10; public override int MinDamage => 10;
public override int MaxDamage => 20; public override int MaxDamage => 20;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,31 +1,15 @@
namespace Server.Items using ModernUO.Serialization;
{
public class GreaterExplosionPotion : BaseExplosionPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class GreaterExplosionPotion : BaseExplosionPotion
{ {
[Constructible] [Constructible]
public GreaterExplosionPotion() : base(PotionEffect.ExplosionGreater) public GreaterExplosionPotion() : base(PotionEffect.ExplosionGreater)
{ {
} }
public GreaterExplosionPotion(Serial serial) : base(serial)
{
}
public override int MinDamage => Core.AOS ? 20 : 15; public override int MinDamage => Core.AOS ? 20 : 15;
public override int MaxDamage => Core.AOS ? 40 : 30; public override int MaxDamage => Core.AOS ? 40 : 30;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,31 +1,15 @@
namespace Server.Items using ModernUO.Serialization;
{
public class LesserExplosionPotion : BaseExplosionPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class LesserExplosionPotion : BaseExplosionPotion
{ {
[Constructible] [Constructible]
public LesserExplosionPotion() : base(PotionEffect.ExplosionLesser) public LesserExplosionPotion() : base(PotionEffect.ExplosionLesser)
{ {
} }
public LesserExplosionPotion(Serial serial) : base(serial)
{
}
public override int MinDamage => 5; public override int MinDamage => 5;
public override int MaxDamage => 10; public override int MaxDamage => 10;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,37 +1,20 @@
using System; using System;
using ModernUO.Serialization;
using Server.Engines.ConPVP; using Server.Engines.ConPVP;
using Server.Network;
namespace Server.Items namespace Server.Items;
{
public abstract class BaseHealPotion : BasePotion [SerializationGenerator(0, false)]
public abstract partial class BaseHealPotion : BasePotion
{ {
public BaseHealPotion(PotionEffect effect) : base(0xF0C, effect) public BaseHealPotion(PotionEffect effect) : base(0xF0C, effect)
{ {
} }
public BaseHealPotion(Serial serial) : base(serial)
{
}
public abstract int MinHeal { get; } public abstract int MinHeal { get; }
public abstract int MaxHeal { get; } public abstract int MaxHeal { get; }
public abstract double Delay { get; } public abstract double Delay { get; }
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public void DoHeal(Mobile from) public void DoHeal(Mobile from)
{ {
var min = Scale(from, MinHeal); var min = Scale(from, MinHeal);
@ -42,17 +25,27 @@ namespace Server.Items
public override void Drink(Mobile from) public override void Drink(Mobile from)
{ {
if (from.Hits < from.HitsMax) if (from.Hits >= from.HitsMax)
{ {
// You decide against drinking this potion, as you are already at full health.
from.SendLocalizedMessage(1049547);
return;
}
if (from.Poisoned || MortalStrike.IsWounded(from)) if (from.Poisoned || MortalStrike.IsWounded(from))
{ {
// You can not heal yourself in your current state. // You can not heal yourself in your current state.
from.LocalOverheadMessage(MessageType.Regular, 0x22, 1005000); from.LocalOverheadMessage(MessageType.Regular, 0x22, 1005000);
return;
} }
else
{ if (!from.BeginAction<BaseHealPotion>())
if (from.BeginAction<BaseHealPotion>())
{ {
// You must wait 10 seconds before using another healing potion.
from.LocalOverheadMessage(MessageType.Regular, 0x22, 500235);
return;
}
DoHeal(from); DoHeal(from);
PlayDrinkEffect(from); PlayDrinkEffect(from);
@ -64,18 +57,4 @@ namespace Server.Items
Timer.StartTimer(TimeSpan.FromSeconds(Delay), from.EndAction<BaseHealPotion>); Timer.StartTimer(TimeSpan.FromSeconds(Delay), from.EndAction<BaseHealPotion>);
} }
else
{
// You must wait 10 seconds before using another healing potion.
from.LocalOverheadMessage(MessageType.Regular, 0x22, 500235);
}
}
}
else
{
// You decide against drinking this potion, as you are already at full health.
from.SendLocalizedMessage(1049547);
}
}
}
} }

View file

@ -1,32 +1,16 @@
namespace Server.Items using ModernUO.Serialization;
{
public class GreaterHealPotion : BaseHealPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class GreaterHealPotion : BaseHealPotion
{ {
[Constructible] [Constructible]
public GreaterHealPotion() : base(PotionEffect.HealGreater) public GreaterHealPotion() : base(PotionEffect.HealGreater)
{ {
} }
public GreaterHealPotion(Serial serial) : base(serial)
{
}
public override int MinHeal => Core.AOS ? 20 : 9; public override int MinHeal => Core.AOS ? 20 : 9;
public override int MaxHeal => Core.AOS ? 25 : 30; public override int MaxHeal => Core.AOS ? 25 : 30;
public override double Delay => 10.0; public override double Delay => 10.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,32 +1,16 @@
namespace Server.Items using ModernUO.Serialization;
{
public class HealPotion : BaseHealPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class HealPotion : BaseHealPotion
{ {
[Constructible] [Constructible]
public HealPotion() : base(PotionEffect.Heal) public HealPotion() : base(PotionEffect.Heal)
{ {
} }
public HealPotion(Serial serial) : base(serial)
{
}
public override int MinHeal => Core.AOS ? 13 : 6; public override int MinHeal => Core.AOS ? 13 : 6;
public override int MaxHeal => Core.AOS ? 16 : 20; public override int MaxHeal => Core.AOS ? 16 : 20;
public override double Delay => Core.AOS ? 8.0 : 10.0; public override double Delay => Core.AOS ? 8.0 : 10.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,32 +1,16 @@
namespace Server.Items using ModernUO.Serialization;
{
public class LesserHealPotion : BaseHealPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class LesserHealPotion : BaseHealPotion
{ {
[Constructible] [Constructible]
public LesserHealPotion() : base(PotionEffect.HealLesser) public LesserHealPotion() : base(PotionEffect.HealLesser)
{ {
} }
public LesserHealPotion(Serial serial) : base(serial)
{
}
public override int MinHeal => Core.AOS ? 6 : 3; public override int MinHeal => Core.AOS ? 6 : 3;
public override int MaxHeal => Core.AOS ? 8 : 10; public override int MaxHeal => Core.AOS ? 8 : 10;
public override double Delay => Core.AOS ? 3.0 : 10.0; public override double Delay => Core.AOS ? 3.0 : 10.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,19 +1,17 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using ModernUO.Serialization;
namespace Server.Items namespace Server.Items;
{
public class InvisibilityPotion : BasePotion [SerializationGenerator(0, false)]
public partial class InvisibilityPotion : BasePotion
{ {
private static readonly Dictionary<Mobile, TimerExecutionToken> m_Table = new(); private static readonly Dictionary<Mobile, TimerExecutionToken> m_Table = new();
[Constructible] [Constructible]
public InvisibilityPotion() : base(0xF0A, PotionEffect.Invisibility) => Hue = 0x48D; public InvisibilityPotion() : base(0xF0A, PotionEffect.Invisibility) => Hue = 0x48D;
public InvisibilityPotion(Serial serial) : base(serial)
{
}
public override int LabelNumber => 1072941; // Potion of Invisibility public override int LabelNumber => 1072941; // Potion of Invisibility
public override void Drink(Mobile from) public override void Drink(Mobile from)
@ -45,6 +43,7 @@ namespace Server.Items
15, 15,
5045 5045
); );
m.PlaySound(0x3C4); m.PlaySound(0x3C4);
m.Hidden = true; m.Hidden = true;
@ -77,19 +76,4 @@ namespace Server.Items
timer.Cancel(); timer.Cancel();
} }
} }
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,32 +1,16 @@
using ModernUO.Serialization;
using Server.Engines.ConPVP; using Server.Engines.ConPVP;
namespace Server.Items namespace Server.Items;
{
public class NightSightPotion : BasePotion [SerializationGenerator(0, false)]
public partial class NightSightPotion : BasePotion
{ {
[Constructible] [Constructible]
public NightSightPotion() : base(0xF06, PotionEffect.Nightsight) public NightSightPotion() : base(0xF06, PotionEffect.Nightsight)
{ {
} }
public NightSightPotion(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public override void Drink(Mobile from) public override void Drink(Mobile from)
{ {
if (from.BeginAction<LightCycle>()) if (from.BeginAction<LightCycle>())
@ -50,4 +34,3 @@ namespace Server.Items
} }
} }
} }
}

View file

@ -1,34 +0,0 @@
namespace Server.Items
{
public class ParasiticPotion : BasePoisonPotion
{
[Constructible]
public ParasiticPotion() : base(PotionEffect.Parasitic) => Hue = 0x17C;
public ParasiticPotion(Serial serial) : base(serial)
{
}
/* public override Poison Poison => Poison.Darkglow; MUST be restored when prerequisites are done */
public override Poison Poison => Poison.Greater;
public override double MinPoisoningSkill => 95.0;
public override double MaxPoisoningSkill => 100.0;
public override int LabelNumber => 1072848; // Parasitic Poison
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
}

View file

@ -1,8 +1,10 @@
using ModernUO.Serialization;
using Server.Engines.ConPVP; using Server.Engines.ConPVP;
namespace Server.Items namespace Server.Items;
{
public abstract class BasePoisonPotion : BasePotion [SerializationGenerator(0, false)]
public abstract partial class BasePoisonPotion : BasePotion
{ {
public BasePoisonPotion(PotionEffect effect) : base(0xF0A, effect) public BasePoisonPotion(PotionEffect effect) : base(0xF0A, effect)
{ {
@ -17,20 +19,6 @@ namespace Server.Items
public abstract double MinPoisoningSkill { get; } public abstract double MinPoisoningSkill { get; }
public abstract double MaxPoisoningSkill { get; } public abstract double MaxPoisoningSkill { get; }
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public void DoPoison(Mobile from) public void DoPoison(Mobile from)
{ {
from.ApplyPoison(from, Poison); from.ApplyPoison(from, Poison);
@ -48,4 +36,3 @@ namespace Server.Items
} }
} }
} }
}

View file

@ -0,0 +1,18 @@
using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class DarkglowPotion : BasePoisonPotion
{
[Constructible]
public DarkglowPotion() : base(PotionEffect.Darkglow) => Hue = 0x96;
/* public override Poison Poison => Poison.DarkGlow; // MUST be restored when prerequisites are done */
public override Poison Poison => Poison.Greater;
public override double MinPoisoningSkill => 95.0;
public override double MaxPoisoningSkill => 100.0;
public override int LabelNumber => 1072849; // Darkglow Poison
}

View file

@ -1,33 +1,17 @@
namespace Server.Items using ModernUO.Serialization;
{
public class DeadlyPoisonPotion : BasePoisonPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class DeadlyPoisonPotion : BasePoisonPotion
{ {
[Constructible] [Constructible]
public DeadlyPoisonPotion() : base(PotionEffect.PoisonDeadly) public DeadlyPoisonPotion() : base(PotionEffect.PoisonDeadly)
{ {
} }
public DeadlyPoisonPotion(Serial serial) : base(serial)
{
}
public override Poison Poison => Poison.Deadly; public override Poison Poison => Poison.Deadly;
public override double MinPoisoningSkill => 95.0; public override double MinPoisoningSkill => 95.0;
public override double MaxPoisoningSkill => 100.0; public override double MaxPoisoningSkill => 100.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,33 +1,17 @@
namespace Server.Items using ModernUO.Serialization;
{
public class GreaterPoisonPotion : BasePoisonPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class GreaterPoisonPotion : BasePoisonPotion
{ {
[Constructible] [Constructible]
public GreaterPoisonPotion() : base(PotionEffect.PoisonGreater) public GreaterPoisonPotion() : base(PotionEffect.PoisonGreater)
{ {
} }
public GreaterPoisonPotion(Serial serial) : base(serial)
{
}
public override Poison Poison => Poison.Greater; public override Poison Poison => Poison.Greater;
public override double MinPoisoningSkill => 60.0; public override double MinPoisoningSkill => 60.0;
public override double MaxPoisoningSkill => 100.0; public override double MaxPoisoningSkill => 100.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,33 +1,17 @@
namespace Server.Items using ModernUO.Serialization;
{
public class LesserPoisonPotion : BasePoisonPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class LesserPoisonPotion : BasePoisonPotion
{ {
[Constructible] [Constructible]
public LesserPoisonPotion() : base(PotionEffect.PoisonLesser) public LesserPoisonPotion() : base(PotionEffect.PoisonLesser)
{ {
} }
public LesserPoisonPotion(Serial serial) : base(serial)
{
}
public override Poison Poison => Poison.Lesser; public override Poison Poison => Poison.Lesser;
public override double MinPoisoningSkill => 0.0; public override double MinPoisoningSkill => 0.0;
public override double MaxPoisoningSkill => 60.0; public override double MaxPoisoningSkill => 60.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -0,0 +1,16 @@
using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class ParasiticPotion : BasePoisonPotion
{
[Constructible]
public ParasiticPotion() : base(PotionEffect.Parasitic) => Hue = 0x17C;
/* public override Poison Poison => Poison.Parasitic; // MUST be restored when prerequisites are done */
public override Poison Poison => Poison.Greater;
public override double MinPoisoningSkill => 95.0;
public override double MaxPoisoningSkill => 100.0;
}

View file

@ -1,33 +1,17 @@
namespace Server.Items using ModernUO.Serialization;
{
public class PoisonPotion : BasePoisonPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class PoisonPotion : BasePoisonPotion
{ {
[Constructible] [Constructible]
public PoisonPotion() : base(PotionEffect.Poison) public PoisonPotion() : base(PotionEffect.Poison)
{ {
} }
public PoisonPotion(Serial serial) : base(serial)
{
}
public override Poison Poison => Poison.Regular; public override Poison Poison => Poison.Regular;
public override double MinPoisoningSkill => 30.0; public override double MinPoisoningSkill => 30.0;
public override double MaxPoisoningSkill => 70.0; public override double MaxPoisoningSkill => 70.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,33 +1,17 @@
using ModernUO.Serialization;
using Server.Engines.ConPVP; using Server.Engines.ConPVP;
namespace Server.Items namespace Server.Items;
{
public abstract class BaseRefreshPotion : BasePotion [SerializationGenerator(0, false)]
public abstract partial class BaseRefreshPotion : BasePotion
{ {
public BaseRefreshPotion(PotionEffect effect) : base(0xF0B, effect) public BaseRefreshPotion(PotionEffect effect) : base(0xF0B, effect)
{ {
} }
public BaseRefreshPotion(Serial serial) : base(serial)
{
}
public abstract double Refresh { get; } public abstract double Refresh { get; }
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public override void Drink(Mobile from) public override void Drink(Mobile from)
{ {
if (from.Stam < from.StamMax) if (from.Stam < from.StamMax)
@ -47,4 +31,3 @@ namespace Server.Items
} }
} }
} }
}

View file

@ -1,30 +1,14 @@
namespace Server.Items using ModernUO.Serialization;
{
public class RefreshPotion : BaseRefreshPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class RefreshPotion : BaseRefreshPotion
{ {
[Constructible] [Constructible]
public RefreshPotion() : base(PotionEffect.Refresh) public RefreshPotion() : base(PotionEffect.Refresh)
{ {
} }
public RefreshPotion(Serial serial) : base(serial)
{
}
public override double Refresh => 0.25; public override double Refresh => 0.25;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,30 +1,14 @@
namespace Server.Items using ModernUO.Serialization;
{
public class TotalRefreshPotion : BaseRefreshPotion namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class TotalRefreshPotion : BaseRefreshPotion
{ {
[Constructible] [Constructible]
public TotalRefreshPotion() : base(PotionEffect.RefreshTotal) public TotalRefreshPotion() : base(PotionEffect.RefreshTotal)
{ {
} }
public TotalRefreshPotion(Serial serial) : base(serial)
{
}
public override double Refresh => 1.0; public override double Refresh => 1.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,36 +1,20 @@
using System; using System;
using ModernUO.Serialization;
using Server.Engines.ConPVP; using Server.Engines.ConPVP;
using Server.Spells; using Server.Spells;
namespace Server.Items namespace Server.Items;
{
public abstract class BaseStrengthPotion : BasePotion [SerializationGenerator(0, false)]
public abstract partial class BaseStrengthPotion : BasePotion
{ {
public BaseStrengthPotion(PotionEffect effect) : base(0xF09, effect) public BaseStrengthPotion(PotionEffect effect) : base(0xF09, effect)
{ {
} }
public BaseStrengthPotion(Serial serial) : base(serial)
{
}
public abstract int StrOffset { get; } public abstract int StrOffset { get; }
public abstract TimeSpan Duration { get; } public abstract TimeSpan Duration { get; }
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public bool DoStrength(Mobile from) public bool DoStrength(Mobile from)
{ {
// TODO: Verify scaled; is it offset, duration, or both? // TODO: Verify scaled; is it offset, duration, or both?
@ -58,4 +42,3 @@ namespace Server.Items
} }
} }
} }
}

View file

@ -1,33 +1,16 @@
using System; using System;
using ModernUO.Serialization;
namespace Server.Items namespace Server.Items;
{
public class GreaterStrengthPotion : BaseStrengthPotion [SerializationGenerator(0, false)]
public partial class GreaterStrengthPotion : BaseStrengthPotion
{ {
[Constructible] [Constructible]
public GreaterStrengthPotion() : base(PotionEffect.StrengthGreater) public GreaterStrengthPotion() : base(PotionEffect.StrengthGreater)
{ {
} }
public GreaterStrengthPotion(Serial serial) : base(serial)
{
}
public override int StrOffset => 20; public override int StrOffset => 20;
public override TimeSpan Duration => TimeSpan.FromMinutes(2.0); public override TimeSpan Duration => TimeSpan.FromMinutes(2.0);
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,8 +1,10 @@
using System; using System;
using ModernUO.Serialization;
namespace Server.Items namespace Server.Items;
{
public class StrengthPotion : BaseStrengthPotion [SerializationGenerator(0, false)]
public partial class StrengthPotion : BaseStrengthPotion
{ {
[Constructible] [Constructible]
public StrengthPotion() : base(PotionEffect.Strength) public StrengthPotion() : base(PotionEffect.Strength)
@ -15,19 +17,4 @@ namespace Server.Items
public override int StrOffset => 10; public override int StrOffset => 10;
public override TimeSpan Duration => TimeSpan.FromMinutes(2.0); public override TimeSpan Duration => TimeSpan.FromMinutes(2.0);
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.AgilityPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BaseAgilityPotion"
}

View file

@ -0,0 +1,35 @@
{
"version": 0,
"type": "Server.Items.BaseConflagrationPotion.InternalItem",
"properties": [
{
"name": "From",
"type": "Server.Mobile",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "End",
"type": "System.DateTime",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "MinDamage",
"type": "int",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "MaxDamage",
"type": "int",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
}
]
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BaseConflagrationPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BaseConfusionBlastPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BaseCurePotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BaseExplosionPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BaseHealPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BasePoisonPotion"
}

View file

@ -0,0 +1,11 @@
{
"version": 2,
"type": "Server.Items.BasePotion",
"properties": [
{
"name": "PotionEffect",
"type": "Server.Items.PotionEffect",
"rule": "EnumMigrationRule"
}
]
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BaseRefreshPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BaseStrengthPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.ConflagrationPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.ConfusionBlastPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.CurePotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.DarkglowPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.DeadlyPoisonPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.ExplosionPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GreaterAgilityPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GreaterConflagrationPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GreaterConfusionBlastPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GreaterExplosionPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GreaterHealPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GreaterPoisonPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GreaterStrengthPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.HealPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.InvisibilityPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.LesserCurePotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.LesserExplosionPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.LesserHealPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.LesserPoisonPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.NightSightPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.ParasiticPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.PoisonPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.RefreshPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.StrengthPotion"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.TotalRefreshPotion"
}