public void SpendXp(Enum.Ability ability, uint amount) { uint baseValue = character.Abilities[ability].Base; uint result = SpendAbilityXp(character.Abilities[ability], amount); bool isSecondary = (ability == Enum.Ability.Health || ability == Enum.Ability.Stamina || ability == Enum.Ability.Mana); if (result > 0u) { uint ranks = character.Abilities[ability].Ranks; uint newValue = character.Abilities[ability].UnbuffedValue; var xpUpdate = new GameMessagePrivateUpdatePropertyInt64(Session, PropertyInt64.AvailableExperience, character.AvailableExperience); GameMessage abilityUpdate; if (!isSecondary) { abilityUpdate = new GameMessagePrivateUpdateAbility(Session, ability, ranks, baseValue, result); } else { abilityUpdate = new GameMessagePrivateUpdateVital(Session, ability, ranks, baseValue, result, character.Abilities[ability].Current); } var soundEvent = new GameMessageSound(this.Guid, Network.Enum.Sound.AbilityIncrease, 1f); var message = new GameMessageSystemChat($"Your base {ability} is now {newValue}!", ChatMessageType.Broadcast); Session.Network.EnqueueSend(xpUpdate, abilityUpdate, soundEvent, message); } else { ChatPacket.SendServerMessage(Session, $"Your attempt to raise {ability} has failed.", ChatMessageType.Broadcast); } }
public void RaiseAttributeGameAction(PropertyAttribute attribute, uint amount) { var creatureAttribute = new CreatureAttribute(this, attribute); uint result = SpendAttributeXp(creatureAttribute, amount); if (result > 0u) { GameMessage abilityUpdate = new GameMessagePrivateUpdateAttribute(this, attribute, creatureAttribute.Ranks, creatureAttribute.StartingValue, result); // checks if max rank is achieved and plays fireworks w/ special text string messageText; if (IsAttributeMaxRank(creatureAttribute.Ranks)) { // fireworks PlayParticleEffect(ACE.Entity.Enum.PlayScript.WeddingBliss, Guid); messageText = $"Your base {attribute} is now {creatureAttribute.Base} and has reached its upper limit!"; } else { messageText = $"Your base {attribute} is now {creatureAttribute.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 == PropertyAttribute.Endurance) { var healthUpdate = new GameMessagePrivateUpdateVital(this, PropertyAttribute2nd.MaxHealth, Health.Ranks, Health.StartingValue, Health.ExperienceSpent, Health.Current); Session.Network.EnqueueSend(abilityUpdate, soundEvent, message, healthUpdate); } else if (attribute == PropertyAttribute.Self) { var manaUpdate = new GameMessagePrivateUpdateVital(this, PropertyAttribute2nd.MaxMana, Mana.Ranks, Mana.StartingValue, Mana.ExperienceSpent, Mana.Current); Session.Network.EnqueueSend(abilityUpdate, soundEvent, message, manaUpdate); } else { Session.Network.EnqueueSend(abilityUpdate, soundEvent, message); } // retail was missing the 'raise attribute' runrate hook here if ((attribute == PropertyAttribute.Strength || attribute == PropertyAttribute.Quickness) && PropertyManager.GetBool("runrate_add_hooks").Item) { HandleRunRateUpdate(); } } else { ChatPacket.SendServerMessage(Session, $"Your attempt to raise {attribute} has failed.", ChatMessageType.Broadcast); } }
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); } }
public void SpendXp(Enum.Ability ability, uint amount) { uint baseValue = character.Abilities[ability].Base; uint result = SpendAbilityXp(character.Abilities[ability], amount); bool isSecondary = (ability == Enum.Ability.Health || ability == Enum.Ability.Stamina || ability == Enum.Ability.Mana); uint ranks = character.Abilities[ability].Ranks; uint newValue = character.Abilities[ability].UnbuffedValue; string messageText = ""; if (result > 0u) { GameMessage abilityUpdate; if (!isSecondary) { abilityUpdate = new GameMessagePrivateUpdateAbility(Session, ability, ranks, baseValue, result); } else { abilityUpdate = new GameMessagePrivateUpdateVital(Session, ability, ranks, baseValue, result, character.Abilities[ability].Current); } // checks if max rank is achieved and plays fireworks w/ special text if (IsAbilityMaxRank(ranks, isSecondary)) { // fireworks PlayParticleEffect(Effect.WeddingBliss); messageText = $"Your base {ability} is now {newValue} and has reached its upper limit!"; } else { messageText = $"Your base {ability} is now {newValue}!"; } var xpUpdate = new GameMessagePrivateUpdatePropertyInt64(Session, PropertyInt64.AvailableExperience, character.AvailableExperience); var soundEvent = new GameMessageSound(this.Guid, Network.Enum.Sound.RaiseTrait, 1f); var message = new GameMessageSystemChat(messageText, ChatMessageType.Advancement); Session.Network.EnqueueSend(abilityUpdate, xpUpdate, soundEvent, message); } else { ChatPacket.SendServerMessage(Session, $"Your attempt to raise {ability} has failed.", ChatMessageType.Broadcast); } }
public bool HandleActionRaiseAttribute(PropertyAttribute attribute, uint amount) { if (!Attributes.TryGetValue(attribute, out var creatureAttribute)) { log.Error($"{Name}.HandleActionRaiseAttribute({attribute}, {amount}) - invalid attribute"); return(false); } if (amount > AvailableExperience) { log.Error($"{Name}.HandleActionRaiseAttribute({attribute}, {amount}) - amount > AvaiableExperience ({AvailableExperience})"); return(false); } var prevRank = creatureAttribute.Ranks; if (!SpendAttributeXp(creatureAttribute, amount)) { ChatPacket.SendServerMessage(Session, $"Your attempt to raise {attribute} has failed.", ChatMessageType.Broadcast); return(false); } Session.Network.EnqueueSend(new GameMessagePrivateUpdateAttribute(this, creatureAttribute)); if (prevRank != creatureAttribute.Ranks) { // checks if max rank is achieved and plays fireworks w/ special text var suffix = ""; if (creatureAttribute.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 {attribute} is now {creatureAttribute.Base}{suffix}!", ChatMessageType.Advancement); Session.Network.EnqueueSend(sound, msg); if (attribute == PropertyAttribute.Endurance) { // this packet appears to trigger client to update both health and stamina var updateHealth = new GameMessagePrivateUpdateVital(this, Health); Session.Network.EnqueueSend(updateHealth); } else if (attribute == PropertyAttribute.Self) { var updateMana = new GameMessagePrivateUpdateVital(this, Mana); Session.Network.EnqueueSend(updateMana); } // retail was missing the 'raise attribute' runrate hook here if ((attribute == PropertyAttribute.Strength || attribute == PropertyAttribute.Quickness) && PropertyManager.GetBool("runrate_add_hooks").Item) { HandleRunRateUpdate(); } } return(true); }