public void HandleActionRaiseVital(PropertyAttribute2nd attribute, uint amount) { var creatureVital = new CreatureVital(this, attribute); uint result = SpendVitalXp(creatureVital, amount); if (result > 0u) { GameMessage abilityUpdate = new GameMessagePrivateUpdateVital(this, attribute, creatureVital.Ranks, creatureVital.StartingValue, result, creatureVital.Current); // checks if max rank is achieved and plays fireworks w/ special text string messageText; if (IsVitalMaxRank(creatureVital.Ranks)) { // fireworks PlayParticleEffect(ACE.Entity.Enum.PlayScript.WeddingBliss, Guid); messageText = $"Your base {attribute.ToSentence()} is now {creatureVital.Base} and has reached its upper limit!"; } else { messageText = $"Your base {attribute.ToSentence()} is now {creatureVital.Base}!"; } var soundEvent = new GameMessageSound(Guid, Sound.RaiseTrait, 1f); var message = new GameMessageSystemChat(messageText, ChatMessageType.Advancement); // This seems to be needed to keep health up to date properly. // Needed when increasing health and endurance. //if (attribute == PropertyAttribute2nd.Endurance) //{ // var healthUpdate = new GameMessagePrivateUpdateVital(Session, Ability.Health, Health.Ranks, Health.StartingValue, Health.ExperienceSpent, Health.Current); // Session.Network.EnqueueSend(abilityUpdate, soundEvent, message, healthUpdate); //} //else if (attribute == PropertyAttribute2nd.Self) //{ // var manaUpdate = new GameMessagePrivateUpdateVital(Session, Ability.Mana, Mana.Ranks, Mana.StartingValue, Mana.ExperienceSpent, Mana.Current); // Session.Network.EnqueueSend(abilityUpdate, soundEvent, message, manaUpdate); //} //else //{ Session.Network.EnqueueSend(abilityUpdate, soundEvent, message); //} } else { ChatPacket.SendServerMessage(Session, $"Your attempt to raise {attribute.ToSentence()} has failed.", ChatMessageType.Broadcast); } }
/// <summary> /// Handles the GameAction 0x44 - RaiseVital network message from client /// </summary> public bool HandleActionRaiseVital(PropertyAttribute2nd vital, uint amount) { if (!Vitals.TryGetValue(vital, out var creatureVital)) { log.Error($"{Name}.HandleActionRaiseVital({vital}, {amount}) - invalid vital"); return(false); } if (amount > AvailableExperience) { // there is a client bug for vitals only, // where the client will enable the button to raise a vital by 10 // if the player only has enough AvailableExperience to raise it by 1 ChatPacket.SendServerMessage(Session, $"Your attempt to raise {vital.ToSentence()} has failed.", ChatMessageType.Broadcast); log.Error($"{Name}.HandleActionRaiseVital({vital}, {amount}) - amount > AvailableExperience ({AvailableExperience})"); return(false); } var prevRank = creatureVital.Ranks; if (!SpendVitalXp(creatureVital, amount)) { return(false); } Session.Network.EnqueueSend(new GameMessagePrivateUpdateVital(this, creatureVital)); if (prevRank != creatureVital.Ranks) { // checks if max rank is achieved and plays fireworks w/ special text var suffix = ""; if (creatureVital.IsMaxRank) { // fireworks PlayParticleEffect(PlayScript.WeddingBliss, Guid); suffix = $" and has reached its upper limit"; } var sound = new GameMessageSound(Guid, Sound.RaiseTrait); var msg = new GameMessageSystemChat($"Your base {vital.ToSentence()} is now {creatureVital.Base}{suffix}!", ChatMessageType.Advancement); Session.Network.EnqueueSend(sound, msg); } return(true); }