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))