Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<MsgiPacket>()
.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<MsgiPacket>()
.FirstOrDefault(p => p.Message == Game18NConstString.CanNotBeWornDifferentClass);
Assert.IsNull(msg);
}

private async Task UsingTheItem() => await UsingTheItemWithMode_(1);

private async Task UsingTheItemWithMode_(byte mode)
Expand Down
Loading