diff --git a/src/NosCore.GameObject/Messaging/Handlers/UseItem/WearHandler.cs b/src/NosCore.GameObject/Messaging/Handlers/UseItem/WearHandler.cs index dceb06356..4400c31e7 100644 --- a/src/NosCore.GameObject/Messaging/Handlers/UseItem/WearHandler.cs +++ b/src/NosCore.GameObject/Messaging/Handlers/UseItem/WearHandler.cs @@ -148,12 +148,14 @@ await session.SendPacketAsync(new MsgiPacket } } + // The class gate is the combined check above, which sends CanNotWearThat; this one + // is the job level and was answering with the class message. if (session.Character.JobLevel < itemInstance.ItemInstance.Item.LevelJobMinimum) { await session.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, - Message = Game18NConstString.CanNotBeWornDifferentClass + Message = Game18NConstString.CanNotBeWornLowJobLevel }); return; } diff --git a/test/NosCore.GameObject.Tests/Messaging/Handlers/UseItem/WearHandlerTests.cs b/test/NosCore.GameObject.Tests/Messaging/Handlers/UseItem/WearHandlerTests.cs index 69c7118a8..96f398955 100644 --- a/test/NosCore.GameObject.Tests/Messaging/Handlers/UseItem/WearHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Messaging/Handlers/UseItem/WearHandlerTests.cs @@ -134,6 +134,19 @@ public async Task SuccessfulEquipWithValidTimeStampsItemDeleteTime() .ExecuteAsync(); } + [TestMethod] + public async Task LowJobLevelIsRejectedWithTheJobLevelMessage() + { + await new Spec("An item whose LevelJobMinimum exceeds character.JobLevel is rejected, and the message says so - the class message belongs to the combined gate above") + .Given(ItemInInventoryOfType_, ItemType.Specialist) + .And(ItemRequiresJobLevel_, (byte)55) + .And(CharacterIsJobLevel_, (byte)1) + .WhenAsync(UsingTheItem) + .Then(LowJobLevelShouldHaveBeenSent) + .And(NoDifferentClassPacketSent) + .ExecuteAsync(); + } + private void ItemHasValidTime_(int seconds) { _item.ItemInstance.Item.ItemValidTime = seconds; @@ -197,6 +210,32 @@ private void CharacterGenderIs_(GenderType gender) _session.Character.Gender = gender; } + private void ItemRequiresJobLevel_(byte level) + { + _item.ItemInstance.Item.LevelJobMinimum = level; + } + + private void CharacterIsJobLevel_(byte level) + { + _session.Character.JobLevel = level; + } + + private void LowJobLevelShouldHaveBeenSent() + { + var msg = _session.LastPackets.OfType() + .FirstOrDefault(p => p.Message == Game18NConstString.CanNotBeWornLowJobLevel); + Assert.IsNotNull(msg); + } + + // The failure this guards against sends a real message on the right condition, so it + // raises nothing: the player is simply told the wrong reason. + private void NoDifferentClassPacketSent() + { + var msg = _session.LastPackets.OfType() + .FirstOrDefault(p => p.Message == Game18NConstString.CanNotBeWornDifferentClass); + Assert.IsNull(msg); + } + private async Task UsingTheItem() => await UsingTheItemWithMode_(1); private async Task UsingTheItemWithMode_(byte mode)