private void UpdateXpVitae(long amount) { var vitaePenalty = EnchantmentManager.GetVitae().StatModValue; var startPenalty = vitaePenalty; var maxPool = (int)VitaeCPPoolThreshold(vitaePenalty, DeathLevel.Value); var curPool = VitaeCpPool + amount; while (curPool >= maxPool) { curPool -= maxPool; vitaePenalty = EnchantmentManager.ReduceVitae(); if (vitaePenalty == 1.0f) { break; } maxPool = (int)VitaeCPPoolThreshold(vitaePenalty, DeathLevel.Value); } VitaeCpPool = (int)curPool; Session.Network.EnqueueSend(new GameMessagePrivateUpdatePropertyInt(this, PropertyInt.VitaeCpPool, VitaeCpPool.Value)); if (vitaePenalty != startPenalty) { Session.Network.EnqueueSend(new GameMessageSystemChat("Your experience has reduced your Vitae penalty!", ChatMessageType.Magic)); EnchantmentManager.SendUpdateVitae(); } if (vitaePenalty == 1.0f) { EnchantmentManager.RemoveVitae(); } }
/// <summary> /// Handles updating the vitae penalty through earned XP /// </summary> /// <param name="amount">The amount of XP to apply to the vitae penalty</param> private void UpdateXpVitae(long amount) { var vitae = EnchantmentManager.GetVitae(); if (vitae == null) { log.Error($"{Name}.UpdateXpVitae({amount}) vitae null, likely due to cross-thread operation or corrupt EnchantmentManager cache. Please report this."); log.Error(Environment.StackTrace); return; } var vitaePenalty = vitae.StatModValue; var startPenalty = vitaePenalty; var maxPool = VitaeCPPoolThreshold(vitaePenalty, DeathLevel.Value); var curPool = VitaeCpPool + amount; while (curPool >= (long)maxPool) { curPool -= (long)maxPool; vitaePenalty = EnchantmentManager.ReduceVitae(); if (vitaePenalty == 1.0f) { break; } maxPool = VitaeCPPoolThreshold(vitaePenalty, DeathLevel.Value); } VitaeCpPool = curPool; Session.Network.EnqueueSend(new GameMessagePrivateUpdatePropertyInt64(this, PropertyInt64.VitaeCpPool, VitaeCpPool.Value)); if (vitaePenalty != startPenalty) { Session.Network.EnqueueSend(new GameMessageSystemChat($"Your experience has reduced your Vitae penalty!", ChatMessageType.Magic)); EnchantmentManager.SendUpdateVitae(); } Session.Network.EnqueueSend(new GameMessageSystemChat($"Xp Required to reduce Vitae Penalty: {VitaeCpPool:N0}/{maxPool:n0}", ChatMessageType.Magic)); if (vitaePenalty.EpsilonEquals(1.0f) || vitaePenalty > 1.0f) { var actionChain = new ActionChain(); actionChain.AddDelaySeconds(2.0f); actionChain.AddAction(this, () => { var vitae = EnchantmentManager.GetVitae(); if (vitae != null) { var curPenalty = vitae.StatModValue; if (curPenalty.EpsilonEquals(1.0f) || curPenalty > 1.0f) { EnchantmentManager.RemoveVitae(); } } }); actionChain.EnqueueChain(); } }
/// <summary> /// Handles updating the vitae penalty through earned XP /// </summary> /// <param name="amount">The amount of XP to apply to the vitae penalty</param> private void UpdateXpVitae(long amount) { var vitaePenalty = EnchantmentManager.GetVitae().StatModValue; var startPenalty = vitaePenalty; var maxPool = (int)VitaeCPPoolThreshold(vitaePenalty, DeathLevel.Value); var curPool = VitaeCpPool + amount; while (curPool >= maxPool) { curPool -= maxPool; vitaePenalty = EnchantmentManager.ReduceVitae(); if (vitaePenalty == 1.0f) { break; } maxPool = (int)VitaeCPPoolThreshold(vitaePenalty, DeathLevel.Value); } VitaeCpPool = (int)curPool; Session.Network.EnqueueSend(new GameMessagePrivateUpdatePropertyInt(this, PropertyInt.VitaeCpPool, VitaeCpPool.Value)); if (vitaePenalty != startPenalty) { Session.Network.EnqueueSend(new GameMessageSystemChat("Your experience has reduced your Vitae penalty!", ChatMessageType.Magic)); EnchantmentManager.SendUpdateVitae(); } if (vitaePenalty.EpsilonEquals(1.0f) || vitaePenalty > 1.0f) { var actionChain = new ActionChain(); actionChain.AddDelaySeconds(2.0f); actionChain.AddAction(this, () => { var vitae = EnchantmentManager.GetVitae(); if (vitae != null) { var curPenalty = vitae.StatModValue; if (curPenalty.EpsilonEquals(1.0f) || curPenalty > 1.0f) { EnchantmentManager.RemoveVitae(); } } }); actionChain.EnqueueChain(); } }