protected void Buff(Creature creature, Item item, int timeout, double str = 0, double int_ = 0, double dex = 0, double will = 0, double luck = 0, double life = 0, double mana = 0, double stamina = 0, double lifeRecovery = 0, double manaRecovery = 0, double staminaRecovery = 0, double injuryRecovery = 0, int defense = 0, int protection = 0)
{
var statModSource = StatModSource.TmpFood;
var statModIdent = 0;
var regenGroup = "TmpFoodRegen";
// Prepare quality value for the calculations
// Bonus Formula: floor(dbValue / 200 * (quality + 100))
var quality = 0;
var hasQuality = false;
if (item.MetaData1.Has("QUAL"))
{
quality = item.MetaData1.GetInt("QUAL");
hasQuality = true;
}
quality += 100;
// Remove previous buffs
creature.StatMods.Remove(statModSource, statModIdent);
creature.Regens.Remove(regenGroup);
// Add stat buffs
if (str != 0)
creature.StatMods.Add(Stat.StrMod, (float)Math.Floor(str / 200f * quality), statModSource, statModIdent, timeout);
if (int_ != 0)
creature.StatMods.Add(Stat.IntMod, (float)Math.Floor(int_ / 200f * quality), statModSource, statModIdent, timeout);
if (dex != 0)
creature.StatMods.Add(Stat.DexMod, (float)Math.Floor(dex / 200f * quality), statModSource, statModIdent, timeout);
if (will != 0)
creature.StatMods.Add(Stat.WillMod, (float)Math.Floor(will / 200f * quality), statModSource, statModIdent, timeout);
if (luck != 0)
creature.StatMods.Add(Stat.LuckMod, (float)Math.Floor(luck / 200f * quality), statModSource, statModIdent, timeout);
if (defense != 0)
creature.StatMods.Add(Stat.DefenseMod, (float)Math.Floor(defense / 200f * quality), statModSource, statModIdent, timeout);
if (protection != 0)
creature.StatMods.Add(Stat.ProtectionMod, (float)Math.Floor(protection / 200f * quality), statModSource, statModIdent, timeout);
if (life != 0)
{
creature.StatMods.Add(Stat.LifeMaxMod, (float)Math.Floor(life / 200f * quality), statModSource, statModIdent, timeout);
creature.Life = creature.Life; // Cap in case max was reduced
}
if (mana != 0)
{
creature.StatMods.Add(Stat.ManaMaxMod, (float)Math.Floor(mana / 200f * quality), statModSource, statModIdent, timeout);
creature.Mana = creature.Mana; // Cap in case max was reduced
}
if (stamina != 0)
{
creature.StatMods.Add(Stat.StaminaMaxMod, (float)Math.Floor(stamina / 200f * quality), statModSource, statModIdent, timeout);
creature.Stamina = creature.Stamina; // Cap in case max was reduced
}
// Add regens
if (lifeRecovery != 0)
{
var value = (float)lifeRecovery;
if (hasQuality)
value = (float)Math.Floor(value / 200f * quality);
creature.Regens.Add(regenGroup, Stat.Life, value, creature.LifeInjured, timeout * 1000);
}
if (manaRecovery != 0)
{
var value = (float)manaRecovery;
if (hasQuality)
value = (float)Math.Floor(value / 200f * quality);
creature.Regens.Add(regenGroup, Stat.Mana, value, creature.ManaMax, timeout * 1000);
}
if (staminaRecovery != 0)
{
var value = (float)staminaRecovery;
if (hasQuality)
value = (float)Math.Floor(value / 200f * quality);
creature.Regens.Add(regenGroup, Stat.Stamina, value, creature.StaminaMax, timeout * 1000);
}
if (injuryRecovery != 0)
{
var value = (float)injuryRecovery;
if (hasQuality)
value = (float)Math.Floor(value / 200f * quality);
creature.Regens.Add(regenGroup, Stat.LifeInjured, value, creature.LifeMax, timeout * 1000);
}
// Update client
Send.StatUpdate(creature, StatUpdateType.Private,
Stat.StrMod, Stat.IntMod, Stat.DexMod, Stat.WillMod, Stat.LuckMod,
Stat.Life, Stat.LifeInjured, Stat.LifeMaxMod, Stat.LifeMax,
Stat.Mana, Stat.ManaMaxMod, Stat.ManaMax,
Stat.Stamina, Stat.StaminaMaxMod, Stat.StaminaMax,
Stat.DefenseMod, Stat.ProtectionMod
);
Send.StatUpdate(creature, StatUpdateType.Public, Stat.Life, Stat.LifeInjured, Stat.LifeMaxMod, Stat.LifeMax);
}