From 5214754fee9a320d38df0dad685858b972f00da8 Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Sun, 2 Aug 2026 00:23:28 -0400 Subject: [PATCH 01/10] Update AttributeTransferDevice.cs --- .../WorldObjects/AttributeTransferDevice.cs | 95 ++++++++++++++++--- 1 file changed, 80 insertions(+), 15 deletions(-) diff --git a/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs b/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs index f339f279dd..fd618f7024 100644 --- a/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs +++ b/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs @@ -6,6 +6,7 @@ using ACE.Entity.Models; using ACE.Server.Entity; using ACE.Server.Network.GameMessages.Messages; +using ACE.Server.WorldObjects.Entity; namespace ACE.Server.WorldObjects { @@ -54,25 +55,23 @@ public void ActOnUse(WorldObject activator, bool confirmed) if (player == null) return; if (TransferFromAttribute == PropertyAttribute.Undef || TransferToAttribute == PropertyAttribute.Undef) + { + player.SendWeenieError(WeenieError.YouHaveFailedToAlterAttributes); return; + } var device = player.FindObject(Guid.Full, Player.SearchLocations.MyInventory); - if (device == null) return; + if (device == null) + { + player.SendWeenieError(WeenieError.YouHaveFailedToAlterAttributes); + return; + } var fromAttr = player.Attributes[TransferFromAttribute]; var toAttr = player.Attributes[TransferToAttribute]; - if (fromAttr.StartingValue <= 10) - { - player.Session.Network.EnqueueSend(new GameMessageSystemChat($"Your innate {TransferFromAttribute} must be above 10 to use the {Name}.", ChatMessageType.Broadcast)); + if (!VerifyRequirements(player, fromAttr, toAttr)) return; - } - - if (toAttr.StartingValue >= 100) - { - player.Session.Network.EnqueueSend(new GameMessageSystemChat($"Your innate {TransferToAttribute} must be below 100 to use the {Name}.", ChatMessageType.Broadcast)); - return; - } if (!confirmed) { @@ -92,16 +91,82 @@ public void ActOnUse(WorldObject activator, bool confirmed) var updateFrom = new GameMessagePrivateUpdateAttribute(player, fromAttr); var updateTo = new GameMessagePrivateUpdateAttribute(player, toAttr); - var msgFrom = new GameMessageSystemChat($"Your base {TransferFromAttribute} is now {fromAttr.Base}!", ChatMessageType.Broadcast); - var msgTo = new GameMessageSystemChat($"Your base {TransferToAttribute} is now {toAttr.Base}!", ChatMessageType.Broadcast); + //// begin things not seen in pcaps? + //var msgFrom = new GameMessageSystemChat($"Your base {TransferFromAttribute} is now {fromAttr.Base}!", ChatMessageType.Broadcast); + //var msgTo = new GameMessageSystemChat($"Your base {TransferToAttribute} is now {toAttr.Base}!", ChatMessageType.Broadcast); + + //var sound = new GameMessageSound(player.Guid, Sound.RaiseTrait); + //// end things not seen in pcaps? + //// the above provides better feedback to player but it wasn't seen in pcaps... - var sound = new GameMessageSound(player.Guid, Sound.RaiseTrait); + //player.Session.Network.EnqueueSend(updateFrom, updateTo, msgFrom, msgTo, sound); + player.Session.Network.EnqueueSend(updateFrom, updateTo); - player.Session.Network.EnqueueSend(updateFrom, updateTo, msgFrom, msgTo, sound); + // this should be a UseDone(WeenieError.YouHaveSucceededTransferringAttributes) but Player.TryUseItem has built in UseDone(WeenieError.None) which would conflict. + player.SendWeenieError(WeenieError.YouHaveSucceededTransferringAttributes); player.SaveBiotaToDatabase(); player.TryConsumeFromInventoryWithNetworking(this, 1); } + + public bool VerifyRequirements(Player player, CreatureAttribute transferFromAttribute, CreatureAttribute transferToAttribute) + { + // Check for equipped items that have requirements in skill or attributes + if (CheckWieldedItems(player)) + { + // Items are wielded which might be affected by a transfer operation + //player.Session.Network.EnqueueSend(new GameEventWeenieErrorWithString(player.Session, WeenieErrorWithString.CannotLowerSkillWhileWieldingItem, skill.Skill.ToSentence())); + player.SendWeenieError(WeenieError.CannotTransferAttributesWhileWieldingItem); + return false; + } + + if (transferFromAttribute.StartingValue <= 10) + { + //player.Session.Network.EnqueueSend(new GameMessageSystemChat($"Your innate {TransferFromAttribute} must be above 10 to use the {Name}.", ChatMessageType.Broadcast)); + player.SendWeenieErrorWithString(WeenieErrorWithString.AttributeTransferFromTooLow, $"Your innate {TransferFromAttribute} must be above 10 to use the {Name}."); + return false; + } + + if (transferToAttribute.StartingValue >= 100) + { + //player.Session.Network.EnqueueSend(new GameMessageSystemChat($"Your innate {TransferToAttribute} must be below 100 to use the {Name}.", ChatMessageType.Broadcast)); + player.SendWeenieErrorWithString(WeenieErrorWithString.AttributeTransferToTooHigh, $"Your innate {TransferToAttribute} must be below 100 to use the {Name}."); + return false; + } + + return true; + } + + /// + /// Checks wielded items and their requirements to see if they'd be violated by an impending attribute transfer operation + /// + private bool CheckWieldedItems(Player player) + { + foreach (var equippedItem in player.EquippedObjects.Values) + { + if (CheckWieldRequirement(player, equippedItem.WieldRequirements, equippedItem.WieldSkillType) || + CheckWieldRequirement(player, equippedItem.WieldRequirements2, equippedItem.WieldSkillType2) || + CheckWieldRequirement(player, equippedItem.WieldRequirements3, equippedItem.WieldSkillType3) || + CheckWieldRequirement(player, equippedItem.WieldRequirements4, equippedItem.WieldSkillType4)) + { + return true; + } + } + return false; + } + + private bool CheckWieldRequirement(Player player, WieldRequirement itemWieldReq, int? wieldSkillType) + { + //if (itemWieldReq != WieldRequirement.RawSkill && itemWieldReq != WieldRequirement.Skill + // && itemWieldReq != WieldRequirement.RawAttrib && itemWieldReq != WieldRequirement.Attrib + // && itemWieldReq != WieldRequirement.RawSecondaryAttrib && itemWieldReq != WieldRequirement.SecondaryAttrib) + if (itemWieldReq < WieldRequirement.Skill && itemWieldReq > WieldRequirement.RawSecondaryAttrib) + { + return false; + } + + return true; + } } } From 3f1202efdbd9470fea6c296ad3ddb61e2bab53f6 Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Sun, 2 Aug 2026 02:16:52 -0400 Subject: [PATCH 02/10] Update SkillAlterationDevice.cs --- .../WorldObjects/SkillAlterationDevice.cs | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs b/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs index 1bd4d8ac1c..28ed3cd471 100644 --- a/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs +++ b/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs @@ -280,10 +280,10 @@ private bool CheckWieldedItems(Player player) { foreach (var equippedItem in player.EquippedObjects.Values) { - if (CheckWieldRequirement(player, equippedItem.WieldRequirements, equippedItem.WieldSkillType) || - CheckWieldRequirement(player, equippedItem.WieldRequirements2, equippedItem.WieldSkillType2) || - CheckWieldRequirement(player, equippedItem.WieldRequirements3, equippedItem.WieldSkillType3) || - CheckWieldRequirement(player, equippedItem.WieldRequirements4, equippedItem.WieldSkillType4)) + if (CheckWieldRequirement(player, equippedItem.WieldRequirements, equippedItem.WieldSkillType, equippedItem.WieldDifficulty) || + CheckWieldRequirement(player, equippedItem.WieldRequirements2, equippedItem.WieldSkillType2, equippedItem.WieldDifficulty2) || + CheckWieldRequirement(player, equippedItem.WieldRequirements3, equippedItem.WieldSkillType3, equippedItem.WieldDifficulty3) || + CheckWieldRequirement(player, equippedItem.WieldRequirements4, equippedItem.WieldSkillType4, equippedItem.WieldDifficulty4)) { return true; } @@ -291,8 +291,22 @@ private bool CheckWieldedItems(Player player) return false; } - private bool CheckWieldRequirement(Player player, WieldRequirement itemWieldReq, int? wieldSkillType) + private bool CheckWieldRequirement(Player player, WieldRequirement itemWieldReq, int? wieldSkillType, int? wieldSkillDifficulty) { + if (itemWieldReq == WieldRequirement.Training) + { + var skill = player.ConvertToMoASkill((Skill)(wieldSkillType ?? 0)); + if (skill != SkillToBeAltered) + return false; + + var creatureSkill = player.GetCreatureSkill(skill, false); + + if (creatureSkill == null || wieldSkillDifficulty is null) + return false; + + return (SkillAdvancementClass)wieldSkillDifficulty >= creatureSkill.AdvancementClass; + } + if (itemWieldReq != WieldRequirement.RawSkill && itemWieldReq != WieldRequirement.Skill) return false; From c4db7a75b87a80f2cf4c886010261a27050bdd66 Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Sun, 2 Aug 2026 03:38:02 -0400 Subject: [PATCH 03/10] Update WorldObject_Properties.cs --- Source/ACE.Server/WorldObjects/WorldObject_Properties.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/ACE.Server/WorldObjects/WorldObject_Properties.cs b/Source/ACE.Server/WorldObjects/WorldObject_Properties.cs index d194687c63..a2270d5ff2 100644 --- a/Source/ACE.Server/WorldObjects/WorldObject_Properties.cs +++ b/Source/ACE.Server/WorldObjects/WorldObject_Properties.cs @@ -2202,6 +2202,12 @@ public Skill? ItemSkillLimit set { if (!value.HasValue) RemoveProperty(PropertyDataId.ItemSkillLimit); else SetProperty(PropertyDataId.ItemSkillLimit, (uint)value); } } + public Skill? ItemSpecializedOnly + { + get => (Skill?)GetProperty(PropertyDataId.ItemSpecializedOnly); + set { if (!value.HasValue) RemoveProperty(PropertyDataId.ItemSpecializedOnly); else SetProperty(PropertyDataId.ItemSpecializedOnly, (uint)value); } + } + public int? ItemSkillLevelLimit { get => GetProperty(PropertyInt.ItemSkillLevelLimit); From c2387c8da523fdcb7f5ba3a87ca7254743bc81a7 Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Sun, 2 Aug 2026 03:38:21 -0400 Subject: [PATCH 04/10] Update WorldObject_Use.cs --- .../WorldObjects/WorldObject_Use.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Source/ACE.Server/WorldObjects/WorldObject_Use.cs b/Source/ACE.Server/WorldObjects/WorldObject_Use.cs index b9029dea56..d45601212e 100644 --- a/Source/ACE.Server/WorldObjects/WorldObject_Use.cs +++ b/Source/ACE.Server/WorldObjects/WorldObject_Use.cs @@ -216,6 +216,14 @@ public virtual ActivationResult CheckUseRequirements(WorldObject activator) var skill = activator.ConvertToMoASkill((Skill)ItemSkillLimit.Value); var playerSkill = player.GetCreatureSkill(skill); + if (playerSkill.AdvancementClass < SkillAdvancementClass.Trained) + { + //return new ActivationResult(new GameEventWeenieErrorWithString(player.Session, WeenieErrorWithString.Your_SkillMustBeTrained, playerSkill.Skill.ToSentence())); + player.Session.Network.EnqueueSend(new GameEventCommunicationTransientString(player.Session, $"You must have {playerSkill.Skill.ToSentence()} trained to use that item's magic")); + return new ActivationResult(false); + } + + // verify skill level if (playerSkill.Current < ItemSkillLevelLimit.Value) return new ActivationResult(new GameEventWeenieErrorWithString(player.Session, WeenieErrorWithString.Your_IsTooLowToUseItemMagic, playerSkill.Skill.ToSentence())); } @@ -259,6 +267,24 @@ public virtual ActivationResult CheckUseRequirements(WorldObject activator) } } + // verify skill specialized + // only found on a few items, doesn't show up on ID panel so is effectively a hidden requirement + if (ItemSpecializedOnly != null) + { + var skill = activator.ConvertToMoASkill((Skill)ItemSpecializedOnly.Value); + var playerSkill = player.GetCreatureSkill(skill); + + if (playerSkill.AdvancementClass < SkillAdvancementClass.Specialized) + return new ActivationResult(new GameEventWeenieErrorWithString(player.Session, WeenieErrorWithString.YouMustSpecialize_ToUseItemMagic, playerSkill.Skill.ToSentence())); + + // verify skill level (if this was included) + if (ItemSkillLevelLimit != null) + { + if (playerSkill.Current < ItemSkillLevelLimit.Value) + return new ActivationResult(new GameEventWeenieErrorWithString(player.Session, WeenieErrorWithString.Your_IsTooLowToUseItemMagic, playerSkill.Skill.ToSentence())); + } + } + // verify player level if (UseRequiresLevel != null) { From cbe49eb5d24072c9fe48f08ac8d98c2e22b27e83 Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Sun, 2 Aug 2026 03:44:12 -0400 Subject: [PATCH 05/10] Update AttributeTransferDevice.cs --- .../WorldObjects/AttributeTransferDevice.cs | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs b/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs index fd618f7024..740bfc5d9a 100644 --- a/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs +++ b/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs @@ -145,10 +145,11 @@ private bool CheckWieldedItems(Player player) { foreach (var equippedItem in player.EquippedObjects.Values) { - if (CheckWieldRequirement(player, equippedItem.WieldRequirements, equippedItem.WieldSkillType) || - CheckWieldRequirement(player, equippedItem.WieldRequirements2, equippedItem.WieldSkillType2) || - CheckWieldRequirement(player, equippedItem.WieldRequirements3, equippedItem.WieldSkillType3) || - CheckWieldRequirement(player, equippedItem.WieldRequirements4, equippedItem.WieldSkillType4)) + if (CheckWieldRequirement(player, equippedItem.WieldRequirements, equippedItem.WieldSkillType, equippedItem.WieldDifficulty) || + CheckWieldRequirement(player, equippedItem.WieldRequirements2, equippedItem.WieldSkillType2, equippedItem.WieldDifficulty2) || + CheckWieldRequirement(player, equippedItem.WieldRequirements3, equippedItem.WieldSkillType3, equippedItem.WieldDifficulty3) || + CheckWieldRequirement(player, equippedItem.WieldRequirements4, equippedItem.WieldSkillType4, equippedItem.WieldDifficulty4) || + CheckActivationRequirement(player, equippedItem)) { return true; } @@ -156,17 +157,38 @@ private bool CheckWieldedItems(Player player) return false; } - private bool CheckWieldRequirement(Player player, WieldRequirement itemWieldReq, int? wieldSkillType) + private bool CheckWieldRequirement(Player player, WieldRequirement itemWieldReq, int? wieldSkillType, int? wieldSkillDifficulty) { //if (itemWieldReq != WieldRequirement.RawSkill && itemWieldReq != WieldRequirement.Skill // && itemWieldReq != WieldRequirement.RawAttrib && itemWieldReq != WieldRequirement.Attrib - // && itemWieldReq != WieldRequirement.RawSecondaryAttrib && itemWieldReq != WieldRequirement.SecondaryAttrib) - if (itemWieldReq < WieldRequirement.Skill && itemWieldReq > WieldRequirement.RawSecondaryAttrib) + // && itemWieldReq != WieldRequirement.RawSecondaryAttrib && itemWieldReq != WieldRequirement.SecondaryAttrib + // && itemWieldReq != WieldRequirement.Training) + if (itemWieldReq < WieldRequirement.Skill && itemWieldReq > WieldRequirement.RawSecondaryAttrib && itemWieldReq != WieldRequirement.Training) { - return false; + return true; } - return true; + return false; + } + + private bool CheckActivationRequirement(Player player, WorldObject equippedItem) + { + if (equippedItem.ItemDifficulty > 0) + return true; + + if (player.ConvertToMoASkill(equippedItem.ItemSkillLimit ?? 0) != Skill.None) + return true; + + if (player.ConvertToMoASkill(equippedItem.ItemSpecializedOnly ?? 0) != Skill.None) + return true; + + if (player.ConvertToMoASkill((Skill)(equippedItem.UseRequiresSkill ?? 0)) != Skill.None) + return true; + + if (player.ConvertToMoASkill((Skill)(equippedItem.UseRequiresSkillSpec ?? 0)) != Skill.None) + return true; + + return false; } } } From 95403decd45905c60998e457b7c266d81e04330d Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Sun, 2 Aug 2026 03:44:31 -0400 Subject: [PATCH 06/10] Update SkillAlterationDevice.cs --- .../WorldObjects/SkillAlterationDevice.cs | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs b/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs index 28ed3cd471..1bf4f54fcc 100644 --- a/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs +++ b/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs @@ -283,7 +283,8 @@ private bool CheckWieldedItems(Player player) if (CheckWieldRequirement(player, equippedItem.WieldRequirements, equippedItem.WieldSkillType, equippedItem.WieldDifficulty) || CheckWieldRequirement(player, equippedItem.WieldRequirements2, equippedItem.WieldSkillType2, equippedItem.WieldDifficulty2) || CheckWieldRequirement(player, equippedItem.WieldRequirements3, equippedItem.WieldSkillType3, equippedItem.WieldDifficulty3) || - CheckWieldRequirement(player, equippedItem.WieldRequirements4, equippedItem.WieldSkillType4, equippedItem.WieldDifficulty4)) + CheckWieldRequirement(player, equippedItem.WieldRequirements4, equippedItem.WieldSkillType4, equippedItem.WieldDifficulty4) || + CheckActivationRequirement(player, equippedItem)) { return true; } @@ -312,5 +313,25 @@ private bool CheckWieldRequirement(Player player, WieldRequirement itemWieldReq, return player.ConvertToMoASkill((Skill)(wieldSkillType ?? 0)) == SkillToBeAltered; } + + private bool CheckActivationRequirement(Player player, WorldObject equippedItem) + { + if (equippedItem.ItemDifficulty > 0 && SkillToBeAltered == Skill.ArcaneLore) + return true; + + if (player.ConvertToMoASkill(equippedItem.ItemSkillLimit ?? 0) == SkillToBeAltered) + return true; + + if (player.ConvertToMoASkill(equippedItem.ItemSpecializedOnly ?? 0) == SkillToBeAltered) + return true; + + if (player.ConvertToMoASkill((Skill)(equippedItem.UseRequiresSkill ?? 0)) == SkillToBeAltered) + return true; + + if (player.ConvertToMoASkill((Skill)(equippedItem.UseRequiresSkillSpec ?? 0)) == SkillToBeAltered) + return true; + + return false; + } } } From 7bb25285ff17bfc4c98c903daff0c744f2295125 Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Sun, 2 Aug 2026 03:49:51 -0400 Subject: [PATCH 07/10] Update AttributeTransferDevice.cs --- Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs b/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs index 740bfc5d9a..2ae6a92e9c 100644 --- a/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs +++ b/Source/ACE.Server/WorldObjects/AttributeTransferDevice.cs @@ -149,7 +149,7 @@ private bool CheckWieldedItems(Player player) CheckWieldRequirement(player, equippedItem.WieldRequirements2, equippedItem.WieldSkillType2, equippedItem.WieldDifficulty2) || CheckWieldRequirement(player, equippedItem.WieldRequirements3, equippedItem.WieldSkillType3, equippedItem.WieldDifficulty3) || CheckWieldRequirement(player, equippedItem.WieldRequirements4, equippedItem.WieldSkillType4, equippedItem.WieldDifficulty4) || - CheckActivationRequirement(player, equippedItem)) + CheckActivationRequirements(player, equippedItem)) { return true; } @@ -171,7 +171,7 @@ private bool CheckWieldRequirement(Player player, WieldRequirement itemWieldReq, return false; } - private bool CheckActivationRequirement(Player player, WorldObject equippedItem) + private bool CheckActivationRequirements(Player player, WorldObject equippedItem) { if (equippedItem.ItemDifficulty > 0) return true; From 76cb36dba7536ea5868e5c166429e68d9040dc05 Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Sun, 2 Aug 2026 03:49:53 -0400 Subject: [PATCH 08/10] Update SkillAlterationDevice.cs --- Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs b/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs index 1bf4f54fcc..3409c953ee 100644 --- a/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs +++ b/Source/ACE.Server/WorldObjects/SkillAlterationDevice.cs @@ -284,7 +284,7 @@ private bool CheckWieldedItems(Player player) CheckWieldRequirement(player, equippedItem.WieldRequirements2, equippedItem.WieldSkillType2, equippedItem.WieldDifficulty2) || CheckWieldRequirement(player, equippedItem.WieldRequirements3, equippedItem.WieldSkillType3, equippedItem.WieldDifficulty3) || CheckWieldRequirement(player, equippedItem.WieldRequirements4, equippedItem.WieldSkillType4, equippedItem.WieldDifficulty4) || - CheckActivationRequirement(player, equippedItem)) + CheckActivationRequirements(player, equippedItem)) { return true; } @@ -314,7 +314,7 @@ private bool CheckWieldRequirement(Player player, WieldRequirement itemWieldReq, return player.ConvertToMoASkill((Skill)(wieldSkillType ?? 0)) == SkillToBeAltered; } - private bool CheckActivationRequirement(Player player, WorldObject equippedItem) + private bool CheckActivationRequirements(Player player, WorldObject equippedItem) { if (equippedItem.ItemDifficulty > 0 && SkillToBeAltered == Skill.ArcaneLore) return true; From 64dff4954274d9b4317fa2399bf3361f7ce03a17 Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Sun, 2 Aug 2026 03:49:56 -0400 Subject: [PATCH 09/10] Update WorldObject_Use.cs --- Source/ACE.Server/WorldObjects/WorldObject_Use.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/ACE.Server/WorldObjects/WorldObject_Use.cs b/Source/ACE.Server/WorldObjects/WorldObject_Use.cs index d45601212e..45fcf7390c 100644 --- a/Source/ACE.Server/WorldObjects/WorldObject_Use.cs +++ b/Source/ACE.Server/WorldObjects/WorldObject_Use.cs @@ -268,7 +268,7 @@ public virtual ActivationResult CheckUseRequirements(WorldObject activator) } // verify skill specialized - // only found on a few items, doesn't show up on ID panel so is effectively a hidden requirement + // only found on a few items, doesn't show up on ID panel so is effectively a hidden requirement unless noted in ShortDesc/LongDesc string text if (ItemSpecializedOnly != null) { var skill = activator.ConvertToMoASkill((Skill)ItemSpecializedOnly.Value); From a24a8257ff5ba508331e190c203cd5a6bce17127 Mon Sep 17 00:00:00 2001 From: Ty Conner Date: Mon, 3 Aug 2026 13:13:53 -0400 Subject: [PATCH 10/10] Update WorldObject_Use.cs --- Source/ACE.Server/WorldObjects/WorldObject_Use.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/ACE.Server/WorldObjects/WorldObject_Use.cs b/Source/ACE.Server/WorldObjects/WorldObject_Use.cs index 45fcf7390c..170922ec5f 100644 --- a/Source/ACE.Server/WorldObjects/WorldObject_Use.cs +++ b/Source/ACE.Server/WorldObjects/WorldObject_Use.cs @@ -216,12 +216,12 @@ public virtual ActivationResult CheckUseRequirements(WorldObject activator) var skill = activator.ConvertToMoASkill((Skill)ItemSkillLimit.Value); var playerSkill = player.GetCreatureSkill(skill); - if (playerSkill.AdvancementClass < SkillAdvancementClass.Trained) - { - //return new ActivationResult(new GameEventWeenieErrorWithString(player.Session, WeenieErrorWithString.Your_SkillMustBeTrained, playerSkill.Skill.ToSentence())); - player.Session.Network.EnqueueSend(new GameEventCommunicationTransientString(player.Session, $"You must have {playerSkill.Skill.ToSentence()} trained to use that item's magic")); - return new ActivationResult(false); - } + //if (playerSkill.AdvancementClass < SkillAdvancementClass.Trained) + //{ + // //return new ActivationResult(new GameEventWeenieErrorWithString(player.Session, WeenieErrorWithString.Your_SkillMustBeTrained, playerSkill.Skill.ToSentence())); + // player.Session.Network.EnqueueSend(new GameEventCommunicationTransientString(player.Session, $"You must have {playerSkill.Skill.ToSentence()} trained to use that item's magic")); + // return new ActivationResult(false); + //} // verify skill level if (playerSkill.Current < ItemSkillLevelLimit.Value)