/// <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); }