// // Licensed under the MIT License. See LICENSE file in the project root for full license information. // namespace MUnique.OpenMU.GameLogic.Benchmarks; using Microsoft.Extensions.Logging.Abstractions; using Moq; using MUnique.OpenMU.AttributeSystem; using MUnique.OpenMU.GameLogic; using MUnique.OpenMU.GameLogic.Attributes; using MUnique.OpenMU.GameLogic.Benchmarks.Helpers; /// /// Benchmarks for class methods related to XP distribution and item drops. /// [MemoryDiagnoser] [ThreadingDiagnoser] [InvocationCount(100)] public class PartyBenchmarks { private Party _party = null!; private Player _killer = null!; private IAttackable _killedObject = null!; private List _players = null!; /// /// Sets up the benchmark by creating a party with 5 players. /// [GlobalSetup] public async Task Setup() { var partyManager = new PartyManager(5, new NullLogger()); _party = new Party(partyManager, 5, new NullLogger()); _players = new List(); for (int i = 0; i < 5; i++) { var player = await PlayerTestHelper.CreatePlayerAsync(); await player.PlayerState.TryAdvanceToAsync(PlayerState.EnteredWorld).ConfigureAwait(false); if (player.Attributes is { } attrs) { attrs[Stats.Level] = (short)(100 + i); } _players.Add(player); await _party.AddAsync(player).ConfigureAwait(false); } _killer = _players[0]; foreach (var player in _players) { _killer.Observers.Add(player); } _killedObject = CreateMockAttackable(50); } /// /// Benchmarks the method. /// [Benchmark] public async ValueTask DistributeExperienceAfterKillAsync() { await _party.DistributeExperienceAfterKillAsync(_killedObject, _killer); } /// /// Benchmarks the method. /// [Benchmark] public async ValueTask DistributeMoneyAfterKillAsync() { await _party.DistributeMoneyAfterKillAsync(_killedObject, _killer, 10000); } /// /// Benchmarks the method. /// [Benchmark] public async ValueTask GetQuestDropItemGroupsAsync() { await _party.GetQuestDropItemGroupsAsync(_killer); } private static IAttackable CreateMockAttackable(float level) { var attributes = new Mock(); attributes.Setup(a => a[Stats.Level]).Returns(level); var result = new Mock(); result.SetupAllProperties(); result.SetupGet(a => a.Attributes).Returns(attributes.Object); GameMap? nullMap = null; result.SetupGet(a => a.CurrentMap).Returns(nullMap); return result.Object; } }