Hi,
I created this custom potion, which is basically a drug for the players. It gives a high str+dex bonus and I would like it to also give a penalty once the bonus wears off (-30 on both str and dex, for example). The penalty would have to last for a few minutes.
I was thinking on using a Timer.DelayCall, but cannot figure out how to do it.

As always, any help will be much appreciated.

C#:
using System;

namespace Server.Items
{
    public abstract class BaseDrugPotion: BasePotion
    {
        public BaseDrugPotion(PotionEffect effect)
            : base(0xF09, effect)
        {
            Hue = 1459;
        }

        public BaseDrugPotion(Serial serial)
            : base(serial)
        {
        }

        public abstract int StrOffset { get; }
        public abstract int DexOffset { get; }
        public abstract TimeSpan Duration { get; }
        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 bool DoStrength(Mobile from)
        {
            // TODO: Verify scaled; is it offset, duration, or both?
            int scale = Scale(from, this.StrOffset);
            int scale2 = Scale(from, this.DexOffset);
            if (Spells.SpellHelper.AddStatOffset(from, StatType.Str, scale, this.Duration) && Spells.SpellHelper.AddStatOffset(from, StatType.Dex, scale2, this.Duration))
            {
                from.FixedEffect(0x375A, 10, 15);
                from.PlaySound(0x1E7);

                BuffInfo.AddBuff(from, new BuffInfo(BuffIcon.Strength, 1075845, this.Duration, from, scale.ToString()));
                BuffInfo.AddBuff(from, new BuffInfo(BuffIcon.Agility, 1075841, this.Duration, from, scale.ToString()));


                return true;
            }

            from.SendLocalizedMessage(502173); // You are already under a similar effect.
            return false;
        }

        public override void Drink(Mobile from)
        {
            if (this.DoStrength(from))
            {
                BasePotion.PlayDrinkEffect(from);

                if (!Engines.ConPVP.DuelContext.IsFreeConsume(from))
                    this.Consume();
            }
        }
    }
}
 
This seems to be working:

C#:
                     Timer.DelayCall(TimeSpan.FromSeconds(10), delegate { from.AddStatMod(new StatMod(StatType.Str, "RockandRoll", -10, TimeSpan.FromMinutes(5.0))); });
 
Back