diff --git a/src/GameLogic/PlayerActions/MiniGames/EnterMiniGameAction.cs b/src/GameLogic/PlayerActions/MiniGames/EnterMiniGameAction.cs index cd9703b83..28d34d84c 100644 --- a/src/GameLogic/PlayerActions/MiniGames/EnterMiniGameAction.cs +++ b/src/GameLogic/PlayerActions/MiniGames/EnterMiniGameAction.cs @@ -4,6 +4,7 @@ namespace MUnique.OpenMU.GameLogic.PlayerActions.MiniGames; +using MUnique.OpenMU.DataModel.Configuration.Items; using MUnique.OpenMU.GameLogic.Attributes; using MUnique.OpenMU.GameLogic.GuildWar; using MUnique.OpenMU.GameLogic.MiniGames; @@ -16,6 +17,8 @@ namespace MUnique.OpenMU.GameLogic.PlayerActions.MiniGames; /// public class EnterMiniGameAction { + private const int UndefinedTicketSlot = 0xFF; + /// /// Tries to enter the mini game event of the specified type and level with the specified ticket item. /// @@ -169,34 +172,42 @@ private async ValueTask ConsumeTicketItemAsync(Item? ticketItem, Player player) private bool CheckTicketItem(MiniGameDefinition miniGameDefinition, Player player, byte gameTicketInventoryIndex, out Item? ticketItem) { + ticketItem = null; + if (miniGameDefinition.TicketItem is not { } ticketItemDefinition) { - ticketItem = null; return true; } - ticketItem = player.Inventory?.GetItem(gameTicketInventoryIndex); - if (ticketItemDefinition.Equals(ticketItem?.Definition) && ticketItem.Durability > 0 && ticketItem.Level == miniGameDefinition.TicketItemLevel) + if (gameTicketInventoryIndex != UndefinedTicketSlot) { - return true; + ticketItem = player.Inventory?.GetItem(gameTicketInventoryIndex); + if (this.IsValidTicket(ticketItem, ticketItemDefinition, miniGameDefinition)) + { + return true; + } } - var candidateTicketItems = player.Inventory?.FindItemsByDefinition(ticketItemDefinition); - if (candidateTicketItems is not null && candidateTicketItems.Any()) + foreach (var candidateItem in player.Inventory?.FindItemsByDefinition(ticketItemDefinition) ?? Enumerable.Empty()) { - foreach (var candidateTicketItem in candidateTicketItems) + if (this.IsValidTicket(candidateItem, ticketItemDefinition, miniGameDefinition)) { - ticketItem = candidateTicketItem; - if (ticketItemDefinition.Equals(ticketItem?.Definition) && ticketItem.Durability > 0 && ticketItem.Level == miniGameDefinition.TicketItemLevel) - { - return true; - } + ticketItem = candidateItem; + return true; } } return false; } + private bool IsValidTicket(Item? ticketItem, ItemDefinition requiredItemDefinition, MiniGameDefinition miniGameDefinition) + { + return ticketItem is not null + && requiredItemDefinition.Equals(ticketItem.Definition) + && ticketItem.Durability > 0 + && ticketItem.Level == miniGameDefinition.TicketItemLevel; + } + private bool CheckEntranceFee(MiniGameDefinition miniGameDefinition, Player player, out int entranceFee) { entranceFee = Math.Max(miniGameDefinition.EntranceFee, 0); diff --git a/src/GameLogic/Storage.cs b/src/GameLogic/Storage.cs index 99d85eff1..6f53ccc51 100644 --- a/src/GameLogic/Storage.cs +++ b/src/GameLogic/Storage.cs @@ -267,7 +267,7 @@ public IEnumerable FindItemsByDefinition(ItemDefinition definition) { var primaryMatches = this.ItemArray .Where(i => i != null && i.Definition == definition) - .Cast(); + .Select(i => i!); var extensionMatches = this.Extensions? .SelectMany(extension => extension.FindItemsByDefinition(definition))